Ghostel: libghostty 로 구동되는 고성능 Emacs 터미널 에뮬레이터
Ghostel: libghostty 로 구동되는 고성능 Emacs 터미널 에뮬레이터
Ghostel은 Emacs용 고성능 터미널 에뮬레이터로, Ghostty 터미널을 구동하는 동일한 VT 엔진인 libghostty-vt를 활용합니다. Zig 로 작성된 네이티브 동적 모듈을 사용해 터미널 상태 관리, 렌더링, 로컬 PTY I/O 를 Emacs 메인 스레드에서 분리함으로써 큰 성능 향상을 이루고, 일반적으로 Emacs에서 사용할 수 없는 최신 터미널 프로토콜을 지원합니다.
핵심 요점
Ghostel은 vterm 및 eat에 대한 현대적인 대안을 제공하며, 처리량이 크게 높아(최대 75 MB/s) Kitty 그래픽 및 키보드 프로토콜을 지원합니다. 아키텍처 덕분에 대량 데이터가 폭주해도 UI 가 반응성을 유지하고, Emacs와의 깊은 통합을 통해 비밀번호 프롬프트 감지, 클릭 가능한 파일 경로, 쉘에서 직접 Elisp 함수를 호출하는 기능 등을 제공합니다.
성능 및 아키텍처
Ghostel은 Emacs 메인 스레드에서 출력 파싱으로 인한 "UI 정지" 문제를 해결하도록 설계되었습니다.
네이티브 PTY 및 비동기 처리
로컬 터미널의 경우 Ghostel은 네이티브 PTY 경로를 사용합니다. Zig 백그라운드 스레드가 PTY 출력을 읽고 터미널 상태를 비동기적으로 업데이트합니다. Emacs는 재그리기나 특정 콜백(예: OSC 핸들러)이 필요할 때만 알림을 받습니다. 이를 통해 대용량 로그 스트림이 Emacs 이벤트 루프를 차단하는 일을 방지합니다.
처리량 벤치마크
Apple M4 Max에서 수행한 벤치마크에서 Ghostel은 일반 ASCII 처리량 면에서 다른 인기 Emacs 터미널을 크게 앞섭니다:
| Backend | Plain ASCII | URL-heavy |
|---|---|---|
| Ghostel | 75 MB/s | 36 MB/s |
| vterm | 18 MB/s | 15 MB/s |
| eat | 6.2 MB/s | 4.5 MB/s |
| term | 7.2 MB/s | 5.9 MB/s |
버스트 흡수
10 MB cat 명령을 처리할 때, Ghostel의 네이티브 PTY 경로는 약 110 ms 안에 데이터를 흡수합니다—vterm보다 약 5배, eat보다 16배 빠릅니다. 파싱이 백그라운드 스레드에서 이루어지기 때문에 Emacs UI는 전체 과정 내내 반응성을 유지합니다.
고급 터미널 기능
libghostty-vt를 활용함으로써 Ghostel은 Emacs에 여러 현대적 기능을 제공합니다:
- Kitty Graphics Protocol: PNG, RGB, RGBA 형식의 인라인 이미지를 Emacs 내장 이미지 지원을 통해 렌더링합니다. 이를 통해
yazi나timg같은 도구가 버퍼에 직접 이미지를 표시할 수 있습니다. - Synchronized Output (DEC 2026): 최신 TUI(예: Claude Code)에서 발생하는 끊긴 부분 재그리기를 없앱니다.
- Rich Text Attributes: 색상이 독립적인 다섯 종류의 밑줄(단일, 이중, 곱슬, 점선, 대시)과 흐림/희미 텍스트, 취소선을 지원합니다.
- OSC 8 Hyperlinks: 터미널 프로그램이 출력하는 클릭 가능한 URL을 네이티브하게 지원합니다.
- Color Queries: OSC 4/10/11을 지원해 TUI 프로그램이 Emacs 테마의 밝기/어두움 모드를 자동 감지하도록 합니다.
입력 모드와 사용자 경험
Ghostel은 터미널 제어와 Emacs 생산성을 균형 있게 맞추기 위해 다섯 가지 입력 모드를 구현합니다:
- Semi-char mode (Default): 대부분의 키가 터미널로 전달되지만
C-x,M-x등 일부 키는 Emacs 용으로 예약됩니다. - Char mode: 모든 키가 터미널로 전달됩니다. 예약된 Emacs 키를 바인딩하는 TUI에 사용됩니다.
- Emacs mode: 버퍼가 읽기 전용 뷰가 됩니다. 터미널은 계속 실행되지만 사용자는 표준 Emacs 탐색·검색을 할 수 있어 쉘에 영향을 주지 않습니다.
- Copy mode: Emacs mode와 유사하지만 터미널이 정지되어 정확한 텍스트 선택을 위한 안정적인 스냅샷을 제공합니다.
- Line mode: 입력이 Emacs 내부에 버퍼링되어 전체 편집(Emacs 키 사용)이 가능하고
RET누를 때 한 번에 쉘에 전송됩니다.
깊은 Emacs 통합
Ghostel은 쉘과 편집기 사이의 간극을 메우며 터미널 경험을 확장합니다:
- Password Prompt Detection:
sudo나ssh와 같이 비밀번호를 요구하는 프로그램을 감지하면 네이티브 Emacsread-passwd프롬프트를 띄워 비밀번호가view-lossage나 키보드 매크로 기록에 남지 않게 합니다. - Calling Elisp from Shell: 허용된 시스템(
ghostel-eval-cmds)을 통해 쉘 스크립트가 Emacs 함수를 호출할 수 있습니다. 예를 들어, 현재 디렉터리를 Dired에서 열기 위해ghostel_cmd dired-other-window "$(pwd)"와 같은 별칭을 만들 수 있습니다. - TRAMP Support: 원격 터미널을 위해 Ghostel은 TRAMP와 통합됩니다. 원격 호스트에
xterm-ghosttyterminfo 를 자동 설치해 원격 TUI가 고품질 렌더링을 유지하도록 합니다. - Compilation Mode:
ghostel-compile은M-x compile의 TTY 기반 대안으로, 색상이나 진행 바가 필요한 프로그램을 실행하면서도compilation-mode의 오류 탐색 UI를 유지합니다.
커뮤니티 인사이트
초기 사용자는 Ghostel이 일상적인 드라이버로 충분히 활용 가능하다고 평가하지만, 아직 다듬어야 할 부분이 있다고 언급합니다. 요약에서 코드 참조를 클릭해 바로 Emacs 버퍼에서 열 수 있는 기능이 유용하다는 평이 많았습니다. 다만 터미널 클리어링 오류나 드물게 발생하는 정지 현상이 보고되어, 성능은 혁신적이지만 프로젝트가 아직 성장 단계임을 시사합니다.
"최근에 vterm에서 ghostel 로 바꿨는데 전반적으로 훨씬, 훨씬 좋습니다—눈에 띄게 빠르고... 입력 처리가 더 안정적이며, ELisp API 도 훨씬 깔끔합니다."
설치
Ghostel은 MELPA 를 통해 제공됩니다. 네이티브 모듈은 최초 사용 시 자동으로 다운로드되므로 대부분의 사용자는 로컬 Zig 툴체인을 별도로 설치할 필요가 없습니다.
(use-package ghostel
:ensure t)