local wez = require 'wezterm' local agent = require 'bugabinga.agent' local workspace_switcher = require 'bugabinga.workspace_switcher' local leader = { key = 'VoidSymbol', } if wez.target_triple:find 'windows' then leader = { key = 'raw:255', } end local font_mode = ' Font mode (- + 0) ESC to exit' local pane_mode = ' Pane (hjkl a v s x t c r R = q H L)' local resize_pane_mode = (wez.nerdfonts.md_resize or '↔') .. ' Resize Pane (hjkl HJKL)' local confirm_quit = wez.action.Confirmation { message = 'Quit WezTerm?', action = wez.action_callback( function ( window, pane ) window:perform_action( wez.action.QuitApplication, pane ) end ), } local open_url = wez.action.QuickSelectArgs { label = 'open URL', patterns = { 'https?://[^"\'<>\\s]+', }, action = wez.action_callback( function ( window, pane ) local url = window:get_selection_text_for_pane( pane ) if url ~= '' then wez.open_with( url ) end end ), } local rename_tab = wez.action.PromptInputLine { description = 'Enter a new tab name, or leave empty to reset it', action = wez.action_callback( function ( window, _, line ) if line then window:active_tab():set_title( line ) end end ), } local key_tables = { [resize_pane_mode] = { { key = 'h', action = wez.action.AdjustPaneSize { 'Left', 1, }, }, { key = 'j', action = wez.action.AdjustPaneSize { 'Down', 1, }, }, { key = 'k', action = wez.action.AdjustPaneSize { 'Up', 1, }, }, { key = 'l', action = wez.action.AdjustPaneSize { 'Right', 1, }, }, { key = 'H', action = wez.action.AdjustPaneSize { 'Left', 5, }, }, { key = 'J', action = wez.action.AdjustPaneSize { 'Down', 5, }, }, { key = 'K', action = wez.action.AdjustPaneSize { 'Up', 5, }, }, { key = 'L', action = wez.action.AdjustPaneSize { 'Right', 5, }, }, -- Cancel the mode { key = 'Escape', action = 'PopKeyTable', }, }, [font_mode] = { { key = 'Minus', action = wez.action.DecreaseFontSize, }, { key = 'Equal', action = wez.action.IncreaseFontSize, }, { key = '0', action = wez.action.ResetFontSize, }, { key = 'Escape', action = 'PopKeyTable', }, }, [pane_mode] = { { key = 'h', action = wez.action.ActivatePaneDirection 'Left', }, { key = 'j', action = wez.action.ActivatePaneDirection 'Down', }, { key = 'k', action = wez.action.ActivatePaneDirection 'Up', }, { key = 'l', action = wez.action.ActivatePaneDirection 'Right', }, { key = 'a', action = wez.action.PaneSelect, }, { key = 'v', action = wez.action.SplitHorizontal { domain = 'CurrentPaneDomain', }, }, { key = 's', action = wez.action.SplitVertical { domain = 'CurrentPaneDomain', }, }, { key = 'r', action = wez.action.RotatePanes 'CounterClockwise', }, { key = 'R', action = wez.action.RotatePanes 'Clockwise', }, { key = 'x', action = wez.action.PaneSelect { mode = 'SwapWithActiveKeepFocus', }, }, { key = 't', action = wez.action.PaneSelect { mode = 'MoveToNewTab', }, }, { key = 'c', action = rename_tab, }, { key = '=', action = wez.action.ActivateKeyTable { name = resize_pane_mode, one_shot = false, }, }, { key = 'H', action = wez.action.MoveTabRelative( -1 ), }, { key = 'L', action = wez.action.MoveTabRelative( 1 ), }, { key = 'q', action = wez.action.CloseCurrentPane { confirm = false, }, }, { key = 'Escape', action = 'PopKeyTable', }, }, } -- Move tab to position 1-9 in pane mode for i = 1, 9 do table.insert( key_tables[pane_mode], { key = tostring( i ), action = wez.action.MoveTab( i - 1 ), } ) end local keys = { { key = '?', mods = 'LEADER|SHIFT', action = wez.action.ShowLauncherArgs { title = '󰌌 Custom Keybinds', flags = 'FUZZY|KEY_ASSIGNMENTS', }, }, { key = '0', mods = 'LEADER', action = wez.action.ActivateKeyTable { name = font_mode, one_shot = false, }, }, { key = 'w', mods = 'LEADER', action = wez.action.ActivateKeyTable { name = pane_mode, }, }, { key = 'f', mods = 'LEADER', action = wez.action.TogglePaneZoomState, }, { key = 'F5', mods = 'LEADER', action = wez.action.ReloadConfiguration, }, { key = 'F11', mods = 'LEADER', action = wez.action.ToggleFullScreen, }, { key = 'F10', mods = 'LEADER', action = wez.action_callback( require 'bugabinga.presentation_mode'.toggle ), }, { key = 'F12', mods = 'LEADER', action = wez.action.ShowDebugOverlay, }, { key = '.', mods = 'LEADER', action = wez.action.CharSelect { copy_on_select = true, copy_to = 'ClipboardAndPrimarySelection', }, }, { key = 'a', mods = 'LEADER', action = agent.switcher(), }, { key = 'n', mods = 'LEADER', action = wez.action.PromptInputLine { description = wez.format { ---@diagnostic disable-next-line: missing-fields { Attribute = { Intensity = 'Bold', }, }, { Foreground = { AnsiColor = 'Purple', }, }, { Text = 'New workspace:', }, }, action = wez.action_callback( function ( window, pane, line ) if line then window:perform_action( wez.action.SwitchToWorkspace { name = line, }, pane ) end end ), }, }, { key = 'c', mods = 'CTRL|SHIFT', action = wez.action.CopyTo 'Clipboard', }, { key = 'v', mods = 'CTRL|SHIFT', action = wez.action.PasteFrom 'Clipboard', }, { key = 't', mods = 'LEADER', action = wez.action.SpawnTab 'CurrentPaneDomain', }, { key = 'u', mods = 'LEADER', action = wez.action.SpawnCommandInNewTab { domain = { DomainName = 'WSL:ArchLinux-dev', }, args = { 'nu', '--login', }, cwd = '~', }, }, { key = 'U', mods = 'LEADER|SHIFT', action = wez.action.SpawnCommandInNewTab { domain = { DomainName = 'local', }, args = { 'nu', '--login', }, cwd = wez.home_dir, }, }, { key = 'B', mods = 'LEADER|SHIFT', action = wez.action.SpawnCommandInNewTab { domain = 'DefaultDomain', }, }, { key = 'PageUp', action = wez.action_callback( function ( window, pane ) window:perform_action( pane:is_alt_screen_active() and wez.action.SendKey { key = 'PageUp', } or wez.action.ScrollByLine( -1 ), pane ) end ), }, { key = 'PageDown', action = wez.action_callback( function ( window, pane ) window:perform_action( pane:is_alt_screen_active() and wez.action.SendKey { key = 'PageDown', } or wez.action.ScrollByLine( 1 ), pane ) end ), }, { key = 'PageUp', mods = 'SHIFT', action = wez.action_callback( function ( window, pane ) window:perform_action( pane:is_alt_screen_active() and wez.action.SendKey { key = 'PageUp', mods = 'SHIFT', } or wez.action.ScrollByPage( -0.42 ), pane ) end ), }, { key = 'PageDown', mods = 'SHIFT', action = wez.action_callback( function ( window, pane ) window:perform_action( pane:is_alt_screen_active() and wez.action.SendKey { key = 'PageDown', mods = 'SHIFT', } or wez.action.ScrollByPage( 0.42 ), pane ) end ), }, { key = 'p', mods = 'LEADER', action = wez.action.ShowLauncherArgs { title = '🔭 Launcher', flags = 'FUZZY|DOMAINS|KEY_ASSIGNMENTS|COMMANDS|TABS', }, }, { key = 'Tab', mods = 'LEADER', action = wez.action.ShowLauncherArgs { flags = 'FUZZY|WORKSPACES', }, }, { key = 'd', mods = 'LEADER', action = wez.action.ShowLauncherArgs { title = '󰮫 Menu', flags = 'FUZZY|LAUNCH_MENU_ITEMS', }, }, { key = 'z', mods = 'LEADER', action = workspace_switcher.switch_workspace(), }, { key = 'Z', mods = 'LEADER|SHIFT', action = workspace_switcher.switch_workspace_in_new_window(), }, { key = 'k', mods = 'LEADER', action = wez.action.SwitchToWorkspace { name = 'dotfiles', }, }, { key = '/', mods = 'LEADER', action = wez.action.Search 'CurrentSelectionOrEmptyString', }, { key = ' ', mods = 'LEADER', action = open_url, }, { key = 'Enter', mods = 'LEADER', action = wez.action.QuickSelect, }, { key = 'v', mods = 'LEADER', action = wez.action.ActivateCopyMode, }, { key = 'UpArrow', mods = 'LEADER', action = wez.action.ScrollToPrompt( -1 ), }, { key = 'DownArrow', mods = 'LEADER', action = wez.action.ScrollToPrompt( 1 ), }, { key = 'q', mods = 'LEADER', action = confirm_quit, }, } -- Navigate Tabs by LEADER+n for i = 1, 8 do -- CTRL+ALT + number to activate that tab table.insert( keys, { key = tostring( i ), mods = 'LEADER', action = wez.action.ActivateTab( i - 1 ), } ) end if wez.target_triple:find 'windows' then table.insert( keys, { key = 'j', mods = 'LEADER', action = wez.action.SwitchToWorkspace { name = 'wsl', spawn = { domain = { DomainName = 'WSL:ArchLinux-dev', }, args = { 'nu', '--login', }, cwd = '~', }, }, } ) end return function ( cfg ) ---@cast cfg Config cfg.disable_default_key_bindings = true cfg.leader = leader cfg.keys = keys cfg.key_tables = key_tables end