From ce298b96007afdd4ef96c500adccca576ee6dc78 Mon Sep 17 00:00:00 2001 From: Noah Masur <7386960+nmasur@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:16:58 -0700 Subject: [PATCH] wezterm: refactor config and add session management --- modules/common/applications/wezterm.nix | 294 ++++++++++++++---------- 1 file changed, 168 insertions(+), 126 deletions(-) diff --git a/modules/common/applications/wezterm.nix b/modules/common/applications/wezterm.nix index ae163ff..11abb95 100644 --- a/modules/common/applications/wezterm.nix +++ b/modules/common/applications/wezterm.nix @@ -102,135 +102,177 @@ }; }; extraConfig = '' - return { - color_scheme = "myTheme", + local wezterm = require("wezterm") + local config = wezterm.config_builder() + config.check_for_updates = false + config.color_scheme = "myTheme" - -- Scrollback - scrollback_lines = 10000, + -- Scrollback + config.scrollback_lines = 10000 - -- Window - window_padding = { - left = 10, - right = 10, - top = 10, - bottom = 10, - }, - - font = wezterm.font('${font}', { weight = 'Bold'}), - font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"}, - - -- Fix color blocks instead of text - front_end = "WebGpu", - - -- Tab Bar - hide_tab_bar_if_only_one_tab = true, - window_frame = { - font = wezterm.font('${font}', { weight = 'Bold'}), - font_size = ${if pkgs.stdenv.isLinux then "12.0" else "16.0"}, - }, - - colors = { - tab_bar = { - active_tab = { - bg_color = '${config.theme.colors.base00}', - fg_color = '${config.theme.colors.base04}', - }, - }, - }, - - -- Disable audio - audible_bell = "Disabled", - - initial_rows = 80, - initial_cols = 200, - - keys = { - -- sends completion string for fish autosuggestions - { - key = 'Enter', - mods = 'SHIFT', - action = wezterm.action.SendString '\x1F' - }, - -- ctrl-shift-h was "hide" - { - key = 'H', - mods = 'SHIFT|CTRL', - action = wezterm.action.DisableDefaultAssignment - }, - -- alt-enter was "fullscreen" - { - key = 'Enter', - mods = 'ALT', - action = wezterm.action.DisableDefaultAssignment - }, - -- make super-f "fullscreen" - { - key = 'f', - mods = 'SUPER', - action = wezterm.action.ToggleFullScreen - }, - -- super-t open new tab in new dir - { - key = 't', - mods = ${if pkgs.stdenv.isDarwin then "'SUPER'" else "'ALT'"}, - action = wezterm.action.SpawnCommandInNewTab { - cwd = wezterm.home_dir, - }, - }, - -- shift-super-t open new tab in same dir - { - key = 't', - mods = 'SUPER|SHIFT', - action = wezterm.action.SpawnTab 'CurrentPaneDomain' - }, - -- project switcher - { - key = 'P', - mods = 'SUPER', - action = wezterm.action_callback(function(window, pane) - local choices = {} - - wezterm.log_info "working?" - - function scandir(directory) - local i, t, popen = 0, {}, io.popen - local pfile = popen('${pkgs.fd}/bin/fd --search-path "'..directory..'" --type directory --exact-depth 2 | ${pkgs.proximity-sort}/bin/proximity-sort "'..os.getenv("HOME").."/dev/work"..'"') - for filename in pfile:lines() do - i = i + 1 - t[i] = filename - end - pfile:close() - return t - end - - for _, v in pairs(scandir(os.getenv("HOME").."/dev")) do - table.insert(choices, { label = v }) - end - - window:perform_action( - wezterm.action.InputSelector { - action = wezterm.action_callback(function(window, pane, id, label) - if not id and not label then - wezterm.log_info "cancelled" - else - window:perform_action( - wezterm.action.SpawnCommandInNewTab { - cwd = label, - }, - pane - ) - end - end), - fuzzy = true, - title = "Select Project", - choices = choices, - }, - pane - ) - end), - }, - }, + -- Window + config.window_padding = { + left = 10, + right = 10, + top = 10, + bottom = 10, } + + config.font = wezterm.font('${font}', { weight = 'Bold'}) + config.font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"} + + -- Fix color blocks instead of text + config.front_end = "WebGpu" + + -- Tab Bar + config.hide_tab_bar_if_only_one_tab = true + config.window_frame = { + font = wezterm.font('${font}', { weight = 'Bold'}), + font_size = ${if pkgs.stdenv.isLinux then "12.0" else "16.0"}, + } + + config.colors = { + tab_bar = { + active_tab = { + bg_color = '${config.theme.colors.base00}', + fg_color = '${config.theme.colors.base04}', + }, + }, + } + + -- Disable audio + config.audible_bell = "Disabled" + + config.initial_rows = 80 + config.initial_cols = 200 + + config.unix_domains = { + { + name = 'unix', + }, + } + + config.leader = { + key = 'a', + mods = 'CTRL', + timeout_milliseconds = 2000, + } + + config.keys = { + -- Attach to muxer + { + key = 'a', + mods = 'LEADER', + action = wezterm.action.AttachDomain 'unix', + }, + + -- Detach from muxer + { + key = 'd', + mods = 'LEADER', + action = wezterm.action.DetachDomain { DomainName = 'unix' }, + }, + -- sends completion string for fish autosuggestions + { + key = 'Enter', + mods = 'SHIFT', + action = wezterm.action.SendString '\x1F' + }, + -- ctrl-shift-h was "hide" + { + key = 'H', + mods = 'SHIFT|CTRL', + action = wezterm.action.DisableDefaultAssignment + }, + -- alt-enter was "fullscreen" + { + key = 'Enter', + mods = 'ALT', + action = wezterm.action.DisableDefaultAssignment + }, + -- make super-f "fullscreen" + { + key = 'f', + mods = 'SUPER', + action = wezterm.action.ToggleFullScreen + }, + -- super-t open new tab in new dir + { + key = 't', + mods = ${if pkgs.stdenv.isDarwin then "'SUPER'" else "'ALT'"}, + action = wezterm.action.SpawnCommandInNewTab { + cwd = wezterm.home_dir, + }, + }, + -- shift-super-t open new tab in same dir + { + key = 't', + mods = 'SUPER|SHIFT', + action = wezterm.action.SpawnTab 'CurrentPaneDomain' + }, + -- project switcher + { + key = 'P', + mods = 'SUPER', + action = wezterm.action_callback(function(window, pane) + local choices = {} + + wezterm.log_info "working?" + + function scandir(directory) + local i, t, popen = 0, {}, io.popen + local pfile = popen('${pkgs.fd}/bin/fd --search-path "'..directory..'" --type directory --exact-depth 2 | ${pkgs.proximity-sort}/bin/proximity-sort "'..os.getenv("HOME").."/dev/work"..'"') + for filename in pfile:lines() do + i = i + 1 + t[i] = filename + end + pfile:close() + return t + end + + for _, v in pairs(scandir(os.getenv("HOME").."/dev")) do + table.insert(choices, { label = v }) + end + + window:perform_action( + wezterm.action.InputSelector { + action = wezterm.action_callback(function(window, pane, id, label) + if not id and not label then + wezterm.log_info "cancelled" + else + window:perform_action( + wezterm.action.SpawnCommandInNewTab { + cwd = label, + }, + pane + ) + end + end), + fuzzy = true, + title = "Select Project", + choices = choices, + }, + pane + ) + end), + }, + } + + -- print the workspace name at the upper right + wezterm.on("update-right-status", function(window, pane) + window:set_right_status(window:active_workspace()) + end) + -- load plugin + local workspace_switcher = wezterm.plugin.require("https://github.com/MLFlexer/smart_workspace_switcher.wezterm") + -- set path to zoxide + workspace_switcher.zoxide_path = "${pkgs.zoxide}/bin/zoxide" + -- keymaps + table.insert(config.keys, { key = "s", mods = "CTRL|SHIFT", action = workspace_switcher.switch_workspace() }) + -- table.insert(config.keys, { key = "t", mods = "CTRL|SHIFT", action = wezterm.action.ShowLauncherArgs({ flags = "FUZZY|WORKSPACES" }) }) + table.insert(config.keys, { key = "[", mods = "CTRL|SHIFT", action = wezterm.action.SwitchWorkspaceRelative(1) }) + table.insert(config.keys, { key = "]", mods = "CTRL|SHIFT", action = wezterm.action.SwitchWorkspaceRelative(-1) }) + + return config ''; }; };