Emacs 에서 조금이라도 처음 실행 될 때 속도를 높일려고 하다 보면 필연적으로 .el 파일을 컴파일 해서 .elc 로 만들게 됩니다. 속도가 얼마나 빨라지겠느냐 하지만 기분상이라도 빨라지게 하려면 컴파일 해주는 것이 좋습니다. 더구나 컴파일만 해주면 알아서 .el 대신 .elc 파일을 로딩하니 편리하기도 합니다. 

일반적으로 .el 파일을 컴파일 할려고 하면 


M-x byte-compile-file  
컴파일 대상 파일 지정 



이런식으로 컴파일을 해줘야 합니다. 하지만 이 얼마나 불편합니까? 따라서 디렉토리에 존재하는 모든 .el 파일을 컴파일 하는 명령을 소개할 까 합니다. 



C-u 0 M-x byte-recompile-directory



앞에 C-u 0 (숫자임) 을 붙이는 이유는 질문이 안나오고 전부 .el 을 .elc 로 바꾸기 위해서 입니다. 일일이 물어보는 것에 답하면서 컴파일 하면 귀찮지 않겠습니까? 



SSH 를 이용해서 원격에 접속해서 Emacs 를 구동할 때 Meta Key 가 설정되어 있지 않아서 ESC 를 써야 하는 불편함이 있었습니다. 정말 빠르게  Option Key 를 메타키로 설정하는 방법을 알려드립니다. 


터미널 설정창을 열고 '키보드' 탭에 가시면 아래쪽에 'option을 메타 키로 사용' 체크 박스에 체크만 하시면 됩니다. 

이 간단한 걸 가지고 계속 ESC 를 썼다니 흑흑.. 제 환경은 SnowLeopard 입니다. 보통때 Emacs Client 는 Aquamacs 를 사용하지만 서버 작업할 때는 원격지 접속을 해야 하는 관계로 터미널을 씁니다. 



OSX Snow Leopard 에서 Rails 개발하게 됐습니다. 환경 세팅이 되야 본격적으로 개발을 진행 할 테니 이 글은 개발 환경 세팅에 관한 글입니다. 

1. Emacs Client 는 OSX 에서 사용하는 Aquamacs 입니다. Ruby-mode 는 내장된 것을 사용함 
2. 색 배정은 Color Theme 를 사용합니다. 
3. Rails Helper 는 Rinari 를 사용합니다. 
4. snippet 기능은 yasnippets 를 사용합니다. 
5. ruby-mode 에서 complete 기능은 ri-emacs 기능을 사용합니다. 


Aquamacs 는 설치가 되어 있다고 가정합니다. 

1. ~/Library/Preferences/Aquamacs Emacs/http://github.com/zhannes/Aquamacs-Emacs 에서 받은 파일들을 복사해 넣습니다. 



