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를 함께 볼 수 있음
Read Entire Article