GNUEmacsManual:22

From 흡혈양파의 번역工房
Jump to: navigation, search
인간 언어를 위한 명령어

인간 언어를 위한 명령어

이번 장에서는 인간 언어(컴퓨터 프로그래밍 언어와 상반된)에서 문자의 시퀀스를 의미하는 텍스트에 대해 Emacs가 실행하는 명령어를 설명한다. 이러한 명령어들은 인간 언어의 구문적 및 문체적 변환을 고려하는 방식으로 작동하는데, 이는 단어, 문장, 문단, 대문자를 수반하는 변환을 의미한다. 채우기(filling)에 사용 가능한 명령어들도 존재하는데, 문단의 행들을 대략적으로 길이가 동일하도록 재정렬함을 의미한다. 주로 텍스트의 편집을 목적으로 하는 이러한 명령어들은 프로그램을 편집하는 데에도 유용하다.


Emacs에는 인간 언어 텍스트를 편집하는 몇 가지 주 모드가 있다. 파일이 일반 텍스트를 포함한다면 텍스트의 구문적 변환을 위해 작은 방식을 Emacs를 맞춤화하는 Text 모드를 사용하라. Outline 모드는 텍스트를 개요(outline) 구조로 작업하는 특수 명령어를 제공한다. Org 모드는 Outline 모드를 확장시켜 Emacs를 완전한 기능의 관리자(organizer)으로 만드는데, 이 때 사용자는 TODO 목록을 관리하고, 노트를 보관하여 여러 포맷으로 게시할 수 있다.


217 페이지의 22.8절 [Outline 모드]를 참고한다.


Emacs 는 TeXLaTeX(224 페이지의 22.10절 [TeX 모드] 참고), HTML과 SGML(228 페이지의 22.11절 [HTML 모드] 참고), XML(Emacs와 함께 배포되는 nXML mode Info manual 참고), Groff와 Nroff(229 페이지의 22.12절 [Nroff 모드] 참고)와 같이 "내장된" 명령어들을 포함한 주 모드들도 갖고 있다.


텍스트 문자로 구성된 사진을 (보통 "ASCII art"로 칭함) 편집해야 할 경우 그러한 사진 편집을 위한 특수 주 모드인 Picture 모드를 사용한다. Specialized Emacs Features 의 "Picture Mode" 절을 참고한다.


단어

Emacs는 단어 위를 이동하거나 단어에 실행하는 명령어를 몇 가지 정의한다:

M-f 단어 위로 순방향 이동한다(
forward-word
).


M-b 단어 위로 역방향 이동한다(
backward-word
).


M-d 단어 끝까지 제거한다(
kill-word
).


M-DEL 단어 시작까지 역으로 제거한다(
backward-kill-word
).


M-@ 다음 단어 끝까지 표시한다(
mark-word
).


M-t 두 개의 단어를 뒤바꾸거나 단어를 다른 단어들을 거쳐 드래그한다(
transpose-words
).


이러한 키들이 어떻게 문자 기반의 C-f, C-b, C-d, DEL, C-t 에 일치하는 series 를 형성하는지 명심하라. M-@C-SPC 를 칭하는 C-@ 와 동일하다.


M-f (
forward-word
)와 M-b (
backward-word
) 명령어는 단어를 거쳐 순방향으로 그리고 역방향으로 이동한다. 이러한
META
기반의 키 시퀀스는 하나의 문자 위를 이동하는 C-fC-b 키 시퀀스와 동일하다. 유사점은 수치적 인자로도 확장되어 반복 계수 역할을 한다. 음의 수치적 인자를 이용한 M-f 는 역방향으로 이동하고, 음의 수치적 인자를 이용한 M-b 는 순방향으로 이동한다. 순방향 움직임은 단어의 마지막 문자 직후에 중단되고, 역방향 움직임은 첫 문자 직전에 중단된다.


M-d (
kill-word
) 는 포인트 다음 단어를 제거한다. 정확히 말하자면 포인트부터 M-f 가 이동하게 될 위치까지 모든 것을 제거한다. 따라서 포인트가 단어 중간에 있다면 M-d 는 포인트 이후 부분만 제거한다. 포인트와 다음 단어 사이에 구두점이 위치한 경우 단어와 함께 제거된다. (다음 단어만 제거하고 그 앞에 있는 구두점은 제거하지 않을 경우 M-DEL 을 이용해 단어를 역방향으로 제거한다.) M-dM-f 와 마찬가지로 인자를 취한다.


M-DEL (
backward-kill-word
) 는 포인트 앞 단어를 제거한다. 따라서 포인트부터 시작해 M-b 가 이동할 위치까지 역방향으로 모두 제거한다. 가령 포인트가 '
FOO, BAR
' 에서 공백 다음에 위치할 경우 '
FOO,
' 를 제거한다. 중간에 콤마와 공백을 제외한 '
FOO
' 만 제거하고 싶다면 M-DEL 대신 M-b M-d 를 사용한다.


M-t (
transpose-words
)는 포인트 이전에 또는 포인트를 포함하는 단어를 그 뒤에 따라오는 단어와 교환한다. 단어 사이에 구분 문자는 이동하지 않는다. 가령 '
FOO, BAR
' 는 '
BAR FOO,
' 가 아니라 '
BAR, FOO
' 로 바꿔놓는다. 전치(transposition)에 관한 추가 정보는 110 페이지의 13.2절 [순서조정]을 참고한다.


영역에서 작업하는 연산을 이용해 단어에 작업하려면 M-@ (
mark-word
) 명령어를 사용한다. 이 명령어는 M-f 가 이동하게 될 위치에 마크를 설정한다. 이 명령어에 관한 추가 정보는 47 페이지의 8.2절 [객체 표시하기]를 참고한다.


단어 경계에 대한 단어 명령어의 이해는 구분 테이블로 제어된다. 가령 어떠한 문자든 단어 구분 문자로 선언할 수 있다. The Emacs Lisp Reference Manual의 "Syntax Tables" 절을 참고한다.


또한 영역이나 버퍼에서 단어 개수를 세고 보고하는 M-= (
count-words-region
)과 M-x count-words 명령어는 22 페이지의 4.9절 [위치 정보]를 참고한다.


문장

문장과 문단을 조작하기 위한 Emacs 명령어는 단어를 처리하는 명령어처럼 대부분 Meta 키에 위치한다.


M-a 문장의 시작까지 역방향으로 이동한다(
backward-sentence
).


M-e 문장의 끝까지 순방향으로 이동한다(
forward-sentence
).


M-k 문장의 끝까지 순방향으로 제거한다(
kill-sentence
).


C-x DEL 문장의 시작까지 역방향으로 제거한다(
backward-kill-sentence
).


M-a (
backward-sentence
)와 M-e (
forward-sentence
) 명령어는 각각 현재 문장의 시작과 끝으로 이동한다. 이 명령어들의 바인딩은 행의 시작과 끝으로 이동하는 C-aC-e 에 비슷하게 선택되었다. 이 둘과 다르게 M-aM-e 는 반복 시 연속 문장을 넘어 이동한다.


문장 위로 역방향 이동하면 포인트를 문장의 첫 문자 바로 앞에 위치시키고, 순방향으로 이동시키면 문장이 끝나는 구두점 바로 뒤에 포인트를 위치시킨다. 두 방법 모두 문장 경계에서 공백 위로는 이동하지 않는다.


C-ac-e 에 제거 명령어 C-k 가 있듯이 M-aM-e 도 그에 상응하는 제거 명령어 M-k (
kill-sentence
)가 있는데, 이는 포인트부터 문장의 끝까지 제거한다. 양의 수치적 인자 n을 이용해 다음 n개의 문장을 제거하고, 음의 수치적 인자 n을 이용해 선행하는 n번째 문장의 시작까지 역방향으로 제거한다.


C-x DEL (
backward-kill-sentence
)는 문장의 시작까지 역으로 제거한다.


문장 명령어는 사용자가 문장 끝에 두 개의 공백을 놓는 미국 타이피스트(typist) 규칙을 따른다고 가정한다. 즉 문장은 '
.
', '
?
' 또는 '
!
' 뒤에 행 끝이나 두 개의 문자가 따라오고 그 사이에 '
)
', '
]
', '
'
', 또는 '
"
' 문자가 허용되는 곳마다 끝난다. 문장은 문단이 시작되거나 끝나는 곳마다 시작되거나 끝나기도 한다. 이러한 규칙은 따르는 것이 유용한데, Emacs 문장 명령어들은 문장을 끝마치는 마침표와 약어로 사용된 마침표의 구별을 허용하기 때문이다.


문장 사이에 하나의 공백만 사용하길 원한다면
sentence-end-double-space
변수를
nil
로 설정하여 문장 명령어들이 하나의 공백에도 멈추도록 만든다. 그렇지만 이런 경우 한 가지 단점이 존재하는데, 문장을 끝마치는 마침표와 약어를 나타내는 마침표를 구별하는 방법이 없다는 것이다. 따라서 편리하고 신뢰할 수 있는 편집을 위해서는 두 개의 공백 규칙을 따를 것을 권한다.
sentence-end-double-space
변수 역시 채우기에 영향을 미친다(213 페이지의 22.5.2절 [채우기 명령어] 참고).


sentence-end
변수는 문장의 끝을 어떻게 인식할 것인지를 제어한다. nil이 아닌 값의 경우 값은 문장 뒤 공백과 함께 문장의 마지막 문자 몇 개에 일치시키는 데에 사용되는 정규 표현식이어야 한다(97 페이지의 12.6절 [Regexps] 참고). 값이 기본값 nil일 경우, Emacs 는
sentence-end-double-space
의 값과 같이 다양한 기준에 따라 문장 끝을 계산한다.


타이(Thai)어와 같은 몇몇 언어들은 문장의 끝을 나타내는 데에 마침표를 사용하지 않는다. 이런 경우
sentence-end-without-period
변수를
t
로 설정한다.


문단

문단을 조작하는 Emacs 명령어 역시 Meta 키에 위치한다.


M-{ 이전 문단 시작까지 역방향으로 이동한다(
backward-paragraph
).


M-} 이전 문단 끝까지 순방향으로 이동한다(
forward-paragraph
).


M-h 포인트와 마크를 이번 문단 또는 다음 문단 주위에 놓는다(
mark-paragraph
).


