Emacs
Table of Contents
1. 왜
Emacs가 좋다
vim을 쓰다보면 vim-binding과 유사한 키 스트로크를 채용한 TUI 프로그램을 쓰고 싶은 욕망에 휩싸인다. 그런데 그러한 프로그램들은 독립적인 프로그램이라 vim과 별도로 단축키를 할당해주고 관리해주어야한다.
3. 이맥스 배워보기
- 플러그인 없이 만들어진 의도대로 써보기
- org-mode 써보면서 불편한 점 정리하기
- meow에 적응하기
3.1. 플러그인 없이 일단 만들어진 의도대로 써보기
아래 명령어로 터미널에서 아무 설정 없이 실행할 수 있다.
emacs -nw -Q
그 후 M-x help-with-tutorial 하여 튜토리얼을 해본다. 아래의 것들을 배운다:
| 카테고리 | 키 바인딩 | 설명 |
|---|---|---|
| 화면 이동 | C-v | 다음 화면으로 이동 |
| M-v | 이전 화면으로 이동 | |
| C-l | 현재 커서 위치를 화면 중앙으로 이동 | |
| M-< | 버퍼의 시작으로 이동 | |
| M-> | 버퍼의 끝으로 이동 | |
| 커서 이동 | C-f | 한 문자 앞으로 |
| C-b | 한 문자 뒤로 | |
| C-n | 다음 줄로 | |
| C-p | 이전 줄로 | |
| C-a | 줄의 시작으로 | |
| C-e | 줄의 끝으로 | |
| M-f | 한 단어 앞으로 | |
| M-b | 한 단어 뒤로 | |
| 편집 | C-d | 커서 위치의 문자 삭제 |
| M-d | 커서 위치부터 단어 끝까지 삭제 | |
| C-k | 커서 위치부터 줄 끝까지 삭제 | |
| M-/ | 단어 자동 완성 | |
| 복사/붙여넣기 | C-SPC | 영역 선택 시작 |
| C-w | 선택 영역 잘라내기(“죽이기”) | |
| M-w | 선택 영역 복사 | |
| C-y | 붙여넣기 | |
| M-y | C-y 다음에 사용하면 이전 잘라낸 내용 차례로 불러옴 | |
| C-x u | 무르기 | |
| 버퍼 | C-x C-b | 버퍼 목록 보기 |
| C-x b | 버퍼 전환 | |
| C-x k | 현재 버퍼 닫기 | |
| C-x C-f | 파일 찾기 (새 버퍼 열기) | |
| C-x C-s | 현재 파일 저장 | |
| C-x s | 열린 모든 파일 저장 | |
| 찾기/바꾸기 | C-s | 앞으로 찾기 |
| C-r | 뒤로 찾기 | |
| M-% | 찾아 바꾸기 | |
| C-M-s | 정규표현식으로 찾기 | |
| 윈도우 | C-x 0 | 현재 윈도우 닫기 |
| C-x 1 | 현재 윈도우만 남기고 다른 윈도우 닫기 | |
| C-x 2 | 윈도우 가로 분할 | |
| C-x 3 | 윈도우 세로 분할 | |
| C-x o | 다른 윈도우로 커서 이동 | |
| 도움말 | C-h | 도움말 명령 시작 |
| C-h c | 단축키의 기능 이름 간단히 보기 (describe-key-briefly) | |
| C-h k | 단축키에 대한 자세한 설명 보기 (describe-key) | |
| C-h f | 함수에 대한 설명 보기 (describe-function) | |
| C-h v | 변수에 대한 설명 보기 (describe-variable) | |
| C-h a | 명령어 검색 (apropos) | |
| C-h i | Info 문서 열기 | |
| 기타 | C-g | 명령 취소 |
| M-x | 명령어 이름으로 실행 | |
| C-u [숫자] | 다음 명령에 인자 전달 | |
| C-x C-c | Emacs 종료 |
3.2. org-mode 써보기
org-mode를 써서 이맥스를 배우며 메모하기.
- 쓰면서 배운 키들 (익숙해지기 전까지는 종종 봐야함)
- 쓰면서 불편한 것들 체크해서 나중에 고치기
- 쓰면서 어떻게 하는지 잘 모르겠는 필요한 기능들 체크하기
일단은 org-mode에 대단한 기능을 기대하지는 않고, 간단한 마크업 정도만 익혀서 쓰는 중.
3.3. 스타트 키트 깔아보기
- 깔아봤는데 그냥 내가 쓰는 게 낫겠다.
- 속도 튜닝 같은 거랑 유용한 플러그인만 빼먹고 키맵은 내가 설정하자
4. 이렇게 쓰자
- 기본 모달 에디팅: meow
- 근데 이제 helixy하게 config를 바꿔서
- helix의 키맵은 고민을 많이 해두었다.
- 언어는 tree-sitter + LSP + REPL
- SPC 모드
- SPC p 프로젝트
- SPC b 버퍼
- SPC c 코드
- SPC g 깃
- SPC s 셸
- SPC f 찾기 s 심볼 f 파일 이름 / 파일 내용 머 이런 식으루다가
- SPC SPC 하면 god-mode
5. 미립자 팁
5.1. org-mode에서 meow 숫자 오버레이 보기
아래처럼 meow-expand-exclude-mode-list에서 org-mode를 제외해주면 된다.
(use-package meow │ :demand │ :after general │ :config │ (setq meow-expand-exclude-mode-list '(markdown-mode)) │ │ (meow-setup) │ │ (meow-global-mode 1))
5.2. org-mode에서 인라인 마크업 뒤에 조사 붙이기
org-mode의 인라인 마크업은 기본적으로 단어 단위이다. 마크업 뒤에는 특수문자만 허용된다. 그래서 아래처럼 조사가 붙는 경우, 강조가 되지 않는다.
│ 이 *부분*은 매우 중요하다
아래를 설정해주면 마크업 뒤에 조사가 붙어도 괜찮다.
│ (defun nyeong/modify-org-inline-markup-rules () │ "인라인 마크업 뒤에 조사를 붙일 수 있도록 허용" │ │ (setcar org-emphasis-regexp-components " \t('\"{[:multibyte:]") │ │ (setcar (nthcdr 1 org-emphasis-regexp-components) "[:multibyte:]- \t.,:!?;'\")}\\") │ │ (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)) │ │ │ ;; 위 함수가 org-mode가 불러와진 후 실행되도록 등록 │ (with-eval-after-load 'org │ │ (nyeong/modify-org-inline-markup-rules))
6. 불편한 점
[ ]버퍼 관리[ ]현재 열려 있는 버퍼 보기가 불편함 (C-x b랑C-x C-b쓰고 있긴 한데 키조합이 외우기 어렵다)[ ]그냥C-바인딩 자체가 home-row-mode 쓰는 게 아니면 불편하다[ ]meow의 SPC(god-mode) 쓰고 있긴 한데, 제일 중요한 SPC키를 내 맘대로 못 쓰니 별로임
[ ]프로젝트 관리[ ]프로젝트 전환을 어떻게 해야할 지 모르겠음
[ ]meow[ ]줄 처음과 끝에 삽입할 때 한 번에 하기가 불편함 (vim의I 와 =A)- 지금은
C-a,C-e로 이동 후에a,i로 편집하는 중
- 지금은
[ ]org-mode[ ]새 파일 만들 때 레이아웃 자동으로 잡아주면 좋겠음[ ]C-<enter>누르면 지금 위계에서 새 줄을 추가해주면 좋겠음 (이 줄에서 누르면 리스트 아이템을 추가)
7. 참고
7.1. 튜토리얼
- Master Emacs in one year
- Xah Emacs Tutorial
- Mastering Key Bindings Emacs
- Emergency Elisp
- Mastering Emacs
- Emacs Starter Guide
다들 밑바닥부터 시작하지 말고 셋업 쓰라고 난리임:
7.2. 다른 사람의 emacs.d
- purcell/emacs.d corfu, vertio, eglot, docker.el, projectile, …
- Centaur Emacs require init 패턴?이나 최적화 패턴
- turbana/emacs-config 설명이 잘 적혀있어서 보기 좋음
- Emacs literate configuration 설명 잘 적혀 있어서 (이하 생략)
- SystemCrafters/crafted-emacs
- Emacs Config From Scratch 시리즈 시리즈로 차분히 하나씩 설명해줘서 보기 좋음
- https://systemcrafters.net/live-streams/april-21-2023/
- Doom Emacs가
- 너무 evil-mode 키 바인딩에 최적화되어있음
- 커스텀하기에는 자체적인 게 너무 많음
- 그래서 purcell/emacs.d를 쓰기로 함
- Doom Emacs가