다음 이전 차례

2. 일단 써보기

2.1 Emacs 가동

Emacs를 가동하려면 emacs 라고 치고 뒤에 편집하고자하는 화일의 이름을 치면된다. 만일 존재하지 않는 화일이름을 사용하면 Emacs는 새로운 커서는 ``point'' 또는 ``dot''라고도 불린다. Emacs의 온라인 도움말 기능은 이 단어를 사용한다. 많은 편집기 들과는 달리(대표적으로 vi) Emacs는 글자를 삽입하고 명령을 내리는 모드를 구분하지 않는다. 화면의 맨 아랫줄은 ``미니버퍼''로 사용되고 아래에서 두번째 줄은 여러가지 정보를 표시해 준다. 이 줄은 ``모드라인'' 이라고 불린다. 맨 왼쪽에 두개의 별표(**)가 있다면, 버퍼가 수정 되었다는 것을 나타내 준다. (이 위치에 %%가 있으면 읽기 전용 버퍼임을 나타낸다.) Emacs:뒤에 버퍼(혹은 화일)의 이름이 나온다. 괄호 안에 현재의 모드가 나오고, 그 뒤에 화면에 보이는 부분이 전체중 어디쯤인지를 표시해 준다. 버퍼의 처음일 경우 'Top', 끝일 경우 'Bot' 그렇지 않을 경우에는 %로 표시해 주고, 버퍼의 내용 전체가 화면에 보일 경우에는 'ALL'이라고 표시해 준다.

Emacs의 숙련자가 되면, 때때로 여러개의 버퍼를 같이 열어 놓고 작업을 할 때도 있을 것이다. 이러한 경우에도 각각의 버퍼는 각각의 모드라인을 가지게 된다.

2.2 Emacs 명령어들

Emacs 는 몇천 아니면 몇백개의 명령어들을 가지고 있다. 물론 독자들로 예상하고 있겠지만 binding이 이루어지지 않은 명령어 들이나, 어떤 키에 binding이 이루어져 있는지 모르는 경우에는 M-x ``명령어 이름'' RETURN 을 치면 된다.

Emacs 는 사용자가 자기만의 binding을 가지거나, 기존의 binding을 바꿀 수 있도록 해준다. 자세한 것은 ``Learning GNU Emacs'' 9장을 참고하거나, Emacs Help를 참고하기 바란다. (아니면, 이 글이 혹시 그 내용을 다루게 될지도 모르므로 그 때까지 기다리면 된다.)

2.3 기본 명령들

자 이제 가장 기본적인 명령어들에 대해 알아보자. 여기서 부터는 명령어 요약을 먼저 제시하고 보충설명이 필요한 부분은 뒤에 설명하는 방식으로 진행하겠다. 명령어 요약은 명령어 단축키를 먼저 제시하고 난 후 명령어 이름을 써 놓았다.

C-x C-f (find-file)

같은 이름의 버퍼를 만들고, 화일을 읽어온다. 만일 화일이 존재하지 않으면 새로운 화일을 만든다. (다른 에디터들의 'file open' 과 유사) C-x C-v (find-alternate-file) : 방금 읽은 화일 대신 다른 화일을 읽어온다. 잘못된 화일을 읽었을 때 사용한다.

help

Emacs help는 사용자와의 대화를 위하여 종종 다른 윈도우를 열거나, 미니버퍼를 사용하거나, 때로는 전체 윈도우를 차지하기도 한다. 미니 버퍼에 나오는 내용들은 종종 중요한 지식을 얻게 해주므로, 미니 버퍼의 내용들을 유심히 보는 것도 Emacs 를 빨리 익히는 한 방법일 것이다. 예를 들어 C-h 를 눌러보자. ? 를 눌러보라고 한다. ?를 눌러보자. C-h를 한번 더 누르면 자세한 정보를 주겠다고 한다. 눌러보자. 설명이 나온다. 그리고 화면에 다 안 나오면 space 를 누르면 화면이 스코롤된다고 알려준다. (C-h를 마구 눌러도 같은 결과가 생긴다.) t를 눌러서 TURTORIAL을 선택해 보자. 이제 TURTORIAL 을 이용해서 Emacs 공부를 해보자.

