GNUEmacsManual:21

From 흡혈양파의 번역工房
Jump to: navigation, search
들여쓰기

들여쓰기

들여쓰기(indentation)는 텍스트 행의 시작에 공백 문자(whitespace character; 스페이스 또는 탭 문자)를 삽입하거나 조정하는 것을 나타낸다. 본 장에서는 Text 모드 및 관련 모드와 프로그래밍 언어 모드에서 공통으로 사용하는 들여쓰기 명령어 및 옵션을 문서화한다. 프로그래밍 모드에서 들여쓰기에 관한 추가 문서는 243 페이지의 23.3절 [프로그램 들여쓰기]를 참고한다.


들여쓰기를 가장 간단하게 실행하는 방법은 TAB 키를 이용하는 것이다. 대부분의 주 모드에서 이는
indent-for-tab-command
명령어를 실행한다. (C 및 그와 관련된 모드에서는 TAB 을 이용하면 그와 비슷하게 행동하는
c-indent-line-or-region
명령어를 실행시킨다.)


TAB
모드에 적절한 방식으로 공백을 삽입하거나 현재 행을 들여 쓴다(
indent-for-tab-command
). 영역이 활성화되어 있으면 영역 내 모든 행을 들여 쓴다.


TAB 의 정확한 행동은 주 모드에 따라 좌우된다. Text 모드 및 그와 관련된 주 모드에서 TAB 은 보통 스페이스와 탭 문자를 조합하여 삽입하여 포인트를 다음 탭 중지 위치로 앞세운다(206 페이지의 21.2절 [탭 중지] 참고). 이를 목적으로 하여 선행하는 행에서 처음으로 공백이 아닌 문자의 위치는 추가 탭 중지로 취급되므로 사용자는 TAB 을 이용해 포인트와 선행하는 행을 "일직선으로" 조정할 수 있다. 영역이 활성화되어 있으면 (47 페이지의 8.3절 [영역 사용하기] 참고) TAB 은 특별하게 행동하는데, 영역 내 각 행마다 들여쓰기를 실행하여 공백이 아닌 첫 번째 문자가 선행하는 행과 일직선에 위치하도록 한다.


프로그래밍 모드에서 TAB 은 선행하는 행의 코드를 감안해 알맞은 방식으로 코드의 현재 행을 들여 쓴다. 영역이 활성화되어 있다면 영역 내 모든 행이 이와 같은 방식으로 들여쓰기 된다. 포인트가 현재 행의 들여 쓴 범위(indentation) 내에서 초기에 위치해 있었다면 행에서 공백이 아닌 첫 번째 문자로 위치가 조정된다.


버퍼에 탭 문자를 삽입하길 원한다면 C-q TAB 을 입력한다(16 페이지의 4.1절 [텍스트 삽입하기] 참고).


들여쓰기 명령어

Emacs 는 TAB (
indent-for-tab-command
) 외에도 다른 방식으로 들여쓰기를 실행하는 명령어를 다양하게 제공한다.


C-M-o 포인트에 있는 현재 행을 분할한다(
split-line
). 포인트 이후 행에 있는 텍스트가 새 행이 되고, 포인트가 위치한 열과 동일한 열로 들여쓰기 된다. 이 명령어는 먼저 포인트를 어떠한 공백이나 탭이든 그 위로 순방향으로 이동시킨다. 이후 포인트는 삽입된 새 행 앞에 위치된다.


M-m 현재 행에 처음으로 공백이 아닌 문자로 (순방향 또는 역방향으로) 이동한다(
back-to-indentation
). 행에 공백이 아닌 문자가 없을 경우 행 끝으로 이동한다.


M-i 포인트에 있는 공백을 다음 탭 중지까지 들여 쓴다(
tab-to-tab-stop
). 206 페이지의 21.2절 [탭 중지]를 참고한다.

M-x indent-relative 포인트가 선행하는 행(사실 공백이 아닌 마지막 행)에서 처음으로 공백이 아닌 문자와 일직선이 될 때까지 포인트에 공백을 삽입한다. 포인트가 이미 그보다 훨씬 오른쪽에 위치한다면 대신 tab-to-tab-stop 을 실행하는데, 단 수치적 인자를 이용하면 어떤 일도 하지 않으므로 이 경우는 제외된다.


