You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

251 lines
7.1 KiB
Lua

local wezterm = require("wezterm")
local act = wezterm.action
local wsl_domains = wezterm.default_wsl_domains()
-- WSL related
for _, dom in ipairs(wsl_domains) do
dom.default_cwd = "~"
end
local function get_os()
local target = wezterm.target_triple
if string.find(target, "linux") then
return "linux"
elseif string.find(target, "darwin") then
return "macos"
else
return "windows"
end
end
if get_os() == "windows" then
default_prog = { "wsl.exe", "~", "-d", "Ubuntu-20.04" }
default_domain = "WSL:Ubuntu-20.04"
end
-- Superscript/Subscript
local function numberStyle(number, script)
local scripts = {
superscript = {
"",
"¹",
"²",
"³",
"",
"",
"",
"",
"",
"",
},
subscript = {
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
},
}
local numbers = scripts[script]
local number_string = tostring(number)
local result = ""
for i = 1, #number_string do
local char = number_string:sub(i, i)
local num = tonumber(char)
if num then
result = result .. numbers[num + 1]
else
result = result .. char
end
end
return result
end
-- Custom Tab Bar
wezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width)
local RIGHT_DIVIDER = utf8.char(0xe0bc)
local colours = config.resolved_palette.tab_bar
local active_tab_index = 0
for _, t in ipairs(tabs) do
if t.is_active == true then
active_tab_index = t.tab_index
end
end
local active_bg = colours.active_tab.bg_color
local active_fg = colours.active_tab.fg_color
local inactive_bg = colours.inactive_tab.bg_color
local inactive_fg = colours.inactive_tab.fg_color
local new_tab_bg = colours.new_tab.bg_color
local s_bg, s_fg, e_bg, e_fg
-- the last tab
if tab.tab_index == #tabs - 1 then
if tab.is_active then
s_bg = active_bg
s_fg = active_fg
e_bg = new_tab_bg
e_fg = active_bg
else
s_bg = inactive_bg
s_fg = inactive_fg
e_bg = new_tab_bg
e_fg = inactive_bg
end
elseif tab.tab_index == active_tab_index - 1 then
s_bg = inactive_bg
s_fg = inactive_fg
e_bg = active_bg
e_fg = inactive_bg
elseif tab.is_active then
s_bg = active_bg
s_fg = active_fg
e_bg = inactive_bg
e_fg = active_bg
else
s_bg = inactive_bg
s_fg = inactive_fg
e_bg = inactive_bg
e_fg = inactive_bg
end
local muxpanes = wezterm.mux.get_tab(tab.tab_id):panes()
local count = #muxpanes == 1 and "" or #muxpanes
return {
{ Background = { Color = s_bg } },
{ Foreground = { Color = s_fg } },
{
Text = " " .. tab.tab_index + 1 .. ": " .. tab.active_pane.title .. numberStyle(count, "superscript") .. " ",
},
{ Background = { Color = e_bg } },
{ Foreground = { Color = e_fg } },
{ Text = RIGHT_DIVIDER },
}
end)
return {
set_environment_variables = {
ZVM_TERM = "xterm-256color"
},
term = "wezterm",
color_scheme = "Catppuccin Mocha",
font = wezterm.font_with_fallback({ "VictorMono Nerd Font" }),
font_size = 13,
background = {
{
source = { File = "Pictures/astronaut.png" },
hsb = { brightness = 0.07, hue = 1.0, saturation = 0.1 },
},
},
default_domain = default_domain,
wsl_domains = wsl_domains,
default_prog = default_prog,
window_padding = { top = 0, bottom = 0, left = 0, right = 0 },
adjust_window_size_when_changing_font_size = false,
window_decorations = "RESIZE",
window_close_confirmation = "NeverPrompt",
use_fancy_tab_bar = false,
tab_bar_at_bottom = true,
hide_tab_bar_if_only_one_tab = true,
tab_max_width = 32,
scrollback_lines = 1000000,
exit_behavior = "CloseOnCleanExit",
clean_exit_codes = { 130 },
audible_bell = "Disabled",
disable_default_key_bindings = false,
keys = {
-- Fullscreen
{ key = "F11", action = wezterm.action.ToggleFullScreen },
-- Zoom
{ key = "z", mods = "ALT|SHIFT", action = wezterm.action.TogglePaneZoomState },
-- Copy / Paste
{ key = "C", mods = "CTRL", action = wezterm.action.CopyTo("Clipboard") },
{ key = "V", mods = "CTRL", action = act.PasteFrom("Clipboard") },
-- Open Pane
-- https://github.com/wez/wezterm/discussions/2426
-- https://github.com/neovim/neovim/issues/2252
{
key = "n",
mods = "ALT|SHIFT",
action = wezterm.action_callback(function(window, pane)
if pane:get_title() == "nvim" then
window:perform_action(act.SendKey({ key = "n", mods = "ALT|SHIFT" }), pane)
else
window:perform_action(act.SplitPane({ direction = "Right", size = { Percent = 50 } }), pane)
end
end),
},
{
key = "m",
mods = "ALT|SHIFT",
action = wezterm.action_callback(function(window, pane)
if pane:get_title() == "nvim" then
window:perform_action(act.SendKey({ key = "m", mods = "ALT|SHIFT" }), pane)
else
window:perform_action(act.SplitPane({ direction = "Down", size = { Percent = 50 } }), pane)
end
end),
},
-- Navigating Panes
{ key = "h", mods = "ALT|SHIFT", action = act.ActivatePaneDirection("Left") },
{ key = "l", mods = "ALT|SHIFT", action = act.ActivatePaneDirection("Right") },
{ key = "k", mods = "ALT|SHIFT", action = act.ActivatePaneDirection("Up") },
{ key = "j", mods = "ALT|SHIFT", action = act.ActivatePaneDirection("Down") },
-- Close Pane
{ key = "c", mods = "ALT|SHIFT", action = wezterm.action.CloseCurrentPane({ confirm = false }) },
-- Swap Panes
{ key = "i", mods = "ALT|SHIFT", action = act.PaneSelect({ alphabet = "asdfghjkl;", mode = "Activate" }) },
{
key = "s",
mods = "ALT|SHIFT",
action = act.PaneSelect({ alphabet = "asdfghjkl;", mode = "SwapWithActive" }),
},
-- Resize Panes
{ key = "LeftArrow", mods = "ALT|SHIFT", action = act({ AdjustPaneSize = { "Left", 5 } }) },
{ key = "DownArrow", mods = "ALT|SHIFT", action = act({ AdjustPaneSize = { "Down", 5 } }) },
{ key = "UpArrow", mods = "ALT|SHIFT", action = act({ AdjustPaneSize = { "Up", 5 } }) },
{ key = "RightArrow", mods = "ALT|SHIFT", action = act({ AdjustPaneSize = { "Right", 5 } }) },
-- New Tab
{ key = "n", mods = "CTRL|SHIFT", action = act({ SpawnTab = "CurrentPaneDomain" }) },
-- Swap Tabs
{ key = "h", mods = "CTRL|SHIFT", action = act.ActivateTabRelative(-1) },
{ key = "l", mods = "CTRL|SHIFT", action = act.ActivateTabRelative(1) },
-- Open Links
{
key = "o",
mods = "ALT|SHIFT",
action = wezterm.action.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),
}),
},
-- ScrollBack To Prompt
{ key = "UpArrow", mods = "CTRL|SHIFT", action = act.ScrollToPrompt(-1) },
{ key = "DownArrow", mods = "CTRL|SHIFT", action = act.ScrollToPrompt(1) },
},
}