From 011dee305e82584f091d2d53dc59ae54d0290032 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sun, 5 Feb 2023 04:01:32 +0000 Subject: [PATCH] fix(nvim): add workaround for lack of OSC 7 We are working around the problem of neovim not outputting OSC 7 properly. The issue link is as follows https://github.com/neovim/neovim/issues/2252 --- dot_config/nvim/lua/binds.lua | 10 +- dot_config/wezterm/wezterm.lua | 403 ++++++++++++++++++--------------- 2 files changed, 230 insertions(+), 183 deletions(-) diff --git a/dot_config/nvim/lua/binds.lua b/dot_config/nvim/lua/binds.lua index d6016cb..94b68b3 100644 --- a/dot_config/nvim/lua/binds.lua +++ b/dot_config/nvim/lua/binds.lua @@ -1,11 +1,17 @@ local wk = require("which-key") +-- what a workaround (screw you @nekowinston :sob:) +-- https://github.com/wez/wezterm/discussions/2426 +-- https://github.com/neovim/neovim/issues/2252 wk.register({ - ["0"] = { "0^", "" } -}) + [""] = { "lua io.popen('wezterm cli split-pane --right --cwd .')", "All my homies hate OSC 7" }, + [""] = { "lua io.popen('wezterm cli split-pane --bottom --cwd .')", "All my homies hate OSC 7" }, +}, { mode = { "n", "i", "v", "t" } }) -- normal binds wk.register({ + ["0"] = { "0^", "Start of Line" }, + [""] = { "o", "New Line Without Insert" }, [""] = { "write", "Save" }, [""] = { "zz", "Half page down" }, [""] = { "zz", "Half page up" }, diff --git a/dot_config/wezterm/wezterm.lua b/dot_config/wezterm/wezterm.lua index a7144a3..e86560b 100644 --- a/dot_config/wezterm/wezterm.lua +++ b/dot_config/wezterm/wezterm.lua @@ -1,210 +1,251 @@ -local wezterm = require 'wezterm'; +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 = "~" + 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 + 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' + 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 + 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 - end - return result + 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 + 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 - 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 + + 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 = new_tab_bg - e_fg = inactive_bg + s_bg = inactive_bg + s_fg = inactive_fg + e_bg = inactive_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 }, - } + + 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 { - color_scheme = "Catppuccin Mocha", - font = wezterm.font_with_fallback { "VictorMono Nerd Font" }, - font_size = 14, - background = { { - source = { File = "/home/hammy/Pictures/astronaut.png", }, - hsb = { brightness = 0.15, 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, - - 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.Copy }, - { key = 'V', mods = 'CTRL', action = act.PasteFrom 'Clipboard' }, - - -- Open Pane - { key = "n", mods = "ALT|SHIFT", action = act({ SplitHorizontal = { domain = "CurrentPaneDomain" } }), }, - { key = "m", mods = "ALT|SHIFT", action = act({ SplitVertical = { domain = "CurrentPaneDomain" } }), }, - -- 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+", + color_scheme = "Catppuccin Mocha", + font = wezterm.font_with_fallback({ "VictorMono Nerd Font" }), + font_size = 14, + background = { + { + source = { File = "Pictures/astronaut.png" }, + hsb = { brightness = 0.15, 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.Copy }, + { 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), }, - action = wezterm.action_callback(function(window, pane) - local url = window:get_selection_text_for_pane(pane) - wezterm.open_with(url) - 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) }, }, - } }