2007년 12월 12일 수요일

Emacs에서 Rails 코딩하기

환경: 맥북, 레오파드

레오파드에는 Emacs가 /usr/share/emacs에 기본적으로 깔려있다.

루비와 레일즈 관련 파일들을 위치시켜야 하는 emacs 폴더:
~/emacs.d/ 또는 /usr/share/emacs/site-lisp
둘 중 어느 곳에 위치시키든, 또는 전혀 다른 곳에 위치시키든 상관 없는 것 같다. 뒤에 작성할 .emacs 파일에 파일들이 위치한 경로를 적어주면 된다.

위에서 정한 경로 내에 넣어야 하는 파일:
1. emacs-rails 파일들
http://rubyforge.org/projects/emacs-rails
다음 명령으로도 다운받을 수 있다.
svn co svn://rubyforge.org/var/svn/emacs-rails/trunk emacs-rails

2. snippet.el 파일
http://www.kazmier.com/computer/snippet.el
find-recursive.el 파일
http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt 에서 find-recursive.txt 파일을 받아서 확장자를 el로 변경
inf-ruby.el 파일
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/inf-ruby.el?view=co
그런데 이 파일은 '3. ruby 관련 파일'에서 다운 받으면 그 안에 들어있기 때문에 여기서 다운받을 필요는 없을 것 같다.

3. ruby 관련 파일
위의 파일들만 받으면 ruby-mode와 관련해서 에러가 나기 때문에 ruby 관련 el 파일들도 받아야 하는 것 같다.
http://svn.ruby-lang.org/repos/ruby/trunk/misc/ 이 곳에서 다운 받거나 다음 명령으로도 다운받을 수 있다.
svn export http://svn.ruby-lang.org/repos/ruby/trunk/misc ruby

위와 같은 파일들을 다운 받았으면 rails를 로드하는 .emacs 파일을 작성하여 홈 폴더(~)에 저장해야 한다. site-lisp 디렉토리나 루트(/)에 놓아서는 emacs에 의해 로드되지 않는 것 같았다. .emacs파일의 내용은 다음과 같다.