C-h f

Describe function: 이라고 나온다. 여기다 describe-function 이라고 쳐보자.(이러한 경우에도 completion이 적용된다. 한번 시도해 보자.) 그러면, 화면이 갈라지면서 아래 윈도우에 describe-function 이라는 명령에 대한 설명이 나오고, 미니버퍼에는 친절하게도, C-x 1 을 누르면 다시 화면이 하나가 된다는 이야기가 나온다. (이 내용은 버젼에 따라 조금 다를 수도 있을 것이다. 어쨌든 지금 필자가 쓰고 있는 Emacs 는 이렇게 동작한다.)

앞에서 필자는 ``Learning GNU Emacs'' 라는 책을 소개했었다. `음, 잘못된 내용이 적으려면 책뿐만아니라 실제로 사용해서 확인해보고, 또 Emacs 자체의 설명도 읽어보는 것이 좋겠지.' 그래서, 필자는 Emacs 의 `info' 를 읽어보기 시작했던 것이다. `그래, Emacs 를 익히는데 도움이 많이 되겠군.'

마음 같아선 그 내용들을 다 번역해서 올리고 싶지만, 참기로 했다. 어쨌든 일단 info 로 들어가 보자. (`C-h i' 를 누른다.) Emacs 노드로 가자. (g 를 누르고 emacs RETURN 을 누른다. 아니면, `* Emacs: (emacs)' 라고 된 줄을 찾아가서 RETURN 을 눌러도 된다.)

삽입

삽입을 위해서는 그냥 문자를 치면 된다. 방금 친 문자를 지우려면 DEL 키를 사용하면 된다. ``Auto Fill'' 모드를 사용하면 줄이 길어질 경우 자동으로 줄이 나누어지게 할 수 있다. 만일 당신이 문자가 삽입되어지는 대신에 덮어씌워지기를 바란다면 Overwrite 모드를 사용할 수 있다.

control 문자나 8진수 200 이상의 문자 코드를 가지는 문자등 직접 삽입이 힘든 문자를 입력하려면 `C-q' 명령을 사용하면 된다.

이동 명령

숫자 인수

자, 이 글을 읽으면서 실습을 해보기 바란다. 그냥 읽기만 하는것 보다는 한번 해보는 것이 훨씬 빨리 익힐 수 있는 방법이니까.

위의 `M-r' (`move-to-window-line') 명령을 보면 숫자 인수를 받아들인다는 내용이 있는데, 명령에 어떻게 숫자 인수를 줄까?

삭제 명령

변화 취소(Undoing Changes)

`Emacs 는 문서나 버퍼의 변화를 어떤 양까지(8000자 정도) 취소하는 것을 가능하게 해준다고? 각각의 버퍼에 대해 취소가 따로 적용된다. 일반적으로 각각의 명령은 하나의 취소 기록을 남기지만, `query-replace' 처럼 여러 기록을 남기는 명령도 있고 묶여서 기록되는 경우도 있다.'

계속적인 `C-_' 또는 `C-x u' 명령은 기록된 한계까지 이전의, 또 그 이전의 변화를 취소한다. 만일 기록된 것이 없으면 에러 메시지를 낸다. 취소 명령이 아닌 어떤 명령도 취소 명령의 연속을 끊는다. 이 시점에서 이전의 취소 명령들은 변화로 인식되어 취소 명령에의해 취소 될 수 있다. 취소를 취소하려면, `C-f' 등의 명령을 내리고 취소 명령을 내리면 된다. (좀더 깊은 내용을 알고 싶으시다면 Emacs 의 info 를 참조하세요.)

미니버퍼

