├── nvim ├── lua │ ├── config │ │ ├── colors.lua │ │ ├── keymaps.lua │ │ ├── autocmds.lua │ │ ├── options.lua │ │ └── lazy.lua │ └── plugins │ │ ├── asset │ │ ├── illuminati-logo.txt │ │ ├── skull-fuck-you.txt │ │ ├── coffin-logo.txt │ │ └── death-star-logo.txt │ │ ├── comment.lua │ │ ├── cpp-snippets.lua │ │ ├── dashboard.lua │ │ ├── plugins.lua │ │ └── cpp-templates.lua ├── init.lua ├── package-lock.json ├── stylua.toml ├── README.md ├── .neoconf.json ├── lazyvim.json ├── .clang-format ├── lazy-lock.json └── LICENSE ├── gtklock ├── config.ini └── style.css ├── systemd └── user │ ├── default.target.wants │ ├── psd.service │ └── low-battery-notify.service │ └── low-battery-notify.service ├── .gitmodules ├── pavucontrol.ini ├── rofi ├── colors │ └── wallust.rasi ├── bgselector │ └── style.rasi └── config.rasi ├── wallust ├── templates │ ├── vscode │ ├── rofi.rasi │ ├── neopywal.vim │ ├── kitty.conf │ ├── alacritty.toml │ ├── vscode.json │ ├── colors.css │ ├── gtk.css │ ├── waybar.css │ ├── zathurarc │ ├── dunstrc │ ├── mako │ └── vicinae.toml └── wallust.toml ├── fastfetch ├── logo.txt └── config.jsonc ├── vicinae └── vicinae.json ├── kitty ├── colors.conf └── kitty.conf ├── waybar ├── config.jsonc ├── colors.css ├── style.css └── modules.json ├── alacritty ├── colors.toml └── alacritty.toml ├── scripts ├── low-battery-notify.sh ├── media-control.sh ├── lib │ └── common.sh ├── bgselector.sh ├── git-cleanup.sh └── theme-sync.sh ├── LICENSE ├── .gitignore ├── zathura └── zathurarc ├── yazi └── yazi.toml ├── mako └── config ├── starship └── starship.toml ├── zsh └── config.zsh ├── fish ├── fish_variables └── config.fish ├── CODE_OF_CONDUCT.md ├── README.md └── niri └── config.kdl /nvim/lua/config/colors.lua: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gtklock/config.ini: -------------------------------------------------------------------------------- 1 | [playerctl] 2 | art-size=0 3 | position=bottom-center -------------------------------------------------------------------------------- /systemd/user/default.target.wants/psd.service: -------------------------------------------------------------------------------- 1 | /usr/lib/systemd/user/psd.service -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "wallpapers"] 2 | path = wallpapers 3 | url = https://github.com/saatvik333/wallpapers 4 | -------------------------------------------------------------------------------- /nvim/init.lua: -------------------------------------------------------------------------------- 1 | -- bootstrap lazy.nvim, LazyVim and your plugins 2 | require("config.lazy") 3 | vim.opt.autochdir = true -------------------------------------------------------------------------------- /systemd/user/default.target.wants/low-battery-notify.service: -------------------------------------------------------------------------------- 1 | /home/saatvik333/.config/systemd/user/low-battery-notify.service -------------------------------------------------------------------------------- /nvim/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nvim", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | -------------------------------------------------------------------------------- /gtklock/style.css: -------------------------------------------------------------------------------- 1 | window { 2 | background-size: cover; 3 | background-repeat: no-repeat; 4 | background-position: center; 5 | } -------------------------------------------------------------------------------- /nvim/stylua.toml: -------------------------------------------------------------------------------- 1 | indent_type = "Spaces" 2 | indent_width = 2 3 | column_width = 120 4 | line_endings = "Unix" 5 | quote_style = "AutoPreferDouble" 6 | call_parentheses = "Always" 7 | -------------------------------------------------------------------------------- /nvim/README.md: -------------------------------------------------------------------------------- 1 | # 💤 LazyVim 2 | 3 | A starter template for [LazyVim](https://github.com/LazyVim/LazyVim). 4 | Refer to the [documentation](https://lazyvim.github.io/installation) to get started. 5 | -------------------------------------------------------------------------------- /pavucontrol.ini: -------------------------------------------------------------------------------- 1 | [window] 2 | width=600 3 | height=400 4 | sinkInputType=1 5 | sourceOutputType=1 6 | sinkType=0 7 | sourceType=1 8 | showVolumeMeters=1 9 | hideUnavailableCardProfiles=1 10 | -------------------------------------------------------------------------------- /systemd/user/low-battery-notify.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Battery notification 3 | 4 | [Service] 5 | ExecStart=%h/.config/scripts/low-battery-notify.sh 6 | Restart=always 7 | 8 | [Install] 9 | WantedBy=default.target 10 | -------------------------------------------------------------------------------- /nvim/.neoconf.json: -------------------------------------------------------------------------------- 1 | { 2 | "neodev": { 3 | "library": { 4 | "enabled": true, 5 | "plugins": true 6 | } 7 | }, 8 | "neoconf": { 9 | "plugins": { 10 | "lua_ls": { 11 | "enabled": true 12 | } 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /rofi/colors/wallust.rasi: -------------------------------------------------------------------------------- 1 | * { 2 | background: #1E1E2E; 3 | background-alt: #585B70; 4 | foreground: #CDD6F4; 5 | selected: #89B4FA; 6 | border: #89B4FA; 7 | active: #A6E3A1; 8 | urgent: #F38BA8; 9 | } 10 | -------------------------------------------------------------------------------- /wallust/templates/vscode: -------------------------------------------------------------------------------- 1 | {{color0}} 2 | {{color1}} 3 | {{color2}} 4 | {{color3}} 5 | {{color4}} 6 | {{color5}} 7 | {{color6}} 8 | {{color7}} 9 | {{color8}} 10 | {{color9}} 11 | {{color10}} 12 | {{color11}} 13 | {{color12}} 14 | {{color13}} 15 | {{color14}} 16 | {{color15}} 17 | -------------------------------------------------------------------------------- /wallust/templates/rofi.rasi: -------------------------------------------------------------------------------- 1 | * { 2 | background: {{background}}; 3 | background-alt: {{color8}}; 4 | foreground: {{foreground}}; 5 | selected: {{color4}}; 6 | border: {{color12}}; 7 | active: {{color2}}; 8 | urgent: {{color1}}; 9 | } 10 | -------------------------------------------------------------------------------- /nvim/lua/config/keymaps.lua: -------------------------------------------------------------------------------- 1 | -- Keymaps are automatically loaded on the VeryLazy event 2 | -- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua 3 | -- Add any additional keymaps here 4 | 5 | -- C++ Template keymaps are now handled in the plugin file 6 | -------------------------------------------------------------------------------- /fastfetch/logo.txt: -------------------------------------------------------------------------------- 1 | $7⣿⣿⣿⣿⡿⢿⣿⠿⡯⠛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 2 | $7⣿⣿⣿⡟⣼⣷⣷⠄⢰⡤⢸⡬⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 3 | $7⣿⣿⣿⠀⠼⡯⡟⠀⢁⣤⠈⢀⡘⢿⣿⢟⡟⢍⢻⣿⣿⣿⣿⣿ 4 | $7⣿⣿⣿⣦⠀⠀⠀⠀⠈⢳⠛⢋⣩⣾⣿⡏⡁⠁⠘⢸⣿⣿⣿⣿ 5 | $7⣿⣿⣿⣿⣷⣦⣤⣖⠀⠀⣿⣿⣿⣿⠿⣇⣁⠀⠀⢺⣿⣿⣿⣿ 6 | $7⣿⣿⣿⣿⣿⣿⣿⠿⢂⠀⣿⣿⣿⣿⣷⣬⠣⠂⠀⠐⢻⣿⣿⣿ 7 | $7⣿⣿⣿⣿⣿⣿⡿⠓⠐⠀⠀⡀⠋⣿⣿⣿⣷⡊⠀⢸⡘⣿⣿⣿ 8 | $7⣿⣿⣿⣿⣿⣯⣤⣷⠼⢄⠐⢅⡀⠀⣿⣿⣿⡕⠁⠘⡇⢿⣿⣿ 9 | $7⣿⣿⣿⣿⣿⣯⣿⠃⢄⣈⣱⢦⡩⢀⠈⠻⣿⣧⢠⠀⢣⠸⣿⣿ 10 | $7⣿⣿⣿⣿⡟⠲⡁⡀⠒⠶⠮⡅⢭⡢⡀⣶⣄⠙⠸⣼⡘⣴⣿⣿ 11 | $7⣿⣿⣿⣿⣃⢤⠶⢄⡉⠾⣷⠶⢦⣡⠈⢎⠻⣷⠇⢠⠀⣿⣿⣿ 12 | $7⣿⣿⣿⣿⡀⡑⠙⠠⣉⡑⢒⠹⢦⠉⠀⣾⣧⣚⠂⢠⣿⣿⣿⣿ 13 | $7⣿⣿⣿⣿⣇⡀⡅⢢⠀⡉⢐⣭⢋⡜⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿ 14 | $7⣿⣿⣿⣿⣿⣦⣀⣀⣀⣜⣻⣴⣿⣵⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ -------------------------------------------------------------------------------- /vicinae/vicinae.json: -------------------------------------------------------------------------------- 1 | { 2 | "closeOnFocusLoss": true, 3 | "considerPreedit": false, 4 | "faviconService": "google", 5 | "font": { 6 | "size": 11 7 | }, 8 | "keybinding": "default", 9 | "keybinds": { 10 | }, 11 | "popToRootOnClose": true, 12 | "rootSearch": { 13 | "searchFiles": true 14 | }, 15 | "theme": { 16 | "name": "wallust" 17 | }, 18 | "window": { 19 | "csd": true, 20 | "opacity": 1, 21 | "rounding": 0 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /nvim/lua/plugins/asset/illuminati-logo.txt: -------------------------------------------------------------------------------- 1 | ⠀⠀⠀⡀⠀⡀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 2 | ⠐⠈⠊⠛⠋⠙⠛⠛⠂⠀⠀⢀⠈⢀⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀ 3 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢡⠀⠈⣀⢊⡜⠄⡇⠀⡐⠀⢀⠀⠀⠀⠀⠀⠀⠀ 4 | ⠀⠀⠀⠀⠀⠀⠀⠈⢆⢀⢣⣠⢣⡟⢻⣌⢴⡴⡀⡠⠃⠀⡀⠀⠀⠀⠀⠀ 5 | ⠀⠀⠀⠀⢄⠀⠈⠢⡢⣳⡿⣡⡟⠀⠀⠹⣎⢻⣝⣕⡴⠊⠀⡀⠀⠀⠀⠀ 6 | ⠀⠀⠀⢀⡀⠈⢓⣿⣾⡟⣱⠏⠀⠀⠀⠀⠹⣦⢻⣿⣮⣒⠁⠀⡀⠀⠀⠀ 7 | ⠀⠀⠀⠀⠀⠩⢷⣿⡟⣼⣯⣴⣞⣛⣙⣓⡦⣜⣧⡹⣿⡶⠍⠁⠀⠀⠀⠀ 8 | ⠀⠁⠀⠀⠀⢉⣽⢏⣼⣿⡛⠉⣇⢿⡿⢸⠋⢙⣿⢷⡹⣯⣉⠁⠀⠀⠀⠀ 9 | ⠀⠀⠀⠀⠀⣐⢎⡾⠃⠈⠙⠷⣮⣵⣾⣥⠶⠛⠁⠈⢷⡜⣆⠀⠈⠁⠀⠀ 10 | ⠀⠀⠀⠈⢡⢣⣾⣁⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣈⣿⣌⠌⠁⠀⠀⠀ 11 | ⠀⠀⠀⠀⠓⠒⢒⠖⠖⡶⣶⣶⣿⣷⣷⣷⣾⣿⢷⡲⠲⣖⠚⠚⠂⠀⠀⠀ 12 | ⠀⠀⠀⠀⠀⠀⠁⢀⠜⠈⡼⠘⡏⡟⡟⢸⠡⢳⠁⠑⡄⠀⠑⠀⠀⠀⠀⠀ 13 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⢠⠃⠀⡇⠀⡇⠀⢡⠀⠈⠀⠀⠀⠀⠀⠀⠀ 14 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⣀⡁⣀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀ 15 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠓⠛⠛⠛⠋⠙⠋⠃⠛⠉⠀⠑⠛⠛⠛ 16 | -------------------------------------------------------------------------------- /kitty/colors.conf: -------------------------------------------------------------------------------- 1 | cursor #CDD6F4 2 | 3 | foreground #CDD6F4 4 | background #1E1E2E 5 | 6 | # black 7 | color0 #45475A 8 | color8 #585B70 9 | 10 | # red 11 | color1 #F38BA8 12 | color9 #F38BA8 13 | 14 | # green 15 | color2 #A6E3A1 16 | color10 #A6E3A1 17 | 18 | # yellow 19 | color3 #F9E2AF 20 | color11 #F9E2AF 21 | 22 | # blue 23 | color4 #89B4FA 24 | color12 #89B4FA 25 | 26 | # magenta 27 | color5 #F5C2E7 28 | color13 #F5C2E7 29 | 30 | # cyan 31 | color6 #94E2D5 32 | color14 #94E2D5 33 | 34 | # white 35 | color7 #BAC2DE 36 | color15 #A6ADC8 37 | -------------------------------------------------------------------------------- /wallust/templates/neopywal.vim: -------------------------------------------------------------------------------- 1 | let background = "{{background}}" 2 | let foreground = "{{foreground}}" 3 | let cursor = "{{cursor}}" 4 | let color0 = "{{color0}}" 5 | let color1 = "{{color1}}" 6 | let color2 = "{{color2}}" 7 | let color3 = "{{color3}}" 8 | let color4 = "{{color4}}" 9 | let color5 = "{{color5}}" 10 | let color6 = "{{color6}}" 11 | let color7 = "{{color7}}" 12 | let color8 = "{{color8}}" 13 | let color9 = "{{color9}}" 14 | let color10 = "{{color10}}" 15 | let color11 = "{{color11}}" 16 | let color12 = "{{color12}}" 17 | let color13 = "{{color13}}" 18 | let color14 = "{{color14}}" 19 | let color15 = "{{color15}}" 20 | -------------------------------------------------------------------------------- /waybar/config.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "reload_style_on_change": true, 3 | "toggle": true, 4 | "layer": "top", 5 | "position": "left", 6 | "margin-top": 0, 7 | "margin-bottom": 0, 8 | "margin-left": 0, 9 | "margin-right": 0, 10 | "spacing": 0, 11 | "include": ["~/.config/waybar/modules.json"], 12 | "modules-left": ["custom/cachy", "clock", "cpu"], 13 | "modules-center": ["mpris", "niri/workspaces", "privacy"], 14 | "modules-right": [ 15 | "group/extras", 16 | "network", 17 | "bluetooth", 18 | "pulseaudio#microphone", 19 | "group/audio", 20 | "group/brightness", 21 | "battery" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /wallust/templates/kitty.conf: -------------------------------------------------------------------------------- 1 | cursor {{cursor}} 2 | 3 | foreground {{foreground}} 4 | background {{background}} 5 | 6 | # black 7 | color0 {{color0 }} 8 | color8 {{color8 }} 9 | 10 | # red 11 | color1 {{color1 }} 12 | color9 {{color9 }} 13 | 14 | # green 15 | color2 {{color2 }} 16 | color10 {{color10 }} 17 | 18 | # yellow 19 | color3 {{color3 }} 20 | color11 {{color11 }} 21 | 22 | # blue 23 | color4 {{color4 }} 24 | color12 {{color12 }} 25 | 26 | # magenta 27 | color5 {{color5 }} 28 | color13 {{color13 }} 29 | 30 | # cyan 31 | color6 {{color6 }} 32 | color14 {{color14 }} 33 | 34 | # white 35 | color7 {{color7 }} 36 | color15 {{color15 }} 37 | -------------------------------------------------------------------------------- /nvim/lua/config/autocmds.lua: -------------------------------------------------------------------------------- 1 | -- Autocmds are automatically loaded on the VeryLazy event 2 | -- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua 3 | -- 4 | -- Add any additional autocmds here 5 | -- with `vim.api.nvim_create_autocmd` 6 | -- 7 | -- Or remove existing autocmds by their group name (which is prefixed with `lazyvim_` for the defaults) 8 | -- e.g. vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell") 9 | 10 | -- Autosave on insert leave and text change 11 | -- vim.api.nvim_create_autocmd({ "InsertLeave", "TextChanged" }, { 12 | -- pattern = { "*" }, 13 | -- command = "silent! wall", 14 | -- nested = true, 15 | -- }) 16 | -------------------------------------------------------------------------------- /alacritty/colors.toml: -------------------------------------------------------------------------------- 1 | # wallust.toml needs to include this 2 | # alacritty = { template = 'alacritty.toml', target = '~/.config/alacritty/colors.toml' } 3 | # and alacritty.toml should import that file under [general] 4 | [colors.primary] 5 | background = "#1E1E2E" 6 | foreground = "#CDD6F4" 7 | 8 | [colors.normal] 9 | black = "#45475A" 10 | red = "#F38BA8" 11 | green = "#A6E3A1" 12 | yellow = "#F9E2AF" 13 | blue = "#89B4FA" 14 | magenta = "#F5C2E7" 15 | cyan = "#94E2D5" 16 | white = "#BAC2DE" 17 | 18 | [colors.bright] 19 | black = "#585B70" 20 | red = "#F38BA8" 21 | green = "#A6E3A1" 22 | yellow = "#F9E2AF" 23 | blue = "#89B4FA" 24 | magenta = "#F5C2E7" 25 | cyan = "#94E2D5" 26 | white = "#A6ADC8" 27 | -------------------------------------------------------------------------------- /wallust/templates/alacritty.toml: -------------------------------------------------------------------------------- 1 | # wallust.toml needs to include this 2 | # alacritty = { template = 'alacritty.toml', target = '~/.config/alacritty/colors.toml' } 3 | # and alacritty.toml should import that file under [general] 4 | [colors.primary] 5 | background = "{{background}}" 6 | foreground = "{{foreground}}" 7 | 8 | [colors.normal] 9 | black = "{{color0}}" 10 | red = "{{color1}}" 11 | green = "{{color2}}" 12 | yellow = "{{color3}}" 13 | blue = "{{color4}}" 14 | magenta = "{{color5}}" 15 | cyan = "{{color6}}" 16 | white = "{{color7}}" 17 | 18 | [colors.bright] 19 | black = "{{color8}}" 20 | red = "{{color9}}" 21 | green = "{{color10}}" 22 | yellow = "{{color11}}" 23 | blue = "{{color12}}" 24 | magenta = "{{color13}}" 25 | cyan = "{{color14}}" 26 | white = "{{color15}}" 27 | -------------------------------------------------------------------------------- /wallust/templates/vscode.json: -------------------------------------------------------------------------------- 1 | { 2 | "checksum": ":)", 3 | "wallpaper": "{{wallpaper}}", 4 | "alpha": "100", 5 | 6 | "special": { 7 | "background": "{{background}}", 8 | "foreground": "{{foreground}}", 9 | "cursor": "{{cursor}}" 10 | }, 11 | "colors": { 12 | "color0": "{{color0}}", 13 | "color1": "{{color1}}", 14 | "color2": "{{color2}}", 15 | "color3": "{{color3}}", 16 | "color4": "{{color4}}", 17 | "color5": "{{color5}}", 18 | "color6": "{{color6}}", 19 | "color7": "{{color7}}", 20 | "color8": "{{color8}}", 21 | "color9": "{{color9}}", 22 | "color10": "{{color10}}", 23 | "color11": "{{color11}}", 24 | "color12": "{{color12}}", 25 | "color13": "{{color13}}", 26 | "color14": "{{color14}}", 27 | "color15": "{{color15}}" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /wallust/templates/colors.css: -------------------------------------------------------------------------------- 1 | /* CSS variables for wallust 2 | * You can use this template by adding the following to wallust.toml: 3 | css = { src = "colors.css", dst = "~/.config/" } 4 | */ 5 | 6 | :root { 7 | --wallpaper: url("{{wallpaper}}"); 8 | 9 | /* Special */ 10 | --background: {{background}}; 11 | --foreground: {{foreground}}; 12 | --cursor: {{cursor}}; 13 | 14 | /* Colors */ 15 | --color0: {{color0 }}; 16 | --color1: {{color1 }}; 17 | --color2: {{color2 }}; 18 | --color3: {{color3 }}; 19 | --color4: {{color4 }}; 20 | --color5: {{color5 }}; 21 | --color6: {{color6 }}; 22 | --color7: {{color7 }}; 23 | --color8: {{color8 }}; 24 | --color9: {{color9 }}; 25 | --color10: {{color10}}; 26 | --color11: {{color11}}; 27 | --color12: {{color12}}; 28 | --color13: {{color13}}; 29 | --color14: {{color14}}; 30 | --color15: {{color15}}; 31 | } 32 | -------------------------------------------------------------------------------- /waybar/colors.css: -------------------------------------------------------------------------------- 1 | /* CSS variables for Waybar 2 | * You can add it to wallust.toml with: 3 | 4 | waybar = { src = "waybar.css", dst = "~/.config/waybar/colors.css" } 5 | 6 | * And then in you waybar 'style.css' file, import it with: 7 | 8 | @import url("colors.css"); 9 | */ 10 | 11 | @define-color cursor #CDD6F4; 12 | @define-color background #1E1E2E; 13 | @define-color foreground #CDD6F4; 14 | @define-color color0 #45475A; 15 | @define-color color1 #F38BA8; 16 | @define-color color2 #A6E3A1; 17 | @define-color color3 #F9E2AF; 18 | @define-color color4 #89B4FA; 19 | @define-color color5 #F5C2E7; 20 | @define-color color6 #94E2D5; 21 | @define-color color7 #BAC2DE; 22 | @define-color color8 #585B70; 23 | @define-color color9 #F38BA8; 24 | @define-color color10 #A6E3A1; 25 | @define-color color11 #F9E2AF; 26 | @define-color color12 #89B4FA; 27 | @define-color color13 #F5C2E7; 28 | @define-color color14 #94E2D5; 29 | @define-color color15 #A6ADC8; 30 | -------------------------------------------------------------------------------- /wallust/templates/gtk.css: -------------------------------------------------------------------------------- 1 | @define-color accent_color {{color2 | darken(0.1)}} 2 | @define-color accent_fg_color {{color4 | lighten(0.1)}}; 3 | @define-color accent_bg_color {{color2 | darken(0.1)}} 4 | @define-color window_bg_color {{color0 | darken(0.1)}}; 5 | @define-color window_fg_color {{color7 | lighten(0.1)}}; 6 | @define-color headerbar_bg_color {{color0 | darken(0.1)}}; 7 | @define-color headerbar_fg_color {{color7 | lighten(0.1)}}; 8 | @define-color popover_bg_color {{color0 | darken(0.1)}}; 9 | @define-color popover_fg_color {{color7 | lighten(0.1)}}; 10 | @define-color view_bg_color {{color0}} 11 | @define-color view_fg_color {{color7 | lighten(0.1)}}; 12 | @define-color card_bg_color {{color0}} 13 | @define-color card_fg_color {{color7 | lighten(0.1)}}; 14 | @define-color sidebar_bg_color @window_bg_color; 15 | @define-color sidebar_fg_color @window_fg_color; 16 | @define-color sidebar_border_color @window_bg_color; 17 | @define-color sidebar_backdrop_color @window_bg_color; 18 | -------------------------------------------------------------------------------- /scripts/low-battery-notify.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | notified_20=0 3 | notified_10=0 4 | notified_5=0 5 | 6 | while true; do 7 | battery_status=$(acpi -b | grep -o 'Discharging\|Charging') 8 | battery_level=$(acpi -b | grep -P -o '[0-9]+(?=%)') 9 | 10 | if [ "$battery_status" = "Discharging" ]; then 11 | if [ "$battery_level" -eq 20 ] && [ "$notified_20" -eq 0 ]; then 12 | notify-send -u critical "Battery 20%" "Connect charger" 13 | notified_20=1 14 | fi 15 | 16 | if [ "$battery_level" -eq 10 ] && [ "$notified_10" -eq 0 ]; then 17 | notify-send -u critical "Battery 10%" "Connect charger now" 18 | notified_10=1 19 | fi 20 | 21 | if [ "$battery_level" -eq 5 ] && [ "$notified_5" -eq 0 ]; then 22 | notify-send -u critical "Battery 5%" "System will shutdown" 23 | notified_5=1 24 | fi 25 | fi 26 | 27 | if [ "$battery_status" = "Charging" ] || [ "$battery_level" -gt 21 ]; then 28 | notified_20=0 29 | notified_10=0 30 | notified_5=0 31 | fi 32 | 33 | sleep 60 34 | done 35 | -------------------------------------------------------------------------------- /wallust/templates/waybar.css: -------------------------------------------------------------------------------- 1 | /* CSS variables for Waybar 2 | * You can add it to wallust.toml with: 3 | 4 | waybar = { src = "waybar.css", dst = "~/.config/waybar/colors.css" } 5 | 6 | * And then in you waybar 'style.css' file, import it with: 7 | 8 | @import url("colors.css"); 9 | */ 10 | 11 | @define-color cursor {{cursor}}; 12 | @define-color background {{background}}; 13 | @define-color foreground {{foreground}}; 14 | @define-color color0 {{color0 }}; 15 | @define-color color1 {{color1 }}; 16 | @define-color color2 {{color2 }}; 17 | @define-color color3 {{color3 }}; 18 | @define-color color4 {{color4 }}; 19 | @define-color color5 {{color5 }}; 20 | @define-color color6 {{color6 }}; 21 | @define-color color7 {{color7 }}; 22 | @define-color color8 {{color8 }}; 23 | @define-color color9 {{color9 }}; 24 | @define-color color10 {{color10}}; 25 | @define-color color11 {{color11}}; 26 | @define-color color12 {{color12}}; 27 | @define-color color13 {{color13}}; 28 | @define-color color14 {{color14}}; 29 | @define-color color15 {{color15}}; 30 | -------------------------------------------------------------------------------- /nvim/lua/plugins/asset/skull-fuck-you.txt: -------------------------------------------------------------------------------- 1 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 2 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 3 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 4 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⣸⠀⣠⣄⡀⠀⣀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 5 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⢨⣿⣿⣿⣿⣿⠀⠀⢀⡰⠡⣾⣿⣿⡇⠰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 6 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⣸⣿⣿⣿⣿⣿⣆⠘⣥⣄⠀⠘⠋⠉⣴⣶⠉⢉⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 7 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠛⡯⡿⢿⣿⣿⣿⣿⣿⣦⣯⠉⢹⣿⡆⠀⠉⠉⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 8 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⡔⢸⣁⡇⢸⢸⣿⣿⣿⣿⣿⣿⠀⠀⠻⠿⠿⠷⠷⣿⣿⣿⣿⣿⣿⣿⡿⡛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 9 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⢣⣸⢸⢇⡏⣸⣿⣿⣿⣿⣿⣿⣿⠶⠤⠤⣄⠀⢀⣸⣿⣿⣿⣿⣿⣿⣿⣉⠲⢮⢿⣿⣿⣿⣿⣿⣿⣿ 10 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⢿⣟⣿⣼⣿⣿⣿⣿⣿⣿⣿⠯⠭⠥⢦⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⢉⣿⠀⠈⣿⣿⣿⣿⣿⣿⣿ 11 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠉⡟⠚⡿⠿⣿⣿⣿⡿⣻⣿⠥⣤⣶⡶⢿⣭⣛⢿⣿⣿⣿⣿⣿⣿⣷⣶⡏⠀⣆⣿⣿⣿⣿⣿⣿⣿ 12 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠸⠀⡾⣷⠖⠒⡖⢿⣿⡿⠟⠛⠛⣉⡟⠛⠙⢯⠽⢿⣞⠙⡟⠛⠚⢿⣿⡿⠲⠿⢻⣿⣿⣿⣿⣿⣿ 13 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⢸⠀⢸⢀⡞⣷⣈⠻⢿⣶⣶⣶⣾⣷⣄⠀⣼⣷⣿⡿⣿⢧⡀⠀⣼⣿⣷⣄⠀⢸⣿⣿⣿⣿⣿⣿ 14 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⢠⡏⣸⣷⡘⠿⣷⣶⣤⣤⣤⣤⡴⢿⡄⠘⣿⣿⣶⡿⢆⣳⡄⠘⣿⣿⡇⢱⣾⣿⣿⣿⣿⣿⣿ 15 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⢰⣾⣷⣿⡙⢿⣶⣤⣈⣉⣉⣉⣡⣴⣾⣄⠀⢹⣶⣭⣥⣿⢿⣿⣆⠈⢿⣇⣾⣿⣿⣿⣿⣿⣿⣿ 16 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⣯⠳⣤⡉⠛⠻⠿⠿⠿⠿⠛⣡⣿⡀⠘⣮⣙⣛⣋⣼⣿⣿⣦⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿ 17 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡈⠛⠷⣶⣤⣤⣴⣶⠿⠛⣡⡇⠘⣮⡻⢿⣿⡿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 18 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣤⣀⣀⣀⣤⣴⣾⣿⣿⣶⣿⣿⣷⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 19 | ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 20 | -------------------------------------------------------------------------------- /nvim/lua/plugins/asset/coffin-logo.txt: -------------------------------------------------------------------------------- 1 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 2 | ⠀⠀⠀⠀⠀⠀⠀⡀⢄⢮⡳⣶⢭⣖⣢⡤⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 3 | ⠀⠀⠀⢀⢤⣢⣵⣾⣾⣿⣿⣿⣹⣿⣿⣿⣿⣶⣯⣵⣒⡠⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 4 | ⠀⠀⠀⢸⣎⣿⣿⣿⣿⣿⡿⠛⠛⠻⣿⣿⣿⣿⣿⣿⡇⣿⣟⣵⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 5 | ⠀⠀⠀⢸⡇⠼⣿⣿⣿⡟⠀⢠⣤⢸⡊⢻⣿⡿⣿⣿⡇⣿⣿⣷⣝⣕⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 6 | ⠀⠀⠀⢸⡇⢑⢻⣿⣿⣧⡀⣅⡡⣠⠆⠹⣿⣿⣿⣿⣷⣿⣿⣿⣿⣷⢟⢯⠢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 7 | ⠀⠀⠀⢸⡇⣸⢉⢿⣯⣿⣿⣶⣧⣤⣰⣾⣿⡟⠽⣋⣈⢿⣿⣿⣿⣿⢸⣷⣝⠮⡢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 8 | ⠀⠀⠀⢸⣷⣿⠠⣞⢿⣿⣿⣿⣿⢟⡫⡗⡢⡑⢭⣗⡺⢷⣙⠿⣿⣿⣼⣿⢿⣷⣍⣎⡢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 9 | ⠀⠀⠀⢸⣿⣿⣼⡏⠗⢝⢿⣿⡈⢥⣿⠞⡜⡼⣾⣛⢿⣛⣻⣷⣰⠹⣻⣿⣿⣿⣿⣿⣮⡪⡢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 10 | ⠀⠀⠀⣸⣿⣿⣾⡇⠄⠁⠋⣊⢟⠬⡻⣯⡵⣣⡻⣟⡦⢾⣿⣋⣇⢉⣿⣿⣿⣿⣿⣿⣿⣿⣿⡪⡢⡀⠀⠀⠀⠀⠀⠀⠀ 11 | ⠠⠰⣹⢔⠹⣿⣿⣫⠁⠀⢰⡌⢿⡎⢜⠝⡿⣟⡫⢗⡫⠏⠙⢫⣵⠘⣄⡘⠿⣿⣿⣿⣿⣿⣿⣿⣾⣮⡢⡀⠀⠀⠀⠀⠀ 12 | ⠀⠀⠀⠄⡚⠘⢿⣯⡅⠀⢸⠇⠄⠀⠀⠉⠲⠔⡱⡻⢿⣽⣁⠢⢼⣶⣿⣿⣷⣬⡉⡹⠿⣿⣿⣿⣿⣿⣯⡪⡢⡀⠀⠀⠀ 13 | ⠀⠀⠠⠀⢀⠄⠎⢿⣷⠀⢸⠇⡄⡆⡌⠁⡂⠀⡘⢠⠱⠨⢛⢿⣶⣬⡉⡹⠻⣿⣷⣢⣄⠙⢿⣿⣿⣿⣿⡿⠞⢞⡆⠀⠀ 14 | ⠀⠀⠀⠀⠈⠈⠒⠊⡻⡇⡄⡒⠤⡀⠁⠃⠁⢠⢀⠁⠀⠀⠂⢉⢊⠝⠿⣶⡤⡘⢿⣿⣷⣝⢦⣙⠿⡛⣉⣼⣾⣿⡇⠀⠀ 15 | ⠀⠀⠀⠀⠀⠘⠠⢬⠐⠱⠺⢵⡣⢆⡅⢆⡎⠘⠈⠘⢰⠰⠀⠃⠎⡔⠸⢐⠹⢻⢵⡩⣛⢟⢋⣡⣵⣿⡟⢹⢿⣿⡇⠀⠀ 16 | ⠀⠀⠀⠀⠀⠀⠂⠄⡈⢀⠀⠑⢉⢓⠾⡥⢨⠐⡠⣀⠂⠆⡄⡄⡀⠐⢀⠀⡌⡖⢌⠪⣤⢾⣿⣿⣿⣏⣍⢰⣿⢿⡇⢤⠀ 17 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠋⠐⠁⠀⠈⠐⠱⠁⢊⢅⡃⠉⢒⠤⡁⠃⠦⢌⠘⠀⠁⠀⠂⣿⣿⣿⣿⣿⣿⣧⣸⣾⣿⡇⢠⠰ 18 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠄⠄⡀⠂⠅⠌⠕⣰⢈⠒⠵⢢⢎⣐⠀⡃⠄⠀⣿⢷⣿⣿⣿⣟⣯⣷⠿⢻⢱⠂⠈ 19 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠈⠀⢉⢒⠄⡂⡖⡩⢒⠄⠀⣿⡿⣟⣽⣾⡟⡏⠆⠀⠑⠈⠀⠀ 20 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠄⠂⠈⠈⢑⠣⢇⡎⠄⣿⣿⡿⡉⠃⠃⠀⠀⠀⠀⠀⠀⠀ 21 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⠁⠁⠀⠎⠛⠉⡀⠉⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀ 22 | -------------------------------------------------------------------------------- /nvim/lazyvim.json: -------------------------------------------------------------------------------- 1 | { 2 | "extras": [ 3 | "lazyvim.plugins.extras.editor.inc-rename", 4 | "lazyvim.plugins.extras.editor.refactoring", 5 | "lazyvim.plugins.extras.formatting.prettier", 6 | "lazyvim.plugins.extras.lang.angular", 7 | "lazyvim.plugins.extras.lang.clangd", 8 | "lazyvim.plugins.extras.lang.cmake", 9 | "lazyvim.plugins.extras.lang.docker", 10 | "lazyvim.plugins.extras.lang.go", 11 | "lazyvim.plugins.extras.lang.json", 12 | "lazyvim.plugins.extras.lang.markdown", 13 | "lazyvim.plugins.extras.lang.python", 14 | "lazyvim.plugins.extras.lang.rust", 15 | "lazyvim.plugins.extras.lang.tailwind", 16 | "lazyvim.plugins.extras.lang.toml", 17 | "lazyvim.plugins.extras.lang.typescript", 18 | "lazyvim.plugins.extras.linting.eslint", 19 | "lazyvim.plugins.extras.ui.dashboard-nvim", 20 | "lazyvim.plugins.extras.ui.edgy", 21 | "lazyvim.plugins.extras.util.dot", 22 | "lazyvim.plugins.extras.util.mini-hipatterns" 23 | ], 24 | "install_version": 8, 25 | "news": { 26 | "NEWS.md": "11866" 27 | }, 28 | "version": 8 29 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Saatvik Sharma 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 | -------------------------------------------------------------------------------- /kitty/kitty.conf: -------------------------------------------------------------------------------- 1 | include $HOME/.config/kitty/colors.conf 2 | 3 | font_family JetBrainsMono Nerd Font 4 | font_size 12 5 | bold_font auto 6 | italic_font auto 7 | bold_italic_font auto 8 | cursor_shape block 9 | cursor_blink_interval 0.5 10 | cursor_stop_blinking_after 1 11 | scrollback_lines 5000 12 | scrollback_indicator_opacity 0 13 | wheel_scroll_min_lines 1 14 | touch_scroll_multiplier 4 15 | enable_audio_bell no 16 | window_padding_width 10 17 | hide_window_decorations yes 18 | background_opacity 1 19 | dynamic_background_opacity yes 20 | confirm_os_window_close 0 21 | selection_foreground none 22 | selection_background none 23 | # Performance settings, if you have a high end CPU; do enable 24 | # input_delay 0 25 | # repaint_delay 2 26 | sync_to_monitor no 27 | wayland_enable_ime no 28 | -------------------------------------------------------------------------------- /nvim/lua/plugins/asset/death-star-logo.txt: -------------------------------------------------------------------------------- 1 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⠀⢤⡤⡤⢤⢤⢤⠤⠄⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 2 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠴⠂⠉⠁⣀⢠⡊⠀⠀⠀⠀⢈⢻⣄⣀⣈⣉⣐⠢⠄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 3 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠊⠉⠁⠀⠀⠂⠄⠀⠀⠀⠀⠀⠀⠀⠀⠠⣶⠔⡎⢒⠶⣄⠀⠉⡑⢦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 4 | ⠀⠀⠀⠀⠀⠀⠀⣠⠾⠉⠀⠀⠀⠀⡀⠠⠆⠀⠀⠀⠀⠀⠀⠀⠘⠀⠀⢾⣆⡘⢷⡸⠢⠲⡀⢑⠄⠉⠳⣄⠀⠀⠀⠀⠀⠀⠀ 5 | ⠀⠀⠀⠀⠀⣠⠞⠁⣀⣀⣠⠄⠀⡌⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣏⣳⡘⣯⡘⣧⠰⡆⠙⡔⠬⠾⣷⣄⠀⠀⠀⠀⠀ 6 | ⠀⠀⠀⠀⡔⢃⠔⣋⠤⠀⠐⠽⡞⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⡿⣌⡇⠸⣇⠘⣷⠘⣧⡘⢮⢻⣝⣎⢧⡀⠀⠀⠀ 7 | ⠀⠀⢀⠞⡴⢡⠞⠡⠀⠀⠀⠀⢹⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⢠⡏⣷⡁⢙⣆⢹⣷⡘⣧⣨⣯⣿⣽⣯⣷⡀⠀⠀ 8 | ⠀⠀⡞⡜⡰⠉⢲⣄⡣⣔⣢⡄⠸⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣲⡀⠜⣏⣁⢉⣺⣶⢒⣫⡼⣾⡥⡾⠻⣿⣿⣿⣷⡀⠀ 9 | ⠀⡼⣴⠀⠀⠀⠀⠑⡞⠁⠈⡇⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⡞⡇⣳⣿⠁⠨⣿⢿⠈⠛⢫⢹⢏⣧⣤⣿⣷⣿⣿⣷⠀ 10 | ⢠⢣⠀⠀⠀⠀⠀⢸⡀⠀⡜⠉⠀⠀⠄⠀⠀⠀⠀⠀⠠⠄⠠⠀⠃⠄⠇⠷⠟⠷⡽⠼⡞⣻⢷⣱⣿⣿⢺⣿⣿⣿⣿⣿⣿⣿⡄ 11 | ⣼⣼⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡂⢰⠸⢼⢹⠄⠁⠆⢨⠧⠀⢺⢸⠘⡿⠉⣻⡏⣿⣿⣿⢿⣿⣿⣿⣧ 12 | ⡿⠠⡆⠀⢄⡀⠀⢀⡠⡦⠂⠀⠀⠀⢐⠀⠀⠀⠀⢠⢸⠀⢸⢸⢸⠀⠀⠐⢶⣿⡃⠀⠠⠘⡇⣧⣾⣿⣇⣿⣿⣿⣾⣿⣿⣿⣿ 13 | ⡇⣀⡆⣄⠀⠈⠉⢑⠃⢈⠀⠀⠀⠀⢸⠆⠀⣀⠀⠀⢐⠌⢲⢸⠸⠋⠀⢀⢾⣬⡗⢶⣠⡲⡇⣿⣿⣿⣿⢸⣿⣿⡇⣿⣿⣿⣿ 14 | ⣿⢭⡁⠈⠉⠀⠀⢐⠀⠐⠀⠀⠀⠀⢸⡀⠀⠀⠀⢠⢸⡅⠘⢸⠨⠁⠀⠰⡙⢹⢧⡾⣻⣿⡇⢸⣿⣿⣿⢸⣿⡿⠟⠟⣋⣭⣿ 15 | ⢸⣶⣬⣝⡒⠦⢤⣤⣄⣁⣀⠀⠀⠀⠘⠋⠈⠘⠛⠲⠸⠲⠞⠺⠸⠿⠦⠳⠓⠙⠘⠛⠛⠛⠃⠘⣋⣉⣩⣤⣤⡴⠖⣛⣯⣿⡟ 16 | ⠈⡄⡿⠴⠄⣭⢃⢰⢰⢤⢬⡍⣍⡙⡛⣛⣛⡛⡓⠒⠒⠒⠒⠒⠒⠒⠐⠒⣛⣛⣛⣛⣛⣻⣯⣭⣭⣽⣶⣾⣿⣿⣿⣿⣿⣿⠃ 17 | ⠀⢻⣽⢮⢺⣋⠦⠙⡰⣏⡘⣪⡧⡦⣷⡊⢨⡇⡿⢏⣿⣧⡤⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀ 18 | ⠀⠀⢿⣾⡇⡾⡎⣐⡇⡷⡋⢹⣽⢟⡻⣯⣤⣼⣿⣷⢿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀ 19 | ⠀⠀⠈⢿⣿⣿⣷⡯⢿⣰⣆⡳⣿⣿⣿⣿⣷⣽⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀ 20 | ⠀⠀⠀⠀⠻⣿⣷⣿⣿⣏⣿⣿⣿⣿⣷⣿⣿⣿⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⠀⠀⠀ 21 | ⠀⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀⠀ 22 | ⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⠀⠀⠀⠀⠀⠀ 23 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀ 24 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 25 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠙⠛⠛⠛⠛⠛⠋⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # IDE & Editor Configurations 2 | Code/ 3 | Cursor/ 4 | .vscode/ 5 | .factory/ 6 | Kiro/ 7 | configstore/ 8 | blender/ 9 | zed/ 10 | acli/ 11 | Antigravity/ 12 | Postman/ 13 | 14 | # Development Tools & Languages 15 | go/ 16 | gopls/ 17 | flutter/ 18 | fontforge/ 19 | nextjs-nodejs/ 20 | 21 | # Browsers 22 | google-chrome/ 23 | .mozilla/ 24 | 25 | # Communication 26 | discord/ 27 | vesktop/ 28 | Slack/ 29 | 30 | # Media & Entertainment 31 | spotify/ 32 | spotify-player/ 33 | obs-studio/ 34 | LosslessCut/ 35 | inkscape/ 36 | obsidian/ 37 | kew/lastPlaylist.m3u 38 | kew/kewlibrary 39 | bongocat/ 40 | 41 | # System & Utilities 42 | nwg-look/ 43 | nwg-displays/ 44 | # systemd/ 45 | balenaEtcher/ 46 | yay/ 47 | easyeffects/ 48 | thefuck/ 49 | qBittorrent/ 50 | sherlock/ 51 | eog/ 52 | autostart/ 53 | ranger/ 54 | nautilus/ 55 | bottom/ 56 | celluloid/ 57 | s-tui/ 58 | kew/ 59 | Thunar/ 60 | waytrogen/ 61 | qView/ 62 | libvirt/ 63 | gnome-boxes/ 64 | deluge/ 65 | AirPodsTrayApp/ 66 | rustdesk/ 67 | GIMP/ 68 | 69 | # Desktop Environment & Frameworks 70 | kde.org/ 71 | ego/ 72 | cachyos/ 73 | gtk-3.0/ 74 | gtk-4.0/ 75 | qt6ct/ 76 | qt5ct/ 77 | xfce4/ 78 | QtProject.conf 79 | xsettingsd/ 80 | htop/ 81 | mimeapps.list 82 | user-dirs.dirs 83 | user-dirs.locale 84 | dconf/ 85 | 86 | # Audio 87 | pulse/ 88 | 89 | # Electron Apps 90 | Electron/ 91 | Notion/ 92 | 93 | *.env 94 | *.swp.* 95 | temp.md 96 | -------------------------------------------------------------------------------- /zathura/zathurarc: -------------------------------------------------------------------------------- 1 | set selection-clipboard clipboard 2 | set notification-error-bg "#F38BA8" 3 | set notification-error-fg "#A6ADC8" 4 | set notification-warning-bg "#F9E2AF" 5 | set notification-warning-fg "#45475A" 6 | set notification-bg "#45475A" 7 | set notification-fg "#A6ADC8" 8 | 9 | set completion-bg "#45475A" 10 | set completion-fg "#89B4FA" 11 | set completion-group-bg "#45475A" 12 | set completion-group-fg "#89B4FA" 13 | set completion-highlight-bg "#89B4FA" 14 | set completion-highlight-fg "#45475A" 15 | 16 | set index-bg "#45475A" 17 | set index-fg "#A6ADC8" 18 | set index-active-bg "#89B4FA" 19 | set index-active-fg "#45475A" 20 | 21 | set inputbar-bg "#45475A" 22 | set inputbar-fg "#A6ADC8" 23 | 24 | set statusbar-bg "#45475A" 25 | set statusbar-fg "#A6ADC8" 26 | 27 | set highlight-color "#F9E2AF" 28 | set highlight-active-color "#A6E3A1" 29 | 30 | set default-bg "#1E1E2E" 31 | set default-fg "#CDD6F4" 32 | set render-loading true 33 | set render-loading-bg "#1E1E2E" 34 | set render-loading-fg "#CDD6F4" 35 | 36 | set recolor-lightcolor "#1E1E2E" 37 | set recolor-darkcolor "#CDD6F4" 38 | -------------------------------------------------------------------------------- /wallust/templates/zathurarc: -------------------------------------------------------------------------------- 1 | set selection-clipboard clipboard 2 | set notification-error-bg "{{color1}}" 3 | set notification-error-fg "{{color15}}" 4 | set notification-warning-bg "{{color3}}" 5 | set notification-warning-fg "{{color0}}" 6 | set notification-bg "{{color0}}" 7 | set notification-fg "{{color15}}" 8 | 9 | set completion-bg "{{color0}}" 10 | set completion-fg "{{color4}}" 11 | set completion-group-bg "{{color0}}" 12 | set completion-group-fg "{{color4}}" 13 | set completion-highlight-bg "{{color4}}" 14 | set completion-highlight-fg "{{color0}}" 15 | 16 | set index-bg "{{color0}}" 17 | set index-fg "{{color15}}" 18 | set index-active-bg "{{color4}}" 19 | set index-active-fg "{{color0}}" 20 | 21 | set inputbar-bg "{{color0}}" 22 | set inputbar-fg "{{color15}}" 23 | 24 | set statusbar-bg "{{color0}}" 25 | set statusbar-fg "{{color15}}" 26 | 27 | set highlight-color "{{color3}}" 28 | set highlight-active-color "{{color2}}" 29 | 30 | set default-bg "{{background}}" 31 | set default-fg "{{foreground}}" 32 | set render-loading true 33 | set render-loading-bg "{{background}}" 34 | set render-loading-fg "{{foreground}}" 35 | 36 | set recolor-lightcolor "{{background}}" 37 | set recolor-darkcolor "{{foreground}}" 38 | -------------------------------------------------------------------------------- /nvim/lua/config/options.lua: -------------------------------------------------------------------------------- 1 | -- Options are automatically loaded before lazy.nvim startup 2 | -- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua 3 | -- Add any additional options here 4 | -- File handling: Swap, Backup, Undo 5 | -- Store swap files in the same directory as the file being edited 6 | vim.opt.swapfile = true 7 | vim.opt.directory = "." 8 | 9 | -- Store backup files in the same directory as the file being edited 10 | vim.opt.backup = false -- Disable backups if you prefer (they can clutter directories) 11 | -- If you want backups, uncomment the lines below and comment the line above 12 | -- vim.opt.backup = true 13 | -- vim.opt.backupdir = "." 14 | 15 | -- Persistent undo history (stored in a central location) 16 | vim.opt.undofile = true 17 | vim.opt.undodir = vim.fn.stdpath("data") .. "/undo//" -- Use Neovim's data directory for undo files 18 | 19 | -- -- Enable true colors for proper colorscheme support 20 | -- vim.opt.termguicolors = true 21 | -- vim.cmd("set t_Co=256") 22 | 23 | -- Ensure terminal opens in current working directory 24 | vim.api.nvim_create_autocmd("TermOpen", { 25 | callback = function() 26 | vim.opt_local.number = false 27 | vim.opt_local.relativenumber = false 28 | vim.opt_local.signcolumn = "no" 29 | end 30 | }) 31 | 32 | -- Ensure format on save is enabled 33 | vim.api.nvim_create_autocmd("BufWritePre", { 34 | pattern = "*", 35 | callback = function(args) 36 | require("conform").format({ 37 | bufnr = args.buf 38 | }) 39 | end 40 | }) 41 | -------------------------------------------------------------------------------- /fastfetch/config.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", 3 | "logo": { 4 | "source": "$HOME/.config/fastfetch/logo.txt", 5 | "color": { 6 | "1": "black", 7 | "2": "red", 8 | "3": "green", 9 | "4": "yellow", 10 | "5": "blue", 11 | "6": "magenta", 12 | "7": "cyan", 13 | "8": "white" 14 | }, 15 | "padding": { 16 | "right": 2 17 | } 18 | }, 19 | "display": { 20 | "separator": " " 21 | }, 22 | "modules": [ 23 | "title", 24 | { 25 | "type": "os", 26 | "key": "OS ", 27 | "keyColor": "31" // = color1 28 | }, 29 | { 30 | "type": "kernel", 31 | "key": "Kernel", 32 | "keyColor": "32" 33 | }, 34 | { 35 | "type": "host", 36 | "format": "{5} {1}", 37 | "key": "Host ", 38 | "keyColor": "33" 39 | }, 40 | { 41 | "type": "terminal", 42 | "key": "Term ", 43 | "keyColor": "34" 44 | }, 45 | { 46 | "type": "packages", 47 | "format": "{} (pacman)", 48 | "key": "Pkgs ", 49 | "keyColor": "35" 50 | }, 51 | { 52 | "type": "uptime", 53 | "format": "{2}h {3}m", 54 | "key": "Uptime", 55 | "keyColor": "36" 56 | }, 57 | { 58 | "type": "cpu", 59 | "key": "CPU ", 60 | "keyColor": "37" 61 | }, 62 | { 63 | "type": "memory", 64 | "key": "Memory", 65 | "keyColor": "37" 66 | }, 67 | { 68 | "type": "disk", 69 | "key": "Disk ", 70 | "keyColor": "37" 71 | }, 72 | { 73 | "type": "battery", 74 | "key": "Bat ", 75 | "keyColor": "37" 76 | }, 77 | "break", 78 | "colors" 79 | ] 80 | } 81 | -------------------------------------------------------------------------------- /nvim/.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | BasedOnStyle: Google 4 | IndentWidth: 2 5 | TabWidth: 2 6 | UseTab: Never 7 | ColumnLimit: 80 8 | BreakBeforeBraces: Attach 9 | AllowShortIfStatementsOnASingleLine: WithoutElse 10 | AllowShortLoopsOnASingleLine: true 11 | AllowShortFunctionsOnASingleLine: All 12 | AllowShortBlocksOnASingleLine: Never 13 | AlignAfterOpenBracket: Align 14 | AlignConsecutiveAssignments: false 15 | AlignConsecutiveDeclarations: false 16 | AlignOperands: true 17 | AlignTrailingComments: true 18 | BinPackArguments: true 19 | BinPackParameters: true 20 | BreakBeforeBinaryOperators: None 21 | BreakBeforeTernaryOperators: true 22 | BreakConstructorInitializersBeforeComma: false 23 | BreakAfterJavaFieldAnnotations: false 24 | BreakStringLiterals: true 25 | ConstructorInitializerAllOnOneLineOrOnePerLine: true 26 | ConstructorInitializerIndentWidth: 4 27 | ContinuationIndentWidth: 4 28 | Cpp11BracedListStyle: true 29 | DerivePointerAlignment: true 30 | DisableFormat: false 31 | ExperimentalAutoDetectBinPacking: false 32 | ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] 33 | IncludeCategories: 34 | - Regex: '^<.*\.h>' 35 | Priority: 1 36 | - Regex: '^<.*' 37 | Priority: 2 38 | - Regex: '.*' 39 | Priority: 3 40 | IncludeIsMainRegex: '([-_](test|unittest))?$' 41 | IndentCaseLabels: true 42 | IndentWrappedFunctionNames: false 43 | IndentFunctionDeclarationAfterType: false 44 | MaxEmptyLinesToKeep: 1 45 | NamespaceIndentation: None 46 | ObjCBlockIndentWidth: 2 47 | ObjCSpaceAfterProperty: false 48 | ObjCSpaceBeforeProtocolList: false 49 | PenaltyBreakBeforeFirstCallParameter: 1 50 | PenaltyBreakComment: 300 51 | PenaltyBreakString: 1000 52 | PenaltyBreakFirstLessLess: 120 53 | PenaltyExcessCharacter: 1000000 54 | PenaltyReturnTypeOnItsOwnLine: 200 55 | PointerAlignment: Left 56 | SpacesBeforeTrailingComments: 2 57 | Std: Auto 58 | TabWidth: 8 59 | UseTab: Never -------------------------------------------------------------------------------- /wallust/templates/dunstrc: -------------------------------------------------------------------------------- 1 | [global] 2 | # Monitor and positioning 3 | monitor = 0 4 | follow = keyboard 5 | origin = top-center 6 | scale = 0 7 | 8 | # Dimensions and spacing 9 | width = (300, 800) 10 | height = (100, 400) 11 | gap_size = 10 12 | padding = 10 13 | horizontal_padding = 10 14 | text_icon_padding = 20 15 | 16 | # Visual appearance 17 | corner_radius = 0 18 | frame_width = 2 19 | separator_height = 20 20 | 21 | # Typography 22 | font = JetBrainsMono Nerd Font Propo 11 23 | line_height = 0 24 | text_icon_padding = 8 25 | alignment = left 26 | 27 | # Behavior 28 | indicate_hidden = yes 29 | stack_duplicates = true 30 | hide_duplicate_count = false 31 | ignore_dbusclose = false 32 | sticky_history = yes 33 | history_length = 20 34 | always_run_script = true 35 | startup_notification = false 36 | enable_posix_regex = true 37 | 38 | # Content formatting 39 | markup = full 40 | format = "%a\n%s\n%b" 41 | word_wrap = yes 42 | ellipsize = middle 43 | ignore_newline = no 44 | show_age_threshold = 60 45 | idle_threshold = 120 46 | 47 | # Icons 48 | icon_position = left 49 | icon_size = 128 50 | icon_theme = "Colloid-Dark" 51 | enable_recursive_icon_lookup = true 52 | 53 | # Progress bar 54 | progress_bar = true 55 | progress_bar_height = 10 56 | progress_bar_frame_width = 1 57 | progress_bar_min_width = 150 58 | progress_bar_max_width = 400 59 | 60 | # Mouse interaction 61 | mouse_left_click = close_current 62 | mouse_middle_click = do_action, close_current 63 | mouse_right_click = close_all 64 | 65 | # Colors 66 | frame_color = "{{color4}}" 67 | highlight = "{{color5}}" 68 | separator_color = "{{foreground}}" 69 | 70 | [experimental] 71 | per_monitor_dpi = false 72 | 73 | [urgency_low] 74 | timeout = 4 75 | background = "{{background}}" 76 | foreground = "{{foreground}}" 77 | frame_color = "{{color11}}" 78 | 79 | [urgency_normal] 80 | timeout = 6 81 | background = "{{background}}" 82 | foreground = "{{foreground}}" 83 | frame_color = "{{color10}}" 84 | 85 | [urgency_critical] 86 | timeout = 0 87 | background = "{{background}}" 88 | foreground = "{{foreground}}" 89 | frame_color = "{{color9}}" 90 | -------------------------------------------------------------------------------- /nvim/lua/config/lazy.lua: -------------------------------------------------------------------------------- 1 | local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 2 | if not (vim.uv or vim.loop).fs_stat(lazypath) then 3 | local lazyrepo = "https://github.com/folke/lazy.nvim.git" 4 | local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) 5 | if vim.v.shell_error ~= 0 then 6 | vim.api.nvim_echo({ 7 | { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, 8 | { out, "WarningMsg" }, 9 | { "\nPress any key to exit..." }, 10 | }, true, {}) 11 | vim.fn.getchar() 12 | os.exit(1) 13 | end 14 | end 15 | vim.opt.rtp:prepend(lazypath) 16 | 17 | require("lazy").setup({ 18 | spec = { 19 | -- add LazyVim and import its plugins 20 | { "LazyVim/LazyVim", import = "lazyvim.plugins" }, 21 | -- import/override with your plugins 22 | { import = "plugins" }, 23 | }, 24 | defaults = { 25 | -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. 26 | -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. 27 | lazy = false, 28 | -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, 29 | -- have outdated releases, which may break your Neovim install. 30 | version = false, -- always use the latest git commit 31 | -- version = "*", -- try installing the latest stable version for plugins that support semver 32 | }, 33 | 34 | checker = { 35 | enabled = true, -- check for plugin updates periodically 36 | notify = false, -- notify on update 37 | }, -- automatically check for plugin updates 38 | performance = { 39 | rtp = { 40 | -- disable some rtp plugins 41 | disabled_plugins = { 42 | "gzip", 43 | -- "matchit", 44 | -- "matchparen", 45 | -- "netrwPlugin", 46 | "tarPlugin", 47 | "tohtml", 48 | "tutor", 49 | "zipPlugin", 50 | }, 51 | }, 52 | }, 53 | }) 54 | 55 | vim.schedule(function() 56 | vim.cmd.colorscheme("neopywal-dark") 57 | end) 58 | -------------------------------------------------------------------------------- /yazi/yazi.toml: -------------------------------------------------------------------------------- 1 | # Yazi configuration file 2 | 3 | [opener] 4 | play = [ 5 | { run = 'celluloid "$@"', orphan = true, for = "unix" }, 6 | ] 7 | edit = [ 8 | { run = 'nvim "$@"', desc = "nvim", block = true, for = "unix" }, 9 | ] 10 | open = [ 11 | { run = 'xdg-open "$1"', desc = "Open", for = "unix" }, 12 | ] 13 | reveal = [ 14 | { run = 'xdg-open "$(dirname "$1")"', desc = "Reveal", for = "unix" }, 15 | { run = '''exiftool "$1"; echo "Press enter to exit"; read _''', block = true, desc = "Show EXIF", for = "unix" }, 16 | ] 17 | pdf = [ 18 | { run = 'zathura "$1"', desc = "Open with Zathura", for = "unix" }, 19 | ] 20 | markdown = [ 21 | { run = 'glow "$1"', desc = "View with glow", for = "unix" }, 22 | ] 23 | extract = [ 24 | { run = '7z x "$1"', block = true, desc = "Extract with 7z", for = "unix" }, 25 | ] 26 | view_archive = [ 27 | { run = 'if [ -f "$1" ]; then case "$1" in *.tar) tar tf "$1" ;; *.zip) unzip -l "$1" ;; *.rar) unrar l "$1" ;; *.7z) 7z l "$1" ;; esac; echo "Press enter to exit"; read _; fi', block = true, desc = "View archive contents", for = "unix" }, 28 | ] 29 | ebook = [ 30 | { run = 'ebook-viewer "$1"', desc = "Open with ebook-viewer", for = "unix" }, 31 | ] 32 | 33 | [open] 34 | rules = [ 35 | # Folder 36 | { name = "*/", use = ["open", "edit", "reveal"] }, 37 | # Text 38 | { mime = "text/*", use = ["edit", "reveal"] }, 39 | # Markdown 40 | { mime = "text/markdown", use = ["markdown", "edit", "reveal"] }, 41 | # Image 42 | { mime = "image/*", use = ["open", "reveal"] }, 43 | # Media 44 | { mime = "video/*", use = ["play", "reveal"] }, 45 | { mime = "audio/*", use = ["play", "reveal"] }, 46 | # Archive 47 | { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", use = ["extract", "view_archive", "reveal"] }, 48 | # PDF 49 | { mime = "application/pdf", use = ["pdf", "reveal"] }, 50 | # Ebooks 51 | { mime = "application/epub+zip", use = ["ebook", "reveal"] }, 52 | # JSON 53 | { mime = "application/{json,ndjson}", use = ["edit", "reveal"] }, 54 | # JavaScript 55 | { mime = "*/javascript", use = ["edit", "reveal"] }, 56 | # Empty file 57 | { mime = "inode/empty", use = ["edit", "reveal"] }, 58 | # Fallback 59 | { name = "*", use = ["open", "reveal"] }, 60 | ] 61 | 62 | [mgr] 63 | show_hidden = true 64 | -------------------------------------------------------------------------------- /waybar/style.css: -------------------------------------------------------------------------------- 1 | @import "./colors.css"; 2 | 3 | * { 4 | font-family: "JetBrainsMono Nerd Font Propo"; 5 | font-size: 16px; 6 | border-radius: 0; 7 | box-shadow: none; 8 | } 9 | 10 | window#waybar { 11 | background: @background; 12 | } 13 | 14 | #custom-cachy:hover, 15 | #cpu:hover, 16 | #network:hover, 17 | #bluetooth:hover, 18 | #pulseaudio:hover, 19 | #pulseaudio.microphone:hover, 20 | #pulseaudio.sink-muted:hover, 21 | #custom-powermenu:hover { 22 | opacity: 0.5; 23 | } 24 | 25 | #custom-cachy, 26 | #cpu, 27 | #clock, 28 | #mpris, 29 | #custom-menu, 30 | #tray, 31 | #privacy, 32 | #network, 33 | #bluetooth, 34 | #pulseaudio, 35 | #pulseaudio.microphone, 36 | #backlight, 37 | #battery, 38 | #custom-powermenu { 39 | color: @foreground; 40 | padding: 6px 0; 41 | } 42 | 43 | #workspaces button { 44 | color: @foreground; 45 | padding: 0; 46 | } 47 | #workspaces button.active { 48 | color: @color2; 49 | } 50 | 51 | #privacy { 52 | margin: 4px; 53 | color: @color3; 54 | } 55 | 56 | #clock { 57 | color: @color4; 58 | } 59 | 60 | #mpris { 61 | color: @color3; 62 | } 63 | 64 | #network.disabled { 65 | color: @color1; 66 | } 67 | #network.wifi { 68 | color: @color2; 69 | } 70 | #network.ethernet { 71 | color: @color3; 72 | } 73 | 74 | #bluetooth.disabled { 75 | color: @color1; 76 | } 77 | #bluetooth.connected { 78 | color: @color4; 79 | } 80 | 81 | #pulseaudio.sink-muted:not(.microphone) { 82 | color: @color3; 83 | } 84 | #pulseaudio.microphone.source-muted { 85 | color: @color1; 86 | } 87 | 88 | #battery.plugged { 89 | color: @color4; 90 | } 91 | #battery.charging { 92 | color: @color2; 93 | } 94 | #battery.critical { 95 | color: @color3; 96 | } 97 | 98 | tooltip { 99 | background: @background; 100 | border: 1px solid @foreground; 101 | } 102 | tooltip * { 103 | color: @foreground; 104 | margin: 2px; 105 | background: @background; 106 | } 107 | 108 | #pulseaudio-slider, 109 | #backlight-slider { 110 | min-height: 80px; 111 | } 112 | 113 | #pulseaudio-slider slider, 114 | #backlight-slider slider { 115 | background: transparent; 116 | } 117 | 118 | #pulseaudio-slider trough, 119 | #backlight-slider trough { 120 | min-width: 8px; 121 | } 122 | 123 | #pulseaudio-slider highlight { 124 | background: @color4; 125 | } 126 | #backlight-slider highlight { 127 | background: @color3; 128 | } -------------------------------------------------------------------------------- /alacritty/alacritty.toml: -------------------------------------------------------------------------------- 1 | [general] 2 | import = ["./colors.toml"] 3 | live_config_reload = true 4 | working_directory = "None" 5 | 6 | [window] 7 | dynamic_padding = true 8 | decorations = "none" 9 | opacity = 0.9 10 | padding.x = 10 11 | padding.y = 10 12 | 13 | [cursor] 14 | style.shape = "block" 15 | unfocused_hollow = true 16 | 17 | [mouse] 18 | hide_when_typing = true 19 | 20 | [window.class] 21 | instance = "Alacritty" 22 | general = "Alacritty" 23 | 24 | [scrolling] 25 | history = 10000 26 | multiplier = 6 27 | 28 | [font] 29 | size = 12 30 | 31 | [font.normal] 32 | family = "JetBrainsMono Nerd Font" 33 | style = "Regular" 34 | 35 | [font.bold] 36 | family = "JetBrainsMono Nerd Font" 37 | style = "Bold" 38 | 39 | [font.italic] 40 | family = "JetBrainsMono Nerd Font" 41 | style = "Italic" 42 | 43 | [font.bold_italic] 44 | family = "JetBrainsMono Nerd Font" 45 | style = "Bold Italic" 46 | 47 | [selection] 48 | semantic_escape_chars = ",│`|:\"' ()[]{}<>\t" 49 | save_to_clipboard = true 50 | 51 | [[mouse.bindings]] 52 | mouse = "Middle" 53 | action = "PasteSelection" 54 | 55 | [keyboard] 56 | [[keyboard.bindings]] 57 | key = "Paste" 58 | action = "Paste" 59 | 60 | [[keyboard.bindings]] 61 | key = "Copy" 62 | action = "Copy" 63 | 64 | [[keyboard.bindings]] 65 | key = "L" 66 | mods = "Control" 67 | action = "ClearLogNotice" 68 | 69 | [[keyboard.bindings]] 70 | key = "L" 71 | mods = "Control" 72 | mode = "~Vi" 73 | chars = "\f" 74 | 75 | [[keyboard.bindings]] 76 | key = "PageUp" 77 | mods = "Shift" 78 | mode = "~Alt" 79 | action = "ScrollPageUp" 80 | 81 | [[keyboard.bindings]] 82 | key = "PageDown" 83 | mods = "Shift" 84 | mode = "~Alt" 85 | action = "ScrollPageDown" 86 | 87 | [[keyboard.bindings]] 88 | key = "Home" 89 | mods = "Shift" 90 | mode = "~Alt" 91 | action = "ScrollToTop" 92 | 93 | [[keyboard.bindings]] 94 | key = "End" 95 | mods = "Shift" 96 | mode = "~Alt" 97 | action = "ScrollToBottom" 98 | 99 | [[keyboard.bindings]] 100 | key = "V" 101 | mods = "Control|Shift" 102 | action = "Paste" 103 | 104 | [[keyboard.bindings]] 105 | key = "C" 106 | mods = "Control|Shift" 107 | action = "Copy" 108 | 109 | [[keyboard.bindings]] 110 | key = "F" 111 | mods = "Control|Shift" 112 | action = "SearchForward" 113 | 114 | [[keyboard.bindings]] 115 | key = "B" 116 | mods = "Control|Shift" 117 | action = "SearchBackward" 118 | 119 | [[keyboard.bindings]] 120 | key = "C" 121 | mods = "Control|Shift" 122 | mode = "Vi" 123 | action = "ClearSelection" 124 | 125 | [[keyboard.bindings]] 126 | key = "Key0" 127 | mods = "Control" 128 | action = "ResetFontSize" -------------------------------------------------------------------------------- /mako/config: -------------------------------------------------------------------------------- 1 | max-history=5 2 | markup=1 3 | actions=1 4 | history=1 5 | default-timeout=5000 6 | sort=+time 7 | 8 | # [ BINDING OPTIONS ] 9 | on-button-left=invoke-default-action 10 | on-button-middle=dismiss-group 11 | on-button-right=dismiss 12 | on-touch=invoke-default-action 13 | 14 | # [ STYLE OPTIONS ] 15 | font= JetBrainsMono Nerd Font 10 16 | background-color=#1E1E2E 17 | text-color=#CDD6F4 18 | 19 | width=320 20 | height=240 21 | 22 | margin=10 23 | outer-margin=0 24 | padding=16 25 | 26 | border-color=#89B4FA 27 | border-size=2 28 | border-radius=0 29 | 30 | icons=1 31 | max-icon-size=48 32 | icon-location=left 33 | 34 | format= %s\n%b 35 | text-alignment=left 36 | max-visible=5 37 | layer=overlay 38 | anchor=top-right 39 | 40 | default-timeout=5000 41 | ignore-timeout=0 42 | 43 | [app-name=Volume] 44 | anchor=bottom-center 45 | text-alignment=center 46 | width=200 47 | height=60 48 | border-size=20 49 | border-color=#1B1B29 50 | background-color=#E7F0FE 51 | text-color=#CDD6F4 52 | progress-color=source #89B4FA 53 | outer-margin=0, 0, 30, 0 54 | margin=10 55 | padding=2 56 | layer=overlay 57 | ignore-timeout=1 58 | default-timeout=1000 59 | format=%s 60 | 61 | [app-name="Volume Mute"] 62 | anchor=bottom-center 63 | text-alignment=center 64 | width=200 65 | height=60 66 | border-size=20 67 | border-color=#1B1B29 68 | background-color=#F38BA8 69 | text-color=#CDD6F4 70 | progress-color=source #89B4FA 71 | outer-margin=0, 0, 30, 0 72 | margin=10 73 | padding=2 74 | layer=overlay 75 | ignore-timeout=1 76 | default-timeout=1000 77 | format=%s 78 | 79 | [app-name="spotify-player"] 80 | max-icon-size=128 81 | 82 | [app-name=Microphone] 83 | anchor=bottom-center 84 | text-alignment=center 85 | width=200 86 | height=60 87 | border-size=20 88 | border-color=#1B1B29 89 | background-color=#F38BA8 90 | text-color=#CDD6F4 91 | progress-color=source #A6E3A1 92 | outer-margin=0, 0, 30, 0 93 | margin=10 94 | padding=2 95 | layer=overlay 96 | ignore-timeout=1 97 | default-timeout=1000 98 | format=%s 99 | 100 | [app-name=Brightness] 101 | anchor=bottom-center 102 | text-alignment=center 103 | width=200 104 | height=60 105 | border-size=20 106 | border-color=#1B1B29 107 | background-color=#FEF9EF 108 | text-color=#CDD6F4 109 | progress-color=source #F9E2AF 110 | outer-margin=0, 0, 30, 0 111 | margin=10 112 | padding=2 113 | layer=overlay 114 | ignore-timeout=1 115 | default-timeout=1000 116 | format=%s 117 | 118 | # Music 119 | [app-name="Music Player"] 120 | text-alignment=center 121 | ignore-timeout=1 122 | margin=10 123 | layer=overlay 124 | 125 | # Critical 126 | [urgency=critical] 127 | border-color=#F38BA8 128 | background-color=#1E1E2E 129 | text-color=#CDD6F4 130 | default-timeout=0 131 | layer=overlay 132 | 133 | # Hidden 134 | [hidden=true] 135 | invisible=1 136 | -------------------------------------------------------------------------------- /starship/starship.toml: -------------------------------------------------------------------------------- 1 | # Main format configuration 2 | format = """ 3 | $username\ 4 | $hostname\ 5 | $directory\ 6 | $git_branch\ 7 | $git_commit\ 8 | $git_state\ 9 | $git_status\ 10 | $package\ 11 | $python\ 12 | $nodejs\ 13 | $rust\ 14 | $golang\ 15 | $docker_context\ 16 | $line_break\ 17 | $character 18 | """ 19 | 20 | add_newline = false 21 | 22 | # Directory configuration 23 | [directory] 24 | format = "[ $path ]($style)[$read_only]($read_only_style)" 25 | read_only = "󰌾 " 26 | truncation_length = 3 27 | fish_style_pwd_dir_length = 1 28 | home_symbol = "~" 29 | 30 | # Character at prompt 31 | [character] 32 | success_symbol = "[](bold green)" 33 | error_symbol = "[](bold red)" 34 | vimcmd_symbol ="[](bold green)" 35 | 36 | # Username display 37 | [username] 38 | format = "[$user]($style)" 39 | disabled = false 40 | show_always = true 41 | 42 | # Hostname for SSH 43 | [hostname] 44 | ssh_only = true 45 | ssh_symbol = "" 46 | format = "[$hostname ]($style)" 47 | style = "bg:#A94744 fg:#0D1017" 48 | disabled = false 49 | 50 | # Time display 51 | [time] 52 | time_format = "%R" # Hour:Minute format 53 | format = '[ $time ]($style)' 54 | use_12hr = true 55 | 56 | [aws] 57 | symbol = "󰅟 " 58 | 59 | [buf] 60 | symbol = " " 61 | 62 | [c] 63 | symbol = " " 64 | 65 | [cmake] 66 | symbol = " " 67 | 68 | [conda] 69 | symbol = " " 70 | 71 | [crystal] 72 | symbol = " " 73 | 74 | [dart] 75 | symbol = " " 76 | 77 | [docker_context] 78 | symbol = " " 79 | 80 | [elixir] 81 | symbol = " " 82 | 83 | [elm] 84 | symbol = " " 85 | 86 | [fossil_branch] 87 | symbol = " " 88 | 89 | [git_branch] 90 | symbol = " " 91 | 92 | [git_commit] 93 | tag_symbol = " " 94 | 95 | [git_status] 96 | ahead = "  " 97 | behind = "  " 98 | conflicted = " 󰞇 " 99 | deleted = " 󰆴 " 100 | diverged = " 󰃻 " 101 | modified = " 󰏫 " 102 | renamed = "  " 103 | staged = "  " 104 | stashed = " 󰀼 " 105 | untracked = " 󰋖 " 106 | up_to_date = "  " 107 | 108 | [golang] 109 | symbol = " " 110 | 111 | [guix_shell] 112 | symbol = " " 113 | 114 | [haskell] 115 | symbol = " " 116 | 117 | [hg_branch] 118 | symbol = " " 119 | 120 | [java] 121 | symbol = " " 122 | 123 | [julia] 124 | symbol = " " 125 | 126 | [kotlin] 127 | symbol = " " 128 | 129 | [lua] 130 | symbol = " " 131 | 132 | [meson] 133 | symbol = "󰔷 " 134 | 135 | [nim] 136 | symbol = "󰆥 " 137 | 138 | [nix_shell] 139 | symbol = " " 140 | 141 | [nodejs] 142 | symbol = " " 143 | 144 | [ocaml] 145 | symbol = " " 146 | 147 | [package] 148 | symbol = "󰏗 " 149 | 150 | [perl] 151 | symbol = " " 152 | 153 | [php] 154 | symbol = " " 155 | 156 | [pijul_channel] 157 | symbol = " " 158 | 159 | [python] 160 | symbol = " " 161 | 162 | [ruby] 163 | symbol = " " 164 | 165 | [rust] 166 | symbol = "󱘗 " 167 | 168 | [scala] 169 | symbol = " " 170 | 171 | [swift] 172 | symbol = " " 173 | 174 | [zig] 175 | symbol = " " 176 | 177 | [gradle] 178 | symbol = " " -------------------------------------------------------------------------------- /wallust/wallust.toml: -------------------------------------------------------------------------------- 1 | # wallust v3.3 2 | # 3 | # You can copy this file to ~/.config/wallust/wallust.toml (keep in mind is a sample config) 4 | 5 | # SIMPLE TUTORIAL, or `man wallust.5`: 6 | # https://explosion-mental.codeberg.page/wallust/ 7 | # 8 | # If comming from v2: https://explosion-mental.codeberg.page/wallust/v3.html#wallusttoml 9 | 10 | # Global section - values below can be overwritten by command line flags 11 | 12 | # How the image is parse, in order to get the colors: 13 | # full - resized - wal - thumb - fastresize - kmeans 14 | backend = "fastresize" 15 | 16 | # What color space to use to produce and select the most prominent colors: 17 | # lab - labmixed - lch - lchmixed 18 | color_space = "lab" 19 | 20 | # Use the most prominent colors in a way that makes sense, a scheme color palette: 21 | # dark - dark16 - darkcomp - darkcomp16 22 | # light - light16 - lightcomp - lightcomp16 23 | # harddark - harddark16 - harddarkcomp - harddarkcomp16 24 | # softdark - softdark16 - softdarkcomp - softdarkcomp16 25 | # softlight - softlight16 - softlightcomp - softlightcomp16 26 | palette = "harddark" 27 | 28 | # Ensures a "readable contrast" (OPTIONAL, disabled by default) 29 | # Should only be enabled when you notice an unreadable contrast frequently happening 30 | # with your images. The reference color for the contrast is the background color. 31 | check_contrast = true 32 | 33 | # Color saturation, between [1% and 100%] (OPTIONAL, disabled by default) 34 | # usually something higher than 50 increases the saturation and below 35 | # decreases it (on a scheme with strong and vivid colors) 36 | #saturation = 35 37 | 38 | # Alpha value for templating, by default 100 (no other use whatsoever) 39 | #alpha = 100 40 | 41 | [templates] 42 | # NOTE: prefer '' over "" for paths, avoids escaping. 43 | # template: A RELATIVE path that points to `~/.config/wallust/template` (depends on platform) 44 | # target: ABSOLUTE path in which to place a file with generated templated values. 45 | # ¡ If either one is a directory, then both SHOULD be one. ! 46 | # zathura = { template = 'zathura', target = '~/.config/zathura/zathurarc' } 47 | alacritty = { template = 'alacritty.toml', target = '~/.config/alacritty/colors.toml' } 48 | 49 | kitty = { src = 'kitty.conf', dst = '~/.config/kitty/colors.conf' } 50 | 51 | waybar = { src = 'waybar.css', dst = '~/.config/waybar/colors.css' } 52 | 53 | gtk3 = { src = 'gtk.css', dst = '~/.config/gtk-3.0/colors.css' } 54 | 55 | gtk4 = { src = 'gtk.css', dst = '~/.config/gtk-4.0/colors.css' } 56 | 57 | vscode = { src = 'vscode.json', dst = '~/.cache/wallust/colors.json' } 58 | 59 | vscode2 = { src = 'vscode', dst = '~/.cache/wallust/colors' } 60 | 61 | neopywal = { src = 'neopywal.vim', dst = '~/.cache/wallust/colors_neopywal.vim' } 62 | 63 | rofi = { src = 'rofi.rasi', dst = '~/.config/rofi/colors/wallust.rasi' } 64 | 65 | mako = { src = 'mako', dst = '~/.config/mako/config' } 66 | 67 | zathurarc = { src = 'zathurarc', dst = '~/.config/zathura/zathurarc' } 68 | 69 | vicinae = { src = 'vicinae.toml', dst = '~/.local/share/vicinae/themes/wallust.toml'} -------------------------------------------------------------------------------- /wallust/templates/mako: -------------------------------------------------------------------------------- 1 | max-history=5 2 | markup=1 3 | actions=1 4 | history=1 5 | default-timeout=5000 6 | sort=+time 7 | 8 | # [ BINDING OPTIONS ] 9 | on-button-left=invoke-default-action 10 | on-button-middle=dismiss-group 11 | on-button-right=dismiss 12 | on-touch=invoke-default-action 13 | 14 | # [ STYLE OPTIONS ] 15 | font= JetBrainsMono Nerd Font 10 16 | background-color={{background}} 17 | text-color={{foreground}} 18 | 19 | width=320 20 | height=240 21 | 22 | margin=10 23 | outer-margin=0 24 | padding=16 25 | 26 | border-color={{color12}} 27 | border-size=2 28 | border-radius=0 29 | 30 | icons=1 31 | max-icon-size=48 32 | icon-location=left 33 | 34 | format= %s\n%b 35 | text-alignment=left 36 | max-visible=5 37 | layer=overlay 38 | anchor=top-right 39 | 40 | default-timeout=5000 41 | ignore-timeout=0 42 | 43 | [app-name=Volume] 44 | anchor=bottom-center 45 | text-alignment=center 46 | width=200 47 | height=60 48 | border-size=20 49 | border-color={{background | darken(0.1)}} 50 | background-color={{color12 | lighten(0.8)}} 51 | text-color={{foreground}} 52 | progress-color=source {{color4}} 53 | outer-margin=0, 0, 30, 0 54 | margin=10 55 | padding=2 56 | layer=overlay 57 | ignore-timeout=1 58 | default-timeout=1000 59 | format=%s 60 | 61 | [app-name="Volume Mute"] 62 | anchor=bottom-center 63 | text-alignment=center 64 | width=200 65 | height=60 66 | border-size=20 67 | border-color={{background | darken(0.1)}} 68 | background-color={{color1}} 69 | text-color={{foreground}} 70 | progress-color=source {{color4}} 71 | outer-margin=0, 0, 30, 0 72 | margin=10 73 | padding=2 74 | layer=overlay 75 | ignore-timeout=1 76 | default-timeout=1000 77 | format=%s 78 | 79 | [app-name="spotify-player"] 80 | max-icon-size=128 81 | 82 | [app-name=Microphone] 83 | anchor=bottom-center 84 | text-alignment=center 85 | width=200 86 | height=60 87 | border-size=20 88 | border-color={{background | darken(0.1)}} 89 | background-color={{color1}} 90 | text-color={{foreground}} 91 | progress-color=source {{color2}} 92 | outer-margin=0, 0, 30, 0 93 | margin=10 94 | padding=2 95 | layer=overlay 96 | ignore-timeout=1 97 | default-timeout=1000 98 | format=%s 99 | 100 | [app-name=Brightness] 101 | anchor=bottom-center 102 | text-alignment=center 103 | width=200 104 | height=60 105 | border-size=20 106 | border-color={{background | darken(0.1)}} 107 | background-color={{color11 | lighten(0.8)}} 108 | text-color={{foreground}} 109 | progress-color=source {{color3}} 110 | outer-margin=0, 0, 30, 0 111 | margin=10 112 | padding=2 113 | layer=overlay 114 | ignore-timeout=1 115 | default-timeout=1000 116 | format=%s 117 | 118 | # Music 119 | [app-name="Music Player"] 120 | text-alignment=center 121 | ignore-timeout=1 122 | margin=10 123 | layer=overlay 124 | 125 | # Critical 126 | [urgency=critical] 127 | border-color={{color1}} 128 | background-color={{background}} 129 | text-color={{foreground}} 130 | default-timeout=0 131 | layer=overlay 132 | 133 | # Hidden 134 | [hidden=true] 135 | invisible=1 136 | -------------------------------------------------------------------------------- /scripts/media-control.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euo pipefail 4 | 5 | readonly VOLUME_STEP=0.05 6 | readonly BRIGHTNESS_STEP=5 7 | readonly MAX_VOLUME=1.0 8 | readonly NOTIFICATION_TIMEOUT=1000 9 | readonly SHOW_TEXT=false 10 | 11 | parse_volume() { 12 | local vol=${1#* } muted=${1##* } 13 | vol=${vol%% *} 14 | echo "$((${vol%%.*} * 100 + ${vol#*.}))" "$muted" 15 | } 16 | 17 | notify() { 18 | local body="" 19 | [[ "$SHOW_TEXT" == true ]] && body="$4" 20 | notify-send --app-name="$1" --expire-time="$NOTIFICATION_TIMEOUT" --transient \ 21 | --hint="string:x-canonical-private-synchronous:$2" \ 22 | --hint="string:x-dunst-stack-tag:$2" \ 23 | --hint="int:value:$3" "$body" & 24 | } 25 | 26 | volume_up() { 27 | wpctl set-mute @DEFAULT_SINK@ 0 28 | local output=$(wpctl get-volume @DEFAULT_SINK@) 29 | read -r vol _ <<< "$(parse_volume "$output")" 30 | wpctl set-volume @DEFAULT_SINK@ "$(awk -v v="$vol" -v s="$VOLUME_STEP" -v m="$MAX_VOLUME" 'BEGIN {r=v/100+s; print (r>m)?m:r}')" 31 | output=$(wpctl get-volume @DEFAULT_SINK@) 32 | read -r vol _ <<< "$(parse_volume "$output")" 33 | notify "Volume" "volume" "$vol" "${vol}%" 34 | } 35 | 36 | volume_down() { 37 | wpctl set-volume @DEFAULT_SINK@ "${VOLUME_STEP}-" 38 | local output=$(wpctl get-volume @DEFAULT_SINK@) 39 | read -r vol _ <<< "$(parse_volume "$output")" 40 | notify "Volume" "volume" "$vol" "${vol}%" 41 | } 42 | 43 | volume_mute() { 44 | wpctl set-mute @DEFAULT_SINK@ toggle 45 | local output=$(wpctl get-volume @DEFAULT_SINK@) 46 | read -r vol muted <<< "$(parse_volume "$output")" 47 | [[ "$muted" == "[MUTED]" ]] && notify "Volume Mute" "volume" 0 "Muted" || notify "Volume" "volume" "$vol" "${vol}%" 48 | } 49 | 50 | mic_mute() { 51 | wpctl set-mute @DEFAULT_SOURCE@ toggle 52 | [[ "$(wpctl get-volume @DEFAULT_SOURCE@)" == *"[MUTED]"* ]] && notify "Microphone" "microphone" 0 "Muted" || notify "Microphone" "microphone" 100 "Unmuted" 53 | } 54 | 55 | brightness_up() { 56 | local max=$(brightnessctl max) 57 | brightnessctl -q set "${BRIGHTNESS_STEP}%+" 58 | notify "Brightness" "brightness" "$(($(brightnessctl get) * 100 / max))" "" 59 | } 60 | 61 | brightness_down() { 62 | local max=$(brightnessctl max) 63 | brightnessctl -q set "${BRIGHTNESS_STEP}%-" 64 | notify "Brightness" "brightness" "$(($(brightnessctl get) * 100 / max))" "" 65 | } 66 | 67 | music_notify() { 68 | local meta=$(playerctl metadata --format '{{title}}|{{artist}}' 2> /dev/null) || return 69 | exec notify-send --app-name="Music Player" --expire-time="$NOTIFICATION_TIMEOUT" \ 70 | --transient --hint="string:x-dunst-stack-tag:music_notif" "${meta%%|*}" "${meta#*|}" 71 | } 72 | 73 | next_track() { playerctl next && sleep 0.5 && music_notify; } 74 | prev_track() { playerctl previous && sleep 0.5 && music_notify; } 75 | play_pause() { playerctl play-pause && sleep 0.5 && music_notify; } 76 | 77 | case "${1:-}" in 78 | volume_up | volume_down | volume_mute | mic_mute | brightness_up | brightness_down | next_track | prev_track | play_pause) "$1" ;; 79 | *) 80 | echo "Usage: $0 {volume_up|volume_down|volume_mute|mic_mute|brightness_up|brightness_down|next_track|prev_track|play_pause}" >&2 81 | exit 1 82 | ;; 83 | esac 84 | 85 | -------------------------------------------------------------------------------- /scripts/lib/common.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # --- Logging Functions --- 4 | log_info() { 5 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 6 | echo -e "\033[1;34m[$timestamp] INFO: $*\033[0m" >&2 7 | } 8 | 9 | log_error() { 10 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 11 | echo -e "\033[1;31m[$timestamp] ERROR: $*\033[0m" >&2 12 | } 13 | 14 | log_success() { 15 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 16 | echo -e "\033[1;32m[$timestamp] SUCCESS: $*\033[0m" >&2 17 | } 18 | 19 | log_warn() { 20 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 21 | echo -e "\033[1;33m[$timestamp] WARN: $*\033[0m" >&2 22 | } 23 | 24 | log_debug() { 25 | if [[ ${DEBUG:-0} -eq 1 ]]; then 26 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 27 | echo -e "\033[1;90m[$timestamp] DEBUG: $*\033[0m" >&2 28 | fi 29 | } 30 | 31 | # --- Error Handling --- 32 | die() { 33 | log_error "$*" 34 | exit 1 35 | } 36 | 37 | # --- File System Utilities --- 38 | ensure_directory() { 39 | local -r dir="$1" 40 | if [[ ! -d "$dir" ]]; then 41 | mkdir -p "$dir" || die "Failed to create directory: $dir" 42 | log_debug "Created directory: $dir" 43 | fi 44 | } 45 | 46 | validate_file() { 47 | local -r file="$1" 48 | local -r description="${2:-File}" 49 | 50 | [[ -f "$file" ]] || die "$description not found: $file" 51 | } 52 | 53 | validate_executable() { 54 | local -r file="$1" 55 | local -r description="${2:-Script}" 56 | 57 | validate_file "$file" "$description" 58 | [[ -x "$file" ]] || die "$description not executable: $file" 59 | } 60 | 61 | # --- Process Management --- 62 | acquire_lock() { 63 | local -r lock_file="$1" 64 | local -r script_name="${2:-$(basename "$0")}" 65 | 66 | if [[ -f "$lock_file" ]]; then 67 | local pid 68 | pid=$(cat "$lock_file" 2>/dev/null || echo "") 69 | if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then 70 | die "Another instance of $script_name is already running (PID: $pid)" 71 | else 72 | log_info "Removing stale lock file: $lock_file" 73 | rm -f "$lock_file" 74 | fi 75 | fi 76 | 77 | echo $$ >"$lock_file" 78 | trap "rm -f '$lock_file'" EXIT INT TERM 79 | } 80 | 81 | # --- Dependency Validation --- 82 | validate_dependencies() { 83 | local -ra required_deps=("$@") 84 | local missing_deps=() 85 | 86 | for dep in "${required_deps[@]}"; do 87 | command -v "$dep" >/dev/null 2>&1 || missing_deps+=("$dep") 88 | done 89 | 90 | if [[ ${#missing_deps[@]} -gt 0 ]]; then 91 | die "Missing required dependencies: ${missing_deps[*]}" 92 | fi 93 | 94 | log_debug "All dependencies validated: ${required_deps[*]}" 95 | } 96 | 97 | # --- Notification Helper --- 98 | send_notification() { 99 | local -r app_name="$1" 100 | local -r title="$2" 101 | local -r message="$3" 102 | local -r urgency="${4:-normal}" 103 | local -r icon="${5:-}" 104 | 105 | local notify_args=( 106 | --app-name="$app_name" 107 | --urgency="$urgency" 108 | ) 109 | 110 | [[ -n "$icon" ]] && notify_args+=(--icon="$icon") 111 | 112 | notify-send "${notify_args[@]}" "$title" "$message" 113 | } -------------------------------------------------------------------------------- /nvim/lua/plugins/comment.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | "numToStr/Comment.nvim", 4 | event = { "BufReadPre", "BufNewFile" }, 5 | dependencies = { 6 | "JoosepAlviste/nvim-ts-context-commentstring", 7 | }, 8 | config = function() 9 | require("Comment").setup({ 10 | ---Add a space b/w comment and the line 11 | ---@type boolean 12 | padding = true, 13 | 14 | ---Whether the cursor should stay at its position 15 | ---NOTE: This only affects NORMAL mode mappings and doesn't work with dot-repeat 16 | ---@type boolean 17 | sticky = true, 18 | 19 | ---Lines to be ignored while comment/uncomment. 20 | ---Could be a regex string or a function that returns a regex string. 21 | ---Example: Use '^$' to ignore empty lines 22 | ---@type string|function 23 | ignore = nil, 24 | 25 | ---LHS of toggle mappings in NORMAL + VISUAL mode 26 | ---@type table 27 | toggler = { 28 | ---Line-comment toggle keymap 29 | line = "gcc", 30 | ---Block-comment toggle keymap 31 | block = "gbc", 32 | }, 33 | 34 | ---LHS of operator-pending mappings in NORMAL + VISUAL mode 35 | ---@type table 36 | opleader = { 37 | ---Line-comment keymap 38 | line = "gc", 39 | ---Block-comment keymap 40 | block = "gb", 41 | }, 42 | 43 | ---LHS of extra mappings 44 | ---@type table 45 | extra = { 46 | ---Add comment on the line above 47 | above = "gcO", 48 | ---Add comment on the line below 49 | below = "gco", 50 | ---Add comment at the end of line 51 | eol = "gcA", 52 | }, 53 | 54 | ---Create basic (operator-pending) and extended mappings for NORMAL + VISUAL mode 55 | ---@type table 56 | mappings = { 57 | ---Operator-pending mapping 58 | ---Includes `gcc`, `gbc`, `gc[count]{motion}` and `gb[count]{motion}` 59 | ---NOTE: These mappings can be changed individually by `opleader` and `toggler` config 60 | basic = true, 61 | ---Extra mapping 62 | ---Includes `gco`, `gcO`, `gcA` 63 | extra = true, 64 | ---Extended mapping 65 | ---Includes `g>`, `g<`, `g>[count]{motion}` and `g<[count]{motion}` 66 | extended = false, 67 | }, 68 | 69 | ---Pre-hook, called before commenting the line 70 | ---@type fun(ctx: Ctx):string 71 | pre_hook = function(ctx) 72 | -- Only calculate commentstring for tsx filetypes 73 | if vim.api.nvim_buf_get_option(0, "buftype") == "prompt" then return end 74 | local U = require "Comment.utils" 75 | 76 | local location = nil 77 | if ctx.ctype == U.ctype.block then 78 | location = require("ts_context_commentstring.utils").get_cursor_location() 79 | elseif ctx.cmotion == U.cmotion.v or ctx.cmotion == U.cmotion.V then 80 | location = require("ts_context_commentstring.utils").get_visual_start_location() 81 | end 82 | 83 | return require("ts_context_commentstring.internal").calculate_commentstring { 84 | key = ctx.ctype == U.ctype.line and "__default" or "__multiline", 85 | location = location, 86 | } 87 | end, 88 | 89 | ---Post-hook, called after commenting is done 90 | ---@type fun(ctx: Ctx) 91 | post_hook = nil, 92 | }) 93 | end, 94 | }, 95 | } -------------------------------------------------------------------------------- /nvim/lua/plugins/cpp-snippets.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | "L3MON4D3/LuaSnip", 4 | dependencies = { 5 | "rafamadriz/friendly-snippets", 6 | }, 7 | config = function() 8 | local ls = require("luasnip") 9 | local s = ls.snippet 10 | local t = ls.text_node 11 | local i = ls.insert_node 12 | 13 | -- C++ snippets 14 | ls.add_snippets("cpp", { 15 | -- Competitive programming template 16 | s("cptemp", { 17 | t({ 18 | "#include ", 19 | "using namespace std;", 20 | "", 21 | "typedef long long ll;", 22 | "typedef long double ld;", 23 | "#define endl '\\n'", 24 | "", 25 | "void solve() {", 26 | " " 27 | }), 28 | i(1), 29 | t({ 30 | "", 31 | "}", 32 | "", 33 | "int main() {", 34 | " // Fast IO", 35 | " ios::sync_with_stdio(0);", 36 | " cin.tie(NULL);", 37 | " cout.tie(NULL);", 38 | " ", 39 | " ll T;", 40 | " cin >> T;", 41 | " while (T--) {", 42 | " solve();", 43 | " }", 44 | " ", 45 | " return 0;", 46 | "}" 47 | }) 48 | }), 49 | 50 | -- Simple main template 51 | s("mainsimple", { 52 | t({ 53 | "#include ", 54 | "using namespace std;", 55 | "", 56 | "int main() {", 57 | " " 58 | }), 59 | i(1), 60 | t({ 61 | "", 62 | " return 0;", 63 | "}" 64 | }) 65 | }), 66 | 67 | -- Basic template 68 | s("cppbasic", { 69 | t({ 70 | "#include ", 71 | "#include ", 72 | "#include ", 73 | "using namespace std;", 74 | "", 75 | "int main() {", 76 | " " 77 | }), 78 | i(1), 79 | t({ 80 | "", 81 | " return 0;", 82 | "}" 83 | }) 84 | }), 85 | 86 | -- Algorithm practice template 87 | s("algotemplate", { 88 | t({ 89 | "#include ", 90 | "#include ", 91 | "#include ", 92 | "#include ", 93 | "#include ", 94 | "#include ", 95 | "#include ", 96 | "#include ", 97 | "using namespace std;", 98 | "", 99 | "int main() {", 100 | " " 101 | }), 102 | i(1), 103 | t({ 104 | "", 105 | " return 0;", 106 | "}" 107 | }) 108 | }), 109 | 110 | -- Class template 111 | s("classtemplate", { 112 | t({ 113 | "#include ", 114 | "using namespace std;", 115 | "", 116 | "class Solution {", 117 | "public:", 118 | " " 119 | }), 120 | i(1), 121 | t({ 122 | "", 123 | "};", 124 | "", 125 | "int main() {", 126 | " Solution sol;", 127 | " " 128 | }), 129 | i(2), 130 | t({ 131 | "", 132 | " return 0;", 133 | "}" 134 | }) 135 | }), 136 | }) 137 | end, 138 | }, 139 | } -------------------------------------------------------------------------------- /nvim/lua/plugins/dashboard.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "nvimdev/dashboard-nvim", 3 | lazy = false, -- As https://github.com/nvimdev/dashboard-nvim/pull/450, dashboard-nvim shouldn't be lazy-loaded to properly handle stdin. 4 | opts = function() 5 | local logo = [[ 6 | 7 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 8 | ⠀⠀⠀⠀⠀⠀⠀⡀⢄⢮⡳⣶⢭⣖⣢⡤⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 9 | ⠀⠀⠀⢀⢤⣢⣵⣾IuseNVIM⣿⣶⣯⣵⣒⡠⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 10 | ⠀⠀⠀⢸⣎⣿⣿⣿⣿^⡿⠛⠛⠻⣿⣿⣿⣿⣿⣿⡇⣿⣟⣵⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 11 | ⠀⠀⠀⢸⡇⠼⣿⣿⣿⡟⠀⢠⣤⢸⡊⢻⣿⡿⣿⣿⡇⣿⣿⣷⣝⣕⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 12 | ⠀⠀⠀⢸⡇⢑⢻⣿⣿⣧⡀⣅⡡⣠⠆⠹⣿⣿⣿⣿⣷⣿⣿⣿⣿⣷⢟⢯⠢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 13 | ⠀⠀⠀⢸⡇⣸⢉⢿⣯⣿⣿⣶⣧⣤⣰⣾⣿⡟⠽⣋⣈⢿⣿⣿⣿⣿⢸⣷⣝⠮⡢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 14 | ⠀⠀⠀⢸⣷⣿⠠⣞⢿⣿⣿⣿⣿⢟⡫⡗⡢⡑⢭⣗⡺⢷⣙⠿⣿⣿⣼⣿⢿⣷⣍⣎⡢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 15 | ⠀⠀⠀⢸⣿⣿⣼⡏⠗⢝⢿⣿⡈⢥⣿⠞⡜⡼⣾⣛⢿⣛⣻⣷⣰⠹⣻⣿⣿⣿⣿⣿⣮⡪⡢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 16 | ⠀⠀⠀⣸⣿⣿⣾⡇⠄⠁⠋⣊⢟⠬⡻⣯⡵⣣⡻⣟⡦⢾⣿⣋⣇⢉⣿⣿⣿⣿⣿⣿⣿⣿⣿⡪⡢⡀⠀⠀⠀⠀⠀⠀⠀ 17 | ⠠⠰⣹⢔⠹⣿⣿⣫⠁⠀⢰⡌⢿⡎⢜⠝⡿⣟⡫⢗⡫⠏⠙⢫⣵⠘⣄⡘⠿⣿⣿⣿⣿⣿⣿⣿⣾⣮⡢⡀⠀⠀⠀⠀⠀ 18 | ⠀⠀⠀⠄⡚⠘⢿⣯⡅⠀⢸⠇⠄⠀⠀⠉⠲⠔⡱⡻⢿⣽⣁⠢⢼⣶⣿⣿⣷⣬⡉⡹⠿⣿⣿⣿⣿⣿⣯⡪⡢⡀⠀⠀⠀ 19 | ⠀⠀⠠⠀⢀⠄⠎⢿⣷⠀⢸⠇⡄⡆⡌⠁⡂⠀⡘⢠⠱⠨⢛⢿⣶⣬⡉⡹⠻⣿⣷⣢⣄⠙⢿⣿⣿⣿⣿⡿⠞⢞⡆⠀⠀ 20 | ⠀⠀⠀⠀⠈⠈⠒⠊⡻⡇⡄⡒⠤⡀⠁⠃⠁⢠⢀⠁⠀⠀⠂⢉⢊⠝⠿⣶⡤⡘⢿⣿⣷⣝⢦⣙⠿⡛⣉⣼⣾⣿⡇⠀⠀ 21 | ⠀⠀⠀⠀⠀⠘⠠⢬⠐⠱⠺⢵⡣⢆⡅⢆⡎⠘⠈⠘⢰⠰⠀⠃⠎⡔⠸⢐⠹⢻⢵⡩⣛⢟⢋⣡⣵⣿⡟⢹⢿⣿⡇⠀⠀ 22 | ⠀⠀⠀⠀⠀⠀⠂⠄⡈⢀⠀⠑⢉⢓⠾⡥⢨⠐⡠⣀⠂⠆⡄⡄⡀⠐⢀⠀⡌⡖⢌⠪⣤⢾⣿⣿⣿⣏⣍⢰⣿⢿⡇⢤⠀ 23 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠋⠐⠁⠀⠈⠐⠱⠁⢊⢅⡃⠉⢒⠤⡁⠃⠦⢌⠘⠀⠁⠀⠂⣿⣿⣿⣿⣿⣿⣧⣸⣾⣿⡇⢠⠰ 24 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠄⠄⡀⠂⠅⠌⠕⣰⢈⠒⠵⢢⢎⣐⠀⡃⠄⠀⣿⢷⣿⣿⣿⣟⣯⣷⠿⢻⢱⠂⠈ 25 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠈⠀⢉⢒⠄⡂⡖⡩⢒⠄⠀⣿⡿⣟⣽⣾⡟⡏⠆⠀⠑⠈⠀⠀ 26 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠄⠂⠈⠈⢑⠣⢇⡎⠄⣿⣿⡿⡉⠃⠃⠀⠀⠀⠀⠀⠀⠀ 27 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⠁⠁⠀⠎⠛⠉⡀⠉⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀ 28 | ]] 29 | 30 | logo = string.rep("\n", 4) .. logo .. "\n" 31 | 32 | local opts = { 33 | theme = "doom", 34 | hide = { 35 | -- this is taken care of by lualine 36 | -- enabling this messes up the actual laststatus setting after loading a file 37 | statusline = false, 38 | }, 39 | config = { 40 | header = vim.split(logo, "\n"), 41 | -- stylua: ignore 42 | center = { 43 | { action = 'lua LazyVim.pick()()', desc = " Find File", icon = " ", key = "f" }, 44 | -- { action = 'lua LazyVim.pick("oldfiles")()', desc = " Recent Files", icon = " ", key = "r" }, 45 | { action = 'lua LazyVim.pick("live_grep")()', desc = " Find Text", icon = " ", key = "g" }, 46 | -- { action = 'lua LazyVim.pick.config_files()()', desc = " Config", icon = " ", key = "c" }, 47 | { action = 'lua require("persistence").load()', desc = " Restore Session", icon = " ", key = "s" }, 48 | { action = "LazyExtras", desc = " Lazy Extras", icon = " ", key = "x" }, 49 | -- { action = "Lazy", desc = " Lazy", icon = "󰒲 ", key = "l" }, 50 | { action = function() vim.api.nvim_input("qa") end, desc = " Quit", icon = " ", key = "q" }, 51 | }, 52 | footer = function() 53 | local stats = require("lazy").stats() 54 | local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100) 55 | return { "⚡ Neovim loaded " .. stats.loaded .. "/" .. stats.count .. " plugins in " .. ms .. "ms" } 56 | end, 57 | }, 58 | } 59 | 60 | for _, button in ipairs(opts.config.center) do 61 | button.desc = button.desc .. string.rep(" ", 40 - #button.desc) 62 | button.key_format = " %s" 63 | end 64 | 65 | -- open dashboard after closing lazy 66 | if vim.o.filetype == "lazy" then 67 | vim.api.nvim_create_autocmd("WinClosed", { 68 | pattern = tostring(vim.api.nvim_get_current_win()), 69 | once = true, 70 | callback = function() 71 | vim.schedule(function() 72 | vim.api.nvim_exec_autocmds("UIEnter", { group = "dashboard" }) 73 | end) 74 | end, 75 | }) 76 | end 77 | 78 | return opts 79 | end, 80 | } 81 | -------------------------------------------------------------------------------- /zsh/config.zsh: -------------------------------------------------------------------------------- 1 | # Starship configuration 2 | export STARSHIP_CONFIG=$HOME/.config/starship/starship.toml 3 | export STARSHIP_CACHE=~/.starship/cache 4 | eval "$(starship init zsh)" 5 | 6 | # Format man pages 7 | export MANROFFOPT="-c" 8 | export MANPAGER="sh -c 'col -bx | bat -l man -p'" 9 | 10 | # Node.js (bundled ICU) 11 | export PATH="/opt/node/bin:$PATH" 12 | 13 | # PATH additions 14 | for p in ~/.local/bin ~/Applications/depot_tools; do 15 | if [[ -d "$p" ]] && [[ ":$PATH:" != *":$p:"* ]]; then 16 | export PATH="$p:$PATH" 17 | fi 18 | done 19 | 20 | ###################### 21 | ### Key Bindings #### 22 | ###################### 23 | # Enable vim bindings 24 | bindkey -v 25 | 26 | # Zsh-specific settings 27 | HISTFILE=~/.histfile 28 | HISTSIZE=10000 29 | SAVEHIST=10000 30 | setopt BANG_HIST 31 | setopt appendhistory 32 | setopt hist_ignore_dups 33 | setopt hist_ignore_all_dups 34 | setopt hist_find_no_dups 35 | setopt hist_ignore_space 36 | setopt extended_history 37 | 38 | ################## 39 | ### Functions ### 40 | ################## 41 | # Backup function 42 | backup() { 43 | if [[ -n "$1" ]]; then 44 | cp "$1" "$1.bak" 45 | else 46 | echo "Usage: backup " 47 | fi 48 | } 49 | 50 | # Enhanced copy function 51 | copy() { 52 | local count=$# 53 | if [[ $count -eq 2 ]] && [[ -d "$1" ]]; then 54 | local from="${1%/}" # Remove trailing slash 55 | local to="$2" 56 | command cp -r "$from" "$to" 57 | else 58 | command cp "$@" 59 | fi 60 | } 61 | 62 | # mkcd DIR 63 | mkcd() { 64 | mkdir -p "$1" && cd "$1" 65 | } 66 | 67 | # Extract archives 68 | extract() { 69 | local file="$1" 70 | if [[ -f "$file" ]]; then 71 | case "$file" in 72 | *.tar.bz2) tar xjf "$file" ;; 73 | *.tar.gz) tar xzf "$file" ;; 74 | *.bz2) bunzip2 "$file" ;; 75 | *.rar) unrar x "$file" ;; 76 | *.gz) gunzip "$file" ;; 77 | *.tar) tar xvf "$file" ;; 78 | *.tbz2) tar xjf "$file" ;; 79 | *.tgz) tar xzf "$file" ;; 80 | *.zip) unzip "$file" ;; 81 | *.Z) uncompress "$file" ;; 82 | *.7z) 7z x "$file" ;; 83 | *) echo "'$file' cannot be extracted via extract()" ;; 84 | esac 85 | else 86 | echo "'$file' is not a valid file" 87 | fi 88 | } 89 | 90 | ################## 91 | ### Aliases ### 92 | ################## 93 | # ls replacements (matching fish exactly) 94 | alias ls='eza -al --color=always --group-directories-first --icons' 95 | alias la='eza -a --color=always --group-directories-first --icons' 96 | alias ll='eza -l --color=always --group-directories-first --icons' 97 | alias lt='eza -aT --color=always --group-directories-first --icons' 98 | alias l.='eza -a | grep -e "^\."' 99 | 100 | # Navigation 101 | alias ..='cd ..' 102 | alias ...='cd ../..' 103 | alias ....='cd ../../..' 104 | alias .....='cd ../../../..' 105 | alias ......='cd ../../../../..' 106 | 107 | # System helpers 108 | alias fixpacman="sudo rm /var/lib/pacman/db.lck" 109 | alias tarnow='tar -acf ' 110 | alias untar='tar -zxvf ' 111 | alias wget='wget -c ' 112 | alias psmem='ps auxf | sort -nr -k 4' 113 | alias psmem10='ps auxf | sort -nr -k 4 | head -10' 114 | 115 | # Arch helpers 116 | alias big="expac -H M '%m\t%n' | sort -h | nl" 117 | alias gitpkg='pacman -Q | grep -i "\-git" | wc -l' 118 | alias update='sudo pacman -Syu' 119 | alias mirror="sudo cachyos-rate-mirrors" 120 | alias cleanup='sudo pacman -Rns $(pacman -Qtdq)' 121 | 122 | # Shortcuts 123 | alias apt='man pacman' 124 | alias apt-get='man pacman' 125 | alias please='sudo' 126 | alias jctl="journalctl -p 3 -xb" 127 | alias nf='neofetch' 128 | alias ff='fastfetch' 129 | alias uf='uwufetch' 130 | alias q='exit' 131 | alias h='history' 132 | alias c='clear' 133 | 134 | # Git shortcuts 135 | alias gs='git status' 136 | alias ga='git add' 137 | alias gc='git commit' 138 | alias gcl='git clone' 139 | alias gl='git log --oneline' 140 | alias gd='git diff' 141 | alias gpush='git push' 142 | alias gpull='git pull' 143 | 144 | # System control 145 | alias wifi='nmtui' 146 | alias install='yay -S' 147 | alias search='yay -Ss' 148 | alias lsearch='yay -Qs' 149 | alias remove='yay -Rns' 150 | alias shutdown='systemctl poweroff' 151 | alias du='dust' 152 | 153 | # Zsh-specific aliases 154 | alias zshconfig='$EDITOR ~/.config/zsh/config.zsh' 155 | 156 | # Zsh-specific plugins 157 | # source $HOME/.config/zsh/plugins/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh 158 | # source $HOME/.config/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.plugin.zsh -------------------------------------------------------------------------------- /rofi/bgselector/style.rasi: -------------------------------------------------------------------------------- 1 | configuration { 2 | show-icons: true; 3 | modi: "drun"; 4 | 5 | kb-primary-paste: "Control+V,Shift+Insert"; 6 | kb-secondary-paste: "Control+v,Insert"; 7 | kb-clear-line: "Control+w"; 8 | kb-move-front: "Control+a"; 9 | kb-move-end: "Control+e"; 10 | kb-move-word-back: "Alt+b,Control+Left"; 11 | kb-move-word-forward: "Alt+f,Control+Right"; 12 | kb-move-char-back: "Left,Control+b"; 13 | kb-move-char-forward: "Right,Control+f"; 14 | kb-remove-word-back: "Control+Alt+h,Control+BackSpace"; 15 | kb-remove-word-forward: "Control+Alt+d"; 16 | kb-remove-char-forward: "Delete,Control+d"; 17 | kb-remove-char-back: "BackSpace,Shift+BackSpace"; 18 | kb-remove-to-sol: "Control+u"; 19 | kb-remove-to-eol: "Control+q"; 20 | kb-accept-entry: "Control+m,Return,KP_Enter"; 21 | kb-accept-custom: "Control+Return"; 22 | kb-accept-custom-alt: "Control+Shift+Return"; 23 | kb-accept-alt: "Shift+Return"; 24 | kb-delete-entry: "Shift+Delete"; 25 | kb-mode-next: "Shift+Right,Control+Tab"; 26 | kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab"; 27 | kb-mode-complete: "Control+p"; 28 | kb-row-left: "h"; 29 | kb-row-right: "l"; 30 | kb-row-down: "Down,j"; 31 | kb-row-up: "Up,k"; 32 | kb-page-prev: "Page_Up"; 33 | kb-page-next: "Page_Down"; 34 | kb-row-first: "Home,KP_Home"; 35 | kb-row-last: "End,KP_End"; 36 | kb-row-select: "Control+space"; 37 | kb-screenshot: "Alt+S"; 38 | kb-ellipsize: "Alt+period"; 39 | kb-toggle-case-sensitivity: "grave,dead_grave"; 40 | kb-toggle-sort: "Alt+grave"; 41 | kb-cancel: "Escape,Control+g,Control+bracketleft"; 42 | kb-custom-1: "Alt+1"; 43 | kb-custom-2: "Alt+2"; 44 | kb-custom-3: "Alt+3"; 45 | kb-custom-4: "Alt+4"; 46 | kb-custom-5: "Alt+5"; 47 | kb-custom-6: "Alt+6"; 48 | kb-custom-7: "Alt+7"; 49 | kb-custom-8: "Alt+8"; 50 | kb-custom-9: "Alt+9"; 51 | kb-custom-10: "Alt+0"; 52 | kb-custom-11: "Alt+exclam"; 53 | kb-custom-12: "Alt+at"; 54 | kb-custom-13: "Alt+numbersign"; 55 | kb-custom-14: "Alt+dollar"; 56 | kb-custom-15: "Alt+percent"; 57 | kb-custom-16: "Alt+dead_circumflex"; 58 | kb-custom-17: "Alt+ampersand"; 59 | kb-custom-18: "Alt+asterisk"; 60 | kb-custom-19: "Alt+parenleft"; 61 | kb-select-1: "Super+1"; 62 | kb-select-2: "Super+2"; 63 | kb-select-3: "Super+3"; 64 | kb-select-4: "Super+4"; 65 | kb-select-5: "Super+5"; 66 | kb-select-6: "Super+6"; 67 | kb-select-7: "Super+7"; 68 | kb-select-8: "Super+8"; 69 | kb-select-9: "Super+9"; 70 | kb-select-10: "Super+0"; 71 | ml-row-left: "ScrollLeft"; 72 | ml-row-right: "ScrollRight"; 73 | ml-row-up: "ScrollUp"; 74 | ml-row-down: "ScrollDown"; 75 | me-select-entry: "MousePrimary"; 76 | me-accept-entry: "MouseDPrimary"; 77 | me-accept-custom: "Control+MouseDPrimary"; 78 | } 79 | 80 | * { 81 | background-color: transparent; 82 | separator: none; 83 | border: none; 84 | padding: 0px; 85 | margin: 0px; 86 | } 87 | 88 | window { 89 | background-color: rgba(0,0,0,1); // slightly stronger backdrop 90 | fullscreen: true; 91 | border: 0px; 92 | separator: none; 93 | } 94 | 95 | mainbox { 96 | children: [listview]; 97 | spacing: 0px; 98 | border: 0px; 99 | separator: none; 100 | padding: 0% 5%; // use horizontal padding only 101 | expand: true; // makes listview fill available height 102 | orientation: vertical; 103 | valign: 0.5; // center vertically 104 | } 105 | 106 | listview { 107 | padding: 20px; 108 | spacing: 12px; // slightly looser spacing between thumbs 109 | columns: 7; 110 | lines: 1; 111 | flow: horizontal; 112 | fixed-height: true; 113 | scrollbar: false; 114 | cycle: true; 115 | border: 0px; 116 | separator: none; 117 | expand: true; // vertically centers content 118 | valign: 0.5; 119 | halign: 0.5; // horizontally centered too 120 | } 121 | 122 | element { 123 | border-radius: 0px; // subtle rounded corners 124 | children: [element-icon]; 125 | background-color: #000000; 126 | padding: 0px; 127 | margin: 0px; 128 | } 129 | 130 | element.selected { 131 | border: 2px solid; 132 | border-color: #ffffff; 133 | border-radius: 0px; 134 | background-color: rgba(255,255,255,0.05); // soft highlight behind selection 135 | } 136 | 137 | element-icon { 138 | size: 330px 509px; // slightly refined proportions 139 | horizontal-align: 0.5; 140 | vertical-align: 0.5; 141 | background-color: #000000; 142 | expand: true; 143 | scale: "fit"; 144 | } 145 | -------------------------------------------------------------------------------- /scripts/bgselector.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | WALL_DIR="$HOME/Pictures/Wallpapers" 4 | CACHE_DIR="$HOME/.cache/thumbnails/bgselector" 5 | CACHE_INDEX="$CACHE_DIR/.index" 6 | 7 | mkdir -p "$CACHE_DIR" 8 | 9 | # Build current wallpaper index 10 | current_index=$(mktemp) 11 | find "$WALL_DIR" -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' -o -iname '*.gif' -o -iname '*.bmp' -o -iname '*.tiff' -o -iname '*.avif' \) -printf '%p\n' > "$current_index" 12 | 13 | # Clean orphaned cache files 14 | if [ -f "$CACHE_INDEX" ]; then 15 | while read -r cached_path; do 16 | if [ ! -f "$cached_path" ]; then 17 | rel_path="${cached_path#$WALL_DIR/}" 18 | cache_name="${rel_path//\//_}" 19 | cache_name="${cache_name%.*}.jpg" 20 | rm -f "$CACHE_DIR/$cache_name" 21 | fi 22 | done < "$CACHE_INDEX" 23 | fi 24 | 25 | # Generate thumbnails with validation 26 | progress_file=$(mktemp) 27 | touch "$progress_file" 28 | 29 | # Use all available CPU cores for parallel processing 30 | max_jobs=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) 31 | job_count=0 32 | 33 | # Create list of images that need thumbnails 34 | to_generate=$(mktemp) 35 | while read -r img; do 36 | rel_path="${img#$WALL_DIR/}" 37 | cache_name="${rel_path//\//_}" 38 | cache_name="${cache_name%.*}.jpg" 39 | cache_file="$CACHE_DIR/$cache_name" 40 | 41 | [ -f "$cache_file" ] || echo "$img" >> "$to_generate" 42 | done < "$current_index" 43 | 44 | # Process images in parallel 45 | generate_thumbnail() { 46 | local img="$1" 47 | local cache_dir="$2" 48 | local wall_dir="$3" 49 | local progress="$4" 50 | 51 | local rel_path="${img#$wall_dir/}" 52 | local cache_name="${rel_path//\//_}" 53 | cache_name="${cache_name%.*}.jpg" 54 | local cache_file="$cache_dir/$cache_name" 55 | 56 | # Optimized magick with faster settings: 57 | # -define jpeg:size= hints decoder to not decode full res 58 | # -filter Triangle is faster than default Lanczos 59 | # -limit memory/map constrains resource usage per job 60 | if [[ "$img" =~ \.(gif|GIF)$ ]]; then 61 | magick "$img[0]" -define jpeg:size=660x1080 -filter Triangle -strip \ 62 | -thumbnail 330x540^ -gravity center -extent 330x540 \ 63 | -quality 80 +repage "$cache_file" 2>/dev/null 64 | else 65 | magick "$img" -define jpeg:size=660x1080 -filter Triangle -strip \ 66 | -thumbnail 330x540^ -gravity center -extent 330x540 \ 67 | -quality 80 +repage "$cache_file" 2>/dev/null 68 | fi 69 | [ -f "$cache_file" ] && echo "1" >> "$progress" 70 | } 71 | export -f generate_thumbnail 72 | 73 | # Use xargs for efficient parallel execution if available, fallback to bash loop 74 | if command -v xargs >/dev/null 2>&1 && [ -s "$to_generate" ]; then 75 | cat "$to_generate" | xargs -P "$max_jobs" -I {} bash -c \ 76 | 'generate_thumbnail "$1" "$2" "$3" "$4"' _ {} "$CACHE_DIR" "$WALL_DIR" "$progress_file" 77 | elif [ -s "$to_generate" ]; then 78 | # Fallback: manual parallel with all cores 79 | while read -r img; do 80 | generate_thumbnail "$img" "$CACHE_DIR" "$WALL_DIR" "$progress_file" & 81 | ((job_count++)) 82 | if [ $((job_count % max_jobs)) -eq 0 ]; then 83 | wait -n 2>/dev/null || wait 84 | fi 85 | done < "$to_generate" 86 | wait 87 | fi 88 | 89 | rm -f "$to_generate" 90 | 91 | total_generated=$(wc -l < "$progress_file" 2>/dev/null || echo 0) 92 | [ $total_generated -gt 0 ] && echo "Generated $total_generated thumbnails" || echo "Cache up to date" 93 | rm -f "$progress_file" 94 | 95 | # Update cache index 96 | mv "$current_index" "$CACHE_INDEX" 97 | 98 | # Build rofi list 99 | rofi_input=$(mktemp) 100 | while read -r img; do 101 | rel_path="${img#$WALL_DIR/}" 102 | cache_name="${rel_path//\//_}" 103 | cache_name="${cache_name%.*}.jpg" 104 | cache_file="$CACHE_DIR/$cache_name" 105 | 106 | [ -f "$cache_file" ] && printf '%s\000icon\037%s\n' "$rel_path" "$cache_file" 107 | done < "$CACHE_INDEX" > "$rofi_input" 108 | 109 | # Show rofi and get selection 110 | selected=$(rofi -dmenu -show-icons -config "$HOME/.config/rofi/bgselector/style.rasi" < "$rofi_input") 111 | rm "$rofi_input" 112 | 113 | # Apply wallpaper 114 | if [ -n "$selected" ]; then 115 | selected_path="$WALL_DIR/$selected" 116 | if [ -f "$selected_path" ]; then 117 | awww img "$selected_path" -t fade --transition-duration 2 --transition-fps 30 & 118 | sleep 0.2 119 | "$HOME/.config/scripts/theme-sync.sh" & 120 | wait 121 | fi 122 | fi -------------------------------------------------------------------------------- /nvim/lazy-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" }, 3 | "LazyVim": { "branch": "main", "commit": "28db03f958d58dfff3c647ce28fdc1cb88ac158d" }, 4 | "LuaSnip": { "branch": "master", "commit": "3732756842a2f7e0e76a7b0487e9692072857277" }, 5 | "SchemaStore.nvim": { "branch": "main", "commit": "e9c00ea7813006dfa29f35c174f83f0184d45a93" }, 6 | "blink.cmp": { "branch": "main", "commit": "b19413d214068f316c78978b08264ed1c41830ec" }, 7 | "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, 8 | "catppuccin": { "branch": "main", "commit": "ce4a8e0d5267e67056f9f4dcf6cb1d0933c8ca00" }, 9 | "clangd_extensions.nvim": { "branch": "main", "commit": "b67cc417d9020fb4b83d46662351b4d16894905e" }, 10 | "cmake-tools.nvim": { "branch": "master", "commit": "87944a5d79b4da7458145d7476d5336557e11911" }, 11 | "conform.nvim": { "branch": "master", "commit": "4993e07fac6679d0a5005aa7499e0bad2bd39f19" }, 12 | "crates.nvim": { "branch": "main", "commit": "ac9fa498a9edb96dc3056724ff69d5f40b898453" }, 13 | "dashboard-nvim": { "branch": "master", "commit": "0775e567b6c0be96d01a61795f7b64c1758262f6" }, 14 | "edgy.nvim": { "branch": "main", "commit": "8bfd2808994a988c975694122f68624b8a219f5f" }, 15 | "flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" }, 16 | "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, 17 | "gitsigns.nvim": { "branch": "main", "commit": "5813e4878748805f1518cee7abb50fd7205a3a48" }, 18 | "grug-far.nvim": { "branch": "main", "commit": "b58b2d65863f4ebad88b10a1ddd519e5380466e0" }, 19 | "inc-rename.nvim": { "branch": "main", "commit": "2597bccb57d1b570fbdbd4adf88b955f7ade715b" }, 20 | "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, 21 | "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" }, 22 | "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" }, 23 | "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, 24 | "mason-lspconfig.nvim": { "branch": "main", "commit": "0b9bb925c000ae649ff7e7149c8cd00031f4b539" }, 25 | "mason.nvim": { "branch": "main", "commit": "57e5a8addb8c71fb063ee4acda466c7cf6ad2800" }, 26 | "mini.ai": { "branch": "main", "commit": "bfb26d9072670c3aaefab0f53024b2f3729c8083" }, 27 | "mini.hipatterns": { "branch": "main", "commit": "add8d8abad602787377ec5d81f6b248605828e0f" }, 28 | "mini.icons": { "branch": "main", "commit": "ff2e4f1d29f659cc2bad0f9256f2f6195c6b2428" }, 29 | "mini.pairs": { "branch": "main", "commit": "472ec50092a3314ec285d2db2baa48602d71fe93" }, 30 | "neopywal": { "branch": "master", "commit": "09188d79b45694141ec779d05cbcc75f994639d1" }, 31 | "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" }, 32 | "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, 33 | "nvim-lint": { "branch": "master", "commit": "d1118791070d090777398792a73032a0ca5c79ff" }, 34 | "nvim-lspconfig": { "branch": "master", "commit": "effe4bf2e1afb881ea67291c648b68dd3dfc927a" }, 35 | "nvim-treesitter": { "branch": "main", "commit": "c5623d3486c1cda5f73e28a3a4abb454f708c48c" }, 36 | "nvim-treesitter-textobjects": { "branch": "main", "commit": "dfbf9596f8aa8b4bed5301647485594ff7252955" }, 37 | "nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" }, 38 | "nvim-ts-context-commentstring": { "branch": "main", "commit": "1b212c2eee76d787bbea6aa5e92a2b534e7b4f8f" }, 39 | "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" }, 40 | "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, 41 | "refactoring.nvim": { "branch": "master", "commit": "6784b54587e6d8a6b9ea199318512170ffb9e418" }, 42 | "render-markdown.nvim": { "branch": "main", "commit": "84432cb0bf9a29c020b217a1aa474155d1b929de" }, 43 | "rustaceanvim": { "branch": "master", "commit": "6c3785d6a230bec63f70c98bf8e2842bed924245" }, 44 | "snacks.nvim": { "branch": "main", "commit": "fe7cfe9800a182274d0f868a74b7263b8c0c020b" }, 45 | "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, 46 | "tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" }, 47 | "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" }, 48 | "ts-comments.nvim": { "branch": "main", "commit": "123a9fb12e7229342f807ec9e6de478b1102b041" }, 49 | "venv-selector.nvim": { "branch": "main", "commit": "58bae72c84b9f7f864c879ec1896e384296f9ffb" }, 50 | "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } 51 | } 52 | -------------------------------------------------------------------------------- /fish/fish_variables: -------------------------------------------------------------------------------- 1 | # This file contains fish universal variable definitions. 2 | # VERSION: 3.0 3 | SETUVAR __done_min_cmd_duration:10000 4 | SETUVAR __done_notification_urgency_level:low 5 | SETUVAR __fish_initialized:3800 6 | SETUVAR _fisher_upgraded_to_4_4:\x1d 7 | SETUVAR fish_color_autosuggestion:brblack 8 | SETUVAR fish_color_cancel:\x2dr 9 | SETUVAR fish_color_command:normal 10 | SETUVAR fish_color_comment:red 11 | SETUVAR fish_color_cwd:green 12 | SETUVAR fish_color_cwd_root:red 13 | SETUVAR fish_color_end:green 14 | SETUVAR fish_color_error:brred 15 | SETUVAR fish_color_escape:brcyan 16 | SETUVAR fish_color_history_current:\x2d\x2dbold 17 | SETUVAR fish_color_host:normal 18 | SETUVAR fish_color_host_remote:yellow 19 | SETUVAR fish_color_normal:normal 20 | SETUVAR fish_color_operator:brcyan 21 | SETUVAR fish_color_param:cyan 22 | SETUVAR fish_color_quote:yellow 23 | SETUVAR fish_color_redirection:cyan\x1e\x2d\x2dbold 24 | SETUVAR fish_color_search_match:white\x1e\x2d\x2dbackground\x3dbrblack 25 | SETUVAR fish_color_selection:white\x1e\x2d\x2dbold\x1e\x2d\x2dbackground\x3dbrblack 26 | SETUVAR fish_color_status:red 27 | SETUVAR fish_color_user:brgreen 28 | SETUVAR fish_color_valid_path:\x2d\x2dunderline 29 | SETUVAR fish_greeting: 30 | SETUVAR fish_key_bindings:fish_vi_key_bindings 31 | SETUVAR fish_pager_color_completion:normal 32 | SETUVAR fish_pager_color_description:yellow\x1e\x2di 33 | SETUVAR fish_pager_color_prefix:normal\x1e\x2d\x2dbold\x1e\x2d\x2dunderline 34 | SETUVAR fish_pager_color_progress:brwhite\x1e\x2d\x2dbackground\x3dcyan 35 | SETUVAR fish_pager_color_selected_background:\x2dr 36 | SETUVAR fish_user_paths:/home/saatvik333/\x2eopencode/bin 37 | SETUVAR pure_begin_prompt_with_current_directory:true 38 | SETUVAR pure_check_for_new_release:false 39 | SETUVAR pure_color_at_sign:pure_color_mute 40 | SETUVAR pure_color_aws_profile:pure_color_warning 41 | SETUVAR pure_color_command_duration:pure_color_warning 42 | SETUVAR pure_color_current_directory:pure_color_primary 43 | SETUVAR pure_color_danger:red 44 | SETUVAR pure_color_dark:black 45 | SETUVAR pure_color_git_branch:pure_color_mute 46 | SETUVAR pure_color_git_dirty:pure_color_mute 47 | SETUVAR pure_color_git_stash:pure_color_info 48 | SETUVAR pure_color_git_unpulled_commits:pure_color_info 49 | SETUVAR pure_color_git_unpushed_commits:pure_color_info 50 | SETUVAR pure_color_hostname:pure_color_mute 51 | SETUVAR pure_color_info:cyan 52 | SETUVAR pure_color_jobs:pure_color_normal 53 | SETUVAR pure_color_k8s_context:pure_color_success 54 | SETUVAR pure_color_k8s_namespace:pure_color_primary 55 | SETUVAR pure_color_k8s_prefix:pure_color_info 56 | SETUVAR pure_color_light:white 57 | SETUVAR pure_color_mute:brblack 58 | SETUVAR pure_color_nixdevshell_prefix:pure_color_info 59 | SETUVAR pure_color_nixdevshell_symbol:pure_color_mute 60 | SETUVAR pure_color_normal:normal 61 | SETUVAR pure_color_prefix_root_prompt:pure_color_danger 62 | SETUVAR pure_color_primary:blue 63 | SETUVAR pure_color_prompt_on_error:pure_color_danger 64 | SETUVAR pure_color_prompt_on_success:pure_color_success 65 | SETUVAR pure_color_success:magenta 66 | SETUVAR pure_color_system_time:pure_color_mute 67 | SETUVAR pure_color_username_normal:pure_color_mute 68 | SETUVAR pure_color_username_root:pure_color_light 69 | SETUVAR pure_color_virtualenv:pure_color_mute 70 | SETUVAR pure_color_warning:yellow 71 | SETUVAR pure_enable_aws_profile:true 72 | SETUVAR pure_enable_container_detection:true 73 | SETUVAR pure_enable_git:true 74 | SETUVAR pure_enable_k8s:false 75 | SETUVAR pure_enable_nixdevshell:false 76 | SETUVAR pure_enable_single_line_prompt:false 77 | SETUVAR pure_enable_virtualenv:true 78 | SETUVAR pure_reverse_prompt_symbol_in_vimode:true 79 | SETUVAR pure_separate_prompt_on_error:false 80 | SETUVAR pure_shorten_prompt_current_directory_length:0 81 | SETUVAR pure_shorten_window_title_current_directory_length:0 82 | SETUVAR pure_show_jobs:false 83 | SETUVAR pure_show_prefix_root_prompt:false 84 | SETUVAR pure_show_subsecond_command_duration:false 85 | SETUVAR pure_show_system_time:false 86 | SETUVAR pure_symbol_aws_profile_prefix: 87 | SETUVAR pure_symbol_container_prefix: 88 | SETUVAR pure_symbol_git_dirty:\x2a 89 | SETUVAR pure_symbol_git_stash:\u2261 90 | SETUVAR pure_symbol_git_unpulled_commits:\u21e3 91 | SETUVAR pure_symbol_git_unpushed_commits:\u21e1 92 | SETUVAR pure_symbol_k8s_prefix:\u2638 93 | SETUVAR pure_symbol_nixdevshell_prefix:\u2744\ufe0f 94 | SETUVAR pure_symbol_prefix_root_prompt:\x23 95 | SETUVAR pure_symbol_prompt:\u276f 96 | SETUVAR pure_symbol_reverse_prompt:\u276e 97 | SETUVAR pure_symbol_ssh_prefix: 98 | SETUVAR pure_symbol_title_bar_separator:\x2d 99 | SETUVAR pure_symbol_virtualenv_prefix: 100 | SETUVAR pure_threshold_command_duration:5 101 | SETUVAR pure_truncate_prompt_current_directory_keeps:\x2d1 102 | SETUVAR pure_truncate_window_title_current_directory_keeps:\x2d1 103 | -------------------------------------------------------------------------------- /wallust/templates/vicinae.toml: -------------------------------------------------------------------------------- 1 | # Vicinae Theme - Wallust Generated 2 | # This file is a template. Place it in your wallust templates directory 3 | # and configure wallust.toml to output it to your vicinae themes folder. 4 | 5 | [meta] 6 | name = "Wallust Generated" 7 | description = "Dynamic theme generated from current wallpaper" 8 | variant = "dark" # Wallust defaults to dark variants usually. 9 | inherits = "vicinae-dark" 10 | 11 | # ============================================================================ 12 | # Core Colors 13 | # ============================================================================ 14 | 15 | [colors.core] 16 | accent = "{{color4}}" # Standard ANSI Blue for primary actions 17 | accent_foreground = "{{background}}" # Text on accent should be dark for contrast 18 | background = "{{background}}" # Main wallpaper-derived background 19 | foreground = "{{foreground}}" # Main text color 20 | secondary_background = "{{color0 | lighten(0.05)}}" # Slightly elevated surface 21 | border = "{{color8 | darken(0.3)}}" # Subtler border than raw bright-black 22 | 23 | # ============================================================================ 24 | # Window-Specific Colors 25 | # ============================================================================ 26 | 27 | [colors.main_window] 28 | border = "{{color8 | darken(0.3)}}" 29 | 30 | [colors.settings_window] 31 | border = "{{color8 | darken(0.3)}}" 32 | 33 | # ============================================================================ 34 | # Accent Colors 35 | # ============================================================================ 36 | 37 | [colors.accents] 38 | blue = "{{color4}}" 39 | green = "{{color2}}" 40 | magenta = "{{color5}}" 41 | orange = "{{color3}}" # ANSI Yellow/Orange are often swapped or similar 42 | red = "{{color1}}" 43 | yellow = "{{color3}}" 44 | cyan = "{{color6}}" 45 | purple = "{{color5}}" 46 | 47 | # ============================================================================ 48 | # Text Colors 49 | # ============================================================================ 50 | 51 | [colors.text] 52 | default = "{{foreground}}" 53 | muted = "{{foreground | darken(0.4)}}" # Derived from foreground for consistent tone 54 | danger = "{{color1}}" # Red for errors 55 | success = "{{color2}}" # Green for success 56 | placeholder = "{{foreground | darken(0.6)}}" # Even darker than muted 57 | selection = { background = "{{color4}}", foreground = "{{background}}" } 58 | 59 | [colors.text.links] 60 | default = "{{color4}}" 61 | visited = "{{color5 | darken(0.1)}}" 62 | 63 | # ============================================================================ 64 | # Input Fields 65 | # ============================================================================ 66 | 67 | [colors.input] 68 | border = "{{color8 | darken(0.3)}}" 69 | border_focus = "{{color4}}" 70 | border_error = "{{color1}}" 71 | 72 | # ============================================================================ 73 | # Buttons 74 | # ============================================================================ 75 | 76 | [colors.button.primary] 77 | background = "{{color0 | lighten(0.1)}}" # Explicitly elevated button background 78 | foreground = "{{foreground}}" 79 | hover = { background = "{{color8 | darken(0.1)}}" } # Smoother hover state 80 | focus = { outline = "{{color4}}" } 81 | 82 | # ============================================================================ 83 | # Lists 84 | # ============================================================================ 85 | 86 | [colors.list.item.hover] 87 | background = "{{color8 | darken(0.2)}}" # darker hover for better text contrast 88 | foreground = "{{foreground}}" 89 | 90 | [colors.list.item.selection] 91 | background = "{{color8}}" # Selected item background 92 | foreground = "{{foreground}}" 93 | secondary_background = "{{color8}}" 94 | secondary_foreground = "{{foreground}}" 95 | 96 | # ============================================================================ 97 | # Grid Items 98 | # ============================================================================ 99 | 100 | [colors.grid.item] 101 | background = "{{color0 | lighten(0.05)}}" 102 | hover = { outline = "{{foreground | darken(0.2)}}" } 103 | selection = { outline = "{{color4}}" } 104 | 105 | # ============================================================================ 106 | # Scrollbars 107 | # ============================================================================ 108 | 109 | [colors.scrollbars] 110 | background = "{{color0}}" 111 | 112 | # ============================================================================ 113 | # Loading Indicators 114 | # ============================================================================ 115 | 116 | [colors.loading] 117 | bar = "{{color4}}" 118 | spinner = "{{color4}}" -------------------------------------------------------------------------------- /nvim/lua/plugins/plugins.lua: -------------------------------------------------------------------------------- 1 | return {{ 2 | "LazyVim/LazyVim", 3 | opts = { 4 | news = { 5 | headlines = false, 6 | }, 7 | extras = {"lazyvim.plugins.extras.lang.typescript", "lazyvim.plugins.extras.lang.python", 8 | "lazyvim.plugins.extras.lang.json", "lazyvim.plugins.extras.lang.yaml", 9 | "lazyvim.plugins.extras.lang.markdown", "lazyvim.plugins.extras.lang.docker", 10 | "lazyvim.plugins.extras.lang.terraform", "lazyvim.plugins.extras.lang.html", 11 | "lazyvim.plugins.extras.lang.css", "lazyvim.plugins.extras.lang.tailwind", 12 | "lazyvim.plugins.extras.lang.rust", "lazyvim.plugins.extras.lang.go", 13 | "lazyvim.plugins.extras.lang.clangd", "lazyvim.plugins.extras.lang.prisma", 14 | "lazyvim.plugins.extras.ui.edgy", "lazyvim.plugins.extras.editor.refactoring", 15 | "lazyvim.plugins.extras.util.project"} 16 | } 17 | 18 | }, { 19 | "mason-org/mason.nvim", 20 | opts = function(_, opts) 21 | vim.list_extend(opts.ensure_installed, { -- Core LSP Servers 22 | "lua-language-server", "pyright", "ruff-lsp", "typescript-language-server", "eslint-lsp", "html-lsp", "css-lsp", 23 | "tailwindcss-language-server", "json-lsp", "yaml-language-server", "taplo", "marksman", "rust-analyzer", 24 | "gopls", "dockerfile-language-server", "terraform-ls", "prisma-language-server", "clangd", -- Formatters 25 | "stylua", "prettierd", "eslint_d", "shfmt", "rustfmt", "gofumpt", "goimports", "taplo", "black", "isort", 26 | "clang-format", -- Linters 27 | "shellcheck", "ruff", "eslint_d", "yamllint", "markdownlint", "hadolint"}) 28 | end 29 | }, { 30 | "mfussenegger/nvim-lint", 31 | event = "LazyFile", 32 | opts = { 33 | linters_by_ft = { 34 | lua = {"selene"}, 35 | python = {"ruff"}, 36 | javascript = {"eslint_d"}, 37 | typescript = {"eslint_d"}, 38 | javascriptreact = {"eslint_d"}, 39 | typescriptreact = {"eslint_d"}, 40 | vue = {"eslint_d"}, 41 | html = {"htmlhint"}, 42 | css = {"stylelint"}, 43 | scss = {"stylelint"}, 44 | yaml = {"yamllint"}, 45 | markdown = {"markdownlint"}, 46 | sh = {"shellcheck"}, 47 | dockerfile = {"hadolint"}, 48 | terraform = {"tflint"}, 49 | ["*"] = {"typos"} 50 | }, 51 | linters = { 52 | typos = { 53 | condition = function(ctx) 54 | return vim.fs.find({"typos.toml", ".typos.toml"}, { 55 | path = ctx.filename, 56 | upward = true 57 | })[1] 58 | end 59 | } 60 | } 61 | } 62 | }, { 63 | "stevearc/conform.nvim", 64 | opts = { 65 | formatters_by_ft = { 66 | lua = {"stylua"}, 67 | python = {"isort", "black"}, 68 | javascript = {"prettierd"}, 69 | typescript = {"prettierd"}, 70 | javascriptreact = {"prettierd"}, 71 | typescriptreact = {"prettierd"}, 72 | vue = {"prettierd"}, 73 | html = {"prettierd"}, 74 | css = {"prettierd"}, 75 | scss = {"prettierd"}, 76 | json = {"prettierd"}, 77 | jsonc = {"prettierd"}, 78 | yaml = {"prettierd"}, 79 | markdown = {"prettierd"}, 80 | sh = {"shfmt"}, 81 | rust = {"rustfmt"}, 82 | go = {"gofumpt", "goimports"}, 83 | toml = {"taplo"}, 84 | terraform = {"terraform_fmt"}, 85 | cpp = {"clang-format"}, 86 | c = {"clang-format"}, 87 | ["*"] = {"trim_whitespace"} 88 | }, 89 | formatters = { 90 | prettierd = { 91 | prepend_args = {"--tab-width", "2", "--single-quote", "true", "--trailing-comma", "es5", 92 | "--print-width", "100", "--semi", "true"} 93 | }, 94 | shfmt = { 95 | prepend_args = {"-i", "2", "-ci", "-sr"} 96 | }, 97 | rustfmt = { 98 | prepend_args = {"--edition", "2021"} 99 | }, 100 | stylua = { 101 | prepend_args = {"--indent-type", "Spaces", "--indent-width", "2", "--column-width", "120"} 102 | }, 103 | black = { 104 | prepend_args = {"--line-length", "88", "--target-version", "py38"} 105 | }, 106 | ["clang-format"] = { 107 | prepend_args = {"--style=Google"} 108 | } 109 | } 110 | } 111 | }, { 112 | "RedsXDD/neopywal.nvim", 113 | name = "neopywal", 114 | lazy = false, 115 | priority = 1000, 116 | config = function() 117 | require("neopywal").setup({ 118 | transparent_background = true, 119 | use_palette = { 120 | dark = "wallust", 121 | light = "wallust" 122 | } 123 | }) 124 | vim.cmd.colorscheme("neopywal-dark") 125 | end 126 | }} 127 | -------------------------------------------------------------------------------- /fish/config.fish: -------------------------------------------------------------------------------- 1 | # Disable greeting 2 | set -U fish_greeting "" 3 | 4 | # Starship prompt 5 | if status is-interactive 6 | set -gx STARSHIP_CONFIG $HOME/.config/starship/starship.toml 7 | starship init fish | source 8 | end 9 | 10 | # Format man pages 11 | set -x MANROFFOPT -c 12 | set -x MANPAGER "sh -c 'col -bx | bat -l man -p'" 13 | 14 | # Source fish_profile if exists 15 | if test -f $HOME/.fish_profile 16 | source $HOME/.fish_profile 17 | end 18 | 19 | # Node.js (bundled ICU) 20 | set -gx PATH /opt/node/bin $PATH 21 | 22 | # PATH additions 23 | for p in $HOME/.local/bin $HOME/Applications/depot_tools 24 | if test -d $p 25 | if not contains -- $p $PATH 26 | set -p PATH $p 27 | end 28 | end 29 | end 30 | 31 | ##################### 32 | ### Key Bindings ### 33 | ##################### 34 | # Enable vim bindings 35 | set -U fish_key_bindings fish_vi_key_bindings 36 | 37 | # Always block cursor (disable cursor switching) 38 | function fish_mode_prompt 39 | echo -n '' 40 | end 41 | 42 | # !! and !$ support 43 | function __history_previous_command 44 | switch (commandline -t) 45 | case "!" 46 | commandline -t $history[1] 47 | commandline -f repaint 48 | case "*" 49 | commandline -i ! 50 | end 51 | end 52 | 53 | function __history_previous_command_arguments 54 | switch (commandline -t) 55 | case "!" 56 | commandline -t "" 57 | commandline -f history-token-search-backward 58 | case "*" 59 | commandline -i '$' 60 | end 61 | end 62 | 63 | bind ! __history_previous_command 64 | bind '$' __history_previous_command_arguments 65 | 66 | ################## 67 | ### Functions ### 68 | ################## 69 | # Better history 70 | function history 71 | builtin history --show-time='%F %T ' 72 | end 73 | 74 | function backup --argument filename 75 | cp $filename $filename.bak 76 | end 77 | 78 | # Copy DIR1 DIR2 79 | function copy 80 | set count (count $argv | tr -d \n) 81 | if test "$count" = 2; and test -d "$argv[1]" 82 | set from (string trim -r -c '/' $argv[1]) 83 | set to $argv[2] 84 | command cp -r $from $to 85 | else 86 | command cp $argv 87 | end 88 | end 89 | 90 | # mkcd DIR 91 | function mkcd 92 | mkdir -p $argv[1]; and cd $argv[1] 93 | end 94 | 95 | # Extract archives 96 | function extract 97 | set file $argv[1] 98 | if test -f $file 99 | switch $file 100 | case '*.tar.bz2' 101 | tar xjf $file 102 | case '*.tar.gz' 103 | tar xzf $file 104 | case '*.bz2' 105 | bunzip2 $file 106 | case '*.rar' 107 | unrar x $file 108 | case '*.gz' 109 | gunzip $file 110 | case '*.tar' 111 | tar xvf $file 112 | case '*.tbz2' 113 | tar xjf $file 114 | case '*.tgz' 115 | tar xzf $file 116 | case '*.zip' 117 | unzip $file 118 | case '*.Z' 119 | uncompress $file 120 | case '*.7z' 121 | 7z x $file 122 | case '*' 123 | echo "'$file' cannot be extracted via extract()" 124 | end 125 | else 126 | echo "'$file' is not a valid file" 127 | end 128 | end 129 | 130 | ################## 131 | ### Aliases ### 132 | ################## 133 | # ls replacements 134 | alias ls='eza -al --color=always --group-directories-first --icons' 135 | alias la='eza -a --color=always --group-directories-first --icons' 136 | alias ll='eza -l --color=always --group-directories-first --icons' 137 | alias lt='eza -aT --color=always --group-directories-first --icons' 138 | alias l.='eza -a | grep -e "^\."' 139 | 140 | # System helpers 141 | alias grubup="sudo grub-mkconfig -o /boot/grub/grub.cfg" 142 | alias fixpacman="sudo rm /var/lib/pacman/db.lck" 143 | alias tarnow='tar -acf ' 144 | alias untar='tar -zxvf ' 145 | alias wget='wget -c ' 146 | alias psmem='ps auxf | sort -nr -k 4' 147 | alias psmem10='ps auxf | sort -nr -k 4 | head -10' 148 | alias ..='cd ..' 149 | alias ...='cd ../..' 150 | alias ....='cd ../../..' 151 | alias .....='cd ../../../..' 152 | alias ......='cd ../../../../..' 153 | 154 | # Arch helpers 155 | alias gitpkg='pacman -Q | grep -i "\-git" | wc -l' 156 | alias update='sudo pacman -Syu' 157 | alias mirror="sudo cachyos-rate-mirrors" 158 | alias cleanup='sudo pacman -Rns (pacman -Qtdq)' 159 | 160 | # Shortcuts 161 | alias apt='man pacman' 162 | alias apt-get='man pacman' 163 | alias please='sudo' 164 | alias jctl="journalctl -p 3 -xb" 165 | alias nf='neofetch' 166 | alias ff='fastfetch' 167 | alias q='exit' 168 | alias h='history' 169 | alias c='clear' 170 | 171 | # Git shortcuts 172 | alias gs='git status' 173 | alias ga='git add' 174 | alias gc='git commit' 175 | alias gcl='git clone' 176 | alias gl='git log --oneline' 177 | alias gd='git diff' 178 | alias gpush='git push' 179 | alias gpull='git pull' 180 | 181 | # System control 182 | alias wifi='nmtui' 183 | alias install='yay -S' 184 | alias update='yay -Syu' 185 | alias search='yay -Ss' 186 | alias lsearch='yay -Qs' 187 | alias remove='yay -Rns' 188 | alias shutdown='systemctl poweroff' 189 | alias du='dust' 190 | 191 | ################### 192 | ### Environment ### 193 | ################### 194 | set -gx SHELL_CONFIG_DIR $HOME/.config 195 | set -gx GOPATH $HOME/go 196 | set -gx PATH $GOPATH/bin $PATH 197 | set -gx CARGO_HOME $HOME/.cargo 198 | set -gx PATH $CARGO_HOME/bin $PATH -------------------------------------------------------------------------------- /rofi/config.rasi: -------------------------------------------------------------------------------- 1 | configuration { 2 | /*---------- General setting ----------*/ 3 | modi: "drun,run,filebrowser,window"; 4 | case-sensitive: false; 5 | cycle: true; 6 | filter: ""; 7 | scroll-method: 0; 8 | normalize-match: true; 9 | show-icons: true; 10 | icon-theme: "Papirus"; 11 | /* cache-dir: ;*/ 12 | steal-focus: false; 13 | /* dpi: -1;*/ 14 | 15 | /*---------- Matching setting ----------*/ 16 | matching: "normal"; 17 | tokenize: true; 18 | 19 | /*---------- SSH settings ----------*/ 20 | ssh-client: "ssh"; 21 | ssh-command: "{terminal} -e {ssh-client} {host} [-p {port}]"; 22 | parse-hosts: true; 23 | parse-known-hosts: true; 24 | 25 | /*---------- Drun settings ----------*/ 26 | drun-categories: ""; 27 | drun-match-fields: "name,generic,exec,categories,keywords"; 28 | drun-display-format: "{name} [({generic})]"; 29 | drun-show-actions: false; 30 | drun-reload-desktop-cache: true; 31 | drun-url-launcher: "xdg-open"; 32 | drun-use-desktop-cache: false; 33 | drun { 34 | /** Parse user desktop files. */ 35 | parse-user: true; 36 | /** Parse system desktop files. */ 37 | parse-system: true; 38 | } 39 | 40 | /*---------- Run settings ----------*/ 41 | run-command: "{cmd}"; 42 | run-list-command: ""; 43 | run-shell-command: "{terminal} -e {cmd}"; 44 | 45 | /*---------- Fallback Icon ----------*/ 46 | run,drun { 47 | fallback-icon: "application-x-addon"; 48 | } 49 | 50 | /*---------- Window switcher settings ----------*/ 51 | window-match-fields: "title,class,role,name,desktop"; 52 | window-command: "wmctrl -i -R {window}"; 53 | window-format: "{w} - {c} - {t:0}"; 54 | window-thumbnail: false; 55 | 56 | /*---------- Combi settings ----------*/ 57 | /* combi-modi: "window,run";*/ 58 | /* combi-hide-mode-prefix: false;*/ 59 | /* combi-display-format: "{mode} {text}";*/ 60 | 61 | /*---------- History and Sorting ----------*/ 62 | disable-history: false; 63 | sorting-method: "normal"; 64 | max-history-size: 25; 65 | 66 | /*---------- Display setting ----------*/ 67 | display-window: "Windows"; 68 | display-windowcd: "Window CD"; 69 | display-run: "Run"; 70 | display-ssh: "SSH"; 71 | display-drun: "Apps"; 72 | display-combi: "Combi"; 73 | display-keys: "Keys"; 74 | display-filebrowser: "Files"; 75 | 76 | /*---------- Misc setting ----------*/ 77 | terminal: "rofi-sensible-terminal"; 78 | font: "JetBrainsMono Nerd Font Propo 14"; 79 | sort: false; 80 | threads: 0; 81 | click-to-exit: true; 82 | /* ignored-prefixes: "";*/ 83 | /* pid: "/run/user/1000/rofi.pid";*/ 84 | 85 | /*---------- File browser settings ----------*/ 86 | filebrowser { 87 | /* directory: "/home";*/ 88 | directories-first: true; 89 | sorting-method: "name"; 90 | } 91 | 92 | /*---------- Other settings ----------*/ 93 | timeout { 94 | action: "kb-cancel"; 95 | delay: 0; 96 | } 97 | 98 | /*---------- Keybindings ----------*/ 99 | kb-primary-paste: "Control+V,Shift+Insert"; 100 | kb-secondary-paste: "Control+v,Insert"; 101 | kb-clear-line: "Control+w"; 102 | kb-move-front: "Control+a"; 103 | kb-move-end: "Control+e"; 104 | kb-move-word-back: "Alt+b,Control+Left"; 105 | kb-move-word-forward: "Alt+f,Control+Right"; 106 | kb-move-char-back: "Left,Control+b"; 107 | kb-move-char-forward: "Right,Control+f"; 108 | kb-remove-word-back: "Control+Alt+h,Control+BackSpace"; 109 | kb-remove-word-forward: "Control+Alt+d"; 110 | kb-remove-char-forward: "Delete,Control+d"; 111 | kb-remove-char-back: "BackSpace,Shift+BackSpace"; 112 | kb-remove-to-sol: "Control+u"; 113 | kb-remove-to-eol: "Control+q"; 114 | kb-accept-entry: "Control+m,Return,KP_Enter"; 115 | kb-accept-custom: "Control+Return"; 116 | kb-accept-custom-alt: "Control+Shift+Return"; 117 | kb-accept-alt: "Shift+Return"; 118 | kb-delete-entry: "Shift+Delete"; 119 | kb-mode-next: "Shift+Right,Control+Tab"; 120 | kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab"; 121 | kb-mode-complete: "Control+p"; 122 | kb-row-left: "Alt+h"; 123 | kb-row-right: "Alt+l"; 124 | kb-row-down: "Down,Alt+j"; 125 | kb-row-up: "Up,Alt+k"; 126 | kb-page-prev: "Page_Up"; 127 | kb-page-next: "Page_Down"; 128 | kb-row-first: "Home,KP_Home"; 129 | kb-row-last: "End,KP_End"; 130 | kb-row-select: "Control+space"; 131 | kb-screenshot: "Alt+S"; 132 | kb-ellipsize: "Alt+period"; 133 | kb-toggle-case-sensitivity: "grave,dead_grave"; 134 | kb-toggle-sort: "Alt+grave"; 135 | kb-cancel: "Escape,Control+g,Control+bracketleft"; 136 | kb-custom-1: "Alt+1"; 137 | kb-custom-2: "Alt+2"; 138 | kb-custom-3: "Alt+3"; 139 | kb-custom-4: "Alt+4"; 140 | kb-custom-5: "Alt+5"; 141 | kb-custom-6: "Alt+6"; 142 | kb-custom-7: "Alt+7"; 143 | kb-custom-8: "Alt+8"; 144 | kb-custom-9: "Alt+9"; 145 | kb-custom-10: "Alt+0"; 146 | kb-custom-11: "Alt+exclam"; 147 | kb-custom-12: "Alt+at"; 148 | kb-custom-13: "Alt+numbersign"; 149 | kb-custom-14: "Alt+dollar"; 150 | kb-custom-15: "Alt+percent"; 151 | kb-custom-16: "Alt+dead_circumflex"; 152 | kb-custom-17: "Alt+ampersand"; 153 | kb-custom-18: "Alt+asterisk"; 154 | kb-custom-19: "Alt+parenleft"; 155 | kb-select-1: "Super+1"; 156 | kb-select-2: "Super+2"; 157 | kb-select-3: "Super+3"; 158 | kb-select-4: "Super+4"; 159 | kb-select-5: "Super+5"; 160 | kb-select-6: "Super+6"; 161 | kb-select-7: "Super+7"; 162 | kb-select-8: "Super+8"; 163 | kb-select-9: "Super+9"; 164 | kb-select-10: "Super+0"; 165 | ml-row-left: "ScrollLeft"; 166 | ml-row-right: "ScrollRight"; 167 | ml-row-up: "ScrollUp"; 168 | ml-row-down: "ScrollDown"; 169 | me-select-entry: "MousePrimary"; 170 | me-accept-entry: "MouseDPrimary"; 171 | me-accept-custom: "Control+MouseDPrimary"; 172 | } 173 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | saatvik333sharma@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /scripts/git-cleanup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euo pipefail 4 | 5 | # --- Logging Functions --- 6 | log_info() { 7 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 8 | echo -e "\033[1;34m[$timestamp] INFO: $*\033[0m" >&2 9 | } 10 | 11 | log_error() { 12 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 13 | echo -e "\033[1;31m[$timestamp] ERROR: $*\033[0m" >&2 14 | } 15 | 16 | log_success() { 17 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 18 | echo -e "\033[1;32m[$timestamp] SUCCESS: $*\033[0m" >&2 19 | } 20 | 21 | log_warn() { 22 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 23 | echo -e "\033[1;33m[$timestamp] WARN: $*\033[0m" >&2 24 | } 25 | 26 | log_debug() { 27 | if [[ ${DEBUG:-0} -eq 1 ]]; then 28 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 29 | echo -e "\033[1;90m[$timestamp] DEBUG: $*\033[0m" >&2 30 | fi 31 | } 32 | 33 | # --- Error Handling --- 34 | die() { 35 | log_error "$*" 36 | exit 1 37 | } 38 | 39 | # --- File System Utilities --- 40 | ensure_directory() { 41 | local -r dir="$1" 42 | if [[ ! -d "$dir" ]]; then 43 | mkdir -p "$dir" || die "Failed to create directory: $dir" 44 | log_debug "Created directory: $dir" 45 | fi 46 | } 47 | 48 | validate_file() { 49 | local -r file="$1" 50 | local -r description="${2:-File}" 51 | 52 | [[ -f "$file" ]] || die "$description not found: $file" 53 | } 54 | 55 | validate_executable() { 56 | local -r file="$1" 57 | local -r description="${2:-Script}" 58 | 59 | validate_file "$file" "$description" 60 | [[ -x "$file" ]] || die "$description not executable: $file" 61 | } 62 | 63 | # --- Process Management --- 64 | acquire_lock() { 65 | local -r lock_file="$1" 66 | local -r script_name="${2:-$(basename "$0")}" 67 | 68 | if [[ -f "$lock_file" ]]; then 69 | local pid 70 | pid=$(cat "$lock_file" 2>/dev/null || echo "") 71 | if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then 72 | die "Another instance of $script_name is already running (PID: $pid)" 73 | else 74 | log_info "Removing stale lock file: $lock_file" 75 | rm -f "$lock_file" 76 | fi 77 | fi 78 | 79 | echo $$ >"$lock_file" 80 | trap "rm -f '$lock_file'" EXIT INT TERM 81 | } 82 | 83 | # --- Dependency Validation --- 84 | validate_dependencies() { 85 | local -ra required_deps=("$@") 86 | local missing_deps=() 87 | 88 | for dep in "${required_deps[@]}"; do 89 | command -v "$dep" >/dev/null 2>&1 || missing_deps+=("$dep") 90 | done 91 | 92 | if [[ ${#missing_deps[@]} -gt 0 ]]; then 93 | die "Missing required dependencies: ${missing_deps[*]}" 94 | fi 95 | 96 | log_debug "All dependencies validated: ${required_deps[*]}" 97 | } 98 | 99 | # --- Notification Helper --- 100 | send_notification() { 101 | local -r app_name="$1" 102 | local -r title="$2" 103 | local -r message="$3" 104 | local -r urgency="${4:-normal}" 105 | local -r icon="${5:-}" 106 | 107 | local notify_args=( 108 | --app-name="$app_name" 109 | --urgency="$urgency" 110 | ) 111 | 112 | [[ -n "$icon" ]] && notify_args+=(--icon="$icon") 113 | 114 | notify-send "${notify_args[@]}" "$title" "$message" 115 | } 116 | 117 | # --- Functions --- 118 | validate_git_repository() { 119 | if ! git rev-parse --git-dir >/dev/null 2>&1; then 120 | die "Not in a git repository!" 121 | fi 122 | 123 | if [[ ! -f .gitignore ]]; then 124 | die ".gitignore file not found!" 125 | fi 126 | } 127 | 128 | find_ignored_tracked_files() { 129 | git ls-files -ci --exclude-standard 2>/dev/null || echo "" 130 | } 131 | 132 | remove_files_from_tracking() { 133 | local -r files="$1" 134 | 135 | log_info "Removing files from git tracking..." 136 | 137 | echo "$files" | while IFS= read -r file; do 138 | if [[ -n "$file" ]]; then 139 | log_info "Removing: $file" 140 | if ! git rm --cached "$file" 2>/dev/null; then 141 | log_warn "Could not remove: $file" 142 | fi 143 | fi 144 | done 145 | } 146 | 147 | show_staged_changes() { 148 | if git diff --cached --quiet; then 149 | log_success "No changes to commit." 150 | else 151 | log_info "Files removed from tracking. You can now commit these changes:" 152 | echo 153 | echo " git commit -m \"Remove ignored files from tracking\"" 154 | echo 155 | log_info "Staged changes:" 156 | git diff --cached --name-only | sed 's/^/ - /' 157 | fi 158 | } 159 | 160 | main() { 161 | log_info "🧹 Git Repository Cleanup Script" 162 | echo "=================================" 163 | 164 | validate_git_repository 165 | 166 | log_info "Checking for files that should be ignored..." 167 | 168 | local ignored_files 169 | ignored_files=$(find_ignored_tracked_files) 170 | 171 | if [[ -z "$ignored_files" ]]; then 172 | log_success "No tracked files found that should be ignored!" 173 | exit 0 174 | fi 175 | 176 | echo 177 | log_warn "Found the following tracked files that should be ignored:" 178 | echo "$ignored_files" | sed 's/^/ - /' 179 | echo 180 | 181 | # Ask for confirmation 182 | read -p "Do you want to remove these files from git tracking? (y/N): " -n 1 -r 183 | echo 184 | 185 | if [[ ! $REPLY =~ ^[Yy]$ ]]; then 186 | log_info "Operation cancelled." 187 | exit 0 188 | fi 189 | 190 | remove_files_from_tracking "$ignored_files" 191 | show_staged_changes 192 | 193 | log_success "Cleanup completed!" 194 | 195 | # Show current status 196 | echo 197 | log_info "Current git status:" 198 | git status --short 199 | 200 | # Send notification 201 | send_notification "Git Cleanup" "Cleanup Complete" \ 202 | "Removed ignored files from git tracking" "normal" "git" 203 | } 204 | 205 | # --- Script Entry Point --- 206 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 207 | main "$@" 208 | fi -------------------------------------------------------------------------------- /waybar/modules.json: -------------------------------------------------------------------------------- 1 | { 2 | "group/extras": { 3 | "orientation": "inherit", 4 | "drawer": { 5 | "transition-duration": 400, 6 | "children-class": "extras", 7 | "transition-left-to-right": false 8 | }, 9 | "modules": [ 10 | "custom/menu", 11 | "tray" 12 | ] 13 | }, 14 | "group/brightness": { 15 | "orientation": "inherit", 16 | "drawer": { 17 | "transition-duration": 400, 18 | "children-class": "brightness", 19 | "transition-left-to-right": false 20 | }, 21 | "modules": [ 22 | "backlight", 23 | "backlight/slider" 24 | ] 25 | }, 26 | "group/audio": { 27 | "orientation": "inherit", 28 | "drawer": { 29 | "transition-duration": 400, 30 | "children-class": "audio", 31 | "transition-left-to-right": false 32 | }, 33 | "modules": [ 34 | "pulseaudio", 35 | "pulseaudio/slider" 36 | ] 37 | }, 38 | "custom/cachy": { 39 | "format": "", 40 | "tooltip": false, 41 | "on-click": "alacritty", 42 | "on-click-right": "kitty" 43 | }, 44 | "niri/workspaces": { 45 | "on-click": "activate", 46 | "format": "{icon}", 47 | "format-icons": { 48 | "default": "󰄰", 49 | "active": "󰄯" 50 | } 51 | }, 52 | "cpu": { 53 | "format": "{icon}", 54 | "format-icons": [ 55 | "", 56 | "", 57 | "", 58 | "", 59 | "", 60 | "" 61 | ], 62 | "interval": 1, 63 | "tooltip": true, 64 | "tooltip-format": "CPU Frequency: {avg_frequency} GHz", 65 | "on-click": "alacritty -e btm" 66 | }, 67 | "clock": { 68 | "interval": 1, 69 | "format": "{:%H 70 | %M}", 71 | "format-alt": "{:%d 72 | %m 73 | %y}", 74 | "tooltip-format": "{calendar}" 75 | }, 76 | "mpris": { 77 | "format": "󰐎", 78 | "interval": 1, 79 | "on-click": "playerctl play-pause", 80 | "on-click-right": "playerctl next", 81 | "on-click-middle": "playerctl previous", 82 | "tooltip": true, 83 | "tooltip-format": "{title}" 84 | }, 85 | "custom/menu": { 86 | "format": "󰅃", 87 | "tooltip": false 88 | }, 89 | "tray": { 90 | "spacing": 16, 91 | "reverse-direction": true, 92 | "icon-size": 16, 93 | "show-passive-items": false 94 | }, 95 | "privacy": { 96 | "icon-size": 14, 97 | "transition-duration": 250, 98 | "modules": [ 99 | { 100 | "type": "screenshare", 101 | "tooltip": false, 102 | } 103 | ], 104 | "ignore": [ 105 | { 106 | "type": "screenshare", 107 | "name": "obs" 108 | } 109 | ] 110 | }, 111 | "network": { 112 | "format-icons": { 113 | "wifi": [ 114 | "󰤯", 115 | "󰤟", 116 | "󰤢", 117 | "󰤥", 118 | "󰤨" 119 | ], 120 | "ethernet": "󰈀", 121 | "disabled": "󰤭", 122 | "disconnected": "󰤩" 123 | }, 124 | "format-wifi": "{icon}", 125 | "format-ethernet": "{icon}", 126 | "format-disconnected": "{icon}", 127 | "format-disabled": "{icon}", 128 | "interval": 5, 129 | "tooltip-format": "{essid}\t{gwaddr}", 130 | "on-click": "rfkill toggle wifi", 131 | "on-click-right": "nm-connection-editor", 132 | "tooltip": true, 133 | "max-length": 20 134 | }, 135 | "bluetooth": { 136 | "interval": 5, 137 | "format-on": "󰂯", 138 | "format-off": "󰂲", 139 | "format-disabled": "󰂲", 140 | "format-connected": "󰂱", 141 | "format-no-controller": "span size='14pt'>󰂯", 142 | "tooltip": true, 143 | "tooltip-format": "{device_enumerate}", 144 | "tooltip-format-enumerate-connected": "{device_address}", 145 | "tooltip-format-enumerate-connected-battery": "{device_address} | Battery: {device_battery_percentage}%", 146 | "on-click": "rfkill toggle bluetooth", 147 | "on-click-right": "blueman-manager" 148 | }, 149 | "pulseaudio#microphone": { 150 | "format": "{format_source}", 151 | "format-source": "󰍬", 152 | "format-source-muted": "󰍭", 153 | "on-click": "pactl set-source-mute @DEFAULT_SOURCE@ toggle", 154 | "on-click-right": "pavucontrol -t 4", 155 | "tooltip": false 156 | }, 157 | "pulseaudio/slider": { 158 | "min": 0, 159 | "max": 100, 160 | "orientation": "vertical" 161 | }, 162 | "pulseaudio": { 163 | "interval": 1, 164 | "format": "{icon}", 165 | "format-icons": [ 166 | "󰕿", 167 | "󰖀", 168 | "󰕾" 169 | ], 170 | "format-muted": "󰝟", 171 | "on-click-right": "pavucontrol -t 3", 172 | "on-click": "pactl set-sink-mute @DEFAULT_SINK@ toggle", 173 | "reverse-scrolling": true, 174 | "tooltip": true, 175 | "tooltip-format": "Volume: {volume}%\n{desc}", 176 | "ignored-sinks": [ 177 | "Easy Effects Sink" 178 | ] 179 | }, 180 | "backlight/slider": { 181 | "min": 0, 182 | "max": 100, 183 | "orientation": "vertical", 184 | "device": "intel_backlight" 185 | }, 186 | "backlight": { 187 | "device": "intel_backlight", 188 | "format": "{icon}", 189 | "format-icons": [ 190 | "󰃚", 191 | "󰃛", 192 | "󰃜", 193 | "󰃝", 194 | "󰃞", 195 | "󰃟", 196 | "󰃠" 197 | ], 198 | "reverse-scrolling": true, 199 | "smooth-scrolling-threshold": 0.2, 200 | "tooltip": false 201 | }, 202 | "battery": { 203 | "interval": 5, 204 | "states": { 205 | "critical": 10 206 | }, 207 | "format": "{icon}", 208 | "format-icons": [ 209 | "󰁺", 210 | "󰁻", 211 | "󰁼", 212 | "󰁽", 213 | "󰁾", 214 | "󰁿", 215 | "󰂀", 216 | "󰂁", 217 | "󰂂", 218 | "󰁹" 219 | ], 220 | "format-charging": "󰂄", 221 | "format-plugged": "󰚥", 222 | "format-critical": "󰂃", 223 | "tooltip": true, 224 | "tooltip-format": "Charge: {capacity}%", 225 | "tooltip-format-charging": "Charging: {capacity}%" 226 | }, 227 | "custom/powermenu": { 228 | "format": "󰐥", 229 | "on-click": "$HOME/.config/rofi/powermenu/powermenu.sh", 230 | "tooltip": false 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /nvim/lua/plugins/cpp-templates.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { 3 | "nvim-telescope/telescope.nvim", 4 | optional = true, 5 | }, 6 | { 7 | name = "cpp-templates", 8 | dir = vim.fn.stdpath("config"), 9 | lazy = false, 10 | priority = 100, 11 | config = function() 12 | -- Template definitions 13 | local templates = { 14 | { 15 | name = "Competitive Programming", 16 | description = "Full competitive programming template with fast I/O", 17 | content = [[#include 18 | using namespace std; 19 | 20 | typedef long long ll; 21 | typedef long double ld; 22 | #define endl '\n' 23 | 24 | void solve() { 25 | 26 | } 27 | 28 | int main() { 29 | // Fast IO 30 | ios::sync_with_stdio(0); 31 | cin.tie(NULL); 32 | cout.tie(NULL); 33 | 34 | ll T; 35 | cin >> T; 36 | while (T--) { 37 | solve(); 38 | } 39 | 40 | return 0; 41 | }]], 42 | }, 43 | { 44 | name = "Simple Main", 45 | description = "Basic C++ template with main function", 46 | content = [[#include 47 | using namespace std; 48 | 49 | int main() { 50 | 51 | return 0; 52 | }]], 53 | }, 54 | { 55 | name = "Basic Template", 56 | description = "Minimal C++ template with common headers", 57 | content = [[#include 58 | #include 59 | #include 60 | using namespace std; 61 | 62 | int main() { 63 | 64 | return 0; 65 | }]], 66 | }, 67 | { 68 | name = "Algorithm Practice", 69 | description = "Template for algorithm practice with common includes", 70 | content = [[#include 71 | #include 72 | #include 73 | #include 74 | #include 75 | #include 76 | #include 77 | #include 78 | using namespace std; 79 | 80 | int main() { 81 | 82 | return 0; 83 | }]], 84 | }, 85 | { 86 | name = "Class Template", 87 | description = "Template with a basic class structure", 88 | content = [[#include 89 | using namespace std; 90 | 91 | class Solution { 92 | public: 93 | 94 | }; 95 | 96 | int main() { 97 | Solution sol; 98 | 99 | return 0; 100 | }]], 101 | }, 102 | } 103 | 104 | -- Function to apply template to current buffer 105 | local function apply_template(template) 106 | local buf = vim.api.nvim_get_current_buf() 107 | local lines = vim.split(template.content, "\n") 108 | vim.api.nvim_buf_set_lines(buf, 0, -1, false, lines) 109 | 110 | -- Find the first empty line or cursor position 111 | for i, line in ipairs(lines) do 112 | if line:match("^%s*$") and i > 1 then 113 | vim.api.nvim_win_set_cursor(0, { i, vim.fn.indent(i) }) 114 | break 115 | end 116 | end 117 | 118 | vim.notify("Applied template: " .. template.name) 119 | end 120 | 121 | -- Function to select template using vim.ui.select (fallback if telescope not available) 122 | local function select_template_fallback() 123 | local items = {} 124 | for _, template in ipairs(templates) do 125 | table.insert(items, template.name .. " - " .. template.description) 126 | end 127 | 128 | vim.ui.select(items, { 129 | prompt = "Select C++ Template:", 130 | }, function(choice, idx) 131 | if choice and idx then 132 | apply_template(templates[idx]) 133 | end 134 | end) 135 | end 136 | 137 | -- Function to select template using telescope (if available) 138 | local function select_template() 139 | local ok, telescope = pcall(require, "telescope") 140 | if not ok then 141 | select_template_fallback() 142 | return 143 | end 144 | 145 | local pickers = require("telescope.pickers") 146 | local finders = require("telescope.finders") 147 | local conf = require("telescope.config").values 148 | local actions = require("telescope.actions") 149 | local action_state = require("telescope.actions.state") 150 | 151 | pickers 152 | .new({}, { 153 | prompt_title = "C++ Templates", 154 | finder = finders.new_table({ 155 | results = templates, 156 | entry_maker = function(entry) 157 | return { 158 | value = entry, 159 | display = entry.name .. " - " .. entry.description, 160 | ordinal = entry.name, 161 | } 162 | end, 163 | }), 164 | sorter = conf.generic_sorter({}), 165 | attach_mappings = function(prompt_bufnr, map) 166 | actions.select_default:replace(function() 167 | actions.close(prompt_bufnr) 168 | local selection = action_state.get_selected_entry() 169 | apply_template(selection.value) 170 | end) 171 | return true 172 | end, 173 | }) 174 | :find() 175 | end 176 | 177 | -- Make functions available globally 178 | _G.cpp_templates = { 179 | apply_template = apply_template, 180 | select_template = select_template, 181 | templates = templates, 182 | } 183 | 184 | -- Auto-apply template for new .cpp files 185 | vim.api.nvim_create_autocmd("BufNewFile", { 186 | pattern = "*.cpp", 187 | callback = function() 188 | -- Check if file is empty 189 | local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) 190 | if #lines == 1 and lines[1] == "" then 191 | -- Ask user if they want to use a template 192 | vim.defer_fn(function() 193 | local choice = vim.fn.confirm("Use C++ template?", "&Yes\n&No\n&Select", 1) 194 | if choice == 1 then 195 | -- Apply competitive programming template by default 196 | apply_template(templates[1]) 197 | elseif choice == 3 then 198 | select_template() 199 | end 200 | end, 100) 201 | end 202 | end, 203 | }) 204 | 205 | -- Create user commands 206 | vim.api.nvim_create_user_command("CppTemplate", function() 207 | select_template() 208 | end, { desc = "Select C++ template" }) 209 | 210 | vim.api.nvim_create_user_command("CppCompetitive", function() 211 | apply_template(templates[1]) 212 | end, { desc = "Apply competitive programming template" }) 213 | 214 | vim.api.nvim_create_user_command("CppSimple", function() 215 | apply_template(templates[2]) 216 | end, { desc = "Apply simple main template" }) 217 | 218 | -- Create keymaps 219 | vim.keymap.set("n", "ct", function() 220 | select_template() 221 | end, { desc = "C++ Templates" }) 222 | 223 | vim.keymap.set("n", "ccp", function() 224 | apply_template(templates[1]) 225 | end, { desc = "C++ Competitive Programming Template" }) 226 | 227 | vim.keymap.set("n", "csm", function() 228 | apply_template(templates[2]) 229 | end, { desc = "C++ Simple Main Template" }) 230 | 231 | vim.notify("C++ Templates loaded successfully!", vim.log.levels.INFO) 232 | end, 233 | }, 234 | } 235 | 236 | -------------------------------------------------------------------------------- /nvim/LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Niri WM Dotfiles 2 | 3 |
4 | 5 | **A productive and clean [Niri](https://github.com/YaLTeR/niri) configuration setup** 6 | _Dynamic theming • Borderless layouts • Minimal_ 7 | 8 | --- 9 | 10 | ### Gallery 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
Desktop View
Workspace View
Application Launcher
23 | 24 | --- 25 | 26 |
27 | 28 | ## Contents 29 | 30 | - [Features](#features) 31 | - [Automatic Installation](#automatic-installation-recommended) 32 | - [What Gets Installed](#what-gets-installed) 33 | - [Themes](#themes) 34 | - [Preconfigured Tools](#preconfigured-tools) 35 | - [Keybinds](#keybinds) 36 | - [System & Shortcuts](#system--shortcuts) 37 | - [Applications](#applications) 38 | - [Media Controls](#media-controls) 39 | - [Window Management](#window-management) 40 | - [Workspace Management](#workspace-management) 41 | - [Monitor Management](#monitor-management) 42 | - [Layout Controls](#layout-controls) 43 | - [Window Modes](#window-modes) 44 | - [Utilities](#utilities) 45 | 46 | ## Features 47 | 48 | - Clean borderless, gapless minimal look 49 | - Dynamic theme switching system-wide 50 | - Out-of-Box preconfigured for all popular themes and applications 51 | - Rust-powered tooling and packages (rust go brrr...) 52 | 53 | ## Automatic Installation (Recommended) 54 | 55 | For Arch Linux and Arch-based distributions (Manjaro, EndeavourOS, etc.): 56 | 57 | ```bash 58 | curl -fsSL https://raw.githubusercontent.com/saatvik333/niri-dotfiles/main/install.sh | sh 59 | ``` 60 | 61 | **Important Requirements:** 62 | 63 | ``` 64 | Fresh or minimal Arch Linux installation recommended 65 | Active internet connection required 66 | Sudo privileges needed 67 | At least 5GB free disk space 68 | ``` 69 | 70 | What the Script Does 71 | 72 | The automated installer will: 73 | 74 | ``` 75 | Verify system compatibility (Arch-based only) 76 | Update your system packages 77 | Install base development tools (git, base-devel, curl) 78 | Set up AUR helper (yay) 79 | Configure Rust toolchain 80 | Install all required packages (niri, waybar, fish, etc.) 81 | Install AUR packages (vicinae, wallust, etc.) 82 | Install GTK themes (Colloid, Rose Pine, Osaka) 83 | Install icon themes (Colloid icons) 84 | Clone and configure dotfiles 85 | Set up shell configuration (Fish/Zsh) 86 | Create systemd services 87 | Install wallpapers 88 | Backup existing configurations 89 | ``` 90 | 91 | Installation Time: Approximately 15-30 minutes depending on your internet speed. 92 | 93 | # What Gets Installed 94 | 95 | Core Components 96 | 97 | Window Manager: Niri (Scrollable-tiling Wayland compositor) 98 | Status Bar: Waybar (Highly customizable) 99 | Terminal: Alacritty, Kitty 100 | Shell: Fish (with optional Zsh) 101 | Notification Daemon: Mako 102 | Application Launcher: Rofi 103 | Screen Locker: GTKLock 104 | Wallpaper Manager: awww 105 | 106 | Additional Tools 107 | 108 | Editor: Neovim (preconfigured) 109 | File Manager: Yazi (TUI), Thunar (GUI) 110 | PDF Viewer: Zathura 111 | System Info: Fastfetch 112 | Theme Manager: Wallust 113 | Prompt: Starship 114 | Authentication: Polkit-gnome 115 | Utilities: dust, eza, niri-switch 116 | 117 | Development Tools 118 | 119 | Rust toolchain (rustup, cargo) 120 | Base development packages 121 | Git and build essentials 122 | 123 | ## Themes 124 | 125 | [Wallust](https://codeberg.org/explosion-mental/wallust) is used for the theming using it's color palettes and it's palette generation using wallpaper. 126 | 127 | | Theme | GTK Theme | Icon Theme | 128 | | ---------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | 129 | | Catppuccin | [Colloid (Light/Dark) Catppuccin](https://github.com/vinceliuice/Colloid-gtk-theme) | [Colloid Catppuccin (Light/Dark)](https://github.com/vinceliuice/Colloid-icon-theme) | 130 | | Everforest | [Colloid (Light/Dark) Everforest](https://github.com/vinceliuice/Colloid-gtk-theme) | [Colloid Everforest (Light/Dark)](https://github.com/vinceliuice/Colloid-icon-theme) | 131 | | Gruvbox | [Colloid (Light/Dark) Gruvbox](https://github.com/vinceliuice/Colloid-gtk-theme) | [Colloid Gruvbox (Light/Dark)](https://github.com/vinceliuice/Colloid-icon-theme) | 132 | | Nord | [Colloid (Light/Dark) Nord](https://github.com/vinceliuice/Colloid-gtk-theme) | [Colloid Nord (Light/Dark)](https://github.com/vinceliuice/Colloid-icon-theme) | 133 | | Rosé Pine | [Rose Pine GTK Theme (Light/Dark)](https://github.com/Fausto-Korpsvart/Rose-Pine-GTK-Theme) | [Colloid Catppuccin (Light/Dark)](https://github.com/vinceliuice/Colloid-icon-theme) | 134 | | Dracula | [Colloid (Light/Dark) Dracula](https://github.com/vinceliuice/Colloid-gtk-theme) | [Colloid Dracula (Light/Dark)](https://github.com/vinceliuice/Colloid-icon-theme) | 135 | | Material | [Colloid Grey (Light/Dark)](https://github.com/vinceliuice/Colloid-gtk-theme) | [Colloid (Light/Dark)](https://github.com/vinceliuice/Colloid-icon-theme) | 136 | | Solarized | [Osaka GTK Theme (Light/Dark)](https://github.com/Fausto-Korpsvart/Osaka-GTK-Theme) | [Colloid Everforest (Light/Dark)](https://github.com/vinceliuice/Colloid-icon-theme) | 137 | 138 | Thanks to [vinceliuice](https://github.com/vinceliuice) and [Fausto-Korpsvart](https://github.com/Fausto-Korpsvart) for providing awesome GTK themes. 139 | 140 | ## Preconfigured Tools 141 | 142 | - Neovim 143 | - Yazi 144 | - Rofi 145 | - Waybar 146 | - Fish 147 | - Fastfetch 148 | - Mako 149 | - Alacritty 150 | - Kitty 151 | - Starship 152 | 153 | ## Keybinds 154 | 155 | > **Note:** `MOD` key is the Super/Windows key by default. 156 | 157 | ### System & Shortcuts 158 | 159 | | Keybind | Action | 160 | | ---------------------- | ------------------------------------- | 161 | | `MOD + Shift + Escape` | Show hotkey overlay (shortcuts panel) | 162 | 163 | ### Applications 164 | 165 | | Keybind | Action | 166 | | -------------------- | ------------------------------------------------ | 167 | | `MOD + Return` | Open terminal (Alacritty) | 168 | | `MOD + Alt + Return` | Open terminal (Kitty) | 169 | | `MOD + B` | Open primary browser (Firefox Developer Edition) | 170 | | `MOD + Alt + B` | Open secondary browser (Google Chrome) | 171 | | `MOD + A` | Toggle application launcher (Vicinae) | 172 | | `MOD + E` | Open file manager (Thunar) | 173 | | `MOD + Alt + E` | Open TUI file manager (Yazi) | 174 | | `MOD + W` | Open wallpaper selector | 175 | | `MOD + Shift + Q` | Lock screen (GTKLock) | 176 | 177 | ### Media Controls 178 | 179 | | Keybind | Action | 180 | | ----------------------- | -------------------------- | 181 | | `XF86AudioRaiseVolume` | Increase volume | 182 | | `XF86AudioLowerVolume` | Decrease volume | 183 | | `XF86AudioMute` | Mute/unmute audio | 184 | | `XF86AudioMicMute` | Mute/unmute microphone | 185 | | `XF86MonBrightnessUp` | Increase screen brightness | 186 | | `XF86MonBrightnessDown` | Decrease screen brightness | 187 | | `XF86AudioPlay` | Play/pause media | 188 | | `XF86AudioPause` | Play/pause media | 189 | | `XF86AudioNext` | Next track | 190 | | `XF86AudioPrev` | Previous track | 191 | 192 | > **Note:** All media keys work even when the screen is locked. 193 | 194 | ### Window Management 195 | 196 | #### Focus Windows 197 | 198 | | Keybind | Action | 199 | | -------------------------- | ---------------------------------- | 200 | | `MOD + H` or `MOD + Left` | Focus window/column left | 201 | | `MOD + J` or `MOD + Down` | Focus workspace down / window down | 202 | | `MOD + K` or `MOD + Up` | Focus workspace up / window up | 203 | | `MOD + L` or `MOD + Right` | Focus window/column right | 204 | | `MOD + Home` | Focus first column | 205 | | `MOD + End` | Focus last column | 206 | | `MOD + Q` | Close focused window | 207 | 208 | #### Move Windows 209 | 210 | | Keybind | Action | 211 | | ------------------------------------------ | ------------------------------------------------ | 212 | | `MOD + Shift + H` or `MOD + Shift + Left` | Move column left | 213 | | `MOD + Shift + J` or `MOD + Shift + Down` | Move column to workspace down / move window down | 214 | | `MOD + Shift + K` or `MOD + Shift + Up` | Move column to workspace up / move window up | 215 | | `MOD + Shift + L` or `MOD + Shift + Right` | Move column right | 216 | | `MOD + Shift + Home` | Move column to first position | 217 | | `MOD + Shift + End` | Move column to last position | 218 | 219 | #### Mouse Navigation 220 | 221 | | Keybind | Action | 222 | | --------------------------- | ----------------------------- | 223 | | `MOD + Scroll Down` | Focus workspace down | 224 | | `MOD + Scroll Up` | Focus workspace up | 225 | | `MOD + Scroll Right` | Focus column right | 226 | | `MOD + Scroll Left` | Focus column left | 227 | | `MOD + Shift + Scroll Down` | Move column to workspace down | 228 | | `MOD + Shift + Scroll Up` | Move column to workspace up | 229 | | `MOD + Ctrl + Scroll Right` | Move column right | 230 | | `MOD + Ctrl + Scroll Left` | Move column left | 231 | 232 | ### Workspace Management 233 | 234 | #### Navigate Workspaces 235 | 236 | | Keybind | Action | 237 | | -------------- | ----------------------------- | 238 | | `MOD + 1-9` | Switch to workspace 1-9 | 239 | | `MOD + Tab` | Switch to previous workspace | 240 | | `MOD + Escape` | Toggle overview mode | 241 | | `Alt + Tab` | Window switcher (niri-switch) | 242 | 243 | #### Move Windows to Workspaces 244 | 245 | | Keybind | Action | 246 | | ------------------- | ---------------------------- | 247 | | `MOD + Shift + 1-9` | Move window to workspace 1-9 | 248 | 249 | ### Monitor Management 250 | 251 | #### Focus Monitors 252 | 253 | | Keybind | Action | 254 | | ---------------------------------------- | ------------------- | 255 | | `MOD + Ctrl + H` or `MOD + Ctrl + Left` | Focus monitor left | 256 | | `MOD + Ctrl + L` or `MOD + Ctrl + Right` | Focus monitor right | 257 | | `MOD + Ctrl + K` or `MOD + Ctrl + Up` | Focus monitor up | 258 | | `MOD + Ctrl + J` or `MOD + Ctrl + Down` | Focus monitor down | 259 | 260 | #### Move Windows to Monitors 261 | 262 | | Keybind | Action | 263 | | -------------------------------------------------------- | ---------------------------- | 264 | | `MOD + Shift + Ctrl + H` or `MOD + Shift + Ctrl + Left` | Move window to monitor left | 265 | | `MOD + Shift + Ctrl + L` or `MOD + Shift + Ctrl + Right` | Move window to monitor right | 266 | | `MOD + Shift + Ctrl + K` or `MOD + Shift + Ctrl + Up` | Move window to monitor up | 267 | | `MOD + Shift + Ctrl + J` or `MOD + Shift + Ctrl + Down` | Move window to monitor down | 268 | 269 | ### Layout Controls 270 | 271 | | Keybind | Action | 272 | | -------------------------- | ----------------------------- | 273 | | `MOD + C` | Center focused column | 274 | | `MOD + Ctrl + C` | Center all visible columns | 275 | | `MOD + [` | Decrease column width by 10% | 276 | | `MOD + ]` | Increase column width by 10% | 277 | | `MOD + Shift + [` | Decrease window height by 10% | 278 | | `MOD + Shift + ]` | Increase window height by 10% | 279 | | `MOD + Ctrl + Scroll Down` | Decrease window height by 5% | 280 | | `MOD + Ctrl + Scroll Up` | Increase window height by 5% | 281 | 282 | ### Window Modes 283 | 284 | | Keybind | Action | 285 | | --------- | ---------------------- | 286 | | `MOD + T` | Toggle window floating | 287 | | `MOD + F` | Toggle fullscreen | 288 | | `MOD + M` | Maximize column | 289 | 290 | ### Utilities 291 | 292 | | Keybind | Action | 293 | | ----------------- | --------------------------- | 294 | | `MOD + S` | Take screenshot (selection) | 295 | | `MOD + Shift + S` | Screenshot entire screen | 296 | | `MOD + Ctrl + S` | Screenshot current window | 297 | | `MOD + P` | Color picker (hyprpicker) | 298 | | `MOD + Alt + W` | Restart Waybar | 299 | 300 | --- 301 | -------------------------------------------------------------------------------- /niri/config.kdl: -------------------------------------------------------------------------------- 1 | // Startup Applications 2 | spawn-sh-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &" 3 | spawn-at-startup "awww-daemon" 4 | spawn-at-startup "waybar" 5 | spawn-at-startup "sh" "-c" "vicinae server &" 6 | 7 | // General Settings 8 | prefer-no-csd 9 | screenshot-path "~/Pictures/Screenshots/%Y-%m-%d %H-%M-%S.png" 10 | 11 | output "eDP-1" { 12 | mode "1920x1080@60.024" 13 | scale 1 14 | } 15 | 16 | input { 17 | keyboard { 18 | xkb { 19 | layout "us" 20 | options "caps:escape" 21 | } 22 | } 23 | 24 | touchpad { 25 | tap 26 | natural-scroll 27 | } 28 | 29 | focus-follows-mouse 30 | workspace-auto-back-and-forth 31 | } 32 | 33 | hotkey-overlay { 34 | skip-at-startup 35 | } 36 | 37 | cursor { 38 | hide-when-typing 39 | hide-after-inactive-ms 5000 40 | } 41 | 42 | overview { 43 | backdrop-color "#1E1E2E" 44 | workspace-shadow { 45 | off 46 | } 47 | } 48 | 49 | layer-rule { 50 | match namespace="^awww-daemon$" 51 | place-within-backdrop true 52 | } 53 | 54 | binds { 55 | // Shortcuts Panel 56 | MOD+SHIFT+ESCAPE { show-hotkey-overlay; } 57 | 58 | // Application Shortcuts 59 | MOD+RETURN hotkey-overlay-title="Open Terminal: alacritty" { spawn-sh "alacritty"; } 60 | MOD+ALT+RETURN hotkey-overlay-title="Open Terminal: kitty" { spawn-sh "kitty"; } 61 | MOD+ALT+B hotkey-overlay-title="Open Secondary Browser: chrome" { spawn-sh "google-chrome-stable --enable-features=TouchpadOverscrollHistoryNavigation"; } 62 | MOD+SHIFT+Q hotkey-overlay-title="Lock Screen: gtklock" { spawn-sh "gtklock"; } 63 | MOD+A hotkey-overlay-title="Open App Launcher: vicinae" { spawn-sh "vicinae toggle"; } 64 | MOD+B hotkey-overlay-title="Open Browser: firefox" { spawn-sh "firefox-developer-edition"; } 65 | MOD+E hotkey-overlay-title="File Manager: Thunar" { spawn-sh "thunar"; } 66 | MOD+ALT+E hotkey-overlay-title="File Manager: Yazi" { spawn-sh "yazi"; } 67 | MOD+W hotkey-overlay-title="Open Wallpaper Selector" { spawn-sh "$HOME/.config/scripts/bgselector.sh"; } 68 | 69 | // Media Keys 70 | XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "mediactl volume_up"; } 71 | XF86AudioLowerVolume allow-when-locked=true { spawn-sh "mediactl volume_down"; } 72 | XF86MonBrightnessUp allow-when-locked=true { spawn-sh "mediactl brightness_up"; } 73 | XF86MonBrightnessDown allow-when-locked=true { spawn-sh "mediactl brightness_down"; } 74 | XF86AudioMute allow-when-locked=true { spawn-sh "mediactl volume_mute"; } 75 | XF86AudioMicMute allow-when-locked=true { spawn-sh "mediactl mic_mute"; } 76 | XF86AudioNext allow-when-locked=true { spawn-sh "mediactl next_track"; } 77 | XF86AudioPause allow-when-locked=true { spawn-sh "mediactl play_pause"; } 78 | XF86AudioPlay allow-when-locked=true { spawn-sh "mediactl play_pausse"; } 79 | XF86AudioPrev allow-when-locked=true { spawn-sh "mediactl prev_track"; } 80 | 81 | // Window Management 82 | MOD+Q { close-window; } 83 | 84 | MOD+H { focus-column-left; } 85 | MOD+J { focus-workspace-down; } 86 | MOD+K { focus-workspace-up; } 87 | MOD+L { focus-column-right; } 88 | 89 | MOD+LEFT { focus-column-left; } 90 | MOD+DOWN { focus-window-down; } 91 | MOD+UP { focus-window-up; } 92 | MOD+RIGHT { focus-column-right; } 93 | 94 | // Move windows within workspace 95 | MOD+SHIFT+LEFT { move-column-left; } 96 | MOD+SHIFT+DOWN { move-window-down; } 97 | MOD+SHIFT+UP { move-window-up; } 98 | MOD+SHIFT+RIGHT { move-column-right; } 99 | 100 | MOD+SHIFT+H { move-column-left; } 101 | MOD+SHIFT+J { move-column-to-workspace-down; } 102 | MOD+SHIFT+K { move-column-to-workspace-up; } 103 | MOD+SHIFT+L { move-column-right; } 104 | 105 | // Move to workspace edges 106 | MOD+SHIFT+HOME { move-column-to-first; } 107 | MOD+SHIFT+END { move-column-to-last; } 108 | 109 | MOD+HOME { focus-column-first; } 110 | MOD+END { focus-column-last; } 111 | 112 | // Monitor Management - Move between monitors 113 | MOD+CTRL+LEFT { focus-monitor-left; } 114 | MOD+CTRL+RIGHT { focus-monitor-right; } 115 | MOD+CTRL+UP { focus-monitor-up; } 116 | MOD+CTRL+DOWN { focus-monitor-down; } 117 | 118 | MOD+CTRL+H { focus-monitor-left; } 119 | MOD+CTRL+L { focus-monitor-right; } 120 | MOD+CTRL+K { focus-monitor-up; } 121 | MOD+CTRL+J { focus-monitor-down; } 122 | 123 | // Move windows to different monitors 124 | MOD+SHIFT+CTRL+LEFT { move-column-to-monitor-left; } 125 | MOD+SHIFT+CTRL+RIGHT { move-column-to-monitor-right; } 126 | MOD+SHIFT+CTRL+UP { move-column-to-monitor-up; } 127 | MOD+SHIFT+CTRL+DOWN { move-column-to-monitor-down; } 128 | 129 | MOD+SHIFT+CTRL+H { move-column-to-monitor-left; } 130 | MOD+SHIFT+CTRL+L { move-column-to-monitor-right; } 131 | MOD+SHIFT+CTRL+K { move-column-to-monitor-up; } 132 | MOD+SHIFT+CTRL+J { move-column-to-monitor-down; } 133 | 134 | // Workspace Management 135 | MOD+ESCAPE hotkey-overlay-title="Open Overview" repeat=false { toggle-overview; } 136 | MOD+WHEELSCROLLDOWN cooldown-ms=100 { focus-workspace-down; } 137 | MOD+WHEELSCROLLUP cooldown-ms=100 { focus-workspace-up; } 138 | 139 | // Move windows to different workspaces - using wheel matches K/J pattern 140 | MOD+SHIFT+WHEELSCROLLDOWN cooldown-ms=100 { move-column-to-workspace-down; } 141 | MOD+SHIFT+WHEELSCROLLUP cooldown-ms=100 { move-column-to-workspace-up; } 142 | 143 | // Column navigation with mouse 144 | MOD+WHEELSCROLLRIGHT { focus-column-right; } 145 | MOD+WHEELSCROLLLEFT { focus-column-left; } 146 | MOD+CTRL+WHEELSCROLLRIGHT { move-column-right; } 147 | MOD+CTRL+WHEELSCROLLLEFT { move-column-left; } 148 | 149 | // Numbered Workspaces 150 | MOD+1 { focus-workspace 1; } 151 | MOD+2 { focus-workspace 2; } 152 | MOD+3 { focus-workspace 3; } 153 | MOD+4 { focus-workspace 4; } 154 | MOD+5 { focus-workspace 5; } 155 | MOD+6 { focus-workspace 6; } 156 | MOD+7 { focus-workspace 7; } 157 | MOD+8 { focus-workspace 8; } 158 | MOD+9 { focus-workspace 9; } 159 | 160 | // Move windows to numbered workspaces with MOD+SHIFT 161 | MOD+SHIFT+1 { move-column-to-workspace 1; } 162 | MOD+SHIFT+2 { move-column-to-workspace 2; } 163 | MOD+SHIFT+3 { move-column-to-workspace 3; } 164 | MOD+SHIFT+4 { move-column-to-workspace 4; } 165 | MOD+SHIFT+5 { move-column-to-workspace 5; } 166 | MOD+SHIFT+6 { move-column-to-workspace 6; } 167 | MOD+SHIFT+7 { move-column-to-workspace 7; } 168 | MOD+SHIFT+8 { move-column-to-workspace 8; } 169 | MOD+SHIFT+9 { move-column-to-workspace 9; } 170 | 171 | MOD+TAB { focus-workspace-previous; } 172 | 173 | // Layout Controls 174 | MOD+C { center-column; } 175 | MOD+CTRL+C { center-visible-columns; } 176 | MOD+BRACKETLEFT { set-column-width "-10%"; } 177 | MOD+BRACKETRIGHT { set-column-width "+10%"; } 178 | MOD+SHIFT+BRACKETLEFT { set-window-height "-10%"; } 179 | MOD+SHIFT+BRACKETRIGHT { set-window-height "+10%"; } 180 | 181 | // Window resizing with mouse 182 | MOD+CTRL+WHEELSCROLLDOWN { set-window-height "-5%"; } 183 | MOD+CTRL+WHEELSCROLLUP { set-window-height "+5%"; } 184 | 185 | // Window Modes 186 | MOD+T { toggle-window-floating; } 187 | MOD+F { fullscreen-window; } 188 | MOD+M { maximize-column; } 189 | // MOD+W { toggle-column-tabbed-display; } 190 | 191 | // Utils 192 | MOD+S { screenshot; } 193 | MOD+SHIFT+S { screenshot-screen write-to-disk=true; } 194 | MOD+CTRL+S { screenshot-window write-to-disk=true; } 195 | MOD+P { spawn-sh "pgrep -x hyprpicker >/dev/null || hyprpicker"; } 196 | 197 | // Application Restarts 198 | MOD+ALT+W { spawn "sh" "-c" "pgrep -x waybar >/dev/null && killall waybar || waybar &"; } 199 | // use with toggle in waybar (doens't restart if not running) 200 | // MOD+ALT+W { spawn "killall" "-SIGUSR1" "waybar"; } 201 | } 202 | 203 | // Layout Settings 204 | layout { 205 | gaps 0 206 | center-focused-column "on-overflow" 207 | background-color "transparent" 208 | 209 | preset-column-widths { 210 | proportion 0.33333 211 | proportion 0.5 212 | proportion 0.66667 213 | } 214 | 215 | focus-ring { 216 | width 0 217 | active-color "#1E1E2E" 218 | } 219 | 220 | insert-hint { 221 | off 222 | color "#1E1E2E" 223 | } 224 | 225 | struts {} 226 | 227 | } 228 | 229 | // Animation Settings 230 | animations { 231 | workspace-switch { 232 | spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001 233 | } 234 | window-open { 235 | duration-ms 200 236 | curve "ease-out-quad" 237 | } 238 | window-close { 239 | duration-ms 200 240 | curve "ease-out-cubic" 241 | } 242 | horizontal-view-movement { 243 | spring damping-ratio=1.0 stiffness=900 epsilon=0.0001 244 | } 245 | window-movement { 246 | spring damping-ratio=1.0 stiffness=800 epsilon=0.0001 247 | } 248 | window-resize { 249 | spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001 250 | } 251 | config-notification-open-close { 252 | spring damping-ratio=0.6 stiffness=1200 epsilon=0.001 253 | } 254 | screenshot-ui-open { 255 | duration-ms 300 256 | curve "ease-out-quad" 257 | } 258 | overview-open-close { 259 | spring damping-ratio=1.0 stiffness=900 epsilon=0.0001 260 | } 261 | } 262 | 263 | // Window Rules 264 | // Application-specific rules 265 | window-rule { 266 | match app-id=r#"firefox$"# title="^Picture-in-Picture$" 267 | open-floating true 268 | } 269 | 270 | window-rule { 271 | match app-id=r#"firefox"# 272 | match app-id=r#"google-chrome"# 273 | match app-id=r#"code"# 274 | match app-id=r#"obsidian$"# 275 | open-maximized true 276 | } 277 | 278 | // File dialogs - Open/Save/Select 279 | window-rule { 280 | match title=r#".*(Open|Save|Select).*"# 281 | open-floating true 282 | default-column-width { proportion 0.0; } 283 | max-width 800 284 | max-height 1000 285 | } 286 | 287 | window-rule { 288 | match title=r#".*File.*"# 289 | open-floating true 290 | default-column-width { proportion 0.0; } 291 | max-width 800 292 | max-height 1000 293 | } 294 | 295 | window-rule { 296 | match app-id=r#"org\.gtk\.FileChooserDialog"# 297 | open-floating true 298 | default-column-width { proportion 0.0; } 299 | max-width 800 300 | max-height 1000 301 | } 302 | 303 | window-rule { 304 | match title=r#".*Sign in - Google Accounts — Mozilla Firefox"# 305 | open-floating true 306 | } 307 | 308 | // System dialogs 309 | window-rule { 310 | match title=r#".*(Dialog|Properties|Preferences|Settings|Rename).*"# 311 | open-floating true 312 | } 313 | 314 | window-rule { 315 | match app-id=r#"zenity"# 316 | open-floating true 317 | } 318 | 319 | // Authentication dialogs 320 | window-rule { 321 | match app-id=r#"org\.kde\.polkit-kde-authentication-agent-1"# 322 | open-floating true 323 | } 324 | 325 | window-rule { 326 | match title=r#".*Authentication.*"# 327 | open-floating true 328 | } 329 | 330 | // Password managers 331 | window-rule { 332 | match app-id=r#"org\.keepassxc\.KeePassXC"# title=r#".*Auto-Type.*"# 333 | open-floating true 334 | } 335 | 336 | window-rule { 337 | match app-id=r#"Bitwarden"# title=r#".*unlock.*"# 338 | open-floating true 339 | } 340 | 341 | // Notification and system utilities 342 | window-rule { 343 | match app-id=r#"nm-connection-editor"# 344 | open-floating true 345 | } 346 | 347 | window-rule { 348 | match app-id=r#"blueman-manager"# 349 | open-floating true 350 | } 351 | 352 | window-rule { 353 | match app-id=r#"pavucontrol"# 354 | open-floating true 355 | } 356 | 357 | // Steam dialogs 358 | window-rule { 359 | match app-id=r#"steam"# title=r#".*(Friends|Settings|Properties).*"# 360 | open-floating true 361 | } 362 | 363 | // Global window appearance 364 | window-rule { 365 | geometry-corner-radius 0 366 | clip-to-geometry true 367 | } 368 | 369 | // Inactive window transparency 370 | window-rule { 371 | match is-active=false 372 | opacity 0.9 373 | } 374 | 375 | // Environment Variables 376 | environment { 377 | DISPLAY null 378 | ELECTRON_OZONE_PLATFORM_HINT "auto" 379 | XDG_SESSION_TYPE "wayland" 380 | XDG_CURRENT_DESKTOP "niri" 381 | 382 | // Wayland Platform Settings 383 | QT_QPA_PLATFORM "wayland" 384 | QT_QPA_PLATFORMTHEME "gtk3" 385 | QT_QPA_PLATFORMTHEME_QT6 "gtk3" 386 | QT_WAYLAND_DISABLE_WINDOWDECORATION "1" 387 | QT_AUTO_SCREEN_SCALE_FACTOR "1" 388 | 389 | // GTK Settings 390 | GDK_BACKEND "wayland,x11" 391 | 392 | // Firefox Wayland 393 | MOZ_ENABLE_WAYLAND "1" 394 | MOZ_DBUS_REMOTE "1" 395 | 396 | // Java Applications 397 | _JAVA_AWT_WM_NONREPARENTING "1" 398 | 399 | // SDL Applications 400 | SDL_VIDEODRIVER "wayland" 401 | 402 | // CLUTTER Applications 403 | CLUTTER_BACKEND "wayland" 404 | 405 | // Performance 406 | VDPAU_DRIVER "va_gl" 407 | LIBVA_DRIVER_NAME "iHD" 408 | } 409 | 410 | -------------------------------------------------------------------------------- /scripts/theme-sync.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -uo pipefail 4 | 5 | sleep 0.8 # let awww set the wallpaper 6 | 7 | # Source common utilities if available 8 | if [[ -f "$(dirname "${BASH_SOURCE[0]}")/lib/common.sh" ]]; then 9 | source "$(dirname "${BASH_SOURCE[0]}")/lib/common.sh" 10 | else 11 | # Fallback logging functions if common.sh is not available 12 | log_info() { 13 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 14 | echo -e "\\033[1;34m[$timestamp] INFO: $*\\033[0m" >&2 15 | } 16 | 17 | log_error() { 18 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 19 | echo -e "\\033[1;31m[$timestamp] ERROR: $*\\033[0m" >&2 20 | } 21 | 22 | log_success() { 23 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 24 | echo -e "\\033[1;32m[$timestamp] SUCCESS: $*\\033[0m" >&2 25 | } 26 | 27 | log_warn() { 28 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 29 | echo -e "\\033[1;33m[$timestamp] WARN: $*\\033[0m" >&2 30 | } 31 | 32 | log_debug() { 33 | local -r timestamp=$(date '+%Y-%m-%d %H:%M:%S') 34 | echo -e "\\033[1;36m[$timestamp] DEBUG: $*\\033[0m" >&2 35 | } 36 | 37 | die() { 38 | log_error "$*" 39 | exit 1 40 | } 41 | 42 | validate_dependencies() { 43 | local -ra required_deps=("$@") 44 | local missing_deps=() 45 | 46 | for dep in "${required_deps[@]}"; do 47 | command -v "$dep" > /dev/null 2>&1 || missing_deps+=("$dep") 48 | done 49 | 50 | if [[ ${#missing_deps[@]} -gt 0 ]]; then 51 | die "Missing required dependencies: ${missing_deps[*]}" 52 | fi 53 | } 54 | fi 55 | 56 | # --- Configuration --- 57 | readonly SCRIPT_NAME="${0##*/}" 58 | readonly WALLPAPERS_DIR="$HOME/Pictures/Wallpapers" 59 | readonly DEFAULT_GTK_THEME="Colloid-Dark" 60 | readonly DEFAULT_ICON_THEME="Colloid-Dark" 61 | readonly THEME_STATE_FILE="$HOME/.cache/theme-sync-state" 62 | 63 | # Get theme based on directory and variation 64 | map_to_gtk_theme() { 65 | local theme_name="$1" 66 | local variation="$2" 67 | 68 | case "${theme_name}" in 69 | "catppuccin") 70 | if [[ "$variation" == "light" ]]; then 71 | echo "Colloid-Light-Catppuccin" 72 | else 73 | echo "Colloid-Dark-Catppuccin" 74 | fi 75 | ;; 76 | "dracula") 77 | if [[ "$variation" == "light" ]]; then 78 | echo "Colloid-Light-Dracula" 79 | else 80 | echo "Colloid-Dark-Dracula" 81 | fi 82 | ;; 83 | "everforest") 84 | if [[ "$variation" == "light" ]]; then 85 | echo "Colloid-Light-Everforest" 86 | else 87 | echo "Colloid-Dark-Everforest" 88 | fi 89 | ;; 90 | "gruvbox") 91 | if [[ "$variation" == "light" ]]; then 92 | echo "Colloid-Light-Gruvbox" 93 | else 94 | echo "Colloid-Dark-Gruvbox" 95 | fi 96 | ;; 97 | "material") 98 | if [[ "$variation" == "light" ]]; then 99 | echo "Colloid-Light" 100 | else 101 | echo "Colloid-Grey-Dark" 102 | fi 103 | ;; 104 | "nord") 105 | if [[ "$variation" == "light" ]]; then 106 | echo "Colloid-Light-Nord" 107 | else 108 | echo "Colloid-Dark-Nord" 109 | fi 110 | ;; 111 | "solarized") 112 | if [[ "$variation" == "light" ]]; then 113 | echo "Osaka-Light-Solarized" 114 | else 115 | echo "Osaka-Dark-Solarized" 116 | fi 117 | ;; 118 | "rose-pine") 119 | if [[ "$variation" == "light" ]]; then 120 | echo "Rosepine-Light" 121 | else 122 | echo "Rosepine-Dark" 123 | fi 124 | ;; 125 | "tokyo-night") 126 | if [[ "$variation" == "light" ]]; then 127 | echo "Tokyonight-Light" 128 | else 129 | echo "Tokyonight-Dark" 130 | fi 131 | ;; 132 | *) 133 | log_warn "Unknown theme: $theme_name, using default theme" 134 | if [[ "$variation" == "light" ]]; then 135 | echo "Colloid-Light" 136 | else 137 | echo "Colloid-Dark" 138 | fi 139 | ;; 140 | esac 141 | } 142 | 143 | map_to_icon_theme() { 144 | local theme_name="$1" 145 | local variation="$2" 146 | 147 | case "${theme_name}" in 148 | "catppuccin") 149 | if [[ "$variation" == "light" ]]; then 150 | echo "Colloid-Catppuccin-Light" 151 | else 152 | echo "Colloid-Catppuccin-Dark" 153 | fi 154 | ;; 155 | "dracula") 156 | if [[ "$variation" == "light" ]]; then 157 | echo "Colloid-Dracula-Light" 158 | else 159 | echo "Colloid-Dracula-Dark" 160 | fi 161 | ;; 162 | "everforest") 163 | if [[ "$variation" == "light" ]]; then 164 | echo "Colloid-Everforest-Light" 165 | else 166 | echo "Colloid-Everforest-Dark" 167 | fi 168 | ;; 169 | "gruvbox") 170 | if [[ "$variation" == "light" ]]; then 171 | echo "Colloid-Gruvbox-Light" 172 | else 173 | echo "Colloid-Gruvbox-Dark" 174 | fi 175 | ;; 176 | "material") 177 | # Base colloid-dark for material as requested 178 | if [[ "$variation" == "light" ]]; then 179 | echo "Colloid-Light" 180 | else 181 | echo "Colloid-Dark" 182 | fi 183 | ;; 184 | "nord") 185 | if [[ "$variation" == "light" ]]; then 186 | echo "Colloid-Nord-Light" 187 | else 188 | echo "Colloid-Nord-Dark" 189 | fi 190 | ;; 191 | "solarized") 192 | # everforest for osaka (solarized) as requested 193 | if [[ "$variation" == "light" ]]; then 194 | echo "Colloid-Everforest-Light" 195 | else 196 | echo "Colloid-Everforest-Dark" 197 | fi 198 | ;; 199 | "rose-pine" | "tokyo-night") 200 | # catppuccin for rose-pine and tokyo-night as requested 201 | if [[ "$variation" == "light" ]]; then 202 | echo "Colloid-Catppuccin-Light" 203 | else 204 | echo "Colloid-Catppuccin-Dark" 205 | fi 206 | ;; 207 | *) 208 | log_warn "Unknown theme: $theme_name, using default icon theme" 209 | if [[ "$variation" == "light" ]]; then 210 | echo "Colloid-Light" 211 | else 212 | echo "Colloid-Dark" 213 | fi 214 | ;; 215 | esac 216 | } 217 | 218 | map_to_wallust_theme() { 219 | local theme_name="$1" 220 | local variation="$2" 221 | 222 | case "${theme_name}" in 223 | "catppuccin") 224 | if [[ "$variation" == "light" ]]; then 225 | echo "Catppuccin-Latte" 226 | else 227 | echo "Catppuccin-Mocha" 228 | fi 229 | ;; 230 | "dracula") 231 | if [[ "$variation" == "light" ]]; then 232 | echo "base16-default-light" 233 | else 234 | echo "base16-dracula" 235 | fi 236 | ;; 237 | "everforest") 238 | if [[ "$variation" == "light" ]]; then 239 | echo "Everforest-Light-Medium" 240 | else 241 | echo "Everforest-Dark-Medium" 242 | fi 243 | ;; 244 | "gruvbox") 245 | if [[ "$variation" == "light" ]]; then 246 | echo "Gruvbox" 247 | else 248 | echo "Gruvbox-Dark" 249 | fi 250 | ;; 251 | "material") 252 | if [[ "$variation" == "light" ]]; then 253 | echo "base16-default-light" 254 | else 255 | echo "base16-black-metal-funeral" 256 | fi 257 | ;; 258 | "nord") 259 | if [[ "$variation" == "light" ]]; then 260 | echo "Nord-Light" 261 | else 262 | echo "Nord" 263 | fi 264 | ;; 265 | "solarized") 266 | if [[ "$variation" == "light" ]]; then 267 | echo "Solarized-Light" 268 | else 269 | echo "Solarized-Dark" 270 | fi 271 | ;; 272 | "rose-pine") 273 | if [[ "$variation" == "light" ]]; then 274 | echo "Rosé-Pine-Dawn" 275 | else 276 | echo "Rosé-Pine" 277 | fi 278 | ;; 279 | "tokyo-night") 280 | if [[ "$variation" == "light" ]]; then 281 | echo "Tokyo-Night-Light" 282 | else 283 | echo "Tokyo-Night" 284 | fi 285 | ;; 286 | *) 287 | log_warn "Unknown theme: $theme_name, using random theme" 288 | echo "random" 289 | ;; 290 | esac 291 | } 292 | 293 | # --- Functions --- 294 | 295 | detect_theme_from_wallpaper() { 296 | log_info "Detecting theme from current wallpaper directory" 297 | 298 | local wallpaper_path 299 | wallpaper_path=$(awww query 2> /dev/null | grep -oP '(?<=image: ).*' | head -n1 | tr -d '\n\r') 300 | 301 | if [[ -z "$wallpaper_path" ]]; then 302 | die "No wallpaper detected from awww query" 303 | fi 304 | 305 | if [[ ! -f "$wallpaper_path" ]]; then 306 | die "Wallpaper file does not exist: $wallpaper_path" 307 | fi 308 | 309 | log_debug "Found wallpaper: $wallpaper_path" 310 | 311 | local theme_dir 312 | theme_dir=$(dirname "$wallpaper_path") 313 | local parent_dir 314 | parent_dir=$(dirname "$theme_dir") 315 | 316 | local theme_name 317 | theme_name=$(basename "$parent_dir" | tr '[:upper:]' '[:lower:]') 318 | 319 | local variation 320 | variation=$(basename "$theme_dir" | tr '[:upper:]' '[:lower:]') 321 | 322 | if [[ "$theme_name" == "osaka" ]]; then 323 | theme_name="solarized" 324 | fi 325 | 326 | log_debug "Detected theme: $theme_name, variation: $variation" 327 | 328 | WALLPAPER_PATH="$wallpaper_path" 329 | WALLPAPER_VARIATION="$variation" 330 | DETECTED_THEME="$theme_name" 331 | 332 | export WALLPAPER_PATH WALLPAPER_VARIATION 333 | } 334 | 335 | check_theme_changed() { 336 | local -r current_theme="$1" 337 | local -r current_variation="$2" 338 | 339 | # Create cache directory if it doesn't exist 340 | mkdir -p "$(dirname "$THEME_STATE_FILE")" 341 | 342 | if [[ ! -f "$THEME_STATE_FILE" ]]; then 343 | log_info "No previous theme state found, this is first run or cache was cleared" 344 | return 0 # Theme changed (first run) 345 | fi 346 | 347 | local previous_theme previous_variation 348 | read -r previous_theme previous_variation < "$THEME_STATE_FILE" 349 | 350 | if [[ "$current_theme" == "$previous_theme" && "$current_variation" == "$previous_variation" ]]; then 351 | log_info "Theme unchanged: $current_theme ($current_variation)" 352 | return 1 # Theme did not change 353 | else 354 | log_info "Theme changed: $previous_theme ($previous_variation) → $current_theme ($current_variation)" 355 | return 0 # Theme changed 356 | fi 357 | } 358 | 359 | save_theme_state() { 360 | local -r theme="$1" 361 | local -r variation="$2" 362 | 363 | mkdir -p "$(dirname "$THEME_STATE_FILE")" 364 | echo "$theme $variation" > "$THEME_STATE_FILE" 365 | log_info "Saved theme state: $theme ($variation)" 366 | } 367 | 368 | # Function to set values in INI files 369 | set_ini_value() { 370 | local -r file="$1" 371 | local -r section="$2" 372 | local -r key="$3" 373 | local -r value="$4" 374 | 375 | [[ -f "$file" ]] || touch "$file" 376 | 377 | if grep -q "^\\[$section\\]" "$file"; then 378 | if grep -q "^$key=" "$file"; then 379 | sed -i "/^\\[$section\\]/,/^\\[/ s/^$key=.*/$key=$value/" "$file" 380 | else 381 | sed -i "/^\\[$section\\]/a $key=$value" "$file" 382 | fi 383 | else 384 | printf '\\n[%s]\\n%s=%s\\n' "$section" "$key" "$value" >> "$file" 385 | fi 386 | } 387 | 388 | manage_gtk_config() { 389 | local -r version="$1" 390 | local -r theme="$2" 391 | local -r variation="${3:-dark}" 392 | local -r config_file="$HOME/.config/gtk-$version/settings.ini" 393 | 394 | # Create directory if it doesn't exist 395 | mkdir -p "$(dirname "$config_file")" 396 | 397 | set_ini_value "$config_file" "Settings" "gtk-theme-name" "$theme" 398 | 399 | # Set prefer-dark-theme based on variation 400 | if [[ "$variation" == "light" ]]; then 401 | set_ini_value "$config_file" "Settings" "gtk-application-prefer-dark-theme" "0" 402 | else 403 | set_ini_value "$config_file" "Settings" "gtk-application-prefer-dark-theme" "1" 404 | fi 405 | } 406 | 407 | update_xsettingsd() { 408 | local -r theme="$1" 409 | local -r icon_theme="$2" 410 | local -r config_file="$HOME/.config/xsettingsd/xsettingsd.conf" 411 | 412 | # Create directory if it doesn't exist 413 | mkdir -p "$(dirname "$config_file")" 414 | 415 | # Check if file exists, create it with proper format if it doesn't 416 | if [[ ! -f "$config_file" ]]; then 417 | printf 'Net/ThemeName "%s" 418 | Net/IconThemeName "%s" 419 | ' "$theme" "$icon_theme" > "$config_file" 420 | else 421 | sed -i "s/Net\/ThemeName \".*\"/Net\/ThemeName \"$theme\"/; s/Net\/IconThemeName \".*\"/Net\/IconThemeName \"$icon_theme\"/" "$config_file" 2> /dev/null || 422 | log_warn "Failed to update xsettingsd config for theme name" 423 | fi 424 | } 425 | 426 | update_gtk_settings() { 427 | local -r gtk_theme="$1" 428 | local -r variation="$2" 429 | 430 | # Set the GTK theme using gsettings 431 | gsettings set org.gnome.desktop.interface gtk-theme "$gtk_theme" 2> /dev/null || { 432 | log_warn "Failed to set GTK theme via gsettings, may not be available" 433 | } 434 | 435 | # Set color scheme based on variation 436 | if [[ "$variation" == "light" ]]; then 437 | gsettings set org.gnome.desktop.interface color-scheme "prefer-light" 2> /dev/null || { 438 | log_warn "Failed to set light color scheme via gsettings" 439 | } 440 | else 441 | gsettings set org.gnome.desktop.interface color-scheme "prefer-dark" 2> /dev/null || { 442 | log_warn "Failed to set dark color scheme via gsettings" 443 | } 444 | fi 445 | 446 | # Force reload of GTK settings for running applications 447 | if command -v dbus-send > /dev/null 2>&1; then 448 | dbus-send --session --dest=org.gtk.Settings --type=method_call \ 449 | /org/gtk/Settings org.gtk.Settings.NotifyThemeChange 2> /dev/null || true 450 | fi 451 | 452 | # Reload xsettingsd if running 453 | if command -v pgrep > /dev/null 2>&1 && command -v pkill > /dev/null 2>&1; then 454 | if pgrep -x xsettingsd > /dev/null; then 455 | pkill -HUP xsettingsd 456 | fi 457 | else 458 | log_warn "pgrep/pkill not available, skipping xsettingsd reload" 459 | fi 460 | } 461 | 462 | manage_symlinks() { 463 | local -r theme="$1" 464 | local target_dir="" 465 | 466 | # Find theme directory 467 | local -ra theme_paths=( 468 | "$HOME/.themes/$theme" 469 | "$HOME/.local/share/themes/$theme" 470 | "/usr/share/themes/$theme" 471 | ) 472 | 473 | for path in "${theme_paths[@]}"; do 474 | if [[ -d "$path" ]]; then 475 | target_dir="$path" 476 | break 477 | fi 478 | done 479 | 480 | [[ -n "$target_dir" ]] || { 481 | log_warn "Theme assets not found: $theme, skipping symlinks" 482 | return 1 483 | } 484 | 485 | # Create symlinks for GTK 4.0 486 | local -r gtk4_dir="$HOME/.config/gtk-4.0" 487 | mkdir -p "$gtk4_dir" 488 | 489 | declare -A links=( 490 | ["$gtk4_dir/gtk.css"]="gtk-4.0/gtk.css" 491 | ["$gtk4_dir/gtk-dark.css"]="gtk-4.0/gtk-dark.css" 492 | ["$gtk4_dir/assets"]="gtk-4.0/assets" 493 | ) 494 | 495 | # Create symlinks 496 | for link in "${!links[@]}"; do 497 | local target="$target_dir/${links[$link]}" 498 | [[ -e "$target" ]] || continue 499 | 500 | mkdir -p "$(dirname "$link")" 501 | ln -sf "$target" "$link" && log_info "Created symlink: ${link##*/}" 502 | done 503 | } 504 | 505 | set_gtk_theme() { 506 | local -r gtk_theme="$1" 507 | local -r variation="${2:-dark}" 508 | local -r icon_theme="${3:-$DEFAULT_ICON_THEME}" 509 | 510 | log_info "Setting GTK theme to: $gtk_theme" 511 | 512 | # Check if theme directory exists 513 | local theme_found=0 514 | local -ra theme_paths=( 515 | "$HOME/.themes/$gtk_theme" 516 | "$HOME/.local/share/themes/$gtk_theme" 517 | "/usr/share/themes/$gtk_theme" 518 | ) 519 | 520 | for path in "${theme_paths[@]}"; do 521 | if [[ -d "$path" ]]; then 522 | theme_found=1 523 | break 524 | fi 525 | done 526 | 527 | if [[ $theme_found -eq 0 ]]; then 528 | log_warn "GTK theme not found: $gtk_theme, skipping theme change" 529 | return 530 | fi 531 | 532 | # Apply theme through multiple methods to ensure coverage 533 | update_gtk_settings "$gtk_theme" "$variation" 534 | manage_gtk_config "3.0" "$gtk_theme" "$variation" 535 | manage_gtk_config "4.0" "$gtk_theme" "$variation" 536 | manage_symlinks "$gtk_theme" 537 | update_xsettingsd "$gtk_theme" "$icon_theme" 538 | 539 | log_success "GTK theme set to: $gtk_theme with comprehensive configuration" 540 | } 541 | 542 | set_icon_theme() { 543 | local -r icon_theme="$1" 544 | 545 | log_info "Setting icon theme to: $icon_theme" 546 | 547 | # Check if icon theme directory exists 548 | local theme_found=0 549 | local -ra icon_theme_paths=( 550 | "$HOME/.icons/$icon_theme" 551 | "$HOME/.local/share/icons/$icon_theme" 552 | "/usr/share/icons/$icon_theme" 553 | ) 554 | 555 | for path in "${icon_theme_paths[@]}"; do 556 | if [[ -d "$path" ]]; then 557 | theme_found=1 558 | break 559 | fi 560 | done 561 | 562 | if [[ $theme_found -eq 0 ]]; then 563 | log_warn "Icon theme not found: $icon_theme, skipping icon theme change" 564 | return 565 | fi 566 | 567 | # Set the icon theme 568 | gsettings set org.gnome.desktop.interface icon-theme "$icon_theme" || { 569 | log_warn "Failed to set icon theme, gsettings may not be available" 570 | } 571 | 572 | log_success "Icon theme set to: $icon_theme" 573 | } 574 | 575 | run_wallust_theme() { 576 | local -r wallust_theme="$1" 577 | local -r wallpaper_path="$2" 578 | 579 | log_info "Running wallust with theme: $wallust_theme for wallpaper: $wallpaper_path" 580 | 581 | if [[ "$wallust_theme" == "random" ]]; then 582 | # Just run wallust on the wallpaper without a specific theme if unknown 583 | log_info "Running wallust in auto mode for: $wallpaper_path" 584 | if ! wallust run "$wallpaper_path" --dynamic-threshold 2> /dev/null; then 585 | log_warn "Wallust theme generation failed, continuing..." 586 | else 587 | log_success "Wallust theme generation completed" 588 | fi 589 | else 590 | # Try to apply the specific theme if available 591 | log_info "Applying specific wallust theme: $wallust_theme" 592 | if ! wallust theme "$wallust_theme" 2> /dev/null; then 593 | log_warn "Specific wallust theme failed, falling back to auto-generation for: $wallpaper_path" 594 | # Fallback to running wallust on the wallpaper directly 595 | if ! wallust run "$wallpaper_path" --dynamic-threshold 2> /dev/null; then 596 | log_warn "Wallust generation failed completely, continuing..." 597 | else 598 | log_success "Wallust fallback theme generation completed" 599 | fi 600 | else 601 | log_success "Wallust specific theme applied: $wallust_theme" 602 | fi 603 | fi 604 | } 605 | 606 | update_niri_config() { 607 | local -r niri_config_file="$HOME/.config/niri/config.kdl" 608 | local -r wallust_colors_file="$HOME/.cache/wallust/colors.json" 609 | 610 | if [[ ! -f "$wallust_colors_file" ]]; then 611 | log_warn "Wallust color cache not found, skipping niri config update" 612 | return 613 | fi 614 | 615 | local background_color 616 | background_color=$(jq -r '.special.background' "$wallust_colors_file") 617 | 618 | if [[ -z "$background_color" ]]; then 619 | log_warn "Could not extract background color from wallust cache" 620 | return 621 | fi 622 | 623 | log_info "Updating niri config with background color: $background_color" 624 | 625 | # Only change active-color within the focus-ring block 626 | sed -i "/focus-ring {/,/}/ s/active-color \".*\"/active-color \"$background_color\"/" "$niri_config_file" 627 | # Only change color within the insert-hint block 628 | sed -i "/insert-hint {/,/}/ s/color \".*\"/color \"$background_color\"/" "$niri_config_file" 629 | 630 | log_success "Niri config updated successfully" 631 | } 632 | 633 | update_vscode_theme() { 634 | local -r vscode_settings_file="$HOME/.config/Code/User/settings.json" 635 | local theme 636 | 637 | if [[ ! -f "$vscode_settings_file" ]]; then 638 | log_warn "VSCode settings file not found, skipping theme update" 639 | return 640 | fi 641 | 642 | if [[ "$WALLPAPER_VARIATION" == "light" ]]; then 643 | theme="Wallust-Bordered-Light" 644 | else 645 | theme="Wallust-Bordered-Dark" 646 | fi 647 | 648 | log_info "Updating VSCode theme to: $theme" 649 | 650 | if ! sed -i "s/\"workbench.colorTheme\": \".*\"/\"workbench.colorTheme\": \"$theme\"/" "$vscode_settings_file"; then 651 | log_error "Failed to update VSCode theme with sed" 652 | return 1 653 | fi 654 | 655 | log_success "VSCode theme updated successfully" 656 | } 657 | 658 | main() { 659 | log_info "Starting dynamic theme synchronization" 660 | 661 | # Validate dependencies 662 | validate_dependencies "awww" "wallust" "jq" "sed" "grep" "head" "tr" 663 | 664 | # Detect theme from current wallpaper 665 | detect_theme_from_wallpaper 666 | 667 | local detected_theme="${DETECTED_THEME:-}" 668 | local wallpaper_path="${WALLPAPER_PATH:-}" 669 | local wallpaper_variation="${WALLPAPER_VARIATION:-}" 670 | 671 | if [[ -z "$detected_theme" ]]; then 672 | die "Unable to determine theme from current wallpaper" 673 | fi 674 | 675 | if [[ -z "$wallpaper_path" || ! -f "$wallpaper_path" ]]; then 676 | die "Wallpaper file does not exist: ${wallpaper_path:-unknown}" 677 | fi 678 | 679 | if [[ -z "$wallpaper_variation" ]]; then 680 | die "Unable to determine wallpaper variation" 681 | fi 682 | 683 | log_info "Detected theme: $detected_theme, variation: $wallpaper_variation" 684 | 685 | # Check if theme/variation changed 686 | local theme_changed=0 687 | if check_theme_changed "$detected_theme" "$wallpaper_variation"; then 688 | theme_changed=1 689 | fi 690 | 691 | # Map to appropriate themes using both theme and variation 692 | local gtk_theme 693 | gtk_theme=$(map_to_gtk_theme "$detected_theme" "$wallpaper_variation") 694 | 695 | local icon_theme 696 | icon_theme=$(map_to_icon_theme "$detected_theme" "$wallpaper_variation") 697 | 698 | local wallust_theme 699 | wallust_theme=$(map_to_wallust_theme "$detected_theme" "$wallpaper_variation") 700 | 701 | # Only apply themes if theme/variation changed 702 | if [[ $theme_changed -eq 1 ]]; then 703 | set_gtk_theme "$gtk_theme" "$wallpaper_variation" "$icon_theme" 704 | set_icon_theme "$icon_theme" 705 | run_wallust_theme "$wallust_theme" "$wallpaper_path" 706 | update_niri_config 707 | update_vscode_theme 708 | 709 | if command -v vicinae > /dev/null 2>&1; then 710 | vicinae theme set wallust || log_warn "Failed to set vicinae theme" 711 | else 712 | log_warn "vicinae not found, skipping vicinae theme update" 713 | fi 714 | 715 | if command -v makoctl > /dev/null 2>&1; then 716 | makoctl reload 2> /dev/null || log_warn "Failed to reload mako" 717 | else 718 | log_warn "makoctl not available, skipping notification daemon reload" 719 | fi 720 | 721 | save_theme_state "$detected_theme" "$wallpaper_variation" 722 | 723 | log_success "Dynamic theme synchronization completed successfully" 724 | send_notification "Theme Manager" "Theme Synchronization Complete" "" "normal" "preferences-desktop-theme" 725 | else 726 | log_info "Theme unchanged, skipping all theming operations" 727 | log_success "Wallpaper applied, no theme changes needed" 728 | fi 729 | } 730 | 731 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 732 | main "$@" 733 | fi 734 | 735 | --------------------------------------------------------------------------------