그냥 재미로 1000줄 안 되는 에디터 만들기
경고: 길고 그다지 쓸모없는 글이다. TLDR은 그냥 재미로 ncurses에 의존하지 않고 구문 강조와 검색 기능을 갖춘 1000줄 미만의 텍스트 에디터를 만들었다는 것이다. 코드는 여기 있다: http://github.com/antirez/kilo.
시연 영상은 여기: https://asciinema.org/a/90r2i9bq8po03nazhqtsifksb
감상에 젖고 싶은 분들은 계속 읽어보길…
몇 주 전 Nano 에디터가 더 이상 GNU 프로젝트의 일부가 아니라는 소식이 있었다. 내 첫 반응은, 와, 사람들이 아직도 터미널 기반 이메일 클라이언트에 포함되어 있던 에디터의 복제판인 그 오래된 에디터를 진심으로 아끼는구나,였다. 다시 한번 말해보자, “이메일 클라이언트”. 이제는 이메일 클라이언트라는 개념 자체가 사라졌다. 모든 게 변했다. 그런데도 Hacker News에서 수많은 사람들이 낯선 시스템에서 nano 덕분에 시스템 관리자 업무 같은 걸 할 때 몇 번이나 구원받았다는 글을 읽었다. 내 아들이 C로 첫 프로그램을 작성한 것도 Nano였다. 파일을 편집해 본 경험이 없어도 쓸 만한 경험을 제공한다.
그렇게 나는 Nano 자체보다 훨씬 더 작은 텍스트 에디터를 만들어 볼 생각을 하기 시작했다. 그냥 재미로, 기본적으로 작고 간결한 프로그램을 좋아하고 동경하기 때문이다.
요즘 에디터를 만드는 게 얼마나 한심하고 쓸모없고 시간 낭비로 보이는가? 우리는 반짝이고 놀라운 프로젝트, 아주 멋지고 복잡하며 가치 있는 무언가를 만들어야 한다고 여겨진다. 하지만 가끔은 뚜렷한 목적 없이 무언가를 만드는 것도 신선하다. 추억도 떠올랐다…
Commodore 16의 롬 내장 어셈블러와 어릴 적 썼던 모든 가정용 컴퓨터와 BASIC 인터프리터를 처음 접했던 기억이 난다. 에디터는 인간과 기계 사이의 근본적인 연결 고리다. 인간이 컴퓨터가 해석할 수 있는 무언가를 쓸 수 있게 해준다. 네모난 프롬프트가 깜빡이던 모습은 우리 중 많은 이들이 절대 잊지 못할 것이다.
어쨌든 다 좋지만 내 시간은 매우 제한적이었다. 두 주말에 걸쳐 가족 행사 일정과 친구들과의 긴 바비큐를 위해 고기를 준비하느라 쓸 수 있는 시간은 몇 시간뿐이었다. 그래도 요령을 쓰면 자투리 시간에 에디터를 만들 수 있을지 모른다고 생각했다. 목표는 매우 작고, curses 없이, 구문 강조가 되는 에디터를 만드는 것이었다. 기본적으로 쓸 만한 것. 그게 조건이었다. 별거 아닌 것 같지만 몇 시간 만에 이 모든 걸 처음부터 만드는 건 이미 어려운 일이다.
그런데… 잠깐, 나는 예전에 에디터를 만든 적이 있다. 어린이를 위한 Lua 기반 프로그래밍 환경인 LOAD81 프로젝트의 일부다. 그걸 그냥 재활용하면 어떨까… 그리고 화면에 출력할 때 SDL을 쓰는 대신 터미널에 직접 VT100 이스케이프 시퀀스를 보내면 어떨까? 그 코드도 가지고 있다, linenoise에 있다. 결국 다른 여러 진지한 프로젝트에서 자리를 잡게 된 또 다른 장난감 프로젝트다. 그러니 둘을 섞어 보면…
첫 주 토요일 아침에는 바다에 갔는데 정말 좋았다. 나중에 동생이 에든버러에서 카타니아로 왔고, 하루가 저물 무렵 우리는 낮 동안의 30도를 버티려 애쓰며 정원에서 노트북을 펼치고 함께 앉아 있었고, 그래서 에디터의 첫 골격을 해킹하기 시작했다. LOAD81 코드는 꽤 모듈화되어 있어서 원래 프로젝트에서 떼어내는 건 일도 아니었다. 몇 시간 만에 대충 편집은 할 수 있게 되었고, 이미 잘 시간이 되었다. 다음 날 바다로 떠나기 전에 다시 작업했다. 15살인 내 아들은 오후 1시까지 잔다. 결국 내가 15살 때 여름 방학에 그랬던 것처럼 말이다. 그래서 그가 일어날 때까지 30분씩 끊어 코딩하고, 나머지 시간은 사랑스러운 딸과 놀며 보냈다. 마침내 일요일 밤 늦게 남은 것들을 정리하려 애썼다.
예전에는 프로젝트를 해킹한다는 게 말 그대로 며칠 동안 풀타임으로 *해킹*하는 것이었는데 말이다. 이제는 늙었지만, 그래도 장난감 에디터를 만들고 그걸 진지한 일이라고 여길 만큼은 아직 젊다 :-)
하지만 삶은 팍팍하고, 월요일이 왔다. 진짜 업무, 장난감 프로젝트를 할 시간도, 주말 동안 만든 걸 공개할 시간조차 없었다… 최소한의 다듬기와 블로그 글 정도는 필요했다.
이번 월요일이 되어서야 “Kilo” 에디터에 다시 손을 댈 수 있었다. 코드가 1024줄 미만이라 Kilo라고 이름 붙였다. 코드 줄 수를 세는 cloc 유틸리티가 1024줄까지 아직 100줄 정도 여유가 있다고 알려주었고, 진지한 에디터라면 어쨌든 “검색” 기능이 필요하니까. 그래서 코드로 돌아가 조금 재구성하고 주석도 다시 달아보려 했다. 알다시피 몇 시간 만에 두 프로젝트 조각을 섞으면 코드 품질이 그다지 훌륭하지 않을 위험이 있으니까.
자, 이제 공개할 시간이다, 이 미친 프로젝트의 끝이다. 누군가는 이걸 진짜 에디터를 만들기 위한 출발점으로 쓸지도 모르고, 아니면 일반적인 REPL 방식을 넘어서는 새로운 흥미로운 CLI를 만드는 데 쓰일지도 모른다.
코드는 여기 있다: http://github.com/antirez/kilo
글을 무작위로 읽기