M-{ (
backward-paragraph
)는 현재 또는 이전 문단의 시작으로 이동한다(문단의 정의는 아래를 참고). M-} (
forward-paragraph
)는 현재 문단 또는 다음 문단의 끝으로 이동한다. 문단 앞에 빈 행이 있을 경우 {{M-{}} 은 빈 행으로 이동한다.


문단에 작업하길 원한다면 그 주변에 영역을 설정하도록 M-h (
mark-paragraph
)를 입력한다. 예를 들어 M-h C-w 는 포인트 주변 또는 포인트 뒤에 오는 문단을 제거한다. M-h 는 포인트가 있던 문단의 시작에 포인트를, 문단의 끝에 마크를 위치시킨다. 포인트가 문단 사이에 위치할 경우 (빈 행의 실행에서 혹은 경계에서) M-h 는 포인트 이후에 따라오는 문단 주변에 영역을 설정한다. 문단의 첫 행 앞에 빈 행이 있을 경우 빈 행들 중 하나가 영역에 포함된다. 영역이 이미 활성화되어 있으면 명령어는 포인트를 변경하지 않고 마크를 설정하며, 잇따라 M-h 를 사용할 때마다 마크를 한 문단씩 앞으로 이동시킨다(advance).


문단의 정의는 주 모드에 따라 좌우된다. Fundamental 모드를 비롯해 Text 모드 및 그와 관련된 모드에서는 문단이 주변에 다른 문단과 하나 또는 그 이상의 빈 행으로 구분되어 있는데, 이러한 행은 비어 있거나 스페이스, 탭, 서식 이송(form feed) 문자로만 구성되어 있다. 프로그래밍 언어 모드에서는 문단이 주로 비슷한 방식으로 정의되므로 프로그램에 그러한 문단이 없다 하더라도 문단 명령어를 사용할 수 있다.


들여 쓴 행은 Text 모드에서 문단 구분(break)이 아님을 주목한다. 들여 쓴 행이 문단을 구분하길 원한다면 Paragraph-Indent Text 모드를 대신 사용한다. 217 페이지의 22.7절 [텍스트 모드]를 참고한다.


채우기 접두어를 설정하였다면 문단은 채우기 접두어로 시작하지 않는 모든 행들로 구분된다. 212 페이지의 22.5절 [Fill]를 참고한다.


문단 경계의 정확한 정의는
paragraph-separate
paragraph-start
변수로 제어된다.
paragraph-start
의 값은 시작 또는 구분된 문단에 해당하는 행들에 일치해야 하는 정규 표현식이다(97 페이지의 12.6절 [Regexps] 참고).
paragraph-separate
의 값은 문단에 속하지 않고 문단을 구분하는 행에 (예: 빈 행) 일치해야 하는 또 다른 정규 표현식이다. 새로운 문단을 시작하면서 그에 포함된 행들은
paragraph-separate
가 아니라
paragraph-start
에만 일치해야 한다. Fundamental 모드에서
paragraph-start
는 "
\f\\|[\t]*$
"이고,
paragraph-separate
는 "
[\t\f]*$
"이다.


페이지

일부 텍스트 파일 내에서 텍스트는 서식 이송 문자(ASCII 코드 12, '
control-L
'로도 표기)로 구분된 페이지로 나뉘는데, 그러한 문자는 Emacs 에서 escape 시퀀스 '
^L
'로 표시된다(85 페이지의 11.19절 [텍스트 표시] 참고). 본래 그러한 텍스트 파일이 하드카피로 출력되면 각 서식 이송 문자마다 강제로 페이지 나눔을 실행한다. 대부분의 Emacs 명령어들은 그것을 여느 다른 문자처럼 취급하므로 C-q C-1 를 이용해 삽입하고 DEL 을 이용해 삭제할 수 있다. Emacs 는 또한 페이지를 걸쳐 이동하고 페이지에서 실행하는 명령어들도 제공한다.


M-x what-page 포인트의 페이지 번호와 해당 페이지 내에서 행 번호를 표시한다.


C-x [ 이전 페이지 경계로 포인트를 이동시킨다(
backward-page
).


C-x ] 다음 페이지 경계로 포인트를 이동시킨다(
forward-page
).


C-x C-p 이 페이지 (또는 다른 페이지) 주변에 포인트와 마크를 놓는다(
mark-page
).


C-x l 이 페이지의 행을 센다(
count-lines-page
).


M-x what-page 는 파일 시작부터 페이지 수를 세고 페이지 내 행을 세어 두 숫자를 에코 영역에 표시한다.


C-x [ (
backward-page
) 명령어는 포인트를 이전 페이지 구분 문자 직후로 이동시킨다. 포인트가 이미 페이지 구분 문자 직후에 위치할 경우 그 구분 문자를 건너뛰고 이전 구분 문자에서 멈춘다. 수치적 인자는 반복 계수의 역할을 한다. C-x ] (
forward-page
) 명령어는 다음 페이지 구분 문자를 넘어 순방향 이동한다.


C-x C-p 명령어 (
mark-page
)는 포인트를 현재 페이지의 시작에 놓고 (앞에서 해당 페이지 구분 문자 다음에), 마크는 페이지 끝에 놓는다(끝에서 페이지 구분 문자 다음에).


C-x C-p C-w 는 페이지를 다른 곳으로 이동시키기 위해 손쉽게 제거할 수 있는 방법이다. C-x [C-x ] 를 이용해 또 다른 페이지 구분 문자로 이동한 후 제거한 페이지를 붙여 넣을 경우 모든 페이지가 다시 적절하게 구분될 것이다. 이를 위해 C-x C-p 는 영역 내에서 뒤따라오는 페이지 구분 문자만 포함한다.


C-x C-p 에 대한 수치적 인자는 현재 페이지를 기준으로 하여 이동할 페이지를 명시한다. 0은 현재 페이지를, 1은 다음 페이지를, -1은 이전 페이지를 의미한다.


C-x l 명령어 (
count-lines-page
)는 페이지를 어디에서 두 개로 나눌 것인지 결정하는 데에 사용하기 좋다. 이 명령어는 현재 페이지의 총 행 수를 에코 영역에 표시한 후 다음과 같이 현재 행을 선행하는 행들과 그 뒤에 따라오는 행들로 나눈다.
Page has 96 (72+25) lines


총합에 1이 모자란데, 포인트가 행의 시작에 위치하지 않을 경우 이것이 올바른 값임을 명심한다.


page-delimiter
변수는 페이지가 어디서 시작되는지를 제어한다. 그 값은 페이지를 구분하는 행의 시작에 일치시키는 정규 표현식이다(97 페이지의 12.6절 [Regexps] 참고). 이 변수의 일반 값은 행의 시작에서 서식 이송 문자에 일치시키는 "
^\f
"이다.


텍스트 채우기

채우기(filling)는 명시된 너비에 들어맞는 행 바꿈을 실행함을 의미한다. Emacs는 두 가지 방법으로 채우기를 실행한다. Auto Fill 모드에서는 자체 삽입되는 문자를 이용해 텍스트를 삽입하면 자동으로 채우기가 실행된다. 텍스트를 편집 시 사용할 수 있는 명시적 채우기 명령어들도 존재한다.

Auto Fill 모드

Auto Fill 모드는 행이 너무 넓어지면 자동으로 나뉘는 버퍼 로컬 부 모드이다(200 페이지의 20.2절 [부 모드] 참고). 행 바꿈은 사용자가 SPC 또는 RET을 입력할 때만 발생한다.


M-x auto-fill-mode Auto Fill 모드를 활성화 또는 비활성화한다.


SPC RET Auto Fill 모드에서 적절하게 행 바꿈을 실행한다.


M-x auto-fill-mode 모드 명령어는 현재 버퍼에서 Auto Fill 모드를 토글한다. 양의 수치적 인자를 이용해 Auto Fill 모드를 활성화하고, 음의 수치적 인자를 이용해 비활성화한다. 인자가 생략되거나
nil
일 때 Lisp 으로부터
auto-fill-mode
를 호출하면 Auto Fill 모드를 활성화한다. 특정 주 모드에서 자동으로 Auto Fill 모드를 활성화하려면
auto-fill-mode
를 모드 훅으로 추가한다(199 페이지의 20.1절 [주 모드] 참고). Auto Fill 모드가 활성화되면 모드 행에 모드 표시문자인 '
Fill
'이 나타난다(8 페이지의 1.3절 [모드 행] 참고).


Auto Fill 모드는 바람직한 너비보다 행이 길어질 때마다 공백에서 자동으로 행 바꿈을 실행한다. 행 바꿈은 사용자가 SPC 또는 RET 을 입력할 때에만 발생한다. 행 바꿈을 허용하지 않고 공백 또는 새 행을 삽입하길 원한다면 각각 C-q SPC 또는 C-q C-j 를 입력한다. 또한 C-o 를 사용하면 행 바꿈 없이 새 행을 삽입한다.


Auto Fill 모드는 행 바꿈을 실행할 때 적응적 채우기 접두어(adaptive fill prefix)를 준수하는데, 채우기 접두어(fill prefix)를 현재 문단의 첫 행과 (또는) 두 번째 행으로부터 추론해낼 수 있다면 새 행으로 삽입된다(215 페이지의 22.5.4절 [적응적 채우기] 참고). 아니면 사용자가 마치 TAB 을 입력한 것처럼 새 행이 들여쓰기 된다(205 페이지의 21장 [들여쓰기] 참고). 프로그래밍 언어 모드에서 주석 중간에 행 바꿈이 발생하면 적절하게 새로운 주석 구분 문자를 삽입함으로써 주석이 나뉜다.


Auto Fill 모드는 전체 문단을 다시 채우지는 않으며, 행 바꿈을 실행하긴 하지만 행을 합하진 않는다. 따라서 문단 중간에서 편집하면 올바로 채워지지 않은 문단을 야기한다. 문단을 채우려면 다음 절에 소개된 채우기 명령어를 명시적으로 호출한다.


명시적 Fill 명령어

M-q 현재 문단을 채운다(
fill-paragraph
).


C-x f 채우기 열을 설정한다(
set-fill-column
).


M-x fill-region 영역의 각 문단을 채운다(
fill-region
).


M-x fill-region-as-paragraph 영역을 하나의 문단으로 간주하면서 채운다.


M-o M-s 행을 중앙화시킨다.


M-q (
fill-paragraph
) 명령어는 현재 문단을 채운다. 그리고 문단 내에 행 바꿈을 재분배하고, 문단에서 발생하는 초과 스페이스 및 탭 문자는 삭제되어 행이 특정 최대 너비에 들어맞는 행이 되도록 확보한다.


보통 M-q 는 포인트가 위치한 문단에 작업하지만 포인트가 문단 사이에 위치할 경우 포인트 다음 문단에 적용한다. 영역이 활성화된 경우 영역 내 텍스트에 대신 작용한다. 영역 내 텍스트를 구체적으로 채우려면 M-x fill-region 을 호출해도 좋다.


M-q
fill-region
은 문단 경계를 찾는 데에 일반적인 Emacs 기준을 사용한다(210 페이지의 22.3절 [문단]을 참고한다). 더 많은 제어를 얻으려면 포인트와 마크 사이에 모든 것을 단일 문단으로서 채우는 M-x fill-region-as-paragraph 를 사용할 수 있다. 이 명령어는 영역 내 빈 행은 모두 삭제하므로 구분된 텍스트 블록은 하나의 블록으로 결합될 것이다.


M-q 에 수치적 인자를 이용하면 채우기뿐만 아니라 텍스트의 맞춤(justify)도 실행하도록 알린다. 즉 오른쪽 여백이 정확히 채우기 열에서 일직선으로 위치하도록 추가로 공백이 삽입된다는 의미다. 추가 스페이스를 제거하려면 인자 없이 M-q 를 사용한다. (
fill-region
에서와 마찬가지로.)


채우기를 위한 최대 행 너비는
fill-column
버퍼 로컬 변수로 명시된다. 기본값은 70 이다(423 페이지의 33.2.3절 [로컬] 참고). 현재 버퍼에서
fill-column
을 가장 쉽게 설정하는 방법은 C-x f (
set-fill-column
)을 사용하는 방법이다. 수치적 인자를 이용하면 이 명령어는 인자를 새로운 채우기 열로 사용한다. C-u 를 인자로 이용하면
fill-column
을 포인트의 현재 가로 위치로 설정한다.


M-o M-s (
center-line
) 명령어는 현재 채우기 열 내에서 현재 열을 중앙화한다. 수치적 인자 n 을 이용해 n 개 행을 개별적으로 중앙화하여 그것을 거쳐 이동한다. 이러한 바인딩은 Text 모드에 의해 만들어지며, Text 모드 및 그와 관련된 모드에서만 이용 가능하다(217 페이지의 22.7절 [텍스트 모드] 참고).


기본적으로 Emacs는 마침표 다음에 두 개의 공백 혹은 새 행이 따라올 경우 문장의 끝으로 간주하고, 마침표 뒤에 하나의 공백이 따라오면 문장의 끝이 아니라 약어를 의미한다. 따라서 채우기 명령어들은 마침표 뒤에 하나의 공백이 포함된 행 뒤에서는 행 바꿈을 실행하지 않을 것이다.
sentence-end-double-space
변수를
nil
로 설정하면 채우기 명령어는 마침표 뒤에 위치한 하나의 공백 뒤에서 행 바꿈을 실행하고, 각 마침표 뒤에는 하나의 공백만 위치시킨다. 이러한 방법의 다른 효과를 비롯해 발생할 수 있는 문제점은 209 페이지의 22.2절 [문장]을 참고한다.


colon-double-space
변수가
nil
이 아니면 채우기 명령어는 콜론 뒤에 두 개의 공백을 놓는다.


행 바꿈이 허용되지 않는 추가 조건을 명시하려면
fill-nobreak-predicate
라는 특이한 훅 변수를 맞춤화한다(422 페이지의 33.2.2절 [훅] 참고). 이 훅에 위치하는 각 함수는 인자 없이 호출되고, 포인트는 Emacs 가 행 바꿈을 고려하는 곳에 위치된다. 함수가
nil
이 아닌 값을 리턴하면 Emacs는 그곳에서 행 바꿈을 실행하지 않을 것이다. 사용자가 그곳에서 사용할 수 있는 함수들로는
fill-single-word-nobreak-p
(문장의 첫 번째 단어 뒤에서 혹은 마지막 단어 앞에서 행 바꿈을 실행하지 말라),
fill-single-char-nobreak-p
(한 글자로 이루어진 단어 뒤에서 행 바꿈을 실행하지 말라),
fill-french-nobreak-p
'
(
' 뒤에서나 '
)
', '
:
', '
?
' 앞에서 행 바꿈을 실행하지 말라)가 있다.


채우기 접두어

채우기 접두어(fill prefix)는 문단을 채워서 각 행이 특수 문자로 된 문자열로 시작하는 것을 허용한다(예: 들여 쓴 문단을 제공하는 공백의 시퀀스). 채우기 접두어를 명시적으로 지정할 수도 있고, 그렇지 않으면 Emacs 가 자동으로 도출한다. (215 페이지의 22.5.4절 [Adaptive Fill] 참고).


C-x . 채우기 접두어를 설정한다(
set-fill-prefix
).


M-q 현재 채우기 접두어로 문단을 채운다(
fill-paragraph
).


M-x fill-individual-paragraphs 들여 쓴 변경 내용마다 새로운 문단의 시작으로 간주하여 영역을 채운다.


M-x fill-nonuniform-paragraphs 문단을 구분하는 행만 새로운 문단의 시작으로 간주하여 영역을 채운다.


현재 버퍼에 대한 채우기 접두어를 명시하려면 원하는 접두어로 시작하는 행으로 이동하여 접두어 끝에 포인트를 놓고 C-x . (
set-fill-prefix
) 를 입력한다. (C-x 다음에 마침표를 찍어야 한다.) 채우기 접두어를 끄려면 빈 접두어를 명시해야 하므로 행 시작에 포인트를 위치시키고 C-x . 를 입력한다.


채우기 접두어가 적용되면 채우기 명령어는 채우기 전에 문단의 각 행으로부터 채우기 접두어를 제공하고, 채운 후에 각 행에 삽입한다. (문단의 첫 행 시작은 본래부터 다르기 때문에 변경되지 않은 채 남는다.) Auto Fill 모드는 새 행을 만들 때 채우기 접두어를 자동으로 삽입하기도 한다(212 페이지의 22.5.1절 [자동 채우기] 참고). C-o 명령어는 그것이 생성하는 새로운 행 시작에서 사용 시 생성되는 행에 채우기 접두어를 삽입한다(21 페이지의 4.7절 [빈 행] 참고). 반대로 M-^ 명령어는 그것이 삭제하는 새 행 다음에 접두어를 (발생 시) 삭제한다(205 페이지의 21장 [들여쓰기] 참고).


예를 들어
fill-column
이 40 이고 사용자가 채우기 접두어를 '
;;
'로 설정하면 다음 텍스트에서 M-q
;; This is an
;; example of a paragraph
;; inside a Lisp-style comment.

다음을 생성한다:

;; This is an example of a paragraph ;; inside a Lisp-style comment.


채우기 접두어로 시작하지 않는 행은 M-q 와 문단 명령어 모두에서 문단을 시작하는 것으로 간주되며, 이는 hanging indentation을 사용한 문단에 바람직한 결과를 제공한다(들여 쓴 첫 행을 제외하고 들여 쓴 모든 행). 비어 있거나 들여 쓴 행은 접두어가 제거되고 나면 문단을 시작하거나 구분하므로 각 행에서 주석 구분 문자로 다중 문단 주석을 작성하고 있다면 이러한 방법을 사용하길 원할 것이다.


M-x fill-individual-paragraphs 를 이용해 자동으로 각 문단에 채우기 접두어를 설정할 수도 있다. 이 명령어는 영역을 문단으로 나누어 들여쓰기 양에 변화가 생기면 모두 새 문단의 시작으로 취급하고, 이러한 문단 각각을 채운다. 따라서 하나의 "문단"에 있는 모든 행들은 들여 쓴 양이 모두 동일하다. 이러한 들여쓰기는 해당 문단에 대해 채우기 접두어 역할을 한다.


M-x fill-nonuniform-paragraphs 는 비슷한 명령어지만 다른 방식으로 영역을 문단으로 나눈다. 이 명령어는 문단을 구분하는 행만 (
paragraph-separate
으로 정의되는) 새로운 문단의 시작으로 간주한다. 이는 한 문단의 행을 다른 양만큼 들여 쓸 수 있음을 의미하므로 사용되는 채우기 접두어는 문단의 어떠한 행이든 들여 쓴 최소량이 된다. 이는 문단의 첫 행을 나머지 문단과 다소 비슷하게 들여 쓰는 스타일에 바람직한 결과를 제공한다.


채우기 접두어는
fill-prefix
변수에 보관된다. 그 값은 문자열이고, 채우기 접두어가 없으면
nil
이다. 이는 버퍼별 변수로서 변수를 수정하면 현재 버퍼에만 영향을 미치지만 사용자가 변경할 수 있는 기본값도 있다. 423 페이지의 33.2.3절 [로컬]을 참고한다.


텍스트 속성
indentation
은 문단이 허용하는 들여쓰기 수준을 관리하는 또 다른 방법을 제공한다. 232 페이지의 22.13.5절 [Enriched 들여쓰기]를 참고한다.


적응적 채우기

채우기(fill) 명령어는 특정 사례에서 문단에 적절한 채우기 접두어를 자동으로 도출할 수 있는데, 행 시작에 공백 또는 특정 구두점 문자는 문단의 모든 행으로 전파된다.


문단에 두 개 이상의 행이 있을 경우 문단의 두 번째 행에서 채우기 접두어를 취하지만 첫 번째 행에서도 표시될 때에만 그러하다.


문단에 행이 하나일 경우 채우기 명령어는 해당 행으로부터 접두어를 취해도 좋다. 그러한 경우 세 가지 선택이 가능하므로 복잡해진다:

  • 첫 행의 접두어를 문단의 모든 행에서 사용한다.
  • 잇따른 행을 공백으로 들여쓰기 하여 첫 행에서 접두어 뒤에 오는 텍스트 아래에 일직선에 되도록 하되 첫 행으로부터 접두어를 실제로 복사하지는 않는다.
  • 두 번째 행부터 어떠한 특별한 일도 하지 않는다.


이 세 가지 포맷팅 스타일 모두 흔히 사용된다. 따라서 채우기 명령어들은 표시되는 접두어와 주 모드를 바탕으로 사용자가 좋아하는 것을 결정하려고 시도한다. 그 방법은 아래와 같다.


첫 행에서 발견된 접두어가
adaptive-fill-first-line-regexp
에 일치하거나 주석을 시작하는 시퀀스로 나타나면 (주 모드에 따라 좌우된다), 발견되는 접두어가 잇따른 행에서 문단 시작(starter)의 역할을 하지 않을 경우 문단을 채우는 데에 사용된다.


또는 발견된 접두어가 동일한 수의 공백으로 변환되고, 그러한 공백이 잇따른 행에서 문단 시작의 역할을 하지 않을 경우 공백은 나머지 행에서 채우기 접두어로 사용된다.


Text 모드를 비롯해 공백과 페이지 구분 문자만이 문단을 구분하는 다른 모드에서는 적응적 채우기로 선택된 접두어가 문단 시작의 역할을 할 리는 절대 없으므로 항상 채우기에 사용 가능하다.


adaptive-fill-regexp
변수는 어떠한 유형의 행 시작이 채우기 접두어의 역할을 수행할 수 있는지 결정하는데, 이러한 정규 표현식에 일치하는 행의 시작에 위치한 문자라면 무엇이든 사용된다.
adaptive-fill-mode
변수를
nil
로 설정하면 채우기 접두어는 절대 자동으로 선택되지 않는다.


adaptive-fill-function
변수를 함수로 설정하면 채우기 접두어를 자동으로 선택하는 좀 더 복잡한 방법을 명시할 수 있다. 이 함수는 행의 왼쪽 여백 다음에 포인트로 호출되고, 해당 행을 기반으로 적절한 채우기 접두어를 리턴해야 한다.
nil
을 리턴할 경우
adaptive-fill-regexp
는 접두어를 찾을 기회를 얻게 된다.


대, 소문자 변환 명령어

Emacs에는 임의의 텍스트 범위 또는 하나의 단어를 대문자나 소문자로 변환하는 명령어가 있다.


M-l 다음에 따라오는 단어를 소문자로 변환한다(
downcase-word
).


M-u 다음에 따라오는 단어를 대문자로 변환한다(
upcase-word
).


M-c 다음에 따라오는 단어 첫 글자를 대문자화한다(
capitalize-word
).


C-x C-l 영역을 소문자로 변환한다(
downcase-region
).


C-x C-u 영역을 대문자로 변환한다(
upcase-region
).


M-l (
downcase-word
)는 포인트 이후 단어를 소문자로 변환하여 그것을 넘어 이동한다. 따라서 M-1 을 반복하면 뒤에 연속하는 단어들을 변환한다. M-u (
upcase-word
)는 모두 대문자로 대신 변환하고, M-c (
capitalize-word
)는 단어의 첫 글자를 대문자로, 나머지를 소문자로 둔다. 이러한 명령어들은 모두 인자가 주어지면 한 번에 여러 개의 단어를 변환한다. 이는 특히 많은 양의 텍스트를 대문자에서 대, 소문자가 섞인 문자로 변환하는 데에 편리한데, 사용자가 각 단어에서 적절하게 M-1, M-u, M-c 중 하나를 이용하고 때로는 M-f 를 이용하여 단어를 건너뛰어 텍스트 사이를 이동할 수 있기 때문이다.


음의 인자가 주어지면 단어 대, 소문자 변환 명령어는 포인트 앞의 적절한 단어 수에 적용되지만 포인트를 이동시키진 않는다. 이는 사용자가 대, 소문자를 잘못하여 단어를 입력한 경우 대, 소문자 변환 명령어를 제공하여 계속 타이핑할 수 있기 때문에 편리하다.


단어 대, 소문자 변환 명령어가 단어 중간에 제공될 경우 포인트 뒤에 따라오는 단어 부분에만 적용된다. (이것은 M-d (
kill-word
)가 행하는 것과 비슷하다.) 음의 인자를 이용하면 대, 소문자 변환은 포인트 앞의 단어 일부에만 적용된다.


그 외 대, 소문자 변환 명령어로 포인트와 마크 사이의 모든 것을 명시된 대, 소문자로 변환하는 C-x C-u (
upcase-region
) 와 C-x C-l (
downcase-region
)이 있다. 포인트와 마크는 이동하지 않는다.


영역 대, 소문자 변환 명령어
upcase-region
downcase-region
은 보통 비활성화된다. 즉 이러한 명령어를 사용하려 하면 확인을 요청함을 의미한다. 사용자가 확인하고 나면 명령어를 활성화시켜도 좋으며, 이는 다시 확인을 요청하지 않음을 의미한다. 437 페이지의 33.3.11절 [비활성화하기]를 참고한다.


Text 모드

Text 모드는 텍스트 파일을 인간 언어로 편집하기 위한 주 모드이다. 확장자
.txt
로 끝나는 이름을 가진 파일은 주로 Text 모드에서 열린다(202 페이지의 20.3절 [모드 선택하기] 참고). 명시적으로 Text 모드로 전환하려면 M-x text-mode 를 입력한다.


Text 모드에서는 빈 행과 페이지 구분 문자만 문단을 구분한다. 그 결과 문단 들여쓰기가 가능하고, 적응적 채우기는 문단을 채울 때 사용할 들여쓰기를 결정한다. 215 페이지의 22.5.4절 [적응적 채우기]를 참고한다.


Text 모드에서 TAB (
indent-for-tab-command
) 명령어는 주로 현재 행을 들여 쓰는 대신 다음 탭 스톱까지 공백을 삽입한다. 상세한 내용은 205 페이지의 21장 [들여쓰기]를 참고한다.


Text 모드는 직접 호출될 때를 제외하면 주석과 관련된 기능을 끈다. 이는 구문 테이블을 변경하여 작은 따옴표는 단어의 부분으로 간주된다(예: '
don't
'는 하나의 단어로 간주된다). 하지만 단어가 작은 따옴표로 시작되면 대문자화를 목적으로 한 접두어로 취급된다(예: M-c 는 예상대로 '
'hello'
' 를 '
'Hello'
' 로 변환한다).


문단의 첫 행들을 들여 쓸 경우 Text 모드보다는 Paragraph-Indent Text 모드를 (M-x paragraph-indent-text-mode) 사용해야 한다. 이 모드에서는 첫 행 들여쓰기만으로 문단을 시작하기에 충분하기 때문에 문단들 사이에 빈 행을 둘 이유가 없지만 모든 행을 들여쓰는 문단은 지원되지 않는다. M-x paragraph-indent-minor-mode 를 사용하면 가령 메일 작성처럼 주 모드를 변경해선 안 되는 상황에서 그에 상응하는 부 모드를 활성화한다.


Text 모드는 M-TAB
ispell-complete-word
로 바인딩한다. 이 명령어는 맞춤법 사전을 가능한 단어의 공간으로 사용하여 버퍼에서 포인트 앞에 부분적 단어의 완성을 실행한다. 111 페이지의 13.4절 [맞춤법]을 참고한다. 창 관리자가 창을 전환하도록 M-TAB 을 정의할 경우 ESC TAB 또는 C-M-i 를 입력할 수 있다.


Text 모드에 들어가면 모드 훅
text-mode-hook
을 실행한다(199 페이지의 20.1절 [주 모드] 참고).


다음 절은 Text 모드에서 파생된 주 모드 몇 가지를 설명하겠다. 특히 Text 모드의 파생 모드들은 자체 모드 훅을 실행하기 전에
text-mode-hook
을 실행한다.


Outline 모드

Outline 모드는 Text 모드에서 파생된 주 모드로, 개요 편집에 특수화되어 있다. 이 모드는 개요 구조의 엔트리들을 탐색하는 명령어들과 버퍼의 부분들을 임시적으로 보이지 않게 만드는 명령어들을 제공하여 개요 구조를 더 쉽게 볼 수 있도록 해준다. M-x outline-mode 를 입력하면 Outline 모드로 전환된다. Outline 모드로 들어가면
text-mode-hook
훅 다음에
outline-mode-hook
훅이 실행된다(422 페이지의 33.2.2절 [훅] 참고).


Outline 모드 명령어를 사용하여 행을 보이지 않게 만들면 (219 페이지의 22.8.3절 [개요 표시] 참고) 화면에서 행이 사라진다. 그리고 이전에 표시되는 행의 끝에 생략 부호(세 개의 점)가 생겨 숨겨진 텍스트를 나타낸다. 보이지 않는 행이 여러 개 연속하여도 하나의 생략 부호가 생성된다.


C-nC-p 처럼 행에서 작업하는 편집 명령어들은 보이지 않는 행의 텍스트를 이전에 표시된 행의 일부로 취급한다. 표시된 행의 끝에 위치한 생략 부호를 제거하면 그 뒤에 그러한 부호와 연관된 보이지 않는 텍스트까지 모두 제거된다.


Outline 부 모드는 Outline 주 모드와 동일한 명령어를 제공하는 버퍼 로컬 부 모드지만 다른 주 모드와 함께 사용 가능하다. M-x outline-minor-mode 를 입력하면 현재 버퍼에서 Outline 부 모드를 토글할 수 있고, 파일 로컬 변수 설정을 이용해 특정 파일에서 활성화할 수도 있다(424 페이지의 33.2.4절 [파일 변수] 참고).


Outline 주 모드는 C-c 접두어에 특별한 키 바인딩을 제공한다. Outline 부 모드도 C-c @ 를 접두어로 이용하여 비슷한 바인딩을 제공하는데, 이는 주 모드의 특수 명령어와 충돌을 감소시키기 위함이다. (
outline-minor-mode-prefix
변수는 사용된 접두어를 관리한다.)


개요의 포맷

Outline 모드는 버퍼의 행이 제목(heading) 행본문(body) 행, 두 가지 유형이라고 가정한다. 제목 행은 개요에서 주제를 나타낸다. 제목 행은 하나 또는 그 이상의 별표 ('
*
') 문자로 시작하고, 별표의 개수는 개요 구조에서 제목의 깊이를 결정한다. 따라서 하나의 '
*
'로 시작하는 제목이 주요 주제가 되고, 1개의 제목 행과 그 다음 '
*
'가 달린 제목 사이에 '
*
'가 2개 달린 제목 행들은 모두 하위 주제를 의미하며 이와 같은 방식으로 나아간다. 제목 행이 아닌 행은 모두 본문 행이다. 본문 행은 선행하는 제목 행과 관계가 있다. 예를 들어보겠다:
* Food
This is the body,
which says something about the topic of food.

** Delicious Food
This is the body of the second-level header.

** Distasteful Food
This could have
a body too, with
several lines.

*** Dormitory Food

* Shelter
Another first-level topic with its header line.


제목 행과 잇따른 본문 행을 종합해서 엔트리(entry)라고 부른다. 하나의 제목 행과 그에 따르는 깊은 제목 행들과 본문 행들은 하위트리(subtress)라고 부른다.


제목 행을 구별하는 기준은
outline-regexp
변수를 설정하여 맞춤화 가능하다. (이에 권장하는 방법은 주 모드 함수에 있거나 파일 로컬 변수를 이용하는 방법이다.) 이러한 regexp 에 매칭하는 시작을 가진 행이라면 모두 제목 행으로 간주된다. (왼쪽 여백이 아니라) 행 내에서 시작하는 매칭은 포함하지 않는다.


매칭 텍스트의 길이는 제목 수준(level)을 결정하며, 매칭이 길수록 더 깊은 중첩 수준(nested level)을 만든다. 따라서 가령 텍스트 포맷터가 문서를 여러 개의 챕터와 섹션으로 나누는 '
@chapter
', '
@section
' '
@subsection
' 명령어를 갖고 있다면
outlint-regexp
를 "
@chap\\|@\\(sub\\)*section
"로 설정함으로써 그러한 행을 제목 행으로 간주하도록 만들 수 있다. 한 가지 수법, 즉 '
chapter
'와 '
section
' 이란 두 단어는 길이가 동일하지만 regexp 를 '
chap
' 으로만 매칭하도록 정의하면 챕터 제목에서 매칭되는 텍스트 길이는 더 짧게 확보하여 Outline 모드는 섹션이 챕터에 포함되어 있음을 알게 됨을 명심한다. 이것은 그 외 '
@chap
'으로 시작되는 다른 명령어가 없을 때에만 권장하는 방법이다.


outline-level
변수를 설정하면 제목 행 수준을 계산하는 규칙을 직접 명시할 수 있다.
outline-level
값은 인자를 취하지 않고 현재 제목 수준으로 리턴하는 함수여야 한다. 이러한 변수를 설정하는 데에 권장하는 방법은 주 모드 명령어에 있거나 파일 로컬 변수를 사용하여 이루어진다.


Outline 움직임 명령어

Outline 모드는 제목 행으로 역방향 그리고 순방향으로 이동하는 특수 움직임 명령어를 제공한다.


C-c C-n 포인트를 눈에 보이는 다음 제목 행으로 이동한다(
outline-next-visible-heading
).


C-c C-p 포인트를 눈에 보이는 이전 제목 행으로 이동한다(
outline-previous-visible-heading
).


C-c C-f 포인트를 눈에 보이는 다음 제목 행에서 하나의 포인트가 위치한 장소와 동일한 수준으로 이동한다(
outline-forward-same-level
).


C-c C-b 포인트를 눈에 보이는 이전 제목 행에서 동일한 수준으로 이동한다(
outline-backward-same-level
).


C-c C-u포인트를 한 수준 낮게 (좀 더 포괄적으로) 눈에 보이는 제목 행까지 상향 이동한다(
outline-up-heading
).


C-c C-n (
outline-next-visible-heading
)은 다음 제목 행으로 하향 이동한다. C-c C-p (
outline-previous-visible-heading
)은 비슷하게 역방향으로 이동한다. 두 가지 모두 수치적 인자를 반복 계수로 허용한다.


C-c C-f (
outline-forward-same-level
) 과 C-c C-b (
outline-backward-same-level
)은 하나의 제목 행에서 또 다른 눈에 보이는 제목 행으로, 개요에서 동일한 수준으로 이동한다. C-c C-u (
outline-up-heading
) 은 덜 깊게 중첩된 다른 제목으로 역방향 이동한다.


개요 표시 명령어

Outline 모드는 개요 구조를 기반으로 버퍼의 부분들을 일시적으로 숨기거나 보여주는 명령어를 제공한다. 이러한 명령어들은 실행 취소가 가능하지 않은데, 그 효과는 실행취소 메커니즘에 의해 기록되지 않으니 그저 실행취소를 그냥 지나치면 된다(109 페이지의 13.1절 [실행취소] 참고).


이러한 명령어 중 다수는 "현재" 제목 행에 작업한다. 포인트가 제목 행에 있을 경우 그것이 현재 제목 행이고, 포인트가 본문 행에 있다면 현재 제목 행은 가장 가까이 선행하는 제목 행이다.


C-c C-c 현재 제목 행의 본문을 표시하지 않는다(
hide-entry
).


C-c C-e 현재 제목 행의 본문을 표시한다(
show-entry
).


C-c C-d 현재 제목은 제외하고 그에 포함된 모든 것을 표시하지 않는다(
hide-subtree
).


C-c C-s 본문, 하위제목, 하위제목의 본문을 포함해 현재 제목에 포함된 모든 것을 표시한다(
show-subtree
).


C-c C-l 현재 제목 행의 본문과 그 하위제목의 본문을 표시하지 않는다(
hide-leaves
).


C-c C-k 현재 제목 행의 하위제목을 모든 수준에서 표시한다(
show-branches
).


C-c C-i 현재 제목 행의 근접한 하위제목(1개 수준 하향)을 표시한다(
show-children
).


C-c C-t 버퍼 내 모든 본문 행을 표시하지 않는다(
hide-body
).


C-c C-a 버퍼 내 모든 행을 표시한다(
show-all
).


C-c C-q 제목 행의 최상위 n개의 수준을 제외한 모든 것을 숨긴다(
hide-sublevels
).


C-c C-o 포인트가 위치하는 본문이나 제목을 제외한 모든 것을 숨기고, 그곳에서 최상위 수준의 개요까지 이어지는 제목도 모두 숨긴다(
hide-other
).


이러한 명령어의 가장 단순한 형태는 현재 제목 행 바로 뒤의 본문 행을 숨기는 C-c C-c (
hide-entry
)와 그것을 표시하는 C-c C-e (
show-entry
)다. 하위 제목과 그 본문은 영향을 받지 않는다.


C-c C-d (
hide-subtree
)와 C-c C-s (
show-subtree
)는 좀 더 강력하다. 이들은 현재 제목 행의 하위트리에 적용되는데, 하위트리라 함은 현재 제목 행의 본문, 간접적이든 직접적이든 그 하위 제목, 하위 제목의 본문을 모두 포함한다.


C-c C-l (
hide-leaves
) 명령어는 하위트리에서 모든 본문은 물론이고 현재 제목 행의 본문까지 숨기고, 하위제목 자체는 표시되지 않은 채 남는다. C-c C-k (
show-branches
) 명령어는 이전에 숨겨진 적이 있다면 (예: C-c C-d 에 의해) 하위제목을 표시한다. C-c C-i (
show-children
) 명령어는 좀 더 약한 버전으로, 직접적 하위제목(예: 한 수준 아래)만 표시한다.


C-c C-o (
hide-other
) 명령어는 포인트가 위치한 엔트리를 제외한 모든 것을 숨기는데, 그 부모(그곳에서 개요에서 최상위 수준까지 이어지는 제목)와 최상위 수준 제목까지 포함한다.


나머지 명령어들은 전체 버퍼에 영향을 미친다. C-c C-t (
hide-body
)는 모든 본문 행을 숨겨 사용자가 개요 구조만 볼 수 있도록 한다(특별한 예외의 경우, 첫 제목 행을 선행하는 파일 최상단에 위치한 행은 엄밀히 말해 본문 행임에도 불구하고 숨기지 않을 것이다). C-c C-a (
show-all
)는 모든 행을 표시한다. C-c C-q (
hide-sublevels
)는 최상위 수준의 제목을 모두 숨기고, 수치적 인자 n을 이용하면 제목 행의 상위 n개 수준을 제외한 모든 것을 숨긴다.


증분 검색이 Outline 모드에 의해 숨겨진 텍스트를 발견하면 해당하는 버퍼의 부분을 표시한다. 사용자가 그 위치에서 검색을 종료하면 텍스트는 표시된 채로 남는다. 활성화된 증분 검색이 숨겨진 텍스트에 매칭할 수 있는지 여부를 토글하려면 M-s i 를 입력한다. 향후 검색에서 기본값을 변경하려면
search-invisible
옵션을 맞춤화한다. (이 옵션은
query-replace
와 그에 관련된 함수들이 숨겨진 텍스트를 어떻게 취급하는지에도 영향을 미치며, 관련 내용은 105 페이지의 12.10.4절 [쿼리 대체]를 참고한다.) Reveal 모드(M-x reveal-mode)라는 버퍼 로컬 부 모드를 이용하여 사용자가 텍스트를 탐색하는 동안 텍스트를 자동으로 표시하게 만들 수도 있다.


다중 뷰에서 하나의 개요 보기

동시에 여러 창에서 하나의 개요에 대해 두 개의 뷰를 표시할 수도 있다. 이를 위해선 M-x make-indirect-buffer 를 이용해 간접 버퍼를 생성해야 한다. 이 명령어의 첫 번째 인자는 기존 개요 버퍼명이고, 두 번째 인자는 새로운 간접 버퍼에 사용할 이름이다. 153 페이지의 16.6절 [간접 버퍼]를 참고한다.


간접 버퍼가 존재하게 되면 C-x 4 b 또는 다른 Emacs 명령어를 이용해 일반적인 방식으로 창에 표시하면 된다. 텍스트의 부분들을 표시하고 숨기는 Outline 모드 명령어들은 각 버퍼에 따로 작업하므로 그 결과 각 버퍼는 고유의 뷰를 가질 수 있다. 동일한 개요에 두 개 이상의 뷰를 원한다면 간접 버퍼를 추가로 생성한다.


Folding 편집

Foldout 패키지는 Outline 모드와 Outline 부 모드를 "접는(folding)" 명령어로 확장한다. "접는다"란 개념은 사용자가 개요의 중첩(nested) 부분에서 확대하는 동안 더 높은 수준에서 그 relatives를 숨기는 것이다.


1 수준 제목 아래의 모든 텍스트와 하위제목이 있는 Outline 모드 버퍼는 숨겨진 것으로 간주한다. 이러한 제목 중 하나에 무엇이 숨겨졌는지 살펴보려면 C-c C-e (M-x show-entry)를 이용해 본문을 표시하거나 C-c C-i 를 이용해 자녀 (2수준) 제목을 표시할 수 있다.


Foldout 일 때 C-c C-z (M-x foldout-zoom-subtree)를 사용할 수도 있다. 이는 본문과 자녀 하위제목을 표시하고, 버퍼를 좁혀 1수준 제목, 본문, 2수준 제목만 표시되도록 한다. 이제 2수준 제목 중 하나에 딸린 내용을 살펴보기 위해서는 그 위에 커서를 위치시키고 C-c C-z 를 다시 사용한다. 그러면 2수준과 3수준의 자녀 하위제목이 표시되고 버퍼를 다시 좁힌다. 잇따른 하위제목에서는 원하는 만큼 확대할 수 있다. 모드 행에 위치한 문자열은 사용자가 얼마나 깊이 들어갔는지를 표시한다.


제목에서 확대(zooming in)를 실행할 때 자녀 하위제목만 확인하면 수치적 인자를 명시한다: C-u C-c C-z. 자녀 수준의 개수도 명시되며 (M-x show-children 과 비교), 가령 M-2 C-c C-z 는 자녀 하위제목의 두 수준을 표시한다. 아니면 본체를 음의 인자와 함께 명시할 수도 있다: M-- C-c C-z. 전체 하위트리는 C-c C-s (M-x show-subtree)와 비슷하게 인자를 0(zero) 으로 명시함으로써 확장이 가능하다: M-0 C-c C-z.


확대되는 동안에도 Foldout을 방해하지 않고 Outline 모드의 보이기 및 숨기기 함수를 이용할 수 있다. 또한 버퍼가 좁혀진 이후 "전역적" 편집 액션은 확대된 제목에 포함된 텍스트에만 영향을 미칠 것이다. 이는 문서의 특정 챕터나 섹션의 변경을 제한할 때 유용하다.


접힘의 확대를 취소(종료)하려면 C-c C-x (M-x foldout-exit-fold)를 사용한다. 이는 최상위 제목에 포함된 텍스트와 하위제목을 모두 숨기고, 사용자를 이전 버퍼 보기로 되돌린다. 수치적 인자를 명시하면 그만큼 많은 접힘 수준을 종료한다. 인자 0을 명시하면 모든 fold를 종료한다.


텍스트와 하위제목을 숨기지 않고 접힘의 좁히기를 취소하려면 음의 인자를 명시한다. 가령 M--2 C-c C-x 는 두 개의 접힘을 종료하고, 텍스트와 하위제목을 표시된 채로 남겨둔다.


Foldout 모드는 접힘에 들어가고 벗어나는 마우스 명령어와, 텍스트를 표시하고 숨기는 마우스 명령어를 제공하기도 한다.


C-M-Mouse-1 은 클릭한 제목에서 확대를 실행한다.

1번 클릭: 본문을 표시한다.
2번 클릭: 하위제목을 표시한다.
3번 클릭: 본문과 하위제목을 표시한다.
4번 클릭: 전체 하위트리를 표시한다.


C-M-Mouse-2 는 클릭한 제목 아래에 포함된 텍스트를 표시한다.

1번 클릭: 본문을 표시한다.
2번 클릭: 하위제목을 표시한다.
3번 클릭: 본문과 하위제목을 표시한다.
4번 클릭: 전체 하위트리를 표시한다.


C-M-Mouse-3 는 클릭한 제목 아래에 포함된 모든 텍스트를 숨기거나 점힘을 종료한다.

1번 클릭: 하위트리를 숨긴다.
2번 클릭: 접힘을 종료하고 텍스트를 숨긴다.
3번 클릭: 텍스트를 숨기지 않고 접힘을 종료한다.
4번 클릭: 모든 접힘을 종료하고 텍스트를 숨긴다.


foldout-mouse-modifiers
를 설정하여 다른 수식 키(Ctrl-META- 대신)를 명시할 수 있지만 foldout.el 라이브러리를 이미 로딩했다면 다시 로딩해야만 효과가 나타난다.


Foldout 패키지를 사용하려면 M-x load-library RET foldout RET 을 입력하거나 아래를 init 파일에 넣어 자동으로 실행되도록 만들 수 있다:

(eval-after-load "outline" '(require 'foldout))


Org 모드

Org 모드는 Emacs를 관리자(organizer)이자 오서링(authoring) 시스템으로 사용하는 Outline 모드의 변형 모드이다. 이름이
.org
확장자로 끝나는 파일은 Org 모드에서 열린다(202 페이지의 20.3절 [모드 선택하기] 참고). Org 모드로 직접 전환하려면 M-x org-mode 를 입력한다.


Outline 모드와 같이 Org 모드에서는 각 엔트리가 하나 또는 이상의 '
*
' 문자로 시작되는 제목 행을 하나씩 갖고 있다. 218 페이지의 22.8.1절 [Outline 포맷]을 참고한다. 또한 '
#
' 문자로 시작되는 행은 모두 주석으로 취급된다.


Org 모드는 개요 구조를 쉽게 보고 조작하는 명령어를 제공한다. 이러한 명령어의 가장 단순한 형태가 TAB (
org-cycle
)이다. 제목 행에서 이 명령어를 호출하면 하위트리의 여러 표시 상태를 순환하는데, (1) 제목 행만 표시, (2) 제목 행과 직계 자녀(존재 시)의 제목 행만 표시, (3) 전체 하위트리를 표시하기가 있다. 본문 행에서 호출하면 TAB에 대한 전역적 바인딩이 실행된다.


Org 모드 버퍼 어디서든 S-TAB (
org-shifttab
)을 입력하면 전체 개요 구조의 표시 여부를 (1) 최상위 수준의 제목 행만 표시, (2) 제목 행을 모두 표시하고 본문 행은 표시하지 않기, (3) 모두 표시하기 중에서 순환한다.


제목 행에서 M-<up> (
org-metaup
) 또는 M-<down> (
org-metadown
)을 입력하면 본문 행과 하위트리(존재 시)를 포함해 전체 엔트리를 버퍼에서 상향 또는 하향 이동할 수 있다. 비슷한 방식으로 M-<left> (
org-metaleft
)와 M-<right> (
org-metaright
)를 이용해 제목 행을 활성화(promote)하고 비활성화(demote)할 수도 있다. 이 명령어들은 본문 행에서 호출 시 전역적 바인딩을 실행한다.


다음 하위 절에서는 Org 모드를 관리자이자 오서링 시스템으로 사용 시 기본 지침을 제공한다. 상세한 내용은 The Org Manual 의 "Introduction" 절을 참고한다.


관리자로서 Org

엔트리 어디서든 C-c C-t (
org-todo
)를 입력하면 Org 엔트리를 '
TODO
' 항목으로 태그할 수 있다. 그러면 제목 행에 '
TODO
'라는 키워드가 추가된다. C-c C-t 를 다시 입력하면 키워드가 '
DONE
' 으로 전환되고, 다시 C-c C-t 를 입력하면 키워드가 전체 제거되는 식이다. org-todo-keywords 변수를 통해 C-c C-t 가 사용하는 키워드를 맞춤화할 수 있다.


엔트리를 TODO 로 표시하는 것 외에도 엔트리에 C-c C-s (
org-schedule
)를 입력하여 일자를 붙일 수도 있다. 그러면 Emacs Calendar가 팝업되어 (331 페이지의 28장 [달력/다이어리] 참고) 일자를 입력하도록 요구한 후 선택된 일자와 함께 '
SCHEDULED
' 라는 태그가 제목 행 아래에 추가된다. C-c C-d (
org-deadline
) 명령어는
DEADLINE
이라는 태그를 사용한다는 점만 제외하면 동일한 효과를 보인다.


Org 파일에 TODO 항목이 몇 가지 있다면 이제 C-c [ (
org-agenda-file-to-front
)라고 입력하여 해당 파일을 agenda files 의 목록으로 추가할 수 있다. Org 모드는 사용자가 여러 개의 agenda 파일을 손쉽게 관리할 수 있도록 디자인되었는데, 가령 사용자 삶에 중요한 사항들을 정리하는 데에 필요한 파일을 의미한다. Agenda 파일의 목록은
org-agenda-files
변수에 보관된다.


Agenda 파일로부터 항목을 표시하려면 M-x org-agenda 를 입력한다. 이 명령어는 사용자가 확인하고자 하는 것을 입력하도록 요하는데, 이번 주에 해야 할 일, 특정 키워드가 있는 TODO 항목 목록 등이 해당한다.


오서링 시스템으로서의 Org

Org 노트는 내보내기와 게시(publication)용으로 적절하게 포맷팅하여 준비하길 원할 것이다. 현재 버퍼를 내보내려면 Org 버퍼 어디서든 C-c C-e (
org-export
)를 입력한다. 이 명령어는 내보내기 포맷을 요청하는데, 현재 지원되는 포맷은 HTML, LaTeX, OpenDocument (
.odt
), PDF 를 포함한다. PDF 를 비롯한 일부 포맷은 특정 시스템 툴의 설치를 요구한다.


여러 파일을 특정 디렉터리로 로컬 또는 네트워크를 통해 내보내고 싶다면
org-publish-project-alist
변수를 통해 프로젝트 목록을 정의해야만 한다. 상세한 내용은 관련 문서를 참고한다.


Org는 텍스트 포맷팅을 내보낸 문서로 적용하기 위해 단순한 마크업 구조를 지원한다:

This text is /emphasized/
This text is *in bold*
This text is _underlined_
This text uses =a teletype font=

#+begin_quote
''This is a quote.''
#+end_quote

#+begin_example
This is an example.
#+end_example


상세한 내용은 The Org Manual 의 "Exporting" 절과 "Publishing" 절을 참고한다.


TeX 모드

Emacs 는 TeX 모드 및 그와 관련된 포맷으로 작성된 파일을 편집하기 위한 특수 주 모드를 제공한다. TeX 는 Donald Knuth 가 쓴 강력한 텍스트 포맷터로, GNU Emacs와 같이 무료 소프트웨어이다. LaTeXTeX 에 대한 단순화된 입력 포맷으로서 TeX 매크로를 이용해 구현된다. DocTeXTeX 소스가 쓰여진 특수 파일 포맷으로, 소스와 문서를 결합한다. SliTeXLaTeX 의 오래된 특수 형태다[1].


TeX 모드에는 네 가지 변형체, Plain TeX 모드, LaTeX 모드, DocTeX 모드, SliTeX 모드가 있다. 이 주 모드들은 약간씩만 차이가 있고, 네 가지 다른 포맷을 편집하도록 설계되었다. Emacs는 버퍼의 내용을 살펴보고 적절한 모드를 선택한다. (이는 사용자가 TeX와 같은 파일을 살펴볼 때 보통 자동으로 호출되는
tex-mode
명령어에 의해 이루어진다. 202 페이지의 20.3절 [모드 선택하기]를 참고한다.) 내용만으로 결정할 수 없다면 Emacs는
tex-default-mode
변수에서 명시하는 모드를 선택하는데, 기본값은
latex-mode
이다. Emacs가 올바로 고르지 못하면 사용자가 M-x plain-tex-mode, M-x latex-mode, M-x slitex-mode, doctex-mode 명령어들 중 하나를 이용해 TeX 모드의 올바른 변형체를 선택할 수 있다.


다음 절에서는 TeX 모드와 그 변형체의 기능을 문서화한다. 본 매뉴얼에서는 문서화하지 않은 TeX 과 관련된 다른 Emacs 패키지도 몇 가지 있다:

  • BibTeX 모드는 BibTeX 파일에 대한 주 모드로, LaTeX 문서에 대한 문헌 참조를 보관하는 데에 주로 사용된다. 상세한 정보는
    bibtex-mode
    명령어에 대한 문서 문자열을 참고한다.
  • RefTeX 패키지는 문헌 참조를 관리하도록 LATEX 모드와 함께 사용 가능한 부 모드를 제공한다. 상세한 정보는 Emacs 와 함께 배포되는 RefTeX Info 매뉴얼을 참고한다.
  • AUCTeX 패키지는 TeX 과 그에 관련된 포맷을 편집하기 위한 좀 더 고급 기능을 제공하는데, Emacs 버퍼 내에서 TeX 방정식을 미리보는 기능도 포함한다. BibTeX 모드와 RefTeX 패키지와는 달리 AUCTeX 는 기본적으로 Emacs와 함께 배포되지 않는다. 이는 Package Menu를 통해 다운로드 할 수 있으며 (408 페이지의 32장 [패키지] 참고) 설치가 되고 나면 패키지에 포함된 AUCTeX 매뉴얼을 참고한다.


TeX 편집 명령어

" 컨텍스트에 따라 '
' 또는 '
"
' 또는 '
' 를 입력한다(
tex-insert-quote
).


C-j 문단 나눔(두 개의 새 행)을 삽입하고 이전 문단에서 균형이 맞지 않은 중괄호나 달러 기호가 있는지 확인한다(Template:Tex-terminate-paragraph).


M-x tex-validate-region 영역 내 각 문단에서 균형이 맞지 않는 중괄호나 달러 기호를 확인한다.


C-c { '{}'를 삽입하고 포인트를 사이에 위치시킨다(
tex-insert-braces
).


C-c } 다음으로 일치하지 않는 닫힌 중괄호를 지나 전방향으로 이동한다(
up-list
).


TeX 에서 '
"
' 문자는 보통 사용되지 않으며 대신 '
'로 시작해서 '
'로 끝나는 인용 부호가 사용된다. 따라서 TeX" 키를
tex-insert-quote
명령어로 바인딩한다. 그러면 공백이나 열린 중괄호 뒤에 '
' 가 삽입되고, 그 외 다른 문자 뒤에는 '
'가 삽입된다.


특별한 예외가 있는데, 포인트 앞 텍스트가 '
'이거나 '
'일 때 사용자가 " 를 입력하면 Emacs는 선행하는 텍스트를 하나의 '
"
' 문자로 대체한다. 따라서 사용자는 필요 시 "" 를 입력하여 '
"
'를 삽입할 수 있을 것이다. (C-q " 를 이용해도 이 문자를 삽입할 수 있다.)


TeX 모드에서 '
$
' 는 TEX가 모드 구분 문자의 매칭 방식을 이해하려고 시도하는 특수 구문 코드를 갖고 있다. 사용자가 매치 모드를 종료하도록 '
$
'를 삽입하면 매치 모드로 들어간 매칭하는 '
$
'의 위치가 잠시 표시된다. 이는 삽입된 닫는 중괄호에 일치하는 열린 중괄호를 표시하는 것과 동일한 기능이다. 하지만 '
$
'가 매치 모드에 들어가는지 떠나는지 알려줄 방법은 없으므로 매치 모드로 들어가는 '
$
'를 삽입할 때는 사실상 상관이 없다 하더라도 마치 일치하는 결과인 것처럼 이전 '
$
' 위치가 표시된다.


TeX 는 중괄호를 일치해야만 하는 구분 문자로서 사용한다. 일부 사용자들은 따로 삽입하기보다는 항상 균형이 맞는 중괄호를 유지하는 편을 선호한다. 한 쌍의 중괄호를 삽입하려면 C-c { (
tex-insert-braces
)를 사용한다. 그러면 중괄호 안에 속하는 텍스트를 삽입할 수 있도록 중괄호 사이에 포인트를 남겨둔다. 이후 C-c } (
up-list
) 명령어를 이용해 닫는 중괄호를 지나 순방향으로 이동한다.


중괄호의 매칭을 확인하는 명령어에 두 가지가 있다. C-j (
tex-terminate-paragraph
)는 포인트 앞의 문단을 확인하고, 새 문단을 시작하기 위해 두 개의 행을 삽입한다. 일치하지 않는 결과가 발견되면 에코 영역에 메시지를 출력한다. M-x tex-validate-region 은 영역을 문단별로 확인한다. 오류는
*Occur*
버퍼에 열거되며, 사용자는 해당 버퍼에서 C-c C-c 와 같이 일반적인 Occur 모드 명령어를 사용하여 특정 비매칭 결과(mismatch)로 방문할 수 있다(107 페이지의 12.11절 [그 외 Search-and-Loop 명령어] 참고).


Emacs 명령어들은 TeX 모드에서 중괄호뿐만 아니라 사각 대괄호와 소괄호를 인식하기도 한다는 사실을 주목한다. 따라서 TeX 구문을 확인하려는 목적에는 올바르지 않다. 하지만 소괄호와 사각 대괄호는 일치하는 구분 문자로서 텍스트에 사용되기 쉽고, 다양한 움직임 명령어 및 자동 일치 표시를 함께 작동시키는 데에 유용하다.


LaTeX 편집 명령어

LaTeX 모드는 일반 TeX 에 적용되지 않는 기능을 몇 가지 제공한다.


C-c C-o LaTeX 블록에 '
\begin
' 과 '
\end
' 를 삽입하고 그 사이 행에 포인트를 위치시킨다(
tex-latex-block
).


C-c C-e 아직 닫지 않은 가장 안쪽의 TeX 블록을 닫는다(
tex-close-latex-block
).


LaTeX 입력에서는 '
\begin
' 과 '
\end
' 태그를 이용해 텍스트의 블록을 그룹화하는 데에 사용한다. 블록을 삽입하려면 C-c C-o (
tex-latex-block
) 를 입력한다. 이는 블록 타입의 입력을 요구하고, 적절하게 일치하는 '
\begin
' 과 '
\end
' 태그를 삽입하여 둘 사이에 빈 행을 남겨두고 포인트를 그곳으로 이동시킨다.


