레이블이 flymake인 게시물을 표시합니다. 모든 게시물 표시
레이블이 flymake인 게시물을 표시합니다. 모든 게시물 표시

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 "\\`" ...) 을 추가하면 된다.