diff --git a/Containerfile b/Containerfile
index 58501ee..6754091 100644
--- a/Containerfile
+++ b/Containerfile
@@ -8,6 +8,9 @@ COPY build_files /
# Base Image
FROM ${BASE_IMAGE}
+# Copy dot_files into the image at /usr/share/binaryos/config
+COPY dot_files /usr/share/binaryos/config
+
## Other possible base images include:
# FROM ghcr.io/ublue-os/bazzite:latest
# FROM ghcr.io/ublue-os/bluefin-dx-nvidia:stable-daily
diff --git a/build_files/binaryos-config b/build_files/binaryos-config
new file mode 100755
index 0000000..2b42c12
--- /dev/null
+++ b/build_files/binaryos-config
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+set -euo pipefail
+
+USER_HOME=$(getent passwd "$USER" | cut -d: -f6)
+HYPR_CONFIG_DIR="$USER_HOME/.config/hypr"
+HYPR_CONFIG_FILE="$HYPR_CONFIG_DIR/hyprland.conf"
+DEFAULT_HYPR_CONFIG_DIR="/usr/share/binaryos/config/hypr"
+
+if [ ! -f "$HYPR_CONFIG_FILE" ]; then
+ mkdir -p "$HYPR_CONFIG_DIR"
+ echo "source = $DEFAULT_HYPR_CONFIG_DIR/hyprland.conf" > "$HYPR_CONFIG_FILE"
+fi
diff --git a/build_files/binaryos-config.service b/build_files/binaryos-config.service
new file mode 100644
index 0000000..e53766f
--- /dev/null
+++ b/build_files/binaryos-config.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=BinaryOS Config
+After=graphical-session.target
+PartOf=hyprland-session.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/binaryos-config
+
+[Install]
+WantedBy=hyprland-session.target
diff --git a/build_files/build.sh b/build_files/build.sh
index a4ee207..d152702 100755
--- a/build_files/build.sh
+++ b/build_files/build.sh
@@ -9,28 +9,43 @@ set -ouex pipefail
# List of rpmfusion packages can be found here:
# https://mirrors.rpmfusion.org/mirrorlist?path=free/fedora/updates/39/x86_64/repoview/index.html&protocol=https&redirect=1
-# hyprland COPR from solopasha
+# Compositor / Hyprland Utilities
dnf5 -y copr enable solopasha/hyprland
-dnf5 -y install xdg-desktop-portal-hyprland hyprland hyprland-contrib hyprland-plugins hyprpaper hyprpicker hypridle hyprshot hyprlock pyprland waybar-git xdg-desktop-portal-hyprland hyprland-qtutils
+dnf5 -y install xdg-desktop-portal-hyprland hyprland hyprland-contrib hyprland-plugins hyprpaper hyprpicker hypridle hyprshot hyprlock pyprland xdg-desktop-portal-hyprland hyprland-qtutils
-# Walker
+# Remove extra things
+# TODO: Figure out what we don't need from solopasha/hyprland
+#
+# GUI Shell
+dnf5 -y copr enable killcrb/ashell
+dnf5 -y install ashell
+
+# Application Launcher
dnf5 -y copr enable errornointernet/walker
dnf5 -y install walker
dnf5 -y install elephant
-# swayosd
+# On Screen Display
dnf5 -y copr enable markupstart/SwayOSD
dnf5 -y install swayosd
-# other related packages found in main Fedora repos:
-dnf5 -y install mako swaybg
+# Desktop Notifications
+dnf5 -y install mako
+systemctl --global mask mako.service
-# Wezterm
+# Terminal
dnf5 -y copr enable wezfurlong/wezterm-nightly
dnf5 -y install wezterm
-# Neovim
+# Editor
dnf5 -y copr enable agriffis/neovim-nightly
dnf5 -y install neovim python3-neovim
+# Install binaryos config setup script and service
+install -Dm755 /ctx/binaryos-config /usr/bin/binaryos-config
+install -Dm644 /ctx/binaryos-config.service /usr/lib/systemd/user/binaryos-config.service
+
+# Enable hyprland config setup service
+systemctl --global enable binaryos-config.service
+
# systemctl enable podman.socket
diff --git a/dot_files/fish/conf.d/hydro.fish b/dot_files/fish/conf.d/hydro.fish
new file mode 100644
index 0000000..72afd5c
--- /dev/null
+++ b/dot_files/fish/conf.d/hydro.fish
@@ -0,0 +1,137 @@
+status is-interactive || exit
+
+set --global _hydro_git _hydro_git_$fish_pid
+
+function $_hydro_git --on-variable $_hydro_git
+ commandline --function repaint
+end
+
+function _hydro_pwd --on-variable PWD --on-variable hydro_ignored_git_paths --on-variable fish_prompt_pwd_dir_length
+ set --local git_root (command git --no-optional-locks rev-parse --show-toplevel 2>/dev/null)
+ set --local git_base (string replace --all --regex -- "^.*/" "" "$git_root")
+ set --local path_sep /
+
+ test "$fish_prompt_pwd_dir_length" = 0 && set path_sep
+
+ if set --query git_root[1] && ! contains -- $git_root $hydro_ignored_git_paths
+ set --erase _hydro_skip_git_prompt
+ else
+ set --global _hydro_skip_git_prompt
+ end
+
+ set --global _hydro_pwd (
+ string replace --ignore-case -- ~ \~ $PWD |
+ string replace -- "/$git_base/" /:/ |
+ string replace --regex --all -- "(\.?[^/]{"(
+ string replace --regex --all -- '^$' 1 "$fish_prompt_pwd_dir_length"
+ )"})[^/]*/" "\$1$path_sep" |
+ string replace -- : "$git_base" |
+ string replace --regex -- '([^/]+)$' "\x1b[1m\$1\x1b[22m" |
+ string replace --regex --all -- '(?!^/$)/|^$' "\x1b[2m/\x1b[22m"
+ )
+end
+
+function _hydro_postexec --on-event fish_postexec
+ set --local last_status $pipestatus
+ set --global _hydro_status "$_hydro_newline$_hydro_color_prompt$hydro_symbol_prompt"
+
+ for code in $last_status
+ if test $code -ne 0
+ set --global _hydro_status "$_hydro_color_error| "(echo $last_status)" $_hydro_newline$_hydro_color_prompt$_hydro_color_error$hydro_symbol_prompt"
+ break
+ end
+ end
+
+ test "$CMD_DURATION" -lt $hydro_cmd_duration_threshold && set _hydro_cmd_duration && return
+
+ set --local secs (math --scale=1 $CMD_DURATION/1000 % 60)
+ set --local mins (math --scale=0 $CMD_DURATION/60000 % 60)
+ set --local hours (math --scale=0 $CMD_DURATION/3600000)
+
+ set --local out
+
+ test $hours -gt 0 && set --local --append out $hours"h"
+ test $mins -gt 0 && set --local --append out $mins"m"
+ test $secs -gt 0 && set --local --append out $secs"s"
+
+ set --global _hydro_cmd_duration "$out "
+end
+
+function _hydro_prompt --on-event fish_prompt
+ set --query _hydro_status || set --global _hydro_status "$_hydro_newline$_hydro_color_prompt$hydro_symbol_prompt"
+ set --query _hydro_pwd || _hydro_pwd
+
+ command kill $_hydro_last_pid 2>/dev/null
+
+ set --query _hydro_skip_git_prompt && set $_hydro_git && return
+
+ fish --private --command "
+ set branch (
+ command git symbolic-ref --short HEAD 2>/dev/null ||
+ command git describe --tags --exact-match HEAD 2>/dev/null ||
+ command git rev-parse --short HEAD 2>/dev/null |
+ string replace --regex -- '(.+)' '@\$1'
+ )
+
+ test -z \"\$$_hydro_git\" && set --universal $_hydro_git \"\$branch \"
+
+ ! command git diff-index --quiet HEAD 2>/dev/null ||
+ count (command git ls-files --others --exclude-standard) >/dev/null && set info \"$hydro_symbol_git_dirty\"
+
+ for fetch in $hydro_fetch false
+ command git rev-list --count --left-right @{upstream}...@ 2>/dev/null |
+ read behind ahead
+
+ switch \"\$behind \$ahead\"
+ case \" \" \"0 0\"
+ case \"0 *\"
+ set upstream \" $hydro_symbol_git_ahead\$ahead\"
+ case \"* 0\"
+ set upstream \" $hydro_symbol_git_behind\$behind\"
+ case \*
+ set upstream \" $hydro_symbol_git_ahead\$ahead $hydro_symbol_git_behind\$behind\"
+ end
+
+ set --universal $_hydro_git \"\$branch\$info\$upstream \"
+
+ test \$fetch = true && command git fetch --no-tags 2>/dev/null
+ end
+ " &
+
+ set --global _hydro_last_pid $last_pid
+end
+
+function _hydro_fish_exit --on-event fish_exit
+ set --erase $_hydro_git
+end
+
+function _hydro_uninstall --on-event hydro_uninstall
+ set --names |
+ string replace --filter --regex -- "^(_?hydro_)" "set --erase \$1" |
+ source
+ functions --erase (functions --all | string match --entire --regex "^_?hydro_")
+end
+
+set --global hydro_color_normal (set_color normal)
+
+for color in hydro_color_{pwd,git,error,prompt,duration}
+ function $color --on-variable $color --inherit-variable color
+ set --query $color && set --global _$color (set_color $$color)
+ end && $color
+end
+
+function hydro_multiline --on-variable hydro_multiline
+ if test "$hydro_multiline" = true
+ set --global _hydro_newline "\n"
+ else
+ set --global _hydro_newline ""
+ end
+end && hydro_multiline
+
+set --query hydro_color_error || set --global hydro_color_error $fish_color_error
+set --query hydro_symbol_prompt || set --global hydro_symbol_prompt ❱
+set --query hydro_symbol_git_dirty || set --global hydro_symbol_git_dirty •
+set --query hydro_symbol_git_ahead || set --global hydro_symbol_git_ahead ↑
+set --query hydro_symbol_git_behind || set --global hydro_symbol_git_behind ↓
+set --query hydro_multiline || set --global hydro_multiline false
+set --query hydro_cmd_duration_threshold || set --global hydro_cmd_duration_threshold 1000
diff --git a/dot_files/fish/conf.d/rustup.fish b/dot_files/fish/conf.d/rustup.fish
new file mode 100644
index 0000000..e4cb363
--- /dev/null
+++ b/dot_files/fish/conf.d/rustup.fish
@@ -0,0 +1 @@
+source "$HOME/.cargo/env.fish"
diff --git a/dot_files/fish/config.fish b/dot_files/fish/config.fish
new file mode 100644
index 0000000..1bb912b
--- /dev/null
+++ b/dot_files/fish/config.fish
@@ -0,0 +1,35 @@
+if status is-interactive
+ # Commands to run in interactive sessions can go here
+
+ # VIM Mode
+ fish_vi_key_bindings
+
+ # Editor
+ set -gx EDITOR nvim
+
+ # Prompt
+ set --global hydro_multiline true
+ set --global fish_prompt_pwd_dir_length 100
+ set --global hydro_color_pwd $fish_color_comment
+ set --global hydro_color_git $fish_color_operator
+ set --global hydro_color_error $fish_color_error
+ set --global hydro_color_prompt $fish_color_command
+ set --global hydro_color_duration $fish_color_param
+
+ # Env Variables
+ set -Ux GOOGLE_CLOUD_PROJECT ibexio-src
+
+ # Path
+ fish_add_path $HOME/.local/bin
+ fish_add_path $HOME/.npm-packages/bin
+ fish_add_path $HOME/.cargo/bin
+ fish_add_path $HOME/Code/flutter/bin
+ fish_add_path $HOME/go/bin
+
+ # Alias
+ alias wezterm 'flatpak run org.wezfurlong.wezterm'
+end
+
+### bling.fish source start
+test -f /usr/share/ublue-os/bluefin-cli/bling.fish && source /usr/share/ublue-os/bluefin-cli/bling.fish
+### bling.fish source end
diff --git a/dot_files/fish/fish_variables b/dot_files/fish/fish_variables
new file mode 100644
index 0000000..2bb807c
--- /dev/null
+++ b/dot_files/fish/fish_variables
@@ -0,0 +1,86 @@
+# This file contains fish universal variable definitions.
+# VERSION: 3.0
+SETUVAR --export EXA_STANDARD_OPTIONS:\x2d\x2dgroup\x1e\x2d\x2dheader\x1e\x2d\x2dgroup\x2ddirectories\x2dfirst\x1e\x2d\x2dicons
+SETUVAR --export GOOGLE_CLOUD_PROJECT:ibexio\x2dsrc
+SETUVAR __fish_initialized:3800
+SETUVAR _hydro_git_1088236:charles\x2dsup\x2d743\x20
+SETUVAR _hydro_git_1088826:charles\x2dsup\x2d743\x20
+SETUVAR _hydro_git_1090793:charles\x2dsup\x2d743\x20
+SETUVAR _hydro_git_11278:charles\x2dsrv\x2d449\u2022\x20
+SETUVAR _hydro_git_11288:onboard\x20
+SETUVAR _hydro_git_11462:onboard\x20
+SETUVAR _hydro_git_121214:charles\x2deng\x2d15\x20
+SETUVAR _hydro_git_1602414:charles\x2ddevpod\u2022\x20
+SETUVAR _hydro_git_1991287:charles\x2dsup\x2d598\u2022\x20
+SETUVAR _hydro_git_222390:charles\x2deng\x2d230\x20
+SETUVAR _hydro_git_264321:charles\x2deng\x2d230\u2022\x20
+SETUVAR _hydro_git_264428:charles\x2deng\x2d230\u2022\x20
+SETUVAR _hydro_git_264643:client\x2dimport\x2dfamily\x20
+SETUVAR _hydro_git_27695:charles\x2deng\x2d148\u2022\x20\u21914\x20
+SETUVAR _hydro_git_2809224:charles\x2ddevpod\x20
+SETUVAR _hydro_git_293996:main\u2022\x20
+SETUVAR _hydro_git_294696:main\u2022\x20
+SETUVAR _hydro_git_301432:main\x20
+SETUVAR _hydro_git_3076414:onboarding\x20
+SETUVAR _hydro_git_3115435:onboarding\x20
+SETUVAR _hydro_git_31341:charles\x2dsrv\x2d332\x20
+SETUVAR _hydro_git_3179190:onboard\u2022\x20
+SETUVAR _hydro_git_3188953:onboard\u2022\x20
+SETUVAR _hydro_git_3223428:onboard\u2022\x20
+SETUVAR _hydro_git_3223609:onboard\u2022\x20
+SETUVAR _hydro_git_3223793:onboard\u2022\x20
+SETUVAR _hydro_git_3270698:onboard\u2022\x20
+SETUVAR _hydro_git_3310547:ai\x2dclient\x2dmatching\u2022\x20
+SETUVAR _hydro_git_33114:charles\x2deng\x2d133\u2022\x20
+SETUVAR _hydro_git_3347834:\x1d
+SETUVAR _hydro_git_343422:main\u2022\x20
+SETUVAR _hydro_git_34638:charles\x2deng\x2d133\x20
+SETUVAR _hydro_git_34984:ai\x2dcoach\x2dmatching\u2022\x20
+SETUVAR _hydro_git_3622049:onboarding\x20
+SETUVAR _hydro_git_3743035:onboard\u2022\x20
+SETUVAR _hydro_git_3850354:\x1d
+SETUVAR _hydro_git_4026738:charles\x2ddev\x2dbashrc\u2022\x20
+SETUVAR _hydro_git_4107649:charles\x2dsrv\x2d256\u2022\x20
+SETUVAR _hydro_git_4145898:charles\x2dsrv\x2d256\u2022\x20
+SETUVAR _hydro_git_4150144:charles\x2dsrv\x2d256\u2022\x20
+SETUVAR _hydro_git_4164312:charles\x2dsrv\x2d256\u2022\x20
+SETUVAR _hydro_git_43562:ai\x2dcoach\x2dmatching\u2022\x20
+SETUVAR _hydro_git_43801:ai\x2dcoach\x2dmatching\u2022\x20
+SETUVAR _hydro_git_44056:ai\x2dcoach\x2dmatching\x20
+SETUVAR _hydro_git_441742:charles\x2deng\x2d15b\u2022\x20
+SETUVAR _hydro_git_455034:charles\x2deng\x2d15b\u2022\x20
+SETUVAR _hydro_git_470026:qbo\x20
+SETUVAR _hydro_git_724865:charles\x2dsrv\x2d449\u2022\x20
+SETUVAR _hydro_git_725109:charles\x2dsrv\x2d449\u2022\x20
+SETUVAR _hydro_git_725293:charles\x2dsrv\x2d449\u2022\x20
+SETUVAR _hydro_git_8132:master\x20
+SETUVAR _hydro_git_9213:onboard\x20
+SETUVAR fish_color_autosuggestion:brblack
+SETUVAR fish_color_cancel:\x2dr
+SETUVAR fish_color_command:blue
+SETUVAR fish_color_comment:red
+SETUVAR fish_color_cwd:green
+SETUVAR fish_color_cwd_root:red
+SETUVAR fish_color_end:green
+SETUVAR fish_color_error:brred
+SETUVAR fish_color_escape:brcyan
+SETUVAR fish_color_history_current:\x2d\x2dbold
+SETUVAR fish_color_host:normal
+SETUVAR fish_color_host_remote:yellow
+SETUVAR fish_color_normal:normal
+SETUVAR fish_color_operator:brcyan
+SETUVAR fish_color_param:cyan
+SETUVAR fish_color_quote:yellow
+SETUVAR fish_color_redirection:cyan\x1e\x2d\x2dbold
+SETUVAR fish_color_search_match:white\x1e\x2d\x2dbackground\x3dbrblack
+SETUVAR fish_color_selection:white\x1e\x2d\x2dbold\x1e\x2d\x2dbackground\x3dbrblack
+SETUVAR fish_color_status:red
+SETUVAR fish_color_user:brgreen
+SETUVAR fish_color_valid_path:\x2d\x2dunderline
+SETUVAR fish_key_bindings:fish_vi_key_bindings
+SETUVAR fish_pager_color_completion:normal
+SETUVAR fish_pager_color_description:yellow\x1e\x2di
+SETUVAR fish_pager_color_prefix:normal\x1e\x2d\x2dbold\x1e\x2d\x2dunderline
+SETUVAR fish_pager_color_progress:brwhite\x1e\x2d\x2dbackground\x3dcyan
+SETUVAR fish_pager_color_selected_background:\x2dr
+SETUVAR fish_user_paths:/var/home/binarypie/Code/flutter/bin\x1e/var/home/binarypie/\x2ecargo/bin\x1e/var/home/binarypie/\x2elocal/bin
diff --git a/dot_files/fish/fishd.tmp.ehcEoz b/dot_files/fish/fishd.tmp.ehcEoz
new file mode 100644
index 0000000..e69de29
diff --git a/dot_files/gitui/key_bindings.ron b/dot_files/gitui/key_bindings.ron
new file mode 100644
index 0000000..5f3b30c
--- /dev/null
+++ b/dot_files/gitui/key_bindings.ron
@@ -0,0 +1,40 @@
+// Note:
+// If the default key layout is lower case,
+// and you want to use `Shift + q` to trigger the exit event,
+// the setting should like this `exit: Some(( code: Char('Q'), modifiers: "SHIFT")),`
+// The Char should be upper case, and the modifier should be set to "SHIFT".
+//
+// Note:
+// find `KeysList` type in src/keys/key_list.rs for all possible keys.
+// every key not overwritten via the config file will use the default specified there
+(
+ open_help: Some(( code: F(1), modifiers: "")),
+
+ move_left: Some(( code: Char('h'), modifiers: "")),
+ move_right: Some(( code: Char('l'), modifiers: "")),
+ move_up: Some(( code: Char('k'), modifiers: "")),
+ move_down: Some(( code: Char('j'), modifiers: "")),
+
+ popup_up: Some(( code: Char('p'), modifiers: "CONTROL")),
+ popup_down: Some(( code: Char('n'), modifiers: "CONTROL")),
+ page_up: Some(( code: Char('b'), modifiers: "CONTROL")),
+ page_down: Some(( code: Char('f'), modifiers: "CONTROL")),
+ home: Some(( code: Char('g'), modifiers: "")),
+ end: Some(( code: Char('G'), modifiers: "SHIFT")),
+ shift_up: Some(( code: Char('K'), modifiers: "SHIFT")),
+ shift_down: Some(( code: Char('J'), modifiers: "SHIFT")),
+
+ edit_file: Some(( code: Char('I'), modifiers: "SHIFT")),
+
+ status_reset_item: Some(( code: Char('U'), modifiers: "SHIFT")),
+
+ diff_reset_lines: Some(( code: Char('u'), modifiers: "")),
+ diff_stage_lines: Some(( code: Char('s'), modifiers: "")),
+
+ stashing_save: Some(( code: Char('w'), modifiers: "")),
+ stashing_toggle_index: Some(( code: Char('m'), modifiers: "")),
+
+ stash_open: Some(( code: Char('l'), modifiers: "")),
+
+ abort_merge: Some(( code: Char('M'), modifiers: "SHIFT")),
+)
diff --git a/dot_files/hypr/.gitignore b/dot_files/hypr/.gitignore
new file mode 100644
index 0000000..6fd0a37
--- /dev/null
+++ b/dot_files/hypr/.gitignore
@@ -0,0 +1,41 @@
+# Compiled Lua sources
+luac.out
+
+# luarocks build files
+*.src.rock
+*.zip
+*.tar.gz
+
+# Object files
+*.o
+*.os
+*.ko
+*.obj
+*.elf
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+*.def
+*.exp
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
diff --git a/dot_files/hypr/background.webp b/dot_files/hypr/background.webp
new file mode 100644
index 0000000..1580a5d
Binary files /dev/null and b/dot_files/hypr/background.webp differ
diff --git a/dot_files/hypr/hypridle.conf b/dot_files/hypr/hypridle.conf
new file mode 100644
index 0000000..c28d167
--- /dev/null
+++ b/dot_files/hypr/hypridle.conf
@@ -0,0 +1,42 @@
+# Hypridle Configuration - Auto-lock for Hyprland
+# Tokyo Night Theme
+
+general {
+ lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances
+ before_sleep_cmd = loginctl lock-session # lock before suspend
+ after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display
+}
+
+# Dim screen after 2.5 minutes of inactivity
+listener {
+ timeout = 150 # 2.5 minutes
+ on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor
+ on-resume = brightnessctl -r # restore monitor backlight
+}
+
+# Turn off keyboard backlight after 2.5 minutes
+listener {
+ timeout = 150 # 2.5 minutes
+ on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight
+ on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight
+}
+
+# Lock screen after 5 minutes of inactivity
+listener {
+ timeout = 300 # 5 minutes
+ on-timeout = loginctl lock-session # lock screen when timeout has passed
+}
+
+# Turn off screen after 5.5 minutes of inactivity (30 seconds after lock)
+listener {
+ timeout = 330 # 5.5 minutes
+ on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
+ on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired
+}
+
+# Suspend system after 30 minutes of inactivity
+listener {
+ timeout = 1800 # 30 minutes
+ on-timeout = systemctl suspend # suspend pc
+}
+
diff --git a/dot_files/hypr/hyprland.conf b/dot_files/hypr/hyprland.conf
new file mode 100644
index 0000000..3b4f974
--- /dev/null
+++ b/dot_files/hypr/hyprland.conf
@@ -0,0 +1,348 @@
+
+# #######################################################################################
+# HYPRLAND CONFIG - Tokyo Night Theme with Vim-like Keybindings
+# #######################################################################################
+#
+# Tokyo Night Color Palette:
+# - Background: #1a1b26
+# - Foreground: #c0caf5
+# - Blue (accent): #7aa2f7
+# - Purple (accent): #bb9af7
+# - Cyan: #7dcfff
+# - Green: #9ece6a
+# - Red: #f7768e
+# - Border inactive: #414868
+#
+# Keybindings:
+# - Vim-like navigation: SUPER + h/j/k/l (left/down/up/right)
+# - Move windows: SUPER + SHIFT + h/j/k/l
+# - Resize windows: SUPER + CTRL + h/j/k/l
+# - Task runner: SUPER + R (launches Walker)
+#
+# #######################################################################################
+
+# Refer to the wiki for more information.
+# https://wiki.hypr.land/Configuring/
+
+
+################
+### MONITORS ###
+################
+
+# See https://wiki.hypr.land/Configuring/Monitors/
+monitor=,preferred,auto,auto
+
+
+###################
+### MY PROGRAMS ###
+###################
+
+# See https://wiki.hypr.land/Configuring/Keywords/
+
+# Set programs that you use
+$terminal = wezterm
+$fileManager = files
+$menu = /usr/sbin/walker
+
+
+#################
+### AUTOSTART ###
+#################
+
+# Autostart necessary processes (like notifications daemons, status bars, etc.)
+# Or execute your favorite apps at launch like this:
+
+# Start Elephant service (required for Walker)
+exec-once = systemctl --user start elephant.service
+
+# Start hyprpaper for wallpaper
+exec-once = hyprpaper -c ./hyprpaper.conf
+
+# Start swayosd server for OSD notifications
+exec-once = swayosd-server
+
+# Start hypridle for auto-lock
+exec-once = hypridle -c ./hypridle.conf
+
+# exec-once = $terminal
+# exec-once = nm-applet &
+# exec-once = waybar & firefox
+
+
+#############################
+### ENVIRONMENT VARIABLES ###
+#############################
+
+# See https://wiki.hypr.land/Configuring/Environment-variables/
+
+env = XCURSOR_SIZE,24
+env = HYPRCURSOR_SIZE,24
+
+
+###################
+### PERMISSIONS ###
+###################
+
+# See https://wiki.hypr.land/Configuring/Permissions/
+# Please note permission changes here require a Hyprland restart and are not applied on-the-fly
+# for security reasons
+
+# ecosystem {
+# enforce_permissions = 1
+# }
+
+# permission = /usr/(bin|local/bin)/grim, screencopy, allow
+# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
+# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow
+
+
+#####################
+### LOOK AND FEEL ###
+#####################
+
+# Refer to https://wiki.hypr.land/Configuring/Variables/
+
+# https://wiki.hypr.land/Configuring/Variables/#general
+# Tokyo Night Theme Colors
+general {
+ gaps_in = 5
+ gaps_out = 20
+
+ border_size = 2
+
+ # Tokyo Night colors - active border uses accent blue/purple gradient
+ col.active_border = rgba(7aa2f7ee) rgba(bb9af7ee) 45deg
+ col.inactive_border = rgba(414868aa)
+
+ # Set to true enable resizing windows by clicking and dragging on borders and gaps
+ resize_on_border = false
+
+ # Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
+ allow_tearing = false
+
+ layout = dwindle
+}
+
+# https://wiki.hypr.land/Configuring/Variables/#decoration
+decoration {
+ rounding = 10
+ rounding_power = 2
+
+ # Change transparency of focused and unfocused windows
+ active_opacity = 1.0
+ inactive_opacity = 1.0
+
+ shadow {
+ enabled = true
+ range = 4
+ render_power = 3
+ color = rgba(1a1b26ee) # Tokyo Night background
+ }
+
+ # https://wiki.hypr.land/Configuring/Variables/#blur
+ blur {
+ enabled = true
+ size = 3
+ passes = 1
+
+ vibrancy = 0.1696
+ }
+}
+
+# https://wiki.hypr.land/Configuring/Variables/#animations
+animations {
+ enabled = yes, please :)
+
+ # Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves
+ # NAME, X0, Y0, X1, Y1
+ bezier = easeOutQuint, 0.23, 1, 0.32, 1
+ bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1
+ bezier = linear, 0, 0, 1, 1
+ bezier = almostLinear, 0.5, 0.5, 0.75, 1
+ bezier = quick, 0.15, 0, 0.1, 1
+
+ # Default animations, see https://wiki.hypr.land/Configuring/Animations/
+ # NAME, ONOFF, SPEED, CURVE, [STYLE]
+ animation = global, 1, 10, default
+ animation = border, 1, 5.39, easeOutQuint
+ animation = windows, 1, 4.79, easeOutQuint
+ animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
+ animation = windowsOut, 1, 1.49, linear, popin 87%
+ animation = fadeIn, 1, 1.73, almostLinear
+ animation = fadeOut, 1, 1.46, almostLinear
+ animation = fade, 1, 3.03, quick
+ animation = layers, 1, 3.81, easeOutQuint
+ animation = layersIn, 1, 4, easeOutQuint, fade
+ animation = layersOut, 1, 1.5, linear, fade
+ animation = fadeLayersIn, 1, 1.79, almostLinear
+ animation = fadeLayersOut, 1, 1.39, almostLinear
+ animation = workspaces, 1, 1.94, almostLinear, fade
+ animation = workspacesIn, 1, 1.21, almostLinear, fade
+ animation = workspacesOut, 1, 1.94, almostLinear, fade
+ animation = zoomFactor, 1, 7, quick
+}
+
+# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/
+# "Smart gaps" / "No gaps when only"
+# uncomment all if you wish to use that.
+# workspace = w[tv1], gapsout:0, gapsin:0
+# workspace = f[1], gapsout:0, gapsin:0
+# windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
+# windowrule = rounding 0, floating:0, onworkspace:w[tv1]
+# windowrule = bordersize 0, floating:0, onworkspace:f[1]
+# windowrule = rounding 0, floating:0, onworkspace:f[1]
+
+# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more
+dwindle {
+ pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = true # You probably want this
+}
+
+# See https://wiki.hypr.land/Configuring/Master-Layout/ for more
+master {
+ new_status = master
+}
+
+# https://wiki.hypr.land/Configuring/Variables/#misc
+misc {
+ force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers
+ disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :(
+}
+
+
+#############
+### INPUT ###
+#############
+
+# https://wiki.hypr.land/Configuring/Variables/#input
+input {
+ kb_layout = us
+ kb_variant =
+ kb_model =
+ kb_options =
+ kb_rules =
+ follow_mouse = 1
+ sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
+ touchpad {
+ natural_scroll = false
+ }
+}
+
+# See https://wiki.hypr.land/Configuring/Gestures
+gesture = 3, horizontal, workspace
+
+# Example per-device config
+# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more
+device {
+ name = epic-mouse-v1
+ sensitivity = -0.5
+}
+
+
+###################
+### KEYBINDINGS ###
+###################
+
+# See https://wiki.hypr.land/Configuring/Keywords/
+$mainMod = SUPER # Sets "Windows" key as main modifier
+
+# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
+bind = $mainMod, Q, exec, $terminal
+bind = $mainMod, C, killactive,
+bind = $mainMod, E, exec, $fileManager
+bind = $mainMod, V, togglefloating,
+bind = $mainMod, F, fullscreen, 0 # Fullscreen
+bind = $mainMod, R, exec, $menu
+bind = $mainMod, P, pseudo, # dwindle
+bind = $mainMod, S, togglesplit, # dwindle
+bind = $mainMod SHIFT, L, exec, hyprlock # Lock screen
+
+# Move focus with mainMod + vim keys (h/j/k/l)
+bind = $mainMod, H, movefocus, l
+bind = $mainMod, L, movefocus, r
+bind = $mainMod, K, movefocus, u
+bind = $mainMod, J, movefocus, d
+
+# Move focus with mainMod + arrow keys (alternative)
+bind = $mainMod, left, movefocus, l
+bind = $mainMod, right, movefocus, r
+bind = $mainMod, up, movefocus, u
+bind = $mainMod, down, movefocus, d
+
+# Switch workspaces with mainMod + [0-9]
+bind = $mainMod, 1, workspace, 1
+bind = $mainMod, 2, workspace, 2
+bind = $mainMod, 3, workspace, 3
+bind = $mainMod, 4, workspace, 4
+bind = $mainMod, 5, workspace, 5
+bind = $mainMod, 6, workspace, 6
+bind = $mainMod, 7, workspace, 7
+bind = $mainMod, 8, workspace, 8
+bind = $mainMod, 9, workspace, 9
+bind = $mainMod, 0, workspace, 10
+
+# Move active window to a workspace with mainMod + SHIFT + [0-9]
+bind = $mainMod SHIFT, 1, movetoworkspace, 1
+bind = $mainMod SHIFT, 2, movetoworkspace, 2
+bind = $mainMod SHIFT, 3, movetoworkspace, 3
+bind = $mainMod SHIFT, 4, movetoworkspace, 4
+bind = $mainMod SHIFT, 5, movetoworkspace, 5
+bind = $mainMod SHIFT, 6, movetoworkspace, 6
+bind = $mainMod SHIFT, 7, movetoworkspace, 7
+bind = $mainMod SHIFT, 8, movetoworkspace, 8
+bind = $mainMod SHIFT, 9, movetoworkspace, 9
+bind = $mainMod SHIFT, 0, movetoworkspace, 10
+
+# Move windows with vim keys (mainMod + SHIFT + h/j/k/l)
+bind = $mainMod SHIFT, H, movewindow, l
+bind = $mainMod SHIFT, L, movewindow, r
+bind = $mainMod SHIFT, K, movewindow, u
+bind = $mainMod SHIFT, J, movewindow, d
+
+# Resize windows with vim keys (mainMod + CTRL + h/j/k/l)
+bind = $mainMod CTRL, H, resizeactive, -50 0
+bind = $mainMod CTRL, L, resizeactive, 50 0
+bind = $mainMod CTRL, K, resizeactive, 0 -50
+bind = $mainMod CTRL, J, resizeactive, 0 50
+
+# Example special workspace (scratchpad)
+bind = $mainMod, T, togglespecialworkspace, magic
+bind = $mainMod SHIFT, T, movetoworkspace, special:magic
+
+# Scroll through existing workspaces with mainMod + scroll
+bind = $mainMod, mouse_down, workspace, e+1
+bind = $mainMod, mouse_up, workspace, e-1
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+# Laptop multimedia keys for volume and LCD brightness (using swayosd)
+bindel = ,XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise
+bindel = ,XF86AudioLowerVolume, exec, swayosd-client --output-volume lower
+bindel = ,XF86AudioMute, exec, swayosd-client --output-volume mute-toggle
+bindel = ,XF86AudioMicMute, exec, swayosd-client --input-volume mute-toggle
+bindel = ,XF86MonBrightnessUp, exec, swayosd-client --brightness raise
+bindel = ,XF86MonBrightnessDown, exec, swayosd-client --brightness lower
+
+# Requires playerctl
+bindl = , XF86AudioNext, exec, playerctl next
+bindl = , XF86AudioPause, exec, playerctl play-pause
+bindl = , XF86AudioPlay, exec, playerctl play-pause
+bindl = , XF86AudioPrev, exec, playerctl previous
+
+##############################
+### WINDOWS AND WORKSPACES ###
+##############################
+
+# See https://wiki.hypr.land/Configuring/Window-Rules/ for more
+# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
+
+# Example windowrule
+# windowrule = float,class:^(kitty)$,title:^(kitty)$
+
+# Ignore maximize requests from apps. You'll probably like this.
+windowrule = suppressevent maximize, class:.*
+
+# Fix some dragging issues with XWayland
+windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
diff --git a/dot_files/hypr/hyprlock.conf b/dot_files/hypr/hyprlock.conf
new file mode 100644
index 0000000..555ca53
--- /dev/null
+++ b/dot_files/hypr/hyprlock.conf
@@ -0,0 +1,91 @@
+# Hyprlock Configuration - Tokyo Night Theme
+
+# General settings
+general {
+ grace = 0
+ hide_cursor = true
+ no_fade_in = false
+}
+
+# Tokyo Night Background
+# Replace the path below with your custom wallpaper
+background {
+ monitor =
+ path = $/usr/share/binaryos/hypr/background.webp # Change this to your image path
+ blur_passes = 3
+ blur_size = 7
+ noise = 0.0117
+ contrast = 0.8916
+ brightness = 0.8172
+ vibrancy = 0.1696
+ vibrancy_darkness = 0.0
+}
+
+# Input Field (Password)
+input-field {
+ monitor =
+ size = 300, 50
+ outline_thickness = 3
+ dots_size = 0.25
+ dots_spacing = 0.15
+ dots_center = true
+ dots_rounding = -1
+
+ # Tokyo Night colors
+ outer_color = rgba(122, 162, 247, 0.9) # Tokyo Night blue
+ inner_color = rgba(26, 27, 38, 0.9) # Tokyo Night background
+ font_color = rgba(192, 202, 245, 1.0) # Tokyo Night foreground
+
+ check_color = rgba(158, 206, 106, 0.9) # Tokyo Night green
+ fail_color = rgba(247, 118, 142, 0.9) # Tokyo Night red
+ capslock_color = rgba(187, 154, 247, 0.9) # Tokyo Night purple
+
+ fade_on_empty = true
+ fade_timeout = 1000
+ placeholder_text = Enter Password...
+ fail_text = $FAIL ($ATTEMPTS)
+
+ rounding = 12
+ position = 0, -120
+ halign = center
+ valign = center
+}
+
+# Time Label
+label {
+ monitor =
+ text = cmd[update:1000] echo "$(date +'%H:%M')"
+ color = rgba(192, 202, 245, 1.0)
+ font_size = 90
+ font_family = JetBrains Mono
+
+ position = 0, 150
+ halign = center
+ valign = center
+}
+
+# Date Label
+label {
+ monitor =
+ text = cmd[update:1000] echo "$(date +'%A, %B %d')"
+ color = rgba(192, 202, 245, 1.0)
+ font_size = 24
+ font_family = JetBrains Mono
+
+ position = 0, 50
+ halign = center
+ valign = center
+}
+
+# User Label
+label {
+ monitor =
+ text = $USER
+ color = rgba(192, 202, 245, 1.0)
+ font_size = 18
+ font_family = JetBrains Mono
+
+ position = 0, -180
+ halign = center
+ valign = center
+}
diff --git a/dot_files/hypr/hyprpaper.conf b/dot_files/hypr/hyprpaper.conf
new file mode 100644
index 0000000..129940d
--- /dev/null
+++ b/dot_files/hypr/hyprpaper.conf
@@ -0,0 +1,19 @@
+# Hyprpaper Configuration - Tokyo Night Theme
+
+# Preload wallpapers (load into memory)
+# Replace with your actual wallpaper path
+preload = /user/share/binaryos/hypr/background.webp
+
+# Set wallpaper for all monitors
+# Use empty monitor name to apply to all monitors
+wallpaper = ,/user/share/binaryos/hypr/background.webp
+
+# You can also set per-monitor wallpapers:
+# wallpaper = DP-1,~/Pictures/wallpaper1.png
+# wallpaper = HDMI-A-1,~/Pictures/wallpaper2.png
+
+# Enable IPC for dynamic wallpaper changes
+ipc = true
+
+# Disable splash (optional)
+splash = false
diff --git a/dot_files/nvim/.gitignore b/dot_files/nvim/.gitignore
new file mode 100644
index 0000000..cc5457a
--- /dev/null
+++ b/dot_files/nvim/.gitignore
@@ -0,0 +1,8 @@
+tt.*
+.tests
+doc/tags
+debug
+.repro
+foo.*
+*.log
+data
diff --git a/dot_files/nvim/.neoconf.json b/dot_files/nvim/.neoconf.json
new file mode 100644
index 0000000..7c48087
--- /dev/null
+++ b/dot_files/nvim/.neoconf.json
@@ -0,0 +1,15 @@
+{
+ "neodev": {
+ "library": {
+ "enabled": true,
+ "plugins": true
+ }
+ },
+ "neoconf": {
+ "plugins": {
+ "lua_ls": {
+ "enabled": true
+ }
+ }
+ }
+}
diff --git a/dot_files/nvim/LICENSE.md b/dot_files/nvim/LICENSE.md
new file mode 100644
index 0000000..9f98dd6
--- /dev/null
+++ b/dot_files/nvim/LICENSE.md
@@ -0,0 +1,10 @@
+ The MIT License (MIT)
+
+Copyright © 2025
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/dot_files/nvim/README.md b/dot_files/nvim/README.md
new file mode 100644
index 0000000..c4d6f1c
--- /dev/null
+++ b/dot_files/nvim/README.md
@@ -0,0 +1,76 @@
+# My Neovim Configuration
+
+This is my personal Neovim configuration, based on [LazyVim](https://github.com/LazyVim/LazyVim).
+
+## Overview
+
+This configuration is built upon the LazyVim distribution and customized with a set of plugins and settings to enhance the development workflow.
+
+## Plugins
+
+This configuration uses [lazy.nvim](https://github.com/folke/lazy.nvim) to manage plugins. Here is a list of the plugins included in this configuration:
+
+### Core Plugins (from LazyVim)
+
+* LazyVim
+* blink.cmp
+* bufferline.nvim
+* catppuccin
+* conform.nvim
+* crates.nvim
+* dial.nvim
+* flash.nvim
+* friendly-snippets
+* gitsigns.nvim
+* grug-far.nvim
+* inc-rename.nvim
+* lazy.nvim
+* lazydev.nvim
+* lualine.nvim
+* mason-lspconfig.nvim
+* mason.nvim
+* mini.ai
+* mini.hipatterns
+* mini.icons
+* mini.pairs
+* noice.nvim
+* nui.nvim
+* nvim-lint
+* nvim-lspconfig
+* nvim-treesitter
+* nvim-treesitter-textobjects
+* nvim-ts-autotag
+* persistence.nvim
+* plenary.nvim
+* rustaceanvim
+* snacks.nvim
+* todo-comments.nvim
+* tokyonight.nvim
+* trouble.nvim
+* ts-comments.nvim
+* vim-dadbod
+* vim-dadbod-completion
+* vim-dadbod-ui
+* vim-helm
+* which-key.nvim
+* yanky.nvim
+
+ ### Custom Plugins and Configuration
+
+The following customizations have been applied.
+
+* Augment Code
+
+## How it Works
+
+This configuration is loaded from `init.lua`, which bootstraps `lazy.nvim` and the rest of the configuration. The main configuration is in `lua/config/lazy.lua`, which sets up `lazy.nvim` and loads the plugins.
+
+The plugins are defined in `lua/plugins/`. The file `lua/plugins/example.lua` contains the custom plugin configurations. Any file in this directory is automatically loaded by `lazy.nvim`.
+
+The `lazy-lock.json` file is used to lock the versions of the plugins, ensuring that the configuration is reproducible.
+
+## Installation
+
+1. Clone this repository to `~/.config/nvim`.
+2. Delete the .git folder
+3. Start Neovim. `lazy.nvim` will automatically install the plugins.
diff --git a/dot_files/nvim/init.lua b/dot_files/nvim/init.lua
new file mode 100644
index 0000000..2514f9e
--- /dev/null
+++ b/dot_files/nvim/init.lua
@@ -0,0 +1,2 @@
+-- bootstrap lazy.nvim, LazyVim and your plugins
+require("config.lazy")
diff --git a/dot_files/nvim/lazy-lock.json b/dot_files/nvim/lazy-lock.json
new file mode 100644
index 0000000..0584d59
--- /dev/null
+++ b/dot_files/nvim/lazy-lock.json
@@ -0,0 +1,46 @@
+{
+ "LazyVim": { "branch": "main", "commit": "d72127eb936f7f05d88d4fc316bc7e89080d69d8" },
+ "SchemaStore.nvim": { "branch": "main", "commit": "09bc7137bcb13b903f7337ec2a86d8a7f55002d1" },
+ "augment.vim": { "branch": "main", "commit": "97418c9dfc1918fa9bdd23863ea3d2e49130727f" },
+ "blink.cmp": { "branch": "main", "commit": "327fff91fe6af358e990be7be1ec8b78037d2138" },
+ "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
+ "catppuccin": { "branch": "main", "commit": "8c4125e3c746976ba025dc5d908fa22c6aa09486" },
+ "conform.nvim": { "branch": "master", "commit": "9fd3d5e0b689ec1bf400c53cbbec72c6fdf24081" },
+ "crates.nvim": { "branch": "main", "commit": "ac9fa498a9edb96dc3056724ff69d5f40b898453" },
+ "dial.nvim": { "branch": "master", "commit": "f0404ec1f83a03f2c3457e60087c6331d1cbb83f" },
+ "flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" },
+ "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
+ "gitsigns.nvim": { "branch": "main", "commit": "20ad4419564d6e22b189f6738116b38871082332" },
+ "grug-far.nvim": { "branch": "main", "commit": "3e72397465f774b01aa38e4fe8e6eecf23d766d9" },
+ "helm-ls.nvim": { "branch": "main", "commit": "d6f3a8d4ad59b4f54cd734267dfb5411679ea608" },
+ "inc-rename.nvim": { "branch": "main", "commit": "7c79416330364976955ec8059fe3832b72ee1271" },
+ "lazy.nvim": { "branch": "main", "commit": "db067881fff0fd4be8c00e5bde7492e0e1c77a2f" },
+ "lazydev.nvim": { "branch": "main", "commit": "371cd7434cbf95606f1969c2c744da31b77fcfa6" },
+ "lualine.nvim": { "branch": "master", "commit": "3946f0122255bc377d14a59b27b609fb3ab25768" },
+ "mason-lspconfig.nvim": { "branch": "main", "commit": "d7b5feb6e769e995f7fcf44d92f49f811c51d10c" },
+ "mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" },
+ "mini.ai": { "branch": "main", "commit": "11c57180bc9084089206e211ac7aa598bedc9673" },
+ "mini.hipatterns": { "branch": "main", "commit": "5629d5fba132b4ab0b3f0039549308421f65ff45" },
+ "mini.icons": { "branch": "main", "commit": "284798619aed9f4c1ac1b9417b9a5e3b4b85ef3a" },
+ "mini.pairs": { "branch": "main", "commit": "b9aada8c0e59f2b938e98fbf4eae0799eba96ad9" },
+ "noice.nvim": { "branch": "main", "commit": "5099348591f7d3ba9e547b1e631c694c65bbe0b9" },
+ "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
+ "nvim-lint": { "branch": "master", "commit": "9da1fb942dd0668d5182f9c8dee801b9c190e2bb" },
+ "nvim-lspconfig": { "branch": "master", "commit": "e25994a1c2373784364852cd904cb39b6d75f227" },
+ "nvim-treesitter": { "branch": "main", "commit": "64f4755b9d6ea9008265b09eb79fd91727311682" },
+ "nvim-treesitter-textobjects": { "branch": "main", "commit": "5d63945ad7002ee3702c2f2150a662d5ed20626b" },
+ "nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" },
+ "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" },
+ "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
+ "rustaceanvim": { "branch": "master", "commit": "be0d1d14b8504c1c0965b608dc7ed39f2d588c91" },
+ "snacks.nvim": { "branch": "main", "commit": "143e9b58c7b8301bdc36b1b8a03449078beb49d1" },
+ "todo-comments.nvim": { "branch": "main", "commit": "411503d3bedeff88484de572f2509c248e499b38" },
+ "tokyonight.nvim": { "branch": "main", "commit": "2642dbb83333e0575d1c3436e1d837926871c5fb" },
+ "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
+ "ts-comments.nvim": { "branch": "main", "commit": "123a9fb12e7229342f807ec9e6de478b1102b041" },
+ "vim-dadbod": { "branch": "master", "commit": "e95afed23712f969f83b4857a24cf9d59114c2e6" },
+ "vim-dadbod-completion": { "branch": "master", "commit": "a8dac0b3cf6132c80dc9b18bef36d4cf7a9e1fe6" },
+ "vim-dadbod-ui": { "branch": "master", "commit": "236179fd6bdc2aabeb1326d428e6b29d41044d8e" },
+ "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" },
+ "yanky.nvim": { "branch": "main", "commit": "04775cc6e10ef038c397c407bc17f00a2f52b378" }
+}
diff --git a/dot_files/nvim/lazyvim.json b/dot_files/nvim/lazyvim.json
new file mode 100644
index 0000000..19638f0
--- /dev/null
+++ b/dot_files/nvim/lazyvim.json
@@ -0,0 +1,23 @@
+{
+ "extras": [
+ "lazyvim.plugins.extras.coding.yanky",
+ "lazyvim.plugins.extras.editor.dial",
+ "lazyvim.plugins.extras.editor.inc-rename",
+ "lazyvim.plugins.extras.lang.docker",
+ "lazyvim.plugins.extras.lang.git",
+ "lazyvim.plugins.extras.lang.go",
+ "lazyvim.plugins.extras.lang.helm",
+ "lazyvim.plugins.extras.lang.rust",
+ "lazyvim.plugins.extras.lang.sql",
+ "lazyvim.plugins.extras.lang.typescript",
+ "lazyvim.plugins.extras.lang.yaml",
+ "lazyvim.plugins.extras.util.dot",
+ "lazyvim.plugins.extras.util.gitui",
+ "lazyvim.plugins.extras.util.mini-hipatterns"
+ ],
+ "install_version": 8,
+ "news": {
+ "NEWS.md": "11866"
+ },
+ "version": 8
+}
diff --git a/dot_files/nvim/lua/config/autocmds.lua b/dot_files/nvim/lua/config/autocmds.lua
new file mode 100644
index 0000000..4221e75
--- /dev/null
+++ b/dot_files/nvim/lua/config/autocmds.lua
@@ -0,0 +1,8 @@
+-- Autocmds are automatically loaded on the VeryLazy event
+-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua
+--
+-- Add any additional autocmds here
+-- with `vim.api.nvim_create_autocmd`
+--
+-- Or remove existing autocmds by their group name (which is prefixed with `lazyvim_` for the defaults)
+-- e.g. vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell")
diff --git a/dot_files/nvim/lua/config/keymaps.lua b/dot_files/nvim/lua/config/keymaps.lua
new file mode 100644
index 0000000..2c134f7
--- /dev/null
+++ b/dot_files/nvim/lua/config/keymaps.lua
@@ -0,0 +1,3 @@
+-- Keymaps are automatically loaded on the VeryLazy event
+-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
+-- Add any additional keymaps here
diff --git a/dot_files/nvim/lua/config/lazy.lua b/dot_files/nvim/lua/config/lazy.lua
new file mode 100644
index 0000000..d73bfa1
--- /dev/null
+++ b/dot_files/nvim/lua/config/lazy.lua
@@ -0,0 +1,53 @@
+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+if not (vim.uv or vim.loop).fs_stat(lazypath) then
+ local lazyrepo = "https://github.com/folke/lazy.nvim.git"
+ local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
+ if vim.v.shell_error ~= 0 then
+ vim.api.nvim_echo({
+ { "Failed to clone lazy.nvim:\n", "ErrorMsg" },
+ { out, "WarningMsg" },
+ { "\nPress any key to exit..." },
+ }, true, {})
+ vim.fn.getchar()
+ os.exit(1)
+ end
+end
+vim.opt.rtp:prepend(lazypath)
+
+require("lazy").setup({
+ spec = {
+ -- add LazyVim and import its plugins
+ { "LazyVim/LazyVim", import = "lazyvim.plugins" },
+ -- import/override with your plugins
+ { import = "plugins" },
+ },
+ defaults = {
+ -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup.
+ -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default.
+ lazy = false,
+ -- It's recommended to leave version=false for now, since a lot the plugin that support versioning,
+ -- have outdated releases, which may break your Neovim install.
+ version = false, -- always use the latest git commit
+ -- version = "*", -- try installing the latest stable version for plugins that support semver
+ },
+ install = { colorscheme = { "tokyonight", "habamax" } },
+ checker = {
+ enabled = true, -- check for plugin updates periodically
+ notify = false, -- notify on update
+ }, -- automatically check for plugin updates
+ performance = {
+ rtp = {
+ -- disable some rtp plugins
+ disabled_plugins = {
+ "gzip",
+ -- "matchit",
+ -- "matchparen",
+ -- "netrwPlugin",
+ "tarPlugin",
+ "tohtml",
+ "tutor",
+ "zipPlugin",
+ },
+ },
+ },
+})
diff --git a/dot_files/nvim/lua/config/options.lua b/dot_files/nvim/lua/config/options.lua
new file mode 100644
index 0000000..d6411dc
--- /dev/null
+++ b/dot_files/nvim/lua/config/options.lua
@@ -0,0 +1,28 @@
+-- Options are automatically loaded before lazy.nvim startup
+-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
+-- Add any additional options here
+
+vim.opt.exrc = true
+vim.opt.secure = true
+vim.o.backupcopy = "yes"
+
+local function paste()
+ return {
+ vim.split(vim.fn.getreg(""), "\n"),
+ vim.fn.getregtype(""),
+ }
+end
+
+if vim.env.SSH_TTY then
+ vim.g.clipboard = {
+ name = "OSC 52",
+ copy = {
+ ["+"] = require("vim.ui.clipboard.osc52").copy("+"),
+ ["*"] = require("vim.ui.clipboard.osc52").copy("*"),
+ },
+ paste = {
+ ["+"] = paste,
+ ["*"] = paste,
+ },
+ }
+end
diff --git a/dot_files/nvim/lua/plugins/augment.lua b/dot_files/nvim/lua/plugins/augment.lua
new file mode 100644
index 0000000..580972d
--- /dev/null
+++ b/dot_files/nvim/lua/plugins/augment.lua
@@ -0,0 +1,4 @@
+return {
+ "augmentcode/augment.vim",
+ cmd = "Augment",
+}
diff --git a/dot_files/nvim/lua/plugins/snacks.lua b/dot_files/nvim/lua/plugins/snacks.lua
new file mode 100644
index 0000000..cf43ad1
--- /dev/null
+++ b/dot_files/nvim/lua/plugins/snacks.lua
@@ -0,0 +1,38 @@
+return {
+ "snacks.nvim",
+ opts = {
+ picker = {
+ files = {
+ sources = {
+ exclude = { "build/**", "target/**", ".git", ".dart_tool" },
+ hidden = true,
+ ignored = true,
+ },
+ grep = {
+ exclude = { "build/**", "target/**", ".git", ".dart_tool" },
+ hidden = true,
+ ignored = true,
+ },
+ explorer = {
+ exclude = { "build/**", "target/**", ".git", ".dart_tool" },
+ hidden = true,
+ ignored = true,
+ },
+ },
+ },
+ dashboard = {
+ -- dashboard configuration
+ preset = {
+ header = [[
+
+ ██╗ ██╗ ██╗ ███╗ ███╗
+ ██║ ██║ ██║ ████╗ ████║
+ ██║ ██║ ██║ ██╔████╔██║
+ ╚██╗ ██╔╝ ██║ ██║╚██╔╝██║
+ ╚████╔╝ ██║ ██║ ╚═╝ ██║
+ ╚═══╝ ╚═╝ ╚═╝ ╚═╝
+ ]],
+ },
+ },
+ },
+}
diff --git a/dot_files/nvim/lua/plugins/tofu.lua b/dot_files/nvim/lua/plugins/tofu.lua
new file mode 100644
index 0000000..0dad946
--- /dev/null
+++ b/dot_files/nvim/lua/plugins/tofu.lua
@@ -0,0 +1,108 @@
+return {
+ -- 1. Ensure tofu-ls is installed by mason.nvim
+ {
+ "mason-org/mason.nvim",
+ opts = function(_, opts)
+ opts.ensure_installed = opts.ensure_installed or {}
+ vim.list_extend(opts.ensure_installed, { "terraform-ls" })
+ end,
+ },
+ {
+ "neovim/nvim-lspconfig",
+ opts = {
+ servers = {
+ -- Disable terraformls (set to false to properly disable)
+ terraformls = false,
+ -- Configure terraform-ls for OpenTofu
+ -- terraform-ls works with OpenTofu as they share the same protocol
+ terraform_ls = {
+ cmd = { "terraform-ls", "serve" },
+ filetypes = { "terraform", "tf", "tfvars" },
+ root_dir = require("lspconfig.util").root_pattern(".terraform", ".git"),
+ },
+ },
+ },
+ },
+ {
+ "stevearc/conform.nvim",
+ opts = {
+ formatters = {
+ tofu_fmt = {
+ command = "tofu",
+ args = { "fmt", "-" },
+ stdin = true,
+ },
+ },
+ formatters_by_ft = {
+ terraform = { "tofu_fmt" },
+ tf = { "tofu_fmt" },
+ tfvars = { "tofu_fmt" },
+ },
+ },
+ },
+ {
+ "mfussenegger/nvim-lint",
+ opts = function(_, opts)
+ -- Initialize linters table if it doesn't exist
+ opts.linters = opts.linters or {}
+ opts.linters_by_ft = opts.linters_by_ft or {}
+
+ -- Define the "tofu_validate" linter with a custom parser
+ opts.linters.tofu_validate = {
+ cmd = "tofu",
+ args = { "validate", "-json" },
+ stdin = false,
+ ignore_exitcode = true,
+ parser = function(output, bufnr)
+ local diagnostics = {}
+
+ -- Parse the JSON output
+ local ok, decoded = pcall(vim.json.decode, output)
+ if not ok or not decoded then
+ return diagnostics
+ end
+
+ -- Check if validation was successful
+ if decoded.valid == true then
+ return diagnostics
+ end
+
+ -- Process diagnostics array
+ if decoded.diagnostics then
+ for _, diag in ipairs(decoded.diagnostics) do
+ local severity = vim.diagnostic.severity.ERROR
+ if diag.severity == "warning" then
+ severity = vim.diagnostic.severity.WARN
+ elseif diag.severity == "error" then
+ severity = vim.diagnostic.severity.ERROR
+ end
+
+ -- Extract range information
+ local range = diag.range or {}
+ local start_pos = range.start or {}
+ local end_pos = range["end"] or {}
+
+ table.insert(diagnostics, {
+ lnum = (start_pos.line or 1) - 1, -- nvim-lint uses 0-based line numbers
+ end_lnum = (end_pos.line or start_pos.line or 1) - 1,
+ col = (start_pos.column or 1) - 1, -- nvim-lint uses 0-based columns
+ end_col = (end_pos.column or start_pos.column or 1) - 1,
+ severity = severity,
+ message = diag.summary or "Validation error",
+ source = "tofu",
+ })
+ end
+ end
+
+ return diagnostics
+ end,
+ }
+
+ -- Set the linter for terraform filetypes
+ opts.linters_by_ft.terraform = { "tofu_validate" }
+ opts.linters_by_ft.tf = { "tofu_validate" }
+
+ return opts
+ end,
+ },
+}
diff --git a/dot_files/nvim/stylua.toml b/dot_files/nvim/stylua.toml
new file mode 100644
index 0000000..5d6c50d
--- /dev/null
+++ b/dot_files/nvim/stylua.toml
@@ -0,0 +1,3 @@
+indent_type = "Spaces"
+indent_width = 2
+column_width = 120
\ No newline at end of file
diff --git a/dot_files/walker/config.toml b/dot_files/walker/config.toml
new file mode 100644
index 0000000..55ac280
--- /dev/null
+++ b/dot_files/walker/config.toml
@@ -0,0 +1,82 @@
+# Walker Configuration - Tokyo Night Theme with Vim Keybindings
+
+theme = "tokyonight"
+force_keyboard_focus = false
+close_when_open = true
+click_to_close = true
+selection_wrap = false
+global_argument_delimiter = "#"
+exact_search_prefix = "'"
+disable_mouse = false
+debug = false
+page_jump_items = 10
+hide_quick_activation = false
+
+[shell]
+anchor_top = true
+anchor_bottom = true
+anchor_left = true
+anchor_right = true
+
+[placeholders]
+"default" = { input = "Search", list = "No Results" }
+
+[keybinds]
+close = ["Escape"]
+# Vim-like navigation
+next = ["Down", "ctrl j"]
+previous = ["Up", "ctrl k"]
+toggle_exact = ["ctrl e"]
+resume_last_query = ["ctrl r"]
+quick_activate = ["F1", "F2", "F3", "F4"]
+page_down = ["Page_Down", "ctrl d"]
+page_up = ["Page_Up", "ctrl u"]
+
+[providers]
+default = [
+ "desktopapplications",
+ "calc",
+ "runner",
+ "websearch",
+]
+empty = ["desktopapplications"]
+ignore_preview = []
+max_results = 50
+
+[providers.argument_delimiter]
+runner = " "
+
+[[providers.prefixes]]
+prefix = ";"
+provider = "providerlist"
+
+[[providers.prefixes]]
+prefix = ">"
+provider = "runner"
+
+[[providers.prefixes]]
+prefix = "/"
+provider = "files"
+
+[[providers.prefixes]]
+prefix = "."
+provider = "symbols"
+
+[[providers.prefixes]]
+prefix = "!"
+provider = "todo"
+
+[[providers.prefixes]]
+prefix = "="
+provider = "calc"
+
+[[providers.prefixes]]
+prefix = "@"
+provider = "websearch"
+
+[[providers.prefixes]]
+prefix = ":"
+provider = "clipboard"
+
+[providers.clipboard]
+time_format = "%d.%m. - %H:%M"
diff --git a/dot_files/walker/themes/tokyonight/style.css b/dot_files/walker/themes/tokyonight/style.css
new file mode 100644
index 0000000..f587559
--- /dev/null
+++ b/dot_files/walker/themes/tokyonight/style.css
@@ -0,0 +1,208 @@
+/* Tokyo Night Theme for Walker */
+/* Based on Tokyo Night color palette */
+
+@define-color window_bg_color #1a1b26; /* Tokyo Night background */
+@define-color accent_bg_color #7aa2f7; /* Tokyo Night blue */
+@define-color theme_fg_color #c0caf5; /* Tokyo Night foreground */
+@define-color error_bg_color #f7768e; /* Tokyo Night red */
+@define-color error_fg_color #c0caf5; /* Tokyo Night foreground */
+@define-color purple_accent #bb9af7; /* Tokyo Night purple */
+@define-color cyan_accent #7dcfff; /* Tokyo Night cyan */
+@define-color green_accent #9ece6a; /* Tokyo Night green */
+@define-color border_color #414868; /* Tokyo Night border */
+
+* {
+ all: unset;
+}
+
+.normal-icons {
+ -gtk-icon-size: 16px;
+}
+
+.large-icons {
+ -gtk-icon-size: 32px;
+}
+
+scrollbar {
+ opacity: 0;
+}
+
+.box-wrapper {
+ box-shadow:
+ 0 19px 38px rgba(0, 0, 0, 0.5),
+ 0 15px 12px rgba(0, 0, 0, 0.3);
+ background: @window_bg_color;
+ padding: 20px;
+ border-radius: 12px;
+ border: 2px solid @border_color;
+}
+
+.preview-box,
+.elephant-hint,
+.placeholder {
+ color: @theme_fg_color;
+}
+
+.box {
+}
+
+.search-container {
+ border-radius: 10px;
+}
+
+.input placeholder {
+ opacity: 0.5;
+}
+
+.input {
+ caret-color: @accent_bg_color;
+ background: lighter(@window_bg_color);
+ padding: 12px;
+ color: @theme_fg_color;
+ border-radius: 8px;
+}
+
+.input:focus,
+.input:active {
+ border: 1px solid @accent_bg_color;
+}
+
+.content-container {
+}
+
+.placeholder {
+}
+
+.scroll {
+}
+
+.list {
+ color: @theme_fg_color;
+}
+
+child {
+}
+
+.item-box {
+ border-radius: 8px;
+ padding: 10px;
+ transition: all 200ms ease;
+}
+
+.item-quick-activation {
+ background: alpha(@purple_accent, 0.3);
+ border-radius: 5px;
+ padding: 8px;
+ color: @theme_fg_color;
+ font-weight: bold;
+}
+
+child:hover .item-box,
+child:selected .item-box {
+ background: alpha(@accent_bg_color, 0.2);
+ border-left: 3px solid @accent_bg_color;
+}
+
+.item-text-box {
+}
+
+.item-subtext {
+ font-size: 12px;
+ opacity: 0.6;
+ color: alpha(@theme_fg_color, 0.7);
+}
+
+.providerlist .item-subtext {
+ font-size: unset;
+ opacity: 0.8;
+}
+
+.item-image-text {
+ font-size: 28px;
+}
+
+.preview {
+ border: 2px solid @border_color;
+ padding: 12px;
+ border-radius: 10px;
+ color: @theme_fg_color;
+ background: alpha(@window_bg_color, 0.5);
+}
+
+.calc .item-text {
+ font-size: 24px;
+ color: @green_accent;
+}
+
+.calc .item-subtext {
+ color: @cyan_accent;
+}
+
+.symbols .item-image {
+ font-size: 24px;
+}
+
+.todo.done .item-text-box {
+ opacity: 0.3;
+ text-decoration: line-through;
+}
+
+.todo.urgent {
+ font-size: 24px;
+ color: @error_bg_color;
+}
+
+.todo.active {
+ font-weight: bold;
+ color: @accent_bg_color;
+}
+
+.bluetooth.disconnected {
+ opacity: 0.5;
+}
+
+.preview .large-icons {
+ -gtk-icon-size: 64px;
+}
+
+.keybinds-wrapper {
+ border-top: 2px solid @border_color;
+ font-size: 12px;
+ opacity: 0.7;
+ color: @theme_fg_color;
+ padding-top: 10px;
+ margin-top: 10px;
+}
+
+.keybinds {
+}
+
+.keybind {
+}
+
+.keybind-bind {
+ color: @accent_bg_color;
+ font-weight: bold;
+ text-transform: lowercase;
+ background: alpha(@accent_bg_color, 0.1);
+ padding: 2px 6px;
+ border-radius: 4px;
+}
+
+.keybind-label {
+ color: alpha(@theme_fg_color, 0.8);
+}
+
+.error {
+ padding: 12px;
+ background: @error_bg_color;
+ color: @error_fg_color;
+ border-radius: 8px;
+ border: 1px solid darker(@error_bg_color);
+}
+
+:not(.calc).current {
+ font-style: italic;
+ opacity: 0.7;
+}
+
diff --git a/dot_files/wezterm/wezterm.lua b/dot_files/wezterm/wezterm.lua
new file mode 100644
index 0000000..629a5ea
--- /dev/null
+++ b/dot_files/wezterm/wezterm.lua
@@ -0,0 +1,241 @@
+local wezterm = require("wezterm")
+local config = wezterm.config_builder()
+local act = wezterm.action
+
+config.color_scheme = "Tokyo Night"
+config.font = wezterm.font("JetBrains Mono")
+config.window_decorations = "NONE"
+config.font_size = 13.0
+config.pane_focus_follows_mouse = false
+config.tab_bar_at_bottom = true
+config.automatically_reload_config = true
+config.show_tab_index_in_tab_bar = false
+config.tab_max_width = 32
+
+config.use_fancy_tab_bar = false
+config.show_new_tab_button_in_tab_bar = false
+config.show_tab_index_in_tab_bar = false
+config.hide_tab_bar_if_only_one_tab = true
+config.max_fps = 120
+
+-- Pane border colors matching Tokyo Night theme
+config.inactive_pane_hsb = {
+ saturation = 0.9,
+ brightness = 0.6,
+}
+
+-- The filled in variant of the < symbol
+local SOLID_LEFT_ARROW = wezterm.nerdfonts.ple_ice_waveform_mirrored
+
+-- The filled in variant of the > symbol
+local SOLID_RIGHT_ARROW = wezterm.nerdfonts.ple_ice_waveform
+
+-- This function returns the suggested title for a tab.
+-- It prefers the title that was set via `tab:set_title()`
+-- or `wezterm cli set-tab-title`, but falls back to the
+-- title of the active pane in that tab.
+function tab_title(tab_info)
+ local title = tab_info.tab_title
+ -- if the tab title is explicitly set, take that
+ if title and #title > 0 then
+ return title
+ end
+ -- Otherwise, use the title from the active pane
+ -- in that tab
+ return tab_info.active_pane.title
+end
+
+wezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width)
+ local edge_background = "#1a1b26"
+ local background = "#1a1b26"
+ local foreground = "#565f89"
+
+ if tab.is_active then
+ background = "#24283b"
+ foreground = "#bb9af7"
+ elseif hover then
+ background = "#24283b"
+ end
+
+ local edge_foreground = background
+
+ local title = tab_title(tab)
+
+ -- ensure that the titles fit in the available space,
+ -- and that we have room for the edges.
+ title = wezterm.truncate_right(title, max_width - 4)
+
+ return {
+ { Background = { Color = edge_background } },
+ { Foreground = { Color = edge_foreground } },
+ { Text = SOLID_LEFT_ARROW },
+ { Background = { Color = background } },
+ { Foreground = { Color = foreground } },
+ { Text = " " .. title .. " " },
+ { Background = { Color = edge_background } },
+ { Foreground = { Color = edge_foreground } },
+ { Text = SOLID_RIGHT_ARROW },
+ }
+end)
+
+config.leader = {
+ key = "a",
+ mods = "CTRL",
+ timeout_milliseconds = 2000,
+}
+
+-- Custom key bindings
+config.keys = {
+ {
+ key = "Enter",
+ mods = "ALT",
+ action = act.DisableDefaultAssignment,
+ },
+
+ -- Copy mode
+ {
+ key = "[",
+ mods = "LEADER",
+ action = act.ActivateCopyMode,
+ },
+
+ -- ----------------------------------------------------------------
+ -- TABS
+ --
+ -- Where possible, I'm using the same combinations as I would in tmux
+ -- ----------------------------------------------------------------
+
+ -- Show tab navigator; similar to listing panes in tmux
+ {
+ key = "w",
+ mods = "LEADER",
+ action = act.ShowTabNavigator,
+ },
+ -- Create a tab (alternative to Ctrl-Shift-Tab)
+ {
+ key = "c",
+ mods = "LEADER",
+ action = act.SpawnTab("CurrentPaneDomain"),
+ },
+ -- Rename current tab; analagous to command in tmux
+ {
+ key = ",",
+ mods = "LEADER",
+ action = act.PromptInputLine({
+ description = "Enter new name for tab",
+ action = wezterm.action_callback(function(window, pane, line)
+ if line then
+ window:active_tab():set_title(line)
+ end
+ end),
+ }),
+ },
+ -- Move to next/previous TAB
+ {
+ key = "n",
+ mods = "LEADER",
+ action = act.ActivateTabRelative(1),
+ },
+ {
+ key = "p",
+ mods = "LEADER",
+ action = act.ActivateTabRelative(-1),
+ },
+ -- Close tab
+ {
+ key = "&",
+ mods = "LEADER|SHIFT",
+ action = act.CloseCurrentTab({ confirm = true }),
+ },
+
+ -- ----------------------------------------------------------------
+ -- PANES
+ --
+ -- These are great and get me most of the way to replacing tmux
+ -- entirely, particularly as you can use "wezterm ssh" to ssh to another
+ -- server, and still retain Wezterm as your terminal there.
+ -- ----------------------------------------------------------------
+
+ -- -- Vertical split
+ {
+ -- |
+ key = "|",
+ mods = "LEADER|SHIFT",
+ action = act.SplitPane({
+ direction = "Right",
+ size = { Percent = 50 },
+ }),
+ },
+ -- Horizontal split
+ {
+ -- -
+ key = "-",
+ mods = "LEADER",
+ action = act.SplitPane({
+ direction = "Down",
+ size = { Percent = 50 },
+ }),
+ },
+
+ -- Close/kill active pane
+ {
+ key = "x",
+ mods = "LEADER",
+ action = act.CloseCurrentPane({ confirm = true }),
+ },
+ -- Swap active pane with another one
+
+ {
+ key = "{",
+ mods = "LEADER|SHIFT",
+ action = act.PaneSelect({ mode = "SwapWithActiveKeepFocus" }),
+ },
+ -- Zoom current pane (toggle)
+ {
+ key = "z",
+ mods = "LEADER",
+ action = act.TogglePaneZoomState,
+ },
+ {
+ key = "f",
+ mods = "ALT",
+ action = act.TogglePaneZoomState,
+ },
+ -- Move to next/previous pane
+ {
+ key = ";",
+ mods = "LEADER",
+ action = act.ActivatePaneDirection("Prev"),
+ },
+ {
+ key = "o",
+ mods = "LEADER",
+ action = act.ActivatePaneDirection("Next"),
+ },
+
+ { key = "h", mods = "LEADER", action = act.ActivatePaneDirection("Left") },
+ { key = "l", mods = "LEADER", action = act.ActivatePaneDirection("Right") },
+ { key = "k", mods = "LEADER", action = act.ActivatePaneDirection("Up") },
+ { key = "j", mods = "LEADER", action = act.ActivatePaneDirection("Down") },
+
+ {
+ key = "r",
+ mods = "LEADER",
+ action = act.ActivateKeyTable({
+ name = "resize_pane",
+ one_shot = false,
+ }),
+ },
+}
+
+config.key_tables = {
+ resize_pane = {
+ { key = "h", action = act.AdjustPaneSize({ "Left", 1 }) },
+ { key = "l", action = act.AdjustPaneSize({ "Right", 1 }) },
+ { key = "k", action = act.AdjustPaneSize({ "Up", 1 }) },
+ { key = "j", action = act.AdjustPaneSize({ "Down", 1 }) },
+ { key = "Escape", action = "PopKeyTable" },
+ },
+}
+
+return config