C-c C-o 에 블록 타입 인자를 입력 시에는 일반적인 완성 명령어를 사용할 수 있다(28 페이지의 5.4절 [완성] 참고). 기본 완성 목록은 표준 LaTeX 블록 타입을 포함한다. 사용자가 완성을 위한 추가 블록 타입을 원한다면
latex-block-names
목록 변수를 맞춤화하라.


LaTeX 입력에서는 '
\begin
'과 '
\end
' 태그는 균형을 맞춰야 한다. C-c C-e (
tex-close-latex-block
) 를 이용하면 마지막으로 일치하지 않는 '
\begin
'에 일치하는 '
\end
'를 삽입할 수 있다. 이는 '
\end
' 를 그에 상응하는 '
\begin
' 에 일치하도록 들여 쓰고, 포인트가 행 시작에 위치할 경우 '
\end
' 뒤에 새 행을 삽입하기도 한다.
latex-electric-env-pair-mode
부 모드는 사용자가 입력 시 '
\end
' 또는 '
\begin
' 태그를 자동으로 삽입한다.


TeX 출력 명령어

TeX 를 Emacs의 하위프로세스로 호출하여 버퍼의 전체 내용 또는 일부(예: 큰 문서의 한 챕터)를 제공할 수 있다.


C-c C-b
현재 전체 버퍼에 TeX 를 호출한다(
tex-buffer
).


