
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-command | M-x |
| Next-line | C-n |
| Previous-line | C-p |
| Forward-char | C-f |
| Backward-car | C-b |
| iSearch-forward | C-s |
연상법은 기억에 효과적이다. 명령 이름을 기억한다면 키 바인딩도 기억하기 쉽다.
이맥스의 여러 이동 명령에는 일관된 규칙이 있다. 예를 들어 이동 단위에 따라 다음처럼 키가 배정된다.
| 명령 | 키 바인딩 |
|---|---|
| forward-char | C-f |
| forward-word | M-f |
| forward-sexp | C-M-f |
어떤 항목의 끝으로 이동하는 명령도 비슷한 방식으로 묶인다.
| 명령 | 키 바인딩 |
|---|---|
| move-end-of-line | C-e |
| forward-sentence | M-e |
| end-of-defun | C-M-e |
커서 양쪽의 텍스트 순서를 바꾸는 명령은 다음과 같다.
| 명령 | 키 바인딩 |
|---|---|
| transpose-chars | C-t |
| transpose-words | M-t |
| transpose-sexps | C-M-t |
텍스트를 잘라내는 명령에도 같은 규칙이 적용된다.
| 명령 | 키 바인딩 |
|---|---|
| kill-line | C-k |
| kill-sentence | M-k |
| kill-sexp | C-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 요소 순서를 바꾸는 명령에 다시 지정한다.
규칙을 이해하면 언제 따르고 언제 바꿀지 알 수 있다. 그러면 구루 테스트를 통과하는 데도 한 걸음 가까워진다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요