GNUEmacsManual:17
- 다중 창
다중 창
Emacs는 두 개 또는 그 이상의 창으로 프레임을 나눌 수 있다. 다중 창은 여러 버퍼의 부분들 또는 한 버퍼의 여러 부분들을 표시할 수 있다. 다중 프레임은 항상 다중 창을 의미하기도 하는데 각 프레임은 고유의 창 집합을 갖고 있기 때문이다. 각 창은 하나의 프레임에만 속한다.
Emacs 창의 개념
각 Emacs 창은 언제든 하나의 Emacs 버퍼만 표시한다. 단일 버퍼는 하나 이상의 창에 나타날 수 있으며, 그럴 경우 그 텍스트에 일어나는 변경내용은 그것이 나타나는 모든 창에 표시된다. 하지만 각 창은 고유의 포인트 값을 가지기 때문에 이러한 창들은 버퍼의 서로 다른 부분들을 표시할 수 있다.
어느 때건 하나의 Emacs 창이 선택된 창이고, 이 창이 표시하는 버퍼는 현재 버퍼이다. 그래픽 디스플레이에서 포인트는 선택된 창에선 깜빡이는 입체 커서로 표시되고 선택되지 않은 창에서는 빈 상자로 표시된다. 텍스트 터미널에서는 선택된 창에서만 커서가 그려진다. 86 페이지의 11.20절 [커서 표시]를 참고한다.
포인트를 이동시키는 명령어들은 선택된 Emacs 창에 대한 포인트 값에 영향을 미친다. 다른 Emacs 창의 포인트 값은 변경하지 않으며, 동일한 버퍼를 표시하는 창들도 마찬가지다. C-x b 와 같은 버퍼 전환 명령어의 경우에도 다른 창에는 전혀 영향을 미치지 않는다. 하지만 C-x 4 b 처럼 다른 창을 선택하고 그 안의 버퍼를 전환하는 명령어들도 존재한다. 또한 (가령) C-h f (
)나 C-x C-b (
)를 비롯해 창에서 정보를 표시하는 모든 명령어들은 선택된 창에 영향을 미치지 않고 선택되지 않은 창에서 버퍼를 전환함으로써 작동한다.
여러 개의 창이 동일한 버퍼를 표시할 때는 포인트의 다른 값을 가질 수 있으므로 다른 영역을 가질 수 있다. 하지만 각 버퍼는 하나의 마크 위치만 가지므로 모두 마크에 대해 동일한 값을 가진다.
각 창마다 버퍼명, 수정 상태, 창에 표시된 버퍼의 주 모드와 부 모드를 표시하는 공유의 모드 행을 갖는다. 선택된 창의 모드 행은 다른 색상으로 표시된다. 상세한 내용은 8 페이지의 1.3절 [모드 행]을 참고한다.
창 분할하기
C-x 2 선택된 창을 두 개의 위, 아래 창으로 분할한다(
).
C-x 3 선택된 창을 옆으로 나란히 분할한다(
).
C-Mouse-2 창의 모드 행에서 해당 창을 분할한다.
C-x 2 (
)는 선택된 창을 위, 아래 두 개의 창으로 분할한다. 창을 분할한 후에는 위의 창이 선택되고 새로 분리된 창은 아래에 위치한다. 두 개의 창 모두 이전과 동일한 포인트 값을 갖고, 버퍼의 동일한 부분을 표시한다(또는 가능하면 가장 가까운 부분). 필요할때에 창은 포인트를 화면에 유지하도록 스크롤된다. 기본적으로 두 창은 각각 본래 창의 절반 정도의 높이를 얻는다. 양수 인자는 상단 창에 얼마나 많은 행을 부여할 것인지 명시하고, 음수 인자는 하단 창에 얼마나 많은 행을 부여할 것인지 명시한다.
변수를
로 변경하면 C-x 2 는 화면에서 가능한 한 이전과 가까운 위치에 텍스트를 유지하기 위해 각 창에 포인트 값을 비롯해 두 창에서 표시하는 버퍼의 부분을 조정하고, 포인트가 원래 창의 하단 부분에 존재한 경우 상단 창 대신 하단 창이 선택된다.
C-x 3 (
)은 선택된 창을 양 옆으로 나란히 분할한다. 왼쪽 창이 선택된 창이고, 오른쪽 창은 동일한 버퍼의 동일한 부분을 표시하며 동일한 포인트 값을 갖는다. 양수 인자는 왼쪽 창에 얼마나 많은 열을 부여할 것인지 명시하고, 음수 인자는 오른쪽 창에 몇 개의 열을 부여할 것인지 명시한다.
창을 C-x 3 을 이용해 나누면 결과가 되는 창은 프레임의 전체 너비보다 적게 차지한다. 연속 행이 사용 중일 경우 창 너비가 너무 좁아지면 버퍼를 읽기 힘들어질 수도 있다(22 페이지의 4.8절 [연속 행] 참고). 따라서 창 너비가 50개 열보다 좁아지면 Emacs는 자동으로 행 절단으로 전환한다. 이러한 절단은
변수의 값과 상관없이 발생하며 (87 페이지의 11.21절 [행 절단] 참고),
변수로 대신 조정된다. 이 변수의 값이 양의 정수라면 (기본값 50) 이는 자동 행 절단이 발생하기 전에
창에 대한 최소 너비를 명시하고, 값이
일 경우 자동 행 절단이 비활성화되며,
이외에 다른 값일 경우 Emacs는 그 너비와 상관없이
창마다 행을 절단한다.
텍스트 터미널 상에서 옆에 나란히 위치한 창들은
face를 이용해 그려지는 수직 구분자로 구분된다.
창의 모드 행에서 C-Mouse-2 를 클릭하면 창을 나누어 사용자가 클릭하는 곳에 수직 구분자를 놓는다. Emacs가 어떻게 컴파일되는지에 따라 스크롤 바에서 C-Mouse-2 를 클릭하면 클릭한 위치에 수평 구분자를 놓으면서 창을 분할하기도 한다(이 기능은 Emacs가
스크롤 바를 사용할 때는 작동하지 않는다).
기본적으로 창을 나누면 Emacs는 결과 창마다 프레임의 기본 폰트 크기의 정수 배수에 해당하는 크기를 부여한다. 따라서 결과적 창들의 화면을 균일하지 못하게 분할할 수 있다.
변수를
이 아닌 값으로 설정하면 Emacs는 각 창에 동일한 픽셀 수를 제공할 것이다(초기 크기가 홀수 픽셀일 경우 얼추 1 픽셀 정도). 프레임의 픽셀 크기가 프레임 문자 크기의 배수가 아닐 경우 이 옵션이
이라 하더라도 최소 하나의 창 크기가 픽셀 조정될 수 있다.
다른 창 이용하기
C-x o 다른 창을 선택한다(
).
C-M-v 다음 창을 스크롤한다(
).
Mouse-1 창의 텍스트 영역에서 Mouse-1 은 창을 선택하여 클릭한 위치로 포인트를 이동시킨다. 모드 행을 클릭하면 포인트를 그곳으로 이동시키지 않고 창을 선택한다.
키보드를 이용해 C-x o (other-window)를 입력하면 창을 전환할 수 있다. 단, 0이 아니라 o("다른 것"을 의미)이니 주의한다. 두 개 이상의 창이 있을 때 이 명령어는 모든 창을 순환 순서로, 주로 상단에서 하단으로, 왼쪽에서 오른쪽으로 이동한다. 가장 오른쪽이나 아래쪽에 있는 창 다음에는 상단 좌측 가장자리로 돌아간다. 수치적 인자는 창의 순환 순서에서 몇 단계를 이동시킴을 의미한다. 음의 인자는 반대 순서로 창을 순환한다. 미니버퍼가 활성화되면 미니버퍼는 사이클에서 마지막 창으로, 사용자는 미니버퍼 창에서 다른 창들 중 하나로 전환한 후 다시 전환하여 요청한 미니버퍼 인자의 제공을 완료할 수 있다. 27 페이지의 5.3절 [미니버퍼 편집]을 참고한다.
일반 스크롤 명령어는 (69 페이지의 11장 [디스플레이] 참고) 선택된 창에만 적용되지만 다음 창을 스크롤하는 명령어가 한 가지 존재한다. C-M-v (
)는 C-x o 가 선택할 창을 스크롤한다. 이는 C-v 와 같은 양수와 음수 인자를 취한다. (미니버퍼에서 C-M-v 는 표준 순환순으로 다음에 위치한 창보다는 미니버퍼가 있을 경우 미니버퍼와 상관된 도움말 창을 스크롤한다. 27 페이지의 5.3절 [미니버퍼 편집]을 참고한다.)
를
이 아닌 값으로 설정하면 다른 창에 마우스를 이동 시 창을 선택한다. 이 기능은 기본적으로 꺼져 있다.
다른 창에 표시하기
C-x 4 는 다른 창- 선택된 창을 분할함으로써 새로 생성된 창이나 기존의 다른 창-의 버퍼로 전환하는 다양한 명령어에 대한 접두 키다. Emacs가 사용할 창을 선택하거나 생성하는 방법은 17.6.1절 [창 선택]을 참고한다.
C-x 4 b bufname RET 다른 창에서 bufname이란 버퍼를 선택한다(
).
C-x 4 C-o bufname RET bufname 버퍼를 선택하지 않고 어떤 창에 표시한다(
). 창을 어떻게 선택하는지에 관한 상세한 내용은 160 페이지의 17.6절 [버퍼 표시하기]를 참고한다.
C-x 4 f filename RET 다른 창에 filename 파일을 방문하여 그 버퍼를 선택한다(
). 123 페이지의 15.2절 [방문하기]를 참고한다.
C-x 4 d directory RET 다른 창에 directory 디렉터리에 대한 Dired 버퍼를 선택한다(
). 315 페이지의 27장 [Dired]를 참고한다.
C-x 4 m
과 비슷하게 메일 메시지 작성을 시작하지만 (350 페이지의 29장 [메일 전송하기 참고]) 다른 창에서 작성한다(
).
C-x 4 .
와 비슷하게 현재 태그 테이블에서 (299 페이지의 25.3절 [태그] 참고) 태그를 찾지만 다른 창에서 찾는다(
).
C-x 4 r filename RET 읽기 전용 파일 filename을 방문하고, 다른 창에서 그 버퍼를 선택한다(
). 123 페이지의 15.2절 [방문하기]를 참고한다.
창 삭제하기와 재배열하기
C-x 0 선택된 창을 삭제한다(
).
C-x 1 선택된 창만 제외하고 선택된 프레임에서 모든 창을 삭제한다(
).
C-x 4 0 선택된 창만 삭제하고 그 안에 표시되는 버퍼를 제거한다(
). 이 키 시퀀스에서 마지막 문자는 0이다.
C-x ^ 선택된 창을 크게 만든다(
).
C-x } 선택된 창을 넓게 만든다(
).
C-x { 선택된 창을 좁게 만든다(
).
C-x - 버퍼가 너무 많은 행을 필요로 하지 않으면 이 창을 줄인다(
).
C-x + 모든 창의 높이를 동일하게 만든다(
).
선택된 창을 삭제하기 위해 C-x 0 (
)를 입력한다. (여기서는 0이다.) 창이 삭제되면 그것이 차지한 공간이 주위 창으로 주어진다(하지만 당시에 미니버퍼 창이 활성화되었다 하더라도 그 창에는 주어지지 않는다). 창의 삭제는 그것이 표시하던 버퍼에는 어떠한 효과도 미치지 않고, 버퍼는 계속 존재하며, C-x b 를 이용해 사용자는 여전히 전환할 수 있다.
C-x 4 0 (
)은 C-x 0 보다 더 강한 명령어이고, 현재 버퍼를 제거한 후 선택된 창을 삭제한다.
C-x 1 (
)은 선택된 창을 제외한 모든 창을 삭제하며, 선택된 창은 전체 프레임을 사용하기 위해 확장한다. (미니버퍼 창이 활성화되어 있는 동안은 이 명령어를 사용할 수 없으며, 사용을 시도할 시 오류를 신호로 보낸다.)
C-x ^ (
) 명령어는 선택된 창을 하나의 행만큼 길게 만들어 프레임의 높이를 변경하지 않고 수직으로 근방에 있는 창으로부터 공간을 차지한다. 양의 수치적 인자를 이용하면 이 명령어는 창 높이를 다수의 행만큼 증가시키고, 음의 수치적 인자를 이용하면 다수의 행만큼 높이를 줄인다. 세로로 인접한 창들이 없을 경우 (예: 창이 전체 프레임 높이에 위치한 경우) 오류를 신호로 보낸다. 이 명령어는 사용자가
변수를 이용해 명시한 (기본값 4) 특정 행 수보다 작게 창 높이를 감소시키려 하여도 오류를 보낸다.
이와 유사하게 C-x } (
)는 선택된 창을 넓게 만들고 C-x { (
)는 좁게 만든다. 이 명령어들은
변수로 명시한 (기본값 10) 최소 열 수보다 적게 창 너비를 감소시키려 하면 오류를 보낸다.
C-x - (
)는 선택된 창의 높이가 그것이 표시하는 버퍼의 전체 텍스트를 표시하는 데에 필요한 높이보다 길 경우 높이를 감소시킨다. 이는 프레임 내 다른 창들에게 추가 열을 제공한다.
선택된 프레임에 모든 창의 높이를 동일하게 하려면 C-x + (
)를 사용한다.
모드 행에서 마우스를 클릭하면 창 높이를 변경하고 창을 삭제하는 또 다른 방법을 제공한다. 165 페이지의 18.5절 [모드 행 마우스]를 참고한다.
창에 버퍼 표시하기
사용자 명령어에 대한 응답으로 일부 버퍼를 표시하거나 "팝업"시키는 것은 Emacs 공통 연산이다. 명령어가 이를 실행하는 방법에는 여러 가지가 있다.
C-x C-f (
)와 같은 많은 명령어들은 선택된 창을 "차지"함으로써 버퍼를 표시하여 사용자의 주의가 해당 버퍼로 전환될 것을 예상한다. 이러한 명령어들은 주로 내부적으로
를 호출함으로써 작동한다(147 페이지의 16.1절 [버퍼 선택하기] 참고).
일부 명령어들은 선택된 창을 차지하지 않으려 하면서 "지능적으로" 표시하려 하는데, 가령 새 창을 분할하여 원하는 버퍼를 그곳에 표시하는 식이다. 다양한 도움말 명령어를 포함해 그러한 명령어들은 (37 페이지의 7장 [도움말] 참고)
를 내부적으로 호출함으로써 작동한다. 상세한 내용은 160 페이지의 17.6.1절 [창 선택]을 참고한다.
다른 명령어들도
와 동일한 일을 수행하며, 사용자가 그 버퍼의 편집을 시작할 수 있도록 표시하는 창을 추가로 선택한다. C-x ' (
) 명령어가 한 예다(262 페이지의 24.2절 [컴파일 방식] 참고). 그러한 명령어들은
함수를 내부적으로 호출함으로써 작동한다. 관련 내용은 The Emacs Lisp Reference Manual의 "Switching to a Buffer in a Window" 절을 참고한다.
로 끝나는 이름을 가진 명령어들은
와 같이 행동하지만, 선택된 창에 절대로 표시되지 않는다는 점은 제외다. 이러한 명령어들 중 몇 가지는 C-x 4 접두 키에 바인딩된다(158 페이지의 17.4절 [팝업 창] 참고).
으로 끝나는 이름을 가진 명령어들은 (i) 선택된 창에 절대 표시되지 않고, (ii) 창을 나누는 대신 새로운 프레임을 생성하여 원하는 버퍼를 생성하는 방법을 선호한다는 (
변수가
로 설정된 것처럼) 점만 제외하면
와 같이 행동한다(160 페이지의 17.6.1절 [창 선택] 참고). 이러한 명령어들 중 몇 가지는 C-x 5 접두 키에 바인딩된다.
display-buffer가 작동하는 방식
명령어는 (내부적으로 호출하는 명령어들과 함께) 아래의 단계에 따라 표시할 창을 선택한다. 이 단계 순서를 변경하는 방법에 관한 상세한 내용은 The Emacs Lisp Reference Manual의 "Choosing a Window for Display" 절을 참고한다.
먼저 버퍼가 다른 고려사항과 상관없이 선택된 창에 표시되어야 하는지 확인한다. 이는 원하는 버퍼명을
리스트로 추가하거나 일치하는 정규 표현식을
로 추가함으로써 Emacs에게 알려줄 수 있다. 기본적으로 이러한 변수들은 nil이므로 이 단계는 건너뛴다.
또는 버퍼가 이미 기존 창에 표시된다면 해당 창을 "재사용"한다. 보통은 선택된 프레임에 있는 창들만 고려되지만
(아래 내용 참고)를 t로 변경하면 다른 프레임의 창들 역시 재사용 가능하다.
또는 새 프레임을 선택적으로 생성하여 그곳에 버퍼를 표시한다. 기본값은 이 단계를 건너뛰도록 되어 있다. 활성화하려면
변수를
이 아닌 값으로 변경한다. 특수값
는 그래픽 디스플레이에서만 이를 실행하는 것을 의미한다.
아니면 선택된 창을 분할하여 새 창을 생성하고 해당 새 창에 버퍼를 표시하라.
분할은
와
변수에 따라 세로나 가로로 가능하다. 이러한 변수들은 정수값을 가져야 한다.
가 선택된 창의 높이보다 작을 경우 분할하기는 새 창을 아래에 놓는다. 그 외에
가 창의 너비보다 작으면 분할을 실행 시 새 창이 오른쪽에 놓일 것이다. 두 조건 모두 해당하지 않으면 Emacs는 새 창이 아래에 위치하도록 분할을 시도하지만 이전에 분할되지 않은 창만 가능하다(과도한 분할을 피하기 위해).
아니면 선택된 프레임 상의 기존 창에 버퍼를 표시한다.
위의 방법이 어떤 이유에서건 모두 실패하면 새 프레임을 생성하여 그곳에 버퍼를 표시한다.
창을 다루는 편리한 기능들
Winner 모드는 창 설정의 변경내용을 기록하여 (예: 프레임이 어떻게 창으로 나뉘는지) 사용자가 그것을 "실행취소"할 수 있는 전역적 부 모드이다. M-x winner-mode 를 이용하거나
변수를 맞춤화하여 Winner 모드를 토글할 수 있다. 모드가 활성화되면 C-c left (
)는 마지막 창 설정 변경내용을 실행 취소한다. 실행취소 중에 마음이 바뀌면 C-c right (M-x winner-redo)를 이용해 실행취소한 변경내용을 다시 실행할 수 있다.
Follow 모드(M-x follow-mode)는 동일한 버퍼에서 여러 창을 동기화하여 항상 해당 버퍼의 주위 부분들을 표시하도록 한다. 74 페이지의 11.7절 [Follow 모드]를 참고한다.
Windmove 패키지는 프레임 내 인접한 창들 간 양방향 이동을 위한 명령어를 정의한다. M-x windmove-right 는 최근 선택된 창의 바로 오른쪽 창을 선택하고 "왼쪽", "위", "아래"의 경우에도 비슷하다. M-x windmove-default-keybindings 는 이러한 명령어를 S-right 등으로 바인딩하므로 이는 그러한 키들에 대한 시프트 선택을 비활성화한다(49 페이지의 8.6절 [시프트 선택] 참고).
M-x compare-windows 명령어는 다른 창들에 표시된 텍스트를 비교하도록 해준다. 137 페이지의 15.8절 [파일 비교하기]를 참고한다.
Scroll All 모드(M-x scroll-all-mode)는 포인트 움직임 명령어와 스크롤 명령어를 단일 창으로 적용하도록 야기하는 전역적 부 모드이다.