feat: configuración de WezTerm con temas visuales y skill de personalización
This commit is contained in:
@@ -0,0 +1,259 @@
|
||||
---
|
||||
name: wezterm
|
||||
description: Configure and customize WezTerm terminal emulator. Use for setting up WezTerm config, themes, keybindings, and advanced features.
|
||||
---
|
||||
|
||||
# WezTerm Configuration
|
||||
|
||||
Configure the WezTerm terminal emulator.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
```bash
|
||||
# Install WezTerm
|
||||
brew install --cask wezterm
|
||||
```
|
||||
|
||||
Config location: `~/.wezterm.lua` or `~/.config/wezterm/wezterm.lua`
|
||||
|
||||
## Basic Configuration
|
||||
|
||||
### Minimal Config
|
||||
|
||||
```lua
|
||||
-- ~/.wezterm.lua
|
||||
local wezterm = require 'wezterm'
|
||||
local config = wezterm.config_builder()
|
||||
|
||||
-- Font
|
||||
config.font = wezterm.font('JetBrains Mono')
|
||||
config.font_size = 14.0
|
||||
|
||||
-- Colors
|
||||
config.color_scheme = 'Catppuccin Mocha'
|
||||
|
||||
-- Window
|
||||
config.window_padding = {
|
||||
left = 10,
|
||||
right = 10,
|
||||
top = 10,
|
||||
bottom = 10,
|
||||
}
|
||||
|
||||
return config
|
||||
```
|
||||
|
||||
### Font Configuration
|
||||
|
||||
```lua
|
||||
-- Single font
|
||||
config.font = wezterm.font('JetBrains Mono')
|
||||
|
||||
-- Font with fallbacks
|
||||
config.font = wezterm.font_with_fallback({
|
||||
'JetBrains Mono',
|
||||
'Fira Code',
|
||||
'Nerd Font Symbols',
|
||||
})
|
||||
|
||||
-- Font with weight
|
||||
config.font = wezterm.font('JetBrains Mono', { weight = 'Medium' })
|
||||
|
||||
-- Different font for bold
|
||||
config.font_rules = {
|
||||
{
|
||||
intensity = 'Bold',
|
||||
font = wezterm.font('JetBrains Mono', { weight = 'Bold' }),
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Color Schemes
|
||||
|
||||
```lua
|
||||
-- Use built-in scheme
|
||||
config.color_scheme = 'Catppuccin Mocha'
|
||||
|
||||
-- List available schemes
|
||||
-- wezterm show-keys --lua
|
||||
|
||||
-- Custom colors
|
||||
config.colors = {
|
||||
foreground = '#c0caf5',
|
||||
background = '#1a1b26',
|
||||
cursor_bg = '#c0caf5',
|
||||
selection_bg = '#33467c',
|
||||
ansi = {'#15161e', '#f7768e', '#9ece6a', '#e0af68', '#7aa2f7', '#bb9af7', '#7dcfff', '#a9b1d6'},
|
||||
brights = {'#414868', '#f7768e', '#9ece6a', '#e0af68', '#7aa2f7', '#bb9af7', '#7dcfff', '#c0caf5'},
|
||||
}
|
||||
```
|
||||
|
||||
## Key Bindings
|
||||
|
||||
### Custom Keybindings
|
||||
|
||||
```lua
|
||||
config.keys = {
|
||||
-- Split panes
|
||||
{ key = 'd', mods = 'CMD', action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
|
||||
{ key = 'd', mods = 'CMD|SHIFT', action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' } },
|
||||
|
||||
-- Navigate panes
|
||||
{ key = 'LeftArrow', mods = 'CMD', action = wezterm.action.ActivatePaneDirection 'Left' },
|
||||
{ key = 'RightArrow', mods = 'CMD', action = wezterm.action.ActivatePaneDirection 'Right' },
|
||||
{ key = 'UpArrow', mods = 'CMD', action = wezterm.action.ActivatePaneDirection 'Up' },
|
||||
{ key = 'DownArrow', mods = 'CMD', action = wezterm.action.ActivatePaneDirection 'Down' },
|
||||
|
||||
-- Tabs
|
||||
{ key = 't', mods = 'CMD', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
|
||||
{ key = 'w', mods = 'CMD', action = wezterm.action.CloseCurrentPane { confirm = true } },
|
||||
|
||||
-- Font size
|
||||
{ key = '=', mods = 'CMD', action = wezterm.action.IncreaseFontSize },
|
||||
{ key = '-', mods = 'CMD', action = wezterm.action.DecreaseFontSize },
|
||||
{ key = '0', mods = 'CMD', action = wezterm.action.ResetFontSize },
|
||||
}
|
||||
```
|
||||
|
||||
### Leader Key
|
||||
|
||||
```lua
|
||||
-- Define leader key (like tmux prefix)
|
||||
config.leader = { key = 'a', mods = 'CMD', timeout_milliseconds = 1000 }
|
||||
|
||||
config.keys = {
|
||||
-- Leader + c = new tab
|
||||
{ key = 'c', mods = 'LEADER', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
|
||||
-- Leader + | = vertical split
|
||||
{ key = '|', mods = 'LEADER', action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
|
||||
-- Leader + - = horizontal split
|
||||
{ key = '-', mods = 'LEADER', action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' } },
|
||||
}
|
||||
```
|
||||
|
||||
## Advanced Features
|
||||
|
||||
### Tab Bar Customization
|
||||
|
||||
```lua
|
||||
config.use_fancy_tab_bar = false
|
||||
config.tab_bar_at_bottom = true
|
||||
config.hide_tab_bar_if_only_one_tab = true
|
||||
|
||||
-- Custom tab title
|
||||
wezterm.on('format-tab-title', function(tab)
|
||||
local title = tab.tab_title
|
||||
if title and #title > 0 then
|
||||
return title
|
||||
end
|
||||
return tab.active_pane.title
|
||||
end)
|
||||
```
|
||||
|
||||
### Startup Actions
|
||||
|
||||
```lua
|
||||
-- Start with specific layout
|
||||
wezterm.on('gui-startup', function(cmd)
|
||||
local tab, pane, window = mux.spawn_window(cmd or {})
|
||||
-- Split right
|
||||
pane:split { direction = 'Right' }
|
||||
end)
|
||||
```
|
||||
|
||||
### SSH Domains
|
||||
|
||||
```lua
|
||||
config.ssh_domains = {
|
||||
{
|
||||
name = 'my-server',
|
||||
remote_address = 'server.example.com',
|
||||
username = 'user',
|
||||
},
|
||||
}
|
||||
|
||||
-- Connect with: wezterm connect my-server
|
||||
```
|
||||
|
||||
### Multiplexer
|
||||
|
||||
```lua
|
||||
-- Unix domain for persistent sessions
|
||||
config.unix_domains = {
|
||||
{ name = 'unix' },
|
||||
}
|
||||
|
||||
-- Default to multiplexer
|
||||
config.default_gui_startup_args = { 'connect', 'unix' }
|
||||
```
|
||||
|
||||
## Useful Snippets
|
||||
|
||||
### Quick Theme Toggle
|
||||
|
||||
```lua
|
||||
local function toggle_theme()
|
||||
local overrides = window:get_config_overrides() or {}
|
||||
if overrides.color_scheme == 'Catppuccin Latte' then
|
||||
overrides.color_scheme = 'Catppuccin Mocha'
|
||||
else
|
||||
overrides.color_scheme = 'Catppuccin Latte'
|
||||
end
|
||||
window:set_config_overrides(overrides)
|
||||
end
|
||||
|
||||
config.keys = {
|
||||
{ key = 't', mods = 'CMD|SHIFT', action = wezterm.action_callback(toggle_theme) },
|
||||
}
|
||||
```
|
||||
|
||||
### Background Image
|
||||
|
||||
```lua
|
||||
config.window_background_image = '/path/to/image.png'
|
||||
config.window_background_image_hsb = {
|
||||
brightness = 0.02,
|
||||
saturation = 0.5,
|
||||
}
|
||||
```
|
||||
|
||||
### Status Bar
|
||||
|
||||
```lua
|
||||
wezterm.on('update-right-status', function(window, pane)
|
||||
window:set_right_status(wezterm.format({
|
||||
{ Text = wezterm.strftime('%H:%M') },
|
||||
}))
|
||||
end)
|
||||
```
|
||||
|
||||
## Command Line
|
||||
|
||||
```bash
|
||||
# Open with specific config
|
||||
wezterm --config-file path/to/config.lua
|
||||
|
||||
# Connect to multiplexer
|
||||
wezterm connect unix
|
||||
|
||||
# List color schemes
|
||||
wezterm ls-colors
|
||||
|
||||
# Show key bindings
|
||||
wezterm show-keys
|
||||
wezterm show-keys --lua
|
||||
|
||||
# CLI utilities
|
||||
wezterm cli list # List panes
|
||||
wezterm cli spawn # Spawn new pane
|
||||
wezterm cli split-pane # Split current pane
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Start simple** - Add features as needed
|
||||
2. **Use config_builder** - Better error messages
|
||||
3. **Test incrementally** - WezTerm reloads on save
|
||||
4. **Backup your config** - Keep in dotfiles repo
|
||||
5. **Use leader keys** - Avoid conflicts with apps
|
||||
6. **Check logs** - `wezterm --config-file ~/.wezterm.lua` shows errors
|
||||
@@ -0,0 +1,5 @@
|
||||
node_modules/
|
||||
package.json
|
||||
package-lock.json
|
||||
skills-lock.json
|
||||
.current-theme
|
||||
@@ -0,0 +1,84 @@
|
||||
# WezTerm · Configuración con temas visuales
|
||||
|
||||
Configuración de [WezTerm](https://wezterm.org) orientada a una estética de terminal de **sysadmin / developer / hacker**, con múltiples temas intercambiables en caliente.
|
||||
|
||||
## Instalación
|
||||
|
||||
El directorio de configuración de WezTerm es `~/.config/wezterm/`. Puedes copiar los archivos directamente o enlazarlos desde este repositorio:
|
||||
|
||||
```bash
|
||||
# Opción 1: copiar
|
||||
cp -r wezterm.lua themes ~/.config/wezterm/
|
||||
|
||||
# Opción 2: enlace simbólico (mantiene el repo como fuente de verdad)
|
||||
ln -s "$(pwd)" ~/.config/wezterm
|
||||
```
|
||||
|
||||
Recarga la configuración dentro de WezTerm con `CTRL+SHIFT+R`.
|
||||
|
||||
## Temas
|
||||
|
||||
| Tema | Estética | Fondo | Acento |
|
||||
|------|----------|-------|--------|
|
||||
| `matrix` | Hacker · verde neón sobre negro | `#000000` | `#00ff41` |
|
||||
| `phosphor-green` | Retro · fósforo verde VT100 | `#001a00` | `#33ff33` |
|
||||
| `phosphor-amber` | Retro · fósforo ámbar VT100 | `#1a0f00` | `#ffb000` |
|
||||
| `cyberpunk` | Neon · magenta/cian sobre púrpura | `#0d0221` | `#ff2a6d` |
|
||||
| `nord` | Sysadmin · azul-gris sobrio | `#2e3440` | `#81a1c1` |
|
||||
| `tokyonight` | Developer · azul oscuro | `#1a1b26` | `#7aa2f7` |
|
||||
| `dracula` | Developer · púrpura oscuro | `#282a36` | `#bd93f9` |
|
||||
|
||||
## Atajos
|
||||
|
||||
| Atajo | Acción |
|
||||
|-------|--------|
|
||||
| `CTRL+SHIFT+H` | Ciclar al siguiente tema (con notificación) |
|
||||
| `CTRL+SHIFT+R` | Recargar configuración |
|
||||
|
||||
La selección de tema se persiste en `.current-theme` (no versionado): al abrir WezTerm arranca con el último tema elegido. Sin ese archivo, el tema por defecto es `matrix`.
|
||||
|
||||
## Dividir panes y moverse
|
||||
|
||||
| Atajo | Acción |
|
||||
|-------|--------|
|
||||
| `CTRL+SHIFT+ALT+"` | Dividir verticalmente (pane arriba/abajo) |
|
||||
| `CTRL+SHIFT+ALT+%` | Dividir horizontalmente (pane izquierda/derecha) |
|
||||
| `CTRL+SHIFT+←/→/↑/↓` | Moverse entre panes |
|
||||
| `CTRL+SHIFT+ALT+←/→/↑/↓` | Redimensionar el pane activo |
|
||||
| `CTRL+SHIFT+Z` | Zoom sobre el pane activo (maximizar) |
|
||||
| `CTRL+SHIFT+W` | Cerrar pane/pestaña (con confirmación) |
|
||||
| `CTRL+SHIFT+T` | Nueva pestaña |
|
||||
|
||||
Son los atajos por defecto de WezTerm (verificados con `wezterm show-keys`), así que funcionan sin configuración adicional.
|
||||
|
||||
## Personalización asistida
|
||||
|
||||
Este repositorio incluye la skill `wezterm` (`.agents/skills/wezterm/SKILL.md`): una guía para configurar y personalizar WezTerm — fuentes, colores, keybindings, tab bar, leader key, dominios SSH, multiplexor y más. Úsala como referencia para ampliar esta configuración o construir nuevas funciones.
|
||||
|
||||
## Estructura
|
||||
|
||||
```
|
||||
wezterm.lua # Configuración principal: fuentes, tab bar, status bar, atajos
|
||||
themes/
|
||||
├── registry.lua # Registro, ciclado y persistencia de temas
|
||||
├── matrix.lua # Un archivo por tema (paleta ansi/brights/tab_bar completa)
|
||||
├── phosphor-green.lua
|
||||
├── phosphor-amber.lua
|
||||
├── cyberpunk.lua
|
||||
├── nord.lua
|
||||
├── tokyonight.lua
|
||||
└── dracula.lua
|
||||
```
|
||||
|
||||
Cada tema es autocontenido: define su propia paleta de colores (`foreground`, `background`, cursor, selección, `ansi[8]`, `brights[8]`, tab bar), opacidad, gradiente de fondo y parpadeo del cursor, por lo que no depende de esquemas externos.
|
||||
|
||||
## Añadir un tema nuevo
|
||||
|
||||
1. Crea un archivo en `themes/` siguiendo el mismo formato que los existentes (tabla con `name`, `label`, `colors` y ajustes opcionales).
|
||||
2. Regístralo en `themes/registry.lua` dentro de la lista `theme_files`.
|
||||
3. Recarga con `CTRL+SHIFT+R` y cíclalo con `CTRL+SHIFT+H`.
|
||||
|
||||
## Requisitos
|
||||
|
||||
- WezTerm 20240203 o superior
|
||||
- Fuente `JetBrains Mono` (con `Nerd Font Symbols` como fallback)
|
||||
@@ -0,0 +1,47 @@
|
||||
local colors = {
|
||||
foreground = '#d0e8ff',
|
||||
background = '#0d0221',
|
||||
cursor_bg = '#05d9e8',
|
||||
cursor_fg = '#0d0221',
|
||||
cursor_border = '#05d9e8',
|
||||
selection_bg = '#3d1256',
|
||||
selection_fg = '#ffffff',
|
||||
compose_cursor = '#05d9e8',
|
||||
ansi = {
|
||||
'#0d0221',
|
||||
'#ff2a6d',
|
||||
'#05d9e8',
|
||||
'#f2f230',
|
||||
'#00b3ff',
|
||||
'#b967ff',
|
||||
'#01c4e7',
|
||||
'#d0e8ff',
|
||||
},
|
||||
brights = {
|
||||
'#3d1256',
|
||||
'#ff5c8a',
|
||||
'#6ffff0',
|
||||
'#ffff6a',
|
||||
'#5cc9ff',
|
||||
'#d08cff',
|
||||
'#7ce9ff',
|
||||
'#ffffff',
|
||||
},
|
||||
tab_bar = {
|
||||
background = '#16052e',
|
||||
active_tab = { bg_color = '#ff2a6d', fg_color = '#ffffff', intensity = 'Bold' },
|
||||
inactive_tab = { bg_color = '#16052e', fg_color = '#05d9e8' },
|
||||
inactive_tab_hover = { bg_color = '#3d1256', fg_color = '#ff5c8a' },
|
||||
new_tab = { bg_color = '#16052e', fg_color = '#05d9e8' },
|
||||
new_tab_hover = { bg_color = '#3d1256', fg_color = '#b967ff' },
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
name = 'cyberpunk',
|
||||
label = 'CYBERPUNK',
|
||||
colors = colors,
|
||||
window_background_opacity = 0.97,
|
||||
window_background_gradient = { colors = { '#0d0221', '#1a0533' }, orientation = 'Vertical' },
|
||||
cursor_blink_rate = 500,
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
local colors = {
|
||||
foreground = '#f8f8f2',
|
||||
background = '#282a36',
|
||||
cursor_bg = '#f8f8f2',
|
||||
cursor_fg = '#282a36',
|
||||
cursor_border = '#f8f8f2',
|
||||
selection_bg = '#44475a',
|
||||
selection_fg = '#f8f8f2',
|
||||
compose_cursor = '#f8f8f2',
|
||||
ansi = {
|
||||
'#21222c',
|
||||
'#ff5555',
|
||||
'#50fa7b',
|
||||
'#f1fa8c',
|
||||
'#bd93f9',
|
||||
'#ff79c6',
|
||||
'#8be9fd',
|
||||
'#f8f8f2',
|
||||
},
|
||||
brights = {
|
||||
'#6272a4',
|
||||
'#ff6e6e',
|
||||
'#69ff94',
|
||||
'#ffffa5',
|
||||
'#d6acff',
|
||||
'#ff92df',
|
||||
'#a4ffff',
|
||||
'#ffffff',
|
||||
},
|
||||
tab_bar = {
|
||||
background = '#21222c',
|
||||
active_tab = { bg_color = '#bd93f9', fg_color = '#282a36', intensity = 'Bold' },
|
||||
inactive_tab = { bg_color = '#21222c', fg_color = '#f8f8f2' },
|
||||
inactive_tab_hover = { bg_color = '#44475a', fg_color = '#f8f8f2' },
|
||||
new_tab = { bg_color = '#21222c', fg_color = '#50fa7b' },
|
||||
new_tab_hover = { bg_color = '#44475a', fg_color = '#f8f8f2' },
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
name = 'dracula',
|
||||
label = 'DRACULA',
|
||||
colors = colors,
|
||||
window_background_opacity = 1.0,
|
||||
cursor_blink_rate = 500,
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
local colors = {
|
||||
foreground = '#00ff41',
|
||||
background = '#000000',
|
||||
cursor_bg = '#00ff41',
|
||||
cursor_fg = '#000000',
|
||||
cursor_border = '#00ff41',
|
||||
selection_bg = '#003b1f',
|
||||
selection_fg = '#c8ffe0',
|
||||
compose_cursor = '#00ff41',
|
||||
ansi = {
|
||||
'#0a1f0a',
|
||||
'#ff4d4d',
|
||||
'#00ff41',
|
||||
'#c8e65c',
|
||||
'#40c9ff',
|
||||
'#c792ea',
|
||||
'#00e0a0',
|
||||
'#a8ffb0',
|
||||
},
|
||||
brights = {
|
||||
'#1a3b1a',
|
||||
'#ff8080',
|
||||
'#66ff8a',
|
||||
'#e0ff70',
|
||||
'#80ddff',
|
||||
'#d4a0ff',
|
||||
'#66ffc0',
|
||||
'#d8ffdd',
|
||||
},
|
||||
tab_bar = {
|
||||
background = '#001400',
|
||||
active_tab = { bg_color = '#00ff41', fg_color = '#000000', intensity = 'Bold' },
|
||||
inactive_tab = { bg_color = '#001400', fg_color = '#00ff41' },
|
||||
inactive_tab_hover = { bg_color = '#003b1f', fg_color = '#00ff41' },
|
||||
new_tab = { bg_color = '#001400', fg_color = '#00ff41' },
|
||||
new_tab_hover = { bg_color = '#003b1f', fg_color = '#00ff41' },
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
name = 'matrix',
|
||||
label = 'MATRIX',
|
||||
colors = colors,
|
||||
window_background_opacity = 0.97,
|
||||
window_background_gradient = { colors = { '#000000', '#001a00' }, orientation = 'Vertical' },
|
||||
cursor_blink_rate = 500,
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
local colors = {
|
||||
foreground = '#d8dee9',
|
||||
background = '#2e3440',
|
||||
cursor_bg = '#d8dee9',
|
||||
cursor_fg = '#2e3440',
|
||||
cursor_border = '#d8dee9',
|
||||
selection_bg = '#4c566a',
|
||||
selection_fg = '#eceff4',
|
||||
compose_cursor = '#d8dee9',
|
||||
ansi = {
|
||||
'#3b4252',
|
||||
'#bf616a',
|
||||
'#a3be8c',
|
||||
'#ebcb8b',
|
||||
'#81a1c1',
|
||||
'#b48ead',
|
||||
'#88c0d0',
|
||||
'#e5e9f0',
|
||||
},
|
||||
brights = {
|
||||
'#4c566a',
|
||||
'#bf616a',
|
||||
'#a3be8c',
|
||||
'#ebcb8b',
|
||||
'#81a1c1',
|
||||
'#b48ead',
|
||||
'#8fbcbb',
|
||||
'#eceff4',
|
||||
},
|
||||
tab_bar = {
|
||||
background = '#2e3440',
|
||||
active_tab = { bg_color = '#81a1c1', fg_color = '#2e3440', intensity = 'Bold' },
|
||||
inactive_tab = { bg_color = '#3b4252', fg_color = '#d8dee9' },
|
||||
inactive_tab_hover = { bg_color = '#434c5e', fg_color = '#eceff4' },
|
||||
new_tab = { bg_color = '#3b4252', fg_color = '#88c0d0' },
|
||||
new_tab_hover = { bg_color = '#434c5e', fg_color = '#eceff4' },
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
name = 'nord',
|
||||
label = 'NORD',
|
||||
colors = colors,
|
||||
window_background_opacity = 1.0,
|
||||
cursor_blink_rate = 500,
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
local colors = {
|
||||
foreground = '#ffb000',
|
||||
background = '#1a0f00',
|
||||
cursor_bg = '#ffb000',
|
||||
cursor_fg = '#1a0f00',
|
||||
cursor_border = '#ffb000',
|
||||
selection_bg = '#4a2c00',
|
||||
selection_fg = '#ffe8c0',
|
||||
compose_cursor = '#ffb000',
|
||||
ansi = {
|
||||
'#1a0f00',
|
||||
'#ff4a00',
|
||||
'#ffb000',
|
||||
'#ffd080',
|
||||
'#ff8c00',
|
||||
'#ff6600',
|
||||
'#ffcc66',
|
||||
'#ffd9a0',
|
||||
},
|
||||
brights = {
|
||||
'#3d2a00',
|
||||
'#ff6a00',
|
||||
'#ffc040',
|
||||
'#ffe0a0',
|
||||
'#ffaa40',
|
||||
'#ff8040',
|
||||
'#ffd080',
|
||||
'#ffe8c0',
|
||||
},
|
||||
tab_bar = {
|
||||
background = '#241500',
|
||||
active_tab = { bg_color = '#ffb000', fg_color = '#1a0f00', intensity = 'Bold' },
|
||||
inactive_tab = { bg_color = '#241500', fg_color = '#ffb000' },
|
||||
inactive_tab_hover = { bg_color = '#4a2c00', fg_color = '#ffb000' },
|
||||
new_tab = { bg_color = '#241500', fg_color = '#ffb000' },
|
||||
new_tab_hover = { bg_color = '#4a2c00', fg_color = '#ffb000' },
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
name = 'phosphor-amber',
|
||||
label = 'PHOSPHOR-AMBER',
|
||||
colors = colors,
|
||||
window_background_opacity = 0.97,
|
||||
window_background_gradient = { colors = { '#1a0f00', '#2a1a00' }, orientation = 'Vertical' },
|
||||
cursor_blink_rate = 600,
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
local colors = {
|
||||
foreground = '#33ff33',
|
||||
background = '#001a00',
|
||||
cursor_bg = '#33ff33',
|
||||
cursor_fg = '#001a00',
|
||||
cursor_border = '#33ff33',
|
||||
selection_bg = '#003d00',
|
||||
selection_fg = '#ccffcc',
|
||||
compose_cursor = '#33ff33',
|
||||
ansi = {
|
||||
'#003300',
|
||||
'#00cc44',
|
||||
'#33ff33',
|
||||
'#99ff33',
|
||||
'#00ccff',
|
||||
'#66ffcc',
|
||||
'#00ff88',
|
||||
'#ccffcc',
|
||||
},
|
||||
brights = {
|
||||
'#006600',
|
||||
'#33ff66',
|
||||
'#66ff66',
|
||||
'#ccff66',
|
||||
'#66ffff',
|
||||
'#99ffee',
|
||||
'#66ffcc',
|
||||
'#ffffff',
|
||||
},
|
||||
tab_bar = {
|
||||
background = '#002000',
|
||||
active_tab = { bg_color = '#33ff33', fg_color = '#001a00', intensity = 'Bold' },
|
||||
inactive_tab = { bg_color = '#002000', fg_color = '#33ff33' },
|
||||
inactive_tab_hover = { bg_color = '#003d00', fg_color = '#33ff33' },
|
||||
new_tab = { bg_color = '#002000', fg_color = '#33ff33' },
|
||||
new_tab_hover = { bg_color = '#003d00', fg_color = '#33ff33' },
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
name = 'phosphor-green',
|
||||
label = 'PHOSPHOR-GREEN',
|
||||
colors = colors,
|
||||
window_background_opacity = 0.97,
|
||||
window_background_gradient = { colors = { '#001a00', '#002000' }, orientation = 'Vertical' },
|
||||
cursor_blink_rate = 600,
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
local wezterm = require 'wezterm'
|
||||
|
||||
local themes_dir = wezterm.config_dir .. '/themes'
|
||||
local state_file = wezterm.config_dir .. '/.current-theme'
|
||||
|
||||
local theme_files = {
|
||||
'matrix',
|
||||
'phosphor-green',
|
||||
'phosphor-amber',
|
||||
'cyberpunk',
|
||||
'nord',
|
||||
'tokyonight',
|
||||
'dracula',
|
||||
}
|
||||
|
||||
local themes = {}
|
||||
local order = {}
|
||||
|
||||
for _, name in ipairs(theme_files) do
|
||||
local ok, theme = pcall(dofile, themes_dir .. '/' .. name .. '.lua')
|
||||
if ok and theme and theme.name then
|
||||
themes[name] = theme
|
||||
order[#order + 1] = name
|
||||
else
|
||||
wezterm.log_error('wezterm-themes: error loading theme "' .. name .. '": ' .. tostring(theme))
|
||||
end
|
||||
end
|
||||
|
||||
local M = {}
|
||||
|
||||
function M.names()
|
||||
return order
|
||||
end
|
||||
|
||||
function M.get(name)
|
||||
return themes[name] or themes[order[1]]
|
||||
end
|
||||
|
||||
function M.current()
|
||||
local f = io.open(state_file, 'r')
|
||||
local name = f and f:read('*l')
|
||||
if f then
|
||||
f:close()
|
||||
end
|
||||
if name and themes[name] then
|
||||
return themes[name]
|
||||
end
|
||||
return themes[order[1]]
|
||||
end
|
||||
|
||||
function M.next(name)
|
||||
local cur = name or M.current().name
|
||||
local idx = 0
|
||||
for i, n in ipairs(order) do
|
||||
if n == cur then
|
||||
idx = i
|
||||
break
|
||||
end
|
||||
end
|
||||
return themes[order[(idx % #order) + 1]]
|
||||
end
|
||||
|
||||
function M.save(theme)
|
||||
local f = io.open(state_file, 'w')
|
||||
if f then
|
||||
f:write(theme.name .. '\n')
|
||||
f:close()
|
||||
end
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -0,0 +1,46 @@
|
||||
local colors = {
|
||||
foreground = '#c0caf5',
|
||||
background = '#1a1b26',
|
||||
cursor_bg = '#c0caf5',
|
||||
cursor_fg = '#1a1b26',
|
||||
cursor_border = '#c0caf5',
|
||||
selection_bg = '#33467c',
|
||||
selection_fg = '#c0caf5',
|
||||
compose_cursor = '#c0caf5',
|
||||
ansi = {
|
||||
'#15161e',
|
||||
'#f7768e',
|
||||
'#9ece6a',
|
||||
'#e0af68',
|
||||
'#7aa2f7',
|
||||
'#bb9af7',
|
||||
'#7dcfff',
|
||||
'#a9b1d6',
|
||||
},
|
||||
brights = {
|
||||
'#414868',
|
||||
'#f7768e',
|
||||
'#9ece6a',
|
||||
'#e0af68',
|
||||
'#7aa2f7',
|
||||
'#bb9af7',
|
||||
'#7dcfff',
|
||||
'#c0caf5',
|
||||
},
|
||||
tab_bar = {
|
||||
background = '#16161e',
|
||||
active_tab = { bg_color = '#7aa2f7', fg_color = '#16161e', intensity = 'Bold' },
|
||||
inactive_tab = { bg_color = '#16161e', fg_color = '#a9b1d6' },
|
||||
inactive_tab_hover = { bg_color = '#1f2335', fg_color = '#c0caf5' },
|
||||
new_tab = { bg_color = '#16161e', fg_color = '#7aa2f7' },
|
||||
new_tab_hover = { bg_color = '#1f2335', fg_color = '#7dcfff' },
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
name = 'tokyonight',
|
||||
label = 'TOKYO-NIGHT',
|
||||
colors = colors,
|
||||
window_background_opacity = 1.0,
|
||||
cursor_blink_rate = 500,
|
||||
}
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
local wezterm = require 'wezterm'
|
||||
local config = wezterm.config_builder()
|
||||
|
||||
local registry = dofile(wezterm.config_dir .. '/themes/registry.lua')
|
||||
|
||||
-- Fields that can vary between themes and must be hot-swappable.
|
||||
local THEME_FIELDS = {
|
||||
'colors',
|
||||
'window_background_opacity',
|
||||
'window_background_gradient',
|
||||
'cursor_blink_rate',
|
||||
}
|
||||
|
||||
local function apply_theme(cfg, theme)
|
||||
for _, field in ipairs(THEME_FIELDS) do
|
||||
if theme[field] ~= nil then
|
||||
cfg[field] = theme[field]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
apply_theme(config, registry.current())
|
||||
|
||||
-- Font
|
||||
config.font = wezterm.font_with_fallback({
|
||||
'JetBrains Mono',
|
||||
'Nerd Font Symbols',
|
||||
})
|
||||
config.font_size = 14.0
|
||||
|
||||
-- Window
|
||||
config.window_padding = { left = 10, right = 10, top = 10, bottom = 10 }
|
||||
config.window_close_confirmation = 'AlwaysPrompt'
|
||||
config.scrollback_lines = 10000
|
||||
|
||||
-- Tab bar
|
||||
config.enable_tab_bar = true
|
||||
config.use_fancy_tab_bar = false
|
||||
config.tab_bar_at_bottom = false
|
||||
config.hide_tab_bar_if_only_one_tab = false
|
||||
config.show_tab_index_in_tab_bar = true
|
||||
|
||||
-- Keybindings
|
||||
local act = wezterm.action
|
||||
|
||||
config.keys = {
|
||||
{
|
||||
key = 'h',
|
||||
mods = 'CTRL|SHIFT',
|
||||
action = wezterm.action_callback(function(window, pane)
|
||||
local next_theme = registry.next()
|
||||
registry.save(next_theme)
|
||||
|
||||
local overrides = {}
|
||||
for _, field in ipairs(THEME_FIELDS) do
|
||||
if next_theme[field] ~= nil then
|
||||
overrides[field] = next_theme[field]
|
||||
end
|
||||
end
|
||||
window:set_config_overrides(overrides)
|
||||
|
||||
window:toast_notification('Tema', next_theme.label, nil, 1500)
|
||||
window:perform_action(act.EmitEvent('update-right-status'), pane)
|
||||
end),
|
||||
},
|
||||
}
|
||||
|
||||
-- Status bar
|
||||
wezterm.on('update-right-status', function(window, _)
|
||||
local theme = registry.current()
|
||||
window:set_right_status(wezterm.format({
|
||||
{ Text = ' ' },
|
||||
{ Foreground = { Color = theme.colors.cursor_bg } },
|
||||
{ Text = '> ' },
|
||||
{ Foreground = { Color = theme.colors.ansi[4] } },
|
||||
{ Attribute = { Intensity = 'Bold' } },
|
||||
{ Text = theme.label },
|
||||
{ Attribute = { Intensity = 'Normal' } },
|
||||
{ Text = ' ' },
|
||||
{ Foreground = { Color = theme.colors.ansi[2] } },
|
||||
{ Text = wezterm.hostname() },
|
||||
{ Text = ' ' },
|
||||
{ Foreground = { Color = theme.colors.ansi[3] } },
|
||||
{ Text = wezterm.strftime('%H:%M') },
|
||||
{ Text = ' ' },
|
||||
}))
|
||||
end)
|
||||
|
||||
return config
|
||||
Reference in New Issue
Block a user