M-^ 이전 행과 현재 행을 합친다(
delete-indentation
). 이는 행 경계와 함께 현재 행의 앞에 위치한 들여쓰기를 하나의 공백으로 대체함으로써 두 행을 깔끔하게 "합친다."
특별한 경우로 (Lisp 코드에 유용), 합할 문자들이 연속된 열린 괄호와 닫힌 괄호이거나 연결점 다음에 또 다른 새 행이 따라올 경우 하나의 공백이 생략된다.
fill 접두어가 있을 경우 M-^ 는 삭제되는 새 행 다음에 나타나면 fill 접두어를 삭제한다. 관련 내용은 214 페이지의 22.5.3절 [Fill 접두어]를 참고한다.


C-M-\각 행의 시작에서 사용자가 마치 TAB을 입력한 것처럼 영역 내 모든 행을 들여 쓴다(
indent-region
).
수치적 인자가 제공되면 해당 열 번호로 영역 내 모든 행을 들여 쓴다.


C-x TAB 이 명령어는 영역 내에서 시작하는 모든 행의 들여쓰기를 변경하는 데에 사용되어 영향을 받는 행을 "rigid" 단위로 이동시킨다.

수치적 인자 없이 이 명령어를 호출할 경우 영향을 받는 행의 들여쓰기를 대화형으로 조정하기 위해 transient 모드를 활성화한다. 이러한 transient 모드가 활성화되었을 때 LEFT 또는 RIGHT 를 입력하면 각각 왼쪽과 오른쪽으로 하나의 공백만큼 들여 쓴다. 다음 탭 중지까지 왼쪽 또는 오른쪽으로 들여 쓰기 위해서는 S-LEFT 또는 S-RIGHT 를 입력한다(206 페이지의 21.2절 [탭 중지] 참고). 그 외 다른 키를 입력하면 transient 모드를 비활성화하고 일반 편집을 재개한다.
수치적 인자 n을 이용해 이 명령어를 호출할 경우 n개의 공백만큼 행을 순방향으로 들여 쓴다(transient 모드를 활성화하지 않고). n의 음수 값은 역방향으로 들여 쓰기 때문에 아래와 같이 큰 수의 음의 인자를 이용해 영역 내 행에서 이루어진 들여쓰기를 모두 제거할 수 있다:
C-u -999 C-x TAB


탭 중지

Emacs는 특정 열 번호를 탭 스톱(tab stops)이 되도록 정의한다. 이는 Text 모드 및 관련 모드에서 공백을 삽입할 때 TAB 에 의해 (205 페이지의 21장 [들여쓰기] 참고) 그리고 M-i 와 같은 명령어에 의해 (205 페이지의 21.1절 [들여쓰기 명령어] 참고) 중지점으로 사용된다.
tab-stop-lis
t 변수는 이러한 위치들을 제어한다. 기본값은 nil로, 탭이 8개 열마다 중지됨을 의미한다. 값은 탭 스톱을 위치시킬 0부터 시작하는 열 번호(증가순)로 된 목록이 가능하다. Emacs는 마지막 요소와 마지막 이전 요소의 차이만큼 반복하여 이 목록을 영원히 확장시킬 수 있다.


tab-stop-list
를 직접 맞춤화하는 대신 M-x edit-tab-stops 명령어를 통해 탭 스톱을 간편하게 확인하고 설정할 수 있다. 이는 아래와 같이 탭 스톱 설정의 설명을 포함하는 버퍼로 전환한다:
        :       :       :       :       :       :
0         1         2         3         4
0123456789012345678901234567890123456789012345678 
To install changes, type C-c C-c


첫 행은 탭 스톱마다 콜론을 포함한다. 다음 두 행에 포함된 숫자들은 콜론이 위치한 곳을 나타내기 위해 존재할 뿐이다.
tab-stop-list
의 값이 기본값
nil
일 경우 처음에 콜론이 전혀 표시되지 않는다. 원하는 열에 콜론을 위치시킴으로써 여러 탭 스톱을 명시하도록 버퍼를 편집할 수 있다. 버퍼는 Overwrite 모드를 사용한다(200 페이지의 20.2절 [부 모드] 참고). Emacs는 사용자가 위치시킨 마지막 두 개의 명시된 중지점의 차이를 반복함으로써 탭 중지 목록을 무제한으로 확장시킬 것이다. 사용이 끝나면 C-c C-c 를 입력하여 새로운 탭 스톱의 효과가 발생하도록 만든다. 보통은 새로운 탭 스톱 설정이 모든 버퍼에 적용된다. 하지만
tab-stop-list
변수를 사용자가 M-x edit-tab-stops 를 호출한 버퍼로 국한되게 만들고 싶다면 (423 페이지의 33.2.3절 [로컬] 참고) 새로운 탭 스톱 설정은 해당 버퍼로만 적용될 것이다. 향후 Emacs 세션에서 사용하도록 탭 스톱 설정을 저장하려면 Customize 인터페이스를 사용해
tab-stop-list
의 값을 저장한다(412 페이지의 33.1절 [간편한 맞춤화] 참고).


