이맥스로 리스프 개발환경 구축하기

이맥스여야만 하는가?

리습 프로그램을 짜는 개발 환경으로는 이맥스가 거의 유일하다. 물론 다른 에디터들에도 리습을 위한 플러그인들이 존재하고, LispWorks라는 어썸한 IDE도 있지만, 다른 에디터를 위한 플러그인들은 이맥스에서 제공하는 것에 비해 빈약한 편이고, LispWorks는 상용 프로그램인데다 이맥스와 별 다르지 않은 환경을 제공한다.

그럼 어째서 이맥스가 그토록 특별한 리습 개발 환경이 될 수 있는가? 거기에는 두 가지의 답변이 있다. 우선 첫 번째는 이맥스가 리습으로 만들어졌기 때문이다. 이맥스의 git mirror에서도 확인할 수 있듯이, 이맥스는 코어 부분의 리스프 프로세서를 제외한 대부분이 이맥스 리습이라는 리습 방언으로 만들어져있다(이맥스가 어떻게 리습을 품게 되었는지는 스톨먼의 에세이를 통해 확인할 수 있다).

Emacs Lisp의 비중이 60퍼센트에 달한다

그 때문에 이맥스가 만들어지면서 리습의 S-표현식S-Expression을 분석하고 편집하기 위한 다양한 도구들은 이미 완성된 상태였다. 그리고 이맥스가 리습 모듈을 확장하며 만들어진 에디터이다 보니, 자연스레 더 편하게 리습 프로그래밍을 할 수 있도록 변화되어왔다. 그래서 다른 리습 방언으로 프로그램을 짜기에도 적합해진 것이다(알다시피, 리습 방언들의 구조는 대개 비슷하므로...).

이맥스가 리습의 강력한 우군인 두 번째 이유는 바로 이 글에서 소개할 SLIME이라는 플러그인 덕분이다. SLIME은 'The Superior Lisp Interaction Mode for Emacs'의 줄임말인데, 이름에서 알 수 있듯이 SLIME의 본 목적은 리습의 인터랙티브 셸을 제공하는 것이다. 셸이다보니 자연스럽게 컴플리션 기능이 추가되었고, 디버그 기능, 값 검사 기능 등 다양한 기능들이 추가되었다. 기능이 하나 둘 추가되면서, SLIME은 리습 개발을 위한 모든 것을 갖추게 되었다. 리습 프로그래머들은 SLIME 덕분에 다른 개발 환경의 필요성을 느끼지 못하게 되었고, 그로 말미암아 사실상 이맥스가 리습 개발 환경의 표준이 되었다.

그래 어디 한번 해봅시다

결국 리습을 개발하려면 이맥스를, 거기서도 SLIME을 이용해야 한다. 그래서 이 글은 SLIME을 설치하고 기본적인 설정을 만져보는 것을 주제로 삼는다. 나는 당신이 이정도 수준은 된다고 믿고있다:

  • 이맥스 생초짜가 아니다. (이맥스가 처음이라면 M-x help-with-tutorial부터 해보는 것을 권한다)
  • 머신에 clisp 혹은 sbcl을 깔아두었다.
  • 이맥스 시작 스크립트가 .emacs~/.emacs.d/init.el라는 것 정도는 안다.

별로 어려운 요구사항은 아니다. 그럼 시작해볼까요...

MELPA 저장소 설정

간단하여 생략한다.

자네가 설치해야할 패키지

의 목록이다.

  • slime
  • company-mode
  • slime-company

이 글에서는 자동완성을 위해 company-mode를 이용한다. 만약 당신이 auto-complete 의 광팬이라면 유감이다. 나는 auto-complete을 쓰지 않으므로, 알아서 잘 해보길 바란다. 참고로 ac-slime 이라는 패키지가 있긴 하다.

혹시, 패키지 설치하는 법을 모르십니까?

  1. 설정파일에 melpa 저장소 설정을 저장하고 아직 이맥스를 재시작 하지 않았다면 재시작 하세요.
  2. 이맥스를 재시작한 뒤, M-x package-list-packages 명령으로 패키지 목록을 확인합니다. melpa에서 목록을 로딩하는데 약간 시간이 걸릴 수 있습니다.
  3. 패키지를 찾습니다. 만약 slime을 찾으려면, 패키지 목록에서 C-s slime으로 slime 패키지의 위치를 찾습니다.
  4. 그 위치에서 i(install)를 누르면 줄 앞에 I가 표시됩니다. 이것을 설치할 것이라는 마크입니다. 실수로 다른곳에 마크를 했다면 u로 마크를 지울 수 있습니다.
  5. x(execute)를 눌러 설치하기로 마크한 패키지를 한꺼번에 설치할 수 있습니다. 설치에는 조금 시간이 걸릴 수 있습니다.

