EmacsW32 를 설치하고 grep-find 를 동작하게 만들기 위해서 몇가지 세팅을 해줘야 합니다. 

1. EmacsW32 설치하기 


 EmacsW32 는 GNU Emacs 에다가 윈도에서 사용하기 편하게 몇가지 패치를 한 버젼입니다. 편해서 윈도에서는 항상 설치해서 사용하고 있습니다. 


2. grep-find 문제 해결 

 grep-find (find-grep 으로 써도 똑같이 동작함)은 현재 디렉토리부터 하위 디렉토리까지 찾고자 하는 단어를 포함하고 있는 줄의 정보를 표시하는 Emacs 의 기능입니다. 유닉스 명령어 (unix command) 중에서 가장 많이 쓰이는 find 와 grep 을 합쳐놓은 것입니다. 게다가 검색된 파일을 바로 emacs 상에서 열어서 편집할 수가 있습니다. 

요즘 대부분의 통합개발툴 (IDE) 상에서 지원하는 검색하고 무엇이 다르냐? 라고 물으면 '똑같다. 다른게 없다' 라고 말씀드릴 수 있습니다. 다만 아주 예전부터 지원하는 기능이라서 이 기능 때문에 이맥스( Emacs) 를 20년간 사용하고 있다는 분도 계십니다. 

grep 문법을 그대로 활용되니 찾고자 하는 단어를 정규 표현식으로 찾을 수 있습니다. 

하지만 EmacsW32 를 설치하고 바로 

M-x grep-find 

하고 나면 

  
   M-x grep-find 하면
      grep -r <C> -nH -e . --include=
      /bin/sh: C: No such file or directory
      
      Grep finished with no matches found at 날짜

      또는
      find . -type f -exec grep -nH -e  {} NUL ;
      find: missing argument to `-exec'
      
      Grep finished with no matches found at 날짜

      또는
      find . -type f -print0 | xargs -0 -e grep -nH -e 
      grep: unrecognized option `--color=auto'
      Usage: grep [OPTION]... PATTERN [FILE]...
      Try `grep --help' for more information.
      
      Grep exited abnormally with code 123 at 날짜

이렇게 나오고 안되실 것입니다.  제 경우에는 붉은색으로 나오면서 안 됐습니다. 

그래서 KLDP에서 참조 한 내용을 적어주자면 


2-1 . Emacs 상에서 다음 명령 실행 



      M-x customize-group
      grep




 2-2 .  Grep Highlight Matches 설정 


      Grep Highlight Matches: Value Menu 버튼 누르고 "Not Set"로 변경  state 버튼 누르고 Save for Future Sessions 을 선택해 줍니다.  

2-3 . Grep Find Use Grep R 설정 


      Grep Find Use Grep R: Toggle 버튼 누르고 "off (nil)"로 변경
      state 버튼 누르고 Save for Future Sessions 를 역시 선택해 줍니다. 
      

2-4. DotEmacs (.emacs ) 에서 확인 

  
   (custom-set-variables
      ;; custom-set-variables was added by Custom.
      ;; If you edit it by hand, you could mess it up, so be careful.
      ;; Your init file should contain only one such instance.
      ;; If there is more than one, they won't work right.

      '(grep-find-use-grep-r nil)
      '(grep-highlight-matches nil)
    

의 내용이 추가되어 있는 것을 확인해 줍니다. 

여기까지 하고 테스트 해주면 일단 하위 디렉토리가 없는 경우에서는 제대로 동작합니다. 하지만 하위 디렉토리가 존재하는 경우라면 

      xargs : cannot fork 

에러가 발생하면서 제대로 동작하지 않는 것을 목격합니다. 참고로 저는 MingW 같은것을 설치 안한 순수한 Windows7 환경입니다. 


3. w32shell-shell 설정해 주기 

메뉴상에서 

"Options" -  "Customize EmacsW32" 

를 선택해 줍니다. 그리고 그중에서 w32shell-shell 메뉴를 찾아서 다음 그림과 같이 "Windows cmd.exe" 로 선택해 줍니다. 그리고  "Save for future sessions" 를 클릭해 줍니다. 



자 또 DotEmacs (.emacs) 파일에서 다음과 같이 설정되어 있는지 확인 해 줍니다. 


      (custom-set-variables
      ...  
      '(w32shell-shell (quote cmd))
      ...)



이제 편하게 grep-find (find-grep) 을 사용하시면 됩니다. 



아이폰 개발을 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 파일에 추가해주시면 됩니다.





+ Recent posts