이번 절에서 논한 탭 스톱은 탭 문자가 버퍼에서 어떻게 표시되는지와는 아무 상관이 없음을 주목한다. 탭 문자는 언제나 다음 디스플레이 탭 스톱까지 확장된 빈 공백으로 표시된다. 관련 내용은 85 페이지의 11.19절 [텍스트 표시]를 참고한다.


탭 vs. 스페이스

보통 들여쓰기 명령어는 원하는 열에 일직선을 만들도록 스페이스 문자와 탭 문자의 최적의 조합을 삽입하거나 삭제한다. 탭 문자는 다음 디스플레이 탭 스톱까지 확장되는 빈 공백의 연장(stretch)으로 표시된다.
tab-width
열마다 하나의 디스플레이 탭 스톱이 존재하는 것이 기본값이다(기본값 8). 85 페이지의 11.19절 [텍스트 표시]를 참고한다.


원한다면 스페이스로만 들여쓰기를 만들 수도 있다. 이를 요청하려면 버퍼 로컬 변수
indent-tabs-mode
nil
로 설정한다. 버퍼 로컬 변수의 설정에 관한 정보는 423 페이지의 33.2.3절 [로컬]을 참고한다. 하지만 C-q TAB 을 이용하면 indent-tabs-mode의 값과 상관없이 항상 탭 문자를 삽입함을 주목한다.


indent-tabs-mode
nil
로 설정하는 한 가지 이유는 모든 에디터들이 탭 문자를 동일한 방식으로 표시하는 것은 아니기 때문이다. Emacs 사용자들 역시
tab-width
에 대해 다른 값을 맞춤화하였을지도 모른다. 스페이스만 사용할 경우 파일이 항상 동일하게 보이도록 만들 수 있다. Emacs 내에서의 모양만 중요하다면 파일 로컬 변수에서
tab-width
변수를 설정하여 이 문제를 해결하는 방법도 있다(424 페이지의 33.2.4절 [파일 변수] 참고).


공백이 아닌 모든 텍스트의 열을 항상 유지하면서 탭을 스페이스로 혹은 반대로 변환하는 명령어들도 있다. M-x tabify 는 영역에서 스페이스의 시퀀스를 스캔하고, 들여쓰기를 변경하지 않고도 가능하다면 최소 두 개의 스페이스 시퀀스를 탭으로 변환한다. M-x untabify 는 영역 내 모든 탭을 적절한 수의 스페이스로 변경한다.


들여쓰기를 위한 편리한 기능

tab-always-indent
변수는 TAB (
indent-for-tab-command
) 명령어의 행위를 약간 수정한다. 기본값
t
는 205 페이지의 21장 [들여쓰기]에 설명된 행위를 제공한다. 그 값을
complete
심볼로 변경할 경우 TAB 은 먼저 현재 행의 들여쓰기를 시도하고, 이미 들여쓰기가 적용된 행일 경우 포인트에 있는 텍스트를 완성하려 할 것이다(254 페이지의 23.8절 [심볼 완성] 참고). 값이
nil
일 경우 TAB 은 포인트가 왼쪽 여백이나 행의 들여쓰기에 위치할 때에만 현재 행을 들여 쓰고, 그 외의 값의 경우 탭 문자를 삽입한다.


Electric Indent 모드는 사용자가 RET 을 입력할 때마다 행을 자동으로 들여 쓰는 전역적 부 모드이다. 이 모드는 기본적으로 활성화된다. 부 모드를 토글하기 위해서는 M-x electric-indent-mode 를 입력한다. 단일 버퍼에서 모드를 토글하기 위해서는 M-x electric-indent-local-mode 를 사용한다.


Notes