From 0a34b63540900fb936308f5d3368dc9017e5aa91 Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Sun, 29 Dec 2024 17:03:25 +0100 Subject: [PATCH] Initial WezTerm configuration --- README.md | 1 + wezterm/.config/wezterm/.gitignore | 4 + wezterm/.config/wezterm/.luarc.json | 3 + wezterm/.config/wezterm/.stylua.toml | 6 + wezterm/.config/wezterm/colors/custom.lua | 94 ++++++++ wezterm/.config/wezterm/config/appearance.lua | 87 ++++++++ wezterm/.config/wezterm/config/bindings.lua | 207 ++++++++++++++++++ wezterm/.config/wezterm/config/domains.lua | 5 + wezterm/.config/wezterm/config/fonts.lua | 14 ++ wezterm/.config/wezterm/config/general.lua | 50 +++++ wezterm/.config/wezterm/config/init.lua | 34 +++ wezterm/.config/wezterm/config/launch.lua | 34 +++ .../.config/wezterm/events/new-tab-button.lua | 21 ++ .../.config/wezterm/events/right-status.lua | 76 +++++++ wezterm/.config/wezterm/events/tab-title.lua | 175 +++++++++++++++ wezterm/.config/wezterm/utils/math.lua | 14 ++ wezterm/.config/wezterm/utils/platform.lua | 15 ++ wezterm/.config/wezterm/wezterm.lua | 13 ++ 18 files changed, 853 insertions(+) create mode 100644 wezterm/.config/wezterm/.gitignore create mode 100644 wezterm/.config/wezterm/.luarc.json create mode 100644 wezterm/.config/wezterm/.stylua.toml create mode 100644 wezterm/.config/wezterm/colors/custom.lua create mode 100644 wezterm/.config/wezterm/config/appearance.lua create mode 100644 wezterm/.config/wezterm/config/bindings.lua create mode 100644 wezterm/.config/wezterm/config/domains.lua create mode 100644 wezterm/.config/wezterm/config/fonts.lua create mode 100644 wezterm/.config/wezterm/config/general.lua create mode 100644 wezterm/.config/wezterm/config/init.lua create mode 100644 wezterm/.config/wezterm/config/launch.lua create mode 100644 wezterm/.config/wezterm/events/new-tab-button.lua create mode 100644 wezterm/.config/wezterm/events/right-status.lua create mode 100644 wezterm/.config/wezterm/events/tab-title.lua create mode 100644 wezterm/.config/wezterm/utils/math.lua create mode 100644 wezterm/.config/wezterm/utils/platform.lua create mode 100644 wezterm/.config/wezterm/wezterm.lua diff --git a/README.md b/README.md index 81294e8..fe29136 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Below is a list of the software: - Sway - Tmux - Waybar +- Wezterm - Yazi - Zellij - Zoxide diff --git a/wezterm/.config/wezterm/.gitignore b/wezterm/.config/wezterm/.gitignore new file mode 100644 index 0000000..83b8d56 --- /dev/null +++ b/wezterm/.config/wezterm/.gitignore @@ -0,0 +1,4 @@ +/luarocks.bat +/lua.bat +/lua_modules +/.luarocks diff --git a/wezterm/.config/wezterm/.luarc.json b/wezterm/.config/wezterm/.luarc.json new file mode 100644 index 0000000..23b9ee2 --- /dev/null +++ b/wezterm/.config/wezterm/.luarc.json @@ -0,0 +1,3 @@ +{ + "workspace.checkThirdParty": false +} \ No newline at end of file diff --git a/wezterm/.config/wezterm/.stylua.toml b/wezterm/.config/wezterm/.stylua.toml new file mode 100644 index 0000000..f49b59d --- /dev/null +++ b/wezterm/.config/wezterm/.stylua.toml @@ -0,0 +1,6 @@ +column_width = 100 +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 3 +quote_style = "AutoPreferSingle" +call_parentheses = "Always" diff --git a/wezterm/.config/wezterm/colors/custom.lua b/wezterm/.config/wezterm/colors/custom.lua new file mode 100644 index 0000000..a2e25e9 --- /dev/null +++ b/wezterm/.config/wezterm/colors/custom.lua @@ -0,0 +1,94 @@ +-- A slightly altered version of catppucchin mocha +-- please check: https://wezfurlong.org/wezterm/config/appearance.html +local mocha = { + rosewater = '#f5e0dc', + flamingo = '#f2cdcd', + pink = '#f5c2e7', + mauve = '#cba6f7', + red = '#f38ba8', + maroon = '#eba0ac', + peach = '#fab387', + yellow = '#f9e2af', + green = '#a6e3a1', + teal = '#94e2d5', + sky = '#89dceb', + sapphire = '#74c7ec', + blue = '#89b4fa', + lavender = '#b4befe', + text = '#cdd6f4', + subtext1 = '#bac2de', + subtext0 = '#a6adc8', + overlay2 = '#9399b2', + overlay1 = '#7f849c', + overlay0 = '#6c7086', + surface2 = '#585b70', + surface1 = '#45475a', + surface0 = '#313244', + base = '#1f1f28', + mantle = '#181825', + crust = '#11111b', +} + +local colorscheme = { + foreground = mocha.text, + background = mocha.base, + cursor_bg = mocha.rosewater, + cursor_border = mocha.rosewater, + cursor_fg = mocha.crust, + selection_bg = mocha.surface2, + selection_fg = mocha.text, + ansi = { + '#282828', -- black + '#cc241d', -- red + '#98971a', -- green + '#d79921', -- yellow + '#458588', -- blue + '#b16286', -- magenta/purple + '#3A96DD', -- cyan + '#CCCCCC', -- white + }, + brights = { + '#767676', -- black + '#E74856', -- red + '#16C60C', -- green + '#F9F1A5', -- yellow + '#3B78FF', -- blue + '#B4009E', -- magenta/purple + '#61D6D6', -- cyan + '#F2F2F2', -- white + }, + tab_bar = { + background = '#000000', + active_tab = { + bg_color = mocha.surface2, + fg_color = mocha.text, + }, + inactive_tab = { + bg_color = mocha.surface0, + fg_color = mocha.subtext1, + }, + inactive_tab_hover = { + bg_color = mocha.surface0, + fg_color = mocha.text, + }, + new_tab = { + bg_color = mocha.base, + fg_color = mocha.text, + }, + new_tab_hover = { + bg_color = mocha.mantle, + fg_color = mocha.text, + italic = true, + }, + }, + visual_bell = mocha.surface0, + indexed = { + [16] = mocha.peach, + [17] = mocha.rosewater, + }, + scrollbar_thumb = mocha.surface2, + split = mocha.overlay0, + compose_cursor = mocha.flamingo, -- nightbuild only +} + +return colorscheme diff --git a/wezterm/.config/wezterm/config/appearance.lua b/wezterm/.config/wezterm/config/appearance.lua new file mode 100644 index 0000000..32d98ef --- /dev/null +++ b/wezterm/.config/wezterm/config/appearance.lua @@ -0,0 +1,87 @@ +local wezterm = require('wezterm') +local colors = require('colors.custom') +local platform = require('utils.platform')() + +local config = {} +if platform.is_mac then + config.button_style = 'MacOsNative' + config.button_alignment = 'Left' +elseif platform.is_linux then + config.button_style = 'Gnome' + config.button_alignment = 'Right' +else + config.buttun_style = 'Windows' + config.button_alignment = 'Right' +end + +return { + term = 'xterm-256color', + animation_fps = 60, + max_fps = 60, + front_end = 'WebGpu', + webgpu_power_preference = 'HighPerformance', + warn_about_missing_glyphs = false, + + -- color scheme + -- colors = colors, if you want to setting your color custom + color_scheme = 'Gruvbox dark, medium (base16)', + + -- Set to deault rows and columns + initial_cols = 140, + initial_rows = 35, + + -- background + window_background_opacity = 0.80, + win32_system_backdrop = 'Acrylic', + background = { + { + source = { Color = '#1d2021' }, + height = '100%', + width = '100%', + opacity = 0.90, + }, + }, + + -- scrollbar + enable_scroll_bar = true, + min_scroll_bar_height = '3cell', + colors = { + scrollbar_thumb = '#34354D', + }, + + -- tab bar + enable_tab_bar = true, + hide_tab_bar_if_only_one_tab = false, + use_fancy_tab_bar = true, + tab_max_width = 25, + show_tab_index_in_tab_bar = true, + switch_to_last_active_tab_when_closing_tab = true, + + -- cursor + default_cursor_style = 'BlinkingBlock', + cursor_blink_ease_in = 'Constant', + cursor_blink_ease_out = 'Constant', + cursor_blink_rate = 0, + + -- window + adjust_window_size_when_changing_font_size = true, + window_decorations = 'INTEGRATED_BUTTONS|RESIZE', + integrated_title_button_style = config.button_style, + integrated_title_button_color = '#282828', + integrated_title_button_alignment = config.button_alignment, + + window_padding = { + left = 5, + right = 10, + top = 12, + bottom = 7, + }, + window_close_confirmation = 'AlwaysPrompt', + window_frame = { + active_titlebar_bg = '#282828', + inactive_titlebar_bg = '#282828', + -- font = fonts.font, + -- font_size = fonts.font_size, + }, + inactive_pane_hsb = { saturation = 1.0, brightness = 1.0 }, +} diff --git a/wezterm/.config/wezterm/config/bindings.lua b/wezterm/.config/wezterm/config/bindings.lua new file mode 100644 index 0000000..5a42a24 --- /dev/null +++ b/wezterm/.config/wezterm/config/bindings.lua @@ -0,0 +1,207 @@ +local wezterm = require('wezterm') +local platform = require('utils.platform')() +local act = wezterm.action + +local mod = {} + +if platform.is_mac then + mod.SUPER = 'SUPER' + mod.SUPER_REV = 'SUPER|CTRL' +elseif platform.is_win or platform.is_linux then + mod.SUPER = 'ALT' -- to not conflict with Windows key shortcuts + mod.SUPER_REV = 'ALT|CTRL' +end + +local keys = { + -- misc/useful -- + { key = 'F1', mods = 'NONE', action = 'ActivateCopyMode' }, + { key = 'F2', mods = 'NONE', action = act.ActivateCommandPalette }, + { key = 'F3', mods = 'NONE', action = act.ShowLauncher }, + { key = 'F4', mods = 'NONE', action = act.ShowTabNavigator }, + { key = 'F11', mods = 'NONE', action = act.ToggleFullScreen }, + { key = 'F12', mods = 'NONE', action = act.ShowDebugOverlay }, + { key = 'f', mods = mod.SUPER, action = act.Search({ CaseInSensitiveString = '' }) }, + + -- copy/paste -- + { key = 'c', mods = 'CTRL|SHIFT', action = act.CopyTo('Clipboard') }, + { key = 'v', mods = 'CTRL|SHIFT', action = act.PasteFrom('Clipboard') }, + + -- tabs -- + -- tabs: spawn+close + { key = 't', mods = mod.SUPER, action = act.SpawnTab('DefaultDomain') }, + { key = 't', mods = mod.SUPER_REV, action = act.SpawnTab({ DomainName = 'WSL:Ubuntu' }) }, + { key = 'w', mods = mod.SUPER_REV, action = act.CloseCurrentTab({ confirm = false }) }, + + -- tabs: navigation + { key = '[', mods = mod.SUPER, action = act.ActivateTabRelative(-1) }, + { key = ']', mods = mod.SUPER, action = act.ActivateTabRelative(1) }, + { key = '[', mods = mod.SUPER_REV, action = act.MoveTabRelative(-1) }, + { key = ']', mods = mod.SUPER_REV, action = act.MoveTabRelative(1) }, + + -- window -- + -- spawn windows + { key = 'n', mods = mod.SUPER, action = act.SpawnWindow }, + + -- panes -- + -- panes: split panes + { + key = [[/]], + mods = mod.SUPER_REV, + action = act.SplitVertical({ domain = 'CurrentPaneDomain' }), + }, + { + key = [[\]], + mods = mod.SUPER_REV, + action = act.SplitHorizontal({ domain = 'CurrentPaneDomain' }), + }, + { + key = [[-]], + mods = mod.SUPER_REV, + action = act.CloseCurrentPane({ confirm = true }), + }, + + -- panes: zoom+close pane + { key = 'z', mods = mod.SUPER_REV, action = act.TogglePaneZoomState }, + { key = 'w', mods = mod.SUPER, action = act.CloseCurrentPane({ confirm = false }) }, + + -- panes: navigation + { key = 'k', mods = mod.SUPER_REV, action = act.ActivatePaneDirection('Up') }, + { key = 'j', mods = mod.SUPER_REV, action = act.ActivatePaneDirection('Down') }, + { key = 'h', mods = mod.SUPER_REV, action = act.ActivatePaneDirection('Left') }, + { key = 'l', mods = mod.SUPER_REV, action = act.ActivatePaneDirection('Right') }, + + -- panes: resize + { key = 'UpArrow', mods = mod.SUPER_REV, action = act.AdjustPaneSize({ 'Up', 1 }) }, + { key = 'DownArrow', mods = mod.SUPER_REV, action = act.AdjustPaneSize({ 'Down', 1 }) }, + { key = 'LeftArrow', mods = mod.SUPER_REV, action = act.AdjustPaneSize({ 'Left', 1 }) }, + { key = 'RightArrow', mods = mod.SUPER_REV, action = act.AdjustPaneSize({ 'Right', 1 }) }, + + -- fonts -- + -- fonts: resize + { key = 'UpArrow', mods = mod.SUPER, action = act.IncreaseFontSize }, + { key = 'DownArrow', mods = mod.SUPER, action = act.DecreaseFontSize }, + { key = 'r', mods = mod.SUPER, action = act.ResetFontSize }, + + -- key-tables -- + -- resizes fonts + { + key = 'f', + mods = 'LEADER', + action = act.ActivateKeyTable({ + name = 'resize_font', + one_shot = false, + timemout_miliseconds = 1000, + }), + }, + -- resize panes + { + key = 'p', + mods = 'LEADER', + action = act.ActivateKeyTable({ + name = 'resize_pane', + one_shot = false, + timemout_miliseconds = 1000, + }), + }, + -- rename tab bar + { + key = 'R', + mods = 'CTRL|SHIFT', + action = act.PromptInputLine({ + description = 'Enter new name for tab', + action = wezterm.action_callback(function(window, pane, line) + -- line will be `nil` if they hit escape without entering anything + -- An empty string if they just hit enter + -- Or the actual line of text they wrote + if line then + window:active_tab():set_title(line) + end + end), + }), + }, +} + +local key_tables = { + resize_font = { + { key = 'k', action = act.IncreaseFontSize }, + { key = 'j', action = act.DecreaseFontSize }, + { key = 'r', action = act.ResetFontSize }, + { key = 'Escape', action = 'PopKeyTable' }, + { key = 'q', action = 'PopKeyTable' }, + }, + resize_pane = { + { key = 'k', action = act.AdjustPaneSize({ 'Up', 1 }) }, + { key = 'j', action = act.AdjustPaneSize({ 'Down', 1 }) }, + { key = 'h', action = act.AdjustPaneSize({ 'Left', 1 }) }, + { key = 'l', action = act.AdjustPaneSize({ 'Right', 1 }) }, + { key = 'Escape', action = 'PopKeyTable' }, + { key = 'q', action = 'PopKeyTable' }, + }, +} + +local mouse_bindings = { + -- Ctrl-click will open the link under the mouse cursor + { + event = { Up = { streak = 1, button = 'Left' } }, + mods = 'CTRL', + action = act.OpenLinkAtMouseCursor, + }, + -- Move mouse will only select text and not copy text to clipboard + { + event = { Down = { streak = 1, button = 'Left' } }, + mods = 'NONE', + action = act.SelectTextAtMouseCursor('Cell'), + }, + { + event = { Up = { streak = 1, button = 'Left' } }, + mods = 'NONE', + action = act.ExtendSelectionToMouseCursor('Cell'), + }, + { + event = { Drag = { streak = 1, button = 'Left' } }, + mods = 'NONE', + action = act.ExtendSelectionToMouseCursor('Cell'), + }, + -- Triple Left click will select a line + { + event = { Down = { streak = 3, button = 'Left' } }, + mods = 'NONE', + action = act.SelectTextAtMouseCursor('Line'), + }, + { + event = { Up = { streak = 3, button = 'Left' } }, + mods = 'NONE', + action = act.SelectTextAtMouseCursor('Line'), + }, + -- Double Left click will select a word + { + event = { Down = { streak = 2, button = 'Left' } }, + mods = 'NONE', + action = act.SelectTextAtMouseCursor('Word'), + }, + { + event = { Up = { streak = 2, button = 'Left' } }, + mods = 'NONE', + action = act.SelectTextAtMouseCursor('Word'), + }, + -- Turn on the mouse wheel to scroll the screen + { + event = { Down = { streak = 1, button = { WheelUp = 1 } } }, + mods = 'NONE', + action = act.ScrollByCurrentEventWheelDelta, + }, + { + event = { Down = { streak = 1, button = { WheelDown = 1 } } }, + mods = 'NONE', + action = act.ScrollByCurrentEventWheelDelta, + }, +} + +return { + disable_default_key_bindings = true, + disable_default_mouse_bindings = true, + leader = { key = 'Space', mods = 'CTRL|SHIFT' }, + keys = keys, + key_tables = key_tables, + mouse_bindings = mouse_bindings, +} diff --git a/wezterm/.config/wezterm/config/domains.lua b/wezterm/.config/wezterm/config/domains.lua new file mode 100644 index 0000000..153328e --- /dev/null +++ b/wezterm/.config/wezterm/config/domains.lua @@ -0,0 +1,5 @@ +-- Please check https://wezfurlong.org/wezterm/config/lua/SshDomain.html + +return { + ssh_domains = {}, +} diff --git a/wezterm/.config/wezterm/config/fonts.lua b/wezterm/.config/wezterm/config/fonts.lua new file mode 100644 index 0000000..b115024 --- /dev/null +++ b/wezterm/.config/wezterm/config/fonts.lua @@ -0,0 +1,14 @@ +local wezterm = require('wezterm') + +return { + font = wezterm.font_with_fallback({ + { family = 'CaskaydiaMono Nerd Font Mono', weight = 'Regular' }, + { family = 'FiraCode Nerd Font', weight= 'Regular' }, + { family = 'JetBrainsMono Nerd Font', weight = 'Regular' }, + }), + font_size = 16, + + --ref: https://wezfurlong.org/wezterm/config/lua/config/freetype_pcf_long_family_names.html#why-doesnt-wezterm-use-the-distro-freetype-or-match-its-configuration + freetype_load_target = 'Normal', ---@type 'Normal'|'Light'|'Mono'|'HorizontalLcd' + freetype_render_target = 'Normal', ---@type 'Normal'|'Light'|'Mono'|'HorizontalLcd' +} diff --git a/wezterm/.config/wezterm/config/general.lua b/wezterm/.config/wezterm/config/general.lua new file mode 100644 index 0000000..20ec9a8 --- /dev/null +++ b/wezterm/.config/wezterm/config/general.lua @@ -0,0 +1,50 @@ +return { + -- behaviours + automatically_reload_config = true, + check_for_updates = false, + exit_behavior = 'CloseOnCleanExit', -- if the shell program exited with a successful status + status_update_interval = 1000, + + -- scrollbar + scrollback_lines = 5000, + + -- paste behaviours + canonicalize_pasted_newlines = 'CarriageReturn', + + hyperlink_rules = { + -- Matches: a URL in parens: (URL) + { + regex = '\\((\\w+://\\S+)\\)', + format = '$1', + highlight = 1, + }, + -- Matches: a URL in brackets: [URL] + { + regex = '\\[(\\w+://\\S+)\\]', + format = '$1', + highlight = 1, + }, + -- Matches: a URL in curly braces: {URL} + { + regex = '\\{(\\w+://\\S+)\\}', + format = '$1', + highlight = 1, + }, + -- Matches: a URL in angle brackets: + { + regex = '<(\\w+://\\S+)>', + format = '$1', + highlight = 1, + }, + -- Then handle URLs not wrapped in brackets + { + regex = '\\b\\w+://\\S+[)/a-zA-Z0-9-]+', + format = '$0', + }, + -- implicit mailto link + { + regex = '\\b\\w+@[\\w-]+(\\.[\\w-]+)+\\b', + format = 'mailto:$0', + }, + }, +} diff --git a/wezterm/.config/wezterm/config/init.lua b/wezterm/.config/wezterm/config/init.lua new file mode 100644 index 0000000..ef3f810 --- /dev/null +++ b/wezterm/.config/wezterm/config/init.lua @@ -0,0 +1,34 @@ +local wezterm = require('wezterm') + +---@class Config +---@field options table +local Config = {} + +---Initialize Config +---@return Config +function Config:init() + local o = {} + self = setmetatable(o, { __index = Config }) + self.options = {} + return o +end + +---Append to `Config.options` +---@param new_options table new options to append +---@return Config +function Config:append(new_options) + for k, v in pairs(new_options) do + if self.options[k] ~= nil then + wezterm.log_warn( + 'Duplicate config option detected: ', + { old = self.options[k], new = new_options[k] } + ) + goto continue + end + self.options[k] = v + ::continue:: + end + return self +end + +return Config diff --git a/wezterm/.config/wezterm/config/launch.lua b/wezterm/.config/wezterm/config/launch.lua new file mode 100644 index 0000000..54e6be1 --- /dev/null +++ b/wezterm/.config/wezterm/config/launch.lua @@ -0,0 +1,34 @@ +local platform = require('utils.platform')() + +local options = { + default_prog = {}, + launch_menu = {}, +} + +if platform.is_win then + options.default_prog = { 'pwsh' } + options.launch_menu = { + { label = 'PowerShell Core', args = { 'pwsh' } }, + { label = 'PowerShell Desktop', args = { 'powershell' } }, + { + label = 'Git Bash', + args = { 'C:\\Program Files\\Git\\bin\\bash.exe' }, + } + } +elseif platform.is_mac or platform.is_linux then + options.default_prog = { '/bin/zsh', '-l' } + options.launch_menu = { + { label = 'Zsh', args = { 'zsh', '-l' } }, + { label = 'Bash', args = { 'bash', '-l' } }, + { label = 'Fish', args = { 'fish', '-l' } }, + } +elseif platform.is_linux then + options.default_prog = { 'zsh', '-l' } + options.launch_menu = { + { label = 'Zsh', args = { 'zsh', '-l' } }, + { label = 'Bash', args = { 'bash', '-l' } }, + { label = 'Fish', args = { 'fish', '-l' } }, + } +end + +return options diff --git a/wezterm/.config/wezterm/events/new-tab-button.lua b/wezterm/.config/wezterm/events/new-tab-button.lua new file mode 100644 index 0000000..b3a1b47 --- /dev/null +++ b/wezterm/.config/wezterm/events/new-tab-button.lua @@ -0,0 +1,21 @@ +local wezterm = require('wezterm') + +local M = {} + +M.setup = function() + wezterm.on('new-tab-button-click', function(window, pane, button, default_action) + wezterm.log_info('new-tab', window, pane, button, default_action) + if default_action and button == 'Left' then + window:perform_action(default_action, pane) + end + + if default_action and button == 'Right' then + window:perform_action( + wezterm.action.ShowLauncherArgs({ title = ' Select/Search:', flags = 'FUZZY|LAUNCH_MENU_ITEMS|DOMAINS'}), pane + ) + end + return false + end) +end + +return M diff --git a/wezterm/.config/wezterm/events/right-status.lua b/wezterm/.config/wezterm/events/right-status.lua new file mode 100644 index 0000000..93ac734 --- /dev/null +++ b/wezterm/.config/wezterm/events/right-status.lua @@ -0,0 +1,76 @@ +local wezterm = require('wezterm') +local math = require('utils.math') +local M = {} + +M.separator_char = ' ' + +M.colors = { + date_fg = '#79740e', + date_bg = '#282828', + battery_fg = '#79740e', + battery_bg = '#282828', + separator_fg = '#786D22', + separator_bg = '#282828', +} + +M.cells = {} -- wezterm FormatItems (ref: https://wezfurlong.org/wezterm/config/lua/wezterm/format.html) + +---@param text string +---@param icon string +---@param fg string +---@param bg string +---@param separate boolean +M.push = function(text, icon, fg, bg, separate) + table.insert(M.cells, { Foreground = { Color = fg } }) + table.insert(M.cells, { Background = { Color = bg } }) + table.insert(M.cells, { Attribute = { Intensity = 'Bold' } }) + table.insert(M.cells, { Text = icon .. ' ' .. text .. ' ' }) + + if separate then + table.insert(M.cells, { Foreground = { Color = M.colors.separator_fg } }) + table.insert(M.cells, { Background = { Color = M.colors.separator_bg } }) + table.insert(M.cells, { Text = M.separator_char }) + end + + table.insert(M.cells, 'ResetAttributes') +end + +M.set_date = function() + local date = wezterm.strftime(' %a %H:%M') + M.push(date, '', M.colors.date_fg, M.colors.date_bg, true) +end + +M.set_battery = function() + -- ref: https://wezfurlong.org/wezterm/config/lua/wezterm/battery_info.html + local discharging_icons = + { '', '', '', '', '', '', '', '', '', '' } + local charging_icons = { '', '', '', '', '', '', '', '', '', '' } + + local charge = '' + local icon = '🔋' + + for _, b in ipairs(wezterm.battery_info()) do + local idx = math.clamp(math.round(b.state_of_charge * 10), 1, 10) + charge = string.format('%.0f%%', b.state_of_charge * 100) + + if b.state == 'Charging' then + icon = charging_icons[idx] + else + icon = discharging_icons[idx] + end + end + + M.push(charge, ' 🔋', M.colors.battery_fg, M.colors.battery_bg, false) +end + +M.setup = function() + wezterm.on('update-right-status', function(window) + M.cells = {} + M.set_date() + M.set_battery() + + window:set_right_status(wezterm.format(M.cells)) + end) +end + +return M diff --git a/wezterm/.config/wezterm/events/tab-title.lua b/wezterm/.config/wezterm/events/tab-title.lua new file mode 100644 index 0000000..f63c6a8 --- /dev/null +++ b/wezterm/.config/wezterm/events/tab-title.lua @@ -0,0 +1,175 @@ +local wezterm = require('wezterm') +local platform = require('utils.platform')() + +-- Inspired by https://github.com/wez/wezterm/discussions/628#discussioncomment-1874614 + +local GLYPH_SEMI_CIRCLE_LEFT = '' +-- local GLYPH_SEMI_CIRCLE_LEFT = utf8.char(0xe0b6) +local GLYPH_SEMI_CIRCLE_RIGHT = '' +-- local GLYPH_SEMI_CIRCLE_RIGHT = utf8.char(0xe0b4) +local GLYPH_CIRCLE = '💤' --  +-- local GLYPH_CIRCLE = utf8.char(0xf111) +local GLYPH_ADMIN = 'ﱾ' +-- local GLYPH_ADMIN = utf8.char(0xfc7e) + +local M = {} + +M.cells = {} + +M.colors = { + default = { + bg = '#7c6f64', + fg = '#282828', + }, + is_active = { + bg = '#d79921', + fg = '#282828', + }, + hover = { + bg = '#d79921', + fg = '#282828', + }, +} + +M.set_process_name = function(s) + local a = string.gsub(s, '(.*[/\\])(.*)', '%2') + return a:gsub('%.exe$', '') +end + +M.set_title = function(process_name, static_title, active_title, max_width, inset) + local title + -- 󰌽   + local icon + inset = inset or 6 + + if platform.is_win and not process_name:find('wsl') then + icon = ' ' + elseif process_name:find('wsl') then + icon = ' ' + elseif platform.is_mac then + icon = ' ' + elseif platform.is_linux then + icon = ' ' + end + + title = icon .. process_name .. ' ~ ' .. ' ' + if process_name:len() > 0 and static_title:len() == 0 then + title = icon .. process_name .. ' ~ ' .. ' ' + elseif static_title:len() > 0 then + title = icon .. static_title .. ' ~ ' .. ' ' + else + title = icon .. active_title .. ' ~ ' .. ' ' + end + + if title:len() > max_width - inset then + local diff = title:len() - max_width + inset + title = wezterm.truncate_right(title, title:len() - diff) + end + + return title +end + +M.check_if_admin = function(p) + if p:match('^Administrator: ') then + return true + end + return false +end + +---@param fg string +---@param bg string +---@param attribute table +---@param text string +M.push = function(bg, fg, attribute, text) + table.insert(M.cells, { Background = { Color = bg } }) + table.insert(M.cells, { Foreground = { Color = fg } }) + table.insert(M.cells, { Attribute = attribute }) + table.insert(M.cells, { Text = text }) +end + +M.setup = function() + wezterm.on('format-tab-title', function(tab, tabs, panes, config, hover, max_width) + M.cells = {} + + local bg + local fg + local process_name = M.set_process_name(tab.active_pane.foreground_process_name) + local is_admin = M.check_if_admin(tab.active_pane.title) + local title = M.set_title( + process_name, + tab.tab_title, + tab.active_pane.title, + max_width, + (is_admin and 8) + ) + + if tab.is_active then + bg = M.colors.is_active.bg + fg = M.colors.is_active.fg + elseif hover then + bg = M.colors.hover.bg + fg = M.colors.hover.fg + else + bg = M.colors.default.bg + fg = M.colors.default.fg + end + + local has_unseen_output = false + for _, pane in ipairs(tab.panes) do + if pane.has_unseen_output then + has_unseen_output = true + break + end + end + + -- Left semi-circle + M.push(fg, bg, { Intensity = 'Bold' }, GLYPH_SEMI_CIRCLE_LEFT) + + -- Admin Icon + if is_admin then + M.push(bg, fg, { Intensity = 'Bold' }, ' ' .. GLYPH_ADMIN) + end + + -- Title + M.push(bg, fg, { Intensity = 'Bold' }, ' ' .. title) + + -- Unseen output alert + if has_unseen_output then + M.push(bg, '#79740e', { Intensity = 'Bold' }, ' ' .. GLYPH_CIRCLE) + end + + -- Right padding + M.push(bg, fg, { Intensity = 'Bold' }, ' ') + + -- Right semi-circle + M.push(fg, bg, { Intensity = 'Bold' }, GLYPH_SEMI_CIRCLE_RIGHT) + + return M.cells + end) +end + +return M + +-- local CMD_ICON = utf8.char(0xe62a) +-- local NU_ICON = utf8.char(0xe7a8) +-- local PS_ICON = utf8.char(0xe70f) +-- local ELV_ICON = utf8.char(0xfc6f) +-- local WSL_ICON = utf8.char(0xf83c) +-- local YORI_ICON = utf8.char(0xf1d4) +-- local NYA_ICON = utf8.char(0xf61a) +-- +-- local VIM_ICON = utf8.char(0xe62b) +-- local PAGER_ICON = utf8.char(0xf718) +-- local FUZZY_ICON = utf8.char(0xf0b0) +-- local HOURGLASS_ICON = utf8.char(0xf252) +-- local SUNGLASS_ICON = utf8.char(0xf9df) +-- +-- local PYTHON_ICON = utf8.char(0xf820) +-- local NODE_ICON = utf8.char(0xe74e) +-- local DENO_ICON = utf8.char(0xe628) +-- local LAMBDA_ICON = utf8.char(0xfb26) +-- +-- local SOLID_LEFT_ARROW = utf8.char(0xe0ba) +-- local SOLID_LEFT_MOST = utf8.char(0x2588) +-- local SOLID_RIGHT_ARROW = utf8.char(0xe0bc) +-- local ADMIN_ICON = utf8.char(0xf49c) diff --git a/wezterm/.config/wezterm/utils/math.lua b/wezterm/.config/wezterm/utils/math.lua new file mode 100644 index 0000000..e426d89 --- /dev/null +++ b/wezterm/.config/wezterm/utils/math.lua @@ -0,0 +1,14 @@ +local _math = math + +_math.clamp = function(x, min, max) + return x < min and min or (x > max and max or x) +end + +_math.round = function(x, increment) + if increment then + return _math.round(x / increment) * increment + end + return x >= 0 and math.floor(x + 0.5) or math.ceil(x - 0.5) +end + +return _math diff --git a/wezterm/.config/wezterm/utils/platform.lua b/wezterm/.config/wezterm/utils/platform.lua new file mode 100644 index 0000000..ec7cdaf --- /dev/null +++ b/wezterm/.config/wezterm/utils/platform.lua @@ -0,0 +1,15 @@ +local wezterm = require('wezterm') + +local function is_found(str, pattern) + return string.find(str, pattern) ~= nil +end + +local function platform() + return { + is_win = is_found(wezterm.target_triple, 'windows'), + is_linux = is_found(wezterm.target_triple, 'linux'), + is_mac = is_found(wezterm.target_triple, 'apple'), + } +end + +return platform diff --git a/wezterm/.config/wezterm/wezterm.lua b/wezterm/.config/wezterm/wezterm.lua new file mode 100644 index 0000000..e4cc194 --- /dev/null +++ b/wezterm/.config/wezterm/wezterm.lua @@ -0,0 +1,13 @@ +local Config = require('config') + +require('events.right-status').setup() +require('events.tab-title').setup() +require('events.new-tab-button').setup() + +return Config:init() + :append(require('config.appearance')) + :append(require('config.bindings')) + :append(require('config.domains')) + :append(require('config.fonts')) + :append(require('config.general')) + :append(require('config.launch')).options