dotfiles/terminal/.config/wezterm/events.lua
Marty Oehme a2f3fe87c3
wezterm: Copy logical lines from scrollback buffer
When copying the recent buffer into an editor for copying/editing/doing
whatever with, we should copy *logical* lines since that is generally
what we want to be working with instead of arbitrary line-breaks.

Wezterm helpfully provides us this possibility (thanks, Wez!).
2023-06-22 12:33:31 +02:00

81 lines
2.2 KiB
Lua

local wezterm = require("wezterm")
local io = require("io")
local os = require("os")
local act = wezterm.action
local function setup()
local function isViProcess(pane)
return pane:get_foreground_process_name():find("n?vim") ~= nil
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_logical_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)
wezterm.on("toggle-leader", function(window, pane)
wezterm.log_info("toggling the leader")
local overrides = window:get_config_overrides() or {}
if not overrides.leader then
wezterm.log_info("leader wasn't set")
overrides.leader = { key = "s", mods = "SUPER" }
else
wezterm.log_info("leader was set")
overrides.leader = nil
end
window:set_config_overrides(overrides)
end)
end
return { setup = setup }