2011년 8월 23일 화요일

[Emacs] 검색 후 되돌아오기

Emacs에선 C-sC-r로 파일 내 검색을 할 수 있는데 이 때 검색 전의 위치로 돌아오는 명령이 있는지 없는지 모르겠다. 찾는것도 귀찮고 해서 이 기능을 만들어 봤다.

아래가 소스 코드이다.

(defun memory-and-search ()
  (interactive)
  (when buffer-file-name
    (bookmark-set "search-point"))
  (isearch-forward))

(defun memory-and-search-backward ()
  (interactive)
  (when buffer-file-name
    (bookmark-set "search-point"))
  (isearch-backward))

(defun back-to-search-point ()
  (interactive)
  (bookmark-jump "search-point"))

(global-set-key (kbd "C-s") 'memory-and-search)
(global-set-key (kbd "C-r") 'memory-and-search-backward)
(global-set-key (kbd "C--") 'back-to-search-point)
C-s 혹은 C-r키를 누르면 Emacs의 기본적인 bookmark 기능을 활용해 현재 위치를 기록한 후에 검색 함수를 호출하도록 한 코드이다.

내용 상에 현재 파일 이름이 없으면 북마크 기록을 하지 않도록 한 부분이 있는데, 북마크 기능은 파일이름이 없는 버퍼의 경우 에러가 발생하기 때문이다. 따라서 이 기능은 scratch 등의 특수 버퍼에서는 동작하지 않고 오로지 파일을 열었을 때 생성되는 버퍼에서만 동작한다.

C-- (Ctrl 키와 -키를 동시에 누르기) 키를 누르면 검색 전의 위치로 점프하게 된다. (원래 이 키는 negative argument에 매핑되어 있지만 개인적으론 잘 사용하지 않는다)

C--키를 되돌아오기 키로 설정한 이유는 bash의 이전 디렉토리로 돌아가기 커맨드인 'cd -' 의 영향이 크다. -_-;;

혹시나 이 기능과 동일한 기능이 제공되고 있을 가능성은 매우 높다. 하지만 이런 기능을 직접 구현한다는 것도 왠지 보람찬 일이라고나 할까. 그냥 기분이 좋다. ;)

댓글 7개 :

익명 :

C-g 로 검색을 취소했을때와 다른점이 있나요?

Seorenn :

위 기능은 검색을 끝낸 시점에서 다시 돌아가기 위한 기능입니다. 예를 들자면 특정 문구를 검색해서 해당 부분을 수정한 다음에 다시 검색을 시작했던 지점으로 돌아가는 경우 등 말이지요.

Darren :

C-u space 로 이전 mark로 jump할 수 있어요.
원하시는 바가 그것인것 같은데 한번 사용해보세요

Seorenn :

Darren ha //
위 코드는 검색 시작 지점에 자동으로 북마크를 기록하는 것도 포함되어 있습니다.
혹시나 C-s 시 자동으로 지점이 기록되는 기능이 있다면 전 헛일을 한 것이겠지만요. ;-)
(아직 시험해 보지는 않았습니다. 업무 중이라 'ㅅ';;;)

Darren :

C-s시에 현재우치를 push합니다. 이것은 제가 자주 쓰는 기능이라서요. ^^
그나저나 만나기 힘든 emacs 유저를 만나게 되어 너무나 반갑습니다. 서로 좋은 정보 공유 하면 좋겠습니다.
종종 들르겠습니다.

Seorenn :

Darren ha//
기본적으로 되는 거였군요. 하아 ^^;
좋은 정보 감사합니다~

익명 :

기본 설정은 'C-u C-space' 네요.
(http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/Point-and-mark.html)