2013년 2월 19일 화요일

[Emacs] highlight-symbol 을 이용한 심볼 검색

앞서 auto-highlight-symbol-mode 를 이용한 글을 썼었는데 오류와 버그로 인해 가끔 동작하지 않는 문제가 있었다. 다만 Emacs 24에서만 발생하는 문제 일 수도 있다. auto-highlight-symbol-mode가 제대로 동작한다면 굳이 이 글을 참조 할 필요는 없다.

이 글은 역시 Vim의 * 커맨드를 흉내내기 위한 방법을 정리하는 글이다. 모르는 이들을 위해서 간단히 설명하자면, Vim에서는 *(Shift-8)을 누르면 현재 커서가 위치한 심볼(단어)가 하이라이트 되면서 해당 심볼과 완벽하게 매칭되는 단어를 검색할 수 있다. 해당 단어가 포함된 문자열은 검색되지 않기 때문에 비슷한 이름이 많이 쓰이는 함수를 검색 할 때 유용하게 이용 할 수 있다.

우선 highlight-symbol 이라는 확장이 필요하다. 이 확장은 아래 URL에서 구할 수 있다.


위 홈페이지에도 언급되어 있지만 ELPA를 통해서도 구할 수 있으니 ELPA를 사용하고 있다면 쉽게 설치가 가능하다.

기본적으로 사용하기 위한 설정은 아래와 같다.
(load-library "highlight-symbol")
(setq highlight-symbol-on-navigation-p t)
(global-set-key (kbd "C-*") 'highlight-symbol-next)
(global-set-key (kbd "M-*") 'highlight-symbol-prev)
C-* (Ctrl-Shift-8) 키를 누르면 해당 단어를 검색하고 M-* (Meta/Alt-Shift-8) 키를 누르면 역순으로 검색한다. 이 정도만으로도 충분히 쓸 만 하다.

하지만 하이라이트가 깜빡거리는 등 좀 마음에 안들게 동작하여서 EmacsWiki에서 알게된 방법을 적용해 봤다. (해당 위키 링크는 하단 참고링크에 기록)
(load-library "highlight-symbol")

(defun hl-symbol-and-jump ()
  (interactive)
  (let ((symbol (highlight-symbol-get-symbol)))
    (unless symbol (error "No symbol at point"))
    (unless hi-lock-mode (hi-lock-mode 1))
    (if (member symbol highlight-symbol-list)
        (highlight-symbol-next)
      (highlight-symbol-at-point)
      (highlight-symbol-next))))
(defun hl-symbol-cleanup ()
  (interactive)
  (mapc 'hi-lock-unface-buffer highlight-symbol-list)
  (setq highlight-symbol-list ()))

(global-set-key (kbd "C-*") 'hl-symbol-and-jump)
(global-set-key (kbd "M-*") 'highlight-symbol-prev)
(global-set-key (kbd "C-M-*") 'hl-symbol-cleanup)
단축키는 앞서 이야기한 것과 동일하다. 차이점이 있다면 하이라이트를 하는 부분에 있는데 굳이 설명 할 필요는 없을 것 같다.
참고링크) http://www.emacswiki.org/emacs/SearchAtPoint

댓글 없음 :