2. ~/Library/Preferences/Aquamacs Emacs/Preferences.el 을 열어서 다음과 같이 수정해 줍니다. 



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load ruby-mode.el                 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;loads ruby-mode.el - activate with M-x ruby-mode
(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ruby-mode.el")

; loads ruby mode when a .rb file is opened.
(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))
(setq auto-mode-alist  (cons '(".rhtml$" . rhtml-mode) auto-mode-alist))

(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ruby-electric.el")


rhtml 확장자 파일이면 rhtml-mode 로 연결될 수 있도록 수정합니다.




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load emacs-code-browser           ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;Allows syntax highlighting to work, among other things

;; ;These lines are required for ECB
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/eieio")
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/speedbar")
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/semantic")
;; (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 "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/ecb")
;; (require 'ecb)

ECB 관련해서는 전부 comment 처리합니다. ECB 버젼이 낮아서 최신 버젼을 깔아주는 것이 좋겠더군요. 
 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load rails-mode.el                ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; needed for rails mode
(require 'snippet)
(require 'find-recursive)
; The rails require needs to go after ECB
; otherwise it loads a new incompatible speedbar
; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/emacs-rails")

; blik.it's rhtml enhancements
;; (add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/rhtml/")
;;(add-to-list 'load-path "~/Library/Preferences/Aquamacs Emacs/emacs_includes/plugins/emacs-rails/")
(require 'nxml-mode)
;; (require 'rhtml-mode)
;;(require 'rails)


기존에 포함된 emacs-rails 헬퍼부분을 comment 처리합니다. 이렇게 하는 이유는 Rinari 를 헬퍼로 사용하기 위해서 입니다. 

rhtml-mode 는 사용하는 모드인데 .emacs 에서 최신버젼으로 설정해 주기 위해서 기존 것을 로딩하는 부분을 comment 처리해 줍니다.

;(load "~/Library/Preferences/Aquamacs Emacs/nxhtml/autostart.el")

nxhtml-mode 는 검은색을 바탕으로 하는 색 테마에는 어울리지가 않더군요. comment 처리해 줍니다. 


(cua-mode t) -> (cua-mode nil) 

로 수정해 줍니다. 

3. ri-emacs 는 http://rubyforge.org/projects/ri-emacs/ 에서 다운 받아서 "~/.emacs.d/ri-emacs" 안에 내용을 풀어줍니다. 
.emacs 안에 


(add-to-list 'load-path "~/.emacs.d/ri-emacs")
(autoload 'ri "~/.emacs.d/ri-emacs/ri-ruby.el" nil t)
(setq ri-ruby-script (expand-file-name "~/.emacs.d/ri-emacs/ri-emacs.rb"))


와 같이 세팅해 줍니다. 

4.yasnippet 은 http://code.google.com/p/yasnippet/ 에서 다운 받을 수 있습니다. 오른쪽 중간쯤에 필요한 파일들이 나열되어 있는데요. yasnippet-bundle-0.6.1c.el.tgz 파일을 받아서 푸시고 "~/.emacs.d/plugins" 에 복사합니다. 그리고 .emacs 파일에 



(add-to-list 'load-path
             "~/.emacs.d/plugins")
(require 'yasnippet-bundle)

와 같이 지정해 주면 됩니다. 

5. rhtml-modehttp://github.com/eschulte/rhtml 에서 다운 받아서 "~/.emacs.d/rhtml" 에 압축을 풀어 줍니다. 그리고 .emacs 에 



(add-to-list 'load-path
             "~/.emacs.d/rhtml")
(require 'rhtml-mode)
(add-hook 'rhtml-mode-hook
          (lambda () (rinari-launch)))

와 같이 설정해 줍니다. 

6. yasnippet 모드에서 Rails 를 지원하기 위한 추가 팩입니다. http://github.com/eschulte/yasnippets-rails 에서 다운 받아서  "~/.emacs.d/plugins" 에 풀어줍니다
. 그리고 .emacs 에 


(load-file "~/.emacs.d/plugins/setup.el")
(add-hook 'rinari-minor-mode-hook
          #'(lambda ()
              (setq yas/mode-symbol 'rails-mode)))

와 같이 설정해 줍니다. 

7. ECB 파일을 따로 설치해 줍니다. 굳이 따로 설명을 드리지 않겠습니다. 다만 제 .emacs 파일에서는 



(add-to-list 'load-path "~/.emacs.d/cedet/common")
(add-to-list 'load-path "~/.emacs.d/cedet/contrib")
(require 'cedet)

(add-to-list 'load-path
                   "~/.emacs.d/ecb")
(require 'ecb)


이렇게 설정되어 있습니다. 

8. Rinari 모드를 설치해야 합니다. 이건 ELPA 방식으로 설치하는 것이 가장 편합니다. *scrach* 버퍼로 이동해서 모드를 lisp-interaction-mode 로 변경합니다. 그리고 다음 과 같은 내용을 버퍼에 삽입합니다. 



(let ((buffer (url-retrieve-synchronously
      "http://tromey.com/elpa/package-install.el")))
  (save-excursion
    (set-buffer buffer)
    (goto-char (point-min))
    (re-search-forward "^$" nil 'move)
    (eval-region (point) (point-max))
    (kill-buffer (current-buffer))))

내용 마지막에 커서를 위치시키고 C-xC-e 를 눌러서 버퍼를 실행시킵니다. 그리고 M-x package-list-packages 를 실행합니다. 


인스톨하고 싶은 패키치에 마우스나 커서를 위치시키고 (여기서는 Rinari) 'I' 키로 인스톨 대상을 확인 시키고 'X' 키로 인스톨을 실행합니다. 

9. html.erb 확장자 를 rhtml 모드로 동작시키기 위해서 .emacs 에 다음과 같은 내용을 채워 줍니다. 



(setq auto-mode-alist
      (cons '("\\.rhtml$" . rhtml-mode)
   auto-mode-alist))
(setq auto-mode-alist
      (cons '("\\.erb$" . rhtml-mode)
   auto-mode-alist))
(setq auto-mode-alist
      (cons '("\\.html\\.erb$" . rhtml-mode)
   auto-mode-alist))

10. ruby-mode 에서 yasnippets 확장을 쓰기 위해서 TAB 키에 바인딩된 함수 기능을 풀어줍니다. .emacs 에서 다음 과 같은 내용을 추가합니다. 


(add-hook 'ruby-mode-hook
          #'(lambda ()
              (define-key ruby-mode-map (kbd "TAB") nil)
              (define-key ruby-mode-map [(control return)]  'ri-ruby-complete-symbol)
              (define-key ruby-mode-map [(shift return)]  'ri-ruby-show-args)
              ))



여기까지 세팅을 하면 기본적으로 잘 동작이 될 것입니다. yasnippets 에 자주 쓰는 기능들을 등록시켜가면서 (추후에 몇개 공개하겠음) Rails 개발을 하면 Emacs 사용자로서 보람도 느끼고 상용 Rails 개발툴이 안 부러울 것입니다. (왜냐하면 우리는 이맥션 이기 때문이지요 캬오!!) 그런데 발생하는 중대한 문제가 있습니다. rhtml-mode 로 yasnippets 로 사용하다 보면 erb block 안에 { } <-- 이게 들어갈 때 문제가 발생하기 시작합니다. unclosed tag 에러가 발생하기 시작하는데 이거 수정이 매우 어렵습니다. 처음에 정규표현식을 바꿔서 수정해 볼까 하다가, 나중에는 포기하고 그냥 rhtml-mode 자체를 수정하기로 결심했습니다. 

rhtml-mode.el 파일을 열어줍니다. 제 경우에는 ~/.emacs.d/rhtml/rhtml-mode.el 에 있습니다. 


(define-derived-mode rhtml-mode
;  html-mode "RHTML"
  html-helper-mode "RHTML"
  "Embedded Ruby Mode (RHTML)"
  (interactive)
  (abbrev-mode)
  ;; disable if you don't want it...
  (rhtml-activate-fontification))

html-mode "RHTML" 을 
html-helper-mode  "RHTML" 로 수정

rhtml-mode 가 html-mode 에서 상속받은 형태의 mode 였는데 이것을 html-helper-mode 에서 상속받게 바꾸어 주기만 하면 됩니다. 에 게다가 바꾸는 김에 조금 더 바꿔줍니다. rhtml-mode 일때 erb-block 을 highlight 시키는데 이게 눈에 상당히 거슬립니다. 

rhtml-fonts.el 파일을 열어줍니다. 제 경우에는 ~/.emacs.d/rhtml/rhtml-fonts.el 에 있습니다. 



(defface erb-face
  '((((class color) (min-colors 88) (background dark))
;     :background "#383838")
    :background "black")
    (((class color) (min-colors 88) (background light))
     ;; :background "azure")
     :background "snow2")
    (((class color) (min-colors 16) (background dark))
     :background "blue3")
    (((class color) (min-colors 16) (background light))
     :background "azure")
    (((class color) (min-colors 8))
     :background "blue")
    (((type tty) (class mono))
     :inverse-video t)
    (t :background "gray"))
  "Default inherited face for ERB tag body"
  :group 'rhtml-faces)

이렇게 수정해 줍니다. 즉 

:background "#383838") 을 
:background "black") 으로 수정

자 이제 마지막으로 erb block 이 시작되는 델리미터까지 깔끔하게 수정해 주기로 합니다. rhtml-fonts.el 파일에서 



;; (defface erb-out-delim-face
;;   `((((background dark)) :foreground "#aaffff" :background "#383838")
;;     (t (:inherit erb-delim-face :weight bold :foreground "darkred")))
;;   "Basic face for Ruby embedded into HTML"
;;   :group 'rhtml-faces)

(defface erb-out-delim-face
  `((((background dark)) :foreground "#aaffff" :background "black")
    (t (:inherit erb-delim-face :weight bold :foreground "darkred")))
  "Basic face for Ruby embedded into HTML"
  :group 'rhtml-faces)


전체를 comment 처리한 것으로 보이지만 :background "#383838" 부분을 "black" 으로 바꿔주기만 한 것입니다. 

조금 길지만 충분히 따라할 만한 설정입니다. 즐겁게 Rails 코딩하세요 ~ 




Rails 개발을 시작하게 된 김에, 스타일을 텍스트 메이트 스타일로 바꿔줬습니다. 레일즈 개발하기에는 Textmate 가 정말 좋다고 하더군요. (텍메 살돈은 없으니 그냥 손에 익은 이맥스로 쿨럭..)



매번 Emacs 로 작업할 때 간단한 정규표현식인데 자꾸 까먹는 방법입니다. 오늘은 큰맘 먹고 적어서 기록을 남기기로 합니다. 

예를 들면 
 
Blinds, Fade, Fly, Iris, Photo, PixelDissolve, Rotate, Squeeze, Wipe, Zoom, Random

이렇게 단어만 나열 되어 있는 내용들을 복사해 왔을 때, 문자열 모음으로 바꾸고 싶을 것입니다. 

 "Blinds", "Fade", "Fly", "Iris", "Photo", "PixelDissolve", "Rotate", "Squeeze", "Wipe", "Zoom", "Random"


가장 쉬운 방법으로는 일일이 손으로 쳐 넣는 것이 있습니다. 쉽긴 하지만 내가 뭐하나 싶을 때가 있지요. 


M-x replace-regexp 

로 그림에 나와 있는 방법대로 치면 됩니다. \(\<\w+\>\) RET "\1"       : RET 은 Enter 키 한번 치는 것입니다. 



아이폰 개발을 Emacs 로 하시는 분들은 Object-c 의 그 살인적인 키워드 길이 (예를 들면 scheduledTimerWithTimeInterval 이런것) 에 당황하실 때가 있으리라고 생각합니다. XCode 내장된 에디터를 사용하시면 물론 편합니다. 하지만 Emacs 로 개발하시려면 여간 성가신게 아닌데요. Emacs 에 내장된 objc-mode 가 나쁘지는 않습니다. 괜찮게 쓰고 있는 편이긴 하지만 역시 부족한건 부족한 것입니다.

예컨대 scheduledTimerWithTimeInterval  이런 함수를 외워서 쓸려면 여간 부담되는 게 아닙니다. 자동 완성을 구현하고 싶기는 한데, 아직 귀찮아서 그쪽까지 공부할 여력은 안되더군요. 대신 제대로 쳤는지 확인하기 위해서라도 키워드의 색을 다르게 해 주고 싶더군요.

예전에 포스팅 했던 "Major 모드에 Keyword 추가하기" 의 변형입니다.

일단 결론입니다. 설정하면 다음과 같이 보입니다.

"누르면 커져요"


인디안레드 색으로 보이는게 추가한 키워드 입니다. 뭐 지금 당장 완벽한 것은 아니고요. 차차 알게되는 키워드를 추가할려고 생각중입니다. 남의 object-c 라이브러리를 얻어다 쓰는 처지라 어떤 것이 Object-c 원래 키워드인지 알아내는 과정도 필요해서 시간이 좀 걸릴 것 같습니다. (배경색으로는 칠판색을 선택해서 쓰고 있습니다. 그렇게 보기 싫어하던 칠판을 이 나이가 되서 텍스트 에디터에서 매번 보고 있습니다.)

실제로 키워드 추가하는 방법입니다.

1. 건드리는 프로그래밍 언어가 알게 모르게 많기 때문에 font-lock 을 전문적으로 하기 위해서 ~/.emacs.d/ 안에 관련 폴더를 한개 만들어 줬습니다. "~/.emacs.d/lang-font-lock" 으로 정해줬습니다.

2. 파일 한개를 생성합니다. 저는 "obj-c-add-font-lock.el" 로 만들어 줬습니다.

3. 그 내용입니다. (obj-c-add-font-lock.el)

(make-face 'cr-obj-c-keywords-face)

;; M-x list-color-display
(set-face-foreground 'cr-obj-c-keywords-face "IndianRed")

(font-lock-add-keywords 'objc-mode '(("\\<loadNibNamed\\|setNeedsDisplay\\|mainBundle\\|scheduledTimerWithTimeInterval\\>" . 'cr-obj-c-keywords-face)))
(font-lock-add-keywords 'objc-mode '(("\\<addSubview\\>" . 'cr-obj-c-keywords-face)))

(provide 'obj-c-add-font-lock)


윗 부분은 전에 올렸던 내용과 비슷합니다. loaddNibNamed 와  setNeedsDisplay , mainBundle, scheduledTimerWithTimeInterval 그리고 addSubview 를 우선 키워드로 등록해줬습니다. 마지막에 (provide 'obj-c-add-font-lock) 은 .emacs 에서 require 문을 쓰기 쉽게 해주려고 추가해줬습니다.

4. .emacs 에 다음과 같이 추가해서 로딩때 불러주기로 합니다.
(add-to-list 'load-path "~/.emacs.d/lang-font-lock")
(require 'obj-c-add-font-lock)

이제 키워드를 알아갈 때마다 obj-c-add-font-lock.el 파일에 추가해주시면 됩니다.





XCode 는 강력한 통합 IDE 입니다. 자체 에디터도 쓰기 편리하고 아이폰이나 맥 어플리케이션 개발에 최적화 되어 있습니다. 하지만 이맥스 유저들은 텍스트 에디팅 자체를 다른 툴에서 하라고 하면 몸에 두드러기가 발생하나 봅니다. (아 저만 그런가여? ㅎㅎ) 그래서 에디팅 자체를 Emacs 에서 할 수 있는 방법이 있습니다.


Preferences 에서 "text" 라고 되어 있는 부분을 외장 에디터로 설정할 수가 있습니다. 저 같은 경우에는 Aquamacs 로 지정해 줬습니다.

그리고 .emacs

(setq ns-pop-up-frames 'nil)


와 같이 추가해주면 소스 파일을 클릭했을 때 새 Frame 에서 창이 열리는 것을 막아줍니다.


드디어 올것이 오고 말았군요.
clojure 를 emacs 에서 slime 과 연결시키는 방법에 관한 것입니다. 물론 제가 쓰고 있는 osx snow leopard 에서 말이죠. 기존에 제가 쓰고 있던 환경은 emacs 에 slime 을 clbuild 버젼으로 연결시켜서 쓰고 있었습니다. 나름 편해서 애용하고 있었는데 이번에 clojure 를 연결 시켜야 해서 살짝 골치가 아프군요.

참고로 clbuild 를 쓰게 되면 slime 관련 설정 부분입니다. (.emacs 에 있음)

(setq load-path (cons "/Users/crazia/work/clbuild/source/slime" load-path))
(setq load-path (cons "/Users/crazia/work/clbuild/source/slime/contrib" load-path))
(setq slime-backend "/Users/crazia/work/clbuild/.swank-loader.lisp")
(setq inhibit-splash-screen t)
(load "/Users/crazia/work/clbuild/source/slime/slime")
(setq inferior-lisp-program "/Users/crazia/work/clbuild/clbuild lisp")
(setq slime-use-autodoc-mode nil)
(slime-setup '(slime-fancy slime-tramp slime-asdf))
(slime-require :swank-listener-hooks)

복잡하지요? 그래서 자동화 방법을 애용하기로 하겠습니다.

ELPA 라는 것이 있습니다. Emacs Lisp Package Archive 의 약자입니다. 말 그대로 Emacs 에서 쓰기 편하게
여러가지들을 제공하는 패키지 시스템이라고 할 수 있습니다.

http://tromey.com/elpa/install.html  여기에서 제공하는 방식으로 하면 인터페이스 버퍼가 뜹니다.

 
(let ((buffer (url-retrieve-synchronously
           "http://tromey.com/elpa/package-install.el")))
  (save-excursion
    (set-buffer buffer)
    (goto-char (point-min))
    (re-search-forward "^$" nil 'move)
    (eval-region (point) (point-max))
    (kill-buffer (current-buffer))))


이 내용을 *scratch* 버퍼에 가져다 두고 C-j 를 입력하면 된다고 쓰여져 있는데, AquaEmacs 의
경우에는 *scratch* 버퍼가 lisp-interaction-mode 로 설정되어 있지 않습니다.  따라서

M-x lisp-interaction-mode


바꾸시고 위의 내용을 복사해서 넣고 C-j 를 입력하세요. 반응이 만약 없다면 C-xC-e 로도 되는것 같더군요. 어찌 됐건 위의 코드를 실행하면 명령을 하나 쓸수가 있습니다.
M-x package-list-packages


를 입력하면 조금 시간이 걸리지만 설치할 수 있는 목록 리스트가 주르륵 나옵니다. 그중에서 swank-clojure 를 찾아서 'i' 를 눌러서 체크를 하시고 'x' 를 눌러서 설치가 됩니다.
그러면 .emacs 파일 아래쪽에 다음과 같은 코드가 자동으로 추가됩니다.

 (when
     (load
      (expand-file-name "~/.emacs.d/elpa/package.el"))
   (package-initialize))


package-initialize 가 실행된다면 기존에 설정되어 있는 slime 설정하고 충돌이 일어납니다. 멋지게 해결할 수 있는 방법이 없으니.. 귀찮지만 clbuild 로 웹 개발할 때와 클로져 공부 할 때를 구분시키는 방법으로 잠시동안 머물러야 겠습니다. 위에 있는 코드를 삭제하고 맨 위에 있는 clbuild 용 slime 설정 코드도 삭제해 줍니다.

(defun select-lisp-program (n)
  (interactive "n1:clbuild 2:clojure : (enter number)  ")
  (cond ((= n 1) (progn
                   (setq load-path (cons "/Users/crazia/work/clbuild/source/slime" load-path))
                   (setq load-path (cons "/Users/crazia/work/clbuild/source/slime/contrib" load-path))
                   (setq slime-backend "/Users/crazia/work/clbuild/.swank-loader.lisp")
                   (setq inhibit-splash-screen t)
                   (load "/Users/crazia/work/clbuild/source/slime/slime")
                   (setq inferior-lisp-program "/Users/crazia/work/clbuild/clbuild lisp")
                   ;;(setq inferior-lisp-program "clj")
                   (setq slime-use-autodoc-mode nil)
                   (slime-setup '(slime-fancy slime-tramp slime-asdf))
                   (slime-require :swank-listener-hooks)
                   (add-hook 'lisp-mode-hook (lambda () (slime-mode t)))
                   (add-hook 'slime-repl-mode-hook (lambda () (slime-mode t)))
                   (add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))

                   (define-key slime-mode-map (kbd "C-,") 'forward-sexp)
                   (define-key slime-mode-map (kbd "C-.") 'backward-sexp)
                   (define-key slime-mode-map (kbd "TAB") 'slime-indent-and-complete-symbol)
                   (define-key slime-mode-map (kbd "RET") 'paredit-newline)
                   (define-key slime-mode-map (kbd "<return>") 'paredit-newline)

                   (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
                   ))
        ((= n 2)
         (when
             (load (expand-file-name "~/.emacs.d/elpa/package.el"))
           (package-initialize))))
  )


그리고 두가지를 한 함수로 합쳐서 제공합니다. 위의 내용을 .emacs 에 추가하시면 다음 emacs 를 실행시키고 상황에 따라서

M-x select-lisp-program


명령으로 1 (clbuild) 나 2 (clojure) 로 개발 모드를 바꿔가면서 사용하실 수 있습니다. 물론 이렇게 귀찮게 안하고 lisp 을 clbuild 가 아닌 독자적으로 설치해서 적용하면 되지만 귀찮은걸 어쩌겠습니까 -0- clbuild 가 너무 편한걸..




Conkeror 라고 모질라 기반의 웹 브라우져 입니다. 프로그램이 추구하는 바는 바로 "Emacs" 입니다. 키보드로만 모든것을 할려는 그 정신을 이어 받았습니다. 실제로 동작하는 Key Binding 이 Emacs 의 것을 그대로 가져다 썼습니다.


생긴 것은 ('' 이렇게 생겼습니다. Emacs 키에 익숙하지 않으신 분은 별 감흥을 못 느끼실 것 같습니다. 써보고 있는데 느낌은 꼭 Mozilla-mode 가 생긴것 같습니다. ㅎㅎ

아직 Form 관련해서 버그가 조금 있는 상태인데요. 곧 좋아질 것이라고 믿습니다. 왠만한 웹 서핑은 컨커러를 가지고 하고 있습니다.


Android 를 개발하기에 제일 좋은 환경은 Eclipse 입니다.  android-sdk 에서 따로 plug-in 을 제공하고 공식문서에서 기본으로 설명하는 것이기 때문에 가장 좋은 환경이라고 할 수 있습니다. 이클립스는 기본적으로 진화된 Emacs 라고 불릴정도로 많은 기능과 다양한 플러그-인 쉬운 UI 인터페이스등 정말 좋은 IDE라고 할 수 있습니다.

그럼에도 불구하고 나는 독하게 Emacs 를 쓰시겠다고 하는 분들만 아래에 쓰여질 내용을 보시면 됩니다.

1.  Emacs 를 Android 개발 환경으로 쓸려고 하면 android-mode 를 설치해야 합니다. git 가 설치되어 있다고 가정하고

git clone git://github.com/remvee/android-mode.git


과 같이 입력합니다. 그러면 android-mode 라는 디렉토리가 생깁니다. 제 경우에는 그 디렉토리를 "~/.emacs.d/android-mode" 로 복사해줬습니다.

2. 그리고  저번 포스팅인 "[Android] Snow Leopard 에 SDK 설치하기" 에서 설치됐던 Android SDK 가 위치한 곳 (제 경우에는 저번 포스트에서 "~/work/android" 였습니다.) "PATH_ANDROID_SDK/tools/lib"밀에 있는 android.el 을 "~/.emacs.d/android-mode" 밑에 같이 복사해 줍니다.

3. 그리고  .emacs 파일에 다음과 같이 추가해 줍니다.

(add-to-list 'load-path "~/.emacs.d/android-mode")
(require 'android-mode)
(require 'android)
(setq android-mode-sdk-dir "~/work/android")

이렇게 하면 android-mode 의 기능과 android 에서 자체적으로 지원하는 android 기능을 두가지 다 쓸 수가 있습니다.

이제 실제로 프로젝트를 만들어 보기로 하지요. http://developer.android.com/guide/developing/other-ide.html 이클립스를 쓰지 않고 다른 IDE 를 쓸 경우에 참조해야 하는 곳입니다. 그중에서 프로젝트 만드는 것을 참조하기로 하겠습니다.

android create project \
--target <target_ID> \
--name <your_project_name> \
--path path/to/your/project \
--activity <your_activity_name> \
--package <your_package_namespace>
라는 식으로 만들게 되어 있습니다. 다 일반적인 내용이고 실제로 몇번 만들어 보시면 어떤식으로 돌아가는지 아실 수 있습니다. 참조한 사이트에서 설명도 충분하고요. 다만 target 을 실제로 어떤것을 써야 할지 감이 안오실 수 있을 실텐데요. Terminal 창을 한개 여시고

android list targets.

라고 입력하시면 target 에 대한 설명이 자세히 나옵니다. 저번 포스팅 "[Android] Snow Leopard 에 SDK 설치하기" 에서 만들어본 testMachine 이라고 하는 AVD 는 타겟이 "10" 입니다.

이렇게 만들어진 프로젝트에서 "path/to/your/project/<your_project_name>/src/<your_package_namespace 를 갈라서 디렉토리로표현>/<your_activity_name>.java" 파일을 열어서

M-x

android-ant-install

라고 입력하시면 프로젝트가 컴파일이 되고 알아서 인스톨이 됩니다.

android-mode 에서 쓸만한 단축키를 보여드리겠습니다.

"\C-c \C-c" 를 입력한 상태에서

   
    ("d" . android-start-ddms)
    ("e" . android-start-emulator)
    ("l" . android-logcat)
    ("c" . android-ant-compile)
    ("i" . android-ant-install)
    ("r" . android-ant-reinstall)
    ("u" . android-ant-uninstall)

단축키에 따라서 실행되는 명령들 입니다.

여기까지는 쉽게 따라할 수 있는 부분입니다. 이제부터가 어려운데 특히나 Snow Leopard 에 설치하는 것이라 더 힘들었던것 같습니다.

위에 나와 있는 내용대로 포스팅을 하면 그냥 노트패드 같은 에디터에서 개발하는 것과 별 차이가 없습니다. 기본적으로 code generation 이나 code auto-completion 등이 되지 않으면 쓰기에 많이 불편합니다. 그래서 JDEE (Java Development Environment for Emacs) 를 설치해서 사용하게 됩니다.

Emacs + JDEE 가 딱 자바용 Eclipse 라고 보시면 됩니다. 다시금 Eclipse 를 설치해서 개발하면 편하다는 것을 말씀드리고 싶습니다.

1. JDEE 를 다운 받습니다. http://sourceforge.net/projects/jdee/files/ 에서 받으시고. 2.4.0.1 버젼을 받으시면 됩니다. 압축을 푸시고 "~/.emacs.d/jdee-2.4.0.1/" 로 복사해 두시면 됩니다.

2. ELIB 이 필요합니다. JDEE 를 받은곳에 포함되어 있습니다. http://sourceforge.net/projects/jdee/files/ 에서 받으시고 버젼은 1.0 입니다. elib-1.0.zip 을 받으시고 압축풀고 "~/.emacs.d/elib-1.0/" 으로 복사해 두시면 됩니다.

3. CEDET (Collection of Emacs Development Environment Tools) 이 필요합니다. http://cedet.sourceforge.net/ 에서 다운이 가능합니다. http://sourceforge.net/projects/cedet/files/ 에서 cedet-1.0pre7.tar.gz 을 다운 받으시고 압축을 푸신 다음에 "~/.emacs.d/cedet/" 으로 복사합니다.

4. USER_HOME 에 (제 경우에는 /Users/crazia ) 에 있는 .bash_profile 파일을 열고 다음과 같은 내용을 추가합니다.

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
export JAVAC=$JAVA_HOME/bin/java

저장하고 Terminal 창을 한개 열고

source .bash_profile


이라고 바로 효과가 나타나게 해 줍니다.

5. 이제 .emacs 파일에 다음과 같은 내용을 추가해 줍니다.  (추가 설명을 해 가면서 붙이기 하겠습니다)

(add-to-list 'load-path "~/.emacs.d/cedet/common")
(add-to-list 'load-path "~/.emacs.d/cedet/contrib")
(require 'cedet)

JDEE 는 기본적으로 CEDET 을 필요로 합니다. CEDET 을 설정하는 부분입니다.

(add-to-list 'load-path "~/.emacs.d/elib-1.0")
(add-to-list 'load-path "~/.emacs.d/jdee-2.4.0.1/lisp")
(require 'jde)

elib 과 jdee 의 path 를 추가해 주는 부분입니다. 그리고 jde 를 불러줍니다.

(setq jde-run-mode-hook t)

이상하게 jde-mode-hook 이 안불려지는 버그가 있더군요. 그래서 추가해 줍니다. 강제적으로 mode-hook 을 불러서 실행해줍니다.

(setq
 jde-sourcepath '( "/Users/crazia/work/android/project" )
 jde-db-option-connect-socket '(nil "28380")
 jde-jdk-registry (quote (
              ("1.5" . "/System/Library/Frameworks/JavaVM.framework/Versions/1.5/")
              ("1.6" . "/System/Library/Frameworks/JavaVM.framework/Versions/1.6/")
              )
             )
 jde-jdk `("1.6")
)

jdk 버젼을 조정할 수 있게 구현해 주는 부분입니다. OSX 다 보니 java 가 깔려 있는 곳의 디렉토리가 일반적인 unix 와는 조금 다릅니다.

;; cua-mode 끄기
(cua-mode nil)

\C-RET 은 정말 편하게 쓸 수 있는 단축키 인데 cua-mode 가 항상 점유하고 있으면서 바꿔지지도 않습니다. 아예 cua-mode 를 꺼버리면 편하게 쓸 수 있습니다.

(add-hook 'jde-mode-hook
          (lambda()
            (define-key jde-mode-map [(control return)] 'jde-complete)
        (define-key jde-mode-map [(meta return)] 'jde-complete-minibuf)
        (define-key jde-mode-map [(shift return)] 'jde-complete-in-line)))

자동 완성 단축키를 지정합니다. 제일 많이 쓰는 것이 "\C-RET" 다 보니 그 단축키를 jde-complete 함수에 묶었습니다.

이제부터 Emacs 에서 Android 개발이 쉬워지게 세팅을 끝냈습니다.


+ Recent posts