diff --git a/.config/.DS_Store b/.config/.DS_Store
deleted file mode 100644
index 67ae685..0000000
Binary files a/.config/.DS_Store and /dev/null differ
diff --git a/.config/fish/completions/fisher.fish b/.config/fish/completions/fisher.fish
new file mode 100644
index 0000000..6d23ce4
--- /dev/null
+++ b/.config/fish/completions/fisher.fish
@@ -0,0 +1,7 @@
+complete --command fisher --exclusive --long help --description "Print help"
+complete --command fisher --exclusive --long version --description "Print version"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments install --description "Install plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments update --description "Update installed plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments remove --description "Remove installed plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments list --description "List installed plugins matching regex"
+complete --command fisher --exclusive --condition "__fish_seen_subcommand_from update remove" --arguments "(fisher list)"
diff --git a/.config/fish/completions/fzf_configure_bindings.fish b/.config/fish/completions/fzf_configure_bindings.fish
new file mode 100644
index 0000000..b38ef92
--- /dev/null
+++ b/.config/fish/completions/fzf_configure_bindings.fish
@@ -0,0 +1,8 @@
+complete fzf_configure_bindings --no-files
+complete fzf_configure_bindings --long help --short h --description "Print help" --condition "not __fish_seen_argument --help -h"
+complete fzf_configure_bindings --long directory --description "Change the key binding for Search Directory" --condition "not __fish_seen_argument --directory"
+complete fzf_configure_bindings --long git_log --description "Change the key binding for Search Git Log" --condition "not __fish_seen_argument --git_log"
+complete fzf_configure_bindings --long git_status --description "Change the key binding for Search Git Status" --condition "not __fish_seen_argument --git_status"
+complete fzf_configure_bindings --long history --description "Change the key binding for Search History" --condition "not __fish_seen_argument --history"
+complete fzf_configure_bindings --long processes --description "Change the key binding for Search Processes" --condition "not __fish_seen_argument --processes"
+complete fzf_configure_bindings --long variables --description "Change the key binding for Search Variables" --condition "not __fish_seen_argument --variables"
diff --git a/.config/fish/completions/nvm.fish b/.config/fish/completions/nvm.fish
new file mode 100644
index 0000000..14be1b7
--- /dev/null
+++ b/.config/fish/completions/nvm.fish
@@ -0,0 +1,21 @@
+complete --command nvm --exclusive
+complete --command nvm --exclusive --long version --description "Print version"
+complete --command nvm --exclusive --long help --description "Print help"
+complete --command nvm --long silent --description "Suppress standard output"
+
+complete --command nvm --exclusive --condition __fish_use_subcommand --arguments install --description "Download and activate the specified Node version"
+complete --command nvm --exclusive --condition __fish_use_subcommand --arguments use --description "Activate the specified Node version in the current shell"
+complete --command nvm --exclusive --condition __fish_use_subcommand --arguments list --description "List installed Node versions"
+complete --command nvm --exclusive --condition __fish_use_subcommand --arguments list-remote --description "List available Node versions to install"
+complete --command nvm --exclusive --condition __fish_use_subcommand --arguments current --description "Print the currently-active Node version"
+complete --command nvm --exclusive --condition "__fish_seen_subcommand_from install" --arguments "(
+ test -e $nvm_data && string split ' ' <$nvm_data/.index
+)"
+complete --command nvm --exclusive --condition "__fish_seen_subcommand_from use" --arguments "(_nvm_list | string split ' ')"
+complete --command nvm --exclusive --condition __fish_use_subcommand --arguments uninstall --description "Uninstall the specified Node version"
+complete --command nvm --exclusive --condition "__fish_seen_subcommand_from uninstall" --arguments "(
+ _nvm_list | string split ' ' | string replace system ''
+)"
+complete --command nvm --exclusive --condition "__fish_seen_subcommand_from use uninstall" --arguments "(
+ set --query nvm_default_version && echo default
+)"
diff --git a/.config/fish/conf.d/aliases.fish b/.config/fish/conf.d/aliases.fish
new file mode 100644
index 0000000..1f9a0ba
--- /dev/null
+++ b/.config/fish/conf.d/aliases.fish
@@ -0,0 +1,47 @@
+# All your aliases
+alias ld="ls -lisaGh"
+alias g="goto"
+alias vim="nvim"
+alias code="open -a 'Visual Studio Code'"
+alias kubi="open -a 'Lens'"
+alias update-system="brew update && brew upgrade && npm update -g"
+alias do-st="docker compose"
+alias do-re="docker compose down && docker compose up -d"
+alias hetzi="ssh root@128.140.71.88"
+alias qaserv="TERM=xterm-256color ssh root@195.201.17.47"
+alias kc1="set -gx KUBECONFIG ~/.kube/config"
+alias kc2="set -gx KUBECONFIG ~/.kube/mobilistics"
+alias ram="vm_stat"
+
+# DevOps Core Tools
+alias d="docker"
+alias dc="docker compose"
+alias dcu="docker compose up -d"
+alias dcd="docker compose down"
+alias dcl="docker compose logs -f"
+alias dce="docker compose exec"
+alias dps="docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'"
+
+# Kubernetes power aliases
+alias k="kubectl"
+alias kx="kubectx" # Context switching
+alias kn="kubens" # Namespace switching
+alias kgp="kubectl get pods -o wide"
+alias kgs="kubectl get svc -o wide"
+alias kgd="kubectl get deploy -o wide"
+alias kl="kubectl logs -f"
+alias ke="kubectl exec -it"
+alias kdesc="kubectl describe"
+alias kpf="kubectl port-forward"
+
+# Testing
+alias pw="npx playwright"
+alias pwt="npx playwright test"
+alias pwh="npx playwright test --headed"
+alias pwr="npx playwright show-report"
+
+# Python/Go
+alias py="python3"
+alias pip="pip3"
+alias venv="python3 -m venv"
+alias activate="source venv/bin/activate"
diff --git a/.config/fish/conf.d/dev-helpers.fish b/.config/fish/conf.d/dev-helpers.fish
new file mode 100644
index 0000000..7b6131a
--- /dev/null
+++ b/.config/fish/conf.d/dev-helpers.fish
@@ -0,0 +1,34 @@
+# Quick project setup
+function mkproj
+ mkdir -p $argv[1]
+ cd $argv[1]
+ git init
+ touch README.md .gitignore
+ echo "# $argv[1]" > README.md
+end
+
+# Docker cleanup
+function docker-cleanup
+ docker system prune -af
+ docker volume prune -f
+end
+
+# Kubernetes context info
+function kinfo
+ echo "Context: "(kubectl config current-context)
+ echo "Namespace: "(kubectl config view --minify -o jsonpath='{..namespace}')
+ kubectl get nodes --no-headers | wc -l | xargs echo "Nodes:"
+end
+
+# Quick YAML validation
+function yaml-check
+ python3 -c "import yaml; yaml.safe_load(open('$argv[1]'))"
+end
+
+# Environment file loader
+function loadenv
+ if test -f .env
+ export (cat .env | grep -v '^#' | xargs)
+ echo "Loaded .env"
+ end
+end
diff --git a/.config/fish/conf.d/done.fish b/.config/fish/conf.d/done.fish
new file mode 100644
index 0000000..ae8d242
--- /dev/null
+++ b/.config/fish/conf.d/done.fish
@@ -0,0 +1,340 @@
+# MIT License
+
+# Copyright (c) 2016 Francisco Lourenço & Daniel Wehner
+
+# 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.
+
+if not status is-interactive
+ exit
+end
+
+set -g __done_version 1.20.0
+
+function __done_run_powershell_script
+ set -l powershell_exe (command --search "powershell.exe")
+
+ if test $status -ne 0
+ and command --search wslvar
+
+ set -l powershell_exe (wslpath (wslvar windir)/System32/WindowsPowerShell/v1.0/powershell.exe)
+ end
+
+ if string length --quiet "$powershell_exe"
+ and test -x "$powershell_exe"
+
+ set cmd (string escape $argv)
+
+ eval "$powershell_exe -Command $cmd"
+ end
+end
+
+function __done_windows_notification -a title -a message
+ if test "$__done_notify_sound" -eq 1
+ set soundopt ""
+ else
+ set soundopt ""
+ end
+
+ __done_run_powershell_script "
+[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
+[Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
+
+\$toast_xml_source = @\"
+
+ $soundopt
+
+
+ $title
+ $message
+
+
+
+\"@
+
+\$toast_xml = New-Object Windows.Data.Xml.Dom.XmlDocument
+\$toast_xml.loadXml(\$toast_xml_source)
+
+\$toast = New-Object Windows.UI.Notifications.ToastNotification \$toast_xml
+
+[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier(\"fish\").Show(\$toast)
+"
+end
+
+function __done_get_focused_window_id
+ if type -q lsappinfo
+ lsappinfo info -only bundleID (lsappinfo front | string replace 'ASN:0x0-' '0x') | cut -d '"' -f4
+ else if test -n "$SWAYSOCK"
+ and type -q jq
+ swaymsg --type get_tree | jq '.. | objects | select(.focused == true) | .id'
+ else if test -n "$HYPRLAND_INSTANCE_SIGNATURE"
+ hyprctl activewindow | awk 'NR==1 {print $2}'
+ else if test -n "$NIRI_SOCKET"
+ and type -q jq
+ niri msg --json focused-window | jq ".id"
+ else if begin
+ test "$XDG_SESSION_DESKTOP" = gnome; and type -q gdbus
+ end
+ gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval 'global.display.focus_window.get_id()'
+ else if type -q xprop
+ and test -n "$DISPLAY"
+ # Test that the X server at $DISPLAY is running
+ and xprop -grammar >/dev/null 2>&1
+ xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2
+ else if uname -a | string match --quiet --ignore-case --regex microsoft
+ __done_run_powershell_script '
+Add-Type @"
+ using System;
+ using System.Runtime.InteropServices;
+ public class WindowsCompat {
+ [DllImport("user32.dll")]
+ public static extern IntPtr GetForegroundWindow();
+ }
+"@
+[WindowsCompat]::GetForegroundWindow()
+'
+ else if set -q __done_allow_nongraphical
+ echo 12345 # dummy value
+ end
+end
+
+function __done_is_tmux_window_active
+ set -q fish_pid; or set -l fish_pid %self
+
+ # find the outermost process within tmux
+ # ppid != "tmux" -> pid = ppid
+ # ppid == "tmux" -> break
+ set tmux_fish_pid $fish_pid
+ while set tmux_fish_ppid (ps -o ppid= -p $tmux_fish_pid | string trim)
+ # remove leading hyphen so that basename does not treat it as an argument (e.g. -fish), and return only
+ # the actual command and not its arguments so that basename finds the correct command name.
+ # (e.g. '/usr/bin/tmux' from command '/usr/bin/tmux new-session -c /some/start/dir')
+ and ! string match -q "tmux*" (basename (ps -o command= -p $tmux_fish_ppid | string replace -r '^-' '' | string split ' ')[1])
+ set tmux_fish_pid $tmux_fish_ppid
+ end
+
+ # tmux session attached and window is active -> no notification
+ # all other combinations -> send notification
+ tmux list-panes -a -F "#{session_attached} #{window_active} #{pane_pid}" | string match -q "1 1 $tmux_fish_pid"
+end
+
+function __done_is_screen_window_active
+ string match --quiet --regex "$STY\s+\(Attached" (screen -ls)
+end
+
+function __done_is_process_window_focused
+ # Return false if the window is not focused
+
+ if set -q __done_allow_nongraphical
+ return 1
+ end
+
+ if set -q __done_kitty_remote_control
+ kitty @ --password="$__done_kitty_remote_control_password" ls | jq -e ".[].tabs[] | select(any(.windows[]; .is_self)) | .is_focused" >/dev/null
+ return $status
+ end
+
+ set __done_focused_window_id (__done_get_focused_window_id)
+ if test "$__done_sway_ignore_visible" -eq 1
+ and test -n "$SWAYSOCK"
+ string match --quiet --regex "^true" (swaymsg -t get_tree | jq ".. | objects | select(.id == "$__done_initial_window_id") | .visible")
+ return $status
+ else if test -n "$HYPRLAND_INSTANCE_SIGNATURE"
+ and test $__done_initial_window_id = (hyprctl activewindow | awk 'NR==1 {print $2}')
+ return $status
+ else if test -n "$NIRI_SOCKET"
+ and test $__done_initial_window_id = (niri msg --json focused-window | jq ".id")
+ return $status
+ else if test "$__done_initial_window_id" != "$__done_focused_window_id"
+ return 1
+ end
+ # If inside a tmux session, check if the tmux window is focused
+ if type -q tmux
+ and test -n "$TMUX"
+ __done_is_tmux_window_active
+ return $status
+ end
+
+ # If inside a screen session, check if the screen window is focused
+ if type -q screen
+ and test -n "$STY"
+ __done_is_screen_window_active
+ return $status
+ end
+
+ return 0
+end
+
+function __done_humanize_duration -a milliseconds
+ set -l seconds (math --scale=0 "$milliseconds/1000" % 60)
+ set -l minutes (math --scale=0 "$milliseconds/60000" % 60)
+ set -l hours (math --scale=0 "$milliseconds/3600000")
+
+ if test $hours -gt 0
+ printf '%s' $hours'h '
+ end
+ if test $minutes -gt 0
+ printf '%s' $minutes'm '
+ end
+ if test $seconds -gt 0
+ printf '%s' $seconds's'
+ end
+end
+
+# verify that the system has graphical capabilities before initializing
+if test -z "$SSH_CLIENT" # not over ssh
+ and count (__done_get_focused_window_id) >/dev/null # is able to get window id
+ set __done_enabled
+end
+
+if set -q __done_allow_nongraphical
+ and set -q __done_notification_command
+ set __done_enabled
+end
+
+if set -q __done_enabled
+ set -g __done_initial_window_id ''
+ set -q __done_min_cmd_duration; or set -g __done_min_cmd_duration 5000
+ set -q __done_exclude; or set -g __done_exclude '^git (?!push|pull|fetch)'
+ set -q __done_notify_sound; or set -g __done_notify_sound 0
+ set -q __done_sway_ignore_visible; or set -g __done_sway_ignore_visible 0
+ set -q __done_tmux_pane_format; or set -g __done_tmux_pane_format '[#{window_index}]'
+ set -q __done_notification_duration; or set -g __done_notification_duration 3000
+
+ function __done_started --on-event fish_preexec
+ set __done_initial_window_id (__done_get_focused_window_id)
+ end
+
+ function __done_ended --on-event fish_postexec
+ set -l exit_status $status
+
+ # backwards compatibility for fish < v3.0
+ set -q cmd_duration; or set -l cmd_duration $CMD_DURATION
+
+ if test $cmd_duration
+ and test $cmd_duration -gt $__done_min_cmd_duration # longer than notify_duration
+ and not __done_is_process_window_focused # process pane or window not focused
+
+ # don't notify if command matches exclude list
+ for pattern in $__done_exclude
+ if string match -qr $pattern $argv[1]
+ return
+ end
+ end
+
+ # Store duration of last command
+ set -l humanized_duration (__done_humanize_duration "$cmd_duration")
+
+ set -l title "Done in $humanized_duration"
+ set -l wd (string replace --regex "^$HOME" "~" (pwd))
+ set -l message "$wd/ $argv[1]"
+ set -l sender $__done_initial_window_id
+
+ if test $exit_status -ne 0
+ set title "Failed ($exit_status) after $humanized_duration"
+ end
+
+ if test -n "$TMUX_PANE"
+ set message (tmux lsw -F"$__done_tmux_pane_format" -f '#{==:#{pane_id},'$TMUX_PANE'}')" $message"
+ end
+
+ if set -q __done_notification_command
+ eval $__done_notification_command
+ if test "$__done_notify_sound" -eq 1
+ echo -e "\a" # bell sound
+ end
+ else if set -q KITTY_WINDOW_ID
+ printf "\x1b]99;i=done:d=0;$title\x1b\\"
+ printf "\x1b]99;i=done:d=1:p=body;$message\x1b\\"
+ else if type -q terminal-notifier # https://github.com/julienXX/terminal-notifier
+ if test "$__done_notify_sound" -eq 1
+ # pipe message into terminal-notifier to avoid escaping issues (https://github.com/julienXX/terminal-notifier/issues/134). fixes #140
+ echo "$message" | terminal-notifier -title "$title" -sender "$__done_initial_window_id" -sound default
+ else
+ echo "$message" | terminal-notifier -title "$title" -sender "$__done_initial_window_id"
+ end
+
+ else if type -q osascript # AppleScript
+ # escape double quotes that might exist in the message and break osascript. fixes #133
+ set -l message (string replace --all '"' '\"' "$message")
+ set -l title (string replace --all '"' '\"' "$title")
+
+ if test "$__done_notify_sound" -eq 1
+ osascript -e "display notification \"$message\" with title \"$title\" sound name \"Glass\""
+ else
+ osascript -e "display notification \"$message\" with title \"$title\""
+ end
+
+ else if type -q notify-send # Linux notify-send
+ # set urgency to normal
+ set -l urgency normal
+
+ # use user-defined urgency if set
+ if set -q __done_notification_urgency_level
+ set urgency "$__done_notification_urgency_level"
+ end
+ # override user-defined urgency level if non-zero exitstatus
+ if test $exit_status -ne 0
+ set urgency critical
+ if set -q __done_notification_urgency_level_failure
+ set urgency "$__done_notification_urgency_level_failure"
+ end
+ end
+
+ notify-send --hint=int:transient:1 --urgency=$urgency --icon=utilities-terminal --app-name=fish --expire-time=$__done_notification_duration "$title" "$message"
+
+ if test "$__done_notify_sound" -eq 1
+ echo -e "\a" # bell sound
+ end
+
+ else if type -q notify-desktop # Linux notify-desktop
+ set -l urgency
+ if test $exit_status -ne 0
+ set urgency "--urgency=critical"
+ end
+ notify-desktop $urgency --icon=utilities-terminal --app-name=fish "$title" "$message"
+ if test "$__done_notify_sound" -eq 1
+ echo -e "\a" # bell sound
+ end
+
+ else if uname -a | string match --quiet --ignore-case --regex microsoft
+ __done_windows_notification "$title" "$message"
+
+ else # anything else
+ echo -e "\a" # bell sound
+ end
+
+ end
+ end
+end
+
+function __done_uninstall -e done_uninstall
+ # Erase all __done_* functions
+ functions -e __done_ended
+ functions -e __done_started
+ functions -e __done_get_focused_window_id
+ functions -e __done_is_tmux_window_active
+ functions -e __done_is_screen_window_active
+ functions -e __done_is_process_window_focused
+ functions -e __done_windows_notification
+ functions -e __done_run_powershell_script
+ functions -e __done_humanize_duration
+
+ # Erase __done variables
+ set -e __done_version
+end
diff --git a/.config/fish/conf.d/fzf.fish b/.config/fish/conf.d/fzf.fish
new file mode 100644
index 0000000..8156c11
--- /dev/null
+++ b/.config/fish/conf.d/fzf.fish
@@ -0,0 +1,28 @@
+# fzf.fish is only meant to be used in interactive mode. If not in interactive mode and not in CI, skip the config to speed up shell startup
+if not status is-interactive && test "$CI" != true
+ exit
+end
+
+# Because of scoping rules, to capture the shell variables exactly as they are, we must read
+# them before even executing _fzf_search_variables. We use psub to store the
+# variables' info in temporary files and pass in the filenames as arguments.
+# This variable is global so that it can be referenced by fzf_configure_bindings and in tests
+set --global _fzf_search_vars_command '_fzf_search_variables (set --show | psub) (set --names | psub)'
+
+
+# Install the default bindings, which are mnemonic and minimally conflict with fish's preset bindings
+fzf_configure_bindings
+
+# Doesn't erase autoloaded _fzf_* functions because they are not easily accessible once key bindings are erased
+function _fzf_uninstall --on-event fzf_uninstall
+ _fzf_uninstall_bindings
+
+ set --erase _fzf_search_vars_command
+ functions --erase _fzf_uninstall _fzf_migration_message _fzf_uninstall_bindings fzf_configure_bindings
+ complete --erase fzf_configure_bindings
+
+ set_color cyan
+ echo "fzf.fish uninstalled."
+ echo "You may need to manually remove fzf_configure_bindings from your config.fish if you were using custom key bindings."
+ set_color normal
+end
diff --git a/.config/fish/conf.d/kubernetes.fish b/.config/fish/conf.d/kubernetes.fish
new file mode 100644
index 0000000..3148387
--- /dev/null
+++ b/.config/fish/conf.d/kubernetes.fish
@@ -0,0 +1,42 @@
+# Kubernetes setup
+set -gx KUBECONFIG ~/.kube/config
+
+# Kubernetes aliases
+alias k="kubectl"
+alias kgp="kubectl get pods"
+alias kgn="kubectl get nodes"
+alias kgs="kubectl get services"
+alias kgc="kubectl config get-contexts"
+alias kuc="kubectl config use-context"
+alias kns="kubectl config set-context --current --namespace"
+
+# Kubernetes context function
+function update_kubernetes_context
+ if command -q kubectl
+ set -l kube_ctx (kubectl config current-context 2>/dev/null)
+ if test $status -eq 0
+ set -l kube_ns (kubectl config view --minify --output 'jsonpath={..namespace}' 2>/dev/null)
+ set -gx STARSHIP_KUBERNETES_CONTEXT $kube_ctx
+ if test -n "$kube_ns"
+ set -gx STARSHIP_KUBERNETES_NAMESPACE $kube_ns
+ end
+ else
+ set -e STARSHIP_KUBERNETES_CONTEXT
+ set -e STARSHIP_KUBERNETES_NAMESPACE
+ end
+ end
+end
+
+# Wrapper for kubectl
+function kubectl
+ command kubectl $argv
+ set -l exit_code $status
+
+ if test $exit_code -eq 0; and test "$argv[1]" = "config"; and contains "$argv[2]" "use-context" "set-context"
+ update_kubernetes_context
+ end
+ return $exit_code
+end
+
+# Update context on startup
+update_kubernetes_context
diff --git a/.config/fish/conf.d/nvim.fish b/.config/fish/conf.d/nvim.fish
new file mode 100644
index 0000000..57b689d
--- /dev/null
+++ b/.config/fish/conf.d/nvim.fish
@@ -0,0 +1,34 @@
+# Enhanced nvim with project detection
+function v
+ if test (count $argv) -eq 0
+ # Open nvim in project root or current dir
+ if test -f package.json; or test -f go.mod; or test -f requirements.txt; or test -f Dockerfile; or test -f docker-compose.yml
+ nvim .
+ else
+ nvim
+ end
+ else
+ nvim $argv
+ end
+end
+
+# Quick config edit
+function vconfig
+ nvim ~/.config/nvim/
+end
+
+# Edit dockerfile
+function vdocker
+ if test -f Dockerfile
+ nvim Dockerfile
+ else if test -f docker-compose.yml
+ nvim docker-compose.yml
+ else
+ echo "No Docker files found"
+ end
+end
+
+# Edit kubernetes manifests
+function vk8s
+ find . -name "*.yaml" -o -name "*.yml" | grep -E "(k8s|kubernetes|deploy)" | head -5 | xargs nvim
+end
diff --git a/.config/fish/conf.d/nvm.fish b/.config/fish/conf.d/nvm.fish
new file mode 100644
index 0000000..7545699
--- /dev/null
+++ b/.config/fish/conf.d/nvm.fish
@@ -0,0 +1,28 @@
+set --query XDG_DATA_HOME || set --local XDG_DATA_HOME ~/.local/share
+set --query nvm_mirror || set --global nvm_mirror https://nodejs.org/dist
+set --query nvm_data || set --global nvm_data $XDG_DATA_HOME/nvm
+
+function _nvm_install --on-event nvm_install
+ test ! -d $nvm_data && command mkdir -p $nvm_data
+ echo "Downloading the Node distribution index..." 2>/dev/null
+ _nvm_index_update
+end
+
+function _nvm_update --on-event nvm_update
+ set --query --universal nvm_data && set --erase --universal nvm_data
+ set --query --universal nvm_mirror && set --erase --universal nvm_mirror
+ set --query nvm_mirror || set --global nvm_mirror https://nodejs.org/dist
+end
+
+function _nvm_uninstall --on-event nvm_uninstall
+ command rm -rf $nvm_data
+
+ set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version
+
+ set --names | string replace --filter --regex -- "^nvm" "set --erase nvm" | source
+ functions --erase (functions --all | string match --entire --regex -- "^_nvm_")
+end
+
+if status is-interactive && set --query nvm_default_version && ! set --query nvm_current_version
+ nvm use --silent $nvm_default_version
+end
diff --git a/.config/fish/conf.d/paths.fish b/.config/fish/conf.d/paths.fish
new file mode 100644
index 0000000..5d96a3e
--- /dev/null
+++ b/.config/fish/conf.d/paths.fish
@@ -0,0 +1,10 @@
+# Development paths
+fish_add_path /opt/homebrew/bin
+fish_add_path ~/.cargo/bin
+fish_add_path ~/.local/bin
+fish_add_path /usr/local/go/bin
+fish_add_path $GOPATH/bin
+
+# Go environment
+set -gx GOPATH ~/go
+set -gx GO111MODULE on
diff --git a/.config/fish/conf.d/ssh-gpg.fish b/.config/fish/conf.d/ssh-gpg.fish
new file mode 100644
index 0000000..6d84ae1
--- /dev/null
+++ b/.config/fish/conf.d/ssh-gpg.fish
@@ -0,0 +1,10 @@
+# SSH/GPG setup
+set -gx GPG_TTY (tty)
+set -gx SSH_AUTH_SOCK ~/.gnupg/S.gpg-agent.ssh
+
+# Launch GPG agent
+gpgconf --launch gpg-agent
+
+if test "$gnupg_SSH_AUTH_SOCK_by" != "$fish_pid"
+ set -gx SSH_AUTH_SOCK (gpgconf --list-dirs agent-ssh-socket)
+end
diff --git a/.config/fish/conf.d/testing.fish b/.config/fish/conf.d/testing.fish
new file mode 100644
index 0000000..2e25c84
--- /dev/null
+++ b/.config/fish/conf.d/testing.fish
@@ -0,0 +1,7 @@
+# Testing environment variables
+set -gx PLAYWRIGHT_BROWSERS_PATH ~/.cache/ms-playwright
+set -gx PYTEST_CURRENT_TEST ""
+
+# Test result formatting
+alias pytest="python -m pytest -v --tb=short"
+alias test-docker="docker run --rm -v (pwd):/app -w /app"
diff --git a/.config/fish/conf.d/tools.fish b/.config/fish/conf.d/tools.fish
new file mode 100644
index 0000000..bd1c21d
--- /dev/null
+++ b/.config/fish/conf.d/tools.fish
@@ -0,0 +1,14 @@
+# Starship
+if command -q starship
+ starship init fish | source
+end
+
+# Zoxide
+if command -q zoxide
+ zoxide init --cmd cd fish | source
+end
+
+# GPG
+set -gx GPG_TTY (tty)
+set -gx SSH_AUTH_SOCK ~/.gnupg/S.gpg-agent.ssh
+gpgconf --launch gpg-agent
diff --git a/.config/fish/config.fish b/.config/fish/config.fish
new file mode 100644
index 0000000..0e244a1
--- /dev/null
+++ b/.config/fish/config.fish
@@ -0,0 +1,4 @@
+# ~/.config/fish/config.fish
+# Startup commands only
+neofetch
+
diff --git a/.config/fish/fish_plugins b/.config/fish/fish_plugins
new file mode 100644
index 0000000..a55e96a
--- /dev/null
+++ b/.config/fish/fish_plugins
@@ -0,0 +1,4 @@
+jorgebucaran/fisher
+jorgebucaran/nvm.fish
+patrickf1/fzf.fish
+franciscolourenco/done
diff --git a/.config/fish/functions/_fzf_configure_bindings_help.fish b/.config/fish/functions/_fzf_configure_bindings_help.fish
new file mode 100644
index 0000000..ecfe68e
--- /dev/null
+++ b/.config/fish/functions/_fzf_configure_bindings_help.fish
@@ -0,0 +1,43 @@
+function _fzf_configure_bindings_help --description "Prints the help message for fzf_configure_bindings."
+ echo "\
+USAGE:
+ fzf_configure_bindings [--COMMAND=[KEY_SEQUENCE]...]
+
+DESCRIPTION
+ fzf_configure_bindings installs key bindings for fzf.fish's commands and erases any bindings it
+ previously installed. It installs bindings for both default and insert modes. fzf.fish executes
+ it without options on fish startup to install the out-of-the-box key bindings.
+
+ By default, commands are bound to a mnemonic key sequence, shown below. Each command's binding
+ can be configured using a namesake corresponding option:
+ COMMAND | DEFAULT KEY SEQUENCE | CORRESPONDING OPTION
+ Search Directory | Ctrl+Alt+F (F for file) | --directory
+ Search Git Log | Ctrl+Alt+L (L for log) | --git_log
+ Search Git Status | Ctrl+Alt+S (S for status) | --git_status
+ Search History | Ctrl+R (R for reverse) | --history
+ Search Processes | Ctrl+Alt+P (P for process) | --processes
+ Search Variables | Ctrl+V (V for variable) | --variables
+ Override a command's binding by specifying its corresponding option with the desired key
+ sequence. Disable a command's binding by specifying its corresponding option with no value.
+
+ Because fzf_configure_bindings erases bindings it previously installed, it can be cleanly
+ executed multiple times. Once the desired fzf_configure_bindings command has been found, add it
+ to your config.fish in order to persist the customized bindings.
+
+ In terms of validation, fzf_configure_bindings fails if passed unknown options. It expects an
+ equals sign between an option's name and value. However, it does not validate key sequences.
+
+ Pass -h or --help to print this help message and exit.
+
+EXAMPLES
+ Default bindings but bind Search Directory to Ctrl+F and Search Variables to Ctrl+Alt+V
+ \$ fzf_configure_bindings --directory=\cf --variables=\e\cv
+ Default bindings but disable Search History
+ \$ fzf_configure_bindings --history=
+ An agglomeration of different options
+ \$ fzf_configure_bindings --git_status=\cg --history=\ch --variables= --processes=
+
+SEE Also
+ To learn more about fish key bindings, see bind(1) and fish_key_reader(1).
+"
+end
diff --git a/.config/fish/functions/_fzf_extract_var_info.fish b/.config/fish/functions/_fzf_extract_var_info.fish
new file mode 100644
index 0000000..dd4e952
--- /dev/null
+++ b/.config/fish/functions/_fzf_extract_var_info.fish
@@ -0,0 +1,15 @@
+# helper function for _fzf_search_variables
+function _fzf_extract_var_info --argument-names variable_name set_show_output --description "Extract and reformat lines pertaining to \$variable_name from \$set_show_output."
+ # Extract only the lines about the variable, all of which begin with either
+ # $variable_name: ...or... $variable_name[
+ string match --regex "^\\\$$variable_name(?::|\[).*" <$set_show_output |
+
+ # Strip the variable name prefix, including ": " for scope info lines
+ string replace --regex "^\\\$$variable_name(?:: )?" '' |
+
+ # Distill the lines of values, replacing...
+ # [1]: |value|
+ # ...with...
+ # [1] value
+ string replace --regex ": \|(.*)\|" ' $1'
+end
diff --git a/.config/fish/functions/_fzf_preview_changed_file.fish b/.config/fish/functions/_fzf_preview_changed_file.fish
new file mode 100644
index 0000000..78dd561
--- /dev/null
+++ b/.config/fish/functions/_fzf_preview_changed_file.fish
@@ -0,0 +1,49 @@
+# helper for _fzf_search_git_status
+# arg should be a line from git status --short, e.g.
+# MM functions/_fzf_preview_changed_file.fish
+# D README.md
+# R LICENSE -> "New License"
+function _fzf_preview_changed_file --argument-names path_status --description "Show the git diff of the given file."
+ # remove quotes because they'll be interpreted literally by git diff
+ # no need to requote when referencing $path because fish does not perform word splitting
+ # https://fishshell.com/docs/current/fish_for_bash_users.html
+ set -f path (string unescape (string sub --start 4 $path_status))
+ # first letter of short format shows index, second letter shows working tree
+ # https://git-scm.com/docs/git-status/2.35.0#_short_format
+ set -f index_status (string sub --length 1 $path_status)
+ set -f working_tree_status (string sub --start 2 --length 1 $path_status)
+
+ set -f diff_opts --color=always
+
+ if test $index_status = '?'
+ _fzf_report_diff_type Untracked
+ _fzf_preview_file $path
+ else if contains {$index_status}$working_tree_status DD AU UD UA DU AA UU
+ # Unmerged statuses taken directly from git status help's short format table
+ # Unmerged statuses are mutually exclusive with other statuses, so if we see
+ # these, then safe to assume the path is unmerged
+ _fzf_report_diff_type Unmerged
+ git diff $diff_opts -- $path
+ else
+ if test $index_status != ' '
+ _fzf_report_diff_type Staged
+
+ # renames are only detected in the index, never working tree, so only need to test for it here
+ # https://stackoverflow.com/questions/73954214
+ if test $index_status = R
+ # diff the post-rename path with the original path, otherwise the diff will show the entire file as being added
+ set -f orig_and_new_path (string split --max 1 -- ' -> ' $path)
+ git diff --staged $diff_opts -- $orig_and_new_path[1] $orig_and_new_path[2]
+ # path currently has the form of "original -> current", so we need to correct it before it's used below
+ set path $orig_and_new_path[2]
+ else
+ git diff --staged $diff_opts -- $path
+ end
+ end
+
+ if test $working_tree_status != ' '
+ _fzf_report_diff_type Unstaged
+ git diff $diff_opts -- $path
+ end
+ end
+end
diff --git a/.config/fish/functions/_fzf_preview_file.fish b/.config/fish/functions/_fzf_preview_file.fish
new file mode 100644
index 0000000..c926475
--- /dev/null
+++ b/.config/fish/functions/_fzf_preview_file.fish
@@ -0,0 +1,43 @@
+# helper function for _fzf_search_directory and _fzf_search_git_status
+function _fzf_preview_file --description "Print a preview for the given file based on its file type."
+ # because there's no way to guarantee that _fzf_search_directory passes the path to _fzf_preview_file
+ # as one argument, we collect all the arguments into one single variable and treat that as the path
+ set -f file_path $argv
+
+ if test -L "$file_path" # symlink
+ # notify user and recurse on the target of the symlink, which can be any of these file types
+ set -l target_path (realpath "$file_path")
+
+ set_color yellow
+ echo "'$file_path' is a symlink to '$target_path'."
+ set_color normal
+
+ _fzf_preview_file "$target_path"
+ else if test -f "$file_path" # regular file
+ if set --query fzf_preview_file_cmd
+ # need to escape quotes to make sure eval receives file_path as a single arg
+ eval "$fzf_preview_file_cmd '$file_path'"
+ else
+ bat --style=numbers --color=always "$file_path"
+ end
+ else if test -d "$file_path" # directory
+ if set --query fzf_preview_dir_cmd
+ # see above
+ eval "$fzf_preview_dir_cmd '$file_path'"
+ else
+ # -A list hidden files as well, except for . and ..
+ # -F helps classify files by appending symbols after the file name
+ command ls -A -F "$file_path"
+ end
+ else if test -c "$file_path"
+ _fzf_report_file_type "$file_path" "character device file"
+ else if test -b "$file_path"
+ _fzf_report_file_type "$file_path" "block device file"
+ else if test -S "$file_path"
+ _fzf_report_file_type "$file_path" socket
+ else if test -p "$file_path"
+ _fzf_report_file_type "$file_path" "named pipe"
+ else
+ echo "$file_path doesn't exist." >&2
+ end
+end
diff --git a/.config/fish/functions/_fzf_report_diff_type.fish b/.config/fish/functions/_fzf_report_diff_type.fish
new file mode 100644
index 0000000..cc26fb3
--- /dev/null
+++ b/.config/fish/functions/_fzf_report_diff_type.fish
@@ -0,0 +1,18 @@
+# helper for _fzf_preview_changed_file
+# prints out something like
+# ╭────────╮
+# │ Staged │
+# ╰────────╯
+function _fzf_report_diff_type --argument-names diff_type --description "Print a distinct colored header meant to preface a git patch."
+ # number of "-" to draw is the length of the string to box + 2 for padding
+ set -f repeat_count (math 2 + (string length $diff_type))
+ set -f line (string repeat --count $repeat_count ─)
+ set -f top_border ╭$line╮
+ set -f btm_border ╰$line╯
+
+ set_color yellow
+ echo $top_border
+ echo "│ $diff_type │"
+ echo $btm_border
+ set_color normal
+end
diff --git a/.config/fish/functions/_fzf_report_file_type.fish b/.config/fish/functions/_fzf_report_file_type.fish
new file mode 100644
index 0000000..49e02e1
--- /dev/null
+++ b/.config/fish/functions/_fzf_report_file_type.fish
@@ -0,0 +1,6 @@
+# helper function for _fzf_preview_file
+function _fzf_report_file_type --argument-names file_path file_type --description "Explain the file type for a file."
+ set_color red
+ echo "Cannot preview '$file_path': it is a $file_type."
+ set_color normal
+end
diff --git a/.config/fish/functions/_fzf_search_directory.fish b/.config/fish/functions/_fzf_search_directory.fish
new file mode 100644
index 0000000..4541eec
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_directory.fish
@@ -0,0 +1,33 @@
+function _fzf_search_directory --description "Search the current directory. Replace the current token with the selected file paths."
+ # Directly use fd binary to avoid output buffering delay caused by a fd alias, if any.
+ # Debian-based distros install fd as fdfind and the fd package is something else, so
+ # check for fdfind first. Fall back to "fd" for a clear error message.
+ set -f fd_cmd (command -v fdfind || command -v fd || echo "fd")
+ set -f --append fd_cmd --color=always $fzf_fd_opts
+
+ set -f fzf_arguments --multi --ansi $fzf_directory_opts
+ set -f token (commandline --current-token)
+ # expand any variables or leading tilde (~) in the token
+ set -f expanded_token (eval echo -- $token)
+ # unescape token because it's already quoted so backslashes will mess up the path
+ set -f unescaped_exp_token (string unescape -- $expanded_token)
+
+ # If the current token is a directory and has a trailing slash,
+ # then use it as fd's base directory.
+ if string match --quiet -- "*/" $unescaped_exp_token && test -d "$unescaped_exp_token"
+ set --append fd_cmd --base-directory=$unescaped_exp_token
+ # use the directory name as fzf's prompt to indicate the search is limited to that directory
+ set --prepend fzf_arguments --prompt="Directory $unescaped_exp_token> " --preview="_fzf_preview_file $expanded_token{}"
+ set -f file_paths_selected $unescaped_exp_token($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ else
+ set --prepend fzf_arguments --prompt="Directory> " --query="$unescaped_exp_token" --preview='_fzf_preview_file {}'
+ set -f file_paths_selected ($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ end
+
+
+ if test $status -eq 0
+ commandline --current-token --replace -- (string escape -- $file_paths_selected | string join ' ')
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_git_log.fish b/.config/fish/functions/_fzf_search_git_log.fish
new file mode 100644
index 0000000..aa54724
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_git_log.fish
@@ -0,0 +1,36 @@
+function _fzf_search_git_log --description "Search the output of git log and preview commits. Replace the current token with the selected commit hash."
+ if not git rev-parse --git-dir >/dev/null 2>&1
+ echo '_fzf_search_git_log: Not in a git repository.' >&2
+ else
+ if not set --query fzf_git_log_format
+ # %h gives you the abbreviated commit hash, which is useful for saving screen space, but we will have to expand it later below
+ set -f fzf_git_log_format '%C(bold blue)%h%C(reset) - %C(cyan)%ad%C(reset) %C(yellow)%d%C(reset) %C(normal)%s%C(reset) %C(dim normal)[%an]%C(reset)'
+ end
+
+ set -f preview_cmd 'git show --color=always --stat --patch {1}'
+ if set --query fzf_diff_highlighter
+ set preview_cmd "$preview_cmd | $fzf_diff_highlighter"
+ end
+
+ set -f selected_log_lines (
+ git log --no-show-signature --color=always --format=format:$fzf_git_log_format --date=short | \
+ _fzf_wrapper --ansi \
+ --multi \
+ --scheme=history \
+ --prompt="Git Log> " \
+ --preview=$preview_cmd \
+ --query=(commandline --current-token) \
+ $fzf_git_log_opts
+ )
+ if test $status -eq 0
+ for line in $selected_log_lines
+ set -f abbreviated_commit_hash (string split --field 1 " " $line)
+ set -f full_commit_hash (git rev-parse $abbreviated_commit_hash)
+ set -f --append commit_hashes $full_commit_hash
+ end
+ commandline --current-token --replace (string join ' ' $commit_hashes)
+ end
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_git_status.fish b/.config/fish/functions/_fzf_search_git_status.fish
new file mode 100644
index 0000000..358f88c
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_git_status.fish
@@ -0,0 +1,41 @@
+function _fzf_search_git_status --description "Search the output of git status. Replace the current token with the selected file paths."
+ if not git rev-parse --git-dir >/dev/null 2>&1
+ echo '_fzf_search_git_status: Not in a git repository.' >&2
+ else
+ set -f preview_cmd '_fzf_preview_changed_file {}'
+ if set --query fzf_diff_highlighter
+ set preview_cmd "$preview_cmd | $fzf_diff_highlighter"
+ end
+
+ set -f selected_paths (
+ # Pass configuration color.status=always to force status to use colors even though output is sent to a pipe
+ git -c color.status=always status --short |
+ _fzf_wrapper --ansi \
+ --multi \
+ --prompt="Git Status> " \
+ --query=(commandline --current-token) \
+ --preview=$preview_cmd \
+ --nth="2.." \
+ $fzf_git_status_opts
+ )
+ if test $status -eq 0
+ # git status --short automatically escapes the paths of most files for us so not going to bother trying to handle
+ # the few edges cases of weird file names that should be extremely rare (e.g. "this;needs;escaping")
+ set -f cleaned_paths
+
+ for path in $selected_paths
+ if test (string sub --length 1 $path) = R
+ # path has been renamed and looks like "R LICENSE -> LICENSE.md"
+ # extract the path to use from after the arrow
+ set --append cleaned_paths (string split -- "-> " $path)[-1]
+ else
+ set --append cleaned_paths (string sub --start=4 $path)
+ end
+ end
+
+ commandline --current-token --replace -- (string join ' ' $cleaned_paths)
+ end
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_history.fish b/.config/fish/functions/_fzf_search_history.fish
new file mode 100644
index 0000000..cafbce9
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_history.fish
@@ -0,0 +1,39 @@
+function _fzf_search_history --description "Search command history. Replace the command line with the selected command."
+ # history merge incorporates history changes from other fish sessions
+ # it errors out if called in private mode
+ if test -z "$fish_private_mode"
+ builtin history merge
+ end
+
+ if not set --query fzf_history_time_format
+ # Reference https://devhints.io/strftime to understand strftime format symbols
+ set -f fzf_history_time_format "%m-%d %H:%M:%S"
+ end
+
+ # Delinate time from command in history entries using the vertical box drawing char (U+2502).
+ # Then, to get raw command from history entries, delete everything up to it. The ? on regex is
+ # necessary to make regex non-greedy so it won't match into commands containing the char.
+ set -f time_prefix_regex '^.*? │ '
+ # Delinate commands throughout pipeline using null rather than newlines because commands can be multi-line
+ set -f commands_selected (
+ builtin history --null --show-time="$fzf_history_time_format │ " |
+ _fzf_wrapper --read0 \
+ --print0 \
+ --multi \
+ --scheme=history \
+ --prompt="History> " \
+ --query=(commandline) \
+ --preview="string replace --regex '$time_prefix_regex' '' -- {} | fish_indent --ansi" \
+ --preview-window="bottom:3:wrap" \
+ $fzf_history_opts |
+ string split0 |
+ # remove timestamps from commands selected
+ string replace --regex $time_prefix_regex ''
+ )
+
+ if test $status -eq 0
+ commandline --replace -- $commands_selected
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_processes.fish b/.config/fish/functions/_fzf_search_processes.fish
new file mode 100644
index 0000000..133a880
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_processes.fish
@@ -0,0 +1,32 @@
+function _fzf_search_processes --description "Search all running processes. Replace the current token with the pid of the selected process."
+ # Directly use ps command because it is often aliased to a different command entirely
+ # or with options that dirty the search results and preview output
+ set -f ps_cmd (command -v ps || echo "ps")
+ # use all caps to be consistent with ps default format
+ # snake_case because ps doesn't seem to allow spaces in the field names
+ set -f ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command')
+ set -f processes_selected (
+ $ps_cmd -A -opid,command | \
+ _fzf_wrapper --multi \
+ --prompt="Processes> " \
+ --query (commandline --current-token) \
+ --ansi \
+ # first line outputted by ps is a header, so we need to mark it as so
+ --header-lines=1 \
+ # ps uses exit code 1 if the process was not found, in which case show an message explaining so
+ --preview="$ps_cmd -o '$ps_preview_fmt' -p {1} || echo 'Cannot preview {1} because it exited.'" \
+ --preview-window="bottom:4:wrap" \
+ $fzf_processes_opts
+ )
+
+ if test $status -eq 0
+ for process in $processes_selected
+ set -f --append pids_selected (string split --no-empty --field=1 -- " " $process)
+ end
+
+ # string join to replace the newlines outputted by string split with spaces
+ commandline --current-token --replace -- (string join ' ' $pids_selected)
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_variables.fish b/.config/fish/functions/_fzf_search_variables.fish
new file mode 100644
index 0000000..52a7c70
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_variables.fish
@@ -0,0 +1,47 @@
+# This function expects the following two arguments:
+# argument 1 = output of (set --show | psub), i.e. a file with the scope info and values of all variables
+# argument 2 = output of (set --names | psub), i.e. a file with all variable names
+function _fzf_search_variables --argument-names set_show_output set_names_output --description "Search and preview shell variables. Replace the current token with the selected variable."
+ if test -z "$set_names_output"
+ printf '%s\n' '_fzf_search_variables requires 2 arguments.' >&2
+
+ commandline --function repaint
+ return 22 # 22 means invalid argument in POSIX
+ end
+
+ # Exclude the history variable from being piped into fzf because
+ # 1. it's not included in $set_names_output
+ # 2. it tends to be a very large value => increases computation time
+ # 3._fzf_search_history is a much better way to examine history anyway
+ set -f all_variable_names (string match --invert history <$set_names_output)
+
+ set -f current_token (commandline --current-token)
+ # Use the current token to pre-populate fzf's query. If the current token begins
+ # with a $, remove it from the query so that it will better match the variable names
+ set -f cleaned_curr_token (string replace -- '$' '' $current_token)
+
+ set -f variable_names_selected (
+ printf '%s\n' $all_variable_names |
+ _fzf_wrapper --preview "_fzf_extract_var_info {} $set_show_output" \
+ --prompt="Variables> " \
+ --preview-window="wrap" \
+ --multi \
+ --query=$cleaned_curr_token \
+ $fzf_variables_opts
+ )
+
+ if test $status -eq 0
+ # If the current token begins with a $, do not overwrite the $ when
+ # replacing the current token with the selected variable.
+ # Uses brace expansion to prepend $ to each variable name.
+ commandline --current-token --replace (
+ if string match --quiet -- '$*' $current_token
+ string join " " \${$variable_names_selected}
+ else
+ string join " " $variable_names_selected
+ end
+ )
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_wrapper.fish b/.config/fish/functions/_fzf_wrapper.fish
new file mode 100644
index 0000000..486e36c
--- /dev/null
+++ b/.config/fish/functions/_fzf_wrapper.fish
@@ -0,0 +1,21 @@
+function _fzf_wrapper --description "Prepares some environment variables before executing fzf."
+ # Make sure fzf uses fish to execute preview commands, some of which
+ # are autoloaded fish functions so don't exist in other shells.
+ # Use --function so that it doesn't clobber SHELL outside this function.
+ set -f --export SHELL (command --search fish)
+
+ # If neither FZF_DEFAULT_OPTS nor FZF_DEFAULT_OPTS_FILE are set, then set some sane defaults.
+ # See https://github.com/junegunn/fzf#environment-variables
+ set --query FZF_DEFAULT_OPTS FZF_DEFAULT_OPTS_FILE
+ if test $status -eq 2
+ # cycle allows jumping between the first and last results, making scrolling faster
+ # layout=reverse lists results top to bottom, mimicking the familiar layouts of git log, history, and env
+ # border shows where the fzf window begins and ends
+ # height=90% leaves space to see the current command and some scrollback, maintaining context of work
+ # preview-window=wrap wraps long lines in the preview window, making reading easier
+ # marker=* makes the multi-select marker more distinguishable from the pointer (since both default to >)
+ set --export FZF_DEFAULT_OPTS '--cycle --layout=reverse --border --height=90% --preview-window=wrap --marker="*"'
+ end
+
+ fzf $argv
+end
diff --git a/.config/fish/functions/_nvm_index_update.fish b/.config/fish/functions/_nvm_index_update.fish
new file mode 100644
index 0000000..c66753d
--- /dev/null
+++ b/.config/fish/functions/_nvm_index_update.fish
@@ -0,0 +1,20 @@
+function _nvm_index_update
+ test ! -d $nvm_data && command mkdir -p $nvm_data
+
+ set --local index $nvm_data/.index
+
+ if not command curl -q --location --silent $nvm_mirror/index.tab >$index.temp
+ command rm -f $index.temp
+ echo "nvm: Can't update index, host unavailable: \"$nvm_mirror\"" >&2
+ return 1
+ end
+
+ command awk -v OFS=\t '
+ /v0.9.12/ { exit } # Unsupported
+ NR > 1 {
+ print $1 (NR == 2 ? " latest" : $10 != "-" ? " lts/" tolower($10) : "")
+ }
+ ' $index.temp >$index
+
+ command rm -f $index.temp
+end
diff --git a/.config/fish/functions/_nvm_list.fish b/.config/fish/functions/_nvm_list.fish
new file mode 100644
index 0000000..1623bb8
--- /dev/null
+++ b/.config/fish/functions/_nvm_list.fish
@@ -0,0 +1,14 @@
+function _nvm_list
+ set --local versions $nvm_data/*
+
+ set --query versions[1] &&
+ string match --entire --regex -- (
+ string replace --all -- $nvm_data/ "" $versions |
+ string match --regex -- "v\d.+" |
+ string escape --style=regex |
+ string join "|"
+ ) <$nvm_data/.index
+
+ command --all node |
+ string match --quiet --invert --regex -- "^$nvm_data" && echo system
+end
diff --git a/.config/fish/functions/_nvm_version_activate.fish b/.config/fish/functions/_nvm_version_activate.fish
new file mode 100644
index 0000000..f7dfef7
--- /dev/null
+++ b/.config/fish/functions/_nvm_version_activate.fish
@@ -0,0 +1,4 @@
+function _nvm_version_activate --argument-names ver
+ set --global --export nvm_current_version $ver
+ set --prepend PATH $nvm_data/$ver/bin
+end
diff --git a/.config/fish/functions/_nvm_version_deactivate.fish b/.config/fish/functions/_nvm_version_deactivate.fish
new file mode 100644
index 0000000..24dd36e
--- /dev/null
+++ b/.config/fish/functions/_nvm_version_deactivate.fish
@@ -0,0 +1,5 @@
+function _nvm_version_deactivate --argument-names ver
+ test "$nvm_current_version" = "$ver" && set --erase nvm_current_version
+ set --local index (contains --index -- $nvm_data/$ver/bin $PATH) &&
+ set --erase PATH[$index]
+end
diff --git a/.config/fish/functions/colormap.fish b/.config/fish/functions/colormap.fish
new file mode 100644
index 0000000..7dee778
--- /dev/null
+++ b/.config/fish/functions/colormap.fish
@@ -0,0 +1,8 @@
+function colormap
+ for i in (seq 0 255)
+ printf "%b%03d%b " (set_color -b $i) $i (set_color normal)
+ if test (math $i % 6) -eq 3
+ echo
+ end
+ end
+end
diff --git a/.config/fish/functions/fisher.fish b/.config/fish/functions/fisher.fish
new file mode 100644
index 0000000..e915cb8
--- /dev/null
+++ b/.config/fish/functions/fisher.fish
@@ -0,0 +1,240 @@
+function fisher --argument-names cmd --description "A plugin manager for Fish"
+ set --query fisher_path || set --local fisher_path $__fish_config_dir
+ set --local fisher_version 4.4.5
+ set --local fish_plugins $__fish_config_dir/fish_plugins
+
+ switch "$cmd"
+ case -v --version
+ echo "fisher, version $fisher_version"
+ case "" -h --help
+ echo "Usage: fisher install Install plugins"
+ echo " fisher remove Remove installed plugins"
+ echo " fisher update Update installed plugins"
+ echo " fisher update Update all installed plugins"
+ echo " fisher list [] List installed plugins matching regex"
+ echo "Options:"
+ echo " -v, --version Print version"
+ echo " -h, --help Print this help message"
+ echo "Variables:"
+ echo " \$fisher_path Plugin installation path. Default: $__fish_config_dir" | string replace --regex -- $HOME \~
+ case ls list
+ string match --entire --regex -- "$argv[2]" $_fisher_plugins
+ case install update remove
+ isatty || read --local --null --array stdin && set --append argv $stdin
+
+ set --local install_plugins
+ set --local update_plugins
+ set --local remove_plugins
+ set --local arg_plugins $argv[2..-1]
+ set --local old_plugins $_fisher_plugins
+ set --local new_plugins
+
+ test -e $fish_plugins && set --local file_plugins (string match --regex -- '^[^\s]+$' <$fish_plugins | string replace -- \~ ~)
+
+ if ! set --query argv[2]
+ if test "$cmd" != update
+ echo "fisher: Not enough arguments for command: \"$cmd\"" >&2 && return 1
+ else if ! set --query file_plugins
+ echo "fisher: \"$fish_plugins\" file not found: \"$cmd\"" >&2 && return 1
+ end
+ set arg_plugins $file_plugins
+ end
+
+ for plugin in $arg_plugins
+ set plugin (test -e "$plugin" && realpath $plugin || string lower -- $plugin)
+ contains -- "$plugin" $new_plugins || set --append new_plugins $plugin
+ end
+
+ if set --query argv[2]
+ for plugin in $new_plugins
+ if contains -- "$plugin" $old_plugins
+ test "$cmd" = remove &&
+ set --append remove_plugins $plugin ||
+ set --append update_plugins $plugin
+ else if test "$cmd" = install
+ set --append install_plugins $plugin
+ else
+ echo "fisher: Plugin not installed: \"$plugin\"" >&2 && return 1
+ end
+ end
+ else
+ for plugin in $new_plugins
+ contains -- "$plugin" $old_plugins &&
+ set --append update_plugins $plugin ||
+ set --append install_plugins $plugin
+ end
+
+ for plugin in $old_plugins
+ contains -- "$plugin" $new_plugins || set --append remove_plugins $plugin
+ end
+ end
+
+ set --local pid_list
+ set --local source_plugins
+ set --local fetch_plugins $update_plugins $install_plugins
+ set --local fish_path (status fish-path)
+
+ echo (set_color --bold)fisher $cmd version $fisher_version(set_color normal)
+
+ for plugin in $fetch_plugins
+ set --local source (command mktemp -d)
+ set --append source_plugins $source
+
+ command mkdir -p $source/{completions,conf.d,themes,functions}
+
+ $fish_path --command "
+ if test -e $plugin
+ command cp -Rf $plugin/* $source
+ else
+ set temp (command mktemp -d)
+ set repo (string split -- \@ $plugin) || set repo[2] HEAD
+
+ if set path (string replace --regex -- '^(https://)?gitlab.com/' '' \$repo[1])
+ set name (string split -- / \$path)[-1]
+ set url https://gitlab.com/\$path/-/archive/\$repo[2]/\$name-\$repo[2].tar.gz
+ else
+ set url https://api.github.com/repos/\$repo[1]/tarball/\$repo[2]
+ end
+
+ echo Fetching (set_color --underline)\$url(set_color normal)
+
+ if command curl -q --silent -L \$url | command tar -xzC \$temp -f - 2>/dev/null
+ command cp -Rf \$temp/*/* $source
+ else
+ echo fisher: Invalid plugin name or host unavailable: \\\"$plugin\\\" >&2
+ command rm -rf $source
+ end
+
+ command rm -rf \$temp
+ end
+
+ set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files
+ " &
+
+ set --append pid_list (jobs --last --pid)
+ end
+
+ wait $pid_list 2>/dev/null
+
+ for plugin in $fetch_plugins
+ if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source
+ if set --local index (contains --index -- "$plugin" $install_plugins)
+ set --erase install_plugins[$index]
+ else
+ set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)]
+ end
+ end
+ end
+
+ for plugin in $update_plugins $remove_plugins
+ if set --local index (contains --index -- "$plugin" $_fisher_plugins)
+ set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
+
+ if contains -- "$plugin" $remove_plugins
+ for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var)
+ emit {$name}_uninstall
+ end
+ printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
+ set --erase _fisher_plugins[$index]
+ end
+
+ command rm -rf (string replace -- \~ ~ $$plugin_files_var)
+
+ functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var)
+
+ for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var)
+ complete --erase --command $name
+ end
+
+ set --erase $plugin_files_var
+ end
+ end
+
+ if set --query update_plugins[1] || set --query install_plugins[1]
+ command mkdir -p $fisher_path/{functions,themes,conf.d,completions}
+ end
+
+ for plugin in $update_plugins $install_plugins
+ set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)]
+ set --local files $source/{functions,themes,conf.d,completions}/*
+
+ if set --local index (contains --index -- $plugin $install_plugins)
+ set --local user_files $fisher_path/{functions,themes,conf.d,completions}/*
+ set --local conflict_files
+
+ for file in (string replace -- $source/ $fisher_path/ $files)
+ contains -- $file $user_files && set --append conflict_files $file
+ end
+
+ if set --query conflict_files[1] && set --erase install_plugins[$index]
+ echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2
+ continue
+ end
+ end
+
+ for file in (string replace -- $source/ "" $files)
+ command cp -RLf $source/$file $fisher_path/$file
+ end
+
+ set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
+
+ set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files | string replace -- ~ \~)
+
+ contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin
+ contains -- $plugin $install_plugins && set --local event install || set --local event update
+
+ printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
+
+ for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var | string replace -- \~ ~)
+ source $file
+ if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file)
+ emit {$name}_$event
+ end
+ end
+ end
+
+ command rm -rf $source_plugins
+
+ if set --query _fisher_plugins[1]
+ set --local commit_plugins
+
+ for plugin in $file_plugins
+ contains -- (string lower -- $plugin) (string lower -- $_fisher_plugins) && set --append commit_plugins $plugin
+ end
+
+ for plugin in $_fisher_plugins
+ contains -- (string lower -- $plugin) (string lower -- $commit_plugins) || set --append commit_plugins $plugin
+ end
+
+ string replace --regex -- $HOME \~ $commit_plugins >$fish_plugins
+ else
+ set --erase _fisher_plugins
+ command rm -f $fish_plugins
+ end
+
+ set --local total (count $install_plugins) (count $update_plugins) (count $remove_plugins)
+
+ test "$total" != "0 0 0" && echo (string join ", " (
+ test $total[1] = 0 || echo "Installed $total[1]") (
+ test $total[2] = 0 || echo "Updated $total[2]") (
+ test $total[3] = 0 || echo "Removed $total[3]")
+ ) plugin/s
+ case \*
+ echo "fisher: Unknown command: \"$cmd\"" >&2 && return 1
+ end
+end
+
+if ! set --query _fisher_upgraded_to_4_4
+ set --universal _fisher_upgraded_to_4_4
+ if functions --query _fisher_list
+ set --query XDG_DATA_HOME[1] || set --local XDG_DATA_HOME ~/.local/share
+ command rm -rf $XDG_DATA_HOME/fisher
+ functions --erase _fisher_{list,plugin_parse}
+ fisher update >/dev/null 2>/dev/null
+ else
+ for var in (set --names | string match --entire --regex '^_fisher_.+_files$')
+ set $var (string replace -- ~ \~ $$var)
+ end
+ functions --erase _fisher_fish_postexec
+ end
+end
diff --git a/.config/fish/functions/fzf_configure_bindings.fish b/.config/fish/functions/fzf_configure_bindings.fish
new file mode 100644
index 0000000..4b4e7a2
--- /dev/null
+++ b/.config/fish/functions/fzf_configure_bindings.fish
@@ -0,0 +1,46 @@
+# Always installs bindings for insert and default mode for simplicity and b/c it has almost no side-effect
+# https://gitter.im/fish-shell/fish-shell?at=60a55915ee77a74d685fa6b1
+function fzf_configure_bindings --description "Installs the default key bindings for fzf.fish with user overrides passed as options."
+ # no need to install bindings if not in interactive mode or running tests
+ status is-interactive || test "$CI" = true; or return
+
+ set -f options_spec h/help 'directory=?' 'git_log=?' 'git_status=?' 'history=?' 'processes=?' 'variables=?'
+ argparse --max-args=0 --ignore-unknown $options_spec -- $argv 2>/dev/null
+ if test $status -ne 0
+ echo "Invalid option or a positional argument was provided." >&2
+ _fzf_configure_bindings_help
+ return 22
+ else if set --query _flag_help
+ _fzf_configure_bindings_help
+ return
+ else
+ # Initialize with default key sequences and then override or disable them based on flags
+ # index 1 = directory, 2 = git_log, 3 = git_status, 4 = history, 5 = processes, 6 = variables
+ set -f key_sequences \e\cf \e\cl \e\cs \cr \e\cp \cv # \c = control, \e = escape
+ set --query _flag_directory && set key_sequences[1] "$_flag_directory"
+ set --query _flag_git_log && set key_sequences[2] "$_flag_git_log"
+ set --query _flag_git_status && set key_sequences[3] "$_flag_git_status"
+ set --query _flag_history && set key_sequences[4] "$_flag_history"
+ set --query _flag_processes && set key_sequences[5] "$_flag_processes"
+ set --query _flag_variables && set key_sequences[6] "$_flag_variables"
+
+ # If fzf bindings already exists, uninstall it first for a clean slate
+ if functions --query _fzf_uninstall_bindings
+ _fzf_uninstall_bindings
+ end
+
+ for mode in default insert
+ test -n $key_sequences[1] && bind --mode $mode $key_sequences[1] _fzf_search_directory
+ test -n $key_sequences[2] && bind --mode $mode $key_sequences[2] _fzf_search_git_log
+ test -n $key_sequences[3] && bind --mode $mode $key_sequences[3] _fzf_search_git_status
+ test -n $key_sequences[4] && bind --mode $mode $key_sequences[4] _fzf_search_history
+ test -n $key_sequences[5] && bind --mode $mode $key_sequences[5] _fzf_search_processes
+ test -n $key_sequences[6] && bind --mode $mode $key_sequences[6] "$_fzf_search_vars_command"
+ end
+
+ function _fzf_uninstall_bindings --inherit-variable key_sequences
+ bind --erase -- $key_sequences
+ bind --erase --mode insert -- $key_sequences
+ end
+ end
+end
diff --git a/.config/fish/functions/nvm.fish b/.config/fish/functions/nvm.fish
new file mode 100644
index 0000000..64d94c5
--- /dev/null
+++ b/.config/fish/functions/nvm.fish
@@ -0,0 +1,237 @@
+function nvm --description "Node version manager"
+ for silent in --silent -s
+ if set --local index (contains --index -- $silent $argv)
+ set --erase argv[$index] && break
+ end
+ set --erase silent
+ end
+
+ set --local cmd $argv[1]
+ set --local ver $argv[2]
+
+ if set --query silent && ! set --query cmd[1]
+ echo "nvm: Version number not specified (see nvm -h for usage)" >&2
+ return 1
+ end
+
+ if ! set --query ver[1] && contains -- "$cmd" install use
+ for file in .nvmrc .node-version
+ set file (_nvm_find_up $PWD $file) && read ver <$file && break
+ end
+
+ if ! set --query ver[1]
+ echo "nvm: Invalid version or missing \".nvmrc\" file" >&2
+ return 1
+ end
+ end
+
+ set --local their_version $ver
+
+ switch "$cmd"
+ case -v --version
+ echo "nvm, version 2.2.18"
+ case "" -h --help
+ echo "Usage: nvm install Download and activate the specified Node version"
+ echo " nvm install Install the version specified in the nearest .nvmrc file"
+ echo " nvm use Activate the specified Node version in the current shell"
+ echo " nvm use Activate the version specified in the nearest .nvmrc file"
+ echo " nvm list List installed Node versions"
+ echo " nvm list-remote List available Node versions to install"
+ echo " nvm list-remote List Node versions matching a given regex pattern"
+ echo " nvm current Print the currently-active Node version"
+ echo " nvm uninstall Uninstall the specified Node version"
+ echo "Options:"
+ echo " -s, --silent Suppress standard output"
+ echo " -v, --version Print the version of nvm"
+ echo " -h, --help Print this help message"
+ echo "Variables:"
+ echo " nvm_arch Override architecture, e.g. x64-musl"
+ echo " nvm_mirror Use a mirror for downloading Node binaries"
+ echo " nvm_default_version Set the default version for new shells"
+ echo " nvm_default_packages Install a list of packages every time a Node version is installed"
+ echo " nvm_data Set a custom directory for storing nvm data"
+ echo "Examples:"
+ echo " nvm install latest Install the latest version of Node"
+ echo " nvm use 14.15.1 Use Node version 14.15.1"
+ echo " nvm use system Activate the system's Node version"
+
+ case install
+ _nvm_index_update
+
+ string match --entire --regex -- (_nvm_version_match $ver) <$nvm_data/.index | read ver alias
+
+ if ! set --query ver[1]
+ echo "nvm: Invalid version number or alias: \"$their_version\"" >&2
+ return 1
+ end
+
+ if test ! -e $nvm_data/$ver
+ set --local os (command uname -s | string lower)
+ set --local ext tar.gz
+ set --local arch (command uname -m)
+ set --local tarcmd tar
+
+ switch $os
+ case aix
+ set arch ppc64
+ case sunos
+ case linux
+ case darwin
+ case {msys_nt,mingw\*_nt}\*
+ set os win
+ set ext zip
+ set tarcmd bsdtar
+ case \*
+ echo "nvm: Unsupported operating system: \"$os\"" >&2
+ return 1
+ end
+
+ switch $arch
+ case i\*86
+ set arch x86
+ case x86_64
+ set arch x64
+ case arm64
+ string match --regex --quiet "v(?\d+)" $ver
+ if test "$os" = darwin -a $major -lt 16
+ set arch x64
+ end
+ case armv6 armv6l
+ set arch armv6l
+ case armv7 armv7l
+ set arch armv7l
+ case armv8 armv8l aarch64
+ set arch arm64
+ end
+
+ set --query nvm_arch && set arch $nvm_arch
+
+ set --local dir "node-$ver-$os-$arch"
+ set --local url $nvm_mirror/$ver/$dir.$ext
+
+ command mkdir -p $nvm_data/$ver
+
+ if ! set --query silent
+ echo -e "Installing Node \x1b[1m$ver\x1b[22m $alias"
+ echo -e "Fetching \x1b[4m$url\x1b[24m\x1b[7m"
+ end
+
+ if ! command curl -q $silent --progress-bar --location $url |
+ command $tarcmd --extract --gzip --directory $nvm_data/$ver 2>/dev/null
+ command rm -rf $nvm_data/$ver
+ echo -e "\033[F\33[2K\x1b[0mnvm: Invalid mirror or host unavailable: \"$url\"" >&2
+ return 1
+ end
+
+ set --query silent || echo -en "\033[F\33[2K\x1b[0m"
+
+ if test "$os" = win
+ command mv $nvm_data/$ver/$dir $nvm_data/$ver/bin
+ else
+ command mv $nvm_data/$ver/$dir/* $nvm_data/$ver
+ command rm -rf $nvm_data/$ver/$dir
+ end
+ end
+
+ if test $ver != "$nvm_current_version"
+ set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version
+ _nvm_version_activate $ver
+
+ set --query nvm_default_packages[1] && npm install --global $silent $nvm_default_packages
+ end
+
+ set --query silent || printf "Now using Node %s (npm %s) %s\n" (_nvm_node_info)
+ case use
+ test $ver = default && set ver $nvm_default_version
+ _nvm_list | string match --entire --regex -- (_nvm_version_match $ver) | read ver __
+
+ if ! set --query ver[1]
+ echo "nvm: Can't use Node \"$their_version\", version must be installed first" >&2
+ return 1
+ end
+
+ if test $ver != "$nvm_current_version"
+ set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version
+ test $ver != system && _nvm_version_activate $ver
+ end
+
+ set --query silent || printf "Now using Node %s (npm %s) %s\n" (_nvm_node_info)
+ case uninstall
+ if test -z "$ver"
+ echo "nvm: Not enough arguments for command: \"$cmd\"" >&2
+ return 1
+ end
+
+ test $ver = default && test ! -z "$nvm_default_version" && set ver $nvm_default_version
+
+ _nvm_list | string match --entire --regex -- (_nvm_version_match $ver) | read ver __
+
+ if ! set -q ver[1]
+ echo "nvm: Node version not installed or invalid: \"$their_version\"" >&2
+ return 1
+ end
+
+ set --query silent || printf "Uninstalling Node %s %s\n" $ver (string replace ~ \~ "$nvm_data/$ver/bin/node")
+
+ _nvm_version_deactivate $ver
+
+ command rm -rf $nvm_data/$ver
+ case current
+ _nvm_current
+ case ls list
+ _nvm_list | _nvm_list_format (_nvm_current) $argv[2]
+ case lsr {ls,list}-remote
+ _nvm_index_update || return
+ _nvm_list | command awk '
+ FILENAME == "-" && (is_local[$1] = FNR == NR) { next } {
+ print $0 (is_local[$1] ? " ✓" : "")
+ }
+ ' - $nvm_data/.index | _nvm_list_format (_nvm_current) $argv[2]
+ case \*
+ echo "nvm: Unknown command or option: \"$cmd\" (see nvm -h for usage)" >&2
+ return 1
+ end
+end
+
+function _nvm_find_up --argument-names path file
+ test -e "$path/$file" && echo $path/$file || begin
+ test ! -z "$path" || return
+ _nvm_find_up (string replace --regex -- '/[^/]*$' "" $path) $file
+ end
+end
+
+function _nvm_version_match --argument-names ver
+ string replace --regex -- '^v?(\d+|\d+\.\d+)$' 'v$1.' $ver |
+ string replace --filter --regex -- '^v?(\d+)' 'v$1' |
+ string escape --style=regex || string lower '\b'$ver'(?:/\w+)?$'
+end
+
+function _nvm_list_format --argument-names current regex
+ command awk -v current="$current" -v regex="$regex" '
+ $0 ~ regex {
+ aliases[versions[i++] = $1] = $2 " " $3
+ pad = (n = length($1)) > pad ? n : pad
+ }
+ END {
+ if (!i) exit 1
+ while (i--)
+ printf((current == versions[i] ? " ▶ " : " ") "%"pad"s %s\n",
+ versions[i], aliases[versions[i]])
+ }
+ '
+end
+
+function _nvm_current
+ command --search --quiet node || return
+ set --query nvm_current_version && echo $nvm_current_version || echo system
+end
+
+function _nvm_node_info
+ set --local npm_path (string replace bin/npm-cli.js "" (realpath (command --search npm)))
+ test -f $npm_path/package.json || set --local npm_version_default (command npm --version)
+ command node --eval "
+ console.log(process.version)
+ console.log('$npm_version_default' ? '$npm_version_default': require('$npm_path/package.json').version)
+ console.log(process.execPath)
+ " | string replace -- ~ \~
+end
diff --git a/.config/ghostty/config b/.config/ghostty/config
new file mode 100644
index 0000000..cdd3053
--- /dev/null
+++ b/.config/ghostty/config
@@ -0,0 +1,5 @@
+font-family = "MesloLGS Nerd Font Mono"
+font-size = 14
+theme = "DoomOne"
+# theme = "SynthwaveAlpha"
+# theme = "SpaceGray Eighties Dull"
diff --git a/.config/ghostty/themes/DoomOne.yml b/.config/ghostty/themes/DoomOne.yml
new file mode 100644
index 0000000..1becba2
--- /dev/null
+++ b/.config/ghostty/themes/DoomOne.yml
@@ -0,0 +1 @@
+404: Not Found
\ No newline at end of file
diff --git a/.config/ghostty/themes/SpaceGray Eighties Dull.yml b/.config/ghostty/themes/SpaceGray Eighties Dull.yml
new file mode 100644
index 0000000..1becba2
--- /dev/null
+++ b/.config/ghostty/themes/SpaceGray Eighties Dull.yml
@@ -0,0 +1 @@
+404: Not Found
\ No newline at end of file
diff --git a/.config/ghostty/themes/SynthwaveAlpha.yml b/.config/ghostty/themes/SynthwaveAlpha.yml
new file mode 100644
index 0000000..1becba2
--- /dev/null
+++ b/.config/ghostty/themes/SynthwaveAlpha.yml
@@ -0,0 +1 @@
+404: Not Found
\ No newline at end of file
diff --git a/.config/git/gitk b/.config/git/gitk
deleted file mode 100644
index 1a74fda..0000000
--- a/.config/git/gitk
+++ /dev/null
@@ -1,64 +0,0 @@
-set mainfont {{Lucida Grande} 9}
-set textfont {Monaco 9}
-set uifont {{Lucida Grande} 9 bold}
-set tabstop 8
-set findmergefiles 0
-set maxgraphpct 50
-set maxwidth 16
-set cmitmode tree
-set wrapcomment none
-set autoselect 1
-set autosellen 40
-set showneartags 1
-set maxrefs 20
-set visiblerefs {"master"}
-set hideremotes 0
-set showlocalchanges 1
-set datetimeformat {%Y-%m-%d %H:%M:%S}
-set limitdiffs 1
-set uicolor grey85
-set want_ttk 1
-set bgcolor white
-set fgcolor black
-set uifgcolor black
-set uifgdisabledcolor #999
-set colors {"#00ff00" red blue magenta darkgrey brown orange}
-set diffcolors {"#c30000" "#009800" blue}
-set mergecolors {red blue "#00ff00" purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
-set markbgcolor #e0e0ff
-set diffcontext 3
-set selectbgcolor gray85
-set foundbgcolor yellow
-set currentsearchhitbgcolor orange
-set extdifftool opendiff
-set perfile_attrs 0
-set headbgcolor #00ff00
-set headfgcolor black
-set headoutlinecolor black
-set remotebgcolor #ffddaa
-set tagbgcolor yellow
-set tagfgcolor black
-set tagoutlinecolor black
-set reflinecolor black
-set filesepbgcolor #aaaaaa
-set filesepfgcolor black
-set linehoverbgcolor #ffff80
-set linehoverfgcolor black
-set linehoveroutlinecolor black
-set mainheadcirclecolor yellow
-set workingfilescirclecolor red
-set indexcirclecolor #00ff00
-set circlecolors {white blue gray blue blue}
-set linkfgcolor blue
-set circleoutlinecolor black
-set diffbgcolors {"#fff3f3" "#f0fff0"}
-set web_browser open
-set geometry(main) 1241x1367+2024+35
-set geometry(state) normal
-set geometry(topwidth) 1241
-set geometry(topheight) 165
-set geometry(pwsash0) "363 1"
-set geometry(pwsash1) "546 1"
-set geometry(botwidth) 454
-set geometry(botheight) 1197
-set permviews {}
diff --git a/.config/github-copilot/hosts.json b/.config/github-copilot/hosts.json
deleted file mode 100644
index c452994..0000000
--- a/.config/github-copilot/hosts.json
+++ /dev/null
@@ -1 +0,0 @@
-{"github.com":{"user":"Baerspektivo","oauth_token":"ghu_GHB9iVoZ3GaPOPlrcwJXm6QM12kwdC4cVWia"}}
diff --git a/.config/github-copilot/versions.json b/.config/github-copilot/versions.json
deleted file mode 100644
index eb14056..0000000
--- a/.config/github-copilot/versions.json
+++ /dev/null
@@ -1 +0,0 @@
-{"copilot.lua":"1.13.0"}
diff --git a/.config/goto b/.config/goto
deleted file mode 100644
index e69de29..0000000
diff --git a/.config/gtk-2.0/gtkfilechooser.ini b/.config/gtk-2.0/gtkfilechooser.ini
deleted file mode 100644
index ab3cf4e..0000000
--- a/.config/gtk-2.0/gtkfilechooser.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[Filechooser Settings]
-LocationMode=path-bar
-ShowHidden=false
-ShowSizeColumn=true
-GeometryX=10
-GeometryY=63
-GeometryWidth=2545
-GeometryHeight=1367
-SortColumn=name
-SortOrder=ascending
-StartupMode=recent
diff --git a/.config/htop/htoprc b/.config/htop/htoprc
deleted file mode 100644
index ed8f13f..0000000
--- a/.config/htop/htoprc
+++ /dev/null
@@ -1,53 +0,0 @@
-# Beware! This file is rewritten by htop when settings are changed in the interface.
-# The parser is also very primitive, and not human-friendly.
-htop_version=3.3.0
-config_reader_min_version=3
-fields=0 48 17 18 38 39 2 46 47 49 1
-hide_kernel_threads=1
-hide_userland_threads=0
-hide_running_in_container=0
-shadow_other_users=0
-show_thread_names=0
-show_program_path=1
-highlight_base_name=0
-highlight_deleted_exe=1
-shadow_distribution_path_prefix=0
-highlight_megabytes=1
-highlight_threads=1
-highlight_changes=0
-highlight_changes_delay_secs=5
-find_comm_in_cmdline=1
-strip_exe_from_cmdline=1
-show_merged_command=0
-header_margin=1
-screen_tabs=1
-detailed_cpu_time=0
-cpu_count_from_one=0
-show_cpu_usage=1
-show_cpu_frequency=0
-update_process_names=0
-account_guest_in_cpu_meter=0
-color_scheme=0
-enable_mouse=1
-delay=15
-hide_function_bar=0
-header_layout=two_50_50
-column_meters_0=LeftCPUs2 Memory Swap
-column_meter_modes_0=1 1 1
-column_meters_1=RightCPUs2 Tasks LoadAverage Uptime
-column_meter_modes_1=1 2 2 2
-tree_view=0
-sort_key=46
-tree_sort_key=0
-sort_direction=-1
-tree_sort_direction=1
-tree_view_always_by_pid=0
-all_branches_collapsed=0
-screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT STATE PERCENT_CPU PERCENT_MEM TIME Command
-.sort_key=PERCENT_CPU
-.tree_sort_key=PID
-.tree_view_always_by_pid=0
-.tree_view=0
-.sort_direction=-1
-.tree_sort_direction=1
-.all_branches_collapsed=0
diff --git a/.config/iterm2/AppSupport b/.config/iterm2/AppSupport
deleted file mode 120000
index fa6cdf7..0000000
--- a/.config/iterm2/AppSupport
+++ /dev/null
@@ -1 +0,0 @@
-/Users/r.kallinich/Library/Application Support/iTerm2
\ No newline at end of file
diff --git a/.config/jgit/config b/.config/jgit/config
deleted file mode 100644
index 92e8795..0000000
--- a/.config/jgit/config
+++ /dev/null
@@ -1,3 +0,0 @@
-[filesystem "Eclipse Adoptium|17.0.7|/dev/disk3s1"]
- timestampResolution = 2000 nanoseconds
- minRacyThreshold = 0 nanoseconds
diff --git a/.config/kitty/kitty.conf b/.config/kitty/kitty.conf
deleted file mode 100644
index 3f40633..0000000
--- a/.config/kitty/kitty.conf
+++ /dev/null
@@ -1,2529 +0,0 @@
-# vim:fileencoding=utf-8:foldmethod=marker
-
-#: Fonts {{{
-
-#: kitty has very powerful font management. You can configure
-#: individual font faces and even specify special fonts for particular
-#: characters.
-
-# font_family monospace
-# bold_font auto
-# italic_font auto
-# bold_italic_font auto
-
-#: You can specify different fonts for the bold/italic/bold-italic
-#: variants. To get a full list of supported fonts use the `kitty
-#: +list-fonts` command. By default they are derived automatically, by
-#: the OSes font system. When bold_font or bold_italic_font is set to
-#: auto on macOS, the priority of bold fonts is semi-bold, bold,
-#: heavy. Setting them manually is useful for font families that have
-#: many weight variants like Book, Medium, Thick, etc. For example::
-
-#: font_family Operator Mono Book
-#: bold_font Operator Mono Medium
-#: italic_font Operator Mono Book Italic
-#: bold_italic_font Operator Mono Medium Italic
-
-# font_size 14.0
-
-#: Font size (in pts).
-
-# force_ltr no
-
-#: kitty does not support BIDI (bidirectional text), however, for RTL
-#: scripts, words are automatically displayed in RTL. That is to say,
-#: in an RTL script, the words "HELLO WORLD" display in kitty as
-#: "WORLD HELLO", and if you try to select a substring of an RTL-
-#: shaped string, you will get the character that would be there had
-#: the string been LTR. For example, assuming the Hebrew word ירושלים,
-#: selecting the character that on the screen appears to be ם actually
-#: writes into the selection buffer the character י. kitty's default
-#: behavior is useful in conjunction with a filter to reverse the word
-#: order, however, if you wish to manipulate RTL glyphs, it can be
-#: very challenging to work with, so this option is provided to turn
-#: it off. Furthermore, this option can be used with the command line
-#: program GNU FriBidi
-#: to get BIDI support, because it will force kitty to always treat
-#: the text as LTR, which FriBidi expects for terminals.
-
-# symbol_map
-
-#: E.g. symbol_map U+E0A0-U+E0A3,U+E0C0-U+E0C7 PowerlineSymbols
-
-#: Map the specified Unicode codepoints to a particular font. Useful
-#: if you need special rendering for some symbols, such as for
-#: Powerline. Avoids the need for patched fonts. Each Unicode code
-#: point is specified in the form `U+`. You
-#: can specify multiple code points, separated by commas and ranges
-#: separated by hyphens. This option can be specified multiple times.
-#: The syntax is::
-
-#: symbol_map codepoints Font Family Name
-
-# narrow_symbols
-
-#: E.g. narrow_symbols U+E0A0-U+E0A3,U+E0C0-U+E0C7 1
-
-#: Usually, for Private Use Unicode characters and some symbol/dingbat
-#: characters, if the character is followed by one or more spaces,
-#: kitty will use those extra cells to render the character larger, if
-#: the character in the font has a wide aspect ratio. Using this
-#: option you can force kitty to restrict the specified code points to
-#: render in the specified number of cells (defaulting to one cell).
-#: This option can be specified multiple times. The syntax is::
-
-#: narrow_symbols codepoints [optionally the number of cells]
-
-# disable_ligatures never
-
-#: Choose how you want to handle multi-character ligatures. The
-#: default is to always render them. You can tell kitty to not render
-#: them when the cursor is over them by using cursor to make editing
-#: easier, or have kitty never render them at all by using always, if
-#: you don't like them. The ligature strategy can be set per-window
-#: either using the kitty remote control facility or by defining
-#: shortcuts for it in kitty.conf, for example::
-
-#: map alt+1 disable_ligatures_in active always
-#: map alt+2 disable_ligatures_in all never
-#: map alt+3 disable_ligatures_in tab cursor
-
-#: Note that this refers to programming ligatures, typically
-#: implemented using the calt OpenType feature. For disabling general
-#: ligatures, use the font_features option.
-
-# font_features
-
-#: E.g. font_features none
-
-#: Choose exactly which OpenType features to enable or disable. This
-#: is useful as some fonts might have features worthwhile in a
-#: terminal. For example, Fira Code includes a discretionary feature,
-#: zero, which in that font changes the appearance of the zero (0), to
-#: make it more easily distinguishable from Ø. Fira Code also includes
-#: other discretionary features known as Stylistic Sets which have the
-#: tags ss01 through ss20.
-
-#: For the exact syntax to use for individual features, see the
-#: HarfBuzz documentation .
-
-#: Note that this code is indexed by PostScript name, and not the font
-#: family. This allows you to define very precise feature settings;
-#: e.g. you can disable a feature in the italic font but not in the
-#: regular font.
-
-#: On Linux, font features are first read from the FontConfig database
-#: and then this option is applied, so they can be configured in a
-#: single, central place.
-
-#: To get the PostScript name for a font, use `kitty +list-fonts
-#: --psnames`:
-
-#: .. code-block:: sh
-
-#: $ kitty +list-fonts --psnames | grep Fira
-#: Fira Code
-#: Fira Code Bold (FiraCode-Bold)
-#: Fira Code Light (FiraCode-Light)
-#: Fira Code Medium (FiraCode-Medium)
-#: Fira Code Regular (FiraCode-Regular)
-#: Fira Code Retina (FiraCode-Retina)
-
-#: The part in brackets is the PostScript name.
-
-#: Enable alternate zero and oldstyle numerals::
-
-#: font_features FiraCode-Retina +zero +onum
-
-#: Enable only alternate zero in the bold font::
-
-#: font_features FiraCode-Bold +zero
-
-#: Disable the normal ligatures, but keep the calt feature which (in
-#: this font) breaks up monotony::
-
-#: font_features TT2020StyleB-Regular -liga +calt
-
-#: In conjunction with force_ltr, you may want to disable Arabic
-#: shaping entirely, and only look at their isolated forms if they
-#: show up in a document. You can do this with e.g.::
-
-#: font_features UnifontMedium +isol -medi -fina -init
-
-# modify_font
-
-#: Modify font characteristics such as the position or thickness of
-#: the underline and strikethrough. The modifications can have the
-#: suffix px for pixels or % for percentage of original value. No
-#: suffix means use pts. For example::
-
-#: modify_font underline_position -2
-#: modify_font underline_thickness 150%
-#: modify_font strikethrough_position 2px
-
-#: Additionally, you can modify the size of the cell in which each
-#: font glyph is rendered and the baseline at which the glyph is
-#: placed in the cell. For example::
-
-#: modify_font cell_width 80%
-#: modify_font cell_height -2px
-#: modify_font baseline 3
-
-#: Note that modifying the baseline will automatically adjust the
-#: underline and strikethrough positions by the same amount.
-#: Increasing the baseline raises glyphs inside the cell and
-#: decreasing it lowers them. Decreasing the cell size might cause
-#: rendering artifacts, so use with care.
-
-# box_drawing_scale 0.001, 1, 1.5, 2
-
-#: The sizes of the lines used for the box drawing Unicode characters.
-#: These values are in pts. They will be scaled by the monitor DPI to
-#: arrive at a pixel value. There must be four values corresponding to
-#: thin, normal, thick, and very thick lines.
-
-# undercurl_style thin-sparse
-
-#: The style with which undercurls are rendered. This option takes the
-#: form (thin|thick)-(sparse|dense). Thin and thick control the
-#: thickness of the undercurl. Sparse and dense control how often the
-#: curl oscillates. With sparse the curl will peak once per character,
-#: with dense twice.
-
-# text_composition_strategy platform
-
-#: Control how kitty composites text glyphs onto the background color.
-#: The default value of platform tries for text rendering as close to
-#: "native" for the platform kitty is running on as possible.
-
-#: A value of legacy uses the old (pre kitty 0.28) strategy for how
-#: glyphs are composited. This will make dark text on light
-#: backgrounds look thicker and light text on dark backgrounds
-#: thinner. It might also make some text appear like the strokes are
-#: uneven.
-
-#: You can fine tune the actual contrast curve used for glyph
-#: composition by specifying up to two space-separated numbers for
-#: this setting.
-
-#: The first number is the gamma adjustment, which controls the
-#: thickness of dark text on light backgrounds. Increasing the value
-#: will make text appear thicker. The default value for this is 1.0 on
-#: Linux and 1.7 on macOS. Valid values are 0.01 and above. The result
-#: is scaled based on the luminance difference between the background
-#: and the foreground. Dark text on light backgrounds receives the
-#: full impact of the curve while light text on dark backgrounds is
-#: affected very little.
-
-#: The second number is an additional multiplicative contrast. It is
-#: percentage ranging from 0 to 100. The default value is 0 on Linux
-#: and 30 on macOS.
-
-#: If you wish to achieve similar looking thickness in light and dark
-#: themes, a good way to experiment is start by setting the value to
-#: 1.0 0 and use a dark theme. Then adjust the second parameter until
-#: it looks good. Then switch to a light theme and adjust the first
-#: parameter until the perceived thickness matches the dark theme.
-
-# text_fg_override_threshold 0
-
-#: The minimum accepted difference in luminance between the foreground
-#: and background color, below which kitty will override the
-#: foreground color. It is percentage ranging from 0 to 100. If the
-#: difference in luminance of the foreground and background is below
-#: this threshold, the foreground color will be set to white if the
-#: background is dark or black if the background is light. The default
-#: value is 0, which means no overriding is performed. Useful when
-#: working with applications that use colors that do not contrast well
-#: with your preferred color scheme.
-
-#: WARNING: Some programs use characters (such as block characters)
-#: for graphics display and may expect to be able to set the
-#: foreground and background to the same color (or similar colors).
-#: If you see unexpected stripes, dots, lines, incorrect color, no
-#: color where you expect color, or any kind of graphic display
-#: problem try setting text_fg_override_threshold to 0 to see if this
-#: is the cause of the problem.
-
-#: }}}
-
-#: Cursor customization {{{
-
-# cursor #cccccc
-
-#: Default cursor color. If set to the special value none the cursor
-#: will be rendered with a "reverse video" effect. Its color will be
-#: the color of the text in the cell it is over and the text will be
-#: rendered with the background color of the cell. Note that if the
-#: program running in the terminal sets a cursor color, this takes
-#: precedence. Also, the cursor colors are modified if the cell
-#: background and foreground colors have very low contrast. Note that
-#: some themes set this value, so if you want to override it, place
-#: your value after the lines where the theme file is included.
-
-# cursor_text_color #111111
-
-#: The color of text under the cursor. If you want it rendered with
-#: the background color of the cell underneath instead, use the
-#: special keyword: `background`. Note that if cursor is set to none
-#: then this option is ignored. Note that some themes set this value,
-#: so if you want to override it, place your value after the lines
-#: where the theme file is included.
-
-# cursor_shape block
-
-#: The cursor shape can be one of block, beam, underline. Note that
-#: when reloading the config this will be changed only if the cursor
-#: shape has not been set by the program running in the terminal. This
-#: sets the default cursor shape, applications running in the terminal
-#: can override it. In particular, shell integration
-#: in kitty sets
-#: the cursor shape to beam at shell prompts. You can avoid this by
-#: setting shell_integration to no-cursor.
-
-# cursor_shape_unfocused hollow
-
-#: Defines the text cursor shape when the OS window is not focused.
-#: The unfocused cursor shape can be one of block, beam, underline,
-#: hollow.
-
-# cursor_beam_thickness 1.5
-
-#: The thickness of the beam cursor (in pts).
-
-# cursor_underline_thickness 2.0
-
-#: The thickness of the underline cursor (in pts).
-
-# cursor_blink_interval -1
-
-#: The interval to blink the cursor (in seconds). Set to zero to
-#: disable blinking. Negative values mean use system default. Note
-#: that the minimum interval will be limited to repaint_delay.
-
-# cursor_stop_blinking_after 15.0
-
-#: Stop blinking cursor after the specified number of seconds of
-#: keyboard inactivity. Set to zero to never stop blinking.
-
-#: }}}
-
-#: Scrollback {{{
-
-# scrollback_lines 2000
-
-#: Number of lines of history to keep in memory for scrolling back.
-#: Memory is allocated on demand. Negative numbers are (effectively)
-#: infinite scrollback. Note that using very large scrollback is not
-#: recommended as it can slow down performance of the terminal and
-#: also use large amounts of RAM. Instead, consider using
-#: scrollback_pager_history_size. Note that on config reload if this
-#: is changed it will only affect newly created windows, not existing
-#: ones.
-
-# scrollback_indicator_opacity 1.0
-
-#: The opacity of the scrollback indicator which is a small colored
-#: rectangle that moves along the right hand side of the window as you
-#: scroll, indicating what fraction you have scrolled. The default is
-#: one which means fully opaque, aka visible. Set to a value between
-#: zero and one to make the indicator less visible.
-
-# scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER
-
-#: Program with which to view scrollback in a new window. The
-#: scrollback buffer is passed as STDIN to this program. If you change
-#: it, make sure the program you use can handle ANSI escape sequences
-#: for colors and text formatting. INPUT_LINE_NUMBER in the command
-#: line above will be replaced by an integer representing which line
-#: should be at the top of the screen. Similarly CURSOR_LINE and
-#: CURSOR_COLUMN will be replaced by the current cursor position or
-#: set to 0 if there is no cursor, for example, when showing the last
-#: command output.
-
-# scrollback_pager_history_size 0
-
-#: Separate scrollback history size (in MB), used only for browsing
-#: the scrollback buffer with pager. This separate buffer is not
-#: available for interactive scrolling but will be piped to the pager
-#: program when viewing scrollback buffer in a separate window. The
-#: current implementation stores the data in UTF-8, so approximately
-#: 10000 lines per megabyte at 100 chars per line, for pure ASCII,
-#: unformatted text. A value of zero or less disables this feature.
-#: The maximum allowed size is 4GB. Note that on config reload if this
-#: is changed it will only affect newly created windows, not existing
-#: ones.
-
-# scrollback_fill_enlarged_window no
-
-#: Fill new space with lines from the scrollback buffer after
-#: enlarging a window.
-
-# wheel_scroll_multiplier 5.0
-
-#: Multiplier for the number of lines scrolled by the mouse wheel.
-#: Note that this is only used for low precision scrolling devices,
-#: not for high precision scrolling devices on platforms such as macOS
-#: and Wayland. Use negative numbers to change scroll direction. See
-#: also wheel_scroll_min_lines.
-
-# wheel_scroll_min_lines 1
-
-#: The minimum number of lines scrolled by the mouse wheel. The scroll
-#: multiplier wheel_scroll_multiplier only takes effect after it
-#: reaches this number. Note that this is only used for low precision
-#: scrolling devices like wheel mice that scroll by very small amounts
-#: when using the wheel. With a negative number, the minimum number of
-#: lines will always be added.
-
-# touch_scroll_multiplier 1.0
-
-#: Multiplier for the number of lines scrolled by a touchpad. Note
-#: that this is only used for high precision scrolling devices on
-#: platforms such as macOS and Wayland. Use negative numbers to change
-#: scroll direction.
-
-#: }}}
-
-#: Mouse {{{
-
-# mouse_hide_wait 3.0
-
-#: Hide mouse cursor after the specified number of seconds of the
-#: mouse not being used. Set to zero to disable mouse cursor hiding.
-#: Set to a negative value to hide the mouse cursor immediately when
-#: typing text. Disabled by default on macOS as getting it to work
-#: robustly with the ever-changing sea of bugs that is Cocoa is too
-#: much effort.
-
-# url_color #0087bd
-# url_style curly
-
-#: The color and style for highlighting URLs on mouse-over. url_style
-#: can be one of: none, straight, double, curly, dotted, dashed.
-
-# open_url_with default
-
-#: The program to open clicked URLs. The special value default will
-#: first look for any URL handlers defined via the open_actions
-#: facility and if non
-#: are found, it will use the Operating System's default URL handler
-#: (open on macOS and xdg-open on Linux).
-
-# url_prefixes file ftp ftps gemini git gopher http https irc ircs kitty mailto news sftp ssh
-
-#: The set of URL prefixes to look for when detecting a URL under the
-#: mouse cursor.
-
-# detect_urls yes
-
-#: Detect URLs under the mouse. Detected URLs are highlighted with an
-#: underline and the mouse cursor becomes a hand over them. Even if
-#: this option is disabled, URLs are still clickable. See also the
-#: underline_hyperlinks option to control how hyperlinks (as opposed
-#: to plain text URLs) are displayed.
-
-# url_excluded_characters
-
-#: Additional characters to be disallowed from URLs, when detecting
-#: URLs under the mouse cursor. By default, all characters that are
-#: legal in URLs are allowed. Additionally, newlines are allowed (but
-#: stripped). This is to accommodate programs such as mutt that add
-#: hard line breaks even for continued lines. \n can be added to this
-#: option to disable this behavior. Special characters can be
-#: specified using backslash escapes, to specify a backslash use a
-#: double backslash.
-
-# show_hyperlink_targets no
-
-#: When the mouse hovers over a terminal hyperlink, show the actual
-#: URL that will be activated when the hyperlink is clicked.
-
-# underline_hyperlinks hover
-
-#: Control how hyperlinks are underlined. They can either be
-#: underlined on mouse hover, always (i.e. permanently underlined) or
-#: never which means that kitty will not apply any underline styling
-#: to hyperlinks. Uses the url_style and url_color settings for the
-#: underline style. Note that reloading the config and changing this
-#: value to/from always will only affect text subsequently received by
-#: kitty.
-
-# copy_on_select no
-
-#: Copy to clipboard or a private buffer on select. With this set to
-#: clipboard, selecting text with the mouse will cause the text to be
-#: copied to clipboard. Useful on platforms such as macOS that do not
-#: have the concept of primary selection. You can instead specify a
-#: name such as a1 to copy to a private kitty buffer. Map a shortcut
-#: with the paste_from_buffer action to paste from this private
-#: buffer. For example::
-
-#: copy_on_select a1
-#: map shift+cmd+v paste_from_buffer a1
-
-#: Note that copying to the clipboard is a security risk, as all
-#: programs, including websites open in your browser can read the
-#: contents of the system clipboard.
-
-# paste_actions quote-urls-at-prompt,confirm
-
-#: A comma separated list of actions to take when pasting text into
-#: the terminal. The supported paste actions are:
-
-#: quote-urls-at-prompt:
-#: If the text being pasted is a URL and the cursor is at a shell prompt,
-#: automatically quote the URL (needs shell_integration).
-#: replace-dangerous-control-codes
-#: Replace dangerous control codes from pasted text, without confirmation.
-#: replace-newline
-#: Replace the newline character from pasted text, without confirmation.
-#: confirm:
-#: Confirm the paste if the text to be pasted contains any terminal control codes
-#: as this can be dangerous, leading to code execution if the shell/program running
-#: in the terminal does not properly handle these.
-#: confirm-if-large
-#: Confirm the paste if it is very large (larger than 16KB) as pasting
-#: large amounts of text into shells can be very slow.
-#: filter:
-#: Run the filter_paste() function from the file paste-actions.py in
-#: the kitty config directory on the pasted text. The text returned by the
-#: function will be actually pasted.
-#: no-op:
-#: Has no effect.
-
-# strip_trailing_spaces never
-
-#: Remove spaces at the end of lines when copying to clipboard. A
-#: value of smart will do it when using normal selections, but not
-#: rectangle selections. A value of always will always do it.
-
-# select_by_word_characters @-./_~?&=%+#
-
-#: Characters considered part of a word when double clicking. In
-#: addition to these characters any character that is marked as an
-#: alphanumeric character in the Unicode database will be matched.
-
-# select_by_word_characters_forward
-
-#: Characters considered part of a word when extending the selection
-#: forward on double clicking. In addition to these characters any
-#: character that is marked as an alphanumeric character in the
-#: Unicode database will be matched.
-
-#: If empty (default) select_by_word_characters will be used for both
-#: directions.
-
-# click_interval -1.0
-
-#: The interval between successive clicks to detect double/triple
-#: clicks (in seconds). Negative numbers will use the system default
-#: instead, if available, or fallback to 0.5.
-
-# focus_follows_mouse no
-
-#: Set the active window to the window under the mouse when moving the
-#: mouse around. On macOS, this will also cause the OS Window under
-#: the mouse to be focused automatically when the mouse enters it.
-
-# pointer_shape_when_grabbed arrow
-
-#: The shape of the mouse pointer when the program running in the
-#: terminal grabs the mouse.
-
-# default_pointer_shape beam
-
-#: The default shape of the mouse pointer.
-
-# pointer_shape_when_dragging beam
-
-#: The default shape of the mouse pointer when dragging across text.
-
-#: Mouse actions {{{
-
-#: Mouse buttons can be mapped to perform arbitrary actions. The
-#: syntax is:
-
-#: .. code-block:: none
-
-#: mouse_map button-name event-type modes action
-
-#: Where button-name is one of left, middle, right, b1 ... b8 with
-#: added keyboard modifiers. For example: ctrl+shift+left refers to
-#: holding the Ctrl+Shift keys while clicking with the left mouse
-#: button. The value b1 ... b8 can be used to refer to up to eight
-#: buttons on a mouse.
-
-#: event-type is one of press, release, doublepress, triplepress,
-#: click, doubleclick. modes indicates whether the action is performed
-#: when the mouse is grabbed by the program running in the terminal,
-#: or not. The values are grabbed or ungrabbed or a comma separated
-#: combination of them. grabbed refers to when the program running in
-#: the terminal has requested mouse events. Note that the click and
-#: double click events have a delay of click_interval to disambiguate
-#: from double and triple presses.
-
-#: You can run kitty with the kitty --debug-input command line option
-#: to see mouse events. See the builtin actions below to get a sense
-#: of what is possible.
-
-#: If you want to unmap a button, map it to nothing. For example, to
-#: disable opening of URLs with a plain click::
-
-#: mouse_map left click ungrabbed
-
-#: See all the mappable actions including mouse actions here
-#: .
-
-#: .. note::
-#: Once a selection is started, releasing the button that started it will
-#: automatically end it and no release event will be dispatched.
-
-# clear_all_mouse_actions no
-
-#: Remove all mouse action definitions up to this point. Useful, for
-#: instance, to remove the default mouse actions.
-
-#: Click the link under the mouse or move the cursor
-
-# mouse_map left click ungrabbed mouse_handle_click selection link prompt
-
-#:: First check for a selection and if one exists do nothing. Then
-#:: check for a link under the mouse cursor and if one exists, click
-#:: it. Finally check if the click happened at the current shell
-#:: prompt and if so, move the cursor to the click location. Note
-#:: that this requires shell integration
-#:: to work.
-
-#: Click the link under the mouse or move the cursor even when grabbed
-
-# mouse_map shift+left click grabbed,ungrabbed mouse_handle_click selection link prompt
-
-#:: Same as above, except that the action is performed even when the
-#:: mouse is grabbed by the program running in the terminal.
-
-#: Click the link under the mouse cursor
-
-# mouse_map ctrl+shift+left release grabbed,ungrabbed mouse_handle_click link
-
-#:: Variant with Ctrl+Shift is present because the simple click based
-#:: version has an unavoidable delay of click_interval, to
-#:: disambiguate clicks from double clicks.
-
-#: Discard press event for link click
-
-# mouse_map ctrl+shift+left press grabbed discard_event
-
-#:: Prevent this press event from being sent to the program that has
-#:: grabbed the mouse, as the corresponding release event is used to
-#:: open a URL.
-
-#: Paste from the primary selection
-
-# mouse_map middle release ungrabbed paste_from_selection
-
-#: Start selecting text
-
-# mouse_map left press ungrabbed mouse_selection normal
-
-#: Start selecting text in a rectangle
-
-# mouse_map ctrl+alt+left press ungrabbed mouse_selection rectangle
-
-#: Select a word
-
-# mouse_map left doublepress ungrabbed mouse_selection word
-
-#: Select a line
-
-# mouse_map left triplepress ungrabbed mouse_selection line
-
-#: Select line from point
-
-# mouse_map ctrl+alt+left triplepress ungrabbed mouse_selection line_from_point
-
-#:: Select from the clicked point to the end of the line. If you
-#:: would like to select the word at the point and then extend to the
-#:: rest of the line, change `line_from_point` to
-#:: `word_and_line_from_point`.
-
-#: Extend the current selection
-
-# mouse_map right press ungrabbed mouse_selection extend
-
-#:: If you want only the end of the selection to be moved instead of
-#:: the nearest boundary, use move-end instead of extend.
-
-#: Paste from the primary selection even when grabbed
-
-# mouse_map shift+middle release ungrabbed,grabbed paste_selection
-# mouse_map shift+middle press grabbed discard_event
-
-#: Start selecting text even when grabbed
-
-# mouse_map shift+left press ungrabbed,grabbed mouse_selection normal
-
-#: Start selecting text in a rectangle even when grabbed
-
-# mouse_map ctrl+shift+alt+left press ungrabbed,grabbed mouse_selection rectangle
-
-#: Select a word even when grabbed
-
-# mouse_map shift+left doublepress ungrabbed,grabbed mouse_selection word
-
-#: Select a line even when grabbed
-
-# mouse_map shift+left triplepress ungrabbed,grabbed mouse_selection line
-
-#: Select line from point even when grabbed
-
-# mouse_map ctrl+shift+alt+left triplepress ungrabbed,grabbed mouse_selection line_from_point
-
-#:: Select from the clicked point to the end of the line even when
-#:: grabbed. If you would like to select the word at the point and
-#:: then extend to the rest of the line, change `line_from_point` to
-#:: `word_and_line_from_point`.
-
-#: Extend the current selection even when grabbed
-
-# mouse_map shift+right press ungrabbed,grabbed mouse_selection extend
-
-#: Show clicked command output in pager
-
-# mouse_map ctrl+shift+right press ungrabbed mouse_show_command_output
-
-#:: Requires shell integration
-#:: to work.
-
-#: }}}
-
-#: }}}
-
-#: Performance tuning {{{
-
-# repaint_delay 10
-
-#: Delay between screen updates (in milliseconds). Decreasing it,
-#: increases frames-per-second (FPS) at the cost of more CPU usage.
-#: The default value yields ~100 FPS which is more than sufficient for
-#: most uses. Note that to actually achieve 100 FPS, you have to
-#: either set sync_to_monitor to no or use a monitor with a high
-#: refresh rate. Also, to minimize latency when there is pending input
-#: to be processed, this option is ignored.
-
-# input_delay 3
-
-#: Delay before input from the program running in the terminal is
-#: processed (in milliseconds). Note that decreasing it will increase
-#: responsiveness, but also increase CPU usage and might cause flicker
-#: in full screen programs that redraw the entire screen on each loop,
-#: because kitty is so fast that partial screen updates will be drawn.
-#: This setting is ignored when the input buffer is almost full.
-
-# sync_to_monitor yes
-
-#: Sync screen updates to the refresh rate of the monitor. This
-#: prevents screen tearing
-#: when scrolling.
-#: However, it limits the rendering speed to the refresh rate of your
-#: monitor. With a very high speed mouse/high keyboard repeat rate,
-#: you may notice some slight input latency. If so, set this to no.
-
-#: }}}
-
-#: Terminal bell {{{
-
-# enable_audio_bell yes
-
-#: The audio bell. Useful to disable it in environments that require
-#: silence.
-
-# visual_bell_duration 0.0
-
-#: The visual bell duration (in seconds). Flash the screen when a bell
-#: occurs for the specified number of seconds. Set to zero to disable.
-
-# visual_bell_color none
-
-#: The color used by visual bell. Set to none will fall back to
-#: selection background color. If you feel that the visual bell is too
-#: bright, you can set it to a darker color.
-
-# window_alert_on_bell yes
-
-#: Request window attention on bell. Makes the dock icon bounce on
-#: macOS or the taskbar flash on Linux.
-
-# bell_on_tab "🔔 "
-
-#: Some text or a Unicode symbol to show on the tab if a window in the
-#: tab that does not have focus has a bell. If you want to use leading
-#: or trailing spaces, surround the text with quotes. See
-#: tab_title_template for how this is rendered.
-
-#: For backwards compatibility, values of yes, y and true are
-#: converted to the default bell symbol and no, n, false and none are
-#: converted to the empty string.
-
-# command_on_bell none
-
-#: Program to run when a bell occurs. The environment variable
-#: KITTY_CHILD_CMDLINE can be used to get the program running in the
-#: window in which the bell occurred.
-
-# bell_path none
-
-#: Path to a sound file to play as the bell sound. If set to none, the
-#: system default bell sound is used. Must be in a format supported by
-#: the operating systems sound API, such as WAV or OGA on Linux
-#: (libcanberra) or AIFF, MP3 or WAV on macOS (NSSound).
-
-# linux_bell_theme __custom
-
-#: The XDG Sound Theme kitty will use to play the bell sound. Defaults
-#: to the custom theme name used by GNOME and Budgie, falling back to
-#: the default freedesktop theme if it does not exist. This option may
-#: be removed if Linux ever provides desktop-agnostic support for
-#: setting system sound themes.
-
-#: }}}
-
-#: Window layout {{{
-
-# remember_window_size yes
-# initial_window_width 640
-# initial_window_height 400
-
-#: If enabled, the OS Window size will be remembered so that new
-#: instances of kitty will have the same size as the previous
-#: instance. If disabled, the OS Window will initially have size
-#: configured by initial_window_width/height, in pixels. You can use a
-#: suffix of "c" on the width/height values to have them interpreted
-#: as number of cells instead of pixels.
-
-# enabled_layouts *
-
-#: The enabled window layouts. A comma separated list of layout names.
-#: The special value all means all layouts. The first listed layout
-#: will be used as the startup layout. Default configuration is all
-#: layouts in alphabetical order. For a list of available layouts, see
-#: the layouts .
-
-# window_resize_step_cells 2
-# window_resize_step_lines 2
-
-#: The step size (in units of cell width/cell height) to use when
-#: resizing kitty windows in a layout with the shortcut
-#: start_resizing_window. The cells value is used for horizontal
-#: resizing, and the lines value is used for vertical resizing.
-
-# window_border_width 0.5pt
-
-#: The width of window borders. Can be either in pixels (px) or pts
-#: (pt). Values in pts will be rounded to the nearest number of pixels
-#: based on screen resolution. If not specified, the unit is assumed
-#: to be pts. Note that borders are displayed only when more than one
-#: window is visible. They are meant to separate multiple windows.
-
-# draw_minimal_borders yes
-
-#: Draw only the minimum borders needed. This means that only the
-#: borders that separate the window from a neighbor are drawn. Note
-#: that setting a non-zero window_margin_width overrides this and
-#: causes all borders to be drawn.
-
-# window_margin_width 0
-
-#: The window margin (in pts) (blank area outside the border). A
-#: single value sets all four sides. Two values set the vertical and
-#: horizontal sides. Three values set top, horizontal and bottom. Four
-#: values set top, right, bottom and left.
-
-# single_window_margin_width -1
-
-#: The window margin to use when only a single window is visible (in
-#: pts). Negative values will cause the value of window_margin_width
-#: to be used instead. A single value sets all four sides. Two values
-#: set the vertical and horizontal sides. Three values set top,
-#: horizontal and bottom. Four values set top, right, bottom and left.
-
-# window_padding_width 0
-
-#: The window padding (in pts) (blank area between the text and the
-#: window border). A single value sets all four sides. Two values set
-#: the vertical and horizontal sides. Three values set top, horizontal
-#: and bottom. Four values set top, right, bottom and left.
-
-# single_window_padding_width -1
-
-#: The window padding to use when only a single window is visible (in
-#: pts). Negative values will cause the value of window_padding_width
-#: to be used instead. A single value sets all four sides. Two values
-#: set the vertical and horizontal sides. Three values set top,
-#: horizontal and bottom. Four values set top, right, bottom and left.
-
-# placement_strategy center
-
-#: When the window size is not an exact multiple of the cell size, the
-#: cell area of the terminal window will have some extra padding on
-#: the sides. You can control how that padding is distributed with
-#: this option. Using a value of center means the cell area will be
-#: placed centrally. A value of top-left means the padding will be
-#: only at the bottom and right edges. The value can be one of: top-
-#: left, top, top-right, left, center, right, bottom-left, bottom,
-#: bottom-right.
-
-# active_border_color #00ff00
-
-#: The color for the border of the active window. Set this to none to
-#: not draw borders around the active window.
-
-# inactive_border_color #cccccc
-
-#: The color for the border of inactive windows.
-
-# bell_border_color #ff5a00
-
-#: The color for the border of inactive windows in which a bell has
-#: occurred.
-
-# inactive_text_alpha 1.0
-
-#: Fade the text in inactive windows by the specified amount (a number
-#: between zero and one, with zero being fully faded).
-
-# hide_window_decorations no
-
-#: Hide the window decorations (title-bar and window borders) with
-#: yes. On macOS, titlebar-only and titlebar-and-corners can be used
-#: to only hide the titlebar and the rounded corners. Whether this
-#: works and exactly what effect it has depends on the window
-#: manager/operating system. Note that the effects of changing this
-#: option when reloading config are undefined. When using titlebar-
-#: only, it is useful to also set window_margin_width and
-#: placement_strategy to prevent the rounded corners from clipping
-#: text. Or use titlebar-and-corners.
-
-# window_logo_path none
-
-#: Path to a logo image. Must be in PNG format. Relative paths are
-#: interpreted relative to the kitty config directory. The logo is
-#: displayed in a corner of every kitty window. The position is
-#: controlled by window_logo_position. Individual windows can be
-#: configured to have different logos either using the launch action
-#: or the remote control facility.
-
-# window_logo_position bottom-right
-
-#: Where to position the window logo in the window. The value can be
-#: one of: top-left, top, top-right, left, center, right, bottom-left,
-#: bottom, bottom-right.
-
-# window_logo_alpha 0.5
-
-#: The amount the logo should be faded into the background. With zero
-#: being fully faded and one being fully opaque.
-
-# window_logo_scale 0
-
-#: The percentage (0-100] of the window size to which the logo should
-#: scale. Using a single number means the logo is scaled to that
-#: percentage of the shortest window dimension, while preseving aspect
-#: ratio of the logo image.
-
-#: Using two numbers means the width and height of the logo are scaled
-#: to the respective percentage of the window's width and height.
-
-#: Using zero as the percentage disables scaling in that dimension. A
-#: single zero (the default) disables all scaling of the window logo.
-
-# resize_debounce_time 0.1 0.5
-
-#: The time to wait (in seconds) before asking the program running in
-#: kitty to resize and redraw the screen during a live resize of the
-#: OS window, when no new resize events have been received, i.e. when
-#: resizing is either paused or finished. On platforms such as macOS,
-#: where the operating system sends events corresponding to the start
-#: and end of a live resize, the second number is used for redraw-
-#: after-pause since kitty can distinguish between a pause and end of
-#: resizing. On such systems the first number is ignored and redraw is
-#: immediate after end of resize. On other systems only the first
-#: number is used so that kitty is "ready" quickly after the end of
-#: resizing, while not also continuously redrawing, to save energy.
-
-# resize_in_steps no
-
-#: Resize the OS window in steps as large as the cells, instead of
-#: with the usual pixel accuracy. Combined with initial_window_width
-#: and initial_window_height in number of cells, this option can be
-#: used to keep the margins as small as possible when resizing the OS
-#: window. Note that this does not currently work on Wayland.
-
-# visual_window_select_characters 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
-
-#: The list of characters for visual window selection. For example,
-#: for selecting a window to focus on with focus_visible_window. The
-#: value should be a series of unique numbers or alphabets, case
-#: insensitive, from the set 0-9A-Z\-=[];',./\\`. Specify your
-#: preference as a string of characters.
-
-# confirm_os_window_close -1
-
-#: Ask for confirmation when closing an OS window or a tab with at
-#: least this number of kitty windows in it by window manager (e.g.
-#: clicking the window close button or pressing the operating system
-#: shortcut to close windows) or by the close_tab action. A value of
-#: zero disables confirmation. This confirmation also applies to
-#: requests to quit the entire application (all OS windows, via the
-#: quit action). Negative values are converted to positive ones,
-#: however, with shell_integration enabled, using negative values
-#: means windows sitting at a shell prompt are not counted, only
-#: windows where some command is currently running. Note that if you
-#: want confirmation when closing individual windows, you can map the
-#: close_window_with_confirmation action.
-
-#: }}}
-
-#: Tab bar {{{
-
-# tab_bar_edge bottom
-
-#: The edge to show the tab bar on, top or bottom.
-
-# tab_bar_margin_width 0.0
-
-#: The margin to the left and right of the tab bar (in pts).
-
-# tab_bar_margin_height 0.0 0.0
-
-#: The margin above and below the tab bar (in pts). The first number
-#: is the margin between the edge of the OS Window and the tab bar.
-#: The second number is the margin between the tab bar and the
-#: contents of the current tab.
-
-# tab_bar_style fade
-
-#: The tab bar style, can be one of:
-
-#: fade
-#: Each tab's edges fade into the background color. (See also tab_fade)
-#: slant
-#: Tabs look like the tabs in a physical file.
-#: separator
-#: Tabs are separated by a configurable separator. (See also
-#: tab_separator)
-#: powerline
-#: Tabs are shown as a continuous line with "fancy" separators.
-#: (See also tab_powerline_style)
-#: custom
-#: A user-supplied Python function called draw_tab is loaded from the file
-#: tab_bar.py in the kitty config directory. For examples of how to
-#: write such a function, see the functions named draw_tab_with_* in
-#: kitty's source code: kitty/tab_bar.py. See also
-#: this discussion
-#: for examples from kitty users.
-#: hidden
-#: The tab bar is hidden. If you use this, you might want to create
-#: a mapping for the select_tab action which presents you with a list of
-#: tabs and allows for easy switching to a tab.
-
-# tab_bar_align left
-
-#: The horizontal alignment of the tab bar, can be one of: left,
-#: center, right.
-
-# tab_bar_min_tabs 2
-
-#: The minimum number of tabs that must exist before the tab bar is
-#: shown.
-
-# tab_switch_strategy previous
-
-#: The algorithm to use when switching to a tab when the current tab
-#: is closed. The default of previous will switch to the last used
-#: tab. A value of left will switch to the tab to the left of the
-#: closed tab. A value of right will switch to the tab to the right of
-#: the closed tab. A value of last will switch to the right-most tab.
-
-# tab_fade 0.25 0.5 0.75 1
-
-#: Control how each tab fades into the background when using fade for
-#: the tab_bar_style. Each number is an alpha (between zero and one)
-#: that controls how much the corresponding cell fades into the
-#: background, with zero being no fade and one being full fade. You
-#: can change the number of cells used by adding/removing entries to
-#: this list.
-
-# tab_separator " ┇"
-
-#: The separator between tabs in the tab bar when using separator as
-#: the tab_bar_style.
-
-# tab_powerline_style angled
-
-#: The powerline separator style between tabs in the tab bar when
-#: using powerline as the tab_bar_style, can be one of: angled,
-#: slanted, round.
-
-# tab_activity_symbol none
-
-#: Some text or a Unicode symbol to show on the tab if a window in the
-#: tab that does not have focus has some activity. If you want to use
-#: leading or trailing spaces, surround the text with quotes. See
-#: tab_title_template for how this is rendered.
-
-# tab_title_max_length 0
-
-#: The maximum number of cells that can be used to render the text in
-#: a tab. A value of zero means that no limit is applied.
-
-# tab_title_template "{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}"
-
-#: A template to render the tab title. The default just renders the
-#: title with optional symbols for bell and activity. If you wish to
-#: include the tab-index as well, use something like: {index}:{title}.
-#: Useful if you have shortcuts mapped for goto_tab N. If you prefer
-#: to see the index as a superscript, use {sup.index}. All data
-#: available is:
-
-#: title
-#: The current tab title.
-#: index
-#: The tab index usable with goto_tab N goto_tab shortcuts.
-#: layout_name
-#: The current layout name.
-#: num_windows
-#: The number of windows in the tab.
-#: num_window_groups
-#: The number of window groups (a window group is a window and all of its overlay windows) in the tab.
-#: tab.active_wd
-#: The working directory of the currently active window in the tab
-#: (expensive, requires syscall). Use active_oldest_wd to get
-#: the directory of the oldest foreground process rather than the newest.
-#: tab.active_exe
-#: The name of the executable running in the foreground of the currently
-#: active window in the tab (expensive, requires syscall). Use
-#: active_oldest_exe for the oldest foreground process.
-#: max_title_length
-#: The maximum title length available.
-#: keyboard_mode
-#: The name of the current keyboard mode or the empty string if no keyboard mode is active.
-
-#: Note that formatting is done by Python's string formatting
-#: machinery, so you can use, for instance, {layout_name[:2].upper()}
-#: to show only the first two letters of the layout name, upper-cased.
-#: If you want to style the text, you can use styling directives, for
-#: example:
-#: `{fmt.fg.red}red{fmt.fg.tab}normal{fmt.bg._00FF00}greenbg{fmt.bg.tab}`.
-#: Similarly, for bold and italic:
-#: `{fmt.bold}bold{fmt.nobold}normal{fmt.italic}italic{fmt.noitalic}`.
-#: Note that for backward compatibility, if {bell_symbol} or
-#: {activity_symbol} are not present in the template, they are
-#: prepended to it.
-
-# active_tab_title_template none
-
-#: Template to use for active tabs. If not specified falls back to
-#: tab_title_template.
-
-# active_tab_foreground #000
-# active_tab_background #eee
-# active_tab_font_style bold-italic
-# inactive_tab_foreground #444
-# inactive_tab_background #999
-# inactive_tab_font_style normal
-
-#: Tab bar colors and styles.
-
-# tab_bar_background none
-
-#: Background color for the tab bar. Defaults to using the terminal
-#: background color.
-
-# tab_bar_margin_color none
-
-#: Color for the tab bar margin area. Defaults to using the terminal
-#: background color for margins above and below the tab bar. For side
-#: margins the default color is chosen to match the background color
-#: of the neighboring tab.
-
-#: }}}
-
-#: Color scheme {{{
-
-# foreground #dddddd
-# background #000000
-
-#: The foreground and background colors.
-
-# background_opacity 1.0
-
-#: The opacity of the background. A number between zero and one, where
-#: one is opaque and zero is fully transparent. This will only work if
-#: supported by the OS (for instance, when using a compositor under
-#: X11). Note that it only sets the background color's opacity in
-#: cells that have the same background color as the default terminal
-#: background, so that things like the status bar in vim, powerline
-#: prompts, etc. still look good. But it means that if you use a color
-#: theme with a background color in your editor, it will not be
-#: rendered as transparent. Instead you should change the default
-#: background color in your kitty config and not use a background
-#: color in the editor color scheme. Or use the escape codes to set
-#: the terminals default colors in a shell script to launch your
-#: editor. Be aware that using a value less than 1.0 is a (possibly
-#: significant) performance hit. When using a low value for this
-#: setting, it is desirable that you set the background color to a
-#: color the matches the general color of the desktop background, for
-#: best text rendering. If you want to dynamically change
-#: transparency of windows, set dynamic_background_opacity to yes
-#: (this is off by default as it has a performance cost). Changing
-#: this option when reloading the config will only work if
-#: dynamic_background_opacity was enabled in the original config.
-
-# background_blur 0
-
-#: Set to a positive value to enable background blur (blurring of the
-#: visuals behind a transparent window) on platforms that support it.
-#: Only takes effect when background_opacity is less than one. On
-#: macOS, this will also control the blur radius (amount of blurring).
-#: Setting it to too high a value will cause severe performance issues
-#: and/or rendering artifacts. Usually, values up to 64 work well.
-#: Note that this might cause performance issues, depending on how the
-#: platform implements it, so use with care. Currently supported on
-#: macOS and KDE.
-
-# background_image none
-
-#: Path to a background image. Must be in PNG format.
-
-# background_image_layout tiled
-
-#: Whether to tile, scale or clamp the background image. The value can
-#: be one of tiled, mirror-tiled, scaled, clamped, centered or
-#: cscaled. The scaled and cscaled values scale the image to the
-#: window size, with cscaled preserving the image aspect ratio.
-
-# background_image_linear no
-
-#: When background image is scaled, whether linear interpolation
-#: should be used.
-
-# dynamic_background_opacity no
-
-#: Allow changing of the background_opacity dynamically, using either
-#: keyboard shortcuts (increase_background_opacity and
-#: decrease_background_opacity) or the remote control facility.
-#: Changing this option by reloading the config is not supported.
-
-# background_tint 0.0
-
-#: How much to tint the background image by the background color. This
-#: option makes it easier to read the text. Tinting is done using the
-#: current background color for each window. This option applies only
-#: if background_opacity is set and transparent windows are supported
-#: or background_image is set.
-
-# background_tint_gaps 1.0
-
-#: How much to tint the background image at the window gaps by the
-#: background color, after applying background_tint. Since this is
-#: multiplicative with background_tint, it can be used to lighten the
-#: tint over the window gaps for a *separated* look.
-
-# dim_opacity 0.4
-
-#: How much to dim text that has the DIM/FAINT attribute set. One
-#: means no dimming and zero means fully dimmed (i.e. invisible).
-
-# selection_foreground #000000
-# selection_background #fffacd
-
-#: The foreground and background colors for text selected with the
-#: mouse. Setting both of these to none will cause a "reverse video"
-#: effect for selections, where the selection will be the cell text
-#: color and the text will become the cell background color. Setting
-#: only selection_foreground to none will cause the foreground color
-#: to be used unchanged. Note that these colors can be overridden by
-#: the program running in the terminal.
-
-#: The color table {{{
-
-#: The 256 terminal colors. There are 8 basic colors, each color has a
-#: dull and bright version, for the first 16 colors. You can set the
-#: remaining 240 colors as color16 to color255.
-
-# color0 #000000
-# color8 #767676
-
-#: black
-
-# color1 #cc0403
-# color9 #f2201f
-
-#: red
-
-# color2 #19cb00
-# color10 #23fd00
-
-#: green
-
-# color3 #cecb00
-# color11 #fffd00
-
-#: yellow
-
-# color4 #0d73cc
-# color12 #1a8fff
-
-#: blue
-
-# color5 #cb1ed1
-# color13 #fd28ff
-
-#: magenta
-
-# color6 #0dcdcd
-# color14 #14ffff
-
-#: cyan
-
-# color7 #dddddd
-# color15 #ffffff
-
-#: white
-
-# mark1_foreground black
-
-#: Color for marks of type 1
-
-# mark1_background #98d3cb
-
-#: Color for marks of type 1 (light steel blue)
-
-# mark2_foreground black
-
-#: Color for marks of type 2
-
-# mark2_background #f2dcd3
-
-#: Color for marks of type 1 (beige)
-
-# mark3_foreground black
-
-#: Color for marks of type 3
-
-# mark3_background #f274bc
-
-#: Color for marks of type 3 (violet)
-
-#: }}}
-
-#: }}}
-
-#: Advanced {{{
-
-# shell .
-
-#: The shell program to execute. The default value of . means to use
-#: whatever shell is set as the default shell for the current user.
-#: Note that on macOS if you change this, you might need to add
-#: --login and --interactive to ensure that the shell starts in
-#: interactive mode and reads its startup rc files. Environment
-#: variables are expanded in this setting.
-
-# editor .
-
-#: The terminal based text editor (such as vim or nano) to use when
-#: editing the kitty config file or similar tasks.
-
-#: The default value of . means to use the environment variables
-#: VISUAL and EDITOR in that order. If these variables aren't set,
-#: kitty will run your shell ($SHELL -l -i -c env) to see if your
-#: shell startup rc files set VISUAL or EDITOR. If that doesn't work,
-#: kitty will cycle through various known editors (vim, emacs, etc.)
-#: and take the first one that exists on your system.
-
-# close_on_child_death no
-
-#: Close the window when the child process (usually the shell) exits.
-#: With the default value no, the terminal will remain open when the
-#: child exits as long as there are still other processes outputting
-#: to the terminal (for example disowned or backgrounded processes).
-#: When enabled with yes, the window will close as soon as the child
-#: process exits. Note that setting it to yes means that any
-#: background processes still using the terminal can fail silently
-#: because their stdout/stderr/stdin no longer work.
-
-# remote_control_password
-
-#: Allow other programs to control kitty using passwords. This option
-#: can be specified multiple times to add multiple passwords. If no
-#: passwords are present kitty will ask the user for permission if a
-#: program tries to use remote control with a password. A password can
-#: also *optionally* be associated with a set of allowed remote
-#: control actions. For example::
-
-#: remote_control_password "my passphrase" get-colors set-colors focus-window focus-tab
-
-#: Only the specified actions will be allowed when using this
-#: password. Glob patterns can be used too, for example::
-
-#: remote_control_password "my passphrase" set-tab-* resize-*
-
-#: To get a list of available actions, run::
-
-#: kitten @ --help
-
-#: A set of actions to be allowed when no password is sent can be
-#: specified by using an empty password. For example::
-
-#: remote_control_password "" *-colors
-
-#: Finally, the path to a python module can be specified that provides
-#: a function is_cmd_allowed that is used to check every remote
-#: control command. For example::
-
-#: remote_control_password "my passphrase" my_rc_command_checker.py
-
-#: Relative paths are resolved from the kitty configuration directory.
-#: See rc_custom_auth for details.
-
-# allow_remote_control no
-
-#: Allow other programs to control kitty. If you turn this on, other
-#: programs can control all aspects of kitty, including sending text
-#: to kitty windows, opening new windows, closing windows, reading the
-#: content of windows, etc. Note that this even works over SSH
-#: connections. The default setting of no prevents any form of remote
-#: control. The meaning of the various values are:
-
-#: password
-#: Remote control requests received over both the TTY device and the socket
-#: are confirmed based on passwords, see remote_control_password.
-
-#: socket-only
-#: Remote control requests received over a socket are accepted
-#: unconditionally. Requests received over the TTY are denied.
-#: See listen_on.
-
-#: socket
-#: Remote control requests received over a socket are accepted
-#: unconditionally. Requests received over the TTY are confirmed based on
-#: password.
-
-#: no
-#: Remote control is completely disabled.
-
-#: yes
-#: Remote control requests are always accepted.
-
-# listen_on none
-
-#: Listen to the specified socket for remote control connections. Note
-#: that this will apply to all kitty instances. It can be overridden
-#: by the kitty --listen-on command line option. For UNIX sockets,
-#: such as unix:${TEMP}/mykitty or unix:@mykitty (on Linux).
-#: Environment variables are expanded and relative paths are resolved
-#: with respect to the temporary directory. If {kitty_pid} is present,
-#: then it is replaced by the PID of the kitty process, otherwise the
-#: PID of the kitty process is appended to the value, with a hyphen.
-#: For TCP sockets such as tcp:localhost:0 a random port is always
-#: used even if a non-zero port number is specified. See the help for
-#: kitty --listen-on for more details. Note that this will be ignored
-#: unless allow_remote_control is set to either: yes, socket or
-#: socket-only. Changing this option by reloading the config is not
-#: supported.
-
-# env
-
-#: Specify the environment variables to be set in all child processes.
-#: Using the name with an equal sign (e.g. env VAR=) will set it to
-#: the empty string. Specifying only the name (e.g. env VAR) will
-#: remove the variable from the child process' environment. Note that
-#: environment variables are expanded recursively, for example::
-
-#: env VAR1=a
-#: env VAR2=${HOME}/${VAR1}/b
-
-#: The value of VAR2 will be /a/b.
-
-# watcher
-
-#: Path to python file which will be loaded for watchers
-#: . Can be
-#: specified more than once to load multiple watchers. The watchers
-#: will be added to every kitty window. Relative paths are resolved
-#: relative to the kitty config directory. Note that reloading the
-#: config will only affect windows created after the reload.
-
-# exe_search_path
-
-#: Control where kitty finds the programs to run. The default search
-#: order is: First search the system wide PATH, then ~/.local/bin and
-#: ~/bin. If still not found, the PATH defined in the login shell
-#: after sourcing all its startup files is tried. Finally, if present,
-#: the PATH specified by the env option is tried.
-
-#: This option allows you to prepend, append, or remove paths from
-#: this search order. It can be specified multiple times for multiple
-#: paths. A simple path will be prepended to the search order. A path
-#: that starts with the + sign will be append to the search order,
-#: after ~/bin above. A path that starts with the - sign will be
-#: removed from the entire search order. For example::
-
-#: exe_search_path /some/prepended/path
-#: exe_search_path +/some/appended/path
-#: exe_search_path -/some/excluded/path
-
-# update_check_interval 24
-
-#: The interval to periodically check if an update to kitty is
-#: available (in hours). If an update is found, a system notification
-#: is displayed informing you of the available update. The default is
-#: to check every 24 hours, set to zero to disable. Update checking is
-#: only done by the official binary builds. Distro packages or source
-#: builds do not do update checking. Changing this option by reloading
-#: the config is not supported.
-
-# startup_session none
-
-#: Path to a session file to use for all kitty instances. Can be
-#: overridden by using the kitty --session =none command line option
-#: for individual instances. See sessions
-#: in the kitty
-#: documentation for details. Note that relative paths are interpreted
-#: with respect to the kitty config directory. Environment variables
-#: in the path are expanded. Changing this option by reloading the
-#: config is not supported. Note that if kitty is invoked with command
-#: line arguments specifying a command to run, this option is ignored.
-
-# clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask
-
-#: Allow programs running in kitty to read and write from the
-#: clipboard. You can control exactly which actions are allowed. The
-#: possible actions are: write-clipboard, read-clipboard, write-
-#: primary, read-primary, read-clipboard-ask, read-primary-ask. The
-#: default is to allow writing to the clipboard and primary selection
-#: and to ask for permission when a program tries to read from the
-#: clipboard. Note that disabling the read confirmation is a security
-#: risk as it means that any program, even the ones running on a
-#: remote server via SSH can read your clipboard. See also
-#: clipboard_max_size.
-
-# clipboard_max_size 512
-
-#: The maximum size (in MB) of data from programs running in kitty
-#: that will be stored for writing to the system clipboard. A value of
-#: zero means no size limit is applied. See also clipboard_control.
-
-# file_transfer_confirmation_bypass
-
-#: The password that can be supplied to the file transfer kitten
-#: to skip the
-#: transfer confirmation prompt. This should only be used when
-#: initiating transfers from trusted computers, over trusted networks
-#: or encrypted transports, as it allows any programs running on the
-#: remote machine to read/write to the local filesystem, without
-#: permission.
-
-# allow_hyperlinks yes
-
-#: Process hyperlink escape sequences (OSC 8). If disabled OSC 8
-#: escape sequences are ignored. Otherwise they become clickable
-#: links, that you can click with the mouse or by using the hints
-#: kitten . The
-#: special value of ask means that kitty will ask before opening the
-#: link when clicked.
-
-# shell_integration enabled
-
-#: Enable shell integration on supported shells. This enables features
-#: such as jumping to previous prompts, browsing the output of the
-#: previous command in a pager, etc. on supported shells. Set to
-#: disabled to turn off shell integration, completely. It is also
-#: possible to disable individual features, set to a space separated
-#: list of these values: no-rc, no-cursor, no-title, no-cwd, no-
-#: prompt-mark, no-complete, no-sudo. See Shell integration
-#: for details.
-
-# allow_cloning ask
-
-#: Control whether programs running in the terminal can request new
-#: windows to be created. The canonical example is clone-in-kitty
-#: .
-#: By default, kitty will ask for permission for each clone request.
-#: Allowing cloning unconditionally gives programs running in the
-#: terminal (including over SSH) permission to execute arbitrary code,
-#: as the user who is running the terminal, on the computer that the
-#: terminal is running on.
-
-# clone_source_strategies venv,conda,env_var,path
-
-#: Control what shell code is sourced when running clone-in-kitty in
-#: the newly cloned window. The supported strategies are:
-
-#: venv
-#: Source the file $VIRTUAL_ENV/bin/activate. This is used by the
-#: Python stdlib venv module and allows cloning venvs automatically.
-#: conda
-#: Run conda activate $CONDA_DEFAULT_ENV. This supports the virtual
-#: environments created by conda.
-#: env_var
-#: Execute the contents of the environment variable
-#: KITTY_CLONE_SOURCE_CODE with eval.
-#: path
-#: Source the file pointed to by the environment variable
-#: KITTY_CLONE_SOURCE_PATH.
-
-#: This option must be a comma separated list of the above values.
-#: Only the first valid match, in the order specified, is sourced.
-
-# notify_on_cmd_finish never
-
-#: Show a desktop notification when a long-running command finishes
-#: (needs shell_integration). The possible values are:
-
-#: never
-#: Never send a notification.
-
-#: unfocused
-#: Only send a notification when the window does not have keyboard focus.
-
-#: invisible
-#: Only send a notification when the window both is unfocused and not visible
-#: to the user, for example, because it is in an inactive tab or its OS window
-#: is not currently active.
-
-#: always
-#: Always send a notification, regardless of window state.
-
-#: There are two optional arguments:
-
-#: First, the minimum duration for what is considered a long running
-#: command. The default is 5 seconds. Specify a second argument to set
-#: the duration. For example: invisible 15. Do not set the value too
-#: small, otherwise a command that launches a new OS Window and exits
-#: will spam a notification.
-
-#: Second, the action to perform. The default is notify. The possible
-#: values are:
-
-#: notify
-#: Send a desktop notification.
-
-#: bell
-#: Ring the terminal bell.
-
-#: command
-#: Run a custom command. All subsequent arguments are the cmdline to run.
-
-#: Some more examples::
-
-#: # Send a notification when a command takes more than 5 seconds in an unfocused window
-#: notify_on_cmd_finish unfocused
-#: # Send a notification when a command takes more than 10 seconds in a invisible window
-#: notify_on_cmd_finish invisible 10.0
-#: # Ring a bell when a command takes more than 10 seconds in a invisible window
-#: notify_on_cmd_finish invisible 10.0 bell
-#: # Run 'notify-send' when a command takes more than 10 seconds in a invisible window
-#: # Here %c is replaced by the current command line and %s by the job exit code
-#: notify_on_cmd_finish invisible 10.0 command notify-send "job finished with status: %s" %c
-
-# term xterm-kitty
-
-#: The value of the TERM environment variable to set. Changing this
-#: can break many terminal programs, only change it if you know what
-#: you are doing, not because you read some advice on "Stack Overflow"
-#: to change it. The TERM variable is used by various programs to get
-#: information about the capabilities and behavior of the terminal. If
-#: you change it, depending on what programs you run, and how
-#: different the terminal you are changing it to is, various things
-#: from key-presses, to colors, to various advanced features may not
-#: work. Changing this option by reloading the config will only affect
-#: newly created windows.
-
-# terminfo_type path
-
-#: The value of the TERMINFO environment variable to set. This
-#: variable is used by programs running in the terminal to search for
-#: terminfo databases. The default value of path causes kitty to set
-#: it to a filesystem location containing the kitty terminfo database.
-#: A value of direct means put the entire database into the env var
-#: directly. This can be useful when connecting to containers, for
-#: example. But, note that not all software supports this. A value of
-#: none means do not touch the variable.
-
-# forward_stdio no
-
-#: Forward STDOUT and STDERR of the kitty process to child processes
-#: as file descriptors 3 and 4. This is useful for debugging as it
-#: allows child processes to print to kitty's STDOUT directly. For
-#: example, echo hello world >&3 in a shell will print to the parent
-#: kitty's STDOUT. When enabled, this also sets the
-#: KITTY_STDIO_FORWARDED=3 environment variable so child processes
-#: know about the forwarding.
-
-# menu_map
-
-#: Specify entries for various menus in kitty. Currently only the
-#: global menubar on macOS is supported. For example::
-
-#: menu_map global "Actions::Launch something special" launch --hold --type=os-window sh -c "echo hello world"
-
-#: This will create a menu entry named "Launch something special" in
-#: an "Actions" menu in the macOS global menubar. Sub-menus can be
-#: created by adding more levels separated by the :: characters.
-
-#: }}}
-
-#: OS specific tweaks {{{
-
-# wayland_titlebar_color system
-
-#: The color of the kitty window's titlebar on Wayland systems with
-#: client side window decorations such as GNOME. A value of system
-#: means to use the default system colors, a value of background means
-#: to use the background color of the currently active kitty window
-#: and finally you can use an arbitrary color, such as #12af59 or red.
-
-# macos_titlebar_color system
-
-#: The color of the kitty window's titlebar on macOS. A value of
-#: system means to use the default system color, light or dark can
-#: also be used to set it explicitly. A value of background means to
-#: use the background color of the currently active window and finally
-#: you can use an arbitrary color, such as #12af59 or red. WARNING:
-#: This option works by using a hack when arbitrary color (or
-#: background) is configured, as there is no proper Cocoa API for it.
-#: It sets the background color of the entire window and makes the
-#: titlebar transparent. As such it is incompatible with
-#: background_opacity. If you want to use both, you are probably
-#: better off just hiding the titlebar with hide_window_decorations.
-
-# macos_option_as_alt no
-
-#: Use the Option key as an Alt key on macOS. With this set to no,
-#: kitty will use the macOS native Option+Key to enter Unicode
-#: character behavior. This will break any Alt+Key keyboard shortcuts
-#: in your terminal programs, but you can use the macOS Unicode input
-#: technique. You can use the values: left, right or both to use only
-#: the left, right or both Option keys as Alt, instead. Note that
-#: kitty itself always treats Option the same as Alt. This means you
-#: cannot use this option to configure different kitty shortcuts for
-#: Option+Key vs. Alt+Key. Also, any kitty shortcuts using
-#: Option/Alt+Key will take priority, so that any such key presses
-#: will not be passed to terminal programs running inside kitty.
-#: Changing this option by reloading the config is not supported.
-
-# macos_hide_from_tasks no
-
-#: Hide the kitty window from running tasks on macOS (⌘+Tab and the
-#: Dock). Changing this option by reloading the config is not
-#: supported.
-
-# macos_quit_when_last_window_closed no
-
-#: Have kitty quit when all the top-level windows are closed on macOS.
-#: By default, kitty will stay running, even with no open windows, as
-#: is the expected behavior on macOS.
-
-# macos_window_resizable yes
-
-#: Disable this if you want kitty top-level OS windows to not be
-#: resizable on macOS.
-
-# macos_thicken_font 0
-
-#: Draw an extra border around the font with the given width, to
-#: increase legibility at small font sizes on macOS. For example, a
-#: value of 0.75 will result in rendering that looks similar to sub-
-#: pixel antialiasing at common font sizes. Note that in modern kitty,
-#: this option is obsolete (although still supported). Consider using
-#: text_composition_strategy instead.
-
-# macos_traditional_fullscreen no
-
-#: Use the macOS traditional full-screen transition, that is faster,
-#: but less pretty.
-
-# macos_show_window_title_in all
-
-#: Control where the window title is displayed on macOS. A value of
-#: window will show the title of the currently active window at the
-#: top of the macOS window. A value of menubar will show the title of
-#: the currently active window in the macOS global menu bar, making
-#: use of otherwise wasted space. A value of all will show the title
-#: in both places, and none hides the title. See
-#: macos_menubar_title_max_length for how to control the length of the
-#: title in the menu bar.
-
-# macos_menubar_title_max_length 0
-
-#: The maximum number of characters from the window title to show in
-#: the macOS global menu bar. Values less than one means that there is
-#: no maximum limit.
-
-# macos_custom_beam_cursor no
-
-#: Use a custom mouse cursor for macOS that is easier to see on both
-#: light and dark backgrounds. Nowadays, the default macOS cursor
-#: already comes with a white border. WARNING: this might make your
-#: mouse cursor invisible on dual GPU machines. Changing this option
-#: by reloading the config is not supported.
-
-# macos_colorspace srgb
-
-#: The colorspace in which to interpret terminal colors. The default
-#: of srgb will cause colors to match those seen in web browsers. The
-#: value of default will use whatever the native colorspace of the
-#: display is. The value of displayp3 will use Apple's special
-#: snowflake display P3 color space, which will result in over
-#: saturated (brighter) colors with some color shift. Reloading
-#: configuration will change this value only for newly created OS
-#: windows.
-
-# linux_display_server auto
-
-#: Choose between Wayland and X11 backends. By default, an appropriate
-#: backend based on the system state is chosen automatically. Set it
-#: to x11 or wayland to force the choice. Changing this option by
-#: reloading the config is not supported.
-
-# wayland_enable_ime yes
-
-#: Enable Input Method Extension on Wayland. This is typically used
-#: for inputting text in East Asian languages. However, its
-#: implementation in Wayland is often buggy and introduces latency
-#: into the input loop, so disable this if you know you dont need it.
-#: Changing this option by reloading the config is not supported, it
-#: will not have any effect.
-
-#: }}}
-
-#: Keyboard shortcuts {{{
-
-#: Keys are identified simply by their lowercase Unicode characters.
-#: For example: a for the A key, [ for the left square bracket key,
-#: etc. For functional keys, such as Enter or Escape, the names are
-#: present at Functional key definitions
-#: .
-#: For modifier keys, the names are ctrl (control, ⌃), shift (⇧), alt
-#: (opt, option, ⌥), super (cmd, command, ⌘).
-
-#: Simple shortcut mapping is done with the map directive. For full
-#: details on advanced mapping including modal and per application
-#: maps, see mapping . Some
-#: quick examples to illustrate common tasks::
-
-#: # unmap a keyboard shortcut, passing it to the program running in kitty
-#: map kitty_mod+space
-#: # completely ignore a keyboard event
-#: map ctrl+alt+f1 discard_event
-#: # combine multiple actions
-#: map kitty_mod+e combine : new_window : next_layout
-#: # multi-key shortcuts
-#: map ctrl+x>ctrl+y>z action
-
-#: The full list of actions that can be mapped to key presses is
-#: available here .
-
-# kitty_mod ctrl+shift
-
-#: Special modifier key alias for default shortcuts. You can change
-#: the value of this option to alter all default shortcuts that use
-#: kitty_mod.
-
-# clear_all_shortcuts no
-
-#: Remove all shortcut definitions up to this point. Useful, for
-#: instance, to remove the default shortcuts.
-
-# action_alias
-
-#: E.g. action_alias launch_tab launch --type=tab --cwd=current
-
-#: Define action aliases to avoid repeating the same options in
-#: multiple mappings. Aliases can be defined for any action and will
-#: be expanded recursively. For example, the above alias allows you to
-#: create mappings to launch a new tab in the current working
-#: directory without duplication::
-
-#: map f1 launch_tab vim
-#: map f2 launch_tab emacs
-
-#: Similarly, to alias kitten invocation::
-
-#: action_alias hints kitten hints --hints-offset=0
-
-# kitten_alias
-
-#: E.g. kitten_alias hints hints --hints-offset=0
-
-#: Like action_alias above, but specifically for kittens. Generally,
-#: prefer to use action_alias. This option is a legacy version,
-#: present for backwards compatibility. It causes all invocations of
-#: the aliased kitten to be substituted. So the example above will
-#: cause all invocations of the hints kitten to have the --hints-
-#: offset=0 option applied.
-
-#: Clipboard {{{
-
-#: Copy to clipboard
-
-# map kitty_mod+c copy_to_clipboard
-# map cmd+c copy_to_clipboard
-
-#:: There is also a copy_or_interrupt action that can be optionally
-#:: mapped to Ctrl+C. It will copy only if there is a selection and
-#:: send an interrupt otherwise. Similarly,
-#:: copy_and_clear_or_interrupt will copy and clear the selection or
-#:: send an interrupt if there is no selection.
-
-#: Paste from clipboard
-
-# map kitty_mod+v paste_from_clipboard
-# map cmd+v paste_from_clipboard
-
-#: Paste from selection
-
-# map kitty_mod+s paste_from_selection
-# map shift+insert paste_from_selection
-
-#: Pass selection to program
-
-# map kitty_mod+o pass_selection_to_program
-
-#:: You can also pass the contents of the current selection to any
-#:: program with pass_selection_to_program. By default, the system's
-#:: open program is used, but you can specify your own, the selection
-#:: will be passed as a command line argument to the program. For
-#:: example::
-
-#:: map kitty_mod+o pass_selection_to_program firefox
-
-#:: You can pass the current selection to a terminal program running
-#:: in a new kitty window, by using the @selection placeholder::
-
-#:: map kitty_mod+y new_window less @selection
-
-#: }}}
-
-#: Scrolling {{{
-
-#: Scroll line up
-
-# map kitty_mod+up scroll_line_up
-# map kitty_mod+k scroll_line_up
-# map opt+cmd+page_up scroll_line_up
-# map cmd+up scroll_line_up
-
-#: Scroll line down
-
-# map kitty_mod+down scroll_line_down
-# map kitty_mod+j scroll_line_down
-# map opt+cmd+page_down scroll_line_down
-# map cmd+down scroll_line_down
-
-#: Scroll page up
-
-# map kitty_mod+page_up scroll_page_up
-# map cmd+page_up scroll_page_up
-
-#: Scroll page down
-
-# map kitty_mod+page_down scroll_page_down
-# map cmd+page_down scroll_page_down
-
-#: Scroll to top
-
-# map kitty_mod+home scroll_home
-# map cmd+home scroll_home
-
-#: Scroll to bottom
-
-# map kitty_mod+end scroll_end
-# map cmd+end scroll_end
-
-#: Scroll to previous shell prompt
-
-# map kitty_mod+z scroll_to_prompt -1
-
-#:: Use a parameter of 0 for scroll_to_prompt to scroll to the last
-#:: jumped to or the last clicked position. Requires shell
-#:: integration
-#:: to work.
-
-#: Scroll to next shell prompt
-
-# map kitty_mod+x scroll_to_prompt 1
-
-#: Browse scrollback buffer in pager
-
-# map kitty_mod+h show_scrollback
-
-#:: You can pipe the contents of the current screen and history
-#:: buffer as STDIN to an arbitrary program using launch --stdin-
-#:: source. For example, the following opens the scrollback buffer in
-#:: less in an overlay window::
-
-#:: map f1 launch --stdin-source=@screen_scrollback --stdin-add-formatting --type=overlay less +G -R
-
-#:: For more details on piping screen and buffer contents to external
-#:: programs, see launch .
-
-#: Browse output of the last shell command in pager
-
-# map kitty_mod+g show_last_command_output
-
-#:: You can also define additional shortcuts to get the command
-#:: output. For example, to get the first command output on screen::
-
-#:: map f1 show_first_command_output_on_screen
-
-#:: To get the command output that was last accessed by a keyboard
-#:: action or mouse action::
-
-#:: map f1 show_last_visited_command_output
-
-#:: You can pipe the output of the last command run in the shell
-#:: using the launch action. For example, the following opens the
-#:: output in less in an overlay window::
-
-#:: map f1 launch --stdin-source=@last_cmd_output --stdin-add-formatting --type=overlay less +G -R
-
-#:: To get the output of the first command on the screen, use
-#:: @first_cmd_output_on_screen. To get the output of the last jumped
-#:: to command, use @last_visited_cmd_output.
-
-#:: Requires shell integration
-#:: to work.
-
-#: }}}
-
-#: Window management {{{
-
-#: New window
-
-# map kitty_mod+enter new_window
-# map cmd+enter new_window
-
-#:: You can open a new kitty window running an arbitrary program, for
-#:: example::
-
-#:: map kitty_mod+y launch mutt
-
-#:: You can open a new window with the current working directory set
-#:: to the working directory of the current window using::
-
-#:: map ctrl+alt+enter launch --cwd=current
-
-#:: You can open a new window that is allowed to control kitty via
-#:: the kitty remote control facility with launch --allow-remote-
-#:: control. Any programs running in that window will be allowed to
-#:: control kitty. For example::
-
-#:: map ctrl+enter launch --allow-remote-control some_program
-
-#:: You can open a new window next to the currently active window or
-#:: as the first window, with::
-
-#:: map ctrl+n launch --location=neighbor
-#:: map ctrl+f launch --location=first
-
-#:: For more details, see launch
-#:: .
-
-#: New OS window
-
-# map kitty_mod+n new_os_window
-# map cmd+n new_os_window
-
-#:: Works like new_window above, except that it opens a top-level OS
-#:: window. In particular you can use new_os_window_with_cwd to open
-#:: a window with the current working directory.
-
-#: Close window
-
-# map kitty_mod+w close_window
-# map shift+cmd+d close_window
-
-#: Next window
-
-# map kitty_mod+] next_window
-
-#: Previous window
-
-# map kitty_mod+[ previous_window
-
-#: Move window forward
-
-# map kitty_mod+f move_window_forward
-
-#: Move window backward
-
-# map kitty_mod+b move_window_backward
-
-#: Move window to top
-
-# map kitty_mod+` move_window_to_top
-
-#: Start resizing window
-
-# map kitty_mod+r start_resizing_window
-# map cmd+r start_resizing_window
-
-#: First window
-
-# map kitty_mod+1 first_window
-# map cmd+1 first_window
-
-#: Second window
-
-# map kitty_mod+2 second_window
-# map cmd+2 second_window
-
-#: Third window
-
-# map kitty_mod+3 third_window
-# map cmd+3 third_window
-
-#: Fourth window
-
-# map kitty_mod+4 fourth_window
-# map cmd+4 fourth_window
-
-#: Fifth window
-
-# map kitty_mod+5 fifth_window
-# map cmd+5 fifth_window
-
-#: Sixth window
-
-# map kitty_mod+6 sixth_window
-# map cmd+6 sixth_window
-
-#: Seventh window
-
-# map kitty_mod+7 seventh_window
-# map cmd+7 seventh_window
-
-#: Eighth window
-
-# map kitty_mod+8 eighth_window
-# map cmd+8 eighth_window
-
-#: Ninth window
-
-# map kitty_mod+9 ninth_window
-# map cmd+9 ninth_window
-
-#: Tenth window
-
-# map kitty_mod+0 tenth_window
-
-#: Visually select and focus window
-
-# map kitty_mod+f7 focus_visible_window
-
-#:: Display overlay numbers and alphabets on the window, and switch
-#:: the focus to the window when you press the key. When there are
-#:: only two windows, the focus will be switched directly without
-#:: displaying the overlay. You can change the overlay characters and
-#:: their order with option visual_window_select_characters.
-
-#: Visually swap window with another
-
-# map kitty_mod+f8 swap_with_window
-
-#:: Works like focus_visible_window above, but swaps the window.
-
-#: }}}
-
-#: Tab management {{{
-
-#: Next tab
-
-# map kitty_mod+right next_tab
-# map shift+cmd+] next_tab
-# map ctrl+tab next_tab
-
-#: Previous tab
-
-# map kitty_mod+left previous_tab
-# map shift+cmd+[ previous_tab
-# map ctrl+shift+tab previous_tab
-
-#: New tab
-
-# map kitty_mod+t new_tab
-# map cmd+t new_tab
-
-#: Close tab
-
-# map kitty_mod+q close_tab
-# map cmd+w close_tab
-
-#: Close OS window
-
-# map shift+cmd+w close_os_window
-
-#: Move tab forward
-
-# map kitty_mod+. move_tab_forward
-
-#: Move tab backward
-
-# map kitty_mod+, move_tab_backward
-
-#: Set tab title
-
-# map kitty_mod+alt+t set_tab_title
-# map shift+cmd+i set_tab_title
-
-
-#: You can also create shortcuts to go to specific tabs, with 1 being
-#: the first tab, 2 the second tab and -1 being the previously active
-#: tab, and any number larger than the last tab being the last tab::
-
-#: map ctrl+alt+1 goto_tab 1
-#: map ctrl+alt+2 goto_tab 2
-
-#: Just as with new_window above, you can also pass the name of
-#: arbitrary commands to run when using new_tab and new_tab_with_cwd.
-#: Finally, if you want the new tab to open next to the current tab
-#: rather than at the end of the tabs list, use::
-
-#: map ctrl+t new_tab !neighbor [optional cmd to run]
-#: }}}
-
-#: Layout management {{{
-
-#: Next layout
-
-# map kitty_mod+l next_layout
-
-
-#: You can also create shortcuts to switch to specific layouts::
-
-#: map ctrl+alt+t goto_layout tall
-#: map ctrl+alt+s goto_layout stack
-
-#: Similarly, to switch back to the previous layout::
-
-#: map ctrl+alt+p last_used_layout
-
-#: There is also a toggle_layout action that switches to the named
-#: layout or back to the previous layout if in the named layout.
-#: Useful to temporarily "zoom" the active window by switching to the
-#: stack layout::
-
-#: map ctrl+alt+z toggle_layout stack
-#: }}}
-
-#: Font sizes {{{
-
-#: You can change the font size for all top-level kitty OS windows at
-#: a time or only the current one.
-
-#: Increase font size
-
-# map kitty_mod+equal change_font_size all +2.0
-# map kitty_mod+plus change_font_size all +2.0
-# map kitty_mod+kp_add change_font_size all +2.0
-# map cmd+plus change_font_size all +2.0
-# map cmd+equal change_font_size all +2.0
-# map shift+cmd+equal change_font_size all +2.0
-
-#: Decrease font size
-
-# map kitty_mod+minus change_font_size all -2.0
-# map kitty_mod+kp_subtract change_font_size all -2.0
-# map cmd+minus change_font_size all -2.0
-# map shift+cmd+minus change_font_size all -2.0
-
-#: Reset font size
-
-# map kitty_mod+backspace change_font_size all 0
-# map cmd+0 change_font_size all 0
-
-
-#: To setup shortcuts for specific font sizes::
-
-#: map kitty_mod+f6 change_font_size all 10.0
-
-#: To setup shortcuts to change only the current OS window's font
-#: size::
-
-#: map kitty_mod+f6 change_font_size current 10.0
-#: }}}
-
-#: Select and act on visible text {{{
-
-#: Use the hints kitten to select text and either pass it to an
-#: external program or insert it into the terminal or copy it to the
-#: clipboard.
-
-#: Open URL
-
-# map kitty_mod+e open_url_with_hints
-
-#:: Open a currently visible URL using the keyboard. The program used
-#:: to open the URL is specified in open_url_with.
-
-#: Insert selected path
-
-# map kitty_mod+p>f kitten hints --type path --program -
-
-#:: Select a path/filename and insert it into the terminal. Useful,
-#:: for instance to run git commands on a filename output from a
-#:: previous git command.
-
-#: Open selected path
-
-# map kitty_mod+p>shift+f kitten hints --type path
-
-#:: Select a path/filename and open it with the default open program.
-
-#: Insert selected line
-
-# map kitty_mod+p>l kitten hints --type line --program -
-
-#:: Select a line of text and insert it into the terminal. Useful for
-#:: the output of things like: `ls -1`.
-
-#: Insert selected word
-
-# map kitty_mod+p>w kitten hints --type word --program -
-
-#:: Select words and insert into terminal.
-
-#: Insert selected hash
-
-# map kitty_mod+p>h kitten hints --type hash --program -
-
-#:: Select something that looks like a hash and insert it into the
-#:: terminal. Useful with git, which uses SHA1 hashes to identify
-#:: commits.
-
-#: Open the selected file at the selected line
-
-# map kitty_mod+p>n kitten hints --type linenum
-
-#:: Select something that looks like filename:linenum and open it in
-#:: your default editor at the specified line number.
-
-#: Open the selected hyperlink
-
-# map kitty_mod+p>y kitten hints --type hyperlink
-
-#:: Select a hyperlink (i.e. a URL that has been marked as such by
-#:: the terminal program, for example, by `ls --hyperlink=auto`).
-
-
-#: The hints kitten has many more modes of operation that you can map
-#: to different shortcuts. For a full description see hints kitten
-#: .
-#: }}}
-
-#: Miscellaneous {{{
-
-#: Show documentation
-
-# map kitty_mod+f1 show_kitty_doc overview
-
-#: Toggle fullscreen
-
-# map kitty_mod+f11 toggle_fullscreen
-# map ctrl+cmd+f toggle_fullscreen
-
-#: Toggle maximized
-
-# map kitty_mod+f10 toggle_maximized
-
-#: Toggle macOS secure keyboard entry
-
-# map opt+cmd+s toggle_macos_secure_keyboard_entry
-
-#: Unicode input
-
-# map kitty_mod+u kitten unicode_input
-# map ctrl+cmd+space kitten unicode_input
-
-#: Edit config file
-
-# map kitty_mod+f2 edit_config_file
-# map cmd+, edit_config_file
-
-#: Open the kitty command shell
-
-# map kitty_mod+escape kitty_shell window
-
-#:: Open the kitty shell in a new window / tab / overlay / os_window
-#:: to control kitty using commands.
-
-#: Increase background opacity
-
-# map kitty_mod+a>m set_background_opacity +0.1
-
-#: Decrease background opacity
-
-# map kitty_mod+a>l set_background_opacity -0.1
-
-#: Make background fully opaque
-
-# map kitty_mod+a>1 set_background_opacity 1
-
-#: Reset background opacity
-
-# map kitty_mod+a>d set_background_opacity default
-
-#: Reset the terminal
-
-# map kitty_mod+delete clear_terminal reset active
-# map opt+cmd+r clear_terminal reset active
-
-#:: You can create shortcuts to clear/reset the terminal. For
-#:: example::
-
-#:: # Reset the terminal
-#:: map f1 clear_terminal reset active
-#:: # Clear the terminal screen by erasing all contents
-#:: map f1 clear_terminal clear active
-#:: # Clear the terminal scrollback by erasing it
-#:: map f1 clear_terminal scrollback active
-#:: # Scroll the contents of the screen into the scrollback
-#:: map f1 clear_terminal scroll active
-#:: # Clear everything on screen up to the line with the cursor or the start of the current prompt (needs shell integration)
-#:: map f1 clear_terminal to_cursor active
-#:: # Same as above except cleared lines are moved into scrollback
-#:: map f1 clear_terminal to_cursor_scroll active
-
-#:: If you want to operate on all kitty windows instead of just the
-#:: current one, use all instead of active.
-
-#:: Some useful functions that can be defined in the shell rc files
-#:: to perform various kinds of clearing of the current window:
-
-#:: .. code-block:: sh
-
-#:: clear-only-screen() {
-#:: printf "\e[H\e[2J"
-#:: }
-
-#:: clear-screen-and-scrollback() {
-#:: printf "\e[H\e[3J"
-#:: }
-
-#:: clear-screen-saving-contents-in-scrollback() {
-#:: printf "\e[H\e[22J"
-#:: }
-
-#:: For instance, using these escape codes, it is possible to remap
-#:: Ctrl+L to both scroll the current screen contents into the
-#:: scrollback buffer and clear the screen, instead of just clearing
-#:: the screen. For ZSH, in ~/.zshrc, add:
-
-#:: .. code-block:: zsh
-
-#:: ctrl_l() {
-#:: builtin print -rn -- $'\r\e[0J\e[H\e[22J' >"$TTY"
-#:: builtin zle .reset-prompt
-#:: builtin zle -R
-#:: }
-#:: zle -N ctrl_l
-#:: bindkey '^l' ctrl_l
-
-#:: Alternatively, you can just add map ctrl+l clear_terminal
-#:: to_cursor_scroll active to kitty.conf which works with no changes
-#:: to the shell rc files, but only clears up to the prompt, it does
-#:: not clear anytext at the prompt itself.
-
-#: Clear up to cursor line
-
-# map cmd+k clear_terminal to_cursor active
-
-#: Reload kitty.conf
-
-# map kitty_mod+f5 load_config_file
-# map ctrl+cmd+, load_config_file
-
-#:: Reload kitty.conf, applying any changes since the last time it
-#:: was loaded. Note that a handful of options cannot be dynamically
-#:: changed and require a full restart of kitty. Particularly, when
-#:: changing shortcuts for actions located on the macOS global menu
-#:: bar, a full restart is needed. You can also map a keybinding to
-#:: load a different config file, for example::
-
-#:: map f5 load_config /path/to/alternative/kitty.conf
-
-#:: Note that all options from the original kitty.conf are discarded,
-#:: in other words the new configuration *replace* the old ones.
-
-#: Debug kitty configuration
-
-# map kitty_mod+f6 debug_config
-# map opt+cmd+, debug_config
-
-#:: Show details about exactly what configuration kitty is running
-#:: with and its host environment. Useful for debugging issues.
-
-#: Send arbitrary text on key presses
-
-#:: E.g. map ctrl+shift+alt+h send_text all Hello World
-
-#:: You can tell kitty to send arbitrary (UTF-8) encoded text to the
-#:: client program when pressing specified shortcut keys. For
-#:: example::
-
-#:: map ctrl+alt+a send_text all Special text
-
-#:: This will send "Special text" when you press the Ctrl+Alt+A key
-#:: combination. The text to be sent decodes ANSI C escapes
-#:: so you can use escapes like \e to send control
-#:: codes or \u21fb to send Unicode characters (or you can just input
-#:: the Unicode characters directly as UTF-8 text). You can use
-#:: `kitten show_key` to get the key escape codes you want to
-#:: emulate.
-
-#:: The first argument to send_text is the keyboard modes in which to
-#:: activate the shortcut. The possible values are normal,
-#:: application, kitty or a comma separated combination of them. The
-#:: modes normal and application refer to the DECCKM cursor key mode
-#:: for terminals, and kitty refers to the kitty extended keyboard
-#:: protocol. The special value all means all of them.
-
-#:: Some more examples::
-
-#:: # Output a word and move the cursor to the start of the line (like typing and pressing Home)
-#:: map ctrl+alt+a send_text normal Word\e[H
-#:: map ctrl+alt+a send_text application Word\eOH
-#:: # Run a command at a shell prompt (like typing the command and pressing Enter)
-#:: map ctrl+alt+a send_text normal,application some command with arguments\r
-
-#: Open kitty Website
-
-# map shift+cmd+/ open_url https://sw.kovidgoyal.net/kitty/
-
-#: Hide macOS kitty application
-
-# map cmd+h hide_macos_app
-
-#: Hide macOS other applications
-
-# map opt+cmd+h hide_macos_other_apps
-
-#: Minimize macOS window
-
-# map cmd+m minimize_macos_window
-
-#: Quit kitty
-
-# map cmd+q quit
-
-#: }}}
-
-#: }}}
diff --git a/.config/neofetch/ascii/qa.txt b/.config/neofetch/ascii/qa.txt
new file mode 100644
index 0000000..a1b2a7c
--- /dev/null
+++ b/.config/neofetch/ascii/qa.txt
@@ -0,0 +1,12 @@
+ ### x_x Bugs fleeing x_x ###
+ Debug the Whale
+ ## ===
+ ## ## ===
+ ## ## ## ===
+ ## ## ## ## ## ===
+ /"""""""""""""""""\___/ ===
+~~~{~~CATCH THE BUGWAHLE~~ / ===- ~~~
+ \______ o __/
+ \ \ __/
+ \____\_______/
+ [BUG HUNTER]
diff --git a/.config/neofetch/config-backup.conf b/.config/neofetch/config-backup.conf
new file mode 100644
index 0000000..6a44721
--- /dev/null
+++ b/.config/neofetch/config-backup.conf
@@ -0,0 +1,885 @@
+# See this wiki page for more info:
+# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
+print_info() {
+ info title
+ info underline
+
+ # info "Host" model
+ # info "Packages" packages
+ # info "Resolution" resolution
+ # info "DE" de
+ # info "WM" wm
+ # info "WM Theme" wm_theme
+ # info "Theme" theme
+ # info "Icons" icons
+ # info "Terminal" term
+ # info "Terminal Font" term_font
+
+ info "OS" distro
+ info "Kernel" kernel
+ info "Uptime" uptime
+ info "Shell" shell
+ info "CPU" cpu
+ info "GPU" gpu
+ info "Memory" memory
+ info "Disk" disk
+
+ command -v docker >/dev/null && prin "Docker" "$(docker --version | cut -d' ' -f3 | tr -d ',')"
+ command -v kubectl >/dev/null && prin "Kubectl" "$(kubectl version --client --output=yaml 2>/dev/null | grep gitVersion | cut -d' ' -f4)"
+ command -v go >/dev/null && prin "Go" "$(go version | cut -d' ' -f3)"
+ command -v python3 >/dev/null && prin "Python" "$(python3 --version | cut -d' ' -f2)"
+ command -v node >/dev/null && prin "Node" "$(node --version)"
+ # info "GPU Driver" gpu_driver # Linux/macOS only
+ # info "CPU Usage" cpu_usage
+ # info "Disk" disk
+ # info "Battery" battery
+ # info "Font" font
+ # info "Song" song
+ # [[ "$player" ]] && prin "Music Player" "$player"
+ # info "Local IP" local_ip
+ # info "Public IP" public_ip
+ # info "Users" users
+ # info "Locale" locale # This only works on glibc systems.
+
+ info cols
+}
+
+# Performance optimizations
+kernel_shorthand="on"
+distro_shorthand="off"
+os_arch="on"
+uptime_shorthand="on"
+memory_percent="on"
+memory_unit="gib"
+shell_path="off"
+shell_version="on"
+cpu_speed="on"
+cpu_cores="logical"
+cpu_temp="off" # Often not needed for DevOps
+speed_shorthand="on"
+
+# Title
+
+
+# Hide/Show Fully qualified domain name.
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --title_fqdn
+title_fqdn="off"
+
+
+# Kernel
+
+
+# Shorten the output of the kernel function.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --kernel_shorthand
+# Supports: Everything except *BSDs (except PacBSD and PC-BSD)
+#
+# Example:
+# on: '4.8.9-1-ARCH'
+# off: 'Linux 4.8.9-1-ARCH'
+kernel_shorthand="on"
+
+
+# Distro
+
+
+# Shorten the output of the distro function
+#
+# Default: 'off'
+# Values: 'on', 'tiny', 'off'
+# Flag: --distro_shorthand
+# Supports: Everything except Windows and Haiku
+distro_shorthand="off"
+
+# Show/Hide OS Architecture.
+# Show 'x86_64', 'x86' and etc in 'Distro:' output.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --os_arch
+#
+# Example:
+# on: 'Arch Linux x86_64'
+# off: 'Arch Linux'
+os_arch="on"
+
+
+# Uptime
+
+
+# Shorten the output of the uptime function
+#
+# Default: 'on'
+# Values: 'on', 'tiny', 'off'
+# Flag: --uptime_shorthand
+#
+# Example:
+# on: '2 days, 10 hours, 3 mins'
+# tiny: '2d 10h 3m'
+# off: '2 days, 10 hours, 3 minutes'
+uptime_shorthand="on"
+
+
+# Memory
+
+
+# Show memory pecentage in output.
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --memory_percent
+#
+# Example:
+# on: '1801MiB / 7881MiB (22%)'
+# off: '1801MiB / 7881MiB'
+memory_percent="off"
+
+# Change memory output unit.
+#
+# Default: 'mib'
+# Values: 'kib', 'mib', 'gib'
+# Flag: --memory_unit
+#
+# Example:
+# kib '1020928KiB / 7117824KiB'
+# mib '1042MiB / 6951MiB'
+# gib: ' 0.98GiB / 6.79GiB'
+memory_unit="mib"
+
+
+# Packages
+
+
+# Show/Hide Package Manager names.
+#
+# Default: 'tiny'
+# Values: 'on', 'tiny' 'off'
+# Flag: --package_managers
+#
+# Example:
+# on: '998 (pacman), 8 (flatpak), 4 (snap)'
+# tiny: '908 (pacman, flatpak, snap)'
+# off: '908'
+package_managers="on"
+
+
+# Shell
+
+
+# Show the path to $SHELL
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --shell_path
+#
+# Example:
+# on: '/bin/bash'
+# off: 'bash'
+shell_path="off"
+
+# Show $SHELL version
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --shell_version
+#
+# Example:
+# on: 'bash 4.4.5'
+# off: 'bash'
+shell_version="on"
+
+
+# CPU
+
+
+# CPU speed type
+#
+# Default: 'bios_limit'
+# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'.
+# Flag: --speed_type
+# Supports: Linux with 'cpufreq'
+# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value.
+speed_type="bios_limit"
+
+# CPU speed shorthand
+#
+# Default: 'off'
+# Values: 'on', 'off'.
+# Flag: --speed_shorthand
+# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz
+#
+# Example:
+# on: 'i7-6500U (4) @ 3.1GHz'
+# off: 'i7-6500U (4) @ 3.100GHz'
+speed_shorthand="off"
+
+# Enable/Disable CPU brand in output.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --cpu_brand
+#
+# Example:
+# on: 'Intel i7-6500U'
+# off: 'i7-6500U (4)'
+cpu_brand="on"
+
+# CPU Speed
+# Hide/Show CPU speed.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --cpu_speed
+#
+# Example:
+# on: 'Intel i7-6500U (4) @ 3.1GHz'
+# off: 'Intel i7-6500U (4)'
+cpu_speed="on"
+
+# CPU Cores
+# Display CPU cores in output
+#
+# Default: 'logical'
+# Values: 'logical', 'physical', 'off'
+# Flag: --cpu_cores
+# Support: 'physical' doesn't work on BSD.
+#
+# Example:
+# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores)
+# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores)
+# off: 'Intel i7-6500U @ 3.1GHz'
+cpu_cores="logical"
+
+# CPU Temperature
+# Hide/Show CPU temperature.
+# Note the temperature is added to the regular CPU function.
+#
+# Default: 'off'
+# Values: 'C', 'F', 'off'
+# Flag: --cpu_temp
+# Supports: Linux, BSD
+# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable
+# coretemp kernel module. This only supports newer Intel processors.
+#
+# Example:
+# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]'
+# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]'
+# off: 'Intel i7-6500U (4) @ 3.1GHz'
+cpu_temp="on"
+
+
+# GPU
+
+
+# Enable/Disable GPU Brand
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --gpu_brand
+#
+# Example:
+# on: 'AMD HD 7950'
+# off: 'HD 7950'
+gpu_brand="on"
+
+# Which GPU to display
+#
+# Default: 'all'
+# Values: 'all', 'dedicated', 'integrated'
+# Flag: --gpu_type
+# Supports: Linux
+#
+# Example:
+# all:
+# GPU1: AMD HD 7950
+# GPU2: Intel Integrated Graphics
+#
+# dedicated:
+# GPU1: AMD HD 7950
+#
+# integrated:
+# GPU1: Intel Integrated Graphics
+gpu_type="all"
+
+
+# Resolution
+
+
+# Display refresh rate next to each monitor
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --refresh_rate
+# Supports: Doesn't work on Windows.
+#
+# Example:
+# on: '1920x1080 @ 60Hz'
+# off: '1920x1080'
+refresh_rate="off"
+
+
+# Gtk Theme / Icons / Font
+
+
+# Shorten output of GTK Theme / Icons / Font
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --gtk_shorthand
+#
+# Example:
+# on: 'Numix, Adwaita'
+# off: 'Numix [GTK2], Adwaita [GTK3]'
+gtk_shorthand="off"
+
+
+# Enable/Disable gtk2 Theme / Icons / Font
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --gtk2
+#
+# Example:
+# on: 'Numix [GTK2], Adwaita [GTK3]'
+# off: 'Adwaita [GTK3]'
+gtk2="on"
+
+# Enable/Disable gtk3 Theme / Icons / Font
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --gtk3
+#
+# Example:
+# on: 'Numix [GTK2], Adwaita [GTK3]'
+# off: 'Numix [GTK2]'
+gtk3="on"
+
+
+# IP Address
+
+
+# Website to ping for the public IP
+#
+# Default: 'http://ident.me'
+# Values: 'url'
+# Flag: --ip_host
+public_ip_host="http://ident.me"
+
+# Public IP timeout.
+#
+# Default: '2'
+# Values: 'int'
+# Flag: --ip_timeout
+public_ip_timeout=2
+
+
+# Desktop Environment
+
+
+# Show Desktop Environment version
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --de_version
+de_version="on"
+
+
+# Disk
+
+
+# Which disks to display.
+# The values can be any /dev/sdXX, mount point or directory.
+# NOTE: By default we only show the disk info for '/'.
+#
+# Default: '/'
+# Values: '/', '/dev/sdXX', '/path/to/drive'.
+# Flag: --disk_show
+#
+# Example:
+# disk_show=('/' '/dev/sdb1'):
+# 'Disk (/): 74G / 118G (66%)'
+# 'Disk (/mnt/Videos): 823G / 893G (93%)'
+#
+# disk_show=('/'):
+# 'Disk (/): 74G / 118G (66%)'
+#
+disk_show=('/')
+
+# Disk subtitle.
+# What to append to the Disk subtitle.
+#
+# Default: 'mount'
+# Values: 'mount', 'name', 'dir', 'none'
+# Flag: --disk_subtitle
+#
+# Example:
+# name: 'Disk (/dev/sda1): 74G / 118G (66%)'
+# 'Disk (/dev/sdb2): 74G / 118G (66%)'
+#
+# mount: 'Disk (/): 74G / 118G (66%)'
+# 'Disk (/mnt/Local Disk): 74G / 118G (66%)'
+# 'Disk (/mnt/Videos): 74G / 118G (66%)'
+#
+# dir: 'Disk (/): 74G / 118G (66%)'
+# 'Disk (Local Disk): 74G / 118G (66%)'
+# 'Disk (Videos): 74G / 118G (66%)'
+#
+# none: 'Disk: 74G / 118G (66%)'
+# 'Disk: 74G / 118G (66%)'
+# 'Disk: 74G / 118G (66%)'
+disk_subtitle="mount"
+
+# Disk percent.
+# Show/Hide disk percent.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --disk_percent
+#
+# Example:
+# on: 'Disk (/): 74G / 118G (66%)'
+# off: 'Disk (/): 74G / 118G'
+disk_percent="on"
+
+
+# Song
+
+
+# Manually specify a music player.
+#
+# Default: 'auto'
+# Values: 'auto', 'player-name'
+# Flag: --music_player
+#
+# Available values for 'player-name':
+#
+# amarok
+# audacious
+# banshee
+# bluemindo
+# clementine
+# cmus
+# deadbeef
+# deepin-music
+# dragon
+# elisa
+# exaile
+# gnome-music
+# gmusicbrowser
+# gogglesmm
+# guayadeque
+# io.elementary.music
+# iTunes
+# juk
+# lollypop
+# mocp
+# mopidy
+# mpd
+# muine
+# netease-cloud-music
+# olivia
+# playerctl
+# pogo
+# pragha
+# qmmp
+# quodlibet
+# rhythmbox
+# sayonara
+# smplayer
+# spotify
+# strawberry
+# tauonmb
+# tomahawk
+# vlc
+# xmms2d
+# xnoise
+# yarock
+music_player="auto"
+
+# Format to display song information.
+#
+# Default: '%artist% - %album% - %title%'
+# Values: '%artist%', '%album%', '%title%'
+# Flag: --song_format
+#
+# Example:
+# default: 'Song: Jet - Get Born - Sgt Major'
+song_format="%artist% - %album% - %title%"
+
+# Print the Artist, Album and Title on separate lines
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --song_shorthand
+#
+# Example:
+# on: 'Artist: The Fratellis'
+# 'Album: Costello Music'
+# 'Song: Chelsea Dagger'
+#
+# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger'
+song_shorthand="off"
+
+# 'mpc' arguments (specify a host, password etc).
+#
+# Default: ''
+# Example: mpc_args=(-h HOST -P PASSWORD)
+mpc_args=()
+
+
+# Text Colors
+
+
+# Text Colors
+#
+# Default: 'distro'
+# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
+# Flag: --colors
+#
+# Each number represents a different part of the text in
+# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info'
+#
+# Example:
+# colors=(distro) - Text is colored based on Distro colors.
+# colors=(4 6 1 8 8 6) - Text is colored in the order above.
+colors=(distro)
+
+
+# Text Options
+
+
+# Toggle bold text
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --bold
+bold="on"
+
+# Enable/Disable Underline
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --underline
+underline_enabled="on"
+
+# Underline character
+#
+# Default: '-'
+# Values: 'string'
+# Flag: --underline_char
+underline_char="-"
+
+
+# Info Separator
+# Replace the default separator with the specified string.
+#
+# Default: ':'
+# Flag: --separator
+#
+# Example:
+# separator="->": 'Shell-> bash'
+# separator=" =": 'WM = dwm'
+separator=":"
+
+
+# Color Blocks
+
+
+# Color block range
+# The range of colors to print.
+#
+# Default: '0', '15'
+# Values: 'num'
+# Flag: --block_range
+#
+# Example:
+#
+# Display colors 0-7 in the blocks. (8 colors)
+# neofetch --block_range 0 7
+#
+# Display colors 0-15 in the blocks. (16 colors)
+# neofetch --block_range 0 15
+block_range=(0 15)
+
+# Toggle color blocks
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --color_blocks
+color_blocks="on"
+
+# Color block width in spaces
+#
+# Default: '3'
+# Values: 'num'
+# Flag: --block_width
+block_width=3
+
+# Color block height in lines
+#
+# Default: '1'
+# Values: 'num'
+# Flag: --block_height
+block_height=1
+
+# Color Alignment
+#
+# Default: 'auto'
+# Values: 'auto', 'num'
+# Flag: --col_offset
+#
+# Number specifies how far from the left side of the terminal (in spaces) to
+# begin printing the columns, in case you want to e.g. center them under your
+# text.
+# Example:
+# col_offset="auto" - Default behavior of neofetch
+# col_offset=7 - Leave 7 spaces then print the colors
+col_offset="auto"
+
+# Progress Bars
+
+
+# Bar characters
+#
+# Default: '-', '='
+# Values: 'string', 'string'
+# Flag: --bar_char
+#
+# Example:
+# neofetch --bar_char 'elapsed' 'total'
+# neofetch --bar_char '-' '='
+bar_char_elapsed="-"
+bar_char_total="="
+
+# Toggle Bar border
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --bar_border
+bar_border="on"
+
+# Progress bar length in spaces
+# Number of chars long to make the progress bars.
+#
+# Default: '15'
+# Values: 'num'
+# Flag: --bar_length
+bar_length=15
+
+# Progress bar colors
+# When set to distro, uses your distro's logo colors.
+#
+# Default: 'distro', 'distro'
+# Values: 'distro', 'num'
+# Flag: --bar_colors
+#
+# Example:
+# neofetch --bar_colors 3 4
+# neofetch --bar_colors distro 5
+bar_color_elapsed="distro"
+bar_color_total="distro"
+
+
+# Info display
+# Display a bar with the info.
+#
+# Default: 'off'
+# Values: 'bar', 'infobar', 'barinfo', 'off'
+# Flags: --cpu_display
+# --memory_display
+# --battery_display
+# --disk_display
+#
+# Example:
+# bar: '[---=======]'
+# infobar: 'info [---=======]'
+# barinfo: '[---=======] info'
+# off: 'info'
+cpu_display="off"
+memory_display="off"
+battery_display="off"
+disk_display="off"
+
+
+# Backend Settings
+
+
+# Image backend.
+#
+# Default: 'ascii'
+# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off',
+# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty'
+# Flag: --backend
+image_backend="ascii"
+
+# Image Source
+#
+# Which image or ascii file to display.
+#
+# Default: 'auto'
+# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/'
+# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")'
+# Flag: --source
+#
+# NOTE: 'auto' will pick the best image source for whatever image backend is used.
+# In ascii mode, distro ascii art will be used and in an image mode, your
+# wallpaper will be used.
+image_source="auto"
+
+
+# Ascii Options
+
+
+# Ascii distro
+# Which distro's ascii art to display.
+#
+# Default: 'auto'
+# Values: 'auto', 'distro_name'
+# Flag: --ascii_distro
+# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS",
+# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs,
+# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock,
+# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD,
+# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
+# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover,
+# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin,
+# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary,
+# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
+# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo,
+# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra,
+# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion,
+# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite,
+# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva,
+# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib,
+# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner,
+# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba,
+# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD,
+# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint,
+# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix,
+# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan,
+# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific,
+# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz,
+# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS,
+# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails,
+# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio,
+# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin,
+# and IRIX have ascii logos
+# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants.
+# Use '{distro name}_old' to use the old logos.
+# NOTE: Ubuntu has flavor variants.
+# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
+# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
+# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
+# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
+# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
+# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
+# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
+# postmarketOS, and Void have a smaller logo variant.
+# Use '{distro name}_small' to use the small variants.
+ascii_distro="auto"
+
+# Ascii Colors
+#
+# Default: 'distro'
+# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
+# Flag: --ascii_colors
+#
+# Example:
+# ascii_colors=(distro) - Ascii is colored based on Distro colors.
+# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors.
+ascii_colors=(distro)
+
+# Bold ascii logo
+# Whether or not to bold the ascii logo.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --ascii_bold
+ascii_bold="on"
+
+
+# Image Options
+
+
+# Image loop
+# Setting this to on will make neofetch redraw the image constantly until
+# Ctrl+C is pressed. This fixes display issues in some terminal emulators.
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --loop
+image_loop="off"
+
+# Thumbnail directory
+#
+# Default: '~/.cache/thumbnails/neofetch'
+# Values: 'dir'
+thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch"
+
+# Crop mode
+#
+# Default: 'normal'
+# Values: 'normal', 'fit', 'fill'
+# Flag: --crop_mode
+#
+# See this wiki page to learn about the fit and fill options.
+# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F
+crop_mode="normal"
+
+# Crop offset
+# Note: Only affects 'normal' crop mode.
+#
+# Default: 'center'
+# Values: 'northwest', 'north', 'northeast', 'west', 'center'
+# 'east', 'southwest', 'south', 'southeast'
+# Flag: --crop_offset
+crop_offset="center"
+
+# Image size
+# The image is half the terminal width by default.
+#
+# Default: 'auto'
+# Values: 'auto', '00px', '00%', 'none'
+# Flags: --image_size
+# --size
+image_size="auto"
+
+# Gap between image and text
+#
+# Default: '3'
+# Values: 'num', '-num'
+# Flag: --gap
+gap=3
+
+# Image offsets
+# Only works with the w3m backend.
+#
+# Default: '0'
+# Values: 'px'
+# Flags: --xoffset
+# --yoffset
+yoffset=0
+xoffset=0
+
+# Image background color
+# Only works with the w3m backend.
+#
+# Default: ''
+# Values: 'color', 'blue'
+# Flag: --bg_color
+background_color=
+
+
+# Misc Options
+
+# Stdout mode
+# Turn off all colors and disables image backend (ASCII/Image).
+# Useful for piping into another command.
+# Default: 'off'
+# Values: 'on', 'off'
+stdout="off"
diff --git a/.config/neofetch/config.conf b/.config/neofetch/config.conf
index 9d0ea00..4099174 100644
--- a/.config/neofetch/config.conf
+++ b/.config/neofetch/config.conf
@@ -1,864 +1,72 @@
-# See this wiki page for more info:
-# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
+# DevOps-focused neofetch config
+# ~/.config/neofetch/config.conf
+
print_info() {
info title
info underline
info "OS" distro
- info "Host" model
info "Kernel" kernel
info "Uptime" uptime
- info "Packages" packages
info "Shell" shell
- info "Resolution" resolution
- info "DE" de
- info "WM" wm
- info "WM Theme" wm_theme
- info "Theme" theme
- info "Icons" icons
- info "Terminal" term
- info "Terminal Font" term_font
info "CPU" cpu
- info "GPU" gpu
info "Memory" memory
-
- # info "GPU Driver" gpu_driver # Linux/macOS only
- # info "CPU Usage" cpu_usage
- # info "Disk" disk
- # info "Battery" battery
- # info "Font" font
- # info "Song" song
- # [[ "$player" ]] && prin "Music Player" "$player"
- # info "Local IP" local_ip
- # info "Public IP" public_ip
- # info "Users" users
- # info "Locale" locale # This only works on glibc systems.
+ info "Disk" disk
+
+ # DevOps tools (if available)
+ command -v docker >/dev/null && prin "Docker" "$(docker --version | cut -d' ' -f3 | tr -d ',')"
+ command -v kubectl >/dev/null && prin "Kubectl" "$(kubectl version --client --output=yaml 2>/dev/null | grep gitVersion | cut -d' ' -f4)"
+ command -v go >/dev/null && prin "Go" "$(go version | cut -d' ' -f3)"
+ command -v python3 >/dev/null && prin "Python" "$(python3 --version | cut -d' ' -f2)"
+ command -v node >/dev/null && prin "Node" "$(node --version)"
info cols
}
-# Title
-
-
-# Hide/Show Fully qualified domain name.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --title_fqdn
-title_fqdn="off"
-
-
-# Kernel
-
-
-# Shorten the output of the kernel function.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --kernel_shorthand
-# Supports: Everything except *BSDs (except PacBSD and PC-BSD)
-#
-# Example:
-# on: '4.8.9-1-ARCH'
-# off: 'Linux 4.8.9-1-ARCH'
+# Performance optimizations
kernel_shorthand="on"
-
-
-# Distro
-
-
-# Shorten the output of the distro function
-#
-# Default: 'off'
-# Values: 'on', 'tiny', 'off'
-# Flag: --distro_shorthand
-# Supports: Everything except Windows and Haiku
distro_shorthand="off"
-
-# Show/Hide OS Architecture.
-# Show 'x86_64', 'x86' and etc in 'Distro:' output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --os_arch
-#
-# Example:
-# on: 'Arch Linux x86_64'
-# off: 'Arch Linux'
os_arch="on"
-
-
-# Uptime
-
-
-# Shorten the output of the uptime function
-#
-# Default: 'on'
-# Values: 'on', 'tiny', 'off'
-# Flag: --uptime_shorthand
-#
-# Example:
-# on: '2 days, 10 hours, 3 mins'
-# tiny: '2d 10h 3m'
-# off: '2 days, 10 hours, 3 minutes'
uptime_shorthand="on"
-
-
-# Memory
-
-
-# Show memory pecentage in output.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --memory_percent
-#
-# Example:
-# on: '1801MiB / 7881MiB (22%)'
-# off: '1801MiB / 7881MiB'
-memory_percent="off"
-
-# Change memory output unit.
-#
-# Default: 'mib'
-# Values: 'kib', 'mib', 'gib'
-# Flag: --memory_unit
-#
-# Example:
-# kib '1020928KiB / 7117824KiB'
-# mib '1042MiB / 6951MiB'
-# gib: ' 0.98GiB / 6.79GiB'
-memory_unit="mib"
-
-
-# Packages
-
-
-# Show/Hide Package Manager names.
-#
-# Default: 'tiny'
-# Values: 'on', 'tiny' 'off'
-# Flag: --package_managers
-#
-# Example:
-# on: '998 (pacman), 8 (flatpak), 4 (snap)'
-# tiny: '908 (pacman, flatpak, snap)'
-# off: '908'
-package_managers="on"
-
-
-# Shell
-
-
-# Show the path to $SHELL
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --shell_path
-#
-# Example:
-# on: '/bin/bash'
-# off: 'bash'
+memory_percent="on"
+memory_unit="gib"
shell_path="off"
-
-# Show $SHELL version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --shell_version
-#
-# Example:
-# on: 'bash 4.4.5'
-# off: 'bash'
shell_version="on"
-
-
-# CPU
-
-
-# CPU speed type
-#
-# Default: 'bios_limit'
-# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'.
-# Flag: --speed_type
-# Supports: Linux with 'cpufreq'
-# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value.
-speed_type="bios_limit"
-
-# CPU speed shorthand
-#
-# Default: 'off'
-# Values: 'on', 'off'.
-# Flag: --speed_shorthand
-# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz
-#
-# Example:
-# on: 'i7-6500U (4) @ 3.1GHz'
-# off: 'i7-6500U (4) @ 3.100GHz'
-speed_shorthand="off"
-
-# Enable/Disable CPU brand in output.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_brand
-#
-# Example:
-# on: 'Intel i7-6500U'
-# off: 'i7-6500U (4)'
-cpu_brand="on"
-
-# CPU Speed
-# Hide/Show CPU speed.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --cpu_speed
-#
-# Example:
-# on: 'Intel i7-6500U (4) @ 3.1GHz'
-# off: 'Intel i7-6500U (4)'
cpu_speed="on"
-
-# CPU Cores
-# Display CPU cores in output
-#
-# Default: 'logical'
-# Values: 'logical', 'physical', 'off'
-# Flag: --cpu_cores
-# Support: 'physical' doesn't work on BSD.
-#
-# Example:
-# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores)
-# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores)
-# off: 'Intel i7-6500U @ 3.1GHz'
cpu_cores="logical"
+cpu_temp="off" # Often not needed for DevOps
+speed_shorthand="on"
-# CPU Temperature
-# Hide/Show CPU temperature.
-# Note the temperature is added to the regular CPU function.
-#
-# Default: 'off'
-# Values: 'C', 'F', 'off'
-# Flag: --cpu_temp
-# Supports: Linux, BSD
-# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable
-# coretemp kernel module. This only supports newer Intel processors.
-#
-# Example:
-# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]'
-# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]'
-# off: 'Intel i7-6500U (4) @ 3.1GHz'
-cpu_temp="on"
+# Disable unnecessary for DevOps
+# GPU info - not needed for servers/DevOps
+gpu_type="off"
-
-# GPU
-
-
-# Enable/Disable GPU Brand
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gpu_brand
-#
-# Example:
-# on: 'AMD HD 7950'
-# off: 'HD 7950'
-gpu_brand="on"
-
-# Which GPU to display
-#
-# Default: 'all'
-# Values: 'all', 'dedicated', 'integrated'
-# Flag: --gpu_type
-# Supports: Linux
-#
-# Example:
-# all:
-# GPU1: AMD HD 7950
-# GPU2: Intel Integrated Graphics
-#
-# dedicated:
-# GPU1: AMD HD 7950
-#
-# integrated:
-# GPU1: Intel Integrated Graphics
-gpu_type="all"
-
-
-# Resolution
-
-
-# Display refresh rate next to each monitor
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --refresh_rate
-# Supports: Doesn't work on Windows.
-#
-# Example:
-# on: '1920x1080 @ 60Hz'
-# off: '1920x1080'
-refresh_rate="off"
-
-
-# Gtk Theme / Icons / Font
-
-
-# Shorten output of GTK Theme / Icons / Font
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --gtk_shorthand
-#
-# Example:
-# on: 'Numix, Adwaita'
-# off: 'Numix [GTK2], Adwaita [GTK3]'
-gtk_shorthand="off"
-
-
-# Enable/Disable gtk2 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk2
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Adwaita [GTK3]'
-gtk2="on"
-
-# Enable/Disable gtk3 Theme / Icons / Font
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --gtk3
-#
-# Example:
-# on: 'Numix [GTK2], Adwaita [GTK3]'
-# off: 'Numix [GTK2]'
-gtk3="on"
-
-
-# IP Address
-
-
-# Website to ping for the public IP
-#
-# Default: 'http://ident.me'
-# Values: 'url'
-# Flag: --ip_host
-public_ip_host="http://ident.me"
-
-# Public IP timeout.
-#
-# Default: '2'
-# Values: 'int'
-# Flag: --ip_timeout
-public_ip_timeout=2
-
-
-# Desktop Environment
-
-
-# Show Desktop Environment version
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --de_version
-de_version="on"
-
-
-# Disk
-
-
-# Which disks to display.
-# The values can be any /dev/sdXX, mount point or directory.
-# NOTE: By default we only show the disk info for '/'.
-#
-# Default: '/'
-# Values: '/', '/dev/sdXX', '/path/to/drive'.
-# Flag: --disk_show
-#
-# Example:
-# disk_show=('/' '/dev/sdb1'):
-# 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 823G / 893G (93%)'
-#
-# disk_show=('/'):
-# 'Disk (/): 74G / 118G (66%)'
-#
+# Disk info - useful for DevOps
disk_show=('/')
-
-# Disk subtitle.
-# What to append to the Disk subtitle.
-#
-# Default: 'mount'
-# Values: 'mount', 'name', 'dir', 'none'
-# Flag: --disk_subtitle
-#
-# Example:
-# name: 'Disk (/dev/sda1): 74G / 118G (66%)'
-# 'Disk (/dev/sdb2): 74G / 118G (66%)'
-#
-# mount: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (/mnt/Local Disk): 74G / 118G (66%)'
-# 'Disk (/mnt/Videos): 74G / 118G (66%)'
-#
-# dir: 'Disk (/): 74G / 118G (66%)'
-# 'Disk (Local Disk): 74G / 118G (66%)'
-# 'Disk (Videos): 74G / 118G (66%)'
-#
-# none: 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-# 'Disk: 74G / 118G (66%)'
-disk_subtitle="mount"
-
-# Disk percent.
-# Show/Hide disk percent.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --disk_percent
-#
-# Example:
-# on: 'Disk (/): 74G / 118G (66%)'
-# off: 'Disk (/): 74G / 118G'
disk_percent="on"
-
-# Song
-
-
-# Manually specify a music player.
-#
-# Default: 'auto'
-# Values: 'auto', 'player-name'
-# Flag: --music_player
-#
-# Available values for 'player-name':
-#
-# amarok
-# audacious
-# banshee
-# bluemindo
-# clementine
-# cmus
-# deadbeef
-# deepin-music
-# dragon
-# elisa
-# exaile
-# gnome-music
-# gmusicbrowser
-# gogglesmm
-# guayadeque
-# io.elementary.music
-# iTunes
-# juk
-# lollypop
-# mocp
-# mopidy
-# mpd
-# muine
-# netease-cloud-music
-# olivia
-# playerctl
-# pogo
-# pragha
-# qmmp
-# quodlibet
-# rhythmbox
-# sayonara
-# smplayer
-# spotify
-# strawberry
-# tauonmb
-# tomahawk
-# vlc
-# xmms2d
-# xnoise
-# yarock
-music_player="auto"
-
-# Format to display song information.
-#
-# Default: '%artist% - %album% - %title%'
-# Values: '%artist%', '%album%', '%title%'
-# Flag: --song_format
-#
-# Example:
-# default: 'Song: Jet - Get Born - Sgt Major'
-song_format="%artist% - %album% - %title%"
-
-# Print the Artist, Album and Title on separate lines
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --song_shorthand
-#
-# Example:
-# on: 'Artist: The Fratellis'
-# 'Album: Costello Music'
-# 'Song: Chelsea Dagger'
-#
-# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger'
-song_shorthand="off"
-
-# 'mpc' arguments (specify a host, password etc).
-#
-# Default: ''
-# Example: mpc_args=(-h HOST -P PASSWORD)
-mpc_args=()
-
-
-# Text Colors
-
-
-# Text Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --colors
-#
-# Each number represents a different part of the text in
-# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info'
-#
-# Example:
-# colors=(distro) - Text is colored based on Distro colors.
-# colors=(4 6 1 8 8 6) - Text is colored in the order above.
+# Clean appearance
colors=(distro)
-
-
-# Text Options
-
-
-# Toggle bold text
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bold
bold="on"
-
-# Enable/Disable Underline
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --underline
underline_enabled="on"
-
-# Underline character
-#
-# Default: '-'
-# Values: 'string'
-# Flag: --underline_char
underline_char="-"
-
-
-# Info Separator
-# Replace the default separator with the specified string.
-#
-# Default: ':'
-# Flag: --separator
-#
-# Example:
-# separator="->": 'Shell-> bash'
-# separator=" =": 'WM = dwm'
separator=":"
-
-# Color Blocks
-
-
-# Color block range
-# The range of colors to print.
-#
-# Default: '0', '15'
-# Values: 'num'
-# Flag: --block_range
-#
-# Example:
-#
-# Display colors 0-7 in the blocks. (8 colors)
-# neofetch --block_range 0 7
-#
-# Display colors 0-15 in the blocks. (16 colors)
-# neofetch --block_range 0 15
-block_range=(0 15)
-
-# Toggle color blocks
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --color_blocks
-color_blocks="on"
-
-# Color block width in spaces
-#
-# Default: '3'
-# Values: 'num'
-# Flag: --block_width
-block_width=3
-
-# Color block height in lines
-#
-# Default: '1'
-# Values: 'num'
-# Flag: --block_height
-block_height=1
-
-# Color Alignment
-#
-# Default: 'auto'
-# Values: 'auto', 'num'
-# Flag: --col_offset
-#
-# Number specifies how far from the left side of the terminal (in spaces) to
-# begin printing the columns, in case you want to e.g. center them under your
-# text.
-# Example:
-# col_offset="auto" - Default behavior of neofetch
-# col_offset=7 - Leave 7 spaces then print the colors
-col_offset="auto"
-
-# Progress Bars
-
-
-# Bar characters
-#
-# Default: '-', '='
-# Values: 'string', 'string'
-# Flag: --bar_char
-#
-# Example:
-# neofetch --bar_char 'elapsed' 'total'
-# neofetch --bar_char '-' '='
-bar_char_elapsed="-"
-bar_char_total="="
-
-# Toggle Bar border
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --bar_border
-bar_border="on"
-
-# Progress bar length in spaces
-# Number of chars long to make the progress bars.
-#
-# Default: '15'
-# Values: 'num'
-# Flag: --bar_length
-bar_length=15
-
-# Progress bar colors
-# When set to distro, uses your distro's logo colors.
-#
-# Default: 'distro', 'distro'
-# Values: 'distro', 'num'
-# Flag: --bar_colors
-#
-# Example:
-# neofetch --bar_colors 3 4
-# neofetch --bar_colors distro 5
-bar_color_elapsed="distro"
-bar_color_total="distro"
-
-
-# Info display
-# Display a bar with the info.
-#
-# Default: 'off'
-# Values: 'bar', 'infobar', 'barinfo', 'off'
-# Flags: --cpu_display
-# --memory_display
-# --battery_display
-# --disk_display
-#
-# Example:
-# bar: '[---=======]'
-# infobar: 'info [---=======]'
-# barinfo: '[---=======] info'
-# off: 'info'
-cpu_display="off"
-memory_display="off"
-battery_display="off"
-disk_display="off"
-
-
-# Backend Settings
-
-
-# Image backend.
-#
-# Default: 'ascii'
-# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off',
-# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty'
-# Flag: --backend
+# ASCII settings
image_backend="ascii"
-
-# Image Source
-#
-# Which image or ascii file to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/'
-# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")'
-# Flag: --source
-#
-# NOTE: 'auto' will pick the best image source for whatever image backend is used.
-# In ascii mode, distro ascii art will be used and in an image mode, your
-# wallpaper will be used.
-image_source="auto"
-
-
-# Ascii Options
-
-
-# Ascii distro
-# Which distro's ascii art to display.
-#
-# Default: 'auto'
-# Values: 'auto', 'distro_name'
-# Flag: --ascii_distro
-# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS",
-# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs,
-# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock,
-# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD,
-# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
-# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover,
-# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin,
-# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary,
-# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
-# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo,
-# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra,
-# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion,
-# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite,
-# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva,
-# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib,
-# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner,
-# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba,
-# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD,
-# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint,
-# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix,
-# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan,
-# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific,
-# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz,
-# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS,
-# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails,
-# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio,
-# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin,
-# and IRIX have ascii logos
-# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants.
-# Use '{distro name}_old' to use the old logos.
-# NOTE: Ubuntu has flavor variants.
-# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
-# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
-# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
-# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
-# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
-# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
-# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
-# postmarketOS, and Void have a smaller logo variant.
-# Use '{distro name}_small' to use the small variants.
-ascii_distro="auto"
-
-# Ascii Colors
-#
-# Default: 'distro'
-# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
-# Flag: --ascii_colors
-#
-# Example:
-# ascii_colors=(distro) - Ascii is colored based on Distro colors.
-# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors.
-ascii_colors=(distro)
-
-# Bold ascii logo
-# Whether or not to bold the ascii logo.
-#
-# Default: 'on'
-# Values: 'on', 'off'
-# Flag: --ascii_bold
+image_source="$HOME/.config/neofetch/ascii/qa.txt"
+ascii_distro="off"
+# ascii_colors=(distro)
+ascii_colors=(4 6 4 6)
ascii_bold="on"
-# Image Options
-
-
-# Image loop
-# Setting this to on will make neofetch redraw the image constantly until
-# Ctrl+C is pressed. This fixes display issues in some terminal emulators.
-#
-# Default: 'off'
-# Values: 'on', 'off'
-# Flag: --loop
+# Disable image features for speed
image_loop="off"
+color_blocks="on"
+block_range=(0 7) # Smaller range for speed
+block_width=2
+block_height=1
-# Thumbnail directory
-#
-# Default: '~/.cache/thumbnails/neofetch'
-# Values: 'dir'
-thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch"
-
-# Crop mode
-#
-# Default: 'normal'
-# Values: 'normal', 'fit', 'fill'
-# Flag: --crop_mode
-#
-# See this wiki page to learn about the fit and fill options.
-# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F
-crop_mode="normal"
-
-# Crop offset
-# Note: Only affects 'normal' crop mode.
-#
-# Default: 'center'
-# Values: 'northwest', 'north', 'northeast', 'west', 'center'
-# 'east', 'southwest', 'south', 'southeast'
-# Flag: --crop_offset
-crop_offset="center"
-
-# Image size
-# The image is half the terminal width by default.
-#
-# Default: 'auto'
-# Values: 'auto', '00px', '00%', 'none'
-# Flags: --image_size
-# --size
-image_size="auto"
-
-# Gap between image and text
-#
-# Default: '3'
-# Values: 'num', '-num'
-# Flag: --gap
-gap=3
-
-# Image offsets
-# Only works with the w3m backend.
-#
-# Default: '0'
-# Values: 'px'
-# Flags: --xoffset
-# --yoffset
-yoffset=0
-xoffset=0
-
-# Image background color
-# Only works with the w3m backend.
-#
-# Default: ''
-# Values: 'color', 'blue'
-# Flag: --bg_color
-background_color=
-
-
-# Misc Options
-
-# Stdout mode
-# Turn off all colors and disables image backend (ASCII/Image).
-# Useful for piping into another command.
-# Default: 'off'
-# Values: 'on', 'off'
+# Fast execution
stdout="off"
diff --git a/.config/nvim.bak/.gitignore b/.config/nvim.bak/.gitignore
new file mode 100644
index 0000000..cc5457a
--- /dev/null
+++ b/.config/nvim.bak/.gitignore
@@ -0,0 +1,8 @@
+tt.*
+.tests
+doc/tags
+debug
+.repro
+foo.*
+*.log
+data
diff --git a/.config/nvim/.neoconf.json b/.config/nvim.bak/.neoconf.json
similarity index 100%
rename from .config/nvim/.neoconf.json
rename to .config/nvim.bak/.neoconf.json
diff --git a/.config/nvim/LICENSE b/.config/nvim.bak/LICENSE
similarity index 100%
rename from .config/nvim/LICENSE
rename to .config/nvim.bak/LICENSE
diff --git a/.config/nvim.bak/README.md b/.config/nvim.bak/README.md
new file mode 100644
index 0000000..185280b
--- /dev/null
+++ b/.config/nvim.bak/README.md
@@ -0,0 +1,4 @@
+# 💤 LazyVim
+
+A starter template for [LazyVim](https://github.com/LazyVim/LazyVim).
+Refer to the [documentation](https://lazyvim.github.io/installation) to get started.
diff --git a/.config/nvim.bak/init.lua b/.config/nvim.bak/init.lua
new file mode 100644
index 0000000..2514f9e
--- /dev/null
+++ b/.config/nvim.bak/init.lua
@@ -0,0 +1,2 @@
+-- bootstrap lazy.nvim, LazyVim and your plugins
+require("config.lazy")
diff --git a/.config/nvim.bak/lazy-lock.json b/.config/nvim.bak/lazy-lock.json
new file mode 100644
index 0000000..6aa7c78
--- /dev/null
+++ b/.config/nvim.bak/lazy-lock.json
@@ -0,0 +1,54 @@
+{
+ "LazyVim": { "branch": "main", "commit": "3f034d0a7f58031123300309f2efd3bb0356ee21" },
+ "SchemaStore.nvim": { "branch": "main", "commit": "c61a74033522c3efbb8465fe6e9c75b27f5c3667" },
+ "blink.cmp": { "branch": "main", "commit": "cb5e346d9e0efa7a3eee7fd4da0b690c48d2a98e" },
+ "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
+ "catppuccin": { "branch": "main", "commit": "5b5e3aef9ad7af84f463d17b5479f06b87d5c429" },
+ "code_runner.nvim": { "branch": "main", "commit": "cb9e1bc37c5e15a870f27730343f62ffd1d9c443" },
+ "conform.nvim": { "branch": "master", "commit": "eebc724d12c5579d733d1f801386e0ceb909d001" },
+ "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
+ "flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" },
+ "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" },
+ "gitsigns.nvim": { "branch": "main", "commit": "17ab794b6fce6fce768430ebc925347e349e1d60" },
+ "grug-far.nvim": { "branch": "main", "commit": "082f97122dd59d816a9a7b676d2b2f86a8ab6ed9" },
+ "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
+ "lazydev.nvim": { "branch": "main", "commit": "2367a6c0a01eb9edb0464731cc0fb61ed9ab9d2c" },
+ "lualine.nvim": { "branch": "master", "commit": "834a5817f7e2be22a7062620032d49c600c35fab" },
+ "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" },
+ "mason-lspconfig.nvim": { "branch": "main", "commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245" },
+ "mason-nvim-dap.nvim": { "branch": "main", "commit": "4c2cdc69d69fe00c15ae8648f7e954d99e5de3ea" },
+ "mason.nvim": { "branch": "main", "commit": "fc98833b6da5de5a9c5b1446ac541577059555be" },
+ "mini.ai": { "branch": "main", "commit": "e139eb1101beb0250fea322f8c07a42f0f175688" },
+ "mini.hipatterns": { "branch": "main", "commit": "e5083df391171dc9d8172645606f8496d9443374" },
+ "mini.icons": { "branch": "main", "commit": "397ed3807e96b59709ef3292f0a3e253d5c1dc0a" },
+ "mini.pairs": { "branch": "main", "commit": "69864a2efb36c030877421634487fd90db1e4298" },
+ "neo-tree.nvim": { "branch": "main", "commit": "73d63376352ac731379892e27ac7b3d9449148e3" },
+ "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" },
+ "none-ls.nvim": { "branch": "main", "commit": "6377e77dae38015d0a8c24852530098f1d8a24f6" },
+ "nui.nvim": { "branch": "main", "commit": "8d3bce9764e627b62b07424e0df77f680d47ffdb" },
+ "nvim-autopairs": { "branch": "master", "commit": "2a406cdd8c373ae7fe378a9e062a5424472bd8d8" },
+ "nvim-dap": { "branch": "master", "commit": "7aade9e99bef5f0735cf966e715b3ce45515d786" },
+ "nvim-dap-ui": { "branch": "master", "commit": "bc81f8d3440aede116f821114547a476b082b319" },
+ "nvim-dap-virtual-text": { "branch": "master", "commit": "df66808cd78b5a97576bbaeee95ed5ca385a9750" },
+ "nvim-lint": { "branch": "master", "commit": "e7b4ffa6ab763af012e38b21af2c9159f10d2d33" },
+ "nvim-lspconfig": { "branch": "master", "commit": "442e077e326ac467daf9cd63e72120fb450a850b" },
+ "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" },
+ "nvim-treesitter": { "branch": "master", "commit": "0e21ee8df6235511c02bab4a5b391d18e165a58d" },
+ "nvim-treesitter-context": { "branch": "master", "commit": "439789a9a8df9639ecd749bb3286b77117024a6f" },
+ "nvim-treesitter-textobjects": { "branch": "master", "commit": "698b5f805722254bca3c509591c1806d268b6c2f" },
+ "nvim-ts-autotag": { "branch": "main", "commit": "a1d526af391f6aebb25a8795cbc05351ed3620b5" },
+ "nvim-web-devicons": { "branch": "master", "commit": "57dfa947cc88cdf1baa2c7e13ed31edddd8fb1d1" },
+ "persistence.nvim": { "branch": "main", "commit": "166a79a55bfa7a4db3e26fc031b4d92af71d0b51" },
+ "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" },
+ "snacks.nvim": { "branch": "main", "commit": "bc0630e43be5699bb94dadc302c0d21615421d93" },
+ "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" },
+ "telescope.nvim": { "branch": "master", "commit": "a4ed82509cecc56df1c7138920a1aeaf246c0ac5" },
+ "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" },
+ "tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" },
+ "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" },
+ "ts-comments.nvim": { "branch": "main", "commit": "1bd9d0ba1d8b336c3db50692ffd0955fe1bb9f0c" },
+ "typescript-tools.nvim": { "branch": "master", "commit": "a4109c70e7d6a3a86f971cefea04ab6720582ba9" },
+ "undotree": { "branch": "master", "commit": "b951b87b46c34356d44aa71886aecf9dd7f5788a" },
+ "which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" },
+ "yanky.nvim": { "branch": "main", "commit": "98b9c21d3c06d79f68fd9d471dcc28fc6d2d72ef" }
+}
diff --git a/.config/nvim/lazyvim.json b/.config/nvim.bak/lazyvim.json
similarity index 54%
rename from .config/nvim/lazyvim.json
rename to .config/nvim.bak/lazyvim.json
index 6703327..6206f7e 100644
--- a/.config/nvim/lazyvim.json
+++ b/.config/nvim.bak/lazyvim.json
@@ -1,8 +1,8 @@
{
"extras": [
- "lazyvim.plugins.extras.lang.docker"
+
],
- "install_version": 7,
+ "install_version": 8,
"news": {
"NEWS.md": "10960"
},
diff --git a/.config/nvim.bak/lua/config/autocmds.lua b/.config/nvim.bak/lua/config/autocmds.lua
new file mode 100644
index 0000000..c400939
--- /dev/null
+++ b/.config/nvim.bak/lua/config/autocmds.lua
@@ -0,0 +1,35 @@
+-- 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")
+
+vim.api.nvim_create_autocmd("FileType", {
+ pattern = { "python" },
+ callback = function()
+ vim.opt_local.colorcolumn = "88" -- Black's default line length
+ vim.opt_local.tabstop = 4
+ vim.opt_local.shiftwidth = 4
+ end,
+})
+
+vim.api.nvim_create_autocmd("FileType", {
+ pattern = { "php" },
+ callback = function()
+ vim.opt_local.colorcolumn = "120"
+ vim.opt_local.tabstop = 4
+ vim.opt_local.shiftwidth = 4
+ end,
+})
+
+vim.api.nvim_create_autocmd("FileType", {
+ pattern = { "typescript", "javascript", "typescriptreact", "javascriptreact" },
+ callback = function()
+ vim.opt_local.colorcolumn = "80"
+ vim.opt_local.tabstop = 2
+ vim.opt_local.shiftwidth = 2
+ end,
+})
diff --git a/.config/nvim/lua/config/keymaps.lua b/.config/nvim.bak/lua/config/keymaps.lua
similarity index 69%
rename from .config/nvim/lua/config/keymaps.lua
rename to .config/nvim.bak/lua/config/keymaps.lua
index 5c40677..46d9684 100644
--- a/.config/nvim/lua/config/keymaps.lua
+++ b/.config/nvim.bak/lua/config/keymaps.lua
@@ -1,22 +1,16 @@
-- Keymaps are automatically loaded on the VeryLazy event
--- Docs: https://www.lazyvim.org/configuration/general
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
-- Add any additional keymaps here
-
-local Util = require("lazyvim.util")
+-- Keymaps are automatically loaded on the VeryLazy event
local function map(mode, lhs, rhs, opts)
local keys = require("lazy.core.handler").handlers.keys
- ---@cast keys LazyKeysHandler
- -- do not create the keymap if a lazy keys handler exists
if not keys.active[keys.parse({ lhs, mode = mode }).id] then
opts = opts or {}
opts.silent = opts.silent ~= false
- if opts.remap and not vim.g.vscode then
- opts.remap = nil
- end
vim.keymap.set(mode, lhs, rhs, opts)
end
end
+-- Nützliche Keymaps
map("n", "bo", "%bd|e#", { desc = "Close all buffers but the current one" })
diff --git a/.config/nvim.bak/lua/config/lazy.lua b/.config/nvim.bak/lua/config/lazy.lua
new file mode 100644
index 0000000..c225f35
--- /dev/null
+++ b/.config/nvim.bak/lua/config/lazy.lua
@@ -0,0 +1,61 @@
+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+if not vim.loop.fs_stat(lazypath) then
+ vim.fn.system({
+ "git",
+ "clone",
+ "--filter=blob:none",
+ "https://github.com/folke/lazy.nvim.git",
+ "--branch=stable",
+ lazypath,
+ })
+end
+vim.opt.rtp:prepend(lazypath)
+
+require("lazy").setup({
+ spec = {
+ -- LazyVim Kern
+ { "LazyVim/LazyVim", import = "lazyvim.plugins" },
+
+ -- Sprachunterstützung
+ { import = "lazyvim.plugins.extras.lang.typescript" },
+ { import = "lazyvim.plugins.extras.lang.json" },
+ { import = "lazyvim.plugins.extras.lang.docker" },
+ { import = "lazyvim.plugins.extras.lang.yaml" },
+ { import = "lazyvim.plugins.extras.lang.tailwind" },
+
+ -- Linting & Formatting
+ { import = "lazyvim.plugins.extras.linting.eslint" },
+ { import = "lazyvim.plugins.extras.formatting.prettier" },
+ { import = "lazyvim.plugins.extras.lsp.none-ls" },
+
+ -- Editor-Verbesserungen
+ -- { import = "lazyvim.plugins.extras.editor.mini-files" },
+ { import = "lazyvim.plugins.extras.coding.yanky" },
+ { import = "lazyvim.plugins.extras.util.mini-hipatterns" },
+
+ -- Debugging & Testing
+ { import = "lazyvim.plugins.extras.dap.core" },
+ -- { import = "lazyvim.plugins.extras.test.core" },
+
+ -- Benutzerdefinierte Plugins
+ { import = "plugins" },
+ },
+ defaults = {
+ lazy = false,
+ version = false,
+ },
+ install = { colorscheme = { "tokyonight", "catppuccin" } },
+ checker = { enabled = true },
+
+ performance = {
+ rtp = {
+ disabled_plugins = {
+ "gzip",
+ "tarPlugin",
+ "tohtml",
+ "tutor",
+ "zipPlugin",
+ },
+ },
+ },
+})
diff --git a/.config/nvim/lua/config/options.lua b/.config/nvim.bak/lua/config/options.lua
similarity index 57%
rename from .config/nvim/lua/config/options.lua
rename to .config/nvim.bak/lua/config/options.lua
index 336e021..e0eef8f 100644
--- a/.config/nvim/lua/config/options.lua
+++ b/.config/nvim.bak/lua/config/options.lua
@@ -1,12 +1,13 @@
-- Options are automatically loaded before lazy.nvim startup
--- Docs: https://www.lazyvim.org/configuration/general
-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
--- Add any additional options here
+--- Options are automatically loaded before lazy.nvim startup
-vim.opt.listchars = "tab:▸ ,trail:·,nbsp:␣,extends:❯,precedes:❮" -- show symbols for whitespace
-vim.opt.relativenumber = false -- relative line numbers
-vim.opt.scrolloff = 10 -- keep 20 lines above and below the cursor
+-- Allgemeine Einstellungen
+vim.opt.listchars = "tab:▸ ,trail:·,nbsp:␣,extends:❯,precedes:❮"
+vim.opt.relativenumber = false
+vim.opt.scrolloff = 10
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
vim.opt.expandtab = true
vim.opt.smartindent = true
+vim.lsp.inlay_hint.enable = false
diff --git a/.config/nvim.bak/lua/plugins/coding.lua b/.config/nvim.bak/lua/plugins/coding.lua
new file mode 100644
index 0000000..7bc517a
--- /dev/null
+++ b/.config/nvim.bak/lua/plugins/coding.lua
@@ -0,0 +1,43 @@
+return {
+ -- Code-Runner
+ {
+ "CRAG666/code_runner.nvim",
+ config = function()
+ require("code_runner").setup({
+ focus = false,
+ filetype = {
+ python = "python3 -u",
+ typescript = "deno run",
+ javascript = "node",
+ php = "php",
+ },
+ })
+ end,
+ keys = { { "rf", "RunFile term", desc = "Run file" } },
+ },
+
+ -- TypeScript-Tooling
+ {
+ "pmizio/typescript-tools.nvim",
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ "neovim/nvim-lspconfig",
+ },
+ opts = {
+ settings = {
+ tsserver_file_preferences = {
+ importModuleSpecifierPreference = "relative",
+ },
+ },
+ },
+ },
+
+ -- Markdown-Vorschau
+ {
+ "iamcco/markdown-preview.nvim",
+ ft = "markdown",
+ build = function()
+ vim.fn["mkdp#util#install"]()
+ end,
+ },
+}
diff --git a/.config/nvim.bak/lua/plugins/colorscheme.lua b/.config/nvim.bak/lua/plugins/colorscheme.lua
new file mode 100644
index 0000000..66a704d
--- /dev/null
+++ b/.config/nvim.bak/lua/plugins/colorscheme.lua
@@ -0,0 +1,43 @@
+return {
+ -- Hauptfarbschema: Tokyo Night Storm
+ {
+ "folke/tokyonight.nvim",
+ lazy = false,
+ priority = 1000,
+ opts = {
+ style = "storm",
+ transparent = false,
+ styles = {
+ sidebars = "dark",
+ floats = "dark",
+ },
+ },
+ },
+
+ -- Alternative: Catppuccin
+ {
+ "catppuccin/nvim",
+ name = "catppuccin",
+ priority = 1000,
+ opts = {
+ flavour = "mocha",
+ transparent_background = false,
+ integrations = {
+ telescope = true,
+ gitsigns = true,
+ nvimtree = true,
+ indent_blankline = true,
+ which_key = true,
+ mini = true,
+ },
+ },
+ },
+
+ -- Aktiviere das Farbschema
+ {
+ "LazyVim/LazyVim",
+ opts = {
+ colorscheme = "tokyonight-storm",
+ },
+ },
+}
diff --git a/.config/nvim.bak/lua/plugins/lsp.lua b/.config/nvim.bak/lua/plugins/lsp.lua
new file mode 100644
index 0000000..7e3e1f4
--- /dev/null
+++ b/.config/nvim.bak/lua/plugins/lsp.lua
@@ -0,0 +1,191 @@
+return {
+ -- LSP-Konfiguration
+ {
+ "neovim/nvim-lspconfig",
+ opts = {
+ servers = {
+ -- Python
+ pyright = {},
+ ruff_lsp = {},
+
+ -- TypeScript/JavaScript
+ tsserver = {
+ settings = {
+ typescript = {
+ inlayHints = {
+ includeInlayParameterNameHints = "all",
+ includeInlayParameterNameHintsWhenArgumentMatchesName = false,
+ includeInlayFunctionParameterTypeHints = true,
+ includeInlayVariableTypeHints = true,
+ includeInlayPropertyDeclarationTypeHints = true,
+ includeInlayFunctionLikeReturnTypeHints = true,
+ },
+ },
+ javascript = {
+ inlayHints = {
+ includeInlayParameterNameHints = "all",
+ includeInlayParameterNameHintsWhenArgumentMatchesName = false,
+ includeInlayFunctionParameterTypeHints = true,
+ includeInlayVariableTypeHints = true,
+ includeInlayPropertyDeclarationTypeHints = true,
+ includeInlayFunctionLikeReturnTypeHints = true,
+ },
+ },
+ },
+ },
+
+ -- PHP
+ intelephense = {
+ settings = {
+ intelephense = {
+ stubs = {
+ "bcmath",
+ "bz2",
+ "Core",
+ "curl",
+ "date",
+ "dom",
+ "fileinfo",
+ "filter",
+ "gd",
+ "gettext",
+ "hash",
+ "iconv",
+ "imap",
+ "intl",
+ "json",
+ "libxml",
+ "mbstring",
+ "mysqli",
+ "oci8",
+ "openssl",
+ "pcntl",
+ "pcre",
+ "PDO",
+ "pdo_mysql",
+ "Phar",
+ "readline",
+ "redis",
+ "Reflection",
+ "session",
+ "SimpleXML",
+ "SPL",
+ "standard",
+ "tokenizer",
+ "xml",
+ "xmlreader",
+ "xmlwriter",
+ "zip",
+ "zlib",
+ "wordpress",
+ "woocommerce",
+ "wordpress-globals",
+ "wp-cli",
+ },
+ environment = {
+ includePaths = {},
+ },
+ files = {
+ maxSize = 5000000,
+ },
+ },
+ },
+ },
+
+ -- Docker
+ dockerls = {},
+ docker_compose_language_service = {},
+
+ -- YAML
+ yamlls = {
+ settings = {
+ yaml = {
+ schemaStore = {
+ enable = true,
+ url = "https://www.schemastore.org/api/json/catalog.json",
+ },
+ format = { enable = true },
+ validate = true,
+ },
+ },
+ },
+ },
+ },
+ },
+
+ -- Mason für einfache Tool-Installation
+ {
+ "williamboman/mason.nvim",
+ opts = function(_, opts)
+ opts.ensure_installed = opts.ensure_installed or {}
+ vim.list_extend(opts.ensure_installed, {
+ -- Python
+ "pyright",
+ "ruff-lsp",
+ "black",
+ "mypy",
+
+ -- TypeScript/JavaScript
+ "typescript-language-server",
+ "eslint-lsp",
+ "prettier",
+
+ -- PHP
+ "intelephense",
+ "php-cs-fixer",
+
+ -- Docker
+ "dockerfile-language-server",
+
+ -- YAML
+ "yaml-language-server",
+ "yamllint",
+ "yamlfix",
+
+ -- Neue Tools für alle Frameworks
+ "css-lsp",
+ "tailwindcss-language-server",
+ "vue-language-server",
+ "typescript-language-server",
+ "eslint-lsp",
+ "prettier",
+ "stylelint-lsp",
+ "phpactor",
+ })
+ end,
+ },
+
+ -- Formatierung
+ {
+ "stevearc/conform.nvim",
+ opts = {
+ formatters_by_ft = {
+ lua = { "stylua" },
+ python = { "black" },
+ typescript = { "prettier" },
+ javascript = { "prettier" },
+ typescriptreact = { "prettier" },
+ javascriptreact = { "prettier" },
+ php = { "php_cs_fixer" },
+ yaml = { "yamlfix" },
+ json = { "prettier" },
+ markdown = { "prettier" },
+ },
+ },
+ },
+
+ -- Linting
+ {
+ "mfussenegger/nvim-lint",
+ opts = {
+ linters_by_ft = {
+ python = { "mypy", "ruff" },
+ typescript = { "eslint" },
+ javascript = { "eslint" },
+ typescriptreact = { "eslint" },
+ javascriptreact = { "eslint" },
+ yaml = { "yamllint" },
+ },
+ },
+ },
+}
diff --git a/.config/nvim.bak/lua/plugins/neo-tree.lua b/.config/nvim.bak/lua/plugins/neo-tree.lua
new file mode 100644
index 0000000..7a7b117
--- /dev/null
+++ b/.config/nvim.bak/lua/plugins/neo-tree.lua
@@ -0,0 +1,54 @@
+return {
+ "nvim-neo-tree/neo-tree.nvim",
+ cmd = "Neotree",
+ priority = 950, -- Höhere Priorität für korrekte Initialisierung
+ lazy = false, -- Verhindert lazy-loading
+ config = function()
+ -- Stelle sicher, dass die Konfiguration direkt angewendet wird
+ require("neo-tree").setup({
+ sources = { "filesystem", "buffers", "git_status" },
+ filesystem = {
+ filtered_items = {
+ visible = true, -- Zeigt gefilterte Elemente an
+ hide_dotfiles = false, -- Versteckte Dateien anzeigen
+ hide_gitignored = false, -- Git-ignorierte Dateien anzeigen
+ always_show = {
+ ".gitignore",
+ ".env",
+ ".gitlab-ci.yml",
+ ".php-cs-fixer.php",
+ },
+ },
+ follow_current_file = {
+ enabled = true, -- Folgt der aktuellen Datei
+ },
+ use_libuv_file_watcher = true,
+ },
+ window = {
+ position = "right", -- Position explizit auf rechts setzen
+ width = 35, -- Breite des Explorers
+ mappings = {
+ [""] = "none", -- Deaktiviert die Space-Taste im Explorer
+ ["H"] = "toggle_hidden", -- Tastenkombination zum Umschalten versteckter Dateien
+ },
+ },
+ default_component_configs = {
+ indent = {
+ with_expanders = true,
+ },
+ },
+ })
+ -- Starte Neotree explizit nach der Konfiguration neu
+ vim.defer_fn(function()
+ vim.cmd("Neotree close")
+ vim.cmd("Neotree position=right")
+ end, 100)
+ end,
+ init = function()
+ -- Führe diese Konfiguration sofort aus
+ vim.g.neo_tree_remove_legacy_commands = 1
+ end,
+ keys = {
+ { "e", "Neotree toggle show position=right", desc = "Explorer (rechts)" },
+ },
+}
diff --git a/.config/nvim.bak/lua/plugins/telescope.lua b/.config/nvim.bak/lua/plugins/telescope.lua
new file mode 100644
index 0000000..a8352d8
--- /dev/null
+++ b/.config/nvim.bak/lua/plugins/telescope.lua
@@ -0,0 +1,27 @@
+return {
+ -- Telescope-Konfiguration
+ {
+ "nvim-telescope/telescope.nvim",
+ opts = {
+ defaults = {
+ file_ignore_patterns = {
+ "^.git/",
+ "^node_modules/",
+ "^vendor/",
+ "^.venv/",
+ "^__pycache__/",
+ },
+ },
+ },
+ dependencies = {
+ -- Fuzzy-Finder-Verbesserung
+ {
+ "nvim-telescope/telescope-fzf-native.nvim",
+ build = "make",
+ config = function()
+ require("telescope").load_extension("fzf")
+ end,
+ },
+ },
+ },
+}
diff --git a/.config/nvim.bak/lua/plugins/tools.lua b/.config/nvim.bak/lua/plugins/tools.lua
new file mode 100644
index 0000000..08787fe
--- /dev/null
+++ b/.config/nvim.bak/lua/plugins/tools.lua
@@ -0,0 +1,38 @@
+return {
+ -- Auto-Pairs für schnelleres Schreiben
+ {
+ "windwp/nvim-autopairs",
+ event = "InsertEnter",
+ opts = {
+ enable_check_bracket_line = true,
+ },
+ },
+
+ -- Diffview für Git-Diffs
+ {
+ "sindrets/diffview.nvim",
+ dependencies = {
+ { "nvim-lua/plenary.nvim" },
+ { "nvim-tree/nvim-web-devicons" },
+ },
+ config = function()
+ vim.opt.fillchars = "diff:░"
+ require("diffview").setup({
+ enhanced_diff_hl = true,
+ })
+ end,
+ keys = {
+ { "gdo", ":DiffviewOpen", desc = "Open Diffview" },
+ { "gdc", ":DiffviewClose", desc = "Close Diffview" },
+ },
+ },
+
+ -- Undotree für detaillierte Änderungshistorie
+ {
+ "mbbill/undotree",
+ cmd = "UndotreeToggle",
+ keys = {
+ { "fu", "UndotreeToggle", desc = "Undo tree" },
+ },
+ },
+}
diff --git a/.config/nvim.bak/lua/plugins/treesitter.lua b/.config/nvim.bak/lua/plugins/treesitter.lua
new file mode 100644
index 0000000..06b4e3d
--- /dev/null
+++ b/.config/nvim.bak/lua/plugins/treesitter.lua
@@ -0,0 +1,46 @@
+return {
+ {
+ "nvim-treesitter/nvim-treesitter",
+ opts = {
+ ensure_installed = {
+ "bash",
+ "css",
+ "dockerfile",
+ "html",
+ "javascript",
+ "json",
+ "lua",
+ "markdown",
+ "markdown_inline",
+ "php",
+ "python",
+ "regex",
+ "tsx",
+ "typescript",
+ "vim",
+ "yaml",
+ },
+ highlight = {
+ enable = true,
+ },
+ indent = {
+ enable = true,
+ },
+ autotag = {
+ enable = true,
+ },
+ },
+ },
+
+ -- Zusätzliche Treesitter-Erweiterungen
+ {
+ "nvim-treesitter/nvim-treesitter-context",
+ dependencies = { "nvim-treesitter/nvim-treesitter" },
+ },
+
+ -- Automatisches Hinzufügen/Schließen von HTML/JSX-Tags
+ {
+ "windwp/nvim-ts-autotag",
+ config = true,
+ },
+}
diff --git a/.config/nvim/stylua.toml b/.config/nvim.bak/stylua.toml
similarity index 100%
rename from .config/nvim/stylua.toml
rename to .config/nvim.bak/stylua.toml
diff --git a/.config/nvim/.DS_Store b/.config/nvim/.DS_Store
deleted file mode 100644
index 7ef7afd..0000000
Binary files a/.config/nvim/.DS_Store and /dev/null differ
diff --git a/.config/nvim/.github/ISSUE_TEMPLATE/bug_report.md b/.config/nvim/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..86598b8
--- /dev/null
+++ b/.config/nvim/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,35 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+
+
+## Before Reporting an Issue
+- I have read the kickstart.nvim README.md.
+- I have read the appropriate plugin's documentation.
+- I have searched that this issue has not been reported before.
+
+- [ ] **By checking this, I confirm that the above steps are completed. I understand leaving this unchecked will result in this report being closed immediately.**
+
+## Describe the bug
+
+
+## To Reproduce
+
+1. ...
+
+## Desktop
+
+- OS:
+- Terminal:
+
+## Neovim Version
+
+
+```
+```
diff --git a/.config/nvim/.github/pull_request_template.md b/.config/nvim/.github/pull_request_template.md
new file mode 100644
index 0000000..f401c9f
--- /dev/null
+++ b/.config/nvim/.github/pull_request_template.md
@@ -0,0 +1,8 @@
+***************************************************************************
+**NOTE**
+Please verify that the `base repository` above has the intended destination!
+Github by default opens Pull Requests against the parent of a forked repository.
+If this is your personal fork and you didn't intend to open a PR for contribution
+to the original project then adjust the `base repository` accordingly.
+**************************************************************************
+
diff --git a/.config/nvim/.github/workflows/stylua.yml b/.config/nvim/.github/workflows/stylua.yml
new file mode 100644
index 0000000..75db6c3
--- /dev/null
+++ b/.config/nvim/.github/workflows/stylua.yml
@@ -0,0 +1,21 @@
+# Check Lua Formatting
+name: Check Lua Formatting
+on: pull_request_target
+
+jobs:
+ stylua-check:
+ if: github.repository == 'nvim-lua/kickstart.nvim'
+ name: Stylua Check
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v2
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
+ - name: Stylua Check
+ uses: JohnnyMorganz/stylua-action@v3
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ version: latest
+ args: --check .
+
diff --git a/.config/nvim/.gitignore b/.config/nvim/.gitignore
index cc5457a..005b535 100644
--- a/.config/nvim/.gitignore
+++ b/.config/nvim/.gitignore
@@ -1,8 +1,7 @@
-tt.*
-.tests
-doc/tags
-debug
-.repro
-foo.*
-*.log
-data
+tags
+test.sh
+.luarc.json
+nvim
+
+spell/
+lazy-lock.json
diff --git a/.config/nvim/.stylua.toml b/.config/nvim/.stylua.toml
new file mode 100644
index 0000000..139e939
--- /dev/null
+++ b/.config/nvim/.stylua.toml
@@ -0,0 +1,6 @@
+column_width = 160
+line_endings = "Unix"
+indent_type = "Spaces"
+indent_width = 2
+quote_style = "AutoPreferSingle"
+call_parentheses = "None"
diff --git a/.config/nvim/LICENSE.md b/.config/nvim/LICENSE.md
new file mode 100644
index 0000000..9cf1062
--- /dev/null
+++ b/.config/nvim/LICENSE.md
@@ -0,0 +1,19 @@
+MIT License
+
+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/.config/nvim/README.md b/.config/nvim/README.md
index 185280b..8ace8b9 100644
--- a/.config/nvim/README.md
+++ b/.config/nvim/README.md
@@ -1,4 +1,240 @@
-# 💤 LazyVim
+# kickstart.nvim
+
+## Introduction
+
+A starting point for Neovim that is:
+
+* Small
+* Single-file
+* Completely Documented
+
+**NOT** a Neovim distribution, but instead a starting point for your configuration.
+
+## Installation
+
+### Install Neovim
+
+Kickstart.nvim targets *only* the latest
+['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest
+['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim.
+If you are experiencing issues, please make sure you have the latest versions.
+
+### Install External Dependencies
+
+External Requirements:
+- Basic utils: `git`, `make`, `unzip`, C Compiler (`gcc`)
+- [ripgrep](https://github.com/BurntSushi/ripgrep#installation)
+- Clipboard tool (xclip/xsel/win32yank or other depending on the platform)
+- A [Nerd Font](https://www.nerdfonts.com/): optional, provides various icons
+ - if you have it set `vim.g.have_nerd_font` in `init.lua` to true
+- Emoji fonts (Ubuntu only, and only if you want emoji!) `sudo apt install fonts-noto-color-emoji`
+- Language Setup:
+ - If you want to write Typescript, you need `npm`
+ - If you want to write Golang, you will need `go`
+ - etc.
+
+> [!NOTE]
+> See [Install Recipes](#Install-Recipes) for additional Windows and Linux specific notes
+> and quick install snippets
+
+### Install Kickstart
+
+> [!NOTE]
+> [Backup](#FAQ) your previous configuration (if any exists)
+
+Neovim's configurations are located under the following paths, depending on your OS:
+
+| OS | PATH |
+| :- | :--- |
+| Linux, MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` |
+| Windows (cmd)| `%localappdata%\nvim\` |
+| Windows (powershell)| `$env:LOCALAPPDATA\nvim\` |
+
+#### Recommended Step
+
+[Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo
+so that you have your own copy that you can modify, then install by cloning the
+fork to your machine using one of the commands below, depending on your OS.
+
+> [!NOTE]
+> Your fork's URL will be something like this:
+> `https://github.com//kickstart.nvim.git`
+
+You likely want to remove `lazy-lock.json` from your fork's `.gitignore` file
+too - it's ignored in the kickstart repo to make maintenance easier, but it's
+[recommended to track it in version control](https://lazy.folke.io/usage/lockfile).
+
+#### Clone kickstart.nvim
+
+> [!NOTE]
+> If following the recommended step above (i.e., forking the repo), replace
+> `nvim-lua` with `` in the commands below
+
+ Linux and Mac
+
+```sh
+git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim
+```
+
+
+
+ Windows
+
+If you're using `cmd.exe`:
+
+```
+git clone https://github.com/nvim-lua/kickstart.nvim.git "%localappdata%\nvim"
+```
+
+If you're using `powershell.exe`
+
+```
+git clone https://github.com/nvim-lua/kickstart.nvim.git "${env:LOCALAPPDATA}\nvim"
+```
+
+
+
+### Post Installation
+
+Start Neovim
+
+```sh
+nvim
+```
+
+That's it! Lazy will install all the plugins you have. Use `:Lazy` to view
+the current plugin status. Hit `q` to close the window.
+
+#### Read The Friendly Documentation
+
+Read through the `init.lua` file in your configuration folder for more
+information about extending and exploring Neovim. That also includes
+examples of adding popularly requested plugins.
+
+> [!NOTE]
+> For more information about a particular plugin check its repository's documentation.
+
+
+### Getting Started
+
+[The Only Video You Need to Get Started with Neovim](https://youtu.be/m8C0Cq9Uv9o)
+
+### FAQ
+
+* What should I do if I already have a pre-existing Neovim configuration?
+ * You should back it up and then delete all associated files.
+ * This includes your existing init.lua and the Neovim files in `~/.local`
+ which can be deleted with `rm -rf ~/.local/share/nvim/`
+* Can I keep my existing configuration in parallel to kickstart?
+ * Yes! You can use [NVIM_APPNAME](https://neovim.io/doc/user/starting.html#%24NVIM_APPNAME)`=nvim-NAME`
+ to maintain multiple configurations. For example, you can install the kickstart
+ configuration in `~/.config/nvim-kickstart` and create an alias:
+ ```
+ alias nvim-kickstart='NVIM_APPNAME="nvim-kickstart" nvim'
+ ```
+ When you run Neovim using `nvim-kickstart` alias it will use the alternative
+ config directory and the matching local directory
+ `~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim
+ distribution that you would like to try out.
+* What if I want to "uninstall" this configuration:
+ * See [lazy.nvim uninstall](https://lazy.folke.io/usage#-uninstalling) information
+* Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files?
+ * The main purpose of kickstart is to serve as a teaching tool and a reference
+ configuration that someone can easily use to `git clone` as a basis for their own.
+ As you progress in learning Neovim and Lua, you might consider splitting `init.lua`
+ into smaller parts. A fork of kickstart that does this while maintaining the
+ same functionality is available here:
+ * [kickstart-modular.nvim](https://github.com/dam9000/kickstart-modular.nvim)
+ * Discussions on this topic can be found here:
+ * [Restructure the configuration](https://github.com/nvim-lua/kickstart.nvim/issues/218)
+ * [Reorganize init.lua into a multi-file setup](https://github.com/nvim-lua/kickstart.nvim/pull/473)
+
+### Install Recipes
+
+Below you can find OS specific install instructions for Neovim and dependencies.
+
+After installing all the dependencies continue with the [Install Kickstart](#Install-Kickstart) step.
+
+#### Windows Installation
+
+Windows with Microsoft C++ Build Tools and CMake
+Installation may require installing build tools and updating the run command for `telescope-fzf-native`
+
+See `telescope-fzf-native` documentation for [more details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation)
+
+This requires:
+
+- Install CMake and the Microsoft C++ Build Tools on Windows
+
+```lua
+{'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' }
+```
+
+Windows with gcc/make using chocolatey
+Alternatively, one can install gcc and make which don't require changing the config,
+the easiest way is to use choco:
+
+1. install [chocolatey](https://chocolatey.org/install)
+either follow the instructions on the page or use winget,
+run in cmd as **admin**:
+```
+winget install --accept-source-agreements chocolatey.chocolatey
+```
+
+2. install all requirements using choco, exit the previous cmd and
+open a new one so that choco path is set, and run in cmd as **admin**:
+```
+choco install -y neovim git ripgrep wget fd unzip gzip mingw make
+```
+
+WSL (Windows Subsystem for Linux)
+
+```
+wsl --install
+wsl
+sudo add-apt-repository ppa:neovim-ppa/unstable -y
+sudo apt update
+sudo apt install make gcc ripgrep unzip git xclip neovim
+```
+
+
+#### Linux Install
+Ubuntu Install Steps
+
+```
+sudo add-apt-repository ppa:neovim-ppa/unstable -y
+sudo apt update
+sudo apt install make gcc ripgrep unzip git xclip neovim
+```
+
+Debian Install Steps
+
+```
+sudo apt update
+sudo apt install make gcc ripgrep unzip git xclip curl
+
+# Now we install nvim
+curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz
+sudo rm -rf /opt/nvim-linux-x86_64
+sudo mkdir -p /opt/nvim-linux-x86_64
+sudo chmod a+rX /opt/nvim-linux-x86_64
+sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz
+
+# make it available in /usr/local/bin, distro installs to /usr/bin
+sudo ln -sf /opt/nvim-linux-x86_64/bin/nvim /usr/local/bin/
+```
+
+Fedora Install Steps
+
+```
+sudo dnf install -y gcc make git ripgrep fd-find unzip neovim
+```
+
+
+Arch Install Steps
+
+```
+sudo pacman -S --noconfirm --needed gcc make git ripgrep fd unzip neovim
+```
+
-A starter template for [LazyVim](https://github.com/LazyVim/LazyVim).
-Refer to the [documentation](https://lazyvim.github.io/installation) to get started.
diff --git a/.config/nvim/doc/kickstart.txt b/.config/nvim/doc/kickstart.txt
new file mode 100644
index 0000000..cb87ac3
--- /dev/null
+++ b/.config/nvim/doc/kickstart.txt
@@ -0,0 +1,24 @@
+================================================================================
+INTRODUCTION *kickstart.nvim*
+
+Kickstart.nvim is a project to help you get started on your neovim journey.
+
+ *kickstart-is-not*
+It is not:
+- Complete framework for every plugin under the sun
+- Place to add every plugin that could ever be useful
+
+ *kickstart-is*
+It is:
+- Somewhere that has a good start for the most common "IDE" type features:
+ - autocompletion
+ - goto-definition
+ - find references
+ - fuzzy finding
+ - and hinting at what more can be done :)
+- A place to _kickstart_ your journey.
+ - You should fork this project and use/modify it so that it matches your
+ style and preferences. If you don't want to do that, there are probably
+ other projects that would fit much better for you (and that's great!)!
+
+ vim:tw=78:ts=8:ft=help:norl:
diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua
index 2514f9e..43bcb96 100644
--- a/.config/nvim/init.lua
+++ b/.config/nvim/init.lua
@@ -1,2 +1,64 @@
--- bootstrap lazy.nvim, LazyVim and your plugins
-require("config.lazy")
+-- Grundeinstellungen
+vim.g.mapleader = ' '
+vim.g.maplocalleader = ' '
+vim.opt.number = true
+vim.opt.relativenumber = false
+vim.opt.mouse = 'a'
+vim.opt.showmode = false
+vim.opt.clipboard = 'unnamedplus'
+vim.opt.breakindent = true
+vim.opt.undofile = true
+vim.opt.ignorecase = true
+vim.opt.smartcase = true
+vim.opt.signcolumn = 'yes'
+vim.opt.updatetime = 250
+vim.opt.timeoutlen = 300
+vim.opt.splitright = true
+vim.opt.splitbelow = true
+vim.opt.list = true
+vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' }
+vim.opt.inccommand = 'split'
+vim.opt.cursorline = true
+vim.opt.scrolloff = 10
+vim.opt.hlsearch = true
+
+-- Lade lazy.nvim
+local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
+if not vim.loop.fs_stat(lazypath) then
+ vim.fn.system({
+ "git",
+ "clone",
+ "--filter=blob:none",
+ "https://github.com/folke/lazy.nvim.git",
+ "--branch=stable", -- neueste stabile Version
+ lazypath,
+ })
+end
+vim.opt.rtp:prepend(lazypath)
+
+-- Lade Plugins
+require("lazy").setup({
+ -- Grundlegende Plugins
+ { import = "custom.plugins" },
+
+ -- Colorscheme
+ {
+ "folke/tokyonight.nvim",
+ lazy = false,
+ priority = 1000,
+ config = function()
+ require("tokyonight").setup({
+ style = "storm",
+ transparent = false,
+ terminal_colors = true,
+ })
+ vim.cmd.colorscheme "tokyonight"
+ end,
+ },
+})
+
+-- Lade benutzerdefinierte Einstellungen
+require("custom.config")
+
+-- Lade Spracheinstellungen
+require("custom.lsp")
diff --git a/.config/nvim/init.lua.bak b/.config/nvim/init.lua.bak
new file mode 100644
index 0000000..cbf9ff6
--- /dev/null
+++ b/.config/nvim/init.lua.bak
@@ -0,0 +1,1033 @@
+--[[
+
+=====================================================================
+==================== READ THIS BEFORE CONTINUING ====================
+=====================================================================
+======== .-----. ========
+======== .----------------------. | === | ========
+======== |.-""""""""""""""""""-.| |-----| ========
+======== || || | === | ========
+======== || KICKSTART.NVIM || |-----| ========
+======== || || | === | ========
+======== || || |-----| ========
+======== ||:Tutor || |:::::| ========
+======== |'-..................-'| |____o| ========
+======== `"")----------------(""` ___________ ========
+======== /::::::::::| |::::::::::\ \ no mouse \ ========
+======== /:::========| |==hjkl==:::\ \ required \ ========
+======== '""""""""""""' '""""""""""""' '""""""""""' ========
+======== ========
+=====================================================================
+=====================================================================
+
+What is Kickstart?
+
+ Kickstart.nvim is *not* a distribution.
+
+ Kickstart.nvim is a starting point for your own configuration.
+ The goal is that you can read every line of code, top-to-bottom, understand
+ what your configuration is doing, and modify it to suit your needs.
+
+ Once you've done that, you can start exploring, configuring and tinkering to
+ make Neovim your own! That might mean leaving Kickstart just the way it is for a while
+ or immediately breaking it into modular pieces. It's up to you!
+
+ If you don't know anything about Lua, I recommend taking some time to read through
+ a guide. One possible example which will only take 10-15 minutes:
+ - https://learnxinyminutes.com/docs/lua/
+
+ After understanding a bit more about Lua, you can use `:help lua-guide` as a
+ reference for how Neovim integrates Lua.
+ - :help lua-guide
+ - (or HTML version): https://neovim.io/doc/user/lua-guide.html
+
+Kickstart Guide:
+
+ TODO: The very first thing you should do is to run the command `:Tutor` in Neovim.
+
+ If you don't know what this means, type the following:
+ -
+ - :
+ - Tutor
+ -
+
+ (If you already know the Neovim basics, you can skip this step.)
+
+ Once you've completed that, you can continue working through **AND READING** the rest
+ of the kickstart init.lua.
+
+ Next, run AND READ `:help`.
+ This will open up a help window with some basic information
+ about reading, navigating and searching the builtin help documentation.
+
+ This should be the first place you go to look when you're stuck or confused
+ with something. It's one of my favorite Neovim features.
+
+ MOST IMPORTANTLY, we provide a keymap "sh" to [s]earch the [h]elp documentation,
+ which is very useful when you're not exactly sure of what you're looking for.
+
+ I have left several `:help X` comments throughout the init.lua
+ These are hints about where to find more information about the relevant settings,
+ plugins or Neovim features used in Kickstart.
+
+ NOTE: Look for lines like this
+
+ Throughout the file. These are for you, the reader, to help you understand what is happening.
+ Feel free to delete them once you know what you're doing, but they should serve as a guide
+ for when you are first encountering a few different constructs in your Neovim config.
+
+If you experience any errors while trying to install kickstart, run `:checkhealth` for more info.
+
+I hope you enjoy your Neovim journey,
+- TJ
+
+P.S. You can delete this when you're done too. It's your config now! :)
+--]]
+
+-- Set as the leader key
+-- See `:help mapleader`
+-- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used)
+vim.g.mapleader = ' '
+vim.g.maplocalleader = ' '
+
+-- Set to true if you have a Nerd Font installed and selected in the terminal
+vim.g.have_nerd_font = false
+
+-- [[ Setting options ]]
+-- See `:help vim.opt`
+-- NOTE: You can change these options as you wish!
+-- For more options, you can see `:help option-list`
+
+-- Make line numbers default
+vim.opt.number = true
+-- You can also add relative line numbers, to help with jumping.
+-- Experiment for yourself to see if you like it!
+-- vim.opt.relativenumber = true
+
+-- Enable mouse mode, can be useful for resizing splits for example!
+vim.opt.mouse = 'a'
+
+-- Don't show the mode, since it's already in the status line
+vim.opt.showmode = false
+
+-- Sync clipboard between OS and Neovim.
+-- Schedule the setting after `UiEnter` because it can increase startup-time.
+-- Remove this option if you want your OS clipboard to remain independent.
+-- See `:help 'clipboard'`
+vim.schedule(function()
+ vim.opt.clipboard = 'unnamedplus'
+end)
+
+-- Enable break indent
+vim.opt.breakindent = true
+
+-- Save undo history
+vim.opt.undofile = true
+
+-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
+vim.opt.ignorecase = true
+vim.opt.smartcase = true
+
+-- Keep signcolumn on by default
+vim.opt.signcolumn = 'yes'
+
+-- Decrease update time
+vim.opt.updatetime = 250
+
+-- Decrease mapped sequence wait time
+vim.opt.timeoutlen = 300
+
+-- Configure how new splits should be opened
+vim.opt.splitright = true
+vim.opt.splitbelow = true
+
+-- Sets how neovim will display certain whitespace characters in the editor.
+-- See `:help 'list'`
+-- and `:help 'listchars'`
+vim.opt.list = true
+vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' }
+
+-- Preview substitutions live, as you type!
+vim.opt.inccommand = 'split'
+
+-- Show which line your cursor is on
+vim.opt.cursorline = true
+
+-- Minimal number of screen lines to keep above and below the cursor.
+vim.opt.scrolloff = 10
+
+-- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`),
+-- instead raise a dialog asking if you wish to save the current file(s)
+-- See `:help 'confirm'`
+vim.opt.confirm = true
+
+-- [[ Basic Keymaps ]]
+-- See `:help vim.keymap.set()`
+
+-- Clear highlights on search when pressing in normal mode
+-- See `:help hlsearch`
+vim.keymap.set('n', '', 'nohlsearch')
+
+-- Diagnostic keymaps
+vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' })
+
+-- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier
+-- for people to discover. Otherwise, you normally need to press , which
+-- is not what someone will guess without a bit more experience.
+--
+-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping
+-- or just use to exit terminal mode
+vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' })
+
+-- TIP: Disable arrow keys in normal mode
+-- vim.keymap.set('n', '', 'echo "Use h to move!!"')
+-- vim.keymap.set('n', '', 'echo "Use l to move!!"')
+-- vim.keymap.set('n', '', 'echo "Use k to move!!"')
+-- vim.keymap.set('n', '', 'echo "Use j to move!!"')
+
+-- Keybinds to make split navigation easier.
+-- Use CTRL+ to switch between windows
+--
+-- See `:help wincmd` for a list of all window commands
+vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' })
+vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' })
+vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' })
+vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' })
+
+-- NOTE: Some terminals have coliding keymaps or are not able to send distinct keycodes
+-- vim.keymap.set("n", "", "H", { desc = "Move window to the left" })
+-- vim.keymap.set("n", "", "L", { desc = "Move window to the right" })
+-- vim.keymap.set("n", "", "J", { desc = "Move window to the lower" })
+-- vim.keymap.set("n", "", "K", { desc = "Move window to the upper" })
+
+-- [[ Basic Autocommands ]]
+-- See `:help lua-guide-autocommands`
+
+-- Highlight when yanking (copying) text
+-- Try it with `yap` in normal mode
+-- See `:help vim.highlight.on_yank()`
+vim.api.nvim_create_autocmd('TextYankPost', {
+ desc = 'Highlight when yanking (copying) text',
+ group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }),
+ callback = function()
+ vim.highlight.on_yank()
+ end,
+})
+
+-- [[ Install `lazy.nvim` plugin manager ]]
+-- See `:help lazy.nvim.txt` or https://github.com/folke/lazy.nvim for more info
+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
+ error('Error cloning lazy.nvim:\n' .. out)
+ end
+end ---@diagnostic disable-next-line: undefined-field
+vim.opt.rtp:prepend(lazypath)
+
+-- [[ Configure and install plugins ]]
+--
+-- To check the current status of your plugins, run
+-- :Lazy
+--
+-- You can press `?` in this menu for help. Use `:q` to close the window
+--
+-- To update plugins you can run
+-- :Lazy update
+--
+-- NOTE: Here is where you install your plugins.
+require('lazy').setup({
+ -- NOTE: Plugins can be added with a link (or for a github repo: 'owner/repo' link).
+ 'tpope/vim-sleuth', -- Detect tabstop and shiftwidth automatically
+
+ -- NOTE: Plugins can also be added by using a table,
+ -- with the first argument being the link and the following
+ -- keys can be used to configure plugin behavior/loading/etc.
+ --
+ -- Use `opts = {}` to automatically pass options to a plugin's `setup()` function, forcing the plugin to be loaded.
+ --
+
+ -- Alternatively, use `config = function() ... end` for full control over the configuration.
+ -- If you prefer to call `setup` explicitly, use:
+ -- {
+ -- 'lewis6991/gitsigns.nvim',
+ -- config = function()
+ -- require('gitsigns').setup({
+ -- -- Your gitsigns configuration here
+ -- })
+ -- end,
+ -- }
+ --
+ -- Here is a more advanced example where we pass configuration
+ -- options to `gitsigns.nvim`.
+ --
+ -- See `:help gitsigns` to understand what the configuration keys do
+ { -- Adds git related signs to the gutter, as well as utilities for managing changes
+ 'lewis6991/gitsigns.nvim',
+ opts = {
+ signs = {
+ add = { text = '+' },
+ change = { text = '~' },
+ delete = { text = '_' },
+ topdelete = { text = '‾' },
+ changedelete = { text = '~' },
+ },
+ },
+ },
+
+ -- NOTE: Plugins can also be configured to run Lua code when they are loaded.
+ --
+ -- This is often very useful to both group configuration, as well as handle
+ -- lazy loading plugins that don't need to be loaded immediately at startup.
+ --
+ -- For example, in the following configuration, we use:
+ -- event = 'VimEnter'
+ --
+ -- which loads which-key before all the UI elements are loaded. Events can be
+ -- normal autocommands events (`:help autocmd-events`).
+ --
+ -- Then, because we use the `opts` key (recommended), the configuration runs
+ -- after the plugin has been loaded as `require(MODULE).setup(opts)`.
+
+ { -- Useful plugin to show you pending keybinds.
+ 'folke/which-key.nvim',
+ event = 'VimEnter', -- Sets the loading event to 'VimEnter'
+ opts = {
+ -- delay between pressing a key and opening which-key (milliseconds)
+ -- this setting is independent of vim.opt.timeoutlen
+ delay = 0,
+ icons = {
+ -- set icon mappings to true if you have a Nerd Font
+ mappings = vim.g.have_nerd_font,
+ -- If you are using a Nerd Font: set icons.keys to an empty table which will use the
+ -- default which-key.nvim defined Nerd Font icons, otherwise define a string table
+ keys = vim.g.have_nerd_font and {} or {
+ Up = ' ',
+ Down = ' ',
+ Left = ' ',
+ Right = ' ',
+ C = ' ',
+ M = ' ',
+ D = ' ',
+ S = ' ',
+ CR = ' ',
+ Esc = ' ',
+ ScrollWheelDown = ' ',
+ ScrollWheelUp = ' ',
+ NL = ' ',
+ BS = ' ',
+ Space = ' ',
+ Tab = ' ',
+ F1 = '',
+ F2 = '',
+ F3 = '',
+ F4 = '',
+ F5 = '',
+ F6 = '',
+ F7 = '',
+ F8 = '',
+ F9 = '',
+ F10 = '',
+ F11 = '',
+ F12 = '',
+ },
+ },
+
+ -- Document existing key chains
+ spec = {
+ { 'c', group = '[C]ode', mode = { 'n', 'x' } },
+ { 'd', group = '[D]ocument' },
+ { 'r', group = '[R]ename' },
+ { 's', group = '[S]earch' },
+ { 'w', group = '[W]orkspace' },
+ { 't', group = '[T]oggle' },
+ { 'h', group = 'Git [H]unk', mode = { 'n', 'v' } },
+ },
+ },
+ },
+
+ -- NOTE: Plugins can specify dependencies.
+ --
+ -- The dependencies are proper plugin specifications as well - anything
+ -- you do for a plugin at the top level, you can do for a dependency.
+ --
+ -- Use the `dependencies` key to specify the dependencies of a particular plugin
+
+ { -- Fuzzy Finder (files, lsp, etc)
+ 'nvim-telescope/telescope.nvim',
+ event = 'VimEnter',
+ branch = '0.1.x',
+ dependencies = {
+ 'nvim-lua/plenary.nvim',
+ { -- If encountering errors, see telescope-fzf-native README for installation instructions
+ 'nvim-telescope/telescope-fzf-native.nvim',
+
+ -- `build` is used to run some command when the plugin is installed/updated.
+ -- This is only run then, not every time Neovim starts up.
+ build = 'make',
+
+ -- `cond` is a condition used to determine whether this plugin should be
+ -- installed and loaded.
+ cond = function()
+ return vim.fn.executable 'make' == 1
+ end,
+ },
+ { 'nvim-telescope/telescope-ui-select.nvim' },
+
+ -- Useful for getting pretty icons, but requires a Nerd Font.
+ { 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font },
+ },
+ config = function()
+ -- Telescope is a fuzzy finder that comes with a lot of different things that
+ -- it can fuzzy find! It's more than just a "file finder", it can search
+ -- many different aspects of Neovim, your workspace, LSP, and more!
+ --
+ -- The easiest way to use Telescope, is to start by doing something like:
+ -- :Telescope help_tags
+ --
+ -- After running this command, a window will open up and you're able to
+ -- type in the prompt window. You'll see a list of `help_tags` options and
+ -- a corresponding preview of the help.
+ --
+ -- Two important keymaps to use while in Telescope are:
+ -- - Insert mode:
+ -- - Normal mode: ?
+ --
+ -- This opens a window that shows you all of the keymaps for the current
+ -- Telescope picker. This is really useful to discover what Telescope can
+ -- do as well as how to actually do it!
+
+ -- [[ Configure Telescope ]]
+ -- See `:help telescope` and `:help telescope.setup()`
+ require('telescope').setup {
+ -- You can put your default mappings / updates / etc. in here
+ -- All the info you're looking for is in `:help telescope.setup()`
+ --
+ -- defaults = {
+ -- mappings = {
+ -- i = { [''] = 'to_fuzzy_refine' },
+ -- },
+ -- },
+ -- pickers = {}
+ extensions = {
+ ['ui-select'] = {
+ require('telescope.themes').get_dropdown(),
+ },
+ },
+ }
+
+ -- Enable Telescope extensions if they are installed
+ pcall(require('telescope').load_extension, 'fzf')
+ pcall(require('telescope').load_extension, 'ui-select')
+
+ -- See `:help telescope.builtin`
+ local builtin = require 'telescope.builtin'
+ vim.keymap.set('n', 'sh', builtin.help_tags, { desc = '[S]earch [H]elp' })
+ vim.keymap.set('n', 'sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' })
+ vim.keymap.set('n', 'sf', builtin.find_files, { desc = '[S]earch [F]iles' })
+ vim.keymap.set('n', 'ss', builtin.builtin, { desc = '[S]earch [S]elect Telescope' })
+ vim.keymap.set('n', 'sw', builtin.grep_string, { desc = '[S]earch current [W]ord' })
+ vim.keymap.set('n', 'sg', builtin.live_grep, { desc = '[S]earch by [G]rep' })
+ vim.keymap.set('n', 'sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' })
+ vim.keymap.set('n', 'sr', builtin.resume, { desc = '[S]earch [R]esume' })
+ vim.keymap.set('n', 's.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
+ vim.keymap.set('n', '', builtin.buffers, { desc = '[ ] Find existing buffers' })
+
+ -- Slightly advanced example of overriding default behavior and theme
+ vim.keymap.set('n', '/', function()
+ -- You can pass additional configuration to Telescope to change the theme, layout, etc.
+ builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
+ winblend = 10,
+ previewer = false,
+ })
+ end, { desc = '[/] Fuzzily search in current buffer' })
+
+ -- It's also possible to pass additional configuration options.
+ -- See `:help telescope.builtin.live_grep()` for information about particular keys
+ vim.keymap.set('n', 's/', function()
+ builtin.live_grep {
+ grep_open_files = true,
+ prompt_title = 'Live Grep in Open Files',
+ }
+ end, { desc = '[S]earch [/] in Open Files' })
+
+ -- Shortcut for searching your Neovim configuration files
+ vim.keymap.set('n', 'sn', function()
+ builtin.find_files { cwd = vim.fn.stdpath 'config' }
+ end, { desc = '[S]earch [N]eovim files' })
+ end,
+ },
+
+ -- LSP Plugins
+ {
+ -- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins
+ -- used for completion, annotations and signatures of Neovim apis
+ 'folke/lazydev.nvim',
+ ft = 'lua',
+ opts = {
+ library = {
+ -- Load luvit types when the `vim.uv` word is found
+ { path = '${3rd}/luv/library', words = { 'vim%.uv' } },
+ },
+ },
+ },
+ {
+ -- Main LSP Configuration
+ 'neovim/nvim-lspconfig',
+ dependencies = {
+ -- Automatically install LSPs and related tools to stdpath for Neovim
+ -- Mason must be loaded before its dependents so we need to set it up here.
+ -- NOTE: `opts = {}` is the same as calling `require('mason').setup({})`
+ { 'williamboman/mason.nvim', opts = {} },
+ 'williamboman/mason-lspconfig.nvim',
+ 'WhoIsSethDaniel/mason-tool-installer.nvim',
+
+ -- Useful status updates for LSP.
+ { 'j-hui/fidget.nvim', opts = {} },
+
+ -- Allows extra capabilities provided by nvim-cmp
+ 'hrsh7th/cmp-nvim-lsp',
+ },
+ config = function()
+ -- Brief aside: **What is LSP?**
+ --
+ -- LSP is an initialism you've probably heard, but might not understand what it is.
+ --
+ -- LSP stands for Language Server Protocol. It's a protocol that helps editors
+ -- and language tooling communicate in a standardized fashion.
+ --
+ -- In general, you have a "server" which is some tool built to understand a particular
+ -- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc.). These Language Servers
+ -- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone
+ -- processes that communicate with some "client" - in this case, Neovim!
+ --
+ -- LSP provides Neovim with features like:
+ -- - Go to definition
+ -- - Find references
+ -- - Autocompletion
+ -- - Symbol Search
+ -- - and more!
+ --
+ -- Thus, Language Servers are external tools that must be installed separately from
+ -- Neovim. This is where `mason` and related plugins come into play.
+ --
+ -- If you're wondering about lsp vs treesitter, you can check out the wonderfully
+ -- and elegantly composed help section, `:help lsp-vs-treesitter`
+
+ -- This function gets run when an LSP attaches to a particular buffer.
+ -- That is to say, every time a new file is opened that is associated with
+ -- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this
+ -- function will be executed to configure the current buffer
+ vim.api.nvim_create_autocmd('LspAttach', {
+ group = vim.api.nvim_create_augroup('kickstart-lsp-attach', { clear = true }),
+ callback = function(event)
+ -- NOTE: Remember that Lua is a real programming language, and as such it is possible
+ -- to define small helper and utility functions so you don't have to repeat yourself.
+ --
+ -- In this case, we create a function that lets us more easily define mappings specific
+ -- for LSP related items. It sets the mode, buffer and description for us each time.
+ local map = function(keys, func, desc, mode)
+ mode = mode or 'n'
+ vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc })
+ end
+
+ -- Jump to the definition of the word under your cursor.
+ -- This is where a variable was first declared, or where a function is defined, etc.
+ -- To jump back, press .
+ map('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition')
+
+ -- Find references for the word under your cursor.
+ map('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
+
+ -- Jump to the implementation of the word under your cursor.
+ -- Useful when your language has ways of declaring types without an actual implementation.
+ map('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation')
+
+ -- Jump to the type of the word under your cursor.
+ -- Useful when you're not sure what type a variable is and you want to see
+ -- the definition of its *type*, not where it was *defined*.
+ map('D', require('telescope.builtin').lsp_type_definitions, 'Type [D]efinition')
+
+ -- Fuzzy find all the symbols in your current document.
+ -- Symbols are things like variables, functions, types, etc.
+ map('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
+
+ -- Fuzzy find all the symbols in your current workspace.
+ -- Similar to document symbols, except searches over your entire project.
+ map('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
+
+ -- Rename the variable under your cursor.
+ -- Most Language Servers support renaming across files, etc.
+ map('rn', vim.lsp.buf.rename, '[R]e[n]ame')
+
+ -- Execute a code action, usually your cursor needs to be on top of an error
+ -- or a suggestion from your LSP for this to activate.
+ map('ca', vim.lsp.buf.code_action, '[C]ode [A]ction', { 'n', 'x' })
+
+ -- WARN: This is not Goto Definition, this is Goto Declaration.
+ -- For example, in C this would take you to the header.
+ map('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
+
+ -- This function resolves a difference between neovim nightly (version 0.11) and stable (version 0.10)
+ ---@param client vim.lsp.Client
+ ---@param method vim.lsp.protocol.Method
+ ---@param bufnr? integer some lsp support methods only in specific files
+ ---@return boolean
+ local function client_supports_method(client, method, bufnr)
+ if vim.fn.has 'nvim-0.11' == 1 then
+ return client:supports_method(method, bufnr)
+ else
+ return client.supports_method(method, { bufnr = bufnr })
+ end
+ end
+
+ -- The following two autocommands are used to highlight references of the
+ -- word under your cursor when your cursor rests there for a little while.
+ -- See `:help CursorHold` for information about when this is executed
+ --
+ -- When you move your cursor, the highlights will be cleared (the second autocommand).
+ local client = vim.lsp.get_client_by_id(event.data.client_id)
+ if client and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_documentHighlight, event.buf) then
+ local highlight_augroup = vim.api.nvim_create_augroup('kickstart-lsp-highlight', { clear = false })
+ vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
+ buffer = event.buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.document_highlight,
+ })
+
+ vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
+ buffer = event.buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.clear_references,
+ })
+
+ vim.api.nvim_create_autocmd('LspDetach', {
+ group = vim.api.nvim_create_augroup('kickstart-lsp-detach', { clear = true }),
+ callback = function(event2)
+ vim.lsp.buf.clear_references()
+ vim.api.nvim_clear_autocmds { group = 'kickstart-lsp-highlight', buffer = event2.buf }
+ end,
+ })
+ end
+
+ -- The following code creates a keymap to toggle inlay hints in your
+ -- code, if the language server you are using supports them
+ --
+ -- This may be unwanted, since they displace some of your code
+ if client and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_inlayHint, event.buf) then
+ map('th', function()
+ vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled { bufnr = event.buf })
+ end, '[T]oggle Inlay [H]ints')
+ end
+ end,
+ })
+
+ -- Diagnostic Config
+ -- See :help vim.diagnostic.Opts
+ vim.diagnostic.config {
+ severity_sort = true,
+ float = { border = 'rounded', source = 'if_many' },
+ underline = { severity = vim.diagnostic.severity.ERROR },
+ signs = vim.g.have_nerd_font and {
+ text = {
+ [vim.diagnostic.severity.ERROR] = ' ',
+ [vim.diagnostic.severity.WARN] = ' ',
+ [vim.diagnostic.severity.INFO] = ' ',
+ [vim.diagnostic.severity.HINT] = ' ',
+ },
+ } or {},
+ virtual_text = {
+ source = 'if_many',
+ spacing = 2,
+ format = function(diagnostic)
+ local diagnostic_message = {
+ [vim.diagnostic.severity.ERROR] = diagnostic.message,
+ [vim.diagnostic.severity.WARN] = diagnostic.message,
+ [vim.diagnostic.severity.INFO] = diagnostic.message,
+ [vim.diagnostic.severity.HINT] = diagnostic.message,
+ }
+ return diagnostic_message[diagnostic.severity]
+ end,
+ },
+ }
+
+ -- LSP servers and clients are able to communicate to each other what features they support.
+ -- By default, Neovim doesn't support everything that is in the LSP specification.
+ -- When you add nvim-cmp, luasnip, etc. Neovim now has *more* capabilities.
+ -- So, we create new capabilities with nvim cmp, and then broadcast that to the servers.
+ local capabilities = vim.lsp.protocol.make_client_capabilities()
+ capabilities = vim.tbl_deep_extend('force', capabilities, require('cmp_nvim_lsp').default_capabilities())
+
+ -- Enable the following language servers
+ -- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
+ --
+ -- Add any additional override configuration in the following tables. Available keys are:
+ -- - cmd (table): Override the default command used to start the server
+ -- - filetypes (table): Override the default list of associated filetypes for the server
+ -- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features.
+ -- - settings (table): Override the default settings passed when initializing the server.
+ -- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/
+ local servers = {
+ -- clangd = {},
+ -- gopls = {},
+ -- pyright = {},
+ -- rust_analyzer = {},
+ -- ... etc. See `:help lspconfig-all` for a list of all the pre-configured LSPs
+ --
+ -- Some languages (like typescript) have entire language plugins that can be useful:
+ -- https://github.com/pmizio/typescript-tools.nvim
+ --
+ -- But for many setups, the LSP (`ts_ls`) will work just fine
+ -- ts_ls = {},
+ --
+
+ lua_ls = {
+ -- cmd = { ... },
+ -- filetypes = { ... },
+ -- capabilities = {},
+ settings = {
+ Lua = {
+ completion = {
+ callSnippet = 'Replace',
+ },
+ -- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings
+ -- diagnostics = { disable = { 'missing-fields' } },
+ },
+ },
+ },
+ }
+
+ -- Ensure the servers and tools above are installed
+ --
+ -- To check the current status of installed tools and/or manually install
+ -- other tools, you can run
+ -- :Mason
+ --
+ -- You can press `g?` for help in this menu.
+ --
+ -- `mason` had to be setup earlier: to configure its options see the
+ -- `dependencies` table for `nvim-lspconfig` above.
+ --
+ -- You can add other tools here that you want Mason to install
+ -- for you, so that they are available from within Neovim.
+ local ensure_installed = vim.tbl_keys(servers or {})
+ vim.list_extend(ensure_installed, {
+ 'stylua', -- Used to format Lua code
+ })
+ require('mason-tool-installer').setup { ensure_installed = ensure_installed }
+
+ require('mason-lspconfig').setup {
+ ensure_installed = {}, -- explicitly set to an empty table (Kickstart populates installs via mason-tool-installer)
+ automatic_installation = false,
+ handlers = {
+ function(server_name)
+ local server = servers[server_name] or {}
+ -- This handles overriding only values explicitly passed
+ -- by the server configuration above. Useful when disabling
+ -- certain features of an LSP (for example, turning off formatting for ts_ls)
+ server.capabilities = vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {})
+ require('lspconfig')[server_name].setup(server)
+ end,
+ },
+ }
+ end,
+ },
+
+ { -- Autoformat
+ 'stevearc/conform.nvim',
+ event = { 'BufWritePre' },
+ cmd = { 'ConformInfo' },
+ keys = {
+ {
+ 'f',
+ function()
+ require('conform').format { async = true, lsp_format = 'fallback' }
+ end,
+ mode = '',
+ desc = '[F]ormat buffer',
+ },
+ },
+ opts = {
+ notify_on_error = false,
+ format_on_save = function(bufnr)
+ -- Disable "format_on_save lsp_fallback" for languages that don't
+ -- have a well standardized coding style. You can add additional
+ -- languages here or re-enable it for the disabled ones.
+ local disable_filetypes = { c = true, cpp = true }
+ if disable_filetypes[vim.bo[bufnr].filetype] then
+ return nil
+ else
+ return {
+ timeout_ms = 500,
+ lsp_format = 'fallback',
+ }
+ end
+ end,
+ formatters_by_ft = {
+ lua = { 'stylua' },
+ -- Conform can also run multiple formatters sequentially
+ -- python = { "isort", "black" },
+ --
+ -- You can use 'stop_after_first' to run the first available formatter from the list
+ -- javascript = { "prettierd", "prettier", stop_after_first = true },
+ },
+ },
+ },
+
+ { -- Autocompletion
+ 'hrsh7th/nvim-cmp',
+ event = 'InsertEnter',
+ dependencies = {
+ -- Snippet Engine & its associated nvim-cmp source
+ {
+ 'L3MON4D3/LuaSnip',
+ build = (function()
+ -- Build Step is needed for regex support in snippets.
+ -- This step is not supported in many windows environments.
+ -- Remove the below condition to re-enable on windows.
+ if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then
+ return
+ end
+ return 'make install_jsregexp'
+ end)(),
+ dependencies = {
+ -- `friendly-snippets` contains a variety of premade snippets.
+ -- See the README about individual language/framework/plugin snippets:
+ -- https://github.com/rafamadriz/friendly-snippets
+ -- {
+ -- 'rafamadriz/friendly-snippets',
+ -- config = function()
+ -- require('luasnip.loaders.from_vscode').lazy_load()
+ -- end,
+ -- },
+ },
+ },
+ 'saadparwaiz1/cmp_luasnip',
+
+ -- Adds other completion capabilities.
+ -- nvim-cmp does not ship with all sources by default. They are split
+ -- into multiple repos for maintenance purposes.
+ 'hrsh7th/cmp-nvim-lsp',
+ 'hrsh7th/cmp-path',
+ 'hrsh7th/cmp-nvim-lsp-signature-help',
+ },
+ config = function()
+ -- See `:help cmp`
+ local cmp = require 'cmp'
+ local luasnip = require 'luasnip'
+ luasnip.config.setup {}
+
+ cmp.setup {
+ snippet = {
+ expand = function(args)
+ luasnip.lsp_expand(args.body)
+ end,
+ },
+ completion = { completeopt = 'menu,menuone,noinsert' },
+
+ -- For an understanding of why these mappings were
+ -- chosen, you will need to read `:help ins-completion`
+ --
+ -- No, but seriously. Please read `:help ins-completion`, it is really good!
+ mapping = cmp.mapping.preset.insert {
+ -- Select the [n]ext item
+ [''] = cmp.mapping.select_next_item(),
+ -- Select the [p]revious item
+ [''] = cmp.mapping.select_prev_item(),
+
+ -- Scroll the documentation window [b]ack / [f]orward
+ [''] = cmp.mapping.scroll_docs(-4),
+ [''] = cmp.mapping.scroll_docs(4),
+
+ -- Accept ([y]es) the completion.
+ -- This will auto-import if your LSP supports it.
+ -- This will expand snippets if the LSP sent a snippet.
+ [''] = cmp.mapping.confirm { select = true },
+
+ -- If you prefer more traditional completion keymaps,
+ -- you can uncomment the following lines
+ --[''] = cmp.mapping.confirm { select = true },
+ --[''] = cmp.mapping.select_next_item(),
+ --[''] = cmp.mapping.select_prev_item(),
+
+ -- Manually trigger a completion from nvim-cmp.
+ -- Generally you don't need this, because nvim-cmp will display
+ -- completions whenever it has completion options available.
+ [''] = cmp.mapping.complete {},
+
+ -- Think of as moving to the right of your snippet expansion.
+ -- So if you have a snippet that's like:
+ -- function $name($args)
+ -- $body
+ -- end
+ --
+ -- will move you to the right of each of the expansion locations.
+ -- is similar, except moving you backwards.
+ [''] = cmp.mapping(function()
+ if luasnip.expand_or_locally_jumpable() then
+ luasnip.expand_or_jump()
+ end
+ end, { 'i', 's' }),
+ [''] = cmp.mapping(function()
+ if luasnip.locally_jumpable(-1) then
+ luasnip.jump(-1)
+ end
+ end, { 'i', 's' }),
+
+ -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see:
+ -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps
+ },
+ sources = {
+ {
+ name = 'lazydev',
+ -- set group index to 0 to skip loading LuaLS completions as lazydev recommends it
+ group_index = 0,
+ },
+ { name = 'nvim_lsp' },
+ { name = 'luasnip' },
+ { name = 'path' },
+ { name = 'nvim_lsp_signature_help' },
+ },
+ }
+ end,
+ },
+
+ { -- You can easily change to a different colorscheme.
+ -- Change the name of the colorscheme plugin below, and then
+ -- change the command in the config to whatever the name of that colorscheme is.
+ --
+ -- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`.
+ 'folke/tokyonight.nvim',
+ priority = 1000, -- Make sure to load this before all the other start plugins.
+ config = function()
+ ---@diagnostic disable-next-line: missing-fields
+ require('tokyonight').setup {
+ styles = {
+ comments = { italic = false }, -- Disable italics in comments
+ },
+ }
+
+ -- Load the colorscheme here.
+ -- Like many other themes, this one has different styles, and you could load
+ -- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'.
+ vim.cmd.colorscheme 'tokyonight-night'
+ end,
+ },
+
+ -- Highlight todo, notes, etc in comments
+ { 'folke/todo-comments.nvim', event = 'VimEnter', dependencies = { 'nvim-lua/plenary.nvim' }, opts = { signs = false } },
+
+ { -- Collection of various small independent plugins/modules
+ 'echasnovski/mini.nvim',
+ config = function()
+ -- Better Around/Inside textobjects
+ --
+ -- Examples:
+ -- - va) - [V]isually select [A]round [)]paren
+ -- - yinq - [Y]ank [I]nside [N]ext [Q]uote
+ -- - ci' - [C]hange [I]nside [']quote
+ require('mini.ai').setup { n_lines = 500 }
+
+ -- Add/delete/replace surroundings (brackets, quotes, etc.)
+ --
+ -- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren
+ -- - sd' - [S]urround [D]elete [']quotes
+ -- - sr)' - [S]urround [R]eplace [)] [']
+ require('mini.surround').setup()
+
+ -- Simple and easy statusline.
+ -- You could remove this setup call if you don't like it,
+ -- and try some other statusline plugin
+ local statusline = require 'mini.statusline'
+ -- set use_icons to true if you have a Nerd Font
+ statusline.setup { use_icons = vim.g.have_nerd_font }
+
+ -- You can configure sections in the statusline by overriding their
+ -- default behavior. For example, here we set the section for
+ -- cursor location to LINE:COLUMN
+ ---@diagnostic disable-next-line: duplicate-set-field
+ statusline.section_location = function()
+ return '%2l:%-2v'
+ end
+
+ -- ... and there is more!
+ -- Check out: https://github.com/echasnovski/mini.nvim
+ end,
+ },
+ { -- Highlight, edit, and navigate code
+ 'nvim-treesitter/nvim-treesitter',
+ build = ':TSUpdate',
+ main = 'nvim-treesitter.configs', -- Sets main module to use for opts
+ -- [[ Configure Treesitter ]] See `:help nvim-treesitter`
+ opts = {
+ ensure_installed = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' },
+ -- Autoinstall languages that are not installed
+ auto_install = true,
+ highlight = {
+ enable = true,
+ -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules.
+ -- If you are experiencing weird indenting issues, add the language to
+ -- the list of additional_vim_regex_highlighting and disabled languages for indent.
+ additional_vim_regex_highlighting = { 'ruby' },
+ },
+ indent = { enable = true, disable = { 'ruby' } },
+ },
+ -- There are additional nvim-treesitter modules that you can use to interact
+ -- with nvim-treesitter. You should go explore a few and see what interests you:
+ --
+ -- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod`
+ -- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context
+ -- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects
+ },
+
+ -- The following comments only work if you have downloaded the kickstart repo, not just copy pasted the
+ -- init.lua. If you want these files, they are in the repository, so you can just download them and
+ -- place them in the correct locations.
+
+ -- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for Kickstart
+ --
+ -- Here are some example plugins that I've included in the Kickstart repository.
+ -- Uncomment any of the lines below to enable them (you will need to restart nvim).
+ --
+ -- require 'kickstart.plugins.debug',
+ -- require 'kickstart.plugins.indent_line',
+ -- require 'kickstart.plugins.lint',
+ -- require 'kickstart.plugins.autopairs',
+ -- require 'kickstart.plugins.neo-tree',
+ -- require 'kickstart.plugins.gitsigns', -- adds gitsigns recommend keymaps
+
+ -- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua`
+ -- This is the easiest way to modularize your config.
+ --
+ -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going.
+ -- { import = 'custom.plugins' },
+ --
+ -- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec`
+ -- Or use telescope!
+ -- In normal mode type `sh` then write `lazy.nvim-plugin`
+ -- you can continue same window with `sr` which resumes last telescope search
+}, {
+ ui = {
+ -- If you are using a Nerd Font: set icons to an empty table which will use the
+ -- default lazy.nvim defined Nerd Font icons, otherwise define a unicode icons table
+ icons = vim.g.have_nerd_font and {} or {
+ cmd = '⌘',
+ config = '🛠',
+ event = '📅',
+ ft = '📂',
+ init = '⚙',
+ keys = '🗝',
+ plugin = '🔌',
+ runtime = '💻',
+ require = '🌙',
+ source = '📄',
+ start = '🚀',
+ task = '📌',
+ lazy = '💤 ',
+ },
+ },
+})
+
+-- The line beneath this is called `modeline`. See `:help modeline`
+-- vim: ts=2 sts=2 sw=2 et
diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json
index e5a89ec..38d7f09 100644
--- a/.config/nvim/lazy-lock.json
+++ b/.config/nvim/lazy-lock.json
@@ -1,84 +1,39 @@
{
- "FixCursorHold.nvim": { "branch": "master", "commit": "1900f89dc17c603eec29960f57c00bd9ae696495" },
- "LazyVim": { "branch": "main", "commit": "3f034d0a7f58031123300309f2efd3bb0356ee21" },
- "LuaSnip": { "branch": "master", "commit": "c9b9a22904c97d0eb69ccb9bab76037838326817" },
- "SchemaStore.nvim": { "branch": "main", "commit": "7823767e65bef7d30cc0acd6df89f3d2d7d420db" },
- "alpha-nvim": { "branch": "main", "commit": "de72250e054e5e691b9736ee30db72c65d560771" },
- "blink.cmp": { "branch": "main", "commit": "1c8d8e45d6fba3d11512f4762b1fdf906bffca42" },
- "catppuccin": { "branch": "main", "commit": "5b5e3aef9ad7af84f463d17b5479f06b87d5c429" },
- "code_runner.nvim": { "branch": "main", "commit": "50a59cbc53e62cd6c171023935a19a79b4bf42fb" },
- "conform.nvim": { "branch": "master", "commit": "f9ef25a7ef00267b7d13bfc00b0dea22d78702d5" },
- "crates.nvim": { "branch": "main", "commit": "fd2bbca7aa588f24ffc3517831934b4c4a9588e9" },
+ "LuaSnip": { "branch": "master", "commit": "776a29c3e1ac61029ac3f57ac6b5937df2340162" },
+ "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
+ "cmp-nvim-lsp": { "branch": "main", "commit": "a8912b88ce488f411177fc8aed358b04dc246d7b" },
+ "cmp-path": { "branch": "main", "commit": "c6635aae33a50d6010bf1aa756ac2398a2d54c32" },
+ "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
+ "conform.nvim": { "branch": "master", "commit": "b529dd4897c85c3188cc787084089a9d55843093" },
"diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
- "flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" },
- "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" },
- "fzf-lua": { "branch": "main", "commit": "aeff8132009a7fc55c6c43bca4288d5ba26a5393" },
- "gh-actions.nvim": { "branch": "main", "commit": "549286202a8fb7b5930e36e5962383049e4d5166" },
- "git-blame.nvim": { "branch": "master", "commit": "2883a7460f611c2705b23f12d58d398d5ce6ec00" },
- "gitsigns.nvim": { "branch": "main", "commit": "7010000889bfb6c26065e0b0f7f1e6aa9163edd9" },
- "grug-far.nvim": { "branch": "main", "commit": "6b1aca6018cb6ce18a46b9e8583074a2f820b51e" },
+ "fidget.nvim": { "branch": "main", "commit": "d9ba6b7bfe29b3119a610892af67602641da778e" },
+ "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
+ "gitsigns.nvim": { "branch": "main", "commit": "d0f90ef51d4be86b824b012ec52ed715b5622e51" },
"harpoon": { "branch": "master", "commit": "1bc17e3e42ea3c46b33c0bbad6a880792692a1b3" },
+ "hydra.nvim": { "branch": "master", "commit": "3ced42c0b6a6c85583ff0f221635a7f4c1ab0dd0" },
"lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
- "lazydev.nvim": { "branch": "main", "commit": "2367a6c0a01eb9edb0464731cc0fb61ed9ab9d2c" },
- "lualine.nvim": { "branch": "master", "commit": "b431d228b7bbcdaea818bdc3e25b8cdbe861f056" },
- "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" },
- "mason-lspconfig.nvim": { "branch": "main", "commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245" },
- "mason-nvim-dap.nvim": { "branch": "main", "commit": "444aad7977ee713a4049e9d1dd9b377967d67a4c" },
- "mason.nvim": { "branch": "main", "commit": "fc98833b6da5de5a9c5b1446ac541577059555be" },
- "material.nvim": { "branch": "main", "commit": "96285a62923ea8e38aea7b603099752da2a97e97" },
- "mini.ai": { "branch": "main", "commit": "978ffc65c6b513fde9ef075326d34d89197f1ea5" },
- "mini.files": { "branch": "main", "commit": "0a396f5ca5516a07959ae2c00667e1a26c20f0ea" },
- "mini.hipatterns": { "branch": "main", "commit": "fbf1e2195fdd65cf1bc970316c28098257728868" },
- "mini.icons": { "branch": "main", "commit": "ec61af6e606fc89ee3b1d8f2f20166a3ca917a36" },
- "mini.pairs": { "branch": "main", "commit": "1a3e73649c0eaef2f6c48ce1e761c6f0a7c11918" },
- "neo-tree.nvim": { "branch": "main", "commit": "dda4c9e9a7806d72fab2c733462b9beb33a45714" },
- "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" },
- "neogit": { "branch": "master", "commit": "333968f8222fda475d3e4545a9b15fe9912ca26a" },
- "neotest": { "branch": "master", "commit": "dddbe8fe358b05b2b7e54fe4faab50563171a76d" },
- "neotest-go": { "branch": "main", "commit": "92950ad7be2ca02a41abca5c6600ff6ffaf5b5d6" },
- "neotest-mocha": { "branch": "main", "commit": "8239023d299a692784176f202f6a4a5e0a698ad2" },
- "neotest-python": { "branch": "master", "commit": "a2861ab3c9a0bf75a56b11835c2bfc8270f5be7e" },
- "neotest-rust": { "branch": "main", "commit": "e1cb22ecf0341fb894ef2ebde344389fe6e6fc8e" },
- "neotest-vim-test": { "branch": "master", "commit": "75c4228882ae4883b11bfce9b8383e637eb44192" },
- "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" },
- "none-ls.nvim": { "branch": "main", "commit": "a117163db44c256d53c3be8717f3e1a2a28e6299" },
- "nui.nvim": { "branch": "main", "commit": "8d3bce9764e627b62b07424e0df77f680d47ffdb" },
- "nvim-autopairs": { "branch": "master", "commit": "6522027785b305269fa17088395dfc0f456cedd2" },
- "nvim-dap": { "branch": "master", "commit": "6a5bba0ddea5d419a783e170c20988046376090d" },
- "nvim-dap-go": { "branch": "main", "commit": "8763ced35b19c8dc526e04a70ab07c34e11ad064" },
- "nvim-dap-python": { "branch": "master", "commit": "34282820bb713b9a5fdb120ae8dd85c2b3f49b51" },
- "nvim-dap-ui": { "branch": "master", "commit": "bc81f8d3440aede116f821114547a476b082b319" },
- "nvim-dap-virtual-text": { "branch": "master", "commit": "df66808cd78b5a97576bbaeee95ed5ca385a9750" },
- "nvim-lspconfig": { "branch": "master", "commit": "fb733ac734249ccf293e5c8018981d4d8f59fa8f" },
- "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" },
- "nvim-treesitter": { "branch": "master", "commit": "b10436b9fb29d3c3c406c07ce813f70245f9bc7b" },
- "nvim-treesitter-context": { "branch": "master", "commit": "93b29a32d5f4be10e39226c6b796f28d68a8b483" },
- "nvim-treesitter-textobjects": { "branch": "master", "commit": "9937e5e356e5b227ec56d83d0a9d0a0f6bc9cad4" },
- "nvim-ts-autotag": { "branch": "main", "commit": "a1d526af391f6aebb25a8795cbc05351ed3620b5" },
- "nvim-web-devicons": { "branch": "master", "commit": "4c3a5848ee0b09ecdea73adcd2a689190aeb728c" },
- "one-small-step-for-vimkind": { "branch": "main", "commit": "b9def31568d20b16f7da9479a4174d165046fe8a" },
- "persistence.nvim": { "branch": "main", "commit": "166a79a55bfa7a4db3e26fc031b4d92af71d0b51" },
- "pipeline.nvim": { "branch": "main", "commit": "549286202a8fb7b5930e36e5962383049e4d5166" },
+ "leap.nvim": { "branch": "main", "commit": "08ca7ec9e859856251d56c22ea107f82f563ff3c" },
+ "mason-lspconfig.nvim": { "branch": "main", "commit": "c2682b0d9732bf52cbc34862056f143e71dc4a6d" },
+ "mason.nvim": { "branch": "main", "commit": "8024d64e1330b86044fed4c8494ef3dcd483a67c" },
+ "neo-tree.nvim": { "branch": "main", "commit": "f3e8633f06007e015f855d3c1ec0cee23af14d8e" },
+ "neogit": { "branch": "master", "commit": "00038cca54436b6fecc064bba00bf42b77189041" },
+ "nui.nvim": { "branch": "main", "commit": "7cd18e73cfbd70e1546931b7268b3eebaeff9391" },
+ "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" },
+ "nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" },
+ "nvim-dap": { "branch": "master", "commit": "61643680dcb771a29073cd432894e2f81a7c2ae3" },
+ "nvim-dap-python": { "branch": "master", "commit": "261ce649d05bc455a29f9636dc03f8cdaa7e0e2c" },
+ "nvim-dap-ui": { "branch": "master", "commit": "73a26abf4941aa27da59820fd6b028ebcdbcf932" },
+ "nvim-lspconfig": { "branch": "master", "commit": "8adb3b5938f6074a1bcc36d3c3916f497d2e8ec4" },
+ "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
+ "nvim-treesitter-textobjects": { "branch": "master", "commit": "0f051e9813a36481f48ca1f833897210dbcfffde" },
+ "nvim-web-devicons": { "branch": "master", "commit": "1fb58cca9aebbc4fd32b086cb413548ce132c127" },
+ "nvim-window-picker": { "branch": "main", "commit": "6382540b2ae5de6c793d4aa2e3fe6dbb518505ec" },
+ "phpactor": { "branch": "master", "commit": "53741d8eb3d878d5b22e39f9255efa08c88d5dfc" },
"plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" },
- "project.nvim": { "branch": "main", "commit": "8c6bad7d22eef1b71144b401c9f74ed01526a4fb" },
- "refactoring.nvim": { "branch": "master", "commit": "36bd14ddd7ebf0546c15e6088e8bc93f8a98787d" },
- "rustaceanvim": { "branch": "master", "commit": "448c76451ecf3c0edabcde427b7f1c8c219be2dd" },
- "snacks.nvim": { "branch": "main", "commit": "bc0630e43be5699bb94dadc302c0d21615421d93" },
- "tailwind-tools.nvim": { "branch": "master", "commit": "abe7368392345c53174979c2cf033e832de80ef8" },
+ "schemastore.nvim": { "branch": "main", "commit": "9c4dbc346c0be7016cf56220bafb964fd8ef87d3" },
"telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" },
- "telescope-live-grep-args.nvim": { "branch": "master", "commit": "b80ec2c70ec4f32571478b501218c8979fab5201" },
- "telescope-terraform-doc.nvim": { "branch": "main", "commit": "28efe1f3cb2ed4c83fa69000ae8afd2f85d62826" },
- "telescope-terraform.nvim": { "branch": "main", "commit": "072c97023797ca1a874668aaa6ae0b74425335df" },
- "telescope.nvim": { "branch": "master", "commit": "a4ed82509cecc56df1c7138920a1aeaf246c0ac5" },
- "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" },
+ "telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" },
"tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" },
- "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" },
- "ts-comments.nvim": { "branch": "main", "commit": "1bd9d0ba1d8b336c3db50692ffd0955fe1bb9f0c" },
- "undotree": { "branch": "master", "commit": "b951b87b46c34356d44aa71886aecf9dd7f5788a" },
- "vim-fugitive": { "branch": "master", "commit": "4a745ea72fa93bb15dd077109afbb3d1809383f2" },
- "vim-test": { "branch": "master", "commit": "0f50a546aef59efe5f1301de8fa9819ecb9fd482" },
- "vim-tmux-navigator": { "branch": "master", "commit": "791dacfcfc8ccb7f6eb1c853050883b03e5a22fe" },
- "which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" },
- "yanky.nvim": { "branch": "main", "commit": "a21a0b4f593e1fb17b17882f1ab3a3c1b943b831" },
+ "typescript-tools.nvim": { "branch": "master", "commit": "3c501d7c7f79457932a8750a2a1476a004c5c1a9" },
"zen-mode.nvim": { "branch": "main", "commit": "863f150ca321b3dd8aa1a2b69b5f411a220e144f" }
}
diff --git a/.config/nvim/lua/.DS_Store b/.config/nvim/lua/.DS_Store
deleted file mode 100644
index b27f912..0000000
Binary files a/.config/nvim/lua/.DS_Store and /dev/null differ
diff --git a/.config/nvim/lua/config/autocmds.lua b/.config/nvim/lua/config/autocmds.lua
deleted file mode 100644
index 60bab50..0000000
--- a/.config/nvim/lua/config/autocmds.lua
+++ /dev/null
@@ -1,54 +0,0 @@
--- Autocmds are automatically loaded on the VeryLazy event
--- Docs: https://www.lazyvim.org/configuration/general
--- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua
--- Add any additional autocmds here
-
-local function find_python_executable()
- if vim.env.VIRTUAL_ENV then
- local paths = vim.fn.glob(vim.env.VIRTUAL_ENV .. "/**/bin/python", true, true)
- local executable_path = table.concat(paths, ", ")
- if executable_path ~= "" then
- vim.api.nvim_echo({ { "Using path for python: " .. executable_path, "None" } }, false, {})
- return executable_path
- end
- elseif vim.fn.filereadable(".venv/bin/python") == 1 then
- local executable_path = vim.fn.expand(".venv/bin/python")
- vim.api.nvim_echo({ { "Using path for python: " .. executable_path, "None" } }, false, {})
- return executable_path
- end
- vim.api.nvim_echo({ { "No python executable found (see autocmds.lua)", "WarningMsg" } }, false, {})
-end
-
-vim.api.nvim_create_autocmd("FileType", {
- pattern = { "python" },
- callback = function()
- vim.g.python3_host_prog = find_python_executable() -- python executable
- vim.opt_local.colorcolumn = "72,88" -- Ruler at column number
- vim.opt_local.tabstop = 4 -- Number of spaces tabs count for
- vim.opt_local.shiftwidth = 4 -- Size of an indent
- end,
-})
-
-vim.api.nvim_create_autocmd("FileType", {
- pattern = { "rust" },
- callback = function()
- vim.opt_local.colorcolumn = "79" -- Ruler at column number
- vim.opt_local.tabstop = 4 -- Number of spaces tabs count for
- vim.opt_local.shiftwidth = 4 -- Size of an indent
- end,
-})
-
-vim.api.nvim_create_autocmd("FileType", {
- pattern = "typescript",
- callback = function()
- vim.opt_local.colorcolumn = "79" -- Ruler at column number
- vim.opt_local.tabstop = 4
- vim.opt_local.shiftwidth = 4
- end,
-})
--- see lint.lua
--- vim.api.nvim_create_autocmd({ "InsertLeave", "BufWritePost" }, {
--- callback = function()
--- require("lint").try_lint()
--- end,
--- })
diff --git a/.config/nvim/lua/config/lazy.lua b/.config/nvim/lua/config/lazy.lua
deleted file mode 100644
index 4bbae56..0000000
--- a/.config/nvim/lua/config/lazy.lua
+++ /dev/null
@@ -1,62 +0,0 @@
-local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
-if not vim.loop.fs_stat(lazypath) then
- -- bootstrap lazy.nvim
- -- stylua: ignore
- -- "git"
- vim.fn.system({"git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath })
-end
-vim.opt.rtp:prepend(vim.env.LAZY or lazypath)
-
-require("lazy").setup({
- spec = {
- -- add LazyVim and import its plugins
- { "LazyVim/LazyVim", import = "lazyvim.plugins" },
-
- -- import any extras modules here
- -- { import = "lazyvim.plugins.extras.lang.docker" },
- { import = "lazyvim.plugins.extras.lang.json" },
- { import = "lazyvim.plugins.extras.lang.rust" },
- -- { import = "lazyvim.plugins.extras.lang.tailwind" },
- { import = "lazyvim.plugins.extras.lang.terraform" },
- { import = "lazyvim.plugins.extras.lang.typescript" },
- -- { import = "lazyvim.plugins.extras.formatting.prettier" },
- { import = "lazyvim.plugins.extras.linting.eslint" },
- { import = "lazyvim.plugins.extras.test.core" },
- { import = "lazyvim.plugins.extras.dap.core" },
- { import = "lazyvim.plugins.extras.dap.nlua" },
- -- { import = "lazyvim.plugins.extras.coding.copilot" }, -- see ai.lua instead
- { import = "lazyvim.plugins.extras.coding.yanky" },
- { import = "lazyvim.plugins.extras.util.mini-hipatterns" },
- { import = "lazyvim.plugins.extras.vscode" },
- { import = "lazyvim.plugins.extras.editor.mini-files" },
- { import = "lazyvim.plugins.extras.coding.luasnip" },
- { import = "lazyvim.plugins.extras.lsp.none-ls" },
- { 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 = { "catppuccin" } },
- checker = { enabled = true }, -- automatically check for plugin updates
- performance = {
- rtp = {
- -- disable some rtp plugins
- disabled_plugins = {
- "gzip",
- -- "matchit",
- -- "matchparen",
- -- "netrwPlugin",
- "tarPlugin",
- "tohtml",
- "tutor",
- "zipPlugin",
- },
- },
- },
-})
diff --git a/.config/nvim/lua/custom/config.lua b/.config/nvim/lua/custom/config.lua
new file mode 100644
index 0000000..5056805
--- /dev/null
+++ b/.config/nvim/lua/custom/config.lua
@@ -0,0 +1,94 @@
+-- Explorer-Konfiguration (Neo-tree)
+require('neo-tree').setup({
+ close_if_last_window = false,
+ popup_border_style = "rounded",
+ enable_git_status = true,
+ enable_diagnostics = true,
+ sources = {
+ "filesystem",
+ "buffers",
+ "git_status",
+ },
+ source_selector = {
+ winbar = true,
+ content_layout = "center",
+ tabs_layout = "equal",
+ },
+ filesystem = {
+ filtered_items = {
+ visible = true,
+ hide_dotfiles = false,
+ hide_gitignored = false,
+ },
+ follow_current_file = {
+ enabled = true,
+ },
+ use_libuv_file_watcher = true,
+ },
+ window = {
+ position = "right",
+ width = 35,
+ mapping_options = {
+ noremap = true,
+ nowait = true,
+ },
+ },
+ git_status = {
+ symbols = {
+ added = "✚",
+ modified = "",
+ deleted = "✖",
+ renamed = "➜",
+ untracked = "★",
+ ignored = "◌",
+ unstaged = "✗",
+ staged = "✓",
+ conflict = "",
+ },
+ },
+})
+
+-- Harpoon (Schnellwechsel zwischen Dateien)
+local mark = require("harpoon.mark")
+local ui = require("harpoon.ui")
+
+vim.keymap.set("n", "a", mark.add_file, { desc = "Datei zu Harpoon hinzufügen" })
+vim.keymap.set("n", "h", ui.toggle_quick_menu, { desc = "Harpoon-Menü anzeigen" })
+
+-- Schnellzugriff auf die ersten 4 Dateien
+vim.keymap.set("n", "1", function() ui.nav_file(1) end, { desc = "Harpoon Datei 1" })
+vim.keymap.set("n", "2", function() ui.nav_file(2) end, { desc = "Harpoon Datei 2" })
+vim.keymap.set("n", "3", function() ui.nav_file(3) end, { desc = "Harpoon Datei 3" })
+vim.keymap.set("n", "4", function() ui.nav_file(4) end, { desc = "Harpoon Datei 4" })
+
+-- Tastenkombinationen für Neo-tree
+vim.keymap.set("n", "e", ":Neotree toggle right", { silent = true, desc = "Explorer öffnen" })
+
+-- Git Signs
+require('gitsigns').setup({
+ signs = {
+ add = { text = '+' },
+ change = { text = '~' },
+ delete = { text = '_' },
+ topdelete = { text = '‾' },
+ changedelete = { text = '~' },
+ untracked = { text = '┆' },
+ },
+ signcolumn = true,
+ on_attach = function(bufnr)
+ local gs = package.loaded.gitsigns
+
+ -- Navigation zwischen Änderungen
+ vim.keymap.set('n', ']c', function()
+ if vim.wo.diff then return ']c' end
+ vim.schedule(function() gs.next_hunk() end)
+ return ''
+ end, { expr = true, buffer = bufnr })
+
+ vim.keymap.set('n', '[c', function()
+ if vim.wo.diff then return '[c' end
+ vim.schedule(function() gs.prev_hunk() end)
+ return ''
+ end, { expr = true, buffer = bufnr })
+ end
+})
diff --git a/.config/nvim/lua/custom/hydra.lua b/.config/nvim/lua/custom/hydra.lua
new file mode 100644
index 0000000..13c6031
--- /dev/null
+++ b/.config/nvim/lua/custom/hydra.lua
@@ -0,0 +1,183 @@
+-- ~/.config/nvim/lua/custom/hydra.lua
+local Hydra = require('hydra')
+
+-- Fenster-Management Hydra
+Hydra({
+ name = 'Fenster',
+ mode = 'n',
+ body = '',
+ heads = {
+ -- Navigieren zwischen Fenstern
+ { 'h', 'h', { desc = 'links' } },
+ { 'j', 'j', { desc = 'unten' } },
+ { 'k', 'k', { desc = 'oben' } },
+ { 'l', 'l', { desc = 'rechts' } },
+
+ -- Fenster verschieben
+ { 'H', 'H', { desc = 'nach links verschieben' } },
+ { 'J', 'J', { desc = 'nach unten verschieben' } },
+ { 'K', 'K', { desc = 'nach oben verschieben' } },
+ { 'L', 'L', { desc = 'nach rechts verschieben' } },
+
+ -- Größe ändern
+ { '>', '>', { desc = 'breiter' } },
+ { '<', '<', { desc = 'schmaler' } },
+ { '+', '+', { desc = 'höher' } },
+ { '-', '-', { desc = 'niedriger' } },
+ { '=', '=', { desc = 'gleiche Größe' } },
+
+ -- Neue Fenster
+ { 's', 's', { desc = 'horizontal teilen' } },
+ { 'v', 'v', { desc = 'vertikal teilen' } },
+ { 'n', 'new', { desc = 'neue horizontale Teilung' } },
+ { 'N', 'vnew', { desc = 'neue vertikale Teilung' } },
+
+ -- Fenster schließen
+ { 'c', 'c', { desc = 'schließen' } },
+ { 'o', 'o', { desc = 'andere schließen' } },
+
+ -- Beenden
+ { 'q', nil, { desc = 'beenden', exit = true } },
+ { '', nil, { desc = 'beenden', exit = true } },
+ }
+})
+
+-- Harpoon Hydra
+Hydra({
+ name = 'Harpoon',
+ mode = 'n',
+ body = 'h',
+ heads = {
+ { 'a', function() require("harpoon.mark").add_file() end, { desc = 'Datei hinzufügen' } },
+ { 'h', function() require("harpoon.ui").toggle_quick_menu() end, { desc = 'Menü anzeigen' } },
+ { 'n', function() require("harpoon.ui").nav_next() end, { desc = 'Nächste Datei' } },
+ { 'p', function() require("harpoon.ui").nav_prev() end, { desc = 'Vorherige Datei' } },
+ { '1', function() require("harpoon.ui").nav_file(1) end, { desc = 'Datei 1' } },
+ { '2', function() require("harpoon.ui").nav_file(2) end, { desc = 'Datei 2' } },
+ { '3', function() require("harpoon.ui").nav_file(3) end, { desc = 'Datei 3' } },
+ { '4', function() require("harpoon.ui").nav_file(4) end, { desc = 'Datei 4' } },
+ { '5', function() require("harpoon.ui").nav_file(5) end, { desc = 'Datei 5' } },
+ { 'q', nil, { desc = 'beenden', exit = true } },
+ { '', nil, { desc = 'beenden', exit = true } },
+ }
+})
+
+-- Git-Operationen Hydra (funktioniert mit Gitsigns und Neogit)
+Hydra({
+ name = 'Git',
+ mode = 'n',
+ body = 'g',
+ heads = {
+ -- Gitsigns
+ { 'h', function() require("gitsigns").preview_hunk() end, { desc = 'Änderung anzeigen' } },
+ { 'n', function() require("gitsigns").next_hunk() end, { desc = 'Nächste Änderung' } },
+ { 'p', function() require("gitsigns").prev_hunk() end, { desc = 'Vorherige Änderung' } },
+ { 's', function() require("gitsigns").stage_hunk() end, { desc = 'Änderung stagen' } },
+ { 'u', function() require("gitsigns").undo_stage_hunk() end, { desc = 'Stagen rückgängig' } },
+ { 'r', function() require("gitsigns").reset_hunk() end, { desc = 'Änderung zurücksetzen' } },
+
+ -- Neogit
+ { 'g', function() require("neogit").open() end, { desc = 'Neogit öffnen', exit = true } },
+ { 'c', function() require("neogit").open({ "commit" }) end, { desc = 'Commit', exit = true } },
+ { 'P', function() require("neogit").open({ "push" }) end, { desc = 'Push', exit = true } },
+ { 'l', function() require("neogit").open({ "log" }) end, { desc = 'Log', exit = true } },
+
+ -- Diffview
+ { 'd', 'DiffviewOpen', { desc = 'Diff anzeigen', exit = true } },
+
+ -- Beenden
+ { 'q', nil, { desc = 'beenden', exit = true } },
+ { '', nil, { desc = 'beenden', exit = true } },
+ }
+})
+
+-- Neo-tree Hydra
+Hydra({
+ name = 'Explorer',
+ mode = 'n',
+ body = 'E',
+ heads = {
+ { 'e', 'Neotree toggle right', { desc = 'Explorer ein/aus', exit = true } },
+ { 'f', 'Neotree focus filesystem right', { desc = 'Dateisystem', exit = true } },
+ { 'b', 'Neotree focus buffers right', { desc = 'Buffer', exit = true } },
+ { 'g', 'Neotree focus git_status right', { desc = 'Git-Status', exit = true } },
+
+ -- Leap Integration
+ { 's', function()
+ -- Öffne Neo-tree und springe mit Leap
+ vim.cmd('Neotree focus filesystem right')
+ -- Eine kleine Verzögerung, damit Neo-tree Zeit hat, zu öffnen
+ vim.defer_fn(function()
+ require('leap').leap { target_windows = { vim.api.nvim_get_current_win() } }
+ end, 100)
+ end,
+ { desc = 'Suchen mit Leap', exit = true }
+ },
+
+ -- Beenden
+ { 'q', nil, { desc = 'beenden', exit = true } },
+ { '', nil, { desc = 'beenden', exit = true } },
+ }
+})
+
+-- LSP und Coding-Hydra
+Hydra({
+ name = 'Code',
+ mode = 'n',
+ body = 'c',
+ heads = {
+ -- LSP Aktionen
+ { 'a', vim.lsp.buf.code_action, { desc = 'Code-Aktion' } },
+ { 'r', vim.lsp.buf.rename, { desc = 'Umbenennen' } },
+ { 'd', vim.lsp.buf.definition, { desc = 'Definition', exit = true } },
+ { 'D', vim.lsp.buf.declaration, { desc = 'Deklaration', exit = true } },
+ { 'i', vim.lsp.buf.implementation, { desc = 'Implementation', exit = true } },
+ { 'h', vim.lsp.buf.hover, { desc = 'Hover Info' } },
+ { 'f', function() require('conform').format() end, { desc = 'Formatieren' } },
+
+ -- Diagnostik
+ { 'n', vim.diagnostic.goto_next, { desc = 'Nächster Fehler' } },
+ { 'p', vim.diagnostic.goto_prev, { desc = 'Vorheriger Fehler' } },
+ { 'l', vim.diagnostic.open_float, { desc = 'Fehler anzeigen' } },
+
+ -- Beenden
+ { 'q', nil, { desc = 'beenden', exit = true } },
+ { '', nil, { desc = 'beenden', exit = true } },
+ }
+})
+
+-- Erweiterte Navigation mit Leap und Harpoon
+Hydra({
+ name = 'Navigation',
+ mode = 'n',
+ body = 'n',
+ heads = {
+ -- Leap
+ { 'f', function() require('leap').leap { target_windows = { vim.api.nvim_get_current_win() } } end,
+ { desc = 'Leap vorwärts', exit = true } },
+ { 'F', function() require('leap').leap { backward = true, target_windows = { vim.api.nvim_get_current_win() } } end,
+ { desc = 'Leap rückwärts', exit = true } },
+ { 'w', function()
+ require('leap').leap { target_windows = vim.tbl_filter(
+ function(win) return vim.api.nvim_win_get_config(win).relative == '' end,
+ vim.api.nvim_list_wins()
+ ) }
+ end, { desc = 'Leap alle Fenster', exit = true } },
+
+ -- Harpoon
+ { 'h', function() require("harpoon.ui").toggle_quick_menu() end, { desc = 'Harpoon-Menü', exit = true } },
+ { '1', function() require("harpoon.ui").nav_file(1) end, { desc = 'Harpoon 1', exit = true } },
+ { '2', function() require("harpoon.ui").nav_file(2) end, { desc = 'Harpoon 2', exit = true } },
+ { '3', function() require("harpoon.ui").nav_file(3) end, { desc = 'Harpoon 3', exit = true } },
+ { '4', function() require("harpoon.ui").nav_file(4) end, { desc = 'Harpoon 4', exit = true } },
+
+ -- Dateiexploration
+ { 'e', 'Neotree toggle right', { desc = 'Explorer', exit = true } },
+ { 't', 'Telescope find_files', { desc = 'Dateien suchen', exit = true } },
+ { 'g', 'Telescope live_grep', { desc = 'Inhalte suchen', exit = true } },
+
+ -- Beenden
+ { 'q', nil, { desc = 'beenden', exit = true } },
+ { '', nil, { desc = 'beenden', exit = true } },
+ }
+})
diff --git a/.config/nvim/lua/custom/lsp.lua b/.config/nvim/lua/custom/lsp.lua
new file mode 100644
index 0000000..84fe8f3
--- /dev/null
+++ b/.config/nvim/lua/custom/lsp.lua
@@ -0,0 +1,280 @@
+-- LSP und Treesitter Konfiguration
+local capabilities = vim.lsp.protocol.make_client_capabilities()
+capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
+
+-- Mason für einfache LSP-Installation
+require('mason').setup()
+require('mason-lspconfig').setup({
+ ensure_installed = {
+ -- Sprachen
+ 'lua_ls', -- Lua
+ 'pyright', -- Python
+ 'ruff', -- Python Linter
+ 'ts_ls', -- TypeScript/JavaScript
+ -- 'vue-language-server', -- Vue
+ 'intelephense', -- PHP
+ 'html', -- HTML
+ 'cssls', -- CSS
+ 'yamlls', -- YAML
+ 'jsonls', -- JSON
+ 'docker_compose_language_service', -- Docker Compose
+ 'dockerls', -- Dockerfile
+ 'gopls',
+ },
+})
+
+-- LSP-Server konfigurieren
+local lspconfig = require('lspconfig')
+
+-- Lua
+lspconfig.lua_ls.setup({
+ capabilities = capabilities,
+})
+
+-- TypeScript (inkl. React)
+lspconfig.ts_ls.setup({
+ capabilities = capabilities,
+})
+
+-- Typescript-Tools für bessere TS/JS Unterstützung
+require("typescript-tools").setup({
+ settings = {
+ -- Für NestJS, React und andere TS-Frameworks
+ tsserver_file_preferences = {
+ importModuleSpecifierPreference = "relative",
+ },
+ },
+})
+
+-- Python
+lspconfig.pyright.setup({
+ capabilities = capabilities,
+})
+
+-- PHP/Symfony
+lspconfig.intelephense.setup({
+ capabilities = capabilities,
+ settings = {
+ intelephense = {
+ stubs = {
+ "apache", "bcmath", "bz2", "calendar", "Core", "curl", "date", "dba",
+ "dom", "fileinfo", "filter", "ftp", "gd", "gettext", "hash", "iconv",
+ "imap", "intl", "json", "ldap", "libxml", "mbstring", "mysqli", "mysqlnd",
+ "oci8", "openssl", "pcntl", "pcre", "PDO", "pdo_mysql", "pdo_pgsql",
+ "pdo_sqlite", "pgsql", "Phar", "posix", "pspell", "readline", "Reflection",
+ "session", "shmop", "SimpleXML", "snmp", "soap", "sockets", "sodium", "SPL",
+ "sqlite3", "standard", "superglobals", "sysvmsg", "sysvsem", "sysvshm",
+ "tidy", "tokenizer", "xml", "xmlreader", "xmlrpc", "xmlwriter", "xsl", "Zend OPcache",
+ "zip", "zlib", "wordpress", "symfony"
+ },
+ },
+ },
+})
+
+-- Go
+lspconfig.gopls.setup({
+ capabilities = capabilities,
+ settings = {
+ gopls = {
+ analyses = {
+ unusedparams = true,
+ },
+ staticcheck = true,
+ gofumpt = true, -- Strengere Formatierung als gofmt
+ usePlaceholders = true,
+ completeUnimported = true,
+ experimentalPostfixCompletions = true,
+ },
+ },
+})
+
+-- YAML mit Schema-Unterstützung
+lspconfig.yamlls.setup({
+ capabilities = capabilities,
+ settings = {
+ yaml = {
+ schemas = require('schemastore').yaml.schemas(),
+ },
+ },
+})
+
+-- JSON mit Schema-Unterstützung
+lspconfig.jsonls.setup({
+ capabilities = capabilities,
+ settings = {
+ json = {
+ schemas = require('schemastore').json.schemas(),
+ validate = { enable = true },
+ },
+ },
+})
+
+-- Treesitter-Konfiguration für Syntax-Highlighting
+require('nvim-treesitter.configs').setup({
+ ensure_installed = {
+ "lua", "vim", "vimdoc", "json", "yaml", "html", "css",
+ "javascript", "typescript", "tsx", "php", "python", "vue",
+ "dockerfile", "markdown", "regex", "bash", "go",
+ },
+ highlight = { enable = true },
+ indent = { enable = true },
+})
+
+-- Autocomplete-Konfiguration
+local cmp = require('cmp')
+local luasnip = require('luasnip')
+
+cmp.setup({
+ snippet = {
+ expand = function(args)
+ luasnip.lsp_expand(args.body)
+ end,
+ },
+ window = {
+ completion = cmp.config.window.bordered(),
+ documentation = cmp.config.window.bordered(),
+ },
+ mapping = cmp.mapping.preset.insert({
+ [''] = cmp.mapping.scroll_docs(-4),
+ [''] = cmp.mapping.scroll_docs(4),
+ [''] = cmp.mapping.complete(),
+ [''] = cmp.mapping.confirm({ select = true }),
+ [''] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_next_item()
+ elseif luasnip.expand_or_jumpable() then
+ luasnip.expand_or_jump()
+ else
+ fallback()
+ end
+ end, { 'i', 's' }),
+ [''] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_prev_item()
+ elseif luasnip.jumpable(-1) then
+ luasnip.jump(-1)
+ else
+ fallback()
+ end
+ end, { 'i', 's' }),
+ }),
+ sources = cmp.config.sources({
+ { name = 'nvim_lsp' },
+ { name = 'luasnip' },
+ { name = 'buffer' },
+ { name = 'path' },
+ }),
+})
+
+-- Einfache benutzerdefinierte Snippets (optional)
+-- Hier ein Beispiel für ein paar einfache Snippets
+local snippets_path = vim.fn.stdpath("config") .. "/snippets"
+if vim.fn.isdirectory(snippets_path) == 0 then
+ vim.fn.mkdir(snippets_path, "p")
+end
+
+-- Füge einige nützliche Snippets hinzu
+luasnip.add_snippets("python", {
+ luasnip.snippet("def", {
+ luasnip.text_node("def "),
+ luasnip.insert_node(1, "function_name"),
+ luasnip.text_node("("),
+ luasnip.insert_node(2, "args"),
+ luasnip.text_node("):\n\t"),
+ luasnip.insert_node(0),
+ }),
+})
+
+luasnip.add_snippets("typescript", {
+ luasnip.snippet("fn", {
+ luasnip.text_node("function "),
+ luasnip.insert_node(1, "name"),
+ luasnip.text_node("("),
+ luasnip.insert_node(2, "params"),
+ luasnip.text_node(") {\n\t"),
+ luasnip.insert_node(0),
+ luasnip.text_node("\n}"),
+ }),
+})
+
+luasnip.add_snippets("go", {
+ luasnip.snippet("func", {
+ luasnip.text_node("func "),
+ luasnip.insert_node(1, "name"),
+ luasnip.text_node("("),
+ luasnip.insert_node(2, "params"),
+ luasnip.text_node(") "),
+ luasnip.insert_node(3, "returnType"),
+ luasnip.text_node(" {\n\t"),
+ luasnip.insert_node(0),
+ luasnip.text_node("\n}"),
+ }),
+ luasnip.snippet("if", {
+ luasnip.text_node("if "),
+ luasnip.insert_node(1, "condition"),
+ luasnip.text_node(" {\n\t"),
+ luasnip.insert_node(0),
+ luasnip.text_node("\n}"),
+ }),
+})
+
+-- Code-Formatierung
+require("conform").setup({
+ formatters_by_ft = {
+ javascript = { "prettier" },
+ typescript = { "prettier" },
+ javascriptreact = { "prettier" },
+ typescriptreact = { "prettier" },
+ vue = { "prettier" },
+ json = { "prettier" },
+ yaml = { "prettier" },
+ html = { "prettier" },
+ css = { "prettier" },
+ php = { "php_cs_fixer" },
+ python = { "black" },
+ lua = { "stylua" },
+ go = { "gofumpt" },
+ },
+})
+
+-- Formatierung beim Speichern
+vim.api.nvim_create_autocmd("BufWritePre", {
+ pattern = "*",
+ callback = function()
+ require("conform").format({ async = false, lsp_fallback = true })
+ end,
+})
+
+
+-- Einstellungen für die Diagnostik (Fehleranzeige)
+vim.diagnostic.config({
+ virtual_text = {
+ format = function(diagnostic)
+ local icon = "→ "
+ if diagnostic.severity == vim.diagnostic.severity.ERROR then
+ icon = "✗ "
+ elseif diagnostic.severity == vim.diagnostic.severity.WARN then
+ icon = "⚠ "
+ elseif diagnostic.severity == vim.diagnostic.severity.INFO then
+ icon = "ℹ "
+ elseif diagnostic.severity == vim.diagnostic.severity.HINT then
+ icon = "➤ "
+ end
+ return icon .. diagnostic.message
+ end
+ },
+ signs = true, -- Symbole in der Randspalte anzeigen
+ underline = true, -- Problematischen Code unterstreichen
+ update_in_insert = false,
+ severity_sort = true,
+ float = {
+ border = "rounded",
+ source = "always",
+ },
+})
+
+-- Tastenkombinationen für Diagnostik
+vim.keymap.set('n', 'cd', vim.diagnostic.open_float, { desc = 'Fehlerdetails anzeigen' })
+vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Vorheriger Fehler' })
+vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Nächster Fehler' })
+vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Fehler in Liste anzeigen' })
diff --git a/.config/nvim/lua/custom/plugins.lua b/.config/nvim/lua/custom/plugins.lua
new file mode 100644
index 0000000..ec9a395
--- /dev/null
+++ b/.config/nvim/lua/custom/plugins.lua
@@ -0,0 +1,449 @@
+return {
+ -- Fuzzy Finder
+ {
+ 'nvim-telescope/telescope.nvim',
+ dependencies = {
+ 'nvim-lua/plenary.nvim',
+ 'nvim-telescope/telescope-fzf-native.nvim',
+ },
+ },
+
+ -- LSP & Completion
+ {
+ 'neovim/nvim-lspconfig',
+ dependencies = {
+ 'williamboman/mason.nvim',
+ 'williamboman/mason-lspconfig.nvim',
+ 'hrsh7th/nvim-cmp',
+ 'hrsh7th/cmp-nvim-lsp',
+ 'hrsh7th/cmp-buffer',
+ 'hrsh7th/cmp-path',
+ 'L3MON4D3/LuaSnip',
+ 'saadparwaiz1/cmp_luasnip',
+ 'j-hui/fidget.nvim',
+ },
+ config = function()
+ -- Nichts hier definieren - wir laden die Konfiguration aus der lsp.lua
+ require("custom.lsp")
+ end,
+ },
+
+ -- Snipped
+ {
+ "rafamadriz/friendly-snippets",
+ dependencies = {
+ "L3MON4D3/LuaSnip",
+ },
+ config = function()
+ require("luasnip.loaders.from_vscode").lazy_load()
+ end,
+ },
+
+ -- Syntax Highlighting
+ {
+ 'nvim-treesitter/nvim-treesitter',
+ build = ':TSUpdate',
+ dependencies = {
+ 'nvim-treesitter/nvim-treesitter-textobjects',
+ },
+ },
+
+ -- Datei-Explorer
+ {
+ "nvim-neo-tree/neo-tree.nvim",
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ "nvim-tree/nvim-web-devicons", -- Für Datei-Icons
+ "MunifTanjim/nui.nvim", -- UI-Komponenten-Bibliothek
+ },
+ config = function()
+ -- Standardkonfiguration deaktivieren
+ vim.g.neo_tree_remove_legacy_commands = 1
+
+ require("neo-tree").setup({
+ close_if_last_window = false, -- Neovim schließen, wenn nur noch Neo-tree offen ist?
+ popup_border_style = "rounded", -- Stil für Popup-Fenster
+ enable_git_status = true, -- Git-Integration aktivieren
+ enable_diagnostics = true, -- Zeige Diagnostik-Informationen (LSP)
+
+ default_component_configs = {
+ container = {
+ enable_character_fade = true, -- Schöne Übergänge bei Textlängen
+ width = "100%",
+ right_padding = 0,
+ },
+ indent = {
+ indent_size = 2,
+ padding = 1,
+ with_markers = true,
+ indent_marker = "│",
+ last_indent_marker = "└",
+ highlight = "NeoTreeIndentMarker",
+ with_expanders = true, -- Klick-/Tastatur-expandierbare Ordner
+ expander_collapsed = "",
+ expander_expanded = "",
+ expander_highlight = "NeoTreeExpander",
+ },
+ icon = {
+ folder_closed = "",
+ folder_open = "",
+ folder_empty = "",
+ default = "*",
+ highlight = "NeoTreeFileIcon"
+ },
+ modified = {
+ symbol = "[+]",
+ highlight = "NeoTreeModified",
+ },
+ name = {
+ trailing_slash = false,
+ use_git_status_colors = true,
+ highlight = "NeoTreeFileName",
+ },
+ git_status = {
+ symbols = {
+ -- Symbole für Git-Status
+ added = "✚", -- oder "✚"
+ modified = "", -- oder "✹"
+ deleted = "✖", -- oder ""
+ renamed = "➜", -- oder ""
+ untracked = "★", -- oder "✭"
+ ignored = "◌", -- oder "◌"
+ unstaged = "✗", -- oder "✗"
+ staged = "✓", -- oder "✓"
+ conflict = "", -- oder "≠"
+ }
+ },
+ },
+
+ -- Welche Ansichten verfügbar sein sollen
+ source_selector = {
+ winbar = true, -- Zeige Auswahl in der Fensterleiste
+ statusline = false, -- Nicht in der Statuszeile anzeigen
+ content_layout = "center",
+ sources = { -- Verfügbare Quellen
+ { source = "filesystem", display_name = " Dateien " },
+ { source = "buffers", display_name = " Buffer " },
+ { source = "git_status", display_name = " Git " },
+ },
+ tabs_layout = "equal", -- "equal", "focus"
+ },
+
+ -- Dateisystemansicht
+ filesystem = {
+ filtered_items = {
+ visible = true, -- Gefilterte Elemente mit anderen Stil anzeigen
+ hide_dotfiles = false, -- Versteckte Dateien anzeigen
+ hide_gitignored = false, -- Git-ignorierte Dateien anzeigen
+ hide_hidden = false, -- Versteckte Dateien unter Windows anzeigen
+ hide_by_name = {
+ -- "node_modules", -- Auskommentieren, um zu verstecken
+ },
+ hide_by_pattern = {
+ -- "*.meta", -- Auskommentieren, um zu verstecken
+ },
+ always_show = { -- Immer anzeigen, auch wenn sie sonst gefiltert würden
+ ".gitignored",
+ ".env",
+ },
+ never_show = { -- Dateien, die immer ausgeblendet werden
+ ".DS_Store",
+ },
+ never_show_by_pattern = { -- Regex-Muster für Dateien, die nie angezeigt werden
+ -- ".*\\.meta$",
+ },
+ },
+ follow_current_file = {
+ enabled = true, -- Hervorheben der aktuellen Datei im Explorer
+ leave_dirs_open = false, -- Ordner öffnen, wenn Datei darin
+ },
+ group_empty_dirs = false, -- Leere Unterordner unter Elternordner gruppieren
+ hijack_netrw_behavior = "open_default", -- Netrw ersetzen
+ use_libuv_file_watcher = true, -- Effiziente Dateiüberwachung (bemerkt Änderungen)
+
+ window = {
+ mappings = {
+ -- Tastenkombinationen im Dateisystem-Fenster
+ [""] = "none", -- Space für andere Funktionen freigeben
+ ["<2-LeftMouse>"] = "open",
+ [""] = "open",
+ ["S"] = "open_split", -- In horizontales Split öffnen
+ ["s"] = "open_vsplit", -- In vertikales Split öffnen
+ ["t"] = "open_tabnew", -- In neuem Tab öffnen
+ ["C"] = "close_node", -- Knoten schließen
+ ["z"] = "close_all_nodes", -- Alle Knoten schließen
+ ["R"] = "refresh", -- Aktualisieren
+ ["a"] = {
+ "add", -- Neue Datei/Ordner erstellen
+ config = {
+ show_path =
+ "relative" -- Relativen Pfad beim Erstellen anzeigen
+ }
+ },
+ ["d"] = "delete", -- Löschen
+ ["r"] = "rename", -- Umbenennen
+ ["y"] = "copy_to_clipboard", -- In Zwischenablage kopieren
+ ["x"] = "cut_to_clipboard", -- Ausschneiden
+ ["p"] = "paste_from_clipboard", -- Einfügen
+ ["c"] = "copy", -- Kopieren (mit Ziel-Auswahl)
+ ["m"] = "move", -- Verschieben (mit Ziel-Auswahl)
+ ["/"] = "filter_on_submit", -- Filtern
+ [""] = "clear_filter", -- Filter löschen
+ ["f"] = "filter_on_submit", -- Filtern (Alternative)
+ [""] = "clear_filter", -- Filter löschen (Alternative)
+ ["?"] = "show_help", -- Hilfe anzeigen
+ }
+ },
+ },
+
+ -- Buffer-Ansicht (Geöffnete Dateien)
+ buffers = {
+ follow_current_file = {
+ enabled = true, -- Aktuelle Datei hervorheben
+ },
+ group_empty_dirs = true, -- Leere Ordner gruppieren
+ show_unloaded = true, -- Auch nicht geladene Buffer anzeigen
+ },
+
+ -- Git-Status-Ansicht
+ git_status = {
+ window = {
+ mappings = {
+ ["A"] = "git_add_all", -- Alle Änderungen stagen
+ ["u"] = "git_unstage_file", -- Datei unstagen
+ ["a"] = "git_add_file", -- Datei stagen
+ ["r"] = "git_revert_file", -- Änderungen zurücksetzen
+ ["c"] = "git_commit", -- Commit erstellen
+ ["p"] = "git_push", -- Push
+ ["gg"] = "git_commit_and_push", -- Commit und Push
+ }
+ }
+ },
+
+ -- Hauptfenster-Konfiguration
+ window = {
+ position = "right", -- Explorer auf der rechten Seite
+ width = 35, -- Breite des Explorers
+ mapping_options = {
+ noremap = true,
+ nowait = true,
+ },
+ mappings = {
+ [""] = "none", -- Space für andere Funktionen freigeben
+ ["<2-LeftMouse>"] = "open",
+ [""] = "open",
+ ["S"] = "open_split",
+ ["s"] = "open_vsplit",
+ ["t"] = "open_tabnew",
+ ["w"] = "open_with_window_picker", -- Mit Fensterauswahl öffnen
+ ["C"] = "close_node",
+ ["z"] = "close_all_nodes",
+ ["R"] = "refresh",
+ ["a"] = {
+ "add",
+ config = {
+ show_path = "relative"
+ }
+ },
+ ["d"] = "delete",
+ ["r"] = "rename",
+ ["y"] = "copy_to_clipboard",
+ ["x"] = "cut_to_clipboard",
+ ["p"] = "paste_from_clipboard",
+ ["c"] = "copy",
+ ["m"] = "move",
+ ["q"] = "close_window", -- Fenster schließen
+ ["?"] = "show_help",
+ }
+ }
+ })
+
+ -- Tastenkombination zum Öffnen des Explorers
+ vim.keymap.set("n", "e", ":Neotree toggle right",
+ { silent = true, desc = "Explorer ein/aus" })
+ -- Tastenkombination für Dateiansicht
+ vim.keymap.set("n", "ef", ":Neotree focus filesystem right",
+ { silent = true, desc = "Datei-Explorer" })
+ -- Tastenkombination für Buffer-Liste
+ vim.keymap.set("n", "eb", ":Neotree focus buffers right",
+ { silent = true, desc = "Buffer-Liste" })
+ -- Tastenkombination für Git-Status
+ vim.keymap.set("n", "eg", ":Neotree focus git_status right",
+ { silent = true, desc = "Git-Status" })
+ end,
+ },
+
+ -- Schnellwechsel zwischen Dateien (wie Harpoon)
+ {
+ 'ThePrimeagen/harpoon',
+ dependencies = {
+ 'nvim-lua/plenary.nvim',
+ },
+ config = function()
+ -- Basiseinstellungen für Harpoon
+ require("harpoon").setup()
+
+ -- Einfache, direkte Keybindings
+ vim.keymap.set("n", "a", require("harpoon.mark").add_file, { desc = "Datei markieren" })
+ vim.keymap.set("n", "h", require("harpoon.ui").toggle_quick_menu,
+ { desc = "Harpoon-Menü" })
+ vim.keymap.set("n", "", function() require("harpoon.ui").nav_file(1) end)
+ vim.keymap.set("n", "", function() require("harpoon.ui").nav_file(2) end)
+ vim.keymap.set("n", "", function() require("harpoon.ui").nav_file(3) end)
+ vim.keymap.set("n", "", function() require("harpoon.ui").nav_file(4) end)
+ end,
+ },
+
+ -- Git-Integration
+ {
+ 'lewis6991/gitsigns.nvim',
+ config = true,
+ },
+
+ -- Formatierung
+ {
+ 'stevearc/conform.nvim',
+ },
+
+ -- Framework-Unterstützung
+
+ -- PHP/Symfony
+ {
+ 'phpactor/phpactor',
+ ft = 'php',
+ build = 'composer install --no-dev -o',
+ },
+
+ -- TypeScript/JavaScript/React/Vue/NestJS
+ {
+ 'pmizio/typescript-tools.nvim',
+ dependencies = {
+ 'nvim-lua/plenary.nvim',
+ 'neovim/nvim-lspconfig',
+ },
+ config = function()
+ require("typescript-tools").setup({
+ settings = {
+ tsserver_file_preferences = {
+ importModuleSpecifierPreference = "relative",
+ },
+ },
+ })
+ end,
+ },
+
+ -- Vue.js
+ -- {
+ -- 'neovim/nvim-lspconfig',
+ -- opts = function(_, opts)
+ -- -- Füge Volar als Server hinzu
+ -- opts.servers = opts.servers or {}
+ -- opts.servers.volar = {
+ -- filetypes = { 'vue', 'typescript', 'javascript' }
+ -- }
+ -- end,
+ -- },
+
+ -- Playwright Testing
+ {
+ 'mxsdev/nvim-dap',
+ dependencies = {
+ 'rcarriga/nvim-dap-ui',
+ 'mfussenegger/nvim-dap-python',
+ },
+ },
+
+ -- YAML und JSON Unterstützung
+ 'b0o/schemastore.nvim',
+
+ -- Für Zen-Modus
+ {
+ "folke/zen-mode.nvim",
+ cmd = "ZenMode",
+ opts = {
+ window = {
+ width = 90,
+ options = {
+ number = false,
+ relativenumber = false,
+ },
+ },
+ },
+ },
+
+ -- Für Git-Integration
+ {
+ "sindrets/diffview.nvim",
+ dependencies = { "nvim-lua/plenary.nvim" },
+ },
+
+ -- Für Neogit
+ {
+ "NeogitOrg/neogit",
+ dependencies = {
+ "nvim-lua/plenary.nvim",
+ "sindrets/diffview.nvim",
+ },
+ cmd = "Neogit",
+ },
+
+ -- Für Farbvorschau in Code
+ {
+ "norcalli/nvim-colorizer.lua",
+ cmd = "ColorizerToggle",
+ config = true,
+ },
+
+ -- Leap/Lightspeed
+ {
+ "ggandor/leap.nvim",
+ config = function()
+ require('leap').add_default_mappings()
+ end,
+ },
+
+ -- Hydra für kontextbezogene Tastaturmodi
+ {
+ "anuvyklack/hydra.nvim",
+ event = "VeryLazy",
+ config = function()
+ -- Die Konfigurationen folgen im nächsten Schritt
+ require("custom.hydra")
+ end,
+ },
+
+ -- Window-Picker
+ {
+ "s1n7ax/nvim-window-picker",
+ version = "v2.*",
+ config = function()
+ require("window-picker").setup({
+ filter_rules = {
+ -- Filtere diese Fenstertypen aus
+ bo = {
+ filetype = { "neo-tree", "neo-tree-popup", "notify", "quickfix" },
+ buftype = { "terminal" },
+ },
+ },
+ highlights = {
+ statusline = {
+ focused = {
+ fg = "#000000",
+ bg = "#E35E4F",
+ },
+ unfocused = {
+ fg = "#000000",
+ bg = "#44CC41",
+ },
+ },
+ },
+ picker_config = {
+ statusline_winbar_picker = {
+ -- Verwende Buchstaben des Alphabets für die Fensterauswahl
+ selection_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ },
+ },
+ })
+ end,
+ }
+}
diff --git a/.config/nvim/lua/custom/plugins/init.lua b/.config/nvim/lua/custom/plugins/init.lua
new file mode 100644
index 0000000..be0eb9d
--- /dev/null
+++ b/.config/nvim/lua/custom/plugins/init.lua
@@ -0,0 +1,5 @@
+-- You can add your own plugins here or in other files in this directory!
+-- I promise not to create any merge conflicts in this directory :)
+--
+-- See the kickstart.nvim README for more information
+return {}
diff --git a/.config/nvim/lua/kickstart/health.lua b/.config/nvim/lua/kickstart/health.lua
new file mode 100644
index 0000000..b59d086
--- /dev/null
+++ b/.config/nvim/lua/kickstart/health.lua
@@ -0,0 +1,52 @@
+--[[
+--
+-- This file is not required for your own configuration,
+-- but helps people determine if their system is setup correctly.
+--
+--]]
+
+local check_version = function()
+ local verstr = tostring(vim.version())
+ if not vim.version.ge then
+ vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr))
+ return
+ end
+
+ if vim.version.ge(vim.version(), '0.10-dev') then
+ vim.health.ok(string.format("Neovim version is: '%s'", verstr))
+ else
+ vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr))
+ end
+end
+
+local check_external_reqs = function()
+ -- Basic utils: `git`, `make`, `unzip`
+ for _, exe in ipairs { 'git', 'make', 'unzip', 'rg' } do
+ local is_executable = vim.fn.executable(exe) == 1
+ if is_executable then
+ vim.health.ok(string.format("Found executable: '%s'", exe))
+ else
+ vim.health.warn(string.format("Could not find executable: '%s'", exe))
+ end
+ end
+
+ return true
+end
+
+return {
+ check = function()
+ vim.health.start 'kickstart.nvim'
+
+ vim.health.info [[NOTE: Not every warning is a 'must-fix' in `:checkhealth`
+
+ Fix only warnings for plugins and languages you intend to use.
+ Mason will give warnings for languages that are not installed.
+ You do not need to install, unless you want to use those languages!]]
+
+ local uv = vim.uv or vim.loop
+ vim.health.info('System Information: ' .. vim.inspect(uv.os_uname()))
+
+ check_version()
+ check_external_reqs()
+ end,
+}
diff --git a/.config/nvim/lua/kickstart/plugins/autopairs.lua b/.config/nvim/lua/kickstart/plugins/autopairs.lua
new file mode 100644
index 0000000..87a7e5f
--- /dev/null
+++ b/.config/nvim/lua/kickstart/plugins/autopairs.lua
@@ -0,0 +1,16 @@
+-- autopairs
+-- https://github.com/windwp/nvim-autopairs
+
+return {
+ 'windwp/nvim-autopairs',
+ event = 'InsertEnter',
+ -- Optional dependency
+ dependencies = { 'hrsh7th/nvim-cmp' },
+ config = function()
+ require('nvim-autopairs').setup {}
+ -- If you want to automatically add `(` after selecting a function or method
+ local cmp_autopairs = require 'nvim-autopairs.completion.cmp'
+ local cmp = require 'cmp'
+ cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done())
+ end,
+}
diff --git a/.config/nvim/lua/kickstart/plugins/debug.lua b/.config/nvim/lua/kickstart/plugins/debug.lua
new file mode 100644
index 0000000..753cb0c
--- /dev/null
+++ b/.config/nvim/lua/kickstart/plugins/debug.lua
@@ -0,0 +1,148 @@
+-- debug.lua
+--
+-- Shows how to use the DAP plugin to debug your code.
+--
+-- Primarily focused on configuring the debugger for Go, but can
+-- be extended to other languages as well. That's why it's called
+-- kickstart.nvim and not kitchen-sink.nvim ;)
+
+return {
+ -- NOTE: Yes, you can install new plugins here!
+ 'mfussenegger/nvim-dap',
+ -- NOTE: And you can specify dependencies as well
+ dependencies = {
+ -- Creates a beautiful debugger UI
+ 'rcarriga/nvim-dap-ui',
+
+ -- Required dependency for nvim-dap-ui
+ 'nvim-neotest/nvim-nio',
+
+ -- Installs the debug adapters for you
+ 'williamboman/mason.nvim',
+ 'jay-babu/mason-nvim-dap.nvim',
+
+ -- Add your own debuggers here
+ 'leoluz/nvim-dap-go',
+ },
+ keys = {
+ -- Basic debugging keymaps, feel free to change to your liking!
+ {
+ '',
+ function()
+ require('dap').continue()
+ end,
+ desc = 'Debug: Start/Continue',
+ },
+ {
+ '