우분투에서 kitty 터미널 사용하는 개발자 팁 | 설치·설정·SSH terminfo 해결까지
이 글의 핵심
GPU 가속 렌더링으로 유명한 kitty 터미널을 우분투에 설치하고, kitty.conf 설정, Nerd Font·테마 적용, 탭/윈도우 분할, icat·ssh 같은 kitten 기능, 원격 서버 접속 시 TERM=xterm-kitty 오류 해결법까지 실전 예제와 함께 정리한 가이드입니다.
들어가며
우분투 데스크톱을 새로 설치하면 기본 터미널로 GNOME 터미널(gnome-terminal)이 딸려 옵니다. 대부분의 개발자는 별다른 불만 없이 이를 그대로 쓰지만, 큰 로그 파일을 cat하거나 tmux 안에서 화면을 여러 개로 쪼개 놓고 빠르게 스크롤할 때 GNOME 터미널이 눈에 띄게 버벅이는 순간을 경험해본 사람이라면 이야기가 달라집니다. 이 병목의 근본 원인은 렌더링 방식에 있습니다. GNOME 터미널이 기반으로 하는 VTE(Virtual Terminal Emulator) 라이브러리는 텍스트를 CPU에서 소프트웨어 방식으로 그리는 반면, kitty는 텍스트 렌더링 전체를 OpenGL 파이프라인에 올려 GPU에서 처리합니다.
이 차이는 단순히 “더 빠르다”는 체감을 넘어 실질적인 작업 흐름에 영향을 줍니다. journalctl -f로 로그를 실시간 추적하거나, 빌드 로그가 초당 수백 줄씩 쏟아지는 CI 파이프라인을 로컬에서 재현할 때, 소프트웨어 렌더러는 화면 갱신이 밀리면서 입력 지연(input latency)이 체감될 정도로 커집니다. kitty는 화면 갱신을 GPU 프레임 버퍼에 위임하고, 자체적으로 구현한 입력 처리 루프로 키 입력과 렌더링 사이의 지연을 최소화하도록 설계되어 있습니다. kitty 개발자가 공개한 벤치마크에 따르면 대량의 텍스트를 출력할 때 처리량이 다른 GPU 가속 터미널 대비 여러 배 높게 측정되었는데, 이는 kitty가 렌더링뿐 아니라 터미널 파서 자체도 별도 스레드로 분리해 입력 처리와 화면 그리기가 서로 블로킹하지 않도록 만들었기 때문입니다.
물론 GPU 가속이 항상 장점만 있는 것은 아닙니다. 원격 데스크톱(RDP, VNC)이나 가상 머신 환경에서는 GPU 패스스루가 제대로 지원되지 않아 오히려 소프트웨어 렌더러보다 불안정할 수 있고, 오래된 Intel 통합 그래픽에서는 드라이버 버그로 화면 깜빡임이 발생하기도 합니다. 이 글은 이런 트레이드오프를 포함해 우분투에서 kitty를 설치하고, 실무에서 바로 쓸 수 있도록 설정을 다듬고, 흔히 겪는 문제(특히 SSH 원격 접속 시 terminfo 오류)를 해결하는 방법까지 실전 위주로 정리합니다.
대상 독자
- GNOME 터미널의 렌더링 성능에 답답함을 느껴본 백엔드/시스템 개발자
- tmux/zellij와 함께 GPU 가속 터미널을 조합해 쓰고 싶은 사용자
- SSH로 원격 서버에 접속할 때
TERM=xterm-kitty관련 오류를 겪어본 사람
이 글을 읽으면
- apt와 공식 설치 스크립트의 차이를 이해하고 우분투에 kitty를 안전하게 설치할 수 있습니다.
kitty.conf로 폰트, 테마, 단축키, 레이아웃을 실무에 맞게 커스터마이징할 수 있습니다.icat,ssh kitten같은 kitty 고유 기능을 활용해 작업 효율을 높일 수 있습니다.- 원격 서버 SSH 접속 시 발생하는 terminfo 오류를 근본적으로 해결할 수 있습니다.
1. 우분투에 kitty 설치하기
apt vs 공식 설치 스크립트
우분투에서 kitty를 설치하는 방법은 크게 세 가지입니다.
# 방법 1: apt (universe 저장소)
sudo apt update
sudo apt install kitty
# 방법 2: 공식 설치 스크립트 (권장)
curl -L https://sw.kovidgoyal.net/kitty/installer.sh | sh /dev/stdin
# 방법 3: PPA (권장하지 않음, 유지 관리 여부 불명확)
sudo add-apt-repository ppa:example/kitty
세 방법은 겉보기엔 비슷해 보이지만 실무에서는 차이가 꽤 큽니다. apt install kitty는 우분투 버전에 고정된 저장소 스냅샷을 그대로 받기 때문에, LTS 릴리스를 쓰는 경우 kitty가 반년~1년 이상 지난 버전으로 고정되는 일이 흔합니다. kitty는 icat, hyperlinked-grep 같은 kitten 기능이 마이너 버전마다 추가되고 버그 수정도 잦은 프로젝트라서, 오래된 버전을 쓰면 이 글에서 다루는 기능 중 일부가 아예 존재하지 않을 수 있습니다.
공식 설치 스크립트는 ~/.local/kitty.app에 kitty를 독립적으로 설치합니다. 시스템 패키지 매니저와 완전히 분리되어 있어 sudo 권한이 필요 없고, 우분투 자체 패키지와 충돌할 일도 없습니다. 업데이트도 동일한 명령을 다시 실행하면 됩니다.
# 업데이트도 동일한 스크립트로
curl -L https://sw.kovidgoyal.net/kitty/installer.sh | sh /dev/stdin
# 데스크톱 통합 (앱 런처에 표시, 아이콘 설정)
ln -sf ~/.local/kitty.app/bin/kitty ~/.local/kitty.app/bin/kitten ~/.local/bin/
cp ~/.local/kitty.app/share/applications/kitty*.desktop ~/.local/share/applications/
cp ~/.local/kitty.app/share/icons/hicolor/256x256/apps/kitty.png ~/.local/share/icons/hicolor/256x256/apps/
sed -i "s|Icon=kitty|Icon=$HOME/.local/kitty.app/share/icons/hicolor/256x256/apps/kitty.png|g;s|Exec=kitty|Exec=$HOME/.local/kitty.app/bin/kitty|g" ~/.local/share/applications/kitty*.desktop
sed 명령으로 .desktop 파일 안의 Icon과 Exec 경로를 절대 경로로 바꿔주는 이유는, GNOME 앱 런처(Activities 화면)가 PATH 환경변수를 참조하지 않고 .desktop 파일에 명시된 경로만 신뢰하기 때문입니다. 이 단계를 건너뛰면 터미널에서는 kitty 명령이 잘 실행되는데 GUI 아이콘을 클릭하면 “찾을 수 없음” 오류가 나는 경우가 있습니다.
PPA 방식은 권장하지 않습니다. 서드파티 PPA는 유지 관리가 중단되는 경우가 많고, 우분투 버전이 올라갈 때 패키지가 깨지는 사례가 자주 보고됩니다. 공식 설치 스크립트 대비 얻는 이점이 거의 없으면서 신뢰할 수 없는 저장소를 시스템에 추가하는 리스크만 남기 때문에, 굳이 apt 스타일의 패키지 관리가 필요한 상황이 아니라면 피하는 것이 좋습니다.
2. kitty.conf 위치와 기본 설정
kitty의 모든 설정은 ~/.config/kitty/kitty.conf 파일 하나로 관리됩니다. 이 파일이 없으면 kitty는 내장 기본값으로 동작하므로, 커스터마이징을 시작하려면 먼저 디렉터리와 파일을 만들어야 합니다.
mkdir -p ~/.config/kitty
touch ~/.config/kitty/kitty.conf
가장 먼저 손대게 되는 기본 설정 항목들을 예시로 정리하면 다음과 같습니다.
# ~/.config/kitty/kitty.conf
# --- 렌더링 성능 관련 ---
# 화면 갱신 빈도를 모니터 주사율에 맞춰 제한 (기본값 그대로 두는 것을 권장)
sync_to_monitor yes
# 커서 깜빡임 속도(0이면 깜빡이지 않음)
cursor_blink_interval 0.5
# --- 스크롤백 ---
# 스크롤백 버퍼 줄 수 (로그를 많이 보는 개발자는 늘리는 것이 좋음)
scrollback_lines 10000
# --- 마우스 ---
copy_on_select yes
strip_trailing_spaces smart
# --- 창 여백 ---
window_padding_width 4
# --- 설정 파일 분리 (선택) ---
include theme.conf
include keybinds.conf
include 지시어는 설정 파일을 여러 개로 쪼갤 수 있게 해줍니다. 테마, 키바인딩, 폰트 설정을 각각 별도 파일로 분리해두면 dotfiles 저장소에서 관리하기 편하고, kitten themes로 테마를 교체할 때도 kitty.conf 본문을 건드리지 않고 theme.conf만 덮어써지므로 git diff가 깔끔하게 유지됩니다.
설정을 바꾼 뒤 kitty를 재시작하지 않고 바로 반영하려면 Ctrl+Shift+F5(Reload kitty.conf)를 누르면 됩니다. 다만 폰트나 GPU 관련 일부 설정은 런타임 리로드가 지원되지 않아 완전히 재시작해야 반영되는 경우도 있으니, 설정을 바꿨는데 화면에 변화가 없다면 먼저 완전히 종료 후 재실행해보는 것이 좋습니다.
3. 폰트 설정: Nerd Font와 ligature
터미널에서 아이콘(파일 타입, git 상태 등)을 표시하려면 일반 폰트가 아니라 Nerd Font로 패치된 폰트가 필요합니다. Nerd Font는 Powerline, Font Awesome, Devicons 같은 아이콘 글리프를 기존 코딩 폰트에 추가로 병합한 것으로, starship이나 powerlevel10k 같은 프롬프트 도구, lsd/eza 같은 ls 대체 도구가 이 아이콘들을 전제로 출력을 구성합니다.
# Nerd Font 설치 (JetBrainsMono 예시)
mkdir -p ~/.local/share/fonts
cd /tmp
curl -fLO https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip
unzip JetBrainsMono.zip -d ~/.local/share/fonts/JetBrainsMonoNerd
fc-cache -fv
fc-cache -fv를 잊지 않고 실행해야 합니다. 폰트 파일을 디렉터리에 복사만 하고 캐시를 갱신하지 않으면 fontconfig가 새 폰트를 인식하지 못해 kitty에서 폰트 이름을 지정해도 적용되지 않는 문제가 생깁니다.
# ~/.config/kitty/kitty.conf
font_family JetBrainsMono Nerd Font
bold_font JetBrainsMono Nerd Font Bold
italic_font JetBrainsMono Nerd Font Italic
bold_italic_font JetBrainsMono Nerd Font Bold Italic
font_size 13.0
# 코드 ligature 지원 (=> , != , -> 같은 기호를 합자로 표시)
disable_ligatures never
ligature(합자)는 !=, =>, -> 같은 여러 문자로 이루어진 연산자를 하나의 시각적 기호로 이어 붙여 보여주는 기능입니다. JetBrains Mono, Fira Code, Cascadia Code 같은 폰트는 이 ligature 글리프를 내장하고 있어 kitty에서 별도 설정 없이 바로 활용할 수 있습니다. disable_ligatures는 never(항상 표시), always(항상 비활성화), cursor(커서가 닿은 텍스트에서만 비활성화) 세 값을 지원하는데, 코드 리뷰 중 정확한 문자 수를 세야 하는 상황이 잦다면 cursor로 두어 커서 위치에서만 원래 문자를 보이게 하는 것도 실용적인 선택입니다.
폰트가 제대로 적용됐는지 빠르게 확인하려면 다음 명령으로 아이콘 글리프가 깨지지 않고 출력되는지 보면 됩니다.
kitty +kitten icat --print-window-size # kitty가 그래픽 프로토콜을 지원하는지 확인
echo -e " " # Nerd Font 아이콘 글리프 직접 출력
4. 색상 테마 적용: kitten themes
kitty 0.26 버전부터 내장 themes kitten이 추가되어, 별도로 테마 파일을 손으로 다운로드하지 않고도 수백 개의 테마를 바로 미리보기하고 적용할 수 있습니다.
kitty +kitten themes
이 명령을 실행하면 터미널 안에서 테마 목록을 위아래로 탐색하며 실시간으로 미리보기가 적용되는 인터랙티브 UI가 뜹니다. 원하는 테마에서 Enter를 누르면 ~/.config/kitty/theme.conf 파일이 자동으로 생성/덮어써지고, kitty.conf에 include theme.conf가 자동으로 추가됩니다(아직 없다면). 이름으로 바로 지정하고 싶다면 다음과 같이 non-interactive 모드도 지원합니다.
kitty +kitten themes --reload-in=all "Catppuccin-Mocha"
--reload-in=all 옵션은 테마를 적용한 뒤 현재 열려 있는 모든 kitty 창에 즉시 반영하라는 의미입니다. 이 옵션이 없으면 새로 여는 창부터만 테마가 적용되고, 이미 떠 있는 창은 수동으로 리로드해야 합니다.
직접 색상 값을 세밀하게 조정하고 싶다면 theme.conf를 열어 개별 색상 키를 덮어쓸 수도 있습니다.
# theme.conf (일부 발췌)
foreground #cdd6f4
background #1e1e2e
cursor #f5e0dc
color0 #45475a
color1 #f38ba8
color2 #a6e3a1
# ... color3 ~ color15 생략
야간에 장시간 작업하는 경우 대비를 낮춘 다크 테마(Catppuccin, Gruvbox Dark 등)를, 캡처나 발표 자료용으로는 밝은 테마(Solarized Light 등)를 별도 프로파일로 분리해두고 상황에 따라 전환하는 방식도 실무에서 자주 씁니다.
5. 탭·윈도우 분할과 kitty의 레이아웃 시스템
kitty는 tmux처럼 하나의 프로세스 안에서 여러 개의 터미널 창을 탭과 윈도우(분할 영역)로 관리할 수 있습니다. 다만 tmux의 팬(pane) 분할과 달리, kitty는 레이아웃(layout) 이라는 개념으로 윈도우 배치 방식 자체를 전환할 수 있다는 점이 독자적입니다.
기본 단축키
| 동작 | 단축키 |
|---|---|
| 새 탭 열기 | Ctrl+Shift+T |
| 탭 전환 | Ctrl+Shift+Right / Ctrl+Shift+Left |
| 윈도우 가로 분할 | Ctrl+Shift+Enter |
| 윈도우 세로 분할 | Ctrl+Shift+\ |
| 윈도우 간 포커스 이동 | Ctrl+Shift+[화살표] |
| 레이아웃 전환 | Ctrl+Shift+L |
레이아웃 종류
kitty가 기본 제공하는 레이아웃은 각각 다른 작업 패턴에 맞춰져 있습니다.
- tall: 왼쪽에 큰 창 하나, 오른쪽에 나머지 창들이 세로로 쌓이는 배치. 메인 에디터/로그를 크게 보면서 부수적인 명령을 여러 개 돌릴 때 적합합니다.
- fat: tall을 90도 회전한 형태로, 위에 큰 창, 아래에 나머지 창들이 가로로 나열됩니다.
- grid: 모든 창을 균등한 격자로 배치합니다. 여러 서버의 로그를 동시에 모니터링할 때 유용합니다.
- splits: 사용자가 수동으로 분할 방향을 지정하며 자유롭게 배치를 구성하는 레이아웃으로, tmux의 팬 분할과 가장 유사한 동작을 원할 때 씁니다.
- stack: 창을 겹쳐 쌓아두고 한 번에 하나씩만 보여주는 레이아웃으로, 탭과 비슷하지만 같은 탭 안에서 빠르게 전환할 수 있습니다.
kitty.conf에서 특정 레이아웃만 쓰도록 제한하거나 시작 레이아웃을 지정할 수도 있습니다.
# 사용할 레이아웃 목록 (Ctrl+Shift+L로 이 순서대로 순환)
enabled_layouts tall,fat,grid,stack
# 창을 새로 열 때 기본 레이아웃
# (kitty.conf에는 직접 지정하는 키가 없어 시작 세션 파일에서 지정하는 것이 일반적)
실무에서는 kitty --session ~/.config/kitty/dev-session.conf처럼 세션 파일을 미리 정의해두고, 프로젝트를 열 때마다 동일한 윈도우 배치(에디터, 서버 로그, 테스트 러너)를 한 번에 복원하는 방식을 자주 씁니다.
# ~/.config/kitty/dev-session.conf
layout tall
cd ~/projects/myapp
launch --title "editor" nvim .
launch --title "server" npm run dev
launch --title "logs" tail -f logs/app.log
6. kitten 기능 활용하기
kitty는 “kitten”이라 부르는 확장 스크립트들을 내장하고 있으며, kitty +kitten <이름> 형식으로 실행합니다. 이 중 개발자가 실무에서 자주 쓰게 되는 몇 가지를 소개합니다.
icat: 터미널에서 이미지 보기
kitty +kitten icat screenshot.png
kitty +kitten icat --scale-up chart.jpg
icat은 kitty가 자체 구현한 그래픽 프로토콜(kitty graphics protocol)을 활용해 터미널 안에 이미지를 픽셀 단위로 직접 렌더링합니다. xdg-open으로 별도 이미지 뷰어를 띄우지 않고도 SSH로 접속한 원격 서버에 저장된 그래프나 스크린샷을 바로 확인할 수 있어, 데이터 분석 스크립트가 생성한 차트를 빠르게 검토할 때 특히 유용합니다.
ssh kitten: terminfo 문제를 자동으로 해결
kitty +kitten ssh myserver
일반 ssh myserver 대신 kitty +kitten ssh를 쓰면, 접속 과정에서 kitty의 terminfo 항목을 원격 서버에 자동으로 설치해줍니다. 이 기능이 왜 필요한지는 7번 섹션에서 자세히 다룹니다.
hyperlinked-grep: 클릭 가능한 grep 결과
kitty +kitten hyperlinked_grep "TODO" -r ./src
일반 grep 결과에 kitty의 하이퍼링크 이스케이프 시퀀스를 추가해, 결과에 마우스를 올리고 Ctrl+클릭하면 해당 파일이 지정된 에디터로 바로 열립니다. 큰 코드베이스에서 특정 패턴을 검색한 뒤 하나씩 열어봐야 할 때 vim $(grep -l ...) 같은 셸 트릭보다 직관적입니다.
diff: 구문 강조가 적용된 diff 뷰어
kitty +kitten diff file_v1.py file_v2.py
git diff나 diff 명령의 텍스트 출력과 달리, kitty의 diff kitten은 좌우 분할 화면에 구문 강조(syntax highlighting)가 적용된 상태로 변경 사항을 보여줍니다. Git 저장소가 아닌 두 파일을 빠르게 비교할 때(예: 배포 전후 설정 파일 비교) 특히 편리합니다.
7. 리모트 SSH 접속과 terminfo 호환성 문제
kitty를 쓰다가 가장 먼저 부딪히는 실무 문제가 바로 이것입니다. 로컬에서 잘 쓰던 kitty로 원격 서버에 ssh로 접속하면 다음과 같은 오류를 만나게 됩니다.
Error opening terminal: xterm-kitty.
또는 vim, htop 같은 TUI 프로그램이 화면을 제대로 그리지 못하고 깨진 문자를 출력하는 경우도 있습니다. 원인은 명확합니다. kitty는 로컬 셸의 TERM 환경변수를 xterm-kitty로 설정하는데, 이 값에 대응하는 terminfo 항목이 원격 서버의 /usr/share/terminfo 데이터베이스에 없기 때문입니다. TERM 환경변수는 SSH 세션을 통해 그대로 원격 서버에 전달되지만, terminfo 데이터베이스 자체는 각 서버에 개별적으로 설치되어 있어야 하는 로컬 자원이라 자동으로 동기화되지 않습니다. 특히 Docker 컨테이너나 최소 설치(minimal install) 이미지로 만든 우분투 서버는 기본 terminfo 패키지가 아예 빠져 있어 이 문제가 더 자주 발생합니다.
해결법 1: ssh kitten 사용 (권장)
kitty +kitten ssh myserver
가장 간단하고 확실한 방법입니다. 접속 시 kitty의 terminfo 항목을 서버에 자동으로 전송하고 설치해주므로, 사용자가 별도로 신경 쓸 필요가 없습니다. ~/.ssh/config에 자주 접속하는 호스트를 등록해두고, 셸 alias로 kitty +kitten ssh를 감싸두면 평소 쓰던 ssh 명령과 거의 동일한 체감으로 쓸 수 있습니다.
# ~/.bashrc 또는 ~/.zshrc
alias ssh='kitty +kitten ssh'
해결법 2: terminfo를 수동으로 복사
ssh kitten을 쓸 수 없는 환경(예: 스크립트 안에서 순수 ssh 명령이 강제되는 경우)이라면 terminfo를 직접 복사합니다.
# 로컬에서 xterm-kitty terminfo를 추출해 원격으로 전달 후 컴파일
infocmp -a xterm-kitty | ssh myserver 'tic -x -o ~/.terminfo /dev/stdin'
infocmp -a는 로컬에 설치된 xterm-kitty terminfo 정의를 텍스트로 출력하고, 이를 파이프로 원격 서버에 전달해 tic(terminfo compiler)으로 사용자 홈 디렉터리의 ~/.terminfo에 컴파일해 넣습니다. 시스템 전역 경로(/usr/share/terminfo)에 넣으려면 sudo가 필요하지만, 사용자 홈 디렉터리에 넣으면 권한 없이도 동작합니다.
해결법 3: TERM을 임시로 xterm-256color로 전환
terminfo를 복사할 수도, ssh kitten을 쓸 수도 없는 극히 제한된 환경(예: 임베디드 장비, 구형 서버)이라면 접속 시점에만 TERM을 널리 호환되는 값으로 바꿔줍니다.
TERM=xterm-256color ssh myserver
이 방법은 kitty 고유의 확장 기능(언더컬 스타일, 트루컬러 일부 표현 등)을 포기하는 대신 대부분의 TUI 프로그램이 정상 동작하는 것을 보장합니다. 임시방편으로는 유효하지만, 자주 접속하는 서버라면 해결법 1이나 2로 근본적으로 해결하는 것이 낫습니다.
8. tmux, zellij와 함께 쓰기
kitty의 탭/윈도우/레이아웃 기능이 tmux, zellij와 겹쳐 보이지만, 둘은 근본적으로 다른 계층에서 동작합니다. kitty는 로컬 GUI 애플리케이션이고, tmux/zellij는 서버 프로세스로 백그라운드에서 세션 상태를 유지합니다. 이 차이는 SSH 연결이 끊겼을 때 극명하게 드러납니다. kitty에서 SSH로 원격 서버에 접속해 긴 작업을 돌리던 중 노트북이 절전 모드에 들어가 연결이 끊기면, 그 작업은 원격 서버의 셸 세션과 함께 종료됩니다. 반면 원격 서버 안에서 tmux new -s work로 세션을 만들어 그 안에서 작업했다면, 연결이 끊겨도 tmux 세션은 서버에서 계속 살아있고 나중에 tmux attach -t work로 다시 이어받을 수 있습니다.
실무에서 자리 잡은 조합은 다음과 같습니다.
- 로컬 화면 분할, 탭 전환, GPU 가속 렌더링: kitty가 담당
- 원격 서버 세션 보존, 재접속 시 작업 복원: 서버 안의 tmux 또는 zellij가 담당
즉 kitty의 splits/tall 레이아웃으로 로컬에서 여러 서버에 각각 SSH 접속한 창을 배치하고, 각 SSH 세션 안에서는 tmux를 실행해 서버 쪽 작업이 연결 끊김에 영향받지 않도록 이중으로 관리하는 방식입니다.
zellij를 쓴다면 kitty와의 조합에서 한 가지 추가로 챙길 점이 있습니다. zellij는 자체적으로 마우스 스크롤과 클립보드 복사를 가로채는 키 입력 모드를 갖고 있어, kitty의 copy_on_select 같은 설정과 충돌할 수 있습니다. zellij 안에서는 zellij의 복사 모드(Ctrl+O 뒤 Y 등, 설정에 따라 다름)를 쓰고, zellij 밖에서는 kitty의 마우스 셀렉션을 쓰는 식으로 컨텍스트를 구분해서 익혀두는 것이 혼란을 줄이는 방법입니다.
9. GPU 가속과 그래픽 드라이버 이슈
kitty의 GPU 가속은 OpenGL을 통해 이루어지므로, 우분투에서 어떤 그래픽 드라이버를 쓰느냐에 따라 겪는 문제가 달라집니다.
Intel 통합 그래픽
Intel 내장 그래픽은 대체로 오픈소스 Mesa 드라이버(i915)와 궁합이 좋아 별다른 설정 없이도 잘 동작합니다. 다만 구형 세대(Ivy Bridge 이전) 하드웨어에서는 OpenGL 버전이 kitty가 요구하는 최소 사양(OpenGL 3.3)에 못 미치는 경우가 있습니다.
glxinfo | grep "OpenGL version"
이 명령으로 지원되는 OpenGL 버전을 먼저 확인하고, 3.3 미만이라면 kitty 실행이 아예 실패하거나 소프트웨어 폴백으로 전환되어 GPU 가속의 이점을 못 보게 됩니다. 이 경우 mesa 드라이버를 최신 우분투 저장소 버전으로 업그레이드하거나, 오래된 하드웨어라면 GNOME 터미널로 돌아가는 것이 현실적입니다.
NVIDIA 독점 드라이버
NVIDIA 드라이버는 X11에서는 대체로 안정적이지만, Wayland 세션에서는 GBM(Generic Buffer Management) 지원이 드라이버 버전에 따라 불완전할 수 있어 kitty 창이 검게 나오거나 렌더링이 깨지는 사례가 보고됩니다.
# ~/.config/kitty/kitty.conf
# Wayland 대신 X11로 강제 실행
linux_display_server x11
이 설정으로도 해결되지 않으면 환경변수로 명시적으로 NVIDIA GLX 벤더 라이브러리를 지정해봅니다.
__GLX_VENDOR_LIBRARY_NAME=nvidia kitty
문제를 더 깊이 진단하고 싶다면 --debug-gl 옵션으로 실행해 어떤 GL 함수 호출이 실패하는지 로그를 확인할 수 있습니다.
kitty --debug-gl 2>&1 | tee kitty-gl-debug.log
AMD 그래픽
AMD는 오픈소스 amdgpu 드라이버가 우분투 커널에 기본 포함되어 있어 대체로 문제가 적은 편입니다. 다만 최신 GPU를 오래된 LTS 커널에서 쓰는 경우 드라이버가 하드웨어를 완전히 인식하지 못해 성능이 기대만큼 나오지 않을 수 있습니다. 이 경우 HWE(Hardware Enablement) 커널 스택으로 업그레이드하는 것이 도움이 됩니다.
sudo apt install --install-recommends linux-generic-hwe-24.04
어떤 드라이버를 쓰든 공통적으로, GPU 가속이 원인인지 아닌지 빠르게 확인하려면 소프트웨어 렌더링으로 강제 실행해 문제가 사라지는지 대조해보는 것이 유용합니다.
LIBGL_ALWAYS_SOFTWARE=1 kitty
이 명령으로 실행했을 때 문제가 사라진다면 GPU/드라이버 쪽 문제로 범위를 좁힐 수 있고, 그래도 동일하게 재현된다면 원인이 다른 곳(폰트, 설정 파일 등)에 있다는 뜻이므로 불필요하게 드라이버만 붙잡고 시간을 쓰는 것을 피할 수 있습니다.
10. Shell Integration (zsh/bash)
kitty는 셸과 통합해 몇 가지 추가 기능을 제공합니다. 명령어 실행 결과에 따라 마진 표시줄에 성공/실패 표시를 보여주거나, Ctrl+Shift+Z로 마지막 명령의 출력만 정확히 선택하는 기능 등입니다. 최신 kitty는 기본적으로 shell integration을 자동 주입(shell_integration enabled)하지만, 이미 커스터마이징된 .bashrc/.zshrc를 쓰고 있다면 수동으로 활성화해야 하는 경우도 있습니다.
# ~/.config/kitty/kitty.conf
shell_integration enabled
zsh를 쓴다면 .zshrc에서 kitty +kitten ssh가 주입하는 원격 통합 스크립트가 다른 프롬프트 프레임워크(예: powerlevel10k)의 초기화 순서와 충돌하지 않도록, kitty 관련 초기화 블록을 프롬프트 테마 로딩 이후에 두는 것이 안전합니다.
# ~/.zshrc 예시 순서
source ~/.p10k.zsh
[[ ! -o interactive ]] || source /path/to/powerlevel10k/powerlevel10k.zsh-theme
# kitty shell integration은 kitty가 자동으로 주입하므로 보통 수동 추가 불필요
# 문제가 있다면 아래처럼 명시적으로 비활성화 후 원인 분리
# export KITTY_SHELL_INTEGRATION="no-rc"
bash를 쓰는 경우도 마찬가지로, ~/.bashrc에서 대화형 셸 여부를 체크하는 조건문(case $- in *i*) ... ;; esac) 위쪽에 다른 도구가 프롬프트를 재정의하는 코드가 있다면 kitty의 커서 모양 변경이나 명령 경계 표시가 덮어써질 수 있으니, 이상 동작이 보이면 .bashrc를 위에서부터 순서대로 점검하는 것이 진단에 도움이 됩니다.
11. 클립보드 연동 문제 해결
kitty의 copy_on_select 기능은 마우스로 텍스트를 드래그해서 선택하는 순간 자동으로 시스템 클립보드에 복사합니다.
copy_on_select yes
이 설정 자체는 문제없이 잘 동작하지만, 실무에서 자주 겪는 클립보드 관련 문제는 따로 있습니다.
원격 서버(SSH) 안에서 클립보드 복사가 로컬로 전달되지 않는 문제: vim이나 tmux 안에서 y(yank)로 복사한 내용이 로컬 클립보드로 전달되지 않고 원격 서버 안에서만 맴도는 경우입니다. 이는 kitty가 지원하는 OSC 52 이스케이프 시퀀스를 애플리케이션이 활용하도록 설정해야 해결됩니다.
# ~/.config/kitty/kitty.conf
clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask
vim의 경우 set clipboard=unnamed만으로는 부족하고, OSC 52를 지원하는 플러그인(vim-oscyank 등)이나 Neovim 0.10 이상의 내장 OSC 52 클립보드 프로바이더를 함께 설정해야 원격 서버 안의 yank가 로컬 클립보드까지 도달합니다.
Wayland/X11 혼재 환경에서 프라이머리 셀렉션이 씹히는 문제: 우분투 GNOME이 기본적으로 Wayland 세션으로 로그인되는데, 일부 X11 전용 애플리케이션과 함께 쓰면 마우스 중클릭 붙여넣기(primary selection)가 간헐적으로 동작하지 않을 수 있습니다. 이 경우 XWayland를 거치는 애플리케이션과 네이티브 Wayland 애플리케이션 사이의 클립보드 브리지 문제이므로, kitty 쪽 설정보다는 wl-clipboard(wl-copy, wl-paste) 패키지가 설치되어 있는지 먼저 확인하는 것이 우선입니다.
sudo apt install wl-clipboard
트러블슈팅 요약
| 증상 | 원인 | 해결 |
|---|---|---|
Error opening terminal: xterm-kitty | 원격 서버에 terminfo 없음 | kitty +kitten ssh 사용 또는 infocmp로 수동 복사 |
| Nerd Font 아이콘이 네모(□)로 표시 | 폰트 캐시 미갱신 | fc-cache -fv 실행 후 kitty 재시작 |
| kitty 창이 검게 나오거나 렌더링 깨짐 (NVIDIA + Wayland) | GBM/EGL 미지원 | linux_display_server x11 설정 |
| SSH로 yank한 텍스트가 로컬 클립보드에 안 옴 | OSC 52 미설정 | clipboard_control 설정 + vim/nvim OSC 52 지원 |
| zellij 안에서 마우스 복사가 이상하게 동작 | zellij와 kitty의 셀렉션 모드 충돌 | zellij 안/밖에서 각각 다른 복사 단축키 사용 |
| GUI 런처에서 kitty 아이콘 클릭 시 실행 안 됨 | .desktop 파일 경로 미설정 | Exec/Icon을 절대 경로로 수정 |
마무리
kitty는 단순히 “더 예쁜 터미널”이 아니라, 렌더링 파이프라인 전체를 GPU로 옮기고 입력 처리를 별도 스레드로 분리해 대량의 텍스트 출력에서도 지연을 최소화하도록 설계된 도구입니다. 우분투에서는 공식 설치 스크립트로 최신 버전을 유지하고, kitty.conf 하나로 폰트·테마·레이아웃·단축키를 선언적으로 관리할 수 있다는 점이 dotfiles 기반 개발 환경 관리와도 잘 맞습니다.
다만 GPU 가속이라는 특성상 그래픽 드라이버 조합(특히 NVIDIA + Wayland)에 따라 예상치 못한 렌더링 문제를 만날 수 있고, 원격 서버 SSH 접속 시 terminfo 호환성 문제는 거의 모든 사용자가 한 번은 겪게 되는 통과의례에 가깝습니다. 이 글에서 정리한 ssh kitten, terminfo 수동 복사, tmux/zellij와의 역할 분담을 미리 알아두면 이런 문제들을 처음부터 헤매지 않고 넘어갈 수 있습니다. 로컬 렌더링 성능은 kitty에, 원격 세션의 영속성은 tmux/zellij에 맡기는 조합이 현재로서는 가장 안정적인 실무 구성입니다.
같이 보면 좋은 글 (내부 링크)
이 주제와 연결되는 다른 글입니다.
- 개발자가 알아야 할 우분투 필수 명령어 및 활용법 | apt·systemd·ufw 실전 가이드
- 개발자를 위한 리눅스·맥 명령어 실전 가이드 | 네트워크·파일·프로세스·디버깅
- Shell 스크립팅 실전 가이드 | Bash, Zsh, PowerShell 비교
- SSH 프로토콜 보안 원격 접속 | 공개키·ProxyJump·포트 포워딩·OpenSSH 실전