GNUEmacsManual:9: Difference between revisions
Onionmixer (talk | contribs) (GNU Emacs 9장 내용 추가) |
Onionmixer (talk | contribs) (빈칸 형식 수정) |
||
Line 25: | Line 25: | ||
삭제란 텍스트를 제거하고 킬 링에 저장하지 않음을 의미한다. 대부분의 경우 텍스트를 삭제하는 Emacs 명령어들은 하나의 문자나 여백만 삭제하는 명령어들이다. | 삭제란 텍스트를 제거하고 킬 링에 저장하지 않음을 의미한다. 대부분의 경우 텍스트를 삭제하는 Emacs 명령어들은 하나의 문자나 여백만 삭제하는 명령어들이다. | ||
{{key press|DEL}} {{key press|BACKSPACE}} 이전 문자 또는 영역이 활성화된 경우 영역의 텍스트를 삭제한다({{RoundTitleNavy|delete-backward-char}}). | {{key press|DEL}} {{key press|BACKSPACE}} 이전 문자 또는 영역이 활성화된 경우 영역의 텍스트를 삭제한다({{RoundTitleNavy|delete-backward-char}}). |
Latest revision as of 08:41, 26 March 2016
- 텍스트 제거하고 이동하기
텍스트 제거하고 이동하기
Emacs에서 제거(killing)란 텍스트를 삭제하여 킬 링(kill ring)이라는 곳에 복사함을 의미한다. 붙여넣기(Yanking)란 킬 링에서 텍스트를 버퍼로 다시 가져오는 것을 뜻한다. (일부 애플리케이션에서는 이와 유사한 연산을 "자르고 붙인다"고 부른다.) 킬 링은 하나의 원에 순환 방식으로 접근할 수 있도록 정렬된 텍스트 블록 집합으로 시각화하면 되기에 붙여진 이름이다. 55 페이지의 9.2.1절 [킬 링]을 참고한다. 구문 단위를 제거하는 명령어의 유형이 여러 가지가 존재하므로 매우 유용하다.
삭제와 제거
버퍼에서 텍스트를 삭제시키는 명령어 대부분은 텍스트를 킬 링에 저장한다. 제거 명령어라고 알려져 있으며, 그러한 명령어들의 이름은 보통 '
' (예:
)이란 단어를 포함한다. 킬 링은 마지막 제거뿐만 아니라 최근 실행한 제거를 몇 개 정도 저장하므로 매우 안전한 연산으로, 이전에 제거한 텍스트를 잃어버릴 염려를 하지 않아도 좋다. 킬 링은 모든 버퍼가 공유하므로 하나의 버퍼에서 제거된 텍스트는 다른 버퍼로 붙여넣을 수 있다.
제거 명령어의 실행을 취소할 때 C-/ (
)를 사용할 경우 (109 페이지의 13.1절 [실행취소하기] 참고) 제거한 텍스트를 버퍼로 다시 가져오긴 하지만 킬 링에서 삭제되지는 않는다.
그래픽 디스플레이에서 텍스트를 제거하면 시스템 클립보드에 역시 복사된다. 57 페이지의 9.3절 [잘라내기와 붙여넣기]를 참고한다.
텍스트를 제거하지만 킬 링에 저장하지 않는 명령어들은 삭제 명령어라고 부르며, 이름에 주로 '
' 단어가 포함되어 있다. 한 번에 하나의 문자를 삭제하는 C-d (
)와 DEL (
), 그리고 공백이나 새 행만 제거하는 명령어들도 이에 포함된다. 중요하지 않은 데이터를 대량으로 제거할 수 있는 명령어들은 킬 연산을 일반적으로 사용한다. 마우스를 이용해 제거와 붙여넣기를 실행할 수도 있다. 57 페이지의 9.3절 [잘라내기와 붙여넣기]를 참고한다.
삭제
삭제란 텍스트를 제거하고 킬 링에 저장하지 않음을 의미한다. 대부분의 경우 텍스트를 삭제하는 Emacs 명령어들은 하나의 문자나 여백만 삭제하는 명령어들이다.
DEL ← Backspace 이전 문자 또는 영역이 활성화된 경우 영역의 텍스트를 삭제한다(
).
Delete 다음 문자 또는 영역이 활성화된 경우 영역의 텍스트를 삭제한다(
).
C-d 다음 문자를 삭제한다(
).
M-\ 포인트 주위에 공백과 탭을 삭제한다(
).
M-SPC 포인트 주위에 공백과 탭을 삭제하고 하나의 공백만 남겨둔다(
).
C-x C-o 현재 행 주위에 빈 행을 삭제한다(
).
M-^ 중간에 오는 새 행과 그 뒤에 따르는 들여쓰기를 삭제하여 두 행을 합친다(
).
기본 삭제 명령어인 DEL (delete-backward-char), delete (delete-forward-char), C-d (
)는 이미 앞에서 설명한 바 있다. 19 페이지의 4.3절 [제거하기]를 참고한다. 이 명령어들은 수치적 인자를 이용해 명시된 문자 수만큼 삭제한다. 수치적 인자가 누락되거나 1인 경우, 영역이 활성화되었을 때 영역 내 모든 텍스트를 삭제한다(47 페이지의 8.3절 [영역 작업하기] 참고).
그 외 삭제 명령어들은 여백, 탭, 새 행 문자만 삭제하는 명령어들이다. M-\ (
)는 포인트 전후로 모든 공백과 탭 문자를 삭제한다. 또한 접두 인자를 이용해 포인트 앞의 공백과 탭 문자를 삭제한다. M-SPC (
)도 마찬가지지만 기존에 존재하던 공백의 개수와 상관없이 (이전에 공백이 없었다 하더라도) 포인트 앞에 하나의 공백을 남겨둔다. 수치적 인자 n을 이용해, n이 양수일 경우 포인트 앞에 n개의 공백을 남겨 두고 음수일 경우에는 공백과 탭뿐만 아니라 새 행까지 삭제하여 포인트 앞에 -n 개의 공백을 남겨둔다. 명령어
은
의 유연한 버전으로 보면 된다. 단, 연속해서 호출할 경우 다른 일을 수행한다. 첫 호출 시에는
처럼 행동하지만, 두 번째 실행에선 모든 여백을 삭제하고, 세 번째 호출하면 원래 여백을 복구시킨다.
C-x C-o (
)는 현재 행 다음에 모든 빈 행을 삭제한다. 현재 행이 비어있는 경우 현재 행 앞에 오는 빈 행까지 모두 삭제한다(하나의 빈 행, 즉 현재 행은 남겨둔다). 빈 행이 하나일 경우 그 행을 삭제한다.
M-^ (
)은 새 행과 주변에 주로 하나만 남기고 모든 공백을 삭제함으로써 현재 행과 이전 행을 합친다. 205 페이지의 21장 [들여쓰기]를 참고한다.
명령어
는 영역에서 동일한 행들을 찾아 각각의 사본 하나씩만 제외하고 모두 제거한다. 보통은 반복된 행의 첫 번째 결과를 유지하지만 C-u 접두 인자를 이용하면 마지막 결과를 유지한다. C-u C-u 접두 인자를 사용하면 주변에 동일한 행만 검색한다. 행이 정렬되어 있을 때 유용한 연산 방식이다. C-u C-u C-u 접두 인자를 이용하면 반복된 빈 행을 유지한다.
행별로 제거하기
C-k 나머지 행 또는 하나 이상의 행을 제거한다(
).
C-S-backspace 모든 행을 한 번에 제거한다(
)
가장 간단한 제거 명령어는 C-k (
)이다. 행 끝에서 사용할 경우 행을 끝내는 새 행 문자를 제거하여 다음 행을 현재 행에 합한다(따라서 새 행이 완전히 제거된다). 그 외의 경우 C-k 는 포인트부터 행 끝까지 모든 텍스트를 제거하는데, 포인트가 행의 시작에 위치한 경우 행을 빈 채로 남겨 둔다.
어떤 경우를 적용할 것인지 결정할 때 행 끝에 공백과 탭은 무시된다. 행에서 시각적으로 보이는 마지막 문자 다음에 포인트가 위치하는 한 C-k 가 새 행을 제거하도록 확보할 수 있다. 비어 있지 않은 행을 전체적으로 제거하기 위해서는 시작으로 가서 C-k 를 두 번 입력하라.
이러한 맥락에서 "행"이란 화면 행이 아니라 논리적 텍스트 행을 의미한다(22 페이지의 4.8절 [계속 행]을 참고).
C-k 에 양의 인자 n이 주어지면 n개의 행과 그 뒤에 따라오는 새 행들을 제거한다(포인트 앞 현재 행의 텍스트는 제거되지 않는다). 음의 인자 n의 경우, 현재 행 앞에 오는 n개의 행과 현재 행에서 포인트 앞에 있는 텍스트를 함께 제거한다. 0의 인자를 가진 C-k 는 현재 행에서 포인트 앞의 텍스트를 모두 제거한다.
변수가 nil이 아닌 경우, 행의 젤 처음에서 C-k 를 실행하면 전체 행을 포함해 다음에 따라오는 새 행을 제거한다. 이 변수는 보통 nil이다.
C-S-backspace (
)는 행 내에서 포인트 위치와 상관없이 새 행을 포함해 전체 행을 제거한다. 많은 텍스트 터미널에서는 C-S-backspace 라는 키 시퀀스를 입력하지 못하도록 한다는 사실을 명심한다.
기타 제거 명령어
C-w 영역을 제거한다(
).
M-w 영역을 킬 링에 복사한다(
).
M-d 다음 워드를 제거한다(
). 208 페이지의 22.1절 [워드]를 참고한다.
M-DEL 하나의 워드를 뒤로 제거한다(
).
C-x DEL 문장의 시작까지 뒤로 제거한다(
). 209 페이지의 22.2절 [문장]을 참고한다.
M-k 문장의 끝까지 제거한다(
).
C-M-k 뒤따라오는 균형 표현식(balanced expression)을 제거한다(
). 246 페이지의 23.4.1절 [표현식]을 참고한다.
M-z char Char의 다음 발생(occurrence)을 통해 제거한다(
).
가장 흔히 사용되는 제거 명령어 중 하나로, 영역 내 텍스트를 제거하는 C-w (
)가 있다(45 페이지의 8장 [마크]를 참고). 이와 비슷한 M-w (
)는 영역 내에 텍스트를 버퍼에서 제거하지 않고 킬 링으로 복사한다. C-w 또는 M-w 를 타이핑하는 동안 마크가 비활성화된 경우 명령어는 사용자가 마지막으로 마크를 설정한 위치와 포인트 사이의 텍스트에 작용한다(47 페이지의 8.3절 [영역 작업하기] 참고).
Emacs는 특정 구문 단위를 제거하는 명령어도 제공하는데, 워드에는 M-DEL 과 M-d (208 페이지의 22.1절 [워드] 참고), 균형 표현식에는 C-M-k (246 페이지의 23.4.1절 [표현식] 참고), 문장에는 C-x DEL 과 M-k 가 사용된다(209 페이지의 22.2절 [문장] 참고)이 있다.
M-z (
) 명령어는 제거와 검색을 결합하는데, 문자를 읽어 포인트부터 버퍼 내 해당 문자의 다음 발생까지 (포함하여) 제거한다. 수치적 인자는 반복 계수의 역할을 하는데, 음의 인자는 뒤로 검색하여 포인트 앞 텍스트를 제거한다.
제거 옵션
일부 특수화된 버퍼들은 읽기 전용 텍스트를 포함하는데, 이러한 텍스트는 수정할 수 없으므로 제거 역시 불가하다. 제거 명령어는 특히 읽기 전용 버퍼에서 작동하는데, 텍스트 위로 이동하여 버퍼로부터 실제로 제거하지 않고 킬 링으로 복사한다. 보통 이러한 일이 발생하면 삐 소리를 내면서 오류 메시지를 표시한다. 하지만
변수를
이 아닌 값으로 설정하면 에코 영역에는 텍스트가 왜 제거되지 않았는지 설명하는 메시지를 출력할 뿐이다.
변수를
이 아닌 값으로 변경하면 잇따라 동일한 킬을 이용 시 복사(duplication) 없이 단일 킬 링 엔트리만 생긴다.
붙여넣기
붙여넣기(Yanking)란 이전에 제거한 텍스트의 재삽입을 의미한다. 텍스트를 제거하여 다른 곳에 붙여넣은 것이 일반적인 텍스트의 이동 또는 복사 방법이다.
C-y 마지막으로 제거한 내용을 버퍼 내 포인트에 붙여넣는다(
).
M-y 방금 붙여넣은 텍스트를 이전에 제거한 텍스트의 batch로 대체한다(
). 55 페이지의 9.2.2절 [이전 제거]를 참고한다.
C-M-w 잇따라 제거 명령어를 사용할 경우 이전 킬 뒤에 덧붙이게 된다(
). 56 페이지의 9.2.3절 [추가 제거]를 참고한다.
기본 붙여넣기 명령어는 C-y (
)다. 이는 가장 최근의 제거 내용을 삽입하고, 삽입된 텍스트 끝에 커서를 남겨둔다. 또한 마크를 활성화하지 않은 채 삽입된 텍스트의 시작에 마크를 설정하는데, 이를 통해 사용자는 원할 경우 C-u C-SPC 를 이용해 해당 위치로 쉽게 넘어갈 수 있다(48 페이지의 8.4절 [마크 링] 참고).
일반적 접두 인자 (C-u C-y)를 이용하면 명령어는 대신 삽입된 텍스트 앞에 커서를 남겨두고, 끝에 마크를 설정한다. 다른 접두 인자를 이용하면 이전 제거 내용을 명시하는데, 가령 C-u 4 C-y 는 현재부터 4번째로 제거한 내용을 재삽입한다. 55 페이지의 9.2.2절 [이전 제거]를 참고한다.
그래픽 디스플레이에서 C-y 는 마지막 Emacs 제거 이후에 다른 애플리케이션에서 시스템 클립보드에 텍스트를 위치시킨 적이 있는지 확인한다. 있을 경우 클립보드의 텍스트를 대신 삽입한다. 따라서 Emacs는 다른 애플리케이션에서 수행된 "자르기" 또는 "복사하기" 클립보드 연산을 Emacs 킬로 효과적으로 취급하지만 킬 링에 기록되지 않는다는 점에 차이가 있다. 상세한 내용은 57 페이지의 9.3절 [자르고 복사하기]를 참고한다.
킬 링
킬 링은 이전에 제거한 텍스트 블록 목록이다. 킬 링은 모든 버퍼가 공유하는 유일한 링으로, 한 버퍼에서 텍스트를 제거하여 다른 버퍼로 붙여넣을 수 있다. 이 방법은 한 버퍼에서 다른 버퍼로 텍스트를 이동시키는 일반적인 방식이다. (레지스터에 텍스트를 저장하는 등 여러 다른 방법도 있으며, 관련 내용은 64 페이지의 10장 [레지스터]를 참고한다. 텍스트를 이동시키는 다른 방법은 59 페이지의 9.4절 [텍스트 누적하기]를 참고한다.)
킬 링에 최대 엔트리 수는
변수로 제어된다. 기본값은 60이다. 한계에 도달했을 때 새로운 킬을 만들면 Emacs는 킬 링에서 오래된 엔트리를 삭제하여 공간을 만든다.
킬 링의 실제 내용은
라는 변수에 저장되며, C-h v kill-ring 를 이용하면 킬 링의 전체 내용을 확인할 수 있다.
이전 제거 내용 붙여넣기
55 페이지의 9.2절 [붙여넣기]에서 설명한 바와 같이 C-y 의 수치적 인자를 이용하면 더 이상 최근 제거에 해당하지 않는 텍스트를 붙여 넣을 수 있다. 따라서 원하는 킬 링 엔트리를 기억하고 있을 때 유용하다. 기억하지 못한다면 가능한 대안들을 순환하는 M-y (
) 명령어를 이용할 수도 있다.
이전 명령어가 붙여넣기 명령어라면 M-y 는 붙여넣기한 텍스트를 만들어 이전에 제거된 텍스트로 대체한다. 따라서 마지막 이전에 제거된 텍스트를 복구하기 위해서는 먼저 마지막 제거 내용을 붙여넣는 C-y 를 사용한 다음 M-y 를 이용해 이전 제거 내용으로 대체한다. M-y 는 C-y 또는 M-y 를 먼저 사용한 후에만 사용할 수 있다.
M-y 는 킬 링에서 엔트리를 가리키는 "마지막 붙여넣기(last yank)" 포인터와 관련해 이해할 수 있겠다. 사용자가 제거할 때마다 "마지막 붙여넣기" 포인터는 링의 앞 부분에 새로 만들어진 엔트리로 이동한다. C-y 는 "마지막 붙여넣기" 포인터가 가리키는 엔트리를 붙여넣기한다. M-y 는 "마지막 붙여넣기" 포인터를 다른 엔트리로 이동시키고, 버퍼 내 텍스트는 일치하기 위해 변경된다. M-y 명령어를 충분히 사용하면 링의 어떤 엔트리든 포인터를 이동시킬 수 있으므로 버퍼 내 원하는 엔트리로 접근할 수 있다. 결국 포인터는 링의 끝으로 도달하며, 다음에 M-y 를 사용하면 첫 번째 엔트리로 다시 돌아간다.
M-y 는 "마지막 붙여넣기" 포인터를 링 주위로 이동시키지만 링 내에 엔트리 순서를 변경하진 않으며, 앞에서 가장 최근에 제거한 내용부터 시작해 기억하는 것 중에서 가장 오래된 제거까지 실행된다.
M-y 는 "마지막 붙여넣기" 포인터가 얼마나 많은 엔트리를 나아가는지 알려주는 수치적 인자를 취할 수 있다. 음의 인자는 포인터를 링의 앞을 향해 이동시키는데, 링의 앞부터 시작해 마지막 엔트리 "주변"으로 이동하여 그곳에서 계속 앞으로(forward) 나아간다.
사용자가 찾는 텍스트를 버퍼에 가져오게 되면 M-y 명령어 실행을 중단하여도 그곳에 머물 것이다. 킬 링 엔트리의 복사본에 불과하기 때문에 버퍼에서 편집한다 하더라도 링 안의 내용이 변경되지는 않는다. 새로운 제거가 발생하지 않는 이상 "마지막 붙여넣기" 포인터는 킬 링 안에 동일한 장소에 남아 있으므로 C-y 를 반복하면 이전과 동일한 제거 내용의 또 다른 복사본을 붙여넣을 것이다.
수치적 인자와 C-y 를 호출할 때에도 "마지막 붙여넣기" 포인터는 그것이 붙여넣은 엔트리로 설정한다.
제거 내용 덧붙이기
일반적으로는 제거(kill)마다 킬 링에서 새로운 엔트리를 민다(push). 하지만 한 행에서 두 개 또는 그 이상의 제거 명령어를 호출할 경우 텍스트를 단일 엔트리로 결합하여 한 번의 C-y 만으로 모든 텍스트를 제거 이전의 상태와 똑같이 하나의 단위로 붙여넣는다.
따라서 텍스트를 단위로서 붙여넣고 싶을 경우, 하나의 명령어로 모두 제거할 필요 없이 행 또는 워드를 모두 제거할 때까지 하나씩 차례로 제거하더라도 한 번에 모두 다시 가져올 수 있다.
포인트부터 앞으로 제거하는 명령어는 이전에 제거한 텍스트 끝에 추가한다. 포인트부터 뒤로 제거하는 명령어는 시작 부분에 텍스트를 추가한다. 이 방법을 이용하면 앞으로 또는 뒤로 제거하는 명령어들의 순서가 어떻든 제거된 텍스트를 재정렬하지 않고 하나의 엔트리로 놓게 된다. 수치적 인자는 제거를 덧붙이는(append) 순서를 바꾸지 않는다. 가령 버퍼가 *로 표시된 포인트와 함께 아래의 텍스트를 포함한다고 가정하자.
This is a line *of sample text.
M-d M-DEL M-d M-DEL 를 입력하여 전방과 후방으로 차례로 제거할 경우, 킬 링에 '
' 엔트리 하나와 버퍼에 '
'만 남게 된다. ('
'와 '
' 사이에 공백이 두 개인 것은 M-SPC 또는 M-q 를 이용해 제거할 수 있다.)
M-b M-b 를 이용해 두 워드만큼 다시 이동시키고, C-u M-d 를 이용해 네 개의 워드를 앞으로 모두 제거하여도 위와 동일한 텍스트를 제거할 수 있다. 이 접근법은 버퍼와 킬 링에서도 정확히 동일한 결과를 도출한다. M-f M-f C-u M-DEL 은 하나는 앞으로, 하나는 뒤로 동일한 텍스트를 제거하는데, 다시 말하지만 결과는 동일하다. 킬 링 엔트리 내에 텍스트는 항상 사용자가 버퍼에서 제거하기 전에 갖고 있던 순서와 동일하다.
제거 명령어가 (수치적 인자뿐만 아니라) 다른 명령어가 이용한 마지막 제거 명령어와 구분되어 있을 경우, 킬 링에서 새로운 엔트리를 시작한다. 하지만 바로 직전에 C-M-w (
)를 입력하면 마지막으로 제거한 텍스트와 강제로 결합시킬 수도 있다. C-M-w 는 다음에 제거 명령어가 따라올 경우 해당 명령어에게 제거를 이전 제거 순서의 일부로 취급하라고 알려준다. 늘 그렇듯 명령어가 앞으로 제거할 경우 이전에 제거된 텍스트 뒤에 킬이 추가되고, 명령어가 뒤로 제거할 경우에는 앞에 추가된다. 이 방식을 통해 사용자는 여러 개의 구분된 텍스트 조각을 제거하여 한 장소에 붙여넣을 수 있도록 누적시킬 수 있다.
M-w (
)에 따라오는 제거 명령어는 M-w 가 킬 링에 복사한 텍스트 뒤에 붙지 않는다.
그래픽 디스플레이에서 "자르고 붙여넣기" 연산
대부분의 그래픽 데스크톱 환경에서는 클립보드라는 시스템 기능을 이용해 여러 애플리케이션 간에 데이터(주로 텍스트)를 전달할 수 있다. X 에서는 두 가지 비슷한 기능을 이용할 수 있는데, 바로 일차 선택과 이차 선택이다. Emacs가 그래픽 디스플레이에서 실행될 때는 제거와 붙여넣기 명령어들이 이 기능들과 통합되므로 Emacs와 다른 그래픽 애플리케이션 간에 텍스트를 쉽게 전달할 수 있다.
기본적으로 Emacs는 프로그램 내 텍스트 전달에 UTF-8을 부호화 체계로 사용한다. 붙여넣은 텍스트가 사용자가 예상한 내용이 아닐 경우, C-x RET x 또는 C-x RET X 를 입력하여 다른 부호화 체계를 명시할 수 있다.
를 맞춤화하여 여러 데이터 유형을 요청할 수도 있다. 189 페이지의 19.10절 [통신 부호화]를 참고한다.
클립보드 사용하기
클립보드는 대부분 그래픽 애플리케이션이 "자르고 붙여넣는" 데에 사용하는 기능이다. 클립보드가 존재하면 Emacs에서 제거와 붙여넣기 명령어가 그것을 활용한다.
C-w (
)와 같은 명령어를 이용해 일부 텍스트를 제거하거나 M-w (
)와 같은 명령어를 이용해 킬 링으로 텍스트를 복사하면 텍스트가 클립보드에도 남는다.
Emacs 제거 명령어가 클립보드에 텍스트를 넣으면 기존 클립보드 내용은 보통 손실된다. 아니면
을
로 변경할 수도 있다. 그러면 Emacs는 먼저 클립보드를 킬 링에 저장하여 오래된 클립보드 데이터가 클 경우 메모리 소비량이 높아서 데이터를 손실하는 일이 없도록 해준다.
C-y (
)와 같은 붙여넣기 명령어들 역시 클립보드를 사용한다. 다른 애플리케이션에서 클립보드를 "소유"할 경우, 다시 말해 사용자가 Emacs에서 마지막으로 사용한 제거 명령어보다 최근에 텍스트를 자르거나 복사하였다면 Emacs는 킬 링 대신 클립보드에서 붙여넣기를 실행한다.
일반적으로 M-y (
)를 이용해 킬 링을 회전시키더라도 클립보드를 수정하지는 않는다. 하지만
을
로 변경하면 M-y 는 새로운 붙여넣기 내용을 클립보드에 저장한다.
제거 및 붙여넣기 명령어가 클립보드로 접근하지 못하도록 하기 위해서는
변수를
로 변경한다.
많은 X 데스크톱 환경들이 클립보드 관리자(clipboard manager)라는 기능을 지원한다. Emacs가 현재 클립보드 데이터의 "소유자"일 때 Emacs를 종료했는데 그 때 클립보드 관리자가 실행 중이라면 Emacs는 클립보드 데이터를 클립보드 관리자로 전달하여 손실을 막는다. 일부 경우에서는 이 때 Emacs를 종료 시 지연이 발생할 수도 있으니 Emacs가 클립보드 관리자로 데이터를 전송하지 못하도록 하려면
변수를
로 변경한다.
Emacs 24 이전에는 제거 및 붙여넣기 명령어가 클립보드가 아니라 일차 선택을 사용하였다(58 페이지의 9.3.2절 [일차 선택] 참고). 이러한 행위를 선호한다면
를
로,
를
로,
을
로 변경한다. 이런 경우 다음과 같은 명령어를 이용해 클립보드에서 명시적으로 작업할 수 있다:
은 영역을 제거하여 클립보드로 저장하고,
는 영역을 킬 링으로 복사하여 클립보드에 저장하며,
는 클립보드의 내용을 포인트에 붙여넣는다.
다른 애플리케이션과 자르고 붙여넣기
X Windows System 에는 X 애플리케이션에서 (주로 마우스 드래그로) 선택된 텍스트의 마지막 구간을 포함한 일차 선택이 존재한다. 보통 이 텍스트는 mouse-2 클릭을 통해 다른 X 애플리케이션으로 삽입 가능하다. 일차 선택은 클립보드와 구분된다. 일차 선택의 내용이 더 "취약"하다고 할 수 있는데, 마우스로 텍스트를 선택할 때마다 덮어쓰기가 되는 반면 클립보드는 꼭 "자르기" 또는 "붙여넣기" 명령어를 이용해야만 덮어쓰기가 가능하기 때문이다.
X에서는 영역이 활성화될 때마다 (45 페이지의 8장 [마크] 참고) 영역 내 텍스트가 일차 선택에 저장된다. 이는 드래그, 마우스 클릭 (162 페이지의 18.1절 [마우스 명령어] 참고), 키보드 명령어 (예: C-SPC 를 입력하고 포인트를 이동시킴으로써; 45 페이지의 8.1절 [마크 설정하기] 참고) 중에서 무엇을 이용해 영역을 선택하였는지와 상관없이 적용된다.
변수를
로 변경하면 Emacs는 일시적으로 활성화된 영역만 일차 선택으로 저장하는데, 가령 마우스 또는 시프트 선택을 이용해 만들어진 영역을 의미한다(49 페이지의 8.6절 [시프트 선택] 참고).
를
로 변경하면 Emacs는 활성 영역을 모두 일차 선택에 저장하는 행위를 피한다.
일차 선택 내용을 Emacs 버퍼로 삽입하기 위해서는 삽입하고자 하는 곳에서 mouse-2 (
)를 클릭한다. 162 페이지의 18.1절 [마우스 명령어]를 참고한다.
MS-Windows 는 일차 선택을 제공하지 않지만 Emacs는 선택된 텍스트를 내부적으로 저장함으로써 Emacs 단일 세션에서 그것을 모방한다. 따라서 일차 선택과 관련된 모든 기능과 명령어는 Windows에서 X의 경우와 동일하게 작업하므로 동일한 세션 내에서 자르고 붙여넣기가 가능하지만 다른 애플리케이션이나 Emacs 세션들 간 자르고 붙여넣기는 불가능하다.
이차 선택
X 윈도우 체제는 일차 선택에 더해 그와 유사한 기능인 이차 선택(secondary selection)을 제공하기도 한다. 최근에는 이차 선택을 사용하는 X 애플리케이션이 거의 없지만 다음과 같은 Emacs 명령어들을 이용해 접근할 수 있다.
M-Drag-Mouse-1 이차 선택 내용을 설정하되 한쪽 끝은 버튼을 누르는 위치에 두고 나머지 끝은 버튼 누름을 해제하는 위치에 둔다(
).
face를 이용하면 드래그하면서 선택된 텍스트가 강조된다.
와 마찬가지로 창의 상단이나 하단에서 마우스를 드래그하여 놓으면 창이 자동으로 스크롤된다(162 페이지의 18.1절 [마우스 명령어] 참고). 이 명령어는 킬 링을 수정하지 않는다.
M-Mouse-1 이차 선택의 한쪽 끝점(endpoint)을 설정한다(
).
M-Mouse-3 이차 선택 내용을 설정하되 한쪽 끝은 클릭한 위치에 두고 나머지 끝은 M-Mouse-1 (
)로 명시한 위치에 둔다. 이는 선택된 텍스트를 킬 링에 넣기도 한다. 동일한 위치에 M-Mouse-3 를 두 번째로 사용하면 방금 실행한 이차 선택 내용을 제거한다.
M-Mouse-2 이차 선택 내용을 클릭한 곳에 삽입하고, 붙여넣은 텍스트의 끝에 포인트를 위치시킨다(
).
M-Mouse-1 를 2번 또는 3번 클릭하면 M-Mouse-1 와 마찬가지로 워드와 행에 작업한다.
가
이 아닌 경우 M-Mouse-2 는 포인트에 붙여넣기를 실행한다. 그리고 나면 사용자가 정확히 어디를 클릭하는지 또는 사용자가 어떤 프레임의 창을 클릭하는지는 중요하지 않다. 162 페이지의 18.1절 [마우스 명령어]를 참고한다.
텍스트 누적하기
보통 우리는 텍스트를 제거하거나 붙임으로써 복사 또는 이동시키지만 편리하게 하나의 텍스트 블록을 여러 장소에 복사하거나 흩어진 여러 텍스트 블록을 하나의 장소로 복사하는 방법도 있다. 본문에서는 흩어져 있는 텍스트 조각을 버퍼나 파일로 누적하는 명령어를 설명하고자 한다.
M-x append-to-buffer 명시적 버퍼 내용 뒤에 영역을 추가한다.
M-x prepend-to-buffer 명시적 버퍼 내용 앞에 영역을 추가한다.
M-x copy-to-buffer 영역을 명시된 버퍼로 복사하고 버퍼의 오래된 내용은 제거한다.
M-x insert-buffer 명시된 버퍼의 내용을 현재 버퍼에서 포인트에 삽입한다.
M-x append-to-file 명시된 파일의 내용 맨 끝에 영역을 추가한다.
텍스트를 버퍼에서 누적하기 위해서는 M-x append-to-buffer 를 사용한다. 그러면 버퍼명을 읽고, 영역의 복사본을 명시된 버퍼로 삽입하게 된다. 존재하지 않는 버퍼를 명시할 경우
가 버퍼를 생성한다. 해당 버퍼 내에 포인트가 어디에 있든 그곳에 텍스트가 삽입된다. 편집에 버퍼를 사용해왔다면 복사된 텍스트는 당시 포인트가 있는 장소부터 시작해 버퍼의 텍스트 중간으로 이동한다.
해당 버퍼에서 포인트는 복사된 텍스트의 끝에 남겨지고, 잇따른
의 사용은 명시된 버퍼에 복사된 것과 동일한 순서로 텍스트를 누적시킨다. 엄밀히 말하자면
는 버퍼에 이미 존재하는 텍스트 뒤에 항상 추가하는 것은 아니며, 해당 버퍼에서 포인트가 끝에 존재할 때에만 뒤에 추가(append)된다. 하지만
가 버퍼의 수정에 사용하는 유일한 명령어일 경우 포인트는 항상 끝에 위치한다.
M-x prepend-to-buffer 명령어는 다른 버퍼의 포인트가 복사된 텍스트 앞에 남겨지므로 잇따라 prepending(앞에 덧붙이기)을 사용하면 역순으로 텍스트를 추가한다는 점만 제외하면
와 같다. M-x copy-to-buffer 도 비슷하지만 다른 버퍼에 존재하는 기존 텍스트가 삭제되므로 버퍼는 그 안에 새로 복사된 텍스트만 포함한 채 유지된다는 점에 차이가 있다.
M-x insert-buffer 명령어를 이용해 다른 버퍼로부터 누적된 텍스트를 인출할 수도 있다. 이를 위해서는 버퍼명을 입력해야 하며, 가져올 버퍼 내 모든 텍스트의 복사본을 현재 버퍼 내 포인트에 삽입하여 삽입된 텍스트의 시작 부분에 포인트를 남겨둔다. 뿐만 아니라 마크를 활성화하지 않고, 삽입된 텍스트 끝 위치를 마크 링으로 추가하기도 한다. 버퍼에 대한 배경 정보는 147 페이지의 16장 [버퍼]를 참고한다.
M-x append-to-file 을 이용하면 버퍼에 텍스트를 누적하는 대신 텍스트를 파일 뒤에 직접 추가할 수도 있다. 이를 위해서는 파일명을 입력해야 하는데, 그리고 나면 명시된 파일 끝에 영역의 텍스트가 추가된다. 파일은 디스크 상에서 즉시 변경된다.
은 Emacs에서 방문하지 않는 파일에 대해서만 사용해야 한다. 만약 Emacs에서 편집 중인 파일에 사용할 경우 Emacs 몰래 파일을 변경시켜 편집의 일부가 손상될 것이다.
주변 텍스트를 이동시키는 또 다른 방법으로 레지스터에 저장하는 방법이 있다. 64 페이지의 10장[레지스터]를 참고한다.
직사각형
직사각형(Rectangle) 명령어는 텍스트의 직사각형 영역에 작업하며, 행의 특정 범위 내에서 특정 한 쌍의 열 사이에 위치한 모든 문자를 대상으로 한다. Emacs는 직사각형을 제거하거나, 제거된 직사각형을 붙여넣거나, 직사각형을 없애고 공백이나 텍스트로 채우거나, 직사각형을 삭제하는 명령어를 갖고 있다. 직사각형 명령어들은 다중 열 포맷의 텍스트와 그러한 포맷 내외에서 텍스트를 변경하는 데에 유용하다.
작업할 명령어에 대한 직사각형을 명시하기 위해서는 한쪽 가장자리에 마크를, 반대쪽 가장자리에 포인트를 설정한다. 따라서 명시된 직사각형을 직사각형 영역(region-rectangle)이라고 부른다. 포인트와 마크가 동일한 열에 있을 경우 직사각형 영역은 비어 있게 된다. 동일한 행에 위치한다면 직사각형 영역은 하나의 행 높이가 된다.
직사각형 영역은 영역과 거의 동일한 방식으로 제어된다. 하지만 포인트와 마크 값의 주어진 조합은 그것을 사용하는 명령어에 따라 영역 또는 직사각형으로 해석할 수 있다.
C-x r k 직사각형 영역의 텍스트를 제거하고 그 내용은 "last killed rectangle(마지막으로 제거한 직사각형)"로 저장한다(
).
C-x r M-w 직사각형 영역의 텍스트를 "last killed rectangle" 로 저장한다(
).
C-x r d 직사각형 영역의 텍스트를 삭제한다(
).
C-x r y 마지막으로 제거한 직사각형을 포인트에 상단 좌측 가장자리에 붙여넣는다(
).
C-x r o 직사각형 영역의 공간을 채우기 위해 빈 칸을 삽입한다(
). 직사각형 영역의 기존 내용은 오른쪽으로 민다.
C-x r N 직사각형 영역의 왼쪽 가장자리를 따라 행 번호를 삽입한다(
). 직사각형 영역의 기존 내용은 오른쪽으로 민다.
C-x r c 직사각형 영역의 내용을 공백으로 대체하여 직사각형 영역을 비운다(
).
M-x delete-whitespace-rectangle 직사각형의 왼쪽 가장자리부터 열부터 시작해 명시된 직사각형 위의 각 행에 여백을 삭제한다.
C-x r t string RET 직사각형 내용을 각 행의 문자열로 대체한다(
).
M-x string-insert-rectangle RET string RET 직사각형의 각 행에 문자열을 삽입한다.
C-x SPC Rectangle Mark 모드를 토글한다(
). 이 모드가 활성화되면 직사각형 영역이 강조되고 축소/확대가 가능하며, 표준 제거 및 붙여넣기 명령어가 작업할 것이다.
직사각형 연산은 두 가지로 분류되는데, 하나는 직사각형을 제거하거나 삽입하는 명령어들이고 나머지는 빈 직사각형을 만드는 명령어들이다.
직사각형 내에 텍스트를 제거하는 방법에는 두 가지가 있는데, C-x r d (
)는 텍스트를 완전히 삭제하고, C-x r k (
)는 텍스트를 제거하여 last killed rectangle로 저장한다. 두 경우 모두 직사각형 영역의 제거는 직사각형의 각 행에서 명시된 텍스트를 제거하는 것과 같으므로 해당 행에서 뒤에 텍스트가 존재할 경우 공간을 채우기 위해 뒤로(backwards) 이동한다.
직사각형을 "제거(Killing)"하는 것은 일반적인 제거의 의미와는 다른데, 직사각형이 킬 링에 저장되지 않고 가장 최근에 제거된 직사각형만 기록하는 특별한 장소에 저장된다는 이유 때문이다. 이는 직사각형의 붙여넣기(yanking)는 여러 붙여넣기 명령어들이 사용되는 선형 텍스트의 붙여넣기와는 상당히 다르기 때문이다. 직사각형에 대한 yank-popping 은 정의되지 않는다.
C-x r M-w (
)는 직사각형을 대상으로 한 M-w 와 같다고 볼 수 있는데, 버퍼로부터 텍스트를 제거하지 않고 직사각형을 "last killed rectangle"로서 기록한다.
마지막으로 제거된 직사각형을 붙여넣기 위해서는 C-x r y (
)라고 입력한다. 직사각형의 첫 행은 포인트에 삽입되고, 직사각형의 두 번째 행은 동일한 수평 위치에서 수직으로 한 행 아래에 삽입되는 식이다. 영향을 받는 행의 수는 저장된 직사각형의 높이로 결정된다.
예를 들면, 단일 열로 목록들 중 하나를 직사각형으로서 제거한 후 다른 목록 옆에 붙여넣을 경우, 두 개의 단일 열 목록을 이중 열 목록으로 변환할 수 있다.
C-x r r r 과 C-x r i r 을 이용해 직사각형을 레지스터 안팎으로 복사할 수도 있다. 관련 내용은 65 페이지의 10.3절 [직사각형 레지스터]를 참고한다.
빈 직사각형을 만드는 데에는 두 가지 명령어를 이용할 수 있는데, C-x r c (
)는 직사각형 영역에 있는 기존 텍스트를 비우고, C-x r o (
)는 빈 직사각형을 삽입한다.
M-x delete-whitespace-rectangle 은 특정 열부터 시작해 수평으로 여백을 삭제한다. 이는 직사각형 안의 각 행마다 적용되며, 열은 직사각형의 왼쪽 가장자리로 명시된다. 직사각형의 오른쪽 가장자리는 이 명령어에 영향을 미치지 않는다.
C-x r N (
) 명령어는 직사각형 영역의 왼쪽 가장자리를 따라 행 번호를 삽입한다. 일반적으로 번호 매기기는 1(직사각형의 첫 행)부터 시작한다. 해당 명령어는 접두 인자와 함께 시작해야 할 번호와 숫자를 출력할 포맷 문자열을 입력하도록 요구한다(The Emacs Lisp Reference Manual의 "Formatting Strings" 절 참고).
C-x r t (
) 명령어는 직사각형 영역 내용을 각 행마다 하나의 문자열로 대체한다. 문자열의 너비가 직사각형의 너비와 동일할 필요는 없다. 문자열 너비가 짧을 경우 직사각형 이후의 텍스트는 왼쪽으로 전환되고 문자열이 직사각형보다 길 경우 직사각형 이후의 텍스트는 오른쪽으로 전환된다.
M-x string-insert-rectangle 명령어는
와 유사하지만 각 행에서 문자열을 삽입하여 원본 텍스트를 오른쪽으로 이동시킨다.
C-x SPC (
)명령어는 직사각형 영역 또는 표준 영역의 강조 여부를 토글한다(필요 시 영역을 먼저 활성화하여). 이 모드가 활성화되면 영역의 크기를 조정하는 명령어들은 (C-f, C-n 등) 직사각형과 같은 방식으로 실행하고, 제거와 붙이기 작업이 직사각형에서 실행된다. 52 페이지의 9장 [제거하기]를 참고한다. 모드는 영역이 활성화되었을 때에만 지속된다.
CUA 바인딩
M-x cua-mode 명령어는 다른 많은 애플리케이션에서 사용되는 일반 사용자 접근(CUA; Common User Access)과 호환되는 키 바인딩을 설정한다.
CUA 가 활성화되면 C-x, C-c, C-v, C-z 키들은 각각 자르기(제거), 복사하기, 붙여넣기, 실행취소하기를 실행하는 명령어를 호출한다. C-x 와 C-c 는 영역이 활성화되어 있을 때만 자르기와 붙여넣기를 수행한다. 영역이 활성화되지 않았다면 접두 키 역할을 하여 C-x C-c 와 같은 표준 Emacs 명령어가 작동한다. 다시 말해
변수는 C-x 와 C-c 에 효과가 없다는 의미다(47 페이지의 8.3절 [영역 사용하기] 참고).
마크가 활성화되어 있을 때 C-x C-f 와 같은 Emacs 명령어를 입력하기 위해서는 시프트 키를 누르면서 접두 키를 누르거나 (예: S-C-x C-f) 접두 키를 빠르게 두 번 입력하는(C-x C-x C-f) 방법을 사용할 수 있다.
표준 Emacs 바인딩을 CUA 모드로 오버라이딩하는 기능을 비활성화하고 아래 설명된 CUA 모드의 다른 기능을 유지하기 위해서는
변수를
로 설정한다.
CUA 모드는 기본적으로 Delete-Selection 모드를 활성화하므로 (162 페이지의 18.1절 [마우스 명령어] 참고) 타이핑한 텍스트가 활성 영역을 대체한다. 이러한 행위 없이 CUA 를 사용하기 위해서는
변수를
로 설정한다.
CUA 모드는 시각적 직사각형 하이라이트와 함께 향상된 직사각형 지원을 제공한다. C-RET 를 이용해 사각형을 시작하고, 이동 명령어를 이용해 확장시키며, C-x 또는 C-c 를 이용해 자르기 또는 붙여넣기를 실행한다. RET은 직사각형의 (시계방향으로) 다음 가장자리로 커서를 이동시키므로 원하는 방향으로 쉽게 확장이 가능하다. 사용자가 입력하는 일반 텍스트는 직사각형 (커서와 동일한 면에서) 내에 동일한 행의 좌측이나 우측으로 삽입된다.
명령어를 호출함으로써 CUA를 활성화하지 않고 직사각형 지원을 사용할 수도 있다. 하지만 표준
를 참고한다. 또한 60 페이지의 9.5절 [직사각형]을 참고한다.
CUA 를 이용하면 명령어를 제거, 복사, 붙여넣을 한 자리 숫자로 된 수치적 접두어를 제공함으로써 텍스트와 직사각형을 쉽게 복사할 수 있는데, 가령 C-1 C-c 는 영역을 레지스터 1로 복사하고, C-2 C-v 는 레지스터 2의 내용을 붙여넣는다.
CUA 모드는 버퍼 간에 텍스트의 손쉬운 이동과 복사를 허용하는 전역적 마크 기능도 갖고 있다. C-S-SPC 를 이용해 전역적 마크를 켜고 끄는 기능을 토글한다. 전역적 마크가 켜져 있을 때에는 사용자가 제거하거나 복사하는 모든 텍스트가 전역적 마크에 자동으로 삽입되고, 사용자가 입력하는 텍스트는 현재 위치보다는 전역적 마크에 삽입된다.
예를 들어, 다양한 버퍼의 워드를 주어진 버퍼 내 워드 목록으로 복사하기 위해서는 목표 버퍼 내에 전역적 마크를 설정하고, 목록에서 원하는 워드마다 검색하여 표시한 후(예: S-M-f 이용) C-c 또는 M-w 를 이용해 목록으로 복사하고, RET 를 눌러 목표 목록에서 워드 다음에 새 행을 삽입한다.