C-c C-r
버퍼의 헤더와 함께 현재 영역에서 TeX 를 호출한다(
tex-region
).


C-c C-f
현재 파일에서 TeX 를 호출한다(
tex-file
).


C-c C-v
마지막 C-c C-r, C-c C-b, C-c C-f 명령어 중 하나로부터 출력결과를 미리보기한다(
tex-view
).


C-c C-p
마지막 C-c C-r, C-c C-b, C-c C-f 명령어 중 하나로부터 출력결과를 출력한다(
tex-print
).


C-c TAB
현재 파일에 BibTeX 를 호출한다(
tex-bibtex-file
).


C-c C-l
TeX 로부터 출력결과를 표시하는 창을 재중심화하여 마지막 행이 보이도록 한다(
tex-recenter-output-buffer
).


C-c C-k
TeX 하위프로세스를 제거한다(
tex-kill-job
).


C-c C-c
현재 전체 버퍼에 다른 컴파일 명령어를 호출한다(
tex-compile
).


현재 버퍼를 TeX 를 통해 전달하려면 C-c C-b (
tex-buffer
)를 입력한다. 포맷팅된 출력 결과는 임시 파일로 이동하는데, 보통은 .dvi 파일이다. 이후 C-c C-v (
tex-view
)를 이용하면 xdvi 와 같은 외부 프로그램을 시작하여 출력결과 파일 보기를 실행한다. C-c C-p (
tex-print
)를 입력하면 출력 파일의 하드카피를 인쇄할 수도 있다.


