find-tag 기능 변경하기 (1)

1. find-tag 기능 대략적으로 설명


emacs에는 find-tag라는 기능이 있습니다.

vim에도 비슷한 기능이 있는데, 프로그램 소스를 읽을때 매우 편리합니다.

c 언어 소스를 예를 들면,

int tempFunc( Data a, Data b)
{
   return temp2( a.num , b.num);
}

이런 소스가 있습니다. 

여기서 temp2가 어떤 행동을 하는지 보고 싶다면, 이 temp2가 define된 곳으로 찾아 가봐야 합니다. 그런데 소스의 어느 부분에 위치하고 있을거며, 또한 찾아 가본 이후에는 다시 기존의 위치로 돌아와야 합니다. 매우 귀찮습니다. 집중도 떨어지고..

emacs에서는 temp2 부분에 커서를 위치시키고 M-x find-tag (또는 단축기 M-.)을 입력하면 자동으로 찾아줍니다.
그리고 단축키 M-*를 입력하여 자동으로 기존의 위치로 돌아 올 수 있습니다.
여기서 M-*은 Alt키를 입력하고 있는 상태에서 *를 입력하라는 뜻입니다.

써보신 분들은 아실테지만 매우 편리합니다.

여기서 필요로 하는게 TAGS라는 이름의 파일인데, ctags라는 이름의 프로그램에 -e옵션을 통해서 생성할 수 있습니다.
emacs는 이러한 TAGS라는 파일을 통해 생성한 정보를 이용하여 동작합니다.


2. find-tag의 2% 아쉬운 점

find-tag는 매우 편리한 기능이지만, 약간 아쉬운 점이 있습니다.
c++환경에서, 다른 클래스 내에 같은 이름의 메소드가 있을 경우,

즉,

class a{
    int add(int num1, int num2);
}

int a::add(int num1, int num2)
{ return num1 + num2 ;}


class b{
    int add(int num1, int num2);
}

int b::add(int num1, int num2)
{ return num1 + num2 ;}


이와 같은 경우에, b::add(1,2)를 호출하는 부분의 add부분에 커서를 위치 시키고, find-tag를 수행하면, a class의  add를 찾아줍니다.  즉, 제가 원하는 것은 b class의 add였는데, a class의 add를 리턴해 주는 거죠..   이 소스를 수정하여 가장 처음에 int add; 라는 global 변수를 만들고 find-tag를 수행하면, b class의 add가 아닌 global 변수인 add에 위치하게 됩니다.  (음.. 대충 어떤식으로 tag table내에서 검색하는지 알 것도 같습니다.)



3. 제대로 된 위치로 움직이기


find-tag 명령을 수행하고 직접 b::add를 입력해 주면 제대로 된 위치로 이동합니다.

문제는 default로 읽어온 단어가 잘못된 것입니다.  먼저 default를 설명하면, find-tag명령을수행하고, 사용자가 특별한 단어를 입력하지 않으면, 현재 cursor에 위치한 단어를 통해 tag를 검색하는데, 이것이default입니다.  b::add인 경우, default로 add를 선택하는 것이죠.. 근데 만약 default로 add를선택하지말고, b::add로 선택하면 문제가 해결 됩니다.


4. 앞으로의 계획

find-tag명령 수행후, default를 얻어오는 부분을 수정할 것입니다. 그래서 b::add인 경우에 default로 add가 아닌 b::add를 리턴하게 하면 앞으로 프로그래밍 생활이 좀 더 윤택해 질것 같습니다.

이것을 위해 먼저 find-tag부분 분석을 해야 합니다.

find-tag 함수 위치를 찾기 위해 디렉토리내 파일 내용을 grep으로 탐색하다가 아주 좋은 것을 발견했습니다.

/usr/share/emacs/21.4/lisp 디렉토리 내에서 find-tag를 grep으로 탐색하였는데, 아래와 같은 내용이 검색되었습니다.

파일명은 loaddefs.el 입니다.

(defvar find-tag-default-function nil "\
*A function of no arguments used by \\[find-tag] to pick a default tag.
If nil, and the symbol that is the value of `major-mode'
has a `find-tag-default-function' property (see `put'), that is used.
Otherwise, `find-tag-default' is used.")


즉, find-tag-default-function이라는 변수를 적당한 함수로 설정하면 원래 설정되어 있는find-tag-default 함수를 호출하지 않고, 사용자가 설정한 find-tag-default-fuction 함수를호출한다는 것입니다.

그래서 간단한 실험을 해보았습니다.

(setq find-tag-default-function
    (lambda() "js"))

이와같이, 초기에 nil로 설정되어 있던 find-tag-default-function변수를, 무조건 "js"를 리턴하는 함수로 설정하였습니다.

그런 다음 find-tag 명령어를 수행시켜보았습니다.

결과는 예상대로,
Find tag: (default js)
이렇게 나왔습니다.  여기서 그냥 엔터를 치면 js를 tag table에서 찾게 됩니다.

이젠 굳이 find-tag함수를 찾지 않아도 됩니다. 하핫
더 simple하게 수정할 수 있겠군요.. ㅋ


   

by 브루스팍 | 2008/02/24 15:16 | Emacs Lisp | 트랙백 | 덧글(0)

트랙백 주소 : http://jongsuknim.egloos.com/tb/1765630
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

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