원문 캡처 · wilfred.me.uk
원문 캡처 · wilfred.me.uk

Control 키를 누른 채 이맥스(Emacs)에 이름을 입력한다고 상상해 보자. 무슨 일이 일어날지 설명할 수 있는가?

— ‘이맥스 구루 테스트’

이맥스 단축키인 키 바인딩(key binding)은 초보자에게 터무니없어 보일 수 있다. 이맥스 사용자 중에는 사용을 시작하자마자 키 바인딩을 바꿔야 한다고 주장하는 사람도 있다.

하지만 그럴 필요는 없다. 이 글은 이맥스 키 바인딩의 규칙을 설명한다. 이를 알면 구루 테스트를 통과하는 데 한 걸음 가까워질 뿐 아니라, 기본 설정 중 일부가 마음에 들 수도 있다.

키 바인딩은 얼마나 많은가

이맥스에는 키 바인딩이 아주 많다.

ELISP> (length global-map) 143

이맥스는 모달 편집기이므로 대부분의 키 바인딩은 모드별로 다르다. 하지만 현재 이맥스 인스턴스에는 어디서나 작동하는 전역 단축키가 100개 넘게 있다.

키맵은 중첩된 자료 구조이므로 실제 개수는 이보다 많다. 예를 들어 C-h C-h와 C-h f는 각각 따로 세지 않는다.

이 숫자도 키 바인딩을 지정할 수 있는 명령의 수에 비하면 일부에 불과하다.

ELISP> (let ((total 0)) (mapatoms (lambda (sym) (when (commandp sym) (setq total (1+ total))))) total) 8612

이 많은 명령을 어떻게 정리할 수 있을까?

이름과 규칙으로 익히기

기본 명령에는 명령 이름을 바탕으로 키 바인딩을 정하는 경우가 많다. 아래 명령은 모두 이맥스 튜토리얼에서 다룬다.

명령키 바인딩
eXecute-extended-commandM-x
Next-lineC-n
Previous-lineC-p
Forward-charC-f
Backward-carC-b
iSearch-forwardC-s

연상법은 기억에 효과적이다. 명령 이름을 기억한다면 키 바인딩도 기억하기 쉽다.

이맥스의 여러 이동 명령에는 일관된 규칙이 있다. 예를 들어 이동 단위에 따라 다음처럼 키가 배정된다.

명령키 바인딩
forward-charC-f
forward-wordM-f
forward-sexpC-M-f

어떤 항목의 끝으로 이동하는 명령도 비슷한 방식으로 묶인다.

명령키 바인딩
move-end-of-lineC-e
forward-sentenceM-e
end-of-defunC-M-e

커서 양쪽의 텍스트 순서를 바꾸는 명령은 다음과 같다.

명령키 바인딩
transpose-charsC-t
transpose-wordsM-t
transpose-sexpsC-M-t

텍스트를 잘라내는 명령에도 같은 규칙이 적용된다.

명령키 바인딩
kill-lineC-k
kill-sentenceM-k
kill-sexpC-M-k

규칙이 보이는가?

보통 C-로 시작하는 명령은 작은 단위의 단순한 텍스트 작업을 한다. M- 명령은 더 큰 단위를 다루며, 대개 단어를 대상으로 한다.

C-M- 명령은 조금 더 특별하다. 코드의 구조를 이해하고 표현식 전체를 대상으로 작업한다. 이맥스는 이를 ‘sexp’(s-expression)라고 부르지만, 이런 명령은 대체로 어떤 프로그래밍 언어에서도 작동한다.

키 바인딩 찾기

C-a를 누르면 어떤 일이 일어날까? 이맥스에 물어볼 수 있다. C-h k C-a를 입력하면 실행되는 명령을 정확히 보여준다.

키 바인딩을 모른 채 명령을 사용하면 이맥스가 해당 단축키가 있다고 알려주기도 한다.

반대로 어떤 동작을 실행한 뒤 무슨 명령이었는지 확인할 수도 있다. C-h l은 실행된 명령과 이를 작동시킨 키를 보여준다.

이맥스의 키 바인딩이 다른 이유

이맥스의 키 바인딩은 왜 다른 프로그램의 일반적인 단축키와 다를까? 왜 다른 프로그램처럼 C-c로 텍스트를 클립보드에 복사하지 않을까?

이맥스는 클립보드 관련 명령에 연상 가능한 이름을 쓴다. 텍스트를 ‘kill’하고 ‘yank’하므로 키 바인딩은 C-k와 C-y다. 원한다면 cua-mode를 사용해 C-x가 익숙한 방식으로 작동하게 할 수 있다.

이맥스 명령은 활용 범위가 넓고 일반적이라 C-x, C-c, C-v 같은 일반적인 단축키만으로 모두 처리하기 어렵다. 이맥스에는 클립보드 관련 명령이 네 가지 있다.

  • kill: 텍스트를 지우고 kill-ring에 넣는다. 클립보드에서 잘라내는 것과 비슷하지만, 여러 항목을 연달아 저장할 수 있고 이맥스가 각 항목을 기억한다.
  • kill-ring-save: 선택한 텍스트를 kill-ring에 복사한다. 클립보드 복사와 비슷하며, 여러 항목을 연달아 저장할 수 있다.
  • yank: kill-ring의 텍스트를 삽입한다. 클립보드 붙여넣기와 비슷하다.
  • yank-pop: 앞서 붙여넣은 텍스트를 kill-ring의 다음 항목으로 바꾼다. 항목 하나만 저장하는 클립보드에는 이에 해당하는 기능이 없다.

이맥스 명령은 범용적이어서 모든 명령에 키 바인딩을 지정하기 어렵다. 그래서 단축키가 조금 길어지는 경우가 있다. 예를 들어 파일을 여는 키는 C-x C-f로, 다른 프로그램의 C-o보다 한 번 더 눌러야 한다.

개인 키 바인딩 지정하기

이미 많은 키 바인딩이 정해져 있다면 자주 쓰는 명령에는 어떤 키를 지정하면 좋을까?

IP 주소의 192.168.x.x 대역이 사적인 용도로 예약되어 있듯, 이맥스에도 사용자 설정을 위해 예약된 키가 있다. C-c a처럼 C-c와 문자 하나를 조합한 키 시퀀스는 모두 사용자가 설정할 수 있고, <F5>부터 <F9>까지도 예약되어 있다.

예를 들어 imenu를 자주 쓴다면 C-c i에 지정할 수 있다.

(global-set-key (kbd "C-c i") #'imenu)

규칙을 따르거나 바꾸기

키 바인딩을 절대 바꾸지 말라는 뜻은 아니다. 이맥스 사용자들은 독특한 방식이나 멋진 방법으로 키를 매핑하기도 한다.

이맥스는 이런 변경도 고려한다. 기본 키 바인딩을 바꾼 뒤 튜토리얼을 열면 변경 사항에 맞춰 내용도 갱신된다.

이맥스를 익히는 핵심은 모든 기능이 스스로를 설명한다는 점을 기억하는 것이다. 도움말 명령을 익혀 기본 키 바인딩이 있는 명령을 찾아보자. 새 키 바인딩을 만들거나 기존 설정을 덮어쓸 때는 기존 규칙을 따르는 것도 좋다. 예를 들어 org-mode는 C-M-t를 Org 요소 순서를 바꾸는 명령에 다시 지정한다.

규칙을 이해하면 언제 따르고 언제 바꿀지 알 수 있다. 그러면 구루 테스트를 통과하는 데도 한 걸음 가까워진다.