2008년 03월 01일
find-tag 기능 변경하기 (3 완결편) js-find-tag 만들고 emacs에 적용하기
1. find-tag-default를 이용하여 js-find-tag-default 만들기
find-tag-default 리턴값에 단어 시작위치를 같이 리턴하도록 변경한 것이 바로 js-find-tag-default입니다.
리스트 형태로 묶어서 리턴합니다.
아래와 같이 변경합니다.
(defun js-find-tag-default ()
(save-excursion
(while (looking-at "\\sw\\|\\s_")
(forward-char 1))
(if (or (re-search-backward "\\sw\\|\\s_"
(save-excursion (beginning-of-line) (point))
t)
(re-search-forward "\\(\\sw\\|\\s_\\)+"
(save-excursion (end-of-line) (point))
t))
(progn (goto-char (match-end 0))
(list ; 추가된 부분. 리턴값은 단어와 단어 시작위치로 이루어진 리스트 형태입니다.
(buffer-substring-no-properties
(point)
(progn (forward-sexp -1)
(while (looking-at "\\s'")
(forward-char 1))
(setq b-point (point))
(point))) ; 단어
(point))) ; 추가된 부분, 단어 시작위치
nil)))
2. js-find-tag 만들기
js-find-tag는 find-tag-default-function에 등록될 함수 입니다. 즉, default tag를 찾기 위해 가장 먼저 호출되는 함수 입니다.
내부에서 js-find-tag-default를 호출하여 단어와 시작 위치를 얻은다음, 단어 시작위치가 "::"인 경우에는 커서를 앞으로 이동시켜서 다시 js-find-tag를 호출합니다.
(defun js-find-tag()
(let* ((result (js-find-tag-default))
(word (car result))
(s-point (car (cdr result)))
(s-string (buffer-substring-no-properties (- s-point 2) s-point)))
(if (string= (substring mode-name 0 3) "C++") ;현재 버퍼가 c++-mode일때만 동작합니다.
(cond ((string= s-string "::")
(save-excursion
(progn (goto-char (- s-point 3)) ; 커서를 "::" 앞으로 이동시킵니다.
(concat (js-find-tag) "::" word)))) ; 커서를 앞으로 이동시킨후 다시 js-find-tag를 호출합니다.
(t word))
(find-tag-default))))
3. find-tag-default-function에 등록하기
(setq find-tag-default-function #'js-find-tag)
4. 자신의 emacs에서 동작되게 만들기
1. 위의 3함수를 하나의 파일에 넣고 이름을 정합니다. 여기선 js-find-tag.el이라고 하겠습니다. 마지막의 .el 을 붙여 주어야 합니다.
2. js-find-tag.el을 적당한 디렉토리에 넣습니다. 여기선 ~/emacs.elisp에 넣었다고 하겠습니다.
3. 자신의 .emacs파일을 열고, 적당한 위치에 (load "~/emacs.elisp/js-find-tag") 이와 같이 적어 줍니다. js-find-tag에 .el을 붙이지 않습니다.
4. 끝.. 이제 c++-mode인 경우 자동적으로 적용됩니다.
5. 이 프로그램이 제대로 동작하게 하기위해선 ctags를 통해서 tag를 생성시킬때 아래와 같은 옵션을 통해서 TAG파일을 생성해야 합니다.
--extra=+q
이 옵션을 줄 경우엔 className::memberFunction 형식으로 TAG파일이 생성됩니다.
5. 마무리 하며..
정말 간단한 프로그램인데도 만만치 않군요..
그래도 글로 작성하니 뭔가 정리가 되는듯한.. ^^;;
어쨋든 드뎌 첫 emacs 프로그램을 완성했습니다. ㅎㅎ .. 근데 함수 및 변수 이름이 좀 맘에 안드네요.. 참고로 js는 제 이니셜입니다. ㅋ
find-tag를 워낙 많이 쓰다 보니 더 손대고 싶은 부분이 많은데, 앞으로도 계속 find-tag 관련해서 프로그램을 작성할 생각입니다.
가장 힘든 단계는 지난듯 하니, 앞으론 좀 쉽게 할 수 있겠죠..ㅋ
# by | 2008/03/01 15:52 | Emacs Lisp | 트랙백(1) | 덧글(0)



