Capture modern wezterm config
This commit is contained in:
@@ -0,0 +1,232 @@
|
|||||||
|
-- Pull in the wezterm API
|
||||||
|
local wezterm = require 'wezterm'
|
||||||
|
local config = {}
|
||||||
|
local act = wezterm.action
|
||||||
|
|
||||||
|
if wezterm.config_builder then
|
||||||
|
config = wezterm.config_builder()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
-- 1. HELPERS & STATE
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
local function is_vim(pane)
|
||||||
|
-- This checks the process name of the active pane
|
||||||
|
local process_name = pane:get_foreground_process_name()
|
||||||
|
return process_name:find('n?vim') ~= nil or process_name:find('vim.exe') ~= nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local key_to_dir = {
|
||||||
|
h = 'Left',
|
||||||
|
j = 'Down',
|
||||||
|
k = 'Up',
|
||||||
|
l = 'Right',
|
||||||
|
}
|
||||||
|
|
||||||
|
local function split_nav(resize_or_move, key)
|
||||||
|
return {
|
||||||
|
key = key,
|
||||||
|
mods = resize_or_move == 'resize' and 'META' or 'CTRL',
|
||||||
|
action = wezterm.action_callback(function(win, pane)
|
||||||
|
if is_vim(pane) then
|
||||||
|
-- pass the keys through to vim/nvim
|
||||||
|
win:perform_action({
|
||||||
|
SendKey = { key = key, mods = resize_or_move == 'resize' and 'META' or 'CTRL' },
|
||||||
|
}, pane)
|
||||||
|
else
|
||||||
|
if resize_or_move == 'resize' then
|
||||||
|
win:perform_action({ AdjustPaneSize = { key_to_dir[key], 3 } }, pane)
|
||||||
|
else
|
||||||
|
win:perform_action({ ActivatePaneDirection = key_to_dir[key] }, pane)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
-- 2. EVENTS (Status Bar & Workspace Tracking)
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
wezterm.on('update-right-status', function(window, pane)
|
||||||
|
local cells = {}
|
||||||
|
|
||||||
|
-- Workspace Name
|
||||||
|
table.insert(cells, " " .. window:active_workspace())
|
||||||
|
|
||||||
|
-- Battery/Power (check if battery info exists to avoid errors on desktops)
|
||||||
|
local battery = wezterm.battery_info()
|
||||||
|
if battery and #battery > 0 then
|
||||||
|
for _, b in ipairs(battery) do
|
||||||
|
table.insert(cells, string.format('%.0f%%', b.state_of_charge * 100))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Date & Day
|
||||||
|
table.insert(cells, wezterm.strftime(' %a %d %b'))
|
||||||
|
|
||||||
|
-- Time
|
||||||
|
table.insert(cells, wezterm.strftime(' %H:%M'))
|
||||||
|
|
||||||
|
local colors = { '#313244', '#45475a', '#585b70', '#6c7086' } -- Catppuccin Mocha colors
|
||||||
|
local text_fg = '#cdd6f4'
|
||||||
|
|
||||||
|
local elements = {}
|
||||||
|
for i, seg in ipairs(cells) do
|
||||||
|
table.insert(elements, { Background = { Color = colors[i] or '#313244' } })
|
||||||
|
table.insert(elements, { Foreground = { Color = text_fg } })
|
||||||
|
table.insert(elements, { Text = ' ' .. seg .. ' ' })
|
||||||
|
end
|
||||||
|
|
||||||
|
window:set_right_status(wezterm.format(elements))
|
||||||
|
end)
|
||||||
|
|
||||||
|
wezterm.on('format-window-title', function(tab, pane, tabs, panes, config)
|
||||||
|
local zoomed = 'wezterm: '
|
||||||
|
if tab.active_pane.is_zoomed then zoomed = '[Z] ' end
|
||||||
|
local index = #tabs > 1 and string.format('[%d/%d] ', tab.tab_index + 1, #tabs) or ''
|
||||||
|
return zoomed .. index .. tab.active_pane.title
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
-- 3. VISUALS (Windows 11 Mica & Aesthetics)
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
{{- if eq .chezmoi.os "windows" }}
|
||||||
|
config.win32_system_backdrop = 'Mica'
|
||||||
|
config.window_background_opacity = 0.85
|
||||||
|
config.prefer_egl = true -- Often smoother on Windows
|
||||||
|
{{- else }}
|
||||||
|
config.window_background_opacity = 1.0
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
config.text_background_opacity = 1.0
|
||||||
|
config.color_scheme = 'Adventure'
|
||||||
|
config.front_end = "WebGpu"
|
||||||
|
config.webgpu_power_preference = 'HighPerformance'
|
||||||
|
config.max_fps = 120
|
||||||
|
config.animation_fps = 1 -- Disable UI animations for "snappier" feel
|
||||||
|
|
||||||
|
config.font = wezterm.font('CaskaydiaCove NF', { weight = 'Regular' })
|
||||||
|
config.font_size = 10.0
|
||||||
|
config.line_height = 1.1 -- Slightly more breathing room
|
||||||
|
config.default_cursor_style = "SteadyBar"
|
||||||
|
|
||||||
|
config.window_decorations = "INTEGRATED_BUTTONS | RESIZE"
|
||||||
|
config.use_fancy_tab_bar = false -- Faster rendering than fancy tab bar
|
||||||
|
config.enable_scroll_bar = false -- Cleaner look
|
||||||
|
config.initial_rows = 48
|
||||||
|
config.initial_cols = 160
|
||||||
|
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
-- 4. GENERAL CONFIG
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
config.use_ime = false -- Reduces input latency
|
||||||
|
config.use_dead_keys = false -- Better for coding (no double-quote issues)
|
||||||
|
config.pane_focus_follows_mouse = true
|
||||||
|
config.inactive_pane_hsb = {
|
||||||
|
saturation = 0.8,
|
||||||
|
brightness = 0.5,
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Colors for the UI
|
||||||
|
config.colors = {
|
||||||
|
split = '#313244',
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Default Shell Configuration
|
||||||
|
{{- if eq .chezmoi.os "windows" }}
|
||||||
|
config.default_prog = { 'pwsh.exe', '-NoLogo' }
|
||||||
|
{{- else }}
|
||||||
|
config.default_prog = { 'zsh', '-l' }
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
config.scrollback_lines = 20000
|
||||||
|
config.enable_kitty_graphics = true
|
||||||
|
config.ssh_backend = "Ssh2"
|
||||||
|
|
||||||
|
-- Leader key Configuration
|
||||||
|
config.leader = { key = ' ', mods = 'CTRL', timeout_milliseconds = 1000 }
|
||||||
|
|
||||||
|
config.launch_menu = {
|
||||||
|
{{- if eq .chezmoi.os "windows" }}
|
||||||
|
{ label = "PowerShell", args = {"C:/Program Files/PowerShell/7/pwsh.exe"}, domain = {DomainName="local"}},
|
||||||
|
{ label = 'cmd', args = {'cmd.exe'}},
|
||||||
|
{ label = 'Ubuntu', args = {'wsl','-d','Ubuntu'}}
|
||||||
|
{{- else }}
|
||||||
|
{ label = "Zsh", args = {"zsh", "-l"}},
|
||||||
|
{{- end }}
|
||||||
|
}
|
||||||
|
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
-- 5. KEYBINDINGS
|
||||||
|
-- --------------------------------------------------------------------
|
||||||
|
config.keys = {
|
||||||
|
-- Leader passthrough
|
||||||
|
{ key = 'b', mods = 'LEADER|CTRL', action = act.SendKey { key = 'a', mods = 'CTRL' }},
|
||||||
|
|
||||||
|
-- Smart Splits (CTRL+h/j/k/l to move between WezTerm and Neovim)
|
||||||
|
split_nav('move', 'h'),
|
||||||
|
split_nav('move', 'j'),
|
||||||
|
split_nav('move', 'k'),
|
||||||
|
split_nav('move', 'l'),
|
||||||
|
|
||||||
|
-- Panes
|
||||||
|
{ key = "\\", mods="LEADER", action=act{SplitVertical={domain="CurrentPaneDomain"}}},
|
||||||
|
{ key = "|", mods="LEADER|SHIFT", action=act{SplitHorizontal={domain="CurrentPaneDomain"}}},
|
||||||
|
{ key = "w", mods="CTRL|SHIFT", action=act{CloseCurrentPane={confirm=true}}},
|
||||||
|
{ key = "z", mods="LEADER", action=act.TogglePaneZoomState },
|
||||||
|
|
||||||
|
-- Tabs
|
||||||
|
{ key = 'n', mods = 'CTRL|SHIFT', action=act.SpawnTab 'DefaultDomain'},
|
||||||
|
{ key = "Tab", mods="CTRL", action=act{ActivateTabRelative=-1}},
|
||||||
|
{ key = "Tab", mods="CTRL|SHIFT", action=act{ActivateTabRelative=1}},
|
||||||
|
|
||||||
|
-- Workspaces
|
||||||
|
{ key = 's', mods = 'LEADER', action = act.ShowLauncherArgs { flags = 'WORKSPACES' }},
|
||||||
|
{ key = '$', mods = 'LEADER|SHIFT', action = act.PromptInputLine {
|
||||||
|
description = 'Enter new name for workspace',
|
||||||
|
action = wezterm.action_callback(function(window, pane, line)
|
||||||
|
if line then wezterm.mux.rename_workspace(wezterm.mux.get_active_workspace(), line) end
|
||||||
|
end),
|
||||||
|
}},
|
||||||
|
|
||||||
|
-- Quick Select (Grab URLs/Hashes)
|
||||||
|
{
|
||||||
|
key = 'f',
|
||||||
|
mods = 'LEADER',
|
||||||
|
action = act.QuickSelectArgs {
|
||||||
|
label = 'open url',
|
||||||
|
patterns = { 'https?://\\S+' },
|
||||||
|
action = wezterm.action_callback(function(window, pane)
|
||||||
|
local url = window:get_selection_text_for_pane(pane)
|
||||||
|
wezterm.open_with(url)
|
||||||
|
end),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Bind number keys to tabs
|
||||||
|
for i = 1, 9 do
|
||||||
|
table.insert(config.keys, {
|
||||||
|
key = tostring(i),
|
||||||
|
mods = 'CTRL',
|
||||||
|
action = act.ActivateTab(i - 1),
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Mouse Bindings
|
||||||
|
config.mouse_bindings = {
|
||||||
|
{
|
||||||
|
event = { Down = { streak = 3, button = 'Left' } },
|
||||||
|
action = act.SelectTextAtMouseCursor 'SemanticZone',
|
||||||
|
mods = 'NONE',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Hyperlink rules
|
||||||
|
config.hyperlink_rules = wezterm.default_hyperlink_rules()
|
||||||
|
table.insert(config.hyperlink_rules, {
|
||||||
|
regex = [=[(\b[A-Za-z]:\\[^\s:"']+\b)]=],
|
||||||
|
format = 'file://$1',
|
||||||
|
})
|
||||||
|
|
||||||
|
return config
|
||||||
Reference in New Issue
Block a user