2007년 3월 31일

쓸만한 이맥스 rhtml 모드

루비 온 레일스 프로젝트를 할 때 이맥스로 rhtml 파일을 편집해야 할 일이 많다. 그러나 기본 설정의 이맥스는 rhtml을 편집할 경우에는 자동으로 모드를 전환해주지 않는다. rails.el을 사용하는 경우에는 html 모드를 주모드로 하게 되는데 내장된 루비 코드가 인식이 되지 않기 때문에 별로 좋지 않다. 게다가 nxml-mode같이 html을 다루기 더 좋은 모드도 있는데 html 모드를 쓰고 싶지 않을 것이다. 이것에 대하여 꽤 괜찮은 글이 있어서 포스팅 해 본다.

문제는 여러 모드 중에서 하나를 선택하여야 한다는 것이고 하나를 선택하면 다른 것의 특징은 잃어버리게 된다는 것이다. 이 글에서 트랙백하고 있는 페이지의 저자는 Rinari라고 하는 패키지가 꽤 좋은 특징이 있는데 다른 특징이 빈약하다고 한다.

리스프의 강력함 덕분에 해결책은 간단하다. 다음과 같은 방법으로 nxml 모드 + 지능적 루비 코드 다루기를 할 수 있다. 원문에서 조금의 추가/수정을 가하였다.

  1. Rinari 패키지에서 rhtml 부분을 내려받는다.
    svn checkout svn://pstickne@rubyforge.org/var/svn/rinari/trunk/rhtml
    
  2. nxml-mode를 설치하지 않았다면 설치한다. 젠투 리눅스를 사용하는 경우라면 다음 명령을 입력한다.
    emerge nxml-mode
    
  3. rails.el 이 깔려 있지 않다면 설치한다.
  4. ruby-electric이 깔려 있지 않다면 설치한다.
  5. $HOME/.emacs 파일에 다음을 추가한다.
    (add-to-list 'load-path "~/.emacs.d/rhtml/")
    (add-to-list 'load-path "~/.emacs.d/emacs-rails/")
    (require 'nxml-mode)
    (require 'rhtml-mode)
    (require 'rails)
    (add-hook 'nxml-mode-hook
       (lambda ()
         (define-key nxml-mode-map "r" 'newline-and-indent)
         (setq indent-tabs-mode nil)
         (setq local-abbrev-table nxml-mode-abbrev-table)
         (message "My nxml-mode customizations loaded")))
    
  6. rhtml/rhtml-mode.el 파일을 편집하여 (define-derived-mode rhtml-mode html-mode “RHTML” 부분에서 html-modenxml-mode 로 바꾼다.
  7. rails.el 파일을 열어서 (setq auto-mode-alist (cons '("\.rhtml$" . html-mode) ...)...) 부분을 찾아서 html-code를 rhtml-code로 바꾸어 준다.
  8. 이제 rhtml 파일을 열때마다 꽤 괜찮은 화면이 나온다.

이렇게 하니까 삽입된 루비 코드가 제대로 하이라이팅이 되어 나오지 않았다. 따라서 6번 항목을 원래대로 돌리고 사용하고 있는데, 결국 html 대신에 nxml-mode로 사용하는 것은 실패한 셈이다.

여기에는 rhtml을 validation 할 때 발생하는 오류를 제거하기 위한 nxml-mode의 패치가 있다. 단, 이 패치로 모든 문제점이 해결되지는 않는다.