GNUEmacsManual:5

From 흡혈양파의 번역工房
Jump to: navigation, search
미니버퍼

미니버퍼

미니버퍼란 Emacs 명령어가 파일명, 버퍼명, Emacs 명령어 이름, Lisp 표현식 등과 같은 복잡한 인자를 읽는 곳이다. 작은 공간의 화면으로 된 특수 목적의 버퍼이기 때문에 "미니버퍼"라고 부른다. 미니버퍼에서 일반 Emacs 편집 명령어를 이용해 인자 텍스트를 편집할 수 있다.

미니버퍼 사용하기

미니버퍼를 사용하면 커서와 함께 에코 영역에 나타난다. 미니버퍼는 보통 콜론으로 끝나는 프롬프트로 시작한다. 프롬프트는 어떤 유형의 입력이 예상되고 어떻게 사용될 것인지 나타낸다. 프롬프트는
minibuffer-prompt
face를 이용해 강조된다(74 페이지의 11.8절 [Faces] 참고).


미니버퍼 인자를 가장 간단하게 입력하는 방법은 텍스트를 입력하고 RET를 입력하여 인자를 제출하고 미니버퍼를 종료하는 방법이다. 아니면 C-g 를 타이핑하여 인자를 요청하는 명령어를 취소함으로써 미니버퍼를 종료할 수도 있다(443 페이지의 34.1절 [종료하기]를 참고).


때로는 프롬프트가 콜론 바로 앞에 괄호 안에 기본 인자를 표시하기도 한다. 이 기본값은 사용자가 RET 를 타이핑하면 인자로서 사용될 것이다. 가령 버퍼명을 읽는 명령어들은 주로 버퍼명을 기본값으로 표시하며, 사용자는 RET 를 타이핑하여 해당 기본 버퍼에서 작동시킬 수 있다.


전역적 부 모드인 Minibuffer Electric Default 모드를 활성화하면 Emacs는 사용자가 미니버퍼의 내용을 수정하는 즉시 기본 인자를 숨긴다(RET 를 타이핑하면 더 이상 해당 기본 인자를 제출하지 않을 것이기 때문에). 원본 미니버퍼 텍스트를 다시 가져온다면 프롬프트는 다시 기본값을 표시한다. 또한
minibuffer-eldef-shorten-default
변수를
nil
이 아닌 값으로 변경할 경우 기본 인자가 '
(default default)
'가 아니라 '
[default]
'로 표시되어 일부 화면 공간을 저장한다. 이 부 모드를 활성화하려면 M-x minibuffer-electric-default-mode 를 타이핑한다.


미니버퍼는 에코 영역에 나타나므로 에코 영역의 다른 사용과 상충될 수도 있다. 미니버퍼가 활성화되어 있을 때 오류 메시지나 정보 메시지가 전송될 경우 메시지는 몇 초간 또는 사용자가 무언가를 타이핑할 때까지 미니버퍼를 숨기고, 미니버퍼가 되돌아온다. 미니버퍼가 사용 중일 때에는 키 누름이 에코잉을 실행하지 않는다.


파일명에 대한 미니버퍼

C-x C-f (
find-file
)와 같은 명령어들은 미니버퍼를 이용해 파일명 인자를 읽는다(20 페이지의 4.5절 [기본 파일]을 참고). 파일명 읽기에 미니버퍼가 사용될 때는 슬래시로 끝나는 이니셜 텍스트로 시작되는 것이 보통이다. 이것이 기본 디렉터리(default directory)다. 예를 들어 아래와 같이 시작될 수 있겠다:


Find file: /u2/emacs/src/


여기서 '
Find file:
'는 프롬프트이고 '
/u2/emacs/src/
'는 기본 디렉터리다. 이제
buffer.c
를 입력(input)으로 타이핑하면
/u2/emacs/src/buffer.c
파일을 명시한다. 기본 디렉터리에 관한 정보는 122 페이지의 15.1절 [파일명]을 참고한다.


이제 ..를 이용해 부모 디렉터리를 명시할 수 있다:
/a/b/../foo.el
/a/foo.el
과 동일하다. 아니면 M-DEL 을 이용해 디렉터리명을 거꾸로 삭제(kill)할 수도 있다(208 페이지의 22.1절 [워드] 참고).


완전히 다른 디렉터리의 파일을 명시하기 위해서는 C-a C-k 를 이용해 전체 기본값을 삭제할 수도 있다(27 페이지의 5.3절 [미니버퍼 편집] 참고). 아니면 기본값을 무시하고, 기본 디렉터리 다음에 슬래시나 틸데로 시작되는 절대 파일명을 입력하는 방법도 있다. 가령
/etc/termcap
를 다음과 같이 명시할 수 있겠다:


Find file: /u2/emacs/src//etc/termcap


