317 lines
10 KiB
Bash
317 lines
10 KiB
Bash
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# Kitty + Neovim scrollback setup script (2026 style with kitty-scrollback.nvim)
|
|
# =============================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
# Install base packages
|
|
sudo apt update -qq
|
|
sudo apt install -y kitty kitty-terminfo kitty-shell-integration fonts-firacode
|
|
|
|
# =============================================================================
|
|
# Paths
|
|
# =============================================================================
|
|
|
|
DEST="${1:-/etc/skel}"
|
|
KITTY_HOME="${DEST}/.config/kitty"
|
|
ALIASES_D="${DEST}/.zsh_aliases.d"
|
|
ZSHRC_D="${DEST}/.zshrc.d"
|
|
SESSIONS_D="${KITTY_HOME}/sessions"
|
|
|
|
mkdir -p "${KITTY_HOME}" "${ALIASES_D}" "${ZSHRC_D}" "${SESSIONS_D}"
|
|
|
|
ALIAS_FILE="${ALIASES_D}/003_kitty.zsh"
|
|
|
|
# =============================================================================
|
|
# 1. OpenGL detection → decide if we force software rendering
|
|
# =============================================================================
|
|
|
|
should_use_software() {
|
|
local gl_version=""
|
|
local es_version=""
|
|
|
|
if command -v glxinfo >/dev/null 2>&1; then
|
|
gl_version=$(glxinfo | grep -i "OpenGL version string" | head -n 1 | awk -F: '{print $2}' | xargs)
|
|
if [[ "$gl_version" =~ ^([4-9]\.|3\.[3-9]) ]]; then
|
|
return 1 # hardware ok
|
|
fi
|
|
fi
|
|
|
|
if command -v eglinfo >/dev/null 2>&1; then
|
|
es_version=$(eglinfo -B 2>/dev/null | grep -i "OpenGL ES profile version" | head -n 1 | grep -oE '[0-9]+\.[0-9]+' || true)
|
|
if [[ "$es_version" =~ ^[3-9]\. ]]; then
|
|
return 1 # GLES 3+ usually good enough
|
|
fi
|
|
fi
|
|
|
|
return 0 # force software
|
|
}
|
|
|
|
conf_print_kitty_alias_hw() {
|
|
cat <<'EOF' | tee "${ALIAS_FILE}"
|
|
# kitty → hardware rendering (OpenGL ≥3.3 detected)
|
|
alias kitty="kitty"
|
|
EOF
|
|
}
|
|
|
|
conf_print_kitty_alias_sw() {
|
|
cat <<'EOF' | tee "${ALIAS_FILE}"
|
|
# kitty → software rendering (old/weak OpenGL)
|
|
alias kitty="LIBGL_ALWAYS_SOFTWARE=1 kitty"
|
|
EOF
|
|
}
|
|
|
|
if should_use_software; then
|
|
conf_print_kitty_alias_sw
|
|
echo "# Forced software rendering due to insufficient OpenGL support" | tee -a "${ALIAS_FILE}"
|
|
else
|
|
conf_print_kitty_alias_hw
|
|
echo "# Using hardware rendering" | tee -a "${ALIAS_FILE}"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# 2. Common kitty aliases (only active inside kitty)
|
|
# =============================================================================
|
|
|
|
cat <<'EOF' | tee -a "${ALIAS_FILE}"
|
|
|
|
if [[ "${XTERM}" = "xterm-kitty" || -n "${KITTY_INSTALLATION_DIR}" ]]; then
|
|
alias ssh="kitty +kitten ssh"
|
|
alias kt="kitty +kitten transfer"
|
|
fi
|
|
EOF
|
|
|
|
# =============================================================================
|
|
# 3. kitty ssh.conf stub
|
|
# =============================================================================
|
|
|
|
confi_print_kitty_ssh() {
|
|
cat <<'EOF'
|
|
# kitty +kitten ssh configuration
|
|
|
|
copy .zshrc
|
|
copy .vimrc
|
|
copy .vim
|
|
copy .gitconfig
|
|
|
|
# env EDITOR=nvim
|
|
# env LANG=en_US.UTF-8
|
|
|
|
# hostname build-*
|
|
# copy ~/.ssh/config
|
|
EOF
|
|
}
|
|
confi_print_kitty_ssh | tee "${KITTY_HOME}/ssh.conf"
|
|
|
|
# =============================================================================
|
|
# 4. Example session
|
|
# =============================================================================
|
|
|
|
conf_print_sessions() {
|
|
cat <<'EOF'
|
|
new_tab dev
|
|
cd ~/projects
|
|
title code
|
|
launch zsh -c 'nvim .'
|
|
launch zsh
|
|
layout tall
|
|
|
|
new_tab scratch
|
|
cd ~
|
|
launch zsh
|
|
layout tall
|
|
EOF
|
|
}
|
|
conf_print_sessions | tee "${SESSIONS_D}/kitty-session.conf"
|
|
|
|
# =============================================================================
|
|
# 5. Manual shell integration (tmux/containers friendly)
|
|
# =============================================================================
|
|
|
|
conf_print_zsh_int() {
|
|
cat <<'EOF'
|
|
# Manual kitty shell integration
|
|
if [[ -n "${KITTY_INSTALLATION_DIR:-}" ]]; then
|
|
export KITTY_SHELL_INTEGRATION="enabled"
|
|
autoload -Uz -- "${KITTY_INSTALLATION_DIR}/shell-integration/zsh/kitty-integration"
|
|
kitty-integration
|
|
unfunction kitty-integration
|
|
fi
|
|
EOF
|
|
}
|
|
conf_print_zsh_int | tee "${ZSHRC_D}/002_kitty.zsh"
|
|
|
|
# =============================================================================
|
|
# 6. Main kitty.conf + kitty-scrollback.nvim integration
|
|
# =============================================================================
|
|
# See /var/tmp/020_neovim-lazyvim_plugins.sh
|
|
|
|
conf_print_kitty() {
|
|
cat <<'EOF'
|
|
# vim:ft=kitty
|
|
|
|
# ─── Performance ─────────────────────────────────────────────────────────────
|
|
input_delay 0
|
|
repaint_delay 2
|
|
sync_to_monitor no
|
|
|
|
# ─── Font ────────────────────────────────────────────────────────────────────
|
|
font_family FiraCode Nerd Font
|
|
bold_font auto
|
|
italic_font auto
|
|
bold_italic_font auto
|
|
font_size 11.5
|
|
|
|
font_features FiraCode Nerd Font +cv04 +cv10 +ss04 +ss03 +cv25 +cv32 +cv28 +ss06 +ss07
|
|
disable_ligatures never
|
|
|
|
# ─── Cursor / Mouse ──────────────────────────────────────────────────────────
|
|
cursor_shape block
|
|
cursor_blink_interval 0
|
|
copy_on_select yes
|
|
strip_trailing_spaces always
|
|
|
|
# ─── Window ──────────────────────────────────────────────────────────────────
|
|
window_border_width 1px
|
|
hide_window_decorations no
|
|
background_opacity 0.88
|
|
|
|
# ─── Bell ────────────────────────────────────────────────────────────────────
|
|
enable_audio_bell no
|
|
window_alert_on_bell yes
|
|
bell_on_tab no
|
|
|
|
# ─── Tabs ────────────────────────────────────────────────────────────────────
|
|
tab_bar_edge top
|
|
tab_bar_style powerline
|
|
|
|
# ─── Updates & Integration ───────────────────────────────────────────────────
|
|
update_check_interval 0
|
|
shell_integration disabled
|
|
|
|
# ─── Browser ─────────────────────────────────────────────────────────────────
|
|
open_url_with default
|
|
|
|
# ─── Scrollback (modern 2026 style with kitty-scrollback.nvim) ───────────────
|
|
scrollback_lines 20000
|
|
scrollback_pager_history_size 4
|
|
|
|
# Required for kitty-scrollback.nvim remote control
|
|
# allow_remote_control yes
|
|
allow_remote_control socket-only
|
|
listen_on unix:/tmp/kitty-remote
|
|
|
|
# Recommended mappings
|
|
map ctrl+shift+question kitty_scrollback_nvim --config search
|
|
|
|
## nvim --headless +'KittyScrollbackGenerateKittens'
|
|
# kitty-scrollback.nvim Kitten alias
|
|
action_alias kitty_scrollback_nvim kitten /home/default/.local/share/nvim/lazy/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py
|
|
|
|
# Browse scrollback buffer in nvim
|
|
map kitty_mod+h kitty_scrollback_nvim
|
|
|
|
# Browse output of the last shell command in nvim
|
|
map kitty_mod+g kitty_scrollback_nvim --config ksb_builtin_last_cmd_output
|
|
|
|
# Show clicked command output in nvim
|
|
mouse_map ctrl+shift+right press ungrabbed combine : mouse_select_command_output : kitty_scrollback_nvim --config ksb_builtin_last_visited_cmd_output
|
|
|
|
## /
|
|
|
|
# Mouse: right-click under cursor → last command output
|
|
# mouse_map ctrl+shift+right press ungrabbed combine : mouse_select_command_output : kitty_scrollback_nvim --config last_cmd
|
|
|
|
# ─── Theme stub ──────────────────────────────────────────────────────────────
|
|
# BEGIN_KITTY_THEME
|
|
include current-theme.conf
|
|
# END_KITTY_THEME
|
|
EOF
|
|
}
|
|
conf_print_kitty | tee "${KITTY_HOME}/kitty.conf"
|
|
|
|
# =============================================================================
|
|
# 7. A few example themes
|
|
# =============================================================================
|
|
|
|
conf_print_nord_theme() {
|
|
cat <<'EOF'
|
|
foreground #d8dee9
|
|
background #2e3440
|
|
selection_foreground #d8dee9
|
|
selection_background #434c5e
|
|
cursor #d8dee9
|
|
cursor_text_color #2e3440
|
|
url_color #88c0d0
|
|
active_border_color #88c0d0
|
|
inactive_border_color #4c566a
|
|
color0 #3b4252
|
|
color1 #bf616a
|
|
color2 #a3be8c
|
|
color3 #ebcb8b
|
|
color4 #81a1c1
|
|
color5 #b48ead
|
|
color6 #88c0d0
|
|
color7 #e5e9f0
|
|
color8 #4c566a
|
|
color9 #bf616a
|
|
color10 #a3be8c
|
|
color11 #ebcb8b
|
|
color12 #81a1c1
|
|
color13 #b48ead
|
|
color14 #8fbcbb
|
|
color15 #eceff4
|
|
EOF
|
|
}
|
|
conf_print_nord_theme | tee "${KITTY_HOME}/Nord.conf"
|
|
|
|
conf_print_macchiato_theme() {
|
|
cat <<'EOF'
|
|
foreground #cad3f5
|
|
background #24273a
|
|
selection_foreground #24273a
|
|
selection_background #f4dbd6
|
|
cursor #f4dbd6
|
|
url_color #f4dbd6
|
|
active_border_color #b7bdf8
|
|
inactive_border_color #6e738d
|
|
color0 #494d64
|
|
color1 #ed8796
|
|
color2 #a6da95
|
|
color3 #eed49f
|
|
color4 #8aadf4
|
|
color5 #f5bde6
|
|
color6 #8bd5ca
|
|
color7 #b8c0e0
|
|
color8 #5b6078
|
|
color9 #ed8796
|
|
color10 #a6da95
|
|
color11 #eed49f
|
|
color12 #8aadf4
|
|
color13 #f5bde6
|
|
color14 #8bd5ca
|
|
color15 #a5adcb
|
|
EOF
|
|
}
|
|
conf_print_macchiato_theme | tee "${KITTY_HOME}/Catppuccin-Macchiato.conf"
|
|
|
|
# =============================================================================
|
|
# Final message
|
|
# =============================================================================
|
|
|
|
cat <<'EOF'
|
|
|
|
Kitty configuration written.
|
|
|
|
Next steps:
|
|
1. Make sure kitty-scrollback.nvim is installed in lazyvim
|
|
2. Restart kitty or source your shell
|
|
3. Test scrollback with ctrl+shift+h
|
|
4. Change theme interactively: kitty +kitten themes
|
|
5. Optional: run in Neovim :KittyScrollbackCheckHealth
|
|
|
|
Enjoy!
|
|
|
|
EOF
|