---@type wezterm local wezterm = require("wezterm") local act = wezterm.action local shortcuts = {} ---@param key string ---@param mods string|string[] ---@param action wezterm.Action ---@return nil local map = function(key, mods, action) if type(mods) == "string" then table.insert(shortcuts, { key = key, mods = mods, action = action }) elseif type(mods) == "table" then for _, mod in pairs(mods) do table.insert(shortcuts, { key = key, mods = mod, action = action }) end end end local toggleTabBar = wezterm.action_callback(function(window) window:set_config_overrides({ enable_tab_bar = not window:effective_config().enable_tab_bar, }) end) local openUrl = 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), }) -- use 'Backslash' to split horizontally map("\\", "LEADER", act.SplitHorizontal({ domain = "CurrentPaneDomain" })) -- and 'Minus' to split vertically map("-", "LEADER", act.SplitVertical({ domain = "CurrentPaneDomain" })) -- map 1-9 to switch to tab 1-9, 0 for the last tab for i = 1, 9 do map(tostring(i), { "LEADER", "SUPER" }, act.ActivateTab(i - 1)) end map("0", { "LEADER", "SUPER" }, act.ActivateTab(-1)) -- 'hjkl' to move between panes map("h", { "LEADER", "SUPER" }, act.ActivatePaneDirection("Left")) map("j", { "LEADER", "SUPER" }, act.ActivatePaneDirection("Down")) map("k", { "LEADER", "SUPER" }, act.ActivatePaneDirection("Up")) map("l", { "LEADER", "SUPER" }, act.ActivatePaneDirection("Right")) -- resize map("h", "LEADER|SHIFT", act.AdjustPaneSize({ "Left", 5 })) map("j", "LEADER|SHIFT", act.AdjustPaneSize({ "Down", 5 })) map("k", "LEADER|SHIFT", act.AdjustPaneSize({ "Up", 5 })) map("l", "LEADER|SHIFT", act.AdjustPaneSize({ "Right", 5 })) -- spawn & close map("c", "LEADER", act.SpawnTab("CurrentPaneDomain")) map("x", "LEADER", act.CloseCurrentPane({ confirm = true })) map("t", { "SHIFT|CTRL", "SUPER" }, act.SpawnTab("CurrentPaneDomain")) map("w", { "SHIFT|CTRL", "SUPER" }, act.CloseCurrentTab({ confirm = true })) map("n", { "SHIFT|CTRL", "SUPER" }, act.SpawnWindow) -- zoom states map("z", { "LEADER", "SUPER" }, act.TogglePaneZoomState) map("Z", { "LEADER", "SUPER" }, toggleTabBar) -- copy & paste map("v", "LEADER", act.ActivateCopyMode) map("c", { "SHIFT|CTRL", "SUPER" }, act.CopyTo("Clipboard")) map("v", { "SHIFT|CTRL", "SUPER" }, act.PasteFrom("Clipboard")) map("f", { "SHIFT|CTRL", "SUPER" }, act.Search({ CaseInSensitiveString = "" })) -- rotation map("e", { "LEADER", "SUPER" }, act.RotatePanes("Clockwise")) -- pickers map(" ", "LEADER", act.QuickSelect) map("o", { "LEADER", "SUPER" }, openUrl) map("p", { "LEADER", "SUPER" }, act.PaneSelect({ alphabet = "asdfghjkl;" })) map("R", { "LEADER", "SUPER" }, act.ReloadConfiguration) map("u", "SHIFT|CTRL", act.CharSelect) map("p", { "SHIFT|CTRL", "SHIFT|SUPER" }, act.ActivateCommandPalette) -- view map("Enter", "ALT", act.ToggleFullScreen) map("-", { "CTRL", "SUPER" }, act.DecreaseFontSize) map("=", { "CTRL", "SUPER" }, act.IncreaseFontSize) map("0", { "CTRL", "SUPER" }, act.ResetFontSize) -- switch fonts map("f", "LEADER", act.EmitEvent("switch-font")) -- debug map("l", "SHIFT|CTRL", act.ShowDebugOverlay) map( "r", { "LEADER", "SUPER" }, act.ActivateKeyTable({ name = "resize_mode", one_shot = false, }) ) local key_tables = { resize_mode = { { key = "h", action = act.AdjustPaneSize({ "Left", 1 }) }, { key = "j", action = act.AdjustPaneSize({ "Down", 1 }) }, { key = "k", action = act.AdjustPaneSize({ "Up", 1 }) }, { key = "l", action = act.AdjustPaneSize({ "Right", 1 }) }, { key = "LeftArrow", action = act.AdjustPaneSize({ "Left", 1 }) }, { key = "DownArrow", action = act.AdjustPaneSize({ "Down", 1 }) }, { key = "UpArrow", action = act.AdjustPaneSize({ "Up", 1 }) }, { key = "RightArrow", action = act.AdjustPaneSize({ "Right", 1 }) }, }, } -- add a common escape sequence to all key tables for k, _ in pairs(key_tables) do table.insert(key_tables[k], { key = "Escape", action = "PopKeyTable" }) table.insert(key_tables[k], { key = "Enter", action = "PopKeyTable" }) table.insert( key_tables[k], { key = "c", mods = "CTRL", action = "PopKeyTable" } ) end local M = {} M.apply = function(c) c.leader = { key = "s", mods = "CTRL", timeout_milliseconds = math.maxinteger, } c.keys = shortcuts c.disable_default_key_bindings = true c.key_tables = key_tables c.mouse_bindings = { { event = { Down = { streak = 1, button = { WheelUp = 1 } } }, mods = "NONE", action = act.ScrollByLine(5), }, { event = { Down = { streak = 1, button = { WheelDown = 1 } } }, mods = "NONE", action = act.ScrollByLine(-5), }, } end return M