Emacs는 더블 슬래시를 "한 쌍의 슬래시 중에 두 번째 슬래시 앞의 것은 모두 무시하라"는 의미로 해석한다. 위의 예의 경우,
/u2/emacs/src/
가 무시되므로 사용자가 제공한 인자는
/etc/termcap
이 된다. 무시된 파일명 부분은 터미널이 허용할 경우 흐릿해진다. (흐릿한 기능을 비활성화하기 위해서는 M-x file-name-shadow-mode 명령어로
File Name Shadow
모드를 끈다.)


Emacs는
~/
를 사용자의 홈 디렉터리로 해석한다. 따라서
~/foo/bar.txt
는 foo라는 디렉터리 안에 bar.txt라는 파일명을 명시하는데, 이는 결국 홈 디렉터리에 위치한다. 또한
~user-id/
라는 로그인 이름이 user-id 인 사용자의 홈 디렉터리를 의미한다. ~ 앞에 오는 디렉터리명은 무엇이든 무시되므로
/u2/emacs/~/foo/bar.txt
~/foo/bar.txt
와 동일하다.


MS-Windows와 MS-DOS 시스템과 같이 사용자에게 홈 디렉터리가 항상 존재하는 것은 아닌 시스템의 경우 Emacs는 몇 가지 대안을 갖는다. MS-Windows는 508 페이지의 G.5절 [윈도우 HOME]을 참고하고, MS-DOS는 Emacs 매뉴얼 디지털 버전에서 "MS-DOS File Name"절을 참고한다. 이러한 시스템에서
~user-id/
구성개념은 현재 사용자, 즉 user-id 가 현재 사용자의 로그인 이름일 경우에만 지원된다.


파일명을 읽을 때 Emacs가 기본 디렉터리를 삽입하지 못하도록 하기 위해서는
insert-default-directory
변수를 nil로 변경한다. 이런 경우 미니버퍼가 비우기를 시작한다. 그럼에도 불구하고 상대적 파일명 인자는 여전히 동일한 기본 디렉터리를 기반으로 해석된다.


미니버퍼에 원격 파일명을 입력할 수도 있다. 142 페이지의 15.13절 [원격 파일]을 참고한다.


미니버퍼에서 편집하기

미니버퍼는 특이하긴 하지만 Emacs 버퍼로서, 인자 텍스트를 편집하는 데에 일반 Emacs 명령어들을 이용할 수 있다. (하지만 프롬프트는 읽기 전용으로, 변경이 불가하다.)


미니버퍼에서 RET 는 인자를 제출하므로 사용자는 이를 이용해 새 행을 삽입할 수 없다. 대신 C-q C-j 를 사용하면 C-j 제어 문자를 삽입하는데, 이는 형식상 새 행 문자와 동일하다(16 페이지의 4.1절 [텍스트 삽입하기]를 참고). 아니면 C-o (open-line) 명령어를 이용할 수도 있다(21 페이지의 4.7절 [빈 행]을 참고).


미니버퍼 내에서 TAB, SPC, ? 키는 완성 명령어에 바인딩되곤 하는데, 이는 원하는 텍스트를 모두 입력하지 않고 쉽게 채우도록 해준다. 28 페이지의 5.4절 [완성]을 참고한다. RET 와 마찬가지로 C-q 를 이용해 TAB, SPC, '?' 문자를 삽입할 수 있다.


편의상 미니버퍼 안에서 C-a (
move-beginning-of-line
)는 포인트를 프롬프트의 시작이 아니라 인자의 시작으로 이동시킨다. 예를 들어, 이는 C-a C-k 를 이용해 전체 인자를 삭제하도록 해준다.


미니버퍼가 활성화되면 에코 영역은 마치 일반 Emacs 창처럼 취급된다. 예를 들어, 사용자는 다른 창으로 전환하여(C-x o를 이용하여), 그 곳에서 텍스트를 편집한 후 미니버퍼 창으로 돌아와 인자를 끝마칠 수 있다. 다른 창에서 텍스트를 종료하고 미니버퍼 창으로 돌아와 텍스트를 인자로 가져올 수도 있다. 하지만 미니버퍼 창에서는 몇 가지가 제한되는데, 가령 분리(split)가 불가하다는 점을 들 수 있다. 156 페이지의 17장 [창]을 참고한다.


보통 미니버퍼 창은 하나의 화면 행을 차지한다. 하지만 두 개 이상의 행으로 된 텍스트를 미니버퍼로 추가할 경우, 자동으로 텍스트를 수용하도록 확장된다.
resize-mini-windows
변수는 미니버퍼의 크기조정을 제어한다. 기본값은
grow-only
로, 방금 설명한 행위를 의미한다. 값이 t일 경우 사용자가 미니버퍼로부터 텍스트의 일부 행을 최소 하나의 화면 행까지 제거하면 미니버퍼 창 역시 자동으로 줄어들 것이다. 값이 nil일 경우 미니버퍼 창은 절대 자동으로 크기를 변경하지 않을 것이지만 그곳에서 일반적인 창 크기 조정 명령어를 사용할 수는 있다(156 페이지의 17장 [창] 참고).


