Я давно привык, что всё настраивается файлом: 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 и остались там — расскажите, что оказалось решающим. Мне правда интересно, чего я не увидел.