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)

트랙백 주소 : http://jongsuknim.egloos.com/tb/1775812
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from START!!! at 2008/03/02 01:12

제목 : find-tag 기능 변경하기 (3 완결편) js-..
find-tag 기능 변경하기 (3 완결편) js-find-tag 만들고 emacs에 적용하기 ...more

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