max-mini-window-height
변수는 미니버퍼 창의 크기조정에 대한 최대 높이를 제어한다. 부동소수점은 프레임 높이의 비율을 명시하고, 정수는 최대 행 수를 명시하며, nil은 미니버퍼 창의 크기를 자동으로 조정하지 않음을 의미한다. 기본값은 0.25로 설정된다.


미니버퍼 내에서 C-M-v 명령어는 다른 창에서 어떤 유형의 도움말 텍스트든 표시하는 명령어로부터 도움말 텍스트를 스크롤한다. M-priorM-next (또는 각각 M-PageUpM-PageDown)를 이용해 도움말 텍스트를 스크롤할 수도 있다. 이는 특히 가능한 완성 목록이 길 때 유용하다. 157 페이지의 17.3절 [다른 창]을 참고한다.


Emacs는 보통 미니버퍼가 활성화되어 있을 때 미니버퍼를 사용하는 명령어를 대부분 허용하지 않는다. 미니버퍼 내에서 그러한 명령어를 허용하기 위해서는
enable-recursive-minibuffers
변수를
t
로 설정한다.


미니버퍼가 활성화되어 있지 않으면
minibuffer-inactive-mode
에 해당하며, 그 곳에서
Mouse-1
을 클릭하면
*Messages*
버퍼를 표시한다. 사용자가 미니버퍼 전용 프레임을 사용한다면 Emacs는 특정 키 역시 인식하는데, 가령 n은 새로운 프레임을 만드는 것을 의미한다.


완성

완성이라는 기능을 이용해 인자를 입력하도록 도울 수도 있다. 이는 인자의 일부를 사용자가 타이핑한 후에 그 내용을 바탕으로 Emacs가 나머지 또는 일부를 채워 넣을 수 있음을 의미한다.


완성을 이용할 수 있으면 특정 키는 (주로 TAB, RET, SPC) 미니버퍼에서 특수 완성 명령어로 리바인딩된다(29 페이지의 5.4.2절 [완성 명령어]를 참고). 이러한 명령어들은 인자를 요청한 명령어가 제공하는 완성 대안의 집합을 바탕으로 하여 미니버퍼 내 텍스트의 완성을 시도한다. 완성 대안의 목록은 ? 를 타이핑하여 확인할 수 있다.


완성은 주로 미니버퍼에서 이루어지지만 기능은 종종 일반 버퍼에서도 이용 가능하다. 254 페이지의 23.8절 [부호 완성]을 참고한다.


완성 예제

여기서 간단한 예를 들면 도움이 되겠다. M-x 는 명령어의 이름을 읽기 위해 미니버퍼를 사용하므로 완성은 기존 Emacs 명령어의 이름에 미니버퍼 텍스트를 일치시킴으로써 작동한다.
auto-fill-mod
e 명령어를 실행하길 원한다고 가정해보자. M-x auto-fill-mode RET 라고 타이핑하면 가능하지만 완성을 이용하면 더 수월하다.


M-x a u TAB 라고 입력하면 TAB은 'au'로 시작하는 완성 대안을 (이번 경우 명령어 이름) 모색한다.
auto-fill-mode
autoconf-mode
를 비롯해 여러 개가 있지만 모두 auto로 시작하므로 미니버퍼 내에 'au'는 'auto'로 완성된다. (대부분 명령어는 사용자의 Emacs 세션에서 정의할 수 있다. 예를 들어
authorize-me
라는 명령어가 정의되었다면 Emacs는 '
aut
'까지만 완성할 수 있을 것이다.)


다시 즉시 TAB 라고 타이핑하면 다음 문자를 결정할 수 없는데, '
-
', '
a
', 또는 '
c
'가 될 수 있기 때문이다. 따라서 어떠한 문자도 추가하지 않으며, TAB은 모든 가능한 완성 목록을 다른 창에 표시한다.


그 다음으로 -f 를 타이핑한다. 이제 미니버퍼는 '
auto-f
'를 포함하고, 이것으로 시작하는 유일한 명령어 이름은
auto-fill-mode
가 된다. 이제 T A P 을 입력하면 완성기능은 '
auto-fill-mode
' 인자의 나머지를 미니버퍼에 채운다.


따라서 a u TAB - f TAB 라고만 타이핑하여도 '
auto-fill-mode
'를 입력할 수 있다.


완성 명령어

아래는 완성이 허용될 때 미니버퍼에 정의된 완성 명령어 목록이다.


TAB 미니버퍼 내에 텍스트를 가능한 한 많이 완성하고, 완성할 수 없다면 가능한 완성 목록을 표시한다(
minibuffer-complete
).


SPC 포인트 앞에 미니버퍼 텍스트로부터 하나의 워드까지 완성한다(
minibuffer-complete-word
). 이 명령어는 파일명과 같이 종종 스페이스를 포함하는 인자에는 이용할 수 없다.


RET 미니버퍼 내 텍스트를 인자로서 제출하는데 아마도 가장 먼저 완성되는 텍스트일 것이다(
minibuffer-complete-and-exit
). 30 페이지의 5.4.3절 [완성 나가기]를 참고한다.


? 완성 목록을 표시한다(
minibuffer-completion-help
).


TAB (
minibuffer-complete
)은 가장 기본적인 완성 명령어다. 이 명령어는 기존 미니버퍼 텍스트와 일치할 가능성이 있는 완성을 모두 검색하고, 가능한 한 많은 완성을 시도한다. 완성 대안을 선택하는 방법은 31 페이지의 5.4.4절 [완성 스타일]을 참고한다.


SPC (
minibuffer-complete-word
)는 TAB과 마찬가지로 완성하지만 다음 하이푼이나 스페이스까지만 완성한다. 미니버퍼에 '
auto-f
'가 있을 때 SPC 라고 타이핑하면 완성이 '
auto-fill-mode
'인 것을 찾고 '
ill-
'만 삽입하며 '
auto-fill-
'를 제공한다. 이 포인트에서 다시 SPC라고 타이핑하면 '
auto-fill-mode
'까지 완성한다.


TAB 또는 SPC 가 완성할 수 없다면 다른 창(이 존재할 경우)에 일치하는 완성 대안의 목록을 표시한다. ? (
minibuffer-completion-help
)를 이용하여도 동일한 목록을 표시할 수 있다. 다음 명령어들을 완성 목록과 함께 이용할 수 있다:


Mouse-1 또는 Mouse-2 완성 대안에서 마우스 버튼 1 또는 2를 클릭하면 그것을 선택한다(
mouse-choose-completion
).


M-v PageUp prior 미니버퍼에 있는 동안 M-v 를 입력하면 완성 목록을 표시하는 창을 선택한다(
switch-to-completions
). 이는 아래 명령어를 사용할 수 있는 상황을 조성한다. PageUp 또는 prior 역시 마찬가지다. 다른 방법을 이용해서 창을 선택할 수도 있다(156 페이지의 17장 [창]을 참고).


RET 완성 목록 버퍼에 있는 동안 이 명령어는 포인트에서 완성을 선택한다(
choose-completion
).


완성 목록 버퍼에 있는 동안 이 명령어는 다음 완성 대안으로 포인트를 이동시킨다(
next-completion
).


완성 목록 버퍼에 있는 동안 이 명령어는 이전 완성 대안으로 포인트를 이동시킨다(
previous-completion
).


완성 나가기

명령어는 완성과 함께 미니버퍼를 이용해 인자를 읽을 때 사용자가 인자를 제출하기 위해 RET (
minibuffer-complete-and-exit
)를 타이핑하면 어떤 일이 일어날 것인지에 대해서도 통제한다. 네 가지 유형의 행위가 있다:


  • 엄격한 완성은 정확한 완성 일치 결과만 수용한다. RET이라고 입력하면 미니버퍼 텍스트가 완전히 일치할 때 혹은 완전히 일치하는 결과로 완성될 때에만 미니버퍼를 종료한다. 그 외의 경우 Emacs는 미니버퍼의 종료를 거부하고, 대신 완성을 시도하며, 어떠한 완성도 실행할 수 없을 경우 미니버퍼 텍스트 다음에 임시로 '
    [No match]
    '를 표시한다. (명령어를 취소하기 위해서는 C-g 를 타이핑하여 미니버퍼를 떠날 수도 있다.) 이러한 행위를 사용하는 명령어 예제는 M-x 를 들 수 있는데, 존재하지 않는 명령어 이름을 수용하는 것은 의미가 없기 때문이다.
  • 주의적 완성은 엄격한 완성과 같은데, RET 는 텍스트가 이미 정확한 일치 결과일 때에만 종료된다. 텍스트가 정확한 일치 결과로 완성될 경우 RET 는 해당 완성을 실행하고 아직 종료되지는 않으며, 종료를 위해서는 두 번째로 RET 를 타이핑해야만 한다.
  • 주의적 완성은 가령 이미 존재해야 하는 파일에 대한 파일명을 읽는 데에 사용된다.
  • 허용 완성은 어떤 입력이든 허용하며, 완성 후보는 제안일 뿐이다. RET 라고 타이핑하면 완성되는 것이 아니라 사용자가 입력하는 즉시 인자를 제출할 뿐이다.
  • 확인과 허용 완성은 허용 완성과 동일하나 한 가지 차이가 있다. 즉 T A P 이라고 타이핑하여 어느 정도의 중간 상태까지 텍스트를 완성하였다면 (예: 아직 정확한 완성 일치 결과가 아닌)그 직후 RET 라고 타이핑할 경우 인자를 제출하지 않는다. 대신 Emacs는 텍스트 다음에 일시적으로 '
    [Confirm]
    '를 표시함으로써 확인을 요청하므로, 확인하고 텍스트를 제출하기 위해서는 다시 RET를 타이핑한다. 이는 한 가지 흔히 범하는 실수, TAB이 원하는 만큼 완성하지 않았다는 사실을 인식하기 전에 RET 를 타이핑하는 실수를 포착한다.
    confirm-nonexistent-file-or-buffer
    변수를 맞춤화함으로써 확인 행위를 수정할 수도 있다. 기본값
    after-completion
    는 방금 설명한 행위를 제공한다. 이를 nil로 변경하면 Emacs는 확인을 요청하지 않고 허용 완성으로 돌아간다. nil이 아닌 다른 값으로 변경할 경우 Emacs는 앞선 명령어가 TAB 이었는지 확인을 요청한다.
    이러한 행위는 C-x C-f 와 같이 파일명을 읽는 대부분의 명령어와 C-x b 와 같이 버퍼명을 읽는 명령어에 의해 사용된다.


완성 대안을 선택하는 방법

완성 명령어는 가능한 완성 대안의 큰 목록을 사용자가 미니버퍼에 타이핑한 것과 "일치"하는 작은 하위집합으로 좁히기(narrow)를 통해 작동한다. 28 페이지의 5.4.1절 [완성 예제]에서는 그러한 매칭의 간단한 예를 제공한다. 무엇이 "매치"를 구성하는지 결정하는 절차는 꽤 복잡하다. Emacs는 대부분의 상황에서 실행 가능한 완성을 제공하려고 노력한다.


Emacs는 하나 또는 이상의 완성 스타일을 이용해 완성을 실행하는데, 이러한 스타일은 미니버퍼 텍스트를 완성 대안에 일치시키기 위한 기준 집합이다. 완성 중에 Emacs는 각 완성 스타일을 차례로 시도한다. 스타일이 하나 또는 이상의 일치 결과를 야기할 경우 완성 대안 목록으로 사용된다. 스타일이 어떠한 일치 결과도 생성하지 않을 경우 Emacs는 다음 스타일로 돌아간다.


목록 변수
completion-styles
는 사용할 완성 스타일을 명시한다. 각 목록 요소는 완성 스타일의 이름이다(Lisp 부호). 기본 완성 스타일은 차례로 다음과 같다:


basic
매칭 완성 대안은 미니버퍼에서 포인트 앞에 텍스트와 동일한 시작을 가져야 한다. 또한 미니버퍼에서 포인트 다음에 텍스트가 있을 경우 나머지 완성 대안은 해당 텍스트를 하위문자열로 포함해야 한다.
partial-completion
이 적극적인 완성 스타일은 미니버퍼 텍스트를 하이푼 또는 스페이스로 구분된 워드에 나누고, 각 워드를 따로 완성한다. (예를 들어 명령어 이름을 완성할 때 '
em-l-m
'은 '
emacs-lisp-mode
'로 완성된다.)
또한 미니버퍼 텍스트에서 '*'는 와일드카드로 취급되는데, 완성 대안에서 그에 상응하는 위치에 있는 어떤 문자와도 일치한다.
emacs22
미니버퍼에서 포인트 다음에 텍스트를 무시한다는 점만 제외하면 basic과 비슷한 완성 스타일이다. Emacs 22에서 완성 행위와 일치하기 때문에 이와 같은 이름을 붙였다.


아래 추가 완성 스타일 역시 정의되어 있으며, 원한다면
completion-styles
로 추가해도 좋다(412 페이지의 33장 [맞춤화]를 참고):


substring
일치하는 완성 대안은 미니버퍼에서 포인트 앞의 텍스트와 미니버퍼에서 포인트 다음 텍스트를 하위문자열로 포함해야 한다(동일한 순서로).
따라서 미니버퍼 내 텍스트가 '
foobar
'이고 '
foo
'와 '
bar
' 사이에 점이 있으면 '
afoobbarc
'와 일치하는데, 여기서 a, b, c는 빈 문자열을 비롯해 어떤 문자열도 가능하다.
initials
이 적극적인 완성 스타일은 두문자어 완성을 시도한다. 예를 들어, 명령어 이름을 완성할 때는 '
lch
'를 '
list-command-history
'에 일치시킨다.


emacs21
이라고 불리는 매우 간단한 완성 스타일도 있다. 이 스타일에서는 미니버퍼 내 텍스트가 '
foobar
'일 경우 '
foobar
'로 시작되는 일치 결과만 고려된다.


completion-category-overrides
변수를 설정함으로써 여러 상황에서 여러 완성 스타일을 사용할 수도 있다. 가령 기본 설정은 버퍼명 완성에
basic
substring
완성만 사용하라고 말한다.


완성 옵션

명령어 이름과 같이 대소문자에 민감한 인자를 완성할 때에는 대소문자가 중요하다. 예를 들어, 명령어 이름을 완성할 때 '
AU
'는 '
auto-fill-mode
'로 완성되지 않는다. 대소문자가 중요하지 않은 인자를 완성할 때는 대소문자 차이가 무시된다.


파일명을 완성할 때
read-file-name-completion-ignore-case
변수 가
nil
이 아닐 경우 대소문자 차이는 무시된다. 기본값은 GNU/Linux와 같이 대소문자에 민감한 파일명을 가진 시스템에서는
nil
이고, Microsoft Windows처럼 대소문자에 민감하지 않은 파일명을 가진 시스템에서는
nil
이 아니다. 버퍼명을 완성할 때
read-buffer-completion-ignore-case
변수가
nil
이 아닐 경우 대소문자 차이가 무시되며, 기본값은
nil
이다.


파일명을 완성할 때 Emacs는 보통 선택되지 않을 가능성이 크다고 간주되는 특정 대안(alternative)은 생략하는데 이는
completion-ignored-extensions
목록 변수로 결정된다. 목록에서 각 요소는 문자열이어야 하고, 그러한 문자열로 끝나는 파일명은 완성 대안으로서 무시된다. 슬래시(/)로 끝나는 요소는 하위디렉터리명을 나타낸다.
completion-ignored-extensions
의 표준값은 "
.o
", "
.elc
", "
~
"를 포함해 여러 요소를 가진다. 예를 들어 디렉터리가 '
foo.c
'와 '
foo.elc
'를 포함할 경우 '
foo
'는 '
foo.c
'로 완성된다. 하지만 가능한 모든 완성이 만일 "무시되는" 문자열로 끝난다면 모든 완성이 무시되지는 않는데, 앞의 '
foo.e
'를 예로 들면 이는 '
foo.elc
'로 완성될 것이다. 완성 목록에 완성 대안을 표시하면 Emacs는
completion-ignored-extensions
를 무시한다.


셸 완성은 파일명 완성의 확장 버전으로, 390 페이지의 31.4.7절 [셸 옵션]을 참고한다.


completion-auto-help
nil
로 설정되면 완성 명령어는 완성 목록 버퍼를 절대 표시하지 않으며, 목록을 표시하기 위해서는 ? 를 타이핑해야 한다.
lazy
가 값일 경우 Emacs는 완성을 두 번째로 시도할 때 완성 목록 버퍼를 표시할 것이다. 다시 말해, 완성해야 할 것이 아무 것도 없다면 첫 번째 TAB은 '
Next char not unique
'를 에코잉하고, 두 번째 TAB은 완성 목록 버퍼를 표시한다.


completion-cycle-threshold
nil
이 아닐 경우, 완성 명령어는 완성 대안을 "순환"할 수 있다. 보통 미니버퍼 내 텍스트에 대해 하나 이상의 완성 대안이 있을 경우 완성 명령은 가장 긴 공통 하위문자열까지 완성된다.
completion-cycle-threshold
t
로 변경할 경우, 완성 명령어는 대신 그러한 완성 대안의 첫 번째까지 완성하고, 잇따라 완성 명령어를 호출할 때마다 순환 방식으로 다음 완성 대안을 대체한다.
completion-cycle-threshold
에 수치값
n
을 부여할 경우 완성 명령어는 n개 이하의 대안이 있을 때에만 이 순환 행동으로 전환한다.


미니버퍼 히스토리

미니버퍼로 입력하는 모든 인자는 미니버퍼 히스토리 목록에 저장되어 사용자가 후에 쉽게 찾아볼 수 있도록 한다. 다음의 인자를 사용하면 이전 인자를 미니버퍼로 빠르게 가져올 수 있다:


M-p 미니버퍼 히스토리에서 이전 항목, 이전 인자로 이동한다. (
previous-history-element
).


M-n 미니버퍼 히스토리에서 다음 항목으로 이동한다(
next-history-element
).


M-r regexp RET 미니버퍼에서 regexp와 일치하는 이전 항목으로 이동한다(
previous-matching-history-element
).


M-s regexp RET 미니버퍼 히스토리에서 regexp와 일치하는 이후 항목으로 이동한다(
next-matching-history-element
).


미니버퍼에서 M-p 또는 (
previous-history-element
)은 미니버퍼 히스토리 목록을 한 번에 하나의 항목씩 이동한다. 각 M-p 는 히스토리 목록의 이전 항목을 미니버퍼로 가져와 기존 내용을 대체한다. M-n 또는 (
next-history-element
)이라고 타이핑하면 미니버퍼 히스토리 목록을 반대 방향으로 이동하면서 이후 엔트리를 미니버퍼에 가져온다.


미니버퍼 히스토리에 이후 엔트리가 없을 때 미니버퍼에 M-n 이라고 타이핑하면 (예: 이전에 M-p 라고 타이핑한 적이 없다면) Emacs는 기본 인자의 목록에서 가져오기를 시도하는데, 이는 사용자가 입력할 법한 값에 해당한다. 이는 "future history" 목록을 이동하는 것으로 보면 되겠다.


M-p 또는 M-n 미니버퍼 히스토리 명령어로 삽입된 텍스트를 편집할 경우 히스토리 목록에서 그 엔트리를 변경하지 않는다. 하지만 편집된 인자는 그것을 제출 시 히스토리 목록의 끝으로 간다.


M-r (
previous-matching-history-element
)을 이용해 히스토리 목록에서 오래된 요소를 검색하고, M-s (
next-matching-history-element
)를 이용해 신규 엔트리를 검색할 수도 있다. 이러한 명령어 각각은 정규 표현식을 인자로 요청하여 처음으로 일치하는 엔트리를 미니버퍼로 가져온다. 정규 표현식에 대한 설명은 97 페이지의 12.6절 [Regexps]를 참고한다. 수치적 접두 인자 n은 n번째 일치하는 엔트리를 가져오는 것을 의미한다. 이러한 명령어들은 미니버퍼로부터 호출될지라도 정규 표현식 인자를 읽기 위해 미니버퍼를 사용한다는 점에서 특이하다고 할 수 있다. 정규 표현식의 대문자는 검색이 대, 소문자에 민감함을 의미한다(102 페이지의 12.9절 [검색 대, 소문자] 참고).


증분 검색을 이용해 히스토리를 검색할 수도 있다. 94 페이지의 12.1.7절 [Isearch 미니버퍼]를 참고한다.


Emacs는 여러 유형의 인자에 대해 구분된 히스토리 목록을 보관한다. 예를 들어, 파일명을 읽는 모든 명령어가 사용하는 파일명 목록이 있다. 그 외 히스토리 목록은 버퍼명, 명령어 이름(M-x 가 사용하는), (
query-replace
와 같은 명령어들이 사용하는) 명령어 인자를 포함한다.


history-length
변수는 미니버퍼 히스토리 목록의 최대 길이를 명시하고, 새로운 요소를 더하는데 목록이 너무 길면 가장 오래된 요소를 삭제한다. 값이 t일 경우 최대 길이가 없다.


history-delete-duplicates
변수는 히스토리에서 중복내용을 삭제할 것인지를 명시한다.
nil
이 아닌 값일 때 새로운 요소를 추가하면 그와 동일한 다른 모든 요소들의 목록으로부터 삭제한다. 기본값은
nil
이다.


미니버퍼 명령어 반복하기

미니버퍼를 한 번만 사용하는 모든 명령어는 특별한 히스토리 목록인 명령어 히스토리라는 곳에 인자의 값과 함께 기록되므로 사용자는 전체 명령어를 반복할 수 있다. 특히 M-x 는 명령어 이름을 읽기 위해 미니버퍼를 사용하므로 M-x 의 모든 사용이 기록된다.


C-x ESC ESC 명령어 히스토리로부터 최근 미니버퍼 명령어를 재실행한다(
repeat-complex-command
).


M-x list-command-history 전체 명령어 히스토리를 표시하여 C-x ESC ESC 가 반복할 수 있는 모든 명령어를 가장 최근을 우선으로 하여 표시한다.


C-x ESC ESC 는 미니버퍼를 사용한 최근 명령어를 재실행한다. 인자가 없다면 그러한 마지막 명령어를 반복한다. 수치적 인자는 반복해야 할 명령어를 명시하는데, 1은 마지막, 2는 이전 명령어 식으로 나아간다.


C-x ESC ESC 는 이전 명령어를 Lisp 표현식으로 바꾼 후 해당 표현식에 대한 텍스트로 초기화된 미니버퍼를 입력함으로써 작동한다. Lisp를 모른다 하더라도 반복에 어떠한 명령어가 표시되는지는 분명해질 것이다. RET만 타이핑할 경우 변경되지 않은 명령어만 반복한다. Lisp 표현식을 실행하기 전에 편집함으로써 명령어를 변경할 수도 있다. 실행된 명령어는 가장 최근 항목과 동일하지 않는 한 명령어 히스토리 앞에 추가된다.


C-x ESC ESC 에 대한 미니버퍼 안에 있는 한 사용자는 일반적 미니버퍼 히스토리 명령어를 이용해 (32 페이지의 5.5절 [미니버퍼 히스토리] 참고) 히스토리 목록을 이동시킬 수 있다. 원하는 이전 명령어를 찾은 후에는 그 표현식을 평소대로 편집하고 RET를 타이핑함으로써 실행할 수 있다.


엄밀히 말해 증분 검색(incremental search)은 미니버퍼를 사용하지 않는다. 따라서 복잡한 명령어처럼 행동한다 하더라도 보통 C-x ESC ESC 에 대한 히스토리 목록에 나타나지 않는다.
isearch-resume-in-command-history
nil
이 아닌 값으로 설정함으로써 증분 검색 명령어가 히스토리에 표시되도록 만들 수 있다. 90 페이지의 12.1절 [증분 검색]을 참고한다.


미니버퍼를 사용하는 이전 명령어의 목록은
command-history
변수에 Lisp 리스트로서 저장된다. 각 요소는 하나의 명령어와 그 인자를 설명하는 Lisp 표현식이다.
command-history
요소가 있는
eval
을 호출함으로써 Lisp 프로그램이 명령어를 재실행할 수 있다.


암호 입력하기

때로는 Emacs에 암호를 입력해야 한다. 가령 Emacs에 FTP와 같은 네트워크 프로토콜을 통해 다른 머신 상의 파일에 방문하라고 알릴 경우, 머신으로 접근성을 얻기 위해 암호를 제공해야 할 때가 있다(142 페이지의 15.13절 [원격 파일] 참고).


암호 입력은 미니버퍼의 이용과 비슷하다. Emacs는 에코 영역에 프롬프트를 표시하고 (예: '
Password:
'), 필요한 암호를 사용자가 입력한 후 RET 를 눌러 제출한다. 다른 사람이 암호를 보지 못하도록 사용자가 입력하는 모든 문자는 일반 형태 대신 점('
.
')으로 표시된다.


미니버퍼와 관련된 대부분의 기능과 명령어는 암호를 입력할 때는 사용할 수 없다. 히스토리나 완성이 없으며, 사용자는 암호를 제출하기 전에는 Emacs로 다른 어떠한 행동도 실행할 수 없고 창을 변경할 수도 없다.


암호를 입력하는 동안 DEL을 누르면 거꾸로 삭제가 되면서 마지막으로 입력한 문자가 제거된다. C-u 는 지금까지 입력한 모든 것을 제거한다. C-g 는 암호 프롬프트를 종료한다(443 페이지의 34.1절 [종료하기]를 참고). C-y 는 현재 킬(제거된 내용)을 암호에 삽입한다(52 페이지의 9장 [제거하기] 참고). 암호는 RET 또는 ESC 를 타이핑하여 제출할 수 있다. 그 외 스스로 삽입하는 문자 키는 관련 문자를 암호로 삽입하고, 다른 모든 입력은 무시된다.


예/아니오 입력하기

Emacs 명령어는 실행 중에 "예 또는 아니오"란 질문에 답을 요구하기도 한다. 그러한 쿼리에는 두 가지가 있다.


첫 번째 "예 또는 아니오" 쿼리 유형에서 프롬프트는 '
(y or n)
'로 끝이 난다. 그러한 쿼리는 사실상 미니버퍼를 사용하지 않으며, 프롬프트가 에코 영역에서 나타나고, 사용자는 'y' 또는 'n'을 타이핑하여 응답하면 즉시 응답을 전달한다. 예를 들어, C-x C-w (
write-file
)라고 타이핑하여 버퍼를 저장하고 기존 파일명을 입력하면 Emacs는 아래와 같은 프롬프트를 송출한다:


File 'foo.el' exists; overwrite? (y or n)


이 쿼리는 사실상 미니버퍼를 사용하지 않으므로, 일반적 미니버퍼 편집 명령어를 사용할 수 없다. 하지만 쿼리가 활성화되는 동안 일부 창 스크롤 연산을 실행할 수 있는데, C-l 는 선택된 창을 재중심화하고, M-v (또는 PageDown 혹은 next)는 앞으로 스크롤하며, C-v (또는 PageUp, 혹은 prior)는 뒤로 스크롤하고, C-M-v 는 다음 창에서 앞으로 스크롤하며, C-M-S-v 는 다음 창에서 뒤로 스크롤한다. C-g 를 타이핑하면 쿼리를 무시하고, 그것을 송출한 명령어를 중단시킨다(443 페이지의 34.1절 [종료하기]를 참고한다).


두 번째 유형의 "예 또는 아니오" 쿼리는 틀린 답을 제공할 경우 심각한 결과를 도출할 경우에 사용되는데, 미니버퍼를 이용하고, ' (yes or no)'로 끝나는 프롬프트를 특징으로 한다. 예를 들어, 저장되지 않은 변경내용이 있는 파일을 방문하는 버퍼에서 C-x k (
kill-buffer
)를 호출하면 Emacs는 다음과 같은 프롬프트로 미니버퍼를 활성화한다:


Buffer foo.el modified; kill anyway? (yes or no)


답을 하기 위해서는 미니버퍼에 '
yes
' 또는 '
no
' 와 함께 뒤에 RET 를 입력해야 한다. 미니버퍼는 앞 절에서 설명한 바와 같이 행동하며, 사용자는 C-x o 를 이용해 다른 창으로 전환하거나, 히스토리 명령어 M-pM-f 를 이용할 수 있다. 미니버퍼와 쿼리 명령어를 종료하려면 C-g 라고 입력한다.



Notes