Tag Archives: Emacs

윈도우즈에서 OCaml 개발 환경 (tuareg)

예전엔 FreeBSD에서 vi로 작업했었는데, Lisp/Slime 환경에 친숙해지면서 OCaml에서도 비슷한 개발환경을 찾아보게 됐습니다. Emacs외에도 몇가지 통합개발환경이 있지만 저는 Emacs 위에서 돌아가는 tuareg mode를 받아서 설치했습니다. 저는 로컬 윈도우즈에서 Emacs를 사용하지만 유닉스에서도 동일하게 사용할수 있습니다. OCaml은 mingw 기반의 설치파일을 받아서 설치했습니다.

tuareg는 tuareg-mode-1.46.1.zip를 받아서 Emacs의 site-lisp에 압축을 풀었습니다. 그리고는 다음을 .emacs 파일에 추가해주었습니다.

[CODE type=lisp](add-to-list ‘load-path “c:/Progra~1/emacs/site-lisp/tuareg-mode-1.46.1”)
(setq auto-mode-alist (cons ‘(“\\.ml\\w?” . tuareg-mode) auto-mode-alist))
(autoload ‘tuareg-mode “tuareg” “Major mode for editing Caml code” t)
(autoload ‘camldebug “camldebug” “Run the Caml debugger” t)

(defvar tuareg-interactive-program “c:/Progra~1/Object~1/bin/ocaml”)
(defvar tuareg-library-path “c:/Program Files/Objective Caml/lib”)
[/HTML][/CODE]
tuareg-interactive-program 지정할때  Program Files와 Objective Caml등으로 넣으면 OCaml 실행이 안되더군요.. 위 사항을 적용하면 ml이나 mli 파일을 읽을때 tuareg-mode로 자동으로 넘어갑니다.

키는 Lisp/Slime과 많이 유사하지만, Slime보다는 제공하는것이 적네요. C는 Ctrl, M은 Alt(Meta)키 입니다.

  • C-x C-e, C-c C-e, C-M-x : 세가지 키조합 모두 현재 expression을 실행합니다. OCaml이 실행중이 아니면 실행합니다.
  • C-c C-b : 현재 버퍼(파일)을 실행합니다.
  • C-c C-c : make를 실행하는데 프로젝트에 맞는 Makefile이 있어야합니다.
  • C-M-p, C-M-n : (toplevel) expression 위아래로 이동.
  • C-c C-a : ml과 mli 사이를 왔다갔다 합니다. 아주 유용한 기능이네요.

