diff --git a/.gitignore b/.gitignore index ebfba8d..e9a0e0c 100644 --- a/.gitignore +++ b/.gitignore @@ -50,4 +50,4 @@ platforms/win/komorebi/applications.json gitconfig -check_update +*.exe \ No newline at end of file diff --git a/_assets/windows-1.png b/_assets/windows-1.png new file mode 100644 index 0000000..313ae1c Binary files /dev/null and b/_assets/windows-1.png differ diff --git a/bootstrap/Windows.ps1 b/bootstrap/Windows.ps1 index 4d59e65..1611145 100644 --- a/bootstrap/Windows.ps1 +++ b/bootstrap/Windows.ps1 @@ -35,8 +35,8 @@ if ($currentPath -notlike "*%PATH_EXT%*") { # Simulate XDG Base Directory Specification $Env:XDG_CONFIG_HOME = "$Env:AppData" $Env:XDG_DATA_HOME = "$Env:LocalAppData" -$Env:XDG_CACHE_HOME = "$Env:LocalAppData\cache" -$Env:XDG_STATE_HOME = "$Env:LocalAppData\state" +$Env:XDG_CACHE_HOME = "$Env:LocalAppData\Cache" +$Env:XDG_STATE_HOME = "$Env:LocalAppData\State" [System.Environment]::SetEnvironmentVariable("XDG_CONFIG_HOME", "$Env:XDG_CONFIG_HOME", "User") [System.Environment]::SetEnvironmentVariable("XDG_DATA_HOME", "$Env:XDG_DATA_HOME", "User") New-Item -ItemType Directory -Path "$Env:LocalAppData\cache" -Force diff --git a/bootstrap/win/Defender.ps1 b/bootstrap/win/Defender.ps1 index 007c5f1..acea93d 100644 --- a/bootstrap/win/Defender.ps1 +++ b/bootstrap/win/Defender.ps1 @@ -3,14 +3,17 @@ Set-MpPreference -EnableControlledFolderAccess 1 $protected = (Get-MpPreference).ControlledFolderAccessProtectedFolders -$protected += "$env:USERPROFILE\.ssh" -$protected += "$env:USERPROFILE\.config" +$protected += "$Env:UserProfile\.ssh" +$protected += "$Env:UserProfile\.config" +$protected += "$Env:UserProfile\Vault" Set-MpPreference -ControlledFolderAccessProtectedFolders $protected $apps = (Get-MpPreference).ControlledFolderAccessAllowedApplications $apps += "$Env:Windir\System32\OpenSSH\ssh.exe" $apps += "$Env:ProgramFiles\GPSoftware\Directory Opus\DOpus.exe" -$apps += "$Env:UserProfile\scoop\apps\pwsh\current\pwsh.exe" +$apps += (Get-Command -Name code).Source.Replace("bin\code.cmd", "Code.exe") +$apps += (Get-Command -Name pwsh).Source +$apps += (Get-Command -Name git).Source Set-MpPreference -ControlledFolderAccessAllowedApplications $apps $exclusion = (Get-MpPreference).ExclusionPath diff --git a/common/lesskey b/common/lesskey index 8eb0c4f..de66057 100644 --- a/common/lesskey +++ b/common/lesskey @@ -4,10 +4,12 @@ # Less the pager. # Location: -# $XDG_CONFIG_HOME/lesskey -# Or specified by the environment variable $LESSKEYIN +# *nix: $XDG_CONFIG_HOME/lesskey (Or specified by the environment variable $LESSKEYIN) +# Windows: %LESSKEYIN% (environment variable, default: %UserProfile%/_lesskey) +# $Env:LESSKEYIN = $Env:AppData\less\lesskey # Linking: # ln -sf $DOTFILES/common/lesskey ~/.config/lesskey +# New-Item -ItemType SymbolicLink -Target $DOTFILES\common\lesskey -Path $Env:LESSKEYIN # =========================================================== # work for less -V > 582, for mac, use brew install less to override the system less # In Windows (current version), the default pager is `more`, should be specifed to `less` by `$Env:Pager = less` diff --git a/platforms/win/Microsoft.PowerShell_profile.ps1 b/platforms/win/Microsoft.PowerShell_profile.ps1 index 05b468a..ef8ee96 100644 --- a/platforms/win/Microsoft.PowerShell_profile.ps1 +++ b/platforms/win/Microsoft.PowerShell_profile.ps1 @@ -5,26 +5,13 @@ ### Load Configs ### $DOTFILES = Join-Path $HOME ".dotfiles" -Get-ChildItem -Path $(Join-Path $DOTFILES "tools" "powershell") -Filter *.ps1 | ForEach-Object {. $_} +Get-ChildItem -Path $(Join-Path $DOTFILES "tools" "powershell") -Filter *.ps1 | ForEach-Object { . $_ } ### Aliases ### # Toggle Theme # -# TODO: Change to `bat` script implementation -# function Set-SystemTheme { -# $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" -# $currentMode = Get-ItemProperty -Path $regPath -Name "AppsUseLightTheme" -# if ($currentMode.AppsUseLightTheme -eq 1) { -# Set-ItemProperty -Path $regPath -Name "AppsUseLightTheme" -Value 0 -# Write-Host "已切换到深色模式" -# } -# else { -# Set-ItemProperty -Path $regPath -Name "AppsUseLightTheme" -Value 1 -# Write-Host "已切换到浅色模式" -# } -# } -# Set-Alias "dark-mode" "Set-SystemTheme" # Consistent with macOS (`dark-mode`) +Set-Alias "dark-mode" "$DOTFILES\platforms\win\cmd\dark-mode.bat" # Consistent with macOS (`dark-mode`) # Miscs # @@ -35,7 +22,7 @@ ${function:qwen} = "ollama run qwen2.5:14b" #region conda initialize # !! Contents within this block are managed by 'conda init' !! If (Test-Path "$HOME\miniconda3\Scripts\conda.exe") { - (& "$HOME\miniconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | Where-Object{$_} | Invoke-Expression + (& "$HOME\miniconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | Where-Object { $_ } | Invoke-Expression } #endregion @@ -67,10 +54,10 @@ $Env:VISUAL = "code --wait" $Env:FILE_MANAGER = "dopus.exe" -${function:wsl2} = {wsl.exe --distribution Ubuntu} +${function:wsl2} = { wsl.exe --distribution kali-linux $args } ${function:wini} = { winget install $args } ${function:winr} = { winget uninstall $args } ${function:wins} = { winget search $args } ${function:winu} = { winget upgrade $args } -${function:killp} = {ps | ? ProcessName -like $args | kill -Force} +${function:pkill} = { ps *$args* | kill -Force } diff --git a/platforms/win/ahk/Caps.ahk b/platforms/win/ahk/Caps.ahk new file mode 100644 index 0000000..5f11baf --- /dev/null +++ b/platforms/win/ahk/Caps.ahk @@ -0,0 +1,114 @@ +#Requires AutoHotkey v2.0 +#SingleInstance Force + +; 全局变量声明 +global g_LastCtrlKeyDownTime := 0 +global g_AbortSendEsc := false +global g_ControlRepeatDetected := false + +*CapsLock:: { + global g_ControlRepeatDetected + global g_LastCtrlKeyDownTime + global g_AbortSendEsc + + if (g_ControlRepeatDetected) { + return + } + + Send "{Ctrl down}" + g_LastCtrlKeyDownTime := A_TickCount + g_AbortSendEsc := false + g_ControlRepeatDetected := true +} + +*CapsLock Up:: { + global g_ControlRepeatDetected + global g_LastCtrlKeyDownTime + global g_AbortSendEsc + + Send "{Ctrl up}" + g_ControlRepeatDetected := false + if (g_AbortSendEsc) { + return + } + current_time := A_TickCount + time_elapsed := current_time - g_LastCtrlKeyDownTime + if (time_elapsed <= 250) { + SendInput "{Esc}" + } +} + +; 组合所有 Ctrl 快捷键 +#HotIf +~*^a:: +~*^b:: +~*^c:: +~*^d:: +~*^e:: +~*^f:: +~*^g:: +~*^h:: +~*^i:: +~*^j:: +~*^k:: +~*^l:: +~*^m:: +~*^n:: +~*^o:: +~*^p:: +~*^q:: +~*^r:: +~*^s:: +~*^t:: +~*^u:: +~*^v:: +~*^w:: +~*^x:: +~*^y:: +~*^z:: +~*^1:: +~*^2:: +~*^3:: +~*^4:: +~*^5:: +~*^6:: +~*^7:: +~*^8:: +~*^9:: +~*^0:: +~*^Space:: +~*^Backspace:: +~*^Delete:: +~*^Insert:: +~*^Home:: +~*^End:: +~*^PgUp:: +~*^PgDn:: +~*^Tab:: +~*^Enter:: +~*^,:: +~*^.:: +~*^/:: +~*^;:: +~*^':: +~*^[:: +~*^]:: +~*^\:: +~*^-:: +~*^=:: +~*^`:: +~*^F1:: +~*^F2:: +~*^F3:: +~*^F4:: +~*^F5:: +~*^F6:: +~*^F7:: +~*^F8:: +~*^F9:: +~*^F10:: +~*^F11:: +~*^F12:: { + global g_AbortSendEsc + g_AbortSendEsc := true +} diff --git a/platforms/win/ahk/colemak.ahk b/platforms/win/ahk/colemak.ahk new file mode 100644 index 0000000..2974bff --- /dev/null +++ b/platforms/win/ahk/colemak.ahk @@ -0,0 +1,29 @@ +#Requires AutoHotkey v2.0 + +q::q +w::w +e::f +r::p +t::g +y::j +u::l +i::u +o::y +p::; +a::a +s::r +d::s +f::t +g::d +h::h +j::n +k::e +l::i +`;::o +z::z +x::x +c::c +v::v +b::b +n::k +m::m \ No newline at end of file diff --git a/platforms/win/fastfetch.jsonc b/platforms/win/fastfetch.jsonc index dcdcad7..1824115 100644 --- a/platforms/win/fastfetch.jsonc +++ b/platforms/win/fastfetch.jsonc @@ -54,7 +54,6 @@ "memory", "swap", "disk", - "localip", "battery", "poweradapter", "locale" diff --git a/platforms/win/glzr/glazewm/config.yaml b/platforms/win/glzr/glazewm/config.yaml index 79984ea..7bc8582 100644 --- a/platforms/win/glzr/glazewm/config.yaml +++ b/platforms/win/glzr/glazewm/config.yaml @@ -53,14 +53,14 @@ gaps: scale_with_dpi: true # Gap between adjacent windows. - inner_gap: "20px" + inner_gap: "5px" # Gap between windows and the screen edge. outer_gap: - top: "60px" - right: "20px" - bottom: "20px" - left: "20px" + top: "50px" + right: "5px" + bottom: "5px" + left: "5px" window_effects: # Visual effects to apply to the focused window. @@ -69,7 +69,7 @@ window_effects: # ** Exclusive to Windows 11 due to API limitations. border: enabled: true - color: "#8dbcff" + color: "#f6a7ba" # Remove the title bar from the window's frame. Note that this can # cause rendering issues for some applications. @@ -86,10 +86,10 @@ window_effects: # Visual effects to apply to non-focused windows. other_windows: border: - enabled: true + enabled: false color: "#a1a1a1" hide_title_bar: - enabled: false + enabled: true corner_style: enabled: false style: "square" @@ -134,6 +134,7 @@ window_rules: match: # Ignores any Zebar windows. - window_process: { equals: "zebar" } + - window_process: { equals: "WindowsTerminal" } # Ignores picture-in-picture windows for browsers. - window_title: { regex: "[Pp]icture.in.[Pp]icture" } @@ -223,7 +224,9 @@ keybindings: bindings: ["lwin+t"] # Change the focused window to be fullscreen. - - commands: ["toggle-fullscreen"] + # - commands: ["toggle-fullscreen"] + # bindings: ["lwin+f"] + - commands: ["shell-exec dopus.exe"] bindings: ["lwin+f"] # Minimize focused window. @@ -249,7 +252,7 @@ keybindings: # Launch CMD terminal. Alternatively, use `shell-exec wt` or # `shell-exec %ProgramFiles%/Git/git-bash.exe` to start Windows # Terminal and Git Bash respectively. - - commands: ["shell-exec wt"] + - commands: ["shell-exec wezterm-gui.exe start"] bindings: ["lwin+r"] # Focus the next/previous active workspace defined in `workspaces` config. diff --git a/platforms/win/glzr/readme.md b/platforms/win/glzr/readme.md index 095effb..dfb7471 100644 --- a/platforms/win/glzr/readme.md +++ b/platforms/win/glzr/readme.md @@ -8,6 +8,20 @@ New-Item -ItemType SymbolicLink -Path $Env:UserProfile\.glzr -Target $DOTFILES\p The Zebar config should be downloaded from [this repository](https://github.com/js0ny/neobrutal-zebar) and extracted to the `glzr\zebar` directory. +```powershell +Invoke-WebRequest -Uri "https://github.com/js0ny/neobrutal-zebar/releases/download/2/neobrutal.zip" -OutFile "$Env:UserProfile\.glzr\zebar\neobrutal.zip" +Expand-Archive -Path "$Env:UserProfile\.glzr\zebar\neobrutal.zip" -DestinationPath "$Env:UserProfile\.glzr\zebar" +Remove-Item -Path "$Env:UserProfile\.glzr\zebar\neobrutal.zip" +``` + +If `just` and `pwsh` are installed, you can build the config by running `just build-zebar`. + +```powershell +git clone https://github.com/js0ny/neobrutal-zebar.git --depth 1 +just init +just build +``` + Or use the minimal setup, by changing `glzr\zebar\settings.json`: `startupConfigs.path` to `minimal/bar.zebar.json`. ```json @@ -21,9 +35,3 @@ Or use the minimal setup, by changing `glzr\zebar\settings.json`: `startupConfig ] } ``` - -```powershell -Invoke-WebRequest -Uri "https://github.com/js0ny/neobrutal-zebar/releases/download/2/neobrutal.zip" -OutFile "$Env:UserProfile\.glzr\zebar\neobrutal.zip" -Expand-Archive -Path "$Env:UserProfile\.glzr\zebar\neobrutal.zip" -DestinationPath "$Env:UserProfile\.glzr\zebar" -Remove-Item -Path "$Env:UserProfile\.glzr\zebar\neobrutal.zip" -``` diff --git a/platforms/win/readme.md b/platforms/win/readme.md index 0c7f7f8..5280122 100644 --- a/platforms/win/readme.md +++ b/platforms/win/readme.md @@ -1,50 +1,82 @@ # Windows dotfiles -By following the Windows Directory Standard, assign the following directories corresponding to `$XDG_CONFIG` in Unix: +![Windows](../../_assets/windows-1.png) -- `%APPDATA%` - `$XDG_CONFIG_HOME` (default: `%USERPROFILE%\AppData\Roaming`) +- Terminal Emulator: [WezTerm](../../tools/wezterm/) +- Tiling Window Manager: [GlazeWM](./glzr/glazewm/config.yaml) +- Status Bar: [Zebar](./glzr/zebar/settings.json) +- Quake Terminal: [Windows Terminal](./WindowsTerminal.json) +- Shell: [PowerShell Core](../../tools/powershell/readme.md) + - WSL1: [Arch Linux](https://github.com/yuk7/ArchWSL) + - WSL2: kali-linux +By following the Windows Directory Standard, assign the following directories corresponding to `$XDG_CONFIG` in Unix, some of the software(like `wezterm`) will use these directories as the default configuration path: + +| Windows Path | XDG-Equivalent | Default | +|------------|----------|----------| +| `%APPDATA%` | `$XDG_CONFIG_HOME` | `%USERPROFILE%\AppData\Roaming` | +| `%LOCALAPPDATA%` | `$XDG_DATA_HOME` | `%USERPROFILE%\AppData\Local` | +| `%LOCALAPPDATA%\Cache` | `$XDG_CACHE_HOME` | `%USERPROFILE%\AppData\Local\Cache` | +| `%LOCALAPPDATA%\State` | `$XDG_STATE_HOME` | `%USERPROFILE%\AppData\Local\State` | + +An example bootstrap script is provided in [bootstrap/Windows.ps1](../../bootstrap/Windows.ps1), which will create necessary directories and link the files. ## PowerShell Profile -This is the *[PowerShell Core](https://github.com/PowerShell/PowerShell)* profile, not the legacy *Windows PowerShell* profile. +This is the *[PowerShell Core](https://github.com/PowerShell/PowerShell)* profile, not the legacy *Windows PowerShell* profile, which is faster(`powershell` vs `pwsh`, `pwsh` types 6 letters less lol), cross-platform and compatible with Unix. -By default, PowerShell profile is stored in `~\Documents\PowerShell\Microsoft.PowerShell_profile.ps1`. +By default, PowerShell profile is stored in `%UserProfile%\Documents\PowerShell\Microsoft.PowerShell_profile.ps1`. It is convenient to use `$PROFILE` to locate the profile file. -```pwsh +```powershell Test-Path $PROFILE ``` +Just like Unix Shell, there are configs work for different sessions. To locate them, use `select *` followed by `$PROFILE`. + +If you want to change the `AllUsers` scoped profile, do not install `pwsh` via `winget`, use `scoop` instead, since `winget` will install `pwsh` to `%ProgramFiles%\PowerShell\7\pwsh.exe`, which is read-only even with Administrator privileges. + +```powershell +PS > $PROFILE | Select * +AllUsersAllHosts : C:\Users\jsony\scoop\apps\pwsh\current\profile.ps1 +AllUsersCurrentHost : C:\Users\jsony\scoop\apps\pwsh\current\Microsoft.PowerShell_profile.ps1 +CurrentUserAllHosts : C:\Users\jsony\Documents\PowerShell\profile.ps1 +CurrentUserCurrentHost : C:\Users\jsony\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 +Length : 68 +``` + +Note that the variable `$PROFILE.*` are constants, the only way to change it is to compile your own `pwsh` + To link the profile file: -```pwsh +```powershell New-Item -ItemType SymbolicLink -Path $PROFILE -Target "$DOTFILES\win\Microsoft.PowerShell_profile.ps1" -Force ``` -I use [starship](https://starship.rs/) to customize the prompt, which is located in [`.dotfiles/.config/starship/starship_pwsh.toml`](../.config/starship/starship_pwsh.toml). This prompt config is cross-platform for powershell core, since I use the promp to identify the shell. +I use [starship](https://starship.rs/) to customize the prompt, which is located in [`tools/starship/starship_pwsh.toml`](../../tools/starship/starship_pwsh.toml). This prompt config is cross-platform for powershell core, since I use the prompt to identify the shell. -## `.wslconfig` - WSL Configuration +## `.wslconfig` - WSL2 Configuration -`.wslconfig` only supports `~/.wslconfig` as the configuration path +`.wslconfig` only supports `%UserProfile%\.wslconfig` as the configuration path -```pwsh -New-Item -ItemType SymbolicLink -Path "~\.wslconfig" -Target "$DOTFILES\win\.wslconfig" -Force +```powershell +New-Item -ItemType SymbolicLink -Path "$Env:UserProfile\.wslconfig" -Target "$DOTFILES\win\.wslconfig" -Force ``` - + ## Neovide Neovide configuration is (only) stored in `%APPDATA%\neovide\config.toml` -```pwsh +```powershell New-Item -ItemType SymbolicLink -Path "$Env:AppData\neovide\config.toml" -Target "$DOTFILES\win\neovide.toml" -Force ``` \ No newline at end of file diff --git a/readme.md b/readme.md index a71c2e8..6a4f444 100644 --- a/readme.md +++ b/readme.md @@ -2,6 +2,10 @@ This repository contains dotfiles for multiple platforms, with _colemak_ as the default keyboard layout. +No rice, no Unixporn/NTporn, just a simple setup that works for me. + +Works for Windows, Linux and MacOS. + ## Structure ```shell @@ -15,3 +19,13 @@ This repository contains dotfiles for multiple platforms, with _colemak_ as the ├──  scripts # Scripts for various tasks └──  tools # Multi-file configurations (shell, neovim etc) ``` + +## Keybindings + +``` + ^ + n + < h i > + e + v +``` diff --git a/scripts/update.zsh b/scripts/update.zsh index 025ee96..7a46754 100644 --- a/scripts/update.zsh +++ b/scripts/update.zsh @@ -41,6 +41,6 @@ if command -v winget.exe > /dev/null; then fi # macOS - Rime -if [ $(uname) = "Darwin"]; then +if [ $(uname) = "Darwin" ]; then bash ~/plum/rime-install fi diff --git a/tools/wezterm/.gitignore b/tools/wezterm/.gitignore new file mode 100644 index 0000000..604ed6b --- /dev/null +++ b/tools/wezterm/.gitignore @@ -0,0 +1,12 @@ +# $DOTFILES/tools/wezterm/ +# Date: 2025-01-06 +# Author: js0ny + +# Location: +# $XDG_CONFIG_HOME/wezterm/wezterm.lua (works Windows) +# Linking: Link the whole directory +# ln -sf $DOTFILES/tools/wezterm $XDG_CONFIG_HOME/wezterm +# New-Item -ItemType SymbolicLink -Target $DOTFILES\tools\wezterm -Path $Env:XDG_CONFIG_HOME\wezterm + +*.json +check_update diff --git a/tools/wezterm/wezterm.lua b/tools/wezterm/wezterm.lua index 3c8affb..b90ce40 100644 --- a/tools/wezterm/wezterm.lua +++ b/tools/wezterm/wezterm.lua @@ -1,121 +1,280 @@ --- $DOTFILES/tools\wezterm\wezterm.lua +-- $DOTFILES/tools/wezterm/wezterm.lua -- Date: 2024-12-22 -- Author: js0ny --- Location: --- $XDG_CONFIG_HOME/wezterm/wezterm.lua --- Linking: --- ln -sf $DOTFILES/tools/wezterm/wezterm.lua $XDG_CONFIG_HOME/wezterm/wezterm.lua - +--#region Import & Setup local wezterm = require 'wezterm' +local action = wezterm.action local config = {} +--#endregion -local os_type = "" -if package.config:sub(1,1) == "\\" then +--#region Helper +--[[ +local function detect_os() + local detected_os = "" + if package.config:sub(1, 1) == "\\" then -- Windows - os_type = "Windows" -elseif package.config:sub(1,1) == "/" then + detected_os = "Windows" + elseif package.config:sub(1, 1) == "/" then -- Unix-like (Linux, macOS, etc.) if os.getenv("HOME") then - os_type = "Unix-like" - -- You can differentiate further by checking for macOS or Linux if needed - if os.getenv("XDG_SESSION_TYPE") then - -- Likely Linux - os_type = "Linux" - elseif os.execute("uname -s | grep -i darwin") == 0 then - -- macOS - os_type = "macOS" - end + detected_os = "Unix-like" + -- You can differentiate further by checking for macOS or Linux if needed + if os.getenv("XDG_SESSION_TYPE") then + -- Likely Linux + detected_os = "Linux" + elseif os.execute("uname -s | grep -i darwin") == 0 then + -- macOS + detected_os = "macOS" + end end + end + return detected_os +end +--]] +--[[ +wezterm.on("text-selection-callback", function(window, pane) + local text = window:get_selection_text_for_pane(pane) +end) +--]] + +local function detect_os() + local os_type = "" + if wezterm.target_triple == "x86_64-pc-windows-msvc" then + os_type = "Windows" + elseif wezterm.target_triple == "x86_64-unknown-linux-gnu" then + os_type = "Linux" + elseif wezterm.target_triple == "aarch64-apple-darwin" then + os_type = "macOS" + end + return os_type end -print("[DEBUG] Detected OS: " .. os_type) +-- OS light/dark theme detection +local function detect_theme() +end +--#endregion + +--#region Constant +local os_type = detect_os() +--#endregion --- Appearance ------------------- +--#region Appearance -- Font and color scheme -config.font = wezterm.font("FiraCode Nerd Font") -config.color_scheme = "Ayu Mirage" +-- config.font = 'FiraCode Nerd Font' + +config.max_fps = 120 +config.font = wezterm.font({ + family = "CaskaydiaCove Nerd Font", +}) +config.color_scheme = "Catppuccin Frappe" config.font_size = 12.0 +config.front_end = "WebGpu" +config.webgpu_power_preference = "HighPerformance" if os_type == "Windows" then - config.window_background_opacity = 0.7 - config.win32_system_backdrop = 'Acrylic' + config.window_background_opacity = 0.7 -- Not working under WebGpu + config.win32_system_backdrop = "Mica" end -- Tab appearance config.hide_tab_bar_if_only_one_tab = true config.tab_bar_at_bottom = true +-- Cursor +-- config.animation_fps = 120 +-- config.cursor_blink_ease_in = 'EaseOut' +-- config.cursor_blink_ease_out = 'EaseOut' +-- config.default_cursor_style = 'BlinkingBlock' +-- config.cursor_blink_rate = 650 +-- Visual Bell +config.visual_bell = { + fade_in_function = 'EaseIn', + fade_in_duration_ms = 250, + fade_out_function = 'EaseOut', + fade_out_duration_ms = 250, + target = 'CursorColor', +} +--#endregion --- Keybindings ------------------- -config.leader = { key="q", mods="CTRL" } +--#region Keybindings +config.leader = { key = "q", mods = "CTRL" } config.keys = { - { - key = 'q', - mods = 'LEADER', - action = wezterm.action.SendKey {key = 'q', mods = 'CTRL'}, - }, - -- Windows Management - { - key = '|', - mods = 'LEADER|SHIFT', - action = wezterm.action.SplitHorizontal{domain="CurrentPaneDomain"} - }, - { - key = '-', - mods = 'LEADER', - action = wezterm.action.SplitVertical{domain="CurrentPaneDomain"} - }, - { - key = 'h', - mods = 'LEADER', - action = wezterm.action.ActivatePaneDirection 'Left' - }, - { - key = 'n', - mods = 'LEADER', - action = wezterm.action.ActivatePaneDirection 'Down' - }, - { - key = 'e', - mods = 'LEADER', - action = wezterm.action.ActivatePaneDirection 'Up' - }, - { - key = 'i', - mods = 'LEADER', - action = wezterm.action.ActivatePaneDirection 'Right' - }, - { - key = 'H', - mods = 'LEADER', - action = wezterm.action.AdjustPaneSize { 'Left', 5 }, - }, - { - key = 'N', - mods = 'LEADER', - action = wezterm.action.AdjustPaneSize { 'Down', 5 }, - }, - { - key = 'E', - mods = 'LEADER', - action = wezterm.action.AdjustPaneSize { 'Up', 5 }, - }, - { - key = 'I', - mods = 'LEADER', - action = wezterm.action.AdjustPaneSize { 'Right', 5 }, - }, + { + key = 'q', + mods = 'LEADER', + action = action.SendKey { key = 'q', mods = 'CTRL' }, + }, + -- Windows Management + { -- leader keys + key = '|', + mods = 'LEADER|SHIFT', + action = action.SplitHorizontal { domain = "CurrentPaneDomain" } + }, + { + key = '-', + mods = 'LEADER', + action = action.SplitVertical { domain = "CurrentPaneDomain" } + }, + { + key = 'h', + mods = 'LEADER', + action = action.ActivatePaneDirection 'Left' + }, + { + key = 'n', + mods = 'LEADER', + action = action.ActivatePaneDirection 'Down' + }, + { + key = 'e', + mods = 'LEADER', + action = action.ActivatePaneDirection 'Up' + }, + { + key = 'i', + mods = 'LEADER', + action = action.ActivatePaneDirection 'Right' + }, + { + key = 'H', + mods = 'LEADER', + action = action.AdjustPaneSize { 'Left', 5 }, + }, + { + key = 'N', + mods = 'LEADER', + action = action.AdjustPaneSize { 'Down', 5 }, + }, + { + key = 'E', + mods = 'LEADER', + action = action.AdjustPaneSize { 'Up', 5 }, + }, + { + key = 'I', + mods = 'LEADER', + action = action.AdjustPaneSize { 'Right', 5 }, + }, + { + key = "/", + mods = "LEADER", + action = action.Search { Regex = "" } + }, + { + key = "?", + mods = "LEADER|SHIFT", + action = action.Search { CaseSensitiveString = "" } + }, + { + key = ";", + mods = "LEADER", + action = action.ShowLauncher + }, + { + key = ":", + mods = "LEADER|SHIFT", + action = action.ActivateCommandPalette + }, + { + key = "W", + mods = "CTRL", + action = action.CloseCurrentPane { confirm = true } + }, + { -- ^C to copy if selection is active, otherwise send signal + -- https://wezfurlong.org/wezterm/config/lua/keyassignment/ClearSelection.html?h=selection + key = 'c', + mods = 'CTRL', + action = wezterm.action_callback(function(window, pane) + local has_selection = window:get_selection_text_for_pane(pane) ~= '' + if has_selection then + window:perform_action(action.CopyTo 'ClipboardAndPrimarySelection', pane) + + window:perform_action(action.ClearSelection, pane) + else + window:perform_action(action.SendKey { key = 'c', mods = 'CTRL' }, pane) + end + end), + }, } --- Environment ------------------- -if os_type == "Windows" then - config.default_prog = { "pwsh.exe" } -else - config.default_prog = { "fish" } -end +config.mouse_bindings = { + { + event = { Up = { streak = 1, button = 'Left' } }, + mods = 'CTRL', + action = action.OpenLinkAtMouseCursor, + }, + { + event = { Up = { streak = 1, button = 'Left' } }, + mods = 'SUPER', + action = action.OpenLinkAtMouseCursor, + }, +} +--#endregion + +--#region Environment config.set_environment_variables = { - WEZTERM="true", + WEZTERM = "true", -- for `icat` } +--#endregion + +--#region Launching +if os_type == "Windows" then + config.default_prog = { "pwsh.exe", "-NoLogo", "-NoProfileLoadTime" } + config.launch_menu = { + { + label = "Local - PowerShell", + args = { "pwsh.exe", "-NoLogo", "-NoProfileLoadTime" } + }, + { + label = "Local - PowerShell Administator", + args = { "sudo.exe", "pwsh.exe", "-NoLogo", "-NoProfileLoadTime" } + }, + { + label = "WSL1 - Arch", + args = { "wsl.exe", "-d", "Arch" } + }, + { + label = "WSL2 - kali-linux", + args = { "wsl.exe", "-d", "kali-linux" } + }, + { + label = "Local - NuShell", + args = { "nu" } + }, + { + label = "Local - Windows PowerShell", + args = { "powershell.exe" } + }, + { + label = "Local - Command Prompt", + args = { "cmd.exe" } + }, + { + label = "WSL1 - Arch Zsh", + args = { "wsl.exe", "-d", "Arch", "zsh" } + }, + } +else + config.default_prog = { "fish" } + config.launch_menu = { + { + label = "Local - Fish", + args = { "fish", "-l" } + }, + { + label = "Local - Zsh", + args = { "zsh", "-l" } + }, + { + label = "Local - PowerShell", + args = { "pwsh", "-NoLogo", "-NoProfileLoadTime", "-Login" } + }, + { + label = "Local - NuShell", + args = { "nu", "-l" } + }, + } +end +--#endregion + + return config