Writing an editor in less than 1000 lines of code, just for fun

Salvatore Sanfilippo

1000줄도 안 되는 코드로 에디터 만들기, 그냥 재미로

원문은 Salvatore Sanfilippo님이 에 게재했습니다. 이 블로그 구독하기

경고: 길고 별로 쓸모없는 글입니다. 요약하자면 그냥 재미로 ncurses에 의존하지 않고 구문 강조와 검색 기능을 갖춘 1000줄 미만의 텍스트 에디터를 만들었다는 이야기입니다. 코드는 여기 있습니다: http://github.com/antirez/kilo.

스크린캐스트는 여기에서 볼 수 있습니다: https://asciinema.org/a/90r2i9bq8po03nazhqtsifksb

감성적인 분들은 계속 읽어주세요…

몇 주 전 Nano 에디터가 더 이상 GNU 프로젝트의 일부가 아니라는 소식이 있었다. 내 첫 반응은, 와, 사람들이 아직도 터미널 기반 EMAIL CLIENT에 원래 포함되어 있던 에디터의 클론인 오래된 에디터에 이렇게나 신경을 쓰는구나, 였다. 다시 한번 말해보자, “이메일 클라이언트”. 이메일 클라이언트라는 개념 자체가 이제는 사라졌고 모든 것이 변했다. 그런데도 Hacker News에서 수많은 사람들이 예를 들어 시스템 관리 작업을 할 때 아무 시스템에서나 nano를 쓸 수 있어 여러 번 구원받았다는 글을 쓰는 걸 읽었다. Nano는 내 아들이 C로 첫 프로그램을 작성할 때 썼던 에디터이기도 하다. 파일을 편집해 본 경험이 없어도 쓸 수 있는 괜찮은 경험을 제공한다.

그렇게 나는 Nano 자체보다 훨씬 더 작은 텍스트 에디터를 만드는 생각을 하기 시작했다. 그냥 재미로, 기본적으로는 작은 프로그램을 좋아하고 동경하기 때문이다.

요즘 에디터를 만드는 게 얼마나 한심하고 쓸모없고 시간 낭비인가? 우리는 반짝이고 놀라운 프로젝트, 아주 멋지고, 아주 복잡하고, 가치 있는 것들을 만들어야 한다고 여겨진다. 하지만 때로는 뚜렷한 목적 없이 무언가를 만드는 것이 상쾌하다. 추억도 있었고…

나는 Commodore 16의 롬 내장 어셈블러와 어릴 적 나중에 썼던 모든 가정용 컴퓨터와 BASIC 인터프리터에서의 첫 경험들을 기억한다. 에디터는 인간과 기계 사이의 근본적인 연결이다. 인간이 컴퓨터가 해석할 수 있는 무언가를 쓸 수 있게 해준다. 네모난 프롬프트의 깜빡임은 우리 중 많은 이가 절대 잊지 못할 것이다.

뭐, 다 좋지만 내 시간은 매우 제한적이었다. 두 주말에 걸쳐 예정된 가족 행사들과 긴 바비큐 시간 동안 친구들을 위해 준비해야 할 고기가 있었다. 그래도 요령을 써서 자투리 시간 몇 시간으로 에디터를 만들 수 있을지도 몰랐다. 내 목표는 매우 작고, curses 없이, 구문 강조가 있는 에디터를 만드는 것이었다. 기본적으로 쓸 만한 것. 그게 조건이었다.. 별거 아닌 것 같지만 이 모든 걸 몇 시간 만에 처음부터 만드는 건 이미 어렵다.

하지만… 잠깐, 나는 사실 과거에 에디터를 만든 적이 있다. 어린이를 위한 Lua 기반 프로그래밍 환경인 LOAD81 프로젝트의 일부다. 그냥 재사용하면 되지 않을까… 그리고 SDL을 써서 화면에 쓰는 대신 VT100 이스케이프 시퀀스를 터미널로 직접 보내면 어떨까? 그리고 그 코드는 linenoise에도 있다. 결국 다른 여러 진지한 프로젝트에서 자리를 잡게 된 또 다른 토이 프로젝트다. 그러니 둘을 섞어 보면…

첫째 주 토요일 아침 나는 바다에 갔고 정말 좋았다. 나중에 내 동생이 에든버러에서 카타니아로 도착했고, 하루가 끝날 무렵 우리는 노트북을 들고 정원에 함께 앉아 낮 동안 30도까지 올랐던 더위를 버텨내려 애쓰면서, 나는 에디터의 첫 번째 골격을 해킹하기 시작했다. LOAD81 코드는 꽤 모듈화되어 있어서 원래 프로젝트에서 떼어내는 건 식은 죽 먹기였다. 몇 시간 만에 어느 정도 편집이 가능해졌고, 이미 잘 시간이 되었다. 다음 날 나는 다시 바다로 떠나기 전에 또 작업을 했다. 내 15살 아들은 오후 1시까지 자는데, 결국 여름방학 때의 15살이던 나도 그랬으니, 나는 그가 일어나기를 기다리며 30분씩 끊어 코딩을 더 했고, 나머지 시간은 사랑스러운 딸과 놀며 보냈다. 마침내 일요일 밤 늦게 남은 것들을 모두 고치려고 했다.

참, 몇 년 전만 해도 프로젝트를 해킹한다는 건, *해킹*한다는 건, 며칠 동안 종일 매달리는 것이었음을 기억한다. 나는 이제 늙었지만, 그래도 장난감 에디터를 만들고 그걸 진지한 일로 여길 만큼은 아직 젊다 :-)

하지만 삶은 고되고, 월요일이 왔다. 진짜 일, 장난감 프로젝트를 할 시간도 없고, 주말 동안 만든 것을 공개할 시간조차 없었다… 최소한의 다듬기와 블로그 글은 필요했다.

나는 이번 월요일이 되어서야 “Kilo” 에디터에 다시 손을 댈 수 있었다. 코드가 1024줄 미만이라 Kilo라고 이름 붙였다. 코드 라인 수를 세는 데 쓰는 “cloc” 유틸리티가 1024 LOC에 도달하기까지 아직 ~100줄 정도의 여유가 있다고 알려줬고, 진지한 에디터라면 결국 “검색” 기능은 있어야 하니까. 그래서 코드로 돌아가 조금 재구성하고 주석도 다시 달아 보려고 했다. 알다시피, 몇 시간 만에 두 프로젝트 조각을 섞으면 코드 품질이 그다지 훌륭하지 않을 위험이 있으니까.

자, 이제 공개할 시간이다, 이 미친 프로젝트의 끝이다. 누군가는 이걸 진짜 에디터를 만들기 위한 출발점으로 쓸지도 모르고, 어쩌면 일반적인 REPL 스타일 모델을 넘어서는 새로운 흥미로운 CLI를 만드는 데 쓰일 수도 있을 것이다.

코드는 여기 있습니다: http://github.com/antirez/kilo

HN 댓글: https://news.ycombinator.com/item?id=12065217

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글