기본적으로 C-c C-b 는 현재 디렉터리에서 TeX 를 실행한다. TeX 의 출력결과도 해당 디렉터리로 간다. 다른 디렉터리에서 TeX 를 실행하려면
tex-directory
변수를 원하는 디렉터리명으로 변경한다. 환경 변수
TEXINPUTS
가 상대적 디렉터리명을 포함하거나 파일에 상대 파일명과 함께 '
\input
' 명령어가 포함되어 있다면
tex-directory
를 실행 시 "
.
" 를 얻거나 올바르지 않은 결과를 얻을 것이다. 또는 "
/tmp
"와 같이 다른 디렉터리를 명시하는 것도 안전한 방법이다.


버퍼의 TeX 변형 모드는 C-c C-b 가 실제로 어떤 셸 명령어를 실행하는지를 결정한다. Plain TeX 모드에서는 "tex"를 기본값으로 하는
tex-run-command
변수에 의해 명시된다. LaTeX 모드에서는 "latex"를 기본값으로 하는
latex-run-command
변수로 명시된다. C-c C-v
.dvi
출력을 보기 위해 실행하는 셸 명령어는 TeX 변형 모드와 상관없이
tex-dvi-view-command
변수로 결정된다. C-c C-p 가 출력결과를 출력하기 위해 실행하는 셸 명령어는
tex-dvi-print-command
변수로 결정된다.