(setq load-path (cons "파일들이 위치한 경로명" load-path))
(require 'rails)

또는 다음과 같이 작성해도 된다.

(add-to-list 'load-path "파일들이 위치한 경로명")
(require 'rails)

하지만 계속해서 나는 다음과 같은 에러.
Symbol's value as variable is void: dirname
온갖 방법을 다 동원해 봤지만 원인을 알 수가 없었다. 에러에도 불구하고 emacs에서 Meta+X - ruby-mode를 쳐서 ruby-mode로의 전환은 가능했다. 하지만 emacs 시작시에 나는 저 에러는 그냥 넘어가기엔 너무 찜찜하다.

계속해서 실패하다가, 드디어 원인을 알아냈다. snippet.el 파일과 find-recursive.el 파일을 해당 링크로 가서 내용을 복사한 다음 emacs에 붙여넣어 두 파일을 만들었었는데, 붙여넣는 과정에서 잘못이 생긴 듯 싶다. 두 파일을 다시 '링크를 다른 이름으로 저장'하는 식으로 다운받아서 해 보니 모든 것이 순조롭게 돌아간다.

그리고 http://sodonnell.wordpress.com/the-emacs-newbie-guide-for-rails/ 가 가장 설명이 잘 되어 있는 것 같다. 다운 받아야 하는 각 부분이 어떤 역할을 하는지를 잘 설명해 주고 있다. 이 사이트에서는 ruby-mode와 ruby-electric, snippet, find-recursive를 명시적으로 require 하는 식으로 .emacs 파일을 작성했다. 하지만 다른 사이트에서는 .emacs의 내용이 로드할 디렉토리를 지정한 다음 (require 'rails)만 적어주면 된다고 하는 것 같다. 후자처럼 해도 def를 치면 end가 자동으로 생기는 것과 같은 ruby-electric의 기능도 제대로 동작하는 것 같고.. 차이를 잘 모르겠다.

그리고 이 사이트에서는 ECB(emacs code browser)에 대해서도 얘기하고 있는데, ECB를 사용하면 Emacs에서 파일을 열 때 폴더구조와 파일명이 보이기 때문에 편하다. 그런데 이 사이트가 ECB 명령어를 좀 이상하게 적어놓고 있어서 한참 삽질을 하게 만든다; 삽질끝에 알아낸 명령어는 다음과 같다.

ECB 활성화: meta+x ecb-activate
ECB 비활성화: meta+x ecb-deactivate
Jump to the directory window: ctrl+c .gd
Jump to the history window: ctrl+c .gh
Jump to the last window you were in: ctrl+c .gl
Jump to the first editor window ctrl+c .g1

그리고 테스트로 rhtml 파일을 생성해서 편집해 보았는데 html 태그의 indentation이 전혀 제대로 되지 않는다. 어쩔 수 없이 emacs에 원래 있는 html-mode로 전환해서 편집해야 한다.

핫 그런데 방금 rails 프로젝트의 view 디렉토리 내에서 rthml 파일을 생성하니 HTML view RoR이라고 모드가 제대로 뜬다.


References

Emacs for Rails << Software bits and pieces
http://sodonnell.wordpress.com/the-emacs-newbie-guide-for-rails/
rubyforge
http://rubyforge.org/projects/emacs-rails
rails on emacs
http://dima-exe.ru/rails-on-emacs
ruby: installing emacs extensions
http://www.rubygarden.org/Ruby/page/show/InstallingEmacsExtensions
How to use emacs with rails
http://wiki.rubyonrails.org/rails/pages/HowToUseEmacsWithRails
emacs에서 rails를 다루자
http://cafe.naver.com/amagramer.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=488


나의 .emacs 코드

;;Rails with Emacs

;Allows syntax highlighting to work, among other things
(global-font-lock-mode 1)

; loads ruby mode when a .rb file is opened.
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/ruby")
(autoload 'ruby-mode "ruby-mode" "Major mode for editing ruby scripts." t)
(setq auto-mode-alist (cons '(".rb$" . ruby-mode) auto-mode-alist))
(setq auto-mode-alist (cons '(".rhtml$" . html-mode) auto-mode-alist))

; adding ruby electric
(add-hook 'ruby-mode-hook
(lambda()
(add-hook 'local-write-file-hooks
'(lambda()
(save-excursion
(untabify (point-min) (point-max))
(delete-trailing-whitespace)
)))
(set (make-local-variable 'indent-tabs-mode) 'nil)
(set (make-local-variable 'tab-width) 2)
(imenu-add-to-menubar "IMENU")
(define-key ruby-mode-map "\C-m" 'newline-and-indent) ;Not sure if this line is 100% right but it works!
(require 'ruby-electric)
(ruby-electric-mode t)
))

;These lines are required for ECB
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/eieio-0.17")
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/speedbar-0.14beta4")
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/semantic-1.4.4")
(setq semantic-load-turn-everything-on t)
(require 'semantic-load)

; This installs ecb - it is activated with M-x ecb-activate
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/ecb-snap")
(require 'ecb-autoloads)

(setq ecb-gzip-setup (quote cons))
(setq ecb-layout-name "left14")
(setq ecb-layout-window-sizes (quote (("left14" (0.2564102564102564 . 0.6949152542372882) (0.2564102564102564 . 0.23728813559322035)))))
(setq ecb-source-path (quote ("~/work")))

; needed for rails mode
(add-to-list 'load-path "/Users/chanwoo/.emacs.d/snippet")
(require 'snippet)
(require 'find-recursive)

(add-to-list 'load-path "/Users/chanwoo/.emacs.d/emacs-rails")
(require 'rails)

댓글 없음: