TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 34 READS

Emacs 31의 markdown-ts-mode, '실험적'이라는 딱지의 진짜 의미

Emacs 31의 markdown-ts-mode, '실험적'이라는 딱지의 진짜 의미
SOURCE IMAGE · HACKER NEWS

Emacs 31이 정식 배포되면서 새 기능들이 대거 들어왔고, 그중에서도 눈길을 끄는 것이 내장 markdown-ts-mode다. 이 모드는 Emacs가 '실험적(experimental)'으로 분류해 기본 활성화하지 않는다. 이 딱지를 보고 아직 완성되지 않은 스케치 수준이라 여기기 쉽지만, 실제로는 그 반대다. 원저자인 Rahul Juliato는 실험적이라는 표시가 '기능이 빈약하다'는 뜻이 아니라 '기본값으로 켜지지 않으니 사용자가 명시적으로 로드해야 하고, 더 많은 테스트와 피드백이 필요하다'는 뜻이라고 설명한다. 기능 측면에서는 이미 CommonMark 명세 전체와 GitHub Flavored Markdown 대부분을 지원하며, 목차 유틸리티나 pandoc·gfm 같은 외부 변환기 연동까지 갖춘 상당히 완성도 높은 모드다.

tree-sitter라는 진입 장벽

이 모드를 처음 켜려는 사용자가 가장 먼저 부딪히는 벽은 markdown 문법 자체가 아니라 tree-sitter다. Emacs의 -ts-mode 계열은 언어별 문법 파서(grammar)를 필요로 하는데, 실험적 모드라 기본 로드되지 않으므로 .md 파일을 열거나 M-x markdown-ts-mode를 호출한다고 바로 켜지지 않는다. 라이브러리를 먼저 로드해야 하며, 저자는 use-package를 이용한 방식과 그렇지 않은 방식을 함께 제시한다. 설정을 건드리지 않고 시험만 하고 싶다면 emacs -Q로 깨끗한 세션을 띄워 실험장으로 삼을 수 있다. 한 가지 분명히 해둘 점은, 이제는 과거의 MELPA 패키지를 설치할 필요가 전혀 없다는 것이다. 아카이브된 구 저장소는 Emacs 31부터 설치를 거부하며, 그것을 쓰고 있다면 애초에 새 내장 모드를 쓰는 것이 아니다.

실제로 파일을 열면 시스템에 markdown grammar가 있으면 곧바로 표시되지만, 없으면 Emacs가 설치를 제안한다. y를 누르면 모드 소스코드에 정의된 저장소에서 문법을 내려받아 컴파일한다. markdown은 본문용과 인라인 파싱용, 두 개의 문법을 쓰기 때문에 두 번째 문법도 같은 방식으로 설치한다. 문제가 생긴다면 점검할 것은 정해져 있다. Emacs가 tree-sitter 플래그로 빌드됐는지는 M-: (featurep 'treesit)가 t를 반환하는지로 확인하고, make·gcc 같은 컴파일 도구와 tree-sitter-cli 패키지(tree-sitter --version으로 확인)가 갖춰졌는지 살펴야 한다. 이는 특정 모드가 아니라 모든 tree-sitter 모드에 공통된 골칫거리다.

모든 -ts-mode를 끌어안는 구조

markdown-ts-mode가 특별한 이유는 markdown만이 아니라 설치된 다른 모든 -ts-mode와 협업하도록 설계됐다는 점이다. 예컨대 문서 상단에 흔히 쓰는 YAML이나 TOML 헤더가 색으로 칠해지지 않는다면, 그것은 버그가 아니라 YAML 문법이 없기 때문이다. M-x treesit-install-language-grammar로 yaml을 설치하면 해결된다. 저자는 이 과정에서 yaml-ts-mode가 자동으로 저장소를 제안하지 못하는 상황도 함께 보여주는데, 이럴 때는 모드의 소스(yaml-ts-mode.el)를 열어 어떤 문법을 기대하는지 직접 확인하거나 저장소 주소를 수동으로 넣어주면 된다. 색이 빠진 코드 블록을 만날 때마다 같은 절차를 반복하며, C-x x f로 강제 폰티파이를 걸면 파일에 필요한 모든 문법을 한 번에 프롬프트로 요청하게 만들 수도 있다. 이 설치 작업은 문법이 없을 때 처음 한 번만 하면 된다.

여기서 실무자가 반드시 이해할 점은 -ts-mode의 품질이 결국 그 뒤에 있는 문법의 품질에 종속된다는 사실이다. 문법은 특정 에디터의 것이 아니라 tree-sitter를 쓰는 모든 도구가 공유하는 자산이므로, 모드는 문법의 개선을 계속 따라가야 하고 문법의 제약을 그대로 물려받는다. 그래서 모드 저자들은 소스 곳곳에 한계와 그 처리 이유를 주석으로 남기고, 검증한 문법 저장소와 SHA 커밋까지 명시해 둔다. markdown-ts-mode는 가장 완성도 높고 널리 채택된 tree-sitter-grammars의 markdown 문법을 쓰지만, 그것 역시 버그와 한계에서 자유롭지 않다. 저자가 '직접 컴파일하라'고 권하는 이유가 여기 있다. 모드가 테스트한 바로 그 버전을 Emacs 안에서 대화형으로 빌드하는 편이 가장 안정적인 경험을 보장하기 때문이다.

편집 경험: org-mode를 닮으려는 설계

기능 측면에서는 org 사용자가 익숙하게 넘어올 수 있도록 곳곳에서 org-mode와 평행선을 그린다. 강조는 직접 마커를 치거나 C-c C-x C-f로 감쌀 수 있고, C-c C-x RET로 마커 자체를 숨겨 볼드를 볼드로만 보이게 할 수 있다. 헤딩은 #부터 ######까지는 물론 setext 스타일도 인식하며, 다시 타이핑하지 않고 승급·강등하거나 하위 항목까지 포함해 섹션을 통째로 이동할 수 있다. TAB으로 헤딩 접기, S-TAB으로 전체 가시성 순환 등 아웃라인 기능도 그대로 동작한다. 다만 리스트 불릿이나 체크박스 표시는 화면 표현일 뿐 버퍼에는 여전히 -와 [x]가 담겨 있다는 점은 기억해야 한다.

압권은 코드 블록이다. 언어를 지정한 펜스드 블록은 해당 언어의 모드로 폰티파이되며, 블록 안에 커서를 두면 그 언어의 편집 컨텍스트로 진입한다. tree-sitter가 없는 elisp 같은 모드도 지원한다. 표는 C-c C-, t로 행·열 수를 지정해 삽입하고, 표 안에서는 전용 키맵으로 바뀌며 CSV/TSV 가져오기·내보내기, 행·열 복제도 제공한다. 다만 표는 문법의 파싱 방식 탓에 입력 중 색이 빠지는 등 현재 한계가 있으니, GFM 명세에 맞는 유효한 표를 유지하는 편이 안전하다. 링크는 text와 참조 방식을 모두 지원하고 #intro 같은 조각 링크는 버퍼 내 헤딩으로 점프하며, 이미지는 C-c C-x C-v로 인라인 렌더링을 토글할 수 있다. 결국 이 모드의 실무적 결론은 명확하다. '실험적'은 미완성이 아니라 옵트인이라는 뜻이며, 진짜 난관은 markdown이 아니라 tree-sitter 문법 관리라는 점을 받아들이면 나머지는 대체로 순조롭다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://rahuljuliato.com/posts/markdown-ts-mode-emacs-31
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...