Я давно привык, что всё настраивается файлом: vim, tmux, zsh, docker-compose — конфиг лежит в git, правится руками, переносится на новую машину за минуту. iTerm на этом фоне всегда стоял особняком: кликаешь по меню, идёшь в Preferences, настраиваешь мышкой.
Ниже — почему я переехал на Kitty, что именно в конфиге и на какой ерунде я потерял вечер.
Почему именно iTerm перестал устраивать
Сразу оговорюсь: iTerm не плохой. Он стабильный, у него отличный поиск по скроллбеку, и большинству людей его хватает с запасом.
Дальше идёт возражение, которое я слышу каждый раз: «настройки iTerm тоже можно держать в git, есть же экспорт в plist». Формально — да. Практически это выглядит так:
<key>New Bookmarks</key>
<array>
<dict>
<key>ASCII Anti Aliased</key>
<true/>
<key>Non Ascii Font</key>
<string>Monaco 12</string>
...
Проблема не в том, что файла нет. Проблема в том, что этот файл:
- не читается глазами — чтобы понять, что поменялось, нужен diff по XML-структуре, а не по смыслу;
- не комментируется — нельзя написать рядом «поставил 120%, иначе глаза устают»;
- не мержится — конфликт в plist на двух машинах разруливается вручную и болезненно;
- не правится руками — редактируешь всё равно через GUI, plist только выгружаешь.
То есть это не конфиг, а дамп состояния. Разница примерно как между docker-compose.yml и снапшотом контейнера.
У Kitty конфиг — обычный текстовый файл с комментариями, который перезагружается без рестарта.
Вау-момент: startup sessions
Момент, после которого я перестал сомневаться.
Kitty умеет описывать стартовое состояние окна отдельным файлом. Не скриптом, не набором alias — обычным конфигом:
os_window_state maximized
new_tab Back console
cd ~/Develop/some_app
launch zsh
new_tab Back Claude
cd ~/Develop/some_app
launch zsh -ic "claude; exec zsh"
Путь указывается в основном конфиге:
startup_session ~/.config/kitty/sessions/myapp.conf
Запускаю Kitty — окно разворачивается на весь экран (именно maximized, с доком и менюбаром, а не fullscreen), открываются две вкладки: сервис в нужной директории и рядом Claude для того же сервиса. Ноль ручных действий.
Под каждый проект — свой файл сессии. Всё в git.
Настройки, которые стоит объяснить
Полный конфиг я приложил в конце. Здесь — только то, что не очевидно из названия параметра.
Сплиты вместо tmux для локальной работы
enabled_layouts splits:split_axis=horizontal,fat,tall,stack
map f5 launch --location=hsplit --cwd=current
map f6 launch --location=vsplit --cwd=current
map ctrl+shift+z toggle_layout stack
Ключевое здесь — --cwd=current: новый сплит открывается в той же директории, а не в домашней. Именно это убрало у меня необходимость в tmux для локальных сессий — раньше tmux был нужен ровно за панели.
ctrl+shift+z разворачивает текущий сплит на всё окно и возвращает обратно, аналог tmux resize-pane -Z. Остальные панели никуда не деваются.
Уведомление о долгой команде
notify_on_cmd_finish invisible 30
Самая недооценённая настройка. Если команда шла дольше 30 секунд и окно в этот момент неактивно — прилетит системное уведомление. Ушёл читать почту, пока идёт билд — тебя позовут.
Слово invisible важно: уведомление приходит только когда окно не на виду. Иначе бы дёргало на каждый go build.
Shell integration и remote control
allow_remote_control yes
shell_integration enabled
shell_integration даёт то, чего в терминалах обычно нет: Kitty начинает понимать, где кончается вывод одной команды и начинается другая. Отсюда прыжки по промптам и подсветка границ вывода.
allow_remote_control открывает управление из скриптов — kitty @ launch, kitty @ set-tab-title и прочее. Нужно, если собираешься автоматизировать раскладку окон. Если не собираешься — лучше не включать: это всё-таки открытый сокет управления терминалом.
Мелочи, которые я выбрал под себя
modify_font cell_height 120%
scrollback_lines 10000
copy_on_select yes
cell_height 120% — больше воздуха между строками. Чисто вопрос глаз, кому-то покажется разреженно.
scrollback_lines 10000 — мне столько хватает, чтобы отлистать вывод неудачного деплоя целиком. Гоняешь очень болтливые логи — ставь больше, память там копеечная.
copy_on_select — выделил, уже в буфере. Привычка из Linux, на macOS сначала непривычно.
Nerd Font (JetBrainsMono Nerd Font Mono) нужен не сам по себе, а если у тебя starship, neovim с иконками или powerline-таббар — без него вместо иконок будут квадраты.
Что реально поломалось: tmux по ssh
Единственная настоящая проблема за всё время.
При подключении по ssh на машину, где живёт tmux, ломались escape-последовательности: съезжали цвета, мусорились рамки, местами не работали клавиши. Причина в том, что Kitty представляется как TERM=xterm-kitty, а на удалённой машине такого terminfo нет — она просто не знает, что это за терминал.
Правильное решение оказалось встроенным: kitty +kitten ssh сам доставляет terminfo на удалённый хост перед подключением.
# ~/.zshrc
[ "$TERM" = "xterm-kitty" ] && alias ssh="kitty +kitten ssh"
Проверка $TERM тут не для красоты: без неё alias сломает ssh во всех остальных терминалах — в том же VS Code или в CI-шелле, где kitty в PATH может и не быть.
После этого проблема ушла полностью.
Альтернатива, если kitten ssh почему-то не подходит — прописать TERM=xterm-256color перед подключением. Работает, но теряются возможности, за которые Kitty и брали.
Полный kitty.conf
Конфиг целиком, с комментариями
# Kitty Configuration
# Путь: ~/.config/kitty/kitty.conf
# Перезагрузка без рестарта: Ctrl+Shift+F5 (Linux) / Ctrl+Cmd+, (macOS)
# ─────────────────────────────────────────────
# 1. ШРИФТЫ
# ─────────────────────────────────────────────
# Установи Nerd Font: https://www.nerdfonts.com/font-downloads
# brew install --cask font-jetbrains-mono-nerd-font (macOS)
font_family JetBrainsMono Nerd Font Mono
bold_font auto
italic_font auto
bold_italic_font auto
font_size 12.0
# Межстрочный интервал — чуть увеличен для читаемости
modify_font cell_height 120%
# Лигатуры (-> => != === и т.д.)
disable_ligatures never
# ─────────────────────────────────────────────
# 2. ТЕМА
# ─────────────────────────────────────────────
# Выбрать тему интерактивно: kitty +kitten themes
# После выбора тема сохранится в current-theme.conf
# BEGIN_KITTY_THEME
# Catppuccin-Mocha
include current-theme.conf
# END_KITTY_THEME
# ─────────────────────────────────────────────
# 3. ПРОЗРАЧНОСТЬ И РАЗМЫТИЕ
# ─────────────────────────────────────────────
background_opacity 0.92
background_blur 25
# ─────────────────────────────────────────────
# 4. КУРСОР
# ─────────────────────────────────────────────
cursor_shape beam
cursor_beam_thickness 2.0
cursor_blink_interval 0.5
cursor_stop_blinking_after 15.0
# Анимация следа курсора (kitty 0.38+)
# cursor_trail 3
# cursor_trail_decay 0.1 0.4
# cursor_trail_start_threshold 2
# ─────────────────────────────────────────────
# 5. SCROLLBACK
# ─────────────────────────────────────────────
scrollback_lines 10000
# ─────────────────────────────────────────────
# 6. ЗВУК И УВЕДОМЛЕНИЯ
# ─────────────────────────────────────────────
enable_audio_bell no
visual_bell_duration 0.0
bell_on_tab "🔔 "
# Уведомление при завершении долгой команды (30+ сек)
notify_on_cmd_finish invisible 30
# ─────────────────────────────────────────────
# 7. МЫШЬ И КОПИРОВАНИЕ
# ─────────────────────────────────────────────
copy_on_select yes
strip_trailing_spaces smart
# URL
url_style curly
open_url_with default
detect_urls yes
# ─────────────────────────────────────────────
# 8. ОКНО
# ─────────────────────────────────────────────
# Убрать рамку окна (titlebar) — на macOS выглядит чисто
hide_window_decorations titlebar-only
# Отступы внутри окна
window_padding_width 8
# Рамки между сплитами
window_border_width 1pt
active_border_color #89b4fa
inactive_border_color #313244
draw_minimal_borders yes
confirm_os_window_close 0
# Начальный размер окна
remember_window_size yes
initial_window_width 120c
initial_window_height 35c
# ─────────────────────────────────────────────
# 9. TAB BAR
# ─────────────────────────────────────────────
tab_bar_edge bottom
tab_bar_style powerline
tab_powerline_style slanted
tab_bar_min_tabs 2
active_tab_foreground #1e1e2e
active_tab_background #89b4fa
active_tab_font_style bold
inactive_tab_foreground #cdd6f4
inactive_tab_background #313244
inactive_tab_font_style normal
# ─────────────────────────────────────────────
# 10. LAYOUTS (сплиты)
# ─────────────────────────────────────────────
enabled_layouts splits:split_axis=horizontal,fat,tall,stack
# ─────────────────────────────────────────────
# 11. SHELL INTEGRATION & REMOTE CONTROL
# ─────────────────────────────────────────────
allow_remote_control yes
shell_integration enabled
# ─────────────────────────────────────────────
# 12. ГОРЯЧИЕ КЛАВИШИ
# ─────────────────────────────────────────────
# --- Сплиты ---
map f5 launch --location=hsplit --cwd=current
map f6 launch --location=vsplit --cwd=current
# Навигация между сплитами
map cmd+shift+h neighboring_window left
map cmd+shift+l neighboring_window right
map cmd+shift+k neighboring_window up
map cmd+shift+j neighboring_window down
# Ресайз сплитов
map ctrl+shift+alt+left resize_window narrower 2
map ctrl+shift+alt+right resize_window wider 2
map ctrl+shift+alt+up resize_window taller 2
map ctrl+shift+alt+down resize_window shorter 2
# --- Табы ---
map ctrl+shift+t new_tab_with_cwd
map ctrl+shift+w close_tab
map ctrl+shift+right next_tab
map ctrl+shift+left previous_tab
map ctrl+shift+. move_tab_forward
map ctrl+shift+, move_tab_backward
map cmd+1 goto_tab 1
map cmd+2 goto_tab 2
map cmd+3 goto_tab 3
map cmd+4 goto_tab 4
map cmd+5 goto_tab 5
map cmd+6 goto_tab 6
map cmd+7 goto_tab 7
map cmd+8 goto_tab 8
map cmd+9 goto_tab 9
# --- Новое окно в текущей директории ---
map ctrl+shift+enter new_window_with_cwd
# --- Полный экран для текущего сплита (toggle stack layout) ---
map ctrl+shift+z toggle_layout stack
# --- Перезагрузка конфига ---
# Linux: Ctrl+Shift+F5 (по умолчанию)
# macOS: Ctrl+Cmd+, (по умолчанию)
# ─────────────────────────────────────────────
# 13. macOS-СПЕЦИФИЧНОЕ
# ─────────────────────────────────────────────
# Opt работает как Alt для терминальных приложений
macos_option_as_alt yes
# Не закрывать Kitty при закрытии последнего окна
macos_quit_when_last_window_closed no
# Paste по physical key position (не зависит от раскладки)
map cmd+0x76 paste_from_clipboard
Кому это не нужно
Честно про границы, чтобы не тратить чужое время:
- Если тебя устраивает iTerm — переезжать незачем. Выигрыш здесь не в скорости, а в воспроизводимости конфига. Не болит — не лечи.
- Если ты живёшь в tmux и он настроен под себя — сплиты Kitty тебе не нужны, а половина смысла переезда именно в них.
- Если работаешь в основном по ssh — большая часть настроек касается локального терминала, а на удалёнке ты всё равно в tmux на той стороне.
Kitty стоит смотреть, если тебе близка мысль «конфигурация — это файл в репозитории», и раздражает, что терминал из этой картины выпадает.
Итог
Обратно на iTerm не тянуло ни разу. Startup sessions закрыли последний аргумент — раскладка рабочего места стала таким же файлом в git, как .zshrc и init.lua.
Из неожиданного: сплиты Kitty вытеснили tmux из локальной работы полностью. Я этого не планировал, но панелями пользовался только за них.
Если пробовали WezTerm или Ghostty и остались там — расскажите, что оказалось решающим. Мне правда интересно, чего я не увидел.