보통 Emacs는 출력 파일명을 선행하는 문단에 설명된 셸 명령어 문자열 뒤에 자동으로 붙인다. 가령
tex-dvi-view-command
가 "
xdvi
" 일 경우 C-c C-v
xdvi output-file-name
을 실행한다. 하지만 일부 사례에서는 파일명이 명령어에 포함될 필요가 있는데, 가령 사용자가 출력결과가 다른 명령어로 pipe되는 명령어에 대해 파일명을 인자로서 제공하는 경우를 들 수 있겠다. 명령어 문자열에는 '
*
' 가 붙은 파일명을 어디다 위치시킬 것인지 명시할 수 있다. 아래를 예로 들겠다.
(setq tex-dvi-print-command "dvips -f * | lpr")


오류 메시지를 포함해 TeX 로부터 단말기 출력은
*tex-shell*
이라는 버퍼에 나타난다. TeX 가 오류를 받으면 사용자는 이 버퍼로 전환하여 입력을 feed할 수 있다(이는 Shell 모드에서와 마찬가지로 작동하는데, 관련 내용은 384 페이지의 31.4.2절 [대화형 셸]을 참고한다.). C-c C-1 을 입력하면 이 버퍼로 전환하지 않고도 스크롤이 가능하여 마지막 행이 표시되도록 만들 수 있다.


C-c C-k (
tex-kill-job
)을 입력하면 TeX 프로세스의 출력이 더 이상 유용하지 않다고 판단될 때 제거할 수 있다. C-c C-b 또는 C-c C-r 은 여전히 실행 중인 어떤 TeX 프로세스든 제거할 수 있다.


C-c C-r (
text-region
)을 입력하면 TeX 을 통해 임의 영역을 전달할 수도 있다. 하지만 대부분의 TeX 입력 파일은 시작 부분에 매개변수를 설정하고 매크로를 정의하는 명령어를 포함하는데, 이것이 없다면 파일 뒷부분은 올바로 포맷팅되지 않을 것이다. 이러한 문제를 해결하기 위해 C-c C-r 은 파일의 일부에 필수 명령어가 포함되도록 지정하게 해주는데, 이는 TeX 에 대한 입력 일부로 명시된 영역 앞에 포함된다. 지정된 파일 부분을 헤더라고 부른다.


Plain TeX 모드에 헤더의 경계를 나타내기 위해서는 파일에 두 개의 특수 문자열을 삽입한다. 헤더 앞에 '
%**start of header
' 를 삽입하고, 뒤에는 '
%**end of header
'를 삽입한다. 각 문자열은 전적으로 하나의 행에 표시되어야 하지만 행의 그 앞이나 뒤에 다른 텍스트가 존재하기도 한다. 두 개의 문자열을 포함하는 행은 헤더에 포함된다. '
%**start of header
'가 버퍼의 첫 100개 행 안에 표시되지 않으면 C-c C-r 은 더 이상 헤더가 없다고 가정한다.


LaTeX 모드에서 헤더는 '
\documentclass
' 또는 '
\documentstyle
'로 시작하고 '
\begin{document
}'로 끝이 난다. 이는 LaTeX 가 사용자로 하여금 언제든 사용하도록 요구하는 명령어이므로 헤더를 식별하기 위해 특별히 해야 할 일은 없다.


명령어 (
tex-buffer
)와 (
tex-region
)는 임시 디렉터리에서 자신의 일을 모두 수행하고, TeX 이 상호참조를 위해 필요로 하는 이용 가능한 보조 파일이 없으며, 이러한 명령어들은 일반적으로 모든 상호 참조가 올바른 값이어야 하는 최종 복사본에 실행하기엔 적합하지 않다.


상호 참조용 보조 파일을 원할 경우 파일 디렉터리에 현재 버퍼의 파일에서 TeX 을 실행하는 C-c C-f (
tex-file
)을 사용한다. TeX 을 실행하기 전에 이는 수정된 버퍼를 저장할 것인지 제안한다. 일반적으로는 상호 참조를 올바로 하기 위해 (
text-file
)을 두 번 사용할 필요가 있다.


tex-start-options
변수의 값은 TeX 실행에 대한 옵션을 명시한다.


tex-start-commands
변수의 값은 TeX 를 시작하기 위한 TeX 명령어를 명시한다. 기본값은 TeX 로 하여금
nonstop
모드에서 실행되도록 야기한다. TeX 를 상호작용적으로 실행하기 위해선 변수를 ""로 설정하라.


규모가 큰 TeX 문서는 종종 여러 개의 파일, 즉 메인 파일 하나와 하위파일들로 나뉜다. 하위파일에서 TeX 를 실행하면 보통 작동하지 않으며 메인 파일에서 실행해야 한다. 하위파일을 편집 중일 때
tex-file
을 유용하게 만들기 위해서는
tex-main-file
변수를 메인 파일명으로 설정할 수 있다. 이후
tex-file
이 해당 파일에서 TeX 을 실행한다.


tex-main-file
을 가장 편리하게 사용하는 방법은 하위파일 각각에 로컬 변수 목록을 명시하는 방법이다. 424 페이지의 33.2.4절 [파일 변수]를 참고한다.


LaTeX 파일의 경우 사용자는 BibTeX 를 이용해 현재 버퍼의 파일에 대해 보조 파일을 처리할 수 있다. BibTeX 는 데이터 기반에서 문헌 인용을 검색하고 문헌 섹션에 대해 인용된 참조를 준비한다. C-c TAB (
tex-bibtex-file
) 명령어는 셸 명령어 (
tex-bibtex-command
) 를 실행하여 현재 버퍼의 파일에 대해 '
.bbl
' 을 생성한다. 일반적으로는 '
.aux
' 파일을 생성하기 위해 C-c C-f (
tex-file
) 을 한 번 실행한 후 C-c TAB (
tex-bibtex-file
)을 실행하고, 상호 참조를 올바르게 얻기 위해 C-c C-f (
text-file
) 을 두 번 더 실행한다.


현재 TeX 버퍼에서 다른 컴파일 프로그램을 호출하려면 C-c C-c (
tex-compile
) 을 입력한다. 이 명령어는
pdflatex
,
yap
,
xdvi
,
dvips
를 포함해 다수의 공통 프로그램에 인자를 전달하는 방법을 이해한다. 표준 컴파일 키를 이용해 원하는 컴파일 프로그램을 선택할 수 있다(28 페이지의 5.4절 [완성] 참고).


다양한 TeX 모드

TeX 모드의 어떤 변형 모드로 들어가든
text-mode-hook
tex-mode-hook
훅이 실행된다. 그리고 나서
plain-tex-mode-hook
,
latex-mode-hook
,
slitex-mode-hook
중 적절한 훅이 하나 실행된다. TeX 셸을 시작하면
tex-shell-hook
훅을 실행한다. 관련 내용은 422 페이지의 33.2.2절 [훅]을 참고한다.


M-x iso-iso2tex, M-x iso-tex2iso, M-x iso-iso2gtex, M-x iso-gtex2iso 명령어를 이용해 Latin-1 부호화 파일과 TeX 부호화 파일 간 변환을 실행할 수 있다.


SGML 모드와 HTML 모드

SGML과 HTML의 주 모드는 태그에 작동하는 명령어와 들여쓰기 지원을 제공한다. HTML 모드는 SGML 모드의 약간 맞춤화된 변형 모드이다.


C-c C-n 특수 문자를 대화형으로 명시하고 그 문자에 대한 SGML '
&
'-명령어 를 삽입한다(
sgml-name-char
).


C-c C-t 태그와 그 속성(attributes)을 대화형으로 명시한다(
sgml-tag
). 이 명령어는 사용자에게 태그명과 속성 값을 요청한 후 여는 태그와 닫는 태그를 삽입하고 그 사이에 포인트를 남겨둔다.
수치적 인자 n을 이용해 버퍼에서 포인트 다음에 이미 존재하는 n개 단어 주변에 태그를 놓는다. 영역이 활성화될 때마다 영역 주변에 태그를 놓는다(Transient Mark 모드가 꺼져 있으면 수치적 인자 -1이 제공될 때에 이러한 작업을 실행한다.)


C-c C-a 현재 태그에 대한 속성 값을 대화형으로 삽입한다(
sgml-attributes
).


C-c C-f 균형을 맞춘 태그 그룹(열린 태그에서 그에 상응하는 닫는 태그까지 확장되는)을 건너뛴다(
sgml-skip-tag-forward
). 수치적 인자는 반복 계수 역할을 한다.


C-c C-b 균형을 맞춘 태그 그룹(열린 태그에서 그에 상응하는 닫는 태그까지 확장되는)을 거쳐 역방향으로 건너뛴다(
sgml-skip-tag-backward
). 수치적 인자는 반복 계수 역할을 한다.


C-c C-d 포인트에 또는 포인트 이후에 위치한 태그를 삭제하고, 일치하는 태그 역시 삭제한다(
sgml-delete-tag
). 포인트에 또는 포인트 이후에 위치한 태그가 열린 태그라면 닫힌 태그도 삭제하고, 닫힌 태그라면 열린 태그도 삭제한다.


C-c ? tag RET tag 태그의 의미에 대한 설명을 표시한다(
sgml-tag-help
). tag 인자가 비어 있으면 포인트에 있는 태그를 설명한다.


C-c / 가장 안쪽에 종료되지 않은 태그에 대해 닫힌 태그를 삽입한다(
sgml-close-tag
). 태그 또는 주석 안에서 호출될 경우 닫힌 태그를 삽입하는 대신 닫는다.


C-c 8 Latin-1 문자가 문자 대신 그것을 상징하는 SGML 명령어를 삽입하는 부 모드를 토글한다(
sgml-name-8bit-mode
).


C-c C-v 현재 버퍼를 SGML으로 인증하는 (사용자가 명시해야 하는) 셸 명령어를 실행한다(
sgml-validate
).


C-c TAB 버퍼에서 기존의 태그 표시를 토글한다. 간략한(cheap) 미리보기로 사용할 수 있다(
sgml-tags-invisible
).


XML 문서를 편집하기 위한 주 모드를 nXML 모드라고 부른다. 이는 기존의 많은 XML 스키마를 인식 가능하고 그러한 스키마를 이용하여 M-TAB을 통한 XML 요소 완성과 오류 강조를 통한 "때에 따른" XML 유효성을 제공하는 강력한 주 모드이다. 기존 버퍼에서 nXML 모드를 활성화하려면 M-x nxml-mode 또는 그와 동일한 M-x xml-mode 를 입력하라. Emacs 는
.xml
확장자를 가진 파일에 대해 nXML 모드를 사용한다. 확장자가
.xhtml
인 XHTML 파일의 경우 Emacs는 기본값으로 HTML 모드를 사용하는데, 사용자는
auto-mode-alist
변수를 맞춤화하여 그러한 모드에서 nXML 모드를 사용하도록 만들 수 있다(202 페이지의 20.3절 [모드 선택하기] 참고). nXML 모드는 Emacs 와 함께 배포되는 Info 매뉴얼에 설명되어 있다.


XML 은 SGML 의 엄밀한 하위집합이므로 XML 을 편집하는 데에 덜 강력한 SGML 모드를 사용하도록 선택할 수 있다. 기존 버퍼에서 SGML 모드를 활성화하기 위해서는 M-x sgml-mode 를 입력한다. SGML 모드를 활성화하면 Emacs는 XML인지 결정하기 위해 버퍼를 조사하고, XML 로 판명이 나면 Emacs 는
sgml-xml-mode
변수를
nil
이 아닌 값으로 설정한다. 그에 따라 위에서 설명한 SGML 모드의 태그 삽입 명령어가 항상 닫는 태그도 삽입하는 결과가 발생한다.


Nroff 모드

Nroff 모드는 Text 모드에서 파생된 주 모드로, nroff 파일을 편집하는 데에 특수화되었다(예: Unix man 페이지). 해당 모드로 들어가려면 M-x nroff-mode 를 입력한다. Nroff 모드에 들어가면
text-mode-hook
을 실행한 다음
nroff-mode-hook
을 실행한다(422 페이지의 33.2.2절 [훅]을 참고한다.).


Nroff 모드에서 nroff 명령어는 문단 구분 문자로 취급되고, 페이지는 '
.bp
' 명령어로 구분되며, 주석은 백슬래시-쌍따옴표로 시작된다. 아래와 같은 명령어들 역시 정의한다:


M-n
nroff 명령어가 아닌 다음 행의 시작으로 이동한다(
forward-text-line
). 인자는 반복 계수이다.


M-p
M-n 과 같으나 상향 이동한다(
backward-text-line
).


M-?
에코 영역에 영역 내 텍스트 행(nroff 명령어가 아닌 행)의 개수를 표시한다(
count-text-lines
).


Electric Nroff 모드는 Nroff 모드와 함께 사용할 수 있는 버퍼 로컬 부 모드이다. 해당 모드를 토글하려면 M-x electric-nroff-mode 를 입력한다(200 페이지의 20.2절 [부 모드] 참고). 모드가 켜져 있으면 사용자가 그루핑 유형을 여는 nroff 명령어를 포함한 행을 끝내기 위해 RET 을 입력할 때마다 자동으로 해당 그루핑을 닫기 위한 nroff 명령어가 다음 행에 삽입된다.


Nroff 모드와 함께 Outline 부 모드를 사용하면 (217 페이지의 22.8절 [Outline 모드] 참고) 제목 행은 '
.H
' 다음에 숫자가 따라오는 형태로 된 행이다(제목 수준).


Enriched 텍스트

Enriched 모드는 WYSIWYG("보이는 대로 얻는다") 방식으로 포맷팅된 텍스트 파일을 편집하기 위한 부 모드이다. Enriched 모드가 활성화되면 사용자는 폰트와 색상 등 다양한 포맷팅 속성을 버퍼 내 텍스트로 적용할 수 있으며, 버퍼를 저장하면 MIME '
text/enriched
' 파일 포맷을 이용해 그러한 속성들도 텍스트와 함께 저장된다.


Enriched 모드는 보통 Text 모드와 함께 사용된다(217 페이지의 22.7절 [텍스트 모드] 참고). 이것은 대부분의 프로그래밍 언어 모드에서 다수의 주 모드가 구문 강조에 사용하는 Font Lock 모드와 호환되지 않는다(78 페이지의 11.12절 [폰트 잠금] 참고). Enriched 모드와 달리 Font Lock 모드는 버퍼 내용을 기반으로 텍스트 속성을 자동으로 할당하며, 그러한 속성은 디스크에 저장되지 않는다.