혹은 M-x package-refresh-packages명령으로 아카이브를 한 번 동기화하고 나서 M-x package-install <package name> RET명령으로 패키지를 하나 하나 설치할 수도 있습니다.

company-mode 설정하기

company-mode는 코드 자동완성을 위한 프론트엔드 패키지이다. melpa에는 다양한 어쩌구-company, 혹은 company-어쩌구 패키지들이 존재하는데, 이 패키지들은 company의 백엔드이다. company가 이 백엔드 패키지들에게 적절한 코드 맥락을 제공하면, 백엔드 패키지는 그 상황에 맞는 자동완성 목록을 계산해주고, company는 그걸 전달 받아서 화면 위에 띄운다. company는 매우 범용적으로 설계되어 있으므로, 리습이 아닌 다른 언어를 쓸 때도 company-mode 패키지는 요긴할 것이다.

일반적으로, company-mode는 항상 켜져있는 것이 좋다. 시작 스크립트에 그 내용을 추가한다.

(require 'company)
(add-hook 'after-init-hook 'global-company-mode)

slime 설정하기

(require 'slime)
(setq inferior-lisp-program "clisp") ;; 혹은 sbcl

slime-company 설정하기

앞서 이야기 했듯이, slime-company 또한 company-mode의 백엔드이다. slimeslime-company를 로딩하도록 설정하고, 적당한 단축키들도 지정해두자. 시작 파일에 이러한 내용을 쓴다.

(with-eval-after-load 'slime
  (slime-setup '(slime-fancy slime-company)))
(with-eval-after-load 'company
  (define-key company-active-map (kbd "\C-n") 'company-select-next)
  (define-key company-active-map (kbd "\C-p") 'company-select-previous)
  (define-key company-active-map (kbd "\C-d") 'company-show-doc-buffer)
  (define-key company-active-map (kbd "M-.") 'company-show-location))

slime-fancyslime REPL을 덜 투박하게 만들어준다.

'slime-companyrequire하지 않는 이유는?

SLIME은 slime-setup을 할 때 알아서 그 패키지를 로딩한다. 만약 이미 로딩되어 있다면, slime-setup은 초기화에 실패한다. 따라서 slime-company를 명시적으로 로드하면 안 된다.

use-package를 안쓰나요?

내 맘이다.

SLIME 맛보기

시작 파일에 쓴 설정들을 적용하기 위해, 이맥스를 재시작하자. 재시작 하고 나서 아무 커먼 리습 파일(.lisp, .lsp 등)을 열어보자. 버퍼 아래의 모드 줄을 보면 SLIME 모드로 시작된 것을 확인할 수 있다.

버퍼 아래의 밝은 띠가 모드 줄이다

인터랙티브 셸과 연결하기 위해 M-x slime 명령을 수행한다.

SLIME REPL을 실행한 모습

이 곳에서 어떤 리습 코드라도 실행할 수 있다. 코드를 치다보면 코드 밑에 조그마한 창이 반짝이며 자동완성 목록을 보여준다. 이맥스 창 하단의 미니버퍼에서 각 함수에 대한 설명도 보여준다. [slime-company 설정하기] 단락에서 설정한 대로, C-nC-p, 혹은 방향키를 통해 자동완성 목록을 선택할 수 있다.

자동완성 목록이 나타난다

C-x o를 눌러 코드 버퍼로 넘어가보자. S-표현식의 오른쪽에 커서를 두고, C-x e를 눌러 표현식을 평가할 수 있다. REPL 버퍼에는 출력 결과가, 미니 버퍼에는 함수값이 표시된다.

S-표현식 실행 결과

이 글에서는 기본적인 SLIME의 사용 방법을 이 정도로 소개하지만, SLIME은 아주 파워풀한 리습 개발 도구이다. 더 많은 사용법은 공식 홈페이지에서 확인할 수 있다.

더불어, 수 많은 리습 프로그래머들이 paredit, lispy, highlight-sexps.el 등 리습의 S-표현식을 분석하고 편집하기 위한 수많은 이맥스용 도구들을 만들어 두었다. 이러한 도구들도 틈틈이 확인해보면 기존과는 아주 색다른 개발 경험을 할 수 있을 것이다.