├── .gitignore ├── uwsm ├── default-id └── env ├── yazi ├── theme.toml ├── init.lua ├── plugins │ ├── smart-enter.yazi │ │ ├── main.lua │ │ ├── LICENSE │ │ └── README.md │ ├── no-status.yazi │ │ ├── main.lua │ │ ├── README.md │ │ └── LICENSE │ └── restore.yazi │ │ └── README.md ├── package.toml ├── flavors │ └── modified-gruvbox.yazi │ │ └── flavor.toml └── yazi.toml ├── rofi ├── shared │ ├── font.rasi │ └── gruvbox.rasi ├── launcher │ └── launcher.sh ├── websearch │ ├── main.rasi │ └── websearch.sh └── powermenu │ ├── powermenu.sh │ ├── confirm.rasi │ └── main.rasi ├── systemd └── user │ ├── hyprland.target.wants │ ├── swaync.service │ ├── waybar.service │ ├── hypridle.service │ ├── hyprpaper.service │ ├── hyprsunset.service │ ├── hyprpolkitagent.service │ ├── ydotoold.service │ ├── battery-monitor.service │ └── wl-clip-persist.service │ ├── default.target.wants │ ├── pipewire-pulse.socket │ └── pipewire-pulse.service │ ├── sockets.target.wants │ └── gnome-keyring-daemon.socket │ ├── swaync.service.d │ └── override.conf │ ├── waybar.service.d │ └── override.conf │ ├── hypridle.service.d │ └── override.conf │ ├── hyprpaper.service.d │ └── override.conf │ ├── hyprsunset.service.d │ └── override.conf │ ├── hyprpolkitagent.service.d │ └── override.conf │ ├── hyprland.target │ ├── wl-clip-persist.service │ ├── ydotoold.service │ └── battery-monitor.service ├── wallpaper ├── wallpaper1.png ├── wallpaper2.png ├── wallpaper3.png ├── wallpaper4.png └── plain-wallpaper.png ├── hypr ├── core │ ├── autostart.conf │ ├── permission.conf │ ├── variables.conf │ ├── binds.conf │ └── submap.conf ├── io │ ├── monitors.conf │ └── input.conf ├── hyprpaper.conf ├── hyprsunset.conf ├── hyprland.conf ├── hypridle.conf └── appearance │ ├── animation.conf │ ├── windowrule.conf │ └── lookNfeel.conf ├── nvim ├── lua │ ├── plugins │ │ ├── screenkey.lua │ │ ├── ts.lua │ │ ├── surround.lua │ │ ├── lint.lua │ │ ├── matchup.lua │ │ ├── conform.lua │ │ ├── markdown.lua │ │ ├── illuminate.lua │ │ ├── dashboard.lua │ │ ├── nvimtree.lua │ │ ├── todo.lua │ │ ├── treesitter.lua │ │ ├── indentline.lua │ │ ├── main.lua │ │ ├── whichkey.lua │ │ ├── snacks.lua │ │ ├── copilot.lua │ │ ├── lsp.lua │ │ ├── git.lua │ │ ├── cmp.lua │ │ └── lspsaga.lua │ ├── utils │ │ ├── terminal.lua │ │ ├── dedent.lua │ │ └── map.lua │ ├── configs │ │ ├── lazy.lua │ │ ├── autocmds.lua │ │ ├── options.lua │ │ ├── servers.lua │ │ └── mappings.lua │ └── chadrc.lua ├── README.md ├── init.lua └── lazy-lock.json ├── screenshot ├── screenshot_2025-05-17_19-17-34.png ├── screenshot_2025-05-17_19-19-04.png ├── screenshot_2025-05-17_19-29-13.png ├── screenshot_2025-05-17_19-51-35.png ├── screenshot_2025-06-02_20-29-16.png ├── screenshot_2025-06-02_20-39-54.png ├── screenshot_2025-06-02_20-42-26.png ├── screenshot_2025-06-02_21-31-26.png ├── screenshot_2025-06-02_21-31-50.png ├── screenshot_2025-07-21_20-14-17.png ├── screenshot_2025-12-20_07-36-48.png ├── screenshot_2025-12-20_07-37-26.png └── screenshot_2025-12-20_07-56-06.png ├── lazygit └── config.yml ├── fastfetch ├── arch.txt └── cat.txt ├── scripts ├── desktop-portal.sh ├── tmux-popup.sh ├── cputemp.sh ├── timer.sh ├── tmux-init.sh ├── mouse-click.sh ├── zoom.sh ├── nvim-sync.sh ├── ocr.sh ├── dev.sh ├── symlink-dotfiles.sh ├── screenshot-full.sh ├── toggle-hyprsunset.sh ├── phone-sync.sh ├── open-file.sh ├── toggle-zen.sh ├── screenshot.sh ├── mediactl.sh ├── battery-warn.sh └── tmux-session-manager.py ├── zsh ├── .zsh_plugins.txt ├── path.zsh ├── keybindings.zsh ├── env_vars.zsh ├── setopt.zsh ├── .zshrc ├── aliases.zsh └── functions.zsh ├── .editorconfig ├── pacseek ├── colors.json └── config.json ├── swaylock └── config ├── LICENSE ├── git └── .gitconfig ├── kitty ├── themes │ └── gruvbox_dark.conf └── kitty.conf ├── btop └── themes │ └── modified_gruvbox.theme ├── README.md ├── swaync └── config.json ├── pkglist.txt ├── tmux └── .tmux.conf └── waybar ├── style.css └── config.jsonc /.gitignore: -------------------------------------------------------------------------------- 1 | etc/ 2 | -------------------------------------------------------------------------------- /uwsm/default-id: -------------------------------------------------------------------------------- 1 | hyprland-uwsm.desktop 2 | -------------------------------------------------------------------------------- /yazi/theme.toml: -------------------------------------------------------------------------------- 1 | [flavor] 2 | dark = "modified-gruvbox" 3 | -------------------------------------------------------------------------------- /rofi/shared/font.rasi: -------------------------------------------------------------------------------- 1 | * { 2 | font: "JetBrains Mono Nerd Font 10"; 3 | } 4 | -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/swaync.service: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/swaync.service -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/waybar.service: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/waybar.service -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/hypridle.service: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/hypridle.service -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/hyprpaper.service: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/hyprpaper.service -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/hyprsunset.service: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/hyprsunset.service -------------------------------------------------------------------------------- /systemd/user/default.target.wants/pipewire-pulse.socket: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/pipewire-pulse.socket -------------------------------------------------------------------------------- /systemd/user/default.target.wants/pipewire-pulse.service: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/pipewire-pulse.service -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/hyprpolkitagent.service: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/hyprpolkitagent.service -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/ydotoold.service: -------------------------------------------------------------------------------- 1 | /home/r4ppz/.config/systemd/user/ydotoold.service -------------------------------------------------------------------------------- /wallpaper/wallpaper1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/wallpaper/wallpaper1.png -------------------------------------------------------------------------------- /wallpaper/wallpaper2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/wallpaper/wallpaper2.png -------------------------------------------------------------------------------- /wallpaper/wallpaper3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/wallpaper/wallpaper3.png -------------------------------------------------------------------------------- /wallpaper/wallpaper4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/wallpaper/wallpaper4.png -------------------------------------------------------------------------------- /systemd/user/sockets.target.wants/gnome-keyring-daemon.socket: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/gnome-keyring-daemon.socket -------------------------------------------------------------------------------- /wallpaper/plain-wallpaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/wallpaper/plain-wallpaper.png -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/battery-monitor.service: -------------------------------------------------------------------------------- 1 | /home/r4ppz/.config/systemd/user/battery-monitor.service -------------------------------------------------------------------------------- /systemd/user/hyprland.target.wants/wl-clip-persist.service: -------------------------------------------------------------------------------- 1 | /home/r4ppz/.config/systemd/user/wl-clip-persist.service -------------------------------------------------------------------------------- /yazi/init.lua: -------------------------------------------------------------------------------- 1 | require("no-status"):setup() 2 | 3 | require("smart-enter"):setup({ 4 | open_multi = true, 5 | }) 6 | -------------------------------------------------------------------------------- /systemd/user/swaync.service.d/override.conf: -------------------------------------------------------------------------------- 1 | [Unit] 2 | PartOf=hyprland.target 3 | 4 | [Install] 5 | WantedBy= 6 | WantedBy=hyprland.target 7 | -------------------------------------------------------------------------------- /systemd/user/waybar.service.d/override.conf: -------------------------------------------------------------------------------- 1 | [Unit] 2 | PartOf=hyprland.target 3 | 4 | [Install] 5 | WantedBy= 6 | WantedBy=hyprland.target 7 | -------------------------------------------------------------------------------- /hypr/core/autostart.conf: -------------------------------------------------------------------------------- 1 | exec-once = systemctl --user start hyprland.target 2 | exec-once = dbus-update-activation-environment --systemd --all 3 | -------------------------------------------------------------------------------- /hypr/io/monitors.conf: -------------------------------------------------------------------------------- 1 | monitor = , preferred, auto, 1 2 | # monitor=,1366x768,0x0,1 3 | # monitor=,1280x720,0x0,1 4 | # monitor=,1920x1080,0x0,1 5 | -------------------------------------------------------------------------------- /nvim/lua/plugins/screenkey.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "NStefan002/screenkey.nvim", 3 | enabled = false, 4 | lazy = true, 5 | version = "*", 6 | } 7 | -------------------------------------------------------------------------------- /screenshot/screenshot_2025-05-17_19-17-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-05-17_19-17-34.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-05-17_19-19-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-05-17_19-19-04.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-05-17_19-29-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-05-17_19-29-13.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-05-17_19-51-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-05-17_19-51-35.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-06-02_20-29-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-06-02_20-29-16.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-06-02_20-39-54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-06-02_20-39-54.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-06-02_20-42-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-06-02_20-42-26.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-06-02_21-31-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-06-02_21-31-26.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-06-02_21-31-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-06-02_21-31-50.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-07-21_20-14-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-07-21_20-14-17.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-12-20_07-36-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-12-20_07-36-48.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-12-20_07-37-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-12-20_07-37-26.png -------------------------------------------------------------------------------- /screenshot/screenshot_2025-12-20_07-56-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r4ppz/Arch-dotfiles/HEAD/screenshot/screenshot_2025-12-20_07-56-06.png -------------------------------------------------------------------------------- /systemd/user/hypridle.service.d/override.conf: -------------------------------------------------------------------------------- 1 | [Unit] 2 | PartOf=hyprland.target 3 | 4 | [Install] 5 | WantedBy= 6 | WantedBy=hyprland.target 7 | -------------------------------------------------------------------------------- /systemd/user/hyprpaper.service.d/override.conf: -------------------------------------------------------------------------------- 1 | [Unit] 2 | PartOf=hyprland.target 3 | 4 | [Install] 5 | WantedBy= 6 | WantedBy=hyprland.target 7 | -------------------------------------------------------------------------------- /systemd/user/hyprsunset.service.d/override.conf: -------------------------------------------------------------------------------- 1 | [Unit] 2 | PartOf=hyprland.target 3 | 4 | [Install] 5 | WantedBy= 6 | WantedBy=hyprland.target 7 | -------------------------------------------------------------------------------- /hypr/hyprpaper.conf: -------------------------------------------------------------------------------- 1 | preload = /home/r4ppz/Arch-dotfiles/wallpaper/wallpaper1.png 2 | wallpaper = ,/home/r4ppz/Arch-dotfiles/wallpaper/wallpaper1.png 3 | -------------------------------------------------------------------------------- /systemd/user/hyprpolkitagent.service.d/override.conf: -------------------------------------------------------------------------------- 1 | [Unit] 2 | PartOf=hyprland.target 3 | 4 | [Install] 5 | WantedBy= 6 | WantedBy=hyprland.target 7 | -------------------------------------------------------------------------------- /systemd/user/hyprland.target: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=User services specific to Hyprland session 3 | BindsTo=graphical-session.target 4 | After=graphical-session.target 5 | 6 | -------------------------------------------------------------------------------- /rofi/launcher/launcher.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | dir="$HOME/.config/rofi/launcher" 4 | theme='main' 5 | 6 | # Run 7 | rofi \ 8 | -show drun \ 9 | -theme ${dir}/${theme}.rasi 10 | -------------------------------------------------------------------------------- /lazygit/config.yml: -------------------------------------------------------------------------------- 1 | gui: 2 | showIcons: true 3 | nerdFontsVersion: "3" 4 | border: single 5 | theme: 6 | activeBorderColor: 7 | - blue 8 | - bold 9 | git: 10 | overrideGpg: true 11 | -------------------------------------------------------------------------------- /hypr/hyprsunset.conf: -------------------------------------------------------------------------------- 1 | max-gamma = 150 2 | 3 | profile { 4 | time = 07:00 5 | temperature = 5000 6 | gamma = 1 7 | } 8 | 9 | profile { 10 | time = 16:00 11 | temperature = 3800 12 | gamma = 0.90 13 | } 14 | -------------------------------------------------------------------------------- /fastfetch/arch.txt: -------------------------------------------------------------------------------- 1 | . 2 | / \ 3 | / \ 4 | /\ \ 5 | / \ 6 | / \ 7 | / .-. \ 8 | / | | _\ 9 | / _.' '._ \ 10 | /_.-' '-._\ 11 | 12 | -------------------------------------------------------------------------------- /scripts/desktop-portal.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | sleep 1 5 | killall -e xdg-desktop-portal-hyprland 6 | killall xdg-desktop-portal 7 | /usr/lib/xdg-desktop-portal-hyprland & 8 | sleep 2 9 | /usr/lib/xdg-desktop-portal & 10 | -------------------------------------------------------------------------------- /zsh/.zsh_plugins.txt: -------------------------------------------------------------------------------- 1 | romkatv/powerlevel10k 2 | Aloxaf/fzf-tab 3 | zsh-users/zsh-autosuggestions 4 | zsh-users/zsh-completions 5 | zsh-users/zsh-history-substring-search 6 | zsh-users/zsh-syntax-highlighting 7 | MichaelAquilina/zsh-you-should-use 8 | paulirish/git-open 9 | -------------------------------------------------------------------------------- /zsh/path.zsh: -------------------------------------------------------------------------------- 1 | typeset -U path 2 | path=( 3 | $HOME/.local/bin 4 | $GOPATH/bin 5 | $HOME/.cargo/bin 6 | $HOME/Arch-dotfiles/scripts 7 | $HOME/.local/share/gem/ruby/3.4.0/bin/ 8 | $HOME/.npm-global/bin:$PATH 9 | ${path[@]} 10 | ) 11 | export PATH 12 | -------------------------------------------------------------------------------- /zsh/keybindings.zsh: -------------------------------------------------------------------------------- 1 | bindkey -e # emacs mode 2 | 3 | # Modern word jumps (Alt+←/→ and Ctrl+←/→) 4 | bindkey '^[[1;3D' backward-word # Alt+← 5 | bindkey '^[[1;3C' forward-word # Alt+→ 6 | bindkey '^[[1;5D' backward-word # Ctrl+← 7 | bindkey '^[[1;5C' forward-word # Ctrl+→ 8 | -------------------------------------------------------------------------------- /rofi/shared/gruvbox.rasi: -------------------------------------------------------------------------------- 1 | * { 2 | background: #282828FF; 3 | background-alt: #353535FF; 4 | foreground: #EBDBB2FF; 5 | selected: #83A598FF; 6 | active: #B8BB26FF; 7 | urgent: #FB4934FF; 8 | border: #504945FF; 9 | } 10 | -------------------------------------------------------------------------------- /hypr/core/permission.conf: -------------------------------------------------------------------------------- 1 | ecosystem { 2 | enforce_permissions = false 3 | } 4 | 5 | permission = /usr/(bin|local/bin)/grim, screencopy, allow 6 | permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow 7 | permission = /usr/(bin|local/bin)/hyprpm, plugin, ask 8 | -------------------------------------------------------------------------------- /scripts/tmux-popup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ "$(tmux display-message -p -F "#{session_name}")" = "popup" ]; then 4 | tmux detach-client 5 | else 6 | tmux popup -d '#{pane_current_path}' -xC -yC -w80% -h80% -E "tmux attach -t popup || tmux new -s popup; tmux set-option -t popup status off" 7 | fi 8 | -------------------------------------------------------------------------------- /systemd/user/wl-clip-persist.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Clipboard persistence for Wayland 3 | After=graphical.target 4 | PartOf=hyprland.target 5 | 6 | [Service] 7 | ExecStart=/usr/bin/wl-clip-persist --clipboard regular 8 | Restart=on-failure 9 | 10 | [Install] 11 | WantedBy=hyprland.target 12 | 13 | -------------------------------------------------------------------------------- /systemd/user/ydotoold.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=ydotoold daemon 3 | After=graphical-session.target 4 | PartOf=hyprland.target 5 | 6 | [Service] 7 | ExecStart=/usr/bin/ydotoold --socket-perm=0600 --socket-path=/run/user/1000/.ydotool_socket 8 | Restart=on-failure 9 | 10 | [Install] 11 | WantedBy=hyprland.target 12 | -------------------------------------------------------------------------------- /yazi/plugins/smart-enter.yazi/main.lua: -------------------------------------------------------------------------------- 1 | --- @since 25.5.31 2 | --- @sync entry 3 | 4 | local function setup(self, opts) self.open_multi = opts.open_multi end 5 | 6 | local function entry(self) 7 | local h = cx.active.current.hovered 8 | ya.emit(h and h.cha.is_dir and "enter" or "open", { hovered = not self.open_multi }) 9 | end 10 | 11 | return { entry = entry, setup = setup } 12 | -------------------------------------------------------------------------------- /nvim/lua/plugins/ts.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "pmizio/typescript-tools.nvim", 3 | dependencies = { "nvim-lua/plenary.nvim", "neovim/nvim-lspconfig" }, 4 | ft = { "javascript", "javascriptreact", "typescript", "typescriptreact" }, 5 | opts = { 6 | settings = { 7 | jsx_close_tag = { enable = false, filetypes = { "javascriptreact", "typescriptreact" } }, 8 | }, 9 | }, 10 | } 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # .editorconfig 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | max_line_length = 120 11 | spelling_language = en-US 12 | trim_trailing_whitespace = true 13 | 14 | [*.java] 15 | indent_size = 4 16 | 17 | [*.rs] 18 | indent_size = 4 19 | 20 | [*.py] 21 | indent_size = 4 22 | -------------------------------------------------------------------------------- /systemd/user/battery-monitor.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Battery Level Monitor 3 | After=graphical-session.target 4 | PartOf=hyprland.target 5 | 6 | [Service] 7 | Type=simple 8 | ExecStart=%h/Arch-dotfiles/scripts/battery-warn.sh 9 | Restart=always 10 | RestartSec=10 11 | Environment=DISPLAY=:0 12 | Environment=WAYLAND_DISPLAY=wayland-0 13 | 14 | [Install] 15 | WantedBy=hyprland.target 16 | -------------------------------------------------------------------------------- /yazi/plugins/no-status.yazi/main.lua: -------------------------------------------------------------------------------- 1 | --- @since 25.2.7 2 | 3 | local function setup() 4 | local old_layout = Tab.layout 5 | 6 | Status.redraw = function() return {} end 7 | Tab.layout = function(self, ...) 8 | self._area = ui.Rect { x = self._area.x, y = self._area.y, w = self._area.w, h = self._area.h + 1 } 9 | return old_layout(self, ...) 10 | end 11 | end 12 | 13 | return { setup = setup } 14 | -------------------------------------------------------------------------------- /scripts/cputemp.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | TEMP=$(sensors 2>/dev/null | awk '/^Package id 0:/ {gsub(/\+|°C/,"",$4); print int($4); exit}') 4 | 5 | if [ -z "$TEMP" ]; then 6 | TEMP=0 7 | fi 8 | 9 | if [ "$TEMP" -ge 80 ]; then 10 | CLASS="critical" 11 | elif [ "$TEMP" -ge 70 ]; then 12 | CLASS="warning" 13 | else 14 | CLASS="normal" 15 | fi 16 | 17 | echo "{\"text\": \"$TEMP\", \"class\": \"$CLASS\"}" 18 | -------------------------------------------------------------------------------- /hypr/hyprland.conf: -------------------------------------------------------------------------------- 1 | # core 2 | source = ./core/variables.conf 3 | source = ./core/autostart.conf 4 | source = ./core/binds.conf 5 | source = ./core/submap.conf 6 | source = ./core/permission.conf 7 | 8 | # appearance 9 | source = ./appearance/windowrule.conf 10 | source = ./appearance/lookNfeel.conf 11 | source = ./appearance/animation.conf 12 | 13 | # io 14 | source = ./io/input.conf 15 | source = ./io/monitors.conf 16 | -------------------------------------------------------------------------------- /yazi/package.toml: -------------------------------------------------------------------------------- 1 | [[plugin.deps]] 2 | use = "yazi-rs/plugins:no-status" 3 | rev = "8f1d971" 4 | hash = "3e023d31f29201efdac2a6ae35fedb78" 5 | 6 | [[plugin.deps]] 7 | use = "yazi-rs/plugins:smart-enter" 8 | rev = "8f1d971" 9 | hash = "56fdabc96fc1f4d53c96eb884b02a5be" 10 | 11 | [[plugin.deps]] 12 | use = "boydaihungst/restore" 13 | rev = "2161735" 14 | hash = "901741afba1979739b4650324265162e" 15 | 16 | [flavor] 17 | deps = [] 18 | -------------------------------------------------------------------------------- /nvim/lua/utils/terminal.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | M.toggle_tab_terminal = function(opts) 4 | local default_opts = { 5 | pos = "float", 6 | size = 0.5, 7 | direction = "horizontal", 8 | } 9 | local config = vim.tbl_extend("force", default_opts, opts or {}) 10 | config.id = "tab_term_" .. tostring(vim.api.nvim_get_current_tabpage()) .. "_" .. config.pos 11 | require("nvchad.term").toggle(config) 12 | end 13 | 14 | return M 15 | -------------------------------------------------------------------------------- /nvim/lua/utils/dedent.lua: -------------------------------------------------------------------------------- 1 | local function dedent(str) 2 | str = str:gsub("^%s*\n", ""):gsub("\n%s*$", "") 3 | local min_indent = nil 4 | for indent in str:gmatch("\n([ \t]*)%S") do 5 | if min_indent == nil or #indent < #min_indent then 6 | min_indent = indent 7 | end 8 | end 9 | if not min_indent or #min_indent == 0 then 10 | return str 11 | end 12 | return str:gsub("\n" .. min_indent, "\n") 13 | end 14 | 15 | return dedent 16 | -------------------------------------------------------------------------------- /nvim/lua/utils/map.lua: -------------------------------------------------------------------------------- 1 | local function map(mode, lhs, rhs, opts) 2 | if not mode then 3 | error("map: 'mode' is required") 4 | end 5 | if not lhs then 6 | error("map: 'lhs' (key) is required") 7 | end 8 | if not rhs then 9 | error("map: 'rhs' (action) is required") 10 | end 11 | 12 | opts = opts or {} 13 | opts.noremap = true 14 | opts.silent = true 15 | 16 | vim.keymap.set(mode, lhs, rhs, opts) 17 | end 18 | 19 | return map 20 | -------------------------------------------------------------------------------- /uwsm/env: -------------------------------------------------------------------------------- 1 | export XCURSOR_THEME=Hackneyed-24px 2 | export XCURSOR_SIZE=24 3 | export GTK_THEME=Gruvbox-Material-Dark 4 | 5 | export QT_QPA_PLATFORMTHEME=kde 6 | export QT_STYLE_OVERRIDE=kvantum 7 | export QT_AUTO_SCREEN_SCALE_FACTOR=1 8 | export QT_WAYLAND_DISABLE_WINDOWDECORATION=1 9 | 10 | export GDK_BACKEND=wayland,x11,* 11 | export QT_QPA_PLATFORM=wayland;xcb 12 | export SDL_VIDEODRIVER=wayland 13 | export CLUTTER_BACKEND=wayland 14 | 15 | export EDITOR=nvim 16 | export VISUAL=nvim 17 | -------------------------------------------------------------------------------- /hypr/io/input.conf: -------------------------------------------------------------------------------- 1 | input { 2 | kb_layout = us 3 | kb_variant = 4 | kb_model = 5 | kb_options = 6 | kb_rules = 7 | 8 | float_switch_override_focus = 0 9 | follow_mouse = 1 10 | mouse_refocus = false 11 | numlock_by_default = false 12 | sensitivity = -0.5 13 | 14 | repeat_delay = 300 15 | repeat_rate = 50 16 | 17 | touchpad { 18 | natural_scroll = true 19 | disable_while_typing = true 20 | scroll_factor = 0.1 21 | tap-to-click = false 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /pacseek/colors.json: -------------------------------------------------------------------------------- 1 | { 2 | "Transparent": true, 3 | "Accent": "83a598", 4 | "Title": "458588", 5 | "SearchBar": "3c3836", 6 | "PackagelistSourceRepository": "98971a", 7 | "PackagelistSourceAUR": "83a598", 8 | "PackagelistHeader": "fabd2f", 9 | "SettingsFieldBackground": "3c3836", 10 | "SettingsFieldText": "ebdbb2", 11 | "SettingsFieldLabel": "d79921", 12 | "SettingsDropdownNotSelected": "504945", 13 | "StylePKGBUILD": "native", 14 | "Comments": "Gruvbox Material Dark by r4ppz" 15 | } 16 | -------------------------------------------------------------------------------- /scripts/timer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | MINUTES="$1" 5 | TOTAL_SECONDS=$((MINUTES * 60)) 6 | 7 | orig_stty=$(stty -g) 8 | stty -echo -icanon 9 | cleanup() { 10 | stty "$orig_stty" 11 | printf "\n" 12 | } 13 | trap cleanup EXIT INT TERM 14 | 15 | for ((i = 1; i <= TOTAL_SECONDS; i++)); do 16 | printf "\r%02d:%02d" $(((TOTAL_SECONDS - i) / 60)) $(((TOTAL_SECONDS - i) % 60)) 17 | sleep 1 18 | done 19 | 20 | printf "\n\n⏰ Timer Done." 21 | notify-send -u critical "⏰ Timer Done" "Your timer has finished." 22 | -------------------------------------------------------------------------------- /yazi/plugins/no-status.yazi/README.md: -------------------------------------------------------------------------------- 1 | # no-status.yazi 2 | 3 | Remove the status bar. 4 | 5 | ![no-status-bar](https://github.com/user-attachments/assets/336bf813-2427-4338-827f-9ebc83d45d99) 6 | 7 | ## Installation 8 | 9 | ```sh 10 | ya pkg add yazi-rs/plugins:no-status 11 | ``` 12 | 13 | ## Usage 14 | 15 | Add this to your `init.lua` to enable the plugin: 16 | 17 | ```lua 18 | require("no-status"):setup() 19 | ``` 20 | 21 | ## License 22 | 23 | This plugin is MIT-licensed. For more information check the [LICENSE](LICENSE) file. 24 | -------------------------------------------------------------------------------- /nvim/README.md: -------------------------------------------------------------------------------- 1 | ### My Personal Neovim Configuration 2 | 3 | > **WARNING:** This config sucks. Proceed with caution. 4 | 5 | This is my messy Neovim setup that I use for everyday coding (IDE). 6 | 7 | ## arrows > hjkl ?! 8 | 9 | idk 10 | 11 | ![Screenshot](../screenshot/screenshot_2025-12-20_07-56-06.png) 12 | 13 | ![Screenshot](../screenshot/screenshot_2025-12-20_07-36-48.png) 14 | 15 | ![Screenshot](../screenshot/screenshot_2025-12-20_07-37-26.png) 16 | 17 | [Screen record](https://github.com/user-attachments/assets/646ba986-ea84-4e03-a66c-457fb5e25caf) 18 | -------------------------------------------------------------------------------- /scripts/tmux-init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | SESSION="${1:-main}" 5 | 6 | create_tmux_session() { 7 | local session="$1" 8 | tmux new-session -d -s "$session" -n "R4PPZ" 9 | tmux new-window -t "$session:" -n "CMD" 10 | tmux new-window -t "$session:" -n "TASK" 11 | tmux send-keys -t "$session:CMD" 'y' C-m 12 | tmux send-keys -t "$session:TASK" 'top' C-m 13 | tmux select-window -t "$session:0" 14 | } 15 | 16 | if tmux has-session -t="$SESSION" 2>/dev/null; then 17 | tmux attach -t "$SESSION" 18 | else 19 | create_tmux_session "$SESSION" 20 | tmux attach -t "$SESSION" 21 | fi 22 | -------------------------------------------------------------------------------- /scripts/mouse-click.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | STATE_FILE="/tmp/mouse_state" 5 | /usr/bin/ydotool click 0x80 2>/dev/null || true 6 | echo "released" >"$STATE_FILE" 7 | 8 | case "$1" in 9 | left) /usr/bin/ydotool click 0x40 0x80 ;; 10 | right) /usr/bin/ydotool click 0x41 0x81 ;; 11 | middle) /usr/bin/ydotool click 0x42 0x82 ;; 12 | toggle) 13 | CURRENT_STATE=$(cat "$STATE_FILE") 14 | 15 | if [ "$CURRENT_STATE" = "released" ]; then 16 | echo "pressed" >"$STATE_FILE" 17 | /usr/bin/ydotool click 0x40 18 | else 19 | echo "released" >"$STATE_FILE" 20 | /usr/bin/ydotool click 0x80 21 | fi 22 | ;; 23 | esac 24 | -------------------------------------------------------------------------------- /scripts/zoom.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ZOOM_STEP=1.5 4 | MIN_ZOOM=1 5 | MAX_ZOOM=20 6 | 7 | ZOOM_IN_FACTOR=$ZOOM_STEP 8 | ZOOM_OUT_FACTOR=$(awk "BEGIN {print 1/$ZOOM_STEP}") 9 | 10 | current=$(hyprctl getoption cursor:zoom_factor -j | jq -r '.float') 11 | 12 | case "$1" in 13 | in) 14 | new=$(awk "BEGIN {val=$current * $ZOOM_IN_FACTOR; if (val > $MAX_ZOOM) val=$MAX_ZOOM; print val}") 15 | ;; 16 | out) 17 | new=$(awk "BEGIN {val=$current * $ZOOM_OUT_FACTOR; if (val < $MIN_ZOOM) val=$MIN_ZOOM; print val}") 18 | ;; 19 | *) 20 | echo "Usage: $0 {in|out}" 21 | exit 1 22 | ;; 23 | esac 24 | 25 | hyprctl -q keyword cursor:zoom_factor "$new" 26 | -------------------------------------------------------------------------------- /fastfetch/cat.txt: -------------------------------------------------------------------------------- 1 | ⠀⠀⠀⢠⣾⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 2 | ⠀⠀⣰⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 3 | ⠀⢰⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 4 | ⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 5 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 6 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣄⣀⣀⣤⣤⣶⣾⣿⣿⣿⡷ 7 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁ 8 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀ 9 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⠀ 10 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀ 11 | ⣿⣿⣿⡇⠀⡾⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀ 12 | ⣿⣿⣿⣧⡀⠁⣀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀ 13 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠉⢹⠉⠙⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀ 14 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣀⠀⣀⣼⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀ 15 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀ 16 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀ 17 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠀⠤⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 18 | ⣿⣿⣿⣿⠿⣿⣿⣿⣿⣿⣿⣿⠿⠋⢃⠈⠢⡁⠒⠄⡀⠈⠁⠀⠀⠀⠀⠀⠀⠀ 19 | ⣿⣿⠟⠁⠀⠀⠈⠉⠉⠁⠀⠀⠀⠀⠈⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 20 | ⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 21 | -------------------------------------------------------------------------------- /nvim/lua/plugins/surround.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "nvim-mini/mini.surround", 3 | event = "BufReadPost", 4 | version = "*", 5 | config = function() 6 | require("mini.surround").setup({ 7 | mappings = { 8 | add = "sa", -- Add surrounding 9 | delete = "sd", -- Delete surrounding 10 | find = "sf", -- Find surrounding (to the right) 11 | find_left = "sF", -- Find surrounding (to the left) 12 | highlight = "sh", -- Highlight surrounding 13 | replace = "sr", -- Replace surrounding 14 | 15 | suffix_last = "l", -- Suffix for "find previous" 16 | suffix_next = "n", -- Suffix for "find next" 17 | }, 18 | }) 19 | end, 20 | } 21 | -------------------------------------------------------------------------------- /hypr/hypridle.conf: -------------------------------------------------------------------------------- 1 | general { 2 | before_sleep_cmd = swaylock -f -C ~/.config/swaylock/config 3 | after_sleep_cmd = hyprctl dispatch dpms on 4 | ignore_dbus_inhibit = false 5 | ignore_systemd_inhibit = false 6 | ignore_wayland_inhibit = false 7 | inhibit_sleep = 2 8 | } 9 | 10 | # Dim screen after 5 min 11 | listener { 12 | timeout = 300 13 | on-timeout = sh -c 'brightnessctl -s set 10' 14 | on-resume = sh -c 'brightnessctl -r' 15 | ignore_inhibit = false 16 | } 17 | 18 | # Lock after 6 min 19 | listener { 20 | timeout = 360 21 | on-timeout = swaylock -f -C ~/.config/swaylock/config 22 | ignore_inhibit = false 23 | } 24 | 25 | # Suspend after 7 min 26 | listener { 27 | timeout = 420 28 | on-timeout = systemctl suspend 29 | ignore_inhibit = false 30 | } 31 | -------------------------------------------------------------------------------- /scripts/nvim-sync.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | SOURCE="/home/r4ppz/Arch-dotfiles/nvim/" 5 | DESTINATION="/home/r4ppz/Repositories/rnvim/" 6 | EXCLUDES=( 7 | '.git/' 8 | ) 9 | 10 | if [[ ! -d "$SOURCE" ]]; then 11 | echo "Source directory $SOURCE does not exist." 12 | exit 1 13 | fi 14 | 15 | if [[ ! -d "$DESTINATION" ]]; then 16 | echo "Destination directory $DESTINATION does not exist." 17 | exit 1 18 | fi 19 | 20 | EXCLUDES_LOG=$(printf ", %s" "${EXCLUDES[@]}") 21 | EXCLUDES_LOG=${EXCLUDES_LOG:2} 22 | 23 | RSYNC_EXCLUDES=() 24 | for pattern in "${EXCLUDES[@]}"; do 25 | RSYNC_EXCLUDES+=(--exclude="$pattern") 26 | done 27 | 28 | rsync -av --delete "${RSYNC_EXCLUDES[@]}" "$SOURCE" "$DESTINATION" 29 | 30 | echo "Neovim config synced from $SOURCE to $DESTINATION." 31 | echo "Excludes: $EXCLUDES_LOG" 32 | -------------------------------------------------------------------------------- /nvim/lua/plugins/lint.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "mfussenegger/nvim-lint", 3 | event = { "BufReadPre", "BufNewFile" }, 4 | config = function() 5 | vim.env.ESLINT_D_PPID = vim.fn.getpid() 6 | 7 | require("lint").linters_by_ft = { 8 | javascript = { "eslint_d" }, 9 | typescript = { "eslint_d" }, 10 | javascriptreact = { "eslint_d" }, 11 | typescriptreact = { "eslint_d" }, 12 | } 13 | 14 | vim.api.nvim_create_autocmd({ "BufWritePost" }, { 15 | callback = function() 16 | require("lint").try_lint() 17 | end, 18 | }) 19 | 20 | vim.api.nvim_create_autocmd({ "InsertLeave", "TextChanged" }, { 21 | pattern = { "*.js", "*.jsx", "*.ts", "*.tsx" }, 22 | callback = function() 23 | require("lint").try_lint("eslint_d") 24 | end, 25 | }) 26 | end, 27 | } 28 | -------------------------------------------------------------------------------- /scripts/ocr.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | LOCKFILE="/tmp/screenshot_ocr.lock" 5 | TMPIMG="$(mktemp --suffix=.png)" 6 | 7 | cleanup() { 8 | rm -f "$LOCKFILE" "$TMPIMG" 9 | } 10 | trap cleanup EXIT INT TERM 11 | 12 | if [[ -f "$LOCKFILE" ]]; then 13 | PID=$(<"$LOCKFILE") 14 | if kill -0 "$PID" 2>/dev/null; then 15 | echo "Script already running with PID $PID. Exiting." 16 | exit 1 17 | else 18 | rm -f "$LOCKFILE" 19 | fi 20 | fi 21 | 22 | echo "$$" >"$LOCKFILE" 23 | 24 | for cmd in grim slurp tesseract wl-copy; do 25 | if ! command -v "$cmd" &>/dev/null; then 26 | echo "Error: $cmd is not installed." >&2 27 | exit 1 28 | fi 29 | done 30 | 31 | if REGION="$(slurp)"; then 32 | grim -g "$REGION" "$TMPIMG" 33 | tesseract "$TMPIMG" - -l eng | wl-copy 34 | else 35 | echo "Selection cancelled." 36 | exit 1 37 | fi 38 | -------------------------------------------------------------------------------- /nvim/init.lua: -------------------------------------------------------------------------------- 1 | -- I am not a real vim user 2 | vim.g.base46_cache = vim.fn.stdpath("data") .. "/base46/" 3 | vim.g.mapleader = " " 4 | 5 | -- bootstrap lazy 6 | local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 7 | 8 | if not vim.uv.fs_stat(lazypath) then 9 | local repo = "https://github.com/folke/lazy.nvim.git" 10 | vim.fn.system({ "git", "clone", "--filter=blob:none", repo, "--branch=stable", lazypath }) 11 | end 12 | 13 | vim.opt.rtp:prepend(lazypath) 14 | 15 | -- load plugins 16 | require("lazy").setup({ 17 | { import = "plugins" }, 18 | }, require("configs.lazy")) 19 | 20 | -- load theme 21 | for _, v in ipairs(vim.fn.readdir(vim.g.base46_cache)) do 22 | dofile(vim.g.base46_cache .. v) 23 | end 24 | 25 | require("configs.options") 26 | require("configs.autocmds") 27 | 28 | vim.schedule(function() 29 | require("configs.mappings") 30 | end) 31 | -------------------------------------------------------------------------------- /scripts/dev.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | SESSION="${1:-dev}" 5 | 6 | FRONTDIR='/home/r4ppz/Project/research-repository-frontend/' 7 | BACKDIR='/home/r4ppz/Project/research-repository-backend/' 8 | DOCSDIR='/home/r4ppz/Project/research-repo-docs/' 9 | 10 | create_tmux_session() { 11 | local session="$1" 12 | tmux new-session -d -s "$session" -n "FRONT" 13 | tmux new-window -t "$session:" -n "BACK" 14 | tmux new-window -t "$session:" -n "DOCKER" 15 | 16 | tmux send-keys -t "$session:FRONT" "cd ${FRONTDIR}; v" C-m 17 | tmux send-keys -t "$session:BACK" "cd ${BACKDIR}; v" C-m 18 | tmux send-keys -t "$session:DOCKER" "cd ${BACKDIR}; lazydocker" C-m 19 | 20 | tmux select-window -t "$session:0" 21 | } 22 | 23 | if tmux has-session -t="$SESSION" 2>/dev/null; then 24 | tmux attach -t "$SESSION" 25 | else 26 | create_tmux_session "$SESSION" 27 | tmux attach -t "$SESSION" 28 | fi 29 | -------------------------------------------------------------------------------- /hypr/core/variables.conf: -------------------------------------------------------------------------------- 1 | # Programs 2 | $terminal = kitty 3 | $browser = "brave" 4 | $browserForSchool = "chromium" 5 | $filemanager = thunar 6 | $lockscreen = swaylock 7 | $notifpanel = swaync-client -t 8 | $colorpicker = hyprpicker -a 9 | $record = obs --startrecording --minimize-to-tray 10 | $ide = code 11 | $passmanager = bitwarden-desktop 12 | 13 | # Scripts 14 | $launcher = "$HOME/Arch-dotfiles/rofi/launcher/launcher.sh" 15 | $powermenu = "$HOME/Arch-dotfiles/rofi/powermenu/powermenu.sh" 16 | $websearch = "$HOME/Arch-dotfiles/rofi/websearch/websearch.sh" 17 | 18 | $screenshot = "$HOME/Arch-dotfiles/scripts/screenshot.sh" 19 | $screenshotfull = "$HOME/Arch-dotfiles/scripts/screenshot-full.sh" 20 | $ocr = "$HOME/Arch-dotfiles/scripts/ocr.sh" 21 | $zen = "$HOME/Arch-dotfiles/scripts/toggle-zen.sh" 22 | $mediactl = "$HOME/Arch-dotfiles/scripts/mediactl.sh" 23 | $mouseclick = "$HOME/Arch-dotfiles/scripts/mouse-click.sh" 24 | $eyetemp = "$HOME/Arch-dotfiles/scripts/toggle-hyprsunset.sh" 25 | $zoom = "$HOME/Arch-dotfiles/scripts/zoom.sh" 26 | -------------------------------------------------------------------------------- /swaylock/config: -------------------------------------------------------------------------------- 1 | # Background and basics 2 | color=1d2021 3 | font=Roboto 4 | 5 | # Effects 6 | screenshots 7 | effect-blur=7x5 8 | effect-vignette=0.5:0.5 9 | fade-in=0.2 10 | clock 11 | timestr=%H:%M 12 | datestr=%a, %e of %B 13 | 14 | # Indicator settings 15 | indicator-radius=120 16 | indicator-thickness=10 17 | indicator-caps-lock 18 | indicator-idle-visible 19 | 20 | # Colors 21 | inside-color=1d202188 22 | inside-clear-color=1d202188 23 | inside-ver-color=1d202188 24 | inside-wrong-color=1d202188 25 | 26 | ring-color=504945 27 | ring-clear-color=83a598 28 | ring-ver-color=458588 29 | ring-wrong-color=fb4934 30 | 31 | line-color=00000000 32 | line-clear-color=00000000 33 | line-ver-color=00000000 34 | line-wrong-color=00000000 35 | 36 | text-color=ebdbb2 37 | text-clear-color=ebdbb2 38 | text-ver-color=ebdbb2 39 | text-wrong-color=ebdbb2 40 | text-caps-lock-color=83a598 41 | 42 | key-hl-color=83a598 43 | bs-hl-color=fb4934 44 | caps-lock-key-hl-color=458588 45 | caps-lock-bs-hl-color=fb4934 46 | separator-color=32302f 47 | 48 | # Layout settings 49 | scaling=fill 50 | -------------------------------------------------------------------------------- /hypr/appearance/animation.conf: -------------------------------------------------------------------------------- 1 | animations { 2 | enabled = true 3 | 4 | bezier = easeOutQuint, 0.22, 1, 0.36, 1 5 | bezier = easeInOutCubic, 0.65, 0, 0.25, 1 6 | bezier = almostLinear,0.5,0.5,0.75,1.0 7 | bezier = quick,0.15,0,0.1,1 8 | bezier = linear,0,0,1,1 9 | bezier = bouncy, 0.05, 0.9, 0.1, 1.05 10 | 11 | animation = global, 1, 10, default 12 | animation = border, 1, 5.39, easeOutQuint 13 | animation = fadeIn, 1, 1.73, almostLinear 14 | animation = fadeOut, 1, 1.46, almostLinear 15 | animation = fade, 1, 3.03, quick 16 | animation = layers, 1, 3.81, easeOutQuint 17 | animation = layersIn, 1, 4, easeOutQuint, slide 18 | animation = layersOut, 1, 1.5, linear, slide 19 | animation = fadeLayersIn, 1, 1.79, almostLinear 20 | animation = fadeLayersOut, 1, 1.39, almostLinear 21 | animation = windows, 1, 4, bouncy, slide 22 | animation = windowsMove, 1, 4, easeOutQuint 23 | animation = workspaces, 1, 4, bouncy, slide 24 | # animation = workspaces, 1, 4, easeOutQuint, slide 25 | animation = specialWorkspace, 1, 2, easeInOutCubic, slidevert 26 | } 27 | -------------------------------------------------------------------------------- /pacseek/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "AurRpcUrl": "https://aurapi.moson.org/rpc", 3 | "AurTimeout": 5000, 4 | "AurSearchDelay": 500, 5 | "AurUseDifferentCommands": false, 6 | "AurInstallCommand": "", 7 | "AurUpgradeCommand": "", 8 | "DisableAur": false, 9 | "MaxResults": 500, 10 | "PacmanDbPath": "/var/lib/pacman/", 11 | "PacmanConfigPath": "/etc/pacman.conf", 12 | "InstallCommand": "yay -S", 13 | "UninstallCommand": "yay -Rsn", 14 | "SysUpgradeCommand": "yay", 15 | "SearchMode": "Contains", 16 | "SearchBy": "Name", 17 | "CacheExpiry": 10, 18 | "DisableCache": false, 19 | "ColorScheme": "Custom", 20 | "BorderStyle": "Single", 21 | "ShowPkgbuildCommand": "curl -s \"{url}\"|less", 22 | "ShowPkgbuildInternally": true, 23 | "ComputeRequiredBy": false, 24 | "GlyphStyle": "Angled-No-X", 25 | "DisableNewsFeed": true, 26 | "FeedURLs": "https://archlinux.org/feeds/news/", 27 | "FeedMaxItems": 5, 28 | "SaveWindowLayout": false, 29 | "LeftProportion": 4, 30 | "Transparent": true, 31 | "PackageColumnWidth": 0, 32 | "EnableAutoSuggest": false, 33 | "SepDepsWithNewLine": true 34 | } 35 | -------------------------------------------------------------------------------- /rofi/websearch/main.rasi: -------------------------------------------------------------------------------- 1 | configuration { 2 | show-icons: false; 3 | } 4 | 5 | /*****----- Global Properties -----*****/ 6 | @import "~/.config/rofi/shared/font.rasi" 7 | @import "~/.config/rofi/shared/gruvbox.rasi" 8 | 9 | /*****----- Window -----*****/ 10 | window { 11 | location: center; 12 | anchor: center; 13 | fullscreen: false; 14 | width: 25%; 15 | border: 2px; 16 | border-radius: 2px; 17 | padding: 10px; 18 | border-color: @border; 19 | background-color: @background; 20 | } 21 | 22 | /*****----- Main Box -----*****/ 23 | mainbox { 24 | spacing: 10px; 25 | padding: 10px; 26 | background-color: transparent; 27 | orientation: vertical; 28 | children: [ "inputbar" ]; 29 | } 30 | 31 | /*****----- Input Bar -----*****/ 32 | inputbar { 33 | spacing: 10px; 34 | background-color: @background-alt; 35 | border-radius: 2px; 36 | padding: 8px 12px; 37 | children: [ "entry" ]; 38 | } 39 | 40 | entry { 41 | background-color: inherit; 42 | text-color: @foreground; 43 | placeholder: "Search..."; 44 | placeholder-color: #A89984FF; 45 | } 46 | 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 r4ppz 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /nvim/lua/plugins/matchup.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "andymass/vim-matchup", 3 | event = { "BufReadPost", "BufWinEnter" }, 4 | config = function() 5 | vim.g.matchup_matchparen_offscreen = { method = "popup" } 6 | vim.g.matchup_matchparen_enabled = 1 7 | vim.g.matchup_motion_enabled = 1 8 | vim.g.matchup_text_obj_enabled = 1 9 | 10 | pcall(function() 11 | require("nvim-treesitter.configs").setup({ 12 | highlight = { enable = true }, 13 | matchup = { enable = true }, 14 | }) 15 | end) 16 | 17 | vim.api.nvim_set_hl(0, "MatchParen", { 18 | fg = "#83A598", 19 | bg = "#444444", 20 | }) 21 | 22 | vim.api.nvim_set_hl(0, "MatchParenCur", { 23 | fg = "#83A598", 24 | bg = "#444444", 25 | }) 26 | 27 | vim.api.nvim_set_hl(0, "MatchWord", { 28 | fg = "", 29 | bg = "#444444", 30 | }) 31 | 32 | vim.api.nvim_set_hl(0, "MatchWordCur", { 33 | fg = "", 34 | bg = "#444444", 35 | }) 36 | 37 | local map = require("utils.map") 38 | map({ "n", "x", "o", "v" }, "~", "(matchup-%)", { desc = "Jump to matching pair" }) 39 | end, 40 | } 41 | -------------------------------------------------------------------------------- /zsh/env_vars.zsh: -------------------------------------------------------------------------------- 1 | # init 2 | source /usr/share/fzf/key-bindings.zsh 3 | source /usr/share/fzf/completion.zsh 4 | 5 | # environment variables 6 | export EDITOR='nvim' 7 | export VISUAL='nvim' 8 | export GOPATH="$HOME/.go" 9 | export MANPAGER="nvim +Man!" 10 | export JAVA_HOME=/usr/lib/jvm/java-21-openjdk 11 | 12 | export KEYTIMEOUT=1 13 | export HISTFILE=~/.zsh_history 14 | export HISTSIZE=10000 15 | export SAVEHIST=10000 16 | 17 | # ZSH Autosuggestions optimizations 18 | export ZSH_AUTOSUGGEST_USE_ASYNC=1 19 | export ZSH_AUTOSUGGEST_STRATEGY=(history completion) 20 | 21 | # FZF-tab optimizations 22 | export FZF_DEFAULT_COMMAND="fd --type f --hidden --follow --exclude .git --exclude node_modules --exclude .cache" 23 | export FZF_ALT_C_COMMAND="fd --type d --hidden --exclude .git" 24 | export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" 25 | export PREVIEW_CMD="bat --style=numbers --color=always {} || cat {}" 26 | export FZF_CTRL_T_OPTS="--preview \"$PREVIEW_CMD\" --height 50%" 27 | export FZF_DEFAULT_OPTS="--height 50% --layout=reverse --border --margin=0 --padding=0" 28 | export FZF_CTRL_R_OPTS="--preview \"$PREVIEW_CMD\" --preview-window down:3:hidden:wrap" 29 | -------------------------------------------------------------------------------- /scripts/symlink-dotfiles.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | DOTFILES="$HOME/Arch-dotfiles" 5 | CONFIG_DIR="$HOME/.config" 6 | 7 | mkdir -p "$CONFIG_DIR" 8 | 9 | CONFIG_ITEMS=( 10 | btop 11 | hypr 12 | kitty 13 | lazygit 14 | nvim 15 | rofi 16 | swaylock 17 | swaync 18 | systemd 19 | waybar 20 | yazi 21 | uwsm 22 | fastfetch 23 | pacseek 24 | ) 25 | 26 | for item in "${CONFIG_ITEMS[@]}"; do 27 | src="$DOTFILES/$item" 28 | dest="$CONFIG_DIR/$item" 29 | 30 | if [[ -e "$src" ]]; then 31 | echo "Linking $src to $dest" 32 | ln -sfT "$src" "$dest" 33 | else 34 | echo "Skipping missing item: $src" >&2 35 | fi 36 | done 37 | 38 | [[ -e "$DOTFILES/.editorconfig" ]] && ln -sfT "$DOTFILES/.editorconfig" "$HOME/.editorconfig" 39 | [[ -e "$DOTFILES/tmux/.tmux.conf" ]] && ln -sfT "$DOTFILES/tmux/.tmux.conf" "$HOME/.tmux.conf" 40 | [[ -e "$DOTFILES/zsh/.zshrc" ]] && ln -sfT "$DOTFILES/zsh/.zshrc" "$HOME/.zshrc" 41 | [[ -e "$DOTFILES/zsh/.zsh_plugins.txt" ]] && ln -sfT "$DOTFILES/zsh/.zsh_plugins.txt" "$HOME/.zsh_plugins.txt" 42 | [[ -e "$DOTFILES/git/.gitconfig" ]] && ln -sfT "$DOTFILES/git/.gitconfig" "$HOME/.gitconfig" 43 | -------------------------------------------------------------------------------- /yazi/plugins/no-status.yazi/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 yazi-rs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /yazi/plugins/smart-enter.yazi/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 yazi-rs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /nvim/lua/plugins/conform.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "stevearc/conform.nvim", 3 | event = "BufReadPre", 4 | opts = { 5 | formatters = { 6 | prettier = { 7 | command = "prettier", 8 | prefer_local = "node_modules/.bin", 9 | args = { 10 | "--stdin-filepath", 11 | "$FILENAME", 12 | }, 13 | }, 14 | }, 15 | formatters_by_ft = { 16 | lua = { "stylua" }, 17 | css = { "prettier" }, 18 | html = { "prettier" }, 19 | javascript = { "prettier" }, 20 | javascriptreact = { "prettier" }, 21 | typescript = { "prettier" }, 22 | typescriptreact = { "prettier" }, 23 | json = { "prettier" }, 24 | markdown = { "prettier" }, 25 | yaml = { "prettier" }, 26 | sh = { "shfmt" }, 27 | python = { "black" }, 28 | rust = { "rustfmt" }, 29 | }, 30 | format_on_save = { 31 | timeout_ms = 1000, 32 | lsp_fallback = true, 33 | }, 34 | }, 35 | keys = { 36 | { 37 | "of", 38 | function() 39 | require("conform").format({ lsp_fallback = true }) 40 | end, 41 | desc = "Formal File", 42 | }, 43 | }, 44 | } 45 | -------------------------------------------------------------------------------- /nvim/lua/plugins/markdown.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | "iamcco/markdown-preview.nvim", 4 | cmd = { 5 | "MarkdownPreviewToggle", 6 | "MarkdownPreview", 7 | "MarkdownPreviewStop", 8 | }, 9 | ft = { "markdown" }, 10 | build = "cd app && yarn install", 11 | keys = { 12 | { 13 | "om", 14 | "MarkdownPreview", 15 | desc = "Markdown preview", 16 | }, 17 | }, 18 | }, 19 | 20 | { 21 | "MeanderingProgrammer/render-markdown.nvim", 22 | enabled = true, 23 | dependencies = { 24 | "nvim-treesitter/nvim-treesitter", 25 | "nvim-tree/nvim-web-devicons", 26 | }, 27 | opts = { 28 | heading = { 29 | atx = false, 30 | icons = { "# ", "## ", "### ", "#### ", "##### ", "###### " }, 31 | }, 32 | bullet = { 33 | icons = { "-", "-", "-", "-" }, 34 | }, 35 | code = { 36 | conceal_delimiters = true, 37 | }, 38 | anti_conceal = { 39 | enabled = false, 40 | }, 41 | sign = { 42 | enabled = false, 43 | }, 44 | }, 45 | ft = { "copilot-chat", "markdown" }, 46 | }, 47 | } 48 | -------------------------------------------------------------------------------- /scripts/screenshot-full.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | LOCKFILE="/tmp/screenshot.lock" 5 | SCREENSHOT_DIR="$HOME/Pictures/screenshot" 6 | TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)" 7 | FILENAME="$SCREENSHOT_DIR/screenshot_${TIMESTAMP}.png" 8 | 9 | exec 200>"$LOCKFILE" 10 | flock -n 200 || { 11 | notify-send -h boolean:transient:true \ 12 | "Screenshot Already Running" \ 13 | "Please wait for the current process to finish." \ 14 | -i dialog-warning 15 | exit 1 16 | } 17 | 18 | for cmd in grim; do 19 | if ! command -v "$cmd" &>/dev/null; then 20 | notify-send -h boolean:transient:true \ 21 | "Screenshot Failed" \ 22 | "Missing dependency: $cmd" \ 23 | -i dialog-error 24 | exit 1 25 | fi 26 | done 27 | 28 | mkdir -p "$SCREENSHOT_DIR" 29 | 30 | grim "$FILENAME" 31 | 32 | if [[ -s "$FILENAME" ]]; then 33 | notify-send -h boolean:transient:true \ 34 | "Screenshot Taken" \ 35 | "Full screen saved to: $FILENAME" \ 36 | -i camera 37 | exit 0 38 | else 39 | notify-send -h boolean:transient:true \ 40 | "Screenshot Failed" \ 41 | "Could not save the screenshot." \ 42 | -i dialog-error 43 | exit 1 44 | fi 45 | 46 | -------------------------------------------------------------------------------- /rofi/websearch/websearch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | declare -A sites=( 4 | [fb]="https://www.facebook.com/messages" 5 | [gh]="https://github.com/r4ppz" 6 | [yt]="https://www.youtube.com" 7 | [red]="https://www.reddit.com/" 8 | [pins]="https://www.pinterest.com" 9 | [mail]="https://mail.google.com/mail/u/0/#inbox" 10 | [movie]="https://movielair.cc/" 11 | [book]="https://annas-archive.org/" 12 | [music]="https://open.spotify.com/" 13 | [figma]="https://www.figma.com/" 14 | [olsis]="https://tsis.assumptiondavao.edu.ph/" 15 | [icon]="https://lucide.dev/icons/" 16 | [read]="https://medium.com/" 17 | [framer]="https://framer.com/projects/" 18 | [dev]="https://devdocs.io/" 19 | ) 20 | 21 | search_engine="https://duckduckgo.com/?q=" 22 | 23 | query=$(rofi -dmenu -theme "$HOME/.config/rofi/websearch/main.rasi") 24 | 25 | [ -z "$query" ] && exit 26 | 27 | url=${sites[$query]} 28 | 29 | if [ -n "$url" ]; then 30 | xdg-open "$url" 31 | elif [[ $query =~ ^https?:// ]]; then 32 | xdg-open "$query" 33 | else 34 | encoded_query=$(python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1]))" "$query") 35 | xdg-open "${search_engine}${encoded_query}" 36 | fi 37 | -------------------------------------------------------------------------------- /yazi/plugins/smart-enter.yazi/README.md: -------------------------------------------------------------------------------- 1 | # smart-enter.yazi 2 | 3 | [`Open`][open] files or [`enter`][enter] directories all in one key! 4 | 5 | ## Installation 6 | 7 | ```sh 8 | ya pkg add yazi-rs/plugins:smart-enter 9 | ``` 10 | 11 | ## Usage 12 | 13 | Bind your l key to the plugin, in your `~/.config/yazi/keymap.toml`: 14 | 15 | ```toml 16 | [[mgr.prepend_keymap]] 17 | on = "l" 18 | run = "plugin smart-enter" 19 | desc = "Enter the child directory, or open the file" 20 | ``` 21 | 22 | ## Advanced 23 | 24 | By default, `--hovered` is passed to the [`open`][open] command, make the behavior consistent with [`enter`][enter] avoiding accidental triggers, 25 | which means both will only target the currently hovered file. 26 | 27 | If you still want `open` to target multiple selected files, add this to your `~/.config/yazi/init.lua`: 28 | 29 | ```lua 30 | require("smart-enter"):setup { 31 | open_multi = true, 32 | } 33 | ``` 34 | 35 | ## License 36 | 37 | This plugin is MIT-licensed. For more information check the [LICENSE](LICENSE) file. 38 | 39 | [open]: https://yazi-rs.github.io/docs/configuration/keymap/#mgr.open 40 | [enter]: https://yazi-rs.github.io/docs/configuration/keymap/#mgr.enter 41 | -------------------------------------------------------------------------------- /scripts/toggle-hyprsunset.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | STATE_FILE="$HOME/.cache/hyprsunset_mode" 5 | 6 | if [[ ! -f "$STATE_FILE" ]]; then 7 | echo "day" >"$STATE_FILE" 8 | fi 9 | 10 | read -r MODE <"$STATE_FILE" 11 | 12 | case "$MODE" in 13 | day) 14 | hyprctl hyprsunset temperature 3800 15 | hyprctl hyprsunset gamma 90 16 | notify-send -t 1000 -h boolean:transient:true \ 17 | -a "Toggle HyprSunset" "NIGHT MODE" -i dialog-information 18 | echo "night" >"$STATE_FILE" 19 | ;; 20 | 21 | night) 22 | hyprctl hyprsunset temperature 4500 23 | hyprctl hyprsunset gamma 100 24 | notify-send -t 1000 -h boolean:transient:true \ 25 | -a "Toggle HyprSunset" "READING MODE" -i dialog-information 26 | echo "reading" >"$STATE_FILE" 27 | ;; 28 | 29 | reading) 30 | hyprctl hyprsunset temperature 5000 31 | hyprctl hyprsunset gamma 100 32 | notify-send -t 1000 -h boolean:transient:true \ 33 | -a "Toggle HyprSunset" "DAY MODE" -i dialog-information 34 | echo "day" >"$STATE_FILE" 35 | ;; 36 | 37 | *) 38 | echo "Unknown mode: '$MODE'. Resetting state to 'day'." 39 | hyprctl hyprsunset temperature 5000 40 | hyprctl hyprsunset gamma 100 41 | echo "day" >"$STATE_FILE" 42 | ;; 43 | esac 44 | -------------------------------------------------------------------------------- /scripts/phone-sync.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | SOURCE_BASE="/mnt/SHARED" 5 | FOLDERS=("School" "Books" "Music" "pass") 6 | 7 | PHONE_MOUNT="$HOME/Phone" 8 | REMOTE="phone:/storage/emulated/0" 9 | 10 | [ -d "$PHONE_MOUNT" ] || mkdir -p "$PHONE_MOUNT" 11 | 12 | printf "Mounting phone\n" 13 | if ! mountpoint -q "$PHONE_MOUNT"; then 14 | sshfs "$REMOTE" "$PHONE_MOUNT" 15 | else 16 | printf "Already mounted\n" 17 | fi 18 | 19 | sync_folder() { 20 | local folder="$1" 21 | local src="$SOURCE_BASE/$folder/" 22 | local dest="$PHONE_MOUNT/$folder/" 23 | 24 | printf "\n-------------------------------------\n" 25 | printf "Syncing $folder..." 26 | printf "\n-------------------------------------\n" 27 | 28 | rsync -av --delete --inplace --no-perms --no-owner --no-group --mkpath "$src" "$dest" || true 29 | } 30 | 31 | for folder in "${FOLDERS[@]}"; do 32 | sync_folder "$folder" 33 | done 34 | 35 | printf "\nUnmounting...\n" 36 | if fusermount -uz "$PHONE_MOUNT"; then 37 | printf "Unmount successful\n" 38 | printf "Cleaning up...\n" 39 | rmdir "$PHONE_MOUNT" || printf "Could not remove mount directory\n" 40 | else 41 | printf "Unmount failed\n" 42 | printf "idk why :(\n" 43 | fi 44 | 45 | printf "Done ;)\n" 46 | -------------------------------------------------------------------------------- /nvim/lua/plugins/illuminate.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "RRethy/vim-illuminate", 3 | event = { "BufReadPost", "BufNewFile" }, 4 | config = function() 5 | require("illuminate").configure({ 6 | providers = { 7 | "lsp", 8 | "treesitter", 9 | }, 10 | delay = 200, 11 | filetypes_denylist = { 12 | "dirvish", 13 | "fugitive", 14 | "alpha", 15 | "dashboard", 16 | "packer", 17 | "neogitstatus", 18 | "NvimTree", 19 | "terminal", 20 | "lazy", 21 | "mason", 22 | "notify", 23 | "toggleterm", 24 | "lazyterm", 25 | "copilot-chat", 26 | "help", 27 | "man", 28 | "DiffviewFiles", 29 | "DiffviewFileHistory", 30 | "markdown", 31 | "TelescopePrompt", 32 | "TelescopeResults", 33 | }, 34 | min_count_to_highlight = 2, 35 | under_cursor = true, 36 | }) 37 | 38 | local map = require("utils.map") 39 | map("n", "[r", function() 40 | require("illuminate").goto_prev_reference() 41 | end, { desc = "Prev reference" }) 42 | map("n", "]r", function() 43 | require("illuminate").goto_next_reference() 44 | end, { desc = "Next reference" }) 45 | end, 46 | } 47 | -------------------------------------------------------------------------------- /nvim/lua/configs/lazy.lua: -------------------------------------------------------------------------------- 1 | return { 2 | defaults = { lazy = true }, 3 | install = { colorscheme = { "nvchad" } }, 4 | 5 | ui = { 6 | border = "single", 7 | size = { 8 | width = 0.8, 9 | height = 0.8, 10 | }, 11 | icons = { 12 | ft = "", 13 | lazy = "󰂠 ", 14 | loaded = "", 15 | not_loaded = "", 16 | }, 17 | }, 18 | 19 | change_detection = { 20 | enabled = true, 21 | notify = false, 22 | }, 23 | 24 | performance = { 25 | rtp = { 26 | disabled_plugins = { 27 | "2html_plugin", 28 | "tohtml", 29 | "getscript", 30 | "getscriptPlugin", 31 | "gzip", 32 | "logipat", 33 | "netrw", 34 | "netrwPlugin", 35 | "netrwSettings", 36 | "netrwFileHandlers", 37 | "matchit", 38 | "tar", 39 | "tarPlugin", 40 | "rrhelper", 41 | "spellfile_plugin", 42 | "vimball", 43 | "vimballPlugin", 44 | "zip", 45 | "zipPlugin", 46 | "tutor", 47 | "rplugin", 48 | "syntax", 49 | "synmenu", 50 | "optwin", 51 | "compiler", 52 | "bugreport", 53 | "ftplugin", 54 | "matchparen", 55 | }, 56 | }, 57 | }, 58 | } 59 | -------------------------------------------------------------------------------- /zsh/setopt.zsh: -------------------------------------------------------------------------------- 1 | setopt append_history # Append history instead of overwriting 2 | setopt share_history # Share history across all sessions 3 | setopt hist_ignore_all_dups # Prevent any duplicate commands from being stored 4 | setopt hist_reduce_blanks # Strip extra whitespace 5 | setopt hist_verify # Allow you to edit history-recalled command before running 6 | setopt extended_history # Add timestamps to history 7 | setopt hist_expire_dups_first # Prioritize deleting duplicates when trimming 8 | setopt hist_find_no_dups # Prevent duplicates from showing in reverse-i-search (Ctrl+R) 9 | setopt hist_save_no_dups # Don't write duplicates to `.zsh_history` 10 | setopt hist_ignore_space # Don't save commands starting with a space 11 | setopt hist_fcntl_lock # Use fcntl to lock history files (better than zsh's default) 12 | setopt interactive_comments # Allow `#` to be used as comments even interactively 13 | setopt extended_glob # Enables powerful globbing (like `^`, `~`, `**/`, etc.) 14 | setopt notify # Immediately notify background job status 15 | setopt hist_no_store # Don't store 'history' command in history 16 | unsetopt inc_append_history # Don't write immediately, only on shell exit (better performance) 17 | -------------------------------------------------------------------------------- /zsh/.zshrc: -------------------------------------------------------------------------------- 1 | # symlinked to ~/.zshrc. 2 | 3 | if [[ $- == *i* ]]; then 4 | 5 | # Instant Prompt (Powerlevel10k) 6 | if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then 7 | source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" 8 | fi 9 | 10 | # Plugin Management (Antidote) 11 | autoload -Uz compinit 12 | compinit 13 | 14 | zsh_plugins=${ZDOTDIR:-~}/.zsh_plugins 15 | [[ -f ${zsh_plugins}.txt ]] || touch ${zsh_plugins}.txt 16 | fpath=($HOME/.antidote/functions $fpath) 17 | autoload -Uz antidote 18 | if [[ ! ${zsh_plugins}.zsh -nt ${zsh_plugins}.txt ]]; then 19 | antidote bundle <${zsh_plugins}.txt >|${zsh_plugins}.zsh 20 | fi 21 | source ${zsh_plugins}.zsh 22 | 23 | # Source Configuration Files 24 | local zsh_config_dir="$HOME/Arch-dotfiles/zsh/" 25 | 26 | if [[ -d "$zsh_config_dir" ]]; then 27 | source "$zsh_config_dir/path.zsh" 28 | source "$zsh_config_dir/setopt.zsh" 29 | source "$zsh_config_dir/env_vars.zsh" 30 | source "$zsh_config_dir/aliases.zsh" 31 | source "$zsh_config_dir/keybindings.zsh" 32 | source "$zsh_config_dir/functions.zsh" 33 | else 34 | echo "Warning: zsh config directory '$zsh_config_dir' not found." 35 | fi 36 | 37 | [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh 38 | 39 | fi 40 | -------------------------------------------------------------------------------- /scripts/open-file.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | SEARCH_DIR="${1:-$HOME}" 5 | EDITOR="${EDITOR:-nvim}" 6 | 7 | if command -v bat &>/dev/null; then 8 | PREVIEW_CMD="bat --style=numbers --color=always --line-range=:500 {}" 9 | else 10 | PREVIEW_CMD="cat {}" 11 | fi 12 | 13 | # Excluded file patterns 14 | EXCLUDED_EXTENSIONS=( 15 | '*.jpg' '*.jpeg' '*.png' '*.gif' '*.bmp' '*.tiff' '*.webp' '*.ico' 16 | '*.pdf' '*.epub' '*.doc' '*.docx' '*.xls' '*.xlsx' '*.ppt' '*.pptx' 17 | '*.mp3' '*.wav' '*.flac' '*.ogg' '*.m4a' '*.wma' '*.aac' 18 | '*.mp4' '*.mkv' '*.webm' '*.avi' '*.mov' '*.flv' '*.wmv' 19 | '*.zip' '*.tar' '*.gz' '*.bz2' '*.xz' '*.7z' '*.rar' '*.iso' 20 | '*.ttf' '*.otf' '*.woff' '*.woff2' 21 | '*.exe' '*.dll' '*.so' '*.bin' '*.class' '*.o' '*.a' 22 | ) 23 | 24 | # Build fd exclude args 25 | EXCLUDES=() 26 | for pattern in "${EXCLUDED_EXTENSIONS[@]}"; do 27 | EXCLUDES+=(--exclude "$pattern") 28 | done 29 | 30 | # Run inside a tmux popup 31 | fd --type f --hidden --follow --exclude .git "${EXCLUDES[@]}" . "$SEARCH_DIR" 2>/dev/null | 32 | fzf-tmux -p 80%,70% --reverse \ 33 | --ansi \ 34 | --prompt='Search: ' \ 35 | --marker='▶' \ 36 | --preview "$PREVIEW_CMD" \ 37 | --preview-window="right:50%" \ 38 | --height=100% \ 39 | --border | 40 | xargs -r -- "$EDITOR" 41 | -------------------------------------------------------------------------------- /nvim/lua/chadrc.lua: -------------------------------------------------------------------------------- 1 | -- This file needs to have same structure as nvconfig.lua 2 | -- https://github.com/NvChad/ui/blob/v3.0/lua/nvconfig.lua 3 | -- Please read that file to know all available options :( 4 | 5 | ---@type ChadrcConfig 6 | local M = {} 7 | 8 | M.base46 = { 9 | theme = "gruvbox", 10 | theme_toggle = { "gruvbox", "gruvchad" }, 11 | transparency = true, 12 | 13 | hl_override = { 14 | Comment = { italic = true }, 15 | ["@comment"] = { italic = true }, 16 | FloatBorder = { fg = "grey_fg" }, 17 | }, 18 | 19 | integrations = { 20 | "lspsaga", 21 | "render-markdown", 22 | }, 23 | } 24 | 25 | M.ui = { 26 | cmp = { 27 | icons = true, 28 | style = "default", 29 | abbr_maxwidth = 300, 30 | }, 31 | 32 | telescope = { 33 | style = "bordered", 34 | }, 35 | 36 | tabufline = { 37 | lazyload = false, 38 | }, 39 | 40 | statusline = { 41 | separator_style = "block", 42 | theme = "default", 43 | }, 44 | } 45 | 46 | M.term = { 47 | float = { 48 | relative = "editor", 49 | row = 0.13, 50 | col = 0.15, 51 | width = 0.7, 52 | height = 0.6, 53 | border = "single", 54 | }, 55 | } 56 | 57 | M.lsp = { 58 | signature = false, 59 | } 60 | 61 | M.colorify = { 62 | enabled = false, 63 | mode = "virtual", 64 | virt_text = "󱓻 ", 65 | highlight = { hex = true, lspvars = true }, 66 | } 67 | 68 | return M 69 | -------------------------------------------------------------------------------- /nvim/lua/plugins/dashboard.lua: -------------------------------------------------------------------------------- 1 | local R = { 2 | "██████╗ ", 3 | "██╔══██╗", 4 | "██████╔╝", 5 | "██╔══██╗", 6 | "██║ ██║", 7 | "╚═╝ ╚═╝", 8 | } 9 | 10 | local F4 = { 11 | "██╗ ██╗", 12 | "██║ ██║", 13 | "███████║", 14 | "╚════██║", 15 | " ██║", 16 | " ╚═╝", 17 | } 18 | 19 | local P = { 20 | "██████╗ ", 21 | "██╔══██╗", 22 | "██████╔╝", 23 | "██╔═══╝ ", 24 | "██║ ", 25 | "╚═╝ ", 26 | } 27 | 28 | local Z = { 29 | "███████╗", 30 | "╚══███╔╝", 31 | " ███╔╝ ", 32 | " ███╔╝ ", 33 | "███████╗", 34 | "╚══════╝", 35 | } 36 | 37 | local spacer = " " 38 | local logo_lines = {} 39 | for i = 1, 6 do 40 | logo_lines[i] = R[i] .. spacer .. F4[i] .. spacer .. P[i] .. spacer .. P[i] .. spacer .. Z[i] 41 | end 42 | 43 | return { 44 | "nvimdev/dashboard-nvim", 45 | lazy = false, 46 | dependencies = { "nvim-tree/nvim-web-devicons" }, 47 | config = function() 48 | require("dashboard").setup({ 49 | theme = "hyper", 50 | hide = { 51 | tabline = true, 52 | statusline = true, 53 | winbar = true, 54 | }, 55 | config = { 56 | header = logo_lines, 57 | week_header = { enable = false }, 58 | packages = { enable = true }, 59 | project = { enable = false }, 60 | mru = { enable = false }, 61 | shortcut = {}, 62 | footer = {}, 63 | }, 64 | }) 65 | end, 66 | } 67 | -------------------------------------------------------------------------------- /git/.gitconfig: -------------------------------------------------------------------------------- 1 | [user] 2 | name = r4ppz 3 | email = johnreyrabosa.f@gmail.com 4 | signingKey = ~/.ssh/id_ed25519.pub 5 | 6 | [gpg] 7 | format = ssh 8 | 9 | [tag] 10 | gpgSign = true 11 | 12 | [push] 13 | autoSetupRemote = true 14 | 15 | [pull] 16 | rebase = true 17 | 18 | [commit] 19 | verbose = true 20 | gpgsign = true 21 | 22 | [init] 23 | defaultBranch = main 24 | 25 | [core] 26 | editor = nvim 27 | pager = delta 28 | autocrlf = input 29 | whitespace = fix,-indent-with-non-tab,trailing-space,cr-at-eol 30 | 31 | [branch] 32 | autosetuprebase = always 33 | 34 | [diff] 35 | tool = nvimdiff 36 | 37 | [difftool "nvimdiff"] 38 | cmd = "nvim -d \"$LOCAL\" \"$REMOTE\"" 39 | 40 | [merge] 41 | tool = nvimdiff 42 | 43 | [mergetool "nvimdiff"] 44 | cmd = "nvim -d \"$LOCAL\" \"$REMOTE\" \"$MERGED\" -c 'wincmd J'" 45 | 46 | [merge] 47 | conflictStyle = zdiff3 48 | 49 | [interactive] 50 | diffFilter = delta --color-only 51 | 52 | [delta] 53 | navigate = true 54 | line-numbers = true 55 | side-by-side = false 56 | hyperlinks = true 57 | 58 | [alias] 59 | s = status -sb 60 | st = status 61 | c = commit 62 | cm = commit -m 63 | d = diff 64 | dc = diff --cached 65 | l = log --oneline --graph --decorate 66 | la = log --oneline --graph --decorate --all 67 | save = stash push 68 | pop = stash pop 69 | undo = reset --soft HEAD~1 70 | amend = commit --amend 71 | 72 | -------------------------------------------------------------------------------- /nvim/lua/plugins/nvimtree.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "nvim-tree/nvim-tree.lua", 3 | cmd = { "NvimTreeToggle", "NvimTreeFocus" }, 4 | opts = function() 5 | return { 6 | filters = { 7 | dotfiles = false, 8 | git_ignored = false, 9 | custom = {}, 10 | }, 11 | disable_netrw = true, 12 | hijack_cursor = true, 13 | sync_root_with_cwd = true, 14 | update_focused_file = { 15 | enable = true, 16 | update_root = false, 17 | }, 18 | view = { 19 | width = 30, 20 | }, 21 | 22 | actions = { 23 | open_file = { 24 | quit_on_open = true, 25 | }, 26 | }, 27 | 28 | git = { 29 | enable = true, 30 | }, 31 | 32 | renderer = { 33 | root_folder_label = false, 34 | highlight_git = "icon", 35 | indent_markers = { enable = true }, 36 | icons = { 37 | glyphs = { 38 | default = "󰈚", 39 | folder = { 40 | default = "", 41 | empty = "", 42 | empty_open = "", 43 | open = "", 44 | symlink = "", 45 | }, 46 | }, 47 | }, 48 | }, 49 | } 50 | end, 51 | 52 | keys = { 53 | { "", "NvimTreeToggle", desc = "Toggle NvimTree " }, 54 | { "e", "NvimTreeFocus", desc = "Focus Nvimtree" }, 55 | }, 56 | } 57 | -------------------------------------------------------------------------------- /nvim/lua/plugins/todo.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "folke/todo-comments.nvim", 3 | dependencies = { "nvim-lua/plenary.nvim" }, 4 | event = "BufReadPost", 5 | opts = function() 6 | return { 7 | signs = true, 8 | keywords = { 9 | FIX = { icon = " ", color = "error" }, 10 | TODO = { icon = " ", color = "default" }, 11 | HACK = { icon = " ", color = "warning" }, 12 | WARN = { icon = " ", color = "warning" }, 13 | PERF = { icon = " ", color = "hint" }, 14 | NOTE = { icon = " ", color = "info" }, 15 | TEST = { icon = " ", color = "test" }, 16 | }, 17 | gui_style = { 18 | fg = "NONE", 19 | bg = "NONE", 20 | gui = "bold", 21 | }, 22 | highlight = { 23 | multiline = false, 24 | }, 25 | merge_keywords = true, 26 | colors = { 27 | error = { "#FB4934" }, 28 | warning = { "#FE8019" }, 29 | info = { "#83A598" }, 30 | hint = { "#8EC07C" }, 31 | default = { "#B8BB26" }, 32 | test = { "#B16286" }, 33 | }, 34 | } 35 | end, 36 | 37 | keys = { 38 | { 39 | "]t", 40 | function() 41 | require("todo-comments").jump_next() 42 | end, 43 | desc = "Next todo comment", 44 | }, 45 | { 46 | "[t", 47 | function() 48 | require("todo-comments").jump_prev() 49 | end, 50 | desc = "Previous todo comment", 51 | }, 52 | }, 53 | } 54 | -------------------------------------------------------------------------------- /scripts/toggle-zen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | STATE="$HOME/.cache/hypr-zen-mode" 5 | 6 | MONITOR="eDP-1" 7 | 8 | NORMAL_GAPS_OUTER=15 9 | NORMAL_GAPS_INNER=8 10 | NORMAL_BORDER_SIZE=2 11 | NORMAL_ROUNDING=1 12 | NORMAL_ROUNDING_POWER=5 13 | NORMAL_WALLPAPER="$HOME/Arch-dotfiles/wallpaper/wallpaper1.png" 14 | 15 | ZEN_GAPS_OUTER=0 16 | ZEN_GAPS_INNER=1 17 | ZEN_BORDER_SIZE=0 18 | ZEN_ROUNDING=0 19 | ZEN_ROUNDING_POWER=0 20 | ZEN_WALLPAPER="$HOME/Arch-dotfiles/wallpaper/plain-wallpaper.png" 21 | 22 | set_hyprland() { 23 | hyprctl --batch "keyword general:gaps_out $1; \ 24 | keyword general:gaps_in $2; \ 25 | keyword general:border_size $3; \ 26 | keyword decoration:rounding $4; \ 27 | keyword decoration:rounding_power $5" 28 | } 29 | 30 | set_wallpaper() { 31 | local WALLPAPER="$1" 32 | hyprctl hyprpaper preload "$WALLPAPER" 33 | hyprctl hyprpaper wallpaper "$MONITOR,$WALLPAPER" 34 | } 35 | 36 | if [[ -f "$STATE" ]]; then 37 | set_hyprland "$NORMAL_GAPS_OUTER" "$NORMAL_GAPS_INNER" "$NORMAL_BORDER_SIZE" "$NORMAL_ROUNDING" "$NORMAL_ROUNDING_POWER" 38 | set_wallpaper "$NORMAL_WALLPAPER" 39 | systemctl --user start waybar.service 40 | rm -f "$STATE" 41 | else 42 | set_hyprland "$ZEN_GAPS_OUTER" "$ZEN_GAPS_INNER" "$ZEN_BORDER_SIZE" "$ZEN_ROUNDING" "$ZEN_ROUNDING_POWER" 43 | set_wallpaper "$ZEN_WALLPAPER" 44 | systemctl --user stop waybar.service 45 | touch "$STATE" 46 | fi 47 | -------------------------------------------------------------------------------- /kitty/themes/gruvbox_dark.conf: -------------------------------------------------------------------------------- 1 | # Based on https://github.com/morhetz/gruvbox by morhetz 2 | # Adapted to kitty by wdomitrz 3 | 4 | cursor #928374 5 | cursor_text_color background 6 | 7 | url_color #83a598 8 | 9 | visual_bell_color #8ec07c 10 | bell_border_color #8ec07c 11 | 12 | active_border_color #83a598 13 | inactive_border_color #83a598 14 | 15 | foreground #ebdbb2 16 | background #282828 17 | selection_foreground #928374 18 | selection_background #ebdbb2 19 | 20 | active_tab_foreground #fbf1c7 21 | active_tab_background #665c54 22 | inactive_tab_foreground #a89984 23 | inactive_tab_background #3c3836 24 | 25 | # black (bg3/bg4) 26 | color0 #665c54 27 | color8 #7c6f64 28 | 29 | # red 30 | color1 #cc241d 31 | color9 #fb4934 32 | 33 | #: green 34 | color2 #98971a 35 | color10 #b8bb26 36 | 37 | # yellow 38 | color3 #d79921 39 | color11 #fabd2f 40 | 41 | # blue 42 | color4 #458588 43 | color12 #83a598 44 | 45 | # purple 46 | color5 #b16286 47 | color13 #d3869b 48 | 49 | # aqua 50 | color6 #689d6a 51 | color14 #8ec07c 52 | 53 | # white (fg4/fg3) 54 | color7 #a89984 55 | color15 #bdae93 56 | -------------------------------------------------------------------------------- /nvim/lua/plugins/treesitter.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "nvim-treesitter/nvim-treesitter", 3 | branch = "main", 4 | lazy = false, 5 | config = function() 6 | require("nvim-treesitter").setup() 7 | local ensure_installed = { 8 | "luadoc", 9 | "printf", 10 | "vim", 11 | "vimdoc", 12 | "markdown", 13 | "markdown_inline", 14 | "query", 15 | 16 | "sql", 17 | "lua", 18 | "bash", 19 | "java", 20 | "rust", 21 | "python", 22 | "c", 23 | "cpp", 24 | "hyprlang", 25 | 26 | "yaml", 27 | "toml", 28 | "xml", 29 | "json", 30 | 31 | "html", 32 | "css", 33 | "javascript", 34 | "typescript", 35 | "typescriptreact", 36 | "javascriptreact", 37 | "tsx", 38 | 39 | "diff", 40 | "git_config", 41 | "gitcommit", 42 | "git_rebase", 43 | "gitignore", 44 | "gitattributes", 45 | } 46 | 47 | require("nvim-treesitter").install(ensure_installed) 48 | 49 | vim.api.nvim_create_autocmd("FileType", { 50 | group = vim.api.nvim_create_augroup("TreesitterEnable", { clear = true }), 51 | pattern = ensure_installed, 52 | callback = function() 53 | local bufnr = 0 54 | pcall(vim.treesitter.start, bufnr) 55 | if vim.bo[bufnr].indentkeys == "" then 56 | vim.bo[bufnr].indentexpr = 'v:lua.require"nvim-treesitter".indentexpr()' 57 | end 58 | end, 59 | }) 60 | end, 61 | } 62 | -------------------------------------------------------------------------------- /scripts/screenshot.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | LOCKFILE="/tmp/screenshot.lock" 5 | SCREENSHOT_DIR="$HOME/Pictures/screenshot" 6 | TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)" 7 | FILENAME="$SCREENSHOT_DIR/screenshot_${TIMESTAMP}.png" 8 | 9 | exec 200>"$LOCKFILE" 10 | flock -n 200 || { 11 | notify-send -h boolean:transient:true \ 12 | "Screenshot Already Running" \ 13 | "Please wait for the current process to finish." \ 14 | -i dialog-warning 15 | exit 1 16 | } 17 | 18 | for cmd in grim slurp; do 19 | if ! command -v "$cmd" &>/dev/null; then 20 | notify-send -h boolean:transient:true \ 21 | "Screenshot Failed" \ 22 | "Missing dependency: $cmd" \ 23 | -i dialog-error 24 | exit 1 25 | fi 26 | done 27 | 28 | mkdir -p "$SCREENSHOT_DIR" 29 | 30 | # Prompt user for region 31 | REGION="$(slurp)" 32 | if [[ -z "$REGION" ]]; then 33 | notify-send -h boolean:transient:true \ 34 | "Screenshot Canceled" \ 35 | "No region selected." \ 36 | -i dialog-warning 37 | exit 1 38 | fi 39 | 40 | # Ensure slurp overlay clears before grim captures 41 | sleep 0.2 42 | 43 | grim -g "$REGION" "$FILENAME" 44 | 45 | if [[ -s "$FILENAME" ]]; then 46 | notify-send -h boolean:transient:true \ 47 | "Screenshot Taken" \ 48 | "Saved to: $FILENAME\nRegion: $REGION" \ 49 | -i camera 50 | exit 0 51 | else 52 | notify-send -h boolean:transient:true \ 53 | "Screenshot Failed" \ 54 | "Could not save the screenshot." \ 55 | -i dialog-error 56 | exit 1 57 | fi 58 | -------------------------------------------------------------------------------- /zsh/aliases.zsh: -------------------------------------------------------------------------------- 1 | # Built-in improvements 2 | alias ls='eza --icons --group-directories-first --color=auto' 3 | alias la='eza -a --icons --group-directories-first --color=auto' 4 | alias ll='eza -lh --icons --group-directories-first --color=auto' 5 | alias tree='eza -T --icons --group-directories-first --color=auto' 6 | alias less='less -SRXF' 7 | alias mv='mv -v' 8 | alias cp='cp -v' 9 | alias mkdir='mkdir -pv' 10 | alias ..='cd ..' 11 | alias open='xdg-open' 12 | alias rot13="tr 'A-Za-z' 'N-ZA-Mn-za-m'" 13 | 14 | alias r='ranger --choosedir="$HOME/.rangerdir"; LASTDIR=$(cat "$HOME/.rangerdir"); cd "$LASTDIR"' 15 | alias v='nvim' 16 | alias lg='lazygit' 17 | alias ld='lazydocker' 18 | alias top='btop' 19 | alias news='clx -n' 20 | # alias ssh='TERM=xterm-256color ssh' 21 | alias smb-start='sudo systemctl start smb.service nmb.service' 22 | alias smb-stop='sudo systemctl stop smb.service nmb.service' 23 | alias restore="gtrash r" 24 | alias q="qwen -p" 25 | alias bm="bashmount" 26 | alias rcopy='rsync -avh --info=progress2 --partial --inplace' 27 | alias rmirror='rsync -avh --delete --info=progress2 --partial --inplace' 28 | 29 | # script 30 | alias of='~/Arch-dotfiles/scripts/open-file.sh' 31 | alias ti='~/Arch-dotfiles/scripts/tmux-init.sh' 32 | alias sm='~/Arch-dotfiles/scripts/tmux-session-manager.py' 33 | # alias sm='. ~/Arch-dotfiles/zsh/session-manager.zsh' 34 | alias dev='~/Arch-dotfiles/scripts/dev.sh' 35 | 36 | # AI 37 | alias ex='gh copilot explain' 38 | alias sug='gh copilot suggest' 39 | alias gemma='tgpt --provider ollama --model gemma3' 40 | alias poll='tgpt --provider pollinations' 41 | -------------------------------------------------------------------------------- /nvim/lua/plugins/indentline.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "lukas-reineke/indent-blankline.nvim", 3 | event = "BufRead", 4 | opts = { 5 | enabled = true, 6 | debounce = 200, 7 | 8 | indent = { 9 | char = "│", 10 | tab_char = "│", 11 | highlight = "IblChar", 12 | smart_indent_cap = true, 13 | priority = 1, 14 | repeat_linebreak = true, 15 | }, 16 | 17 | scope = { 18 | enabled = true, 19 | char = "│", 20 | show_start = false, 21 | show_end = false, 22 | show_exact_scope = false, 23 | injected_languages = false, 24 | highlight = "IblScopeChar", 25 | priority = 1024, 26 | }, 27 | 28 | whitespace = { 29 | highlight = "IblWhitespace", 30 | remove_blankline_trail = true, 31 | }, 32 | 33 | exclude = { 34 | filetypes = { 35 | "help", 36 | "terminal", 37 | "lspinfo", 38 | "packer", 39 | "checkhealth", 40 | "man", 41 | "gitcommit", 42 | "TelescopePrompt", 43 | "TelescopeResults", 44 | "NvimTree", 45 | "", 46 | "copilot-chat", 47 | }, 48 | buftypes = { 49 | "terminal", 50 | "nofile", 51 | "quickfix", 52 | "prompt", 53 | }, 54 | }, 55 | }, 56 | 57 | config = function(_, opts) 58 | local hooks = require("ibl.hooks") 59 | hooks.register(hooks.type.WHITESPACE, hooks.builtin.hide_first_space_indent_level) 60 | hooks.register(hooks.type.WHITESPACE, hooks.builtin.hide_first_tab_indent_level) 61 | require("ibl").setup(opts) 62 | end, 63 | } 64 | -------------------------------------------------------------------------------- /nvim/lua/plugins/main.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "nvim-lua/plenary.nvim", 3 | 4 | { 5 | "nvchad/base46", 6 | build = function() 7 | require("base46").load_all_highlights() 8 | end, 9 | }, 10 | 11 | { 12 | "nvchad/ui", 13 | lazy = false, 14 | config = function() 15 | require("nvchad") 16 | end, 17 | }, 18 | 19 | { "nvzone/volt", lazy = true }, 20 | 21 | { 22 | "nvzone/menu", 23 | dependencies = { "nvzone/volt" }, 24 | keys = { 25 | -- Keyboard-driven default menu 26 | -- { 27 | -- "", 28 | -- function() 29 | -- require("menu").open "default" 30 | -- end, 31 | -- mode = "n", 32 | -- desc = "Open menu (default)", 33 | -- }, 34 | 35 | -- Right-click context menu (normal/visual) 36 | { 37 | "", 38 | function() 39 | require("menu.utils").delete_old_menus() 40 | vim.cmd.normal({ args = { "" }, bang = true }) 41 | local winid = vim.fn.getmousepos().winid 42 | if winid == 0 then 43 | winid = vim.api.nvim_get_current_win() 44 | end 45 | local buf = vim.api.nvim_win_get_buf(winid) 46 | local ft = vim.bo[buf].ft 47 | local options = (ft == "NvimTree") and "nvimtree" or "default" 48 | require("menu").open(options, { mouse = true }) 49 | end, 50 | mode = { "n", "v" }, 51 | desc = "Context menu (auto: default or NvimTree)", 52 | }, 53 | }, 54 | }, 55 | 56 | { 57 | "nvzone/minty", 58 | cmd = { "Shades", "Huefy" }, 59 | }, 60 | } 61 | -------------------------------------------------------------------------------- /nvim/lua/plugins/whichkey.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "folke/which-key.nvim", 3 | event = "VeryLazy", 4 | cmd = "WhichKey", 5 | opts = function() 6 | local wk = require("which-key") 7 | wk.add({ 8 | { "l", group = "LSP", icon = "󰒋" }, 9 | { "g", group = "Git", icon = "󰊢" }, 10 | { "c", group = "Copilot", icon = "" }, 11 | { "f", group = "Picker", icon = "󰭎" }, 12 | { "v", group = "NvChad", icon = "" }, 13 | { "o", group = "Others", icon = "󰏖" }, 14 | { "t", group = "Tabs", icon = "" }, 15 | { "F", group = "Grep", icon = "󰘳" }, 16 | { "s", group = "Surround", icon = "" }, 17 | { "d", group = "Diff", icon = "" }, 18 | { "b", group = "Buffer", icon = "" }, 19 | { "u", group = "UI", icon = "󰍹" }, 20 | 21 | { "", desc = "Toggle NvimTree", icon = "󰙅" }, 22 | { "e", desc = "Focus NvimTree", icon = "󰉋" }, 23 | }) 24 | 25 | return { 26 | icons = { 27 | group = "", 28 | }, 29 | win = { 30 | border = "rounded", 31 | padding = { 1, 2 }, 32 | title = false, 33 | title_pos = "center", 34 | }, 35 | layout = { 36 | width = { min = 25, max = 50 }, 37 | spacing = 4, 38 | align = "center", 39 | }, 40 | sort = { "local", "group", "alphanum" }, 41 | show_help = false, 42 | show_keys = false, 43 | } 44 | end, 45 | 46 | keys = { 47 | { "ow", "WhichKey", desc = "whichkey all keymaps" }, 48 | }, 49 | } 50 | -------------------------------------------------------------------------------- /nvim/lua/configs/autocmds.lua: -------------------------------------------------------------------------------- 1 | local autocmd = vim.api.nvim_create_autocmd 2 | 3 | autocmd("FileType", { 4 | pattern = { "copilot-chat", "NvimTree" }, 5 | command = "setlocal winfixwidth", 6 | }) 7 | 8 | -- Indentation 9 | local four_space_langs = { "python", "java", "rust" } 10 | autocmd("FileType", { 11 | callback = function() 12 | local ft = vim.bo.filetype 13 | if vim.tbl_contains(four_space_langs, ft) then 14 | vim.bo.tabstop = 4 15 | vim.bo.shiftwidth = 4 16 | vim.bo.softtabstop = 4 17 | else 18 | vim.bo.tabstop = 2 19 | vim.bo.shiftwidth = 2 20 | vim.bo.softtabstop = 2 21 | end 22 | vim.bo.expandtab = true 23 | end, 24 | }) 25 | 26 | -- vertical help split 27 | autocmd("BufWinEnter", { 28 | pattern = "*.txt", 29 | callback = function() 30 | if vim.bo.buftype == "help" then 31 | vim.cmd.wincmd("L") 32 | end 33 | end, 34 | }) 35 | 36 | -- copilot chat 37 | autocmd("BufEnter", { 38 | pattern = "copilot-*", 39 | callback = function() 40 | vim.opt_local.relativenumber = false 41 | vim.opt_local.number = false 42 | vim.opt_local.conceallevel = 0 43 | vim.bo.filetype = "markdown" 44 | end, 45 | }) 46 | 47 | -- Wraping 48 | autocmd("FileType", { 49 | pattern = { "text" }, 50 | callback = function() 51 | vim.opt_local.wrap = true 52 | vim.opt_local.linebreak = true 53 | vim.opt_local.breakindent = true 54 | end, 55 | }) 56 | 57 | -- Hightlight yanking 58 | autocmd("TextYankPost", { 59 | desc = "Highlight when yanking (copying) text", 60 | group = vim.api.nvim_create_augroup("kickstart-highlight-yank", { clear = true }), 61 | callback = function() 62 | vim.hl.on_yank() 63 | end, 64 | }) 65 | -------------------------------------------------------------------------------- /rofi/powermenu/powermenu.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Directories & Theme 4 | dir="$HOME/.config/rofi/powermenu" 5 | theme='main' 6 | 7 | # Get system info 8 | uptime="$(uptime -p | sed -e 's/up //g')" 9 | host="$(cat /proc/sys/kernel/hostname)" 10 | 11 | # Icons (Nerd Fonts) 12 | shutdown='󰐥' 13 | reboot='󰜉' 14 | lock='' 15 | suspend='󰤄' 16 | hibernate='󰒲' 17 | yes='' 18 | no='' 19 | 20 | # Rofi Command 21 | rofi_cmd() { 22 | rofi -dmenu \ 23 | -p "Uptime: $uptime" \ 24 | -mesg "Uptime: $uptime" \ 25 | -theme "${dir}/${theme}.rasi" 26 | } 27 | 28 | # Confirmation Dialog 29 | confirm_cmd() { 30 | rofi -dmenu \ 31 | -p 'Confirmation' \ 32 | -mesg 'Are you sure?' \ 33 | -theme "${dir}/confirm.rasi" 34 | } 35 | 36 | # Ask for Confirmation 37 | confirm_exit() { 38 | echo -e "$yes\n$no" | confirm_cmd 39 | } 40 | 41 | # Show Rofi Menu 42 | run_rofi() { 43 | echo -e "$lock\n$suspend\n$hibernate\n$reboot\n$shutdown" | rofi_cmd 44 | } 45 | 46 | # Execute Commands 47 | run_cmd() { 48 | selected="$(confirm_exit)" 49 | if [[ "$selected" == "$yes" ]]; then 50 | case "$1" in 51 | '--shutdown') systemctl poweroff ;; 52 | '--reboot') systemctl reboot ;; 53 | '--suspend') 54 | mpc -q pause 55 | amixer set Master mute 56 | systemctl suspend 57 | ;; 58 | '--hibernate') 59 | mpc -q pause 60 | amixer set Master mute 61 | systemctl hibernate 62 | ;; 63 | esac 64 | else 65 | exit 0 66 | fi 67 | } 68 | 69 | # Handle User Selection 70 | chosen="$(run_rofi)" 71 | case "$chosen" in 72 | "$shutdown") run_cmd --shutdown ;; 73 | "$reboot") run_cmd --reboot ;; 74 | "$lock") sleep 0.5 && swaylock ;; 75 | "$suspend") run_cmd --suspend ;; 76 | "$hibernate") run_cmd --hibernate ;; 77 | esac 78 | -------------------------------------------------------------------------------- /hypr/appearance/windowrule.conf: -------------------------------------------------------------------------------- 1 | # Fixes 2 | windowrulev2 = suppressevent maximize,class:.* 3 | windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 4 | 5 | # Common Dialog Windows 6 | windowrulev2 = float, title:(Open File|Open Files|Save File|Open Folder|Choose Files|Choose Folder|Create Folder|Select Folder) 7 | windowrulev2 = center, title:(Open File|Open Files|Save File|Open Folder|Choose Files|Choose Folder|Create Folder|Select Folder) 8 | windowrulev2 = size 700 500, title:(Open File|Open Files|Save File|Open Folder|Choose Files|Choose Folder|Create Folder|Select Folder) 9 | 10 | # Other dialogs 11 | windowrulev2 = float, title:^(Rename|Move|File Operation Progress).*$ 12 | windowrulev2 = center, title:^(Rename|Move|File Operation Progress).*$ 13 | windowrulev2 = size 350 100, title:^(Rename|Move|File Operation Progress).*$ 14 | 15 | # Generic dialog windows 16 | windowrulev2 = float, class:^(.*)[Dd]ialog(.*)$ 17 | windowrulev2 = center, class:^(.*)[Dd]ialog(.*)$ 18 | 19 | # XDG Desktop Portals 20 | windowrulev2 = float, class:^(xdg-desktop-portal).*$ 21 | windowrulev2 = float, class:^(org.freedesktop.portal).*$ 22 | windowrulev2 = center, class:^(xdg-desktop-portal).*$ 23 | windowrulev2 = center, class:^(org.freedesktop.portal).*$ 24 | windowrulev2 = size 700 500, class:^(xdg-desktop-portal).*$ 25 | windowrulev2 = size 700 500, class:^(org.freedesktop.portal).*$ 26 | 27 | # Workspace-Rules 28 | windowrulev2 = workspace 1,title:.* - Brave$ 29 | windowrulev2 = workspace 3,initialTitle:^(Visual Studio Code)$ 30 | windowrulev2 = workspace 12,class:^(ONLYOFFICE)$ 31 | windowrulev2 = fullscreenstate -1 2, class:^(Code)$ 32 | 33 | # KeePassXC 34 | windowrulev2 = float, title:^(Generate Password).*$ 35 | windowrulev2 = center, title:^(Generate Password).*$ 36 | 37 | -------------------------------------------------------------------------------- /hypr/appearance/lookNfeel.conf: -------------------------------------------------------------------------------- 1 | general { 2 | gaps_in = 8 3 | gaps_out = 15 4 | 5 | border_size = 2 6 | no_border_on_floating = false 7 | 8 | col.active_border = rgb(83A598) 9 | col.inactive_border = rgb(504945) 10 | 11 | resize_on_border = false 12 | 13 | allow_tearing = true 14 | layout = master 15 | 16 | snap { 17 | enabled = true 18 | border_overlap = true 19 | monitor_gap = 5 20 | window_gap = 5 21 | } 22 | } 23 | 24 | decoration { 25 | rounding = 1 26 | rounding_power = 5 27 | 28 | active_opacity = 1 29 | inactive_opacity = 1 30 | fullscreen_opacity = 1.0 31 | 32 | dim_inactive = true 33 | dim_strength = 0.2 34 | 35 | shadow { 36 | enabled = false 37 | range = 1 38 | render_power = 1 39 | sharp = false 40 | ignore_window = true 41 | color = rgba(000000aa) 42 | } 43 | 44 | blur { 45 | enabled = false 46 | special = true 47 | size = 6 48 | passes = 1 49 | new_optimizations = true 50 | ignore_opacity = true 51 | xray = false 52 | noise = 0.01 53 | } 54 | } 55 | 56 | dwindle { 57 | pseudotile = true 58 | preserve_split = true 59 | force_split = 3 60 | split_bias = 2 61 | } 62 | 63 | master { 64 | new_status = slave 65 | mfact = 0.60 66 | } 67 | # Rotate the next window in stack 68 | bind = ALT, TAB, layoutmsg, rollnext 69 | bind = ALT SHIFT, TAB, layoutmsg,rollprev 70 | 71 | misc { 72 | force_default_wallpaper = 0 73 | disable_hyprland_logo = true 74 | font_family = "JetBrainsMono Nerd Font" 75 | focus_on_activate = true 76 | middle_click_paste = true 77 | vfr = true 78 | vrr = 1 79 | always_follow_on_dnd = true 80 | close_special_on_empty = true 81 | new_window_takes_over_fullscreen = 2 82 | } 83 | 84 | render { 85 | direct_scanout = 2 86 | new_render_scheduling = true 87 | } 88 | -------------------------------------------------------------------------------- /nvim/lua/configs/options.lua: -------------------------------------------------------------------------------- 1 | local opt = vim.opt 2 | local o = vim.o 3 | local g = vim.g 4 | 5 | o.autoread = true 6 | 7 | o.relativenumber = false 8 | o.scrolloff = 8 9 | o.sidescroll = 1 10 | o.sidescrolloff = 8 11 | o.wrap = false 12 | o.linebreak = true 13 | o.breakindent = true 14 | o.showbreak = " " 15 | 16 | o.laststatus = 3 17 | o.showmode = false 18 | o.splitkeep = "screen" 19 | o.equalalways = false 20 | 21 | o.clipboard = "unnamedplus" 22 | o.cursorline = true 23 | o.cursorlineopt = "number" 24 | 25 | -- Indenting 26 | o.expandtab = true 27 | o.shiftwidth = 2 28 | o.smartindent = true 29 | o.autoindent = true 30 | o.tabstop = 2 31 | o.softtabstop = 2 32 | 33 | opt.fillchars = { eob = " " } 34 | o.ignorecase = true 35 | o.smartcase = true 36 | o.mouse = "a" 37 | 38 | -- Numbers 39 | o.number = true 40 | o.numberwidth = 2 41 | o.ruler = false 42 | 43 | -- disable nvim intro 44 | opt.shortmess:append("sI") 45 | 46 | o.signcolumn = "yes" 47 | o.splitbelow = true 48 | o.splitright = true 49 | o.timeoutlen = 300 50 | o.undofile = true 51 | 52 | -- performance 53 | o.updatetime = 300 54 | o.lazyredraw = true 55 | o.ttyfast = true 56 | o.fdo = "search,tag,insert,undo" 57 | o.termguicolors = true 58 | o.inccommand = "nosplit" 59 | o.hidden = true 60 | o.belloff = "all" 61 | o.cmdheight = 1 62 | o.synmaxcol = 200 63 | 64 | -- go to previous/next line with h,l,left arrow and right arrow 65 | -- when cursor reaches end/beginning of line 66 | opt.whichwrap:append("<>[]hl") 67 | 68 | -- disable some default providers 69 | g.loaded_node_provider = 0 70 | g.loaded_python3_provider = 0 71 | g.loaded_perl_provider = 0 72 | g.loaded_ruby_provider = 0 73 | 74 | -- add binaries installed by mason.nvim to path 75 | local is_windows = vim.fn.has("win32") ~= 0 76 | local sep = is_windows and "\\" or "/" 77 | local delim = is_windows and ";" or ":" 78 | vim.env.PATH = table.concat({ vim.fn.stdpath("data"), "mason", "bin" }, sep) .. delim .. vim.env.PATH 79 | -------------------------------------------------------------------------------- /btop/themes/modified_gruvbox.theme: -------------------------------------------------------------------------------- 1 | # Main background, empty for terminal default, need to be empty if you want transparent background 2 | theme[main_bg]="" 3 | 4 | # Main text color 5 | theme[main_fg]="#d4be98" 6 | 7 | # Title color for boxes 8 | theme[title]="#d4be98" 9 | 10 | # Highlight color for keyboard shortcuts 11 | theme[hi_fg]="#ea6962" 12 | 13 | # Background color of selected items 14 | theme[selected_bg]="#83A598" 15 | 16 | # Foreground color of selected items 17 | theme[selected_fg]="#282828" 18 | 19 | # Color of inactive/disabled text 20 | theme[inactive_fg]="#282828" 21 | 22 | # Color of text appearing on top of graphs, i.e uptime and current network graph scaling 23 | theme[graph_text]="#665c54" 24 | 25 | # Misc colors for processes box including mini cpu graphs, details memory graph and details status text 26 | theme[proc_misc]="#a9b665" 27 | 28 | # Cpu box outline color 29 | theme[cpu_box]="#7C6F64" 30 | 31 | # Memory/disks box outline color 32 | theme[mem_box]="#7C6F64" 33 | 34 | # Net up/down box outline color 35 | theme[net_box]="#7C6F64" 36 | 37 | # Processes box outline color 38 | theme[proc_box]="#7C6F64" 39 | 40 | # Box divider line and small boxes line color 41 | theme[div_line]="#7C6F64" 42 | 43 | # Temperature graph colors 44 | theme[temp_start]="#83A598" 45 | theme[temp_mid]="#e78a4e" 46 | theme[temp_end]="#ea6962" 47 | 48 | # CPU graph colors 49 | theme[cpu_start]="#a9b665" 50 | theme[cpu_mid]="#d8a657" 51 | theme[cpu_end]="#ea6962" 52 | 53 | # Mem/Disk free meter 54 | theme[free_start]="#89b482" 55 | theme[free_mid]="" 56 | theme[free_end]="" 57 | 58 | # Mem/Disk cached meter 59 | theme[cached_start]="#83A598" 60 | theme[cached_mid]="" 61 | theme[cached_end]="" 62 | 63 | # Mem/Disk available meter 64 | theme[available_start]="#d8a657" 65 | theme[available_mid]="" 66 | theme[available_end]="" 67 | 68 | # Mem/Disk used meter 69 | theme[used_start]="#ea6962" 70 | theme[used_mid]="" 71 | theme[used_end]="" 72 | 73 | # Download graph colors 74 | theme[download_start]="#e78a4e" 75 | theme[download_mid]="" 76 | theme[download_end]="" 77 | 78 | # Upload graph colors 79 | theme[upload_start]="#d3869b" 80 | theme[upload_mid]="" 81 | theme[upload_end]="" 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## My personal dotfiles for Arch Linux + Hyprland. 2 | 3 | This is my setup's **backup** in case I mess something up, a living **reference** of how I've configured things, and a place to keep track of stuff I've **learned** using Linux. 4 | 5 | These files fit _my_ workflow and _my_ taste. Look through, take ideas, build your own ;) 6 | 7 | ### Setup 8 | 9 | - **OS:** Arch Linux 10 | - **WM:** [Hyprland](https://hyprland.org/) 11 | - **Terminal:** [Kitty](https://github.com/kovidgoyal/kitty) 12 | - **Shell:** Zsh + [Antidote](https://antidote.sh/) ([Plugins](zsh/zsh_plugins.txt)) 13 | - **Font:** JetBrainsMono Nerd Font 14 | - **Theme:** Gruvbox 15 | - GTK: [Gruvbox-Material-Dark](https://github.com/TheGreatMcPain/gruvbox-material-gtk) 16 | - QT: [Gruvbox-Dark-Blue](https://github.com/sachnr/gruvbox-kvantum-themes) 17 | - Icons: [Gruvbox Plus Dark](https://github.com/SylEleuth/gruvbox-plus-icon-pack) 18 | - **Cursor:** [Hackeyed](https://www.gnome-look.org/p/999998) 19 | - **Display Manager:** [SDDM](https://github.com/sddm/sddm) ([config](https://github.com/Keyitdev/sddm-astronaut-theme)) 20 | - **Notification:** [SwayNC](https://github.com/ErikReider/SwayNotificationCenter) 21 | - **Bar:** [Waybar](https://github.com/Alexays/Waybar) 22 | - **Launcher:** [Rofi](https://github.com/davatorium/rofi) 23 | - **File Managers:** Thunar (GUI), [Yazi](https://yazi-rs.github.io/) (TUI) 24 | - **Music Player:** [kew](https://github.com/ravachol/kew) 25 | 26 | ![Screenshot](screenshot/screenshot_2025-06-02_20-42-26.png) 27 | 28 | ![Screenshot](screenshot/screenshot_2025-06-02_20-29-16.png) 29 | 30 | ![Screenshot](screenshot/screenshot_2025-12-20_07-56-06.png) 31 | 32 |
33 | Click to see more screenshots 34 | 35 | ![Screenshot](screenshot/screenshot_2025-06-02_20-39-54.png) 36 | 37 | ![Screenshot](screenshot/screenshot_2025-07-21_20-14-17.png) 38 | 39 | ![Screenshot](screenshot/screenshot_2025-05-17_19-29-13.png) 40 | 41 | ![Screenshot](screenshot/screenshot_2025-05-17_19-51-35.png) 42 | 43 | ![Screenshot](screenshot/screenshot_2025-05-17_19-19-04.png) 44 | 45 | ![Screenshot](screenshot/screenshot_2025-06-02_21-31-26.png) 46 | 47 | ![Screenshot](screenshot/screenshot_2025-06-02_21-31-50.png) 48 | 49 | ##
50 | -------------------------------------------------------------------------------- /kitty/kitty.conf: -------------------------------------------------------------------------------- 1 | #----------------------------------- 2 | # General Settings 3 | #----------------------------------- 4 | enable_audio_bell no 5 | resize_in_steps yes 6 | window_margin_width 0 7 | window_padding_width 8 8 | confirm_os_window_close 0 9 | input_delay 3 10 | 11 | #----------------------------------- 12 | # Cursor Settings 13 | #----------------------------------- 14 | cursor_trail 1 15 | cursor_trail_start_threshold 1 16 | cursor_shape block 17 | cursor_blink_interval 0 18 | cursor_shape_unfocused hollow 19 | shell_integration no-cursor 20 | 21 | #----------------------------------- 22 | # Font Settings 23 | #----------------------------------- 24 | font_family JetBrains Mono 25 | font_size 10 26 | 27 | # Fallback Nerd Font for symbols 28 | symbol_map U+E000-U+F8FF JetBrainsMono Nerd Font Mono 29 | 30 | #----------------------------------- 31 | # Opacity and Effects 32 | #----------------------------------- 33 | background_opacity 1 34 | dynamic_background_opacity yes 35 | # background_tint 0.9 36 | 37 | #----------------------------------- 38 | # Scrolling 39 | #----------------------------------- 40 | scrollback_lines 10000 41 | scrollback_pager_history_size 100 42 | mouse_wheel_scrolling yes 43 | scrollback_smooth yes 44 | clear_scrollback_on_exit no 45 | 46 | #----------------------------------- 47 | # Tab 48 | #----------------------------------- 49 | tab_bar_edge bottom 50 | tab_bar_style powerline 51 | tab_bar_align left 52 | tab_bar_min_tabs 2 53 | tab_switch_strategy previous 54 | 55 | enabled_layouts Tall, Horizontal 56 | 57 | #----------------------------------- 58 | # Color Scheme 59 | #----------------------------------- 60 | include ~/.config/kitty/themes/gruvbox_dark.conf 61 | 62 | #----------------------------------- 63 | # Key bindings 64 | #----------------------------------- 65 | # Ctrl+Backspace → delete word 66 | map ctrl+backspace send_text all \x17 67 | 68 | # Free up default kitty keybinds 69 | map ctrl+shift+t no_op 70 | map ctrl+shift+w no_op 71 | map ctrl+shift+enter no_op 72 | map ctrl+shift+q no_op 73 | map ctrl+shift+[ no_op 74 | map ctrl+shift+] no_op 75 | map ctrl+shift+f no_op 76 | map ctrl+shift+l no_op 77 | map ctrl+shift+o no_op 78 | 79 | -------------------------------------------------------------------------------- /scripts/mediactl.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | case "$1" in 5 | volume-up) 6 | wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ 7 | vol=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{printf "%.0f%%", $2 * 100}') 8 | notify-send -h string:x-canonical-private-synchronous:volume \ 9 | -h boolean:transient:true \ 10 | "Volume" -t 1000 "$vol" -i audio-volume-high-symbolic 11 | ;; 12 | volume-down) 13 | wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- 14 | vol=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{printf "%.0f%%", $2 * 100}') 15 | notify-send -h string:x-canonical-private-synchronous:volume \ 16 | -h boolean:transient:true \ 17 | "Volume" -t 1000 "$vol" -i audio-volume-low-symbolic 18 | ;; 19 | mute) 20 | wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle 21 | state=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{if ($3 == "[MUTED]") print "Muted"; else print "Unmuted"}') 22 | notify-send -h string:x-canonical-private-synchronous:audio \ 23 | -h boolean:transient:true \ 24 | "Audio" -t 1000 "$state" -i audio-volume-muted-symbolic 25 | ;; 26 | mic-mute) 27 | wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle 28 | state=$(wpctl get-volume @DEFAULT_AUDIO_SOURCE@ | awk '{if ($3 == "[MUTED]") print "Muted"; else print "Unmuted"}') 29 | notify-send -h string:x-canonical-private-synchronous:mic \ 30 | -h boolean:transient:true \ 31 | "Microphone" -t 1000 "$state" -i microphone-off-symbolic 32 | ;; 33 | brightness-up) 34 | brightnessctl set 5%+ 35 | current=$(brightnessctl get) 36 | max=$(brightnessctl max) 37 | percentage=$(awk -v c="$current" -v m="$max" 'BEGIN {printf "%.0f", (c / m) * 100}') 38 | notify-send -h string:x-canonical-private-synchronous:brightness \ 39 | -h boolean:transient:true \ 40 | "Brightness" -t 1000 "${percentage}%" -i display-brightness-high-symbolic 41 | ;; 42 | brightness-down) 43 | brightnessctl set 5%- 44 | current=$(brightnessctl get) 45 | max=$(brightnessctl max) 46 | percentage=$(awk -v c="$current" -v m="$max" 'BEGIN {printf "%.0f", (c / m) * 100}') 47 | notify-send -h string:x-canonical-private-synchronous:brightness \ 48 | -h boolean:transient:true \ 49 | "Brightness" -t 1000 "${percentage}%" -i display-brightness-low-symbolic 50 | ;; 51 | esac 52 | -------------------------------------------------------------------------------- /nvim/lua/plugins/snacks.lua: -------------------------------------------------------------------------------- 1 | ---@diagnostic disable: undefined-doc-name, undefined-global 2 | return { 3 | "folke/snacks.nvim", 4 | priority = 1000, 5 | lazy = false, 6 | ---@type snacks.Config 7 | opts = { 8 | picker = { 9 | enabled = true, 10 | sources = { 11 | files = { hidden = true, ignored = false }, 12 | grep = { hidden = true }, 13 | }, 14 | win = { 15 | input = { 16 | keys = { 17 | [""] = { "close", mode = { "n", "i" } }, 18 | [""] = { "preview_scroll_up", mode = { "i", "n" } }, 19 | [""] = { "preview_scroll_down", mode = { "i", "n" } }, 20 | }, 21 | }, 22 | }, 23 | }, 24 | }, 25 | keys = { 26 | { 27 | "", 28 | function() 29 | Snacks.picker.files() 30 | end, 31 | desc = "Find Files (Snacks)", 32 | }, 33 | { 34 | "ff", 35 | function() 36 | Snacks.picker.smart() 37 | end, 38 | desc = "Smart Find Files (Snacks)", 39 | }, 40 | 41 | { 42 | "fg", 43 | function() 44 | Snacks.picker.grep() 45 | end, 46 | desc = "Grep (Snacks)", 47 | }, 48 | 49 | { 50 | "fG", 51 | function() 52 | Snacks.picker.grep_buffers() 53 | end, 54 | desc = "Grep Buffers (Snacks)", 55 | }, 56 | 57 | { 58 | "ft", 59 | function() 60 | Snacks.picker.todo_comments() 61 | end, 62 | desc = "Todo (Snacks)", 63 | }, 64 | 65 | { 66 | "fh", 67 | function() 68 | Snacks.picker.actions.help() 69 | end, 70 | desc = "Help tags (Snacks)", 71 | }, 72 | 73 | { 74 | "fm", 75 | function() 76 | Snacks.picker.man() 77 | end, 78 | desc = "Man Pages (Snacks)", 79 | }, 80 | 81 | { 82 | "bl", 83 | function() 84 | Snacks.picker.lines() 85 | end, 86 | desc = "Buffer Lines (Snacks)", 87 | }, 88 | 89 | { 90 | "bb", 91 | function() 92 | Snacks.picker.buffers() 93 | end, 94 | desc = "Buffers (Snacks)", 95 | }, 96 | 97 | { 98 | "", 99 | function() 100 | Snacks.lazygit.open() 101 | end, 102 | desc = "Lazygit (Snacks)", 103 | }, 104 | }, 105 | } 106 | -------------------------------------------------------------------------------- /nvim/lua/plugins/copilot.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "CopilotC-Nvim/CopilotChat.nvim", 3 | branch = "main", 4 | build = "make tiktoken", 5 | dependencies = { 6 | "nvim-lua/plenary.nvim", 7 | }, 8 | 9 | opts = function() 10 | return { 11 | system_prompt = require("configs.prompts").system_prompt, 12 | prompts = require("configs.prompts").prompts, 13 | 14 | resources = "selection", 15 | temperature = 0.1, 16 | model = "gpt-4.1", 17 | -- model = "grok-code-fast-1", 18 | -- model = "gpt-5-mini", 19 | 20 | window = { 21 | layout = "vertical", 22 | width = 0.4, 23 | }, 24 | 25 | headers = { 26 | user = " r4ppz", 27 | assistant = "󱚝 Jarvis", 28 | tool = " Tool", 29 | }, 30 | separator = "─", 31 | -- separator = "-", 32 | highlight_headers = true, 33 | 34 | auto_fold = true, 35 | show_folds = true, 36 | auto_insert_mode = false, 37 | auto_follow_cursor = false, 38 | show_help = false, 39 | clear_chat_on_new_prompt = false, 40 | remember_as_sticky = false, 41 | } 42 | end, 43 | 44 | keys = { 45 | { "ci", "CopilotChatIdiomatic", mode = { "n", "v" }, desc = "Check if code is idiomatic" }, 46 | { "ce", "CopilotChatExplain", mode = { "n", "v" }, desc = "Explain code" }, 47 | { "cs", "CopilotChatSuggest", mode = { "n", "v" }, desc = "Suggest alternatives" }, 48 | { "", "CopilotChatToggle", mode = { "n", "v" }, desc = "Toggle CopilotChat" }, 49 | { "cm", "CopilotChatModels", mode = { "n", "v" }, desc = "View/select available models" }, 50 | 51 | { 52 | "cp", 53 | function() 54 | local chat = require("CopilotChat") 55 | chat.open() 56 | chat.select_prompt() 57 | end, 58 | mode = { "n", "v" }, 59 | desc = "View/select prompt templates", 60 | }, 61 | 62 | -- Open chat with current buffer 63 | { 64 | "cc", 65 | function() 66 | local chat = require("CopilotChat") 67 | chat.open() 68 | chat.chat:add_message({ role = "user", content = "#buffer:active\n" }, true) 69 | end, 70 | mode = { "n", "v" }, 71 | desc = "Open chat with current buffer", 72 | }, 73 | 74 | { 75 | "ca", 76 | function() 77 | local chat = require("CopilotChat") 78 | chat.open() 79 | chat.chat:add_message({ role = "user", content = "#buffer:listed\n" }, true) 80 | end, 81 | mode = { "n", "v" }, 82 | desc = "Open chat with all buffers", 83 | }, 84 | }, 85 | } 86 | -------------------------------------------------------------------------------- /swaync/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "/etc/xdg/swaync/configSchema.json", 3 | "ignore-gtk-theme": true, 4 | "positionX": "right", 5 | "positionY": "top", 6 | "layer": "overlay", 7 | "control-center-layer": "top", 8 | "layer-shell": true, 9 | "layer-shell-cover-screen": true, 10 | "cssPriority": "user", 11 | "control-center-margin-top": 15, 12 | "control-center-margin-bottom": 15, 13 | "control-center-margin-right": 15, 14 | "control-center-margin-left": 0, 15 | "notification-2fa-action": true, 16 | "notification-inline-replies": false, 17 | "notification-body-image-height": 100, 18 | "notification-body-image-width": 200, 19 | "timeout": 10, 20 | "timeout-low": 5, 21 | "timeout-critical": 0, 22 | "fit-to-screen": true, 23 | "relative-timestamps": true, 24 | "control-center-width": 300, 25 | "control-center-height": 600, 26 | "notification-window-width": 300, 27 | "keyboard-shortcuts": true, 28 | "notification-grouping": true, 29 | "image-visibility": "when-available", 30 | "transition-time": 200, 31 | "hide-on-clear": false, 32 | "hide-on-action": true, 33 | "text-empty": "No Notifications", 34 | "script-fail-notify": true, 35 | "scripts": { 36 | "example-script": { 37 | "exec": "echo 'Do something...'", 38 | "urgency": "Normal" 39 | }, 40 | "example-action-script": { 41 | "exec": "echo 'Do something actionable!'", 42 | "urgency": "Normal", 43 | "run-on": "action" 44 | } 45 | }, 46 | "notification-visibility": { 47 | "example-name": { 48 | "state": "muted", 49 | "urgency": "Low", 50 | "app-name": "Spotify" 51 | } 52 | }, 53 | "widgets": ["inhibitors", "title", "dnd", "mpris", "notifications"], 54 | "widget-config": { 55 | "inhibitors": { 56 | "text": "Inhibitors", 57 | "button-text": "Clear All", 58 | "clear-all-button": true 59 | }, 60 | "title": { 61 | "text": "Notifications", 62 | "clear-all-button": true, 63 | "button-text": "Clear All" 64 | }, 65 | "dnd": { 66 | "text": "Do Not Disturb" 67 | }, 68 | "label": { 69 | "max-lines": 5, 70 | "text": "Label Text" 71 | }, 72 | "mpris": { 73 | "show-album-art": "always", 74 | "loop-carousel": false 75 | }, 76 | "buttons-grid": { 77 | "buttons-per-row": 7, 78 | "actions": [ 79 | { 80 | "label": "󰖩", 81 | "type": "toggle", 82 | "active": true, 83 | "command": "sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && nmcli radio wifi on || nmcli radio wifi off'", 84 | "update-command": "sh -c '[[ $(nmcli radio wifi) == \"enabled\" ]] && echo true || echo false'" 85 | } 86 | ] 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /rofi/powermenu/confirm.rasi: -------------------------------------------------------------------------------- 1 | /*****----- Configuration -----*****/ 2 | configuration { 3 | show-icons: false; 4 | } 5 | 6 | /*****----- Global Properties -----*****/ 7 | @import "~/.config/rofi/shared/gruvbox.rasi" 8 | @import "~/.config/rofi/shared/font.rasi" 9 | 10 | /*****----- Main Window -----*****/ 11 | window { 12 | location: center; 13 | anchor: center; 14 | fullscreen: false; 15 | width: 400px; 16 | border-radius: 10px; 17 | cursor: "default"; 18 | background-color: @background; 19 | } 20 | 21 | /*****----- Main Box -----*****/ 22 | mainbox { 23 | spacing: 30px; 24 | padding: 30px; 25 | background-color: transparent; 26 | children: [ "message", "listview" ]; 27 | } 28 | 29 | /*****----- Message -----*****/ 30 | message { 31 | margin: 0px; 32 | padding: 20px; 33 | border-radius: 20px; 34 | background-color: @background-alt; 35 | text-color: @foreground; 36 | } 37 | textbox { 38 | background-color: inherit; 39 | text-color: inherit; 40 | vertical-align: 0.5; 41 | horizontal-align: 0.5; 42 | placeholder-color: @foreground; 43 | blink: true; 44 | markup: true; 45 | } 46 | 47 | /*****----- Listview -----*****/ 48 | listview { 49 | columns: 2; 50 | lines: 1; 51 | cycle: true; 52 | dynamic: true; 53 | scrollbar: false; 54 | layout: vertical; 55 | reverse: false; 56 | fixed-height: true; 57 | fixed-columns: true; 58 | 59 | spacing: 30px; 60 | background-color: transparent; 61 | text-color: @foreground; 62 | cursor: "default"; 63 | } 64 | 65 | /*****----- Elements -----*****/ 66 | element { 67 | padding: 60px 10px; 68 | border-radius: 20px; 69 | background-color: @background-alt; 70 | text-color: @foreground; 71 | cursor: pointer; 72 | } 73 | element-text { 74 | font: "feather 48"; 75 | background-color: transparent; 76 | text-color: inherit; 77 | cursor: inherit; 78 | vertical-align: 0.5; 79 | horizontal-align: 0.5; 80 | } 81 | element selected.normal { 82 | background-color: var(selected); 83 | text-color: var(background); 84 | } 85 | -------------------------------------------------------------------------------- /nvim/lua/plugins/lsp.lua: -------------------------------------------------------------------------------- 1 | local servers = { 2 | "html", 3 | "cssls", 4 | "cssmodules_ls", 5 | "css_variables", 6 | "jsonls", 7 | "marksman", 8 | "lua_ls", 9 | "pyright", 10 | "bashls", 11 | "rust_analyzer", 12 | "emmet_ls", 13 | "lemminx", 14 | "hyprls", 15 | "clangd", 16 | "jdtls", 17 | "taplo", 18 | "yamlls", 19 | "docker_language_server", 20 | "docker_compose_language_service", 21 | "postgres_lsp", 22 | -- old: 23 | -- "eslint", 24 | -- "vtsls", 25 | -- "ts_ls", 26 | } 27 | 28 | return { 29 | "neovim/nvim-lspconfig", 30 | event = "FileType", 31 | dependencies = { 32 | { 33 | "mason-org/mason.nvim", 34 | opts = function() 35 | return { 36 | PATH = "skip", 37 | ui = { 38 | border = "single", 39 | icons = { 40 | package_pending = " ", 41 | package_installed = " ", 42 | package_uninstalled = " ", 43 | }, 44 | }, 45 | max_concurrent_installers = 10, 46 | } 47 | end, 48 | dependencies = "nvim-telescope/telescope.nvim", 49 | }, 50 | { 51 | "mason-org/mason-lspconfig.nvim", 52 | opts = { 53 | ensure_installed = servers, 54 | automatic_enable = false, 55 | }, 56 | }, 57 | "hrsh7th/cmp-nvim-lsp", 58 | "nvimdev/lspsaga.nvim", 59 | "mfussenegger/nvim-jdtls", 60 | }, 61 | 62 | config = function() 63 | local server_configs = require("configs.servers") 64 | local capabilities = require("cmp_nvim_lsp").default_capabilities() 65 | capabilities.textDocument.completion.completionItem = 66 | vim.tbl_deep_extend("force", capabilities.textDocument.completion.completionItem or {}, { 67 | documentationFormat = { 68 | "markdown", 69 | "plaintext", 70 | }, 71 | snippetSupport = true, 72 | preselectSupport = true, 73 | insertReplaceSupport = true, 74 | labelDetailsSupport = true, 75 | deprecatedSupport = true, 76 | commitCharactersSupport = true, 77 | tagSupport = { 78 | valueSet = { 1 }, 79 | }, 80 | resolveSupport = { 81 | properties = { 82 | "documentation", 83 | "detail", 84 | "additionalTextEdits", 85 | }, 86 | }, 87 | }) 88 | 89 | local function setup() 90 | -- Default configurations for all servers 91 | vim.lsp.config("*", { 92 | capabilities = capabilities, 93 | }) 94 | 95 | -- Server-specific configurations 96 | server_configs.setup(capabilities) 97 | 98 | -- Enable all listed servers 99 | for _, s in ipairs(servers) do 100 | vim.lsp.enable(s) 101 | end 102 | end 103 | 104 | -- Run setup 105 | vim.schedule(setup) 106 | end, 107 | } 108 | -------------------------------------------------------------------------------- /nvim/lua/plugins/git.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "lewis6991/gitsigns.nvim", 3 | dependencies = { 4 | "sindrets/diffview.nvim", 5 | }, 6 | event = "VeryLazy", 7 | opts = { 8 | signs = { 9 | add = { text = "│" }, 10 | change = { text = "│" }, 11 | delete = { text = "" }, 12 | topdelete = { text = "" }, 13 | changedelete = { text = "" }, 14 | untracked = { text = "┆" }, 15 | }, 16 | signcolumn = true, 17 | numhl = false, 18 | linehl = false, 19 | word_diff = false, 20 | watch_gitdir = { 21 | interval = 1000, 22 | follow_files = true, 23 | }, 24 | attach_to_untracked = false, 25 | current_line_blame = false, 26 | current_line_blame_opts = { 27 | virt_text = true, 28 | virt_text_pos = "eol", 29 | delay = 1000, 30 | ignore_whitespace = false, 31 | }, 32 | current_line_blame_formatter = ", - ", 33 | sign_priority = 6, 34 | update_debounce = 200, 35 | max_file_length = 10000, 36 | preview_config = { 37 | border = "single", 38 | style = "minimal", 39 | relative = "cursor", 40 | row = 0, 41 | col = 1, 42 | }, 43 | }, 44 | 45 | config = function(_, opts) 46 | require("gitsigns").setup(opts) 47 | local map = require("utils.map") 48 | 49 | -- diff view 50 | map("n", "dd", "DiffviewOpen", { desc = "Open Diffview" }) 51 | map("n", "dx", "DiffviewClose", { desc = "Close Diffview" }) 52 | map("n", "dh", "DiffviewFileHistory", { desc = "Open repository history" }) 53 | map("n", "df", "DiffviewFileHistory %", { desc = "Open current file history" }) 54 | 55 | -- gitsign navigation 56 | map("n", "]c", function() 57 | require("gitsigns").nav_hunk("next") 58 | end, { desc = "Next Git Hunk (GitSign)" }) 59 | map("n", "[c", function() 60 | require("gitsigns").nav_hunk("prev") 61 | end, { desc = "Previous Git Hunk (GitSign)" }) 62 | 63 | -- stage hunk/buffer 64 | map("n", "gs", function() 65 | require("gitsigns").stage_hunk() 66 | end, { desc = "Stage Hunk (GitSign)" }) 67 | map("n", "gS", function() 68 | require("gitsigns").stage_buffer() 69 | end, { desc = "Stage Buffer (GitSign)" }) 70 | 71 | -- reset hunk/buffer 72 | map("n", "gr", function() 73 | require("gitsigns").reset_hunk() 74 | end, { desc = "Reset Hunk (GitSign)" }) 75 | map("n", "gR", function() 76 | require("gitsigns").reset_buffer() 77 | end, { desc = "Reset Buffer (GitSign)" }) 78 | 79 | -- preview changes/blame 80 | map("n", "gp", function() 81 | require("gitsigns").preview_hunk() 82 | end, { desc = "Preview Hunk (GitSign)" }) 83 | map("n", "gP", function() 84 | require("gitsigns").preview_hunk_inline() 85 | end, { desc = "Preview Hunk Inline (GitSign)" }) 86 | map("n", "gb", function() 87 | require("gitsigns").blame_line({ full = true }) 88 | end, { desc = "Blame Line (GitSign)" }) 89 | 90 | -- diff hunk/head 91 | map("n", "gd", function() 92 | require("gitsigns").diffthis() 93 | end, { desc = "Diff Hunk GitSign (GitSign)" }) 94 | map("n", "gD", function() 95 | require("gitsigns").diffthis("~") 96 | end, { desc = "Diff With HEAD (GitSign)" }) 97 | end, 98 | } 99 | -------------------------------------------------------------------------------- /scripts/battery-warn.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | # Configuration 5 | LOW_BATTERY_THRESHOLD=30 6 | CRITICAL_BATTERY_THRESHOLD=20 7 | VERY_CRITICAL_THRESHOLD=10 8 | CHECK_INTERVAL=15 9 | LOG_FILE="$HOME/.local/share/battery_monitor.log" 10 | 11 | LAST_NOTIFICATION_LEVEL="" 12 | NOTIFICATION_COOLDOWN=300 13 | LAST_NOTIFICATION_TIME=0 14 | 15 | log_message() { 16 | echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >>"$LOG_FILE" 17 | } 18 | 19 | send_notification() { 20 | local urgency="$1" 21 | local title="$2" 22 | local message="$3" 23 | local current_time=$(date +%s) 24 | 25 | if [[ "$LAST_NOTIFICATION_LEVEL" == "$urgency" ]]; then 26 | local time_diff=$((current_time - LAST_NOTIFICATION_TIME)) 27 | if [[ $time_diff -lt $NOTIFICATION_COOLDOWN ]]; then 28 | return 29 | fi 30 | fi 31 | 32 | notify-send -u "$urgency" -t 10000 -a "Battery Monitor" \ 33 | -h boolean:transient:true "$title" "$message" 34 | log_message "Notification sent: $title - $message" 35 | 36 | LAST_NOTIFICATION_LEVEL="$urgency" 37 | LAST_NOTIFICATION_TIME=$current_time 38 | } 39 | 40 | get_battery_icon() { 41 | local level="$1" 42 | local status="$2" 43 | 44 | if [[ "$status" == "Charging" ]]; then 45 | echo "󰂄" 46 | elif ((level >= 90)); then 47 | echo "󰁹" 48 | elif ((level >= 80)); then 49 | echo "󰂂" 50 | elif ((level >= 60)); then 51 | echo "󰂀" 52 | elif ((level >= 40)); then 53 | echo "󰁾" 54 | elif ((level >= 20)); then 55 | echo "󰁼" 56 | elif ((level >= 10)); then 57 | echo "󰁺" 58 | else 59 | echo "󰂎" 60 | fi 61 | } 62 | 63 | get_battery_info() { 64 | local bat_path="/sys/class/power_supply" 65 | local battery_dir="" 66 | 67 | for bat in "$bat_path"/BAT*; do 68 | if [[ -d "$bat" ]]; then 69 | battery_dir="$bat" 70 | break 71 | fi 72 | done 73 | 74 | if [[ -z "$battery_dir" ]]; then 75 | log_message "ERROR: No battery found in $bat_path" 76 | exit 1 77 | fi 78 | 79 | if [[ -r "$battery_dir/capacity" && -r "$battery_dir/status" ]]; then 80 | battery_level=$(cat "$battery_dir/capacity") 81 | charging_status=$(cat "$battery_dir/status") 82 | else 83 | log_message "ERROR: Cannot read battery information from $battery_dir" 84 | exit 1 85 | fi 86 | } 87 | 88 | main() { 89 | log_message "Battery monitor started (PID: $$)" 90 | 91 | while true; do 92 | get_battery_info 93 | local battery_icon=$(get_battery_icon "$battery_level" "$charging_status") 94 | 95 | if [[ "$charging_status" != "Charging" ]]; then 96 | if ((battery_level <= VERY_CRITICAL_THRESHOLD)); then 97 | send_notification "critical" "󰂎 CRITICAL BATTERY" \ 98 | "Battery at ${battery_level}%! System will shutdown soon. 󱐋 PLUG IN NOW!" 99 | elif ((battery_level <= CRITICAL_BATTERY_THRESHOLD)); then 100 | send_notification "critical" "󰁺 CRITICAL BATTERY" \ 101 | "Battery at ${battery_level}%. 󱐋 Plug in immediately!" 102 | elif ((battery_level <= LOW_BATTERY_THRESHOLD)); then 103 | send_notification "normal" "${battery_icon} Low Battery" \ 104 | "Battery at ${battery_level}%. 󱐋 Please charge soon." 105 | fi 106 | else 107 | LAST_NOTIFICATION_LEVEL="" 108 | fi 109 | 110 | sleep $CHECK_INTERVAL 111 | done 112 | } 113 | 114 | cleanup() { 115 | log_message "Battery monitor stopped" 116 | exit 0 117 | } 118 | 119 | trap cleanup SIGTERM SIGINT 120 | 121 | mkdir -p "$(dirname "$LOG_FILE")" 122 | 123 | main 124 | -------------------------------------------------------------------------------- /pkglist.txt: -------------------------------------------------------------------------------- 1 | 7zip 2 | acpi 3 | acpi_call 4 | auto-cpufreq 5 | base 6 | base-devel 7 | bashmount 8 | bat 9 | bc 10 | binwalk 11 | bitwarden 12 | blueman 13 | bluez-utils 14 | brave-bin 15 | brightnessctl 16 | btop 17 | cava 18 | circumflex 19 | clang 20 | cpio 21 | dkms 22 | docker 23 | docker-buildx 24 | docker-compose 25 | dosfstools 26 | downgrade 27 | dua-cli 28 | duf 29 | dunst 30 | efibootmgr 31 | epr-git 32 | epy-ereader-git 33 | evtest 34 | eza 35 | f3 36 | fastfetch 37 | fd 38 | firejail 39 | fzf 40 | gamemode 41 | gamescope 42 | git 43 | git-delta 44 | github-cli 45 | gnome-keyring 46 | go 47 | gptfdisk 48 | grim 49 | grub 50 | gsimplecal 51 | gst-plugin-pipewire 52 | gtk-engine-murrine 53 | gtrash 54 | gvfs 55 | gvfs-mtp 56 | hexedit 57 | hexyl 58 | htop 59 | hypridle 60 | hyprland 61 | hyprpaper 62 | hyprpicker 63 | hyprpolkitagent 64 | hyprshot 65 | hyprsunset 66 | imagemagick 67 | imv 68 | intel-media-driver 69 | intel-ucode 70 | iwd 71 | jdk-openjdk 72 | jdk17-openjdk 73 | jdk21-openjdk 74 | jdk8-openjdk 75 | jq 76 | jre8-openjdk 77 | jre8-openjdk-headless 78 | keepassxc 79 | kew 80 | keyd 81 | kitty 82 | krita 83 | kvantum 84 | kvantum-qt5 85 | lazydocker 86 | lazygit 87 | less 88 | lib32-gamemode 89 | lib32-gnutls 90 | lib32-libpulse 91 | lib32-mesa 92 | lib32-vulkan-icd-loader 93 | lib32-vulkan-intel 94 | libpulse 95 | libva-intel-driver 96 | linux 97 | linux-firmware 98 | linux-hardened 99 | linux-headers 100 | linux-lts 101 | linux-zen 102 | linux-zen-headers 103 | linuxconsole 104 | lnav 105 | lua51 106 | lua51-jsregexp 107 | luajit-tiktoken-bin 108 | luarocks 109 | lynx 110 | man-db 111 | maven 112 | mdcat 113 | meson 114 | mpd 115 | mtpfs 116 | mupdf-tools 117 | nano 118 | ncdu 119 | ncmpcpp 120 | neofetch-git 121 | neovim 122 | network-manager-applet 123 | networkmanager 124 | networkmanager-openvpn 125 | nodejs-lts-krypton 126 | noto-fonts-emoji 127 | npm 128 | ntfs-3g 129 | nwg-look 130 | obs-studio 131 | okular 132 | ollama 133 | onlyoffice-bin 134 | ookla-speedtest-bin 135 | openbsd-netcat 136 | os-prober 137 | pacseek-bin 138 | partitionmanager 139 | perl-image-exiftool 140 | pgcli 141 | pipewire 142 | pipewire-alsa 143 | pipewire-jack 144 | pipewire-pulse 145 | plasma-workspace 146 | polkit-kde-agent 147 | postgresql 148 | python-pip 149 | python-pipx 150 | qbittorrent 151 | qt5-wayland 152 | qt5ct 153 | qt6-virtualkeyboard 154 | qt6-wayland 155 | qt6ct-kde 156 | reflector 157 | rmpc 158 | rofi 159 | rsync 160 | ruby 161 | rustup 162 | samba 163 | scrcpy 164 | sddm 165 | sleuthkit 166 | slurp 167 | smartmontools 168 | sof-firmware 169 | sshfs 170 | steghide 171 | swaylock-effects-git 172 | swaync 173 | systemsettings 174 | tealdeer 175 | tesseract 176 | tesseract-data-eng 177 | testdisk 178 | tgpt 179 | thunar 180 | thunar-archive-plugin 181 | thunar-volman 182 | tmux 183 | torbrowser-launcher 184 | trash-cli 185 | tree-sitter 186 | tree-sitter-cli 187 | ttf-dejavu 188 | ttf-hack-nerd 189 | ttf-jetbrains-mono 190 | ttf-jetbrains-mono-nerd 191 | ttf-ms-win11-auto 192 | ttf-roboto 193 | ttf-roboto-mono-nerd 194 | udiskie 195 | uwsm 196 | vim 197 | virtualbox 198 | virtualbox-host-dkms 199 | visual-studio-code-bin 200 | vulkan-intel 201 | vulkan-tools 202 | waybar 203 | wev 204 | wget 205 | wireless_tools 206 | wireplumber 207 | wireshark-cli 208 | wireshark-qt 209 | wl-clip-persist 210 | wl-clipboard 211 | wofi 212 | xarchiver 213 | xdg-dbus-proxy 214 | xdg-desktop-portal-hyprland 215 | xdg-utils 216 | xorg-server 217 | xorg-xinit 218 | xpadneo-dkms 219 | yarn 220 | yay 221 | yazi 222 | ydotool 223 | yt-dlp 224 | zathura 225 | zathura-pdf-poppler 226 | zbar 227 | zoxide 228 | zram-generator 229 | zsh 230 | -------------------------------------------------------------------------------- /zsh/functions.zsh: -------------------------------------------------------------------------------- 1 | # Phone mount 2 | function pmount() { 3 | local mnt=~/Phone 4 | [[ -d $mnt ]] || mkdir "$mnt" 5 | mountpoint -q "$mnt" && { 6 | echo "Already mounted." 7 | return 1 8 | } 9 | sshfs phone:/storage/emulated/0 "$mnt" && echo "Phone mounted at $mnt" || { 10 | echo "Mount failed." 11 | return 1 12 | } 13 | } 14 | 15 | # Phone unmount 16 | function pumount() { 17 | local mnt=~/Phone 18 | mountpoint -q "$mnt" || { 19 | echo "Not mounted." 20 | return 1 21 | } 22 | fusermount3 -u "$mnt" && { 23 | echo "Phone unmounted." 24 | rmdir "$mnt" && echo "Mount point removed." 25 | } || echo "Unmount failed." 26 | } 27 | 28 | # filter history 29 | zshaddhistory() { 30 | emulate -L zsh 31 | # [[ $1 == *\'* || $1 == *\"* ]] && return 1 32 | [[ $1 == *\'* ]] && return 1 33 | ((${#1} > 2000)) && return 1 34 | return 0 35 | } 36 | 37 | # yazi 38 | function y() { 39 | local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd 40 | yazi "$@" --cwd-file="$tmp" 41 | if cwd="$(command cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then 42 | builtin cd -- "$cwd" 43 | fi 44 | rm -f -- "$tmp" 45 | } 46 | 47 | # tgpt 48 | ai() { 49 | case "$1" in 50 | -p) 51 | shift 52 | tgpt -q -w --provider pollinations "$@" 53 | ;; 54 | -o) 55 | shift 56 | tgpt -q -w --provider ollama --model gemma3 "$@" 57 | ;; 58 | *) 59 | tgpt -q -w "$@" 60 | ;; 61 | esac | mdcat | less 62 | } 63 | 64 | function extract() { 65 | if [ -f "$1" ]; then 66 | case "$1" in 67 | *.tar.bz2) tar xjf "$1" ;; 68 | *.tar.gz) tar xzf "$1" ;; 69 | *.tar.xz) tar xJf "$1" ;; 70 | *.tar.zst) tar --zstd -xf "$1" ;; 71 | *.bz2) bunzip2 "$1" ;; 72 | *.rar) unrar x "$1" ;; 73 | *.gz) gunzip "$1" ;; 74 | *.tar) tar xf "$1" ;; 75 | *.tbz2) tar xjf "$1" ;; 76 | *.tgz) tar xzf "$1" ;; 77 | *.zip) unzip "$1" ;; 78 | *.Z) uncompress "$1" ;; 79 | *.7z) 7z x "$1" ;; 80 | *.xz) unxz "$1" ;; 81 | *.lzma) unlzma "$1" ;; 82 | *.zst) unzstd "$1" ;; 83 | *) echo "extract: '$1' - unknown archive method" ;; 84 | esac 85 | else 86 | echo "extract: '$1' is not a valid file" 87 | fi 88 | } 89 | 90 | function compress() { 91 | if [ $# -lt 2 ]; then 92 | echo "Usage: compress [file_or_dir...]" 93 | return 1 94 | fi 95 | local archive="$1" 96 | shift 97 | case "$archive" in 98 | *.tar.gz) tar czf "$archive" "$@" ;; 99 | *.tar.bz2) tar cjf "$archive" "$@" ;; 100 | *.tar.xz) tar cJf "$archive" "$@" ;; 101 | *.tar.zst) tar --zstd -cf "$archive" "$@" ;; 102 | *.zip) zip -r "$archive" "$@" ;; 103 | *.7z) 7z a "$archive" "$@" ;; 104 | *) echo "compress: unsupported archive format: $archive" ;; 105 | esac 106 | } 107 | 108 | # Run a command on every file in the current directory 109 | eachf() { 110 | find . -type f -exec "$@" {} \; 111 | } 112 | 113 | # Decimal to binary 114 | dec2bin() { 115 | echo "obase=2; $1" | bc 116 | } 117 | # Binary to decimal 118 | bin2dec() { 119 | echo "$((2#$1))" 120 | } 121 | # Binary to hex 122 | bin2hex() { 123 | printf "%X\n" "$((2#$1))" 124 | } 125 | # Hex to binary 126 | hex2bin() { 127 | echo "obase=2; ibase=16; $1" | bc 128 | } 129 | # Hex to decimal 130 | hex2dec() { 131 | echo "$((16#$1))" 132 | } 133 | # Decimal to hex 134 | dec2hex() { 135 | printf "%X\n" "$1" 136 | } 137 | # Decimal to octal 138 | dec2oct() { 139 | printf "%o\n" "$1" 140 | } 141 | # Octal to decimal 142 | oct2dec() { 143 | echo "$((8#$1))" 144 | } 145 | # Octal to hex 146 | oct2hex() { 147 | printf "%X\n" "$((8#$1))" 148 | } 149 | # Hex to octal 150 | hex2oct() { 151 | echo "obase=8; ibase=16; $1" | bc 152 | } 153 | -------------------------------------------------------------------------------- /nvim/lazy-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "CopilotChat.nvim": { "branch": "main", "commit": "df5376c132382dd47e3e552612940cbf25b3580c" }, 3 | "LuaSnip": { "branch": "master", "commit": "3732756842a2f7e0e76a7b0487e9692072857277" }, 4 | "base46": { "branch": "v3.0", "commit": "45b336ec52615dd1a3aa47848d894616dd6293a5" }, 5 | "cmp-async-path": { "branch": "main", "commit": "b8aade3a0626f2bc1d3cd79affcd7da9f47f7ab1" }, 6 | "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, 7 | "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, 8 | "cmp-nvim-lua": { "branch": "main", "commit": "e3a22cb071eb9d6508a156306b102c45cd2d573d" }, 9 | "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, 10 | "conform.nvim": { "branch": "master", "commit": "ffe26e8df8115c9665d24231f8a49fadb2d611ce" }, 11 | "dashboard-nvim": { "branch": "master", "commit": "0775e567b6c0be96d01a61795f7b64c1758262f6" }, 12 | "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, 13 | "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, 14 | "gitsigns.nvim": { "branch": "main", "commit": "5813e4878748805f1518cee7abb50fd7205a3a48" }, 15 | "indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" }, 16 | "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, 17 | "lspsaga.nvim": { "branch": "main", "commit": "8efe00d6aed9db6449969f889170f1a7e43101a1" }, 18 | "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, 19 | "mason-lspconfig.nvim": { "branch": "main", "commit": "c55bd8a8fb191e24176c206a7af1dd51ce7276a5" }, 20 | "mason.nvim": { "branch": "main", "commit": "57e5a8addb8c71fb063ee4acda466c7cf6ad2800" }, 21 | "menu": { "branch": "main", "commit": "7a0a4a2896b715c066cfbe320bdc048091874cc6" }, 22 | "mini.surround": { "branch": "main", "commit": "5aab42fcdcf31fa010f012771eda5631c077840a" }, 23 | "minty": { "branch": "main", "commit": "aafc9e8e0afe6bf57580858a2849578d8d8db9e0" }, 24 | "nvim-autopairs": { "branch": "master", "commit": "d9e44e54384e5b0f3536339c65484f2e41b528e3" }, 25 | "nvim-cmp": { "branch": "main", "commit": "d97d85e01339f01b842e6ec1502f639b080cb0fc" }, 26 | "nvim-jdtls": { "branch": "master", "commit": "f73731b543f5971e0da9665eb1d7ceffe1fde71f" }, 27 | "nvim-lint": { "branch": "master", "commit": "ae64d6466ed92b68353122d920e314ff2c8dd0a8" }, 28 | "nvim-lspconfig": { "branch": "master", "commit": "0044d0987ef7e624d04141d0f90d0481fd3c3663" }, 29 | "nvim-tree.lua": { "branch": "master", "commit": "eb33612bff2fb31f54946fb5dcadc89e905e81ec" }, 30 | "nvim-treesitter": { "branch": "main", "commit": "74b119812e9f82bccc2f0eca156faff0354362ae" }, 31 | "nvim-web-devicons": { "branch": "master", "commit": "8dcb311b0c92d460fac00eac706abd43d94d68af" }, 32 | "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, 33 | "render-markdown.nvim": { "branch": "main", "commit": "26097a4eb95b391d0308c1b77cce89b28bbc9916" }, 34 | "screenkey.nvim": { "branch": "main", "commit": "16390931d847b1d5d77098daccac4e55654ac9e2" }, 35 | "snacks.nvim": { "branch": "main", "commit": "fe7cfe9800a182274d0f868a74b7263b8c0c020b" }, 36 | "telescope.nvim": { "branch": "master", "commit": "e69b434b968a33815e2f02a5c7bd7b8dd4c7d4b2" }, 37 | "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, 38 | "typescript-tools.nvim": { "branch": "master", "commit": "c2f5910074103705661e9651aa841e0d7eea9932" }, 39 | "ui": { "branch": "v3.0", "commit": "bea2af0a76c1098fac0988ad296aa028cad2a333" }, 40 | "vim-illuminate": { "branch": "master", "commit": "0d1e93684da00ab7c057410fecfc24f434698898" }, 41 | "vim-matchup": { "branch": "master", "commit": "1c276e12b49a83c1bdca74351187b8adea5da4b9" }, 42 | "volt": { "branch": "main", "commit": "620de1321f275ec9d80028c68d1b88b409c0c8b1" }, 43 | "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } 44 | } 45 | -------------------------------------------------------------------------------- /nvim/lua/plugins/cmp.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "hrsh7th/nvim-cmp", 3 | event = "InsertEnter", 4 | dependencies = { 5 | { 6 | "L3MON4D3/LuaSnip", 7 | event = "InsertEnter", 8 | dependencies = "rafamadriz/friendly-snippets", 9 | 10 | opts = { 11 | history = true, 12 | updateevents = "TextChanged,TextChangedI", 13 | }, 14 | 15 | config = function(_, opts) 16 | local ls = require("luasnip") 17 | ls.config.set_config(opts) 18 | 19 | require("luasnip.loaders.from_vscode").lazy_load() 20 | require("luasnip.loaders.from_snipmate").lazy_load() 21 | require("luasnip.loaders.from_lua").lazy_load() 22 | end, 23 | }, 24 | 25 | { 26 | "windwp/nvim-autopairs", 27 | event = "InsertEnter", 28 | 29 | opts = { 30 | fast_wrap = {}, 31 | disable_filetype = { "TelescopePrompt", "vim" }, 32 | }, 33 | 34 | config = function(_, opts) 35 | local npairs = require("nvim-autopairs") 36 | npairs.setup(opts) 37 | 38 | local cmp_ok, cmp = pcall(require, "cmp") 39 | if cmp_ok then 40 | local cmp_ap = require("nvim-autopairs.completion.cmp") 41 | cmp.event:on("confirm_done", cmp_ap.on_confirm_done()) 42 | end 43 | end, 44 | }, 45 | 46 | { "hrsh7th/cmp-nvim-lsp", lazy = true }, 47 | { "hrsh7th/cmp-nvim-lua", ft = "lua" }, 48 | { "saadparwaiz1/cmp_luasnip", event = "InsertEnter" }, 49 | { "hrsh7th/cmp-buffer", event = "InsertEnter" }, 50 | { "https://codeberg.org/FelipeLema/cmp-async-path.git", event = "InsertEnter" }, 51 | }, 52 | 53 | opts = function() 54 | local cmp = require("cmp") 55 | 56 | local disabled_ft = { 57 | ["TelescopePrompt"] = true, 58 | ["snacks_picker_input"] = true, 59 | ["copilot-chat"] = true, 60 | ["markdown"] = true, 61 | } 62 | 63 | local options = { 64 | completion = { completeopt = "menu,menuone,noselect" }, 65 | 66 | enabled = function() 67 | return not disabled_ft[vim.bo.filetype] 68 | end, 69 | 70 | snippet = { 71 | expand = function(args) 72 | require("luasnip").lsp_expand(args.body) 73 | end, 74 | }, 75 | 76 | mapping = { 77 | [""] = cmp.mapping.select_prev_item(), 78 | [""] = cmp.mapping.select_next_item(), 79 | [""] = cmp.mapping.scroll_docs(-4), 80 | [""] = cmp.mapping.scroll_docs(4), 81 | [""] = cmp.mapping.complete(), 82 | [""] = cmp.mapping.close(), 83 | 84 | [""] = cmp.mapping.confirm({ 85 | behavior = cmp.ConfirmBehavior.Insert, 86 | select = false, 87 | }), 88 | 89 | -- NOTE: might need later? idk 90 | -- [""] = cmp.mapping(function(fallback) 91 | -- if require("luasnip").expand_or_jumpable() then 92 | -- require("luasnip").expand_or_jump() 93 | -- else 94 | -- fallback() 95 | -- end 96 | -- end, { "i", "s" }), 97 | 98 | [""] = cmp.mapping(function(fallback) 99 | if cmp.visible() then 100 | cmp.select_next_item() 101 | else 102 | fallback() 103 | end 104 | end, { "i", "s" }), 105 | 106 | [""] = cmp.mapping(function(fallback) 107 | if cmp.visible() then 108 | cmp.select_prev_item() 109 | else 110 | fallback() 111 | end 112 | end, { "i", "s" }), 113 | }, 114 | 115 | sources = cmp.config.sources({ 116 | { name = "nvim_lsp", priority = 10 }, 117 | { name = "luasnip", priority = 9 }, 118 | { name = "buffer", keyword_length = 3, max_item_count = 10 }, 119 | { name = "nvim_lua", priority = 7 }, 120 | { name = "async_path", priority = 6 }, 121 | }), 122 | 123 | experimental = { 124 | ghost_text = false, 125 | }, 126 | } 127 | 128 | options = vim.tbl_deep_extend("force", require("nvchad.cmp"), options) 129 | cmp.setup(options) 130 | end, 131 | } 132 | -------------------------------------------------------------------------------- /yazi/flavors/modified-gruvbox.yazi/flavor.toml: -------------------------------------------------------------------------------- 1 | # vim:fileencoding=utf-8:foldmethod=marker 2 | 3 | # : Manager {{{ 4 | 5 | [mgr] 6 | cwd = { fg = "#83a598" } 7 | 8 | # Hovered 9 | hovered = { reversed = true, bold = true } 10 | # hovered = { bg = "#3c3836", bold = true } 11 | preview_hovered = { underline = false } 12 | 13 | # Find 14 | find_keyword = { fg = "#b8bb26", italic = true } 15 | find_position = { fg = "#fe8019", bg = "reset", italic = true } 16 | 17 | # Marker 18 | marker_copied = { fg = "#83A598", bg = "#83A598" } 19 | marker_cut = { fg = "#D3869B", bg = "#D3869B" } 20 | marker_marked = { fg = "#FD7F18", bg = "#FD7F18" } 21 | marker_selected = { fg = "#FABD2F", bg = "#FABD2F" } 22 | 23 | # Count 24 | count_copied = { fg = "#282828", bg = "#83A598" } 25 | count_cut = { fg = "#282828", bg = "#d3869b" } 26 | count_selected = { fg = "#282828", bg = "#fbf1c7" } 27 | 28 | # Border 29 | border_symbol = " " 30 | border_style = { fg = "#83A598" } 31 | 32 | # Tabs 33 | [tabs] 34 | active = { fg = "#282828", bg = "#83A598" } 35 | inactive = { fg = "#fbf1c7", bg = "#282828" } 36 | sep_inner = { open = "", close = "" } 37 | sep_outer = { open = "", close = "" } 38 | 39 | # : }}} 40 | 41 | # : Mode {{{ 42 | 43 | [mode] 44 | normal_main = { fg = "#282828", bg = "#83A598", bold = true } 45 | normal_alt = { fg = "#D8C9A4", bg = "#3D3D3D" } 46 | select_main = { fg = "#282828", bg = "#fe8019", bold = true } 47 | select_alt = { fg = "#D8C9A4", bg = "#3D3D3D" } 48 | unset_main = { fg = "#282828", bg = "#b8bb26", bold = true } 49 | unset_alt = { fg = "#D8C9A4", bg = "#3D3D3D" } 50 | 51 | # : }}} 52 | 53 | # : Status {{{ 54 | 55 | [status] 56 | sep_left = { open = "", close = "" } 57 | sep_right = { open = "", close = "" } 58 | overall = { fg = "#c8c093", bg = "#32302F" } 59 | 60 | # Progress 61 | progress_label = { fg = "#ebdbb2", bold = true } 62 | progress_normal = { fg = "#504945", bg = "#3c3836" } 63 | progress_error = { fg = "#fb4934", bg = "#3c3836" } 64 | 65 | # Permissions 66 | perm_type = { fg = "#c8c093" } 67 | perm_read = { fg = "#83A598" } 68 | perm_write = { fg = "#b8bb26" } 69 | perm_exec = { fg = "#CC241D" } 70 | perm_sep = { fg = "#c8c093" } 71 | 72 | # : }}} 73 | 74 | # : Select {{{ 75 | 76 | [pick] 77 | border = { fg = "#83a598" } 78 | active = { fg = "#d3869b", bold = true } 79 | inactive = {} 80 | 81 | # : }}} 82 | 83 | # : Input {{{ 84 | 85 | [input] 86 | border = { fg = "#83a598" } 87 | title = {} 88 | value = {} 89 | selected = { reversed = true } 90 | 91 | # : }}} 92 | 93 | # : Tasks {{{ 94 | 95 | [tasks] 96 | border = { fg = "#83A598" } 97 | title = {} 98 | hovered = { underline = true } 99 | 100 | # : }}} 101 | 102 | # : Which {{{ 103 | 104 | [which] 105 | mask = { bg = "#3c3836" } 106 | cand = { fg = "#83a598" } 107 | rest = { fg = "#928374" } 108 | desc = { fg = "#fe8019" } 109 | separator = "  " 110 | separator_style = { fg = "#83A598" } 111 | 112 | # : }}} 113 | 114 | # : Help {{{ 115 | 116 | [help] 117 | on = { fg = "#83a598" } 118 | run = { fg = "#d3869b" } 119 | hovered = { reversed = true, bold = true } 120 | footer = { fg = "#3c3836", bg = "#a89984" } 121 | 122 | # : }}} 123 | 124 | # : Notify {{{ 125 | 126 | [notify] 127 | title_info = { fg = "#83A598" } 128 | title_warn = { fg = "#fbf1c7" } 129 | title_error = { fg = "#d3869b" } 130 | 131 | # : }}} 132 | 133 | # : Confirmation {{{ 134 | 135 | [confirm] 136 | border = { fg = "#83a598" } 137 | title = { fg = "#83a598" } 138 | content = { fg = "#fbf1c7" } 139 | list = { fg = "#ebdbb2" } 140 | btn_yes = { reversed = true, fg = "#83a598" } 141 | btn_no = {} 142 | btn_labels = [" [Y]es ", " (N)o "] 143 | 144 | # : }}} 145 | 146 | # : File-specific styles {{{ 147 | 148 | [filetype] 149 | rules = [ 150 | # Images 151 | { mime = "image/*", fg = "#d3869b" }, 152 | 153 | # Media 154 | { mime = "{audio,video}/*", fg = "#fabd2f" }, 155 | 156 | # Archives 157 | { mime = "application/*zip", fg = "#fb4934" }, 158 | { mime = "application/x-{tar,bzip*,7z-compressed,xz,rar}", fg = "#fb4934" }, 159 | 160 | # Documents 161 | { mime = "application/{pdf,doc,rtf,vnd.*}", fg = "#83A598" }, 162 | 163 | # Fallback 164 | { name = "*", fg = "#ebdbb2" }, 165 | { name = "*/", fg = "#83A598" }, 166 | ] 167 | 168 | # : }}} 169 | 170 | # : Spotlight {{{ 171 | 172 | [spot] 173 | border = { fg = "#83a598" } 174 | title = { fg = "#83a598" } 175 | tbl_col = { fg = "#83a598", bold = true } 176 | tbl_cell = { fg = "#ebdbb2" } 177 | 178 | # : }}} 179 | 180 | # : Completion {{{ 181 | 182 | [cmp] 183 | border = { fg = "#83a598" } 184 | active = { reversed = true, fg = "#83a598" } 185 | inactive = { fg = "#ebdbb2" } 186 | 187 | # : }}} 188 | -------------------------------------------------------------------------------- /hypr/core/binds.conf: -------------------------------------------------------------------------------- 1 | $mainMod = SUPER 2 | 3 | bind = $mainMod, RETURN, exec, $terminal 4 | bind = $mainMod, E, exec, $filemanager 5 | bind = $mainMod, D, exec, $launcher 6 | bind = $mainMod, T, exec, $terminal 7 | bind = $mainMod, L, exec, $lockscreen 8 | bind = $mainMod, N, exec, $notifpanel 9 | bind = $mainMod, S, exec, $websearch 10 | bind = $mainMod, K, exec, $passmanager 11 | # bind = $mainMod, V, exec, $ide 12 | bind = $mainMod, F, fullscreen 13 | bind = $mainMod SHIFT, F, exec, hyprctl dispatch fullscreenstate 0 2 14 | bind = $mainMod SHIFT, Q, killactive 15 | bind = $mainMod SHIFT CTRL, Q, forcekillactive 16 | bind = $mainMod SHIFT, SPACE, togglefloating 17 | bind = $mainMod SHIFT, Z, exec, $zen 18 | bind = ,XF86PowerOff, exec, $powermenu 19 | 20 | # Prevent accidental dragging 21 | binds { 22 | drag_threshold = 5 23 | } 24 | 25 | # Move and resize windows with mouse 26 | bindm = $mainMod, mouse:272, movewindow 27 | bindm = $mainMod, mouse:273, resizewindow 28 | 29 | # Zoom out/in 30 | bind = $mainMod SHIFT, mouse_up, exec, $zoom out 31 | bind = $mainMod SHIFT, mouse_down, exec, $zoom in 32 | 33 | # Change focus on windows 34 | bind = CTRL ALT, TAB, cyclenext 35 | bind = CTRL ALT SHIFT, TAB, cyclenext, prev 36 | bind = CTRL ALT, TAB, bringactivetotop 37 | bind = CTRL ALT SHIFT, TAB, bringactivetotop 38 | 39 | # To go to previous workspace 40 | bind = $mainMod, TAB, workspace, previous 41 | 42 | # Move focus with mainMod + arrow keys 43 | bind = $mainMod, left, movefocus, l 44 | bind = $mainMod, right, movefocus, r 45 | bind = $mainMod, up, movefocus, u 46 | bind = $mainMod, down, movefocus, d 47 | 48 | # Move window 49 | bind = $mainMod SHIFT, left, movewindow, l 50 | bind = $mainMod SHIFT, right, movewindow, r 51 | bind = $mainMod SHIFT, up, movewindow, u 52 | bind = $mainMod SHIFT, down, movewindow, d 53 | 54 | # Move windows (floating) 55 | binde = $mainMod CTRL, left, moveactive, -40 0 56 | binde = $mainMod CTRL, right, moveactive, 40 0 57 | binde = $mainMod CTRL, up, moveactive, 0 -40 58 | binde = $mainMod CTRL, down, moveactive, 0 40 59 | 60 | # Special workspace (scratchpad) 61 | workspace = special:window, gapsin:3, gapsout:120 240 120 240 62 | bind = $mainMod, W, togglespecialworkspace, window 63 | bind = $mainMod SHIFT, W, movetoworkspace, special:window 64 | 65 | # minimize (kinda) 66 | workspace = special:minimize, gapsin:2, gapsout:5, border:false 67 | bind = $mainMod, X, movetoworkspacesilent, special:minimize 68 | bind = $mainMod, grave, togglespecialworkspace, minimize 69 | 70 | # Scroll through existing workspaces 71 | bind = $mainMod, mouse_down, workspace, e-1 72 | bind = $mainMod, mouse_up, workspace, e+1 73 | bind = $mainMod ALT, right, workspace, e+1 74 | bind = $mainMod ALT, left, workspace, e-1 75 | 76 | # Switch workspaces with mainMod + [0-9] 77 | bind = $mainMod, 1, workspace, 1 78 | bind = $mainMod, 2, workspace, 2 79 | bind = $mainMod, 3, workspace, 3 80 | bind = $mainMod, 4, workspace, 4 81 | bind = $mainMod, 5, workspace, 5 82 | bind = $mainMod, 6, workspace, 6 83 | bind = $mainMod, 7, workspace, 7 84 | bind = $mainMod, 8, workspace, 8 85 | bind = $mainMod, 9, workspace, 9 86 | bind = $mainMod, 0, workspace, 10 87 | bind = $mainMod, F1, workspace, 11 88 | bind = $mainMod, F2, workspace, 12 89 | bind = $mainMod, F3, workspace, 13 90 | 91 | # Move active window to a workspace with mainMod + SHIFT + [0-9] 92 | bind = $mainMod SHIFT, 1, movetoworkspace, 1 93 | bind = $mainMod SHIFT, 2, movetoworkspace, 2 94 | bind = $mainMod SHIFT, 3, movetoworkspace, 3 95 | bind = $mainMod SHIFT, 4, movetoworkspace, 4 96 | bind = $mainMod SHIFT, 5, movetoworkspace, 5 97 | bind = $mainMod SHIFT, 6, movetoworkspace, 6 98 | bind = $mainMod SHIFT, 7, movetoworkspace, 7 99 | bind = $mainMod SHIFT, 8, movetoworkspace, 8 100 | bind = $mainMod SHIFT, 9, movetoworkspace, 9 101 | bind = $mainMod SHIFT, 0, movetoworkspace, 10 102 | bind = $mainMod SHIFT, F1, movetoworkspace, 11 103 | bind = $mainMod SHIFT, F2, movetoworkspace, 12 104 | bind = $mainMod SHIFT, F3, movetoworkspace, 13 105 | 106 | # Laptop multimedia keys for volume, mute, brightness (script required) 107 | bindel = ,XF86AudioRaiseVolume, exec, $mediactl volume-up 108 | bindel = ,XF86AudioLowerVolume, exec, $mediactl volume-down 109 | bindel = ,XF86AudioMute, exec, $mediactl mute 110 | bindel = ,XF86AudioMicMute, exec, $mediactl mic-mute 111 | bindel = ,XF86MonBrightnessUp, exec, $mediactl brightness-up 112 | bindel = ,XF86MonBrightnessDown, exec, $mediactl brightness-down 113 | 114 | # Requires playerctl 115 | bindl = , XF86AudioNext, exec, playerctl next 116 | bindl = , XF86AudioPause, exec, playerctl play-pause 117 | bindl = , XF86AudioPlay, exec, playerctl play-pause 118 | bindl = , XF86AudioPrev, exec, playerctl previous 119 | 120 | -------------------------------------------------------------------------------- /yazi/plugins/restore.yazi/README.md: -------------------------------------------------------------------------------- 1 | # restore.yazi 2 | 3 | 4 | 5 | - [restore.yazi](#restoreyazi) 6 | - [Requirements](#requirements) 7 | - [Installation](#installation) 8 | - [Linux](#linux) 9 | - [Usage](#usage) 10 | 11 | 12 | [Yazi](https://github.com/sxyazi/yazi) plugin to restore/recover latest deleted files/folders. 13 | 14 | ## Requirements 15 | 16 | - [yazi >= v25.5.31](https://github.com/sxyazi/yazi) 17 | - [trash-cli](https://github.com/andreafrancia/trash-cli) 18 | - If you have `Can't Get Trash Directory` error and running `trash-cli --volumes` 19 | in terminal throw `AttributeError: 'PrintVolumesList' object has no attribute 'run_action'`. 20 | Remove the old version of trash-cli and install newer version [How to install](https://github.com/andreafrancia/trash-cli?tab=readme-ov-file#the-easy-way). 21 | 22 | ## Installation 23 | 24 | ### Linux 25 | 26 | ```sh 27 | ya pkg add boydaihungst/restore 28 | ``` 29 | 30 | ## Usage 31 | 32 | > [!IMPORTANT] 33 | > This plugin restores files and folders based on their deletion date and time. 34 | > However, since Yazi deletes files in batches of approximately 1000\~2000, not all files in a large selection will have the same deletion timestamp. 35 | > For example, if you select and delete 10,000 files, each batch of 1000\~2000 may have a different deletion time. This can result in only a partial restoration of your files (in the worst case, only the last 1000\~2000 files deleted). 36 | > To resolve this, you may need to run the "restore" command multiple times until all desired files are recovered. For instance, to restore 10,000 files, you might have to execute the command up to 10 times. 37 | 38 | 1. Key binding 39 | - Add this to your `keymap.toml`. Make it doesn't override other keymaps. 40 | [Read more about keymap](https://yazi-rs.github.io/docs/configuration/keymap): 41 | 42 | ```toml 43 | [mgr] 44 | prepend_keymap = [ 45 | { on = "u", run = "plugin restore", desc = "Restore last deleted files/folders" }, 46 | # or use "d + u" like me 47 | { on = ["d", "u"], run = "plugin restore", desc = "Restore last deleted files/folders" }, 48 | 49 | # Select files/folders to restore. Input item index or range separated by comma: 50 | # - Restore a trashed file: 51 | # What file to restore [0..4]: 4 52 | # - Restore multiple trashed files separated by comma, also support range: 53 | # What file to restore [0..3]: 0-2, 3 54 | 55 | # This will throw error when there is existed file/folder 56 | { on = [ "d", "U" ], run = "plugin restore -- --interactive", desc = "Restore deleted files/folders (Interactive)" }, 57 | # Or auto overwrite existed file/folder 58 | { on = [ "d", "U" ], run = "plugin restore -- --interactive --interactive-overwrite", desc = "Restore deleted files/folders (Interactive overwrite)" }, 59 | ] 60 | ``` 61 | 62 | 2. Configuration (Optional) 63 | - Default: 64 | 65 | ```lua 66 | require("restore"):setup({ 67 | -- Set the position for confirm and overwrite prompts. 68 | -- Don't forget to set height: `h = xx` 69 | -- https://yazi-rs.github.io/docs/plugins/utils/#ya.input 70 | position = { "center", w = 70, h = 40 }, -- Optional 71 | 72 | -- Show confirm prompt before restore. 73 | -- NOTE: even if set this to false, overwrite prompt still pop up 74 | show_confirm = true, -- Optional 75 | 76 | -- Suppress success notification when all files or folder are restored. 77 | suppress_success_notification = true, -- Optional 78 | 79 | -- colors for confirm and overwrite prompts 80 | theme = { -- Optional 81 | -- Default using style from your flavor or theme.lua -> [confirm] -> title. 82 | -- If you edit flavor or theme.lua you can add more style than just color. 83 | -- Example in theme.lua -> [confirm]: title = { fg = "blue", bg = "green" } 84 | title = "blue", -- Optional. This value has higher priority than flavor/theme.lua 85 | 86 | -- Default using style from your flavor or theme.lua -> [confirm] -> content 87 | -- Sample logic as title above 88 | header = "green", -- Optional. This value has higher priority than flavor/theme.lua 89 | 90 | -- header color for overwrite prompt 91 | -- Default using color "yellow" 92 | header_warning = "yellow", -- Optional 93 | -- Default using style from your flavor or theme.lua -> [confirm] -> list 94 | -- Sample logic as title and header above 95 | list_item = { odd = "blue", even = "blue" }, -- Optional. This value has higher priority than flavor/theme.lua 96 | }, 97 | }) 98 | ``` 99 | -------------------------------------------------------------------------------- /nvim/lua/plugins/lspsaga.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "nvimdev/lspsaga.nvim", 3 | event = "LspAttach", 4 | dependencies = { 5 | "nvim-treesitter/nvim-treesitter", 6 | "nvim-tree/nvim-web-devicons", 7 | }, 8 | config = function() 9 | require("lspsaga").setup({ 10 | hover = { 11 | max_width = 0.5, 12 | }, 13 | lightbulb = { 14 | enable = false, 15 | sign = true, 16 | virtual_text = false, 17 | debounce = 10, 18 | sign_priority = 40, 19 | }, 20 | ui = { 21 | code_action = "", 22 | border = "single", 23 | title = true, 24 | expand = "", 25 | collapse = "", 26 | actionfix = " ", 27 | lines = { "", "", "│", "", "" }, 28 | imp_sign = "󰳛 ", 29 | }, 30 | finder = { 31 | max_height = 0.5, 32 | left_width = 0.5, 33 | right_width = 0.5, 34 | default = "ref+def+imp", 35 | layout = "normal", 36 | silent = true, 37 | keys = { 38 | vsplit = "v", 39 | split = "s", 40 | toggle_or_open = "", 41 | shuttle = "", 42 | quit = "q", 43 | }, 44 | }, 45 | definition = { 46 | keys = { 47 | edit = "", 48 | vsplit = "v", 49 | split = "s", 50 | }, 51 | }, 52 | rename = { 53 | in_select = false, 54 | quit = "", 55 | }, 56 | diagnostic = { 57 | extend_relatedInformation = true, 58 | show_layout = "normal", 59 | keys = { 60 | quit = "q", 61 | toggle_or_jump = "", 62 | }, 63 | }, 64 | }) 65 | 66 | -- Lspsaga keymaps setup in LspAttach autocmd 67 | vim.api.nvim_create_autocmd("LspAttach", { 68 | callback = function(args) 69 | local buffer = args.buf 70 | local map = require("utils.map") 71 | 72 | map("n", "gr", "Lspsaga finder", { 73 | buffer = buffer, 74 | desc = "Find References", 75 | }) 76 | 77 | map("n", "gd", "Lspsaga goto_definition", { 78 | buffer = buffer, 79 | desc = "Go to Definition", 80 | }) 81 | map("n", "gi", "Lspsaga finder imp", { 82 | buffer = buffer, 83 | desc = "Go to Implementation", 84 | }) 85 | map("n", "gy", "Lspsaga goto_type_definition", { 86 | buffer = buffer, 87 | desc = "Go to Type Definition", 88 | }) 89 | 90 | map("n", "gD", "Lspsaga peek_definition", { 91 | buffer = buffer, 92 | desc = "Peek Definition", 93 | }) 94 | map("n", "gT", "Lspsaga peek_type_definition", { 95 | buffer = buffer, 96 | desc = "Peek Type Definition", 97 | }) 98 | map("n", "", "Lspsaga peek_definition", { 99 | buffer = buffer, 100 | desc = "Peek Definition", 101 | }) 102 | 103 | map({ "n", "v" }, "la", "Lspsaga code_action", { 104 | buffer = buffer, 105 | desc = "Code Actions", 106 | }) 107 | 108 | map("n", "lr", "Lspsaga rename", { 109 | buffer = buffer, 110 | desc = "Rename Symbol", 111 | }) 112 | 113 | map("n", "", "Lspsaga hover_doc", { 114 | buffer = buffer, 115 | desc = "Hover Documentation", 116 | }) 117 | 118 | map("n", "[d", "Lspsaga diagnostic_jump_prev", { 119 | buffer = buffer, 120 | desc = "Previous Diagnostic", 121 | }) 122 | map("n", "]d", "Lspsaga diagnostic_jump_next", { 123 | buffer = buffer, 124 | desc = "Next Diagnostic", 125 | }) 126 | 127 | map("n", "ld", "Lspsaga show_buf_diagnostics ++unfocus", { 128 | buffer = buffer, 129 | desc = "Show Line Diagnostics", 130 | }) 131 | map("n", "lD", "Lspsaga show_workspace_diagnostics", { 132 | buffer = buffer, 133 | desc = "Show Cursor Diagnostics", 134 | }) 135 | 136 | map("n", "ls", "Lspsaga outline", { 137 | buffer = buffer, 138 | desc = "Outline/Symbols Browser", 139 | }) 140 | map("n", "li", "Lspsaga incoming_calls", { 141 | buffer = buffer, 142 | desc = "Incoming Calls", 143 | }) 144 | map("n", "lo", "Lspsaga outgoing_calls", { 145 | buffer = buffer, 146 | desc = "Outgoing Calls", 147 | }) 148 | end, 149 | }) 150 | end, 151 | } 152 | -------------------------------------------------------------------------------- /tmux/.tmux.conf: -------------------------------------------------------------------------------- 1 | # ======================================== 2 | # R4PPZ TMUX CONFIGURATION # 3 | # ======================================== 4 | 5 | # INITIAL SETUP INSTRUCTIONS 6 | # ========================= 7 | # For fresh installation: 8 | # 1. Install TPM: git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm 9 | # 2. Copy/Use or symlink this config to ~/.tmux.conf 10 | # 3. Reload config: tmux source-file ~/.tmux.conf 11 | # 4. Install plugins: prefix (Ctrl+Space) + I 12 | 13 | # ======================================== 14 | # CORE SETTINGS # 15 | # ======================================== 16 | 17 | # Change prefix to Ctrl+Space 18 | set -g prefix C-Space 19 | unbind C-b 20 | bind C-Space send-prefix 21 | 22 | # Performance & behavior settings 23 | set -g history-limit 10000 24 | set -g escape-time 10 25 | set -g detach-on-destroy on 26 | set -g mouse on 27 | set -g aggressive-resize on 28 | set -g mode-keys vi 29 | set -g focus-events on 30 | set -g visual-activity off 31 | 32 | # Terminal settings & color support 33 | set -g default-terminal "tmux-256color" 34 | set -ga terminal-overrides ",tmux-256color:RGB" 35 | set -ga terminal-overrides ",xterm-kitty:RGB,kitty*:RGB" 36 | set -g allow-passthrough on 37 | set -ga terminal-features 'xterm-kitty:kkp' 38 | 39 | # Quick reload config 40 | bind r source-file ~/.tmux.conf \; display-message "Config reloaded!" 41 | 42 | # ======================================== 43 | # COPY MODE & BINDINGS # 44 | # ======================================== 45 | 46 | # Copy-mode settings 47 | bind Enter copy-mode 48 | bind -T copy-mode-vi Escape send-keys -X cancel 49 | 50 | # Word navigation bindings 51 | bind -T copy-mode-vi C-Left send-keys -X previous-word 52 | bind -T copy-mode-vi C-Right send-keys -X next-word-end 53 | 54 | # Visual selection bindings 55 | bind -T copy-mode-vi v send-keys -X begin-selection 56 | bind -T copy-mode-vi V send-keys -X select-line 57 | bind -T copy-mode-vi C-v send-keys -X begin-selection \; send-keys -X rectangle-toggle 58 | 59 | # Wayland clipboard integration 60 | bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy && wl-paste -n | wl-copy -p" 61 | bind p run "wl-paste -n | tmux load-buffer - ; tmux paste-buffer" 62 | 63 | # ======================================== 64 | # PANE MANAGEMENT # 65 | # ======================================== 66 | 67 | # Pane splits 68 | unbind % 69 | unbind '"' 70 | bind | split-window -h -c "#{pane_current_path}" 71 | bind - split-window -v -c "#{pane_current_path}" 72 | 73 | # Pane navigation with Alt+Arrow (no prefix) 74 | bind Left select-pane -L 75 | bind Right select-pane -R 76 | bind Up select-pane -U 77 | bind Down select-pane -D 78 | 79 | # Pane border styling 80 | set -g pane-border-style 'fg=#83a599' 81 | set -g pane-active-border-style 'fg=#83a599' 82 | 83 | # Fullscreen a pane 84 | bind f resize-pane -Z 85 | 86 | # ======================================== 87 | # WINDOW MANAGEMENT # 88 | # ======================================== 89 | 90 | set -g renumber-windows on 91 | set -g allow-rename off 92 | bind , command-prompt "rename-window %%" 93 | 94 | bind c run-shell ' \ 95 | tmux new-window -n "CMD" -c "#{pane_current_path}" \ 96 | ' 97 | 98 | bind x kill-pane 99 | bind q kill-pane 100 | bind d detach 101 | 102 | # Quick window selection with Alt+number (no prefix) 103 | bind -n M-1 select-window -t :0 104 | bind -n M-2 select-window -t :1 105 | bind -n M-3 select-window -t :2 106 | bind -n M-4 select-window -t :3 107 | bind -n M-5 select-window -t :4 108 | bind -n M-6 select-window -t :5 109 | bind -n M-7 select-window -t :6 110 | bind -n M-8 select-window -t :7 111 | bind -n M-9 select-window -t :8 112 | 113 | # Pop-up terminal using alt+p (no prefix) 114 | # bind -n M-p display-popup \ 115 | # -d "#{pane_current_path}" \ 116 | # -w 70% \ 117 | # -h 70% 118 | 119 | bind -n M-p run-shell "$HOME/Arch-dotfiles/scripts/tmux-popup.sh" 120 | 121 | # ======================================== 122 | # VISUAL STYLING # 123 | # ======================================== 124 | 125 | # Status bar base styling 126 | set -g status on 127 | set -g status-position bottom 128 | set -g status-interval 5 129 | set -g status-justify left 130 | set -g status-bg '#32302F' 131 | set -g status-fg '#ebdbb2' 132 | 133 | # Window appearance in status bar 134 | setw -g window-status-format '#[bg=#3D3D3D,fg=#ebdbb2]  #W ' 135 | setw -g window-status-current-format '#[bg=#83a598,fg=#282828,bold]  #W ' 136 | setw -g window-status-separator '' 137 | 138 | # Message styling 139 | set -g message-style 'fg=#83a598,bg=#282828,bold' 140 | 141 | # Status line content 142 | set -g status-left-length 100 143 | set -g status-right-length 100 144 | set -g status-left "" 145 | set -g status-right '#{prefix_highlight}' 146 | 147 | # ======================================== 148 | # PLUGINS # 149 | # ======================================== 150 | 151 | # List of plugins 152 | set -g @plugin 'tmux-plugins/tpm' 153 | set -g @plugin 'tmux-plugins/tmux-resurrect' 154 | set -g @plugin 'tmux-plugins/tmux-yank' 155 | set -g @plugin 'tmux-plugins/tmux-prefix-highlight' 156 | set -g @plugin 'nhdaly/tmux-better-mouse-mode' 157 | set -g @plugin 'tmux-plugins/tmux-open' 158 | 159 | # Plugin: prefix-highlight configuration 160 | set -g @prefix_highlight_fg '#3D3D3D' 161 | set -g @prefix_highlight_bg '#83a598,bold' 162 | set -g @prefix_highlight_show_copy_mode 'on' 163 | set -g @prefix_highlight_show_sync_mode 'on' 164 | set -g @prefix_highlight_copy_mode_attr 'fg=#282828,bg=#fabd2f,bold' 165 | set -g @prefix_highlight_sync_mode_attr 'fg=#282828,bg=#b8bb26,bold' 166 | set -g @prefix_highlight_prefix_prompt 'WAIT' 167 | set -g @prefix_highlight_copy_prompt 'COPY' 168 | set -g @prefix_highlight_sync_prompt 'SYNC' 169 | set -g @prefix_highlight_empty_prompt ' ' 170 | 171 | # Plugin: tmux-open configuration 172 | set -g @open-S 'https://duckduckgo.com/?q=' 173 | 174 | # Initialize TMUX Plugin Manager (keep at the very end) 175 | run '~/.tmux/plugins/tpm/tpm' 176 | -------------------------------------------------------------------------------- /waybar/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | padding: 0; 3 | margin: 0; 4 | min-height: 0; 5 | border-radius: 0px; 6 | border: none; 7 | text-shadow: none; 8 | transition: none; 9 | box-shadow: none; 10 | } 11 | 12 | window#waybar { 13 | background: #282828; 14 | } 15 | 16 | window#waybar.hidden { 17 | opacity: 0.98; 18 | } 19 | 20 | #custom-cputemp, 21 | #workspaces button, 22 | #workspaces button:hover, 23 | #workspaces button.visible, 24 | #workspaces button.visible:hover, 25 | #workspaces button.active, 26 | #workspaces button.active:hover, 27 | #workspaces button.urgent, 28 | #workspaces button.special, 29 | #workspaces button.special.active, 30 | #window, 31 | #tray, 32 | #disk, 33 | #cpu, 34 | #temperature, 35 | #temperature.critical, 36 | #backlight, 37 | #custom-memory, 38 | #pulseaudio, 39 | #pulseaudio.muted, 40 | #battery, 41 | #battery.critical, 42 | #battery.warning, 43 | #clock, 44 | #custom-web-links, 45 | #power-profiles-daemon, 46 | #custom-power-button, 47 | #custom-rofi, 48 | #memory, 49 | #submap { 50 | font-family: JetBrainsMono Nerd Font; 51 | font-size: 9px; 52 | font-weight: 800; 53 | color: #282828; 54 | /* background: #282828; */ 55 | /* border: 4px solid #282828; */ 56 | /* border-radius: 0px; */ 57 | } 58 | 59 | #custom-cputemp, 60 | #window, 61 | #tray, 62 | #disk, 63 | #cpu, 64 | #temperature, 65 | #temperature.critical, 66 | #backlight, 67 | #custom-memory, 68 | #pulseaudio, 69 | #pulseaudio.muted, 70 | #battery, 71 | #battery.critical, 72 | #battery.warning, 73 | #memory { 74 | margin-right: 5px; 75 | margin-left: 5px; 76 | } 77 | 78 | /* ================================= */ 79 | 80 | tooltip { 81 | background-color: #282828; 82 | color: #ebdbb2; 83 | padding: 5px 10px; 84 | border: 1px solid #504945; 85 | border-radius: 2px; 86 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); 87 | } 88 | 89 | /* ================================= */ 90 | 91 | #workspaces button { 92 | color: #ebdbb2; 93 | border-radius: 0.7px; 94 | margin-bottom: 3px; 95 | margin-top: 3px; 96 | margin-right: 4px; 97 | margin-left: 4px; 98 | min-width: 30px; 99 | } 100 | 101 | #workspaces button:hover { 102 | background: #83a598; 103 | } 104 | 105 | #workspaces button.visible { 106 | background: #83a598; 107 | } 108 | 109 | #workspaces button.visible:hover { 110 | background: #83a598; 111 | } 112 | 113 | #workspaces button.active { 114 | background: #83a598; 115 | } 116 | 117 | #workspaces button.active:hover { 118 | background: #83a598; 119 | } 120 | 121 | #workspaces button.urgent { 122 | background: #ea6962; 123 | } 124 | 125 | /* ================================= */ 126 | 127 | #workspaces button.special { 128 | background-color: #d65d0e; 129 | } 130 | 131 | #workspaces button.special:hover { 132 | background-color: #83a598; 133 | } 134 | 135 | #workspaces button.special.active { 136 | background-color: #fe8019; 137 | } 138 | 139 | #workspaces button.special.active:hover { 140 | background-color: #83a598; 141 | } 142 | 143 | /* ================================= */ 144 | 145 | #window { 146 | color: #282828; 147 | background: #83a598; 148 | border-radius: 0.7px; 149 | margin-top: 4px; 150 | margin-bottom: 4px; 151 | margin-left: 5px; 152 | margin-right: 3px; 153 | 154 | padding-left: 5px; 155 | padding-right: 5px; 156 | /* min-width: 20px; */ 157 | } 158 | 159 | window#waybar.empty #window { 160 | margin: 0; 161 | padding: 0; 162 | background: transparent; 163 | color: transparent; 164 | } 165 | 166 | /* ================================= */ 167 | 168 | #disk { 169 | color: #ea6962; 170 | } 171 | 172 | /* ================================= */ 173 | 174 | #cpu { 175 | color: #e78a4e; 176 | } 177 | 178 | /* ================================= */ 179 | 180 | #temperature { 181 | color: #d8a657; 182 | } 183 | 184 | #temperature.critical { 185 | color: #cc241d; 186 | } 187 | 188 | #custom-cputemp.normal { 189 | color: #d8a657; 190 | } 191 | #custom-cputemp.warning { 192 | color: #fe8019; 193 | } 194 | #custom-cputemp.critical { 195 | color: #cc241d; 196 | } 197 | 198 | /* ================================= */ 199 | 200 | #backlight { 201 | color: #d8a657; 202 | } 203 | 204 | /* ================================= */ 205 | 206 | #memory { 207 | color: #b8bb26; 208 | } 209 | 210 | /* ================================= */ 211 | 212 | #pulseaudio { 213 | color: #83a598; 214 | } 215 | 216 | #pulseaudio.muted { 217 | color: #ea6962; 218 | } 219 | 220 | /* ================================= */ 221 | 222 | #battery { 223 | color: #b8bb26; 224 | } 225 | 226 | #battery.critical { 227 | color: #cc241d; 228 | } 229 | 230 | #battery.warning { 231 | color: #fe8019; 232 | } 233 | 234 | #battery.full { 235 | color: #b8bb26; 236 | } 237 | 238 | #battery.charging { 239 | color: #98971a; 240 | } 241 | 242 | #battery.plugged { 243 | color: #98971a; 244 | } 245 | 246 | #battery.charging.warning { 247 | color: #d79921; 248 | } 249 | 250 | #battery.charging.critical { 251 | color: #cc241d; 252 | } 253 | 254 | /* ================================= */ 255 | 256 | #clock { 257 | color: #8ec07c; 258 | } 259 | 260 | /* ================================= */ 261 | 262 | #power-profiles-daemon { 263 | padding-left: 2px; 264 | padding-right: 2px; 265 | color: #d3869b; 266 | } 267 | 268 | /* ================================= */ 269 | 270 | #custom-power-button { 271 | color: #cc241d; 272 | margin-left: 2px; 273 | } 274 | 275 | /* ================================= */ 276 | 277 | #custom-rofi { 278 | background: #cc241d; 279 | border-radius: 0.7px; 280 | min-width: 22px; 281 | margin-left: 4px; 282 | margin-right: 4px; 283 | margin-bottom: 3px; 284 | margin-top: 3px; 285 | } 286 | 287 | /* ================================= */ 288 | 289 | #submap { 290 | background: #d79921; 291 | margin-top: 4px; 292 | margin-bottom: 4px; 293 | margin-left: 3px; 294 | margin-right: 3px; 295 | 296 | padding-left: 4px; 297 | padding-right: 4px; 298 | } 299 | 300 | /* ================================= */ 301 | 302 | #custom-notification { 303 | font-family: JetBrainsMono Nerd Font; 304 | font-size: 10px; 305 | padding: 0px 7px 0px 0px; 306 | } 307 | -------------------------------------------------------------------------------- /rofi/powermenu/main.rasi: -------------------------------------------------------------------------------- 1 | /*****----- Configuration -----*****/ 2 | configuration { 3 | show-icons: false; 4 | } 5 | 6 | /*****----- Global Properties -----*****/ 7 | @import "~/.config/rofi/shared/gruvbox.rasi" 8 | 9 | 10 | * { 11 | font: "JetBrains Mono Nerd Font 12"; 12 | /* Resolution : 1366x768 */ 13 | box-spacing: 30px; 14 | box-margin: 200px 200px; 15 | message-margin: 0px 200px; 16 | inputbar-spacing: 0px; 17 | list-spacing: 30px; 18 | general-padding: 15px; 19 | element-padding: 40px 8px; 20 | element-radius: 15px; 21 | general-radius: 80%; 22 | element-font: "feather 36"; 23 | } 24 | 25 | /*****----- Main Window -----*****/ 26 | window { 27 | /* properties for window widget */ 28 | transparency: "real"; 29 | location: center; 30 | anchor: center; 31 | fullscreen: true; 32 | width: 1366px; 33 | x-offset: 0px; 34 | y-offset: 0px; 35 | 36 | /* properties for all widgets */ 37 | enabled: true; 38 | margin: 0px; 39 | padding: 0px; 40 | border: 0px solid; 41 | border-radius: 0px; 42 | border-color: @selected; 43 | cursor: "default"; 44 | background-color: @background; 45 | } 46 | 47 | /*****----- Main Box -----*****/ 48 | mainbox { 49 | enabled: true; 50 | spacing: var(box-spacing); 51 | margin: 0px; 52 | padding: var(box-margin); 53 | border: 0px solid; 54 | border-radius: 0px; 55 | border-color: @selected; 56 | background-color: transparent; 57 | children: [ "message", "listview" ]; 58 | } 59 | 60 | /*****----- Inputbar -----*****/ 61 | inputbar { 62 | enabled: true; 63 | spacing: var(inputbar-spacing); 64 | margin: 0px; 65 | padding: 0px; 66 | border: 0px; 67 | border-radius: 0px; 68 | border-color: @selected; 69 | background-color: transparent; 70 | text-color: @foreground; 71 | children: [ "dummy", "textbox-prompt-colon", "prompt", "dummy"]; 72 | } 73 | 74 | dummy { 75 | background-color: transparent; 76 | } 77 | 78 | textbox-prompt-colon { 79 | enabled: true; 80 | expand: false; 81 | str: "SYSTEM"; 82 | padding: var(general-padding); 83 | border-radius: var(general-radius); 84 | background-color: @urgent; 85 | text-color: @background; 86 | } 87 | prompt { 88 | enabled: true; 89 | padding: var(general-padding); 90 | border-radius: var(general-radius); 91 | background-color: @active; 92 | text-color: @background; 93 | } 94 | 95 | /*****----- Message -----*****/ 96 | message { 97 | enabled: true; 98 | margin: var(message-margin); 99 | padding: var(general-padding); 100 | border: 0px; 101 | border-radius: var(general-radius); 102 | border-color: @selected; 103 | background-color: @background-alt; 104 | text-color: @foreground; 105 | } 106 | textbox { 107 | background-color: inherit; 108 | text-color: inherit; 109 | vertical-align: 0.5; 110 | horizontal-align: 0.5; 111 | placeholder-color: @foreground; 112 | blink: true; 113 | markup: true; 114 | } 115 | error-message { 116 | padding: var(general-padding); 117 | border: 0px solid; 118 | border-radius: var(general-radius); 119 | border-color: @selected; 120 | background-color: @background; 121 | text-color: @foreground; 122 | } 123 | 124 | /*****----- Listview -----*****/ 125 | listview { 126 | enabled: true; 127 | columns: 5; 128 | lines: 1; 129 | cycle: true; 130 | dynamic: true; 131 | scrollbar: false; 132 | layout: vertical; 133 | reverse: false; 134 | fixed-height: true; 135 | fixed-columns: true; 136 | 137 | spacing: var(list-spacing); 138 | margin: 0px; 139 | padding: 0px; 140 | border: 0px solid; 141 | border-radius: 0px; 142 | border-color: @selected; 143 | background-color: transparent; 144 | text-color: @foreground; 145 | cursor: "default"; 146 | } 147 | 148 | /*****----- Elements -----*****/ 149 | element { 150 | enabled: true; 151 | spacing: 0px; 152 | margin: 0px; 153 | padding: var(element-padding); 154 | border: 0px solid; 155 | border-radius: var(element-radius); 156 | border-color: @selected; 157 | background-color: @background-alt; 158 | text-color: @foreground; 159 | cursor: pointer; 160 | } 161 | element-text { 162 | font: var(element-font); 163 | background-color: transparent; 164 | text-color: inherit; 165 | cursor: inherit; 166 | vertical-align: 0.5; 167 | horizontal-align: 0.5; 168 | } 169 | element selected.normal { 170 | background-color: var(selected); 171 | text-color: var(background); 172 | } 173 | -------------------------------------------------------------------------------- /scripts/tmux-session-manager.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | import re 4 | import subprocess 5 | import sys 6 | 7 | MAIN_SESSION = "main" 8 | 9 | 10 | def get_tmux_sessions(): 11 | """Returns a list of tmux session names (strings).""" 12 | try: 13 | output = subprocess.check_output( 14 | ["tmux", "list-sessions", "-F", "#{session_name}"], 15 | stderr=subprocess.DEVNULL, 16 | ) 17 | return output.decode().splitlines() 18 | except subprocess.CalledProcessError: 19 | return [] 20 | 21 | 22 | def clear_screen(): 23 | """Clear the terminal screen.""" 24 | print("\033c", end="") 25 | 26 | 27 | def attach_tmux(session): 28 | """Attach to an existing tmux session.""" 29 | os.execvp("tmux", ["tmux", "attach", "-t", session]) 30 | 31 | 32 | def new_tmux(session): 33 | """Create (or attach to) a new tmux session. Name first window after session.""" 34 | os.execvp("tmux", ["tmux", "new-session", "-A", "-s", session, "-n", session]) 35 | 36 | 37 | def kill_tmux(session): 38 | """Kill a tmux session.""" 39 | subprocess.call(["tmux", "kill-session", "-t", session]) 40 | 41 | 42 | def print_header(): 43 | """Print the header/title of the manager.""" 44 | print("=" * 45) 45 | print(" TMUX Session Manager") 46 | print("=" * 45) 47 | print() # Add spacing after the header 48 | 49 | 50 | def print_sessions(sessions): 51 | """Print the list of sessions, highlighting MAIN_SESSION as default.""" 52 | if sessions: 53 | print("Available Sessions:") 54 | for idx, name in enumerate(sessions, 1): 55 | suffix = " (default)" if name == MAIN_SESSION else "" 56 | print(f" {idx}) {name}{suffix}") 57 | print() 58 | print(f"Press Enter to attach '{sessions[0]}'") 59 | else: 60 | print("No existing tmux sessions found.") 61 | print(f"Press Enter to create and attach to '{MAIN_SESSION}'") 62 | print() 63 | 64 | 65 | def print_options(): 66 | """Print the menu options.""" 67 | print("Options:") 68 | print(" [number] - Attach session") 69 | print(" [n] - New session") 70 | print(" [d] - Delete session") 71 | print(" [q] - Quit") 72 | print() 73 | 74 | 75 | def prompt_choice(): 76 | """Prompt the user for a menu choice.""" 77 | return input("Choice: ").strip() 78 | 79 | 80 | def prompt_new_session(): 81 | """Prompt the user for a new session name.""" 82 | print() 83 | session_name = input(f"Session name (default={MAIN_SESSION}): ").strip() 84 | print() 85 | # Sanitize: allow only alphanumeric and underscore 86 | session_name = re.sub(r"[^a-zA-Z0-9_]", "_", session_name) 87 | if not session_name: 88 | session_name = MAIN_SESSION 89 | return session_name 90 | 91 | 92 | def prompt_delete_session(sessions): 93 | """Prompt the user to select a session to delete.""" 94 | print() 95 | if not sessions: 96 | print("No sessions to delete.\n") 97 | input("Press Enter to continue...") 98 | print() 99 | return None 100 | 101 | print("Which session to delete?") 102 | for idx, name in enumerate(sessions, 1): 103 | print(f" {idx}) {name}") 104 | print() 105 | 106 | del_choice = input("Session number to delete: ").strip() 107 | print() 108 | 109 | if del_choice.isdigit(): 110 | del_idx = int(del_choice) - 1 111 | if 0 <= del_idx < len(sessions): 112 | session_to_kill = sessions[del_idx] 113 | confirm = ( 114 | input( 115 | f"Are you sure you want to delete session '{session_to_kill}'? (Y/n): " 116 | ) 117 | .strip() 118 | .lower() 119 | ) 120 | print() 121 | if confirm != "n": 122 | return session_to_kill 123 | else: 124 | print("Delete canceled.\n") 125 | input("Press Enter to continue...") 126 | print() 127 | else: 128 | print("Invalid session number.\n") 129 | input("Press Enter to continue...") 130 | print() 131 | else: 132 | print("Not a valid number.\n") 133 | input("Press Enter to continue...") 134 | print() 135 | return None 136 | 137 | 138 | def main(): 139 | if os.environ.get("TMUX"): 140 | print("Already inside tmux. Exit this tmux client to use the manager.") 141 | sys.exit(0) 142 | if subprocess.call("command -v tmux >/dev/null", shell=True) != 0: 143 | print("tmux not installed. Install it first.") 144 | sys.exit(1) 145 | 146 | while True: 147 | clear_screen() 148 | print_header() 149 | 150 | # Build session list: main session first, others after 151 | sessions_raw = get_tmux_sessions() 152 | sessions = [s for s in sessions_raw if s == MAIN_SESSION] + [ 153 | s for s in sessions_raw if s != MAIN_SESSION 154 | ] 155 | 156 | print_sessions(sessions) 157 | print_options() 158 | choice = prompt_choice() 159 | print() 160 | 161 | if choice == "": 162 | if sessions: 163 | attach_tmux(sessions[0]) 164 | else: 165 | new_tmux(MAIN_SESSION) 166 | break 167 | 168 | elif choice == "1": 169 | if sessions: 170 | attach_tmux(sessions[0]) 171 | else: 172 | new_tmux(MAIN_SESSION) 173 | break 174 | 175 | elif choice.lower() == "n": 176 | session_name = prompt_new_session() 177 | new_tmux(session_name) 178 | break 179 | 180 | elif choice.lower() == "d": 181 | session_to_delete = prompt_delete_session(sessions) 182 | if session_to_delete: 183 | kill_tmux(session_to_delete) 184 | print(f"Session '{session_to_delete}' deleted.\n") 185 | input("Press Enter to continue...") 186 | print() 187 | 188 | elif choice.lower() == "q": 189 | clear_screen() 190 | break 191 | 192 | elif choice.isdigit() and sessions and 1 <= int(choice) <= len(sessions): 193 | attach_tmux(sessions[int(choice) - 1]) 194 | break 195 | 196 | else: 197 | print("Invalid choice!\n") 198 | input("Press Enter to continue...") 199 | print() 200 | 201 | 202 | if __name__ == "__main__": 203 | main() 204 | -------------------------------------------------------------------------------- /hypr/core/submap.conf: -------------------------------------------------------------------------------- 1 | # ================================================= 2 | # Launch applications/links 3 | # ================================================= 4 | bind = $mainMod, SPACE, submap, website 5 | submap = website 6 | 7 | # Clean UI with --app option: 8 | # AI tools 9 | bind = $mainMod, V, exec, bash -c '$browser --app=https://copilot.microsoft.com/ & disown; hyprctl dispatch submap reset' 10 | bind = $mainMod, K, exec, bash -c '$browser --app=https://www.kimi.com/ & disown; hyprctl dispatch submap reset' 11 | bind = $mainMod, X, exec, bash -c '$browser --app=https://github.com/copilot & disown; hyprctl dispatch submap reset' 12 | bind = $mainMod, C, exec, bash -c '$browser --app=https://chatgpt.com/?temporary-chat=true & disown; hyprctl dispatch submap reset' 13 | bind = $mainMod, P, exec, bash -c '$browser --app=https://www.perplexity.ai/ & disown; hyprctl dispatch submap reset' 14 | bind = $mainMod, G, exec, bash -c '$browser --app=https://gemini.google.com/app & disown; hyprctl dispatch submap reset' 15 | bind = $mainMod, D, exec, bash -c '$browser --app=https://chat.deepseek.com/ & disown; hyprctl dispatch submap reset' 16 | bind = $mainMod, N, exec, bash -c '$browser --app=https://notebooklm.google.com/ & disown; hyprctl dispatch submap reset' 17 | bind = $mainMod, Q, exec, bash -c '$browser --app=https://chat.qwen.ai/?temporary-chat=true & disown; hyprctl dispatch submap reset' 18 | 19 | bind = $mainMod, R, exec, bash -c '$browser --app=https://doc.rust-lang.org/book & disown; hyprctl dispatch submap reset' 20 | bind = $mainMod, O, exec, bash -c '$browser --app=https://www.theodinproject.com/dashboard & disown; hyprctl dispatch submap reset' 21 | bind = $mainMod SHIFT, D, exec, bash -c '$browser --app=https://devdocs.io/ & disown; hyprctl dispatch submap reset' 22 | 23 | # Others 24 | bind = $mainMod, F, exec, bash -c '$browser --app=https://www.facebook.com/messages & disown; hyprctl dispatch submap reset' 25 | bind = $mainMod, Y, exec, bash -c '$browser --app=https://www.youtube.com/ & disown; hyprctl dispatch submap reset' 26 | bind = $mainMod, M, exec, bash -c '$browser --app=https://movielair.cc/ & disown; hyprctl dispatch submap reset' 27 | bind = $mainMod SHIFT, S, exec, bash -c '$browser --app=https://open.spotify.com/ & disown; hyprctl dispatch submap reset' 28 | 29 | bind = $mainMod, S, exec, bash -c '$browserForSchool --app=https://classroom.google.com & disown; hyprctl dispatch submap reset' 30 | 31 | # Normal website UI 32 | # AI tools 33 | bind = , T, exec, bash -c '$browser --new-tab https://chatgpt.com/?temporary-chat=true & disown; hyprctl dispatch submap reset' 34 | bind = , C, exec, bash -c '$browser --new-tab https://chatgpt.com/ & disown; hyprctl dispatch submap reset' 35 | bind = , G, exec, bash -c '$browser --new-tab https://gemini.google.com/app & disown; hyprctl dispatch submap reset' 36 | bind = , P, exec, bash -c '$browser --new-tab https://www.perplexity.ai/ & disown; hyprctl dispatch submap reset' 37 | bind = , D, exec, bash -c '$browser --new-tab https://chat.deepseek.com/ & disown; hyprctl dispatch submap reset' 38 | bind = , Q, exec, bash -c '$browser --new-tab https://chat.qwen.ai/?temporary-chat=true & disown; hyprctl dispatch submap reset' 39 | bind = , K, exec, bash -c '$browser --new-tab https://www.kimi.com/ & disown; hyprctl dispatch submap reset' 40 | bind = , N, exec, bash -c '$browser --new-tab https://notebooklm.google.com/ & disown; hyprctl dispatch submap reset' 41 | bind = , X, exec, bash -c '$browser --new-tab https://github.com/copilot & disown; hyprctl dispatch submap reset' 42 | bind = , V, exec, bash -c '$browser --new-tab https://copilot.microsoft.com/ & disown; hyprctl dispatch submap reset' 43 | 44 | bind = , W, exec, bash -c '$browser --new-tab https://www.w3schools.com/ & disown; hyprctl dispatch submap reset' 45 | bind = , M, exec, bash -c '$browser --new-tab https://movielair.cc/ & disown; hyprctl dispatch submap reset' 46 | bind = , O, exec, bash -c '$browser --new-tab https://www.theodinproject.com/dashboard & disown; hyprctl dispatch submap reset' 47 | bind = , Y, exec, bash -c '$browser --new-tab https://www.youtube.com/ & disown; hyprctl dispatch submap reset' 48 | bind = , A, exec, bash -c '$browser --new-tab https://annas-archive.org/ & disown; hyprctl dispatch submap reset' 49 | bind = , F, exec, bash -c '$browser --new-tab https://www.facebook.com/messages & disown; hyprctl dispatch submap reset' 50 | 51 | bind = , ESCAPE, submap, reset 52 | submap = reset 53 | 54 | # ================================================= 55 | # Utils 56 | # ================================================= 57 | bind = $mainMod, U, submap, util 58 | submap = util 59 | bind = SHIFT, S, exec, bash -c '$screenshotfull & disown; hyprctl dispatch submap reset' 60 | bind = , S, exec, bash -c '$screenshot & disown; hyprctl dispatch submap reset' 61 | bind = , R, exec, bash -c '$record & disown; hyprctl dispatch submap reset' 62 | bind = , O, exec, bash -c '$ocr & disown; hyprctl dispatch submap reset' 63 | bind = , C, exec, bash -c '$colorpicker & disown; hyprctl dispatch submap reset' 64 | bind = , E, exec, bash -c '$eyetemp & disown; hyprctl dispatch submap reset' 65 | bind = , ESCAPE, submap, reset 66 | submap = reset 67 | 68 | # ================================================= 69 | # Resize windows 70 | # ================================================= 71 | bind = $mainMod, R, submap, resize 72 | submap = resize 73 | binde = , right, resizeactive, 20 0 74 | binde = , left, resizeactive, -20 0 75 | binde = , up, resizeactive, 0 -20 76 | binde = , down, resizeactive, 0 20 77 | bind = , ESCAPE, submap, reset 78 | submap = reset 79 | 80 | # ================================================= 81 | # Keyboard mouse support V2 (Toggle + Arrow Keys) 82 | # ================================================= 83 | bind = $mainMod, Q, submap, mouse-mode 84 | 85 | # Outsite so I can still use it without the toggle 86 | bind = , KP_Insert, exec, $mouseclick left 87 | bind = , KP_Enter, exec, $mouseclick right 88 | bind = , KP_Delete, exec, $mouseclick middle 89 | submap = mouse-mode 90 | 91 | # Normal speed 92 | binde = , left, exec, ydotool mousemove -- -30 0 93 | binde = , down, exec, ydotool mousemove -- 0 30 94 | binde = , right, exec, ydotool mousemove -- 30 0 95 | binde = , up, exec, ydotool mousemove -- 0 -30 96 | 97 | # Slower speed with Shift (for precision) 98 | binde = Shift, left, exec, ydotool mousemove -- -10 0 99 | binde = Shift, down, exec, ydotool mousemove -- 0 10 100 | binde = Shift, right, exec, ydotool mousemove -- 10 0 101 | binde = Shift, up, exec, ydotool mousemove -- 0 -10 102 | 103 | bind = , KP_Insert, exec, $mouseclick left 104 | bind = , KP_Enter, exec, $mouseclick right 105 | bind = , KP_Delete, exec, $mouseclick middle 106 | bind = , KP_End, exec, $mouseclick toggle 107 | 108 | bind = , Q, exec, $mouseclick left 109 | bind = , W, exec, $mouseclick middle 110 | bind = , E, exec, $mouseclick right 111 | bind = , R, exec, $mouseclick toggle 112 | 113 | bind = , escape, submap, reset 114 | submap = reset 115 | 116 | -------------------------------------------------------------------------------- /waybar/config.jsonc: -------------------------------------------------------------------------------- 1 | // r4ppz 2 | { 3 | // General Waybar configuration 4 | "position": "top", 5 | "layer": "top", 6 | "height": 21, 7 | "spacing": 0, 8 | "margin-top": 0, 9 | "margin-right": 0, 10 | "margin-left": 0, 11 | // Module placement 12 | "modules-left": [ 13 | "hyprland/workspaces", 14 | "hyprland/window", 15 | "hyprland/submap" 16 | ], 17 | "modules-center": [ 18 | "clock" 19 | ], 20 | "modules-right": [ 21 | "memory", 22 | "cpu", 23 | "custom/cputemp", 24 | // "temperature", 25 | // "disk", 26 | "pulseaudio", 27 | "backlight", 28 | "battery", 29 | // "power-profiles-daemon", 30 | "tray", 31 | // "custom/power-button", 32 | "custom/notification", 33 | "custom/rofi" 34 | ], 35 | // -------------------------------------------------- 36 | // Modules configuration 37 | // -------------------------------------------------- 38 | // Hyprland Workspaces module 39 | "hyprland/workspaces": { 40 | "special-visible-only": false, 41 | "show-special": true, 42 | "active-only": false, 43 | "all-outputs": true, 44 | "warp-on-scroll": false, 45 | "format": "{icon}", 46 | "format-icons": { 47 | "1": "", 48 | "2": "", 49 | "3": "", 50 | "4": "", 51 | "5": "", 52 | "6": "", 53 | "7": "󰍛", 54 | "8": "", 55 | "9": "󰍹", 56 | "10": "󰭴", 57 | "11": "󰑴", 58 | "12": "", 59 | "13": "", 60 | "14": "", 61 | "special": "" 62 | }, 63 | "persistent-workspaces": { 64 | "*": 3 65 | } 66 | // "on-scroll-up": "hyprctl dispatch workspace e+1", 67 | // "on-scroll-down": "hyprctl dispatch workspace e-1" 68 | }, 69 | // Hyprland window 70 | "hyprland/window": { 71 | "format": " {class}", 72 | "max-length": 15, 73 | "icon": false, 74 | "icon-size": 9, 75 | "separate-outputs": true, 76 | "tooltip": false 77 | }, 78 | // Hyprland Submap 79 | "hyprland/submap": { 80 | "format": "{}", 81 | "tooltip": false 82 | }, 83 | // System Tray module 84 | "tray": { 85 | "icon-size": 12, 86 | "spacing": 7 87 | }, 88 | // Disk module 89 | "disk": { 90 | "format": " 󰣆 {free}", 91 | "interval": 20 92 | }, 93 | // CPU module 94 | "cpu": { 95 | "format": "  {usage}%", 96 | "tooltip": true, 97 | "tooltip-format": "CPU Usage: {usage}%", 98 | "interval": 2 99 | }, 100 | // Memory module 101 | "memory": { 102 | "format": "  {used} GiB ({percentage}%)", 103 | "tooltip": true, 104 | "tooltip-format": "Total: {total}\nAvailable: {avail}", 105 | "interval": 10, 106 | "on-click-right": "kitty -e btop" 107 | }, 108 | // Temperature module 109 | "temperature": { 110 | "tooltip": false, 111 | "thermal-zone": 7, 112 | "critical-threshold": 70, 113 | "interval": 2, 114 | "format": "  {temperatureC}°C", 115 | "format-critical": "  {temperatureC}°C" 116 | }, 117 | "custom/cputemp": { 118 | "exec": "~/Arch-dotfiles/scripts/cputemp.sh", 119 | "interval": 2, 120 | "format": "  {}", 121 | "return-type": "json", 122 | "tooltip": false 123 | }, 124 | // Backlight module 125 | "backlight": { 126 | // "device": "acpi_video1", 127 | "format": " {icon} {percent}%", 128 | "format-icons": [ 129 | "󰃚", // 0-14% 130 | "󰃛", // 15-29% 131 | "󰃜", // 30-44% 132 | "󰃝", // 45-59% 133 | "󰃞", // 60-74% 134 | "󰃟", // 75-89% 135 | "󰃠" // 90-100% 136 | ], 137 | "on-scroll-up": "brightnessctl set +1%", 138 | "on-scroll-down": "brightnessctl set 1%-", 139 | "on-click": "$HOME/Arch-dotfiles/scripts/toggle-hyprsunset.sh", 140 | "smooth-scrolling-threshold": 1, 141 | "tooltip": false, 142 | "tooltip-format": "Brightness: {percent}%" 143 | }, 144 | // PulseAudio module 145 | "pulseaudio": { 146 | "scroll-step": 1, 147 | "format": "{icon} {volume}%", 148 | "format-muted": "󰝟 {volume}%", 149 | "format-bluetooth": "󰂰 {volume}%", 150 | "format-bluetooth-muted": "󰂲 {volume}%", 151 | "format-source": "󰍬 {volume}%", 152 | "format-source-muted": "󰍭", 153 | "format-icons": { 154 | "default": [ 155 | "󰕿", 156 | "󰖀", 157 | "󰕾" 158 | ] 159 | }, 160 | "on-click": "pactl set-sink-mute @DEFAULT_SINK@ toggle", 161 | "on-click-right": "pavucontrol", 162 | "on-scroll-up": "pactl set-sink-volume @DEFAULT_SINK@ +1%", 163 | "on-scroll-down": "pactl set-sink-volume @DEFAULT_SINK@ -1%", 164 | "tooltip": false, 165 | "tooltip-format": "{desc} - {volume}%", 166 | "max-volume": 130 167 | }, 168 | // Battery module 169 | "battery": { 170 | "interval": 10, 171 | "states": { 172 | "good": 99, 173 | "warning": 30, 174 | "critical": 20 175 | }, 176 | "format-icons": [ 177 | "󰂎", 178 | "󰁺", 179 | "󰁻", 180 | "󰁽", 181 | "󰁾", 182 | "󰁿", 183 | "󰂀", 184 | "󰂁", 185 | "󰂂", 186 | "󰁹" 187 | ], 188 | "format": "{icon} {capacity}%", 189 | "format-critical": " {icon} {capacity}%!!", 190 | "format-warning": " {icon} {capacity}%", 191 | "format-full": " {icon} {capacity}%", 192 | "format-charging": " 󰂅 {capacity}%", 193 | "format-charging-warning": " 󰢝 {capacity}%", 194 | "format-charging-critical": " 󰢜 {capacity}%", 195 | "format-plugged": " 󰂅 {capacity}%", 196 | "format-alt": " 󱧥 {time}", 197 | "tooltip": true 198 | }, 199 | // Clock module 200 | "clock": { 201 | "format": "󰥔 {:%I:%M:%S %p}", 202 | "format-alt": " {:%m-%d-%Y}", 203 | "tooltip": true, 204 | "tooltip-format": "{calendar}", 205 | "on-click-right": "gsimplecal", 206 | "interval": 1 207 | }, 208 | // Power Profiles Daemon module 209 | "power-profiles-daemon": { 210 | "format": "{icon}", 211 | "tooltip-format": "{profile}", 212 | "tooltip": true, 213 | "format-icons": { 214 | "default": " 󰥔 ", 215 | "performance": "  ", 216 | "balanced": "  ", 217 | "power-saver": "  " 218 | } 219 | }, 220 | // Custom Rofi launcher module 221 | "custom/rofi": { 222 | "format": " ", 223 | "on-click": "~/.config/rofi/launcher/launcher.sh", 224 | "on-click-right": "~/.config/rofi/powermenu/powermenu.sh", 225 | "escape": true, 226 | "tooltip": false 227 | }, 228 | // Custom Power Button module 229 | "custom/power-button": { 230 | "format": "  ", 231 | "on-click": "~/.config/rofi/powermenu/powermenu.sh", 232 | "tooltip": false 233 | }, 234 | "custom/notification": { 235 | "tooltip": false, 236 | "format": "{icon}", 237 | "format-icons": { 238 | "notification": "", 239 | "none": "", 240 | "dnd-notification": "", 241 | "dnd-none": "", 242 | "inhibited-notification": "", 243 | "inhibited-none": "", 244 | "dnd-inhibited-notification": "", 245 | "dnd-inhibited-none": "" 246 | }, 247 | "return-type": "json", 248 | "exec-if": "which swaync-client", 249 | "exec": "swaync-client -swb", 250 | "on-click": "swaync-client -t -sw", 251 | "on-click-right": "swaync-client -d -sw", 252 | "escape": true 253 | } 254 | } 255 | -------------------------------------------------------------------------------- /nvim/lua/configs/servers.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | local function make_lua_library() 4 | local lib = {} 5 | lib[vim.fn.expand("$VIMRUNTIME/lua")] = true 6 | lib[vim.fn.stdpath("data") .. "/lazy/ui/nvchad_types"] = true 7 | lib[vim.fn.stdpath("data") .. "/lazy/lazy.nvim/lua/lazy"] = true 8 | lib["${3rd}/luv/library"] = true 9 | return lib 10 | end 11 | 12 | function M.setup(capabilities) 13 | -- Lua LSP 14 | vim.lsp.config("lua_ls", { 15 | capabilities = capabilities, 16 | root_markers = { 17 | ".luarc.json", 18 | ".luarc.jsonc", 19 | ".luacheckrc", 20 | ".stylua.toml", 21 | "stylua.toml", 22 | "selene.toml", 23 | "selene.yml", 24 | }, 25 | settings = { 26 | Lua = { 27 | runtime = { 28 | version = "LuaJIT", 29 | }, 30 | workspace = { 31 | library = make_lua_library(), 32 | maxPreload = 1000, 33 | preloadFileSize = 1000, 34 | }, 35 | telemetry = { enable = false }, 36 | }, 37 | }, 38 | }) 39 | 40 | local java_home = os.getenv("JAVA_HOME") 41 | local lombok_jar = vim.fn.expand("$MASON/share/jdtls/lombok.jar") 42 | vim.lsp.config("jdtls", { 43 | capabilities = capabilities, 44 | root_markers = { 45 | "pom.xml", 46 | "build.gradle", 47 | "build.gradle.kts", 48 | "settings.gradle", 49 | "gradlew", 50 | "mvnw", 51 | }, 52 | cmd = { 53 | "java", 54 | "-Declipse.application=org.eclipse.jdt.ls.core.id1", 55 | "-Dosgi.bundles.defaultStartLevel=4", 56 | "-Declipse.product=org.eclipse.jdt.ls.core.product", 57 | "-Dlog.protocol=true", 58 | "-Dlog.level=ALL", 59 | "-Xmx4G", 60 | "--add-modules=ALL-SYSTEM", 61 | "--add-opens", 62 | "java.base/java.util=ALL-UNNAMED", 63 | "--add-opens", 64 | "java.base/java.lang=ALL-UNNAMED", 65 | "-javaagent:" .. lombok_jar, 66 | "-jar", 67 | vim.fn.glob(vim.fn.stdpath("data") .. "/mason/packages/jdtls/plugins/org.eclipse.equinox.launcher_*.jar"), 68 | "-configuration", 69 | vim.fn.stdpath("data") .. "/mason/packages/jdtls/config_linux", 70 | "-data", 71 | vim.fn.expand("~/.local/share/eclipse/"), 72 | }, 73 | settings = { 74 | java = { 75 | autobuild = { 76 | enabled = true, 77 | }, 78 | spring = { 79 | configuration = { 80 | metadata = { 81 | enabled = true, 82 | }, 83 | }, 84 | boot = { 85 | enabled = true, 86 | microservices = { 87 | enabled = true, 88 | }, 89 | }, 90 | symbol = { 91 | enabled = true, 92 | }, 93 | }, 94 | lombok = { 95 | enabled = true, 96 | enableLombokJarConfiguration = true, 97 | }, 98 | completion = { 99 | favoriteStaticMembers = { 100 | "org.junit.jupiter.api.Assertions.*", 101 | "org.mockito.Mockito.*", 102 | "org.hamcrest.MatcherAssert.assertThat", 103 | "org.hamcrest.Matchers.*", 104 | 105 | "org.springframework.boot.SpringApplication.*", 106 | "org.springframework.boot.autoconfigure.SpringBootApplication.*", 107 | "org.springframework.web.bind.annotation.*", 108 | "org.springframework.http.ResponseEntity.*", 109 | }, 110 | filteredTypes = { 111 | "com.sun.*", 112 | "java.awt.*", 113 | "jdk.*", 114 | "sun.*", 115 | 116 | "org.springframework.cglib.*", 117 | "org.springframework.boot.loader.*", 118 | }, 119 | importOrder = { "java", "javax", "com", "org", "lombok" }, 120 | }, 121 | references = { 122 | codeLens = { 123 | enabled = true, 124 | }, 125 | }, 126 | home = java_home, 127 | configuration = { 128 | runtimes = { 129 | { 130 | name = "JavaSE-21", 131 | path = java_home, 132 | }, 133 | }, 134 | 135 | updateBuildConfiguration = "automatic", 136 | maven = { 137 | userSettings = vim.fn.expand("~/.m2/settings.xml"), 138 | globalSettings = "/etc/maven/settings.xml", 139 | }, 140 | }, 141 | 142 | contentProvider = { 143 | preferred = "fernflower", 144 | }, 145 | format = { 146 | enabled = true, 147 | }, 148 | gradle = { 149 | offline = true, 150 | version = "8.5", 151 | wrapper = { 152 | enabled = true, 153 | }, 154 | }, 155 | import = { 156 | externalAnnotation = { 157 | enabled = true, 158 | }, 159 | gradle = { 160 | enabled = true, 161 | }, 162 | maven = { 163 | enabled = true, 164 | }, 165 | }, 166 | maven = { 167 | downloadSources = true, 168 | updateSnapshots = true, 169 | }, 170 | project = { 171 | importPrompt = { 172 | enabled = true, 173 | }, 174 | referencedLibraries = { "lib/**/*.jar", "./out/**/*.jar" }, 175 | }, 176 | saveActions = { 177 | organizeImports = true, 178 | }, 179 | sources = { 180 | organizeImports = { 181 | starThreshold = 999, 182 | staticStarThreshold = 999, 183 | }, 184 | }, 185 | typeHierarchy = { 186 | multipleInheritance = true, 187 | }, 188 | }, 189 | }, 190 | on_attach = function(client) 191 | client.server_capabilities.semanticTokensProvider = nil 192 | end, 193 | }) 194 | 195 | -- CSS Modules 196 | vim.lsp.config("cssmodules_ls", { 197 | capabilities = capabilities, 198 | filetypes = { "typescriptreact", "javascriptreact" }, 199 | settings = { 200 | css = { 201 | validate = true, 202 | lint = { 203 | unknownAtRules = "ignore", 204 | }, 205 | }, 206 | scss = { 207 | validate = true, 208 | lint = { 209 | unknownAtRules = "ignore", 210 | }, 211 | }, 212 | less = { 213 | validate = true, 214 | lint = { 215 | unknownAtRules = "ignore", 216 | }, 217 | }, 218 | }, 219 | }) 220 | 221 | -- CSS LSP 222 | vim.lsp.config("cssls", { 223 | capabilities = capabilities, 224 | root_markers = { "package.json" }, 225 | settings = { 226 | css = { validate = true, lint = { unknownAtRules = "ignore" } }, 227 | scss = { validate = true, lint = { unknownAtRules = "ignore" } }, 228 | less = { validate = true, lint = { unknownAtRules = "ignore" } }, 229 | }, 230 | }) 231 | 232 | -- CSS Variables 233 | vim.lsp.config("css_variables", { 234 | capabilities = capabilities, 235 | filetypes = { "css", "scss", "sass", "less", "typescriptreact", "javascriptreact" }, 236 | }) 237 | 238 | -- Emmet 239 | vim.lsp.config("emmet_ls", { 240 | capabilities = capabilities, 241 | filetypes = { 242 | "html", 243 | "javascriptreact", 244 | "typescriptreact", 245 | "css", 246 | }, 247 | }) 248 | 249 | -- Hyprland LSP 250 | vim.lsp.config("hyprls", { 251 | capabilities = capabilities, 252 | root_markers = { "hyprland.conf" }, 253 | filetypes = { "hyprlang" }, 254 | }) 255 | 256 | vim.lsp.config("bashls", { 257 | capabilities = capabilities, 258 | filetypes = { "bash", "zsh", "sh" }, 259 | }) 260 | end 261 | 262 | return M 263 | -------------------------------------------------------------------------------- /yazi/yazi.toml: -------------------------------------------------------------------------------- 1 | # A TOML linter such as https://taplo.tamasfe.dev/ can use this schema to validate your config. 2 | # If you encounter any issues, please make an issue at https://github.com/yazi-rs/schemas. 3 | "$schema" = "https://yazi-rs.github.io/schemas/yazi.json" 4 | 5 | [mgr] 6 | ratio = [1, 4, 3] 7 | sort_by = "alphabetical" 8 | sort_sensitive = false 9 | sort_reverse = false 10 | sort_dir_first = true 11 | sort_translit = false 12 | linemode = "none" 13 | show_hidden = false 14 | show_symlink = true 15 | scrolloff = 5 16 | # mouse_events = [ "click", "scroll" ] 17 | mouse_events = ["scroll"] 18 | title_format = "Yazi: {cwd}" 19 | 20 | [preview] 21 | wrap = "no" 22 | tab_size = 2 23 | max_width = 600 24 | max_height = 900 25 | cache_dir = "" 26 | image_delay = 30 27 | image_filter = "triangle" 28 | image_quality = 75 29 | ueberzug_scale = 1 30 | ueberzug_offset = [0, 0, 0, 0] 31 | 32 | [opener] 33 | edit = [ 34 | { run = '${EDITOR:-vi} "$@"', desc = "$EDITOR", block = true, for = "unix" }, 35 | { run = 'code %*', orphan = true, desc = "code", for = "windows" }, 36 | { run = 'code -w %*', block = true, desc = "code (block)", for = "windows" }, 37 | ] 38 | open = [ 39 | { run = 'xdg-open "$1"', desc = "Open", for = "linux" }, 40 | { run = 'open "$@"', desc = "Open", for = "macos" }, 41 | { run = 'start "" "%1"', orphan = true, desc = "Open", for = "windows" }, 42 | { run = 'termux-open "$1"', desc = "Open", for = "android" }, 43 | ] 44 | reveal = [ 45 | { run = 'xdg-open "$(dirname "$1")"', desc = "Reveal", for = "linux" }, 46 | { run = 'open -R "$1"', desc = "Reveal", for = "macos" }, 47 | { run = 'explorer /select,"%1"', orphan = true, desc = "Reveal", for = "windows" }, 48 | { run = 'termux-open "$(dirname "$1")"', desc = "Reveal", for = "android" }, 49 | { run = '''clear; exiftool "$1"; echo "Press enter to exit"; read _''', block = true, desc = "Show EXIF", for = "unix" }, 50 | ] 51 | extract = [ 52 | { run = 'ya pub extract --list "$@"', desc = "Extract here", for = "unix" }, 53 | { run = 'ya pub extract --list %*', desc = "Extract here", for = "windows" }, 54 | ] 55 | play = [ 56 | { run = 'mpv --force-window "$@"', orphan = true, for = "unix" }, 57 | { run = 'mpv --force-window %*', orphan = true, for = "windows" }, 58 | { run = '''mediainfo "$1"; echo "Press enter to exit"; read _''', block = true, desc = "Show media info", for = "unix" }, 59 | ] 60 | 61 | [open] 62 | rules = [ 63 | # Folder 64 | { name = "*/", use = [ 65 | "edit", 66 | "open", 67 | "reveal", 68 | ] }, 69 | # Text 70 | { mime = "text/*", use = [ 71 | "edit", 72 | "reveal", 73 | ] }, 74 | # Image 75 | { mime = "image/*", use = [ 76 | "open", 77 | "reveal", 78 | ] }, 79 | # Media 80 | { mime = "{audio,video}/*", use = [ 81 | "play", 82 | "reveal", 83 | ] }, 84 | # Archive 85 | { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", use = [ 86 | "extract", 87 | "reveal", 88 | ] }, 89 | # JSON 90 | { mime = "application/{json,ndjson}", use = [ 91 | "edit", 92 | "reveal", 93 | ] }, 94 | { mime = "*/javascript", use = [ 95 | "edit", 96 | "reveal", 97 | ] }, 98 | # Empty file 99 | { mime = "inode/empty", use = [ 100 | "edit", 101 | "reveal", 102 | ] }, 103 | # Fallback 104 | { name = "*", use = [ 105 | "open", 106 | "reveal", 107 | ] }, 108 | ] 109 | 110 | [tasks] 111 | micro_workers = 10 112 | macro_workers = 10 113 | bizarre_retry = 3 114 | image_alloc = 536870912 # 512MB 115 | image_bound = [0, 0] 116 | suppress_preload = false 117 | 118 | [plugin] 119 | fetchers = [ 120 | # Mimetype 121 | { id = "mime", name = "*", run = "mime", prio = "high" }, 122 | ] 123 | spotters = [ 124 | { name = "*/", run = "folder" }, 125 | # Code 126 | { mime = "text/*", run = "code" }, 127 | { mime = "application/{mbox,javascript,wine-extension-ini}", run = "code" }, 128 | # Image 129 | { mime = "image/{avif,hei?,jxl}", run = "magick" }, 130 | { mime = "image/svg+xml", run = "svg" }, 131 | { mime = "image/*", run = "image" }, 132 | # Video 133 | { mime = "video/*", run = "video" }, 134 | # Fallback 135 | { name = "*", run = "file" }, 136 | ] 137 | preloaders = [ 138 | # Image 139 | { mime = "image/{avif,hei?,jxl}", run = "magick" }, 140 | { mime = "image/svg+xml", run = "svg" }, 141 | { mime = "image/*", run = "image" }, 142 | # Video 143 | { mime = "video/*", run = "video" }, 144 | # PDF 145 | { mime = "application/pdf", run = "pdf" }, 146 | # Font 147 | { mime = "font/*", run = "font" }, 148 | { mime = "application/ms-opentype", run = "font" }, 149 | ] 150 | previewers = [ 151 | { name = "*/", run = "folder" }, 152 | # Code 153 | { mime = "text/*", run = "code" }, 154 | { mime = "application/{mbox,javascript,wine-extension-ini}", run = "code" }, 155 | # JSON 156 | { mime = "application/{json,ndjson}", run = "json" }, 157 | # Image 158 | { mime = "image/{avif,hei?,jxl}", run = "magick" }, 159 | { mime = "image/svg+xml", run = "svg" }, 160 | { mime = "image/*", run = "image" }, 161 | # Video 162 | { mime = "video/*", run = "video" }, 163 | # PDF 164 | { mime = "application/pdf", run = "pdf" }, 165 | # Archive 166 | { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", run = "archive" }, 167 | { mime = "application/{debian*-package,redhat-package-manager,rpm,android.package-archive}", run = "archive" }, 168 | { name = "*.{AppImage,appimage}", run = "archive" }, 169 | # Virtual Disk / Disk Image 170 | { mime = "application/{iso9660-image,qemu-disk,ms-wim,apple-diskimage}", run = "archive" }, 171 | { mime = "application/virtualbox-{vhd,vhdx}", run = "archive" }, 172 | { name = "*.{img,fat,ext,ext2,ext3,ext4,squashfs,ntfs,hfs,hfsx}", run = "archive" }, 173 | # Font 174 | { mime = "font/*", run = "font" }, 175 | { mime = "application/ms-opentype", run = "font" }, 176 | # Empty file 177 | { mime = "inode/empty", run = "empty" }, 178 | # Fallback 179 | { name = "*", run = "file" }, 180 | ] 181 | 182 | [input] 183 | cursor_blink = false 184 | 185 | # cd 186 | cd_title = "Change directory:" 187 | cd_origin = "top-center" 188 | cd_offset = [0, 2, 50, 3] 189 | 190 | # create 191 | create_title = ["Create:", "Create (dir):"] 192 | create_origin = "top-center" 193 | create_offset = [0, 2, 50, 3] 194 | 195 | # rename 196 | rename_title = "Rename:" 197 | rename_origin = "hovered" 198 | rename_offset = [0, 1, 50, 3] 199 | 200 | # filter 201 | filter_title = "Filter:" 202 | filter_origin = "top-center" 203 | filter_offset = [0, 2, 50, 3] 204 | 205 | # find 206 | find_title = ["Find next:", "Find previous:"] 207 | find_origin = "top-center" 208 | find_offset = [0, 2, 50, 3] 209 | 210 | # search 211 | search_title = "Search via {n}:" 212 | search_origin = "top-center" 213 | search_offset = [0, 2, 50, 3] 214 | 215 | # shell 216 | shell_title = ["Shell:", "Shell (block):"] 217 | shell_origin = "top-center" 218 | shell_offset = [0, 2, 50, 3] 219 | 220 | [confirm] 221 | # trash 222 | trash_title = "Trash {n} selected file{s}?" 223 | trash_origin = "center" 224 | trash_offset = [0, 0, 70, 20] 225 | 226 | # delete 227 | delete_title = "Permanently delete {n} selected file{s}?" 228 | delete_origin = "center" 229 | delete_offset = [0, 0, 70, 20] 230 | 231 | # overwrite 232 | overwrite_title = "Overwrite file?" 233 | overwrite_content = "Will overwrite the following file:" 234 | overwrite_origin = "center" 235 | overwrite_offset = [0, 0, 50, 15] 236 | 237 | # quit 238 | quit_title = "Quit?" 239 | quit_content = "The following tasks are still running, are you sure you want to quit?" 240 | quit_origin = "center" 241 | quit_offset = [0, 0, 50, 15] 242 | 243 | [pick] 244 | open_title = "Open with:" 245 | open_origin = "hovered" 246 | open_offset = [0, 1, 50, 7] 247 | 248 | [which] 249 | sort_by = "none" 250 | sort_sensitive = false 251 | sort_reverse = false 252 | sort_translit = false 253 | -------------------------------------------------------------------------------- /nvim/lua/configs/mappings.lua: -------------------------------------------------------------------------------- 1 | -- I use arrow keys not hjkl cause I am a fucking weirdo 2 | 3 | local map = require("utils.map") 4 | 5 | ---------------------------------------- 6 | -- Personal? 7 | ---------------------------------------- 8 | map({ "n", "v" }, "", "W", { desc = "Move Right like E" }) 9 | map({ "n", "v" }, "", "B", { desc = "Move Left like B" }) 10 | 11 | map("n", "", "%y+", { desc = "Copy whole file" }) 12 | 13 | map("n", "", "O", { desc = "Insert above" }) 14 | map("n", "", "o", { desc = "Insert below" }) 15 | 16 | map("n", "", "u", { desc = "Undo" }) 17 | map("i", "", "u", { desc = "Undo (Insert)" }) 18 | map("v", "", "u", { desc = "Undo (Visual)" }) 19 | map("n", "", "", { desc = "Redo" }) 20 | map("i", "", "", { desc = "Redo (Insert)" }) 21 | map("v", "", "", { desc = "Redo (Visual)" }) 22 | 23 | map("n", "", "zz", { desc = "Scroll half a page up and center" }) 24 | map("n", "", "zz", { desc = "Scroll half a page down and center" }) 25 | map("i", "", "zz", { desc = "Scroll half a page up and center in insert mode" }) 26 | map("i", "", "zz", { desc = "Scroll half a page down and center in insert mode" }) 27 | 28 | map({ "n", "v" }, "", "b", { desc = "Move to the beginning of the word" }) 29 | map({ "n", "v" }, "", "e", { desc = "Move to the end of the word" }) 30 | map("i", "", "b", { desc = "Move to the beginning of the word in insert mode" }) 31 | map("i", "", "e", { desc = "Move to the end of the word in insert mode" }) 32 | 33 | map("v", "", "{", { desc = "Jump to previous paragraph" }) 34 | map("v", "", "}", { desc = "Jump to next paragraph" }) 35 | 36 | map({ "n", "v" }, "", "", { desc = "Scroll window down one line" }) 37 | map({ "n", "v" }, "", "", { desc = "Scroll window up one line" }) 38 | map("i", "", "", { desc = "Scroll window down one line in insert mode" }) 39 | map("i", "", "", { desc = "Scroll window up one line in insert mode" }) 40 | 41 | map("n", "", ":resize +2", { desc = "Increase window height" }) 42 | map("n", "", ":resize -2", { desc = "Decrease window height" }) 43 | map("n", "", ":vertical resize -2", { desc = "Decrease window width" }) 44 | map("n", "", ":vertical resize +2", { desc = "Increase window width" }) 45 | 46 | map("v", "<", "", ">gv", { desc = "Indent right and reselect" }) 48 | 49 | map("n", "", "write", { desc = "Save file" }) 50 | map("v", "", "write", { desc = "Save file" }) 51 | map("i", "", ":write", { desc = "Save file" }) 52 | 53 | map("n", "", "noh", { desc = "Clear highlights" }) 54 | 55 | map("t", "", "", { desc = "Escape terminal mode" }) 56 | 57 | map("n", "/", "gcc", { desc = "toggle comment", remap = true }) 58 | map("v", "/", "gc", { desc = "toggle comment", remap = true }) 59 | 60 | -------------------------------------------------- 61 | -- Disabled/Change defaults cause why not 62 | -------------------------------------------------- 63 | map("n", "", "", { desc = "Disable suspend" }) 64 | map("n", "ZZ", "", { desc = "Disable accidental save and quit (ZZ)" }) 65 | map("n", "ZQ", "", { desc = "Disable accidental quit (ZQ)" }) 66 | 67 | map("n", "s", "", { desc = "Disable s to avoid accidental edits" }) 68 | 69 | map("n", "q", "", { desc = "Disable recording macro (q)" }) 70 | map("n", "Q", "", { desc = "Disable Ex mode (Q)" }) 71 | 72 | map("v", "p", '"_dP', { desc = "Paste without yanking replaced text" }) 73 | map({ "n", "v" }, "x", '"_x', { desc = "Delete character without yanking" }) 74 | map("n", "c", '"_c', { desc = "Change text without yanking" }) 75 | -- map("n", "d", '"_d', { desc = "Delete text without yanking" }) 76 | 77 | map({ "n", "v" }, "!", "^", { desc = "Jump to first non-blank character of the line" }) 78 | map({ "n", "v" }, "@", "g_", { desc = "Jump to last non-blank character of line" }) 79 | 80 | map("n", "#", [[let @/ = '\<'.expand('').'\>':set hlsearch]], { desc = "Highlight word (no jump)" }) 81 | map( 82 | "v", 83 | "#", 84 | [[ylet @/ = '\V' . escape(@", '/\'):set hlsearch]], 85 | { desc = "Highlight selection (no jump)" } 86 | ) 87 | 88 | -- I dont even know why I have this... 89 | local marks = { "A", "B", "C", "D", "E" } 90 | for i, mark in ipairs(marks) do 91 | map("n", "m" .. i, "m" .. mark, { desc = "Set global mark " .. mark }) 92 | map("n", "g" .. i, "`" .. mark, { desc = "Exact jump to global mark " .. mark }) 93 | end 94 | 95 | -- Open selected text as URL (portable) 96 | -- (do I need this? idk) 97 | local function create_open_url_function() 98 | local is_mac = vim.fn.has("mac") == 1 99 | local is_win = vim.fn.has("win32") == 1 100 | 101 | return function(url) 102 | url = vim.fn.trim(url or "") 103 | if url == "" then 104 | vim.notify("No URL selected", vim.log.levels.WARN) 105 | return 106 | end 107 | local cmd 108 | if is_mac then 109 | cmd = { "open", url } 110 | elseif is_win then 111 | cmd = { "cmd.exe", "/c", "start", "", url } 112 | else 113 | cmd = { "xdg-open", url } 114 | end 115 | vim.fn.jobstart(cmd, { detach = true }) 116 | end 117 | end 118 | 119 | local open_url_portable = create_open_url_function() 120 | map("v", "gx", function() 121 | vim.cmd([[normal! "vy]]) 122 | local url = vim.fn.getreg('"') 123 | open_url_portable(url) 124 | end, { desc = "Open selected text as URL" }) 125 | 126 | ------------------------------------------------------------- 127 | -- Plugins? (other keybinds are in the plugins lua files) 128 | ------------------------------------------------------------- 129 | -- NVCHAD 130 | map("n", "vc", "NvCheatsheet", { desc = "toggle nvcheatsheet" }) 131 | map("n", "vt", function() 132 | require("nvchad.themes").open() 133 | end, { desc = "telescope nvchad themes" }) 134 | 135 | -- UI 136 | map("n", "um", "Mason", { desc = "Mason UI" }) 137 | map("n", "ul", "Lazy", { desc = "Lazy UI" }) 138 | 139 | -- Tabs 140 | map("n", "tn", "tabnew", { desc = "New tab" }) 141 | map("n", "tX", "tabonly", { desc = "Close all other tabs" }) 142 | map("n", "tx", "tabclose", { desc = "Close tab" }) 143 | map("n", "", "tabnext", { desc = "Next tab" }) 144 | map("n", "", "tabprevious", { desc = "Previous tab" }) 145 | 146 | -- Buffers management 147 | map("n", "n", "enew", { desc = "Buffer new" }) 148 | -- change buffer 149 | map({ "n" }, "", function() 150 | require("nvchad.tabufline").next() 151 | end, { desc = "Buffer goto next" }) 152 | map({ "n" }, "", function() 153 | require("nvchad.tabufline").prev() 154 | end, { desc = "Buffer goto prev" }) 155 | -- move buffer 156 | map({ "n" }, "", function() 157 | require("nvchad.tabufline").move_buf(1) 158 | end, { desc = "move buffer to the right" }) 159 | map({ "n" }, "", function() 160 | require("nvchad.tabufline").move_buf(-1) 161 | end, { desc = "move buffer to the left" }) 162 | -- close buffer 163 | map("n", "", function() 164 | require("nvchad.tabufline").close_buffer() 165 | end, { desc = "Buffer close" }) 166 | map("n", "", function() 167 | require("nvchad.tabufline").closeAllBufs(false) 168 | end, { desc = "Close all buffers except current" }) 169 | 170 | -- Terminal 171 | local term_utils = require("utils.terminal") 172 | -- Floating Terminal 173 | map({ "n", "t" }, "", function() 174 | term_utils.toggle_tab_terminal({ pos = "float" }) 175 | end, { desc = "Toggle tab-scoped floating terminal" }) 176 | -- Horizontal Split Terminal 177 | map({ "n", "t" }, "", function() 178 | term_utils.toggle_tab_terminal({ pos = "sp", size = 0.6 }) 179 | end, { desc = "Toggle tab-scoped horizontal terminal" }) 180 | -- Vertical Split Terminal 181 | map({ "n", "t" }, "", function() 182 | term_utils.toggle_tab_terminal({ pos = "vsp", size = 0.8 }) 183 | end, { desc = "Toggle tab-scoped vertical terminal" }) 184 | map("n", "", function() 185 | vim.cmd("enew") 186 | vim.cmd("terminal") 187 | vim.cmd("startinsert") 188 | end, { desc = "New Terminal Buffer" }) 189 | 190 | -------------------------------------------------------------------------- 191 | -- Ill put the proper binds here once I learned proper vim key bindings 192 | -- ( Very unlikely ) 193 | map("n", "", "h", { desc = "Move to left window" }) 194 | map("n", "", "j", { desc = "Move to below window" }) 195 | map("n", "", "k", { desc = "Move to above window" }) 196 | map("n", "", "l", { desc = "Move to right window" }) 197 | 198 | map("n", "", ":m .+1==", { desc = "Move current line down" }) 199 | map("n", "", ":m .-2==", { desc = "Move current line up" }) 200 | map("i", "", ":m .+1==gi", { desc = "Move current line down (insert mode)" }) 201 | map("i", "", ":m .-2==gi", { desc = "Move current line up (insert mode)" }) 202 | map("v", "", ":m '>+1gv=gv", { desc = "Move selected lines down" }) 203 | map("v", "", ":m '<-2gv=gv", { desc = "Move selected lines up" }) 204 | 205 | map("i", "jk", "", { desc = "Exit insert mode" }) 206 | --------------------------------------------------------------------------------