Emacs 의
data-directory
내에
enriched.txt
파일은 Enriched 모드의 기능을 보여주는 일례다.


Enriched 모드

Enriched 모드는 버퍼 로컬 부 모드이다(200 페이지의 20.2절 [부 모드] 참고). '
text/enriched
' 포맷에 저장된 파일을 방문하면 Emacs는 자동으로 Enriched 모드를 활성화하고, 파일 내 포맷팅 정보를 버퍼 텍스트에 적용한다. 사용자가 Enriched 모드가 활성화된 채로 버퍼를 저장하면 포맷팅 정보를 포함해 '
text/enriched
' 포맷을 이용하여 저장된다.


포맷팅된 텍스트의 새 파일을 생성하기 위해서는 존재하지 않는 파일을 방문하여 M-x enriched-mode 를 입력한다. 이 명령어는 사실상 Enriched 모드를 토글한다. 접두 인자를 이용해 인자가 양수일 경우 Enriched 모드를 활성화하고, 그 외의 값일 경우 Enriched 모드를 비활성화한다. Enriched 모드를 비활성화하면 Emacs는 더 이상 '
text/enriched
' 포맷을 이용해 버퍼를 저장하지 않으며, 버퍼로 추가된 그 외 포맷팅 속성들은 버퍼에는 남아 있지만 디스크엔 저장되지 않는다.


Enriched 모드는 모든 Emacs 텍스트 속성을 저장하는 것이 아니라
enriched-translations
변수에 명시된 속성만 저장한다. 이는 폰트, 색상, 들여쓰기, 맞춤에 대한 속성을 포함한다.


파일을 방문하였는데 Emacs 가 파일이 '
text/enriched
' 포맷으로 되어 있음을 인식하지 못하면 M-x format-decode-buffer 를 입력한다. 이 명령어는 파일 포맷의 입력을 요하고, 해당 포맷으로 된 파일을 다시 읽는다. '
text-enriched
' 포맷을 명시하면 Enriched 모드가 자동으로 활성화된다.


'
text/enriched
' 파일을 raw 폼으로 보기 위해서는 (포맷팅된 텍스트가 아니라 마크업 태그가 있는 일반 텍스트로) M-x find-file-literally 를 사용한다(123 페이지의 15.2절 [방문하기] 참고).


Emacs 가 '
text/enriched
' 와 같은 파일 포맷을 인식하고 변환하는 방법에 관한 상세한 내용은 Emacs Lisp Reference Manual 의 "Format Conversion" 절을 참고한다. 텍스트 속성에 관한 추가 정보도 Emacs Lisp Reference Manual의 "Text Properties" 절을 참고한다.


딱딱하고 부드러운 새 행

Enriched 모드에서 Emacs는 두 가지 유형의 새 행을 구별하는데, 바로 딱딱한(hard) 새 행과 부드러운(soft) 새 행이다. M-x use-hard-newlines 를 입력하여 이 기능을 다른 버퍼에서도 활성화 또는 비활성화할 수 있다.


딱딱한 새 행은 문단을 구분할 때나, 텍스트가 어떻게 채워지는지와 상관없이 행 바꿈이 필요한 곳이라면 어디서든 사용 가능하며, 부드러운 새 행은 채우기(filling)에 사용된다. RET (
newline
)과 C-o (
open-line
) 명령어는 딱딱한 새 행을 삽입한다. Auto Fill 을 포함해 채우리 명령어들은 (212 페이지의 22.5.1절 [자동 채우기] 참고) 부드러운 새 행만 삽입하고 부드러운 새 행만 삭제하여 딱딱한 새 행만 남겨둔다.


따라서 Enriched 모드로 편집할 때는 채워진 문단 중간에서 행 바꿈을 실행하기 위해 RET 또는 C-o 를 이용해선 안 된다. 대신 Auto Fill 모드나 명시적인 채우기 명령어를 (213 페이지의 22.5.2절 [채우기 명령어] 참고) 사용하도록 한다. 행 바꿈이 항상 유지되어야 하는 곳, 즉 테이블이나 목록 안에서는 RET 또는 C-o 를 사용한다. 그러한 행의 경우 맞춤 스타일을
unfilled
로 설정하는 것이 바람직할 것이다(233 페이지의 22.13.6절 [Enriched 맞춤] 참고).


포맷 정보 편집하기

속성을 가장 쉽게 수정하는 방법은 '
Text Properties
' 메뉴를 이용하는 방법이다. 이 메뉴는 메뉴 바의 '
Edit
' 메뉴에서 (9 페이지의 1.4절 [메뉴 바] 참고) 또는 C-Mouse-2 를 이용해 (165 페이지의 18.4절 [메뉴 마우스 클릭] 참고) 접근할 수 있다. '
Text Properties
' 메뉴의 일부 명령어를 아래에 열거하겠다(M-x 를 이용해 호출하는 방법도 있다):
Remove Face Properties
영역으로부터 face 속성을 제거한다(
facemenu-remove-face-props
).


Remove Text Properties
영역으로부터 face 속성을 포함해 모든 텍스트 속성을 제거한다(Template:Facemenu-remove-all).


Describe Properties
포인트 다음 문자에 관한 다른 정보와 모든 텍스트 속성을 열거한다(
describe-text-properties
).


Display Faces
정의된 faces의 목록을 표시한다(
list-faces-display
). 74 페이지의 11.8절 [Faces]를 참고한다.


Display Colors
정의된 색상의 목록을 표시한다(
list-colors-display
). 75 페이지의 11.9절 [색상]을 참고한다.


그 외 다른 메뉴 엔트리는 다음 절에서 설명하겠다.


Enriched 텍스트에서 Faces

다음 명령어들은 face를 추가하거나 삭제하는 데에 사용 가능하다(74 페이지의 11.8절 [Faces] 참고). 마크가 활성화되어 있으면 각 명령어는 영역 내 텍스트로 적용되고, 마크가 비활성화되어 있다면 자체 삽입하는 다음 문자로 적용된다. 접두 인자를 이용하면 각 명령어는 영역이 활성화되어 있을 때에도 자체 삽입되는 다음 문자에 적용된다.


M-o d 모든
face
속성을 제거한다(
facemenu-set-default
).


M-o b
bold
face를 적용한다(
facemenu-set-bold
).


M-o i
italic
face를 적용한다(
facemenu-set-italic
).


M-o l
bold-italic
face를 적용한다(
facemenu-set-bold-italic
).


M-o u
underline
face를 적용한다(
facemenu-set-underline
).


M-o o face RET face face를 적용한다(
facemenu-set-face
).


M-x facemenu-set-foreground 색상 기입을 요구하고 (75 페이지의 11.9절 [색상] 참고) 그것을 전경색으로 적용한다.


M-x facemenu-set-background 색상 기입을 요구하고 그것을 배경색으로 적용한다.


이 명령어들은 Text Properties 메뉴를 통해서도 이용 가능하다.


자체 삽입되는 문자는 주로 face 속성을 (그리고 대부분의 다른 텍스트 속성도) 버퍼 내 선행하는 문자로부터 상속 받는다. 위의 명령어 중 하나를 이용해 다음으로 자체 삽입하는 문자에 대한 face를 명시한다면 그 문자는 선행 문자로부터 face 속성을 상속 받지 않지만 여전히 그 외 텍스트 속성은 상속받을 것이다.


Enriched 모드는
excerpt
fixed
라는 두 가지 face 를 추가로 정의한다. 이는 텍스트/enriched 파일 포맷에서 사용되는 코드에 해당한다.
excerpt
face는 인용을 위해 들여쓰기 되는데, 기본값으로
italic
과 동일하게 표시된다.
fixed
face는 고정 너비 텍스트를 명시하는데,
bold
와 동일하게 표시되는 것을 기본값으로 한다.


Enriched 텍스트에서 들여쓰기

Enriched 모드에서 사용자는 문단 또는 문단 일부의 오른쪽이나 왼쪽 여백에 들여쓰기 정도를 명시할 수 있다. 이러한 여백은 M-q 와 같은 fill 명령어에도 영향을 미친다(212 페이지의 22.5절 [채우기] 참고).


Text Properties 의 Indentation 하위메뉴는 들여쓰기를 명시하는 명령어를 제공한다:


Indent More
영역을 4개 열만큼 들여 쓴다(
increase-left-margin
). Enriched 모드에서 이 명령어는 C-x TAB 에서도 이용 가능하며, 수치적 인자를 제공 시 여백에 추가할 행의 수를 명시한다(음의 인자는 명시된 행의 수만큼 감소).


Indent Less
영역에서 4개 열만큼 들여쓰기를 제거한다.


Indent Right More
오른쪽 여백에 4개 열만큼 들여 씀으로써 텍스트를 더 좁게 만든다.


Indent Right Less
오른쪽 여백으로부터 4개 열만큼 들여쓰기를 제거한다.


standard-indent
변수는 이러한 명령어들이 들여쓰기에 얼마나 많은 열을 추가 또는 제거하는지 명시한다. 기본값은 4이다. Enriched 모드에서 기본 오른쪽 여백 값은 평소대로
fill-column
변수로 제어된다.


왼쪽 여백과 오른쪽 여백을 설정하기 위해서는 각각 C-c [ (
set-left-margin
) 와 C-c ] (
set-right-margin
) 을 입력하면 된다. 수치적 인자를 이용해 여백 너비를 명시할 수 있는데, 입력하지 않을 시 이러한 명령어들은 미니버퍼를 통해 값을 요구한다.


채우기 접두어가 있을 경우 이는 명시된 문단 들여쓰기와 함께 작동한다: C-x . 는 채우기 접두어에 대한 새 값에 명시된 들여쓰기의 여백을 포함시키지 않으며, 채우기 명령어는 각 행에서 들여쓰기 다음에 채우기 접두어를 검색한다. 214 페이지의 22.5.3절 [채우기 접두어]를 참고한다.


Enriched 텍스트에서 맞춤

Enriched 모드에서는 다음 명령어를 이용해 채우기(filling)에 다양한 맞춤 스타일(justification styles)를 명시할 수 있다. 이러한 명령어들은 포인트를 포함하는 문단에 적용되고, 영역이 활성화되어 있다면 영역에 겹치는 모든 문단에 적용된다.


M-j l 행을 왼쪽 여백에 맞춘다(
set-justification-left
).


M-j r 행을 오른쪽 여백에 맞춘다(
set-justification-right
).


M-j b 행을 양쪽 여백에 맞추고, 이를 위해 행의 중간에 공간을 삽입한다(
set-justification-full
).


M-j c M-S 여백 사이에 행을 가운데로 맞춘다(
set-justification-center
).


M-j u 채우기를 전체적으로 끈다(
set-justification-none
). 채우기 명령어는 이 설정을 이용 시 텍스트에 어떠한 일도 수행하지 않는다. 하지만 여전히 왼쪽 여백을 들여 쓸 수는 있다.


Text Properties 메뉴에서 Justification 하위메뉴를 이용해 맞춤 스타일을 명시할 수 있다. 기본 맞춤 스타일은 버퍼별 변수인
default-justification
에 의해 명시된다. 그 값은
left
,
right
,
full
,
center
,
none
심볼 중 하나여야 하고, 의미는 위의 명령어에 따른다.



기타 텍스트 속성 설정하기

Text Properties 의 하위메뉴 Special Properties 에는 그 외 3개의 텍스트 속성을 추가하거나 제거하는 엔트리가 있다:
read-only
(텍스트 수정을 비허용),
invisible
(텍스트를 숨김),
intangible
(텍스트 내에 포인트 이동을 비허용). '
Remove Special
' 메뉴 항목은 영역 내 텍스트로부터 이러한 특별한 속성을 모두 제거한다.


invisible
intangible
속성은 저장되지 않는다.



텍스트 기반 테이블 편집하기

table
패키지는 텍스트 기반의 테이블을 쉽게 편집하는 명령어를 제공한다. 아래는 그러한 테이블이 어떠한 모양인지를 보여주는 예제다:
+-----------------+--------------------------------+-----------------+
|     Command     |           Description          |   Key Binding   |
+-----------------+--------------------------------+-----------------+
|  forward-char   |Move point right N characters   |       C-f       |
|                 |(left if N is negative).        |                 |
|                 |                                |                 |
+-----------------+--------------------------------+-----------------+
|  backward-char  |Move point left N characters    |       C-b       |
|                 |(right if N is negative).       |                 |
|                 |                                |                 |
+-----------------+--------------------------------+-----------------+


Emacs 가 그러한 텍스트의 연장을 테이블로 인식할 때는 (234 페이지의 22.14.3절 [테이블 인식] 참고) 각 테이블 셀의 내용을 편집 시 내용이 너무 커서 셀에 들어맞지 않을 때마다 각 테이블 셀의 내용을 편집하면 테이블 크기가 자동으로 조정될 것이다.


자동 테이블 크기조정 기능은 M-x table-fixed-width-mode 를 입력하여 토글한다.


텍스트 기반 테이블은 무엇인가?

테이블은 셀로 나뉘는 직사각형 텍스트 영역으로 구성된다. 각 셀은 경계선을 포함하지 않고 적어도 하나의 문자 너비와 하나의 문자 높이여야 한다. 셀은 더 많은 셀로 다시 나눌 수 있지만 겹칠 수는 없다.


셀 경계선은 세 가지 특수 문자로 그려지는데, 이는 다음의 변수들에 의해 명시된다.


table-cell-vertical-char
수직선에 사용되는 문자. 기본값은 '
|
'이다.


table-cell-horizontal-char
수평선에 사용되는 문자. 기본값은 '
"-="
'이다.


table-cell-intersection-char
수평선과 수직선의 교차점에 사용되는 문자. 기본값은 '
+
'이다.


무효한 테이블의 예는 다음과 같다:

+-----+       +--+    +-++--+
|     |       |  |    | ||  |
|     |       |  |    | ||  |
+--+  |    +--+--+    +-++--+
|  |  |    |  |  |    +-++--+
|  |  |    |  |  |    | ||  |
+--+--+    +--+--+    +-++--+
   a          b          c


왼쪽부터 오른쪽까지:

a. 겹치는 셀이나 직사각형이 아닌 셀은 허용되지 않는다.
b. 경계는 직사각형이어야 한다.
c. 셀은 최소 하나의 문자 너비/높이를 가져야 한다.


테이블 생성하기

처음부터 텍스트 기반의 테이블을 생성하려면 M-x table-insert 를 입력한다. 이 명령어는 테이블 열의 개수, 테이블 행의 개수, 셀 너비, 셀 높이를 입력하도록 요구한다. 셀 너비와 셀 높이는 셀 경계를 포함하지 않으며 각각은 하나의 정수(각 셀에 동일한 너비/높이가 주어졌음을 의미) 또는 공백이나 콤마로 구분된 정수의 시퀀스(각 테이블 열/행의 너비/높이를 명시, 테이블 열은 왼쪽에서 오른쪽으로 세고 테이블 행은 위에서 아래로 센다)로 명시된다. 명시된 테이블은 포인트에 삽입된다.


