local wezterm = require 'wezterm' local io = require 'io' local os = require 'os' local act = wezterm.action local function setup() local function isViProcess(pane) local proc = pane:get_foreground_process_name() if (proc:find('vim') or proc:find('nvim')) then return true end return false end local function conditionalActivatePane(window, pane, pane_direction, vim_direction) if (isViProcess(pane)) then window:perform_action(act.Multiple { act.SendKey { key = 'w', mods = 'CTRL' }, act.SendKey { key = vim_direction } }, pane) else window:perform_action(act.ActivatePaneDirection(pane_direction), pane) end end wezterm.on('ActivatePaneDirection-right', function(window, pane) conditionalActivatePane(window, pane, 'Right', 'l') end) wezterm.on('ActivatePaneDirection-left', function(window, pane) conditionalActivatePane(window, pane, 'Left', 'h') end) wezterm.on('ActivatePaneDirection-up', function(window, pane) conditionalActivatePane(window, pane, 'Up', 'k') end) wezterm.on('ActivatePaneDirection-down', function(window, pane) conditionalActivatePane(window, pane, 'Down', 'j') end) -- Retrieve the current scrollback text and send to editor wezterm.on('edit-scrollback', function(window, pane) local viewport_text = pane:get_lines_as_text(10000) -- Create a temporary file to pass to vim local name = os.tmpname() local f = io.open(name, 'w+') if f == nil then return false end f:write(viewport_text) f:flush() f:close() -- Open a new window running vim and tell it to open the file window:perform_action(act.SpawnCommandInNewTab { args = { (os.getenv('EDITOR') or 'vi'), name } }, pane) -- Wait time for vim to read the file before we remove it. wezterm.sleep_ms(1000) os.remove(name) end) end return { setup = setup }