화면의 맨 아랫줄은 ``minibuffer window'' 혹은 ``echo area'' 라고 불리운다. 이 영역은 사용자에게 간단한 정보(에러 메시지등)을 전달하거나, 화일명, 버퍼명, Lisp 함수명, 등등의 복잡한 인수를 넘겨받는데 사용된다. 때때로 미니버퍼는 디폴트 인수를 괄호 안에 제시하기도 한다. 이 때 이 디폴트 인수를 이용하려면 그냥 RETURN 을 누르면 된다. 미니버퍼를 사용하는 명령을 취소하는 간단한 방법은 `C-g'를 누르는 것이다. 이것은, 미니버퍼를 사용하지 않는 명령이라도 여러키들을 누르는 명령의 경우에 사용할 수 있다.

미니버퍼를 사용하는 명령을 반복하는 방법이 있다.

도움말 기능

Emacs 의 도움말 명령은 모두 `C-h' 로 시작한다. h 는 help 라는 단어에서 따왔다.

Emacs 에 조금 익숙해졌다면 이 도움말 기능을 많이 활용하기를 적극 권한다. 뭔가 궁금하다면 도움말 기능을 어떻게 이용할까 생각하는 습관을 가지시길. Emacs 를 보다 더 잘 사용할 수 있는 비결일 것이다.

간단한 설정 변환

`customize' 란 단어를 찾아보면 `주문에 따라 만들다.' 라는 뜻이 있다. `customization' 이란 단어를 좀 더 정확히 표현하자면 `주문에 따라 만드기' 정도가 될 터인데, 그냥 `설정 변환'이라는 좀 애매한 단어를 사용하였다. 전회에 말했듯이 여기에 필자의 `.emacs' 화일을 공개한다. `.emacs' 화일은 Emacs 가 가동되면서 하여야 할 일들을 기술해 놓는 화일이다. Emacs 의 자체 Lisp 언어로 기술 되어져있지만, 잘 살펴보면 다른 변화를 주는 것도 그다지 어렵지는 않으리라 생각된다. 그러나, 원래의 표준 키 binding 은 되도록이면 바꾸지 말 것을 권한다.

;
;   hwijae의 
;  .emacs 화일
;  줄에서 ';' 문자의 뒷 부분은 주석임.
;  Linux SLS 1.03 설치하면서 있던 .emacs 화일에 살을 붙임.
; text 모드가 될 때 turn-on-auto-fill 을 실행하라는 뜻.
; (즉, text 모드가 되면 auto-fill 모드가 됨.)
(setq text-mode-hook 'turn-on-auto-fill) 
(setq make-backup-files t)              ; backup file 을 만들어라.  
(put 'eval-expression 'disabled nil)    ; 원래 있던 내용. (?)
; 화일 명에 따라 모드가 선택됨.
; 둘째줄은 .c 로 끝나는 화일명을 가진 화일을 열면 c-mode 로
; 들어가라는뜻.         
(setq auto-mode-alist (mapcar 'purecopy            
'(("\\.c$" . c-mode) 
 ("\\.h$" . c-mode) 
 ("\\.C$" . c++-mode)
 ("\\.cc$" . c++-mode)
 ("\\.H$" . c++-mode)
 ("\\.hh$" . c++-mode)
 ("\\.cxx$" . c++-mode)
 ("\\.hxx$" . c++-mode)
 ("\\.cpp$" . c++-mode)
 ("\\.hpp$" . c++-mode)
 ("\\.tex$" . TeX-mode)
 ("\\.txi$" . Texinfo-mode)
 ("\\.el$" . emacs-lisp-mode)
 ("\\.a$" . c-mode))))

; 추가된 키 binding.
; `M-[' (`backward-paragraph')명령을 사용하지 못하게 됨.
; 화살표키와 Insert, Page Up, Page Down 등의 키가 그 의미에 맞게 
; 행동한다.
; 기능키들에 (function keys) 원하는 기능을 넣을 수 있다.