M-x table-insert 에 의해 삽입된 테이블은 특별한 텍스트 속성을 포함하여 Emacs에게 그것을 텍스트 기반의 테이블로 특별히 취급할 것을 알린다. 버퍼를 파일로 저장하여 후에 다시 방문하면 그러한 속성들은 손실되고, Emacs 에게 있어 테이블은 일반 텍스트 조각으로 나타난다. 이것을 다시 테이블로 변환하는 방법은 다음 절을 참고한다.


테이블 인식

M-x table-insert 로 적용되는 특수 텍스트 속성이 없는 버퍼 내 기존 텍스트 기반의 테이블은 테이블로서 특별하게 취급되지 않는다. 그러한 텍스트 속성을 적용하려면 M-x table-recognize 를 입력한다. 이 명령어는 현재 버퍼를 스캔하고, 유효한 테이블 셀을 인식하며, 관련된 텍스트 속성을 적용한다. 반대로 M-x table-unrecognize 를 입력하면 현재 버퍼 내 모든 테이블을 인식 취소(unrecognized)하여 특수 텍스트 속성을 제거하고 테이블을 다시 일반 텍스트로 변환시킨다.


M-x table-recognize-region 현재 영역 내 테이블을 인식한다.


M-x table-unrecognize-region 현재 영역 내 테이블을 인식 취소한다.


M-x table-recognize-table 포인트에 있는 테이블을 인식하고 활성화한다.


M-x table-unrecognize-table 포인트에 있는 테이블을 비활성화한다.


M-x table-recognize-cell 포인트에 있는 셀을 인식하고 활성화한다.


M-x table-unrecognize-cell 포인트에 있는 셀을 비활성화한다.


테이블을 인식하는 또 다른 방법은 236 페이지의 22.14.7절 [테이블 변환]을 참고한다.


테이블 셀에 사용하는 명령어

M-x table-forward-cellM-x table-backward-cell 명령어는 현재 셀로부터 근접한 셀로 포인트를 이동한다. 그 순서는 순환적이어서 포인트가 테이블의 마지막 셀에 있으면 M-x table-forward-cell 은 첫 번째 셀로 이동한다. 마찬가지로 포인트가 첫 번째 셀에 있으면 M-x table-backward-cell 은 마지막 셀로 이동한다.


M-x table-span-cell 은 방향(오른쪽, 왼쪽, 위쪽, 아래쪽)을 요청하고, 현재 셀을 해당 방향의 근접 셀과 합친다. 합쳤을 때 적합하지 않은 셀 레이아웃을 야기할 경우 이 명령어는 오류를 보낸다.


M-x table-split-cell 은 현재 셀을 수직으로 또는 수평으로 나누어 미니버퍼로 방향의 입력을 요한다. 특정 방향으로 나누면 M-x table-split-cell-verticallyM-x table-split-cell-horizontally 를 사용하라. 수직으로 나눌 때는 오래된 셀 내용이 두 개의 새로운 셀 사이에서 자동으로 나뉜다. 수평으로 나누면 셀이 비어있지 않을 경우 사용자에게 셀 내용을 어떻게 나눌 것인지 질문하는데, 옵션으로는 '
split
'(포인트에서 내용을 나눈다), '
left
'(모든 내용을 왼쪽 셀에 놓는다), '
right
'(모든 내용을 오른쪽 셀에 놓는다)가 있다.


다음 명령어들은 셀을 확대 또는 축소시킨다. 기본값은 하나의 행이나 열만큼 크기를 조정하는데, 수치적 인자가 제공되면 크기를 조정할 행 또는 열의 수를 명시한다.


M-x table-heighten-cell 현재 셀을 수직으로 확대한다.


M-x table-shorten-cell 현재 셀을 수직으로 축소한다.


M-x table-widen-cell 현재 셀을 수평으로 확대한다.


M-x table-narrow-cell 현재 셀을 수평으로 축소한다.


셀 맞춤

M-x table-justify 명령어는 텍스트 기반의 테이블에서 하나 또는 이상의 셀에 맞춤을 적용한다. 맞춤은 셀에서 셀 가장자리를 기준으로 텍스트를 정려하는 방법을 결정한다. 테이블의 각 셀마다 따로 맞춤이 가능하다.


M-x table-justify 는 먼저 맞추기를 실행할 대상을 질문하는데, 이 때는 '
cell
'(현재 셀만), '
column
'(현재 테이블 열의 모든 셀), '
row
'(현재 테이블 행의 모든 셀) 중 선택할 수 있다. 명령어는 그 다음 맞춤 스타일을 요청하고
left
,
center
,
right
,
top
,
middle
,
bottom
,
none
(수직 맞춤 적용하지 않음) 중에 하나를 선택할 수 있다.


수평 및 수직 맞춤 스타일은 따로 명시되며, 두 스타일 모두 동시에 적용 가능한데, 가령 M-x table-justify
right
맞춤을 명시하기 위해 한 번,
bottom
맞춤을 명시하기 위해 다시 한 번 호출하면 셀 내용을 하단 우측에 맞춰 정렬할 수 있다.


맞춤 스타일은 버퍼에 텍스트 속성으로서 보관되고, 사용자가 버퍼를 제거하거나 Emacs 를 종료하면 손실된다. 하지만 M-x table-recognize 와 같은 테이블 인식 명령어는 (234 페이지의 22.14.3절 [테이블 인식] 참고) 셀 내용을 살펴봄으로써 셀의 맞춤 스타일을 결정하고 재적용한다. 이러한 기능을 끄려면
table-detect-cell-alignment
변수를
nil
로 변경하라.


테이블 행과 열

M-x table-insert-row 는 현재 테이블 행 앞에 셀 행을 삽입한다. 포인트와 함께 현재 행은 새로운 행을 지나 아래로 밀린다. 테이블 하단의 마지막 행 다음에 새 행을 삽입하려면 포인트를 테이블 아래에 하단 가장자리 바로 밑에 두고 이 명령어를 호출한다. 수치적 접두어 인자를 이용해 한 번에 하나 이상의 행을 삽입할 수도 있다.


이와 비슷하게 M-x table-insert-column 은 현재 테이블 열의 왼쪽으로 셀 행을 삽입한다. 가장 오른쪽 열의 오른쪽으로 열을 삽입하려면 포인트를 가장 오른쪽 열의 우측인 테이블 바깥에 두고 명령어를 호출한다. 수치적 접두어 인자는 삽입할 열의 개수를 명시한다.


M-x table-delete-column 은 포인트에 있는 셀의 열을 삭제한다. 이와 비슷하게 M-x table-delete-row 는 포인트에 셀의 행을 삭제한다. 두 명령어에 대한 수치적 접두어 인자는 삭제할 열 또는 행의 개수를 명시한다.


일반 텍스트와 테이블 간 변환

M-x table-capture 명령어는 영역에서 일반 텍스트를 포착하여 테이블로 바꾼다. M-x table-recognize 와 달리 (234 페이지의 22.14.3절 [테이블 인식] 참고) 원본 텍스트는 테이블 외관을 가질 필요가 없으며 논리적 테이블과 같은 구조만 가지면 된다.


가령 아래와 같이 세 개의 행으로 나뉘고 가로로 콤마를 이용해 분리된 다음의 숫자를 갖고 있다고 가정해보자:


저 텍스트에서 M-x table-capture 를 호출하면 아래와 같은 테이블이 생성된다:

1, 2, 3, 4
5, 6, 7, 8
, 9, 10


M-x table-release 는 정반대로 테이블을 일반 텍스트로 변환하여 그 셀 경계를 제거한다.

+-----+-----+-----+-----+
|1    |2    |3    |4    |
+-----+-----+-----+-----+
|5    |6    |7    |8    |
+-----+-----+-----+-----+
|     |9    |10   |     |
+-----+-----+-----+-----+


콤마 쌍은 레이아웃에서 텍스트를 편집하는 데에도 사용된다. 아래 세 개의 문단을 살펴보자(두 번째와 세 번째는 제목 행으로 들여쓰기 되었다):

table-capture is a powerful command.
Here are some things it can do:

Parse Cell Items   Using row and column delimiter regexps,
                   it parses the specified text area and
                   extracts cell items into a table.


위의 텍스트를 포함하는 영역에서 열 및 행 구분 문자 regexps 에 빈 문자열과 함께
table-capture
를 적용하면 아래와 같이 하나의 셀이 있는 테이블이 생성된다:
+----------------------------------------------------------+
|table-capture is a powerful command.                      |
|Here are some things it can do:                           |
|                                                          |
|Parse Cell Items   Using row and column delimiter regexps,|
|                   it parses the specified text area and  |
|                   extracts cell items into a table.      |
+----------------------------------------------------------+

이제 셀을 나누는 명령어를 사용하여 (235 페이지의 22.14.4절 [셀 명령어] 참고) 각 문단이 셀을 차지하도록 테이블을 나눌 수 있다:


+----------------------------------------------------------+
|table-capture is a powerful command.                      |
|Here are some things it can do:                           |
+-----------------+----------------------------------------+
|Parse Cell Items | Using row and column delimiter regexps,|
|                 | it parses the specified text area and  |
|                 | extracts cell items into a table.      |
+-----------------+----------------------------------------+

Emacs 셀은 이제 다른 셀의 레이아웃에 영향을 미치지 않고 독자적으로 편집이 가능하다. 편집이 끝나면 M-x table-release 를 호출하여 테이블을 일반 텍스트로 다시 변환할 수 있다.


다양한 테이블

table-query-dimension
명령어는 포인트에 있는 테이블 셀과 테이블의 레이아웃을 보고한다. 그 출력 예를 들겠다:
Cell: (21w, 6h), Table: (67w, 16h), Dim: (2c, 3r), Total Cells: 5


이는 현재 셀이 21개 문자 너비, 6개 행 높이이고 테이블은 67개 문자 너비와 2개 열, 3개 행 높이의 16개 행으로 되어 총 5개 셀이 있음을 의미한다.


M-x table-insert-sequence 는 문자열을 각 셀에 삽입한다. 각 문자열은 정수가 증가하는 연속 수처럼 시퀀스의 일부에 해당한다.


M-x table-generate-source 는 구체적 마크업 언어에 포맷팅된 테이블을 생성한다. 이는 언어(
html
,
latex
,
cals
중 하나여야 한다), 결과를 넣는 목적지 버퍼, 테이블 캡션을 질문한 후에 생성된 테이블을 명시된 버퍼에 삽입한다. 기본 목적 버퍼는
table.lang
으로, lang 은 사용자가 명시한 언어를 나타낸다.


2-열 편집

2-열 모드는 나란히 선 두 개의 텍스트 열을 편리하게 편집하도록 해준다. 이 때는 두 개의 나란한 창을 이용하는데, 각 창마다 고유의 버퍼를 표시한다. 2-열 모드에 들어가는 방법에는 세 가지가 있다:


F2 2 또는 C-x 6 2 왼쪽에 현재 버퍼, 오른쪽에 현재 버퍼명을 기반으로 한 버퍼로 2-열 모드에 들어간다(
2C-two-columns
). 오른쪽 버퍼가 이미 존재하지 않는 경우 빈 채로 시작되고, 현재 버퍼의 내용은 변경되지 않는다.
이 명령어는 현재 버퍼가 비어 있거나 하나의 열만 포함하는데 사용자가 다른 열을 포함하길 원할 때 적절하다.


F2 s 또는 C-x 6 s 2-열 텍스트를 포함하는 현재 버퍼를 두 개의 버퍼로 나누고 나란히 표시한다(
2C-split
). 현재 버퍼는 왼쪽 버퍼가 되지만 오른쪽 열의 텍스트는 오른쪽 버퍼로 이동한다. 현재 열은 나눔 지점을 명시한다. 나눔은 현재 행에서 시작해 버퍼 끝까지 지속된다.
이 명령어는 2-열 텍스트를 이미 포함하는 버퍼가 있는데 일시적으로 열을 구분하고자 할 때 유용하다.


F2 b buffer RET C-x 6 b buffer RET 현재 버퍼를 왼쪽 버퍼로 사용하고 buffer 버퍼를 오른쪽 버퍼로 사용하는 2-열 모드로 들어간다(
2C-associate-buffer
).


F2 s 또는 C-x 6 s 는 두 열 사이의 각 행에 표시되는 문자열에 해당하는 열 구분 문자를 검색한다. 수치적 인자와 함께 구분문자 너비를 F2 s 로 명시할 수 있는데, 포인트 앞에 얼마나 많은 문자를 구분 문자 문자열로 구성할 것인지를 나타낸다. 기본값 너비는 1이므로 열 구분 문자는 포인트 앞의 문자를 나타낸다.


행이 적절한 위치에 구분 문자를 갖고 있으면 F2 s 는 구분 문자 다음에 텍스트를 오른쪽 버퍼에 놓고 구분 문자를 삭제한다. 행이 적절한 위치에 열 구분 문자를 갖고 있지 않으면 왼쪽 버퍼에 남고, 오른쪽 버퍼는 그에 따라 빈 행을 얻는다. (이것이 바로 "2-열 모드에서 두 개의 열에 걸친" 행을 쓰는 방법으로, 왼쪽 버퍼에서 쓰고 오른쪽 버퍼에는 빈 행을 놓는다.)


C-x 6 RET 또는 F2 RET (
2C-newline
) 명령어는 두 개의 버퍼에서 각 해당 위치에 새 행을 삽입한다. 이는 나뉜 버퍼에서 편집하는 동안 2-열 텍스트에 새 행을 가장 간단하게 추가하는 방법이다.


원하는 대로 두 개의 버퍼를 편집하였다면 F2 1 또는 C-x 6 1 (
2C-merge
)를 이용해 합친다. 그러면 오른쪽 버퍼의 텍스트가 다른 버퍼에 두 번째 열로 복사된다. 2-열 편집으로 돌아가려면 F2 s 를 이용한다.


F2 d 또는 C-x 6 d 를 이용하면 두 버퍼를 분리시키고 각각이 의미하는 대로 둔다(
2C-dissociate
). 사용자가 F2 d 를 입력할 때 현재 버퍼를 제외한 버퍼가 비어 있을 경우 F2 d 를 사용하면 그 버퍼를 제거할 것이다.


Notes

  1. LaTeX 에 따라오는 '
    slides
    ' 문서 클래스로 대체되었다.