Emacs 31에서 이미 매일 쓰는 변화들
1 day ago
4
- Emacs 31은 정식 출시 전이지만 emacs-31 브랜치와 master에서 이미 체감 가능한 변화가 쌓이고 있으며, 여러 설정이 외부 패키지 없이 Emacs 코어만으로 해결되는 방향으로 이동함
- Tree-sitter 자동 전환·문법 설치가 들어오면서 주요 모드와 문법 소스 설정을 직접 관리하던 부담이 줄어듦
- markdown-ts-mode, Eglot 문서 렌더링, eldoc-help-at-pt, eager completion, xref-edit-mode는 편집·탐색·문서 확인 흐름을 내장 기능 중심으로 강화함
- Speedbar side window, VC 자동 숨김, ERC 로그 조건, kill-region-dwim, ielm-history-file-name, native-comp-async-on-battery-power 같은 작은 옵션들이 반복적인 마찰을 줄임
- Emacs 31의 기능명과 기본값은 아직 바뀔 수 있고, markdown-ts-mode와 이를 쓰는 Eglot 문서 렌더링은 실험적 기능이라 명시적으로 켜야 함
Emacs 31 프리뷰의 전제
- Emacs 31은 아직 출시 전이며, 기준 환경은 2026년 중반에 emacs-31 브랜치와 master를 빌드해 쓰는 구성임
- 소개된 항목들은 실제 일상 설정에 들어간 변경이며, 대부분 Emacs 코어에 들어왔거나 그에 가까운 상태임
- 기능명과 기본값은 최종 릴리스 전까지 바뀔 수 있음
- 설정 예시는 Emacs Solo의 init.el에서 ; EMACS-31 주석으로 확인할 수 있음
Tree-sitter 설정 감소
- Emacs 31에서는 두 옵션으로 Tree-sitter 기반 모드 전환과 문법 설치 흐름이 단순해짐
- treesit-enabled-modes t
- treesit-auto-install-grammar t
- treesit-enabled-modes를 t로 두면 Tree-sitter 변형이 있는 주요 모드를 해당 모드로 전환함
- treesit-auto-install-grammar는 문법이 없을 때 오류만 내지 않고, Emacs가 문법을 가져와 빌드하도록 제안함
- TypeScript, TSX, Rust, TOML, YAML, Dockerfile 같은 언어의 문법 소스가 모드 안에 들어가면서 treesit-language-source-alist에 URL과 경로를 직접 넣던 설정을 줄일 수 있음
- 여러 아키텍처에서 공유 Emacs 디렉터리를 쓰는 경우에는 주의가 필요함
- 자동 설치된 문법은 아키텍처별로 분리되지 않음
- x86_64용 .so와 arm64용 .so가 같은 이름 아래 놓여, 한 머신에서 빌드한 바이너리가 다른 머신에서 로드되지 않을 수 있음
내장 markdown-ts-mode
- Emacs 31에는 실험적 markdown-ts-mode가 포함됨
- 이 모드는 2025년 초 emacs-devel에 보낸 제안에서 시작됐고, 이후 Stéphane Marks가 공동 작성자로 참여해 개선을 이어감
- Markdown을 단순 구문 강조 대상이 아니라 쓰고 읽기 편한 편집 환경에 가깝게 다룸
- Org 사용자에게 익숙한 헤딩 이동, 접기, 구조 요소 이동 방식을 제공함
- fenced code block은 평면 고정폭 텍스트가 아니라 해당 언어의 실제 major mode로 font-locking됨
- Emacs Lisp 블록과 다른 내장 모드도 실제 구문 강조를 받을 수 있음
- 코드 블록 편집 명령도 상당 부분 동작하지만, 블록 안 완성 기능은 아직 거친 부분이 남아 있음
- 이미지 링크는 버퍼 안에 인라인으로 렌더링됨
- 아직 auto-mode-alist에 연결되지 않아 .md 파일을 자동으로 가져가지 않음
- M-x load-library RET markdown-ts-mode로 라이브러리를 로드한 뒤 버퍼에서 켤 수 있음
- 직접 auto-mode-alist에 추가하는 방식도 가능함
- 피드백은 bug list에 M-x report-emacs-bug로 보낼 수 있음
- 추가 스크린샷은 markdown-ts-mode-lab demo에 있음
Eglot, Eldoc, completion 개선
- Eglot은 Emacs 31에서 LSP 문서를 markdown-ts-view-mode로 렌더링할 수 있음
- eglot-documentation-renderer 'markdown-ts-view-mode
- formatted hover docs를 외부 패키지 없이 볼 수 있음
- 이 기능은 markdown-ts-mode에 의존하므로 마찬가지로 실험적임
- eglot-code-action-indications로 새 inline code action 힌트를 끌 수 있음
- 일부 language server에서는 힌트가 시끄럽게 느껴질 수 있음
- eglot-events-buffer-size는 eglot-events-buffer-config로 대체되는 중임
- eldoc-help-at-pt t는 커서 아래 항목의 도움말을 별도 호출 없이 보여줌
- eldoc-echo-area-prefer-doc-buffer와 함께 쓰면 낯선 코드를 탐색할 때 안내가 늘어남
- completion 관련 새 설정은 입력 중 UI를 더 적극적으로 갱신함
- completion-eager-update t
- completion-eager-display 'auto
- minibuffer-visible-completions 'up-down
- completion-eager-update와 completion-eager-display는 사용자가 요청하기 전에도 입력에 맞춰 completion UI를 갱신함
- minibuffer-visible-completions를 'up-down으로 설정하면 보이는 후보를 화살표 키로 이동할 수 있음
- icomplete에는 bug#75784 패치가 포함돼 vertical in-buffer 동작과 prefix indicator가 들어감
- icomplete-vertical-in-buffer-adjust-list
- icomplete-vertical-render-prefix-indicator
창 배치와 Speedbar
- Emacs 31에는 창을 직접 다시 쪼개고 닫지 않아도 배치를 바꾸는 명령들이 추가됨
- window-layout-transpose
- window-layout-rotate-clockwise
- window-layout-flip-leftright
- window-layout-flip-topdown
- transpose는 가로·세로 배열을 바꾸고, rotate는 전체 레이아웃을 회전시키며, flip 명령은 좌우 또는 상하로 미러링함
- 버퍼를 유지한 채 3창 구성에서 편집기 창 위치만 바꾸고 싶을 때 유용함
- Speedbar는 Emacs 31에서 별도 frame 대신 side window 안에 배치될 수 있음
- speedbar-window-default-width
- speedbar-window-max-width
- speedbar-window
- speedbar-window는 Speedbar를 현대적인 파일 트리처럼 옆에 dock함
- tiling 환경이나 단일 모니터 노트북에서는 기존 floating frame보다 side window 방식이 더 잘 맞음
VC와 editable xref
- VC에는 일상적인 버전 관리 흐름을 줄여주는 설정들이 들어감
- vc-auto-revert-mode t
- vc-allow-rewriting-published-history t
- vc-dir-auto-hide-up-to-date 'revert
- vc-dir-auto-hide-up-to-date는 vc-dir 버퍼를 새로고침할 때 최신 상태 파일을 자동으로 숨김
- 기존에 vc-dir-refresh 뒤 vc-dir-hide-up-to-date를 호출하던 키 해킹을 삭제할 수 있음
- vc-allow-rewriting-published-history는 Jujutsu나 feature branch force-push처럼 이미 push된 히스토리를 의도적으로 다시 쓰는 흐름에 맞음
- Emacs 31에는 editable xref buffer가 들어감
- 기존 xref 버퍼는 r의 xref-query-replace-in-results만 있었고 정규식 기반 치환에 한정됐음
- Dired의 wdired-mode나 grep 버퍼의 grep-edit-mode처럼 결과 버퍼를 직접 편집하는 흐름이 xref에는 없었음
- 처음 제안은 xref-export-to-grep로 xref 결과를 file:line:content 형태의 grep-mode 버퍼로 내보낸 뒤 편집하는 방식이었음
- xref 유지관리자인 Dmitry Gutov가 grep 버퍼로 우회하는 UI 대신 xref 버퍼 inline 편집을 제안했고, 이후 xref-edit-mode가 작성돼 들어감
- xref-edit-mode는 추가 버퍼 이동을 없애고 큰 xref 버퍼에서도 더 빠르게 동작함
- 사용 흐름은 C-x p g로 검색한 뒤 *xref* 버퍼에서 e로 편집 모드를 시작하고, 수정 후 C-c C-c로 확정하는 방식임
- 관련 논의는 bug#80616에 공개돼 있음
ERC와 작은 품질 개선들
- ERC는 erc-log-insert-log-on-open 'erc-log-new-target-buffer-p로 새 target buffer를 열 때만 이전 로그를 삽입할 수 있음
- Emacs 31에서는 ERC의 scrolltobottom 모듈이 더 이상 erc-fill-wrap에 의존하지 않아, 이전 버전용 조건부 설정을 제거할 수 있음
- 작은 설정값들도 사용성 개선에 기여함
- delete-pair-push-mark t: delete-pair 뒤 mark를 push해 C-x C-x로 내부를 선택할 수 있음
- ibuffer-human-readable-size t: raw byte 대신 KB/MB 표시를 사용함
- ielm-history-file-name: IELM 입력 히스토리를 재시작 후에도 유지함
- kill-region-dwim 'emacs-word: 활성 region이 없을 때 C-w가 오류 대신 뒤쪽 단어를 kill함
- native-comp-async-on-battery-power nil: 배터리 사용 중 백그라운드 native compilation을 멈춤
- view-lossage-auto-refresh t: C-h l이 최근 키 입력을 실시간 갱신함
- display-fill-column-indicator-warning nil
- dired-hide-details-hide-absolute-location t: dired-hide-details-mode에서 절대 디렉터리 경로를 숨김
- world-clock-sort-order "%FT%T": world clock 정렬을 조정함
- zone-all-frames t
- zone-all-windows-in-frame t
- uniquify-after-kill-buffer-flag t: 기존 -p 변형에서 이름이 바뀜
- kill-region-dwim은 C-w에서 “the mark is not active” 오류를 피하게 해줌
- view-lossage-auto-refresh는 화면 공유나 교육 중 키 입력을 실시간으로 보여주는 데 유용함
- native-comp-async-on-battery-power nil은 전원 연결 없이 이동 중일 때 백그라운드 컴파일로 팬이 도는 상황을 줄임
- tty-tip-mode는 -nw로 실행하는 Emacs에서도 tooltips를 제공함
term, Modus 테마, master를 쓰는 이유
- Emacs 31은 term과 ansi-term에서 줄이 삼켜지거나 화면이 깨지는 문제를 고침
- htop, nethack, curses 기반 프로그램처럼 커서 주소 지정과 전체 화면 redraw를 쓰는 프로그램이 Emacs 터미널 안에서 제대로 redraw됨
- 외부 터미널 에뮬레이터를 열어야 했던 이유 하나가 줄어듦
- Emacs에는 Protesilaos의 Modus 5 테마들이 포함됨
- modus-operandi-deuteranopia: 흰 배경의 deuteranopia 최적화 테마
- modus-operandi: 흰 배경의 가독성 높은 테마
- modus-operandi-tinted: 밝은 황토색 배경의 가독성 높은 테마
- modus-operandi-tritanopia: 흰 배경의 tritanopia 최적화 테마
- modus-vivendi-deuteranopia: 검은 배경의 deuteranopia 최적화 테마
- modus-vivendi: 검은 배경의 가독성 높은 테마
- modus-vivendi-tinted: 밤하늘 배경의 가독성 높은 테마
- modus-vivendi-tritanopia: 검은 배경의 tritanopia 최적화 테마
- unreleased Emacs를 매일 쓰는 이유는 코어에 무엇이 들어오는지 직접 확인하고, 릴리스마다 직접 만든 glue code가 줄어드는 과정을 보기 위해서임
- 이미 들어 있는 기능을 다룬 짝이 되는 글로 Even More Batteries Included with Emacs를 함께 볼 수 있음
-
Homepage
-
Tech blog
- Emacs 31에서 이미 매일 쓰는 변화들