(defvar cursor-map-2 (make-keymap)"for ESC-[")      ; ?
(fset 'Cursor-Map-2 cursor-map-2)                   ; ?
(define-key esc-map "[" 'Cursor-Map-2)              ; ?
(define-key esc-map "[3~" 'delete-backward-char)    ; del
(define-key esc-map "[2~" 'overwrite-mode)    ; insert
(define-key esc-map "[5~" 'scroll-down)       ; page-up
(define-key esc-map "[1~" 'beginning-of-line) ; home, X 상에서는 안됨.
(define-key esc-map "[4~" 'end-of-line)       ; end,      ''         .
(define-key esc-map "[6~" 'scroll-up)         ; page-down

(setq f1-function 'count-lines-page)
(setq f2-function 'find-file)                   
(setq f3-function 'other-window)            
(setq f4-function 'delete-other-windows)    
(setq f5-function 'split-window-vertically) 
(setq f6-function 'switch-to-buffer)        
(setq f7-function 'recenter)
(setq f8-function 'recenter)
(setq f9-function 'recenter)
(setq f10-function 'goto-line)
(setq f11-function 'where-is) 
(setq f12-function 'describe-function)       
(define-key esc-map "[11~" f1-function) ; F1
(define-key esc-map "[12~" f2-function) ; F2    
(define-key esc-map "[13~" f3-function) ; F3    
(define-key esc-map "[14~" f4-function) ; F4
(define-key esc-map "[15~" f5-function) ; F5
(define-key esc-map "[17~" f6-function) ; F6
(define-key esc-map "[18~" f7-function) ; F7
(define-key esc-map "[19~" f8-function) ; F8
(define-key esc-map "[20~" f9-function) ; F9
(define-key esc-map "[21~" f10-function) ; F10
(define-key esc-map "[23~" f11-function) ; F11
(define-key esc-map "[24~" f12-function) ; F12
(define-key esc-map "[[A"  f1-function) ; F1
(define-key esc-map "[[B"  f2-function) ; F2
(define-key esc-map "[[C"  f3-function) ; F3
(define-key esc-map "[[D"  f4-function) ; F4
(define-key esc-map "[[E"  f5-function) ; F5

(define-key esc-map "[A" 'previous-line)             ; up-arrow
(define-key esc-map "[B" 'next-line)                 ; down-arrow
(define-key esc-map "[C" 'forward-char)              ; right-arrow
(define-key esc-map "[D" 'backward-char)             ; left-arrow

(define-key esc-map "OA"        'previous-line) ;up-arrow
(define-key esc-map "OB"        'next-line)     ;down-arrow
(define-key esc-map "OC"        'forward-char)  ;right-arrow
(define-key esc-map "OD"        'backward-char) ;left-arrow

;
; 설치할 때부터 있던 내용. 필자는 잘 모름. 
;
(setq load-path 
      (cons (expand-file-name "PATH_FOR_AUC-TEX") load-path))
(autoload 'tex-mode 
          "auc-tex" "Automatic select TeX or LaTeX mode" t)
(autoload 'plain-tex-mode "auc-tex" "Mode for Plain TeX" t)
(autoload 'latex-mode "auc-tex" "Mode for LaTeX" t)
(autoload 'LaTeX-math-mode    "tex-math"      "Math mode for TeX." t)
(autoload 'outline-minor-mode "outline-m" "Minor Outline Mode." t)
 
(defun Ctl-C-prefix ()
  Ctl-C-keymap)
(setq Ctl-C-keymap (make-keymap))
(global-set-key "\C-c" (Ctl-C-prefix))
 
(define-key Ctl-C-keymap "m" 'LaTeX-math-mode)
(define-key Ctl-C-keymap "o" 'outline-minor-mode)
 
(make-variable-buffer-local 'outline-prefix-char)
(setq-default outline-prefix-char "\C-l")
(make-variable-buffer-local 'outline-regexp)
(setq-default outline-regexp "[*\l]+")
(make-variable-buffer-local 'outline-level-function)
(setq-default outline-level-function 'outline-level-default)

(autoload 'ispell-word "ispell"
  "Check the spelling of word in buffer." t)
(global-set-key "\e$" 'ispell-word)
(autoload 'ispell-region "ispell"
  "Check the spelling of region." t)
(autoload 'ispell-buffer "ispell"
  "Check the spelling of buffer." t)
(autoload 'ispell-complete-word "ispell"
  "Look up current word in dictionary and try to complete it." t)
(autoload 'ispell-change-dictionary "ispell"
  "Change ispell dictionary." t)

(setq-default abbrev-mode t) ; 시작과 동시에 abbrev 모드가 된다.
(setq save-abbrevs t)        

(if (equal (nth 0 command-line-args) "mule")     ; 만일 mule이면
    (setq load-path 
          (cons (expand-file-name "/usr/local/emacs/lisp") load-path)) 

())
(load "c++mode")                        ; c++mode 를 읽는다.

; c 에서 indentation (만입?) 형태.
; 필자는 네칸을 좋아함.
(setq c-indent-level 4)                 
(setq c-continued-statement-offset 4)    
(setq c-continued-brace-offset -4)

; c 와 c++ 모드에서 RETURN 을 누르면 
; 다시 indent 하고 줄 바꾸고 indent 함.
(define-key c++-mode-map "\r" 'reindent-then-newline-and-indent) 
(define-key c-mode-map "\r" 'reindent-then-newline-and-indent)

(setq explicit-shell-file-name "/bin/bash") ; shell 모드에서 사용할
                                            ; shell 을 명확히 해줌.
(read-abbrev-file "~/.abbrev_defs")     ; 약어들을 읽어들임.

(if (equal (nth 0 command-line-args) "mule") ; 만일 mule 이면,
(let () 
; 송재경님의 원 .emacs 화일
; 미닉스가 조금 고침.
; 필자가 많이 삭제하고(앞에서 겹치는 부분) 조금 고침.
;
; 두벌식 사용자를 위한 키보드 정의
; 한글영문전환은 알트+스페이스로 정의되어 있음.
; /usr/local/hanauto 화일이 두벌식입력오토마타로 쓰임.
;(load-library "/usr/local/mule/lisp/hangul-mode")
;

;세벌식 사용자를 위한 키보드정의
;자체 입력오토마타를 사용함.
;세벌식을 쓰기 위해서는 이 줄 위로 네번째의 첫칸에 ; 표시를하고
;아래 두줄의 첫칸에 있는 ; 를 제거하면 됨. (필자는 세벌식을 사용함.)
      (require 'quail)
      (load "quail/hangul3")
      (setq kanji-input-code 0)
      )
  ())
;
; 끝
;

마크와 영역(The Mark and the Region)

Emacs 에는 현 버퍼의 특정 연속된 부분에 행하여지는 명령이 많이 있다. 이러한 명령이 행하여질 부분을 지정하기 위해 한쪽 끝에 ``mark'' 를 지정하고, 포인트를 다른 쪽 끝으로 옮겨야 한다. 포인트와 마크 사이의 부분을 ``region'' 이라고 한다. (이하 ``영역''이라 하겠다.) 마크가 한번 지정된 이후에는, 그것이 다른 위치에 다시 지정될 때까지 남아있는다. 마크는 텍스트가 입력되거나 삭제될 때 그 앞의 문자에 따라 위치가 고정되어 있는다. 각각의 Emacs 버퍼는 각각 자신의 마크를 가지고 있다. `C-y' (`yank') 와 `M-x insert-buffer' 와 같이 텍스트를 삽입하는 많은 명령들은 마크를 삽입되는 텍스트의 한 끝에 위치시키고 다른 한 끝에 포인트를 위치시킨다. 따라서, 영역은 바로 삽입된 텍스트가 된다. 영역을 설정하는 것과는 별개로 마크는 되돌아갈 위치를 설정하는대로 유용하다. 이것을 좀더 유용하게하기 위해 Emacs 는 16개의 이전 마크 위치를 `mark ring' 에 기억한다.

위의 명령들을 먼저 기억하는 것이 좋을 것 같다.

그 외에 `M-<' 와 같이 멀리 이동하는 명령의 경우에 이동하기 이전의 포인트 위치에 마크가 된다. 이 경우에 echo area 에 ``Mark set'' 이라는 메시지가 나온다. 이제 마크를 돌아갈 위치를 기억하는데 이용해보자. Emacs 는 이전 16개 마크의 위치를 ``mark ring''에 기억한다. 마크를 지정하는 대부분의 명령은 이전의 마크를 이 ``mark ring'' 에 push 한다. (쉽게말해서 기억한다.) 이제 마크된 위치로 찾아가는 명령에 대해 알아보자.

`C-u C-SPC' 혹은 `C-u C-@' 포인트를 마크 위치로 옮기고 ring 의 이전 마크 위치로 마크를 옮긴다. 멀리 이동하는 명령은 이동하기 전의 위치에 마크를 함으로 되돌아 가는 것을 쉽게 만든다. 변수 `mark-ring -max' 는 mark ring 이 기억하는 최대 마크의 갯수를 나타낸다.

Deletion and Killing

버퍼로부터 텍스트를 지우는 대부분의 명령은 마음이 바뀌었을 때 다시 돌리거나 옮기거나 복사하기 위해 그것들을 저장한다. 이런 명령들은 ``kill'' 명령이라 알려져있다. 지워지는 텍스트를 저장하지 않는 명령들은 ``delete'' 명령이라 알려져있다. (이하 kill 은 삭제, delete 는 제거라 구분하겠다.) 제거 명령은 한 글자만 지우는 명령이나, space 나 newline 만을 지우는 명령들이 포함된다. 실수로 글을 삭제, 혹은 제거했을 경우에는 `C-x u' (`undo') 명령을 사용해서 취소할 수 있다.

제거

삭제 명령

붙이기 (Yanking)

`C-y', `M-y' 명령만 잠시 살펴보자.

예를 들어 A-B-C-D 네개의 문단을 가지는 글에서 B 문단을 삭제(kill) 했다고 가정해보자. 이제 A-C-D 와 같은 글이 될 것이다. 이제 C, D 문단의 순서를 바꾸고 싶다. 그러면 C를 삭제하고, D의 끝에서 `C-y' 를 누르면 된다. 이제 글은 A-D-C의 구조를 가지게 된다. 그런데, 그렇게 하고나니 B의 내용을 A 앞에 놓고 싶어졌다. 그러면, A 의 앞에가서 `C-y'를 누른다. 그러면, C가 삽입될 것이다. 이 때, `M-y' 를 누르면, C의 내용이 삽입된 자리에 B의 내용이 들어갈 것이다. `M-y' (`yangk-pop') 명령은 `C-y' 혹은, 그에 이은 `M-y' 명령 뒤에서만 동작한다. 즉, `C-y' 를 누르면 가장 최근에 삭제된 내용이 삽입되고, 'M-y'를 누를 때마다, 그 이전에 삭제된 내용으로 바뀌어 삽입되는 것이다. 이렇듯 삭제되는 내용은 "kill ring" 에 저장되는데, 저장되는 삭제된 텍스트의 최대 갯수는 kill-ring-max 라는 변수에 저장된다. 보통 기본값은 30이다.

만일 `M-y' 를 몇번 눌러야 원하는 글이 나올지 알고 있다면, `C-y' 에 숫자 인수를 주어서 바로 꺼내올 수 있다. 예로 `C-u 2 C-y' 는 `C-y M-y'와 같다.

직사각형

직사각형 영역을 다루는 명령들을 살펴보자. 직사각형을 영역을 설정하는 것은 보통 영역을 설정하는 것과 비슷하다. 한쪽 끝에 포인트, 한쪽 끝에 마크를 위치 시키면 된다.

등록부(Registers)

Emacs ``등록부'' 는 텍스트나 위치를 다음 사용을 위해 저장하는 장소이다. 등록된 텍스트는 버퍼에 원하는 만큼 복사될 수 있다; 위치는 다음에 그 위치로 돌아오기 위해 등록할 수 있다. 직사각형 영역들도 등록부에 등록될 수 있다. 각 등록부들은 한 문자로 된 이름을 가지고 있다. 각각의 등록부는 하나의 텍스트나 위치, 혹은 직사각형 영역을 저장할 수 있다. 하지만, 한 등록부에는 한 시점에 한가지만 저장할 수 있다. 등록부에 무엇을 등록하든지 그것들은 등록부에 다른것을 저장할 때까지 보존된다.

점진적 탐색(Incremental Search)

점진적 탐색은 찾는 문자열의 첫번째 문자를 치면 시작된다. 찾는 문자열을 입력함에따라 이막스는 문자열이 있을만한 곳을 보여준다. 만일 찾고자 하는 위치를 판별하기에 충분한 문자열을 입력했다면, 멈출 수 있다.

만일 탐색문자열을 입력하는데 실수를 했다면, DEL키를 이용하여 문자들을 지울 수 있다. 만일 원하는 위치에 도달했다면 ESC를 눌러서 탐색을 멈추고 그 위치로 갈 수 있다. 탐색에 관계없는 명령을 입력할 경우에는 그 위치에 커서를 멈추고 그 명령을 실행한다. 예를 들어 `C-a'를 입력하면 커서가 있던 줄의 앞으로 이동한다. 만일 다음 명령이 문자입력이나, DEL, ESC 나 탐색에 의미가 있는 특별한 제어 명령(`C-q', `C-w', `C-r', `C-s', `C-y' 등)일 경우 ESC를 누르는 것은 필수적이다.

때때로 찾고자 하는 문자열이 여러군데 존재하고 처음에 찾은 위치가 원하는 위치가 아닐 경우, `C-s'를 한번 더 눌러서 다음의 그 문자열이 있는 위치로 이동할 수 있다. 만일 `C-s'를 너무 눌러서 원하는 위치를 지나쳤을 경우에는 DEL로 `C-s'들을 취소할 수 있다. 탐색을 멈춘후, 같은 문자열을 또 찾고 싶을 경우에는 `C-s C-s'를 누르면 된다. 첫번째 `C-s'는 점진적 탐색을 시작하는 것이고, 두번째 `C-s'는 ``재 탐색''을 의미한다. 만일 탐색문자열을 찾을 수 없는 경우, 에코영역에 `Failing I-Search' 라고 씌여진다. 커서는 탐색 실패 이전의 위치에 머물러 있는다. 예로`FOOT'을 찾는데 `FOOT'은 없고 `FOOL'이 있다면, 커서는 `FOOL'의 FOO뒤에 위치한다. 이 경우에 할 수 있는 일은 여러가지가 있다. 만일 찾고자 하는 문자열을 잘못 입력했다면 탐색문자열을 수정할 수 있다. 아니면 그 위치에서 탐색을 멈추기 위해 ESC나 기타 명령을 내릴 수 있다. 아니면, `C-g'를 눌러서 찾을 수 없는 문자들을 없앨 수 있다. 위의 예에서는 `FOOT'의 `T'가 된다. 그리고 탐색문자열은 `FOO'가 된다. 그리고 `C-g'를 두번째 누르면 탐색은 취소가 되고, 커서는 탐색을 시작했던 위치로 되돌아간다. 탐색이 실패했을 경우에 `C-s'를 누르면, 버퍼의 시작에서부터 다시 탐색을 시작한다. `C-r'을 계속 눌러서 뒷쪽으로 탐색에하는데 실패한 경우에 `C-r'을 누르면 버퍼의 끝에서 부터 다시 탐색을 시작한다. 이것은 ``wrapping aroun'' 라고 불리우고, `Wrapped'라고 표시된다. `C-s', DEL, ESC 같은 제어문자를 탐색하려면 `C-q'를 먼저 쳐야한다. 이것은 다음의 문자를 탐색문자열의 일부로 간주하게 만든다. 탐색을 뒷쪽으로 하려면, `C-r'을 누르면 된다. 마찬가지로 탐색방향을 다시 앞쪽으로 하려면, `C-s'를 누르면 된다. 처음부터 뒷쪽으로 탐색을 하려면 처음에 `C-r'을 눌러서 탐색을 시작할 수 있다. 점진적 탐색에서 `C-y' 와 `C-w' 는 버퍼의 텍스트를 탐색문자열로 잡아오는데 사용된다. `C-w'는 현재 포인트 이후의 단어부분을 탐색문자열로 복사해 온다. `C-y'는 현재의 단어 전체를 탐색문자열로 복사해 온다. (무슨말인지 잘 모르겠을 때는 직접 해보면 된다.) 점진적 탐색에서 사용되는 특수문자들은 다음의 변수들을 수정해서 바꿀 수있다.

(* 변수 값을 바꾸는 명령 : `M-x set-variable')

비점진적 탐색(Nonincremental Search)

Emacs 는 또한 탐색 문자열을 모두 입력한 뒤에 탐색을 시작하는 전통적인 비점진적 탐색방법을 제공한다.

단어 탐색(Word Search)

단어 탐색은 단어들의 연속을 단어들이 어떻게 분리되어 있는가에 관계없이 탐색을 한다. 좀 더 정확히 말하면, 단어들을 하나의 공간(space)을 이용하여 분리하면, 단어 사이에 여러개의 공간이 있거나, 새줄(newline)이 있거나 마침표가 있거나 다 찾아 준다.

비점진적 탐색이나 단어 탐색은 각각 `search-forward' 와 `search-backward', `word-search- forward' 와 `word-search-backward' 로 구현되어 있다. 이들은 새로운 키에 바인딩 될 수도 있지만, 점진적 탐색이 이들을 부를 수 있도록 만들어져있기 때문에 위와 같은 키 연속이 Emacs 에서 이들을 부르는 일반적인 방법이다.

정규식 탐색(Regular Expression Search)

이것은 점직적으로 할 수도 있고, 비 점진적으로 할 수도 있다. 점진적 탐색은 `C-M-s' (`isearch-forward-regexp') 를 누르면 불려진다. 이 명령은 `C-s' 처럼 정규식을 점진적으로 받아들이지만, 정확히 일치하는 표현을 찾는 것이 아니라, 탐색 문자열을 정규식으로 간주한다. `isearch-backward-regexp' 명령도 존재하지만, 어떤 키에 바인딩 되어 있지는 않다.

일반적인 점진적 탐색에서 적용되는 제어문자들이 여기에도 적용된다. 비점진적 정규식 탐색은 `re-search-forward' 와 `re-search-backward' 함수로 구현되어 있다. 이 함수들은 `M-x'를 이용하거나, 어떤 키에 바인딩하거나 하는 방법으로 부를 수 있다. 아니면, `C-M-s ESC'로 불러도 된다.

정규식의 형식(Syntax of Regular Expressions)

정규식은 약간의 특별한 기호를 가지고 있고 나머지는 일반 문자로 취급된다. 일반 문자는 단순히 그 문자와 일치 여부를 판정하는 간단한 정규식이다. 특수 문자는 `$', `^', `.', `*', `+', `?', `[', `]' , `\' 이다. 정규식에 나타나는 다른 문자는, `\'가 앞에 있는 경우를 제외하고는 일반 문자이다.

주: 특수문자들은 그들의 특별한 의미가 의미가 없는 위치에서는 일반 문자로 취급된다. 예로, `*foo' 의 `*'는 일반 문자로 취급된다. 그러나 이러한 양상을 이용하는 것은 좋은 습관이 아니다.

`\'구문 표는 다음과 같다.

다음은 Lisp 문법에서 사용된 복잡한 정규식의 한 예이다. Lisp 문법에서 문자열은 큰따옴표(``)로 시작해서 큰따옴표로 끝난다. `\'''는 정규식의 부분으로써의 큰따옴표를, `\\'는 정규식의 부분으로써의 역슬래쉬를, `\t'는 텝문자를, `\n'은 새줄문자를 의미한다.

"[.?!][]\"')]*\\($\\|\t\\|  \\)[ \t\n]*"

이것은 네부분으로 나누어져 있다: `.'(마침표)나, `?', `!'와 일치하는 문자집합; `]', `"'(큰따옴표), `''(작은따옴표), `)' 문자집합이 몇번이고 반복되는 부분; 줄의 끝이거나 텝이거나 두개의 스페이스와 일치하는 부분; 스페이스나 텝, 새줄등의 화이트스페이스문자가 몇번이고 반복되는 부분. 위의 예는 Emacs Lisp 프로그램에서 정규식을 어떻게 사용할 것이가에 대한 예이고, `re-search-forward' 등의 명령을 통하여 정규식을 입력할 경우에는 좀 다르게 표시해야한다.

[.?!][]"')]*\($\|^Q^I\| \)[ ^Q^I^Q^J]*    (`^'는 CTRL키를 누르라는 의미이다.)


다음 이전 차례