feat(wezterm): initial commit

The initial release of the rootiest-wezterm config

BREAKING CHANGE: First Commit!
This commit is contained in:
2024-08-16 14:50:01 -04:00
commit 35ec6f0de6
13 changed files with 517 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

+104
View File
@@ -0,0 +1,104 @@
# Rootiest WezTerm Configuration
```none
██▀███ ▒█████ ▒█████ ▄▄▄█████▓ ██▓▓█████ ██████ ▄▄▄█████▓
▓██ ▒ ██▒▒██▒ ██▒▒██▒ ██▒▓ ██▒ ▓▒▓██▒▓█ ▀ ▒██ ▒ ▓ ██▒ ▓▒
▓██ ░▄█ ▒▒██░ ██▒▒██░ ██▒▒ ▓██░ ▒░▒██▒▒███ ░ ▓██▄ ▒ ▓██░ ▒░
▒██▀▀█▄ ▒██ ██░▒██ ██░░ ▓██▓ ░ ░██░▒▓█ ▄ ▒ ██▒░ ▓██▓ ░
░██▓ ▒██▒░ ████▓▒░░ ████▓▒░ ▒██▒ ░ ░██░░▒████▒▒██████▒▒ ▒██▒ ░
░ ▒▓ ░▒▓░░ ▒░▒░▒░ ░ ▒░▒░▒░ ▒ ░░ ░▓ ░░ ▒░ ░▒ ▒▓▒ ▒ ░ ▒ ░░
░▒ ░ ▒░ ░ ▒ ▒░ ░ ▒ ▒░ ░ ▒ ░ ░ ░ ░░ ░▒ ░ ░ ░
░░ ░ ░ ░ ░ ▒ ░ ░ ░ ▒ ░ ▒ ░ ░ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ░ ░ ░
██ ██ ███████ ███████ ████████ ███████ ██████ ███ ███
██ ██ ██ ███ ██ ██ ██ ██ ████ ████
██ █ ██ █████ ███ ██ █████ ██████ ██ ████ ██
██ ███ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██
███ ███ ███████ ███████ ██ ███████ ██ ██ ██ ██
▄████▄ ▒█████ ███▄ █ █████▒
▒██▀ ▀█ ▒██▒ ██▒ ██ ▀█ █ ▓██ ▒
▒▓█ ▄ ▒██░ ██▒▓██ ▀█ ██▒▒████ ░
▒▓▓▄ ▄██▒▒██ ██░▓██▒ ▐▌██▒░▓█▒ ░
▒ ▓███▀ ░░ ████▓▒░▒██░ ▓██░░▒█░
░ ░▒ ▒ ░░ ▒░▒░▒░ ░ ▒░ ▒ ▒ ▒ ░
░ ▒ ░ ▒ ▒░ ░ ░░ ░ ▒░ ░
░ ░ ░ ░ ▒ ░ ░ ░ ░ ░
░ ░ ░ ░ ░
╭─────────────╮
╭─────────────╮
│ $W │
│ │
│ │
╰─────────────╯
```
The rootiest WezTerm configuration you will ever see!
## Installation
1. Install [WezTerm](https://wezfurlong.org/wezterm/installation.html) (nightly)
2. Install pre-requisites
- Required
- [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts/) -
Nerd Fonts glyphs are required.
- Optional
- [fish](https://fishshell.com/)
- [neovim](https://neovim.io/)
3. Backup your current WezTerm configuration (if you have one)
```bash
mv ~/.config/wezterm ~/.config/wezterm.bak
mv ~/.wezterm.lua ~/.wezterm.lua.bak
```
4. Clone the repository
```bash
git clone https://github.com/rootiest/rootiest-wezterm.git ~/.config/wezterm
```
5. **Enjoy!** 🎉
## Features
- Smart key bindings
- Leader key and modal mode
- Session mux/management/resurrection
- Advanced tab management
- Splits and panes integrate seamlessly with NeoVim
- Seamless integration with fish shell
- Catppuccin theme by default
- Integrates cleanly with other Rootiest projects
## Screenshots
![Rootiest WezTerm](.screenshots/term.png)
## Companion Tools
[Rootiest Fish Conf](https://github.com/rootiest/rootiest-fish) -
Fish shell configuration that pairs well with this WezTerm configuration
and the NeoVim configuration.
[Rootiest Neovim](https://github.com/rootiest/rootiest-nvim) -
A NeoVim config built to work alongside this and the fish config.
[Nerd Fonts](https://github.com/ryanoasis/nerd-fonts/) -
A collection of fonts that include many icons and glyphs that are used in this configuration.
## Dotfiles
[Rootiest Dotfiles](https://github.com/rootiest/dotfiles)
## Credits
- [wezterm](https://github.com/wez/wezterm)
- [resurrect.wezterm](https://github.com/MLFlexer/resurrect.wezterm)
- [smart-splits.nvim](https://github.com/mrjones2014/smart-splits.nvim)
- [wezterm-bar](https://github.com/nekowinston/wezterm-bar)
+53
View File
@@ -0,0 +1,53 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ COLORS │
-- ╰─────────────────────────────────────────────────────────╯
return {
-- Color Scheme
color_scheme = "Catppuccin Frappe",
-- Tab Bar Colors
colors = {
tab_bar = {
inactive_tab_edge = "#484D69",
active_tab = {
bg_color = "#CA9EE6",
fg_color = "#232634",
intensity = "Normal",
underline = "None",
italic = false,
strikethrough = false,
},
inactive_tab = {
bg_color = "#484D69",
fg_color = "#C6D0F5",
},
inactive_tab_hover = {
bg_color = "#3b3052",
fg_color = "#C6D0F5",
italic = true,
intensity = "Bold",
},
new_tab = {
bg_color = "#737994",
fg_color = "#C6D0F5",
intensity = "Bold",
underline = "None",
italic = false,
strikethrough = false,
},
new_tab_hover = {
bg_color = "#3b3052",
fg_color = "#C6D0F5",
italic = true,
intensity = "Bold",
},
},
},
-- Titlebar Colors
window_frame = {
active_titlebar_bg = "#232634",
inactive_titlebar_bg = "#303446",
},
-- Terminal Variable
term = "wezterm",
}
+46
View File
@@ -0,0 +1,46 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ FONTS │
-- ╰─────────────────────────────────────────────────────────╯
return {
-- Terminal Font
font = WEZTERM.font({
family = "Iosevka",
weight = "Regular",
harfbuzz_features = {
"VSAH=7",
"VSAF=3",
"VSAI=3",
"VSAJ=8",
"VSAM=4",
"VLAB=5",
"cv10=7",
"cv41=3",
"cv44=6",
"cv07=4",
},
}),
font_size = 12.0,
-- Fancy Tab Bar Font
window_frame = {
font = WEZTERM.font({
family = "Iosevka",
weight = "Medium",
harfbuzz_features = {
"VSAH=7",
"VSAF=3",
"VSAI=3",
"VSAJ=8",
"VSAM=4",
"VLAB=5",
"cv10=7",
"cv41=3",
"cv44=6",
"cv07=4",
},
}),
font_size = 11,
},
-- Cursor Shape
default_cursor_style = "BlinkingBar",
}
+50
View File
@@ -0,0 +1,50 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ KEYS │
-- ╰─────────────────────────────────────────────────────────╯
-- Define action table
local act = WEZTERM.action
return {
leader = { key = " ", mods = "CTRL", timeout_milliseconds = 1500 },
keys = {
{ key = "a", mods = "LEADER|CTRL", action = WEZTERM.action.SendKey({ key = "a", mods = "CTRL" }) },
{ key = "|", mods = "LEADER|SHIFT", action = WEZTERM.action.SplitHorizontal({ domain = "CurrentPaneDomain" }) },
{ key = "_", mods = "LEADER|SHIFT", action = WEZTERM.action.SplitVertical({ domain = "CurrentPaneDomain" }) },
{ key = "h", mods = "SHIFT|CTRL", action = act.ActivatePaneDirection("Left") },
{ key = "l", mods = "SHIFT|CTRL", action = act.ActivatePaneDirection("Right") },
{ key = "k", mods = "SHIFT|CTRL", action = act.ActivatePaneDirection("Up") },
{ key = "j", mods = "SHIFT|CTRL", action = act.ActivatePaneDirection("Down") },
{ key = "h", mods = "ALT", action = act.AdjustPaneSize({ "Left", 1 }) },
{ key = "l", mods = "ALT", action = act.AdjustPaneSize({ "Right", 1 }) },
{ key = "k", mods = "ALT", action = act.AdjustPaneSize({ "Up", 1 }) },
{ key = "j", mods = "ALT", action = act.AdjustPaneSize({ "Down", 1 }) },
{
key = "s",
mods = "ALT",
action = WEZTERM.action.Multiple({
WEZTERM.action_callback(function(_, _)
RESURRECT.save_state(RESURRECT.workspace_state.get_workspace_state())
end),
}),
},
{
key = "r",
mods = "ALT",
action = WEZTERM.action.Multiple({
WEZTERM.action_callback(function(win, pane)
RESURRECT.fuzzy_load(win, pane, function(id, _)
id = string.match(id, "([^/]+)$")
id = string.match(id, "(.+)%..+$")
local state = RESURRECT.load_state(id, "workspace")
RESURRECT.workspace_state.restore_workspace(state, {
relative = true,
restore_text = true,
on_pane_restore = RESURRECT.tab_state.default_on_pane_restore,
})
end)
end),
}),
},
},
}
+20
View File
@@ -0,0 +1,20 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ WINDOW │
-- ╰─────────────────────────────────────────────────────────╯
return {
-- Set the initial size
initial_cols = 180,
initial_rows = 38,
-- Set the window padding
window_padding = {
left = 0,
right = 0,
top = 10,
bottom = 0,
},
-- Set the animation framerate
animation_fps = 120,
}
+56
View File
@@ -0,0 +1,56 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ OPTIONS │
-- ╰─────────────────────────────────────────────────────────╯
-- Load and merge configurations from the 'config' directory
local M = {}
-- Function to require all Lua files in a directory and merge them
local function require_configs(dir)
-- Check if the path exists
local path = dir or os.getenv("HOME") .. "/.config/wezterm/config/"
if not path then
print("Directory path is nil. Unable to load configurations.")
return
end
-- Open the directory
local pfile, open_err = io.popen('ls "' .. path .. '"')
if not pfile then
print("Error opening directory:", open_err)
return
end
local configs = {}
-- Iterate over the files in the directory
for file in pfile:lines() do
if file:match("%.lua$") then
local module_name = file:gsub("%.lua$", "")
local status, config = pcall(require, "config." .. module_name)
if status and type(config) == "table" then
configs[module_name] = config
elseif not status then
print("Error requiring config:", module_name, config)
else
print("Warning: Config not a table:", module_name)
end
end
end
pfile:close()
-- Merge configurations into CONFIG
for _, config in pairs(configs) do
for k, v in pairs(config) do
CONFIG[k] = v
end
end
end
function M.setup()
-- Load all configurations from the 'config' directory
require_configs()
end
return M
+48
View File
@@ -0,0 +1,48 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ PLUGINS │
-- ╰─────────────────────────────────────────────────────────╯
-- Load plugins from the 'plugins' directory
local M = {}
-- Function to require all Lua files in a directory
function M.require_plugins(dir)
-- Check if the path exists
local path = dir or os.getenv("HOME") .. "/.config/wezterm/plugins/"
if not path then
print("Directory path is nil. Unable to load plugins.")
return
end
-- Open the directory
local pfile, open_err = io.popen('ls "' .. path .. '"')
if not pfile then
print("Error opening directory:", open_err)
return
end
-- Iterate over the files in the directory
for file in pfile:lines() do
if file:match("%.lua$") then
local module_name = file:gsub("%.lua$", "")
local status, require_err = pcall(require, "plugins." .. module_name)
if not status then
print("Error requiring plugin:", module_name, require_err)
end
end
end
pfile:close()
end
-- Function to update all plugins
function M.update_plugins()
WEZTERM.plugin.update_all()
end
function M.setup()
-- Load all plugins from the 'plugins' directory
M.require_plugins()
end
return M
+16
View File
@@ -0,0 +1,16 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ HYPERLINKS │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
-- Hyperlink Rules
CONFIG.hyperlink_rules = WEZTERM.default_hyperlink_rules()
-- Add support for GitHub link style
table.insert(CONFIG.hyperlink_rules, {
regex = [[["]?([\w\d]{1}[-\w\d]+)(/){1}([-\w\d\.]+)["]?]],
format = "https://wwwezterm.github.com/$1/$3",
})
return M
+31
View File
@@ -0,0 +1,31 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ RESURRECT │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
-- Load Resurrect plugin
RESURRECT = WEZTERM.plugin.require("https://github.com/MLFlexer/resurrect.wezterm")
-- Set the periodic save interval
RESURRECT.periodic_save(60)
-- load the state whenever I create a new workspace
WEZTERM.on("smart_workspace_switcher.workspace_switcher.created", function(window, _, label)
local workspace_state = RESURRECT.workspace_state
workspace_state.restore_workspace(RESURRECT.load_state(label, "workspace"), {
window = window,
relative = true,
restore_text = true,
on_pane_restore = RESURRECT.tab_state.default_on_pane_restore,
})
end)
-- Save the state whenever I select a workspace
WEZTERM.on("smart_workspace_switcher.workspace_switcher.selected", function(_, _, _)
local workspace_state = RESURRECT.workspace_state
RESURRECT.save_state(workspace_state.get_workspace_state())
end)
return M
+24
View File
@@ -0,0 +1,24 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ SMART-SPLITS │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
-- Load Smart-Splits plugin
SMART_SPLITS = WEZTERM.plugin.require("https://github.com/mrjones2014/smart-splits.nvim")
-- Apply Smart-Splits configuration
SMART_SPLITS.apply_to_config(CONFIG, {
-- directional keys to use in order of: left, down, up, right
direction_keys = {
move = { "h", "j", "k", "l" }, -- Move with CTRL+H, CTRL+J, CTRL+K, CTRL+L
resize = { "h", "j", "k", "l" }, -- Resize with ALT+h, ALT+j, ALT+k, ALT+l
},
-- modifier keys to combine with direction_keys
modifiers = {
move = "CTRL|SHIFT", -- modifier to use for pane movement
resize = "ALT", -- modifier to use for pane resize
},
})
return M
+44
View File
@@ -0,0 +1,44 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ WEZBAR │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
-- Load Wezbar plugin
WEZBAR = WEZTERM.plugin.require("https://github.com/nekowinston/wezterm-bar")
-- Configure wezbar
WEZBAR.apply_to_config(CONFIG, {
position = "top",
max_width = 32,
dividers = "arrows", -- or "slant_left", "arrows", "rounded", false
indicator = {
leader = {
enabled = true,
off = "",
on = "",
},
mode = {
enabled = true,
names = {
resize_mode = "RESIZE",
copy_mode = "VISUAL",
search_mode = "SEARCH",
},
},
},
tabs = {
numerals = "arabic", -- or "roman"
pane_count = "superscript", -- or "subscript", false
brackets = {
active = { "", ":" },
inactive = { "", ":" },
},
},
clock = { -- note that this overrides the whole set_right_status
enabled = true,
format = "%a %R ", -- use https://wezfurlong.org/wezterm/config/lua/wezterm.time/Time/format.html
},
})
return M
+25
View File
@@ -0,0 +1,25 @@
-- __ __ ________
-- / | _ / | / |
-- $$ | / \ $$ | ______ ________$$$$$$$$/______ ______ _____ ____
-- $$ |/$ \$$ | / \ / | $$ | / \ / \ / \/ \
-- $$ /$$$ $$ |/$$$$$$ |$$$$$$$$/ $$ |/$$$$$$ |/$$$$$$ |$$$$$$ $$$$ |
-- $$ $$/$$ $$ |$$ $$ | / $$/ $$ |$$ $$ |$$ | $$/ $$ | $$ | $$ |
-- $$$$/ $$$$ |$$$$$$$$/ /$$$$/__ $$ |$$$$$$$$/ $$ | $$ | $$ | $$ |
-- $$$/ $$$ |$$ |/$$ | $$ |$$ |$$ | $$ | $$ | $$ |
-- $$/ $$/ $$$$$$$/ $$$$$$$$/ $$/ $$$$$$$/ $$/ $$/ $$/ $$/
--------------------------------------------------------------------------------
-- https://github.com/wez/wezterm/
-- Load WezTerm module
WEZTERM = require("wezterm")
-- Load Config Builder
CONFIG = WEZTERM.config_builder()
-- Load Options
require("options").setup()
-- Load Plugins
require("plugins").setup()
-- Return configuration
return CONFIG