2009년 5월 11일 월요일

emacs 특정 path 아래파일을 열경우 flymake 적용하기

이전글에 썼던 코드들에 내용 추가

flymake 가 있으면 킹왕짱 좋지만 설정은 좀 귀찮은 놈이라 몇몇 프로젝트에만 설정해놓고 쓰는데(cmakeflymake 붙이기가 쉽지 않아서 자주 안쓰게 되더라 이거 빨리 적절한 방법을 찾아봐야 하는데...) 이러다 보니 수작업이 좀 들어가야 해서 잠시 남는시간에 관련 코드를 좀 추가했다.

결론적으로 추가된 함수는 요거 하나가 핵심이고
(defmacro yoonkn-enable-flymake-mode (pattern hook)
"hook 에 pattern 을 검사해서 통과한 경우에만 flymake-mode 를 켜는 함수를 추가한다.

사용예:
(yoonkn-enable-flymake-mode \"\\`/home/yoonkn/scratch/hehehehe/mao\" 'c-mode-common-hook)"

`(add-hook ,hook '(lambda ()
(let ((path (buffer-file-name)))
(when (and path (string-match ,pattern path))
(flymake-mode-on))))))

내가 평소에 쓰던 defproject/yoonkn 에서 한방에 적용이 가능하도록 적용하고싶은 모드들은 인자로 추가했다.
(defmacro defproject/yoonkn (name root builddir buildcmd &optional flymake-enable-modes)
"per-directory 로컬변수 세팅이 반복되는 작업이라 매크로를 만들었다.

사용예:
(defproject/yoonkn 'mao \"~/scratch/hehehehe/mao\" \"~/tmp/mao\" \"make \" '(c-mode-common-hook))
(defproject/yoonkn 'boost \"~/scratch/boost\" \"~/tmp/boost\" \"make \")
"

`(progn
(define-project-bindings ,name
'((nil . ((yoonkn-build-option . ((build-directory . ,builddir)
(build-command . ,buildcmd)))))))
(set-directory-project ,root ,name)
;; flymake-enable-modes 가 지정된경우 각각의 모드마다 후킹함수 추가
(loop for mode in ,flymake-enable-modes
collect (yoonkn-enable-flymake-mode (expand-file-name ,root) mode))))

이제 기존에 줄줄이 잡아놓고 쓰던 defproject/yoonkn 들에 원하는 모드를 추가하만 하면 해당 디렉토리의 파일들을 열때 flymake 켜고 뜨게된다. 물론 flymake 세팅은 따로 잡아줘야 하지만.. 뭐 Makefile 하나 정도 추가하는 작업이라 큰작업은 아니지. 다만 귀찮을따름.


추가.
어이쿠.. defproject/yoonkn 에서 root 를 expand 한후에 앞쪽에 \\` 패턴을 붙이는걸 깜빡했네. (concat "\\`" ...) 을 추가하면 된다.

댓글 없음: