GNUEmacsManual:16

From 흡혈양파의 번역工房
Jump to navigation Jump to search
다중 버퍼 사용하기

다중 버퍼 사용하기

Emacs에서 편집 중인 텍스트는 버퍼라는 객체에 상주한다. 사용자가 파일에 방문할 때마다 버퍼가 사용되어 파일의 텍스트를 보유한다. 그리고 Dired를 호출할 때마다 버퍼가 사용되어 디렉터리 리스팅을 보유한다. C-x m 을 이용해 메시지를 전송하면 버퍼를 이용해 메시지의 텍스트를 보유한다. 명령어의 문서를 요청하면

*Help*

라는 버퍼에 나타난다.


각 버퍼는 유일한 이름을 갖고 있으며, 어떤 길이든 가능하다. 버퍼가 창에 나타나면 그 이름은 모드 행에 표시된다(8 페이지의 1.3절 [모드 행] 참고). 버퍼명에는 대문자와 소문자의 차이가 중요하다. 대부분 버퍼는 파일을 방문함으로써 만들어지고, 그 이름은 파일명에서 도출되지만 원하는 이름을 가진 빈 버퍼를 생성할 수도 있다. 새로 시작된 Emacs는 Lisp 표현식을 평가하는 데에 사용 가능하면서 어떠한 파일과도 상관되지 않은

*scratch*

로 명명된 버퍼를 포함해 여러 개의 버퍼를 갖고 있다(279 페이지의 24.10절 [Lisp 상호작용] 참고).


버퍼는 언제나 하나만 선택 가능하며 이를 현재 버퍼라고 부른다. 가끔은 "버퍼"에서 명령어가 실행된다고 말하기도 하는데, 이는 현재 버퍼에서 실행됨을 의미한다. 하나의 Emacs 창만 존재할 경우 해당 창에 표시되는 버퍼가 현재 버퍼가 된다. 여러 개의 창이 있으면 선택된 창에 표시된 버퍼가 현재 버퍼가 된다. 156 페이지의 17장 [창]을 참고한다.


텍스트 내용 외에도 각 버퍼는 그것이 방문하는 파일(이 존재할 경우)의 수정 여부와 상관없이 그리고 어떤 주 모드와 부 모드가 실행 중인지와 상관없이 여러 가지의 정보 조각을 기록한다(199 페이지의 20장 [모드] 참고). 이러한 정보들은 버퍼 로컬 변수, 즉 각 버퍼에서 다른 값을 가질 수 있는 변수에 보관된다. 423 페이지의 33.2.3절 [로컬]을 참고한다.


버퍼 크기는 최대값보다 커질 수 없는데, 이 값은 Emacs 정수로 표현 가능한 최대 버퍼 위치로 정의된다. 그 이유는 Emacs가 해당 데이터 유형을 이용해 버퍼 위치를 추적하기 때문이다. 일반적 64 비트 머신에서 최대 버퍼 크기는 261, 즉 2 바이트, 또는 대략 2 EiB이다. 일반적 32 비트 머신에서 최대 크기는 주로 229, 즉 2 바이트 또는 512 MiB이다. 버퍼 크기는 시스템의 메모리량으로 제한되기도 한다.


버퍼 생성과 선택

C-x b buffer RET buffer라는 버퍼를 선택하거나 생성한다(

switch-to-buffer

).


C-x 4 b buffer RET 위와 비슷하나 다른 창에서 버퍼를 선택한다(

switch-to-buffer-other-window

).


C-x 5 b buffer RET 위와 비슷하나 구분된 프레임에서 버퍼를 선택한다(

switch-to-buffer-other-frame

).


C-x LEFT 버퍼 리스트에서 이전 버퍼를 선택한다(

previous-buffer

).


C-x RIGHT 버퍼 리스트에서 다음 버퍼를 선택한다(

next-buffer

).


C-u M-g M-g C-u M-g g 숫자 n 을 읽어 현재 버퍼를 제외하고 가장 최근에 선택된 버퍼에서 행 n 으로 이동시킨다.


C-x b (

switch-to-buffer

) 명령어는 미니버퍼를 이용해 버퍼 이름을 읽는다. 그리고 읽어온 버퍼를 현재 버퍼로 만들고, 현재 선택된 창에 그 버퍼를 표시한다. 빈 입력값은 현재 어떤 창에도 표시되지 않은 창들 중에서 가장 최근의 '현재 버퍼'를 명시한다.


버퍼 이름을 입력하면서 일반 완성과 히스토리 명령어를 사용할 수 있다(26 페이지의 5장 [미니버퍼] 참고). C-x b, 또는 그와 관련된 명령어들은 미니버퍼 완성에 "permissive completion with confirmation"을 사용하므로, 존재하지 않는 버퍼 이름을 완성한 직후에 사용자가 RET 를 입력하면 Emacs는 '

[Confirm]

'를 출력하고, 사용자가 두 번째로 RET 를 입력하면 해당 버퍼의 이름을 제출함을 명심한다. 상세한 내용은 30 페이지의 5.4.3절 [완성 종료하기]를 참고한다.


존재하지 않는 버퍼를 명시할 경우 C-x b 는 어떠한 파일도 방문하지 않는 비어 있는 새 버퍼를 생성하여 편집하기 위해 선택한다.

major-mode

변수의 기본값은 새 버퍼의 주 모드를 결정하는데, 기본값은 Fundamental 모드이다. 199 페이지의 20.1절 [주 모드]를 참고한다. 새 버퍼를 생성하는 한 가지 이유는 임시 노트를 만드는 데에 사용하기 위함이다. 저장을 시도할 경우 Emacs는 사용할 파일명을 요청하고, 버퍼의 주 모드는 해당 파일명을 고려하여 다시 구성된다(202 페이지의 20.3절 [모드 선택하기] 참고).


몇 가지의 버퍼들을 편리하게 전환하기 위해서는 C-x LEFTC-x RIGHT 명령어를 사용한다. C-x LEFT (

previous-buffer

)는 이전 버퍼(현재 프레임에서 가장 최근의 선택 순서를 따른다)를 선택하는 반면 C-x RIGHT (

next-buffer

)는 역 방향으로 버퍼를 통해 이동한다.


현재 창 이외의 창에서 버퍼를 선택하려면 C-x 4 b (

switch-to-buffer-other-window

)를 입력한다. 이는 미니버퍼를 이용해 버퍼 이름을 요청하고 다른 창에 해당 버퍼를 표시한 후 해당 창을 선택한다.


이와 비슷하게 C-x 5 b (

switch-to-buffer-other-frame

) 는 버퍼 이름을 요청하고, 다른 프레임에 해당 버퍼를 표시한 후 그 프레임을 선택한다. 버퍼가 이미 다른 프레임의 창에 표시되어 있다면 Emacs는 새 프레임을 생성하는 대신 그 프레임과 표시되어 있는 창을 선택한다.


C-x 4 bC-x 5 b 명령어가 표시할 창과 프레임을 어떻게 얻는지는 160 페이지의 17.6절 [버퍼 표시하기]를 참고한다.


또한 C-x C-f 를 비롯해 파일을 방문하는 다른 명령어 역시 파일을 방문하는 기존 버퍼로 전환하는 데에 사용할 수 있다. 123 페이지의 15.2절 [방문하기]를 참고한다.


일반 접두 인자가 있는

goto-line

격인 C-u M-g M-g 는 미니버퍼를 이용해 숫자 n 을 읽고, 다른 창에 있는 현재 버퍼 대신 가장 최근에 선택된 버퍼를 선택한 후 해당 버퍼에 행 번호 n 의 시작으로 포인트를 이동시킨다. 이는 다른 버퍼의 행 번호를 참조하는 버퍼에 유용한데, 포인트가 숫자 위 또는 바로 뒤에 위치할 경우

goto-line

은 해당 번호를 n 에 대한 기본값으로 사용한다. C-u 이외의 접두 인자는 다르게 행동함을 주목한다. C-u 4 M-g M-g 는 미니버퍼에서 숫자를 읽지 않고 현재 버퍼에서 4번째 행으로 이동한다. (접두 인자 없이 M-g M-g 를 사용하면 숫자 n 을 읽은 후 현재 버퍼에서 행 번호 n 으로 이동한다. 17 페이지의 4.2절 [포인트 이동하기]를 참고한다.)


Emacs는 내부적 목적으로 공백으로 시작되는 버퍼 이름을 사용한다. 이러한 버퍼들은 특별한 방식으로 취급되어 가령 실행취소 정보를 기록하지 않는 것을 기본값으로 한다. 따라서 사용자는 공백으로 시작하는 버퍼의 이름은 사용을 피하는 것이 최선이다.


기존 버퍼 열거하기

C-x C-b 기존 버퍼를 열거한다(

list-buffers

).


기존 버퍼 목록을 표시하기 위해서는 C-x C-b 를 입력한다. 목록의 행마다 하나의 버퍼 이름, 크기, 주 모드, 방문한 파일을 표시한다. 버퍼는 최신순으로 열거되며 가장 최근에 방문한 버퍼가 먼저 표시된다.


행 첫 필드에 '

.

'은 버퍼가 현재 버퍼임을 나타낸다. '

%

'는 읽기 전용 버퍼임을 의미한다. '

*

'는 버퍼가 "수정되었음"을 의미한다. 여러 개의 버퍼가 수정되었다면 C-x s 를 이용해 저장할 수도 있다(126 페이지의 15.3.1절 [저장 명령어] 참고). 버퍼 목록의 예를 표시하겠다.

CRM Buffer            Size    Mode                File
. * .emacs            3294    Emacs-Lisp          "/.emacs
 %  *Help*            10 1    Help
    search.c          86055   C                   ~/cvs/emacs/src/search.c
 %  src               20959   Dired by name       ~/cvs/emacs/src/
  * *mail*            42      Mail
 %  HELLO             1607    Fundamental         ~/cvs/emacs/etc/HELLO
 %  NEWS              481184  Outline             ~/cvs/emacs/etc/NEWS
    *scratch*         191     Lisp Interaction
  * *Messages*        1554    Messages


버퍼

*Help*

는 도움말 요청에 의해 만들어졌으므로 (37 페이지의 7장 [도움말] 참고) 어떠한 파일도 방문하지 않는다. 버퍼

src

는 Dired 에 의해

~/cvs/emacs/src/

디렉터리에 만들어졌다. 파일에 방문하는 버퍼는 C-u C-x C-b 와 마찬가지로 명령어에 접두 인자를 부여하여 열거할 수 있다.


list-buffers

는 파일을 방문하지 않는 이상 공백으로 시작하는 이름을 가진 버퍼는 누락하며, 그러한 버퍼는 Emacs에 의해 내부적으로 사용된다.


다양한 버퍼 연산

C-x C-q 버퍼의 읽기전용 상태를 토글한다(

read-only-mode

).


M-x rename-buffer RET name RET 현재 버퍼의 이름을 변경한다.


M-x rename-uniquely 현재 버퍼의 끝에 '

<number>

'를 추가하여 재명명한다.


M-x view-buffer RET buffer RET buffer 버퍼를 통해 스크롤한다. 73 페이지의 11.6절 [뷰 모드]를 참고한다.


버퍼는 읽기 전용도 가능하며, 이는 버퍼의 내용을 변경하는 명령어들이 허용되지 않음을 의미한다. 모드 행은 왼쪽 여백 근처에 '

%%

' 또는 '

%*

'를 이용해 읽기 전용 버퍼를 표시한다. 읽기 전용 버퍼는 주로 텍스트에 실행할 특수 명령어를 가진 Dired나 Rmail과 같은 하위시스템에 의해 만들어지기도 하고, 사용자에 의한 쓰기가 불가능함을 알리는 접근 제어를 가진 파일을 방문할 때 만들어지기도 한다.


C-x C-q (

read-only-mode

) 명령어는 읽기 전용 버퍼를 쓰기 가능하게 만들고, 쓰기 가능한 버퍼를 읽기 전용으로 만든다. 이는 각 버퍼에서 로컬 값을 가지는데, 그 값이

nil

이 아닐 경우에는 버퍼를 읽기 전용으로 만드는

buffer-read-only

변수를 설정할 때 가능하다.

view-read-only

옵션을

nil

이 아닌 값으로 변경 시 C-x C-q 를 이용하여 버퍼를 읽기 전용으로 만들면 버퍼에서 View 모드가 활성화된다(73 페이지의 11.6절 [뷰 모드] 참고).


M-x rename-buffer 는 현재 버퍼의 이름을 변경한다. 새 이름은 미니 버퍼 인자로 명시하고, 기본값은 존재하지 않는다. 다른 버퍼에서 사용 중인 이름을 명시할 경우 오류가 발생하여 재명명이 중단된다.


M-x rename-uniquely 는 현재 버퍼를 추가된 수치적 접두어를 이용해 비슷한 이름으로 재명명하여 버퍼 이름을 다르면서도 유일하게 만든다. 이 명령어는 인자를 필요로 하지 않는다. 그리고 다수의 셸 버퍼를 생성하는 데에도 유용한데, 사용자가

*shell*

버퍼로 이름을 변경하여 M-x 셸을 다시 실행하면

*shell*

이라는 새로운 셸 버퍼를 만들지만, 기존 셸 버퍼는 새로운 이름으로 계속 존재하게 된다. 이는 메일 버퍼, 컴파일 버퍼, 그리고 특정 이름으로 된 특수 버퍼를 생성하는 Emacs 기능 대부분에 유용하다. (M-x compile, M-x grep 과 같이 이러한 기능들 중 일부에서는 명령어를 다시 사용하기 전에 다른 버퍼로 전환할 필요가 있으며, 그렇지 않을 시 이름을 변경하더라도 현재 버퍼를 재사용할 것이다.)


M-x append-to-bufferM-x insert-buffer 명령어는 하나의 버퍼에서 다른 버퍼로 텍스트를 복사하는 데에도 사용 가능하다. 59 페이지의 9.4절 [텍스트 누적하기]를 참고한다.


버퍼 제거하기

한동안 Emacs 세션을 계속할 경우 많은 수의 버퍼를 누적할 수 있다. 따라서 더 이상 필요하지 않은 버퍼는 제거하는 편이 편리함을 발견할 것이다. (일부 편집기는 이러한 연산을 닫기라고 부르고 "버퍼를 닫는다"거나 버퍼에서 방문한 "파일을 닫는다"라고 말하기도 한다.) 대부분의 운영체제에서는 버퍼를 제거하면 그 공간을 다시 운영체제로 방출(release)하여 다른 프로그램이 사용할 수 있도록 한다. 버퍼를 제거하는 명령어를 몇 가지 소개하겠다:


C-x k bufname RET 버퍼 bufname를 제거한다(

kill-buffer

).


M-x kill-some-buffers 각 버퍼를 하나씩 제거할 것을 제안한다.


M-x kill-matching-buffers 정규 표현식에 일치하는 모든 버퍼를 제거할 것을 제안한다.


C-x k (kill-buffer)는 미니버퍼에 사용자가 명시한 이름을 가진 버퍼 하나를 제거한다. 미니버퍼에 사용자가 RET 이라고 입력하면 현재 버퍼를 제거하는 것이 기본 행위이다. 현재 버퍼를 제거하면 다른 버퍼가 현재 버퍼가 되는데, 가장 최근에 사용하였으나 현재 다른 창에서는 표시되지 않은 창이 현재 버퍼가 된다. 수정된 파일 방문 버퍼를 제거하도록 요청할 경우 사용자는 버퍼가 제거되기 전에 yes 라고 승인해야만 한다.


M-x kill-some-buffers 명령어는 각 버퍼마다 질문을 한다.

y

라고 답하면

kill-buffer

와 마찬가지로 버퍼를 제거할 것을 의미한다. 이 명령어는 Emacs가 내부적으로 사용하는, 공백으로 시작하는 이름을 가진 버퍼는 무시한다.


M-x kill-matching-buffers 명령어는 정규 표현식의 입력을 요구하고, 그 표현식에 일치하는 이름을 가진 버퍼는 모두 제거한다. 97 페이지의 12.6절 [Regexps]를 참고한다.

kill-some-buffers

와 마찬가지로 제거하기 전에 확인을 요청한다. 이 명령어는 주로 Emacs에서 내부적으로 사용하는, 공백으로 시작하는 이름을 가진 버퍼는 무시한다. 내부 버퍼도 제거하려면 접두 인자를 이용해

kill-matching-buffers

를 호출한다.


Buffer Menu 기능은 다양한 버퍼의 제거에도 편리하다. 151 페이지의 16.5절 [다양한 버퍼]를 참고한다.


버퍼가 제거될 때마다 뭔가 특별한 일을 하고 싶다면 훅 함수를

kill-buffer-hook

훅으로 추가할 수 있다(422 페이지의 33.2.2절 [훅] 참고).


많은 사람들이 그러하듯 며칠 동안 하나의 Emacs 세션을 실행 중이라면 며칠 전에 사용한 버퍼로 가득 찰 수가 있다. M-x clean-buffer-list 명령어를 이용하면 간편하게 제거할 수 있는데, 오랜 시간 동안 사용하지 않은 미수정된 버퍼를 모두 제거한다. 3일간 표시되지 않은 일반 버퍼도 제거되지만 자동으로 제거되어선 안 되는 특정 버퍼를 명시하거나 1시간이라도 사용하지 않은 버퍼는 모두 제거하도록 명시할 수도 있다.


Midnight 모드를 활성화하면 하루에 한 번씩 이 버퍼를 제거하는 일을 수행한다. Midnight 모드는 매일 자정에 실행되고, 그 시간이 되면

clean-buffer-list

또는 사용자가 일반 훅

midnight-hook

에 위치시킨 함수를 실행한다(422 페이지의 33.2.2절 [훅] 참고). Midnight 모드를 활성화하려면

midnight-mode

변수를

t

로 설정하는 Customization 버퍼를 사용한다. 412 페이지의 33.1절 [간편한 맞춤화]를 참고한다.


여러 버퍼에서 작동하기

M-x buffer-menu 모든 Emacs 버퍼를 열거하는 버퍼의 편집을 시작한다.


M-x buffer-menu-other-window. 위와 유사하지만 다른 창에서 편집을 시작한다.


C-x C-b 를 이용해 열린 버퍼 메뉴(149 페이지의 16.2절 [리스트 버퍼] 참고)는 단순히 버퍼를 열거하는 데에 그치지 않는다. Dired와 유사한 인터페이스를 통해 버퍼에서 다양한 연산을 실행하도록 허용하기도 한다(315 페이지의 27장 [Dired] 참고). 버퍼를 저장하거나, 제거(여기서는 Dired와 일관성을 위해 삭제한다고 부른다)하거나, 표시할 수도 있다.


Buffer Menu 를 사용하려면 C-x C-b 라고 입력하여

*Buffer List*

버퍼를 표시하는 창으로 전환한다. 선택된 창에서 Buffer Menu 를 열기 위해 M-x buffer-menu 라고 입력할 수도 있다. 아니면 M-x buffer-menu-other-window 명령어는 다른 창에 Buffer Menu 를 열어 그 창을 선택한다.


Buffer Menu는 읽기 전용 버퍼로, 이번 절에 소개된 특수 명령어를 통해서만 변경이 가능하다. 일반적 커서 움직임 명령어들은 해당 버퍼에서 사용 가능하다. 다음과 같은 명령어들은 현재 행에서 설명된 버퍼에 적용된다:


d 버퍼 삭제를 위해 (제거) 버퍼를 flag한 후 다음 행으로 포인트를 이동시킨다(

Buffer-menu-delete

). 삭제 플래그는 행의 버퍼명 앞에 '

D

' 문자로 표시된다. 사용자가 x 명령어를 입력해야만 삭제가 이루어진다(아래 참고).


C-d

d

와 같지만 포인트를 아래가 아니라 위로 이동시킨다(

Buffer-menu-delete-backwards

).


s 저장을 위해 버퍼를 flag 한다(

Buffer-menu-save

). 저장 플래그는 행에서 버퍼명 앞에 '

S

' 문자로 표시된다. 사용자가 x 를 입력해야만 삭제가 이루어진다. 동일한 버퍼에 저장과 삭제를 모두 요청할 수 있다.


x 모든 flag된 삭제와 저장을 실행한다(

Buffer-menu-execute

).


u 현재 행에서 모든 플래그를 제거하여 아래로 이동시킨다(

Buffer-menu-unmark

).


DEL 이전 행으로 이동하여 해당 행에서 모든 플래그를 제거한다(

Buffer-menu-backup-unmark

).


플래그의 추가나 제거에 사용되는 명령어 d, C-d, u 는 모두 반복 계수로서 수치적 인자를 수용한다.


아래 명령어들은 현재 행에 열거된 버퍼에서 즉시 작용한다. 수치적 인자를 반복 계수로 수용하기도 한다.


~ 버퍼를 수정되지 않은 것으로 표시한다(

Buffer-menu-not-modified

). 126 페이지의 15.3.1절 [저장 명령어]를 참고한다.


% 버퍼의 읽기 전용 상태를 토글한다(

Buffer-menu-toggle-read-only

). 149 페이지의 16.3절 [다양한 버퍼 연산]을 참고한다.


t 버퍼를 태그 테이블로서 방문한다(

Buffer-menu-visit-tags-table

). 304 페이지의 25.3.4절 [태그 테이블 선택하기]를 참고한다.


아래 명령어들을 이용해 다른 버퍼 또는 버퍼들을 선택할 수 있다:


q Buffer Menu를 중단한다(

quit-window

). 대신 가장 최근에 눈에 보인 버퍼가 표시된다.


RET f 이 행의 버퍼를 선택하고 그 창의

*Buffer List*

버퍼를 대체한다(

Buffer-menu-this-window

).


o

C-x 4 b

와 같이 다른 창에서 이 행의 버퍼를 선택하고

*Buffer List*

는 눈에 보이게 남겨둔다(

Buffer-menu-other-window

).


C-o 다른 창에 이 행의 버퍼를 선택하지 않고 표시만 한다(

Buffer-menu-switch-other-window

).


1 이 행의 버퍼를 전체 프레임 창에서 선택한다(

Buffer-menu-1-window

).


2 현재 프레임에 두 개의 창을 만들어 하나에는 선택된 이 행의 버퍼를 두고 나머지 하나에는 이전의 현재 버퍼(

*Buffer List*

를 제외한)를 둔다 (

Buffer-menu-2-window

).


b 이 행의 버퍼를 숨긴다(bury) (

Buffer-menu-bury

).


m 사용자가 v 명령어로 종료하면 이 행의 버퍼를 다른 창에 표시하도록 표시한다(

Buffer-menu-mark

). 표시 플래그는 행의 시작에 '

>

' 문자로 표시된다. (단일 버퍼는 삭제 플래그와 표시 플래그를 모두 갖고 있지 않을 수도 있다.)


v 이 행의 버퍼를 선택하고, m 명령어를 이용해 flag된 버퍼가 있다면 다른 창에 표시한다(

Buffer-menu-select

). 어떠한 버퍼도 flag하지 않았다면 이 명령어는

1

과 동일하다.


아래는 전체 버퍼 목록에 영향을 미치는 명령어들이다:


S 포인트에 열의 값에 따라 Buffer Menu 엔트리를 정렬한다. 수치적 인자 n 을 이용해 n 번째 열에 따라 정렬한다(

tabulated-list-sort

).


T Non-file 버퍼에 대한 행을 삭제하거나 재삽입한다(

Buffer-menu-toggle-files-only

). 이 명령어는 버퍼 목록에 그러한 버퍼의 포함 여부를 토글한다.


보통

*Buffer List*

버퍼는 버퍼가 생성되거나 제거될 때 자동으로 업데이트되지 않으며 그 내용은 텍스트에 불과하다. 버퍼를 생성, 삭제 또는 재명명하였다면

*Buffer List*

를 업데이트하는 방법은 사용자가 g (

revert-buffer

)를 입력하였음을 보여주는 것이다. 해당 버퍼에서 Auto Revert 모드를 활성화하면 수정되었다고 표시되지 않는 이상

auto-revert-interval

초마다 정기적으로 이를 수행할 수 있다. Global Auto Revert 모드는

global-auto-revert-non-file-buffers

nil

이 아닐 때에만

*Buffer List*

버퍼에 적용된다. 상세한 내용은 Info 파일 emacs-xtra 의 'Autorevert' 노드를 참고한다.


간접 버퍼

간접 버퍼는 간접 버퍼의 기본 버퍼(base buffer)라고 불리는 다른 버퍼의 일부 텍스트를 공유한다. 여러 면에서 이는 파일들 간 심볼릭 링크(symbolic link)와 유사한 버퍼다.


M-x make-indirect-buffer RET base-buffer RET indirect-name RET 기본 버퍼 base-buffer 를 가진 indirect-name 이라는 간접 버퍼를 생성한다.


M-x clone-indirect-buffer RET 현재 버퍼와 동일한 사본인 간접 버퍼를 생성한다.


C-x 4 c 현재 버퍼와 동일한 사본인 간접 버퍼를 생성하여 다른 창에서 선택한다(

clone-indirect-buffer-other-window

).


간접 버퍼의 텍스트는 항상 그 기본 버퍼의 텍스트와 동일해야 하며, 편집을 통해 둘 중 하나가 변경하면 나머지 하나에서도 즉시 확인이 가능하다. 하지만 그 외에 모든 면에서 간접 버퍼와 기본 버퍼는 완전히 구분되어 있다. 이름, 포인트 값, 좁히기, 마커, 주 모드, 로컬 변수에서 모두 차이가 있다.


간접 버퍼는 파일을 방문할 수 없지만 그 기본 버퍼는 파일로 방문이 가능하다. 간접 버퍼의 저장은 기본 버퍼의 저장을 통해 이루어진다. 기본 버퍼를 제거(kill)하면 간접 버퍼를 효과적으로 제거하지만, 간접 버퍼를 제거하면 기본 버퍼에 어떠한 영향도 미치지 않는다.


간접 버퍼는 개요를 여러 개의 보기로 표시하는 데에 사용할 수 있다. 221 페이지의 22.8.4절 [개요 보기]를 참고한다.


간접 버퍼를 가장 손쉽고 빠르게 만드는 방법은 M-x clone-indirect-buffer 명령어를 이용하는 방법이다. 이는 현재 버퍼를 기본 버퍼로 가진 간접 버퍼를 생성하여 선택한다. 수치적 인자를 이용하면 간접 버퍼의 이름을 요청하고, 그렇지 않으면 '

<n>

' 접두사가 추가되어 현재 버퍼의 이름을 사용한다. C-x 4 c (

clone-indirect-buffer-other-window

)는 M-x clone-indirect-buffer 와 같이 작용하지만 다른 창에서 새 버퍼를 선택한다. 이러한 함수들은 간접 버퍼를 생성한 후

clone-indirect-buffer-hook

훅을 실행한다.


M-x make-indirect-buffer 명령어를 이용하면 좀 더 일반적인 방식으로 간접 버퍼를 만들 수 있다. 이는 base-buffer 버퍼로부터 indirect-name 이라는 간접 버퍼를 생성하는데 두 가지 모두 미니버퍼를 이용해 사용자에게 입력값을 요청한다.


버퍼 처리의 편리한 기능과 맞춤화

이번 절에서는 버퍼들 간에 좀 더 편리하게 전환하도록 해주는 모드와 기능을 몇 가지 설명하겠다.

버퍼명을 유일하게 만들기

여러 개의 버퍼가 동일한 이름의 파일로 방문하면 Emacs는 버퍼에게 구분된 이름을 부여해야 한다. 기본 방법은 파일을 포함하는 디렉터리명을 바탕으로 접두어를 추가하는 방법이다. 예를 들어, 사용자가

/foo/bar/mumble/name

파일과

/baz/quux/mumble/name

파일을 동시에 방문한다면 그들의 버퍼는 각각 '

name<bar/mumble>

'와 '

name<quux/mumble>

'로 명명될 것이다. Emacs는 유일한 이름을 만드는 데에 필요한 개수만큼 디렉터리 부분을 추가한다.


uniquify-buffer-name-style

옵션을 맞춤화하면 유일한 버퍼명을 구성하는 여러 스타일 중 원하는 것을 선택할 수 있다.


forward

명명 방법은 버퍼명 시작에서 파일의 디렉터리명의 부분을 포함하는데, 이 방법을 이용하면

/u/rms/tmp/Makefile

/usr/projects/zaphod/Makefile

파일을 방문하는 버퍼들은 '

tmp/Makefile

'과 '

zaphod/Makefile

'로 명명될 것이다.


반면

post-forward

명명법은 '

Makefile|tmp

'와 '

Makefile|zaphod

' 버퍼를 호출할 것이다. 기본 방법인

post-forward-angle-brackets

는 꺾쇠 괄호로 유일한 경로를 둘러싼다는 점만 제외하면

post-forward

와 같다.

reverse

명명법을 이용한다면 그들을 '

Makefile\tmp

'와 '

Makefile\zaphod

'라고 부를 것이다. 하나의 디렉터리명으로 두 파일을 구별하기에 충분하지 않다면

post-forward

reverse

간에 큰 차이가 발생하여

reverse

는 역순으로 디렉터리명을 놓기 때문에

/top/middle/file

은 '

file\middle\top

' 이 되고

post-forward

는 '

file|top/middle

'에서처럼 파일명 다음에 순방향 순으로 놓는다.

uniquify-buffer-name-style

nil

로 설정되면 버퍼명은 단순히 '

<2>

', '

<3>

' 식으로 뒤에 덧붙인다.


버퍼명을 입력하기 전에 살펴보는 것이 목적이라면 버퍼명에 디렉터리명을 넣기 위해 어떤 규칙을 따르는지는 그다지 중요하지 않다. 하지만 규칙을 아는 숙련된 사용자라면 살펴볼 필요가 없다. 그러다 보면 사용자마다 기억하고 빠르게 적용하기 쉬운 규칙이 한두 개 정도 생길 것이다.


빠른 미니버퍼 선택

Icomplete 전역적 부 모드는 미니버퍼에서 가능한 완성들 중 빠르게 요소를 선택하는 편리한 방법을 제공한다. 이것을 활성화하여 미니버퍼에서 입력하면 사용자가 입력한 문자열에 일치하는 완성 목록을 연속하여 표시한다.


언제든 C-j 라고 입력하면 목록에서 첫 번째 완성을 선택한다. 따라서 특별한 완성을 선택하려면 목록에서 첫 번째 완성으로 만든다. 이를 실행하는 방법에는 두 가지가 있다. 먼저 완성 이름을 더 입력하여 목록을 줄이고 원하는 완성은 두고 원하지 않는 완성을 제외시킨다. 두 번째 방법은 C-.C-, 를 이용하여 원하는 버퍼가 처음에 위치할 때까지 목록을 회전시키는 방법이다.


M-TABC-j 와 같이 미니버퍼를 종료하지 않고 후에 편집할 수 있도록 목록에서 첫 번째 완성을 선택할 것이다. 이는 주로 파일명을 입력할 때 사용되는데, M-TAB 을 여러 번 이용하면 디렉터리의 계층구조에서 하향으로 이동이 가능하다.


Icomplete 모드를 활성화하려면 M-x icomplete-mode 를 입력하거나

icomplete-mode

변수를

t

로 맞춤화한다(412 페이지의 33.1 [간편한 맞춤화] 참고).


버퍼 메뉴 맞춤화하기

M-x bs-show

M-x list-buffers

와 유사하게 버퍼의 목록을 만들되 맞춤화 가능하게 만든다.


M-x bs-show 는 보통 C-x C-b 가 표시하는 일반적인 버퍼 목록과 비슷하지만 사용자가 맞춤화할 수 있는 버퍼 목록을 팝업시킨다. 일반 버퍼 목록보다 M-x bs-show 를 선호한다면 이 명령어를 C-x C-b 로 바인딩할 수 있다. 이러한 버퍼 목록을 맞춤화하려면 bs Custom group을 사용한다(412 페이지의 33.1절 [간편한 맞춤화] 참고).


MSB 전역적 부 모드는 ("MSB"는 "마우스 선택 버퍼"를 의미) 사용자가 선호할 법한 다른 맞춤 가능한 마우스 버퍼 메뉴를 제공한다. 이는 주로 C-Down-Mouse-1 에서

mouse-buffer-menu

의 바인딩과 메뉴 바 버퍼 메뉴를 대체한다. 메뉴는 msb Custom group에서 맞춤화할 수 있다.


Notes