From 1d5ca0aa2971d2485575ed7c5efad17144cb3fb1 Mon Sep 17 00:00:00 2001 From: pablu Date: Sun, 22 Mar 2026 18:04:35 +0100 Subject: [PATCH] Initial commit --- dot_config/dunst/dunstrc | 16 + dot_config/ghostty/config | 19 + dot_config/hypr/config/binds.conf | 110 ++++++ dot_config/hypr/config/env.conf | 9 + dot_config/hypr/config/games.conf | 37 ++ dot_config/hypr/config/general.conf | 110 ++++++ dot_config/hypr/config/programs.conf | 27 ++ dot_config/hypr/config/rules.conf | 30 ++ dot_config/hypr/executable_fix-hypr-lock.sh | 8 + dot_config/hypr/executable_games.py | 56 +++ dot_config/hypr/hyprland.conf | 7 + dot_config/hypr/hyprland.conf.bak2 | 349 ++++++++++++++++++ dot_config/hypr/hyprlock.conf | 90 +++++ dot_config/hypr/hyprpaper.conf | 12 + dot_config/nvim/dot_git/HEAD | 1 + dot_config/nvim/dot_git/config | 11 + dot_config/nvim/dot_git/description | 1 + .../hooks/executable_applypatch-msg.sample | 15 + .../hooks/executable_commit-msg.sample | 24 ++ .../executable_fsmonitor-watchman.sample | 174 +++++++++ .../hooks/executable_post-update.sample | 8 + .../hooks/executable_pre-applypatch.sample | 14 + .../hooks/executable_pre-commit.sample | 49 +++ .../hooks/executable_pre-merge-commit.sample | 13 + .../dot_git/hooks/executable_pre-push.sample | 53 +++ .../hooks/executable_pre-rebase.sample | 169 +++++++++ .../hooks/executable_pre-receive.sample | 24 ++ .../executable_prepare-commit-msg.sample | 42 +++ .../hooks/executable_push-to-checkout.sample | 78 ++++ .../executable_sendemail-validate.sample | 77 ++++ .../dot_git/hooks/executable_update.sample | 128 +++++++ dot_config/nvim/dot_git/index | Bin 0 -> 2383 bytes dot_config/nvim/dot_git/info/exclude | 6 + dot_config/nvim/dot_git/logs/HEAD | 1 + .../nvim/dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + dot_config/nvim/dot_git/objects/info/.keep | 0 ...06998243217e48a94f5076ddda793742adba7f.idx | Bin 0 -> 9976 bytes ...6998243217e48a94f5076ddda793742adba7f.pack | Bin 0 -> 44563 bytes ...06998243217e48a94f5076ddda793742adba7f.rev | Bin 0 -> 1324 bytes dot_config/nvim/dot_git/packed-refs | 2 + dot_config/nvim/dot_git/refs/heads/master | 1 + .../nvim/dot_git/refs/remotes/origin/HEAD | 1 + dot_config/nvim/dot_git/refs/tags/.keep | 0 dot_config/nvim/dot_gitignore | 1 + dot_config/nvim/init.lua | 110 ++++++ dot_config/nvim/lazy-lock.json | 35 ++ dot_config/nvim/lua/plugins/autoclose.lua | 6 + dot_config/nvim/lua/plugins/blink.lua | 31 ++ dot_config/nvim/lua/plugins/catppuccin.lua | 24 ++ dot_config/nvim/lua/plugins/conform.lua | 22 ++ dot_config/nvim/lua/plugins/dap.lua | 77 ++++ dot_config/nvim/lua/plugins/fidget.lua | 4 + dot_config/nvim/lua/plugins/flash.lua | 9 + dot_config/nvim/lua/plugins/linter.lua | 17 + dot_config/nvim/lua/plugins/lsp.lua | 37 ++ dot_config/nvim/lua/plugins/lualine.lua | 11 + dot_config/nvim/lua/plugins/mason.lua | 4 + dot_config/nvim/lua/plugins/neotest.lua | 22 ++ dot_config/nvim/lua/plugins/oil.lua | 10 + dot_config/nvim/lua/plugins/telescope.lua | 33 ++ dot_config/nvim/lua/plugins/tiny-inline.lua | 19 + dot_config/nvim/lua/plugins/tmux.lua | 15 + dot_config/nvim/lua/plugins/treesitter.lua | 25 ++ dot_config/nvim/lua/plugins/vim-lazy-dev.lua | 11 + dot_config/nvim/lua/plugins/which-key.lua | 27 ++ dot_config/nvim/lua/vim-options.lua | 11 + dot_config/nvim/queries/gotmpl/injections.scm | 3 + dot_config/nvim/readme.md | 2 + dot_config/starship.toml | 3 + dot_config/waybar/config | 50 +++ dot_config/waybar/style.css | 53 +++ dot_tmux.conf | 57 +++ dot_zshrc | 34 ++ 74 files changed, 2537 insertions(+) create mode 100644 dot_config/dunst/dunstrc create mode 100644 dot_config/ghostty/config create mode 100644 dot_config/hypr/config/binds.conf create mode 100644 dot_config/hypr/config/env.conf create mode 100644 dot_config/hypr/config/games.conf create mode 100644 dot_config/hypr/config/general.conf create mode 100644 dot_config/hypr/config/programs.conf create mode 100644 dot_config/hypr/config/rules.conf create mode 100644 dot_config/hypr/executable_fix-hypr-lock.sh create mode 100644 dot_config/hypr/executable_games.py create mode 100644 dot_config/hypr/hyprland.conf create mode 100644 dot_config/hypr/hyprland.conf.bak2 create mode 100644 dot_config/hypr/hyprlock.conf create mode 100644 dot_config/hypr/hyprpaper.conf create mode 100644 dot_config/nvim/dot_git/HEAD create mode 100644 dot_config/nvim/dot_git/config create mode 100644 dot_config/nvim/dot_git/description create mode 100644 dot_config/nvim/dot_git/hooks/executable_applypatch-msg.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_commit-msg.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_fsmonitor-watchman.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_post-update.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_pre-applypatch.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_pre-commit.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_pre-merge-commit.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_pre-push.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_pre-rebase.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_pre-receive.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_prepare-commit-msg.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_push-to-checkout.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_sendemail-validate.sample create mode 100644 dot_config/nvim/dot_git/hooks/executable_update.sample create mode 100644 dot_config/nvim/dot_git/index create mode 100644 dot_config/nvim/dot_git/info/exclude create mode 100644 dot_config/nvim/dot_git/logs/HEAD create mode 100644 dot_config/nvim/dot_git/logs/refs/heads/master create mode 100644 dot_config/nvim/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_config/nvim/dot_git/objects/info/.keep create mode 100644 dot_config/nvim/dot_git/objects/pack/readonly_pack-d806998243217e48a94f5076ddda793742adba7f.idx create mode 100644 dot_config/nvim/dot_git/objects/pack/readonly_pack-d806998243217e48a94f5076ddda793742adba7f.pack create mode 100644 dot_config/nvim/dot_git/objects/pack/readonly_pack-d806998243217e48a94f5076ddda793742adba7f.rev create mode 100644 dot_config/nvim/dot_git/packed-refs create mode 100644 dot_config/nvim/dot_git/refs/heads/master create mode 100644 dot_config/nvim/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_config/nvim/dot_git/refs/tags/.keep create mode 100644 dot_config/nvim/dot_gitignore create mode 100644 dot_config/nvim/init.lua create mode 100644 dot_config/nvim/lazy-lock.json create mode 100644 dot_config/nvim/lua/plugins/autoclose.lua create mode 100644 dot_config/nvim/lua/plugins/blink.lua create mode 100644 dot_config/nvim/lua/plugins/catppuccin.lua create mode 100644 dot_config/nvim/lua/plugins/conform.lua create mode 100644 dot_config/nvim/lua/plugins/dap.lua create mode 100644 dot_config/nvim/lua/plugins/fidget.lua create mode 100644 dot_config/nvim/lua/plugins/flash.lua create mode 100644 dot_config/nvim/lua/plugins/linter.lua create mode 100644 dot_config/nvim/lua/plugins/lsp.lua create mode 100644 dot_config/nvim/lua/plugins/lualine.lua create mode 100644 dot_config/nvim/lua/plugins/mason.lua create mode 100644 dot_config/nvim/lua/plugins/neotest.lua create mode 100644 dot_config/nvim/lua/plugins/oil.lua create mode 100644 dot_config/nvim/lua/plugins/telescope.lua create mode 100644 dot_config/nvim/lua/plugins/tiny-inline.lua create mode 100644 dot_config/nvim/lua/plugins/tmux.lua create mode 100644 dot_config/nvim/lua/plugins/treesitter.lua create mode 100644 dot_config/nvim/lua/plugins/vim-lazy-dev.lua create mode 100644 dot_config/nvim/lua/plugins/which-key.lua create mode 100644 dot_config/nvim/lua/vim-options.lua create mode 100644 dot_config/nvim/queries/gotmpl/injections.scm create mode 100644 dot_config/nvim/readme.md create mode 100644 dot_config/starship.toml create mode 100644 dot_config/waybar/config create mode 100644 dot_config/waybar/style.css create mode 100644 dot_tmux.conf create mode 100644 dot_zshrc diff --git a/dot_config/dunst/dunstrc b/dot_config/dunst/dunstrc new file mode 100644 index 0000000..f16803f --- /dev/null +++ b/dot_config/dunst/dunstrc @@ -0,0 +1,16 @@ +[global] +frame_color = "#8aadf4" +separator_color= frame + +[urgency_low] +background = "#24273a" +foreground = "#cad3f5" + +[urgency_normal] +background = "#24273a" +foreground = "#cad3f5" + +[urgency_critical] +background = "#24273a" +foreground = "#cad3f5" +frame_color = "#f5a97f" diff --git a/dot_config/ghostty/config b/dot_config/ghostty/config new file mode 100644 index 0000000..c3a548d --- /dev/null +++ b/dot_config/ghostty/config @@ -0,0 +1,19 @@ +theme = Catppuccin Mocha +font-feature=-calt +font-feature=-liga +font-feature=-dlig + +shell-integration-features = ssh-terminfo,ssh-env + +keybind = cmd+t=unbind +keybind = cmd+n=unbind +keybind = cmd+w=unbind +keybind = cmd+plus=unbind +keybind = cmd+minus=unbind + +keybind = cmd+opt+left=unbind +keybind = cmd+opt+right=unbind +keybind = alt+left=unbind +keybind = alt+right=unbind + +keybind = ctrl+v=paste_from_clipboard diff --git a/dot_config/hypr/config/binds.conf b/dot_config/hypr/config/binds.conf new file mode 100644 index 0000000..902312b --- /dev/null +++ b/dot_config/hypr/config/binds.conf @@ -0,0 +1,110 @@ +source = programs.conf + +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more +bind = $mainMod, T, exec, $terminal +bind = $mainMod, Q, killactive, +bind = $mainMod Control_L, Q, exit, +bind = $mainMod, E, exec, $fileManager +bind = $mainMod, V, togglefloating, +bind = $mainMod, R, exec, $menu +bind = $mainMod, P, pseudo, # dwindle +# bind = $mainMod, J, togglesplit, # dwindle + +bind = $mainMod, D, exec, $discord +bind = $mainMod, B, exec, $browser +bind = $mainMod, O, exec, $hyprlock +bind = $mainMod, G, exec, $steam +# loginctl lock-session +bind = $mainMod, M, exec, $spotify + +bind = ,code:127,pass,class:(discord) +bind = $mainMod, code:51,pass,class:(discord) + +# Bind multimedia keys +bindle=, XF86AudioRaiseVolume, exec, vol --up +bindle=, XF86AudioLowerVolume, exec, vol --down +bindle=, XF86MonBrightnessUp, exec, bri --up +bindle=, XF86MonBrightnessDown, exec, bri --down +bindle=, XF86Search, exec, launchpad +# bindl=, XF86AudioMute, exec, amixer set Master toggle +bindl=, XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindl=, XF86AudioPlay, exec, playerctl play-pause # the stupid key is called play , but it toggles +bindl= $mainMod CONTROL, p, exec, playerctl play-pause # the stupid key is called play , but it toggles +bindl=, XF86AudioNext, exec, playerctl next +bindl=, XF86AudioPrev, exec, playerctl previous + +# also make sure you created a directory called screenshots in Pictures/ otherwise the screenshots won't appear anywhere +bind = $mainMod, S, exec, grim -o DP-3 "${HOME}/Pictures/screenshots/screenshot-$(date +%F-%T).png" +# screenshot + crop keybind +bind = $mainMod SHIFT, S, exec, grim -g "$(slurp)" - | swappy -f - + +# Move focus with mainMod + arrow keys +# Maybe H J K L +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d + +bind = $mainMod, H, movefocus, l +bind = $mainMod, L, movefocus, r +bind = $mainMod, K, movefocus, u +bind = $mainMod, J, movefocus, d + + +# Switch workspaces with mainMod + [0-9] +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +# bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +bind = $mainMod, F, fullscreen + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +bind = $mainMod SHIFT, H, movewindow, l +bind = $mainMod SHIFT, L, movewindow, r +bind = $mainMod SHIFT, K, movewindow, u +bind = $mainMod SHIFT, J, movewindow, d + +bind = $mainMod SHIFT, left, movewindow, l +bind = $mainMod SHIFT, right, movewindow, r +bind = $mainMod SHIFT, up, movewindow, u +bind = $mainMod SHIFT, down, movewindow, d + +binde = $mainMod CONTROL, H, resizeactive, -10 0 +binde = $mainMod CONTROL, L, resizeactive, 10 0 +binde = $mainMod CONTROL, K, resizeactive, 0 -10 +binde = $mainMod CONTROL, J, resizeactive, 0 10 + + +bind = , F10, pass, class:^(discord)$ # Send Super + Space to Discord diff --git a/dot_config/hypr/config/env.conf b/dot_config/hypr/config/env.conf new file mode 100644 index 0000000..567e8eb --- /dev/null +++ b/dot_config/hypr/config/env.conf @@ -0,0 +1,9 @@ +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 +env = LIBVA_DRIVER_NAME,nvidia +env = XDG_SESSION_TYPE,wayland +env = GBM_BACKEND,nvidia-drm +env = __GLX_VENDOR_LIBRARY_NAME,nvidia +env = NVD_BACKEND,direct + + diff --git a/dot_config/hypr/config/games.conf b/dot_config/hypr/config/games.conf new file mode 100644 index 0000000..6539410 --- /dev/null +++ b/dot_config/hypr/config/games.conf @@ -0,0 +1,37 @@ +# Auto generated window rules for Games + +windowrule = fullscreen on, match:title "Stardew Valley", match:class "Stardew Valley" +windowrule = monitor DP-3, match:title "Stardew Valley", match:class "Stardew Valley" +windowrule = allows_input on, match:title "Stardew Valley", match:class "Stardew Valley" + +windowrule = tile on, match:initial_class "steam_app_.*" +windowrule = maximize on, match:initial_class "steam_app_.*" +windowrule = fullscreen on, match:initial_class "steam_app_.*" +windowrule = monitor DP-3, match:initial_class "steam_app_.*" +windowrule = allows_input on, match:initial_class "steam_app_.*" + +windowrule = stay_focused on, match:title "ffxiv*", match:class "ffxiv*" +windowrule = fullscreen on, match:title "ffxiv*", match:class "ffxiv*" +windowrule = monitor DP-3, match:title "ffxiv*", match:class "ffxiv*" +windowrule = allows_input on, match:title "ffxiv*", match:class "ffxiv*" + +windowrule = fullscreen on, match:title "Hollow Knight", match:class "Hollow Knight" +windowrule = monitor DP-3, match:title "Hollow Knight", match:class "Hollow Knight" +windowrule = allows_input on, match:title "Hollow Knight", match:class "Hollow Knight" + +windowrule = fullscreen on, match:title "HELLDIVERS*", match:class "HELLDIVERS*" +windowrule = monitor DP-3, match:title "HELLDIVERS*", match:class "HELLDIVERS*" +windowrule = allows_input on, match:title "HELLDIVERS*", match:class "HELLDIVERS*" + +windowrule = tile on, match:title "CS", match:class "CS" +windowrule = maximize on, match:title "CS", match:class "CS" +windowrule = fullscreen on, match:title "CS", match:class "CS" +windowrule = monitor DP-3, match:title "CS", match:class "CS" +windowrule = allows_input on, match:title "CS", match:class "CS" + +windowrule = tile on, match:title "Warhammer 40.000: Darktide" +windowrule = maximize on, match:title "Warhammer 40.000: Darktide" +windowrule = fullscreen on, match:title "Warhammer 40.000: Darktide" +windowrule = monitor DP-3, match:title "Warhammer 40.000: Darktide" +windowrule = allows_input on, match:title "Warhammer 40.000: Darktide" + diff --git a/dot_config/hypr/config/general.conf b/dot_config/hypr/config/general.conf new file mode 100644 index 0000000..8c8b600 --- /dev/null +++ b/dot_config/hypr/config/general.conf @@ -0,0 +1,110 @@ +monitor=DP-4,2560x1440@240,auto,1 +workspace=DP-3,1 +# monitor=DP-2,1920x1080@240,0x0,1 + # workspace=DP-2,6 +monitor=DP-3,1920x1200@60,auto-left,1,transform,1 +workspace=DP-4,6 + +general { + gaps_in = 2 + gaps_out = 10 + + border_size = 1 + + # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg + col.inactive_border = rgba(595959aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +cursor { + no_hardware_cursors = true +} + +# https://wiki.hyprland.org/Configuring/Variables/#decoration +decoration { + # rounding = 10 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + fullscreen_opacity = 1.0 + + # drop_shadow = true + # shadow_range = 4 + # shadow_render_power = 3 + # col.shadow = rgba(1a1a1aee) + + # https://wiki.hyprland.org/Configuring/Variables/#blur + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#animations +animations { + enabled = true + + # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = myBezier, 0.05, 0.9, 0.1, 1.05 + + animation = windows, 1, 7, myBezier + animation = windowsOut, 1, 7, default, popin 80% + animation = border, 1, 10, default + animation = borderangle, 1, 8, default + animation = fade, 1, 7, default + animation = workspaces, 1, 6, default +} + +# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more +master { + new_status = slave +} + +# https://wiki.hyprland.org/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( + focus_on_activate = false +} + + +############# +### INPUT ### +############# + +# https://wiki.hyprland.org/Configuring/Variables/#input +input { + kb_layout = de + follow_mouse = 1 + + sensitivity = 0.2 # -1.0 - 1.0, 0 means no modification. + accel_profile = flat + force_no_accel=1 + + touchpad { + natural_scroll = false + } +} + +device { + name = kinesis-kinesis-adv360-1 + kb_layout = us +} diff --git a/dot_config/hypr/config/programs.conf b/dot_config/hypr/config/programs.conf new file mode 100644 index 0000000..e710951 --- /dev/null +++ b/dot_config/hypr/config/programs.conf @@ -0,0 +1,27 @@ +$terminal = ghostty +$fileManager = nautilus +$menu = fuzzel +$browser = firefox +$discord = LIBVA_DRIVER_NAME=nvidia discord --ignore-gpu-blocklist --disable-features=UseOzonePlatform --enable-features=VaapiVideoDecoder --use-gl=desktop --enable-gpu-rasterization --enable-zero-copy +$hyprlock = ~/.config/hypr/fix-hypr-lock.sh +$spotify = LIBVA_DRIVER_NAME=nvidia spotify-launcher +$obs = obs +$steam = steam +# --enable-features=UseOzonePlatform --ozone-platform=wayland + +# exec-once = hyprctl dispatch workspace 1 +exec-once = [workspace 1 silent] $terminal +# exec-once = [workspace 6 silent] $discord +exec-once = [workspace 6 silent] $spotify +# exec-once = [workspace 7 silent] $steam + +exec-once = xrandr --output DP-4 --primary +exec-once = XDG_MENU_PREFIX=arch- kbuildsycoca6 +exec-once = sleep 2 && waybar & +exec-once = hyprpaper +exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +exec-once = dunst +exec-once = polkit-kde-agent +exec-once = playerctld daemon + +exec-once = $hyprlock diff --git a/dot_config/hypr/config/rules.conf b/dot_config/hypr/config/rules.conf new file mode 100644 index 0000000..fe0b7f4 --- /dev/null +++ b/dot_config/hypr/config/rules.conf @@ -0,0 +1,30 @@ +# windowrule = suppress_event maximize, class:.* # You'll probably like this. + +# Workspace rules +workspace=1,monitor:DP-4,default:true,persistent:true +workspace=2,monitor:DP-4,persistent:true +workspace=3,monitor:DP-4,persistent:true +workspace=4,monitor:DP-4,persistent:true +workspace=5,monitor:DP-4,persistent:true + +# workspace=6,monitor:DP-2,default:true,persistent:true +# workspace=7,monitor:DP-2,persistent:true +# workspace=8,monitor:DP-2,persistent:true +# workspace=9,monitor:DP-2,persistent:true +# workspace=10,monitor:DP-2,persistent:true + +workspace=6,monitor:DP-3,default:true,persistent:true +workspace=7,monitor:DP-3,persistent:true +workspace=8,monitor:DP-3,persistent:true +workspace=9,monitor:DP-3,persistent:true +workspace=10,monitor:DP-3,persistent:true + +# Other +windowrule = stay_focused on, match:class swappy +windowrule = allows_input on, match:class discord +windowrule = monitor DP-2, match:class discord +windowrule = no_initial_focus on, match:initial_class steam +windowrule = monitor DP-2, match:initial_class steam + +windowrule = float on, match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$ +windowrule = no_focus on, match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$ diff --git a/dot_config/hypr/executable_fix-hypr-lock.sh b/dot_config/hypr/executable_fix-hypr-lock.sh new file mode 100644 index 0000000..e32b22c --- /dev/null +++ b/dot_config/hypr/executable_fix-hypr-lock.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +IS_LOCKED=$(ps -e | grep hyprlock) + +if [ -z "$IS_LOCKED" ] +then + hyprlock +fi diff --git a/dot_config/hypr/executable_games.py b/dot_config/hypr/executable_games.py new file mode 100644 index 0000000..3d59232 --- /dev/null +++ b/dot_config/hypr/executable_games.py @@ -0,0 +1,56 @@ +#!/usr/bin/python3 + +games = [ + ("all", "Stardew Valley"), + ("ic", "steam_app_.*", "tile", "max"), + ("all", "ffxiv*", "sf"), + ("all", "Hollow Knight"), + ("all", "HELLDIVERS*"), + ("all", "CS", "tile", "max"), + ("title", "Warhammer 40.000: Darktide", "tile", "max") +] + +def main(): + f = open("config/games.conf", "w") + conf: str = "# Auto generated window rules for Games\n\n" + for game in games: + if type(game) is not tuple: + continue + + name = game[1] + match game[0]: + case "ic": + selector = f"match:initial_class \"{name}\"" + case "title": + selector = f"match:title \"{name}\"" + case "class": + selector = f"match:class \"{name}\"" + case "all": + selector = f"match:title \"{name}\", match:class \"{name}\"" + case s: + print(f"Could not find selector for \"{s}\"") + continue + + for setting in game[2::]: + match setting: + case "sf": + conf += f"windowrule = stay_focused on, {selector}\n" + case "tile": + conf += f"windowrule = tile on, {selector}\n" + case "max": + conf += f"windowrule = maximize on, {selector}\n" + case s: + print(f"Could not find setting \"{s}\"") + + + conf += f"""windowrule = fullscreen on, {selector} +windowrule = monitor DP-3, {selector} +windowrule = allows_input on, {selector}\n +""" + f.write(conf) + f.close() + + +if __name__ == "__main__": + main() + diff --git a/dot_config/hypr/hyprland.conf b/dot_config/hypr/hyprland.conf new file mode 100644 index 0000000..1adc6ce --- /dev/null +++ b/dot_config/hypr/hyprland.conf @@ -0,0 +1,7 @@ +source = config/general.conf +source = config/env.conf +source = config/binds.conf +# Dont source because it is sourced in binds.conf to set Program specific keybinds +# source = config/programs.conf +source = config/rules.conf +source = config/games.conf diff --git a/dot_config/hypr/hyprland.conf.bak2 b/dot_config/hypr/hyprland.conf.bak2 new file mode 100644 index 0000000..02ed2e9 --- /dev/null +++ b/dot_config/hypr/hyprland.conf.bak2 @@ -0,0 +1,349 @@ + +# ####################################################################################### +# AUTOGENERATED HYPRLAND CONFIG. +# EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS. +# ####################################################################################### + +autogenerated = 1 # remove this line to remove the warning + +# This is an example Hyprland config file. +# Refer to the wiki for more information. +# https://wiki.hypr.land/Configuring/ + +# Please note not all available settings / options are set here. +# For a full list, see the wiki + +# You can split this configuration into multiple files +# Create your files separately and then link them to this file like this: +# source = ~/.config/hypr/myColors.conf + + +################ +### MONITORS ### +################ + +# See https://wiki.hypr.land/Configuring/Monitors/ +monitor=,preferred,auto,auto + + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hypr.land/Configuring/Keywords/ + +# Set programs that you use +$terminal = kitty +$fileManager = dolphin +$menu = hyprlauncher + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +# Or execute your favorite apps at launch like this: + +# exec-once = $terminal +# exec-once = nm-applet & +# exec-once = waybar & hyprpaper & firefox + + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hypr.land/Configuring/Environment-variables/ + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 + + +################### +### PERMISSIONS ### +################### + +# See https://wiki.hypr.land/Configuring/Permissions/ +# Please note permission changes here require a Hyprland restart and are not applied on-the-fly +# for security reasons + +# ecosystem { +# enforce_permissions = 1 +# } + +# permission = /usr/(bin|local/bin)/grim, screencopy, allow +# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow +# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow + + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hypr.land/Configuring/Variables/ + +# https://wiki.hypr.land/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 20 + + border_size = 2 + + # https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors + col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg + col.inactive_border = rgba(595959aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hypr.land/Configuring/Variables/#decoration +decoration { + rounding = 10 + rounding_power = 2 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 1.0 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(1a1a1aee) + } + + # https://wiki.hypr.land/Configuring/Variables/#blur + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hypr.land/Configuring/Variables/#animations +animations { + enabled = yes, please :) + + # Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves + # NAME, X0, Y0, X1, Y1 + bezier = easeOutQuint, 0.23, 1, 0.32, 1 + bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1 + bezier = linear, 0, 0, 1, 1 + bezier = almostLinear, 0.5, 0.5, 0.75, 1 + bezier = quick, 0.15, 0, 0.1, 1 + + # Default animations, see https://wiki.hypr.land/Configuring/Animations/ + # NAME, ONOFF, SPEED, CURVE, [STYLE] + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 1.94, almostLinear, fade + animation = workspacesIn, 1, 1.21, almostLinear, fade + animation = workspacesOut, 1, 1.94, almostLinear, fade + animation = zoomFactor, 1, 7, quick +} + +# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrule { +# name = no-gaps-wtv1 +# match:float = false +# match:workspace = w[tv1] +# +# border_size = 0 +# rounding = 0 +# } +# +# windowrule { +# name = no-gaps-f1 +# match:float = false +# match:workspace = f[1] +# +# border_size = 0 +# rounding = 0 +# } + +# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hypr.land/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hypr.land/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( +} + + +############# +### INPUT ### +############# + +# https://wiki.hypr.land/Configuring/Variables/#input +input { + kb_layout = us + kb_variant = + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = false + } +} + +# See https://wiki.hypr.land/Configuring/Gestures +gesture = 3, horizontal, workspace + +# Example per-device config +# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} + + +################### +### KEYBINDINGS ### +################### + +# See https://wiki.hypr.land/Configuring/Keywords/ +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more +bind = $mainMod, Q, exec, $terminal +bind = $mainMod, C, killactive, +bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit +bind = $mainMod, E, exec, $fileManager +bind = $mainMod, V, togglefloating, +bind = $mainMod, R, exec, $menu +bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, J, layoutmsg, togglesplit # dwindle + +# Move focus with mainMod + arrow keys +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d + +# Switch workspaces with mainMod + [0-9] +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Laptop multimedia keys for volume and LCD brightness +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%- + +# Requires playerctl +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# See https://wiki.hypr.land/Configuring/Window-Rules/ for more +# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules + +# Example windowrules that are useful + +windowrule { + # Ignore maximize requests from all apps. You'll probably like this. + name = suppress-maximize-events + match:class = .* + + suppress_event = maximize +} + +windowrule { + # Fix some dragging issues with XWayland + name = fix-xwayland-drags + match:class = ^$ + match:title = ^$ + match:xwayland = true + match:float = true + match:fullscreen = false + match:pin = false + + no_focus = true +} + +# Hyprland-run windowrule +windowrule { + name = move-hyprland-run + + match:class = hyprland-run + + move = 20 monitor_h-120 + float = yes +} diff --git a/dot_config/hypr/hyprlock.conf b/dot_config/hypr/hyprlock.conf new file mode 100644 index 0000000..f6559a2 --- /dev/null +++ b/dot_config/hypr/hyprlock.conf @@ -0,0 +1,90 @@ +# source = ~/.cache/wal/colors-hyprland.conf + +# BACKGROUND +background { + monitor = DP-4 + path = /home/zam/.config/wallpapers/wall0.png + blur_passes = 3 + contrast = 0.8916 + brightness = 0.8172 + vibrancy = 0.1696 + vibrancy_darkness = 0.0 +} + +background { + monitor = DP-3 + path = /home/zam/.config/wallpapers/wall1.png + blur_passes = 3 + contrast = 0.8916 + brightness = 0.8172 + vibrancy = 0.1696 + vibrancy_darkness = 0.0 +} + +# GENERAL +general { + no_fade_in = false + grace = 0 + disable_loading_bar = true + hide_cursor = true +} + +# INPUT FIELD +input-field { + monitor = DP-4 + size = 250, 60 + outline_thickness = 2 + dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true + outer_color = rgba(0, 0, 0, 0) + inner_color = rgba(0, 0, 0, 0.5) + font_color = rgb(200, 200, 200) + fade_on_empty = false + # font_family = JetBrains Mono Nerd Font Mono + placeholder_text = Input Password... + hide_input = false + position = 0, -120 + halign = center + valign = center +} + +# TIME +label { + monitor = DP-4 + text = cmd[update:1000] date +"%-I:%M%p" + # color = $foreground + color = rgba(255, 255, 255, 0.6) + font_size = 120 + font_family = JetBrains Mono Nerd Font Mono ExtraBold + position = 0, -300 + halign = center + valign = top +} + +# USER +label { + monitor = DP-4 + text = Hi there, Zam + # color = $foreground + color = rgba(255, 255, 255, 0.6) + font_size = 25 + font_family = JetBrains Mono Nerd Font Mono + position = 0, -40 + halign = center + valign = center +} + +# CURRENT SONG +# label { +# monitor = DP-3 +# text = cmd[update:1000] echo "$(~/Documents/Scripts/whatsong.sh)" +# color = $foreground +# #color = rgba(255, 255, 255, 0.6) +# font_size = 18 +# font_family = JetBrainsMono, Font Awesome 6 Free Solid +# position = 0, -50 +# halign = center +# valign = bottom +# } +# diff --git a/dot_config/hypr/hyprpaper.conf b/dot_config/hypr/hyprpaper.conf new file mode 100644 index 0000000..e13cb50 --- /dev/null +++ b/dot_config/hypr/hyprpaper.conf @@ -0,0 +1,12 @@ +preload = ~/.config/wallpapers/wall0.jpg +preload = ~/.config/wallpapers/wall1.jpg + +wallpaper { + monitor = DP-4 + path = ~/.config/wallpapers/wall0.jpg +} + +wallpaper { + monitor = DP-3 + path = ~/.config/wallpapers/wall1.jpg +} diff --git a/dot_config/nvim/dot_git/HEAD b/dot_config/nvim/dot_git/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/dot_config/nvim/dot_git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/dot_config/nvim/dot_git/config b/dot_config/nvim/dot_git/config new file mode 100644 index 0000000..1da14ea --- /dev/null +++ b/dot_config/nvim/dot_git/config @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + url = https://git.pablu.de/Pablu/nvim-config.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/dot_config/nvim/dot_git/description b/dot_config/nvim/dot_git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/dot_config/nvim/dot_git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/dot_config/nvim/dot_git/hooks/executable_applypatch-msg.sample b/dot_config/nvim/dot_git/hooks/executable_applypatch-msg.sample new file mode 100644 index 0000000..a5d7b84 --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/dot_config/nvim/dot_git/hooks/executable_commit-msg.sample b/dot_config/nvim/dot_git/hooks/executable_commit-msg.sample new file mode 100644 index 0000000..b58d118 --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/dot_config/nvim/dot_git/hooks/executable_fsmonitor-watchman.sample b/dot_config/nvim/dot_git/hooks/executable_fsmonitor-watchman.sample new file mode 100644 index 0000000..23e856f --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/dot_config/nvim/dot_git/hooks/executable_post-update.sample b/dot_config/nvim/dot_git/hooks/executable_post-update.sample new file mode 100644 index 0000000..ec17ec1 --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/dot_config/nvim/dot_git/hooks/executable_pre-applypatch.sample b/dot_config/nvim/dot_git/hooks/executable_pre-applypatch.sample new file mode 100644 index 0000000..4142082 --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/dot_config/nvim/dot_git/hooks/executable_pre-commit.sample b/dot_config/nvim/dot_git/hooks/executable_pre-commit.sample new file mode 100644 index 0000000..29ed5ee --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff-index --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/dot_config/nvim/dot_git/hooks/executable_pre-merge-commit.sample b/dot_config/nvim/dot_git/hooks/executable_pre-merge-commit.sample new file mode 100644 index 0000000..399eab1 --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/dot_config/nvim/dot_git/hooks/executable_pre-push.sample b/dot_config/nvim/dot_git/hooks/executable_pre-push.sample new file mode 100644 index 0000000..4ce688d --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/dot_config/nvim/dot_git/hooks/executable_pre-rebase.sample b/dot_config/nvim/dot_git/hooks/executable_pre-rebase.sample new file mode 100644 index 0000000..6cbef5c --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/dot_config/nvim/dot_git/hooks/executable_pre-receive.sample b/dot_config/nvim/dot_git/hooks/executable_pre-receive.sample new file mode 100644 index 0000000..a1fd29e --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/dot_config/nvim/dot_git/hooks/executable_prepare-commit-msg.sample b/dot_config/nvim/dot_git/hooks/executable_prepare-commit-msg.sample new file mode 100644 index 0000000..10fa14c --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/dot_config/nvim/dot_git/hooks/executable_push-to-checkout.sample b/dot_config/nvim/dot_git/hooks/executable_push-to-checkout.sample new file mode 100644 index 0000000..af5a0c0 --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/dot_config/nvim/dot_git/hooks/executable_update.sample b/dot_config/nvim/dot_git/hooks/executable_update.sample new file mode 100644 index 0000000..c4d426b --- /dev/null +++ b/dot_config/nvim/dot_git/hooks/executable_update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/dot_config/nvim/dot_git/index b/dot_config/nvim/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..ae87179e2ad945879e81380561366a027549d022 GIT binary patch literal 2383 zcma)-3s4hR6oxM_yfR1?#WW!DsHIv>AXMHef}m2MEz}VK1wyh3OE$YP*+7FLJ}T4> zN|l$$q}7U38MKsX3tC$!jyeSkI1~j%OM|c2P-V2G8A~5)vKMnp@0*fKW{|JL(;yGy=YsLZqF01Tu7u&W*bJA>s0E_LS~HeCshf8^sC^0QmQ zwH#kN-fqAV$Z#5$k(3H!)|oHJfyz95#!E+ebN1cVEeEC}L${kIv<;yS73FkJ$}hkP zCvjRpXhZN=@m3MMv?zpsEQWAGi{tLM@-5#BxENnj)VW zGjqBGy--WOIEB3SZ>?IexS0twWEBYt~=SYY75PV7@h1ic4e|+huHDO!q69 z!u?(}Ob9}J9bD>7>sN)JcX}n_)VgN0eo{iD&Yg4&eL`jZGIN6D+dhAB7d2~Ll_{p^ zH>V2=e1flWO>U@PrY&ep1;LO9mE}rNuIl0AFBu3Gg z8a4#X6)Kx=-W0B2e`0Zu?o1_K5!xDYcK>&TKRU?%;f$-H=gJFvzFczXJ+Q#qcRsG*oBt;gEdM|KD^b4fjvTivW23ZUjj7VhBN)qZ zUfss|1g&R5E-udH%Q3AP4)cJ@=CT##+F+@i^xuySI`_|UJI-sa`k`&fy)8+W{(I(^ zQqnj@s-N4n)bUEl8Z(zsmP?~tkTL(NT5de;zGBo+=R2l*`XKp!Tru$4s=-t^rVfx% zv_eS);A9>qwtPV?W?F%{AQvjj*G%ER>ES;r8*w@=&kr;_DZ)w%&urq$fU^n{Nfeks zApsjw;^LUKH6SS1Cx~P88VD_F7~gg5;l=iYUo>;xU48d2rZylb&_~D_G^~{4D=zh} zIvsX>d-b)GxsOK~bLO8k5Qh5%avI0t<^~D`sb?cnJ(C@dxtcPQ$Jm_!Ap?khEv>A5 z??hVVAB{T(L`N@2IlVDz*&*{fkmHykjkxi77SZa&&#jeZRBeB?|E0rg?W+4OC?DUV Pw8LPbvF$ 1774197642 +0100 clone: from https://git.pablu.de/Pablu/nvim-config.git diff --git a/dot_config/nvim/dot_git/logs/refs/heads/master b/dot_config/nvim/dot_git/logs/refs/heads/master new file mode 100644 index 0000000..661dc40 --- /dev/null +++ b/dot_config/nvim/dot_git/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 6f128632004d8e982b9bb6f917e1afbcda3366f1 pablu 1774197642 +0100 clone: from https://git.pablu.de/Pablu/nvim-config.git diff --git a/dot_config/nvim/dot_git/logs/refs/remotes/origin/HEAD b/dot_config/nvim/dot_git/logs/refs/remotes/origin/HEAD new file mode 100644 index 0000000..661dc40 --- /dev/null +++ b/dot_config/nvim/dot_git/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 6f128632004d8e982b9bb6f917e1afbcda3366f1 pablu 1774197642 +0100 clone: from https://git.pablu.de/Pablu/nvim-config.git diff --git a/dot_config/nvim/dot_git/objects/info/.keep b/dot_config/nvim/dot_git/objects/info/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/nvim/dot_git/objects/pack/readonly_pack-d806998243217e48a94f5076ddda793742adba7f.idx b/dot_config/nvim/dot_git/objects/pack/readonly_pack-d806998243217e48a94f5076ddda793742adba7f.idx new file mode 100644 index 0000000000000000000000000000000000000000..921c1d586731b025e7e820369504791e1f431ebc GIT binary patch literal 9976 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 PY2Tll_7;&XZ}$Hmg3j;D literal 0 HcmV?d00001 diff --git a/dot_config/nvim/dot_git/objects/pack/readonly_pack-d806998243217e48a94f5076ddda793742adba7f.rev b/dot_config/nvim/dot_git/objects/pack/readonly_pack-d806998243217e48a94f5076ddda793742adba7f.rev new file mode 100644 index 0000000000000000000000000000000000000000..80ef3658f81992a5de0ecb528988775885a6bf85 GIT binary patch literal 1324 zcmXZa34D)b00;2*FI&-RL!$#(J8V-cEHxdhVM|*`v(n|LgifN^qMHt-oMROgYLT<1 zT69v5Rf`mz6w;wP#P|7p{6C-X=l6S`_xZo?^S;m9vwL1i6h*N^9#eDle0hYtkG5Ry z_-I<|36$}u;|_9@Y%ELV8S*+=Pd?3MdbV64Q)CxD(VNK%PN5wqas$J;h!4$aMTVZr zQ+m4G#jSb+Igo$#aE+C0(39kQbkiGhs{SeeaSqe@fk&KcB=6>Aa(Re*3FDb8r6>L9 z$bPCA%MxzmQo>roTElhRFP1E?WjvjDfR{LvV;M;suHtPIT3m1 zv8EiSpU)!R;Z=?_-ds+V^*LM*`!;|Q$BFVn!v6fq%WS6BITw!|ug~Wm=J2PnEcrN} zaSPpzoh`qk55wro#jGcZdHhJ4x$Wh?i^B;ugevrQj>wA`~$zV0re8tU#HNDSOOr{Ap;d_lG5cc;i?&o^P zE#H^omI r*QHfiw|PayBerZFmD9PZx_o*;O=4wTe)+By1%;(?sTDP~{W=~5qlcS4 literal 0 HcmV?d00001 diff --git a/dot_config/nvim/dot_git/packed-refs b/dot_config/nvim/dot_git/packed-refs new file mode 100644 index 0000000..94519a1 --- /dev/null +++ b/dot_config/nvim/dot_git/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +6f128632004d8e982b9bb6f917e1afbcda3366f1 refs/remotes/origin/master diff --git a/dot_config/nvim/dot_git/refs/heads/master b/dot_config/nvim/dot_git/refs/heads/master new file mode 100644 index 0000000..a335dfb --- /dev/null +++ b/dot_config/nvim/dot_git/refs/heads/master @@ -0,0 +1 @@ +6f128632004d8e982b9bb6f917e1afbcda3366f1 diff --git a/dot_config/nvim/dot_git/refs/remotes/origin/HEAD b/dot_config/nvim/dot_git/refs/remotes/origin/HEAD new file mode 100644 index 0000000..6efe28f --- /dev/null +++ b/dot_config/nvim/dot_git/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +ref: refs/remotes/origin/master diff --git a/dot_config/nvim/dot_git/refs/tags/.keep b/dot_config/nvim/dot_git/refs/tags/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_config/nvim/dot_gitignore b/dot_config/nvim/dot_gitignore new file mode 100644 index 0000000..9bbbeea --- /dev/null +++ b/dot_config/nvim/dot_gitignore @@ -0,0 +1 @@ +.luarc.json diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua new file mode 100644 index 0000000..e39d340 --- /dev/null +++ b/dot_config/nvim/init.lua @@ -0,0 +1,110 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) + +require("vim-options") +require("lazy").setup("plugins") + +vim.o.number = true +vim.o.relativenumber = true + +vim.filetype.add({ + extension = { + gotmpl = 'gotmpl', + }, + pattern = { + [".*%.gohtml"] = "gotmpl", + [".*%.gotmpl"] = "gotmpl" + } +}) + +-- Panes +vim.cmd.set("splitright") +vim.keymap.set("n", "/", function() + vim.cmd.vnew() +end, { desc = "Pane split right" }) + +vim.cmd.set("splitbelow") +vim.keymap.set("n", "-", function() + vim.cmd.new() +end, { desc = "Pane split down" }) + +-- vim.api.nvim_set_keymap('n', '', ':wincmd k', { noremap = true, silent = true, desc = "Move to up windows" }); +-- vim.api.nvim_set_keymap('n', '', ':wincmd h', { noremap = true, silent = true, desc = "Move to left windows" }); +-- vim.api.nvim_set_keymap('n', '', ':wincmd j', { noremap = true, silent = true, desc = "Move to down windows" }); +-- vim.api.nvim_set_keymap('n', '', ':wincmd l', { noremap = true, silent = true, desc = "Move to right windows" }); + +vim.api.nvim_set_keymap('n', 'gb', ':bnext', { noremap = true, silent = true, desc = "Go back last buffer" }); + +vim.api.nvim_set_keymap('t', '', '', { noremap = true, silent = true, desc = "Escape Terminal" }); +vim.api.nvim_create_autocmd('TermOpen', { + group = vim.api.nvim_create_augroup('custom-term-open', { clear = true }), + callback = function() + vim.opt.number = false + vim.opt.relativenumber = false + end, +}); + + +-- Telescope +local builtin = require("telescope.builtin") +vim.keymap.set('n', 'fg', function() builtin.live_grep({ glob_pattern = "!*_templ.go" }) end, + { desc = "Telescope live grep" }) +vim.keymap.set('n', 'gl', builtin.lsp_references, { desc = "Telescope show references" }) +vim.keymap.set('n', 'fx', builtin.diagnostics, { desc = "Telescope open diagnostics" }) +vim.keymap.set('n', 'ff', builtin.find_files, { desc = "Telescope find files" }) +vim.keymap.set('n', 'fb', builtin.buffers, { desc = "Telescope open buffers" }) + +-- Formating +vim.keymap.set("n", "gf", function() + require("conform").format({ lsp_format = "fallback" }) +end, { desc = "Format buffer" }) + +-- Filesystem +vim.keymap.set("n", "e", ":Oil", { desc = "Open file explorer: OIL" }) + +-- Neotest +local neotest = require("neotest") +vim.keymap.set("n", "ts", function() + neotest.summary.toggle() +end, { desc = "Neotest open summary" }) +vim.keymap.set("n", "to", neotest.output.open, { desc = "Neotest open output" }) +vim.keymap.set("n", "td", function() neotest.run.run({ suite = false, strategy = "dap" }) end, + { desc = "Neotest debug closest test" }) +vim.keymap.set("n", "tr", function() neotest.run.run({ suite = false }) end, + { desc = "Neotest run closest test" }) + +-- Debugging +local dap = require("dap") +vim.keymap.set("n", "db", dap.toggle_breakpoint, + { nowait = true, remap = false, desc = "Debug toggle breakpoint" }) +vim.keymap.set("n", "dc", dap.continue, { nowait = true, remap = false, desc = "Debug continue" }) +vim.keymap.set("n", "di", dap.step_into, { nowait = true, remap = false, desc = "Debug step into" }) +vim.keymap.set("n", "do", dap.step_over, { nowait = true, remap = false, desc = "Debug step over" }) +vim.keymap.set("n", "dr", dap.repl.open, { nowait = true, remap = false, desc = "Debug open repl" }) +vim.keymap.set("n", "dq", function() + dap.terminate() + require("dapui").close() + require("nvim-dap-virtual-text").toggle() +end, { nowait = true, remap = false, desc = "Debug close" }) +vim.keymap.set("n", "dl", dap.list_breakpoints, { nowait = true, remap = false, desc = "Debug list breakpoints" }) + + +-- Lsp Config +vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Show hover information" }) +vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "Goto definition" }) +vim.keymap.set({ "n", "v" }, "ca", vim.lsp.buf.code_action, { desc = "LSP code action" }) +vim.keymap.set("n", "cr", vim.lsp.buf.rename, { desc = "LSP rename" }) + +-- Motions +vim.keymap.set("n", "", "zz", {}) +vim.keymap.set("n", "", "zz", {}) diff --git a/dot_config/nvim/lazy-lock.json b/dot_config/nvim/lazy-lock.json new file mode 100644 index 0000000..cce01f9 --- /dev/null +++ b/dot_config/nvim/lazy-lock.json @@ -0,0 +1,35 @@ +{ + "FixCursorHold.nvim": { "branch": "master", "commit": "1900f89dc17c603eec29960f57c00bd9ae696495" }, + "autoclose.nvim": { "branch": "main", "commit": "3f86702b54a861a17d7994b2e32a7c648cb12fb1" }, + "blink.cmp": { "branch": "main", "commit": "4b18c32adef2898f95cdef6192cbd5796c1a332d" }, + "catppuccin": { "branch": "main", "commit": "0a5de4da015a175f416d6ef1eda84661623e0500" }, + "conform.nvim": { "branch": "master", "commit": "e969e302bced7ffb9a0a0323629f31feb0ca35a6" }, + "fidget.nvim": { "branch": "main", "commit": "7fa433a83118a70fe24c1ce88d5f0bd3453c0970" }, + "flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" }, + "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, + "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" }, + "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" }, + "mason-nvim-dap.nvim": { "branch": "main", "commit": "9a10e096703966335bd5c46c8c875d5b0690dade" }, + "mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" }, + "mini.icons": { "branch": "main", "commit": "5b9076dae1bfbe47ba4a14bc8b967cde0ab5d77e" }, + "neotest": { "branch": "master", "commit": "deadfb1af5ce458742671ad3a013acb9a6b41178" }, + "neotest-go": { "branch": "main", "commit": "59b50505053f9c45a9febb79e11a56206c3e3901" }, + "neotest-python": { "branch": "master", "commit": "b0d3a861bd85689d8ed73f0590c47963a7eb1bf9" }, + "nvim-dap": { "branch": "master", "commit": "7b11f48753ea6a82f09485dadd08016e2a318cf6" }, + "nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" }, + "nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" }, + "nvim-lint": { "branch": "master", "commit": "606b823a57b027502a9ae00978ebf4f5d5158098" }, + "nvim-lspconfig": { "branch": "master", "commit": "ab5139c99df944479e5a26495a37840fcbb1d512" }, + "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, + "nvim-tmux-navigation": { "branch": "main", "commit": "4898c98702954439233fdaf764c39636681e2861" }, + "nvim-treesitter": { "branch": "main", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, + "nvim-web-devicons": { "branch": "master", "commit": "16d919d768b5bc2921bd7d5a4ee76f158f7ea1c0" }, + "oil.nvim": { "branch": "master", "commit": "0fcc83805ad11cf714a949c98c605ed717e0b83e" }, + "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "ripgrep": { "branch": "master", "commit": "cb66736f146f093497f4dc537b33d0826f9af33c" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" }, + "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, + "telescope.nvim": { "branch": "master", "commit": "6312868392331c9c0f22725041f1ec2bef57c751" }, + "tiny-inline-diagnostic.nvim": { "branch": "main", "commit": "ba133b3e932416e4b9507095731a6d7276878fe8" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } +} diff --git a/dot_config/nvim/lua/plugins/autoclose.lua b/dot_config/nvim/lua/plugins/autoclose.lua new file mode 100644 index 0000000..cd9e6ce --- /dev/null +++ b/dot_config/nvim/lua/plugins/autoclose.lua @@ -0,0 +1,6 @@ +return { + 'm4xshen/autoclose.nvim', + config = function() + require('autoclose').setup() + end +} diff --git a/dot_config/nvim/lua/plugins/blink.lua b/dot_config/nvim/lua/plugins/blink.lua new file mode 100644 index 0000000..2c424bd --- /dev/null +++ b/dot_config/nvim/lua/plugins/blink.lua @@ -0,0 +1,31 @@ +return { + "saghen/blink.cmp", + dependecies = { "rafamadriz/friendly-snippets" }, + version = "1.*", + ---@module 'blink.cmp' + ---@type blink.cmp.Config + opts = { + keymap = { + preset = "enter", + [''] = { 'show_signature', 'hide_signature', 'fallback' }, + }, + appearance = { + nerd_font_variant = "mono" + }, + signature = { + enabled = true + }, + completion = { + menu = { + draw = { + padding = { 0, 1 }, -- padding only on right side + components = { + kind_icon = { + text = function(ctx) return ' ' .. ctx.kind_icon .. ctx.icon_gap .. ' ' end + } + } + } + } + } + } +} diff --git a/dot_config/nvim/lua/plugins/catppuccin.lua b/dot_config/nvim/lua/plugins/catppuccin.lua new file mode 100644 index 0000000..772b80e --- /dev/null +++ b/dot_config/nvim/lua/plugins/catppuccin.lua @@ -0,0 +1,24 @@ +return +{ + "catppuccin/nvim", + name = "catppuccin", + priority = 1000, + lazy = false, + config = function() + -- require("catppuccin").setup({ + -- transparent_background = true, + -- }) + + vim.cmd.colorscheme "catppuccin" + end +} +-- { +-- "nyoom-engineering/oxocarbon.nvim", +-- config = function() +-- vim.opt.background = "dark" +-- vim.cmd.colorscheme "oxocarbon" +-- +-- -- vim.api.nvim_set_hl(0, "Normal", { bg = "none" }) +-- -- vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" }) +-- end +-- } diff --git a/dot_config/nvim/lua/plugins/conform.lua b/dot_config/nvim/lua/plugins/conform.lua new file mode 100644 index 0000000..c10e6fa --- /dev/null +++ b/dot_config/nvim/lua/plugins/conform.lua @@ -0,0 +1,22 @@ +return { + "stevearc/conform.nvim", + config = function() + local conform = require("conform") + + conform.setup { + formatters_by_ft = { + lua = { "stylua" }, + python = { "isort", "black", lsp_format = "fallback" }, + gotmpl = { "djlint" } + }, + format_on_save = { + timeout_ms = 500, + lsp_format = "fallback" + } + } + + conform.formatters.djlint = { + append_args = { "--max-blank-lines", "5" } + } + end +} diff --git a/dot_config/nvim/lua/plugins/dap.lua b/dot_config/nvim/lua/plugins/dap.lua new file mode 100644 index 0000000..6d63dfa --- /dev/null +++ b/dot_config/nvim/lua/plugins/dap.lua @@ -0,0 +1,77 @@ +return { + "mfussenegger/nvim-dap", + event = "VeryLazy", + dependencies = { + "rcarriga/nvim-dap-ui", + "nvim-neotest/nvim-nio", + "jay-babu/mason-nvim-dap.nvim", + "theHamsta/nvim-dap-virtual-text", + }, + config = function() + local mason_dap = require("mason-nvim-dap") + local dap = require("dap") + local ui = require("dapui") + local dap_virtual_text = require("nvim-dap-virtual-text") + + -- Dap Virtual Text + dap_virtual_text.setup() + + mason_dap.setup({ + ensure_installed = { "python" }, + automatic_installation = true, + handlers = { + function(config) + require("mason-nvim-dap").default_setup(config) + end, + }, + }) + + -- Configurations + dap.configurations = { + python = { + { + -- The first three options are required by nvim-dap + type = "python", -- the type here established the link to the adapter definition: `dap.adapters.python` + request = "launch", + name = "Launch file", + + -- Options below are for debugpy, see https://github.com/microsoft/debugpy/wiki/Debug-configuration-settings for supported options + + program = "${file}", -- This configuration will launch the current file if used. + pythonPath = function() + -- debugpy supports launching an application with a different interpreter then the one used to launch debugpy itself. + -- The code below looks for a `venv` or `.venv` folder in the current directly and uses the python within. + -- You could adapt this - to for example use the `VIRTUAL_ENV` environment variable. + local cwd = vim.fn.getcwd() + if vim.fn.executable(cwd .. "/venv/bin/python") == 1 then + return cwd .. "/venv/bin/python" + elseif vim.fn.executable(cwd .. "/.venv/bin/python") == 1 then + return cwd .. "/.venv/bin/python" + else + return "/usr/bin/python" + end + end, + }, + }, + } + + -- Dap UI + + ui.setup() + + vim.fn.sign_define("DapBreakpoint", { text = "🐞" }) + + dap.listeners.before.attach.dapui_config = function() + ui.open() + end + dap.listeners.before.launch.dapui_config = function() + ui.open() + end + dap.listeners.before.event_terminated.dapui_config = function() + ui.close() + end + dap.listeners.before.event_exited.dapui_config = function() + ui.close() + end + end +} diff --git a/dot_config/nvim/lua/plugins/fidget.lua b/dot_config/nvim/lua/plugins/fidget.lua new file mode 100644 index 0000000..dc31181 --- /dev/null +++ b/dot_config/nvim/lua/plugins/fidget.lua @@ -0,0 +1,4 @@ +return { + "j-hui/fidget.nvim", + opts = {} +} diff --git a/dot_config/nvim/lua/plugins/flash.lua b/dot_config/nvim/lua/plugins/flash.lua new file mode 100644 index 0000000..61df6c2 --- /dev/null +++ b/dot_config/nvim/lua/plugins/flash.lua @@ -0,0 +1,9 @@ +return { + "folke/flash.nvim", + event = "VeryLazy", + ---@type Flash.Config + opts = {}, + keys = { + { "zk", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" }, + }, +} diff --git a/dot_config/nvim/lua/plugins/linter.lua b/dot_config/nvim/lua/plugins/linter.lua new file mode 100644 index 0000000..1628ca6 --- /dev/null +++ b/dot_config/nvim/lua/plugins/linter.lua @@ -0,0 +1,17 @@ +return { + 'mfussenegger/nvim-lint', + config = function() + local lint = require("lint") + lint.linters_by_ft = { + python = { 'mypy' } + } + + local lint_augroup = vim.api.nvim_create_augroup("lint", { clear = true }) + vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, { + group = lint_augroup, + callback = function() + lint.try_lint(nil, { ignore_errors = true }) + end, + }) + end +} diff --git a/dot_config/nvim/lua/plugins/lsp.lua b/dot_config/nvim/lua/plugins/lsp.lua new file mode 100644 index 0000000..2c5d398 --- /dev/null +++ b/dot_config/nvim/lua/plugins/lsp.lua @@ -0,0 +1,37 @@ +return { + "neovim/nvim-lspconfig", + config = function() + vim.lsp.enable({ "lua_ls", + "basedpyright", + "gopls", + "html", + "yamlls", + "svelte-language-server", + "clangd", + "ansiblels", + "vtsls", + "zls", + "glsl_analyzer", + "rust_analyzer", + "templ", + "tailwindcss", + }) + + + -- Testing basedpyright atm, change to jedi idk + vim.lsp.config("basedpyright", { + settings = { + ['basedpyright'] = { + analysis = { + typeCheckingMode = "basic", + inlayHints = { + variableTypes = true, + genericTypes = true, + }, + autoFormatStrings = true, + } + } + } + }) + end +} diff --git a/dot_config/nvim/lua/plugins/lualine.lua b/dot_config/nvim/lua/plugins/lualine.lua new file mode 100644 index 0000000..669b6cd --- /dev/null +++ b/dot_config/nvim/lua/plugins/lualine.lua @@ -0,0 +1,11 @@ +return { + 'nvim-lualine/lualine.nvim', + dependencies = { 'nvim-tree/nvim-web-devicons' }, + config = function() + require('lualine').setup({ + options = { + theme = 'dracula' + } + }) + end +} diff --git a/dot_config/nvim/lua/plugins/mason.lua b/dot_config/nvim/lua/plugins/mason.lua new file mode 100644 index 0000000..0d059b1 --- /dev/null +++ b/dot_config/nvim/lua/plugins/mason.lua @@ -0,0 +1,4 @@ +return { + "mason-org/mason.nvim", + opts = {} +} diff --git a/dot_config/nvim/lua/plugins/neotest.lua b/dot_config/nvim/lua/plugins/neotest.lua new file mode 100644 index 0000000..1f6efcf --- /dev/null +++ b/dot_config/nvim/lua/plugins/neotest.lua @@ -0,0 +1,22 @@ +return { + "nvim-neotest/neotest", + dependencies = { + "nvim-neotest/nvim-nio", + "nvim-neotest/neotest-python", + "nvim-neotest/neotest-go", + "nvim-lua/plenary.nvim", + "antoinemadec/FixCursorHold.nvim", + "nvim-treesitter/nvim-treesitter" + }, + config = function() + require("neotest").setup({ + adapters = { + require("neotest-python"), + require("neotest-go") + }, + diagnostic = { + enabled = true + } + }) + end +} diff --git a/dot_config/nvim/lua/plugins/oil.lua b/dot_config/nvim/lua/plugins/oil.lua new file mode 100644 index 0000000..8d4c7fc --- /dev/null +++ b/dot_config/nvim/lua/plugins/oil.lua @@ -0,0 +1,10 @@ +return { + 'stevearc/oil.nvim', + ---@module 'oil' + ---@type oil.SetupOpts + opts = {}, + -- Optional dependencies + dependencies = { { "nvim-mini/mini.icons", opts = {} } }, + -- Lazy loading is not recommended because it is very tricky to make it work correctly in all situations. + lazy = false, +} diff --git a/dot_config/nvim/lua/plugins/telescope.lua b/dot_config/nvim/lua/plugins/telescope.lua new file mode 100644 index 0000000..3f4989a --- /dev/null +++ b/dot_config/nvim/lua/plugins/telescope.lua @@ -0,0 +1,33 @@ +return { + { + 'nvim-telescope/telescope.nvim', + tag = '0.1.6', + dependencies = { + 'nvim-lua/plenary.nvim', + 'BurntSushi/ripgrep', + { 'nvim-telescope/telescope-fzf-native.nvim', build = 'make' } + }, + }, + { + 'nvim-telescope/telescope-ui-select.nvim', + config = function() + local telescope = require("telescope") + telescope.setup({ + pickers = { + find_files = { + find_command = { "rg", "--files", "--glob", "!**/vendor/*", "--glob", "!*_templ.go" } + }, + }, + extensions = { + ["ui-select"] = { + require("telescope.themes").get_dropdown { + } + } + } + }) + + telescope.load_extension("ui-select") + telescope.load_extension("fzf") + end + } +} diff --git a/dot_config/nvim/lua/plugins/tiny-inline.lua b/dot_config/nvim/lua/plugins/tiny-inline.lua new file mode 100644 index 0000000..440e829 --- /dev/null +++ b/dot_config/nvim/lua/plugins/tiny-inline.lua @@ -0,0 +1,19 @@ +return { + "rachartier/tiny-inline-diagnostic.nvim", + event = "VeryLazy", + priority = 1000, + config = function() + require('tiny-inline-diagnostic').setup({ + preset = "modern", + transparent_bg = true, + + options = { + multilines = { + enabled = true, + always_show = true, + } + } + }) + vim.diagnostic.config({ virtual_text = false }) -- Disable Neovim's default virtual text diagnostics + end, +} diff --git a/dot_config/nvim/lua/plugins/tmux.lua b/dot_config/nvim/lua/plugins/tmux.lua new file mode 100644 index 0000000..2b859f8 --- /dev/null +++ b/dot_config/nvim/lua/plugins/tmux.lua @@ -0,0 +1,15 @@ +return { + 'alexghergh/nvim-tmux-navigation', + config = function() + require 'nvim-tmux-navigation'.setup { + disable_when_zoomed = false, -- defaults to false + keybindings = { + left = "", + down = "", + up = "", + right = "", + last_active = "", + } + } + end +} diff --git a/dot_config/nvim/lua/plugins/treesitter.lua b/dot_config/nvim/lua/plugins/treesitter.lua new file mode 100644 index 0000000..cf947b9 --- /dev/null +++ b/dot_config/nvim/lua/plugins/treesitter.lua @@ -0,0 +1,25 @@ +return { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate", + config = function() + require("nvim-treesitter.configs").setup({ + ensure_installed = { "lua", "go", "zig", "markdown", "json", "yaml", "javascript", + "typescript", "bash", "python", "c_sharp", "cpp", "gleam", "svelte" }, + indent = { enable = true }, + sync_install = false, + + highlight = { enable = true }, + }) + + local treesitter_parser_config = require("nvim-treesitter.parsers").get_parser_configs() + treesitter_parser_config.templ = { + install_info = { + url = "https://github.com/vrischmann/tree-sitter-templ.git", + files = { "src/parser.c", "src/scanner.c" }, + branch = "master", + }, + } + + vim.treesitter.language.register("templ", "templ") + end +} diff --git a/dot_config/nvim/lua/plugins/vim-lazy-dev.lua b/dot_config/nvim/lua/plugins/vim-lazy-dev.lua new file mode 100644 index 0000000..864161c --- /dev/null +++ b/dot_config/nvim/lua/plugins/vim-lazy-dev.lua @@ -0,0 +1,11 @@ +return { + "folke/lazydev.nvim", + ft = "lua", -- only load on lua files + opts = { + library = { + -- See the configuration section for more details + -- Load luvit types when the `vim.uv` word is found + { path = "${3rd}/luv/library", words = { "vim%.uv" } }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/which-key.lua b/dot_config/nvim/lua/plugins/which-key.lua new file mode 100644 index 0000000..62125fe --- /dev/null +++ b/dot_config/nvim/lua/plugins/which-key.lua @@ -0,0 +1,27 @@ +return { + "folke/which-key.nvim", + event = "VeryLazy", + opts = { + -- your configuration comes here + -- or leave it empty to use the default settings + -- refer to the configuration section below + }, + keys = { + { + "?", + function() + require("which-key").show({ global = false }) + end, + desc = "Buffer Local Keymaps (which-key)", + }, + }, + config = function() + local wk = require("which-key") + wk.add({ + { "d", group = "Debug" }, + { "f", group = "Telescope" }, + { "t", group = "Test" }, + { "c", group = "Code" }, + }) + end +} diff --git a/dot_config/nvim/lua/vim-options.lua b/dot_config/nvim/lua/vim-options.lua new file mode 100644 index 0000000..570a5af --- /dev/null +++ b/dot_config/nvim/lua/vim-options.lua @@ -0,0 +1,11 @@ +vim.g.mapleader = " " +vim.cmd("set tabstop=2") +vim.cmd("set softtabstop=2") +vim.cmd("set shiftwidth=2") +vim.cmd("set expandtab") +vim.cmd("set clipboard+=unnamedplus") +vim.cmd("highlight Normal guibg=none") +vim.cmd("highlight NonText guibg=none") +vim.cmd("highlight Normal ctermbg=none") +vim.cmd("highlight NonText ctermbg=none") +vim.o.winborder = 'rounded' diff --git a/dot_config/nvim/queries/gotmpl/injections.scm b/dot_config/nvim/queries/gotmpl/injections.scm new file mode 100644 index 0000000..16d5736 --- /dev/null +++ b/dot_config/nvim/queries/gotmpl/injections.scm @@ -0,0 +1,3 @@ +((text) @injection.content + (#set! injection.language "html") + (#set! injection.combined)) diff --git a/dot_config/nvim/readme.md b/dot_config/nvim/readme.md new file mode 100644 index 0000000..1a26ec6 --- /dev/null +++ b/dot_config/nvim/readme.md @@ -0,0 +1,2 @@ +Currently this needs doing next: https://www.youtube.com/watch?v=iXIwm4mCpuc + diff --git a/dot_config/starship.toml b/dot_config/starship.toml new file mode 100644 index 0000000..e2d2ef9 --- /dev/null +++ b/dot_config/starship.toml @@ -0,0 +1,3 @@ +[directory] +truncation_length = 0 +truncate_to_repo = false diff --git a/dot_config/waybar/config b/dot_config/waybar/config new file mode 100644 index 0000000..a9f29cc --- /dev/null +++ b/dot_config/waybar/config @@ -0,0 +1,50 @@ +{ + "layer": "top", + "position": "top", + "height": 28, + + "modules-left": ["hyprland/workspaces"], + "modules-center": ["hyprland/window"], + "modules-right": ["cpu", "memory", "network", "pulseaudio", "clock"], + + "hyprland/workspaces": { + "disable-scroll": true, + "all-outputs": false, + "format": "{name}", + "on-click": "activate" + }, + + "hyprland/window": { + "format": "{}", + "max-length": 60 + }, + + "cpu": { + "format": " {usage}%", + "interval": 2 + }, + + "memory": { + "format": " {used:0.1f}G", + "interval": 5 + }, + + "network": { + "format": " {bandwidthDownBits}  {bandwidthUpBits}", + // "format-wifi": " {essid}", + // "format-ethernet": "󰈀 eth", + "format-disconnected": "⚠ offline", + "interval": 5 + }, + + "pulseaudio": { + "format": " {volume}%", + "format-muted": " muted", + "on-click": "pavucontrol" + }, + + "clock": { + "format": " {:%H:%M}", + "tooltip-format": "{:%Y-%m-%d %H:%M:%S}" + } +} diff --git a/dot_config/waybar/style.css b/dot_config/waybar/style.css new file mode 100644 index 0000000..67a2939 --- /dev/null +++ b/dot_config/waybar/style.css @@ -0,0 +1,53 @@ +* { + border: none; + border-radius: 0; + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 12px; + min-height: 0; +} + +window#waybar { + background: #1e1e2e; + color: #cdd6f4; +} + +#workspaces button { + padding: 0 8px; + color: #6c7086; +} + +#workspaces button.active { + color: #89b4fa; +} + +#workspaces button:hover { + background: #313244; +} + +#window { + color: #a6adc8; +} + +#cpu, #memory, #network, #pulseaudio, #clock { + padding: 0 10px; +} + +#clock { + color: #f9e2af; +} + +#cpu { + color: #fab387; +} + +#memory { + color: #f38ba8; +} + +#network { + color: #89b4fa; +} + +#pulseaudio { + color: #a6e3a1; +} diff --git a/dot_tmux.conf b/dot_tmux.conf new file mode 100644 index 0000000..f3c03bd --- /dev/null +++ b/dot_tmux.conf @@ -0,0 +1,57 @@ +# remap prefix +set-option -g prefix C-Space +unbind C-Space +bind-key C-Space send-prefix + +set -g mouse on + +set -g base-index 1 +setw -g pane-base-index 1 + +set -sg escape-time 10 + +set -g renumber-windows on + +# split panes +bind / split-window -hc "#{pane_current_path}" +bind - split-window -vc "#{pane_current_path}" + +bind c new-window + +bind -r "<" swap-window -d -t -1 +bind -r ">" swap-window -d -t +1 + +bind r source-file ~/.tmux.conf + +bind -n C-h select-pane -L +bind -n C-j select-pane -D +bind -n C-k select-pane -U +bind -n C-l select-pane -R + +# Smart pane switching with awareness of Vim splits. +# See: https://github.com/christoomey/vim-tmux-navigator + +# decide whether we're in a Vim process +is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ + | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" + +bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L' +bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D' +bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U' +bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R' + +tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")' + +if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \ + "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'" +if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \ + "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'" + +bind-key -n 'C-Space' if-shell "$is_vim" 'send-keys C-Space' 'select-pane -t:.+' + +bind-key -T copy-mode-vi 'C-h' select-pane -L +bind-key -T copy-mode-vi 'C-j' select-pane -D +bind-key -T copy-mode-vi 'C-k' select-pane -U +bind-key -T copy-mode-vi 'C-l' select-pane -R +bind-key -T copy-mode-vi 'C-\' select-pane -l +bind-key -T copy-mode-vi 'C-Space' select-pane -t:.+ diff --git a/dot_zshrc b/dot_zshrc new file mode 100644 index 0000000..ccb5330 --- /dev/null +++ b/dot_zshrc @@ -0,0 +1,34 @@ +autoload -Uz compinit +compinit + +HISTFILE=~/.zsh_history +SAVEHIST=1000 +HISTSIZE=1000 + +bindkey '^R' history-incremental-search-backward +bindkey '^r' history-incremental-pattern-search-backward + +setopt hist_ignore_dups +setopt appendhistory +unsetopt beep + +# zstyle :compinstall filename '/home/zam/.zshrc' +export EDITOR='nvim' +alias vim='nvim' +alias cd='z' +alias ls='eza --icons=always' + +export path + +type starship_zle-keymap-select >/dev/null || \ + { + eval "$(starship init zsh)" + } + +eval "$(zoxide init zsh)" + +source /usr/share/zsh/plugins/zsh-autocomplete/zsh-autocomplete.plugin.zsh +source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh +source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +fastfetch