또 Emacs메뉴에 Tuareg에 보면 여러가지 기능이 제공됩니다. Definition-Scan을 선택하면 현재 파일에서 모든 정의(type & value)를 정리해서 메뉴에 보여줍니다. 또 C-c . 으로 시작하는 명령들이 있는데, 많이 사용하는 구절들을 빠르게 입력할수 있게 도와줍니다. 한가지 아쉬운점은 completion 기능이 동작하지 않는데, 왜 그런지 아직 파악하지 못했습니다. 메뉴에 보면 관련 항목이 있는데, 활성화 되어있지 않습니다. 또한 키도 할당되어 있지 않습니다. 소스를 보면 C-c TAB( (define-key map [?\C-c ?\t] ‘tuareg-complete) 로 할당되어 있는데, 이 키는 Interrupt Caml Toplevel로 할당되어 보이고, M-x tuareg-complete로 호출해도 “Symbol’s function definition is void: caml-complete”라는 메시지만 출력됩니다.

좀더 연구 해봐야겠습니다…

윈도우즈에서 Common Lisp 개발 환경 갖추기

사용 소프트웨어: Emacs, CLISP, SLIME, HyperSpec

1. Emacs: 강력한 에디터.
Nqmacs 버전으로 Emacs 22.1이 될 개발버전을 컴파일한 Win32 배포본을 설치합니다.
http://sourceforge.net/project/showfiles.php?group_id=92168 에서
emacs-22.0.50.1-20050626-w32.zip를 다운로드 하여 적당한 디렉토리에 압축풀면 됩니다.
저는 C:\Program Files\emacs에 설치했습니다.
실행은 bin 디렉토리 밑에 runemacs를 실행하면 되고, 필요할 경우 바탕화면이나 시작 메뉴에 바로가기를 만들어주면 됩니다.

2. Common LISP: Emacs는 LISP로 짜여졌지만, Common LISP(이하 CL)를 사용하기 위해서는 따로 CL을 설치해야합니다. 공개 CL 중에 CLISP, SBCL을 많이 쓰는거 같은데, 여기서는 CLISP를 설치합니다.
https://sourceforge.net/project/showfiles.php?group_id=1355
에서
clisp-2.41-win32-mingw-without-readline.zip를 다운로드 하여 C:\Program Files에 압축을 풀었으며, 설치는 따로 필요없고 Emacs 설정에서 LISP 프로그램만 설정해주면 됩니다. 아래 .emacs에 대해서 설명 참조하세요.

3. SLIME: Emacs 내에서 CL 개발 환경을 만들어주는 플러그인. CLISP, SBCL등 대부분의 CL을 지원합니다.
자주 업데이트 되기 때문에 CVS 버전을 사용할 것을 권장하고 있습니다. 사용중에도 안되는게 있으면 CVS업데이트치라고 하더라고요.
http://common-lisp.net/project/slime/ 에서 설치 관련 정보를 찾을수 있습니다.

CVSROOT는  :pserver:anonymous@common-lisp.net:/project/slime/cvsroot
암호는 anonymous
모듈은 slime

emacs/site-lisp에서 체크아웃하면 됩니다. 저는 TortoiseCVS를 사용하여 체크아웃했습니다.

4. HyperSpec: Common Lisp HyperSpec (CLHS)는 CL 프로그램을 작성하면서 API를 조회할수 있는 HTML 문서입니다. clisp가 설치된 doc 디렉토리 밑에 설치하면 됩니다.
http://www.lispworks.com/documentation/HyperSpec/ 에서 밑에 보시면 download가 있습니다. tar.gz 파일인데 받아서 적당히 풀어주면 됩니다. 디렉토리 구조는 아래처럼 되면 됩니다.

clisp-2.41
  doc
   HyperSpec
       Body
       Data
       Front
       Graphics
       Issues

일단 이렇게 하면 설치는 끝났고 설정만 남았습니다. 설정은 c:\.emacs 파일을 만들어주면 됩니다.

제 .emacs 파일을 공개합니다 🙂 C:\.emacs 에 저장해주면 됩니다.

먼저 한글 관련 설정 (전 세벌식 사용자!):

;; 한글환경 설정
(set-language-environment “UTF-8”)
(setq default-input-method “korean-hangul3”)
(set-input-method “korean-hangul3”)
(prefer-coding-system ‘utf-8-dos)
(utf-translate-cjk-load-tables)

;; 글로벌 폰트락 설정
(global-font-lock-mode 1 t)

;; 한영전환 shift-space로 하기
(global-set-key [?\S- ] ‘toggle-input-method)

shift-space로 한영 전환하면 한글조합하는게 이맥스창 내에서 보이고, 윈도우즈 한/영키를 이용하면 조합할때 다른곳에 보이기 때문에 불편합니다.

리스프 설정:

;; inferior lisp
(setq inferior-lisp-program “c:/Progra~1/clisp-2.41/base/lisp.exe -M c:/Progra~1/clisp-2.41/base/lispinit.mem”
     lisp-indent-function ‘common-lisp-indent-function
     slime-complete-symbol-function ‘slime-fuzzy-complete-symbol
     slime-startup-animation nil)

;; slime
(add-to-list ‘load-path “c:/Progra~1/emacs/site-lisp/slime”)
(require ‘slime)
(slime-setup)

(setq common-lisp-hyperspec-root “c:/Progra~1/clisp-2.41/doc/HyperSpec/”)
;(setq common-lisp-hyperspec-root “http://www.lispworks.com/documentation/HyperSpec/“)

inferior-lisp라고 되어있는건 emacs lisp가 더 좋다는 의미에서 나온게 아닐까 생각이 드네요. 지금 찾아보니 emacs 밑에 붙는다고 해서 inferior인거 같네요… hyperspec은 LISP 온라인 문서입니다. LISP 배우실려면 로컬에 설치하는것이 좋죠.

기타 설정:

;(setq visible-bell t)
;(setq sound-alist ‘(t 1))
;(setq bell-volume 10)

(global-set-key “%” ‘match-paren)
        
(defun match-paren (arg)
  “Go to the matching paren if on a paren; otherwise insert %.”
  (interactive “p”)
  (cond ((looking-at “\\s\(“) (forward-list 1) (backward-char 1))
((looking-at “\\s\)”) (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))

(setq make-backup-files t)

앞에 세줄은 오류날때 소리나는거 조절할수있는데, 지금은 주석처리되어 있네요. vi에서 처럼 %로 괄호간 이동할수 기능이 구현되어 있습니다. 커서가 괄호위에 있을때만 동작합니다.

.emacs 파일에 더 내용이 있긴 한데, 나머지는 사용하면서 자동으로 Emacs에서 추가해준 설정 내용이라 공개 안합니다.

그리고 Slime 시작할때 약간 오류가 나는데 slime.el 파일을 약간 바꿔줘야합니다. CVS에 따라서 라인은 약간 다를수 있지만 현재는 1890번줄에서

‘(iso-latin-1-unix iso-8859-1-unix binary))

       –>
‘(utf-8-unix emacs-mule-unix binary))

위 처럼 바꿔주면 정상적으로 slime이 시작됩니다. 고친 방법이 정상적인 방법인지는 저도 모르지만, 아직까진 문제없이 잘 돌리고 있습니다.

그럼 모든 설치가 완료되었으니 runemacs로 Emacs를 실행하고 “M-x slime” 하면 REPL이 뜨고 LISP를 바로 사용할수 있습니다. lisp 파일 편집중 C-c C-c로 현재 위치의 S-exp을 LISP로 보낼수 있으며, C-x C-e로 커서 바로 이전 S-exp를 부분적으로 실행해 볼수 있습니다. 편집중 C-c C-z로 REPL로 다시 갈수 있습니다. SLIME 기능이 많기 때문에 좀더 공부해서 다음에 다시 설명하겠습니다.^^