기술

JetBrains 터미널 속 그 엔진, libghostty 1.0과 웹용 ghostty-web

Ghostty 터미널에서 떼어 낸 C 라이브러리 libghostty-vt가 1.0이 됐습니다. 쓰는 곳(JetBrains IDE·Neovim·OrbStack), 1.0의 뜻, xterm.js 대신 ghostty-web으로 바꾸는 코드를 정리했습니다.

Mitchell Hashimoto의 글에 따르면 libghostty-vt 1.0이 나왔습니다. libghostty는 Ghostty 터미널 코어에서 떼어 낸, 이식성 좋은 C 터미널 에뮬레이션 라이브러리입니다(MIT). 해커뉴스에서 585점을 받았습니다.

누가 쓰나

프로젝트내용
JetBrains IDE(IntelliJ, PyCharm, GoLand 등)내장 터미널이 libghostty로 바뀜. JetBrains 보고 기준 활성 사용자 1,250만 명
Neovimlibvterm을 libghostty-vt로 바꾸는 PR 승인, 태그 릴리스 뒤 병합 예정
OrbStack, Vercel Turborepo, devenv제품 안에 내장하거나 출력 렌더에 사용
KDE, Emacs(Ghostel)Konsole 대체 실험, Emacs용 터미널

글은 Ghostty 앱보다 libghostty 기반 터미널을 쓰는 사람이 훨씬 많다고 적었습니다. awesome-libghostty 목록에는 백 개 넘는 프로젝트가 있습니다.

1.0의 뜻

  • 라이브러리와 C ABI가 안정됐고, 시맨틱 버전을 따릅니다. 배포판이 따로 패키징하고 프로그램이 동적 링크해도 됩니다.
  • 모든 객체는 불투명 핸들이고, 값은 enum 키를 쓰는 getter·setter로 읽고 써서 새 기능을 넣어도 심볼이 늘지 않습니다.
  • CI가 리눅스·macOS·WebAssembly에서 ABI 호환을 검사합니다.
  • Ghostty 앱과 따로 릴리스되고, Rust·Go·JavaScript·Swift·Python·.NET 등 커뮤니티 바인딩이 있습니다.

웹에서는 ghostty-web

coder/ghostty-web(MIT)는 Ghostty 파서를 WebAssembly로 컴파일한 웹 터미널입니다. xterm.js와 같은 API를 목표로 하고, 런타임 의존성이 없으며 WASM 묶음은 약 400KB입니다.

// npm install ghostty-web
import { init, Terminal } from 'ghostty-web';

await init();

const term = new Terminal({ fontSize: 14 });
term.open(document.getElementById('terminal'));
term.onData((data) => websocket.send(data));
websocket.onmessage = (e) => term.write(e.data);

README는 xterm.js에서 옮길 때 @xterm/xterm을 ghostty-web으로 바꾸면 된다고 하고, 위처럼 init()을 먼저 한 번 부릅니다. 데바나가리·아랍 문자 같은 복잡한 글자 처리처럼 xterm.js가 약한 부분을 비교표로 보여 줍니다.

오늘 할 일

웹 터미널을 쓰는 프로젝트가 있다면 브랜치 하나에서 ghostty-web으로 바꿔 보세요. JetBrains IDE를 쓴다면 이미 libghostty 위에서 일하고 있습니다.

쇼츠로 보기

이 글은 비치콤버스 쇼츠 No.85의 짝 글입니다. 짧은 주소 beachcombers.co.kr/s/85.

김현빈 Developer & Writer

기술, 포스팅 관련 질문, 프로젝트 협업 등 연락주시면 언제든지 회신 드립니다.

esc

↑↓ 고르기↵ 열기? 단축키

해변에서 주운 것

읽으러 가기 →
guest@beachcombers — zsh

단축키

⌘K 또는 /
글·작업·개발일지 찾기
R
해변 산책 — 아무 글 하나 줍기
`
터미널 열기
←→
쪽 넘기기 (휠·스와이프도 됩니다)
?
이 안내
esc
닫기