From 18373323b068b079b12d7fc308871e1a2ca5be14 Mon Sep 17 00:00:00 2001 From: punkfairie <23287005+punkfairie@users.noreply.github.com> Date: Sun, 14 Apr 2024 18:41:15 -0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Migrate=20to=20Chezmoi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .chezmoiexternals/awesomewm.toml | 19 + .chezmoiexternals/bat.toml | 19 + .chezmoiexternals/btop.toml | 19 + .chezmoiexternals/glow.toml | 19 + .chezmoiexternals/lazygit.toml | 19 + .chezmoiexternals/rofi.toml | 19 + .chezmoiexternals/zathura.toml | 19 + dot_Xresources | 38 + dot_bash_logout | 3 + dot_bash_profile | 5 + dot_bashrc | 13 + dot_config/awesome/config.lua | 102 + dot_config/awesome/helpers/init.lua | 3 + dot_config/awesome/helpers/ui.lua | 188 ++ dot_config/awesome/lib/animation/init.lua | 225 ++ .../awesome/lib/animation/subscribable.lua | 47 + dot_config/awesome/lib/animation/tween.lua | 533 ++++ dot_config/awesome/lib/better-resize.lua | 138 + dot_config/awesome/lib/exit-screen.lua | 186 ++ dot_config/awesome/lib/init.lua | 9 + dot_config/awesome/lib/json.lua | 372 +++ dot_config/awesome/lib/savefloats.lua | 58 + dot_config/awesome/main/bindings.lua | 286 ++ dot_config/awesome/main/custom_bindings.lua | 63 + dot_config/awesome/main/error_handling.lua | 31 + dot_config/awesome/main/init.lua | 14 + dot_config/awesome/main/layout.lua | 36 + dot_config/awesome/main/menu.lua | 107 + dot_config/awesome/main/rules.lua | 78 + dot_config/awesome/main/tags.lua | 10 + dot_config/awesome/main/wallpaper.lua | 26 + dot_config/awesome/rc.lua | 26 + dot_config/awesome/signals/cpu.lua | 20 + dot_config/awesome/signals/disk.lua | 23 + dot_config/awesome/signals/init.lua | 14 + dot_config/awesome/signals/mem.lua | 22 + dot_config/awesome/signals/mic.lua | 29 + dot_config/awesome/signals/player.lua | 31 + dot_config/awesome/signals/playerctl.lua | 17 + dot_config/awesome/signals/uptime.lua | 16 + dot_config/awesome/signals/volume.lua | 26 + .../themes/catppuccin/assets/music.png | Bin 0 -> 404927 bytes .../awesome/themes/catppuccin/assets/pfp.jpg | Bin 0 -> 7540 bytes .../themes/catppuccin/assets/volume-off.png | Bin 0 -> 5729 bytes .../themes/catppuccin/assets/volume-on.png | Bin 0 -> 5208 bytes .../themes/catppuccin/assets/volume.svg | 57 + .../awesome/themes/catppuccin/buttons.png | Bin 0 -> 11964 bytes .../themes/catppuccin/layouts/centered.png | Bin 0 -> 3625 bytes .../themes/catppuccin/layouts/dwindle.png | Bin 0 -> 3532 bytes .../themes/catppuccin/layouts/equalarea.png | Bin 0 -> 3530 bytes .../themes/catppuccin/layouts/floating.png | Bin 0 -> 2609 bytes .../themes/catppuccin/layouts/machi.png | Bin 0 -> 2765 bytes .../awesome/themes/catppuccin/layouts/max.png | Bin 0 -> 3754 bytes .../themes/catppuccin/layouts/mstab.png | Bin 0 -> 3557 bytes .../themes/catppuccin/layouts/tile.png | Bin 0 -> 3495 bytes .../awesome/themes/catppuccin/submenu.png | Bin 0 -> 440 bytes .../themes/catppuccin/taglist/squarefw.png | Bin 0 -> 187 bytes .../themes/catppuccin/taglist/squarew.png | Bin 0 -> 193 bytes .../awesome/themes/catppuccin/theme.lua | 202 ++ .../themes/catppuccin/titlebar/close.svg | 1 + .../catppuccin/titlebar/close_hover.svg | 1 + .../themes/catppuccin/titlebar/maximize.svg | 1 + .../catppuccin/titlebar/maximize_hover.svg | 10 + .../themes/catppuccin/titlebar/minimize.svg | 1 + .../catppuccin/titlebar/minimize_hover.svg | 10 + .../themes/catppuccin/titlebar/ontop.svg | 1 + .../themes/catppuccin/titlebar/unfocus.svg | 1 + dot_config/awesome/ui/info-panel/calendar.lua | 85 + dot_config/awesome/ui/info-panel/init.lua | 121 + .../awesome/ui/info-panel/music-player.lua | 256 ++ dot_config/awesome/ui/info-panel/player.lua | 116 + dot_config/awesome/ui/info-panel/profile.lua | 179 ++ .../weather/icons/weather-clear-night.svg | 3 + .../weather/icons/weather-clear-sky.svg | 3 + .../weather/icons/weather-clouds-night.svg | 8 + .../weather/icons/weather-clouds.svg | 8 + .../icons/weather-few-clouds-night.svg | 4 + .../weather/icons/weather-few-clouds.svg | 3 + .../info-panel/weather/icons/weather-fog.svg | 3 + .../weather/icons/weather-freezing-rain.svg | 9 + .../icons/weather-overcast-symbolic.svg | 4 + .../weather/icons/weather-overcast.svg | 8 + .../weather/icons/weather-severe-alert.svg | 4 + .../icons/weather-showers-scattered.svg | 4 + .../weather/icons/weather-showers.svg | 4 + .../weather/icons/weather-snow-rain.svg | 8 + .../weather/icons/weather-snow-scattered.svg | 8 + .../info-panel/weather/icons/weather-snow.svg | 8 + .../weather/icons/weather-storm.svg | 9 + .../weather/icons/weather-windy.svg | 3 + .../awesome/ui/info-panel/weather/init.lua | 229 ++ dot_config/awesome/ui/init.lua | 5 + dot_config/awesome/ui/notif-panel/init.lua | 334 +++ .../ui/notif-panel/widgets/bri_slider.lua | 50 + .../ui/notif-panel/widgets/mic_slider.lua | 124 + .../ui/notif-panel/widgets/vol_slider.lua | 124 + dot_config/awesome/ui/popups/init.lua | 10 + dot_config/awesome/ui/popups/layout/init.lua | 131 + .../awesome/ui/popups/notifications/error.lua | 12 + .../awesome/ui/popups/notifications/init.lua | 350 +++ .../ui/popups/notifications/playerctl.lua | 20 + .../awesome/ui/popups/scratchpad/init.lua | 27 + dot_config/awesome/ui/popups/volume/init.lua | 284 ++ dot_config/awesome/ui/titlebar/init.lua | 57 + dot_config/awesome/ui/top-panel/config.lua | 13 + dot_config/awesome/ui/top-panel/init.lua | 110 + .../awesome/ui/top-panel/widgets/clock.lua | 34 + .../awesome/ui/top-panel/widgets/cpu.lua | 47 + .../awesome/ui/top-panel/widgets/date.lua | 34 + .../awesome/ui/top-panel/widgets/disk.lua | 39 + .../awesome/ui/top-panel/widgets/init.lua | 14 + .../awesome/ui/top-panel/widgets/launcher.lua | 7 + .../awesome/ui/top-panel/widgets/mem.lua | 41 + .../awesome/ui/top-panel/widgets/menu.lua | 26 + .../awesome/ui/top-panel/widgets/power.lua | 18 + .../ui/top-panel/widgets/promptbox.lua | 5 + .../ui/top-panel/widgets/pulseaudio.lua | 80 + .../ui/top-panel/widgets/seperator.lua | 12 + .../awesome/ui/top-panel/widgets/systray.lua | 64 + .../awesome/ui/top-panel/widgets/taglist.lua | 114 + .../awesome/ui/top-panel/widgets/tasklist.lua | 8 + dot_config/bat/config | 27 + dot_config/btop/btop.conf | 248 ++ dot_config/cheat/conf.yml | 83 + dot_config/composer/composer.json | 6 + dot_config/composer/composer.lock | 2487 +++++++++++++++++ dot_config/dot_curlrc | 11 + dot_config/executable_dot_fehbg | 2 + dot_config/firefox/install.txt | 6 + dot_config/firefox/userChrome.css | 49 + dot_config/fish/completions/dotfiles.fish | 43 + dot_config/fish/completions/fisher.fish | 7 + .../completions/fzf_configure_bindings.fish | 8 + dot_config/fish/completions/pipx.fish | 17 + dot_config/fish/conf.d/00-init.fish | 30 + dot_config/fish/conf.d/10-starship.fish | 10 + dot_config/fish/conf.d/20-aliases.fish | 46 + dot_config/fish/conf.d/20-gpg.fish | 6 + dot_config/fish/conf.d/30-asdf.fish | 3 + dot_config/fish/conf.d/30-bat.fish | 7 + dot_config/fish/conf.d/30-chezmoi.fish | 6 + dot_config/fish/conf.d/30-eza.fish | 18 + dot_config/fish/conf.d/30-fzf.fish | 19 + dot_config/fish/conf.d/30-git.fish | 51 + dot_config/fish/conf.d/30-gtk.fish | 3 + dot_config/fish/conf.d/30-journalctl.fish | 4 + dot_config/fish/conf.d/30-lazygit.fish | 11 + dot_config/fish/conf.d/30-man.fish | 3 + dot_config/fish/conf.d/30-php.fish | 7 + dot_config/fish/conf.d/30-systemctl.fish | 9 + dot_config/fish/conf.d/30-volta.fish | 5 + dot_config/fish/conf.d/30-wget.fish | 7 + dot_config/fish/conf.d/30-yay.fish | 7 + dot_config/fish/conf.d/autopair.fish | 39 + dot_config/fish/conf.d/fzf.fish | 28 + dot_config/fish/config.fish | 6 + dot_config/fish/functions/$.fish | 3 + .../fish/functions/_autopair_backspace.fish | 9 + .../fish/functions/_autopair_insert_left.fish | 13 + .../functions/_autopair_insert_right.fish | 11 + .../fish/functions/_autopair_insert_same.fish | 20 + dot_config/fish/functions/_autopair_tab.fish | 7 + .../_fzf_configure_bindings_help.fish | 43 + .../fish/functions/_fzf_extract_var_info.fish | 15 + .../functions/_fzf_preview_changed_file.fish | 49 + .../fish/functions/_fzf_preview_file.fish | 43 + .../fish/functions/_fzf_report_diff_type.fish | 18 + .../fish/functions/_fzf_report_file_type.fish | 6 + .../fish/functions/_fzf_search_directory.fish | 33 + .../fish/functions/_fzf_search_git_log.fish | 36 + .../functions/_fzf_search_git_status.fish | 41 + .../fish/functions/_fzf_search_history.fish | 39 + .../fish/functions/_fzf_search_processes.fish | 32 + .../fish/functions/_fzf_search_variables.fish | 47 + dot_config/fish/functions/_fzf_wrapper.fish | 20 + dot_config/fish/functions/cpkey.fish | 11 + dot_config/fish/functions/extract.fish | 45 + dot_config/fish/functions/fish_greeting.fish | 5 + dot_config/fish/functions/fisher.fish | 240 ++ dot_config/fish/functions/fm.fish | 5 + dot_config/fish/functions/fuck.fish | 11 + dot_config/fish/functions/fzf.fish | 9 + .../functions/fzf_configure_bindings.fish | 46 + dot_config/fish/functions/git_open.fish | 25 + dot_config/fish/functions/hack.fish | 15 + dot_config/fish/functions/open.fish | 11 + dot_config/fish/functions/pkgsearch.fish | 12 + dot_config/fish/functions/tmux_up.fish | 7 + dot_config/fish/functions/up.fish | 28 + dot_config/gh/config.yml | 17 + dot_config/git/config | 126 + dot_config/git/config.aliases | 164 ++ dot_config/git/config.delta-themes | 513 ++++ dot_config/git/config.local.tmpl | 6 + dot_config/git/dot_gitattributes | 10 + dot_config/git/gitmojis | 1 + .../git/hooks/executable_prepare-commit-msg | 137 + dot_config/glow/glow.yml | 10 + dot_config/gtk-3.0/bookmarks | 1 + dot_config/gtk-3.0/settings.ini | 4 + dot_config/gtk-4.0/symlink_assets | 1 + dot_config/gtk-4.0/symlink_gtk-dark.css | 1 + dot_config/gtk-4.0/symlink_gtk.css | 1 + dot_config/hyfetch.json | 16 + dot_config/lazygit/config.yml | 10 + dot_config/mopidy/mopidy.conf | 168 ++ dot_config/ncmpcpp/config | 598 ++++ dot_config/neofetch/config.conf | 880 ++++++ .../nvim/after/queries/html/injections.scm | 36 + dot_config/nvim/after/queries/php/indents.scm | 10 + dot_config/nvim/dot_neoconf.json | 15 + dot_config/nvim/init.lua | 2 + dot_config/nvim/lazyvim.json | 9 + dot_config/nvim/lua/config/autocmds.lua | 44 + dot_config/nvim/lua/config/keymaps.lua | 3 + dot_config/nvim/lua/config/lazy.lua | 81 + dot_config/nvim/lua/config/options.lua | 29 + dot_config/nvim/lua/config/tabset.lua | 11 + dot_config/nvim/lua/plugins/beacon.lua | 9 + dot_config/nvim/lua/plugins/chezmoi-vim.lua | 9 + dot_config/nvim/lua/plugins/conform.lua | 59 + dot_config/nvim/lua/plugins/cutlass.lua | 15 + dot_config/nvim/lua/plugins/diffview.lua | 6 + dot_config/nvim/lua/plugins/dim.lua | 7 + dot_config/nvim/lua/plugins/example.lua | 265 ++ dot_config/nvim/lua/plugins/gitsigns.lua | 8 + dot_config/nvim/lua/plugins/lazygit.lua | 6 + dot_config/nvim/lua/plugins/lazyvim.lua | 8 + dot_config/nvim/lua/plugins/luasnip.lua | 14 + .../nvim/lua/plugins/mason-lspconfig.lua | 12 + dot_config/nvim/lua/plugins/mason.lua | 24 + dot_config/nvim/lua/plugins/neo-tree.lua | 18 + dot_config/nvim/lua/plugins/nerdy.lua | 9 + dot_config/nvim/lua/plugins/nvim-cmp.lua | 31 + dot_config/nvim/lua/plugins/nvim-devdocs.lua | 36 + dot_config/nvim/lua/plugins/nvim-emmet.lua | 9 + dot_config/nvim/lua/plugins/nvim-lint.lua | 21 + .../nvim/lua/plugins/nvim-lspconfig.lua | 86 + .../nvim/lua/plugins/nvim-treesitter.lua | 59 + dot_config/nvim/lua/plugins/refactoring.lua | 10 + dot_config/nvim/lua/plugins/ssr.lua | 15 + dot_config/nvim/lua/plugins/tabset.lua | 6 + dot_config/nvim/lua/plugins/treesj.lua | 10 + dot_config/nvim/lua/plugins/vim-blade.lua | 6 + dot_config/nvim/lua/plugins/vim-dotenv.lua | 6 + dot_config/nvim/lua/plugins/vim-gutentags.lua | 6 + dot_config/nvim/lua/plugins/vim-pkgbuild.lua | 6 + .../nvim/lua/plugins/vim-tmux-navigator.lua | 19 + dot_config/nvim/lua/snippets/fish.lua | 104 + dot_config/nvim/lua/snippets/gitconfig.lua | 8 + dot_config/nvim/lua/snippets/helpers.lua | 40 + dot_config/nvim/lua/snippets/html.lua | 29 + dot_config/nvim/lua/snippets/lua.lua | 8 + dot_config/nvim/queries/blade/folds.scm | 8 + dot_config/nvim/queries/blade/highlights.scm | 4 + dot_config/nvim/queries/blade/injections.scm | 15 + dot_config/nvim/stylua.toml | 3 + dot_config/openrazer/persistence.conf | 25 + dot_config/openrazer/razer.conf | 23 + dot_config/packages/all | 185 ++ dot_config/picom.conf | 498 ++++ dot_config/qalculate/qalc.cfg | 84 + dot_config/razercommander/macro_logic.json | 1 + dot_config/razercommander/profiles | 1 + dot_config/rofi/config.rasi | 29 + dot_config/starship.toml | 215 ++ dot_config/tmux/tmux.conf | 151 + dot_config/topgrade.d/00-misc.toml | 68 + dot_config/topgrade.d/01-commands.toml | 15 + dot_config/topgrade.d/10-brew.toml | 19 + dot_config/topgrade.d/10-composer.toml | 2 + dot_config/topgrade.d/10-firmware.toml | 3 + dot_config/topgrade.d/10-git.toml | 15 + dot_config/topgrade.d/10-linux.toml | 43 + dot_config/topgrade.d/10-npm.toml | 3 + dot_config/transmission/settings.json | 119 + dot_config/wezterm/wezterm.lua | 78 + dot_config/wgetrc | 18 + dot_config/yay/config.json | 50 + dot_config/zathura/zathurarc | 1 + dot_icons/default/index.theme | 2 + dot_plugin-versions | 3 + dot_screenlayout/executable_multihead.sh | 2 + dot_tool-versions | 2 + dot_xprofile | 36 + private_dot_bash_history | 67 + private_dot_gnupg/private_common.conf | 1 + private_dot_gnupg/private_gpg-agent.conf | 5 + tags | 817 ++++++ 289 files changed, 17267 insertions(+) create mode 100644 .chezmoiexternals/awesomewm.toml create mode 100644 .chezmoiexternals/bat.toml create mode 100644 .chezmoiexternals/btop.toml create mode 100644 .chezmoiexternals/glow.toml create mode 100644 .chezmoiexternals/lazygit.toml create mode 100644 .chezmoiexternals/rofi.toml create mode 100644 .chezmoiexternals/zathura.toml create mode 100644 dot_Xresources create mode 100644 dot_bash_logout create mode 100644 dot_bash_profile create mode 100644 dot_bashrc create mode 100644 dot_config/awesome/config.lua create mode 100644 dot_config/awesome/helpers/init.lua create mode 100644 dot_config/awesome/helpers/ui.lua create mode 100644 dot_config/awesome/lib/animation/init.lua create mode 100644 dot_config/awesome/lib/animation/subscribable.lua create mode 100644 dot_config/awesome/lib/animation/tween.lua create mode 100644 dot_config/awesome/lib/better-resize.lua create mode 100644 dot_config/awesome/lib/exit-screen.lua create mode 100644 dot_config/awesome/lib/init.lua create mode 100644 dot_config/awesome/lib/json.lua create mode 100644 dot_config/awesome/lib/savefloats.lua create mode 100644 dot_config/awesome/main/bindings.lua create mode 100644 dot_config/awesome/main/custom_bindings.lua create mode 100644 dot_config/awesome/main/error_handling.lua create mode 100644 dot_config/awesome/main/init.lua create mode 100644 dot_config/awesome/main/layout.lua create mode 100644 dot_config/awesome/main/menu.lua create mode 100644 dot_config/awesome/main/rules.lua create mode 100644 dot_config/awesome/main/tags.lua create mode 100644 dot_config/awesome/main/wallpaper.lua create mode 100644 dot_config/awesome/rc.lua create mode 100644 dot_config/awesome/signals/cpu.lua create mode 100644 dot_config/awesome/signals/disk.lua create mode 100644 dot_config/awesome/signals/init.lua create mode 100644 dot_config/awesome/signals/mem.lua create mode 100644 dot_config/awesome/signals/mic.lua create mode 100644 dot_config/awesome/signals/player.lua create mode 100644 dot_config/awesome/signals/playerctl.lua create mode 100644 dot_config/awesome/signals/uptime.lua create mode 100644 dot_config/awesome/signals/volume.lua create mode 100644 dot_config/awesome/themes/catppuccin/assets/music.png create mode 100644 dot_config/awesome/themes/catppuccin/assets/pfp.jpg create mode 100644 dot_config/awesome/themes/catppuccin/assets/volume-off.png create mode 100644 dot_config/awesome/themes/catppuccin/assets/volume-on.png create mode 100644 dot_config/awesome/themes/catppuccin/assets/volume.svg create mode 100644 dot_config/awesome/themes/catppuccin/buttons.png create mode 100644 dot_config/awesome/themes/catppuccin/layouts/centered.png create mode 100644 dot_config/awesome/themes/catppuccin/layouts/dwindle.png create mode 100644 dot_config/awesome/themes/catppuccin/layouts/equalarea.png create mode 100644 dot_config/awesome/themes/catppuccin/layouts/floating.png create mode 100644 dot_config/awesome/themes/catppuccin/layouts/machi.png create mode 100644 dot_config/awesome/themes/catppuccin/layouts/max.png create mode 100644 dot_config/awesome/themes/catppuccin/layouts/mstab.png create mode 100644 dot_config/awesome/themes/catppuccin/layouts/tile.png create mode 100644 dot_config/awesome/themes/catppuccin/submenu.png create mode 100644 dot_config/awesome/themes/catppuccin/taglist/squarefw.png create mode 100644 dot_config/awesome/themes/catppuccin/taglist/squarew.png create mode 100644 dot_config/awesome/themes/catppuccin/theme.lua create mode 100644 dot_config/awesome/themes/catppuccin/titlebar/close.svg create mode 100644 dot_config/awesome/themes/catppuccin/titlebar/close_hover.svg create mode 100644 dot_config/awesome/themes/catppuccin/titlebar/maximize.svg create mode 100644 dot_config/awesome/themes/catppuccin/titlebar/maximize_hover.svg create mode 100644 dot_config/awesome/themes/catppuccin/titlebar/minimize.svg create mode 100644 dot_config/awesome/themes/catppuccin/titlebar/minimize_hover.svg create mode 100644 dot_config/awesome/themes/catppuccin/titlebar/ontop.svg create mode 100644 dot_config/awesome/themes/catppuccin/titlebar/unfocus.svg create mode 100644 dot_config/awesome/ui/info-panel/calendar.lua create mode 100644 dot_config/awesome/ui/info-panel/init.lua create mode 100644 dot_config/awesome/ui/info-panel/music-player.lua create mode 100644 dot_config/awesome/ui/info-panel/player.lua create mode 100644 dot_config/awesome/ui/info-panel/profile.lua create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-clear-night.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-clear-sky.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-clouds-night.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-clouds.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-few-clouds-night.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-few-clouds.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-fog.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-freezing-rain.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-overcast-symbolic.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-overcast.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-severe-alert.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-showers-scattered.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-showers.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-snow-rain.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-snow-scattered.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-snow.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-storm.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/icons/weather-windy.svg create mode 100644 dot_config/awesome/ui/info-panel/weather/init.lua create mode 100644 dot_config/awesome/ui/init.lua create mode 100644 dot_config/awesome/ui/notif-panel/init.lua create mode 100644 dot_config/awesome/ui/notif-panel/widgets/bri_slider.lua create mode 100644 dot_config/awesome/ui/notif-panel/widgets/mic_slider.lua create mode 100644 dot_config/awesome/ui/notif-panel/widgets/vol_slider.lua create mode 100644 dot_config/awesome/ui/popups/init.lua create mode 100644 dot_config/awesome/ui/popups/layout/init.lua create mode 100644 dot_config/awesome/ui/popups/notifications/error.lua create mode 100644 dot_config/awesome/ui/popups/notifications/init.lua create mode 100644 dot_config/awesome/ui/popups/notifications/playerctl.lua create mode 100644 dot_config/awesome/ui/popups/scratchpad/init.lua create mode 100644 dot_config/awesome/ui/popups/volume/init.lua create mode 100644 dot_config/awesome/ui/titlebar/init.lua create mode 100644 dot_config/awesome/ui/top-panel/config.lua create mode 100644 dot_config/awesome/ui/top-panel/init.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/clock.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/cpu.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/date.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/disk.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/init.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/launcher.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/mem.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/menu.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/power.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/promptbox.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/pulseaudio.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/seperator.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/systray.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/taglist.lua create mode 100644 dot_config/awesome/ui/top-panel/widgets/tasklist.lua create mode 100644 dot_config/bat/config create mode 100644 dot_config/btop/btop.conf create mode 100644 dot_config/cheat/conf.yml create mode 100644 dot_config/composer/composer.json create mode 100644 dot_config/composer/composer.lock create mode 100644 dot_config/dot_curlrc create mode 100644 dot_config/executable_dot_fehbg create mode 100644 dot_config/firefox/install.txt create mode 100644 dot_config/firefox/userChrome.css create mode 100644 dot_config/fish/completions/dotfiles.fish create mode 100644 dot_config/fish/completions/fisher.fish create mode 100644 dot_config/fish/completions/fzf_configure_bindings.fish create mode 100644 dot_config/fish/completions/pipx.fish create mode 100644 dot_config/fish/conf.d/00-init.fish create mode 100644 dot_config/fish/conf.d/10-starship.fish create mode 100644 dot_config/fish/conf.d/20-aliases.fish create mode 100644 dot_config/fish/conf.d/20-gpg.fish create mode 100644 dot_config/fish/conf.d/30-asdf.fish create mode 100644 dot_config/fish/conf.d/30-bat.fish create mode 100644 dot_config/fish/conf.d/30-chezmoi.fish create mode 100644 dot_config/fish/conf.d/30-eza.fish create mode 100644 dot_config/fish/conf.d/30-fzf.fish create mode 100644 dot_config/fish/conf.d/30-git.fish create mode 100644 dot_config/fish/conf.d/30-gtk.fish create mode 100644 dot_config/fish/conf.d/30-journalctl.fish create mode 100644 dot_config/fish/conf.d/30-lazygit.fish create mode 100644 dot_config/fish/conf.d/30-man.fish create mode 100644 dot_config/fish/conf.d/30-php.fish create mode 100644 dot_config/fish/conf.d/30-systemctl.fish create mode 100644 dot_config/fish/conf.d/30-volta.fish create mode 100644 dot_config/fish/conf.d/30-wget.fish create mode 100644 dot_config/fish/conf.d/30-yay.fish create mode 100644 dot_config/fish/conf.d/autopair.fish create mode 100644 dot_config/fish/conf.d/fzf.fish create mode 100644 dot_config/fish/config.fish create mode 100644 dot_config/fish/functions/$.fish create mode 100644 dot_config/fish/functions/_autopair_backspace.fish create mode 100644 dot_config/fish/functions/_autopair_insert_left.fish create mode 100644 dot_config/fish/functions/_autopair_insert_right.fish create mode 100644 dot_config/fish/functions/_autopair_insert_same.fish create mode 100644 dot_config/fish/functions/_autopair_tab.fish create mode 100644 dot_config/fish/functions/_fzf_configure_bindings_help.fish create mode 100644 dot_config/fish/functions/_fzf_extract_var_info.fish create mode 100644 dot_config/fish/functions/_fzf_preview_changed_file.fish create mode 100644 dot_config/fish/functions/_fzf_preview_file.fish create mode 100644 dot_config/fish/functions/_fzf_report_diff_type.fish create mode 100644 dot_config/fish/functions/_fzf_report_file_type.fish create mode 100644 dot_config/fish/functions/_fzf_search_directory.fish create mode 100644 dot_config/fish/functions/_fzf_search_git_log.fish create mode 100644 dot_config/fish/functions/_fzf_search_git_status.fish create mode 100644 dot_config/fish/functions/_fzf_search_history.fish create mode 100644 dot_config/fish/functions/_fzf_search_processes.fish create mode 100644 dot_config/fish/functions/_fzf_search_variables.fish create mode 100644 dot_config/fish/functions/_fzf_wrapper.fish create mode 100644 dot_config/fish/functions/cpkey.fish create mode 100644 dot_config/fish/functions/extract.fish create mode 100644 dot_config/fish/functions/fish_greeting.fish create mode 100644 dot_config/fish/functions/fisher.fish create mode 100644 dot_config/fish/functions/fm.fish create mode 100644 dot_config/fish/functions/fuck.fish create mode 100644 dot_config/fish/functions/fzf.fish create mode 100644 dot_config/fish/functions/fzf_configure_bindings.fish create mode 100644 dot_config/fish/functions/git_open.fish create mode 100644 dot_config/fish/functions/hack.fish create mode 100644 dot_config/fish/functions/open.fish create mode 100644 dot_config/fish/functions/pkgsearch.fish create mode 100644 dot_config/fish/functions/tmux_up.fish create mode 100644 dot_config/fish/functions/up.fish create mode 100644 dot_config/gh/config.yml create mode 100644 dot_config/git/config create mode 100644 dot_config/git/config.aliases create mode 100644 dot_config/git/config.delta-themes create mode 100644 dot_config/git/config.local.tmpl create mode 100644 dot_config/git/dot_gitattributes create mode 100644 dot_config/git/gitmojis create mode 100644 dot_config/git/hooks/executable_prepare-commit-msg create mode 100644 dot_config/glow/glow.yml create mode 100644 dot_config/gtk-3.0/bookmarks create mode 100644 dot_config/gtk-3.0/settings.ini create mode 100644 dot_config/gtk-4.0/symlink_assets create mode 100644 dot_config/gtk-4.0/symlink_gtk-dark.css create mode 100644 dot_config/gtk-4.0/symlink_gtk.css create mode 100644 dot_config/hyfetch.json create mode 100644 dot_config/lazygit/config.yml create mode 100644 dot_config/mopidy/mopidy.conf create mode 100644 dot_config/ncmpcpp/config create mode 100644 dot_config/neofetch/config.conf create mode 100644 dot_config/nvim/after/queries/html/injections.scm create mode 100644 dot_config/nvim/after/queries/php/indents.scm create mode 100644 dot_config/nvim/dot_neoconf.json create mode 100644 dot_config/nvim/init.lua create mode 100644 dot_config/nvim/lazyvim.json create mode 100644 dot_config/nvim/lua/config/autocmds.lua create mode 100644 dot_config/nvim/lua/config/keymaps.lua create mode 100644 dot_config/nvim/lua/config/lazy.lua create mode 100644 dot_config/nvim/lua/config/options.lua create mode 100644 dot_config/nvim/lua/config/tabset.lua create mode 100644 dot_config/nvim/lua/plugins/beacon.lua create mode 100644 dot_config/nvim/lua/plugins/chezmoi-vim.lua create mode 100644 dot_config/nvim/lua/plugins/conform.lua create mode 100644 dot_config/nvim/lua/plugins/cutlass.lua create mode 100644 dot_config/nvim/lua/plugins/diffview.lua create mode 100644 dot_config/nvim/lua/plugins/dim.lua create mode 100644 dot_config/nvim/lua/plugins/example.lua create mode 100644 dot_config/nvim/lua/plugins/gitsigns.lua create mode 100644 dot_config/nvim/lua/plugins/lazygit.lua create mode 100644 dot_config/nvim/lua/plugins/lazyvim.lua create mode 100644 dot_config/nvim/lua/plugins/luasnip.lua create mode 100644 dot_config/nvim/lua/plugins/mason-lspconfig.lua create mode 100644 dot_config/nvim/lua/plugins/mason.lua create mode 100644 dot_config/nvim/lua/plugins/neo-tree.lua create mode 100644 dot_config/nvim/lua/plugins/nerdy.lua create mode 100644 dot_config/nvim/lua/plugins/nvim-cmp.lua create mode 100644 dot_config/nvim/lua/plugins/nvim-devdocs.lua create mode 100644 dot_config/nvim/lua/plugins/nvim-emmet.lua create mode 100644 dot_config/nvim/lua/plugins/nvim-lint.lua create mode 100644 dot_config/nvim/lua/plugins/nvim-lspconfig.lua create mode 100644 dot_config/nvim/lua/plugins/nvim-treesitter.lua create mode 100644 dot_config/nvim/lua/plugins/refactoring.lua create mode 100644 dot_config/nvim/lua/plugins/ssr.lua create mode 100644 dot_config/nvim/lua/plugins/tabset.lua create mode 100644 dot_config/nvim/lua/plugins/treesj.lua create mode 100644 dot_config/nvim/lua/plugins/vim-blade.lua create mode 100644 dot_config/nvim/lua/plugins/vim-dotenv.lua create mode 100644 dot_config/nvim/lua/plugins/vim-gutentags.lua create mode 100644 dot_config/nvim/lua/plugins/vim-pkgbuild.lua create mode 100644 dot_config/nvim/lua/plugins/vim-tmux-navigator.lua create mode 100644 dot_config/nvim/lua/snippets/fish.lua create mode 100644 dot_config/nvim/lua/snippets/gitconfig.lua create mode 100644 dot_config/nvim/lua/snippets/helpers.lua create mode 100644 dot_config/nvim/lua/snippets/html.lua create mode 100644 dot_config/nvim/lua/snippets/lua.lua create mode 100644 dot_config/nvim/queries/blade/folds.scm create mode 100644 dot_config/nvim/queries/blade/highlights.scm create mode 100644 dot_config/nvim/queries/blade/injections.scm create mode 100644 dot_config/nvim/stylua.toml create mode 100644 dot_config/openrazer/persistence.conf create mode 100644 dot_config/openrazer/razer.conf create mode 100644 dot_config/packages/all create mode 100644 dot_config/picom.conf create mode 100644 dot_config/qalculate/qalc.cfg create mode 100644 dot_config/razercommander/macro_logic.json create mode 100644 dot_config/razercommander/profiles create mode 100644 dot_config/rofi/config.rasi create mode 100644 dot_config/starship.toml create mode 100644 dot_config/tmux/tmux.conf create mode 100644 dot_config/topgrade.d/00-misc.toml create mode 100644 dot_config/topgrade.d/01-commands.toml create mode 100644 dot_config/topgrade.d/10-brew.toml create mode 100644 dot_config/topgrade.d/10-composer.toml create mode 100644 dot_config/topgrade.d/10-firmware.toml create mode 100644 dot_config/topgrade.d/10-git.toml create mode 100644 dot_config/topgrade.d/10-linux.toml create mode 100644 dot_config/topgrade.d/10-npm.toml create mode 100644 dot_config/transmission/settings.json create mode 100644 dot_config/wezterm/wezterm.lua create mode 100644 dot_config/wgetrc create mode 100644 dot_config/yay/config.json create mode 100644 dot_config/zathura/zathurarc create mode 100644 dot_icons/default/index.theme create mode 100644 dot_plugin-versions create mode 100644 dot_screenlayout/executable_multihead.sh create mode 100644 dot_tool-versions create mode 100644 dot_xprofile create mode 100644 private_dot_bash_history create mode 100644 private_dot_gnupg/private_common.conf create mode 100644 private_dot_gnupg/private_gpg-agent.conf create mode 100644 tags diff --git a/.chezmoiexternals/awesomewm.toml b/.chezmoiexternals/awesomewm.toml new file mode 100644 index 0000000..1734502 --- /dev/null +++ b/.chezmoiexternals/awesomewm.toml @@ -0,0 +1,19 @@ +[".config/awesome/lib/bling"] +type = "git-repo" +url = "https://github.com/BlingCorp/bling.git" +refreshPeriod = "672h" + +[".config/awesome/lib/catppuccin"] +type = "git-repo" +url = "https://github.com/catppuccin/lua.git" +refreshPeriod = "672h" + +[".config/awesome/lib/layout-machi"] +type = "git-repo" +url = "https://github.com/xinhaoyuan/layout-machi.git" +refreshPeriod = "672h" + +[".config/awesome/lib/rubato"] +type = "git-repo" +url = "https://github.com/andOrlando/rubato.git" +refreshPeriod = "672h" diff --git a/.chezmoiexternals/bat.toml b/.chezmoiexternals/bat.toml new file mode 100644 index 0000000..cd7a84d --- /dev/null +++ b/.chezmoiexternals/bat.toml @@ -0,0 +1,19 @@ +[".config/bat/themes/Catppuccin-latte.tmTheme"] +type = "file" +url = "https://github.com/catppuccin/bat/raw/main/themes/Catppuccin%20Latte.tmTheme" +refreshPeriod = "672h" + +[".config/bat/themes/Catppuccin-frappe.tmTheme"] +type = "file" +url = "https://github.com/catppuccin/bat/raw/main/themes/Catppuccin%20Frappe.tmTheme" +refreshPeriod = "672h" + +[".config/bat/themes/Catppuccin-macchiato.tmTheme"] +type = "file" +url = "https://github.com/catppuccin/bat/raw/main/themes/Catppuccin%20Macchiato.tmTheme" +refreshPeriod = "672h" + +[".config/bat/themes/Catppuccin-mocha.tmTheme"] +type = "file" +url = "https://github.com/catppuccin/bat/raw/main/themes/Catppuccin%20Mocha.tmTheme" +refreshPeriod = "672h" diff --git a/.chezmoiexternals/btop.toml b/.chezmoiexternals/btop.toml new file mode 100644 index 0000000..1923de8 --- /dev/null +++ b/.chezmoiexternals/btop.toml @@ -0,0 +1,19 @@ +[".config/btop/themes/catppuccin_frappe.theme"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/btop/main/themes/catppuccin_frappe.theme" +refreshPeriod = "672h" + +[".config/btop/themes/catppuccin_latte.theme"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/btop/main/themes/catppuccin_latte.theme" +refreshPeriod = "672h" + +[".config/btop/themes/catppuccin_macchiato.theme"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/btop/main/themes/catppuccin_macchiato.theme" +refreshPeriod = "672h" + +[".config/btop/themes/catppuccin_mocha.theme"] +type = "file" +url = "https://github.com/catppuccin/btop/blob/main/themes/catppuccin_mocha.theme" +refreshPeriod = "672h" diff --git a/.chezmoiexternals/glow.toml b/.chezmoiexternals/glow.toml new file mode 100644 index 0000000..4b04fc7 --- /dev/null +++ b/.chezmoiexternals/glow.toml @@ -0,0 +1,19 @@ +[".config/glow/catppuccin/frappe.json"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/glamour/main/themes/catppuccin-frappe.json" +refreshPeriod = "672h" + +[".config/glow/catppuccin/latte.json"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/glamour/main/themes/catppuccin-latte.json" +refreshPeriod = "672h" + +[".config/glow/catppuccin/macchiato.json"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/glamour/main/themes/catppuccin-macchiato.json" +refreshPeriod = "672h" + +[".config/glow/catppuccin/mocha.json"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/glamour/main/themes/catppuccin-mocha.json" +refreshPeriod = "672h" diff --git a/.chezmoiexternals/lazygit.toml b/.chezmoiexternals/lazygit.toml new file mode 100644 index 0000000..ef9617c --- /dev/null +++ b/.chezmoiexternals/lazygit.toml @@ -0,0 +1,19 @@ +[".config/lazygit/catppuccin/frappe.yml"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/lazygit/main/themes-mergable/frappe/pink.yml" +refreshPeriod = "672h" + +[".config/lazygit/catppuccin/latte.yml"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/lazygit/main/themes-mergable/latte/pink.yml" +refreshPeriod = "672h" + +[".config/lazygit/catppuccin/macchiato.yml"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/lazygit/main/themes-mergable/macchiato/pink.yml" +refreshPeriod = "672h" + +[".config/lazygit/catppuccin/mocha.yml"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/lazygit/main/themes-mergable/mocha/pink.yml" +refreshPeriod = "672h" diff --git a/.chezmoiexternals/rofi.toml b/.chezmoiexternals/rofi.toml new file mode 100644 index 0000000..f5bd8f4 --- /dev/null +++ b/.chezmoiexternals/rofi.toml @@ -0,0 +1,19 @@ +[".local/share/rofi/themes/catppuccin-frappe.rasi"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/rofi/main/basic/.local/share/rofi/themes/catppuccin-frappe.rasi" +refreshPeriod = "672h" + +[".local/share/rofi/themes/catppuccin-latte.rasi"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/rofi/main/basic/.local/share/rofi/themes/catppuccin-latte.rasi" +refreshPeriod = "672h" + +[".local/share/rofi/themes/catppuccin-macchiato.rasi"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/rofi/main/basic/.local/share/rofi/themes/catppuccin-macchiato.rasi" +refreshPeriod = "672h" + +[".local/share/rofi/themes/catppuccin-mocha.rasi"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/rofi/main/basic/.local/share/rofi/themes/catppuccin-mocha.rasi" +refreshPeriod = "672h" diff --git a/.chezmoiexternals/zathura.toml b/.chezmoiexternals/zathura.toml new file mode 100644 index 0000000..8109143 --- /dev/null +++ b/.chezmoiexternals/zathura.toml @@ -0,0 +1,19 @@ +[".config/zathura/catppuccin-frappe"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/zathura/main/src/catppuccin-frappe" +refreshPeriod = "672h" + +[".config/zathura/catppuccin-latte"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/zathura/main/src/catppuccin-latte" +refreshPeriod = "672h" + +[".config/zathura/catppuccin-macchiato"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/zathura/main/src/catppuccin-macchiato" +refreshPeriod = "672h" + +[".config/zathura/catppuccin-mocha"] +type = "file" +url = "https://raw.githubusercontent.com/catppuccin/zathura/main/src/catppuccin-mocha" +refreshPeriod = "672h" diff --git a/dot_Xresources b/dot_Xresources new file mode 100644 index 0000000..85e866c --- /dev/null +++ b/dot_Xresources @@ -0,0 +1,38 @@ +*background: #24273A +*foreground: #CAD3F5 + +! black +*color0: #494D64 +*color8: #5B6078 + +! red +*color1: #ED8796 +*color9: #ED8796 + +! green +*color2: #A6DA95 +*color10: #A6DA95 + +! yellow +*color3: #EED49F +*color11: #EED49F + +! blue +*color4: #8AADF4 +*color12: #8AADF4 + +! magenta +*color5: #F5BDE6 +*color13: #F5BDE6 + +! cyan +*color6: #8BD5CA +*color14: #8BD5CA + +! white +*color7: #B8C0E0 +*color15: #A5ADCB + +! Make Rofi use fish shell +rofi.run-command: fish -c '{cmd}' +rofi.run-list-command: 'fish -c functions' diff --git a/dot_bash_logout b/dot_bash_logout new file mode 100644 index 0000000..0e4e4f1 --- /dev/null +++ b/dot_bash_logout @@ -0,0 +1,3 @@ +# +# ~/.bash_logout +# diff --git a/dot_bash_profile b/dot_bash_profile new file mode 100644 index 0000000..5545f00 --- /dev/null +++ b/dot_bash_profile @@ -0,0 +1,5 @@ +# +# ~/.bash_profile +# + +[[ -f ~/.bashrc ]] && . ~/.bashrc diff --git a/dot_bashrc b/dot_bashrc new file mode 100644 index 0000000..38c1b3e --- /dev/null +++ b/dot_bashrc @@ -0,0 +1,13 @@ +# +# ~/.bashrc +# + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +alias ls='ls --color=auto' +alias grep='grep --color=auto' +PS1='[\u@\h \W]\$ ' + +export EDITOR='nvim' +export VISUAL="$EDITOR" diff --git a/dot_config/awesome/config.lua b/dot_config/awesome/config.lua new file mode 100644 index 0000000..d054a6e --- /dev/null +++ b/dot_config/awesome/config.lua @@ -0,0 +1,102 @@ +local config_dir = require("gears.filesystem").get_configuration_dir() + +local M = {} + +M.keys = { + mod = "Mod4", + alt = "Mod1", +} + +M.apps = { + terminal = "wezterm", + launcher = "rofi -show drun", + browser = "firefox", + file_manager = "thunar", + editor = os.getenv("EDITOR") or "nvim", +} + +M.apps.start_editor = M.apps.terminal .. "-e" .. M.apps.editor +M.apps.music_player = M.apps.terminal .. "--class music -e ncmpcpp" + +M.theme = { + flavor = "macchiato", + accent1 = "pink", + accent2 = "rosewater", + -- wallpaper = config_dir .. "themes/catppuccin/buttons.png", + wallpaper = "~/data/photos/wallpaper/city.png", + pfp = config_dir .. "themes/catppuccin/assets/pfp.jpg", + icon_theme = "Papirus", + font = { + family = "FairiesevkaSans Nerd Font Propo", + size = "10", + }, +} + +M.icons = { + menu = "󰜬", + power = "", + restart = "", + sleep = "", + exit = "󰗼", + lock = "", + music = { + next = "󰒭", + prev = "󰒮", + pause = "󰏤", + play = "󰐊", + }, + tags = { + general = " ", + files = " ", + media = " ", + terminal = " ", + coding = " ", + misc = "󰍹 ", + }, + cal = "", + clock = "", + arr = { + r = "»", + l = "«", + }, + vol = { + on = "󰕾", + off = "󰖁", + low = "󰕿", + med = "󰖀", + high = "󰕾", + }, + mem = "󰍛", + cpu = "", + disk = "", +} + +M.widget = {} + +M.widget.clock = { + format = "%I:%M %p", +} + +M.widget.date = { + format = "%a %b %d", +} + +M.widget.weather = { + api_key = "e894c3e6c1a9d2217eee94791e845c96", + coordinates = { lat = "47.773140", lon = "-122.303660" }, + units = "imperial", +} + +M.widget.github = { + username = "punkfairie", +} + +M.widget.mic = { + name = "", +} + +M.widget.disk = { + name = "/dev/sdb3", +} + +return M diff --git a/dot_config/awesome/helpers/init.lua b/dot_config/awesome/helpers/init.lua new file mode 100644 index 0000000..35cc365 --- /dev/null +++ b/dot_config/awesome/helpers/init.lua @@ -0,0 +1,3 @@ +return { + ui = require("helpers.ui"), +} diff --git a/dot_config/awesome/helpers/ui.lua b/dot_config/awesome/helpers/ui.lua new file mode 100644 index 0000000..be852bf --- /dev/null +++ b/dot_config/awesome/helpers/ui.lua @@ -0,0 +1,188 @@ +local awful = require("awful") +local wibox = require("wibox") +local gshape = require("gears.shape") +local gmatrix = require("gears.matrix") +local beautiful = require("beautiful") + +local capi = { mouse = mouse } +local theme = beautiful.get() + +local ui = {} + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +---Set text color +---@param text string +---@param color string +---@return string +function ui.colorize_text(text, color) + return "" .. text .. "" +end + +---Change a font attribute +---@param attr string attribute(s) to add, e.g. "Bold 16" +---@param font? string base font to use, for use in the theme file itself +---@return string +function ui.set_font(attr, font) + font = font or theme.font + + return beautiful.get_merged_font(font, attr):to_string() +end + +---Create an icon widget +---@param i string the icon +---@param c string the icon's color +---@return table widget the widget +function ui.create_icon(i, c) + local widget = { + { + font = ui.set_font("12.5"), + text = " " .. i, + widget = wibox.widget.textbox, + }, + fg = c, + widget = wibox.container.background, + } + return widget +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +---Change cursor on hovering +---@param w any widget to change cursor on +---@param hover_cursor string cursor to change to +function ui.add_hover_cursor(w, hover_cursor) + local original_cursor = "left_ptr" + + w:connect_signal("mouse::enter", function() + local widget = capi.mouse.current_wibox + if widget then + widget.cursor = hover_cursor + end + end) + + w:connect_signal("mouse::leave", function() + local widget = capi.mouse.current_wibox + if widget then + widget.cursor = original_cursor + end + end) +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +function ui.vertical_pad(height) + return wibox.widget({ + forced_height = height, + layout = wibox.layout.fixed.vertical, + }) +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +function ui.horizontal_pad(width) + return wibox.widget({ + forced_width = width, + layout = wibox.layout.fixed.horizontal, + }) +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +function ui.rrect(radius) + return function(cr, width, height) + gshape.rounded_rect(cr, width, height, radius) + end +end + +function ui.pie(width, height, start_angle, end_angle, radius) + return function(cr) + gshape.pie(cr, width, height, start_angle, end_angle, radius) + end +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +function ui.prgram(height, base) + return function(cr, width) + gshape.parallelogram(cr, width, height, base) + end +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +function ui.prrect(radius, tl, tr, br, bl) + return function(cr, width, height) + gshape.partially_rounded_rect(cr, width, height, tl, tr, br, bl, radius) + end +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +function ui.custom_shape(cr, width, height) + cr:move_to(0, height / 25) + cr:line_to(height / 25, 0) + cr:line_to(width, 0) + cr:line_to(width, height - height / 25) + cr:line_to(width - height / 25, height) + cr:line_to(0, height) + cr:close_path() +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +local function _get_widget_geometry(_hierarchy, widget) + local width, height = _hierarchy:get_size() + if _hierarchy:get_widget() == widget then + -- Get the extents of this widget in the device space + local x, y, w, h = gmatrix.transform_rectangle(_hierarchy:get_matrix_to_device(), 0, 0, width, height) + return { x = x, y = y, width = w, height = h, hierarchy = _hierarchy } + end + + for _, child in ipairs(_hierarchy:get_children()) do + local ret = _get_widget_geometry(child, widget) + if ret then + return ret + end + end +end + +function ui.get_widget_geometry(_wibox, widget) + return _get_widget_geometry(_wibox._drawable._widget_hierarchy, widget) +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +function ui.screen_mask(s, bg) + local mask = wibox({ + visible = false, + ontop = true, + type = "splash", + screen = s, + }) + awful.placement.maximize(mask) + mask.bg = bg + return mask +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +function ui.grouping_widget(w1, w2, dpi1) + local container = wibox.widget({ + w1, + { + nil, + w2, + expand = "none", + layout = wibox.layout.flex.vertical, + }, + spacing = dpi1, + layout = wibox.layout.fixed.horizontal, + }) + + return container +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +return ui diff --git a/dot_config/awesome/lib/animation/init.lua b/dot_config/awesome/lib/animation/init.lua new file mode 100644 index 0000000..fd1500a --- /dev/null +++ b/dot_config/awesome/lib/animation/init.lua @@ -0,0 +1,225 @@ +------------------------------------------- +-- @author https://github.com/Kasper24 +-- @copyright 2021-2022 Kasper24 +------------------------------------------- + +local GLib = require("lgi").GLib +local gobject = require("gears.object") +local gtable = require("gears.table") +local subscribable = require("lib.animation.subscribable") +local tween = require("lib.animation.tween") +local ipairs = ipairs +local table = table +local pairs = pairs + +local animation_manager = {} +animation_manager.easing = { + linear = "linear", + inQuad = "inQuad", + outQuad = "outQuad", + inOutQuad = "inOutQuad", + outInQuad = "outInQuad", + inCubic = "inCubic", + outCubic = "outCubic", + inOutCubic = "inOutCubic", + outInCubic = "outInCubic", + inQuart = "inQuart", + outQuart = "outQuart", + inOutQuart = "inOutQuart", + outInQuart = "outInQuart", + inQuint = "inQuint", + outQuint = "outQuint", + inOutQuint = "inOutQuint", + outInQuint = "outInQuint", + inSine = "inSine", + outSine = "outSine", + inOutSine = "inOutSine", + outInSine = "outInSine", + inExpo = "inExpo", + outExpo = "outExpo", + inOutExpo = "inOutExpo", + outInExpo = "outInExpo", + inCirc = "inCirc", + outCirc = "outCirc", + inOutCirc = "inOutCirc", + outInCirc = "outInCirc", + inElastic = "inElastic", + outElastic = "outElastic", + inOutElastic = "inOutElastic", + outInElastic = "outInElastic", + inBack = "inBack", + outBack = "outBack", + inOutBack = "inOutBack", + outInBack = "outInBack", + inBounce = "inBounce", + outBounce = "outBounce", + inOutBounce = "inOutBounce", + outInBounce = "outInBounce", +} + +local animation = {} + +local instance = nil + +local ANIMATION_FRAME_DELAY = 5 + +local function second_to_micro(sec) + return sec * 1000000 +end + +function animation:start(args) + args = args or {} + + -- Awestoer/Rubbto compatibility + -- I'd rather this always be a table, but Awestoer/Rubbto + -- except the :set() method to have 1 number value parameter + -- used to set the target + local is_table = type(args) == "table" + local initial = is_table and (args.pos or self.pos) or self.pos + local subject = is_table and (args.subject or self.subject) or self.subject + local target = is_table and (args.target or self.target) or args + local duration = is_table and (args.duration or self.duration) or self.duration + local easing = is_table and (args.easing or self.easing) or self.easing + + duration = self._private.anim_manager._private.instant == true and 0.01 or duration + + if self.tween == nil or self.reset_on_stop == true then + self.tween = tween.new({ + initial = initial, + subject = subject, + target = target, + duration = second_to_micro(duration), + easing = easing, + }) + end + + if self._private.anim_manager._private.animations[self.index] == nil then + table.insert(self._private.anim_manager._private.animations, self) + end + + self.state = true + self.last_elapsed = GLib.get_monotonic_time() + + self.started:fire() + self:emit_signal("started") +end + +function animation:set(args) + self:start(args) + self:emit_signal("set") +end + +function animation:stop() + self.state = false + self:emit_signal("stopped") +end + +function animation:abort() + animation:stop() + self:emit_signal("aborted") +end + +function animation:initial() + return self._private.initial +end + +function animation_manager:set_instant(value) + self._private.instant = value +end + +function animation_manager:new(args) + args = args or {} + + args.pos = args.pos or 0 + args.subject = args.subject or nil + args.target = args.target or nil + args.duration = args.duration or 0 + args.easing = args.easing or nil + args.loop = args.loop or false + args.signals = args.signals or {} + args.update = args.update or nil + args.reset_on_stop = args.reset_on_stop == nil and true or args.reset_on_stop + + -- Awestoer/Rubbto compatibility + args.subscribed = args.subscribed or nil + local ret = subscribable() + ret.started = subscribable() + ret.ended = subscribable() + if args.subscribed ~= nil then + ret:subscribe(args.subscribed) + end + + for sig, sigfun in pairs(args.signals) do + ret:connect_signal(sig, sigfun) + end + if args.update ~= nil then + ret:connect_signal("update", args.update) + end + + gtable.crush(ret, args, true) + gtable.crush(ret, animation, true) + + ret._private = {} + ret._private.anim_manager = self + ret._private.initial = args.pos + + return ret +end + +local function new() + local ret = gobject({}) + gtable.crush(ret, animation_manager, true) + + ret._private = {} + ret._private.animations = {} + ret._private.instant = false + + GLib.timeout_add(GLib.PRIORITY_DEFAULT, ANIMATION_FRAME_DELAY, function() + ---@diagnostic disable-next-line: redefined-local + for index, animation in ipairs(ret._private.animations) do + if animation.state == true then + -- compute delta time + local time = GLib.get_monotonic_time() + local delta = time - animation.last_elapsed + animation.last_elapsed = time + + -- If pos is true, the animation has ended + local pos = animation.tween:update(delta) + if pos == true then + -- Loop the animation, don't end it. + -- Useful for widgets like the spinning cicle + if animation.loop == true then + animation.tween:reset() + else + -- Snap to end + animation.pos = animation.tween.target + animation:fire(animation.pos) + animation:emit_signal("update", animation.pos) + + animation.state = false + animation.ended:fire(pos) + table.remove(ret._private.animations, index) + animation:emit_signal("ended", animation.pos) + end + -- Animation in process, keep updating + else + animation.pos = pos + animation:fire(animation.pos) + animation:emit_signal("update", animation.pos) + end + else + table.remove(ret._private.animations, index) + end + end + + -- call again the function after cooldown + return true + end) + + return ret +end + +if not instance then + instance = new() +end +return instance diff --git a/dot_config/awesome/lib/animation/subscribable.lua b/dot_config/awesome/lib/animation/subscribable.lua new file mode 100644 index 0000000..f8cf1a0 --- /dev/null +++ b/dot_config/awesome/lib/animation/subscribable.lua @@ -0,0 +1,47 @@ +------------------------------------------- +-- @author https://github.com/Kasper24 +-- @copyright 2021-2022 Kasper24 +------------------------------------------- + +local gobject = require("gears.object") + +-- Kidna copying awesotre's stores on a surface level for added compatibility +local function subscribable() + local ret = gobject({}) + local subscribed = {} + + -- Subscrubes a function to the object so that it's called when `fire` is + -- Calls subscribe_callback if it exists as well + function ret:subscribe(func) + local id = tostring(func):gsub("function: ", "") + subscribed[id] = func + + if self.subscribe_callback then + self.subscribe_callback(func) + end + end + + -- Unsubscribes a function and calls unsubscribe_callback if it exists + function ret:unsubscribe(func) + if not func then + subscribed = {} + else + local id = tostring(func):gsub("function: ", "") + subscribed[id] = nil + end + + if self.unsubscribe_callback then + self.unsubscribe_callback(func) + end + end + + function ret:fire(...) + for _, func in pairs(subscribed) do + func(...) + end + end + + return ret +end + +return subscribable diff --git a/dot_config/awesome/lib/animation/tween.lua b/dot_config/awesome/lib/animation/tween.lua new file mode 100644 index 0000000..aa9a564 --- /dev/null +++ b/dot_config/awesome/lib/animation/tween.lua @@ -0,0 +1,533 @@ +------------------------------------------- +-- @author https://github.com/Kasper24 +-- @copyright 2021-2022 Kasper24 +------------------------------------------- + +-- easing + +-- Adapted from https://github.com/EmmanuelOga/easing. See LICENSE.txt for credits. +-- For all easing functions: +-- t = time == how much time has to pass for the tweening to complete +-- b = begin == starting property value +-- c = change == ending - beginning +-- d = duration == running time. How much time has passed *right now* + +local gobject = require("gears.object") +local gtable = require("gears.table") + +local tween = { + _VERSION = "tween 2.1.1", + _DESCRIPTION = "tweening for lua", + _URL = "https://github.com/kikito/tween.lua", + _LICENSE = [[ + MIT LICENSE + Copyright (c) 2014 Enrique García Cota, Yuichi Tateno, Emmanuel Oga + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ]], +} + +local sin, cos, pi, sqrt, abs, asin = math.sin, math.cos, math.pi, math.sqrt, math.abs, math.asin + +-- linear +local function linear(t, b, c, d) + return c * t / d + b +end + +-- quad +local function inQuad(t, b, c, d) + return c * ((t / d) ^ 2) + b +end +local function outQuad(t, b, c, d) + t = t / d + return -c * t * (t - 2) + b +end +local function inOutQuad(t, b, c, d) + t = t / d * 2 + if t < 1 then + return c / 2 * (t ^ 2) + b + end + return -c / 2 * ((t - 1) * (t - 3) - 1) + b +end +local function outInQuad(t, b, c, d) + if t < d / 2 then + return outQuad(t * 2, b, c / 2, d) + end + return inQuad((t * 2) - d, b + c / 2, c / 2, d) +end + +-- cubic +local function inCubic(t, b, c, d) + return c * ((t / d) ^ 3) + b +end +local function outCubic(t, b, c, d) + return c * (((t / d - 1) ^ 3) + 1) + b +end +local function inOutCubic(t, b, c, d) + t = t / d * 2 + if t < 1 then + return c / 2 * t * t * t + b + end + t = t - 2 + return c / 2 * (t * t * t + 2) + b +end +local function outInCubic(t, b, c, d) + if t < d / 2 then + return outCubic(t * 2, b, c / 2, d) + end + return inCubic((t * 2) - d, b + c / 2, c / 2, d) +end + +-- quart +local function inQuart(t, b, c, d) + return c * ((t / d) ^ 4) + b +end +local function outQuart(t, b, c, d) + return -c * (((t / d - 1) ^ 4) - 1) + b +end +local function inOutQuart(t, b, c, d) + t = t / d * 2 + if t < 1 then + return c / 2 * (t ^ 4) + b + end + return -c / 2 * (((t - 2) ^ 4) - 2) + b +end +local function outInQuart(t, b, c, d) + if t < d / 2 then + return outQuart(t * 2, b, c / 2, d) + end + return inQuart((t * 2) - d, b + c / 2, c / 2, d) +end + +-- quint +local function inQuint(t, b, c, d) + return c * ((t / d) ^ 5) + b +end +local function outQuint(t, b, c, d) + return c * (((t / d - 1) ^ 5) + 1) + b +end +local function inOutQuint(t, b, c, d) + t = t / d * 2 + if t < 1 then + return c / 2 * (t ^ 5) + b + end + return c / 2 * (((t - 2) ^ 5) + 2) + b +end +local function outInQuint(t, b, c, d) + if t < d / 2 then + return outQuint(t * 2, b, c / 2, d) + end + return inQuint((t * 2) - d, b + c / 2, c / 2, d) +end + +-- sine +local function inSine(t, b, c, d) + return -c * cos(t / d * (pi / 2)) + c + b +end +local function outSine(t, b, c, d) + return c * sin(t / d * (pi / 2)) + b +end +local function inOutSine(t, b, c, d) + return -c / 2 * (cos(pi * t / d) - 1) + b +end +local function outInSine(t, b, c, d) + if t < d / 2 then + return outSine(t * 2, b, c / 2, d) + end + return inSine((t * 2) - d, b + c / 2, c / 2, d) +end + +-- expo +local function inExpo(t, b, c, d) + if t == 0 then + return b + end + return c * (2 ^ (10 * (t / d - 1))) + b - c * 0.001 +end +local function outExpo(t, b, c, d) + if t == d then + return b + c + end + return c * 1.001 * (-(2 ^ (-10 * t / d)) + 1) + b +end +local function inOutExpo(t, b, c, d) + if t == 0 then + return b + end + if t == d then + return b + c + end + t = t / d * 2 + if t < 1 then + return c / 2 * (2 ^ (10 * (t - 1))) + b - c * 0.0005 + end + return c / 2 * 1.0005 * (-(2 ^ (-10 * (t - 1))) + 2) + b +end +local function outInExpo(t, b, c, d) + if t < d / 2 then + return outExpo(t * 2, b, c / 2, d) + end + return inExpo((t * 2) - d, b + c / 2, c / 2, d) +end + +-- circ +local function inCirc(t, b, c, d) + return (-c * (sqrt(1 - ((t / d) ^ 2)) - 1) + b) +end +local function outCirc(t, b, c, d) + return (c * sqrt(1 - ((t / d - 1) ^ 2)) + b) +end +local function inOutCirc(t, b, c, d) + t = t / d * 2 + if t < 1 then + return -c / 2 * (sqrt(1 - t * t) - 1) + b + end + t = t - 2 + return c / 2 * (sqrt(1 - t * t) + 1) + b +end +local function outInCirc(t, b, c, d) + if t < d / 2 then + return outCirc(t * 2, b, c / 2, d) + end + return inCirc((t * 2) - d, b + c / 2, c / 2, d) +end + +-- elastic +local function calculatePAS(p, a, c, d) + p, a = p or d * 0.3, a or 0 + if a < abs(c) then + return p, c, p / 4 + end -- p, a, s + return p, a, p / (2 * pi) * asin(c / a) -- p,a,s +end +local function inElastic(t, b, c, d, a, p) + local s + if t == 0 then + return b + end + t = t / d + if t == 1 then + return b + c + end + p, a, s = calculatePAS(p, a, c, d) + t = t - 1 + return -(a * (2 ^ (10 * t)) * sin((t * d - s) * (2 * pi) / p)) + b +end +local function outElastic(t, b, c, d, a, p) + local s + if t == 0 then + return b + end + t = t / d + if t == 1 then + return b + c + end + p, a, s = calculatePAS(p, a, c, d) + return a * (2 ^ (-10 * t)) * sin((t * d - s) * (2 * pi) / p) + c + b +end +local function inOutElastic(t, b, c, d, a, p) + local s + if t == 0 then + return b + end + t = t / d * 2 + if t == 2 then + return b + c + end + p, a, s = calculatePAS(p, a, c, d) + t = t - 1 + if t < 0 then + return -0.5 * (a * (2 ^ (10 * t)) * sin((t * d - s) * (2 * pi) / p)) + b + end + return a * (2 ^ (-10 * t)) * sin((t * d - s) * (2 * pi) / p) * 0.5 + c + b +end +local function outInElastic(t, b, c, d, a, p) + if t < d / 2 then + return outElastic(t * 2, b, c / 2, d, a, p) + end + return inElastic((t * 2) - d, b + c / 2, c / 2, d, a, p) +end + +-- back +local function inBack(t, b, c, d, s) + s = s or 1.70158 + t = t / d + return c * t * t * ((s + 1) * t - s) + b +end +local function outBack(t, b, c, d, s) + s = s or 1.70158 + t = t / d - 1 + return c * (t * t * ((s + 1) * t + s) + 1) + b +end +local function inOutBack(t, b, c, d, s) + s = (s or 1.70158) * 1.525 + t = t / d * 2 + if t < 1 then + return c / 2 * (t * t * ((s + 1) * t - s)) + b + end + t = t - 2 + return c / 2 * (t * t * ((s + 1) * t + s) + 2) + b +end +local function outInBack(t, b, c, d, s) + if t < d / 2 then + return outBack(t * 2, b, c / 2, d, s) + end + return inBack((t * 2) - d, b + c / 2, c / 2, d, s) +end + +-- bounce +local function outBounce(t, b, c, d) + t = t / d + if t < 1 / 2.75 then + return c * (7.5625 * t * t) + b + end + if t < 2 / 2.75 then + t = t - (1.5 / 2.75) + return c * (7.5625 * t * t + 0.75) + b + elseif t < 2.5 / 2.75 then + t = t - (2.25 / 2.75) + return c * (7.5625 * t * t + 0.9375) + b + end + t = t - (2.625 / 2.75) + return c * (7.5625 * t * t + 0.984375) + b +end +local function inBounce(t, b, c, d) + return c - outBounce(d - t, 0, c, d) + b +end +local function inOutBounce(t, b, c, d) + if t < d / 2 then + return inBounce(t * 2, 0, c, d) * 0.5 + b + end + return outBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b +end +local function outInBounce(t, b, c, d) + if t < d / 2 then + return outBounce(t * 2, b, c / 2, d) + end + return inBounce((t * 2) - d, b + c / 2, c / 2, d) +end + +tween.easing = { + linear = linear, + inQuad = inQuad, + outQuad = outQuad, + inOutQuad = inOutQuad, + outInQuad = outInQuad, + inCubic = inCubic, + outCubic = outCubic, + inOutCubic = inOutCubic, + outInCubic = outInCubic, + inQuart = inQuart, + outQuart = outQuart, + inOutQuart = inOutQuart, + outInQuart = outInQuart, + inQuint = inQuint, + outQuint = outQuint, + inOutQuint = inOutQuint, + outInQuint = outInQuint, + inSine = inSine, + outSine = outSine, + inOutSine = inOutSine, + outInSine = outInSine, + inExpo = inExpo, + outExpo = outExpo, + inOutExpo = inOutExpo, + outInExpo = outInExpo, + inCirc = inCirc, + outCirc = outCirc, + inOutCirc = inOutCirc, + outInCirc = outInCirc, + inElastic = inElastic, + outElastic = outElastic, + inOutElastic = inOutElastic, + outInElastic = outInElastic, + inBack = inBack, + outBack = outBack, + inOutBack = inOutBack, + outInBack = outInBack, + inBounce = inBounce, + outBounce = outBounce, + inOutBounce = inOutBounce, + outInBounce = outInBounce, +} + +-- Private interface +local function copyTables(destination, keysTable, valuesTable) + valuesTable = valuesTable or keysTable + local mt = getmetatable(keysTable) + if mt and getmetatable(destination) == nil then + setmetatable(destination, mt) + end + + for k, v in pairs(keysTable) do + if type(v) == "table" then + destination[k] = copyTables({}, v, valuesTable[k]) + else + destination[k] = valuesTable[k] + end + end + return destination +end + +local function checkSubjectAndTargetRecursively(subject, target, path) + path = path or {} + local targetType, newPath + for k, targetValue in pairs(target) do + targetType, newPath = type(targetValue), copyTables({}, path) + table.insert(newPath, tostring(k)) + if targetType == "number" then + assert( + type(subject[k]) == "number", + "Parameter '" .. table.concat(newPath, "/") .. "' is missing from subject or isn't a number" + ) + elseif targetType == "table" then + checkSubjectAndTargetRecursively(subject[k], targetValue, newPath) + else + assert( + targetType == "number", + "Parameter '" .. table.concat(newPath, "/") .. "' must be a number or table of numbers" + ) + end + end +end + +local function checkNewParams(_, _, subject, target, easing) + -- assert(type(initial) == 'number' and duration > 0, "duration must be a positive number. Was " .. tostring(duration)) + -- assert(type(duration) == 'number' and duration > 0, "duration must be a positive number. Was " .. tostring(duration)) + assert(type(easing) == "function", "easing must be a function. Was " .. tostring(easing)) + + if subject and target then + local tsubject = type(subject) + assert( + tsubject == "table" or tsubject == "userdata", + "subject must be a table or userdata. Was " .. tostring(subject) + ) + assert(type(target) == "table", "target must be a table. Was " .. tostring(target)) + checkSubjectAndTargetRecursively(subject, target) + end +end + +local function getEasingFunction(easing) + easing = easing or "linear" + if type(easing) == "string" then + local name = easing + easing = tween.easing[name] + if type(easing) ~= "function" then + error("The easing function name '" .. name .. "' is invalid") + end + end + return easing +end + +local function performEasingOnSubject(subject, target, initial, clock, duration, easing) + local t, b, c, d + for k, v in pairs(target) do + if type(v) == "table" then + performEasingOnSubject(subject[k], v, initial[k], clock, duration, easing) + else + t, b, c, d = clock, initial[k], v - initial[k], duration + subject[k] = easing(t, b, c, d) + end + end +end + +local function performEasing(table, initial, target, clock, duration, easing) + if type(target) == "table" then + local t, b, c, d + for k, v in pairs(target) do + if type(v) == "table" then + table[k] = {} + performEasing(table[k], initial[k], v, clock, duration, easing) + else + t, b, c, d = clock, initial[k], v - initial[k], duration + table[k] = easing(t, b, c, d) + end + end + + return table + else + local t, b, c, d = clock, initial, target - initial, duration + return easing(t, b, c, d) + end +end + +-- Public interface +local Tween = {} + +function Tween:set(clock) + assert(type(clock) == "number", "clock must be a positive number or 0") + + if self.subject and self.initial == 0 then + self.initial = copyTables({}, self.target, self.subject) + end + + self.clock = clock + + if self.clock <= 0 then + self.clock = 0 + if self.subject then + copyTables(self.subject, self.initial) + end + elseif self.clock >= self.duration then -- the tween has expired + self.clock = self.duration + + if self.subject then + copyTables(self.subject, self.target) + end + else + if self.subject then + performEasingOnSubject(self.subject, self.target, self.initial, self.clock, self.duration, self.easing) + else + local pos = {} + return performEasing(pos, self.initial, self.target, self.clock, self.duration, self.easing) + end + end + + return self.clock >= self.duration +end + +function Tween:update(dt) + assert(type(dt) == "number", "dt must be a number") + return self:set(self.clock + dt) +end + +function Tween:reset() + return self:set(0) +end + +function tween.new(args) + args = args or {} + + args.initial = args.initial or 0 + args.subject = args.subject or nil + args.target = args.target or nil + args.duration = args.duration or 0 + args.easing = args.easing or nil + + args.easing = getEasingFunction(args.easing) + checkNewParams(args.initial, args.duration, args.subject, args.target, args.easing) + + local ret = gobject({}) + ret.clock = 0 + + gtable.crush(ret, args, true) + gtable.crush(ret, Tween, true) + + return ret +end + +return tween diff --git a/dot_config/awesome/lib/better-resize.lua b/dot_config/awesome/lib/better-resize.lua new file mode 100644 index 0000000..b3ac9ad --- /dev/null +++ b/dot_config/awesome/lib/better-resize.lua @@ -0,0 +1,138 @@ +local capi = { + client = client, + mouse = mouse, + screen = screen, + mousegrabber = mousegrabber, +} +local awful = require("awful") + +local function mouse_resize_handler(m, c) + awful.client.incwfact(0, c) -- needed to fix normalization at start + local start = m(capi.mouse.coords()) + local x, y = start.x, start.y + local wa = m(c.screen.workarea) + local idx = awful.client.idx(c) + local c_above + local idx_above, idx_below + local wfact_above, wfact_below + local jump_to = { x = x, y = y } + local move_mwfact = false + + do + local g = m(c:geometry()) + + local v_border = 0.2 * g.height + + if idx and idx.idx > 1 and y >= g.y and y <= g.y + v_border then + -- we are near the top edge of the window + c_above = awful.client.next(-1, c) + C_BELOW = c + jump_to.y = g.y + idx_above = idx.idx - 1 + idx_below = idx.idx + elseif idx and idx.idx < idx.num and y >= g.y + g.height - v_border then + -- we are near the bottom edge of the window + c_above = c + C_BELOW = awful.client.next(1, c) + idx_above = idx.idx + idx_below = idx.idx + 1 + jump_to.y = g.y + g.height + end + + local mw_split = wa.x + wa.width * c.screen.selected_tag.master_width_factor + + if math.abs(mw_split - x) > wa.width / 6 then + move_mwfact = false + else + move_mwfact = true + jump_to.x = mw_split + end + end + + if idx and idx_above then + local t = c.screen.selected_tag + local data = t.windowfact or {} + local colfact = data[idx.col] or {} + wfact_above = colfact[idx_above] or 1 + wfact_below = colfact[idx_below] or 1 + end + + if idx_above and move_mwfact then + CURSOR = "cross" + elseif idx_above then + CURSOR = m({ y = "sb_v_double_arrow", x = "sb_h_double_arrow" }).y + elseif move_mwfact then + CURSOR = m({ y = "sb_v_double_arrow", x = "sb_h_double_arrow" }).x + else + return false + end + + capi.mouse.coords(m(jump_to)) + + capi.mousegrabber.run(function(_mouse) + if not c.valid then + return false + end + + local pressed = false + for _, v in ipairs(_mouse.buttons) do + if v then + pressed = true + break + end + end + + _mouse = m(_mouse) + + if pressed then + if move_mwfact then + c.screen.selected_tag.master_width_factor = math.min(math.max((_mouse.x - wa.x) / wa.width, 0.01), 0.99) + end + + if idx and idx_above then + local factor_delta = (_mouse.y - jump_to.y) / wa.height + + if factor_delta < 0 then + factor_delta = math.max(factor_delta, -(wfact_above - 0.05)) + else + factor_delta = math.min(factor_delta, wfact_below - 0.05) + end + + local t = c.screen.selected_tag + local data = t.windowfact or {} + local colfact = data[idx.col] or {} + colfact[idx_above] = wfact_above + factor_delta + colfact[idx_below] = wfact_below - factor_delta + awful.client.incwfact(0, c_above) -- just in case + end + return true + else + return false + end + end, CURSOR) + + return true +end + +awful.layout.suit.tile.mouse_resize_handler = function(c) + return mouse_resize_handler(function(x) + return x + end, c) +end +---@diagnostic disable-next-line: duplicate-set-field +awful.layout.suit.tile.bottom.mouse_resize_handler = function(c) + return mouse_resize_handler(function(q) + return { x = q.y, y = q.x, width = q.height, height = q.width } + end, c) +end + +-- local old_coords = mouse.coords + +-- mouse.coords = function(...) +-- if select(1, ...) and not(select(1, ...).blah) then +-- print("set mouse!!!") +-- print(debug.traceback()) + +-- end +-- return old_coords(...) +-- end diff --git a/dot_config/awesome/lib/exit-screen.lua b/dot_config/awesome/lib/exit-screen.lua new file mode 100644 index 0000000..429d793 --- /dev/null +++ b/dot_config/awesome/lib/exit-screen.lua @@ -0,0 +1,186 @@ +local awful = require("awful") +local gears = require("gears") +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers") +local config = require("config") + +local dpi = beautiful.xresources.apply_dpi +local theme = beautiful.get() + +--- Minimalist Exit Screen +--- ~~~~~~~~~~~~~~~~~~~~~~ + +--- Icons +local icon_font = helpers.ui.set_font("bold 45") +local poweroff_text_icon = config.icons.power +local reboot_text_icon = config.icons.restart +local suspend_text_icon = config.icons.sleep +local exit_text_icon = config.icons.exit +local lock_text_icon = config.icons.lock + +local button_bg = theme.color.base +local button_size = dpi(120) + +--- Commands +local poweroff_command = function() + awful.spawn.with_shell("systemctl poweroff") + awesome.emit_signal("module::exit_screen:hide") +end + +local reboot_command = function() + awful.spawn.with_shell("systemctl reboot") + awesome.emit_signal("module::exit_screen:hide") +end + +local suspend_command = function() + awesome.emit_signal("module::exit_screen:hide") + awful.spawn.with_shell("systemctl suspend") +end + +local exit_command = function() + awesome.quit() +end + +local lock_command = function() + awesome.emit_signal("module::exit_screen:hide") +end + +local create_button = function(symbol, hover_color, _, command) + local icon = wibox.widget({ + forced_height = button_size, + forced_width = button_size, + halign = "center", + valign = "center", + font = icon_font, + markup = helpers.ui.colorize_text(symbol, theme.color.surface0), + widget = wibox.widget.textbox(), + }) + + local button = wibox.widget({ + { + nil, + icon, + expand = "none", + layout = wibox.layout.align.horizontal, + }, + forced_height = button_size, + forced_width = button_size, + border_width = dpi(8), + border_color = theme.color.surface0, + shape = helpers.ui.rrect(theme.border_width * 2), + bg = button_bg, + widget = wibox.container.background, + }) + + button:buttons(gears.table.join(awful.button({}, 1, function() + command() + end))) + + button:connect_signal("mouse::enter", function() + icon.markup = helpers.ui.colorize_text(icon.text, hover_color) + button.border_color = hover_color + end) + button:connect_signal("mouse::leave", function() + icon.markup = helpers.ui.colorize_text(icon.text, theme.color.surface0) + button.border_color = theme.color.surface0 + end) + + helpers.ui.add_hover_cursor(button, "hand1") + + return button +end + +--- Create the buttons +local poweroff = create_button(poweroff_text_icon, theme.color.red, "Poweroff", poweroff_command) +local reboot = create_button(reboot_text_icon, theme.color.green, "Reboot", reboot_command) +local suspend = create_button(suspend_text_icon, theme.color.peach, "Suspend", suspend_command) +local exit = create_button(exit_text_icon, theme.color.blue, "Exit", exit_command) +local lock = create_button(lock_text_icon, theme.color.pink, "Lock", lock_command) + +local create_exit_screen = function(s) + s.exit_screen = wibox({ + screen = s, + type = "splash", + visible = false, + ontop = true, + bg = theme.color.transparent, + fg = theme.fg_normal, + height = s.geometry.height, + width = s.geometry.width, + x = s.geometry.x, + y = s.geometry.y, + }) + + s.exit_screen:buttons(gears.table.join( + awful.button({}, 2, function() + awesome.emit_signal("module::exit_screen:hide") + end), + awful.button({}, 3, function() + awesome.emit_signal("module::exit_screen:hide") + end) + )) + + s.exit_screen:setup({ + nil, + { + nil, + { + poweroff, + reboot, + suspend, + exit, + lock, + spacing = dpi(50), + layout = wibox.layout.fixed.horizontal, + }, + expand = "none", + layout = wibox.layout.align.horizontal, + }, + expand = "none", + layout = wibox.layout.align.vertical, + }) +end + +screen.connect_signal("request::desktop_decoration", function(s) + create_exit_screen(s) +end) + +screen.connect_signal("removed", function(s) + create_exit_screen(s) +end) + +local exit_screen_grabber = awful.keygrabber({ + auto_start = true, + stop_event = "release", + keypressed_callback = function(_, _, key, _) + if key == "s" then + suspend_command() + elseif key == "e" then + exit_command() + elseif key == "l" then + lock_command() + elseif key == "p" then + poweroff_command() + elseif key == "r" then + reboot_command() + elseif key == "Escape" or key == "q" or key == "x" then + awesome.emit_signal("module::exit_screen:hide") + end + end, +}) + +awesome.connect_signal("module::exit_screen:show", function() + for s in screen do + s.exit_screen.visible = false + end + awful.screen.focused().exit_screen.visible = true + exit_screen_grabber:start() +end) + +awesome.connect_signal("module::exit_screen:hide", function() + exit_screen_grabber:stop() + for s in screen do + s.exit_screen.visible = false + end +end) diff --git a/dot_config/awesome/lib/init.lua b/dot_config/awesome/lib/init.lua new file mode 100644 index 0000000..d4efccb --- /dev/null +++ b/dot_config/awesome/lib/init.lua @@ -0,0 +1,9 @@ +local req = { + "better-resize", + "savefloats", + "exit-screen", +} + +for _, x in pairs(req) do + require(... .. "." .. x) +end diff --git a/dot_config/awesome/lib/json.lua b/dot_config/awesome/lib/json.lua new file mode 100644 index 0000000..f64bdc4 --- /dev/null +++ b/dot_config/awesome/lib/json.lua @@ -0,0 +1,372 @@ +-- +-- json.lua +-- +-- Copyright (c) 2020 rxi +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of +-- this software and associated documentation files (the "Software"), to deal in +-- the Software without restriction, including without limitation the rights to +-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +-- of the Software, and to permit persons to whom the Software is furnished to do +-- so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all +-- copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +-- SOFTWARE. +-- + +local json = { _version = "0.1.2" } + +------------------------------------------------------------------------------- +-- Encode +------------------------------------------------------------------------------- + +local encode + +local escape_char_map = { + ["\\"] = "\\", + ['"'] = '"', + ["\b"] = "b", + ["\f"] = "f", + ["\n"] = "n", + ["\r"] = "r", + ["\t"] = "t", +} + +local escape_char_map_inv = { ["/"] = "/" } +for k, v in pairs(escape_char_map) do + escape_char_map_inv[v] = k +end + +local function escape_char(c) + return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte())) +end + +local function encode_nil(_) + return "null" +end + +local function encode_table(val, stack) + local res = {} + stack = stack or {} + + -- Circular reference? + if stack[val] then + error("circular reference") + end + + stack[val] = true + + if rawget(val, 1) ~= nil or next(val) == nil then + -- Treat as array -- check keys are valid and it is not sparse + local n = 0 + for k in pairs(val) do + if type(k) ~= "number" then + error("invalid table: mixed or invalid key types") + end + n = n + 1 + end + if n ~= #val then + error("invalid table: sparse array") + end + -- Encode + for _, v in ipairs(val) do + table.insert(res, encode(v, stack)) + end + stack[val] = nil + return "[" .. table.concat(res, ",") .. "]" + else + -- Treat as an object + for k, v in pairs(val) do + if type(k) ~= "string" then + error("invalid table: mixed or invalid key types") + end + table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) + end + stack[val] = nil + return "{" .. table.concat(res, ",") .. "}" + end +end + +local function encode_string(val) + return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' +end + +local function encode_number(val) + -- Check for NaN, -inf and inf + if val ~= val or val <= -math.huge or val >= math.huge then + error("unexpected number value '" .. tostring(val) .. "'") + end + return string.format("%.14g", val) +end + +local type_func_map = { + ["nil"] = encode_nil, + ["table"] = encode_table, + ["string"] = encode_string, + ["number"] = encode_number, + ["boolean"] = tostring, +} + +encode = function(val, stack) + local t = type(val) + local f = type_func_map[t] + if f then + return f(val, stack) + end + error("unexpected type '" .. t .. "'") +end + +function json.encode(val) + return (encode(val)) +end + +------------------------------------------------------------------------------- +-- Decode +------------------------------------------------------------------------------- + +local parse + +local function create_set(...) + local res = {} + for i = 1, select("#", ...) do + res[select(i, ...)] = true + end + return res +end + +local space_chars = create_set(" ", "\t", "\r", "\n") +local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") +local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") +local literals = create_set("true", "false", "null") + +local literal_map = { + ["true"] = true, + ["false"] = false, + ["null"] = nil, +} + +local function next_char(str, idx, set, negate) + for i = idx, #str do + if set[str:sub(i, i)] ~= negate then + return i + end + end + return #str + 1 +end + +local function decode_error(str, idx, msg) + local line_count = 1 + local col_count = 1 + for i = 1, idx - 1 do + col_count = col_count + 1 + if str:sub(i, i) == "\n" then + line_count = line_count + 1 + col_count = 1 + end + end + error(string.format("%s at line %d col %d", msg, line_count, col_count)) +end + +local function codepoint_to_utf8(n) + -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa + local f = math.floor + if n <= 0x7f then + return string.char(n) + elseif n <= 0x7ff then + return string.char(f(n / 64) + 192, n % 64 + 128) + elseif n <= 0xffff then + return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) + elseif n <= 0x10ffff then + return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, f(n % 4096 / 64) + 128, n % 64 + 128) + end + error(string.format("invalid unicode codepoint '%x'", n)) +end + +local function parse_unicode_escape(s) + local n1 = tonumber(s:sub(1, 4), 16) + local n2 = tonumber(s:sub(7, 10), 16) + -- Surrogate pair? + if n2 then + return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) + else + return codepoint_to_utf8(n1) + end +end + +local function parse_string(str, i) + local res = "" + local j = i + 1 + local k = j + + while j <= #str do + local x = str:byte(j) + + if x < 32 then + decode_error(str, j, "control character in string") + elseif x == 92 then -- `\`: Escape + res = res .. str:sub(k, j - 1) + j = j + 1 + local c = str:sub(j, j) + if c == "u" then + local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1) + or str:match("^%x%x%x%x", j + 1) + or decode_error(str, j - 1, "invalid unicode escape in string") + res = res .. parse_unicode_escape(hex) + j = j + #hex + else + if not escape_chars[c] then + decode_error(str, j - 1, "invalid escape char '" .. c .. "' in string") + end + res = res .. escape_char_map_inv[c] + end + k = j + 1 + elseif x == 34 then -- `"`: End of string + res = res .. str:sub(k, j - 1) + return res, j + 1 + end + + j = j + 1 + end + + decode_error(str, i, "expected closing quote for string") +end + +local function parse_number(str, i) + local x = next_char(str, i, delim_chars) + local s = str:sub(i, x - 1) + local n = tonumber(s) + if not n then + decode_error(str, i, "invalid number '" .. s .. "'") + end + return n, x +end + +local function parse_literal(str, i) + local x = next_char(str, i, delim_chars) + local word = str:sub(i, x - 1) + if not literals[word] then + decode_error(str, i, "invalid literal '" .. word .. "'") + end + return literal_map[word], x +end + +local function parse_array(str, i) + local res = {} + local n = 1 + i = i + 1 + while 1 do + local x + i = next_char(str, i, space_chars, true) + -- Empty / end of array? + if str:sub(i, i) == "]" then + i = i + 1 + break + end + -- Read token + x, i = parse(str, i) + res[n] = x + n = n + 1 + -- Next token + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "]" then + break + end + if chr ~= "," then + decode_error(str, i, "expected ']' or ','") + end + end + return res, i +end + +local function parse_object(str, i) + local res = {} + i = i + 1 + while 1 do + local key, val + i = next_char(str, i, space_chars, true) + -- Empty / end of object? + if str:sub(i, i) == "}" then + i = i + 1 + break + end + -- Read key + if str:sub(i, i) ~= '"' then + decode_error(str, i, "expected string for key") + end + key, i = parse(str, i) + -- Read ':' delimiter + i = next_char(str, i, space_chars, true) + if str:sub(i, i) ~= ":" then + decode_error(str, i, "expected ':' after key") + end + i = next_char(str, i + 1, space_chars, true) + -- Read value + val, i = parse(str, i) + -- Set + res[key] = val + -- Next token + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "}" then + break + end + if chr ~= "," then + decode_error(str, i, "expected '}' or ','") + end + end + return res, i +end + +local char_func_map = { + ['"'] = parse_string, + ["0"] = parse_number, + ["1"] = parse_number, + ["2"] = parse_number, + ["3"] = parse_number, + ["4"] = parse_number, + ["5"] = parse_number, + ["6"] = parse_number, + ["7"] = parse_number, + ["8"] = parse_number, + ["9"] = parse_number, + ["-"] = parse_number, + ["t"] = parse_literal, + ["f"] = parse_literal, + ["n"] = parse_literal, + ["["] = parse_array, + ["{"] = parse_object, +} + +parse = function(str, idx) + local chr = str:sub(idx, idx) + local f = char_func_map[chr] + if f then + return f(str, idx) + end + decode_error(str, idx, "unexpected character '" .. chr .. "'") +end + +function json.decode(str) + if type(str) ~= "string" then + error("expected argument of type string, got " .. type(str)) + end + local res, idx = parse(str, next_char(str, 1, space_chars, true)) + idx = next_char(str, idx, space_chars, true) + if idx <= #str then + decode_error(str, idx, "trailing garbage") + end + return res +end + +return json diff --git a/dot_config/awesome/lib/savefloats.lua b/dot_config/awesome/lib/savefloats.lua new file mode 100644 index 0000000..6fec1ba --- /dev/null +++ b/dot_config/awesome/lib/savefloats.lua @@ -0,0 +1,58 @@ +local awful = require("awful") + +local function rel(screen, win) + return { + x = (win.x - screen.x) / screen.width, + y = (win.y - screen.y) / screen.height, + width = win.width / screen.width, + aspect = win.height / win.width, + } +end + +local function unrel(s, _rel) + return _rel + and { + x = s.x + s.width * _rel.x, + y = s.y + s.height * _rel.y, + width = s.width * _rel.width, + height = _rel.aspect * s.width * _rel.width, + } +end + +local stored = {} + +local function forget(c) + stored[c] = nil +end + +local floating = awful.layout.suit.floating + +function Remember(c) + if floating == awful.layout.get(c.screen) or c.floating then + stored[c.window] = rel(c.screen.geometry, c:geometry()) + end +end + +function Restore(c) + local s = stored[c.window] + if s then + c:geometry(unrel(c.screen.geometry, stored[c.window])) + return true + else + return false + end +end + +client.connect_signal("manage", Remember) +client.connect_signal("property::geometry", Remember) +client.connect_signal("unmanage", forget) + +tag.connect_signal("property::layout", function(t) + if floating == awful.layout.get(t.screen) then + for _, c in ipairs(t:clients()) do + c:geometry(unrel(t.screen.geometry, stored[c.window])) + end + end +end) + +return Restore diff --git a/dot_config/awesome/main/bindings.lua b/dot_config/awesome/main/bindings.lua new file mode 100644 index 0000000..d61a828 --- /dev/null +++ b/dot_config/awesome/main/bindings.lua @@ -0,0 +1,286 @@ +local awful = require("awful") +local hotkeys_popup = require("awful.hotkeys_popup") +local menubar = require("menubar") +local machi = require("lib.layout-machi") +local menu = require("main.menu") + +local config = require("config") +local apps = config.apps +local keys = config.keys + +-- General awesome keybindings +awful.keyboard.append_global_keybindings({ + awful.key({ keys.mod, "Control" }, "r", awesome.restart, { description = "reload awesome", group = "awesome" }), + + awful.key({ keys.mod, "Shift" }, "q", awesome.quit, { description = "quit awesome", group = "awesome" }), + + awful.key({ keys.mod, "Control", "Shift" }, "x", function() + awful.prompt.run({ + prompt = "Run Lua code: ", + textbox = awful.screen.focused().promptbox.widget, + exe_callback = awful.util.eval, + history_path = awful.util.get_cache_dir() .. "/history_eval", + }) + end, { description = "lua execute prompt", group = "awesome" }), + + awful.key({ keys.mod }, "Return", function() + awful.spawn(apps.terminal) + end, { description = "open a terminal", group = "launcher" }), + + awful.key({ keys.mod, "Shift" }, "c", function() + menu.mainmenu:show() + end, { description = "show main menu", group = "awesome" }), + + awful.key({ keys.mod }, "p", function() + menubar.show() + end, { description = "show the menubar", group = "launcher" }), +}) + +-- Tag bindings +awful.keyboard.append_global_keybindings({ + awful.key({ keys.mod, "Control" }, "s", hotkeys_popup.show_help, { description = "show help", group = "awesome" }), + + awful.key({ keys.mod }, "Left", awful.tag.viewprev, { description = "view previous", group = "tag" }), + + awful.key({ keys.mod }, "Right", awful.tag.viewnext, { description = "view next", group = "tag" }), + + awful.key({ keys.mod }, "Tab", awful.tag.history.restore, { description = "go back", group = "tag" }), +}) + +awful.keyboard.append_global_keybindings({ + awful.key({ + modifiers = { keys.mod }, + keygroup = "numrow", + description = "only view tag", + group = "tag", + on_press = function(index) + local screen = awful.screen.focused() + local tag = screen.tags[index] + if tag then + tag:view_only() + end + end, + }), + + awful.key({ + modifiers = { keys.mod, "Control" }, + keygroup = "numrow", + description = "toggle tag", + group = "tag", + on_press = function(index) + local screen = awful.screen.focused() + local tag = screen.tags[index] + if tag then + awful.tag.viewtoggle(tag) + end + end, + }), + + awful.key({ + modifiers = { keys.mod, "Shift" }, + keygroup = "numrow", + description = "move focused client to tag", + group = "tag", + on_press = function(index) + if client.focus then + local tag = client.focus.screen.tags[index] + if tag then + client.focus:move_to_tag(tag) + end + end + end, + }), + + awful.key({ + modifiers = { keys.mod, "Control", "Shift" }, + keygroup = "numrow", + description = "toggle focused client on tag", + group = "tag", + on_press = function(index) + if client.focus then + local tag = client.focus.screen.tags[index] + if tag then + client.focus:toggle_tag(tag) + end + end + end, + }), + + awful.key({ + modifiers = { keys.mod }, + keygroup = "numpad", + description = "select layout directly", + group = "layout", + on_press = function(index) + local t = awful.screen.focused().selected_tag + if t then + t.layout = t.layouts[index] or t.layout + end + end, + }), +}) + +-- Focus bindings +awful.keyboard.append_global_keybindings({ + awful.key({ keys.mod }, "c", function() + awful.client.focus.byidx(1) + end, { description = "focus next by index", group = "client" }), + + awful.key({ keys.mod }, "x", function() + awful.client.focus.byidx(-1) + end, { description = "focus previous by index", group = "client" }), + + awful.key({ keys.mod }, "Escape", function() + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + end, { description = "go back", group = "client" }), + + awful.key({ keys.mod, "Control" }, "j", function() + awful.screen.focus_relative(1) + end, { description = "focus the next screen", group = "screen" }), + + awful.key({ keys.mod, "Control" }, "k", function() + awful.screen.focus_relative(-1) + end, { description = "focus the previous screen", group = "screen" }), + + awful.key({ keys.mod, "Control" }, "n", function() + local c = awful.client.restore() + -- Focus restored client + if c then + c:activate({ raise = true, context = "key.unminimize" }) + end + end, { description = "restore minimized", group = "client" }), +}) + +-- Layout bindings +awful.keyboard.append_global_keybindings({ + awful.key({ keys.mod, "Shift" }, "j", function() + awful.client.swap.byidx(1) + end, { description = "swap with next client by index", group = "client" }), + + awful.key({ keys.mod, "Shift" }, "k", function() + awful.client.swap.byidx(-1) + end, { description = "swap with previous client by index", group = "client" }), + + awful.key( + { keys.mod }, + "u", + awful.client.urgent.jumpto, + { description = "jump to urgent client", group = "client" } + ), + + awful.key({ keys.mod }, "l", function() + awful.tag.incmwfact(0.05) + end, { description = "increase master width factor", group = "layout" }), + + awful.key({ keys.mod }, "h", function() + awful.tag.incmwfact(-0.05) + end, { description = "decrease master width factor", group = "layout" }), + + awful.key({ keys.mod, "Shift" }, "h", function() + awful.tag.incnmaster(1, nil, true) + end, { description = "increase the number of master clients", group = "layout" }), + + awful.key({ keys.mod, "Shift" }, "l", function() + awful.tag.incnmaster(-1, nil, true) + end, { description = "decrease the number of master clients", group = "layout" }), + + awful.key({ keys.mod, "Control" }, "h", function() + awful.tag.incncol(1, nil, true) + end, { description = "increase the number of columns", group = "layout" }), + + awful.key({ keys.mod, "Control" }, "l", function() + awful.tag.incncol(-1, nil, true) + end, { description = "decrease the number of columns", group = "layout" }), + + awful.key({ keys.mod }, "-", function() + machi.default_editor.start_interactive() + end, { description = "edit the current layout if it is a machi layout", group = "layout" }), + + awful.key({ keys.mod }, ".", function() + machi.switcher.start(client.focus) + end, { description = "switch between windows for a machi layout", group = "layout" }), +}) + +-- Client bindings +client.connect_signal("request::default_keybindings", function() + awful.keyboard.append_client_keybindings({ + awful.key({ keys.mod }, "f", function(c) + c.fullscreen = not c.fullscreen + c:raise() + end, { description = "toggle fullscreen", group = "client" }), + + awful.key({ keys.mod }, "w", function(c) + c:kill() + end, { description = "close", group = "client" }), + + awful.key( + { keys.mod, "Control" }, + "space", + awful.client.floating.toggle, + { description = "toggle floating", group = "client" } + ), + + awful.key({ keys.mod, "Control" }, "Return", function(c) + c:swap(awful.client.getmaster()) + end, { description = "move to master", group = "client" }), + + awful.key({ keys.mod }, "o", function(c) + c:move_to_screen() + end, { description = "move to screen", group = "client" }), + + awful.key({ keys.mod }, "t", function(c) + c.ontop = not c.ontop + end, { description = "toggle keep on top", group = "client" }), + + awful.key({ keys.mod }, "n", function(c) + -- The client currently has the input focus, so it cannot be + -- minimized, since minimized clients can't have the focus. + c.minimized = true + end, { description = "minimize", group = "client" }), + + awful.key({ keys.mod }, "m", function(c) + c.maximized = not c.maximized + c:raise() + end, { description = "(un)maximize", group = "client" }), + + awful.key({ keys.mod, "Control" }, "m", function(c) + c.maximized_vertical = not c.maximized_vertical + c:raise() + end, { description = "(un)maximize vertically", group = "client" }), + + awful.key({ keys.mod, "Shift" }, "m", function(c) + c.maximized_horizontal = not c.maximized_horizontal + c:raise() + end, { description = "(un)maximize horizontally", group = "client" }), + }) +end) + +-- Mouse bindings +awful.mouse.append_global_mousebindings({ + awful.button({}, 3, function() + menu.mainmenu:toggle() + end), + + awful.button({}, 4, awful.tag.viewprev), + + awful.button({}, 5, awful.tag.viewnext), +}) + +client.connect_signal("request::default_mousebindings", function() + awful.mouse.append_client_mousebindings({ + awful.button({}, 1, function(c) + c:activate({ context = "mouse_click" }) + end), + + awful.button({ keys.mod }, 1, function(c) + c:activate({ context = "mouse_click", action = "mouse_move" }) + end), + + awful.button({ keys.mod }, 3, function(c) + c:activate({ context = "mouse_click", action = "mouse_resize" }) + end), + }) +end) diff --git a/dot_config/awesome/main/custom_bindings.lua b/dot_config/awesome/main/custom_bindings.lua new file mode 100644 index 0000000..f373c44 --- /dev/null +++ b/dot_config/awesome/main/custom_bindings.lua @@ -0,0 +1,63 @@ +local awful = require("awful") +local volume = require("ui.popups.volume") +local filesystem = require("gears.filesystem") +local config = require("config") + +local keys = config.keys + +local config_dir = filesystem.get_configuration_dir() +local utils_dir = config_dir .. "utilities/" + +local screenshot_area = utils_dir .. "screensht area" +local screenshot_full = utils_dir .. "screensht full" + +awful.keyboard.append_global_keybindings({ + awful.key({ keys.mod }, "r", function() + awful.spawn(config.apps.launcher) + end, { description = "show rofi", group = "launcher" }), + + awful.key({ keys.mod }, "Print", function() + awful.spawn.easy_async_with_shell(screenshot_area, function() end) + end, { description = "take a area screenshot", group = "Utils" }), + + awful.key({}, "Print", function() + awful.spawn.easy_async_with_shell(screenshot_full, function() end) + end, { description = "take a full screenshot", group = "Utils" }), + + awful.key({ keys.mod }, "q", function() + awesome.emit_signal("module::exit_screen:show") + end, { description = "show Exit Screen", group = "Utils" }), + + awful.key({ keys.mod }, "s", function() + awesome.emit_signal("scratchpad::toggle") + end, { description = "show Scratchpad", group = "Utils" }), + + awful.key({ keys.mod }, "b", function() + awful.spawn.easy_async_with_shell("headsetcontrol -l 0", function() end) + end, { description = "headsetcontrol", group = "Utils" }), + + awful.key({ keys.mod }, "t", function() + awful.titlebar.toggle(client.focus) + end, { description = "toggle titlebar for active client", group = "Utils" }), -- Toggle titlebar +}) + +-- Volume +awful.keyboard.append_global_keybindings({ + awful.key({}, "XF86AudioRaiseVolume", function() + volume.increase() + awesome.emit_signal("widget::update_vol") + awesome.emit_signal("module::volume_osd:show", true) + end), + + awful.key({}, "XF86AudioLowerVolume", function() + volume.decrease() + awesome.emit_signal("widget::update_vol") + awesome.emit_signal("module::volume_osd:show", true) + end), + + awful.key({}, "XF86AudioMute", function() + volume.mute() + awesome.emit_signal("widget::update_vol") + awesome.emit_signal("module::volume_osd:show", true) + end), +}) diff --git a/dot_config/awesome/main/error_handling.lua b/dot_config/awesome/main/error_handling.lua new file mode 100644 index 0000000..eb3bfb0 --- /dev/null +++ b/dot_config/awesome/main/error_handling.lua @@ -0,0 +1,31 @@ +local naughty = require("naughty") + +-- Error handling +-- Check if awesome encountered an error during startup and fell back to +-- another config (This code will only ever execute for the fallback config) +if awesome.startup_errors then + naughty.notify({ + preset = naughty.config.presets.critical, + title = "Oops, there were errors during startup!", + text = awesome.startup_errors, + }) +end + +-- Handle runtime errors after startup +do + local in_error = false + awesome.connect_signal("debug::error", function(err) + -- Make sure we don't go into an endless error loop + if in_error then + return + end + in_error = true + + naughty.notify({ + preset = naughty.config.presets.critical, + title = "Oops, an error happened!", + text = tostring(err), + }) + in_error = false + end) +end diff --git a/dot_config/awesome/main/init.lua b/dot_config/awesome/main/init.lua new file mode 100644 index 0000000..23cfb09 --- /dev/null +++ b/dot_config/awesome/main/init.lua @@ -0,0 +1,14 @@ +local req = { + "error_handling", + "layout", + "menu", + "wallpaper", + "bindings", + "custom_bindings", + "rules", + "tags", +} + +for _, x in pairs(req) do + require(... .. "." .. x) +end diff --git a/dot_config/awesome/main/layout.lua b/dot_config/awesome/main/layout.lua new file mode 100644 index 0000000..b989b09 --- /dev/null +++ b/dot_config/awesome/main/layout.lua @@ -0,0 +1,36 @@ +local awful = require("awful") +local bling = require("lib.bling") +local machi = require("lib.layout-machi") + +-- Custom Layouts +local mstab = bling.layout.mstab +local centered = bling.layout.centered +local equal = bling.layout.equalarea +local deck = bling.layout.deck + +machi.editor.nested_layouts = { + ["0"] = deck, + ["1"] = mstab, + ["2"] = awful.layout.suit.spiral, + ["3"] = awful.layout.suit.fair, + ["4"] = awful.layout.suit.fair.horizontal, +} + +-- Table of layouts to cover with awful.layout.inc, order matters. +awful.layout.append_default_layouts({ + awful.layout.suit.tile, + awful.layout.suit.spiral.dwindle, + awful.layout.suit.floating, + awful.layout.suit.max, + centered, + mstab, + equal, + machi.default_layout, +}) + +client.connect_signal("manage", function(c) + if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then + -- Prevent clients from being unreachable after screen count changes. + awful.placement.no_offscreen(c) + end +end) diff --git a/dot_config/awesome/main/menu.lua b/dot_config/awesome/main/menu.lua new file mode 100644 index 0000000..52dbb13 --- /dev/null +++ b/dot_config/awesome/main/menu.lua @@ -0,0 +1,107 @@ +local awful = require("awful") +local gears = require("gears") +local wibox = require("wibox") +local helpers = require("helpers") +local hotkeys_popup = require("awful.hotkeys_popup") + +local theme = require("beautiful").get() +local apps = require("config").apps + +local menu = {} + +local rofi = {} +rofi.timer = gears.timer({ + autostart = false, + timeout = 0.1, + single_shot = true, + callback = function() + awful.spawn(apps.launcher) + end, +}) + +menu.awesome = { + { + "Hotkeys", + function() + hotkeys_popup.show_help(nil, awful.screen.focused()) + end, + }, + { "Manual", apps.terminal .. " -e man awesome" }, + { "Edit Config", apps.start_editor .. " " .. awesome.conffile }, + { "Restart", awesome.restart }, + { + "Quit", + function() + awesome.quit() + end, + }, +} + +menu.mainmenu = awful.menu({ + items = { + { + "Applications", + function() + menu.mainmenu:hide() + rofi.timer:start() + end, + }, + { "Terminal", apps.terminal }, + { "Web Browser", apps.browser }, + { "File Manager", apps.file_manager }, + { "Text Editor", apps.code_editor }, + { "Music Player", apps.music_player }, + { + "Info Panel", + function() + awesome.emit_signal("sidebar::toggle") + end, + }, + { + "Notifications", + function() + awesome.emit_signal("action::toggle") + end, + }, + { + "Exit", + function() + awesome.emit_signal("module::exit_screen:show") + end, + }, + { "AwesomeWM", menu.awesome }, + }, +}) + +-- apply rounded corners to menus when picom isn't available, thanks to u/signalsourcesexy +-- also applies antialiasing! - By me. +menu.mainmenu.wibox.shape = helpers.ui.rrect(10) +menu.mainmenu.wibox.bg = theme.bg_normal .. "00" +menu.mainmenu.wibox:set_widget(wibox.widget({ + menu.mainmenu.wibox.widget, + bg = theme.bg_normal, + shape = helpers.ui.rrect(0), + widget = wibox.container.background, +})) + +-- apply rounded corners to submenus, thanks to u/signalsourcesexy +-- also applies antialiasing! - By me. +awful.menu.original_new = awful.menu.new + +---@diagnostic disable-next-line: duplicate-set-field +function awful.menu.new(...) + local ret = awful.menu.original_new(...) + + ret.wibox.shape = helpers.ui.rrect(10) + ret.wibox.bg = theme.bg_normal .. "00" + ret.wibox:set_widget(wibox.widget({ + ret.wibox.widget, + widget = wibox.container.background, + bg = theme.color.base, + shape = helpers.ui.rrect(0), + })) + + return ret +end + +return menu diff --git a/dot_config/awesome/main/rules.lua b/dot_config/awesome/main/rules.lua new file mode 100644 index 0000000..9749b2e --- /dev/null +++ b/dot_config/awesome/main/rules.lua @@ -0,0 +1,78 @@ +local awful = require("awful") +local ruled = require("ruled") +local dpi = require("beautiful.xresources").apply_dpi +local helpers = require("helpers") +local config = require("config") + +ruled.client.connect_signal("request::rules", function() + ruled.client.append_rule({ + id = "global", + rule = {}, + properties = { + focus = awful.client.focus.filter, + raise = true, + screen = awful.screen.preferred, + placement = awful.placement.no_overlap + awful.placement.no_offscreen, + }, + }) + + ruled.client.append_rule({ + id = "titlebars", + rule_any = { + type = { "normal", "dialog" }, + }, + properties = { + titlebars_enabled = false, + }, + }) + + ruled.client.append_rule({ + rule = { class = config.apps.launcher }, + properties = { + titlebars_enabled = false, + }, + }) + + ruled.client.append_rule({ + rule = { instance = "origin.exe" }, + properties = { + floating = true, + titlebars_enabled = false, + shape = helpers.ui.rrect(0), + border_width = dpi(0), + }, + }) + + ruled.client.append_rule({ + rule = { instance = "bf1.exe" }, + properties = { shape = helpers.ui.rrect(0), fullscreen = true, tag = "󰍹", switchtotag = true }, + }) + ruled.client.append_rule({ + rule = { instance = "wine" }, + properties = { shape = helpers.ui.rrect(0), titlebars_enabled = false }, + }) + + ruled.client.append_rule({ + rule_any = { + floating = true, + }, + properties = { + placement = awful.placement.centered, + ontop = true, + }, + }) + + ruled.client.append_rule({ + rule_any = { + class = { + "xfce", + }, + instance = { + "xfce", + }, + }, + properties = { + floating = true, + }, + }) +end) diff --git a/dot_config/awesome/main/tags.lua b/dot_config/awesome/main/tags.lua new file mode 100644 index 0000000..fbd5106 --- /dev/null +++ b/dot_config/awesome/main/tags.lua @@ -0,0 +1,10 @@ +local awful = require("awful") +local icons = require("config").icons.tags + +screen.connect_signal("request::desktop_decoration", function(s) + awful.tag( + { icons.general, icons.files, icons.media, icons.terminal, icons.coding, icons.misc }, + s, + awful.layout.layouts[1] + ) +end) diff --git a/dot_config/awesome/main/wallpaper.lua b/dot_config/awesome/main/wallpaper.lua new file mode 100644 index 0000000..c7dff3f --- /dev/null +++ b/dot_config/awesome/main/wallpaper.lua @@ -0,0 +1,26 @@ +local awful = require("awful") +local wibox = require("wibox") + +local image = require("config").theme.wallpaper + +local function set_wall(s) + awful.wallpaper({ + screen = s, + widget = { + { + image = image, + upscale = true, + downscale = true, + widget = wibox.widget.imagebox, + }, + valign = "center", + halign = "center", + tiled = true, + widget = wibox.container.tile, + }, + }) +end + +screen.connect_signal("request::wallpaper", function(s) + set_wall(s) +end) diff --git a/dot_config/awesome/rc.lua b/dot_config/awesome/rc.lua new file mode 100644 index 0000000..33251d6 --- /dev/null +++ b/dot_config/awesome/rc.lua @@ -0,0 +1,26 @@ +pcall(require, "luarocks.loader") + +local gears = require("gears") +local beautiful = require("beautiful") +local awful = require("awful") + +require("awful.autofocus") + +-- Theme -- +beautiful.init(gears.filesystem.get_configuration_dir() .. "themes/catppuccin/theme.lua") + +-- Main/Configuration -- +require("main") + +-- Libraries/Modules -- +require("lib") + +-- Signals/Monitoring -- +require("signals") + +-- Ui/Panels -- +require("ui") + +-- Autostart -- +awful.spawn.with_shell("picom") +awful.spawn.with_shell("~/.config/.fehbg") diff --git a/dot_config/awesome/signals/cpu.lua b/dot_config/awesome/signals/cpu.lua new file mode 100644 index 0000000..43cd9ad --- /dev/null +++ b/dot_config/awesome/signals/cpu.lua @@ -0,0 +1,20 @@ +local awful = require("awful") +local gears = require("gears") + +local function get_cpu() + local script = "echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]" + + awful.spawn.easy_async_with_shell(script, function(cpu_perc) + cpu_perc = cpu_perc:match("%d+") + awesome.emit_signal("signal::cpu", cpu_perc) + end) +end + +gears.timer({ + timeout = 1, + call_now = true, + autostart = true, + callback = function() + get_cpu() + end, +}) diff --git a/dot_config/awesome/signals/disk.lua b/dot_config/awesome/signals/disk.lua new file mode 100644 index 0000000..c89bae4 --- /dev/null +++ b/dot_config/awesome/signals/disk.lua @@ -0,0 +1,23 @@ +local awful = require("awful") +local gears = require("gears") + +local config = require("config") +local disk = config.widget.disk.name + +local function get_disk() + local script = "df -kH -B 1MB" .. disk .. "| tail -1 | awk '{printf $5}'" + + awful.spawn.easy_async_with_shell(script, function(disk_perc) + disk_perc = disk_perc:match("%d+") + awesome.emit_signal("signal::disk", disk_perc) + end) +end + +gears.timer({ + timeout = 2000, + call_now = true, + autostart = true, + callback = function() + get_disk() + end, +}) diff --git a/dot_config/awesome/signals/init.lua b/dot_config/awesome/signals/init.lua new file mode 100644 index 0000000..e5c1910 --- /dev/null +++ b/dot_config/awesome/signals/init.lua @@ -0,0 +1,14 @@ +local req = { + "volume", + "mic", + "cpu", + "mem", + "player", + "disk", + "uptime", + "playerctl", +} + +for _, x in pairs(req) do + require("signals." .. x) +end diff --git a/dot_config/awesome/signals/mem.lua b/dot_config/awesome/signals/mem.lua new file mode 100644 index 0000000..368d052 --- /dev/null +++ b/dot_config/awesome/signals/mem.lua @@ -0,0 +1,22 @@ +local awful = require("awful") +local gears = require("gears") + +local function get_mem() + local script = [[ + free | grep Mem | awk '{print $3/$2 * 100.0}' | cut -f 1 -d "." + ]] + + awful.spawn.easy_async_with_shell(script, function(mem_perc) + mem_perc = mem_perc:match("%d+") + awesome.emit_signal("signal::mem", mem_perc) + end) +end + +gears.timer({ + timeout = 4, + call_now = true, + autostart = true, + callback = function() + get_mem() + end, +}) diff --git a/dot_config/awesome/signals/mic.lua b/dot_config/awesome/signals/mic.lua new file mode 100644 index 0000000..963a526 --- /dev/null +++ b/dot_config/awesome/signals/mic.lua @@ -0,0 +1,29 @@ +local awful = require("awful") + +local config = require("config") +local microphone = config.widget.mic.name + +local vol_sc = "pamixer --source " .. microphone .. " --get-volume" +local mute_sc = "pamixer --source " .. microphone .. " --get-mute" + +local function get_vol() + awful.spawn.easy_async_with_shell(vol_sc, function(vol) + awful.spawn.easy_async_with_shell(mute_sc, function(mute) + local muted + + if mute:match("false") then + muted = false + else + muted = true + end + + awesome.emit_signal("signal::mic", vol, muted) + end) + end) +end + +awesome.connect_signal("widget::update_mic", function() -- Needs to be Updated if muted! For Mute in Sidebar Widget + get_vol() +end) + +get_vol() diff --git a/dot_config/awesome/signals/player.lua b/dot_config/awesome/signals/player.lua new file mode 100644 index 0000000..a710827 --- /dev/null +++ b/dot_config/awesome/signals/player.lua @@ -0,0 +1,31 @@ +local awful = require("awful") + +-- Script +local title_sc = "mpc -f %title% | head -1" +local artist_sc = "mpc -f %artist% | head -1" +local length_sc = "mpc | awk '{print $3}' | awk 'NR==2'" +local status_sc = "mpc | awk '{print $1}' | awk 'NR==2' | sed 's/[[]*//g' | sed 's/[]]*//g'" + +-- function +local function get_player() + awful.spawn.easy_async_with_shell(title_sc, function(title) + awful.spawn.easy_async_with_shell(artist_sc, function(artist) + awful.spawn.easy_async_with_shell(length_sc, function(length) + awful.spawn.easy_async_with_shell(status_sc, function(status) + title = string.gsub(title, "\n", "") + artist = string.gsub(artist, "\n", "") + length = string.gsub(length, "\n", "") + status = string.gsub(status, "\n", "") + + awesome.emit_signal("signal::player", title, artist, length, status) + end) + end) + end) + end) +end + +awesome.connect_signal("widget::update_player", function() + get_player() +end) + +get_player() diff --git a/dot_config/awesome/signals/playerctl.lua b/dot_config/awesome/signals/playerctl.lua new file mode 100644 index 0000000..dc29d93 --- /dev/null +++ b/dot_config/awesome/signals/playerctl.lua @@ -0,0 +1,17 @@ +local bling = require("lib.bling") + +local instance = nil + +local function new() + return bling.signal.playerctl.lib({ + update_on_activity = true, + player = { "mopidy", "spotify", "%any" }, + debounce_delay = 1, + }) +end + +if not instance then + instance = new() +end + +return instance diff --git a/dot_config/awesome/signals/uptime.lua b/dot_config/awesome/signals/uptime.lua new file mode 100644 index 0000000..f839401 --- /dev/null +++ b/dot_config/awesome/signals/uptime.lua @@ -0,0 +1,16 @@ +local awful = require("awful") + +local function get_uptime() + local script = [[ + uptime -p | sed 's/up\s*//g' | sed 's/\s*days*/d/g' | sed 's/\s*hours*/h/g' | sed 's/\s*minutes*/m/g' + ]] + + awful.spawn.easy_async_with_shell(script, function(uptime) + uptime = string.gsub(uptime, "\n", "") + awesome.emit_signal("signal::uptime", uptime) + end) +end +awesome.connect_signal("widget::update_uptime", function() + get_uptime() +end) +get_uptime() diff --git a/dot_config/awesome/signals/volume.lua b/dot_config/awesome/signals/volume.lua new file mode 100644 index 0000000..c004aa5 --- /dev/null +++ b/dot_config/awesome/signals/volume.lua @@ -0,0 +1,26 @@ +local awful = require("awful") + +local vol_sc = "pamixer --get-volume" +local mute_sc = "pamixer --get-mute" + +local function get_vol() + awful.spawn.easy_async_with_shell(vol_sc, function(vol) + awful.spawn.easy_async_with_shell(mute_sc, function(mute) + local muted + + if mute:match("false") then + muted = false + else + muted = true + end + + awesome.emit_signal("signal::volume", vol, muted) + end) + end) +end + +awesome.connect_signal("widget::update_vol", function() -- Needs to be Updated if muted! For Pulseaudio Widget + get_vol() +end) + +get_vol() diff --git a/dot_config/awesome/themes/catppuccin/assets/music.png b/dot_config/awesome/themes/catppuccin/assets/music.png new file mode 100644 index 0000000000000000000000000000000000000000..aae8c492877ec1399349459c557d4264c5d1e1f6 GIT binary patch literal 404927 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ⅆ3lMPGHM*){GKLR80}p9j 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

!a?MUw5U9D~uJ!^; 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 literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/assets/pfp.jpg b/dot_config/awesome/themes/catppuccin/assets/pfp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d4863a3d2daddb3d9311394963080d05f23d059 GIT binary patch literal 7540 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 A)Bpeg literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/assets/volume-off.png b/dot_config/awesome/themes/catppuccin/assets/volume-off.png new file mode 100644 index 0000000000000000000000000000000000000000..842d7de3d87702bc0b9d9eeccdeaf211bf6c40c3 GIT binary patch literal 5729 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 literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/assets/volume-on.png b/dot_config/awesome/themes/catppuccin/assets/volume-on.png new file mode 100644 index 0000000000000000000000000000000000000000..81124d7bc6757d52dac72d9786949ecf59377f55 GIT binary patch literal 5208 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 literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/assets/volume.svg b/dot_config/awesome/themes/catppuccin/assets/volume.svg new file mode 100644 index 0000000..7a59aa1 --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/assets/volume.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/dot_config/awesome/themes/catppuccin/buttons.png b/dot_config/awesome/themes/catppuccin/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..de4cce8fcbb663392d4ab61a7b02f78bf648942c GIT binary patch literal 11964 zcmeAS@N?(olHy`uVBq!ia0y~y;0H1}3OJa7)ba#t2OuR`;u=vBoS#-wo>-L1P+nfH zmzkGcoSayYs+V7sKKq@G6i^Xofk$L90|Vb-5N14{zaoW!fw4BgC&cyZgFC+-Z}@Wk z>X)mRKV7`=^YXG!XU}eZ@!;o$#a|CSU-$Ch+LyaGJiN8$#je#aH^18R=EsrQkB=RD zzWeQp$6Fun`0!)zwEO!H+}-x+*}mzWcV17t{B_EOALsY(oqXZ@w6ni2ADDT4{rwkP zC-$9qe{SXd7mL=`sV&RE>ZBw`PmY=DfmbGl# z!mbH3dne85ubk1;IjeTYr0S);O$7@}8hgvC>;C$T58 zASkOnAT_4KFC{N1(KDvPJ~GoSBE;T1%+AW)&f3w|!qvpa-OkL@*v8QqC}L`BW#Xl0 z#0Iwm!)#y~39iP_a}u^>GwhQo4TGAN zZ3S#`g*#G5OH_>3+@NS@4TeV3Xo-rYeQySA84^=G(lU#Ki{3$zOu@y+&}(Onh8>oa z4eP@alez~*o%%i9y$X(H`$qPumJNR@ydxD<0P$DIht$H#~mB)m%YgqJ*3g|xIk*t%gZ;ilO%dN7cSdq zS*YaBrOtKo@BId5)wIVUhFkmYMXi3mv!y*I zo}O4>G2X~D*M7;(`tv6gN)Fwtoi(|?r>52K#$Lb6f6jQkX>s44Y4t04(z)bW-E-;= zx3CucH}wsB-5WFH%72fNUttS2U*PPY&wYh|?uO#v1#vH0+RIsYan0TEH)z4~6<>F$ z?o*kr$0BgRq45|BN3$oTbSO>n=-NL=)ofEi> z8Zyn^(MkYVtDzNyL#+`5YabI^@Pa!I!#SDKq7(%NGNN^dU=dL@(kQsm5-kB+2DAnm zbYVx!F)x-4oR~!l?${wB0U=c;#Afl)W;IHhLj*E{MIiqShAd9YWJ+4aKSWE^;a-yu z)ojj@APmf(M90o($a){PO;6@zopr E05~%MT>t<8 literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/layouts/centered.png b/dot_config/awesome/themes/catppuccin/layouts/centered.png new file mode 100644 index 0000000000000000000000000000000000000000..180f6dea52f90b50f5a8a53c7efe566cd88c3237 GIT binary patch literal 3625 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 literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/layouts/equalarea.png b/dot_config/awesome/themes/catppuccin/layouts/equalarea.png new file mode 100644 index 0000000000000000000000000000000000000000..89280abd335b048db9c8f877905a60f931162db4 GIT binary patch literal 3530 zcmV;*4K?zKP)SoQuoE;SKf?YG+0AB_6Oev_1e)b+w99|6|3eZ+Br(K> zAc>jGHrO%9v7(9da;wfcRn_;l=(jOe7!AfVuV44=x~EQ^`smhrb-{nu7kvM#R{*?X zK!?Eo@BZ-i>gjs#jT^r_NPcWq>y1uauk6pY9kBn5L+yX-_S;X{;KZ}jPYzd?zj<)9 z_v^paTReXJ`0e%P+1}^RZyc=KMVod$e%qp0kauXGZ9QMK9R^v`4nN9scw##T*U}8X z1lRrSdnbqI-&}og^XAQoJwpiWAN~IR^_^P>zPRrWn}vP0ycvv5n>Fpz#3&hUU!R@) z*M<;*1|K-1K9GGF_S~S=0Lx5?4f5!cJj@v-H+#K_OTcbS_Jzmo;{PES3 z!<{#OKCx#2;Oa64#kAtJUofu1xN6{MlEejw6f3=w-J( zK+el>Yg?G0(J_QSm+={!4j>)jtr?3n@JJeGGa1puUKb*I||rU*5KhTL%b z!^)qED0QeXH2=x;B zpcn2aw^0x5z`Z7dRZ*eT>52)`&~ayixPh33;kJoc5iF@MV%OKmFao2c z{G$yHwENU4(4ciD8IayX^`%zxX=PIUtEIXW(~2slm>$V;ejA2)&>qCHW6o@qmwzpzRvvO^`0i32aPQ-m27N>17wI30 zK!l4As0IKb6x=_q8vxTf;NhoF8PeiWQXKavQYhnH5@-)Y29>e|E;6g{pPvvXDJOpA zVj6S+m|7yAN)JMrQx*~^r9Y)G+<7d7o+5Eb!HKM#H%V#wP#hf@sl+3yWHnawwh1#e zD?+9n+kyd21hqJ0J?^h^w4@*3NJ$vA0<-IS2As5J=pSEOGlaP9ixsJVl(*eRRCcT8 z7c(LeD_kksQK7cuKe^nRp|`eah9>N%P*J&=3W^L%v6zl2g(7U91=J3IalUf^MJ-uC z=}Un?Z4p@TB;+B(9rlT})W}F&IC0b3;nVHf;kzvaG72*Xl~P-Fm-LA3qO=8463W|M zFHqS0Qv3;-Ek9lf8lD_d)b6fy-x7b6A$JPn37&9SV;c#(z@ z_{bKS=?saZz~mx0?FC+b0IV58L@|yeRHV7ePNo>(paO(3T|oQ41HjTCgl1Yt`$m-) zmH9bnQ0)6KgSlH}Zm$6*f}8(7+xzE#+Ds5hJ1a;kCwebrmuqc|wb_iby!{7lc6olO z%`V@=Y!QS6EA3i0MdG+=Gs-`=8Rce}QH~m5y#N=>?1qJ=bpeco_~|bmDm?EQ@T8@| z&)ZB;4dzt6r}G8j{CZ1YZ+7Wx|LBkRuiyB^LEpJ5OTifmM}T>D`lmLd{MEutkP{*I zjM_|w140~_IlA(ceJ&|WgAP08&QJ;3KqN3OX&*)c7>OzVw&Q&PV?9f-N3C>}*3)7Z zV>FoC*Chi3_K%M5zp?Ya=V(xC+Fz>#t#xMf?&QB3*1tE}^@ui2{6^%6bhrP zM%bB=x4Kc*J!+LYNzlH}LhJ)rz?ogWLq-7nxxl5p>pSnY(Kvo|lANrjLtd|?s7m9r zlNNKYwV3jhA(a8;K9HB$ACqyxpapXFJ$Qih_4V3k;pJmvKuT^rDJ^N9g~ z629NcpJ;}l9dH;_GnyTKm%@sT^pl*sjR7%w!>)_BsI29<1aUD0zLi~&zo$guF*Bm=nQ7 zGABNnsZ^sVTa~8EBH=MlW5K*Nff1eaZmVnGZw1WGwEwPIAcmpR z2u-0vGsukgc?r4$YdlLSI}eonnn z2x*E0!<_mhjj>Q9%=n_8M9#(YUxkNxd@`oD<#( z*YV}}INBK&=bCK-PC|x822SI8?TQ|NX(7anQp9ue0!NA2Wd>+$&Ao+t#5SfBz|UN3 z$J7!t`c&lf6`Va8($q-e9m5yWmhC7w>}Bj&2!R3W`a(2Po7^5Oi225r8h|uK+ORvp zvj7PnJtXBW)fO&H)phE2u^TT)$h3&pBC8a!+K>;Gpii&U2^y9Hff$UVuwtUL(-%u& z#V8g}qv|3`hqzhhU^PlH=4@Z};uX!1Z&E-@wBle_AB`b^=NE|Wu(FB?vfzZJc3`m? z@<&(UN&3K5TLoLRE(Du7LDv*9vx|Dqc?f{qav+N!Sgc7D_QDXDVbbIwu59xa*%g8a zWvT_FmPL>+Fpx=XF(Z;-dfBX|zqxO61p+^`v7TiVmjnTsfN@ICNpvB??ahwvp{AzS zkv&T2iI@`xxL(;iOVcM+a)eA-L8YZrRCEdv85M7TAa66~-DM%)G`lgN>*J#i;2p!` z;svWpb&TBC3!0&fbV#5S7K)3$PIKP;(=)@{9I2;z>6cUfCH!z|)iri6RA2E0d)G5-KqRo1h)| za-i-pE5TqC1yhR55h>$KNnU4ky?$Ir;PJc=7Jy761MnV$j4^gX12g~)fZe2I>|#6Y@9;#dbGk}_ ziWd&S`v?i?fnJhO{b0v?^+vOWGPiKna~6)P)l%hwu;>daO@z`@$-a14>cv{|ar?7> zTt70v0pR9D&ro_A2lwzN4Q1s@V9@Xk0I&}5a3T{BY001nH8H|8pi6@`6-Jp5Tq)@} z#EKaUpIrnO)1XgnrApKe#29ZupBNGlQeAL`s!OFBqr+Nx9rv1MNkZ)(yMjNX%OM{ z4PsNXGeKvFhN##g&aVupy}*_OkqDjc2Gk=~1iV!VW#n3lr5~ST0NQP&i`qJCx6C&D zPMaF)0G|pM8?#+hNa6+^Tng`8hMVA{y*n?ge6C!F=j+ppuiuvPl83C1oKw1UPf* z4S-WYco))_#wOL=ujnbJ@A#Sq)GAOtNyGt%DbNJk)P65kf=GkRt3^=2=o~UA&&mN& z067gnEC4WlJssVkMpqbiP%@FrdC$->v!#8QWkB2o;e;MWim#0`HW*S{HbbN`7pv1A z|Auj&Z)z3cQGGyU`calKK;fhDSvUy_g8brj0e;UM<1J?#705U3207*q7>^G8?+ zRxj28kJ@vAFWYkgG&lsoyjt?D3Xt$%3C8S`)~g@2ha+!wFE%`R(q52ww$omaAVm;x zz7=H!H`ZAVRDasmxjwugaok>zcpp!&37D=!8f1o`1MSn<>G+ShhAiMuhAy>#*7kLK zkB^2$b0<ft6$xpOsA9SY(|{Km;N=V(+_6tSNlKHxWTm;$vJRuAKT93 zRvdATe%vR*^)`@G_i-Hc=c`}$CzszoKKTB--`|(xmWII2!QrDT&G`OsF4YV7Qg|MV z?zZ>CJ`S_Nx&dHeIPVf90z?4P=nf7h1@LS)qWcXWLZi$>;5Y|AMItfD#%Z>kSMcrL-Fk1@wREC~PyPkT z>D{&r)6n#77djX0l^MVwwSAg&2B8TAu8TE=1>jc)A>bqxGE5Rctf~FmyZhnD06aax z`r#dTRy@}NU{(Rf@$0B2bxGmC#N3~|uNzMQ6+&iKghXMQ)-pZ=Isg(L3ZN|s3XtOV zvf?!biMBd+zcE@JGg9ZR`mjMQ#pOHY3qNaR~b8N%2 zq=H1R2&lXsXE4@G>z}DL3Ze|Hc4_nwcmNHM=S*E0n+B#RQV+ClnagC5##11z1q9CV z-$RH#=ELwC*eO|RE~neQJ0puA0ic>QmaWu^M@ND=k7bvPVfxA>+ZLH$ArqphV8R^G z9aG*Jk-!+F-8&ehNNS{JaK2jYF>JDc;+zT%hmW3B^2ucM5I`Lum1Bxe zFZn#e!wy8j#4#9NQ<&=JOm(3c3V9Mc3qT7hCvr#_oPKWfG#Da?1<0s^L9E!Z4+DC^ zgm_U&Y*EyWM#h35%?N+TbI3ZUS*lK{1=bS+%mS8Ui%-P57!F^``%a4~V46Zzq|09; z3X@!8EYO`m!gR2y0MO2^B@ISZC-j}dB0Jdoh+%S``t9V0L_+aG_-7`O#tUF;14GAp z>m4U;SK1Nq<7)s)VR=_nFcrP?<60EI3S!s%*h0s;HIc_l9jK?<+MkvC_wtRW2!w!_K*^k}UP z<_z+ZUDmpo!7vJ>JsI*+!o~Yb-bPSxA27_!(Z}tMUkUa)KtHh~v?eO1u`qjH`5n%3 z>Y^7ZoB~T3B7I&f&AL}mec&wQ)hMpkuo+@0oV-&R5={&xDJyj{Hq=`_WZ=O2$_n0E zLt?UiNC8a6FFT1WpxS+-Yd{YHig!u=Q0Qobq)|E-`-Koj=YKUsqUqt-CN(0%l}u*| z;0$s^(S`XeaP<5*^_NM-cjEKYt=Ic+rJs z^b(f>@bGC1f$D8VvuO>p`Mi?nDe}X7&lqQqkmI8eQr!^kFsB8hq545NMl}WJ*qhr8 z9zOdgi$y(aL2%po+h1H>uy;8CjR9C}&~msnmgN*YgA=JvuC_D9ac6;OvXllQQydGW zf)SIjuk~k1QRgec4uGpt6lA>)890OUZl4B#0pzv112DBGn8CxYv2k-6BZ|Qo7?j*+ zq-K%FHMy<>kh27I(C1Dpm+7YC1avCH_kM)DyF?Ec`e zFKJ;i4ZIw5cfuiP$}wC$=JK=neNhA(0Afl`so=r=1a9>ZXr(ac699IQ6rNKiI9cu4 zV3qIk9$*t-5elL+*B6n_s!>=vP2#GU(x18*0>|vGfh94Wyf5h6`R!XPYd}qd$(q{x zvzq|~9-3VodbxmM;BYFdLWfKk9lqi?GR&UjIuHW$BG}TPQ#7?iYjF(V&e`f3uygQp zdo}jWeLmlO9vo^huGq3l43U#dj72CMn58*UNrq^Iq-K4PeZT}_F$OSSuEy1Vrb4$qB<00m zt9a&Lvc#|JvfZZiI+q5cj%nvtE``qwfOlmsl)Y(6QbV1@c-A(GSDqvQSxI^pr=V030gIqs9?IViWq zN@;N5CEvts7X1dlW<$V;F_9WF#+?PZd37&R@quTrAp}qdWYo&D+WDz*?N@HrG3r6? zH@THH*JVIy!S#!L`9edVUr9O<2KHg#}{a`~yhLtp1!^v0# zh-%#Q@8biY))Xnr*!15SlLt;?I^ZbbBf$(56gtuCB3KsI_(N-*QtmW$2&_qfN3`wm z*!_SPFMfOU_sO-^Mq}zqk0&7TH$3gIAP0Z~|LdFEW@>V(`r$@v$yiw&?*lZGc4w2% z+WWyPtG*f&)~Eh>`SRt>t?8S4f4#YO-#4d0atBq>2@QrvlT=)GV>L#W7akP2Y{^?~ z(%rtEKz(xQ_5N&jikG9OwtRzcaCX^X6W(p<7XZ8)ew%;y1p_wUhwo;=xo5zC{qvWb TQi!T>00000NkvXXu0mjf6*$#@ literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/layouts/machi.png b/dot_config/awesome/themes/catppuccin/layouts/machi.png new file mode 100644 index 0000000000000000000000000000000000000000..fa158b5281862035e7a34d973d4055c7997cfb25 GIT binary patch literal 2765 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 T#w)W400000NkvXXu0mjfnK=}y literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/layouts/max.png b/dot_config/awesome/themes/catppuccin/layouts/max.png new file mode 100644 index 0000000000000000000000000000000000000000..fcbad9aed5e2ecee7119b4dfe4704aab31fbc61d GIT binary patch literal 3754 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 X$MK&rzAi=usDi=M)z4*}Q$iB}5zjAs literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/taglist/squarew.png b/dot_config/awesome/themes/catppuccin/taglist/squarew.png new file mode 100644 index 0000000000000000000000000000000000000000..913f2ca6ba168e824644509d6fed72b31c677d49 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^96+qV!3HGtKUiJ>QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf4K5~rW$n|Rx>tZgk|nMYCC>S| zxv6<249-QVi6yBi3gww484B*6z5(HleBwYwGM+AuAr_~TfA}*PG;qo!WN03EeKyd5 d%Z(A}pyPS@6O*PM?E$J|@O1TaS?83{1OQ#WGiU$+ literal 0 HcmV?d00001 diff --git a/dot_config/awesome/themes/catppuccin/theme.lua b/dot_config/awesome/themes/catppuccin/theme.lua new file mode 100644 index 0000000..39a362e --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/theme.lua @@ -0,0 +1,202 @@ +local beautiful = require("beautiful") +local gfs = require("gears.filesystem") +local config = require("config") +local helpers = require("helpers") + +local palette = require("lib.catppuccin.catppuccin." .. config.theme.flavor) + +local theme_assets = beautiful.theme_assets +local dpi = beautiful.xresources.apply_dpi + +local theme_path = gfs.get_configuration_dir() .. "themes/catppuccin/" + +local theme = {} + +theme.color = {} + +-- Transparent Color -- +theme.color.transparent = "#00000000" + +-- Base -- +theme.color.crust = palette.crust.hex +theme.color.mantle = palette.mantle.hex +theme.color.base = palette.base.hex + +-- Surface -- +theme.color.surface0 = palette.surface0.hex +theme.color.surface1 = palette.surface1.hex +theme.color.surface2 = palette.surface2.hex + +-- Overlay -- +theme.color.overlay0 = palette.overlay0.hex +theme.color.overlay1 = palette.overlay1.hex +theme.color.overlay2 = palette.overlay2.hex + +-- Text -- +theme.color.text = palette.text.hex +theme.color.subtext0 = palette.subtext0.hex +theme.color.subtext1 = palette.subtext1.hex + +theme.color.lavender = palette.lavender.hex +theme.color.blue = palette.blue.hex +theme.color.sapphire = palette.sapphire.hex +theme.color.sky = palette.sky.hex +theme.color.teal = palette.teal.hex +theme.color.green = palette.green.hex +theme.color.yellow = palette.yellow.hex +theme.color.peach = palette.peach.hex +theme.color.maroon = palette.maroon.hex +theme.color.red = palette.red.hex +theme.color.mauve = palette.mauve.hex +theme.color.pink = palette.pink.hex +theme.color.flamingo = palette.flamingo.hex +theme.color.rosewater = palette.rosewater.hex + +theme.color.accent1 = theme.color[config.theme.accent1] +theme.color.accent2 = theme.color[config.theme.accent2] + +theme.music = theme_path .. "assets/music.png" +theme.volume_on = theme_path .. "assets/volume-on.png" +theme.volume_off = theme_path .. "assets/volume-off.png" +theme.pfp = config.theme.pfp +theme.wallpaper = config.theme.wallpaper +theme.font = config.theme.font.family .. " " .. config.theme.font.size + +theme.titlebar_bg_focus = theme.color.base +theme.titlebar_bg = theme.color.base +theme.bg_normal = theme.color.base +theme.bg_focus = theme.color.surface0 +theme.bg_urgent = theme.color.red +theme.bg_minimize = theme.color.surface1 +theme.bg_systray = theme.bg_normal + +theme.fg_normal = theme.color.subtext1 -- text color +theme.fg_focus = theme.color.accent1 +theme.fg_urgent = theme.color.text +theme.fg_minimize = theme.color.text + +theme.useless_gap = dpi(10) +theme.border_width = dpi(1) +theme.border_normal = theme.color.surface0 +theme.border_focus = theme.color.accent1 +theme.border_marked = theme.color.maroon + +theme.menu_font = helpers.ui.set_font("12", theme.font) +theme.menu_bg_focus = theme.color.base +theme.menu_fg_focus = theme.color.accent2 +theme.menu_border_width = dpi(2) +theme.menu_border_color = theme.color.surface0 +theme.submenu = config.icons.arr.r .. " " +theme.menu_height = dpi(37) +theme.menu_width = dpi(194) + +theme.tasklist_bg_focus = theme.color.base +theme.tasklist_fg_focus = theme.color.lavender +theme.tasklist_disable_icon = true +theme.tasklist_font = helpers.ui.set_font("11", theme.font) + +theme.taglist_spacing = dpi(2) +theme.taglist_bg_focus = theme.color.base +theme.taglist_disable_icon = true +theme.taglist_font = helpers.ui.set_font("11", theme.font) +theme.taglist_fg_focus = theme.color.accent2 +theme.taglist_fg_empty = theme.color.surface2 +theme.taglist_fg_occupied = theme.color.sky + +-- Generate taglist squares: +local taglist_square_size = dpi(0) +theme.taglist_squares_sel = theme_assets.taglist_squares_sel(taglist_square_size, theme.color.accent2) +theme.taglist_squares_unsel = theme_assets.taglist_squares_unsel(taglist_square_size, theme.taglist_fg_occupied) + +-- Edge Snap +theme.snap_bg = theme.color.accent1 +theme.snap_border_width = dpi(5) +theme.snap_shape = helpers.ui.rrect(0) + +-- Hotkey Popup +theme.hotkeys_shape = helpers.ui.rrect(12) +theme.hotkeys_border_color = theme.color.accent1 +theme.hotkeys_modifiers_fg = theme.color.overlay2 +theme.hotkeys_font = helpers.ui.set_font("10", theme.font) +theme.hotkeys_description_font = helpers.ui.set_font("10", theme.font) + +-- Layoutlist +theme.layoutlist_shape_selected = helpers.ui.rrect(7) + +-- Tabs +theme.mstab_bar_height = dpi(1) +theme.mstab_dont_resize_slaves = true +theme.mstab_bar_padding = dpi(10) +theme.mstab_border_radius = dpi(6) +theme.mstab_bar_ontop = false +theme.mstab_tabbar_position = "top" +theme.mstab_tabbar_style = "default" +theme.mstab_bar_disable = true + +-- Layout Machi +theme.machi_switcher_border_color = theme.color.surface0 +theme.machi_switcher_border_opacity = 0.4 +theme.machi_editor_border_color = theme.color.surface1 +theme.machi_editor_border_opacity = 0.4 +theme.machi_editor_active_opacity = 0.4 + +-- Bling +theme.tag_preview_widget_border_radius = dpi(6) +theme.tag_preview_client_border_radius = dpi(6) +theme.tag_preview_client_opacity = 1 +theme.tag_preview_client_bg = theme.color.base +theme.tag_preview_client_border_color = theme.color.surface0 +theme.tag_preview_client_border_width = dpi(2) +theme.tag_preview_widget_border_color = theme.color.accent1 +theme.tag_preview_widget_border_width = dpi(2) +theme.tag_preview_widget_margin = 4 + +-- Notifications +theme.notification_spacing = dpi(4) +theme.notification_bg = theme.color.base + +-- Titlebar icons +theme.titlebar_close_button_normal = theme_path .. "titlebar/unfocus.svg" +theme.titlebar_close_button_focus = theme_path .. "titlebar/close.svg" +theme.titlebar_close_button_normal_hover = theme_path .. "titlebar/close_hover.svg" +theme.titlebar_close_button_focus_hover = theme_path .. "titlebar/close_hover.svg" + +theme.titlebar_minimize_button_normal = theme_path .. "titlebar/unfocus.svg" +theme.titlebar_minimize_button_focus = theme_path .. "titlebar/minimize.svg" +theme.titlebar_minimize_button_normal_hover = theme_path .. "titlebar/minimize_hover.svg" +theme.titlebar_minimize_button_focus_hover = theme_path .. "titlebar/minimize_hover.svg" + +theme.titlebar_ontop_button_normal_inactive = theme_path .. "titlebar/unfocus.svg" +theme.titlebar_ontop_button_focus_inactive = theme_path .. "titlebar/ontop.svg" + +theme.titlebar_ontop_button_normal_active = theme_path .. "titlebar/unfocus.svg" +theme.titlebar_ontop_button_focus_active = theme_path .. "titlebar/ontop.svg" + +theme.titlebar_maximized_button_normal_active = theme_path .. "titlebar/unfocus.svg" +theme.titlebar_maximized_button_focus_active = theme_path .. "titlebar/maximize.svg" +theme.titlebar_maximized_button_normal_active_hover = theme_path .. "titlebar/maximize_hover.svg" +theme.titlebar_maximized_button_focus_active_hover = theme_path .. "titlebar/maximize_hover.svg" + +theme.titlebar_maximized_button_normal_inactive = theme_path .. "titlebar/unfocus.svg" +theme.titlebar_maximized_button_focus_inactive = theme_path .. "titlebar/maximize.svg" +theme.titlebar_maximized_button_normal_inactive_hover = theme_path .. "titlebar/maximize_hover.svg" +theme.titlebar_maximized_button_focus_inactive_hover = theme_path .. "titlebar/maximize_hover.svg" + +-- Layout icons +theme.layout_floating = theme_path .. "layouts/floating.png" +theme.layout_max = theme_path .. "layouts/max.png" +theme.layout_tile = theme_path .. "layouts/tile.png" +theme.layout_dwindle = theme_path .. "layouts/dwindle.png" +theme.layout_centered = theme_path .. "layouts/centered.png" +theme.layout_mstab = theme_path .. "layouts/mstab.png" +theme.layout_equalarea = theme_path .. "layouts/equalarea.png" +theme.layout_machi = theme_path .. "layouts/machi.png" + +-- Generate Awesome icon: +theme.awesome_icon = theme_assets.awesome_icon(theme.menu_height, theme.bg_focus, theme.fg_focus) + +-- Define the icon theme for application icons. If not set then the icons +-- from /usr/share/icons and /usr/share/icons/hicolor will be used. +theme.icon_theme = config.theme.icon_theme + +return theme diff --git a/dot_config/awesome/themes/catppuccin/titlebar/close.svg b/dot_config/awesome/themes/catppuccin/titlebar/close.svg new file mode 100644 index 0000000..e322f94 --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/titlebar/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dot_config/awesome/themes/catppuccin/titlebar/close_hover.svg b/dot_config/awesome/themes/catppuccin/titlebar/close_hover.svg new file mode 100644 index 0000000..ce5e14d --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/titlebar/close_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dot_config/awesome/themes/catppuccin/titlebar/maximize.svg b/dot_config/awesome/themes/catppuccin/titlebar/maximize.svg new file mode 100644 index 0000000..6e2c884 --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/titlebar/maximize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dot_config/awesome/themes/catppuccin/titlebar/maximize_hover.svg b/dot_config/awesome/themes/catppuccin/titlebar/maximize_hover.svg new file mode 100644 index 0000000..ec5e48a --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/titlebar/maximize_hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dot_config/awesome/themes/catppuccin/titlebar/minimize.svg b/dot_config/awesome/themes/catppuccin/titlebar/minimize.svg new file mode 100644 index 0000000..3c233b7 --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/titlebar/minimize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dot_config/awesome/themes/catppuccin/titlebar/minimize_hover.svg b/dot_config/awesome/themes/catppuccin/titlebar/minimize_hover.svg new file mode 100644 index 0000000..bfb63e6 --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/titlebar/minimize_hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dot_config/awesome/themes/catppuccin/titlebar/ontop.svg b/dot_config/awesome/themes/catppuccin/titlebar/ontop.svg new file mode 100644 index 0000000..901dd95 --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/titlebar/ontop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dot_config/awesome/themes/catppuccin/titlebar/unfocus.svg b/dot_config/awesome/themes/catppuccin/titlebar/unfocus.svg new file mode 100644 index 0000000..14ba0b1 --- /dev/null +++ b/dot_config/awesome/themes/catppuccin/titlebar/unfocus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dot_config/awesome/ui/info-panel/calendar.lua b/dot_config/awesome/ui/info-panel/calendar.lua new file mode 100644 index 0000000..143dffb --- /dev/null +++ b/dot_config/awesome/ui/info-panel/calendar.lua @@ -0,0 +1,85 @@ +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers") + +local dpi = beautiful.xresources.apply_dpi +local theme = beautiful.get() + +-- Creating Calendar +---------------------- + +-- copied from awesome doc and adjusted a bit +local styles = {} + +styles.month = { bg_color = theme.color.surface0 } +styles.normal = { + bg_color = theme.color.surface0, + padding = dpi(6), + fg_color = theme.color.subtext1, +} +styles.focus = { + fg_color = theme.color.yellow, + padding = dpi(6), + markup = function(t) + return "" .. t .. "" + end, +} +styles.header = { + fg_color = theme.color.blue, + markup = function(t) + return "" .. t .. "" + end, +} +styles.weekday = { + fg_color = theme.color.subtext1, + markup = function(t) + local f = helpers.ui.set_font("16") + return '' .. t .. "" + end, +} + +-- The Function +local function decorate_cell(widget, flag) + if flag == "monthheader" and not styles.monthheader then + flag = "header" + end + + local props = styles[flag] or {} + + if props.markup and widget.get_text and widget.set_markup then + widget:set_markup(props.markup(widget:get_text())) + end + + -- Change bg color for weekends + local ret = wibox.widget({ + { + widget, + margins = props.padding, + widget = wibox.container.margin, + }, + fg = props.fg_color, + bg = props.bg_color, + widget = wibox.container.background, + }) + + return ret +end + +local calendar = wibox.widget({ + date = os.date("*t"), + font = helpers.ui.set_font("14"), + fn_embed = decorate_cell, + widget = wibox.widget.calendar.month, +}) + +return wibox.widget({ + nil, + { + nil, + calendar, + expand = "none", + layout = wibox.layout.align.horizontal, + }, + expand = "none", + layout = wibox.layout.align.vertical, +}) diff --git a/dot_config/awesome/ui/info-panel/init.lua b/dot_config/awesome/ui/info-panel/init.lua new file mode 100644 index 0000000..5720f45 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/init.lua @@ -0,0 +1,121 @@ +local awful = require("awful") +local gears = require("gears") +local wibox = require("wibox") +local beautiful = require("beautiful") +local rubato = require("lib.rubato") + +local dpi = beautiful.xresources.apply_dpi +local theme = beautiful.get() + +-- Var +local width = dpi(410) +local height = awful.screen.focused().geometry.height - dpi(100) + +-- Helper +----------- + +local function round_widget(radius) + return function(cr, w, h) + gears.shape.rounded_rect(cr, w, h, radius) + end +end + +local function box_widget(widgets, _width, _height) + return wibox.widget({ + { + { + widgets, + margins = dpi(16), + widget = wibox.container.margin, + }, + forced_width = dpi(_width), + forced_height = dpi(_height), + shape = round_widget(8), + bg = theme.bg_focus, --for widget Rounded and Border + widget = wibox.container.background, + }, + margins = { left = dpi(20), right = dpi(20) }, + widget = wibox.container.margin, + }) +end + +-- Get widgets +local weather_widget = require("ui.info-panel.weather") +local profile_widget = require("ui.info-panel.profile") + +local calendar_widget = require("ui.info-panel.calendar") +local music_widget = require("ui.info-panel.music-player") + +-- Combine some widgets +local weather = box_widget(weather_widget, 380, 180) +local profile = box_widget(profile_widget, 380, 210) +local calendar = box_widget(calendar_widget, 380, 340) + +-- Sidebar +local sidebar = wibox({ + visible = false, + ontop = true, + width = width, + height = height, + y = dpi(60), + bg = theme.bg_normal, + border_width = theme.border_width * 2, + border_color = theme.border_normal, +}) + +-- Sidebar widget setup +sidebar:setup({ + { + profile, + music_widget, + weather, + calendar, + spacing = dpi(20), + layout = wibox.layout.fixed.vertical, + }, + margins = { top = dpi(20), bottom = dpi(20) }, + widget = wibox.container.margin, +}) + +-- Slide animation +local slide = rubato.timed({ + pos = awful.screen.focused().geometry.x - sidebar.width, + rate = 60, + intro = 0.2, + duration = 0.4, + subscribed = function(pos) + sidebar.x = awful.screen.focused().geometry.x + pos + end, +}) + +-- Timer of sidebar's death +sidebar.timer = gears.timer({ + timeout = 0.5, + single_shot = true, + callback = function() + sidebar.visible = not sidebar.visible + end, +}) + +sidebar.shape = function(cr, w, h) --Rounded Corners + gears.shape.rounded_rect(cr, w, h, 14) +end + +-- Toggle function +sidebar.toggle = function() + if sidebar.visible then + slide.target = awful.screen.focused().geometry.x - sidebar.width + sidebar.timer:start() + else + awesome.emit_signal("widget::update_uptime") + slide.target = awful.screen.focused().geometry.x + dpi(20) + sidebar.visible = not sidebar.visible + end +end + +-- Get signal to execute the function (if that makes sense) +awesome.connect_signal("sidebar::toggle", function() + sidebar.toggle() +end) + +return sidebar diff --git a/dot_config/awesome/ui/info-panel/music-player.lua b/dot_config/awesome/ui/info-panel/music-player.lua new file mode 100644 index 0000000..5e1b270 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/music-player.lua @@ -0,0 +1,256 @@ +local awful = require("awful") +local gears = require("gears") +local beautiful = require("beautiful") +local wibox = require("wibox") +local helpers = require("helpers") +local playerctl_daemon = require("signals.playerctl") +local config = require("config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +---- Music Player +---- ~~~~~~~~~~~~ + +local music_text = wibox.widget({ + font = helpers.ui.set_font("Medium 10"), + valign = "center", + widget = wibox.widget.textbox, +}) + +local music_art = wibox.widget({ + image = theme.music, + resize = true, + widget = wibox.widget.imagebox, +}) + +local music_art_container = wibox.widget({ + music_art, + forced_height = dpi(200), + forced_width = dpi(200), + widget = wibox.container.background, +}) + +local filter_color = { + type = "linear", + from = { 0, 0 }, + to = { 0, 160 }, + stops = { { 0, theme.color.surface0 .. "cc" }, { 1, theme.color.surface0 } }, +} + +local music_art_filter = wibox.widget({ + { + bg = filter_color, + forced_height = dpi(120), + forced_width = dpi(120), + widget = wibox.container.background, + }, + direction = "east", + widget = wibox.container.rotate, +}) + +local music_title = wibox.widget({ + font = helpers.ui.set_font("Regular 13"), + valign = "center", + widget = wibox.widget.textbox, +}) + +local music_artist = wibox.widget({ + font = helpers.ui.set_font("Bold 16"), + valign = "center", + widget = wibox.widget.textbox, +}) + +--- Volume Control +local function volume_control() + local volume_bar = wibox.widget({ + max_value = 100, + value = 100, + bar_height = dpi(12), + bar_width = dpi(4), + shape = helpers.ui.rrect(6), + bar_shape = helpers.ui.rrect(6), + color = theme.color.blue, + background_color = theme.color.surface0, + border_width = 0, + widget = wibox.widget.progressbar, + }) + + -- Update bar + local function set_slider_value(_, volume) + volume_bar.value = volume * 100 + end + + playerctl_daemon:connect_signal("volume", set_slider_value) + + volume_bar:connect_signal("button::press", function() + playerctl_daemon:disconnect_signal("volume", set_slider_value) + end) + + volume_bar:connect_signal("button::release", function() + playerctl_daemon:connect_signal("volume", set_slider_value) + end) + + local volume = wibox.widget({ + volume_bar, + direction = "east", + widget = wibox.container.rotate, + }) + + volume:buttons(gears.table.join( + -- Scroll - Increase or decrease volume + awful.button({}, 4, function() + awful.spawn.with_shell("playerctl volume 0.05+") + end), + + awful.button({}, 5, function() + awful.spawn.with_shell("playerctl volume 0.05-") + end) + )) + + return volume +end + +-- Player's Button +local toggle = wibox.widget.textbox() +toggle.font = helpers.ui.set_font("26") + +toggle:buttons(gears.table.join(awful.button({}, 1, function() + playerctl_daemon:play_pause() +end))) + +local next = wibox.widget.textbox() +next.font = helpers.ui.set_font("26") +next.markup = config.icons.music.next + +next:buttons(gears.table.join(awful.button({}, 1, function() + playerctl_daemon:next() +end))) + +local back = wibox.widget.textbox() +back.font = helpers.ui.set_font("26") +back.markup = config.icons.music.prev + +back:buttons(gears.table.join(awful.button({}, 1, function() + playerctl_daemon:previous() +end))) + +local function music() + return wibox.widget({ + { + { + music_art_container, + music_art_filter, + layout = wibox.layout.stack, + }, + { + { + { + music_text, + helpers.ui.vertical_pad(dpi(15)), + { + + { + widget = wibox.container.scroll.horizontal, + step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth, + fps = 60, + speed = 75, + music_artist, + }, + { + widget = wibox.container.scroll.horizontal, + step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth, + fps = 60, + speed = 75, + music_title, + }, + forced_width = dpi(170), + layout = wibox.layout.fixed.vertical, + }, + layout = wibox.layout.fixed.vertical, + }, + nil, + { + { + back, + toggle, + next, + spacing = dpi(25), + layout = wibox.layout.fixed.horizontal, + }, + forced_height = dpi(70), + top = dpi(10), + bottom = dpi(10), + right = dpi(10), + left = dpi(115), + widget = wibox.container.margin, + }, + expand = "none", + layout = wibox.layout.align.vertical, + }, + top = dpi(9), + bottom = dpi(9), + left = dpi(10), + right = dpi(10), + widget = wibox.container.margin, + }, + layout = wibox.layout.stack, + }, + forced_width = dpi(350), + shape = helpers.ui.prrect(8, false, true, true, false), + bg = theme.color.surface0, + widget = wibox.container.background, + }) +end + +local music_widget = wibox.widget({ + { + { + music(), + { + volume_control(), + margins = { top = dpi(0), bottom = dpi(0), left = dpi(10), right = dpi(10) }, + widget = wibox.container.margin, + }, + layout = wibox.layout.align.horizontal, + }, + forced_height = dpi(150), + bg = theme.color.base, + shape = helpers.ui.rrect(8), + widget = wibox.container.background, + }, + left = dpi(20), + right = dpi(10), + color = "#FF000000", + widget = wibox.container.margin, +}) + +--- playerctl +--- ------------- +playerctl_daemon:connect_signal("metadata", function(_, title, artist, album_path, _, _, _) + if title == "" then + title = "Nothing Playing" + end + if artist == "" then + artist = "Nothing Playing" + end + if album_path == "" then + album_path = theme.music + end + + music_art:set_image(gears.surface.load_uncached(album_path)) + music_title:set_markup_silently(helpers.ui.colorize_text(title, theme.color.subtext1)) + music_artist:set_markup_silently(helpers.ui.colorize_text(artist, theme.color.blue)) +end) + +playerctl_daemon:connect_signal("playback_status", function(_, playing, _) + if playing then + music_text:set_markup_silently(helpers.ui.colorize_text("Now Playing", theme.color.overlay0)) + toggle.markup = helpers.ui.colorize_text(config.icons.music.pause, theme.color.blue) + else + music_text:set_markup_silently(helpers.ui.colorize_text("Music", theme.color.overlay0)) + toggle.markup = helpers.ui.colorize_text(config.icons.music.play, theme.color.blue) + end +end) + +return music_widget diff --git a/dot_config/awesome/ui/info-panel/player.lua b/dot_config/awesome/ui/info-panel/player.lua new file mode 100644 index 0000000..b2b1e0e --- /dev/null +++ b/dot_config/awesome/ui/info-panel/player.lua @@ -0,0 +1,116 @@ +local awful = require("awful") +local gears = require("gears") +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers") +local config = require("config") + +local dpi = beautiful.xresources.apply_dpi + +-- Make Widgets +----------------- + +-- Song's Title +local title = wibox.widget.textbox() +title.font = helpers.ui.set_font("Medium 16") +title.halign = "left" +title.valign = "bottom" + +-- Song's Artist +local artist = wibox.widget.textbox() +artist.font = helpers.ui.set_font("Regular 16") +artist.halign = "left" +artist.valign = "bottom" + +-- Song's Length +local length = wibox.widget.textbox() +length.font = helpers.ui.set_font("Regular 14") +length.halign = "center" +length.valign = "center" + +-- Player's Button +local toggle = wibox.widget.textbox() +toggle.font = helpers.ui.set_font("26") + +toggle:buttons(gears.table.join(awful.button({}, 1, function() + awful.spawn("mpc toggle", false) + + if toggle.markup:match("󰏤") then + toggle.markup = config.icons.music.play + else + toggle.markup = config.icons.music.pause + end +end))) + +local next = wibox.widget.textbox() +next.font = helpers.ui.set_font("26") +next.markup = config.icons.music.next + +next:buttons(gears.table.join(awful.button({}, 1, function() + awful.spawn("mpc next", false) +end))) + +local back = wibox.widget.textbox() +back.font = helpers.ui.set_font("26") +back.markup = config.icons.music.prev + +back:buttons(gears.table.join(awful.button({}, 1, function() + awful.spawn("mpc prev", false) +end))) + +-- Get data +awesome.connect_signal("signal::player", function(t, a, l, s) + if not s:match("playing") then + toggle.markup = config.icons.music.play + else + toggle.markup = config.icons.music.pause + end + + title.markup = t + artist.markup = a + length.markup = l +end) + +-- Grouping Widgets +--------------------- + +local buttons = wibox.widget({ + back, + toggle, + next, + spacing = dpi(11), + layout = wibox.layout.fixed.horizontal, +}) + +return wibox.widget({ + { + nil, + { + title, + artist, + spacing = dpi(12), + layout = wibox.layout.fixed.vertical, + }, + expand = "none", + layout = wibox.layout.align.vertical, + }, + { + nil, + nil, + { + length, + { + nil, + buttons, + expand = "none", + layout = wibox.layout.align.horizontal, + }, + spacing = dpi(6), + layout = wibox.layout.fixed.vertical, + }, + top = dpi(30), + bottom = 0, + layout = wibox.container.margin, + }, + layout = wibox.layout.flex.horizontal, +}) diff --git a/dot_config/awesome/ui/info-panel/profile.lua b/dot_config/awesome/ui/info-panel/profile.lua new file mode 100644 index 0000000..f516f81 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/profile.lua @@ -0,0 +1,179 @@ +local awful = require("awful") +local wibox = require("wibox") +local gears = require("gears") +local beautiful = require("beautiful") +local helpers = require("helpers") +local config = require("config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local os_user = os.getenv("USER") + +if not os_user then + os_user = "user" +end + +-- Create Widgets +------------------- + +-- Pfp +local pfp = wibox.widget.imagebox() +pfp.image = require("config").theme.pfp +pfp.clip_shape = gears.shape.circle +pfp.forced_width = dpi(130) +pfp.forced_height = dpi(130) + +-- User +local user = wibox.widget.textbox() +user.font = helpers.ui.set_font("SemiBold 18") +user.halign = "left" +user.markup = helpers.ui.colorize_text(os_user, theme.fg_normal) + +-- Hostname +local hostname = wibox.widget.textbox() +hostname.font = helpers.ui.set_font("Regular 14") +hostname.halign = "left" + +awful.spawn.easy_async_with_shell("hostnamectl --static", function(stdout) + hostname.markup = helpers.ui.colorize_text("@" .. tostring(stdout), theme.color.lavender) +end) + +-- Battery +local uptimeosd = wibox.widget.textbox() +uptimeosd.font = helpers.ui.set_font("12") +uptimeosd.halign = "center" + +-- Get data 4 widgets! +awesome.connect_signal("signal::uptime", function(uptime) + uptimeosd.markup = helpers.ui.colorize_text("up " .. uptime, theme.fg_normal) +end) + +-- Spacing horizontally +local shutdown = wibox.widget({ + { + { + font = helpers.ui.set_font("30"), + markup = helpers.ui.colorize_text(config.icons.power, theme.color.red), + halign = "center", + valign = "center", + widget = wibox.widget.textbox, + }, + top = dpi(9), + bottom = dpi(9), + left = dpi(11), + right = dpi(11), + widget = wibox.container.margin, + }, + bg = theme.color.surface1, + shape = helpers.ui.rrect(8), + widget = wibox.container.background, +}) + +local reboot = wibox.widget({ + { + { + font = helpers.ui.set_font("30"), + markup = helpers.ui.colorize_text(config.icons.restart, theme.color.blue), + halign = "center", + valign = "center", + widget = wibox.widget.textbox, + }, + top = dpi(9), + bottom = dpi(9), + left = dpi(11), + right = dpi(11), + widget = wibox.container.margin, + }, + bg = theme.color.surface1, + shape = helpers.ui.rrect(8), + widget = wibox.container.background, +}) +shutdown:connect_signal("mouse::enter", function() + shutdown.bg = theme.color.surface2 +end) + +shutdown:connect_signal("mouse::leave", function() + shutdown.bg = theme.color.surface1 +end) + +reboot:connect_signal("mouse::enter", function() + reboot.bg = theme.color.surface2 +end) + +reboot:connect_signal("mouse::leave", function() + reboot.bg = theme.color.surface1 +end) + +shutdown:buttons(gears.table.join(awful.button({}, 1, function() + awesome.emit_signal("module::exit_screen:show") +end))) + +reboot:buttons(gears.table.join(awful.button({}, 1, function() + awful.spawn.with_shell("loginctl reboot") +end))) + +-- Grouping widgets +--------------------- +local buttons = wibox.widget({ + { + reboot, + shutdown, + spacing = dpi(8), + layout = wibox.layout.fixed.horizontal, + }, + top = dpi(10), + left = dpi(57), + widget = wibox.container.margin, +}) + +local name = wibox.widget({ + { + user, + hostname, + spacing = dpi(4), + layout = wibox.layout.fixed.vertical, + }, + left = 0, + widget = wibox.container.margin, +}) + +local uptimebox = wibox.widget({ + { + { + uptimeosd, + spacing = dpi(2), + layout = wibox.layout.fixed.vertical, + }, + top = dpi(3), + bottom = dpi(3), + widget = wibox.container.margin, + }, + bg = theme.color.surface0, + shape = helpers.ui.rrect(7), + widget = wibox.container.background, +}) + +-- The Profile Widget +return wibox.widget({ + { + { + pfp, + uptimebox, + spacing = dpi(20), + layout = wibox.layout.fixed.vertical, + }, + layout = wibox.layout.fixed.vertical, + }, + { + { + name, + buttons, + layout = wibox.layout.fixed.vertical, + }, + top = dpi(30), + layout = wibox.container.margin, + }, + spacing = dpi(30), + layout = wibox.layout.fixed.horizontal, +}) diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-clear-night.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-clear-night.svg new file mode 100644 index 0000000..ecf451a --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-clear-night.svg @@ -0,0 +1,3 @@ + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-clear-sky.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-clear-sky.svg new file mode 100644 index 0000000..e84065c --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-clear-sky.svg @@ -0,0 +1,3 @@ + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-clouds-night.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-clouds-night.svg new file mode 100644 index 0000000..1a00dff --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-clouds-night.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-clouds.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-clouds.svg new file mode 100644 index 0000000..d709745 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-clouds.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-few-clouds-night.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-few-clouds-night.svg new file mode 100644 index 0000000..e8243ae --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-few-clouds-night.svg @@ -0,0 +1,4 @@ + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-few-clouds.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-few-clouds.svg new file mode 100644 index 0000000..7279f9f --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-few-clouds.svg @@ -0,0 +1,3 @@ + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-fog.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-fog.svg new file mode 100644 index 0000000..81d0a39 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-fog.svg @@ -0,0 +1,3 @@ + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-freezing-rain.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-freezing-rain.svg new file mode 100644 index 0000000..d83c93a --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-freezing-rain.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-overcast-symbolic.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-overcast-symbolic.svg new file mode 100644 index 0000000..79a543f --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-overcast-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-overcast.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-overcast.svg new file mode 100644 index 0000000..e85bb96 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-overcast.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-severe-alert.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-severe-alert.svg new file mode 100644 index 0000000..3a512f7 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-severe-alert.svg @@ -0,0 +1,4 @@ + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-showers-scattered.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-showers-scattered.svg new file mode 100644 index 0000000..7749e85 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-showers-scattered.svg @@ -0,0 +1,4 @@ + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-showers.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-showers.svg new file mode 100644 index 0000000..b0f387f --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-showers.svg @@ -0,0 +1,4 @@ + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-snow-rain.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-snow-rain.svg new file mode 100644 index 0000000..391fac5 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-snow-rain.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-snow-scattered.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-snow-scattered.svg new file mode 100644 index 0000000..9be2009 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-snow-scattered.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-snow.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-snow.svg new file mode 100644 index 0000000..d1f7d1c --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-snow.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-storm.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-storm.svg new file mode 100644 index 0000000..cb2cba6 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-storm.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/dot_config/awesome/ui/info-panel/weather/icons/weather-windy.svg b/dot_config/awesome/ui/info-panel/weather/icons/weather-windy.svg new file mode 100644 index 0000000..65bec4f --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/icons/weather-windy.svg @@ -0,0 +1,3 @@ + + + diff --git a/dot_config/awesome/ui/info-panel/weather/init.lua b/dot_config/awesome/ui/info-panel/weather/init.lua new file mode 100644 index 0000000..b9437e2 --- /dev/null +++ b/dot_config/awesome/ui/info-panel/weather/init.lua @@ -0,0 +1,229 @@ +local awful = require("awful") +local wibox = require("wibox") +local gears = require("gears") +local beautiful = require("beautiful") +local json = require("lib.json") +local helpers = require("helpers") + +local config = require("config").widget.weather + +local dpi = beautiful.xresources.apply_dpi +local icon_dir = gears.filesystem.get_configuration_dir() .. "ui/info-panel/weather/icons/" + +--- Weather Widget +--- ~~~~~~~~~~~~~~ + +local GET_FORECAST_CMD = [[bash -c "curl -s --show-error -X GET '%s'"]] + +local icon_map = { + ["01d"] = "weather-clear-sky", + ["02d"] = "weather-few-clouds", + ["03d"] = "weather-clouds", + ["04d"] = "weather-few-clouds", + ["09d"] = "weather-showers-scattered", + ["10d"] = "weather-showers", + ["11d"] = "weather-strom", + ["13d"] = "weather-snow", + ["50d"] = "weather-fog", + ["01n"] = "weather-clear-night", + ["02n"] = "weather-few-clouds-night", + ["03n"] = "weather-clouds-night", + ["04n"] = "weather-clouds-night", + ["09n"] = "weather-showers-scattered", + ["10n"] = "weather-showers", + ["11n"] = "weather-strom", + ["13n"] = "weather-snow", + ["50n"] = "weather-fog", +} + +local current_weather_widget = wibox.widget({ + { + { + id = "icon", + image = icon_dir .. "weather-showers.svg", + resize = true, + forced_height = dpi(42), + forced_width = dpi(42), + widget = wibox.widget.imagebox, + }, + { + { + { + id = "description", + text = "Mostly cloudy", + font = helpers.ui.set_font("Bold 10"), + widget = wibox.widget.textbox, + }, + { + id = "humidity", + text = "Humidity: 80%", + font = helpers.ui.set_font("9"), + widget = wibox.widget.textbox, + }, + layout = wibox.layout.fixed.vertical, + }, + widget = wibox.container.place, + }, + spacing = dpi(10), + layout = wibox.layout.fixed.horizontal, + }, + nil, + { + { + { + id = "temp_current", + markup = "20°", + halign = "right", + font = helpers.ui.set_font("Bold 16"), + widget = wibox.widget.textbox, + }, + { + id = "feels_like", + markup = "Feels like: 19°", + font = helpers.ui.set_font("8"), + widget = wibox.widget.textbox, + }, + spacing = dpi(-6), + layout = wibox.layout.fixed.vertical, + }, + widget = wibox.container.place, + }, + layout = wibox.layout.align.horizontal, +}) + +local hourly_widget = function() + local widget = wibox.widget({ + { + { + id = "time", + text = "12PM", + font = helpers.ui.set_font("9"), + widget = wibox.widget.textbox, + }, + widget = wibox.container.place, + }, + { + { + id = "icon", + image = icon_dir .. "weather-clear-sky.svg", + resize = true, + forced_height = dpi(16), + forced_width = dpi(16), + widget = wibox.widget.imagebox, + }, + widget = wibox.container.place, + }, + { + { + id = "temp", + markup = "1°", + font = helpers.ui.set_font("9"), + widget = wibox.widget.textbox, + }, + widget = wibox.container.place, + }, + spacing = dpi(6), + layout = wibox.layout.fixed.vertical, + }) + + widget.update = function(result) + local time = widget:get_children_by_id("time")[1] + local icon = widget:get_children_by_id("icon")[1] + local temp = widget:get_children_by_id("temp")[1] + + temp:set_markup(math.floor(result.temp) .. "°") + + time:set_text(os.date("%I%p", tonumber(result.dt))) + + icon.image = icon_dir .. icon_map[result.weather[1].icon] .. ".svg" + + icon:emit_signal("widget::redraw_needed") + end + + return widget +end + +local hourly_widget_1 = hourly_widget() +local hourly_widget_2 = hourly_widget() +local hourly_widget_3 = hourly_widget() +local hourly_widget_4 = hourly_widget() +local hourly_widget_5 = hourly_widget() +local hourly_widget_6 = hourly_widget() + +local weather_widget = wibox.widget({ + { + text = "Weather", + font = helpers.ui.set_font("Bold 16"), + halign = "center", + widget = wibox.widget.textbox, + }, + current_weather_widget, + { + hourly_widget_1, + hourly_widget_2, + hourly_widget_3, + hourly_widget_4, + hourly_widget_5, + hourly_widget_6, + spacing = dpi(10), + layout = wibox.layout.flex.horizontal, + }, + spacing = dpi(10), + layout = wibox.layout.fixed.vertical, +}) + +local show_hourly_forecast = true +local show_daily_forecast = true + +local url = ( + "https://api.openweathermap.org/data/2.5/onecall" + .. "?lat=" + .. config.coordinates.lat + .. "&lon=" + .. config.coordinates.lon + .. "&appid=" + .. config.api_key + .. "&units=" + .. config.units + .. "&exclude=minutely" + .. (show_hourly_forecast == false and ",hourly" or "") + .. (show_daily_forecast == false and ",daily" or "") +) + +awful.widget.watch(string.format(GET_FORECAST_CMD, url), 600, function(_, stdout, stderr) + if stderr == "" then + local result = json.decode(stdout) + + if not result.current then + return + end + + -- Current weather setup + local icon = current_weather_widget:get_children_by_id("icon")[1] + local description = current_weather_widget:get_children_by_id("description")[1] + local humidity = current_weather_widget:get_children_by_id("humidity")[1] + local temp_current = current_weather_widget:get_children_by_id("temp_current")[1] + local feels_like = current_weather_widget:get_children_by_id("feels_like")[1] + + icon.image = icon_dir .. icon_map[result.current.weather[1].icon] .. ".svg" + icon:emit_signal("widget::redraw_needed") + + description:set_text(result.current.weather[1].description:gsub("^%l", string.upper)) + + humidity:set_text("Humidity: " .. result.current.humidity .. "%") + + temp_current:set_markup(math.floor(result.current.temp) .. "°") + + feels_like:set_markup("Feels like: " .. math.floor(result.current.feels_like) .. "°") + + -- Hourly widget setup + hourly_widget_1.update(result.hourly[1]) + hourly_widget_2.update(result.hourly[2]) + hourly_widget_3.update(result.hourly[3]) + hourly_widget_4.update(result.hourly[4]) + hourly_widget_5.update(result.hourly[5]) + hourly_widget_6.update(result.hourly[6]) + end +end) + +return weather_widget diff --git a/dot_config/awesome/ui/init.lua b/dot_config/awesome/ui/init.lua new file mode 100644 index 0000000..7b7d1af --- /dev/null +++ b/dot_config/awesome/ui/init.lua @@ -0,0 +1,5 @@ +require("ui.popups") +require("ui.notif-panel") +require("ui.info-panel") +require("ui.top-panel") +require("ui.titlebar") diff --git a/dot_config/awesome/ui/notif-panel/init.lua b/dot_config/awesome/ui/notif-panel/init.lua new file mode 100644 index 0000000..04deb87 --- /dev/null +++ b/dot_config/awesome/ui/notif-panel/init.lua @@ -0,0 +1,334 @@ +local gears = require("gears") +local awful = require("awful") +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers") +local naughty = require("naughty") +local rubato = require("lib.rubato") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local notifs_text = wibox.widget({ + font = helpers.ui.set_font("Bold 20"), + markup = "Notifications", + halign = "center", + widget = wibox.widget.textbox, +}) + +local notifs_clear = wibox.widget({ + markup = helpers.ui.colorize_text(" ", theme.color.red), + font = helpers.ui.set_font("Bold 21"), + halign = "center", + valign = "center", + widget = wibox.widget.textbox, +}) + +notifs_clear:buttons(gears.table.join(awful.button({}, 1, function() + _G.Notif_center_reset_notifs_container() +end))) + +helpers.ui.add_hover_cursor(notifs_clear, "hand2") + +local notifs_empty = wibox.widget({ + { + nil, + { + nil, + { + markup = helpers.ui.colorize_text("Nothing Here!", theme.color.subtext1), + font = helpers.ui.set_font("Bold 17"), + halign = "center", + valign = "center", + widget = wibox.widget.textbox, + }, + layout = wibox.layout.align.vertical, + }, + layout = wibox.layout.align.horizontal, + }, + forced_height = dpi(730), + widget = wibox.container.background, + bg = theme.color.surface0, + shape = helpers.ui.rrect(8), +}) + +local notifs_container = wibox.widget({ + spacing = dpi(10), + spacing_widget = { + { + shape = helpers.ui.rrect(8), + widget = wibox.container.background, + }, + top = dpi(2), + bottom = dpi(2), + left = dpi(6), + right = dpi(6), + widget = wibox.container.margin, + }, + forced_width = dpi(320), + forced_height = dpi(730), --Use it like in notifs_empty else it will look weird + layout = wibox.layout.fixed.vertical, +}) + +local remove_notifs_empty = true + +Notif_center_reset_notifs_container = function() + notifs_container:reset(notifs_container) + notifs_container:insert(1, notifs_empty) + remove_notifs_empty = true +end + +Notif_center_remove_notif = function(box) + notifs_container:remove_widgets(box) + + if #notifs_container.children == 0 then + notifs_container:insert(1, notifs_empty) + remove_notifs_empty = true + end +end + +local create_notif = function(icon, n) + local time = os.date("%H:%M") + local box = {} + + box = wibox.widget({ + { + { + { + { + image = icon, + resize = true, + clip_shape = helpers.ui.rrect(8), + halign = "center", + valign = "center", + widget = wibox.widget.imagebox, + }, + strategy = "exact", + height = dpi(50), + width = dpi(50), + widget = wibox.container.constraint, + }, + { + { + nil, + { + { + { + step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth, + speed = dpi(50), + { + markup = n.title, + font = helpers.ui.set_font("Bold 9"), + halign = "left", + widget = wibox.widget.textbox, + }, + forced_width = dpi(140), + widget = wibox.container.scroll.horizontal, + }, + nil, + { + markup = helpers.ui.colorize_text(time, theme.color.subtext1), + halign = "right", + valign = "bottom", + font = helpers.ui.set_font("Bold 10"), + widget = wibox.widget.textbox, + }, + expand = "none", + layout = wibox.layout.align.horizontal, + }, + { + step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth, + speed = dpi(50), + { + markup = n.message, + halign = "left", + widget = wibox.widget.textbox, + }, + forced_width = dpi(165), + widget = wibox.container.scroll.horizontal, + }, + spacing = dpi(3), + layout = wibox.layout.fixed.vertical, + }, + expand = "none", + layout = wibox.layout.align.vertical, + }, + left = dpi(17), + widget = wibox.container.margin, + }, + layout = wibox.layout.align.horizontal, + }, + margins = dpi(15), + widget = wibox.container.margin, + }, + forced_height = dpi(85), + widget = wibox.container.background, + bg = theme.color.surface0, + shape = helpers.ui.rrect(8), + }) + + box:buttons(gears.table.join(awful.button({}, 1, function() + _G.Notif_center_remove_notif(box) + end))) + + return box +end + +notifs_container:buttons(gears.table.join( + awful.button({}, 4, nil, function() + if #notifs_container.children == 1 then + return + end + notifs_container:insert(1, notifs_container.children[#notifs_container.children]) + notifs_container:remove(#notifs_container.children) + end), + + awful.button({}, 5, nil, function() + if #notifs_container.children == 1 then + return + end + notifs_container:insert(#notifs_container.children + 1, notifs_container.children[1]) + notifs_container:remove(1) + end) +)) + +notifs_container:insert(1, notifs_empty) + +naughty.connect_signal("request::display", function(n) + if #notifs_container.children == 1 and remove_notifs_empty then + notifs_container:reset(notifs_container) + remove_notifs_empty = false + end + + local appicon = n.icon or n.app_icon + if not appicon then + appicon = theme.pfp --notification_icon + end + + notifs_container:insert(1, create_notif(appicon, n)) +end) + +local notifs = wibox.widget({ + { + { + { + nil, + notifs_text, + notifs_clear, + expand = "none", + layout = wibox.layout.align.horizontal, + }, + left = dpi(5), + right = dpi(5), + top = dpi(7), + bottom = dpi(7), + layout = wibox.container.margin, + }, + widget = wibox.container.background, + bg = theme.color.surface0, + shape = helpers.ui.rrect(8), + }, + notifs_container, + spacing = dpi(20), + layout = wibox.layout.fixed.vertical, +}) + +local actions = wibox.widget({ + { + { + { + widget = require("ui.notif-panel.widgets.vol_slider"), + }, + { + widget = require("ui.notif-panel.widgets.mic_slider"), + }, + layout = wibox.layout.flex.vertical, + spacing = dpi(1), + }, + widget = wibox.container.margin, + top = dpi(20), + bottom = dpi(20), + left = dpi(35), + right = dpi(35), + }, + forced_height = dpi(120), + widget = wibox.container.background, + bg = theme.color.surface0, + shape = helpers.ui.rrect(8), +}) + +-- Sidebar +local action = wibox({ + visible = false, + ontop = true, + width = dpi(410), + height = awful.screen.focused().geometry.height - dpi(100), + y = dpi(60), + bg = theme.bg_normal, + border_width = theme.border_width * 2, + border_color = theme.border_normal, +}) + +-- Sidebar widget setup +action:setup({ + { + notifs, + nil, + actions, + spacing = dpi(20), + layout = wibox.layout.align.vertical, + }, + margins = { + top = dpi(20), + bottom = dpi(20), + left = dpi(20), + right = dpi(20), + }, + widget = wibox.container.margin, +}) + +-- Slide animation +local slide = rubato.timed({ + pos = awful.screen.focused().geometry.x - awful.screen.focused().geometry.width, + rate = 60, + intro = 0.2, + duration = 0.4, + subscribed = function(pos) + action.x = awful.screen.focused().geometry.x - pos + end, +}) + +-- Timer of action's death +action.timer = gears.timer({ + timeout = 0.5, + single_shot = true, + callback = function() + action.visible = not action.visible + end, +}) +action.shape = function(cr, w, h) --Rounded Corners + gears.shape.rounded_rect(cr, w, h, 14) +end + +-- Toggle function +action.toggle = function() + if action.visible then + slide.target = awful.screen.focused().geometry.x - awful.screen.focused().geometry.width + action.timer:start() + else + awesome.emit_signal("widget::update_vol") + awesome.emit_signal("widget::update_mic") + slide.target = awful.screen.focused().geometry.x + - awful.screen.focused().geometry.width + + action.width + + dpi(25) + action.visible = not action.visible + end +end + +-- Get signal to execute the function (if that makes sense) +awesome.connect_signal("action::toggle", function() + action.toggle() +end) + +return action diff --git a/dot_config/awesome/ui/notif-panel/widgets/bri_slider.lua b/dot_config/awesome/ui/notif-panel/widgets/bri_slider.lua new file mode 100644 index 0000000..7cb05e0 --- /dev/null +++ b/dot_config/awesome/ui/notif-panel/widgets/bri_slider.lua @@ -0,0 +1,50 @@ +local gears = require("gears") +local awful = require("awful") +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local slider = wibox.widget({ + bar_shape = helpers.ui.rrect(9), + bar_height = 6, + bar_color = theme.bg_focus, + bar_active_color = theme.color.yellow, + handle_shape = gears.shape.circle, + handle_color = theme.color.yellow, + handle_width = dpi(12), + value = dpi(25), + widget = wibox.widget.slider, +}) + +helpers.ui.add_hover_cursor(slider, "hand1") + +local bri_slider = wibox.widget({ + { + markup = helpers.ui.colorize_text("󰃞 ", theme.color.yellow), + font = helpers.ui.set_font("14"), + halign = "center", + valign = "center", + widget = wibox.widget.textbox(), + }, + slider, + layout = wibox.layout.fixed.horizontal, + spacing = 0, +}) + +awful.spawn.easy_async_with_shell( + "brightnessctl | grep -i 'current' | awk '{ print $4}' | tr -d \"(%)\"", + function(stdout) + local value = string.gsub(stdout, "^%s*(.-)%s*$", "%1") + bri_slider.value = tonumber(value) + end +) + +slider:connect_signal("property::value", function(_, new_value) + slider.value = new_value + awful.spawn("brightnessctl set " .. new_value .. "%", false) +end) + +return bri_slider diff --git a/dot_config/awesome/ui/notif-panel/widgets/mic_slider.lua b/dot_config/awesome/ui/notif-panel/widgets/mic_slider.lua new file mode 100644 index 0000000..338538e --- /dev/null +++ b/dot_config/awesome/ui/notif-panel/widgets/mic_slider.lua @@ -0,0 +1,124 @@ +local awful = require("awful") +local gears = require("gears") +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local config = require("config") +local microphone = config.widget.mic.name + +local slider = wibox.widget({ + bar_shape = helpers.ui.rrect(9), + bar_height = dpi(6), + bar_color = theme.color.base, + bar_active_color = theme.color.blue, + handle_shape = gears.shape.circle, + handle_color = theme.color.blue, + handle_width = dpi(12), + value = dpi(75), + forced_width = dpi(239), + widget = wibox.widget.slider, +}) + +local osd_value = wibox.widget({ + text = "0%", + font = helpers.ui.set_font("10"), + widget = wibox.widget.textbox(), +}) +local icon = wibox.widget({ + markup = helpers.ui.colorize_text("󰍬", theme.color.blue), + font = helpers.ui.set_font("14"), + halign = "center", + valign = "center", + widget = wibox.widget.textbox(), +}) + +local function get_val() + awesome.connect_signal("signal::mic", function(_, muted) + if muted then + icon.markup = helpers.ui.colorize_text("󰍭", theme.color.blue) + icon.font = helpers.ui.set_font("14") + else + icon.markup = helpers.ui.colorize_text("󰍬", theme.color.blue) + icon.font = helpers.ui.set_font("17") + end + end) +end + +get_val() + +icon:buttons(gears.table.join(awful.button({}, 1, function() + local script = "pamixer --source" .. microphone .. "-t" + + awful.spawn(script, false) + awesome.emit_signal("widget::update_mic") +end))) + +slider:buttons(gears.table.join( + awful.button({}, 4, nil, function() + if slider:get_value() > 100 then + slider:set_value(100) + return + end + slider:set_value(slider:get_value() + 5) + end), + + awful.button({}, 5, nil, function() + if slider:get_value() < 0 then + slider:set_value(0) + return + end + slider:set_value(slider:get_value() - 5) + end) +)) + +helpers.ui.add_hover_cursor(slider, "hand1") +helpers.ui.add_hover_cursor(icon, "hand2") + +local mic_slider = wibox.widget({ + { + { + layout = wibox.layout.fixed.horizontal, + icon, + }, + left = 0, + right = dpi(14), + top = dpi(5), + bottom = dpi(5), + layout = wibox.container.margin, + }, + slider, + layout = wibox.layout.fixed.horizontal, + { + { + layout = wibox.layout.fixed.horizontal, + osd_value, + }, + left = dpi(3), + right = 0, + top = 0, + bottom = 0, + layout = wibox.container.margin, + }, +}) + +local update_microphone = function() -- Sets the Volume Correct + awful.spawn.easy_async_with_shell("pamixer --source " .. microphone .. " --get-volume", function(stdout) + slider.value = tonumber(stdout:match("%d+")) + end) +end + +awesome.connect_signal("widget::update_mic", function() + update_microphone() +end) + +slider:connect_signal("property::value", function(_, new_value) + awful.spawn("pamixer --source " .. microphone .. " --set-volume " .. new_value, false) + local volume_level = slider:get_value() + osd_value.text = volume_level .. "%" +end) + +return mic_slider diff --git a/dot_config/awesome/ui/notif-panel/widgets/vol_slider.lua b/dot_config/awesome/ui/notif-panel/widgets/vol_slider.lua new file mode 100644 index 0000000..4b4c1f4 --- /dev/null +++ b/dot_config/awesome/ui/notif-panel/widgets/vol_slider.lua @@ -0,0 +1,124 @@ +local awful = require("awful") +local gears = require("gears") +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local slider = wibox.widget({ + bar_shape = helpers.ui.rrect(9), + bar_height = dpi(6), + bar_color = theme.color.base, + bar_active_color = theme.color.blue, + handle_shape = gears.shape.circle, + handle_color = theme.color.blue, + handle_width = dpi(12), + value = dpi(75), + forced_width = dpi(239), + widget = wibox.widget.slider, +}) + +local osd_value = wibox.widget({ + text = "0%", + font = helpers.ui.set_font("10"), + widget = wibox.widget.textbox(), +}) +local icon = wibox.widget({ + markup = helpers.ui.colorize_text("󰕾 ", theme.color.blue), + font = helpers.ui.set_font("14"), + halign = "center", + valign = "center", + widget = wibox.widget.textbox(), +}) + +local function get_val() + awesome.connect_signal("signal::volume", function(_, muted) + if muted then + icon.markup = helpers.ui.colorize_text("󰖁", theme.color.blue) + else + icon.markup = helpers.ui.colorize_text("󰕾", theme.color.blue) + end + end) +end + +get_val() + +icon:buttons(gears.table.join(awful.button({}, 1, function() + local script = "pamixer -t" + + awful.spawn(script, false) + awesome.emit_signal("widget::update_vol") +end))) + +slider:buttons(gears.table.join( + awful.button({}, 4, nil, function() + if slider:get_value() > 100 then + slider:set_value(100) + return + end + slider:set_value(slider:get_value() + 5) + end), + + awful.button({}, 5, nil, function() + if slider:get_value() < 0 then + slider:set_value(0) + return + end + slider:set_value(slider:get_value() - 5) + end) +)) + +helpers.ui.add_hover_cursor(slider, "hand1") +helpers.ui.add_hover_cursor(icon, "hand2") + +local vol_slider = wibox.widget({ + { + { + layout = wibox.layout.fixed.horizontal, + icon, + }, + left = 0, + right = dpi(14), + top = dpi(5), + bottom = dpi(5), + layout = wibox.container.margin, + }, + slider, + layout = wibox.layout.fixed.horizontal, + { + { + layout = wibox.layout.fixed.horizontal, + osd_value, + }, + left = dpi(3), + right = 0, + top = 0, + bottom = 0, + layout = wibox.container.margin, + }, +}) + +local update_volume = function() -- Sets the Volume Correct + awful.spawn.easy_async_with_shell("pamixer --get-volume", function(stdout) + slider.value = tonumber(stdout:match("%d+")) + end) +end + +awesome.connect_signal("widget::update_vol", function() + update_volume() +end) + +awesome.connect_signal("widget::update_vol_slider", function(volume_level) + slider:set_value(volume_level) +end) + +slider:connect_signal("property::value", function(_, new_value) + awful.spawn("pamixer --set-volume " .. new_value, false) + awesome.emit_signal("widget::update_vol_pulse") -- update_vol_pulse doesn't Update Volume Signal + local volume_level = slider:get_value() + osd_value.text = volume_level .. "%" +end) + +return vol_slider diff --git a/dot_config/awesome/ui/popups/init.lua b/dot_config/awesome/ui/popups/init.lua new file mode 100644 index 0000000..8d6ae8b --- /dev/null +++ b/dot_config/awesome/ui/popups/init.lua @@ -0,0 +1,10 @@ +local req = { + "layout", + "notifications", + "scratchpad", + "volume", +} + +for _, x in pairs(req) do + require(... .. "." .. x) +end diff --git a/dot_config/awesome/ui/popups/layout/init.lua b/dot_config/awesome/ui/popups/layout/init.lua new file mode 100644 index 0000000..08b5a28 --- /dev/null +++ b/dot_config/awesome/ui/popups/layout/init.lua @@ -0,0 +1,131 @@ +local awful = require("awful") +local gears = require("gears") +local beautiful = require("beautiful") +local wibox = require("wibox") + +local keys = require("config").keys +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local ll = awful.widget.layoutlist({ + base_layout = wibox.widget({ + spacing = dpi(5), + forced_num_cols = dpi(4), + layout = wibox.layout.grid.vertical, + }), + + widget_template = { + { + { + id = "icon_role", + forced_height = dpi(1), + forced_width = dpi(1), + widget = wibox.widget.imagebox, + }, + margins = dpi(15), + widget = wibox.container.margin, + }, + id = "background_role", + forced_width = dpi(70), + forced_height = dpi(70), + shape = gears.shape.rounded_rect, + widget = wibox.container.background, + }, +}) + +local layout_popup = awful.popup({ + widget = wibox.widget({ + ll, + margins = 4, --border margins (padding) + widget = wibox.container.margin, + }), + + border_color = theme.border_normal, + bg = theme.bg_normal, + border_width = theme.border_width, + placement = awful.placement.centered, + ontop = true, + visible = false, + shape = gears.shape.rounded_rect, +}) + +function gears.table.iterate_value(t, value, step_size, filter, _) + local k = gears.table.hasitem(t, value) + if not k then + return + end + + step_size = step_size or 1 + local new_key = gears.math.cycle(#t, k + step_size) + + if filter and not filter(t[new_key]) then + for i = 1, #t do + local k2 = gears.math.cycle(#t, new_key + i) + if filter(t[k2]) then + return t[k2], k2 + end + end + + return + end + + return t[new_key], new_key +end + +-- Timer for Death of PopUp +layout_popup.timer = gears.timer({ + timeout = 0.8, + single_shot = true, + callback = function() + layout_popup.visible = false + end, +}) + +function layout_popup.changed() + layout_popup.visible = true + if not layout_popup.visible then + layout_popup.timer:start() + else + layout_popup.timer:again() + end +end + +-- Mouse Support +layout_popup:connect_signal("mouse::enter", function() + layout_popup.timer:stop() +end) +layout_popup:connect_signal("mouse::leave", function() + layout_popup.timer:start() +end) + +awful.keygrabber({ + start_callback = function() + layout_popup.visible = true + end, + + stop_callback = function() + layout_popup.visible = false + end, + + export_keybindings = true, + stop_event = "release", + stop_key = { "Escape", "Super_L", "Super_R" }, + + keybindings = { + { + { keys.mod }, + " ", + function() + awful.layout.set(gears.table.iterate_value(ll.layouts, ll.current_layout, 1), layout_popup.changed()) + end, + }, + + { + { keys.mod, "Shift" }, + " ", + function() + awful.layout.set(gears.table.iterate_value(ll.layouts, ll.current_layout, -1), layout_popup.changed()) + end, + }, + }, +}) diff --git a/dot_config/awesome/ui/popups/notifications/error.lua b/dot_config/awesome/ui/popups/notifications/error.lua new file mode 100644 index 0000000..5414ce0 --- /dev/null +++ b/dot_config/awesome/ui/popups/notifications/error.lua @@ -0,0 +1,12 @@ +local naughty = require("naughty") + +--- Check if awesome encountered an error during startup and fell back to +--- another config (This code will only ever execute for the fallback config) +naughty.connect_signal("request::display_error", function(message, startup) + naughty.notification({ + urgency = "critical", + app_name = "Awesome", + title = "Oops, an error happened" .. (startup and " during startup!" or "!"), + message = message, + }) +end) diff --git a/dot_config/awesome/ui/popups/notifications/init.lua b/dot_config/awesome/ui/popups/notifications/init.lua new file mode 100644 index 0000000..6f4590d --- /dev/null +++ b/dot_config/awesome/ui/popups/notifications/init.lua @@ -0,0 +1,350 @@ +local gears = require("gears") +local wibox = require("wibox") +local awful = require("awful") +local beautiful = require("beautiful") +local naughty = require("naughty") +local helpers = require("helpers") +local menubar = require("menubar") +local animation = require("lib.animation") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +--- Naughty Notifications with animation +--- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +naughty.persistence_enabled = true +naughty.config.defaults.ontop = true +naughty.config.defaults.timeout = 6 +naughty.config.defaults.title = "System Notification" +naughty.config.defaults.position = "top_right" + +local function get_oldest_notification() + for _, notification in ipairs(naughty.active) do + if notification and notification.timeout > 0 then + return notification + end + end + + --- Fallback to first one. + return naughty.active[1] +end + +--- Handle notification icon +naughty.connect_signal("request::icon", function(n, context, hints) + --- Handle other contexts here + if context ~= "app_icon" then + return + end + + --- Use XDG icon + local path = menubar.utils.lookup_icon(hints.app_icon) or menubar.utils.lookup_icon(hints.app_icon:lower()) + + if path then + n.icon = path + end +end) + +--- Use XDG icon +naughty.connect_signal("request::action_icon", function(a, _, hints) + a.icon = menubar.utils.lookup_icon(hints.id) +end) + +naughty.connect_signal("request::display", function(n) + --- random accent color + local accent_colors = theme.color.accent + + --- table of icons + local app_icons = { + ["firefox"] = { icon = "" }, + ["discord"] = { icon = "󰙯" }, + ["music"] = { icon = "󰝚" }, + ["screenshot tool"] = { icon = "󰊓" }, + } + + local app_icon = nil + local tolow = string.lower + + if app_icons[tolow(n.app_name)] then + app_icon = app_icons[tolow(n.app_name)].icon + else + app_icon = "󰂚" + end + + local app_icon_n = wibox.widget({ + { + font = helpers.ui.set_font("Round 13"), + markup = helpers.ui.colorize_text(app_icon, theme.color.base), + halign = "center", + valign = "center", + widget = wibox.widget.textbox, + }, + bg = accent_colors, + widget = wibox.container.background, + shape = gears.shape.circle, + forced_height = dpi(20), + forced_width = dpi(20), + }) + + local icon = wibox.widget({ + { + { + { + image = n.icon, + resize = true, + clip_shape = gears.shape.circle, + halign = "center", + valign = "center", + widget = wibox.widget.imagebox, + }, + border_width = dpi(2), + border_color = accent_colors, + shape = gears.shape.circle, + widget = wibox.container.background, + }, + strategy = "exact", + height = dpi(50), + width = dpi(50), + widget = wibox.container.constraint, + }, + { + nil, + nil, + { + nil, + nil, + app_icon_n, + layout = wibox.layout.align.horizontal, + expand = "none", + }, + layout = wibox.layout.align.vertical, + expand = "none", + }, + layout = wibox.layout.stack, + }) + + local app_name = wibox.widget({ + font = helpers.ui.set_font("Bold 12"), + text = n.app_name:gsub("^%l", string.upper), + widget = wibox.widget.textbox, + }) + + local dismiss = wibox.widget({ + { + font = helpers.ui.set_font("Bold 10"), + markup = helpers.ui.colorize_text("", theme.color.accent), + widget = wibox.widget.textbox, + valign = "center", + halign = "center", + }, + margins = dpi(4), + widget = wibox.container.margin, + }) + + dismiss:buttons(gears.table.join(awful.button({}, 1, function() + n:destroy(naughty.notification_closed_reason.dismissed_by_user) + end))) + + local timeout_arc = wibox.widget({ + widget = wibox.container.arcchart, + forced_width = dpi(26), + forced_height = dpi(26), + max_value = 100, + min_value = 0, + value = 0, + thickness = dpi(4), + rounded_edge = true, + bg = theme.color.base, + colors = { + { + type = "linear", + from = { 0, 0 }, + to = { 400, 400 }, + stops = { + { 0, accent_colors }, + { 0.2, accent_colors }, + { 0.4, accent_colors }, + { 0.6, accent_colors }, + { 0.8, accent_colors }, + }, + }, + }, + dismiss, + }) + + local title2 = wibox.widget.textbox() + title2.font = helpers.ui.set_font("Bold 11") + title2.text = n.title + + local title = wibox.widget({ + widget = wibox.container.scroll.horizontal, + step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth, + fps = 60, + speed = 75, + title2, + }) + + local message2 = wibox.widget.textbox() + message2.font = helpers.ui.set_font("11") + message2.text = n.message + + local message = wibox.widget({ + widget = wibox.container.scroll.horizontal, + step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth, + fps = 60, + speed = 75, + message2, + }) + + local actions = wibox.widget({ + notification = n, + + base_layout = wibox.widget({ + spacing = dpi(3), + layout = wibox.layout.flex.horizontal, + }), + + widget_template = { + { + { + { + id = "text_role", + font = helpers.ui.set_font("10"), + widget = wibox.widget.textbox, + }, + left = dpi(6), + right = dpi(6), + widget = wibox.container.margin, + }, + widget = wibox.container.place, + }, + bg = theme.color.base, + forced_height = dpi(25), + forced_width = dpi(70), + widget = wibox.container.background, + }, + style = { + underline_normal = false, + underline_selected = true, + }, + widget = naughty.list.actions, + }) + + local widget = naughty.layout.box({ + notification = n, + type = "notification", + cursor = "hand2", + shape = helpers.ui.rrect(12), + border_color = theme.color.surface0, + border_width = dpi(3), + maximum_width = dpi(350), + maximum_height = dpi(180), + bg = "#00000000", + + widget_template = { + { + layout = wibox.layout.fixed.vertical, + { + { + { + layout = wibox.layout.align.horizontal, + app_name, + nil, + timeout_arc, + }, + margins = { top = dpi(3), bottom = dpi(3), left = dpi(15), right = dpi(15) }, + widget = wibox.container.margin, + }, + bg = theme.color.surface0, + widget = wibox.container.background, + }, + { + { + layout = wibox.layout.fixed.vertical, + { + layout = wibox.layout.fixed.horizontal, + spacing = dpi(10), + icon, + { + expand = "none", + layout = wibox.layout.align.vertical, + nil, + { + layout = wibox.layout.fixed.vertical, + title, + message, + }, + nil, + }, + }, + { + helpers.ui.vertical_pad(dpi(10)), + { + actions, + shape = helpers.ui.rrect(0), + widget = wibox.container.background, + }, + visible = n.actions and #n.actions > 0, + layout = wibox.layout.fixed.vertical, + }, + }, + margins = dpi(15), + widget = wibox.container.margin, + }, + }, + --- Anti-aliasing container + shape = helpers.ui.rrect(0), + bg = theme.color.base, + widget = wibox.container.background, + }, + }) + + --- Don't destroy the notification on click --- + widget.buttons = {} + + --- Disables Hand Cursor in Whole wibox --- + helpers.ui.add_hover_cursor(widget, "left_ptr") + + --- Adds Close Cursor on Close Sign --- + helpers.ui.add_hover_cursor(dismiss, "hand2") + + local anim = animation:new({ + duration = n.timeout, + target = 100, + easing = animation.easing.linear, + reset_on_stop = false, + update = function(_, pos) + timeout_arc.value = pos + end, + }) + + anim:connect_signal("ended", function() + n:reset_timeout(0.0000001) + end) + + widget:connect_signal("mouse::enter", function() + n:reset_timeout(0) + anim:stop() + end) + + widget:connect_signal("mouse::leave", function() + anim:start() + end) + + local notification_height = widget.height + theme.notification_spacing + local total_notifications_height = #naughty.active * notification_height + + if total_notifications_height > n.screen.workarea.height then + get_oldest_notification():destroy(naughty.notification_closed_reason.too_many_on_screen) + end + + anim:start() + + --- Destroy popups notifs if dont_disturb mode is on + ---@diagnostic disable-next-line: undefined-field + if _G.dnd_state then + naughty.destroy_all_notifications(nil, 1) + end +end) + +require(... .. ".error") diff --git a/dot_config/awesome/ui/popups/notifications/playerctl.lua b/dot_config/awesome/ui/popups/notifications/playerctl.lua new file mode 100644 index 0000000..7343b37 --- /dev/null +++ b/dot_config/awesome/ui/popups/notifications/playerctl.lua @@ -0,0 +1,20 @@ +local naughty = require("naughty") +local playerctl_daemon = require("signals.playerctl") +local beautiful = require("beautiful") + +local theme = beautiful.get() + +playerctl_daemon:connect_signal("metadata", function(_, title, artist, album_path, _, new, _) + if album_path == "" then -- Sets Image for Notification -- + album_path = theme.music + end + + if new == true then + naughty.notify({ + app_name = "Music", + title = title, + text = artist, + image = album_path, + }) + end +end) diff --git a/dot_config/awesome/ui/popups/scratchpad/init.lua b/dot_config/awesome/ui/popups/scratchpad/init.lua new file mode 100644 index 0000000..a0661c9 --- /dev/null +++ b/dot_config/awesome/ui/popups/scratchpad/init.lua @@ -0,0 +1,27 @@ +local bling = require("lib.bling") +local rubato = require("lib.rubato") + +-- These are example rubato tables. You can use one for just y, just x, or both. +-- The duration and easing is up to you. Please check out the rubato docs to learn more. +local anim_y = rubato.timed({ + pos = -1000, + rate = 60, + intro = 0.2, + duration = 0.4, + awestore_compat = true, -- This option must be set to true. +}) + +local term_scratch = bling.module.scratchpad({ + command = "alacritty --class spad", -- How to spawn the scratchpad + rule = { instance = "spad" }, -- The rule that the scratchpad will be searched by + sticky = true, -- Whether the scratchpad should be sticky + autoclose = true, -- Whether it should hide itself when losing focus + floating = true, -- Whether it should be floating (MUST BE TRUE FOR ANIMATIONS) + geometry = { x = 456, y = 33, height = 600, width = 1000 }, -- The geometry in a floating state + reapply = true, -- Whether all those properties should be reapplied on every new opening of the scratchpad (MUST BE TRUE FOR ANIMATIONS) + dont_focus_before_close = false, -- When set to true, the scratchpad will be closed by the toggle function regardless of whether its focused or not. When set to false, the toggle function will first bring the scratchpad into focus and only close it on a second call + rubato = { y = anim_y }, -- Optional. This is how you can pass in the rubato tables for animations. If you don't want animations, you can ignore this option. +}) +awesome.connect_signal("scratchpad::toggle", function() + term_scratch:toggle() +end) diff --git a/dot_config/awesome/ui/popups/volume/init.lua b/dot_config/awesome/ui/popups/volume/init.lua new file mode 100644 index 0000000..98a3f84 --- /dev/null +++ b/dot_config/awesome/ui/popups/volume/init.lua @@ -0,0 +1,284 @@ +local gears = require("gears") +local awful = require("awful") +local beautiful = require("beautiful") +local wibox = require("wibox") +local helpers = require("helpers") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +--- Volume OSD +--- ~~~~~~~~~~ +local icon = wibox.widget({ + { + id = "icon2", + image = theme.volume_on, + resize = true, + widget = wibox.widget.imagebox, + }, + forced_height = dpi(150), + top = dpi(12), + bottom = dpi(12), + widget = wibox.container.margin, +}) + +local icon3 = icon.icon2 + +local osd_header = wibox.widget({ + text = "Volume", + font = helpers.ui.set_font("Bold 12"), + halign = "left", + valign = "center", + widget = wibox.widget.textbox, +}) + +local osd_value = wibox.widget({ + text = "0%", + font = helpers.ui.set_font("Bold 12"), + halign = "center", + valign = "center", + widget = wibox.widget.textbox, +}) + +local slider_osd = wibox.widget({ + nil, + { + id = "vol_osd_slider", + bar_shape = gears.shape.rounded_rect, + bar_height = dpi(12), + bar_color = theme.color.surface0, + bar_active_color = theme.color.blue, + handle_color = theme.color.blue, + handle_shape = gears.shape.circle, + handle_width = dpi(24), + handle_border_color = "#00000012", + handle_border_width = dpi(1), + maximum = 100, + widget = wibox.widget.slider, + }, + nil, + expand = "none", + layout = wibox.layout.align.vertical, +}) + +local vol_osd_slider = slider_osd.vol_osd_slider + +vol_osd_slider:buttons(gears.table.join( + awful.button({}, 4, nil, function() + if vol_osd_slider:get_value() > 100 then + vol_osd_slider:set_value(100) + return + end + vol_osd_slider:set_value(vol_osd_slider:get_value() + 5) + end), + + awful.button({}, 5, nil, function() + if vol_osd_slider:get_value() < 0 then + vol_osd_slider:set_value(0) + return + end + vol_osd_slider:set_value(vol_osd_slider:get_value() - 5) + end) +)) + +helpers.ui.add_hover_cursor(vol_osd_slider, "hand1") + +local update_volume = function() -- Sets the Volume Correct + awful.spawn.easy_async_with_shell("pamixer --get-volume", function(stdout) + vol_osd_slider.value = tonumber(stdout:match("%d+")) + end) +end + +awesome.connect_signal("widget::update_vol", function() + update_volume() +end) + +update_volume() + +vol_osd_slider:connect_signal("property::value", function(_, new_value) + local volume_level = vol_osd_slider:get_value() + awful.spawn("pamixer --set-volume " .. new_value, false) + + -- Update textbox widget text + osd_value.text = volume_level .. "%" + + -- Update the volume slider if values here change + awesome.emit_signal("widget::update_vol_pulse") + awesome.emit_signal("widget::update_vol_slider", volume_level) + + if awful.screen.focused().show_vol_osd then + awesome.emit_signal("module::volume_osd:show", true) + end +end) + +vol_osd_slider:connect_signal("button::press", function() + awful.screen.focused().show_vol_osd = true +end) + +vol_osd_slider:connect_signal("mouse::enter", function() + awful.screen.focused().show_vol_osd = true +end) + +-- The emit will come from the volume-slider +awesome.connect_signal("module::volume_osd", function(volume) + vol_osd_slider:set_value(volume) +end) + +local volume_osd_height = dpi(250) +local volume_osd_width = dpi(250) + +screen.connect_signal("request::desktop_decoration", function(s) + s = s or {} + s.show_vol_osd = false + + s.volume_osd_overlay = awful.popup({ + type = "notification", + screen = s, + shape = helpers.ui.rrect(15), + height = volume_osd_height, + width = volume_osd_width, + maximum_height = volume_osd_height, + maximum_width = volume_osd_width, + bg = theme.color.transparent, + offset = dpi(5), + border_width = dpi(3), + border_color = theme.color.surface0, + ontop = true, + visible = false, + preferred_anchors = "middle", + preferred_positions = { "left", "right", "top", "bottom" }, + widget = { + { + { + layout = wibox.layout.fixed.vertical, + { + { + layout = wibox.layout.align.horizontal, + expand = "none", + nil, + icon, + nil, + }, + { + layout = wibox.layout.fixed.vertical, + spacing = dpi(5), + { + layout = wibox.layout.align.horizontal, + expand = "none", + osd_header, + nil, + osd_value, + }, + slider_osd, + }, + spacing = dpi(10), + layout = wibox.layout.fixed.vertical, + }, + }, + left = dpi(24), + right = dpi(24), + widget = wibox.container.margin, + }, + bg = theme.color.base, + widget = wibox.container.background, + }, + }) + + -- Reset timer on mouse hover + s.volume_osd_overlay:connect_signal("mouse::enter", function() + awful.screen.focused().show_vol_osd = true + awesome.emit_signal("module::volume_osd:rerun") + end) +end) + +local hide_osd = gears.timer({ + timeout = 1, + autostart = true, + callback = function() + local focused = awful.screen.focused() + focused.volume_osd_overlay.visible = false + focused.show_vol_osd = false + end, +}) + +awesome.connect_signal("module::volume_osd:rerun", function() + if hide_osd.started then + hide_osd:again() + else + hide_osd:start() + end +end) + +local placement_placer = function() + local focused = awful.screen.focused() + local volume_osd = focused.volume_osd_overlay + awful.placement.centered(volume_osd) +end + +-- Get Vol +local function get_vol() + local script = "pamixer --get-volume" + local script2 = "pamixer --get-mute" + + awful.spawn.easy_async_with_shell(script, function() + awful.spawn.easy_async_with_shell(script2, function(is_mute) + local muted + + if is_mute:match("true") then + muted = true + else + muted = false + end + + if muted then + vol_osd_slider.bar_active_color = theme.color.red + vol_osd_slider.handle_color = theme.color.red + icon3.image = theme.volume_off + else + vol_osd_slider.bar_active_color = theme.color.blue + vol_osd_slider.handle_color = theme.color.blue + icon3.image = theme.volume_on + end + end) + end) +end + +awesome.connect_signal("module::volume_osd:show", function(bool) + placement_placer() + + awful.screen.focused().volume_osd_overlay.visible = bool + + if bool then + awesome.emit_signal("module::volume_osd:rerun") + awesome.emit_signal("module::brightness_osd:show", false) + else + if hide_osd.started then + hide_osd:stop() + end + end +end) + +local volume = {} + +volume.increase = function() + local script = "pamixer -i 5" + + awful.spawn(script, false) + get_vol() +end + +volume.decrease = function() + local script = "pamixer -d 5" + + awful.spawn(script, false) + get_vol() +end + +volume.mute = function() + local script = "pamixer -t" + + awful.spawn(script, false) + get_vol() +end + +return volume diff --git a/dot_config/awesome/ui/titlebar/init.lua b/dot_config/awesome/ui/titlebar/init.lua new file mode 100644 index 0000000..598c1c3 --- /dev/null +++ b/dot_config/awesome/ui/titlebar/init.lua @@ -0,0 +1,57 @@ +local awful = require("awful") +local gears = require("gears") +local wibox = require("wibox") +local xresources = require("beautiful.xresources") + +local dpi = xresources.apply_dpi + +-- Add a titlebar if titlebars_enabled is set to true in the rules. +client.connect_signal("request::titlebars", function(c) + -- buttons for the titlebar + local buttons = gears.table.join( + awful.button({}, 1, function() + c:activate({ context = "titlebar", action = "mouse_move" }) + end), + + awful.button({}, 3, function() + c:activate({ context = "titlebar", action = "mouse_resize" }) + end) + ) + + local titlebar_top = awful.titlebar(c, { + size = 30, + expand = "none", + }) + + local left = { + buttons = buttons, + layout = wibox.layout.fixed.horizontal(), + } + + local middle = { + buttons = buttons, + layout = wibox.layout.fixed.horizontal(), + } + + local right = { + awful.titlebar.widget.maximizedbutton(c), + awful.titlebar.widget.minimizebutton(c), + awful.titlebar.widget.closebutton(c), + spacing = dpi(11.5), + layout = wibox.layout.fixed.horizontal(), + } + + titlebar_top:setup({ + { + left, + middle, + right, + layout = wibox.layout.align.horizontal(), + }, + left = dpi(13.5), + right = dpi(13.5), + top = dpi(7.4), + bottom = dpi(7.4), + layout = wibox.container.margin, + }) +end) diff --git a/dot_config/awesome/ui/top-panel/config.lua b/dot_config/awesome/ui/top-panel/config.lua new file mode 100644 index 0000000..7f03189 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/config.lua @@ -0,0 +1,13 @@ +local beautiful = require("beautiful") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local M = { + margin = theme.useless_gap * 2, + padding = theme.useless_gap / 1.5, +} + +M.height = (M.padding * 2) + dpi(20) + +return M diff --git a/dot_config/awesome/ui/top-panel/init.lua b/dot_config/awesome/ui/top-panel/init.lua new file mode 100644 index 0000000..9a86e65 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/init.lua @@ -0,0 +1,110 @@ +local awful = require("awful") +local wibox = require("wibox") +local widgets = require("ui.top-panel.widgets") +local beautiful = require("beautiful") +local gears = require("gears") +local vars = require("ui.top-panel.config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +screen.connect_signal("request::desktop_decoration", function(s) + local clockdate = wibox.widget({ + layout = wibox.layout.fixed.horizontal, + widgets.date, + widgets.clock, + }) + + local tasklist = wibox.widget({ + { + layout = wibox.layout.fixed.horizontal, + s.tasklist, -- needs to be here (under the screen.connect_signal) bc of the s + }, + forced_width = dpi(300), + layout = wibox.layout.fixed.horizontal, + }) + + local layoutbox = awful.widget.layoutbox({ + screen = s, + buttons = { + awful.button({}, 1, function() + awful.layout.inc(1) + end), + + awful.button({}, 3, function() + awful.layout.inc(-1) + end), + + awful.button({}, 4, function() + awful.layout.inc(-1) + end), + + awful.button({}, 5, function() + awful.layout.inc(1) + end), + }, + }) + + -- Create the wibox + s.mywibox = awful.wibar({ + position = "top", + screen = s, + margins = { + top = vars.margin, + right = vars.margin, + left = vars.margin, + }, + border_width = theme.border_width, + border_color = theme.border_normal, + height = vars.height, + shape = gears.shape.rounded_rect, + + widget = { + layout = wibox.layout.align.horizontal, + expand = "none", + { + { -- Left widgets + layout = wibox.layout.fixed.horizontal, + widgets.menu, + widgets.seperator, + s.taglist, + widgets.seperator, + tasklist, + }, + left = theme.useless_gap, + right = 0, + top = vars.padding, + bottom = vars.padding, + layout = wibox.container.margin, + }, + { + { + layout = wibox.layout.align.horizontal, + clockdate, + }, + left = 0, + right = 0, + top = vars.padding, + bottom = vars.padding, + layout = wibox.container.margin, + }, + { -- Right widgets + { + layout = wibox.layout.fixed.horizontal, + widgets.systray, + widgets.seperator, + widgets.audio, + widgets.mem, + widgets.cpu, + widgets.disk, + layoutbox, + }, + left = 0, + right = theme.useless_gap, + top = vars.padding, + bottom = vars.padding, + layout = wibox.container.margin, + }, + }, + }) +end) diff --git a/dot_config/awesome/ui/top-panel/widgets/clock.lua b/dot_config/awesome/ui/top-panel/widgets/clock.lua new file mode 100644 index 0000000..b84def2 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/clock.lua @@ -0,0 +1,34 @@ +local gears = require("gears") +local wibox = require("wibox") +local helpers = require("helpers") +local config = require("config") +local beautiful = require("beautiful") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local clock_icon = helpers.ui.create_icon(config.icons.clock, theme.color.pink) + +local clock = wibox.widget.textbox() +clock.font = helpers.ui.set_font("11") + +gears.timer({ + timeout = 60, + autostart = true, + call_now = true, + callback = function() + clock.markup = os.date(config.widget.clock.format) + end, +}) + +return wibox.widget({ + { + clock_icon, + clock, + spacing = dpi(8), + layout = wibox.layout.fixed.horizontal, + }, + left = dpi(1), + right = dpi(1), + layout = wibox.container.margin, +}) diff --git a/dot_config/awesome/ui/top-panel/widgets/cpu.lua b/dot_config/awesome/ui/top-panel/widgets/cpu.lua new file mode 100644 index 0000000..9201546 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/cpu.lua @@ -0,0 +1,47 @@ +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers.ui") +local config = require("config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +-- Icon +local icon = helpers.create_icon(config.icons.cpu, theme.color.maroon) + +-- Uptime +local cpu = wibox.widget.textbox() +cpu.font = helpers.set_font("10") +cpu.halign = "center" + +local function get_val() + awesome.connect_signal("signal::cpu", function(cpu_perc) + if cpu_perc then + cpu_perc = tonumber(cpu_perc) + else + cpu_perc = "?" + end + + cpu.markup = cpu_perc .. "%" + end) +end + +get_val() + +local full = wibox.widget({ + { + { + icon, + cpu, + spacing = dpi(8), + layout = wibox.layout.fixed.horizontal, + }, + left = dpi(1), + right = 0, + layout = wibox.container.margin, + }, + forced_width = dpi(73), -- Makes it fixed and not Moves Whole Bar + layout = wibox.layout.fixed.horizontal, +}) + +return full diff --git a/dot_config/awesome/ui/top-panel/widgets/date.lua b/dot_config/awesome/ui/top-panel/widgets/date.lua new file mode 100644 index 0000000..17dace5 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/date.lua @@ -0,0 +1,34 @@ +local gears = require("gears") +local wibox = require("wibox") +local helpers = require("helpers") +local beautiful = require("beautiful") +local config = require("config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local icon = helpers.ui.create_icon(config.icons.cal, theme.color.teal) + +local date = wibox.widget.textbox() +date.font = helpers.ui.set_font("11") + +gears.timer({ + timeout = 60, + autostart = true, + call_now = true, + callback = function() + date.markup = os.date(config.widget.date.format) + end, +}) + +return wibox.widget({ + { + icon, + date, + spacing = dpi(8), + layout = wibox.layout.fixed.horizontal, + }, + left = dpi(1), + right = dpi(1), + layout = wibox.container.margin, +}) diff --git a/dot_config/awesome/ui/top-panel/widgets/disk.lua b/dot_config/awesome/ui/top-panel/widgets/disk.lua new file mode 100644 index 0000000..941b556 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/disk.lua @@ -0,0 +1,39 @@ +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers.ui") +local config = require("config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +-- Icon +local icon = helpers.create_icon(config.icons.disk, theme.color.yellow) + +-- Uptime +local disk = wibox.widget.textbox() +disk.font = helpers.set_font("10") +disk.halign = "center" + +local function get_val() + awesome.connect_signal("signal::disk", function(disk_perc) + if disk_perc then + disk.markup = tonumber(disk_perc) .. "%" + end + end) +end + +get_val() + +local full = wibox.widget({ + { + icon, + disk, + spacing = dpi(8), + layout = wibox.layout.fixed.horizontal, + }, + left = dpi(1), + right = dpi(8), + layout = wibox.container.margin, +}) + +return full diff --git a/dot_config/awesome/ui/top-panel/widgets/init.lua b/dot_config/awesome/ui/top-panel/widgets/init.lua new file mode 100644 index 0000000..9ef50c1 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/init.lua @@ -0,0 +1,14 @@ +return { + clock = require(... .. ".clock"), + cpu = require(... .. ".cpu"), + date = require(... .. ".date"), + disk = require(... .. ".disk"), + mem = require(... .. ".mem"), + menu = require(... .. ".menu"), + promptbox = require(... .. ".promptbox"), + audio = require(... .. ".pulseaudio"), + seperator = require(... .. ".seperator"), + systray = require(... .. ".systray"), + taglist = require(... .. ".taglist"), + tasklist = require(... .. ".tasklist"), +} diff --git a/dot_config/awesome/ui/top-panel/widgets/launcher.lua b/dot_config/awesome/ui/top-panel/widgets/launcher.lua new file mode 100644 index 0000000..52a5662 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/launcher.lua @@ -0,0 +1,7 @@ +local awful = require("awful") +local theme = require("beautiful").get() +local menu = require("main.menu") + +local launcher = awful.widget.launcher({ image = theme.awesome_icon, menu = menu }) + +return launcher diff --git a/dot_config/awesome/ui/top-panel/widgets/mem.lua b/dot_config/awesome/ui/top-panel/widgets/mem.lua new file mode 100644 index 0000000..b534066 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/mem.lua @@ -0,0 +1,41 @@ +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers.ui") +local config = require("config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +-- Icon +local icon = helpers.create_icon(config.icons.mem, theme.color.green) + +-- Uptime +local mem = wibox.widget.textbox() +mem.font = helpers.set_font("10") +mem.halign = "center" + +local function get_val() + awesome.connect_signal("signal::mem", function(mem_perc) + mem.markup = tonumber(mem_perc) .. "%" + end) +end + +get_val() + +local full = wibox.widget({ + { + { + icon, + mem, + spacing = dpi(8), + layout = wibox.layout.fixed.horizontal, + }, + left = dpi(1), + right = 0, + layout = wibox.container.margin, + }, + forced_width = dpi(73), + layout = wibox.layout.fixed.horizontal, +}) + +return full diff --git a/dot_config/awesome/ui/top-panel/widgets/menu.lua b/dot_config/awesome/ui/top-panel/widgets/menu.lua new file mode 100644 index 0000000..00688fd --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/menu.lua @@ -0,0 +1,26 @@ +local awful = require("awful") +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers.ui") +local config = require("config") + +local dpi = beautiful.xresources.apply_dpi + +-- Menu +local menu = wibox.widget({ + { + font = helpers.set_font("16"), + markup = config.icons.menu, + widget = wibox.widget.textbox(), + }, + bottom = dpi(2), + widget = wibox.container.margin, +}) + +helpers.add_hover_cursor(menu, "hand2") + +menu:add_button(awful.button({}, 1, function() + awesome.emit_signal("sidebar::toggle") +end)) + +return menu diff --git a/dot_config/awesome/ui/top-panel/widgets/power.lua b/dot_config/awesome/ui/top-panel/widgets/power.lua new file mode 100644 index 0000000..a952d46 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/power.lua @@ -0,0 +1,18 @@ +local awful = require("awful") +local wibox = require("wibox") +local beautiful = require("beautiful") +local config = require("config") +local helpers = require("helpers") + +local theme = beautiful.get() + +-- Menu +local menu = wibox.widget.textbox() +menu.font = helpers.ui.set_font("16") +menu.markup = helpers.ui.colorize_text(config.icons.power, theme.color.red) + +menu:add_button(awful.button({}, 1, function() + awesome.emit_signal("module::exit_screen:show") +end)) + +return menu diff --git a/dot_config/awesome/ui/top-panel/widgets/promptbox.lua b/dot_config/awesome/ui/top-panel/widgets/promptbox.lua new file mode 100644 index 0000000..06ce84a --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/promptbox.lua @@ -0,0 +1,5 @@ +local awful = require("awful") + +local promptbox = awful.widget.prompt() + +return promptbox diff --git a/dot_config/awesome/ui/top-panel/widgets/pulseaudio.lua b/dot_config/awesome/ui/top-panel/widgets/pulseaudio.lua new file mode 100644 index 0000000..e4d1e5c --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/pulseaudio.lua @@ -0,0 +1,80 @@ +local awful = require("awful") +local wibox = require("wibox") +local beautiful = require("beautiful") +local helpers = require("helpers") +local config = require("config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +-- Icon +local icon = helpers.ui.create_icon(config.icons.vol.on, theme.color.blue) + +-- Uptime +local pulseaudio = wibox.widget.textbox() +pulseaudio.font = helpers.ui.set_font("10") +pulseaudio.halign = "center" + +local function get_val() + awesome.connect_signal("signal::volume", function(vol, muted) + if muted then + pulseaudio.markup = "muted" + icon.markup = helpers.ui.colorize_text(config.icons.vol.off, theme.color.blue) + else + pulseaudio.markup = tonumber(vol) .. "%" + icon.markup = helpers.ui.colorize_text(config.icons.vol.on, theme.color.blue) + end + end) +end + +get_val() + +local full = wibox.widget({ + { + { + icon, + pulseaudio, + spacing = dpi(8), + layout = wibox.layout.fixed.horizontal, + }, + left = dpi(5), + right = dpi(8), + layout = wibox.container.margin, + }, + forced_width = dpi(73), + layout = wibox.layout.fixed.horizontal, +}) + +full:add_button(awful.button({}, 1, function() + awesome.emit_signal("action::toggle") +end)) + +-- Update Function +local update_volume = function() + awful.spawn.easy_async_with_shell("pamixer --get-volume", function(stdout) + pulseaudio.markup = tonumber(stdout:match("%d+")) .. "%" + + if tonumber(stdout:match("%d+")) < 10 then + icon.markup = helpers.ui.colorize_text(config.icons.vol.low, theme.color.blue) + elseif tonumber(stdout:match("%d+")) < 50 then + icon.markup = helpers.ui.colorize_text(config.icons.vol.med, theme.color.blue) + elseif tonumber(stdout:match("%d+")) < 100 then + icon.markup = helpers.ui.colorize_text(config.icons.vol.high, theme.color.blue) + else + end + end) +end + +update_volume() + +awesome.connect_signal("widget::update_vol", function() + update_volume() +end) + +awesome.connect_signal("widget::update_vol_pulse", function() + update_volume() +end) + +helpers.ui.add_hover_cursor(full, "hand2") + +return full diff --git a/dot_config/awesome/ui/top-panel/widgets/seperator.lua b/dot_config/awesome/ui/top-panel/widgets/seperator.lua new file mode 100644 index 0000000..183a7e1 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/seperator.lua @@ -0,0 +1,12 @@ +local beautiful = require("beautiful") +local wibox = require("wibox") +local helpers = require("helpers") + +local theme = beautiful.get() + +local seperator = wibox.widget.textbox() + +seperator.font = helpers.ui.set_font("14") +seperator.markup = helpers.ui.colorize_text("|", theme.color.subtext1) + +return seperator diff --git a/dot_config/awesome/ui/top-panel/widgets/systray.lua b/dot_config/awesome/ui/top-panel/widgets/systray.lua new file mode 100644 index 0000000..8f3cf86 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/systray.lua @@ -0,0 +1,64 @@ +local awful = require("awful") +local wibox = require("wibox") +local beautiful = require("beautiful") +local rubato = require("lib.rubato") +local helpers = require("helpers") +local config = require("config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +local arrow = wibox.widget.textbox() +arrow.font = helpers.ui.set_font("13") +arrow.markup = config.icons.arr.r + +local systray = wibox.widget.systray() +systray.visible = true +theme.systray_icon_spacing = dpi(4) + +local sys = wibox.widget({ + widget = wibox.container.constraint, + strategy = "max", + visible = true, + width = 0, + { + widget = wibox.container.margin, + margins = dpi(2), + systray, + }, +}) + +local slide = rubato.timed({ + duration = 0.9, + awestore_compat = true, + subscribed = function(pos) + sys.width = pos + end, +}) + +local value = true + +arrow.toggle = function() + if value == false then + arrow.markup = config.icons.arr.r + value = true + slide:set(2) + else + arrow.markup = config.icons.arr.l + slide:set(500) + value = false + end +end + +arrow:add_button(awful.button({}, 1, function() + arrow.toggle() +end)) + +local full = wibox.widget({ + layout = wibox.layout.fixed.horizontal, + arrow, + sys, + spacing = dpi(2), +}) + +return full diff --git a/dot_config/awesome/ui/top-panel/widgets/taglist.lua b/dot_config/awesome/ui/top-panel/widgets/taglist.lua new file mode 100644 index 0000000..01d5383 --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/taglist.lua @@ -0,0 +1,114 @@ +local awful = require("awful") +local wibox = require("wibox") +local beautiful = require("beautiful") +local bling = require("lib.bling") +local keys = require("config").keys +local vars = require("ui.top-panel.config") + +local theme = beautiful.get() +local dpi = beautiful.xresources.apply_dpi + +awful.screen.connect_for_each_screen(function(s) + s.taglist = awful.widget.taglist({ + screen = s, + filter = awful.widget.taglist.filter.all, + + widget_template = { + { + { + { + id = "text_role", + widget = wibox.widget.textbox, + }, + layout = wibox.layout.fixed.horizontal, + }, + left = dpi(4), + right = dpi(4), + widget = wibox.container.margin, + }, + id = "background_role", + widget = wibox.container.background, + + -- Add support for hover colors and an index label + create_callback = function(self, c3, index, _) + self:get_children_by_id("text_role")[1].markup = " " .. index .. " " + + self:connect_signal("mouse::enter", function() + -- BLING: Only show widget when there are clients in the tag + if #c3:clients() > 0 then + -- BLING: Update the widget with the new tag + awesome.emit_signal("bling::tag_preview::update", c3) + -- BLING: Show the widget + awesome.emit_signal("bling::tag_preview::visibility", s, true) + end + end) + + self:connect_signal("mouse::leave", function() + -- BLING: Turn the widget off + awesome.emit_signal("bling::tag_preview::visibility", s, false) + + if self.has_backup then + self.bg = self.backup + end + end) + end, + + update_callback = function(self, _, index, _) + self:get_children_by_id("text_role")[1].markup = " " .. index .. " " + end, + }, + + buttons = { + awful.button({}, 1, function(t) + t:view_only() + end), + + awful.button({ keys.mod }, 1, function(t) + if client.focus then + client.focus:move_to_tag(t) + end + end), + + awful.button({}, 3, awful.tag.viewtoggle), + + awful.button({ keys.mod }, 3, function(t) + if client.focus then + client.focus:toggle_tag(t) + end + end), + + awful.button({}, 4, function(t) + awful.tag.viewprev(t.screen) + end), + + awful.button({}, 5, function(t) + awful.tag.viewnext(t.screen) + end), + }, + }) + + bling.widget.tag_preview.enable({ + show_client_content = true, -- Whether or not to show the client content + x = 0, -- The x-coord of the popup + y = 0, -- The y-coord of the popup + scale = 0.2, -- The scale of the previews compared to the screen + honor_padding = true, -- Honor padding when creating widget size + honor_workarea = true, -- Honor work area when creating widget size + + placement_fn = function(c) -- Place the widget using awful.placement (this overrides x & y) + awful.placement.top_left(c, { + margins = { + top = vars.height + (vars.margin * 1.5), + left = vars.margin, + }, + }) + end, + + background_widget = wibox.widget({ -- Set a background image (like a wallpaper) for the widget + image = theme.wallpaper, + horizontal_fit_policy = "fit", + vertical_fit_policy = "fit", + widget = wibox.widget.imagebox, + }), + }) +end) diff --git a/dot_config/awesome/ui/top-panel/widgets/tasklist.lua b/dot_config/awesome/ui/top-panel/widgets/tasklist.lua new file mode 100644 index 0000000..fb2aaae --- /dev/null +++ b/dot_config/awesome/ui/top-panel/widgets/tasklist.lua @@ -0,0 +1,8 @@ +local awful = require("awful") + +awful.screen.connect_for_each_screen(function(s) + s.tasklist = awful.widget.tasklist({ + screen = s, + filter = awful.widget.tasklist.filter.focused, + }) +end) diff --git a/dot_config/bat/config b/dot_config/bat/config new file mode 100644 index 0000000..98b160a --- /dev/null +++ b/dot_config/bat/config @@ -0,0 +1,27 @@ +# This is `bat`s configuration file. Each line either contains a comment or +# a command-line option that you want to pass to `bat` by default. You can +# run `bat --help` to get a list of all possible configuration options. + +# Specify desired highlighting theme (e.g. "TwoDark"). Run `bat --list-themes` +# for a list of all available themes +--theme="Catppuccin-macchiato" + +# Enable this to use italic text on the terminal. This is not supported on all +# terminal emulators (like tmux, by default): +#--italic-text=always + +# Uncomment the following line to disable automatic paging: +#--paging=never + +# Uncomment the following line if you are using less version >= 551 and want to +# enable mouse scrolling support in `bat` when running inside tmux. This might +# disable text selection, unless you press shift. +#--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse" + +# Syntax mappings: map a certain filename pattern to a language. +# Example 1: use the C++ syntax for Arduino .ino files +# Example 2: Use ".gitignore"-style highlighting for ".ignore" files +#--map-syntax "*.ino:C++" +#--map-syntax ".ignore:Git Ignore" + +--style=auto diff --git a/dot_config/btop/btop.conf b/dot_config/btop/btop.conf new file mode 100644 index 0000000..d6be048 --- /dev/null +++ b/dot_config/btop/btop.conf @@ -0,0 +1,248 @@ +#? Config file for btop v. 1.3.2 + +#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. +#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" +color_theme = "/home/marley/.config/btop/themes/catppuccin_macchiato.theme" + +#* If the theme set background should be shown, set to False if you want terminal background transparency. +theme_background = False + +#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. +truecolor = True + +#* Set to true to force tty mode regardless if a real tty has been detected or not. +#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. +force_tty = False + +#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. +#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. +#* Use whitespace " " as separator between different presets. +#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" +presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty" + +#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. +#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. +vim_keys = True + +#* Rounded corners on boxes, is ignored if TTY mode is ON. +rounded_corners = True + +#* Default symbols to use for graph creation, "braille", "block" or "tty". +#* "braille" offers the highest resolution but might not be included in all fonts. +#* "block" has half the resolution of braille but uses more common characters. +#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. +#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. +graph_symbol = "braille" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_cpu = "default" + +# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty". +graph_symbol_gpu = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_mem = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_net = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_proc = "default" + +#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace. +shown_boxes = "cpu mem proc net" + +#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. +update_ms = 2000 + +#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", +#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. +proc_sorting = "name" + +#* Reverse sorting order, True or False. +proc_reversed = False + +#* Show processes as a tree. +proc_tree = True + +#* Use the cpu graph colors in the process list. +proc_colors = True + +#* Use a darkening gradient in the process list. +proc_gradient = True + +#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. +proc_per_core = False + +#* Show process memory as bytes instead of percent. +proc_mem_bytes = True + +#* Show cpu graph for each process. +proc_cpu_graphs = True + +#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) +proc_info_smaps = False + +#* Show proc box on left side of screen instead of right. +proc_left = False + +#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). +proc_filter_kernel = False + +#* In tree-view, always accumulate child process resources in the parent process. +proc_aggregate = True + +#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_upper = "Auto" + +#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_lower = "Auto" + +#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off". +show_gpu_info = "Auto" + +#* Toggles if the lower CPU graph should be inverted. +cpu_invert_lower = True + +#* Set to True to completely disable the lower CPU graph. +cpu_single_graph = False + +#* Show cpu box at bottom of screen instead of top. +cpu_bottom = False + +#* Shows the system uptime in the CPU box. +show_uptime = True + +#* Show cpu temperature. +check_temp = True + +#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. +cpu_sensor = "Auto" + +#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. +show_coretemp = True + +#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. +#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. +#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. +#* Example: "4:0 5:1 6:3" +cpu_core_map = "" + +#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". +temp_scale = "celsius" + +#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. +base_10_sizes = False + +#* Show CPU frequency. +show_cpu_freq = True + +#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. +#* Special formatting: /host = hostname | /user = username | /uptime = system uptime +clock_format = "%X" + +#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. +background_update = True + +#* Custom cpu model name, empty string to disable. +custom_cpu_name = "" + +#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". +#* Begin line with "exclude=" to change to exclude filter, otherwise defaults to "most include" filter. Example: disks_filter="exclude=/boot /home/user". +disks_filter = "" + +#* Show graphs instead of meters for memory values. +mem_graphs = True + +#* Show mem box below net box instead of above. +mem_below_net = False + +#* Count ZFS ARC in cached and available memory. +zfs_arc_cached = True + +#* If swap memory should be shown in memory box. +show_swap = False + +#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. +swap_disk = True + +#* If mem box should be split to also show disks info. +show_disks = True + +#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. +only_physical = True + +#* Read disks list from /etc/fstab. This also disables only_physical. +use_fstab = True + +#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) +zfs_hide_datasets = False + +#* Set to true to show available disk space for privileged users. +disk_free_priv = False + +#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. +show_io_stat = True + +#* Toggles io mode for disks, showing big graphs for disk read/write speeds. +io_mode = False + +#* Set to True to show combined read/write io graphs in io mode. +io_graph_combined = False + +#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". +#* Example: "/mnt/media:100 /:20 /boot:1". +io_graph_speeds = "" + +#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. +net_download = 100 + +net_upload = 100 + +#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. +net_auto = True + +#* Sync the auto scaling for download and upload to whichever currently has the highest scale. +net_sync = True + +#* Starts with the Network Interface specified here. +net_iface = "" + +#* Show battery stats in top right if battery is present. +show_battery = True + +#* Which battery to use if multiple are present. "Auto" for auto detection. +selected_battery = "Auto" + +#* Show power stats of battery next to charge indicator. +show_battery_watts = True + +#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". +#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. +log_level = "WARNING" + +#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards. +nvml_measure_pcie_speeds = True + +#* Horizontally mirror the GPU graph. +gpu_mirror_graph = True + +#* Custom gpu0 model name, empty string to disable. +custom_gpu_name0 = "" + +#* Custom gpu1 model name, empty string to disable. +custom_gpu_name1 = "" + +#* Custom gpu2 model name, empty string to disable. +custom_gpu_name2 = "" + +#* Custom gpu3 model name, empty string to disable. +custom_gpu_name3 = "" + +#* Custom gpu4 model name, empty string to disable. +custom_gpu_name4 = "" + +#* Custom gpu5 model name, empty string to disable. +custom_gpu_name5 = "" diff --git a/dot_config/cheat/conf.yml b/dot_config/cheat/conf.yml new file mode 100644 index 0000000..44cda39 --- /dev/null +++ b/dot_config/cheat/conf.yml @@ -0,0 +1,83 @@ +--- +# The editor to use with 'cheat -e '. Defaults to $EDITOR or $VISUAL. +editor: nvim + +# Should 'cheat' always colorize output? +colorize: true + +# Which 'chroma' colorscheme should be applied to the output? +# Options are available here: +# https://github.com/alecthomas/chroma/tree/master/styles +style: catppuccin-macchiato + +# Which 'chroma' "formatter" should be applied? +# One of: "terminal", "terminal256", "terminal16m" +formatter: terminal256 + +# Through which pager should output be piped? +# 'less -FRX' is recommended on Unix systems +# 'more' is recommended on Windows +pager: less -FRX + +# Cheatpaths are paths at which cheatsheets are available on your local +# filesystem. +# +# It is useful to sort cheatsheets into different cheatpaths for organizational +# purposes. For example, you might want one cheatpath for community +# cheatsheets, one for personal cheatsheets, one for cheatsheets pertaining to +# your day job, one for code snippets, etc. +# +# Cheatpaths are scoped, such that more "local" cheatpaths take priority over +# more "global" cheatpaths. (The most global cheatpath is listed first in this +# file; the most local is listed last.) For example, if there is a 'tar' +# cheatsheet on both global and local paths, you'll be presented with the local +# one by default. ('cheat -p' can be used to view cheatsheets from alternative +# cheatpaths.) +# +# Cheatpaths can also be tagged as "read only". This instructs cheat not to +# automatically create cheatsheets on a read-only cheatpath. Instead, when you +# would like to edit a read-only cheatsheet using 'cheat -e', cheat will +# perform a copy-on-write of that cheatsheet from a read-only cheatpath to a +# writeable cheatpath. +# +# This is very useful when you would like to maintain, for example, a +# "pristine" repository of community cheatsheets on one cheatpath, and an +# editable personal reponsity of cheatsheets on another cheatpath. +# +# Cheatpaths can be also configured to automatically apply tags to cheatsheets +# on certain paths, which can be useful for querying purposes. +# Example: 'cheat -t work jenkins'. +# +# Community cheatsheets must be installed separately, though you may have +# downloaded them automatically when installing 'cheat'. If not, you may +# download them here: +# +# https://github.com/cheat/cheatsheets +cheatpaths: + # Cheatpath properties mean the following: + # 'name': the name of the cheatpath (view with 'cheat -d', filter with 'cheat -p') + # 'path': the filesystem path of the cheatsheet directory (view with 'cheat -d') + # 'tags': tags that should be automatically applied to sheets on this path + # 'readonly': shall user-created ('cheat -e') cheatsheets be saved here? + - name: community + path: /home/marley/.config/cheat/cheatsheets/community + tags: [community] + readonly: true + + # If you have personalized cheatsheets, list them last. They will take + # precedence over the more global cheatsheets. + - name: personal + path: /home/marley/.config/cheat/cheatsheets/personal + tags: [personal] + readonly: false + + # While it requires no configuration here, it's also worth noting that + # cheat will automatically append directories named '.cheat' within the + # current working directory to the 'cheatpath'. This can be very useful if + # you'd like to closely associate cheatsheets with, for example, a directory + # containing source code. + # + # Such "directory-scoped" cheatsheets will be treated as the most "local" + # cheatsheets, and will override less "local" cheatsheets. Similarly, + # directory-scoped cheatsheets will always be editable ('readonly: false'). + diff --git a/dot_config/composer/composer.json b/dot_config/composer/composer.json new file mode 100644 index 0000000..7080992 --- /dev/null +++ b/dot_config/composer/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "laravel/installer": "^5.6", + "cpriego/valet-linux": "^2.3" + } +} diff --git a/dot_config/composer/composer.lock b/dot_config/composer/composer.lock new file mode 100644 index 0000000..c2aa15b --- /dev/null +++ b/dot_config/composer/composer.lock @@ -0,0 +1,2487 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "f549eefbe875104320937dfd396c3f80", + "packages": [ + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "cpriego/valet-linux", + "version": "v2.3.10", + "source": { + "type": "git", + "url": "https://github.com/cpriego/valet-linux.git", + "reference": "321e261bfc425b06acd9cba4eab11e44cc4f6759" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cpriego/valet-linux/zipball/321e261bfc425b06acd9cba4eab11e44cc4f6759", + "reference": "321e261bfc425b06acd9cba4eab11e44cc4f6759", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-posix": "*", + "illuminate/container": "~5.3|^6.0|^7.0|^8.0|^9.0|^10.0", + "mnapoli/silly": "~1.1", + "nategood/httpful": "~0.2", + "outrightvision/api-model": "^1.0", + "php": ">=7.0", + "symfony/process": "~2.7|~3.0|~4.0|~5.0|^6.0", + "tightenco/collect": "~5.3|^6.0|^7.0|^8.0|^9.0" + }, + "require-dev": { + "mockery/mockery": "^1.2.3", + "phpunit/phpunit": "~5.5|^9.0" + }, + "bin": [ + "valet" + ], + "type": "library", + "autoload": { + "files": [ + "cli/includes/compatibility.php", + "cli/includes/facades.php", + "cli/includes/helpers.php" + ], + "psr-4": { + "Valet\\": "cli/Valet/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + }, + { + "name": "Adam Wathan", + "email": "adam.wathan@gmail.com" + }, + { + "name": "Carlos Priego", + "email": "carlos.enrique.priego@gmail.com" + }, + { + "name": "Leonardo Nodari", + "email": "nodarileonardo@gmail.com" + }, + { + "name": "Joaquín Marcher", + "email": "joaquin@marcher.com.uy" + }, + { + "name": "Ludovic Lemarinel", + "email": "ludovic@adesin.fr" + } + ], + "description": "A more enjoyable local development experience for Linux.", + "keywords": [ + "arch", + "fedora", + "laravel", + "linux", + "ubuntu", + "valet", + "wwdhhd", + "zonda" + ], + "support": { + "issues": "https://github.com/cpriego/valet-linux/issues", + "source": "https://github.com/cpriego/valet-linux/tree/v2.3.10" + }, + "time": "2024-02-14T10:32:47+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "illuminate/collections", + "version": "v10.48.4", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "f9589f1063a449111dcaa1d68285b507d9483a95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/f9589f1063a449111dcaa1d68285b507d9483a95", + "reference": "f9589f1063a449111dcaa1d68285b507d9483a95", + "shasum": "" + }, + "require": { + "illuminate/conditionable": "^10.0", + "illuminate/contracts": "^10.0", + "illuminate/macroable": "^10.0", + "php": "^8.1" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^6.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-03-20T20:09:13+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "v10.48.4", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "d0958e4741fc9d6f516a552060fd1b829a85e009" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/d0958e4741fc9d6f516a552060fd1b829a85e009", + "reference": "d0958e4741fc9d6f516a552060fd1b829a85e009", + "shasum": "" + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-02-03T08:06:17+00:00" + }, + { + "name": "illuminate/container", + "version": "v10.48.4", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "ddc26273085fad3c471b2602ad820e0097ff7939" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/ddc26273085fad3c471b2602ad820e0097ff7939", + "reference": "ddc26273085fad3c471b2602ad820e0097ff7939", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-06-18T09:12:03+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v10.48.4", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac", + "reference": "8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-01-15T18:52:32+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v10.48.4", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "592fb581a52fba43bf78c2e4b22db540c9f9f149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/592fb581a52fba43bf78c2e4b22db540c9f9f149", + "reference": "592fb581a52fba43bf78c2e4b22db540c9f9f149", + "shasum": "" + }, + "require": { + "illuminate/collections": "^10.0", + "illuminate/contracts": "^10.0", + "illuminate/macroable": "^10.0", + "illuminate/support": "^10.0", + "php": "^8.1", + "symfony/finder": "^6.2" + }, + "suggest": { + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-hash": "Required to use the Filesystem class.", + "illuminate/http": "Required for handling uploaded files (^7.0).", + "league/flysystem": "Required to use the Flysystem local driver (^3.0.16).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/mime": "Required to enable support for guessing extensions (^6.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-03-11T21:45:53+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v10.48.4", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "dff667a46ac37b634dcf68909d9d41e94dc97c27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/dff667a46ac37b634dcf68909d9d41e94dc97c27", + "reference": "dff667a46ac37b634dcf68909d9d41e94dc97c27", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-06-05T12:46:42+00:00" + }, + { + "name": "illuminate/support", + "version": "v10.48.4", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "980d80017e859c8b1720892d952516e8c0b6708f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/980d80017e859c8b1720892d952516e8c0b6708f", + "reference": "980d80017e859c8b1720892d952516e8c0b6708f", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^10.0", + "illuminate/conditionable": "^10.0", + "illuminate/contracts": "^10.0", + "illuminate/macroable": "^10.0", + "nesbot/carbon": "^2.67", + "php": "^8.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^10.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the composer class (^6.2).", + "symfony/uid": "Required to use Str::ulid() (^6.2).", + "symfony/var-dumper": "Required to use the dd function (^6.2).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-03-11T21:46:45+00:00" + }, + { + "name": "laravel/installer", + "version": "v5.7.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/installer.git", + "reference": "9aa23f46453076e026237a54ae7eb23455ab1921" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/installer/zipball/9aa23f46453076e026237a54ae7eb23455ab1921", + "reference": "9aa23f46453076e026237a54ae7eb23455ab1921", + "shasum": "" + }, + "require": { + "illuminate/filesystem": "^10.20|^11.0", + "illuminate/support": "^10.20|^11.0", + "laravel/prompts": "^0.1", + "php": "^8.2", + "symfony/console": "^6.2|^7.0", + "symfony/process": "^6.2|^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.4" + }, + "bin": [ + "bin/laravel" + ], + "type": "library", + "autoload": { + "psr-4": { + "Laravel\\Installer\\Console\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel application installer.", + "keywords": [ + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/installer/issues", + "source": "https://github.com/laravel/installer/tree/v5.7.1" + }, + "time": "2024-04-02T14:11:43+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.17", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "8ee9f87f7f9eadcbe21e9e72cd4176b2f06cd5b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/8ee9f87f7f9eadcbe21e9e72cd4176b2f06cd5b5", + "reference": "8ee9f87f7f9eadcbe21e9e72cd4176b2f06cd5b5", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.17" + }, + "time": "2024-03-13T16:05:43+00:00" + }, + { + "name": "mnapoli/silly", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/mnapoli/silly.git", + "reference": "fdb69ac9335b4c83f70baf433eae91e691901f1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mnapoli/silly/zipball/fdb69ac9335b4c83f70baf433eae91e691901f1c", + "reference": "fdb69ac9335b4c83f70baf433eae91e691901f1c", + "shasum": "" + }, + "require": { + "php": ">=7.4", + "php-di/invoker": "~2.0", + "psr/container": "^1.0|^2.0", + "symfony/console": "~3.0|~4.0|~5.0|~6.0|~7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.12", + "mnapoli/phpunit-easymock": "~1.0", + "phpunit/phpunit": "^6.4|^7|^8|^9|^10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Silly\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Silly CLI micro-framework based on Symfony Console", + "keywords": [ + "PSR-11", + "cli", + "console", + "framework", + "micro-framework", + "silly" + ], + "support": { + "issues": "https://github.com/mnapoli/silly/issues", + "source": "https://github.com/mnapoli/silly/tree/1.9.0" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/mnapoli/silly", + "type": "tidelift" + } + ], + "time": "2024-01-18T15:47:39+00:00" + }, + { + "name": "nategood/httpful", + "version": "0.3.2", + "source": { + "type": "git", + "url": "https://github.com/nategood/httpful.git", + "reference": "0cded3ea97ba905600de9ceb9ef13f3ab681587c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nategood/httpful/zipball/0cded3ea97ba905600de9ceb9ef13f3ab681587c", + "reference": "0cded3ea97ba905600de9ceb9ef13f3ab681587c", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Httpful": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nate Good", + "email": "me@nategood.com", + "homepage": "http://nategood.com" + } + ], + "description": "A Readable, Chainable, REST friendly, PHP HTTP Client", + "homepage": "http://github.com/nategood/httpful", + "keywords": [ + "api", + "curl", + "http", + "requests", + "rest", + "restful" + ], + "support": { + "issues": "https://github.com/nategood/httpful/issues", + "source": "https://github.com/nategood/httpful/tree/v0.3.2" + }, + "time": "2020-01-25T01:13:13+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.72.3", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-01-25T10:35:09+00:00" + }, + { + "name": "outrightvision/api-model", + "version": "v1.0.24", + "source": { + "type": "git", + "url": "https://github.com/OUTRIGHT-Vision/api-model.git", + "reference": "f781b494a485ff915f307c3364a20579466c67e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OUTRIGHT-Vision/api-model/zipball/f781b494a485ff915f307c3364a20579466c67e0", + "reference": "f781b494a485ff915f307c3364a20579466c67e0", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0" + }, + "require-dev": { + "orchestra/testbench": "^8.5", + "php": "^8.2", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Support/helpers.php" + ], + "psr-4": { + "Tests\\": "tests/", + "OUTRIGHTVision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joaquin Marcher", + "email": "joaquin@marcher.com.uy" + } + ], + "description": "Generate Laravel-like Api Models", + "keywords": [ + "api", + "eloquent", + "laravel", + "models" + ], + "support": { + "issues": "https://github.com/OUTRIGHT-Vision/api-model/issues", + "source": "https://github.com/OUTRIGHT-Vision/api-model/tree/v1.0.24" + }, + "time": "2023-12-06T13:59:55+00:00" + }, + { + "name": "php-di/invoker", + "version": "2.3.4", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/33234b32dafa8eb69202f950a1fc92055ed76a86", + "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Invoker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", + "keywords": [ + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" + ], + "support": { + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.4" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2023-09-08T09:24:21+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "symfony/console", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/fde915cd8e7eb99b3d531d3d5c09531429c3f9e5", + "reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-01T11:04:53+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-31T17:30:12+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "710e27879e9be3395de2b98da3f52a946039f297" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", + "reference": "710e27879e9be3395de2b98da3f52a946039f297", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-20T12:31:00+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "11bbf19a0fb7b36345861e85c5768844c552906e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e", + "reference": "11bbf19a0fb7b36345861e85c5768844c552906e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.4.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-12-19T21:51:00+00:00" + }, + { + "name": "symfony/string", + "version": "v7.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.0.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-01T13:17:36+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/bce6a5a78e94566641b2594d17e48b0da3184a8e", + "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-20T13:16:58+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/95bd2706a97fb875185b51ecaa6112ec184233d4", + "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-19T11:56:30+00:00" + }, + { + "name": "tightenco/collect", + "version": "v9.52.7", + "source": { + "type": "git", + "url": "https://github.com/tighten/collect.git", + "reference": "b15143cd11fe01a700fcc449df61adc64452fa6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tighten/collect/zipball/b15143cd11fe01a700fcc449df61adc64452fa6d", + "reference": "b15143cd11fe01a700fcc449df61adc64452fa6d", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony/var-dumper": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "nesbot/carbon": "^2.23.0", + "phpunit/phpunit": "^8.3" + }, + "type": "library", + "autoload": { + "files": [ + "src/Collect/Support/helpers.php", + "src/Collect/Support/alias.php" + ], + "psr-4": { + "Tightenco\\Collect\\": "src/Collect" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "Collect - Illuminate Collections as a separate package.", + "keywords": [ + "collection", + "laravel" + ], + "support": { + "issues": "https://github.com/tighten/collect/issues", + "source": "https://github.com/tighten/collect/tree/v9.52.7" + }, + "abandoned": "illuminate/collections", + "time": "2023-04-14T21:51:36+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/dot_config/dot_curlrc b/dot_config/dot_curlrc new file mode 100644 index 0000000..d83a650 --- /dev/null +++ b/dot_config/dot_curlrc @@ -0,0 +1,11 @@ +# limit the timeout in seconds +connect-timeout = 60 + +# follow HTTP redirects +location + +# show error messages +show-error + +# Disguise as IE 9 on Windows 7 +user-agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" diff --git a/dot_config/executable_dot_fehbg b/dot_config/executable_dot_fehbg new file mode 100644 index 0000000..2860bc2 --- /dev/null +++ b/dot_config/executable_dot_fehbg @@ -0,0 +1,2 @@ +#!/bin/sh +feh --no-fehbg --bg-fill '/home/marley/data/photos/wallpaper/city.png' diff --git a/dot_config/firefox/install.txt b/dot_config/firefox/install.txt new file mode 100644 index 0000000..51a7d56 --- /dev/null +++ b/dot_config/firefox/install.txt @@ -0,0 +1,6 @@ +about:config +"userprof" +switch "toolkit.legacyUserProfileCustomizations.stylesheets" to true +about:support +find profile folder +softlink userChrome.css to $PROFILE_FOLDER/chrome/userChrome.css diff --git a/dot_config/firefox/userChrome.css b/dot_config/firefox/userChrome.css new file mode 100644 index 0000000..49e7afc --- /dev/null +++ b/dot_config/firefox/userChrome.css @@ -0,0 +1,49 @@ +#tabbrowser-tabs { + visibility: collapse; +} +#navigator-toolbox { + display: flex; + flex-flow: row wrap; +} +#titlebar { + order: 1; + max-width: 146px; +} +#titlebar #TabsToolbar { + background-color: var(--toolbar-bgcolor); + background-image: var(--toolbar-bgimage); +} +#titlebar #TabsToolbar .titlebar-spacer { + background-color: rgba(0, 0, 0, 0.05); + margin: 3px; + border-radius: 25%; + cursor: grab; +} +#titlebar #TabsToolbar .titlebar-spacer[type="pre-tabs"] { + display: none; +} +#nav-bar { + order: 0; + width: calc(100% - 146px); +} + +/* Shove bookmarks bar over for macOS titlebar buttons */ +/* #PersonalToolbar { */ +/* order: 2; */ +/* } */ + +/* Update - Hides the new Firefox home + tab dropdown. If you want to +* keep/customize those buttons. remove the CSS below and adjust the widths above +* to get everything fitting in one line */ +#TabsToolbar .toolbar-items { + display: none; +} + +#nav-bar { + order: 0; + width: 100%; +} + +#sidebar-header { + visibility: collapse !important; +} diff --git a/dot_config/fish/completions/dotfiles.fish b/dot_config/fish/completions/dotfiles.fish new file mode 100644 index 0000000..854e2ad --- /dev/null +++ b/dot_config/fish/completions/dotfiles.fish @@ -0,0 +1,43 @@ +#!/usr/bin/env fish + +set -l commands init clone ignore attributes readme + +complete --command dotfiles --wraps git + +# init +complete --command dotfiles \ + --condition "not __fish_seen_subcommand_from $commands" \ + --arguments init \ + --description "Create a new bare repo with the git folder specified" + +complete --command dotfiles \ + --condition "__fish_seen_subcommand_from init; and not __fish_seen_subcommand_from (__fish_complete_directories)" \ + --arguments "(__fish_complete_directories)" + +# clone +complete --command dotfiles \ + --condition "not __fish_seen_subcommand_from $commands" \ + --arguments clone \ + --description "Clone your dotfiles from remote and install them" + +complete --command dotfiles \ + --condition "__fish_seen_subcommand_from clone; and not __fish_seen_subcommand_from (__fish_complete_directories)" \ + --arguments "(__fish_complete_directories)" + +# ignore +complete --command dotfiles \ + --condition "not __fish_seen_subcommand_from $commands" \ + --arguments ignore \ + --description "Add a pattern to gitignore, or edit file if none given" + +# attributes +complete -f --command dotfiles \ + --condition "not __fish_seen_subcommand_from $commands" \ + --arguments attributes \ + --description "Add a pattern to gitattributes, or edit file if none given" + +# readme +complete -f --command dotfiles \ + --condition "not __fish_seen_subcommand_from $commands" \ + --arguments readme \ + --description "Edit the README.md file" diff --git a/dot_config/fish/completions/fisher.fish b/dot_config/fish/completions/fisher.fish new file mode 100644 index 0000000..6d23ce4 --- /dev/null +++ b/dot_config/fish/completions/fisher.fish @@ -0,0 +1,7 @@ +complete --command fisher --exclusive --long help --description "Print help" +complete --command fisher --exclusive --long version --description "Print version" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments install --description "Install plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments update --description "Update installed plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments remove --description "Remove installed plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments list --description "List installed plugins matching regex" +complete --command fisher --exclusive --condition "__fish_seen_subcommand_from update remove" --arguments "(fisher list)" diff --git a/dot_config/fish/completions/fzf_configure_bindings.fish b/dot_config/fish/completions/fzf_configure_bindings.fish new file mode 100644 index 0000000..b38ef92 --- /dev/null +++ b/dot_config/fish/completions/fzf_configure_bindings.fish @@ -0,0 +1,8 @@ +complete fzf_configure_bindings --no-files +complete fzf_configure_bindings --long help --short h --description "Print help" --condition "not __fish_seen_argument --help -h" +complete fzf_configure_bindings --long directory --description "Change the key binding for Search Directory" --condition "not __fish_seen_argument --directory" +complete fzf_configure_bindings --long git_log --description "Change the key binding for Search Git Log" --condition "not __fish_seen_argument --git_log" +complete fzf_configure_bindings --long git_status --description "Change the key binding for Search Git Status" --condition "not __fish_seen_argument --git_status" +complete fzf_configure_bindings --long history --description "Change the key binding for Search History" --condition "not __fish_seen_argument --history" +complete fzf_configure_bindings --long processes --description "Change the key binding for Search Processes" --condition "not __fish_seen_argument --processes" +complete fzf_configure_bindings --long variables --description "Change the key binding for Search Variables" --condition "not __fish_seen_argument --variables" diff --git a/dot_config/fish/completions/pipx.fish b/dot_config/fish/completions/pipx.fish new file mode 100644 index 0000000..79be035 --- /dev/null +++ b/dot_config/fish/completions/pipx.fish @@ -0,0 +1,17 @@ + +function __fish_pipx_complete + set -x _ARGCOMPLETE 1 + set -x _ARGCOMPLETE_DFS \t + set -x _ARGCOMPLETE_IFS \n + set -x _ARGCOMPLETE_SUPPRESS_SPACE 1 + set -x _ARGCOMPLETE_SHELL fish + set -x COMP_LINE (commandline -p) + set -x COMP_POINT (string length (commandline -cp)) + set -x COMP_TYPE + if set -q _ARC_DEBUG + pipx 8>&1 9>&2 1>&9 2>&1 + else + pipx 8>&1 9>&2 1>/dev/null 2>&1 + end +end +complete --command pipx -f -a '(__fish_pipx_complete)' diff --git a/dot_config/fish/conf.d/00-init.fish b/dot_config/fish/conf.d/00-init.fish new file mode 100644 index 0000000..28e8f32 --- /dev/null +++ b/dot_config/fish/conf.d/00-init.fish @@ -0,0 +1,30 @@ +#!/usr/bin/env fish + +# Base path. +set -Ux fish_user_paths "$HOME/.local/bin" + +# Config files. +set -Ux XDG_CONFIG_HOME "$HOME/.config" +set -Ux XDG_CACHE_HOME "$HOME/.cache" +set -Ux XDG_DATA_HOME "$HOME/.local/share" +set -Ux XDG_STATE_HOME "$HOME/.local/state" + +# Machine info. +set -gx OS "$(uname)" + +if command -v hostnamectl &>/dev/null + set -gx HOST "$(hostnamectl --static)" +else if command -v scutil &>/dev/null # macOS + set -gx HOST "$(scutil --get ComputerName)" +end + +# Projects dir. +set -gx HACK "$HOME/hackin" + +# Editor. +set -gx EDITOR nvim +set -gx VISUAL "$EDITOR" +set -gx SUDO_EDITOR "$EDITOR" + +# Use vi key bindings. +set -g fish_key_bindings fish_vi_key_bindings diff --git a/dot_config/fish/conf.d/10-starship.fish b/dot_config/fish/conf.d/10-starship.fish new file mode 100644 index 0000000..459dc72 --- /dev/null +++ b/dot_config/fish/conf.d/10-starship.fish @@ -0,0 +1,10 @@ +#!/usr/bin/env fish + +function starship_transient_prompt_func + starship module character +end + +if status is-interactive + starship init fish | source + enable_transience +end diff --git a/dot_config/fish/conf.d/20-aliases.fish b/dot_config/fish/conf.d/20-aliases.fish new file mode 100644 index 0000000..198e6d6 --- /dev/null +++ b/dot_config/fish/conf.d/20-aliases.fish @@ -0,0 +1,46 @@ +#!/usr/bin/env fish + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Shell aliases. +abbr -a rl --position command "source $XDG_CONFIG_HOME/fish/config.fish" +abbr -a c --position command clear +abbr -a e --position command "$EDITOR" +abbr -a v --position command "$EDITOR" + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Default command options. + +abbr -a cp --position command "cp -iv" +# │└─ list copied files +# └─ prompt before overwriting an existing file + +abbr -a mkdir --position command "mkdir -pv" +# │└─ list created directories +# └─ create intermediate directories + +abbr -a mv --position command "mv -iv" +# │└─ list moved files +# └─ prompt before overwriting an existing file + +abbr -a rm --position command "rm -rf" +# │└─ do not ask for confirmation +# └─ recursively remove directories and files + +# Colored grep output. +abbr -a grep --position command "grep --color=auto" +abbr -a fgrep --position command "fgrep --color=auto" +abbr -a egrep --position command "egrep --color=auto" + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Combinations. + +function mkcd -d "Make a directory and CD into it" + mkdir "$argv" && cd "$argv" +end + +function cdls -d "CD into a directory and list its contents" + cd "$argv" && ls +end diff --git a/dot_config/fish/conf.d/20-gpg.fish b/dot_config/fish/conf.d/20-gpg.fish new file mode 100644 index 0000000..870d96f --- /dev/null +++ b/dot_config/fish/conf.d/20-gpg.fish @@ -0,0 +1,6 @@ +#!/usr/bin/env fish + +if test "$(command -v gpgconf &>/dev/null)" + set -gx GPG_TTY (tty) + gpgconf --launch gpg-agent +end diff --git a/dot_config/fish/conf.d/30-asdf.fish b/dot_config/fish/conf.d/30-asdf.fish new file mode 100644 index 0000000..2cc1d5d --- /dev/null +++ b/dot_config/fish/conf.d/30-asdf.fish @@ -0,0 +1,3 @@ +#!/usr/bin/env fish + +source /opt/asdf-vm/asdf.fish diff --git a/dot_config/fish/conf.d/30-bat.fish b/dot_config/fish/conf.d/30-bat.fish new file mode 100644 index 0000000..a5d9510 --- /dev/null +++ b/dot_config/fish/conf.d/30-bat.fish @@ -0,0 +1,7 @@ +#!/usr/bin/env fish + +set -gx BATDIFF_USE_DELTA true + +function cat --wraps bat + bat $argv +end diff --git a/dot_config/fish/conf.d/30-chezmoi.fish b/dot_config/fish/conf.d/30-chezmoi.fish new file mode 100644 index 0000000..1a87490 --- /dev/null +++ b/dot_config/fish/conf.d/30-chezmoi.fish @@ -0,0 +1,6 @@ +#!/usr/bin/env fish + +abbr -a cz --position command chezmoi +abbr -a czap --position command "chezmoi apply" +abbr -a cza --position command "chezmoi add" +abbr -a czc --position command "chezmoi cd" diff --git a/dot_config/fish/conf.d/30-eza.fish b/dot_config/fish/conf.d/30-eza.fish new file mode 100644 index 0000000..6b9da65 --- /dev/null +++ b/dot_config/fish/conf.d/30-eza.fish @@ -0,0 +1,18 @@ +#!/usr/bin/env fish + +function ls --wraps eza + eza --all --icons=auto --sort=name --group-directories-first $argv +end + +function lst --wraps eza + ls --tree $argv +end + +function lsl --wraps eza + eza --all --icons=auto --sort=name --group-directories-first --grid --long \ + --git --header $argv +end + +function lslt --wraps eza + lsl --tree $argv +end diff --git a/dot_config/fish/conf.d/30-fzf.fish b/dot_config/fish/conf.d/30-fzf.fish new file mode 100644 index 0000000..00f276d --- /dev/null +++ b/dot_config/fish/conf.d/30-fzf.fish @@ -0,0 +1,19 @@ +#!/usr/bin/env fish + +set -gx FZF_DEFAULT_CMD 'rg --files --hidden --glob "!.git"' + +set -gx FZF_DEFAULT_OPTS "\ +--margin=10%,5% \ +--border=sharp \ +--pointer=' ' \ +--marker=' ' \ +--prompt=' ' \ +--preview-label-pos='bottom' \ +--preview-window='border-sharp' \ +--color=bg+:#363a4f,bg:#24273a,spinner:#f4dbd6,hl:#ed8796 \ +--color=fg:#cad3f5,header:#ed8796,info:#c6a0f6,pointer:#f4dbd6 \ +--color=marker:#f4dbd6,fg+:#cad3f5,prompt:#c6a0f6,hl+:#ed8796" + +# fzf.fish +set -g fzf_preview_dir_cmd eza --all --color=always --sort=name --group-directories-first +set -g fzf_diff_highlighter delta --paging=never --features=arctic-fox diff --git a/dot_config/fish/conf.d/30-git.fish b/dot_config/fish/conf.d/30-git.fish new file mode 100644 index 0000000..2feb5b8 --- /dev/null +++ b/dot_config/fish/conf.d/30-git.fish @@ -0,0 +1,51 @@ +#!/usr/bin/env fish + +abbr -a g --position command git +abbr -a d --position command dotfiles + +################################################################################ +# Functions # +################################################################################ + +function git_develop_branch + command git rev-parse --git-dir &>/dev/null || return + set -l branch + + for branch in dev devel develop development + if command git show-ref -q --verify refs/heads/$branch + echo $branch + return 0 + end + end + + echo develop + return 1 +end + +function git_main_branch + command git rev-parse --git-dir &>/dev/null || return + set -l ref + + for ref in + refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,master} + if command git show-ref -q --verify $ref + echo (basename $ref) + return 0 + end + end + + echo main + return 1 +end + +function git_current_branch + set -l ref (git symbolic-ref --quiet HEAD 2>/dev/null) + set -l ret $status + + if [ $ret -ne 0 ] + [ $ret -eq 128 ] && return # no git repo + set ref (git rev-parse --short HEAD 2>/dev/null) || return + end + + echo (string replace "refs/heads/" "" $ref) +end diff --git a/dot_config/fish/conf.d/30-gtk.fish b/dot_config/fish/conf.d/30-gtk.fish new file mode 100644 index 0000000..e24bbbb --- /dev/null +++ b/dot_config/fish/conf.d/30-gtk.fish @@ -0,0 +1,3 @@ +#!/usr/bin/env fish + +set -gx GTK_THEME Catppuccin-Macchiato-Standard-Pink-Dark diff --git a/dot_config/fish/conf.d/30-journalctl.fish b/dot_config/fish/conf.d/30-journalctl.fish new file mode 100644 index 0000000..80459e4 --- /dev/null +++ b/dot_config/fish/conf.d/30-journalctl.fish @@ -0,0 +1,4 @@ +#!/usr/bin/env fish + +abbr -a jf --position command "sudo journalctl --follow --unit" +abbr -a je --position command "sudo journalctl --pager-end --unit" diff --git a/dot_config/fish/conf.d/30-lazygit.fish b/dot_config/fish/conf.d/30-lazygit.fish new file mode 100644 index 0000000..0cf92f0 --- /dev/null +++ b/dot_config/fish/conf.d/30-lazygit.fish @@ -0,0 +1,11 @@ +#!/usr/bin/env fish + +function lzg --wraps=lazygit + set -f configs "$XDG_CONFIG_HOME/lazygit/config.yml,$HOME/.themes/lazygit/catppuccin/themes-mergable/macchiato/pink.yml" + + if test "$(pwd)" = "$HOME" + lazygit --use-config-file="$configs" --work-tree="$HOME" --git-dir="$HOME/.dot" + else + lazygit --use-config-file="$configs" + end +end diff --git a/dot_config/fish/conf.d/30-man.fish b/dot_config/fish/conf.d/30-man.fish new file mode 100644 index 0000000..bdf7a4a --- /dev/null +++ b/dot_config/fish/conf.d/30-man.fish @@ -0,0 +1,3 @@ +#!/usr/bin/env fish + +set -gx MANPAGER "nvim +Man!" diff --git a/dot_config/fish/conf.d/30-php.fish b/dot_config/fish/conf.d/30-php.fish new file mode 100644 index 0000000..07cf29c --- /dev/null +++ b/dot_config/fish/conf.d/30-php.fish @@ -0,0 +1,7 @@ +#!/usr/bin/env fish + +fish_add_path "$HOME/.config/composer/vendor/bin" + +abbr -a p --position command php +abbr -a pa --position command "php artisan" +abbr -a a --position command "php artisan" diff --git a/dot_config/fish/conf.d/30-systemctl.fish b/dot_config/fish/conf.d/30-systemctl.fish new file mode 100644 index 0000000..5dcfa02 --- /dev/null +++ b/dot_config/fish/conf.d/30-systemctl.fish @@ -0,0 +1,9 @@ +#!/usr/bin/env fish + +abbr -a sctl --position command "sudo systemctl" +abbr -a sctls --position command "sudo systemctl status" +abbr -a sctle --position command "sudo systemctl enable --now" +abbr -a sctld --position command "sudo systemctl disable --now" +abbr -a sctlr --position command "sudo systemctl restart" +abbr -a sctlo --position command "sudo systemctl stop" +abbr -a sctla --position command "sudo systemctl start" diff --git a/dot_config/fish/conf.d/30-volta.fish b/dot_config/fish/conf.d/30-volta.fish new file mode 100644 index 0000000..e4dbf8a --- /dev/null +++ b/dot_config/fish/conf.d/30-volta.fish @@ -0,0 +1,5 @@ +#!/usr/bin/env fish + +fish_add_path "$HOME/.volta/bin" + +set -gx VOLTA_HOME "$HOME/.volta" diff --git a/dot_config/fish/conf.d/30-wget.fish b/dot_config/fish/conf.d/30-wget.fish new file mode 100644 index 0000000..5abbcdd --- /dev/null +++ b/dot_config/fish/conf.d/30-wget.fish @@ -0,0 +1,7 @@ +#!/usr/bin/env fish + +set -gx WGETRC "$XDG_CONFIG_HOME/wgetrc" + +function wget --wraps wget + wget --hsts-file="$XDG_CACHE_HOME/wget-hsts" +end diff --git a/dot_config/fish/conf.d/30-yay.fish b/dot_config/fish/conf.d/30-yay.fish new file mode 100644 index 0000000..bc6f402 --- /dev/null +++ b/dot_config/fish/conf.d/30-yay.fish @@ -0,0 +1,7 @@ +#!/usr/bin/env fish + +abbr -a y --position command yay +abbr -a yi --position command "yay -S" +abbr -a yr --position command "yay -R" +abbr -a yc --position command "yay -Sc" +abbr -a yu --position command "yay -Syu" diff --git a/dot_config/fish/conf.d/autopair.fish b/dot_config/fish/conf.d/autopair.fish new file mode 100644 index 0000000..abb4bf3 --- /dev/null +++ b/dot_config/fish/conf.d/autopair.fish @@ -0,0 +1,39 @@ +status is-interactive || exit + +set --global autopair_left "(" "[" "{" '"' "'" +set --global autopair_right ")" "]" "}" '"' "'" +set --global autopair_pairs "()" "[]" "{}" '""' "''" + +function _autopair_fish_key_bindings --on-variable fish_key_bindings + set --query fish_key_bindings[1] || return + + test $fish_key_bindings = fish_default_key_bindings && + set --local mode default insert || + set --local mode insert default + + bind --mode $mode[-1] --erase \177 \b \t + + bind --mode $mode[1] \177 _autopair_backspace # macOS ⌫ + bind --mode $mode[1] \b _autopair_backspace + bind --mode $mode[1] \t _autopair_tab + + printf "%s\n" $autopair_pairs | while read --local left right --delimiter "" + bind --mode $mode[-1] --erase $left $right + if test $left = $right + bind --mode $mode[1] $left "_autopair_insert_same \\$left" + else + bind --mode $mode[1] $left "_autopair_insert_left \\$left \\$right" + bind --mode $mode[1] $right "_autopair_insert_right \\$right" + end + end +end + +_autopair_fish_key_bindings + +function _autopair_uninstall --on-event autopair_uninstall + string collect ( + bind --all | string replace --filter --regex -- "_autopair.*" --erase + set --names | string replace --filter --regex -- "^autopair" "set --erase autopair" + ) | source + functions --erase (functions --all | string match "_autopair_*") +end diff --git a/dot_config/fish/conf.d/fzf.fish b/dot_config/fish/conf.d/fzf.fish new file mode 100644 index 0000000..8156c11 --- /dev/null +++ b/dot_config/fish/conf.d/fzf.fish @@ -0,0 +1,28 @@ +# fzf.fish is only meant to be used in interactive mode. If not in interactive mode and not in CI, skip the config to speed up shell startup +if not status is-interactive && test "$CI" != true + exit +end + +# Because of scoping rules, to capture the shell variables exactly as they are, we must read +# them before even executing _fzf_search_variables. We use psub to store the +# variables' info in temporary files and pass in the filenames as arguments. +# This variable is global so that it can be referenced by fzf_configure_bindings and in tests +set --global _fzf_search_vars_command '_fzf_search_variables (set --show | psub) (set --names | psub)' + + +# Install the default bindings, which are mnemonic and minimally conflict with fish's preset bindings +fzf_configure_bindings + +# Doesn't erase autoloaded _fzf_* functions because they are not easily accessible once key bindings are erased +function _fzf_uninstall --on-event fzf_uninstall + _fzf_uninstall_bindings + + set --erase _fzf_search_vars_command + functions --erase _fzf_uninstall _fzf_migration_message _fzf_uninstall_bindings fzf_configure_bindings + complete --erase fzf_configure_bindings + + set_color cyan + echo "fzf.fish uninstalled." + echo "You may need to manually remove fzf_configure_bindings from your config.fish if you were using custom key bindings." + set_color normal +end diff --git a/dot_config/fish/config.fish b/dot_config/fish/config.fish new file mode 100644 index 0000000..7fe37e2 --- /dev/null +++ b/dot_config/fish/config.fish @@ -0,0 +1,6 @@ +#!/usr/bin/env fish + +# Local environment variables. +if test -e "$HOME/.local.env" + source "~/.local.env" +end diff --git a/dot_config/fish/functions/$.fish b/dot_config/fish/functions/$.fish new file mode 100644 index 0000000..c5e3a14 --- /dev/null +++ b/dot_config/fish/functions/$.fish @@ -0,0 +1,3 @@ +#!/usr/bin/env fish + +$argv diff --git a/dot_config/fish/functions/_autopair_backspace.fish b/dot_config/fish/functions/_autopair_backspace.fish new file mode 100644 index 0000000..a43fa79 --- /dev/null +++ b/dot_config/fish/functions/_autopair_backspace.fish @@ -0,0 +1,9 @@ +function _autopair_backspace + set --local index (commandline --cursor) + set --local buffer (commandline) + + test $index -ge 1 && + contains -- (string sub --start=$index --length=2 -- "$buffer") $autopair_pairs && + commandline --function delete-char + commandline --function backward-delete-char +end diff --git a/dot_config/fish/functions/_autopair_insert_left.fish b/dot_config/fish/functions/_autopair_insert_left.fish new file mode 100644 index 0000000..f078e86 --- /dev/null +++ b/dot_config/fish/functions/_autopair_insert_left.fish @@ -0,0 +1,13 @@ +function _autopair_insert_left --argument-names left right + set --local buffer (commandline) + set --local before (commandline --cut-at-cursor) + + commandline --insert -- $left + + switch "$buffer" + case "$before"{," "\*,$autopair_right\*} + set --local index (commandline --cursor) + commandline --insert -- $right + commandline --cursor $index + end +end diff --git a/dot_config/fish/functions/_autopair_insert_right.fish b/dot_config/fish/functions/_autopair_insert_right.fish new file mode 100644 index 0000000..a0bd61c --- /dev/null +++ b/dot_config/fish/functions/_autopair_insert_right.fish @@ -0,0 +1,11 @@ +function _autopair_insert_right --argument-names key + set --local buffer (commandline) + set --local before (commandline --cut-at-cursor) + + switch "$buffer" + case "$before$key"\* + commandline --cursor (math (commandline --cursor) + 1) + case \* + commandline --insert -- $key + end +end diff --git a/dot_config/fish/functions/_autopair_insert_same.fish b/dot_config/fish/functions/_autopair_insert_same.fish new file mode 100644 index 0000000..27f971d --- /dev/null +++ b/dot_config/fish/functions/_autopair_insert_same.fish @@ -0,0 +1,20 @@ +function _autopair_insert_same --argument-names key + set --local buffer (commandline) + set --local index (commandline --cursor) + set --local next (string sub --start=(math $index + 1) --length=1 -- "$buffer") + + if test (math (count (string match --all --regex -- "$key" "$buffer")) % 2) = 0 + test $key = $next && commandline --cursor (math $index + 1) && return + + commandline --insert -- $key + + if test $index -lt 1 || + contains -- (string sub --start=$index --length=1 -- "$buffer") "" " " $autopair_left && + contains -- $next "" " " $autopair_right + commandline --insert -- $key + commandline --cursor (math $index + 1) + end + else + commandline --insert -- $key + end +end diff --git a/dot_config/fish/functions/_autopair_tab.fish b/dot_config/fish/functions/_autopair_tab.fish new file mode 100644 index 0000000..f2ab8eb --- /dev/null +++ b/dot_config/fish/functions/_autopair_tab.fish @@ -0,0 +1,7 @@ +function _autopair_tab + commandline --paging-mode && down-or-search && return + + string match --quiet --regex -- '\$[^\s]*"$' (commandline --current-token) && + commandline --function end-of-line --function backward-delete-char + commandline --function complete +end diff --git a/dot_config/fish/functions/_fzf_configure_bindings_help.fish b/dot_config/fish/functions/_fzf_configure_bindings_help.fish new file mode 100644 index 0000000..ecfe68e --- /dev/null +++ b/dot_config/fish/functions/_fzf_configure_bindings_help.fish @@ -0,0 +1,43 @@ +function _fzf_configure_bindings_help --description "Prints the help message for fzf_configure_bindings." + echo "\ +USAGE: + fzf_configure_bindings [--COMMAND=[KEY_SEQUENCE]...] + +DESCRIPTION + fzf_configure_bindings installs key bindings for fzf.fish's commands and erases any bindings it + previously installed. It installs bindings for both default and insert modes. fzf.fish executes + it without options on fish startup to install the out-of-the-box key bindings. + + By default, commands are bound to a mnemonic key sequence, shown below. Each command's binding + can be configured using a namesake corresponding option: + COMMAND | DEFAULT KEY SEQUENCE | CORRESPONDING OPTION + Search Directory | Ctrl+Alt+F (F for file) | --directory + Search Git Log | Ctrl+Alt+L (L for log) | --git_log + Search Git Status | Ctrl+Alt+S (S for status) | --git_status + Search History | Ctrl+R (R for reverse) | --history + Search Processes | Ctrl+Alt+P (P for process) | --processes + Search Variables | Ctrl+V (V for variable) | --variables + Override a command's binding by specifying its corresponding option with the desired key + sequence. Disable a command's binding by specifying its corresponding option with no value. + + Because fzf_configure_bindings erases bindings it previously installed, it can be cleanly + executed multiple times. Once the desired fzf_configure_bindings command has been found, add it + to your config.fish in order to persist the customized bindings. + + In terms of validation, fzf_configure_bindings fails if passed unknown options. It expects an + equals sign between an option's name and value. However, it does not validate key sequences. + + Pass -h or --help to print this help message and exit. + +EXAMPLES + Default bindings but bind Search Directory to Ctrl+F and Search Variables to Ctrl+Alt+V + \$ fzf_configure_bindings --directory=\cf --variables=\e\cv + Default bindings but disable Search History + \$ fzf_configure_bindings --history= + An agglomeration of different options + \$ fzf_configure_bindings --git_status=\cg --history=\ch --variables= --processes= + +SEE Also + To learn more about fish key bindings, see bind(1) and fish_key_reader(1). +" +end diff --git a/dot_config/fish/functions/_fzf_extract_var_info.fish b/dot_config/fish/functions/_fzf_extract_var_info.fish new file mode 100644 index 0000000..dd4e952 --- /dev/null +++ b/dot_config/fish/functions/_fzf_extract_var_info.fish @@ -0,0 +1,15 @@ +# helper function for _fzf_search_variables +function _fzf_extract_var_info --argument-names variable_name set_show_output --description "Extract and reformat lines pertaining to \$variable_name from \$set_show_output." + # Extract only the lines about the variable, all of which begin with either + # $variable_name: ...or... $variable_name[ + string match --regex "^\\\$$variable_name(?::|\[).*" <$set_show_output | + + # Strip the variable name prefix, including ": " for scope info lines + string replace --regex "^\\\$$variable_name(?:: )?" '' | + + # Distill the lines of values, replacing... + # [1]: |value| + # ...with... + # [1] value + string replace --regex ": \|(.*)\|" ' $1' +end diff --git a/dot_config/fish/functions/_fzf_preview_changed_file.fish b/dot_config/fish/functions/_fzf_preview_changed_file.fish new file mode 100644 index 0000000..78dd561 --- /dev/null +++ b/dot_config/fish/functions/_fzf_preview_changed_file.fish @@ -0,0 +1,49 @@ +# helper for _fzf_search_git_status +# arg should be a line from git status --short, e.g. +# MM functions/_fzf_preview_changed_file.fish +# D README.md +# R LICENSE -> "New License" +function _fzf_preview_changed_file --argument-names path_status --description "Show the git diff of the given file." + # remove quotes because they'll be interpreted literally by git diff + # no need to requote when referencing $path because fish does not perform word splitting + # https://fishshell.com/docs/current/fish_for_bash_users.html + set -f path (string unescape (string sub --start 4 $path_status)) + # first letter of short format shows index, second letter shows working tree + # https://git-scm.com/docs/git-status/2.35.0#_short_format + set -f index_status (string sub --length 1 $path_status) + set -f working_tree_status (string sub --start 2 --length 1 $path_status) + + set -f diff_opts --color=always + + if test $index_status = '?' + _fzf_report_diff_type Untracked + _fzf_preview_file $path + else if contains {$index_status}$working_tree_status DD AU UD UA DU AA UU + # Unmerged statuses taken directly from git status help's short format table + # Unmerged statuses are mutually exclusive with other statuses, so if we see + # these, then safe to assume the path is unmerged + _fzf_report_diff_type Unmerged + git diff $diff_opts -- $path + else + if test $index_status != ' ' + _fzf_report_diff_type Staged + + # renames are only detected in the index, never working tree, so only need to test for it here + # https://stackoverflow.com/questions/73954214 + if test $index_status = R + # diff the post-rename path with the original path, otherwise the diff will show the entire file as being added + set -f orig_and_new_path (string split --max 1 -- ' -> ' $path) + git diff --staged $diff_opts -- $orig_and_new_path[1] $orig_and_new_path[2] + # path currently has the form of "original -> current", so we need to correct it before it's used below + set path $orig_and_new_path[2] + else + git diff --staged $diff_opts -- $path + end + end + + if test $working_tree_status != ' ' + _fzf_report_diff_type Unstaged + git diff $diff_opts -- $path + end + end +end diff --git a/dot_config/fish/functions/_fzf_preview_file.fish b/dot_config/fish/functions/_fzf_preview_file.fish new file mode 100644 index 0000000..c926475 --- /dev/null +++ b/dot_config/fish/functions/_fzf_preview_file.fish @@ -0,0 +1,43 @@ +# helper function for _fzf_search_directory and _fzf_search_git_status +function _fzf_preview_file --description "Print a preview for the given file based on its file type." + # because there's no way to guarantee that _fzf_search_directory passes the path to _fzf_preview_file + # as one argument, we collect all the arguments into one single variable and treat that as the path + set -f file_path $argv + + if test -L "$file_path" # symlink + # notify user and recurse on the target of the symlink, which can be any of these file types + set -l target_path (realpath "$file_path") + + set_color yellow + echo "'$file_path' is a symlink to '$target_path'." + set_color normal + + _fzf_preview_file "$target_path" + else if test -f "$file_path" # regular file + if set --query fzf_preview_file_cmd + # need to escape quotes to make sure eval receives file_path as a single arg + eval "$fzf_preview_file_cmd '$file_path'" + else + bat --style=numbers --color=always "$file_path" + end + else if test -d "$file_path" # directory + if set --query fzf_preview_dir_cmd + # see above + eval "$fzf_preview_dir_cmd '$file_path'" + else + # -A list hidden files as well, except for . and .. + # -F helps classify files by appending symbols after the file name + command ls -A -F "$file_path" + end + else if test -c "$file_path" + _fzf_report_file_type "$file_path" "character device file" + else if test -b "$file_path" + _fzf_report_file_type "$file_path" "block device file" + else if test -S "$file_path" + _fzf_report_file_type "$file_path" socket + else if test -p "$file_path" + _fzf_report_file_type "$file_path" "named pipe" + else + echo "$file_path doesn't exist." >&2 + end +end diff --git a/dot_config/fish/functions/_fzf_report_diff_type.fish b/dot_config/fish/functions/_fzf_report_diff_type.fish new file mode 100644 index 0000000..cc26fb3 --- /dev/null +++ b/dot_config/fish/functions/_fzf_report_diff_type.fish @@ -0,0 +1,18 @@ +# helper for _fzf_preview_changed_file +# prints out something like +# ╭────────╮ +# │ Staged │ +# ╰────────╯ +function _fzf_report_diff_type --argument-names diff_type --description "Print a distinct colored header meant to preface a git patch." + # number of "-" to draw is the length of the string to box + 2 for padding + set -f repeat_count (math 2 + (string length $diff_type)) + set -f line (string repeat --count $repeat_count ─) + set -f top_border ╭$line╮ + set -f btm_border ╰$line╯ + + set_color yellow + echo $top_border + echo "│ $diff_type │" + echo $btm_border + set_color normal +end diff --git a/dot_config/fish/functions/_fzf_report_file_type.fish b/dot_config/fish/functions/_fzf_report_file_type.fish new file mode 100644 index 0000000..49e02e1 --- /dev/null +++ b/dot_config/fish/functions/_fzf_report_file_type.fish @@ -0,0 +1,6 @@ +# helper function for _fzf_preview_file +function _fzf_report_file_type --argument-names file_path file_type --description "Explain the file type for a file." + set_color red + echo "Cannot preview '$file_path': it is a $file_type." + set_color normal +end diff --git a/dot_config/fish/functions/_fzf_search_directory.fish b/dot_config/fish/functions/_fzf_search_directory.fish new file mode 100644 index 0000000..4541eec --- /dev/null +++ b/dot_config/fish/functions/_fzf_search_directory.fish @@ -0,0 +1,33 @@ +function _fzf_search_directory --description "Search the current directory. Replace the current token with the selected file paths." + # Directly use fd binary to avoid output buffering delay caused by a fd alias, if any. + # Debian-based distros install fd as fdfind and the fd package is something else, so + # check for fdfind first. Fall back to "fd" for a clear error message. + set -f fd_cmd (command -v fdfind || command -v fd || echo "fd") + set -f --append fd_cmd --color=always $fzf_fd_opts + + set -f fzf_arguments --multi --ansi $fzf_directory_opts + set -f token (commandline --current-token) + # expand any variables or leading tilde (~) in the token + set -f expanded_token (eval echo -- $token) + # unescape token because it's already quoted so backslashes will mess up the path + set -f unescaped_exp_token (string unescape -- $expanded_token) + + # If the current token is a directory and has a trailing slash, + # then use it as fd's base directory. + if string match --quiet -- "*/" $unescaped_exp_token && test -d "$unescaped_exp_token" + set --append fd_cmd --base-directory=$unescaped_exp_token + # use the directory name as fzf's prompt to indicate the search is limited to that directory + set --prepend fzf_arguments --prompt="Directory $unescaped_exp_token> " --preview="_fzf_preview_file $expanded_token{}" + set -f file_paths_selected $unescaped_exp_token($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments) + else + set --prepend fzf_arguments --prompt="Directory> " --query="$unescaped_exp_token" --preview='_fzf_preview_file {}' + set -f file_paths_selected ($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments) + end + + + if test $status -eq 0 + commandline --current-token --replace -- (string escape -- $file_paths_selected | string join ' ') + end + + commandline --function repaint +end diff --git a/dot_config/fish/functions/_fzf_search_git_log.fish b/dot_config/fish/functions/_fzf_search_git_log.fish new file mode 100644 index 0000000..aa54724 --- /dev/null +++ b/dot_config/fish/functions/_fzf_search_git_log.fish @@ -0,0 +1,36 @@ +function _fzf_search_git_log --description "Search the output of git log and preview commits. Replace the current token with the selected commit hash." + if not git rev-parse --git-dir >/dev/null 2>&1 + echo '_fzf_search_git_log: Not in a git repository.' >&2 + else + if not set --query fzf_git_log_format + # %h gives you the abbreviated commit hash, which is useful for saving screen space, but we will have to expand it later below + set -f fzf_git_log_format '%C(bold blue)%h%C(reset) - %C(cyan)%ad%C(reset) %C(yellow)%d%C(reset) %C(normal)%s%C(reset) %C(dim normal)[%an]%C(reset)' + end + + set -f preview_cmd 'git show --color=always --stat --patch {1}' + if set --query fzf_diff_highlighter + set preview_cmd "$preview_cmd | $fzf_diff_highlighter" + end + + set -f selected_log_lines ( + git log --no-show-signature --color=always --format=format:$fzf_git_log_format --date=short | \ + _fzf_wrapper --ansi \ + --multi \ + --scheme=history \ + --prompt="Git Log> " \ + --preview=$preview_cmd \ + --query=(commandline --current-token) \ + $fzf_git_log_opts + ) + if test $status -eq 0 + for line in $selected_log_lines + set -f abbreviated_commit_hash (string split --field 1 " " $line) + set -f full_commit_hash (git rev-parse $abbreviated_commit_hash) + set -f --append commit_hashes $full_commit_hash + end + commandline --current-token --replace (string join ' ' $commit_hashes) + end + end + + commandline --function repaint +end diff --git a/dot_config/fish/functions/_fzf_search_git_status.fish b/dot_config/fish/functions/_fzf_search_git_status.fish new file mode 100644 index 0000000..358f88c --- /dev/null +++ b/dot_config/fish/functions/_fzf_search_git_status.fish @@ -0,0 +1,41 @@ +function _fzf_search_git_status --description "Search the output of git status. Replace the current token with the selected file paths." + if not git rev-parse --git-dir >/dev/null 2>&1 + echo '_fzf_search_git_status: Not in a git repository.' >&2 + else + set -f preview_cmd '_fzf_preview_changed_file {}' + if set --query fzf_diff_highlighter + set preview_cmd "$preview_cmd | $fzf_diff_highlighter" + end + + set -f selected_paths ( + # Pass configuration color.status=always to force status to use colors even though output is sent to a pipe + git -c color.status=always status --short | + _fzf_wrapper --ansi \ + --multi \ + --prompt="Git Status> " \ + --query=(commandline --current-token) \ + --preview=$preview_cmd \ + --nth="2.." \ + $fzf_git_status_opts + ) + if test $status -eq 0 + # git status --short automatically escapes the paths of most files for us so not going to bother trying to handle + # the few edges cases of weird file names that should be extremely rare (e.g. "this;needs;escaping") + set -f cleaned_paths + + for path in $selected_paths + if test (string sub --length 1 $path) = R + # path has been renamed and looks like "R LICENSE -> LICENSE.md" + # extract the path to use from after the arrow + set --append cleaned_paths (string split -- "-> " $path)[-1] + else + set --append cleaned_paths (string sub --start=4 $path) + end + end + + commandline --current-token --replace -- (string join ' ' $cleaned_paths) + end + end + + commandline --function repaint +end diff --git a/dot_config/fish/functions/_fzf_search_history.fish b/dot_config/fish/functions/_fzf_search_history.fish new file mode 100644 index 0000000..cafbce9 --- /dev/null +++ b/dot_config/fish/functions/_fzf_search_history.fish @@ -0,0 +1,39 @@ +function _fzf_search_history --description "Search command history. Replace the command line with the selected command." + # history merge incorporates history changes from other fish sessions + # it errors out if called in private mode + if test -z "$fish_private_mode" + builtin history merge + end + + if not set --query fzf_history_time_format + # Reference https://devhints.io/strftime to understand strftime format symbols + set -f fzf_history_time_format "%m-%d %H:%M:%S" + end + + # Delinate time from command in history entries using the vertical box drawing char (U+2502). + # Then, to get raw command from history entries, delete everything up to it. The ? on regex is + # necessary to make regex non-greedy so it won't match into commands containing the char. + set -f time_prefix_regex '^.*? │ ' + # Delinate commands throughout pipeline using null rather than newlines because commands can be multi-line + set -f commands_selected ( + builtin history --null --show-time="$fzf_history_time_format │ " | + _fzf_wrapper --read0 \ + --print0 \ + --multi \ + --scheme=history \ + --prompt="History> " \ + --query=(commandline) \ + --preview="string replace --regex '$time_prefix_regex' '' -- {} | fish_indent --ansi" \ + --preview-window="bottom:3:wrap" \ + $fzf_history_opts | + string split0 | + # remove timestamps from commands selected + string replace --regex $time_prefix_regex '' + ) + + if test $status -eq 0 + commandline --replace -- $commands_selected + end + + commandline --function repaint +end diff --git a/dot_config/fish/functions/_fzf_search_processes.fish b/dot_config/fish/functions/_fzf_search_processes.fish new file mode 100644 index 0000000..133a880 --- /dev/null +++ b/dot_config/fish/functions/_fzf_search_processes.fish @@ -0,0 +1,32 @@ +function _fzf_search_processes --description "Search all running processes. Replace the current token with the pid of the selected process." + # Directly use ps command because it is often aliased to a different command entirely + # or with options that dirty the search results and preview output + set -f ps_cmd (command -v ps || echo "ps") + # use all caps to be consistent with ps default format + # snake_case because ps doesn't seem to allow spaces in the field names + set -f ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command') + set -f processes_selected ( + $ps_cmd -A -opid,command | \ + _fzf_wrapper --multi \ + --prompt="Processes> " \ + --query (commandline --current-token) \ + --ansi \ + # first line outputted by ps is a header, so we need to mark it as so + --header-lines=1 \ + # ps uses exit code 1 if the process was not found, in which case show an message explaining so + --preview="$ps_cmd -o '$ps_preview_fmt' -p {1} || echo 'Cannot preview {1} because it exited.'" \ + --preview-window="bottom:4:wrap" \ + $fzf_processes_opts + ) + + if test $status -eq 0 + for process in $processes_selected + set -f --append pids_selected (string split --no-empty --field=1 -- " " $process) + end + + # string join to replace the newlines outputted by string split with spaces + commandline --current-token --replace -- (string join ' ' $pids_selected) + end + + commandline --function repaint +end diff --git a/dot_config/fish/functions/_fzf_search_variables.fish b/dot_config/fish/functions/_fzf_search_variables.fish new file mode 100644 index 0000000..52a7c70 --- /dev/null +++ b/dot_config/fish/functions/_fzf_search_variables.fish @@ -0,0 +1,47 @@ +# This function expects the following two arguments: +# argument 1 = output of (set --show | psub), i.e. a file with the scope info and values of all variables +# argument 2 = output of (set --names | psub), i.e. a file with all variable names +function _fzf_search_variables --argument-names set_show_output set_names_output --description "Search and preview shell variables. Replace the current token with the selected variable." + if test -z "$set_names_output" + printf '%s\n' '_fzf_search_variables requires 2 arguments.' >&2 + + commandline --function repaint + return 22 # 22 means invalid argument in POSIX + end + + # Exclude the history variable from being piped into fzf because + # 1. it's not included in $set_names_output + # 2. it tends to be a very large value => increases computation time + # 3._fzf_search_history is a much better way to examine history anyway + set -f all_variable_names (string match --invert history <$set_names_output) + + set -f current_token (commandline --current-token) + # Use the current token to pre-populate fzf's query. If the current token begins + # with a $, remove it from the query so that it will better match the variable names + set -f cleaned_curr_token (string replace -- '$' '' $current_token) + + set -f variable_names_selected ( + printf '%s\n' $all_variable_names | + _fzf_wrapper --preview "_fzf_extract_var_info {} $set_show_output" \ + --prompt="Variables> " \ + --preview-window="wrap" \ + --multi \ + --query=$cleaned_curr_token \ + $fzf_variables_opts + ) + + if test $status -eq 0 + # If the current token begins with a $, do not overwrite the $ when + # replacing the current token with the selected variable. + # Uses brace expansion to prepend $ to each variable name. + commandline --current-token --replace ( + if string match --quiet -- '$*' $current_token + string join " " \${$variable_names_selected} + else + string join " " $variable_names_selected + end + ) + end + + commandline --function repaint +end diff --git a/dot_config/fish/functions/_fzf_wrapper.fish b/dot_config/fish/functions/_fzf_wrapper.fish new file mode 100644 index 0000000..45556ce --- /dev/null +++ b/dot_config/fish/functions/_fzf_wrapper.fish @@ -0,0 +1,20 @@ +function _fzf_wrapper --description "Prepares some environment variables before executing fzf." + # Make sure fzf uses fish to execute preview commands, some of which + # are autoloaded fish functions so don't exist in other shells. + # Use --function so that it doesn't clobber SHELL outside this function. + set -f --export SHELL (command --search fish) + + # If FZF_DEFAULT_OPTS is not set, then set some sane defaults. + # See https://github.com/junegunn/fzf#environment-variables + if not set --query FZF_DEFAULT_OPTS + # cycle allows jumping between the first and last results, making scrolling faster + # layout=reverse lists results top to bottom, mimicking the familiar layouts of git log, history, and env + # border shows where the fzf window begins and ends + # height=90% leaves space to see the current command and some scrollback, maintaining context of work + # preview-window=wrap wraps long lines in the preview window, making reading easier + # marker=* makes the multi-select marker more distinguishable from the pointer (since both default to >) + set --export FZF_DEFAULT_OPTS '--cycle --layout=reverse --border --height=90% --preview-window=wrap --marker="*"' + end + + fzf $argv +end diff --git a/dot_config/fish/functions/cpkey.fish b/dot_config/fish/functions/cpkey.fish new file mode 100644 index 0000000..349091c --- /dev/null +++ b/dot_config/fish/functions/cpkey.fish @@ -0,0 +1,11 @@ +#!/usr/bin/env fish + +function cpkey -d "Copy the id_ed25519 public key to clipboard, generating the keypair if needed" + if ! [ -O "~/.ssh/id_ed25519.pub" ] + echo "=> Generating id_ed25519 keypair..." + ssh-keygen -f "~/.ssh/id_ed25519" + end + + more "~/.ssh/id_ed25519.pub" | copyq copy - + echo "=> Public key copied to clipbard" +end diff --git a/dot_config/fish/functions/extract.fish b/dot_config/fish/functions/extract.fish new file mode 100644 index 0000000..3c56e05 --- /dev/null +++ b/dot_config/fish/functions/extract.fish @@ -0,0 +1,45 @@ +#!/usr/bin/env fish + +# Extracts archived files / mounts disk images. +# Usage: extract + +function extract -a file + if [ -f "$file" ] + switch file + case "*.tar.bz2" + tar -jxvf $file + case "*.tar.gz" + tar -zxvf $file + case "*.bz2" + bunzip2 $file + case "*.dmg" + if [ "$(uname)" = Darwin ] + hdiutil mount $file + end + case "*.gz" + gunzip $file + case "*.tar" + tar -xvf $file + case "*.tbz2" + tar -jxvf $file + case "*.tgz" + tar -zxvf $file + case "*.zip" + unzip $file + case "*.ZIP" + unzip $file + case "*pax" + cat $file | pax -r + case "*.pax.Z" + uncompress $file --stdout | pax -r + case "*.rar" + unrar x $file + case "*.Z" + uncompress $file + case "*" + echo "'$file' cannot be extracted/mounted via extract()." + end + else + echo "'$file' is not a valid file." + end +end diff --git a/dot_config/fish/functions/fish_greeting.fish b/dot_config/fish/functions/fish_greeting.fish new file mode 100644 index 0000000..8516e35 --- /dev/null +++ b/dot_config/fish/functions/fish_greeting.fish @@ -0,0 +1,5 @@ +#!/usr/bin/env fish + +function fish_greeting + fortune | cowsay | lolcat +end diff --git a/dot_config/fish/functions/fisher.fish b/dot_config/fish/functions/fisher.fish new file mode 100644 index 0000000..b1513d3 --- /dev/null +++ b/dot_config/fish/functions/fisher.fish @@ -0,0 +1,240 @@ +function fisher --argument-names cmd --description "A plugin manager for Fish" + set --query fisher_path || set --local fisher_path $__fish_config_dir + set --local fisher_version 4.4.4 + set --local fish_plugins $__fish_config_dir/fish_plugins + + switch "$cmd" + case -v --version + echo "fisher, version $fisher_version" + case "" -h --help + echo "Usage: fisher install Install plugins" + echo " fisher remove Remove installed plugins" + echo " fisher update Update installed plugins" + echo " fisher update Update all installed plugins" + echo " fisher list [] List installed plugins matching regex" + echo "Options:" + echo " -v, --version Print version" + echo " -h, --help Print this help message" + echo "Variables:" + echo " \$fisher_path Plugin installation path. Default: $__fish_config_dir" | string replace --regex -- $HOME \~ + case ls list + string match --entire --regex -- "$argv[2]" $_fisher_plugins + case install update remove + isatty || read --local --null --array stdin && set --append argv $stdin + + set --local install_plugins + set --local update_plugins + set --local remove_plugins + set --local arg_plugins $argv[2..-1] + set --local old_plugins $_fisher_plugins + set --local new_plugins + + test -e $fish_plugins && set --local file_plugins (string match --regex -- '^[^\s]+$' <$fish_plugins) + + if ! set --query argv[2] + if test "$cmd" != update + echo "fisher: Not enough arguments for command: \"$cmd\"" >&2 && return 1 + else if ! set --query file_plugins + echo "fisher: \"$fish_plugins\" file not found: \"$cmd\"" >&2 && return 1 + end + set arg_plugins $file_plugins + end + + for plugin in $arg_plugins + set plugin (test -e "$plugin" && realpath $plugin || string lower -- $plugin) + contains -- "$plugin" $new_plugins || set --append new_plugins $plugin + end + + if set --query argv[2] + for plugin in $new_plugins + if contains -- "$plugin" $old_plugins + test "$cmd" = remove && + set --append remove_plugins $plugin || + set --append update_plugins $plugin + else if test "$cmd" = install + set --append install_plugins $plugin + else + echo "fisher: Plugin not installed: \"$plugin\"" >&2 && return 1 + end + end + else + for plugin in $new_plugins + contains -- "$plugin" $old_plugins && + set --append update_plugins $plugin || + set --append install_plugins $plugin + end + + for plugin in $old_plugins + contains -- "$plugin" $new_plugins || set --append remove_plugins $plugin + end + end + + set --local pid_list + set --local source_plugins + set --local fetch_plugins $update_plugins $install_plugins + set --local fish_path (status fish-path) + + echo (set_color --bold)fisher $cmd version $fisher_version(set_color normal) + + for plugin in $fetch_plugins + set --local source (command mktemp -d) + set --append source_plugins $source + + command mkdir -p $source/{completions,conf.d,themes,functions} + + $fish_path --command " + if test -e $plugin + command cp -Rf $plugin/* $source + else + set temp (command mktemp -d) + set repo (string split -- \@ $plugin) || set repo[2] HEAD + + if set path (string replace --regex -- '^(https://)?gitlab.com/' '' \$repo[1]) + set name (string split -- / \$path)[-1] + set url https://gitlab.com/\$path/-/archive/\$repo[2]/\$name-\$repo[2].tar.gz + else + set url https://api.github.com/repos/\$repo[1]/tarball/\$repo[2] + end + + echo Fetching (set_color --underline)\$url(set_color normal) + + if command curl -q --silent -L \$url | command tar -xzC \$temp -f - 2>/dev/null + command cp -Rf \$temp/*/* $source + else + echo fisher: Invalid plugin name or host unavailable: \\\"$plugin\\\" >&2 + command rm -rf $source + end + + command rm -rf \$temp + end + + set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files + " & + + set --append pid_list (jobs --last --pid) + end + + wait $pid_list 2>/dev/null + + for plugin in $fetch_plugins + if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source + if set --local index (contains --index -- "$plugin" $install_plugins) + set --erase install_plugins[$index] + else + set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)] + end + end + end + + for plugin in $update_plugins $remove_plugins + if set --local index (contains --index -- "$plugin" $_fisher_plugins) + set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files + + if contains -- "$plugin" $remove_plugins + for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var) + emit {$name}_uninstall + end + printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~ + set --erase _fisher_plugins[$index] + end + + command rm -rf (string replace -- \~ ~ $$plugin_files_var) + + functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var) + + for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var) + complete --erase --command $name + end + + set --erase $plugin_files_var + end + end + + if set --query update_plugins[1] || set --query install_plugins[1] + command mkdir -p $fisher_path/{functions,themes,conf.d,completions} + end + + for plugin in $update_plugins $install_plugins + set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] + set --local files $source/{functions,themes,conf.d,completions}/* + + if set --local index (contains --index -- $plugin $install_plugins) + set --local user_files $fisher_path/{functions,themes,conf.d,completions}/* + set --local conflict_files + + for file in (string replace -- $source/ $fisher_path/ $files) + contains -- $file $user_files && set --append conflict_files $file + end + + if set --query conflict_files[1] && set --erase install_plugins[$index] + echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2 + continue + end + end + + for file in (string replace -- $source/ "" $files) + command cp -RLf $source/$file $fisher_path/$file + end + + set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files + + set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files | string replace -- ~ \~) + + contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin + contains -- $plugin $install_plugins && set --local event install || set --local event update + + printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~ + + for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var | string replace -- \~ ~) + source $file + if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file) + emit {$name}_$event + end + end + end + + command rm -rf $source_plugins + + if set --query _fisher_plugins[1] + set --local commit_plugins + + for plugin in $file_plugins + contains -- (string lower -- $plugin) (string lower -- $_fisher_plugins) && set --append commit_plugins $plugin + end + + for plugin in $_fisher_plugins + contains -- (string lower -- $plugin) (string lower -- $commit_plugins) || set --append commit_plugins $plugin + end + + printf "%s\n" $commit_plugins >$fish_plugins + else + set --erase _fisher_plugins + command rm -f $fish_plugins + end + + set --local total (count $install_plugins) (count $update_plugins) (count $remove_plugins) + + test "$total" != "0 0 0" && echo (string join ", " ( + test $total[1] = 0 || echo "Installed $total[1]") ( + test $total[2] = 0 || echo "Updated $total[2]") ( + test $total[3] = 0 || echo "Removed $total[3]") + ) plugin/s + case \* + echo "fisher: Unknown command: \"$cmd\"" >&2 && return 1 + end +end + +if ! set --query _fisher_upgraded_to_4_4 + set --universal _fisher_upgraded_to_4_4 + if functions --query _fisher_list + set --query XDG_DATA_HOME[1] || set --local XDG_DATA_HOME ~/.local/share + command rm -rf $XDG_DATA_HOME/fisher + functions --erase _fisher_{list,plugin_parse} + fisher update >/dev/null 2>/dev/null + else + for var in (set --names | string match --entire --regex '^_fisher_.+_files$') + set $var (string replace -- ~ \~ $$var) + end + functions --erase _fisher_fish_postexec + end +end diff --git a/dot_config/fish/functions/fm.fish b/dot_config/fish/functions/fm.fish new file mode 100644 index 0000000..5708167 --- /dev/null +++ b/dot_config/fish/functions/fm.fish @@ -0,0 +1,5 @@ +#!/usr/bin/env fish + +function fm --wraps=fzf -d "Use fzf as a simple file viewer" + find . -type d | fzf --preview='eza --color=always -T {} | head -n 50' +end diff --git a/dot_config/fish/functions/fuck.fish b/dot_config/fish/functions/fuck.fish new file mode 100644 index 0000000..c046ab7 --- /dev/null +++ b/dot_config/fish/functions/fuck.fish @@ -0,0 +1,11 @@ +#!/usr/bin/env fish + +function fuck -d "Correct your previous console command" + set -l fucked_up_command $history[1] + env TF_SHELL=fish TF_ALIAS=fuck PYTHONIOENCODING=utf-8 thefuck $fucked_up_command THEFUCK_ARGUMENT_PLACEHOLDER $argv | read -l unfucked_command + if [ "$unfucked_command" != "" ] + eval $unfucked_command + builtin history delete --exact --case-sensitive -- $fucked_up_command + builtin history merge + end +end diff --git a/dot_config/fish/functions/fzf.fish b/dot_config/fish/functions/fzf.fish new file mode 100644 index 0000000..90e0813 --- /dev/null +++ b/dot_config/fish/functions/fzf.fish @@ -0,0 +1,9 @@ +#!/usr/bin/env fish + +function fzf --wraps=fzf + if set --query TMUX + fzf-tmux -p 90%,95% $argv + else + command fzf $argv + end +end diff --git a/dot_config/fish/functions/fzf_configure_bindings.fish b/dot_config/fish/functions/fzf_configure_bindings.fish new file mode 100644 index 0000000..4b4e7a2 --- /dev/null +++ b/dot_config/fish/functions/fzf_configure_bindings.fish @@ -0,0 +1,46 @@ +# Always installs bindings for insert and default mode for simplicity and b/c it has almost no side-effect +# https://gitter.im/fish-shell/fish-shell?at=60a55915ee77a74d685fa6b1 +function fzf_configure_bindings --description "Installs the default key bindings for fzf.fish with user overrides passed as options." + # no need to install bindings if not in interactive mode or running tests + status is-interactive || test "$CI" = true; or return + + set -f options_spec h/help 'directory=?' 'git_log=?' 'git_status=?' 'history=?' 'processes=?' 'variables=?' + argparse --max-args=0 --ignore-unknown $options_spec -- $argv 2>/dev/null + if test $status -ne 0 + echo "Invalid option or a positional argument was provided." >&2 + _fzf_configure_bindings_help + return 22 + else if set --query _flag_help + _fzf_configure_bindings_help + return + else + # Initialize with default key sequences and then override or disable them based on flags + # index 1 = directory, 2 = git_log, 3 = git_status, 4 = history, 5 = processes, 6 = variables + set -f key_sequences \e\cf \e\cl \e\cs \cr \e\cp \cv # \c = control, \e = escape + set --query _flag_directory && set key_sequences[1] "$_flag_directory" + set --query _flag_git_log && set key_sequences[2] "$_flag_git_log" + set --query _flag_git_status && set key_sequences[3] "$_flag_git_status" + set --query _flag_history && set key_sequences[4] "$_flag_history" + set --query _flag_processes && set key_sequences[5] "$_flag_processes" + set --query _flag_variables && set key_sequences[6] "$_flag_variables" + + # If fzf bindings already exists, uninstall it first for a clean slate + if functions --query _fzf_uninstall_bindings + _fzf_uninstall_bindings + end + + for mode in default insert + test -n $key_sequences[1] && bind --mode $mode $key_sequences[1] _fzf_search_directory + test -n $key_sequences[2] && bind --mode $mode $key_sequences[2] _fzf_search_git_log + test -n $key_sequences[3] && bind --mode $mode $key_sequences[3] _fzf_search_git_status + test -n $key_sequences[4] && bind --mode $mode $key_sequences[4] _fzf_search_history + test -n $key_sequences[5] && bind --mode $mode $key_sequences[5] _fzf_search_processes + test -n $key_sequences[6] && bind --mode $mode $key_sequences[6] "$_fzf_search_vars_command" + end + + function _fzf_uninstall_bindings --inherit-variable key_sequences + bind --erase -- $key_sequences + bind --erase --mode insert -- $key_sequences + end + end +end diff --git a/dot_config/fish/functions/git_open.fish b/dot_config/fish/functions/git_open.fish new file mode 100644 index 0000000..d8e67eb --- /dev/null +++ b/dot_config/fish/functions/git_open.fish @@ -0,0 +1,25 @@ +#!/usr/bin/env fish + +function git_open + set -f origin "$(git remote get-url origin)" + + switch "$origin" + case "*github*" + if command -v gh &>/dev/null + gh repo view --web &>/dev/null + else if command -v hub &>/dev/null + hub browse &>/dev/null + else + set_color red + echo "[ERROR] Install gh-cli or hub to open Github repos." >&2 + set_color normal + return 1 + end + case "https://*" + open '$origin' >/dev/null & + case "*" + set_color red + printf "[ERROR] Unrecognized origin %s" "$origin" >&2 + return 1 + end +end diff --git a/dot_config/fish/functions/hack.fish b/dot_config/fish/functions/hack.fish new file mode 100644 index 0000000..a53f322 --- /dev/null +++ b/dot_config/fish/functions/hack.fish @@ -0,0 +1,15 @@ +#!/usr/bin/env fish + +function hack --description "Select a GH repo, [clone it], enter its directory" + set -f repos $(gh repo list --source --no-archived --json name,description --jq '.[] | "\(.name) \u001b[1;30m\(.description)\u001b[0m"') + set -f repo $(gum filter --height 10 $repos | string split ' ')[1] + + set -f path "$HOME/hackin/$repo" + + if test ! -d $path + echo "Cloning $repo into $path..." + gh repo clone $repo $path + end + + cd $path +end diff --git a/dot_config/fish/functions/open.fish b/dot_config/fish/functions/open.fish new file mode 100644 index 0000000..a0c2fef --- /dev/null +++ b/dot_config/fish/functions/open.fish @@ -0,0 +1,11 @@ +#!/usr/bin/env fish + +if test "$OS" = Darwin + function open --wraps open + open "$argv" + end +else + function open --wraps xdg-open + xdg-open "$argv" >/dev/null + end +end diff --git a/dot_config/fish/functions/pkgsearch.fish b/dot_config/fish/functions/pkgsearch.fish new file mode 100644 index 0000000..dd6930e --- /dev/null +++ b/dot_config/fish/functions/pkgsearch.fish @@ -0,0 +1,12 @@ +#!/usr/bin/env fish + +function pkgsearch -d "Search the core/extra/AUR repos for a package" + set -f res (yay -Slq | command fzf --multi --preview 'yay -Si {}' --height=90% --layout=reverse) + + if test $status -eq 0 + set -l pkgs (string join ' ' $res) + commandline --current-token --replace -- "yay -S $res" + end + + commandline --function repaint +end diff --git a/dot_config/fish/functions/tmux_up.fish b/dot_config/fish/functions/tmux_up.fish new file mode 100644 index 0000000..f0c4a13 --- /dev/null +++ b/dot_config/fish/functions/tmux_up.fish @@ -0,0 +1,7 @@ +#!/usr/bin/env fish + +function tmux_up --description "Update tmux plugins" + ~/.config/tmux/plugins/tpm/bin/install_plugins + ~/.config/tmux/plugins/tpm/bin/clean_plugins + ~/.config/tmux/plugins/tpm/bin/update_plugins all +end diff --git a/dot_config/fish/functions/up.fish b/dot_config/fish/functions/up.fish new file mode 100644 index 0000000..9e83a5b --- /dev/null +++ b/dot_config/fish/functions/up.fish @@ -0,0 +1,28 @@ +function up --description "Update everything except pacman/yay" + cd $HOME || exit 1 + + if type -q brew + set_color magenta && echo Homebrew && set_color normal + brew update && brew upgrade + end + + if type -q npm + set_color magenta && echo npm && set_color normal + npm up -g + end + + if type -q tmux + set_color magenta && echo tmux && set_color normal + tmux_up + end + + if type -q fish_update_completions + set_color magenta && echo "fish completions" && set_color normal + fish_update_completions + end + + if type -q fisher + set_color magenta && echo fisher && set_color normal + fisher update + end +end diff --git a/dot_config/gh/config.yml b/dot_config/gh/config.yml new file mode 100644 index 0000000..241fb97 --- /dev/null +++ b/dot_config/gh/config.yml @@ -0,0 +1,17 @@ +# The current version of the config schema +version: 1 +# What protocol to use when performing git operations. Supported values: ssh, https +git_protocol: https +# What editor gh should run when creating issues, pull requests, etc. If blank, will refer to environment. +editor: +# When to interactively prompt. This is a global config that cannot be overridden by hostname. Supported values: enabled, disabled +prompt: enabled +# A pager program to send command output to, e.g. "less". Set the value to "cat" to disable the pager. +pager: +# Aliases allow you to create nicknames for gh commands +aliases: + co: pr checkout +# The path to a unix socket through which send HTTP connections. If blank, HTTP traffic will be handled by net/http.DefaultTransport. +http_unix_socket: +# What web browser gh should use when opening URLs. If blank, will refer to environment. +browser: diff --git a/dot_config/git/config b/dot_config/git/config new file mode 100644 index 0000000..332287a --- /dev/null +++ b/dot_config/git/config @@ -0,0 +1,126 @@ +[core] + attributesFile = ~/.config/git/.gitattributes + excludesFile = ~/.config/git/.gitignore + hooksPath = ~/.config/git/hooks + + # Whitespace types to treat as errors. + # blank-at-eol: looks for spaces at EOL. + # -blank-at-eof: allows blank lines at EOF. + # space-before-tab: looks for spaces immediately before tabs at the beginning + # of the line. + whitespace = blank-at-eol,-blank-at-eof,space-before-tab + + # Prevent showing files whose names contain non-ASCII symbols as unversioned. + # http://michael-kuehnel.de/git/2014/11/21/git-mac-osx-and-german-umlaute.html + precomposeunicode = false + + # Speed up commands involving untracked files such as `git status`. + # https://git-scm.com/docs/git-update-index#_untracked_cache + untrackedCache = true + + # Use delta. + pager = delta + +[user] + # Do not guess the user's identity. + useConfigOnly = true + +[include] + path = ~/.config/git/config.delta-themes + +[delta] + navigate = true + syntax-theme = Catppuccin-mocha + features = mellow-barbet + true-color = always + hyperlinks = true + +[color] + diff = always + +[pretty] + lo = tformat:%C(auto)%h%C(reset)%C(auto)%d%C(reset) %s %C(italic blue)%ad%C(reset) %C(241)%aN%C(reset) + lc = format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n + lt = format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n%w(0,7,7)%+(trailers:only,unfold) + lf = format:%C(auto)%h%C(reset)%C(auto)%d%C(reset) %C(italic 239)[P: %p] [T: %t]%C(reset)%n%C(white)Author:%C(reset) %aN %C(241)<%aE>%C(reset)%n %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%n%C(white)Commit:%C(reset) %cN %C(241)<%cE>%C(reset) %C(italic 239)[GPG: %G?% GK]%C(reset)%n %C(italic blue)%cd%C(reset) %C(italic cyan)(%cr)%C(reset)%w(0,4,4)%n%n%C(bold)%s%C(reset)%n%n%-b%n%n%-N%n + rlo = tformat:%C(auto)%h%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset)%C(auto)%d%C(reset) %gs %C(italic blue)%ad%C(reset) %C(241)%aN%C(reset) + rlc = format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n %C(white)⤷%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset) %gs %C(241)- %gN <%gE>%C(reset)%n + rlt = format:%C(auto)%h%C(reset) %C(white)-%C(reset) %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)⤷%C(reset) %s %C(241)- %aN <%aE>%C(reset)%n %C(white)⤷%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset) %gs %C(241)- %gN <%gE>%C(reset)%n%w(0,7,7)%+(trailers:only,unfold) + rlf = format:%C(auto)%h%C(reset) %C(bold yellow)(%C(magenta)%gd%C(bold yellow))%C(reset)%C(auto)%d%C(reset) %C(italic 239)[P: %p] [T: %t]%C(reset)%n%C(white)Author:%C(reset) %aN %C(241)<%aE>%C(reset)%n %C(italic blue)%ad%C(reset) %C(italic cyan)(%ar)%C(reset)%n%C(white)Commit:%C(reset) %cN %C(241)<%cE>%C(reset) %C(italic 239)[GPG: %G?% GK]%C(reset)%n %C(italic blue)%cd%C(reset) %C(italic cyan)(%cr)%C(reset)%n%C(white)Reflog:%C(reset) %gN %C(241)<%gE>%C(reset)%n %C(italic)%gs%C(reset)%w(0,4,4)%n%n%C(bold)%s%C(reset)%n%n%-b%n%n%-N%n + +[include] + path = ~/.config/git/config.aliases + +[init] + defaultBranch = main + +[interactive] + diffFilter = delta --color-only + +[status] + showstash = true + +[commit] + gpgSign = true + +[tag] + gpgSign = true + +[push] + autoSetupRemote = true + + # Push tags automatically. + followTags = true + +[rebase] + autosquash = true + +[merge] + # Include summaries of merged commits in merge commit messages. + log = true + + # delta. + conflictstyle = diff3 + +[mergetool] + keepBackup = false + hideResolved = true + +[diff] + # Detect when files are copied as well as renamed. + renames = copies + + # delta + colorMoved = default + +[apply] + # Fix whitespace errors when applying a patch, as specified in + # core.whitespace. + whitespace = true + +[branch] + # Show most recently changed branches first. + sort = -committerdate + + autoSetupMerge = simple + +[url "git@github.com:"] + insteadOf = @gh: + +[url "aur@aur.archlinux.org"] + insteadOf = @aur: + +[url "https://github.com/"] + insteadOf = gh:// + +[url "https://aur.archlinux.org/"] + insteadOf = aur:// + +[credential "https://github.com"] + helper = !/usr/bin/gh auth git-credential + +[credential "https://gist.github.com"] + helper = !/usr/bin/gh auth git-credential + +[include] + path = ~/.config/git/config.local diff --git a/dot_config/git/config.aliases b/dot_config/git/config.aliases new file mode 100644 index 0000000..b041a75 --- /dev/null +++ b/dot_config/git/config.aliases @@ -0,0 +1,164 @@ +# vim:set ft=gitconfig : + +[alias] + + # Staging - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + a = add + aa = add --all + + # Interactively stage parts of a file. + apa = add --patch + + da = diff + das = diff --staged + daw = diff --word-diff # show diff by word + dasw = diff --staged --word-diff + + d = "!f() { git diff "$@" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f" + ds = "!f() { git diff --staged "$@" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f" + dw = "!f() { git diff --word-diff "$@" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f" + dsw = "!f() { git diff --staged --word-diff "$@" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f" + + st = status --short --branch + stu = status --short --branch -u + stl = status + + # Committing - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + c = commit + ce = commit --amend + cen = commit --amend --no-edit --no-verify + ca = "!git add --all && git commit" + cae = "!git add --all && git commit --amend" + caen = "!git add --all && git commit --amend --no-edit --no-verify" + cfu = commit --fixup + + rev = revert + + # Working Dir & Index Manipulation - - - - - - - - - - - - - - - - - - - - - - + + co = checkout + + rt = reset + # rt -- [] - undo but keep changes in working dir. + + rts = reset --soft # undo commits and stage their changes + + rs = restore --worktree # revert local changes + rst = restore --staged # unstage things + rsa = restore --worktree --staged + + rss = restore --worktree --source # specify a commit to revert to + rsts = restore --staged --source + rsas = restore --worktree --staged --source + + rmc = rm --cached # leave worktree copy alone + + sta = stash push + stam = stash push --message + staa = stash push --include-untracked + staam = stash push --include-untracked --message + + stap = stash pop + stal = stash list + stas = stash show --text + + cl = clean -f # remove untracked & unignored files + cldr = clean --dry-run + + # Branches - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + b = branch + cb = checkout -b + cm = "!git checkout $(git_main_branch)" + cd = "!git checkout $(git_develop_branch)" + + m = merge + mtl = mergetool --no-prompt + ma = merge --abort + + cp = cherry-pick + cpa = cherry-pick --abort + cpc = cherry-pick --continue + cpq = cherry-pick --quit + + # Remotes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + p = push + pv = push -v + pdr = push --dry-run + pf = push --force-with-lease --force-if-includes + pfv = push -v --force-with-lease --force-if-includes + pff = push --force + pffv = push -v --force + + f = fetch + fa = fetch --all --prune + + pl = pull + plr = pull --rebase + + sub = submodule + subu = submodule update --init --recursive + + # Logs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + # Current branch. + l = log --pretty=lc --graph + lo = log --pretty=lo --graph --date=human + ls = log --pretty=lo --graph --date=human --simplify-by-decoration + lf = log --pretty=lf --graph + ld = log --pretty=lf --graph --cc --stat + lp = log --pretty=lf --graph --cc --patch + + ls = log -5 --pretty=lc --graph + los = log -5 --pretty=lo --graph --date=human + lss = log -5 --pretty=lo --graph --date=human --simplify-by-decoration + lfs = log -5 --pretty=lf --graph + lds = log -5 --pretty=lf --graph --cc --stat + lps = log -5 --pretty=lf --graph --cc --patch + + # All branches on all remotes. + la = log --pretty=lc --graph --all + lao = log --pretty=lo --graph --all --date=human + las = log --pretty=lo --graph --all --date=human --simplify-by-decoration + laf = log --pretty=lf --graph --all + lad = log --pretty=lf --graph --all --cc --stat + lap = log --pretty=lf --graph --all --cc --patch + + las = log -5 --pretty=lc --graph --all + laos = log -5 --pretty=lo --graph --all --date=human + lass = log -5 --pretty=lo --graph --all --date=human --simplify-by-decoration + lafs = log -5 --pretty=lf --graph --all + lads = log -5 --pretty=lf --graph --all --cc --stat + laps = log -5 --pretty=lf --graph --all --cc --patch + + + # Shortcuts - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + nevermind = "!git reset --hard HEAD && git clean -df" + + open = "!fish -c git_open" + + chash = "!git log --oneline | gum filter --height 10 | cut -d' ' -f1 | copyq copy - &>/dev/null" + + # Notes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + # A note on reset, restore, and revert, paraphrased from `man git`, plus myown + # own on `rm`: + # + # revert - make a new commit that reverts a previous commit. + # restore - undo uncommitted changes in the working tree. + # reset - update the branch and change commit history. + # rm - same as system rm; remove files, either from git's knowledge, the + # working directory, or both. + # + # These are not a description of the *possible* uses, rather a narrowing of + # the *intended* uses. + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + # PATH VALUES: + # :/ - all files within the root of the working tree, so all files in the + # repo, a la git add's --all option. diff --git a/dot_config/git/config.delta-themes b/dot_config/git/config.delta-themes new file mode 100644 index 0000000..241aac5 --- /dev/null +++ b/dot_config/git/config.delta-themes @@ -0,0 +1,513 @@ +# vim:set ft=gitconfig : +# +# To use these themes, first include this file in your own gitconfig file: +# +# [include] +# path = PATH/TO/delta/themes.gitconfig +# +# Then, in your own gitconfig file, activate the chosen theme, e.g. +# +# [delta] +# features = kingfisher +# +# Please add your own themes to this file, and open a PR. +# +# Instructions: +# +# 1. The name of the theme must be the name of some sort of wild organism: +# mammal, bird, plant, mollusk -- whatever. It can be in any language. +# +# 2. Use `delta --show-config` to list all the style settings that are active in +# your current delta environment, but only include settings in your theme +# that are essential to its appearance. +# +# 3. Include either `dark = true` or `light = true` according to whether it is +# designed for a light or dark terminal background. (This marks a feature as +# a "theme", causing it to be picked up by `delta --show-themes`). +# +# 4. Feel free to include a comment line indicating who is the author of the +# theme. E.g. a link to your github user page. + +[delta "colibri"] + # author: https://github.com/pablospe + # Based on woolly-mammoth: https://github.com/Kr1ss-XD. + commit-decoration-style = 130 box + dark = true + file-decoration-style = "#606018" overline + file-added-label = [●] + file-copied-label = [C] + file-modified-label = [+] + file-removed-label = [⛌] + file-renamed-label = [→] + file-style = 232 bold 184 + hunk-header-style = syntax bold italic 237 + line-numbers = true + line-numbers-left-format = "{nm:>1}┊" + line-numbers-left-style = red + line-numbers-minus-style = red bold + line-numbers-plus-style = green bold + line-numbers-right-format = " {np:>1}┊" + line-numbers-right-style = green + line-numbers-zero-style = "#545474" italic + minus-emph-style = normal "#80002a" + minus-style = normal "#5e0000" + plus-emph-style = syntax bold "#007e5e" + plus-style = syntax "#003500" + syntax-theme = OneHalfDark + whitespace-error-style = "#80002a" reverse + zero-style = syntax + blame-format = "{author:<18} ({commit:>7}) ┊{timestamp:^16}┊ " + +[delta "collared-trogon"] + # author: https://github.com/clnoll + commit-decoration-style = bold box ul + dark = true + file-decoration-style = none + file-style = omit + hunk-header-decoration-style = "#022b45" box ul + hunk-header-file-style = "#999999" + hunk-header-line-number-style = bold "#003300" + hunk-header-style = file line-number syntax + line-numbers = true + line-numbers-left-style = "#022b45" + line-numbers-minus-style = "#80002a" + line-numbers-plus-style = "#003300" + line-numbers-right-style = "#022b45" + line-numbers-zero-style = "#999999" + minus-emph-style = normal "#80002a" + minus-style = normal "#330011" + plus-emph-style = syntax "#003300" + plus-style = syntax "#001a00" + syntax-theme = Nord + +[delta "coracias-caudatus"] + # author: https://github.com/clnoll + commit-decoration-style = ol "#7536ff" + commit-style = "#200078" + file-decoration-style = none + file-style = omit + hunk-header-decoration-style = "#cfd6ff" ul + hunk-header-file-style = "#858dff" + hunk-header-line-number-style = "#7536ff" + hunk-header-style = file line-number syntax + light = true + line-numbers = true + line-numbers-left-format = "{nm:>4} ." + line-numbers-left-style = "#e3ab02" + line-numbers-minus-style = "#ff38b6" + line-numbers-plus-style = "#00e0c2" + line-numbers-right-format = "{np:>4} " + line-numbers-right-style = white + line-numbers-zero-style = "#cccccc" + minus-emph-style = bold "#ff3838" "#ffe3f7" + minus-style = "#ff0080" + plus-emph-style = "#008a81" bold "#00ffbf" + plus-style = syntax "#cffff3" + syntax-theme = GitHub + +[delta "hoopoe"] + # author: https://github.com/dandavison + light = true + pink = "#ffe0e0" + dark-pink = "#ffc0c0" + green = "#d0ffd0" + dark-green = "#a0efa0" + dark-green-2 = "#067a00" + minus-style = normal hoopoe.pink + minus-emph-style = normal hoopoe.dark-pink + minus-non-emph-style = minus-style + plus-style = syntax hoopoe.green + plus-emph-style = syntax hoopoe.dark-green + plus-non-emph-style = plus-style + minus-empty-line-marker-style = minus-style + plus-empty-line-marker-style = plus-style + commit-decoration-style = blue ol + commit-style = raw + file-style = omit + hunk-header-decoration-style = blue box + hunk-header-file-style = red + hunk-header-line-number-style = hoopoe.dark-green-2 + hunk-header-style = file line-number syntax + syntax-theme = GitHub + zero-style = syntax + +[delta "tangara-chilensis"] + # author: https://github.com/clnoll + commit-decoration-style = bold box ul "#34fd50" + dark = true + file-decoration-style = none + file-style = omit + hunk-header-decoration-style = "#00b494" box ul + hunk-header-file-style = "#999999" + hunk-header-line-number-style = bold "#03a4ff" + hunk-header-style = file line-number syntax + line-numbers = true + line-numbers-left-style = black + line-numbers-minus-style = "#B10036" + line-numbers-plus-style = "#03a4ff" + line-numbers-right-style = black + line-numbers-zero-style = "#999999" + minus-emph-style = normal "#de004e" + minus-style = normal "#990017" + plus-emph-style = syntax "#03a4ff" + plus-style = syntax "#450eff" + side-by-side = true + syntax-theme = Vibrant Sunburst + +[delta "villsau"] + # author: https://github.com/torarnv + dark = true + file-style = omit + hunk-header-decoration-style = omit + hunk-header-file-style = magenta + hunk-header-line-number-style = dim magenta + hunk-header-style = file line-number syntax + line-numbers = false + minus-emph-style = bold red 52 + minus-empty-line-marker-style = normal "#3f0001" + minus-non-emph-style = dim red + minus-style = bold red + plus-emph-style = bold green 22 + plus-empty-line-marker-style = normal "#002800" + plus-non-emph-style = dim green + plus-style = bold green + syntax-theme = OneHalfDark + whitespace-error-style = reverse red + zero-style = dim syntax + +[delta "woolly-mammoth"] + # author: https://github.com/Kr1ss-XD + commit-decoration-style = 232 130 box + commit-style = 232 bold italic 130 + dark = true + file-added-label = [+] + file-copied-label = [C] + file-decoration-style = "#606018" overline + file-modified-label = [M] + file-removed-label = [-] + file-renamed-label = [R] + file-style = 232 bold 184 + hunk-header-decoration-style = none + hunk-header-style = syntax bold italic 237 + line-numbers = true + line-numbers-left-format = "{nm:>1}┊" + line-numbers-left-style = red + line-numbers-minus-style = red italic black + line-numbers-plus-style = green italic black + line-numbers-right-format = "{np:>1}┊" + line-numbers-right-style = green + line-numbers-zero-style = "#545474" italic + minus-emph-style = syntax bold "#780000" + minus-style = syntax "#400000" + plus-emph-style = syntax bold "#007800" + plus-style = syntax "#004000" + syntax-theme = Vibrant Sunburst + whitespace-error-style = "#280050" reverse + zero-style = syntax + blame-format = "{author:<18} ({commit:>7}) ┊{timestamp:^16}┊ " + blame-palette = "#101010 #200020 #002800 #000028 #202000 #280000 #002020 #002800 #202020" + +[delta "calochortus-lyallii"] + # author: https://github.com/manojkarthick + commit-decoration-style = none + dark = true + file-added-label = [+] + file-copied-label = [C] + file-decoration-style = none + file-modified-label = [M] + file-removed-label = [-] + file-renamed-label = [R] + file-style = 232 bold 184 + hunk-header-decoration-style = none + hunk-header-file-style = "#999999" + hunk-header-line-number-style = bold "#03a4ff" + hunk-header-style = file line-number syntax + line-numbers = true + line-numbers-left-style = black + line-numbers-minus-style = "#B10036" + line-numbers-plus-style = "#03a4ff" + line-numbers-right-style = black + line-numbers-zero-style = "#999999" + minus-emph-style = syntax bold "#780000" + minus-style = syntax "#400000" + plus-emph-style = syntax bold "#007800" + plus-style = syntax "#004000" + whitespace-error-style = "#280050" reverse + zero-style = syntax + syntax-theme = Nord + +[delta "mantis-shrimp"] + #author: https://github.com/2kabhishek + dark = true + side-by-side = true + keep-plus-minus-markers = true + hyperlinks = true + file-added-label = [+] + file-copied-label = [==] + file-modified-label = [*] + file-removed-label = [-] + file-renamed-label = [->] + file-style = omit + zero-style = syntax + syntax-theme = Monokai Extended + commit-decoration-style ="#11ce16" box + commit-style = "#ffd21a" bold italic + hunk-header-decoration-style = "#1688f0" box ul + hunk-header-file-style = "#c63bee" ul bold + hunk-header-line-number-style = "#ffd21a" box bold + hunk-header-style = file line-number syntax bold italic + line-numbers = true + line-numbers-left-format = "{nm:>1}|" + line-numbers-left-style = "#1688f0" + line-numbers-minus-style = "#ff0051" bold + line-numbers-plus-style = "#03e57f" bold + line-numbers-right-format = "{np:>1}|" + line-numbers-right-style = "#1688f0" + line-numbers-zero-style = "#aaaaaa" italic + minus-emph-style = syntax bold "#b80000" + minus-style = syntax "#5d001e" + plus-emph-style = syntax bold "#007800" + plus-style = syntax "#004433" + whitespace-error-style = "#280050" + +[delta "mantis-shrimp-lite"] + #author: https://github.com/2kabhishek + dark = true + side-by-side = true + keep-plus-minus-markers = true + file-added-label = [+] + file-copied-label = [==] + file-modified-label = [*] + file-removed-label = [-] + file-renamed-label = [->] + file-style = omit + zero-style = syntax + syntax-theme = Monokai Extended + commit-decoration-style = green box + commit-style = yellow bold italic + hunk-header-decoration-style = blue box ul + hunk-header-file-style = purple ul bold + hunk-header-line-number-style = yellow box bold + hunk-header-style = file line-number syntax bold italic + line-numbers = true + line-numbers-left-format = "{nm:>1}|" + line-numbers-left-style = blue + line-numbers-minus-style = red bold + line-numbers-plus-style = green bold + line-numbers-right-format = "{np:>1}|" + line-numbers-right-style = blue + line-numbers-zero-style = white italic + minus-emph-style = syntax bold red + plus-emph-style = syntax bold green + whitespace-error-style = purple bold + +[delta "zebra-dark"] + minus-style = syntax "#330f0f" + minus-emph-style = syntax "#4f1917" + plus-style = syntax "#0e2f19" + plus-emph-style = syntax "#174525" + map-styles = \ + bold purple => syntax "#330f29", \ + bold blue => syntax "#271344", \ + bold cyan => syntax "#0d3531", \ + bold yellow => syntax "#222f14" + zero-style = syntax + whitespace-error-style = "#aaaaaa" + +[delta "zebra-light"] + minus-style = syntax "#fbdada" + minus-emph-style = syntax "#f6b6b6" + plus-style = syntax "#d6ffd6" + plus-emph-style = syntax "#adffad" + map-styles = \ + bold purple => syntax "#feecf7", \ + bold blue => syntax "#e5dff6", \ + bold cyan => syntax "#d8fdf6", \ + bold yellow => syntax "#f4ffe0" + zero-style = syntax + whitespace-error-style = "#aaaaaa" + +[delta "chameleon"] + #author: https://github.com/AirOnSkin + dark = true + line-numbers = true + side-by-side = true + keep-plus-minus-markers = false + syntax-theme = Nord + file-style = "#434C5E" bold + file-decoration-style = "#434C5E" ul + file-added-label = [+] + file-copied-label = [==] + file-modified-label = [*] + file-removed-label = [-] + file-renamed-label = [->] + hunk-header-style = omit + line-numbers-left-format = " {nm:>3} │" + line-numbers-left-style = red + line-numbers-right-format = " {np:>3} │" + line-numbers-right-style = green + line-numbers-minus-style = red italic black + line-numbers-plus-style = green italic black + line-numbers-zero-style = "#434C5E" italic + minus-style = bold red + minus-emph-style = bold "#202020" "#FF5555" + minus-non-emph-style = bold + plus-style = bold green + plus-emph-style = bold "#202020" "#50FA7B" + plus-non-emph-style = bold + zero-style = syntax + blame-code-style = syntax + blame-format = "{author:<18} ({commit:>9}) {timestamp:^16}" + blame-palette = "#2E3440" "#3B4252" "#434C5E" "#4C566A" + merge-conflict-begin-symbol = ~ + merge-conflict-end-symbol = ~ + merge-conflict-ours-diff-header-style = "#F1FA8C" bold + merge-conflict-ours-diff-header-decoration-style = "#434C5E" box + merge-conflict-theirs-diff-header-style = "#F1FA8C" bold + merge-conflict-theirs-diff-header-decoration-style = "#434C5E" box + +[delta "gruvmax-fang"] + # author: https://github.com/maxfangx + # General appearance + dark = true + syntax-theme = gruvbox-dark + # File + file-style = "#FFFFFF" bold + file-added-label = [+] + file-copied-label = [==] + file-modified-label = [*] + file-removed-label = [-] + file-renamed-label = [->] + file-decoration-style = "#434C5E" ul + file-decoration-style = "#84786A" ul + # No hunk headers + hunk-header-style = omit + # Line numbers + line-numbers = true + line-numbers-left-style = "#84786A" + line-numbers-right-style = "#84786A" + line-numbers-minus-style = "#A02A11" + line-numbers-plus-style = "#479B36" + line-numbers-zero-style = "#84786A" + line-numbers-left-format = " {nm:>3} │" + line-numbers-right-format = " {np:>3} │" + # Diff contents + inline-hint-style = syntax + minus-style = syntax "#330011" + minus-emph-style = syntax "#80002a" + minus-non-emph-style = syntax auto + plus-style = syntax "#001a00" + plus-emph-style = syntax "#003300" + plus-non-emph-style = syntax auto + whitespace-error-style = "#FB4934" reverse + # Commit hash + commit-decoration-style = normal box + commit-style = "#ffffff" bold + # Blame + blame-code-style = syntax + blame-format = "{author:>18} ({commit:>8}) {timestamp:<13} " + blame-palette = "#000000" "#1d2021" "#282828" "#3c3836" + # Merge conflicts + merge-conflict-begin-symbol = ⌃ + merge-conflict-end-symbol = ⌄ + merge-conflict-ours-diff-header-style = "#FABD2F" bold + merge-conflict-theirs-diff-header-style = "#FABD2F" bold overline + merge-conflict-ours-diff-header-decoration-style = '' + merge-conflict-theirs-diff-header-decoration-style = '' + +[delta "discord"] + commit-style = omit + file-style = 34 ul + file-decoration-style = none + hunk-header-style = omit + minus-style = 31 + minus-non-emph-style = 31 + minus-emph-style = 40 + minus-empty-line-marker-style = 31 + zero-style = 30 + plus-style = 32 + plus-non-emph-style = 32 + plus-emph-style = 40 + grep-file-style = 34 + grep-line-number-style = 34 + whitespace-error-style = 41 + blame-code-style = omit + true-color = never + file-modified-label = changed: + right-arrow = > + hyperlinks = false + keep-plus-minus-markers = true + diff-stat-align-width = 10 + syntax-theme = none + width = variable + +[delta "mellow-barbet"] + # author: https://github.com/kvrohit + # To configure terminal colors see https://github.com/kvrohit/mellow.nvim#terminals + dark = true + syntax-theme = base16 + line-numbers = true + side-by-side = true + file-style = brightwhite + file-decoration-style = none + file-added-label = [+] + file-copied-label = [==] + file-modified-label = [*] + file-removed-label = [-] + file-renamed-label = [->] + hunk-header-decoration-style = "#3e3e43" box ul + plus-style = brightgreen black + plus-emph-style = black green + minus-style = brightred black + minus-emph-style = black red + line-numbers-minus-style = brightred + line-numbers-plus-style = brightgreen + line-numbers-left-style = "#3e3e43" + line-numbers-right-style = "#3e3e43" + line-numbers-zero-style = "#57575f" + zero-style = syntax + whitespace-error-style = black bold + blame-code-style = syntax + blame-palette = "#161617" "#1b1b1d" "#2a2a2d" "#3e3e43" + merge-conflict-begin-symbol = ~ + merge-conflict-end-symbol = ~ + merge-conflict-ours-diff-header-style = yellow bold + merge-conflict-ours-diff-header-decoration-style = "#3e3e43" box + merge-conflict-theirs-diff-header-style = yellow bold + merge-conflict-theirs-diff-header-decoration-style = "#3e3e43" box + +[delta "arctic-fox"] + # author: https://github.com/anthony-halim + dark = true + syntax-theme = Nord + file-added-label = [+] + file-copied-label = [==] + file-modified-label = [*] + file-removed-label = [-] + file-renamed-label = [->] + file-style = omit + hunk-header-decoration-style = "#5E81AC" ul + hunk-header-file-style = blue ul bold + hunk-header-line-number-style = yellow box bold + hunk-header-style = file line-number syntax bold italic + plus-style = brightgreen + plus-emph-style = black green + minus-style = brightred + minus-emph-style = black red + line-numbers = true + line-numbers-minus-style = brightred + line-numbers-plus-style = brightgreen + line-numbers-left-style = "#5E81AC" + line-numbers-right-style = "#5E81AC" + line-numbers-zero-style = "#4C566A" + zero-style = syntax + whitespace-error-style = black bold + blame-code-style = syntax + blame-format = "{author:<18} {commit:<6} {timestamp:<15}" + blame-palette = "#2E3440" "#3B4252" "#434C5E" + merge-conflict-begin-symbol = ~ + merge-conflict-end-symbol = ~ + merge-conflict-ours-diff-header-style = yellow bold + merge-conflict-ours-diff-header-decoration-style = "#5E81AC" box + merge-conflict-theirs-diff-header-style = yellow bold + merge-conflict-theirs-diff-header-decoration-style = "#5E81AC" box diff --git a/dot_config/git/config.local.tmpl b/dot_config/git/config.local.tmpl new file mode 100644 index 0000000..236f9eb --- /dev/null +++ b/dot_config/git/config.local.tmpl @@ -0,0 +1,6 @@ +# vim:set ft=gitconfig : + +[user] + name = punkfairie + email = 23287005+punkfairie@users.noreply.github.com + signingkey = {{ .gpgKey }} diff --git a/dot_config/git/dot_gitattributes b/dot_config/git/dot_gitattributes new file mode 100644 index 0000000..25ba6ef --- /dev/null +++ b/dot_config/git/dot_gitattributes @@ -0,0 +1,10 @@ +# Automatically normalize line endings. +# https://git-scm.com/docs/gitattributes +# https://docs.github.com/en/get-started/getting-started-with-git/configuring-git-to-handle-line-endings + +* text=auto + +*.png binary +*.jpg binary +*.jpeg binary +*.bmp binary diff --git a/dot_config/git/gitmojis b/dot_config/git/gitmojis new file mode 100644 index 0000000..c093c3a --- /dev/null +++ b/dot_config/git/gitmojis @@ -0,0 +1 @@ +{"gitmojis":[{"emoji":"🎨","entity":"🎨","code":":art:","description":"Improve structure / format of the code.","name":"art","semver":null},{"emoji":"⚡️","entity":"⚡","code":":zap:","description":"Improve performance.","name":"zap","semver":"patch"},{"emoji":"🔥","entity":"🔥","code":":fire:","description":"Remove code or files.","name":"fire","semver":null},{"emoji":"🐛","entity":"🐛","code":":bug:","description":"Fix a bug.","name":"bug","semver":"patch"},{"emoji":"🚑️","entity":"🚑","code":":ambulance:","description":"Critical hotfix.","name":"ambulance","semver":"patch"},{"emoji":"✨","entity":"✨","code":":sparkles:","description":"Introduce new features.","name":"sparkles","semver":"minor"},{"emoji":"📝","entity":"📝","code":":memo:","description":"Add or update documentation.","name":"memo","semver":null},{"emoji":"🚀","entity":"🚀","code":":rocket:","description":"Deploy stuff.","name":"rocket","semver":null},{"emoji":"💄","entity":"&#ff99cc;","code":":lipstick:","description":"Add or update the UI and style files.","name":"lipstick","semver":"patch"},{"emoji":"🎉","entity":"🎉","code":":tada:","description":"Begin a project.","name":"tada","semver":null},{"emoji":"✅","entity":"✅","code":":white_check_mark:","description":"Add, update, or pass tests.","name":"white-check-mark","semver":null},{"emoji":"🔒️","entity":"🔒","code":":lock:","description":"Fix security or privacy issues.","name":"lock","semver":"patch"},{"emoji":"🔐","entity":"🔐","code":":closed_lock_with_key:","description":"Add or update secrets.","name":"closed-lock-with-key","semver":null},{"emoji":"🔖","entity":"🔖","code":":bookmark:","description":"Release / Version tags.","name":"bookmark","semver":null},{"emoji":"🚨","entity":"🚨","code":":rotating_light:","description":"Fix compiler / linter warnings.","name":"rotating-light","semver":null},{"emoji":"🚧","entity":"🚧","code":":construction:","description":"Work in progress.","name":"construction","semver":null},{"emoji":"💚","entity":"💚","code":":green_heart:","description":"Fix CI Build.","name":"green-heart","semver":null},{"emoji":"⬇️","entity":"⬇️","code":":arrow_down:","description":"Downgrade dependencies.","name":"arrow-down","semver":"patch"},{"emoji":"⬆️","entity":"⬆️","code":":arrow_up:","description":"Upgrade dependencies.","name":"arrow-up","semver":"patch"},{"emoji":"📌","entity":"📌","code":":pushpin:","description":"Pin dependencies to specific versions.","name":"pushpin","semver":"patch"},{"emoji":"👷","entity":"👷","code":":construction_worker:","description":"Add or update CI build system.","name":"construction-worker","semver":null},{"emoji":"📈","entity":"📈","code":":chart_with_upwards_trend:","description":"Add or update analytics or track code.","name":"chart-with-upwards-trend","semver":"patch"},{"emoji":"♻️","entity":"♻","code":":recycle:","description":"Refactor code.","name":"recycle","semver":null},{"emoji":"➕","entity":"➕","code":":heavy_plus_sign:","description":"Add a dependency.","name":"heavy-plus-sign","semver":"patch"},{"emoji":"➖","entity":"➖","code":":heavy_minus_sign:","description":"Remove a dependency.","name":"heavy-minus-sign","semver":"patch"},{"emoji":"🔧","entity":"🔧","code":":wrench:","description":"Add or update configuration files.","name":"wrench","semver":"patch"},{"emoji":"🔨","entity":"🔨","code":":hammer:","description":"Add or update development scripts.","name":"hammer","semver":null},{"emoji":"🌐","entity":"🌐","code":":globe_with_meridians:","description":"Internationalization and localization.","name":"globe-with-meridians","semver":"patch"},{"emoji":"✏️","entity":"","code":":pencil2:","description":"Fix typos.","name":"pencil2","semver":"patch"},{"emoji":"💩","entity":"","code":":poop:","description":"Write bad code that needs to be improved.","name":"poop","semver":null},{"emoji":"⏪️","entity":"⏪","code":":rewind:","description":"Revert changes.","name":"rewind","semver":"patch"},{"emoji":"🔀","entity":"🔀","code":":twisted_rightwards_arrows:","description":"Merge branches.","name":"twisted-rightwards-arrows","semver":null},{"emoji":"📦️","entity":"F4E6;","code":":package:","description":"Add or update compiled files or packages.","name":"package","semver":"patch"},{"emoji":"👽️","entity":"F47D;","code":":alien:","description":"Update code due to external API changes.","name":"alien","semver":"patch"},{"emoji":"🚚","entity":"F69A;","code":":truck:","description":"Move or rename resources (e.g.: files, paths, routes).","name":"truck","semver":null},{"emoji":"📄","entity":"F4C4;","code":":page_facing_up:","description":"Add or update license.","name":"page-facing-up","semver":null},{"emoji":"💥","entity":"💥","code":":boom:","description":"Introduce breaking changes.","name":"boom","semver":"major"},{"emoji":"🍱","entity":"F371","code":":bento:","description":"Add or update assets.","name":"bento","semver":"patch"},{"emoji":"♿️","entity":"♿","code":":wheelchair:","description":"Improve accessibility.","name":"wheelchair","semver":"patch"},{"emoji":"💡","entity":"💡","code":":bulb:","description":"Add or update comments in source code.","name":"bulb","semver":null},{"emoji":"🍻","entity":"🍻","code":":beers:","description":"Write code drunkenly.","name":"beers","semver":null},{"emoji":"💬","entity":"💬","code":":speech_balloon:","description":"Add or update text and literals.","name":"speech-balloon","semver":"patch"},{"emoji":"🗃️","entity":"🗃","code":":card_file_box:","description":"Perform database related changes.","name":"card-file-box","semver":"patch"},{"emoji":"🔊","entity":"🔊","code":":loud_sound:","description":"Add or update logs.","name":"loud-sound","semver":null},{"emoji":"🔇","entity":"🔇","code":":mute:","description":"Remove logs.","name":"mute","semver":null},{"emoji":"👥","entity":"👥","code":":busts_in_silhouette:","description":"Add or update contributor(s).","name":"busts-in-silhouette","semver":null},{"emoji":"🚸","entity":"🚸","code":":children_crossing:","description":"Improve user experience / usability.","name":"children-crossing","semver":"patch"},{"emoji":"🏗️","entity":"f3d7;","code":":building_construction:","description":"Make architectural changes.","name":"building-construction","semver":null},{"emoji":"📱","entity":"📱","code":":iphone:","description":"Work on responsive design.","name":"iphone","semver":"patch"},{"emoji":"🤡","entity":"🤡","code":":clown_face:","description":"Mock things.","name":"clown-face","semver":null},{"emoji":"🥚","entity":"🥚","code":":egg:","description":"Add or update an easter egg.","name":"egg","semver":"patch"},{"emoji":"🙈","entity":"bdfe7;","code":":see_no_evil:","description":"Add or update a .gitignore file.","name":"see-no-evil","semver":null},{"emoji":"📸","entity":"📸","code":":camera_flash:","description":"Add or update snapshots.","name":"camera-flash","semver":null},{"emoji":"⚗️","entity":"⚗","code":":alembic:","description":"Perform experiments.","name":"alembic","semver":"patch"},{"emoji":"🔍️","entity":"🔍","code":":mag:","description":"Improve SEO.","name":"mag","semver":"patch"},{"emoji":"🏷️","entity":"🏷","code":":label:","description":"Add or update types.","name":"label","semver":"patch"},{"emoji":"🌱","entity":"🌱","code":":seedling:","description":"Add or update seed files.","name":"seedling","semver":null},{"emoji":"🚩","entity":"🚩","code":":triangular_flag_on_post:","description":"Add, update, or remove feature flags.","name":"triangular-flag-on-post","semver":"patch"},{"emoji":"🥅","entity":"🥅","code":":goal_net:","description":"Catch errors.","name":"goal-net","semver":"patch"},{"emoji":"💫","entity":"💫","code":":dizzy:","description":"Add or update animations and transitions.","name":"dizzy","semver":"patch"},{"emoji":"🗑️","entity":"🗑","code":":wastebasket:","description":"Deprecate code that needs to be cleaned up.","name":"wastebasket","semver":"patch"},{"emoji":"🛂","entity":"🛂","code":":passport_control:","description":"Work on code related to authorization, roles and permissions.","name":"passport-control","semver":"patch"},{"emoji":"🩹","entity":"🩹","code":":adhesive_bandage:","description":"Simple fix for a non-critical issue.","name":"adhesive-bandage","semver":"patch"},{"emoji":"🧐","entity":"🧐","code":":monocle_face:","description":"Data exploration/inspection.","name":"monocle-face","semver":null},{"emoji":"⚰️","entity":"⚰","code":":coffin:","description":"Remove dead code.","name":"coffin","semver":null},{"emoji":"🧪","entity":"🧪","code":":test_tube:","description":"Add a failing test.","name":"test-tube","semver":null},{"emoji":"👔","entity":"👔","code":":necktie:","description":"Add or update business logic.","name":"necktie","semver":"patch"},{"emoji":"🩺","entity":"🩺","code":":stethoscope:","description":"Add or update healthcheck.","name":"stethoscope","semver":null},{"emoji":"🧱","entity":"🧱","code":":bricks:","description":"Infrastructure related changes.","name":"bricks","semver":null},{"emoji":"🧑‍💻","entity":"🧑‍💻","code":":technologist:","description":"Improve developer experience.","name":"technologist","semver":null},{"emoji":"💸","entity":"💸","code":":money_with_wings:","description":"Add sponsorships or money related infrastructure.","name":"money-with-wings","semver":null},{"emoji":"🧵","entity":"🧵","code":":thread:","description":"Add or update code related to multithreading or concurrency.","name":"thread","semver":null},{"emoji":"🦺","entity":"🦺","code":":safety_vest:","description":"Add or update code related to validation.","name":"safety-vest","semver":null}]} \ No newline at end of file diff --git a/dot_config/git/hooks/executable_prepare-commit-msg b/dot_config/git/hooks/executable_prepare-commit-msg new file mode 100644 index 0000000..7d3ef9a --- /dev/null +++ b/dot_config/git/hooks/executable_prepare-commit-msg @@ -0,0 +1,137 @@ +#!/usr/bin/env fish + +set -l msg_file $argv[1] +set -l commit_type $(string trim $argv[2]) +set -l commit_sha $(string trim $argv[3]) + +# Rebasing || cherry-picking. +if test "$commit_type" = messageg || test "$commit_type" = message + exit 0 +end + +if test -n "$commit_sha" + gum confirm "Create a new commit message?" || exit 0 +end + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +set -l gitmojis $(curl -s https://gitmoji.dev/api/gitmojis | jello -rl '\ +result = [] +for entry in _.gitmojis: + item = entry.emoji + " - " + entry.description + + if entry.semver is not None: + item += " \033[91;3m(" + entry.semver + ")\033[0m" + + result.append(item) + +result +') + +set -l types \ + "build: Changes that affect the build system or external dependencies" \ + "ci: Changes to the CI configuration files and scripts" \ + "docs: Documentation only changes" \ + "feat: A new feature" \ + "fix: A bug fix" \ + "perf: A code change that improves performance" \ + "refactor: A code change that neither fixes a bug nor adds a feature" \ + "style: Changes that do not affect the meaning of the code" \ + "test: Adding missing tests or correcting existing tests" \ + "chore: Update dependencies; bump version numbers; etc" + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# HAS to be global so the function has access to it. +set -g gitmoji "$(gum filter --height=10 $gitmojis)" + +# Abort if no emoji was selected +if ! test -n "$gitmoji" + exit 1 +end + +set -l emoji $(string sub --length 1 $gitmoji) + +function breaking + string match -rq '\(major\)' "$gitmoji" +end + +# function minor +# string match -rq '\(minor\)' "$gitmoji" +# end +# +# function patch +# string match -r '\(patch\)' "$gitmoji" +# end + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +set -l type $(gum filter --height=10 $types) +set type $(string match --regex '^[a-z]+' $type) + +set -l scope $(gum input --placeholder "scope") + +test -n "$scope" && set scope "($scope)" + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +set -l summary "$type$scope: " +breaking && set summary "$type$scope!: " +set summary $(gum input --value "$summary" --placeholder "Summary of this change") + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +set -l footer "" +breaking && set footer $(gum input --value "BREAKING CHANGE: " --placeholder "The breaking change being introduced") + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# if breaking && test "$(git_current_branch)" = "$(git_main_branch)" +# set -l msg "You are commiting a breaking change on to the main branch. Continue commit?\n(Selecting no will save your commit message to the clipboard)" +# +# gum confirm $msg || begin +# copyq copy "$emoji $summary\n$description$footer" +# exit +# end +# end + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +set -l msg "$(cat $msg_file)" + +set -l new_msg "$emoji $summary\n\n" + +if test ! -z "$footer" + set new_msg "$new_msg$footer\n\n" +end + +set new_msg "$new_msg$msg" + +echo -e "$new_msg" >"$msg_file" + +# function tag +# if breaking || minor || patch +# if test "$(git_current_branch)" = "$(git_main_branch)" +# gum confirm "Bump version number and tag commit?" || return +# +# set -f last $(git describe --tags --abbrev=0 || 'v0.0.0') +# set last $(string replace v '' $last | string split .) +# +# set -f i 0 +# if breaking +# set i 1 +# else if minor +# set i 2 +# else if patch +# set i 3 +# end +# +# if test $i -gt 0 +# set last[$i] $(math $last[$i] + 1) +# end +# +# set -f new "$last[1].$last[2].$last[3]" +# git tag -a "v$new" -m "Version $new" +# end +# end +# end diff --git a/dot_config/glow/glow.yml b/dot_config/glow/glow.yml new file mode 100644 index 0000000..fc4e804 --- /dev/null +++ b/dot_config/glow/glow.yml @@ -0,0 +1,10 @@ +# style name or JSON path (default "auto") +style: "~/.config/glow/macchiato.json" +# show local files only; no network (TUI-mode only) +local: false +# mouse support (TUI-mode only) +mouse: false +# use pager to display markdown +pager: true +# word-wrap at width +width: 80 diff --git a/dot_config/gtk-3.0/bookmarks b/dot_config/gtk-3.0/bookmarks new file mode 100644 index 0000000..85b462c --- /dev/null +++ b/dot_config/gtk-3.0/bookmarks @@ -0,0 +1 @@ +file:///home/marley/data diff --git a/dot_config/gtk-3.0/settings.ini b/dot_config/gtk-3.0/settings.ini new file mode 100644 index 0000000..79cd81c --- /dev/null +++ b/dot_config/gtk-3.0/settings.ini @@ -0,0 +1,4 @@ +[Settings] +gtk-cursor-theme-name = Catppuccin-Macchiato-Pink-Cursors +gtk-theme-name = Catppuccin-Macchiato-Standard-Pink-Dark +gtk-icon-theme-name = Papirus diff --git a/dot_config/gtk-4.0/symlink_assets b/dot_config/gtk-4.0/symlink_assets new file mode 100644 index 0000000..0ee6310 --- /dev/null +++ b/dot_config/gtk-4.0/symlink_assets @@ -0,0 +1 @@ +/usr/share/themes/Catppuccin-Macchiato-Standard-Pink-Dark/gtk-4.0/assets diff --git a/dot_config/gtk-4.0/symlink_gtk-dark.css b/dot_config/gtk-4.0/symlink_gtk-dark.css new file mode 100644 index 0000000..b533e53 --- /dev/null +++ b/dot_config/gtk-4.0/symlink_gtk-dark.css @@ -0,0 +1 @@ +/usr/share/themes/Catppuccin-Macchiato-Standard-Pink-Dark/gtk-4.0/gtk-dark.css diff --git a/dot_config/gtk-4.0/symlink_gtk.css b/dot_config/gtk-4.0/symlink_gtk.css new file mode 100644 index 0000000..7666b4d --- /dev/null +++ b/dot_config/gtk-4.0/symlink_gtk.css @@ -0,0 +1 @@ +/usr/share/themes/Catppuccin-Macchiato-Standard-Pink-Dark/gtk-4.0/gtk.css diff --git a/dot_config/hyfetch.json b/dot_config/hyfetch.json new file mode 100644 index 0000000..43e2ccf --- /dev/null +++ b/dot_config/hyfetch.json @@ -0,0 +1,16 @@ +{ + "preset": "lesbian", + "mode": "rgb", + "light_dark": "dark", + "lightness": 0.7, + "color_align": { + "mode": "horizontal", + "custom_colors": [], + "fore_back": null + }, + "backend": "neofetch", + "args": null, + "distro": null, + "pride_month_shown": [], + "pride_month_disable": false +} \ No newline at end of file diff --git a/dot_config/lazygit/config.yml b/dot_config/lazygit/config.yml new file mode 100644 index 0000000..e9d693f --- /dev/null +++ b/dot_config/lazygit/config.yml @@ -0,0 +1,10 @@ +--- +gui: + nerdFontsVersion: "3" +git: + paging: + colorArg: always + pager: delta --paging=never --features=arctic-fox +os: + copyToClipboardCmd: "copyq copy {{text}}" + editPreset: nvim-remote diff --git a/dot_config/mopidy/mopidy.conf b/dot_config/mopidy/mopidy.conf new file mode 100644 index 0000000..e30faf1 --- /dev/null +++ b/dot_config/mopidy/mopidy.conf @@ -0,0 +1,168 @@ +# For further information about options in this file see: +# https://docs.mopidy.com/ +# +# The initial commented out values reflect the defaults as of: +# Mopidy 3.4.1 +# Mopidy-ALSAMixer 2.0.1 +# Mopidy-File 3.4.1 +# Mopidy-HTTP 3.4.1 +# Mopidy-Local 3.2.1 +# Mopidy-M3U 3.4.1 +# Mopidy-MPD 3.3.0 +# Mopidy-MPRIS 3.0.3 +# Mopidy-Podcast 3.0.1 +# Mopidy-SoftwareMixer 3.4.1 +# Mopidy-Stream 3.4.1 +# +# Available options and defaults might have changed since then, +# run `mopidy config` to see the current effective config and +# `mopidy --version` to check the current version. + +[core] +#cache_dir = $XDG_CACHE_DIR/mopidy +#config_dir = $XDG_CONFIG_DIR/mopidy +#data_dir = $XDG_DATA_DIR/mopidy +#max_tracklist_length = 10000 +#restore_state = false + +[logging] +#verbosity = 0 +#format = %(levelname)-8s %(asctime)s [%(process)d:%(threadName)s] %(name)s\n %(message)s +#color = true +#config_file = + +[audio] +#mixer = software +#mixer_volume = +output = tee name=t ! queue ! autoaudiosink t. ! queue ! audio/x-raw,rate=44100,channels=2,format=S16LE ! udpsink host=localhost port=5555 +#buffer_time = + +[proxy] +#scheme = +#hostname = +#port = +#username = +#password = + +[file] +enabled = false +media_dirs = + /mnt/babeshare/babez/Music|Babeshare +# $XDG_MUSIC_DIR|Music +# ~/|Home +#excluded_file_extensions = +# .directory +# .html +# .jpeg +# .jpg +# .log +# .nfo +# .pdf +# .png +# .txt +# .zip +#show_dotfiles = false +#follow_symlinks = false +#metadata_timeout = 1000 + +[http] +#enabled = true +#hostname = 127.0.0.1 +#port = 6680 +#zeroconf = Mopidy HTTP server on $hostname +#allowed_origins = +#csrf_protection = true +#default_app = mopidy + +[m3u] +#enabled = true +#base_dir = +#default_encoding = latin-1 +#default_extension = .m3u8 +#playlists_dir = + +[softwaremixer] +#enabled = true + +[stream] +enabled = false +#protocols = +# http +# https +# mms +# rtmp +# rtmps +# rtsp +#metadata_blacklist = +#timeout = 5000 + +[alsamixer] +#enabled = true +#card = 0 +#control = Master +#min_volume = 0 +#max_volume = 100 +#volume_scale = cubic + +[local] +#enabled = true +#max_search_results = 100 +media_dir = /mnt/babeshare/babez/Music/ +#scan_timeout = 1000 +#scan_flush_threshold = 100 +#scan_follow_symlinks = false +#included_file_extensions = +#excluded_file_extensions = +# .cue +# .directory +# .html +# .jpeg +# .jpg +# .log +# .nfo +# .pdf +# .png +# .txt +# .zip +#directories = +# Albums local:directory?type=album +# Artists local:directory?type=artist +# Composers local:directory?type=artist&role=composer +# Genres local:directory?type=genre +# Performers local:directory?type=artist&role=performer +# Release Years local:directory?type=date&format=%25Y +# Tracks local:directory?type=track +# Last Week's Updates local:directory?max-age=604800 +# Last Month's Updates local:directory?max-age=2592000 +#timeout = 10 +#use_artist_sortname = false +#album_art_files = +# *.jpg +# *.jpeg +# *.png + +[mpd] +#enabled = true +hostname = 127.0.0.1 +#port = 6600 +#password = +#max_connections = 20 +#connection_timeout = 60 +#zeroconf = Mopidy MPD server on $hostname +#command_blacklist = +# listall +# listallinfo +#default_playlist_scheme = m3u + +[mpris] +#enabled = true +#bus_type = session + +[podcast] +enabled = false +#browse_root = Podcasts.opml +#browse_order = desc +#lookup_order = asc +#cache_size = 64 +#cache_ttl = 86400 +#timeout = 10 diff --git a/dot_config/ncmpcpp/config b/dot_config/ncmpcpp/config new file mode 100644 index 0000000..345fc55 --- /dev/null +++ b/dot_config/ncmpcpp/config @@ -0,0 +1,598 @@ +############################################################## +## This is an example configuration file. Copy it to ## +## $XDG_CONFIG_HOME/ncmpcpp/config or $HOME/.ncmpcpp/config ## +## and set up your preferences. ## +############################################################## +# +##### directories ###### +## +## Directory for storing ncmpcpp related files. Changing it is useful if you +## want to store everything somewhere else and provide command line setting for +## alternative location to config file which defines that while launching +## ncmpcpp. +## +# +#ncmpcpp_directory = ~/.config/ncmpcpp +# +## +## Directory for storing downloaded lyrics. It defaults to ~/.lyrics since other +## MPD clients (eg. ncmpc) also use that location. +## +# +#lyrics_directory = ~/.lyrics +# +##### connection settings ##### +# +#mpd_host = localhost +# +#mpd_port = 6600 +# +#mpd_connection_timeout = 5 +# +## Needed for tag editor and file operations to work. +## +mpd_music_dir = /mnt/babeshare/babez/Music/ +# +#mpd_crossfade_time = 5 +# +# Exclude pattern for random song action +# http://www.boost.org/doc/libs/1_46_1/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html +#random_exclude_pattern = "^(temp|midi_songs).*" +# +##### music visualizer ##### +## +## In order to make music visualizer work with MPD you need to use the fifo +## output. Its format parameter has to be set to 44100:16:1 for mono +## visualization or 44100:16:2 for stereo visualization. As an example here is +## the relevant section for mpd.conf: +## +## audio_output { +## type "fifo" +## name "Visualizer feed" +## path "/tmp/mpd.fifo" +## format "44100:16:2" +## } +## +## If the visualization on occasion diverges from the audio output, please set +## 'buffer_time' parameter of your audio output in mpd.conf to '100000' (100ms) +## or less to prevent that from happening. +## +## Note: If you're using Mopidy, an address of a udpsink gstreamer's output is +## also accepted. For example, the following section in mopidy.conf: +## +## [audio] +## output = tee name=t ! queue ! autoaudiosink t. +## ! queue ! audio/x-raw,rate=44100,channels=2,format=S16LE +## ! udpsink host=localhost port=5555 +## +## will make localhost:5555 available as a source of data for the stereo +## visualizer. +## +# +visualizer_data_source = "localhost:5555" +# +## +## Note: Below parameter is needed for ncmpcpp to determine which output +## provides data for visualizer and reset it at the beginning of visualization +## to synchronize with audio. +## +# +# visualizer_output_name = Visualizer feed +# +## +## If you set format to 44100:16:2, make it 'yes'. +## +# visualizer_in_stereo = yes +# +## +## Note: set below to >=10 only if you have synchronization issues with +## visualization and audio. +## +# +#visualizer_sync_interval = 0 +# +## +## Note: To enable spectrum frequency visualization you need to compile ncmpcpp +## with fftw3 support. +## +# +## Available values: spectrum, wave, wave_filled, ellipse. +## +# visualizer_type = spectrum +# +#visualizer_fps = 60 +# +#visualizer_autoscale = no +# +# visualizer_look = ●▮ +# +#visualizer_color = blue, cyan, green, yellow, magenta, red +# +## Alternative subset of 256 colors for terminals that support it. +## +# visualizer_color = 47, 83, 119, 155, 191, 227, 221, 215, 209, 203, 197, 161 +# +## +## Note: The next few visualization options apply to the spectrum visualizer. +## +# +## Use unicode block characters for a smoother, more continuous look. +## This will override the visualizer_look option. With transparent terminals +## and visualizer_in_stereo set, artifacts may be visible on the bottom half of +## the visualization. +# +#visualizer_spectrum_smooth_look = yes +# +## A value between 1 and 5 inclusive. Specifying a larger value makes the +## visualizer look at a larger slice of time, which results in less jumpy +## visualizer output. +# +#visualizer_spectrum_dft_size = 2 +# +#visualizer_spectrum_gain = 10 +# +## Left-most frequency of visualizer in Hz, must be less than HZ MAX +# +#visualizer_spectrum_hz_min = 20 +# +## Right-most frequency of visualizer in Hz, must be greater than HZ MIN +# +#visualizer_spectrum_hz_max = 20000 +# +##### system encoding ##### +## +## ncmpcpp should detect your charset encoding but if it failed to do so, you +## can specify charset encoding you are using here. +## +## Note: You can see whether your ncmpcpp build supports charset detection by +## checking output of `ncmpcpp --version`. +## +## Note: Since MPD uses UTF-8 by default, setting this option makes sense only +## if your encoding is different. +## +# +#system_encoding = "" +# +##### delays ##### +# +## Time of inactivity (in seconds) after playlist highlighting will be disabled +## (0 = always on). +## +#playlist_disable_highlight_delay = 5 +# +## Defines how long messages are supposed to be visible. +## +#message_delay_time = 5 +# +##### song format ##### +## +## For a song format you can use: +## +## %l - length +## %f - filename +## %D - directory +## %a - artist +## %A - album artist +## %t - title +## %b - album +## %y - date +## %n - track number (01/12 -> 01) +## %N - full track info (01/12 -> 01/12) +## %g - genre +## %c - composer +## %p - performer +## %d - disc +## %C - comment +## %P - priority +## $R - begin right alignment +## +## If you want to make sure that a part of the format is displayed only when +## certain tags are present, you can archieve it by grouping them with brackets, +## e.g. '{%a - %t}' will be evaluated to 'ARTIST - TITLE' if both tags are +## present or '' otherwise. It is also possible to define a list of +## alternatives by providing several groups and separating them with '|', +## e.g. '{%t}|{%f}' will be evaluated to 'TITLE' or 'FILENAME' if the former is +## not present. +## +## Note: If you want to set limit on maximal length of a tag, just put the +## appropriate number between % and character that defines tag type, e.g. to +## make album take max. 20 terminal cells, use '%20b'. +## +## In addition, formats support markers used for text attributes. They are +## followed by character '$'. After that you can put: +## +## - 0 - default window color (discards all other colors) +## - 1 - black +## - 2 - red +## - 3 - green +## - 4 - yellow +## - 5 - blue +## - 6 - magenta +## - 7 - cyan +## - 8 - white +## - 9 - end of current color +## - b - bold text +## - u - underline text +## - r - reverse colors +## - a - use alternative character set +## +## If you don't want to use a non-color attribute anymore, just put it again, +## but this time insert character '/' between '$' and attribute character, +## e.g. {$b%t$/b}|{$r%f$/r} will display bolded title tag or filename with +## reversed colors. +## +## If you want to use 256 colors and/or background colors in formats (the naming +## scheme is described below in section about color definitions), it can be done +## with the syntax $(COLOR), e.g. to set the artist tag to one of the +## non-standard colors and make it have yellow background, you need to write +## $(197_yellow)%a$(end). Note that for standard colors this is interchangable +## with attributes listed above. +## +## Note: colors can be nested. +## +# +#song_list_format = {%a - }{%t}|{$8%f$9}$R{$3%l$9} +# +#song_status_format = {{%a{ "%b"{ (%y)}} - }{%t}}|{%f} +# +#song_library_format = {%n - }{%t}|{%f} +# +#alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b +# +#alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D} +# +#current_item_prefix = $(yellow)$r +# +#current_item_suffix = $/r$(end) +# +#current_item_inactive_column_prefix = $(white)$r +# +#current_item_inactive_column_suffix = $/r$(end) +# +#now_playing_prefix = $b +# +#now_playing_suffix = $/b +# +#browser_playlist_prefix = "$2playlist$9 " +# +#selected_item_prefix = $6 +# +#selected_item_suffix = $9 +# +#modified_item_prefix = $3> $9 +# +## +## Note: attributes are not supported for the following variables. +## +#song_window_title_format = {%a - }{%t}|{%f} +## +## Note: Below variables are used for sorting songs in browser. The sort mode +## determines how songs are sorted, and can be used in combination with a sort +## format to specify a custom sorting format. Available values for +## browser_sort_mode are "type", "name", "mtime", "format" and "none". +## +# +#browser_sort_mode = type +# +#browser_sort_format = {%a - }{%t}|{%f} {%l} +# +##### columns settings ##### +## +## syntax of song columns list format is "column column etc." +## +## - syntax for each column is: +## +## (width of the column)[color of the column]{displayed tag} +## +## Note: Width is by default in %, if you want a column to have fixed size, add +## 'f' after the value, e.g. (10)[white]{a} will be the column that take 10% of +## screen (so the real width will depend on actual screen size), whereas +## (10f)[white]{a} will take 10 terminal cells, no matter how wide the screen +## is. +## +## - color is optional (if you want the default one, leave the field empty). +## +## Note: You can give a column additional attributes by putting appropriate +## character after displayed tag character. Available attributes are: +## +## - r - column will be right aligned +## - E - if tag is empty, empty tag marker won't be displayed +## +## You can also: +## +## - give a column custom name by putting it after attributes, separated with +## character ':', e.g. {lr:Length} gives you right aligned column of lengths +## named "Length". +## +## - define sequence of tags, that have to be displayed in case predecessor is +## empty in a way similar to the one in classic song format, i.e. using '|' +## character, e.g. {a|c|p:Owner} creates column named "Owner" that tries to +## display artist tag and then composer and performer if previous ones are not +## available. +## +# +#song_columns_list_format = (20)[]{a} (6f)[green]{NE} (50)[white]{t|f:Title} (20)[cyan]{b} (7f)[magenta]{l} +# +##### various settings ##### +# +## +## Note: Custom command that will be executed each time song changes. Useful for +## notifications etc. +## +#execute_on_song_change = "" +# +## +## Note: Custom command that will be executed each time player state +## changes. The environment variable MPD_PLAYER_STATE is set to the current +## state (either unknown, play, pause, or stop) for its duration. +## +# +#execute_on_player_state_change = "" +# +#playlist_show_mpd_host = no +# +#playlist_show_remaining_time = no +# +#playlist_shorten_total_times = no +# +#playlist_separate_albums = no +# +## +## Note: Possible display modes: classic, columns. +## +#playlist_display_mode = columns +# +#browser_display_mode = classic +# +#search_engine_display_mode = classic +# +#playlist_editor_display_mode = classic +# +#discard_colors_if_item_is_selected = yes +# +#show_duplicate_tags = yes +# +#incremental_seeking = yes +# +#seek_time = 1 +# +#volume_change_step = 2 +# +#autocenter_mode = no +# +#centered_cursor = no +# +## +## Note: You can specify third character which will be used to build 'empty' +## part of progressbar. +## +#progressbar_look = => +# +## Available values: database, playlist. +## +#default_place_to_search_in = database +# +## Available values: classic, alternative. +## +#user_interface = classic +# +#data_fetching_delay = yes +# +## Available values: artist, album_artist, date, genre, composer, performer. +## +#media_library_primary_tag = artist +# +#media_library_albums_split_by_date = yes +# +#media_library_hide_album_dates = no +# +## Available values: wrapped, normal. +## +#default_find_mode = wrapped +# +#default_tag_editor_pattern = %n - %t +# +#header_visibility = yes +# +#statusbar_visibility = yes +# +## Show the "Connected to ..." message on startup +#connected_message_on_startup = yes +# +#titles_visibility = yes +# +#header_text_scrolling = yes +# +#cyclic_scrolling = no +# +#lyrics_fetchers = azlyrics, genius, musixmatch, sing365, metrolyrics, justsomelyrics, jahlyrics, plyrics, tekstowo, zeneszoveg, internet +# +#follow_now_playing_lyrics = no +# +#fetch_lyrics_for_current_song_in_background = no +# +#store_lyrics_in_song_dir = no +# +#generate_win32_compatible_filenames = yes +# +#allow_for_physical_item_deletion = no +# +## +## Note: If you set this variable, ncmpcpp will try to get info from last.fm in +## language you set and if it fails, it will fall back to english. Otherwise it +## will use english the first time. +## +## Note: Language has to be expressed as an ISO 639 alpha-2 code. +## +#lastfm_preferred_language = en +# +#space_add_mode = add_remove +# +#show_hidden_files_in_local_browser = no +# +## +## How shall screen switcher work? +## +## - "previous" - switch between the current and previous screen. +## - "screen1,...,screenN" - switch between given sequence of screens. +## +## Screens available for use: help, playlist, browser, search_engine, +## media_library, playlist_editor, tag_editor, outputs, visualizer, clock, +## lyrics, last_fm. +## +#screen_switcher_mode = playlist, browser +# +## +## Note: You can define startup screen by choosing screen from the list above. +## +#startup_screen = playlist +# +## +## Note: You can define startup slave screen by choosing screen from the list +## above or an empty value for no slave screen. +## +#startup_slave_screen = "" +# +#startup_slave_screen_focus = no +# +## +## Default width of locked screen (in %). Acceptable values are from 20 to 80. +## +# +#locked_screen_width_part = 50 +# +#ask_for_locked_screen_width_part = yes +# +#jump_to_now_playing_song_at_start = yes +# +#ask_before_clearing_playlists = yes +# +#clock_display_seconds = no +# +#display_volume_level = yes +# +#display_bitrate = no +# +#display_remaining_time = no +# +## Available values: none, basic, extended, perl. +## +#regular_expressions = perl +# +## +## Note: if below is enabled, ncmpcpp will ignore leading "The" word while +## sorting items in browser, tags in media library, etc. +## +#ignore_leading_the = no +# +## +## Note: if below is enabled, ncmpcpp will ignore diacritics while searching and +## filtering lists. This takes an effect only if boost was compiled with ICU +## support. +## +#ignore_diacritics = no +# +#block_search_constraints_change_if_items_found = yes +# +#mouse_support = yes +# +#mouse_list_scroll_whole_page = no +# +#lines_scrolled = 5 +# +#empty_tag_marker = +# +#tags_separator = " | " +# +#tag_editor_extended_numeration = no +# +#media_library_sort_by_mtime = no +# +#enable_window_title = yes +# +## +## Note: You can choose default search mode for search engine. Available modes +## are: +## +## - 1 - use mpd built-in searching (no regexes, pattern matching) +## +## - 2 - use ncmpcpp searching (pattern matching with support for regexes, but +## if your mpd is on a remote machine, downloading big database to process +## it can take a while +## +## - 3 - match only exact values (this mode uses mpd function for searching in +## database and local one for searching in current playlist) +## +# +#search_engine_default_search_mode = 1 +# +#external_editor = nano +# +## Note: set to yes if external editor is a console application. +## +#use_console_editor = yes +# +##### colors definitions ##### +## +## It is possible to set a background color by setting a color value +## "_", e.g. red_black will set foregound color to red +## and background color to black. +## +## In addition, for terminals that support 256 colors it is possible to set one +## of them by using a number in range [1, 256] instead of color name, +## e.g. numerical value corresponding to red_black is 2_1. To find out if the +## terminal supports 256 colors, run ncmpcpp and check out the bottom of the +## help screen for list of available colors and their numerical values. +## +## What is more, there are two special values for the background color: +## "transparent" and "current". The first one explicitly sets the background to +## be transparent, while the second one allows you to preserve current +## background color and change only the foreground one. It's used implicitly +## when background color is not specified. +## +## Moreover, it is possible to attach format information to selected color +## variables by appending to their end a colon followed by one or more format +## flags, e.g. black:b or red:ur. The following variables support this syntax: +## visualizer_color, color1, color2, empty_tag_color, volume_color, +## state_line_color, state_flags_color, progressbar_color, +## progressbar_elapsed_color, player_state_color, statusbar_time_color, +## alternative_ui_separator_color. +## +## Note: due to technical limitations of older ncurses version, if 256 colors +## are used there is a possibility that you'll be able to use only colors with +## transparent background. +# +#colors_enabled = yes +# +#empty_tag_color = cyan +# +#header_window_color = default +# +#volume_color = default +# +#state_line_color = default +# +#state_flags_color = default:b +# +#main_window_color = yellow +# +#color1 = white +# +#color2 = green +# +#progressbar_color = black:b +# +#progressbar_elapsed_color = green:b +# +#statusbar_color = default +# +#statusbar_time_color = default:b +# +#player_state_color = default:b +# +#alternative_ui_separator_color = black:b +# +#window_border_color = green +# +#active_window_border = red +# diff --git a/dot_config/neofetch/config.conf b/dot_config/neofetch/config.conf new file mode 100644 index 0000000..498e349 --- /dev/null +++ b/dot_config/neofetch/config.conf @@ -0,0 +1,880 @@ +# vim:set ft=bash : + + print_info() { + + prin " " + info " ​ ​  " title + prin "$(color 7)┌──────────────────────────────────────┐" + + info " ​ ​ $(color 4)󰌢 \n" model + info " ​ ​ $(color 6)󰍛 \n" cpu + info " ​ ​ $(color 2) \n" gpu + info " ​ ​ $(color 1) \n" memory + info " ​ ​ $(color 5)󰍹 \n" resolution + + prin "$(color 7)├──────────────────────────────────────┤" + + info " ​ ​ $(color 4) \n" distro + info " ​ ​ $(color 4) \n" kernel + info " ​ ​ $(color 6) \n" wm + info " ​ ​ $(color 2) \n" shell + info " ​ ​ $(color 3) \n" term + info " ​ ​ $(color 7) \n" term_font + info " ​ ​ $(color 5)󰉼 \n" theme + info " ​ ​ $(color 1)󰀻 \n" icons + info " ​ ​ $(color 2)󰊠 \n" packages + info " ​ ​ $(color 3) \n" uptime + + prin "$(color 7)├──────────────────────────────────────┤" + + info cols + prin + + prin "$(color 7)└──────────────────────────────────────┘" +} + + +# Title + + +# Hide/Show Fully qualified domain name. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --title_fqdn +title_fqdn="off" + + +# Kernel + + +# Shorten the output of the kernel function. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --kernel_shorthand +# Supports: Everything except *BSDs (except PacBSD and PC-BSD) +# +# Example: +# on: '4.8.9-1-ARCH' +# off: 'Linux 4.8.9-1-ARCH' +kernel_shorthand="on" + + +# Distro + + +# Shorten the output of the distro function +# +# Default: 'off' +# Values: 'on', 'tiny', 'off' +# Flag: --distro_shorthand +# Supports: Everything except Windows and Haiku +distro_shorthand="on" + +# Show/Hide OS Architecture. +# Show 'x86_64', 'x86' and etc in 'Distro:' output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --os_arch +# +# Example: +# on: 'Arch Linux x86_64' +# off: 'Arch Linux' +os_arch="off" + + +# Uptime + + +# Shorten the output of the uptime function +# +# Default: 'on' +# Values: 'on', 'tiny', 'off' +# Flag: --uptime_shorthand +# +# Example: +# on: '2 days, 10 hours, 3 mins' +# tiny: '2d 10h 3m' +# off: '2 days, 10 hours, 3 minutes' +uptime_shorthand="on" + + +# Memory + + +# Show memory pecentage in output. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --memory_percent +# +# Example: +# on: '1801MiB / 7881MiB (22%)' +# off: '1801MiB / 7881MiB' +memory_percent="on" + +# Change memory output unit. +# +# Default: 'mib' +# Values: 'kib', 'mib', 'gib' +# Flag: --memory_unit +# +# Example: +# kib '1020928KiB / 7117824KiB' +# mib '1042MiB / 6951MiB' +# gib: ' 0.98GiB / 6.79GiB' +memory_unit="gib" + + +# Packages + + +# Show/Hide Package Manager names. +# +# Default: 'tiny' +# Values: 'on', 'tiny' 'off' +# Flag: --package_managers +# +# Example: +# on: '998 (pacman), 8 (flatpak), 4 (snap)' +# tiny: '908 (pacman, flatpak, snap)' +# off: '908' +package_managers="on" + + +# Shell + + +# Show the path to $SHELL +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --shell_path +# +# Example: +# on: '/bin/bash' +# off: 'bash' +shell_path="off" + +# Show $SHELL version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --shell_version +# +# Example: +# on: 'bash 4.4.5' +# off: 'bash' +shell_version="off" + + +# CPU + + +# CPU speed type +# +# Default: 'bios_limit' +# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'. +# Flag: --speed_type +# Supports: Linux with 'cpufreq' +# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value. +speed_type="bios_limit" + +# CPU speed shorthand +# +# Default: 'off' +# Values: 'on', 'off'. +# Flag: --speed_shorthand +# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz +# +# Example: +# on: 'i7-6500U (4) @ 3.1GHz' +# off: 'i7-6500U (4) @ 3.100GHz' +speed_shorthand="off" + +# Enable/Disable CPU brand in output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_brand +# +# Example: +# on: 'Intel i7-6500U' +# off: 'i7-6500U (4)' +cpu_brand="on" + +# CPU Speed +# Hide/Show CPU speed. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_speed +# +# Example: +# on: 'Intel i7-6500U (4) @ 3.1GHz' +# off: 'Intel i7-6500U (4)' +cpu_speed="off" + +# CPU Cores +# Display CPU cores in output +# +# Default: 'logical' +# Values: 'logical', 'physical', 'off' +# Flag: --cpu_cores +# Support: 'physical' doesn't work on BSD. +# +# Example: +# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores) +# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores) +# off: 'Intel i7-6500U @ 3.1GHz' +cpu_cores="off" + +# CPU Temperature +# Hide/Show CPU temperature. +# Note the temperature is added to the regular CPU function. +# +# Default: 'off' +# Values: 'C', 'F', 'off' +# Flag: --cpu_temp +# Supports: Linux, BSD +# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable +# coretemp kernel module. This only supports newer Intel processors. +# +# Example: +# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]' +# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]' +# off: 'Intel i7-6500U (4) @ 3.1GHz' +cpu_temp="off" + + +# GPU + + +# Enable/Disable GPU Brand +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gpu_brand +# +# Example: +# on: 'AMD HD 7950' +# off: 'HD 7950' +gpu_brand="on" + +# Which GPU to display +# +# Default: 'all' +# Values: 'all', 'dedicated', 'integrated' +# Flag: --gpu_type +# Supports: Linux +# +# Example: +# all: +# GPU1: AMD HD 7950 +# GPU2: Intel Integrated Graphics +# +# dedicated: +# GPU1: AMD HD 7950 +# +# integrated: +# GPU1: Intel Integrated Graphics +gpu_type="all" + + +# Resolution + + +# Display refresh rate next to each monitor +# Default: 'off' +# Values: 'on', 'off' +# Flag: --refresh_rate +# Supports: Doesn't work on Windows. +# +# Example: +# on: '1920x1080 @ 60Hz' +# off: '1920x1080' +refresh_rate="off" + + +# Gtk Theme / Icons / Font + + +# Shorten output of GTK Theme / Icons / Font +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --gtk_shorthand +# +# Example: +# on: 'Numix, Adwaita' +# off: 'Numix [GTK2], Adwaita [GTK3]' +gtk_shorthand="on" + +# Enable/Disable gtk2 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk2 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Adwaita [GTK3]' +gtk2="on" + +# Enable/Disable gtk3 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk3 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Numix [GTK2]' +gtk3="on" + + +# IP Address + + +# Website to ping for the public IP +# +# Default: 'http://ident.me' +# Values: 'url' +# Flag: --ip_host +public_ip_host="http://ident.me" + +# Public IP timeout. +# +# Default: '2' +# Values: 'int' +# Flag: --ip_timeout +public_ip_timeout=2 + +# Local IP interface +# +# Default: 'auto' (interface of default route) +# Values: 'auto', 'en0', 'en1' +# Flag: --ip_interface +local_ip_interface=('auto') + + +# Desktop Environment + + +# Show Desktop Environment version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --de_version +de_version="on" + + +# Disk + + +# Which disks to display. +# The values can be any /dev/sdXX, mount point or directory. +# NOTE: By default we only show the disk info for '/'. +# +# Default: '/' +# Values: '/', '/dev/sdXX', '/path/to/drive'. +# Flag: --disk_show +# +# Example: +# disk_show=('/' '/dev/sdb1'): +# 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 823G / 893G (93%)' +# +# disk_show=('/'): +# 'Disk (/): 74G / 118G (66%)' +# +disk_show=('/') + +# Disk subtitle. +# What to append to the Disk subtitle. +# +# Default: 'mount' +# Values: 'mount', 'name', 'dir', 'none' +# Flag: --disk_subtitle +# +# Example: +# name: 'Disk (/dev/sda1): 74G / 118G (66%)' +# 'Disk (/dev/sdb2): 74G / 118G (66%)' +# +# mount: 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Local Disk): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 74G / 118G (66%)' +# +# dir: 'Disk (/): 74G / 118G (66%)' +# 'Disk (Local Disk): 74G / 118G (66%)' +# 'Disk (Videos): 74G / 118G (66%)' +# +# none: 'Disk: 74G / 118G (66%)' +# 'Disk: 74G / 118G (66%)' +# 'Disk: 74G / 118G (66%)' +disk_subtitle="mount" + +# Disk percent. +# Show/Hide disk percent. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --disk_percent +# +# Example: +# on: 'Disk (/): 74G / 118G (66%)' +# off: 'Disk (/): 74G / 118G' +disk_percent="on" + + +# Song + + +# Manually specify a music player. +# +# Default: 'auto' +# Values: 'auto', 'player-name' +# Flag: --music_player +# +# Available values for 'player-name': +# +# amarok +# audacious +# banshee +# bluemindo +# clementine +# cmus +# deadbeef +# deepin-music +# dragon +# elisa +# exaile +# gnome-music +# gmusicbrowser +# gogglesmm +# guayadeque +# io.elementary.music +# iTunes +# Music +# juk +# lollypop +# MellowPlayer +# mocp +# mopidy +# mpd +# muine +# netease-cloud-music +# olivia +# playerctl +# pogo +# pragha +# qmmp +# quodlibet +# rhythmbox +# sayonara +# smplayer +# spotify +# strawberry +# tauonmb +# tomahawk +# vlc +# xmms2d +# xnoise +# yarock +music_player="auto" + +# Format to display song information. +# +# Default: '%artist% - %album% - %title%' +# Values: '%artist%', '%album%', '%title%' +# Flag: --song_format +# +# Example: +# default: 'Song: Jet - Get Born - Sgt Major' +song_format="%artist% - %album% - %title%" + +# Print the Artist, Album and Title on separate lines +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --song_shorthand +# +# Example: +# on: 'Artist: The Fratellis' +# 'Album: Costello Music' +# 'Song: Chelsea Dagger' +# +# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger' +song_shorthand="off" + +# 'mpc' arguments (specify a host, password etc). +# +# Default: '' +# Example: mpc_args=(-h HOST -P PASSWORD) +mpc_args=() + + +# Text Colors + + +# Text Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --colors +# +# Each number represents a different part of the text in +# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info' +# +# Example: +# colors=(distro) - Text is colored based on Distro colors. +# colors=(4 6 1 8 8 6) - Text is colored in the order above. +colors=(distro) + + +# Text Options + + +# Toggle bold text +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bold +bold="on" + +# Enable/Disable Underline +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --underline +underline_enabled="on" + +# Underline character +# +# Default: '-' +# Values: 'string' +# Flag: --underline_char +underline_char="-" + + +# Info Separator +# Replace the default separator with the specified string. +# +# Default: ':' +# Flag: --separator +# +# Example: +# separator="->": 'Shell-> bash' +# separator=" =": 'WM = dwm' +separator=" 󰾞" + + +# Color Blocks + + +# Color block range +# The range of colors to print. +# +# Default: '0', '15' +# Values: 'num' +# Flag: --block_range +# +# Example: +# +# Display colors 0-7 in the blocks. (8 colors) +# neofetch --block_range 0 7 +# +# Display colors 0-15 in the blocks. (16 colors) +# neofetch --block_range 0 15 +block_range=(0 15) + +# Toggle color blocks +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --color_blocks +color_blocks="on" + +# Color block width in spaces +# +# Default: '3' +# Values: 'num' +# Flag: --block_width +block_width=3 + +# Color block height in lines +# +# Default: '1' +# Values: 'num' +# Flag: --block_height +block_height=1 + +# Color Alignment +# +# Default: 'auto' +# Values: 'auto', 'num' +# Flag: --col_offset +# +# Number specifies how far from the left side of the terminal (in spaces) to +# begin printing the columns, in case you want to e.g. center them under your +# text. +# Example: +# col_offset="auto" - Default behavior of neofetch +# col_offset=7 - Leave 7 spaces then print the colors +col_offset=49 + + +# Progress Bars + + +# Bar characters +# +# Default: '-', '=' +# Values: 'string', 'string' +# Flag: --bar_char +# +# Example: +# neofetch --bar_char 'elapsed' 'total' +# neofetch --bar_char '-' '=' +bar_char_elapsed="-" +bar_char_total="=" + +# Toggle Bar border +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bar_border +bar_border="on" + +# Progress bar length in spaces +# Number of chars long to make the progress bars. +# +# Default: '15' +# Values: 'num' +# Flag: --bar_length +bar_length=15 + +# Progress bar colors +# When set to distro, uses your distro's logo colors. +# +# Default: 'distro', 'distro' +# Values: 'distro', 'num' +# Flag: --bar_colors +# +# Example: +# neofetch --bar_colors 3 4 +# neofetch --bar_colors distro 5 +bar_color_elapsed="distro" +bar_color_total="distro" + + +# Info display +# Display a bar with the info. +# +# Default: 'off' +# Values: 'bar', 'infobar', 'barinfo', 'off' +# Flags: --memory_display +# --battery_display +# --disk_display +# +# Example: +# bar: '[---=======]' +# infobar: 'info [---=======]' +# barinfo: '[---=======] info' +# off: 'info' +memory_display="off" +battery_display="off" +disk_display="off" + + +# Backend Settings + + +# Image backend. +# +# Default: 'ascii' +# Values: 'ascii', 'caca', 'catimg', 'chafa', 'jp2a', 'iterm2', 'off', +# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty', 'ueberzug', +# 'viu' + +# Flag: --backend +image_backend="ascii" + +# Image Source +# +# Which image or ascii file to display. +# +# Default: 'auto' +# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/' +# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")' +# Flag: --source +# +# NOTE: 'auto' will pick the best image source for whatever image backend is used. +# In ascii mode, distro ascii art will be used and in an image mode, your +# wallpaper will be used. +image_source="auto" + + +# Ascii Options + + +# Ascii distro +# Which distro's ascii art to display. +# +# Default: 'auto' +# Values: 'auto', 'distro_name' +# Flag: --ascii_distro +# NOTE: AIX, Hash, Alpine, AlterLinux, Amazon, Anarchy, Android, instantOS, +# Antergos, antiX, "AOSC OS", "AOSC OS/Retro", Apricity, ArchCraft, +# ArcoLinux, ArchBox, ARCHlabs, ArchStrike, XFerience, ArchMerge, Arch, +# Artix, Arya, Bedrock, Bitrig, BlackArch, BLAG, BlankOn, BlueLight, +# bonsai, BSD, BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS, +# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover, Condres, +# Container_Linux, CRUX, Cucumber, dahlia, Debian, Deepin, DesaOS, +# Devuan, DracOS, DarkOs, Itc, DragonFly, Drauger, Elementary, +# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD, +# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo, +# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra, +# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, Korora, +# KSLinux, Kubuntu, LEDE, LaxerOS, LibreELEC, LFS, Linux_Lite, LMDE, +# Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva, Manjaro, Maui, +# Mer, Minix, LinuxMint, Live_Raizo, MX_Linux, Namib, Neptune, NetBSD, +# Netrunner, Nitrux, NixOS, Nurunner, NuTyX, OBRevenge, OpenBSD, +# openEuler, OpenIndiana, openmamba, OpenMandriva, OpenStage, OpenWrt, +# osmc, Oracle, OS Elbrus, PacBSD, Parabola, Pardus, Parrot, Parsix, +# TrueOS, PCLinuxOS, Pengwin, Peppermint, popos, Porteus, PostMarketOS, +# Proxmox, Puppy, PureOS, Qubes, Quibian, Radix, Raspbian, Reborn_OS, +# Redstar, Redcore, Redhat, Refracted_Devuan, Regata, Regolith, Rosa, +# sabotage, Sabayon, Sailfish, SalentOS, Scientific, Septor, +# SereneLinux, SharkLinux, Siduction, Slackware, SliTaz, SmartOS, +# Solus, Source_Mage, Sparky, Star, SteamOS, SunOS, openSUSE_Leap, t2, +# openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, Trisquel, +# Ubuntu-Cinnamon, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, +# Ubuntu-Studio, Ubuntu, Univention, Venom, Void, semc, Obarun, +# windows10, Windows7, Xubuntu, Zorin, and IRIX have ascii logos. +# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants. +# Use '{distro name}_old' to use the old logos. +# NOTE: Ubuntu has flavor variants. +# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME, +# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors. +# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu, +# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android, +# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola, +# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS, +# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian, +# postmarketOS, and Void have a smaller logo variant. +# Use '{distro name}_small' to use the small variants. +ascii_distro="auto" + +# Ascii Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --ascii_colors +# +# Example: +# ascii_colors=(distro) - Ascii is colored based on Distro colors. +# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors. +ascii_colors=(distro) + +# Bold ascii logo +# Whether or not to bold the ascii logo. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --ascii_bold +ascii_bold="on" + + +# Image Options + + +# Image loop +# Setting this to on will make neofetch redraw the image constantly until +# Ctrl+C is pressed. This fixes display issues in some terminal emulators. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --loop +image_loop="off" + + +# Thumbnail directory +# +# Default: '~/.cache/thumbnails/neofetch' +# Values: 'dir' +thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch" + +# Crop mode +# +# Default: 'normal' +# Values: 'normal', 'fit', 'fill' +# Flag: --crop_mode +# +# See this wiki page to learn about the fit and fill options. +# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F +crop_mode="normal" + +# Crop offset +# Note: Only affects 'normal' crop mode. +# +# Default: 'center' +# Values: 'northwest', 'north', 'northeast', 'west', 'center' +# 'east', 'southwest', 'south', 'southeast' +# Flag: --crop_offset +crop_offset="center" + +# Image size +# The image is half the terminal width by default. +# +# Default: 'auto' +# Values: 'auto', '00px', '00%', 'none' +# Flags: --image_size +# --size +image_size="auto" + +# Catimg block size. +# Control the resolution of catimg. +# +# Default: '2' +# Values: '1', '2' +# Flags: --catimg_size +catimg_size="2" + +# Gap between image and text +# +# Default: '3' +# Values: 'num', '-num' +# Flag: --gap +gap=3 + +# Image offsets +# Only works with the w3m backend. +# +# Default: '0' +# Values: 'px' +# Flags: --xoffset +# --yoffset +yoffset=0 +xoffset=0 + +# Image background color +# Only works with the w3m backend. +# +# Default: '' +# Values: 'color', 'blue' +# Flag: --bg_color +background_color= + + +# Misc Options + +# Stdout mode +# Turn off all colors and disables image backend (ASCII/Image). +# Useful for piping into another command. +# Default: 'off' +# Values: 'on', 'off' +stdout="off" + diff --git a/dot_config/nvim/after/queries/html/injections.scm b/dot_config/nvim/after/queries/html/injections.scm new file mode 100644 index 0000000..e183fb0 --- /dev/null +++ b/dot_config/nvim/after/queries/html/injections.scm @@ -0,0 +1,36 @@ +;; extends + +; AlpineJS attributes +(attribute + (attribute_name) @_attr + (#lua-match? @_attr "^x%-%l") + (#not-any-of? @_attr "x-teleport" "x-ref" "x-transition") + (quoted_attribute_value + (attribute_value) @injection.content) + (#set! injection.language "javascript")) + +; Blade escaped JS attributes +; +(element + (_ + (tag_name) @_tag + (#lua-match? @_tag "^x%-%l") + (attribute + (attribute_name) @_attr + (#lua-match? @_attr "^::%l") + (quoted_attribute_value + (attribute_value) @injection.content) + (#set! injection.language "javascript")))) + +; Blade PHP attributes +; +(element + (_ + (tag_name) @_tag + (#lua-match? @_tag "^x%-%l") + (attribute + (attribute_name) @_attr + (#lua-match? @_attr "^:%l") + (quoted_attribute_value + (attribute_value) @injection.content) + (#set! injection.language "php_only")))) diff --git a/dot_config/nvim/after/queries/php/indents.scm b/dot_config/nvim/after/queries/php/indents.scm new file mode 100644 index 0000000..b2044f3 --- /dev/null +++ b/dot_config/nvim/after/queries/php/indents.scm @@ -0,0 +1,10 @@ +;; extends + +[ + ; prevent double indent for `return new class ...` + (return_statement + (object_creation_expression)) + ; prevent double indent for `return function() { ... }` + (return_statement + (anonymous_function_creation_expression)) +] @indent.dedent diff --git a/dot_config/nvim/dot_neoconf.json b/dot_config/nvim/dot_neoconf.json new file mode 100644 index 0000000..7c48087 --- /dev/null +++ b/dot_config/nvim/dot_neoconf.json @@ -0,0 +1,15 @@ +{ + "neodev": { + "library": { + "enabled": true, + "plugins": true + } + }, + "neoconf": { + "plugins": { + "lua_ls": { + "enabled": true + } + } + } +} diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua new file mode 100644 index 0000000..2514f9e --- /dev/null +++ b/dot_config/nvim/init.lua @@ -0,0 +1,2 @@ +-- bootstrap lazy.nvim, LazyVim and your plugins +require("config.lazy") diff --git a/dot_config/nvim/lazyvim.json b/dot_config/nvim/lazyvim.json new file mode 100644 index 0000000..f03853f --- /dev/null +++ b/dot_config/nvim/lazyvim.json @@ -0,0 +1,9 @@ +{ + "extras": [ + + ], + "news": { + "NEWS.md": "3314" + }, + "version": 3 +} \ No newline at end of file diff --git a/dot_config/nvim/lua/config/autocmds.lua b/dot_config/nvim/lua/config/autocmds.lua new file mode 100644 index 0000000..f6f949d --- /dev/null +++ b/dot_config/nvim/lua/config/autocmds.lua @@ -0,0 +1,44 @@ +-- Autocmds are automatically loaded on the VeryLazy event +-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua +-- Add any additional autocmds here + +-- Open help window in a vertical split to the right. +vim.api.nvim_create_autocmd("BufWinEnter", { + group = vim.api.nvim_create_augroup("help_window_right", {}), + pattern = { "*.txt" }, + callback = function() + if vim.o.filetype == "help" then + vim.cmd.wincmd("L") + end + end, +}) + +-- Define an autocmd group for the blade workaround +local augroup = vim.api.nvim_create_augroup("lsp_blade_workaround", { clear = true }) + +-- Autocommand to temporarily change 'blade' filetype to 'php' when opening for LSP server activation +vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, { + group = augroup, + pattern = "*.blade.php", + callback = function() + vim.bo.filetype = "php" + end, +}) + +-- Additional autocommand to switch back to 'blade' after LSP has attached +vim.api.nvim_create_autocmd("LspAttach", { + pattern = "*.blade.php", + callback = function(args) + vim.schedule(function() + -- Check if the attached client is 'intelephense' + for _, client in ipairs(vim.lsp.get_active_clients()) do + if client.name == "intelephense" and client.attached_buffers[args.buf] then + vim.api.nvim_buf_set_option(args.buf, "filetype", "blade") + -- update treesitter parser to blade + vim.api.nvim_buf_set_option(args.buf, "syntax", "blade") + break + end + end + end) + end, +}) diff --git a/dot_config/nvim/lua/config/keymaps.lua b/dot_config/nvim/lua/config/keymaps.lua new file mode 100644 index 0000000..2c134f7 --- /dev/null +++ b/dot_config/nvim/lua/config/keymaps.lua @@ -0,0 +1,3 @@ +-- Keymaps are automatically loaded on the VeryLazy event +-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua +-- Add any additional keymaps here diff --git a/dot_config/nvim/lua/config/lazy.lua b/dot_config/nvim/lua/config/lazy.lua new file mode 100644 index 0000000..78a7a93 --- /dev/null +++ b/dot_config/nvim/lua/config/lazy.lua @@ -0,0 +1,81 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.loop.fs_stat(lazypath) then + -- bootstrap lazy.nvim + -- stylua: ignore + vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath }) +end +vim.opt.rtp:prepend(vim.env.LAZY or lazypath) + +require("lazy").setup({ + spec = { + -- add LazyVim and import its plugins + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, + + -- import any extras modules here + + -- coding + { import = "lazyvim.plugins.extras.coding.yanky" }, + + -- editor + { import = "lazyvim.plugins.extras.editor.aerial" }, + { import = "lazyvim.plugins.extras.editor.leap" }, + { import = "lazyvim.plugins.extras.editor.navic" }, + + -- formatting + { import = "lazyvim.plugins.extras.formatting.prettier" }, + + -- lang + { import = "lazyvim.plugins.extras.lang.json" }, + { import = "lazyvim.plugins.extras.lang.markdown" }, + { import = "lazyvim.plugins.extras.lang.python" }, + { import = "lazyvim.plugins.extras.lang.ruby" }, + { import = "lazyvim.plugins.extras.lang.typescript" }, + { import = "lazyvim.plugins.extras.lang.yaml" }, + + -- linting + { import = "lazyvim.plugins.extras.linting.eslint" }, + + -- lsp + { import = "lazyvim.plugins.extras.lsp.none-ls" }, + + -- test + { import = "lazyvim.plugins.extras.test.core" }, + + -- ui + { import = "lazyvim.plugins.extras.ui.mini-animate" }, + + -- util + { import = "lazyvim.plugins.extras.util.dot" }, + { import = "lazyvim.plugins.extras.util.mini-hipatterns" }, + { import = "lazyvim.plugins.extras.util.project" }, + + -- import/override with your plugins + { import = "plugins" }, + }, + defaults = { + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. + -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. + lazy = false, + -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, + -- have outdated releases, which may break your Neovim install. + version = false, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + }, + install = { colorscheme = { "catppuccin-macchiato", "tokyonight", "habamax" } }, + checker = { enabled = true }, -- automatically check for plugin updates + performance = { + rtp = { + -- disable some rtp plugins + disabled_plugins = { + "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + "tarPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/dot_config/nvim/lua/config/options.lua b/dot_config/nvim/lua/config/options.lua new file mode 100644 index 0000000..e8fffe0 --- /dev/null +++ b/dot_config/nvim/lua/config/options.lua @@ -0,0 +1,29 @@ +-- Options are automatically loaded before lazy.nvim startup +-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua +-- Add any additional options here + +vim.o.shiftwidth = 0 +vim.o.tabstop = 2 +vim.o.expandtab = true + +vim.o.textwidth = 80 +vim.o.colorcolumn = "+1" + +vim.o.number = true +vim.o.relativenumber = true + +vim.o.wrap = false + +vim.g.diffopt = "filler,vertical,closeoff,internal" + +vim.filetype.add({ + extension = { + env = "conf", + }, + filename = { + [".env"] = "conf", + }, + pattern = { + ["%.env%.[%w_.-]+"] = "conf", + }, +}) diff --git a/dot_config/nvim/lua/config/tabset.lua b/dot_config/nvim/lua/config/tabset.lua new file mode 100644 index 0000000..5ed5585 --- /dev/null +++ b/dot_config/nvim/lua/config/tabset.lua @@ -0,0 +1,11 @@ +return { + defaults = { + tabwidth = 2, + expandtab = true, + }, + languages = { + fish = { + tabwidth = 4, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/beacon.lua b/dot_config/nvim/lua/plugins/beacon.lua new file mode 100644 index 0000000..7763a30 --- /dev/null +++ b/dot_config/nvim/lua/plugins/beacon.lua @@ -0,0 +1,9 @@ +return { + { + "rainbowhxch/beacon.nvim", + event = "CursorMoved", + cond = function() + return not vim.g.neovide + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/chezmoi-vim.lua b/dot_config/nvim/lua/plugins/chezmoi-vim.lua new file mode 100644 index 0000000..4d06f5d --- /dev/null +++ b/dot_config/nvim/lua/plugins/chezmoi-vim.lua @@ -0,0 +1,9 @@ +return { + 'alker0/chezmoi.vim', + lazy = false, + init = function() + -- This option is required. + vim.g['chezmoi#use_tmp_buffer'] = true + -- add other options here if needed. + end, +} diff --git a/dot_config/nvim/lua/plugins/conform.lua b/dot_config/nvim/lua/plugins/conform.lua new file mode 100644 index 0000000..454080d --- /dev/null +++ b/dot_config/nvim/lua/plugins/conform.lua @@ -0,0 +1,59 @@ +local util = require("conform.util") + +return { + { + "stevearc/conform.nvim", + + -- @class ConformOpts + opts = { + formatters_by_ft = { + -- lua + lua = { "stylua" }, + + -- data/conf + sql = { "prettier" }, + json = { "prettier" }, + toml = { "taplo" }, + yaml = { "prettier" }, + + -- web + html = { "prettier" }, + liquid = { "prettier" }, + css = { "stylelint", "prettier" }, + scss = { "stylelint", "prettier" }, + javascript = { "eslint", "prettier" }, + typescript = { "eslint", "prettier" }, + vue = { "eslint", "prettier" }, + markdown = { "prettier" }, + + -- php + php = { "pint" }, + blade = { "blade-formatter", "rustywind" }, + + -- shell + sh = { "shellcheck", "shfmt" }, + fish = { "fish_indent" }, + + -- misc + ruby = { "prettier" }, + }, + formatters = { + shfmt = { + prepend_args = { "--indent=2", "--case-indent", "--binary-next-line", "--func-next-line" }, + }, + pint = { + meta = { + url = "https://github.com/laravel/pint", + description = "Laravel Pint is an opinionated PHP code style fixer for minimalists. Pint is built on top of PHP-CS-Fixer and makes it simple to ensure that your code style stays clean and consistent.", + }, + command = util.find_executable({ + vim.fn.stdpath("data") .. "/mason/bin/pint", + "vendor/bin/pint", + }, "pint"), + args = { "$FILENAME" }, + stdin = false, + }, + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/cutlass.lua b/dot_config/nvim/lua/plugins/cutlass.lua new file mode 100644 index 0000000..385fd12 --- /dev/null +++ b/dot_config/nvim/lua/plugins/cutlass.lua @@ -0,0 +1,15 @@ +return { + { + "gbprod/cutlass.nvim", + event = "BufReadPost", + opts = { + cut_key = "x", + override_del = true, + registers = { + select = "_", + delete = "_", + change = "_", + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/diffview.lua b/dot_config/nvim/lua/plugins/diffview.lua new file mode 100644 index 0000000..9ab05d8 --- /dev/null +++ b/dot_config/nvim/lua/plugins/diffview.lua @@ -0,0 +1,6 @@ +return { + { + "sindrets/diffview.nvim", + config = true, + }, +} diff --git a/dot_config/nvim/lua/plugins/dim.lua b/dot_config/nvim/lua/plugins/dim.lua new file mode 100644 index 0000000..afec06b --- /dev/null +++ b/dot_config/nvim/lua/plugins/dim.lua @@ -0,0 +1,7 @@ +return { + { + "0oAstro/dim.lua", + event = "LspAttach", + config = true, + }, +} diff --git a/dot_config/nvim/lua/plugins/example.lua b/dot_config/nvim/lua/plugins/example.lua new file mode 100644 index 0000000..6859c0e --- /dev/null +++ b/dot_config/nvim/lua/plugins/example.lua @@ -0,0 +1,265 @@ +-- since this is just an example spec, don't actually load anything here and return an empty spec +-- stylua: ignore +if true then return {} end + +-- every spec file under the "plugins" directory will be loaded automatically by lazy.nvim +-- +-- In your plugin files, you can: +-- * add extra plugins +-- * disable/enabled LazyVim plugins +-- * override the configuration of LazyVim plugins +return { + -- add gruvbox + { "ellisonleao/gruvbox.nvim" }, + + -- Configure LazyVim to load gruvbox + { + "LazyVim/LazyVim", + opts = { + colorscheme = "gruvbox", + }, + }, + + -- change trouble config + { + "folke/trouble.nvim", + -- opts will be merged with the parent spec + opts = { use_diagnostic_signs = true }, + }, + + -- disable trouble + { "folke/trouble.nvim", enabled = false }, + + -- add symbols-outline + { + "simrat39/symbols-outline.nvim", + cmd = "SymbolsOutline", + keys = { { "cs", "SymbolsOutline", desc = "Symbols Outline" } }, + config = true, + }, + + -- override nvim-cmp and add cmp-emoji + { + "hrsh7th/nvim-cmp", + dependencies = { "hrsh7th/cmp-emoji" }, + ---@param opts cmp.ConfigSchema + opts = function(_, opts) + table.insert(opts.sources, { name = "emoji" }) + end, + }, + + -- change some telescope options and a keymap to browse plugin files + { + "nvim-telescope/telescope.nvim", + keys = { + -- add a keymap to browse plugin files + -- stylua: ignore + { + "fp", + function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end, + desc = "Find Plugin File", + }, + }, + -- change some options + opts = { + defaults = { + layout_strategy = "horizontal", + layout_config = { prompt_position = "top" }, + sorting_strategy = "ascending", + winblend = 0, + }, + }, + }, + + -- add telescope-fzf-native + { + "telescope.nvim", + dependencies = { + "nvim-telescope/telescope-fzf-native.nvim", + build = "make", + config = function() + require("telescope").load_extension("fzf") + end, + }, + }, + + -- add pyright to lspconfig + { + "neovim/nvim-lspconfig", + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- pyright will be automatically installed with mason and loaded with lspconfig + pyright = {}, + }, + }, + }, + + -- add tsserver and setup with typescript.nvim instead of lspconfig + { + "neovim/nvim-lspconfig", + dependencies = { + "jose-elias-alvarez/typescript.nvim", + init = function() + require("lazyvim.util").lsp.on_attach(function(_, buffer) + -- stylua: ignore + vim.keymap.set( "n", "co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" }) + vim.keymap.set("n", "cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer }) + end) + end, + }, + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- tsserver will be automatically installed with mason and loaded with lspconfig + tsserver = {}, + }, + -- you can do any additional lsp server setup here + -- return true if you don't want this server to be setup with lspconfig + ---@type table + setup = { + -- example to setup with typescript.nvim + tsserver = function(_, opts) + require("typescript").setup({ server = opts }) + return true + end, + -- Specify * to use this function as a fallback for any server + -- ["*"] = function(server, opts) end, + }, + }, + }, + + -- for typescript, LazyVim also includes extra specs to properly setup lspconfig, + -- treesitter, mason and typescript.nvim. So instead of the above, you can use: + { import = "lazyvim.plugins.extras.lang.typescript" }, + + -- add more treesitter parsers + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "bash", + "html", + "javascript", + "json", + "lua", + "markdown", + "markdown_inline", + "python", + "query", + "regex", + "tsx", + "typescript", + "vim", + "yaml", + }, + }, + }, + + -- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above + -- would overwrite `ensure_installed` with the new value. + -- If you'd rather extend the default config, use the code below instead: + { + "nvim-treesitter/nvim-treesitter", + opts = function(_, opts) + -- add tsx and treesitter + vim.list_extend(opts.ensure_installed, { + "tsx", + "typescript", + }) + end, + }, + + -- the opts function can also be used to change the default opts: + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function(_, opts) + table.insert(opts.sections.lualine_x, "😄") + end, + }, + + -- or you can return new options to override all the defaults + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function() + return { + --[[add your custom lualine config here]] + } + end, + }, + + -- use mini.starter instead of alpha + { import = "lazyvim.plugins.extras.ui.mini-starter" }, + + -- add jsonls and schemastore packages, and setup treesitter for json, json5 and jsonc + { import = "lazyvim.plugins.extras.lang.json" }, + + -- add any tools you want to have installed below + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "stylua", + "shellcheck", + "shfmt", + "flake8", + }, + }, + }, + + -- Use for completion and snippets (supertab) + -- first: disable default and behavior in LuaSnip + { + "L3MON4D3/LuaSnip", + keys = function() + return {} + end, + }, + -- then: setup supertab in cmp + { + "hrsh7th/nvim-cmp", + dependencies = { + "hrsh7th/cmp-emoji", + }, + ---@param opts cmp.ConfigSchema + opts = function(_, opts) + local has_words_before = function() + unpack = unpack or table.unpack + local line, col = unpack(vim.api.nvim_win_get_cursor(0)) + return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil + end + + local luasnip = require("luasnip") + local cmp = require("cmp") + + opts.mapping = vim.tbl_extend("force", opts.mapping, { + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + -- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable() + -- this way you will only jump inside the snippet region + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + }) + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/gitsigns.lua b/dot_config/nvim/lua/plugins/gitsigns.lua new file mode 100644 index 0000000..d6b52c2 --- /dev/null +++ b/dot_config/nvim/lua/plugins/gitsigns.lua @@ -0,0 +1,8 @@ +return { + { + "lewis6991/gitsigns.nvim", + dependencies = { + "sindrets/diffview.nvim", + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/lazygit.lua b/dot_config/nvim/lua/plugins/lazygit.lua new file mode 100644 index 0000000..c898cc8 --- /dev/null +++ b/dot_config/nvim/lua/plugins/lazygit.lua @@ -0,0 +1,6 @@ +return { + { + "kdheepak/lazygit.nvim", + cmd = "LazyGit", + }, +} diff --git a/dot_config/nvim/lua/plugins/lazyvim.lua b/dot_config/nvim/lua/plugins/lazyvim.lua new file mode 100644 index 0000000..84bb0c8 --- /dev/null +++ b/dot_config/nvim/lua/plugins/lazyvim.lua @@ -0,0 +1,8 @@ +return { + { + "LazyVim/LazyVim", + opts = { + colorscheme = "catppuccin-macchiato", + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/luasnip.lua b/dot_config/nvim/lua/plugins/luasnip.lua new file mode 100644 index 0000000..304ff2c --- /dev/null +++ b/dot_config/nvim/lua/plugins/luasnip.lua @@ -0,0 +1,14 @@ +return { + { + "L3MON4D3/LuaSnip", + keys = { { "" } }, + opts = { + store_selection_keys = "", + }, + config = function(_, opts) + require("luasnip").setup(opts) + + require("luasnip.loaders.from_lua").lazy_load({ lazy_paths = { "~/.config/nvim/lua/snippets" } }) + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/mason-lspconfig.lua b/dot_config/nvim/lua/plugins/mason-lspconfig.lua new file mode 100644 index 0000000..5564054 --- /dev/null +++ b/dot_config/nvim/lua/plugins/mason-lspconfig.lua @@ -0,0 +1,12 @@ +return { + { + "williamboman/mason-lspconfig.nvim", + dependencies = { + "williamboman/mason.nvim", + "neovim/nvim-lspconfig", + }, + opts = { + automatic_installation = true, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/mason.lua b/dot_config/nvim/lua/plugins/mason.lua new file mode 100644 index 0000000..72d030c --- /dev/null +++ b/dot_config/nvim/lua/plugins/mason.lua @@ -0,0 +1,24 @@ +return { + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + -- general + "commitlint", + "prettier", + + -- data/conf + "yamllint", + + -- php + "blade-formatter", + "pint", + "rustywind", + + -- shell + "shellcheck", + "shfmt", + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/neo-tree.lua b/dot_config/nvim/lua/plugins/neo-tree.lua new file mode 100644 index 0000000..067f2b3 --- /dev/null +++ b/dot_config/nvim/lua/plugins/neo-tree.lua @@ -0,0 +1,18 @@ +return { + { + "nvim-neo-tree/neo-tree.nvim", + opts = { + close_if_last_window = true, + window = { + width = 30, + }, + filesystem = { + filtered_items = { + hide_dotfiles = false, + hide_gitignored = false, + hide_hidden = false, + }, + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/nerdy.lua b/dot_config/nvim/lua/plugins/nerdy.lua new file mode 100644 index 0000000..aead6dc --- /dev/null +++ b/dot_config/nvim/lua/plugins/nerdy.lua @@ -0,0 +1,9 @@ +return { + { + "2kabhishek/nerdy.nvim", + cmd = "Nerdy", + keys = { + { "ci", "Nerdy", desc = "Pick Icon" }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/nvim-cmp.lua b/dot_config/nvim/lua/plugins/nvim-cmp.lua new file mode 100644 index 0000000..4599e44 --- /dev/null +++ b/dot_config/nvim/lua/plugins/nvim-cmp.lua @@ -0,0 +1,31 @@ +local cmp = require("cmp") + +return { + { + "hrsh7th/nvim-cmp", + dependencies = { "hrsh7th/cmp-emoji" }, + opts = function(_, opts) + opts.mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), + [""] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.scroll_docs(4), + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.abort(), + [""] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + [""] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + [""] = function(fallback) + cmp.abort() + fallback() + end, + }) + + table.insert(opts.sources, { name = "emoji" }) + + return opts + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/nvim-devdocs.lua b/dot_config/nvim/lua/plugins/nvim-devdocs.lua new file mode 100644 index 0000000..134797c --- /dev/null +++ b/dot_config/nvim/lua/plugins/nvim-devdocs.lua @@ -0,0 +1,36 @@ +return { + { + "luckasRanarison/nvim-devdocs", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-telescope/telescope.nvim", + "nvim-treesitter/nvim-treesitter", + }, + opts = { + ensure_installed = { + "bash", + "bootstrap~5", + "css", + "eslint", + "fish~3.7", + "html", + "http", + "javascript", + "laravel~10", + "liquid", + "lodash~4", + "lua~5.4", + "markdown", + "nginx", + "node", + "php", + "postgresql~16", + "sass", + "typescript", + "vite", + "vue~3", + "dom", + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/nvim-emmet.lua b/dot_config/nvim/lua/plugins/nvim-emmet.lua new file mode 100644 index 0000000..7494ebf --- /dev/null +++ b/dot_config/nvim/lua/plugins/nvim-emmet.lua @@ -0,0 +1,9 @@ +return { + { + "olrtg/nvim-emmet", + config = function() + vim.keymap.set({ "n", "v" }, "xe", require("nvim-emmet").wrap_with_abbreviation) + end, + ft = { "html", "css", "scss", "vue" }, + }, +} diff --git a/dot_config/nvim/lua/plugins/nvim-lint.lua b/dot_config/nvim/lua/plugins/nvim-lint.lua new file mode 100644 index 0000000..fdfe2f9 --- /dev/null +++ b/dot_config/nvim/lua/plugins/nvim-lint.lua @@ -0,0 +1,21 @@ +return { + { + "mfussenegger/nvim-lint", + opts = { + linters_by_ft = { + gitcommit = { "commitlint" }, + sql = { "sqlfluff" }, + yaml = { "yamllint" }, + bash = { "shellcheck" }, + sh = { "shellcheck" }, + }, + linters = { + commitlint = { + args = { + "--config ~/.config/git/commitlint.config.js", + }, + }, + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/nvim-lspconfig.lua b/dot_config/nvim/lua/plugins/nvim-lspconfig.lua new file mode 100644 index 0000000..99a7c53 --- /dev/null +++ b/dot_config/nvim/lua/plugins/nvim-lspconfig.lua @@ -0,0 +1,86 @@ +return { + { + "neovim/nvim-lspconfig", + ---@class PluginLspOpts + opts = { + servers = { + -- data/conf + sqlls = {}, + taplo = {}, + + -- web + html = { + filetypes = { "html", "liquid" }, + }, + css_variables = { mason = false }, + cssls = {}, + denols = {}, + volar = { + filetypes = { + "typescript", + "javascript", + "javascriptreact", + "typescriptreact", + "vue", + "json", + }, + }, + stylelint_lsp = { + settings = { + stylelintplus = { + autoFixOnFormat = true, + validateOnSave = true, + validateOnType = false, + }, + }, + }, + emmet_language_server = { + filetypes = { + "css", + "eruby", + "html", + "javascriptreact", + "less", + "sass", + "scss", + "pug", + "typescriptreact", + "vue", + "blade", + }, + -- Read more about this options in the [vscode docs](https://code.visualstudio.com/docs/editor/emmet#_emmet-configuration). + -- **Note:** only the options listed in the table are supported. + init_options = { + ---@type table + includeLanguages = {}, + --- @type string[] + excludeLanguages = {}, + --- @type string[] + extensionsPath = {}, + --- @type table [Emmet Docs](https://docs.emmet.io/customization/preferences/) + preferences = {}, + --- @type boolean Defaults to `true` + showAbbreviationSuggestions = true, + --- @type "always" | "never" Defaults to `"always"` + showExpandedAbbreviation = "always", + --- @type boolean Defaults to `false` + showSuggestionsAsSnippets = false, + --- @type table [Emmet Docs](https://docs.emmet.io/customization/syntax-profiles/) + syntaxProfiles = {}, + --- @type table [Emmet Docs](https://docs.emmet.io/customization/snippets/#variables) + variables = {}, + }, + }, + + -- php + phpactor = { + filetypes = { "php", "blade" }, + }, + + -- shell + bashls = {}, + pkgbuild_language_server = { mason = false }, + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/nvim-treesitter.lua b/dot_config/nvim/lua/plugins/nvim-treesitter.lua new file mode 100644 index 0000000..8f16f33 --- /dev/null +++ b/dot_config/nvim/lua/plugins/nvim-treesitter.lua @@ -0,0 +1,59 @@ +return { + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + -- general + "comment", + + -- git + "diff", + "git_config", + "git_rebase", + "gitattributes", + "gitcommit", + "gitignore", + + -- data/conf + "ini", + "ssh_config", + "toml", + + -- web + "html", + "css", + "scss", + "javascript", + "jsdoc", + "vue", + + -- php + "php_only", + "phpdoc", + + -- shell + "bash", + "fish", + }, + }, + + config = function(_, opts) + ---@class ParserInfo[] + local parser_config = require("nvim-treesitter.parsers").get_parser_configs() + + parser_config.blade = { + install_info = { + url = "https://github.com/EmranMR/tree-sitter-blade", + files = { + "src/parser.c", + }, + generate_requires_npm = true, + requires_generate_from_grammar = true, + }, + filetype = "blade", + } + + require("nvim-treesitter.configs").setup(opts) + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/refactoring.lua b/dot_config/nvim/lua/plugins/refactoring.lua new file mode 100644 index 0000000..153ee7d --- /dev/null +++ b/dot_config/nvim/lua/plugins/refactoring.lua @@ -0,0 +1,10 @@ +return { + { + "ThePrimeagen/refactoring.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-treesitter/nvim-treesitter", + }, + config = true, + }, +} diff --git a/dot_config/nvim/lua/plugins/ssr.lua b/dot_config/nvim/lua/plugins/ssr.lua new file mode 100644 index 0000000..0bb4f9c --- /dev/null +++ b/dot_config/nvim/lua/plugins/ssr.lua @@ -0,0 +1,15 @@ +return { + { + "cshuaimin/ssr.nvim", + keys = { + { + "sR", + function() + require("ssr").open() + end, + mode = { "n", "x" }, + desc = "Structural Replace", + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/tabset.lua b/dot_config/nvim/lua/plugins/tabset.lua new file mode 100644 index 0000000..0d54768 --- /dev/null +++ b/dot_config/nvim/lua/plugins/tabset.lua @@ -0,0 +1,6 @@ +return { + { + "FotiadisM/tabset.nvim", + opts = require("config.tabset"), + }, +} diff --git a/dot_config/nvim/lua/plugins/treesj.lua b/dot_config/nvim/lua/plugins/treesj.lua new file mode 100644 index 0000000..c62e929 --- /dev/null +++ b/dot_config/nvim/lua/plugins/treesj.lua @@ -0,0 +1,10 @@ +return { + { + "Wansmer/treesj", + keys = { "m", "j", "s" }, + dependencies = { "nvim-treesitter/nvim-treesitter" }, + opts = { + max_join_length = 80, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/vim-blade.lua b/dot_config/nvim/lua/plugins/vim-blade.lua new file mode 100644 index 0000000..fb22e0f --- /dev/null +++ b/dot_config/nvim/lua/plugins/vim-blade.lua @@ -0,0 +1,6 @@ +return { + { + "jwalton512/vim-blade", + ft = { "blade" }, + }, +} diff --git a/dot_config/nvim/lua/plugins/vim-dotenv.lua b/dot_config/nvim/lua/plugins/vim-dotenv.lua new file mode 100644 index 0000000..418cd3e --- /dev/null +++ b/dot_config/nvim/lua/plugins/vim-dotenv.lua @@ -0,0 +1,6 @@ +return { + { + "tpope/vim-dotenv", + ft = { "dotenv" }, + }, +} diff --git a/dot_config/nvim/lua/plugins/vim-gutentags.lua b/dot_config/nvim/lua/plugins/vim-gutentags.lua new file mode 100644 index 0000000..233721f --- /dev/null +++ b/dot_config/nvim/lua/plugins/vim-gutentags.lua @@ -0,0 +1,6 @@ +return { + { + "ludovicchabant/vim-gutentags", + lazy = false, + }, +} diff --git a/dot_config/nvim/lua/plugins/vim-pkgbuild.lua b/dot_config/nvim/lua/plugins/vim-pkgbuild.lua new file mode 100644 index 0000000..e98146b --- /dev/null +++ b/dot_config/nvim/lua/plugins/vim-pkgbuild.lua @@ -0,0 +1,6 @@ +return { + { + "m-pilia/vim-pkgbuild", + ft = { "pkgbuild" }, + }, +} diff --git a/dot_config/nvim/lua/plugins/vim-tmux-navigator.lua b/dot_config/nvim/lua/plugins/vim-tmux-navigator.lua new file mode 100644 index 0000000..ce695d8 --- /dev/null +++ b/dot_config/nvim/lua/plugins/vim-tmux-navigator.lua @@ -0,0 +1,19 @@ +return { + { + "christoomey/vim-tmux-navigator", + cmd = { + "TmuxNavigateLeft", + "TmuxNavigateDown", + "TmuxNavigateUp", + "TmuxNavigateRight", + "TmuxNavigatePrevious", + }, + keys = { + { "", "TmuxNavigateLeft" }, + { "", "TmuxNavigateDown" }, + { "", "TmuxNavigateUp" }, + { "", "TmuxNavigateRight" }, + { "", "TmuxNavigatePrevious" }, + }, + }, +} diff --git a/dot_config/nvim/lua/snippets/fish.lua b/dot_config/nvim/lua/snippets/fish.lua new file mode 100644 index 0000000..baec2ee --- /dev/null +++ b/dot_config/nvim/lua/snippets/fish.lua @@ -0,0 +1,104 @@ +local ls = require("luasnip") +local s = ls.snippet +local t = ls.text_node +local i = ls.insert_node +local f = ls.function_node +local fmt = require("luasnip.extras.fmt").fmt +local fill = require("snippets.helpers").fill + +return { + s({ trig = "dc", desc = "divider comment" }, f(fill, {}, { user_args = { "#%- " } })), + + s({ trig = "#!", desc = "shebang" }, t("#!/usr/bin/env fish")), + + s( + { trig = "if", desc = "if ... end" }, + fmt( + [[ + if {} + {} + end + ]], + { i(1), i(0) } + ) + ), + + s( + { trig = "elif", desc = "else if ..." }, + fmt( + [[ + else if {} + {} + ]], + { i(1), i(0) } + ) + ), + + s( + { trig = "fori", desc = "for ... in ... end" }, + fmt( + [[ + for {} in {} + {} + end + ]], + { i(1), i(2), i(0) } + ) + ), + + s( + { trig = "wh", desc = "while ... end" }, + fmt( + [[ + while {} + {} + end + ]], + { i(1), i(0) } + ) + ), + + s( + { trig = "wht", desc = "while true ... end" }, + fmt( + [[ + while true + {} + end + ]], + { i(0) } + ) + ), + + s( + { trig = "sw", desc = "switch ... case ... end" }, + fmt( + [[ + switch {} + case {} + {} + end + ]], + { i(1), i(2), i(0) } + ) + ), + + s( + { trig = "func", desc = "function ... end" }, + fmt( + [[ + function {} + {} + end + ]], + { i(1), i(0) } + ) + ), + + s({ trig = "dn", desc = "&>/dev/null" }, t("&>/dev/null")), + + s( + { trig = "abbr", desc = "abbr -a ... --position ..." }, + fmt('abbr -a {} --position {} "{}"', { i(1), i(2, "command"), i(3) }) + ), +} diff --git a/dot_config/nvim/lua/snippets/gitconfig.lua b/dot_config/nvim/lua/snippets/gitconfig.lua new file mode 100644 index 0000000..088e0ef --- /dev/null +++ b/dot_config/nvim/lua/snippets/gitconfig.lua @@ -0,0 +1,8 @@ +local ls = require("luasnip") +local s = ls.snippet +local f = ls.function_node +local helpers = require("snippets.helpers") + +return { + s({ trig = "dc", desc = "divider comment" }, f(helpers.fill, {}, { user_args = { "#%- " } })), +} diff --git a/dot_config/nvim/lua/snippets/helpers.lua b/dot_config/nvim/lua/snippets/helpers.lua new file mode 100644 index 0000000..03ca79f --- /dev/null +++ b/dot_config/nvim/lua/snippets/helpers.lua @@ -0,0 +1,40 @@ +local ls = require("luasnip") +local sn = ls.snippet_node +local i = ls.insert_node + +local M = {} + +M.fill = function(_, parent, args) + local title = "" + local chars = {} + + if #parent.snippet.env.LS_SELECT_RAW > 0 then + for _, ele in ipairs(parent.snippet.env.LS_SELECT_RAW) do + title = title .. ele .. " " + end + end + + for str in string.gmatch(args, "([^%%]+)") do + table.insert(chars, str) + end + + local snip = chars[1] .. " " .. title + + local _, c = unpack(vim.api.nvim_win_get_cursor(0)) + + while #snip < (vim.bo.tw - c - 1) do + snip = snip .. chars[2] + end + + return snip +end + +M.get_visual = function(_, parent) + if #parent.snippet.env.LS_SELECT_RAW > 0 then + return sn(nil, i(1, parent.snippet.env.LS_SELECT_RAW)) + else -- If LS_SELECT_RAW is empty, return a blank insert node + return sn(nil, i(1)) + end +end + +return M diff --git a/dot_config/nvim/lua/snippets/html.lua b/dot_config/nvim/lua/snippets/html.lua new file mode 100644 index 0000000..5a34b0d --- /dev/null +++ b/dot_config/nvim/lua/snippets/html.lua @@ -0,0 +1,29 @@ +local ls = require("luasnip") +local s = ls.snippet +local i = ls.insert_node +local fmt = require("luasnip.extras.fmt").fmt + +return { + s( + { trig = "sd!", desc = "Saudade page" }, + fmt( + [[ + + + + + {} + + + + + + + {} + + + ]], + { i(1), i(0) } + ) + ), +} diff --git a/dot_config/nvim/lua/snippets/lua.lua b/dot_config/nvim/lua/snippets/lua.lua new file mode 100644 index 0000000..1fb0ca2 --- /dev/null +++ b/dot_config/nvim/lua/snippets/lua.lua @@ -0,0 +1,8 @@ +local ls = require("luasnip") +local s = ls.snippet +local f = ls.function_node +local fill = require("snippets.helpers").fill + +return { + s({ trig = "dc", desc = "divider comment" }, f(fill, {}, { user_args = { "--%-- " } })), +} diff --git a/dot_config/nvim/queries/blade/folds.scm b/dot_config/nvim/queries/blade/folds.scm new file mode 100644 index 0000000..0705d92 --- /dev/null +++ b/dot_config/nvim/queries/blade/folds.scm @@ -0,0 +1,8 @@ +((directive_start) @start + (directive_end) @end.after + (#set! role block)) + + +((bracket_start) @start + (bracket_end) @end + (#set! role block)) diff --git a/dot_config/nvim/queries/blade/highlights.scm b/dot_config/nvim/queries/blade/highlights.scm new file mode 100644 index 0000000..2c9c2cd --- /dev/null +++ b/dot_config/nvim/queries/blade/highlights.scm @@ -0,0 +1,4 @@ +(directive) @tag +(directive_start) @tag +(directive_end) @tag +(comment) @comment @spell diff --git a/dot_config/nvim/queries/blade/injections.scm b/dot_config/nvim/queries/blade/injections.scm new file mode 100644 index 0000000..bd3ead0 --- /dev/null +++ b/dot_config/nvim/queries/blade/injections.scm @@ -0,0 +1,15 @@ +((text) @injection.content + (#not-has-ancestor? @injection.content "envoy") + (#set! injection.combined) + (#set! injection.language php)) + +((text) @injection.content + (#has-ancestor? @injection.content "envoy") + (#set! injection.combined) + (#set! injection.language bash)) + +((php_only) @injection.content + (#set! injection.combined) + (#set! injection.language php_only)) +((parameter) @injection.content + (#set! injection.language php_only)) diff --git a/dot_config/nvim/stylua.toml b/dot_config/nvim/stylua.toml new file mode 100644 index 0000000..5d6c50d --- /dev/null +++ b/dot_config/nvim/stylua.toml @@ -0,0 +1,3 @@ +indent_type = "Spaces" +indent_width = 2 +column_width = 120 \ No newline at end of file diff --git a/dot_config/openrazer/persistence.conf b/dot_config/openrazer/persistence.conf new file mode 100644 index 0000000..6440b21 --- /dev/null +++ b/dot_config/openrazer/persistence.conf @@ -0,0 +1,25 @@ +[PM2038H11502057] +dpi_x = 1800 +dpi_y = 1800 +poll_rate = 500 +logo_active = True +logo_brightness = 75 +logo_effect = spectrum +logo_colors = 0 255 0 0 255 255 0 0 255 +logo_speed = 1 +logo_wave_dir = 1 +scroll_active = True +scroll_brightness = 75 +scroll_effect = spectrum +scroll_colors = 0 255 0 0 255 255 0 0 255 +scroll_speed = 1 +scroll_wave_dir = 1 + +[IO2049F50104914] +backlight_active = True +backlight_brightness = 75 +backlight_effect = wave +backlight_colors = 0 255 0 0 255 255 0 0 255 +backlight_speed = 1 +backlight_wave_dir = 1 + diff --git a/dot_config/openrazer/razer.conf b/dot_config/openrazer/razer.conf new file mode 100644 index 0000000..b4a316b --- /dev/null +++ b/dot_config/openrazer/razer.conf @@ -0,0 +1,23 @@ +[General] +# Verbose logging (logs debug messages - lotsa spam) +verbose_logging = False + + +[Startup] +# Set the sync effects flag to true so any assignment of effects will work across devices +sync_effects_enabled = True + +# Turn off the devices when the systems screensaver kicks in +devices_off_on_screensaver = True + +# Battery notifier +battery_notifier = True + +# Battery notification frequency [s] (0 to disable) +battery_notifier_freq = 600 + +# Battery notifications appear when device reaches this percentage +battery_notifier_percent = 33 + +# Apply effects saved to disk when daemon starts +restore_persistence = False diff --git a/dot_config/packages/all b/dot_config/packages/all new file mode 100644 index 0000000..5cf95f0 --- /dev/null +++ b/dot_config/packages/all @@ -0,0 +1,185 @@ +aic94xx-firmware +alsa-utils +arandr +argparse +asdf-vm +ast-firmware +awesome-git +base +base-devel +bat +bat-extras +bind +bluetuith +bluez +bluez-utils +browsh-bin +btop +catppuccin-cursors-macchiato +catppuccin-gtk-theme-macchiato +cheat-bin +cmake +colord +composer +copyq +cowsay +cpio +ctags +dnsmasq +dunst +efibootmgr +eza +fd +feh +firefox +fish +fontforge +fortune-mod-archlinux +fortune-mod-billwurtz +fzf +gamemode +gd +git +git-delta +git-filter-repo +github-cli +glow +gparted +grub +gum +gvfs-smb +hunspell-en_us +hyfetch +hyphen-en +hyprland +imagemagick +inotify-tools +iptables-nft +jc +jq +lazygit +lib32-gamemode +lib32-vkd3d +libheif +libmythes +libreoffice-fresh +libtransmission +linux +linux-firmware +linux-firmware-qlogic +linux-headers +lolcat +lsof +luarocks +lutris +mailhog-bin +man-db +man-pages +meilisearch +mesa +mopidy +mopidy-alsamixer +mopidy-iris +mopidy-local +mopidy-mpd +mopidy-mpris +mopidy-podcast +mpc +mythes-en +ncmpcpp +neovim +networkmanager +nginx +nm-connection-editor +ntfs-3g +openrazer-daemon +pamixer +papirus-folders-catppuccin-git +papirus-icon-theme +php-fpm +php-mcrypt +php-redis +php-sqlite +php83-iconv +picom-git +pipewire +pipewire-alsa +pipewire-pulse +pkgfile +playerctl +plocate +polkit-kde-agent +postgresql +protonup-qt +python-catppuccin +python-pip +python-pipenv +python-pipx +python-pynvim +qt5-graphicaleffects +qt5-quickcontrols2 +qt5-svg +qt5ct +qt6-wayland +razercommander +re2c +redis +reflector +ripgrep +rofi +rofi-calc +rsync +rust +sddm +shfmt +smbclient +starship +steam +swaylock-effects-git +swww-git +termux-language-server +thunar +timeshift +tmux +topgrade +transmission-cli +transmission-gtk +ttf-apple-emoji +ttf-comic-sans +ttf-fairiesevka +ttf-fairiesevka-propo +ttf-fairiesevka-term +ttf-firacode-nerd +ttf-liberation +ttf-nerd-fonts-symbols +ttfautohint +udisks2 +ufw +unzip +upd72020x-fw +ventoy-bin +vesktop +vkd3d +volta +vulkan-tools +wd719x-firmware +wezterm +wget +wine +wireshark-gtk2 +wishlist-bin +wofi +xclip +xdg-desktop-portal +xdg-desktop-portal-gtk +xdg-desktop-portal-hyprland +xfce4-settings +xorg-server +xorg-server-xephyr +xorg-xinit +xorg-xrandr +xorg-xwayland +xsel +yay +zathura +zathura-pdf-mupdf diff --git a/dot_config/picom.conf b/dot_config/picom.conf new file mode 100644 index 0000000..cef3cc8 --- /dev/null +++ b/dot_config/picom.conf @@ -0,0 +1,498 @@ +################################# +# Animations # +################################# + +animations: false; +animation-stiffness = 125 + +animation-window-mass = 1.0 + +animation-dampening = 18 + +animation-clamping = false + +animation-for-open-window = "zoom"; #open window + +animation-for-unmap-window = "zoom"; #minimize window + +animation-for-workspace-switch-in = "fly-in"; #the windows in the workspace that is coming in + +animation-for-workspace-switch-out = "fly-in"; #the windows in the workspace that are coming out + +animation-for-transient-window = "slide-up"; #popup windows + +################################# +# Shadows # +################################# + + +# Enabled client-side shadows on windows. Note desktop windows +# (windows with '_NET_WM_WINDOW_TYPE_DESKTOP') never get shadow, +# unless explicitly requested using the wintypes option. +# +# shadow = false +shadow = true; + +# The blur radius for shadows, in pixels. (defaults to 12) +# shadow-radius = 12 +shadow-radius = 7; +#shadow-radius = 0; +# The opacity of shadows. (0.0 - 1.0, defaults to 0.75) +#shadow-opacity = 0 + +# The left offset for shadows, in pixels. (defaults to -15) +# shadow-offset-x = -15 +shadow-offset-x = -7; + +# The top offset for shadows, in pixels. (defaults to -15) +# shadow-offset-y = -15 +shadow-offset-y = -7; + +# Avoid drawing shadows on dock/panel windows. This option is deprecated, +# you should use the *wintypes* option in your config file instead. +# +# no-dock-shadow = false + +# Don't draw shadows on drag-and-drop windows. This option is deprecated, +# you should use the *wintypes* option in your config file instead. +# +# no-dnd-shadow = false + +# Red color value of shadow (0.0 - 1.0, defaults to 0). +# shadow-red = 0 + +# Green color value of shadow (0.0 - 1.0, defaults to 0). +# shadow-green = 0 + +# Blue color value of shadow (0.0 - 1.0, defaults to 0). +# shadow-blue = 0 + +# Do not paint shadows on shaped windows. Note shaped windows +# here means windows setting its shape through X Shape extension. +# Those using ARGB background is beyond our control. +# Deprecated, use +# shadow-exclude = 'bounding_shaped' +# or +# shadow-exclude = 'bounding_shaped && !rounded_corners' +# instead. +# +# shadow-ignore-shaped = '' + +# Specify a list of conditions of windows that should have no shadow. +# +# examples: +# shadow-exclude = "n:e:Notification"; +# +# shadow-exclude = [] +shadow-exclude = [ + "name = 'Notification'", + "class_g = 'Conky'", + "class_g = 'slop'", + "class_g = 'origin.exe'", + "class_g ?= 'Notify-osd'", + "class_g = 'Cairo-clock'", + "_GTK_FRAME_EXTENTS@:c" +]; + +# Specify a X geometry that describes the region in which shadow should not +# be painted in, such as a dock window region. Use +# shadow-exclude-reg = "x10+0+0" +# for example, if the 10 pixels on the bottom of the screen should not have shadows painted on. +# +# shadow-exclude-reg = "" + +# Crop shadow of a window fully on a particular Xinerama screen to the screen. +# xinerama-shadow-crop = false + + +################################# +# Fading # +################################# + + +# Fade windows in/out when opening/closing and when opacity changes, +# unless no-fading-openclose is used. +# fading = false +fading = true + +# Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028) +# fade-in-step = 0.028 +fade-in-step = 0.03; + +# Opacity change between steps while fading out. (0.01 - 1.0, defaults to 0.03) +# fade-out-step = 0.03 +fade-out-step = 0.03; + +# The time between steps in fade step, in milliseconds. (> 0, defaults to 10) +# fade-delta = 10 + +# Specify a list of conditions of windows that should not be faded. +fade-exclude = [ + "class_g = 'slop'", #maim + "class_g = 'origin.exe'", +] + +# Do not fade on window open/close. +# no-fading-openclose = false + +# Do not fade destroyed ARGB windows with WM frame. Workaround of bugs in Openbox, Fluxbox, etc. +# no-fading-destroyed-argb = false + + +################################# +# Transparency / Opacity # +################################# + + +# Opacity of inactive windows. (0.1 - 1.0, defaults to 1.0) +# inactive-opacity = 1 +inactive-opacity = 0.68; + +# Opacity of window titlebars and borders. (0.1 - 1.0, disabled by default) + frame-opacity = 1.0 +#frame-opacity = 0.7; + +# Default opacity for dropdown menus and popup menus. (0.0 - 1.0, defaults to 1.0) +# menu-opacity = 1.0 + +# Let inactive opacity set by -i override the '_NET_WM_OPACITY' values of windows. +# inactive-opacity-override = true +inactive-opacity-override = true; + +# Default opacity for active windows. (0.0 - 1.0, defaults to 1.0) +active-opacity = 0.92; + +# Dim inactive windows. (0.0 - 1.0, defaults to 0.0) +# inactive-dim = 0.0 + +# Specify a list of conditions of windows that should always be considered focused. +# focus-exclude = [] +focus-exclude = [ + "class_g = 'awesome'", + "class_g = 'Cairo-clock'", + "class_g = 'Rofi'", + "class_g = 'firefox'", + "class_g = 'Firefox'", + "class_g = 'VSCodium'", + "class_g = 'feh'", + "class_g = 'Thunar'", + "class_g = 'slop'", + "class_g = 'origin.exe'", + "class_g = 'Virt-manager'", + "class_g = 'discord'", + "class_g = 'steam_app_0'", + "class_g = 'SlimeRancher2.exe'", + "class_g = 'Steam'", + "class_g = 'origin.exe'", + "class_g = 'Minecraft 1.8.9'", + "class_g = 'VirtualBox Machine'", + "class_g = 'Wine'", +]; + +# Use fixed inactive dim value, instead of adjusting according to window opacity. +# inactive-dim-fixed = 1.0 + +# Specify a list of opacity rules, in the format `PERCENT:PATTERN`, +# like `50:name *= "Firefox"`. picom-trans is recommended over this. +# Note we don't make any guarantee about possible conflicts with other +# programs that set '_NET_WM_WINDOW_OPACITY' on frame or client windows. +# example: +# opacity-rule = [ "80:class_g = 'URxvt'" ]; +# + opacity-rule = [ + "100:class_g= 'awesome'", + "100:class_g= 'Rofi'", + "95:class_g= 'URxvt'", + "100:class_g= 'firefox'", + "100:class_g= 'Firefox'", + "100:class_g= 'VSCodium'", + "100:class_g= 'feh'", + "100:class_g= 'Thunar'", + "100:class_g= 'slop'", + "100:class_g= 'Virt-manager'", + "100:class_g= 'discord'", + "100:class_g= 'steam_app_0'", + "100:class_g= 'Steam'", + "100:class_g= 'origin.exe'", + "100:class_g= 'bf1.exe'", + "100:class_g= 'Minecraft 1.8.9'", + "100:class_g= 'SlimeRancher2.exe'", + "100:class_g= 'VirtualBox Machine'", + "100:class_g= 'Wine'", +]; + + +################################# +# Background-Blurring # +################################# + + +# Parameters for background blurring, see the *BLUR* section for more information. +# blur-method = +blur-method = "dual_kawase" +blur-size = 30 +# +# blur-deviation = false + +# Blur background of semi-transparent / ARGB windows. +# Bad in performance, with driver-dependent behavior. +# The name of the switch may change without prior notifications. +# +# blur-background = false + +# Blur background of windows when the window frame is not opaque. +# Implies: +# blur-background +# Bad in performance, with driver-dependent behavior. The name may change. +# +# blur-background-frame = false + + +# Use fixed blur strength rather than adjusting according to window opacity. +# blur-background-fixed = false + + +# Specify the blur convolution kernel, with the following format: +# example: +# blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"; +# +# blur-kern = '' +blur-kern = "11x11gaussian"; + + +# Exclude conditions for background blur. +# blur-background-exclude = [] +blur-background-exclude = [ + "window_type = 'dock'", + "class_g = 'origin.exe'", + "class_g = 'slop'", # Very important for screenshot, if set else won't work + "window_type = 'desktop'", + "_GTK_FRAME_EXTENTS@:c" +]; + +################################# +# General Settings # +################################# + +# Daemonize process. Fork to background after initialization. Causes issues with certain (badly-written) drivers. +# daemon = false + +# Specify the backend to use: `xrender`, `glx`, or `xr_glx_hybrid`. +# `xrender` is the default one. +# +#backend = "xrender"; +backend = "glx"; + +# Enable/disable VSync. +#vsync = false +vsync = true + +# Enable remote control via D-Bus. See the *D-BUS API* section below for more details. +# dbus = false + +# Try to detect WM windows (a non-override-redirect window with no +# child that has 'WM_STATE') and mark them as active. +# +# mark-wmwin-focused = false +mark-wmwin-focused = true; + +# Mark override-redirect windows that doesn't have a child window with 'WM_STATE' focused. +mark-ovredir-focused = false +#mark-ovredir-focused = true; + +# Try to detect windows with rounded corners and don't consider them +# shaped windows. The accuracy is not very high, unfortunately. +# +# detect-rounded-corners = false + +detect-rounded-corners = true; + +# Detect '_NET_WM_OPACITY' on client windows, useful for window managers +# not passing '_NET_WM_OPACITY' of client windows to frame windows. +# +# detect-client-opacity = false +detect-client-opacity = true; + +# Limit picom to repaint at most once every 1 / 'refresh_rate' second to +# boost performance. This should not be used with +# vsync drm/opengl/opengl-oml +# as they essentially does sw-opti's job already, +# unless you wish to specify a lower refresh rate than the actual value. +# +# sw-opti = + +# Use EWMH '_NET_ACTIVE_WINDOW' to determine currently focused window, +# rather than listening to 'FocusIn'/'FocusOut' event. Might have more accuracy, +# provided that the WM supports it. +# +# use-ewmh-active-win = false + +# Unredirect all windows if a full-screen opaque window is detected, +# to maximize performance for full-screen windows. Known to cause flickering +# when redirecting/unredirecting windows. +# +# unredir-if-possible = false + +# Delay before unredirecting the window, in milliseconds. Defaults to 0. +# unredir-if-possible-delay = 0 + +# Conditions of windows that shouldn't be considered full-screen for unredirecting screen. +# unredir-if-possible-exclude = [] + +# Use 'WM_TRANSIENT_FOR' to group windows, and consider windows +# in the same group focused at the same time. +# +# detect-transient = false +detect-transient = true + +# Use 'WM_CLIENT_LEADER' to group windows, and consider windows in the same +# group focused at the same time. 'WM_TRANSIENT_FOR' has higher priority if +# detect-transient is enabled, too. +# +# detect-client-leader = false +detect-client-leader = true + +# Resize damaged region by a specific number of pixels. +# A positive value enlarges it while a negative one shrinks it. +# If the value is positive, those additional pixels will not be actually painted +# to screen, only used in blur calculation, and such. (Due to technical limitations, +# with use-damage, those pixels will still be incorrectly painted to screen.) +# Primarily used to fix the line corruption issues of blur, +# in which case you should use the blur radius value here +# (e.g. with a 3x3 kernel, you should use `--resize-damage 1`, +# with a 5x5 one you use `--resize-damage 2`, and so on). +# May or may not work with *--glx-no-stencil*. Shrinking doesn't function correctly. +# +# resize-damage = 1 + +# Specify a list of conditions of windows that should be painted with inverted color. +# Resource-hogging, and is not well tested. +# +# invert-color-include = [] + +# GLX backend: Avoid using stencil buffer, useful if you don't have a stencil buffer. +# Might cause incorrect opacity when rendering transparent content (but never +# practically happened) and may not work with blur-background. +# My tests show a 15% performance boost. Recommended. +# +# glx-no-stencil = false + +# GLX backend: Avoid rebinding pixmap on window damage. +# Probably could improve performance on rapid window content changes, +# but is known to break things on some drivers (LLVMpipe, xf86-video-intel, etc.). +# Recommended if it works. +# +# glx-no-rebind-pixmap = false + +# Disable the use of damage information. +# This cause the whole screen to be redrawn everytime, instead of the part of the screen +# has actually changed. Potentially degrades the performance, but might fix some artifacts. +# The opposing option is use-damage +# +# no-use-damage = false +use-damage = true + +# Use X Sync fence to sync clients' draw calls, to make sure all draw +# calls are finished before picom starts drawing. Needed on nvidia-drivers +# with GLX backend for some users. +# +# xrender-sync-fence = tue + +# GLX backend: Use specified GLSL fragment shader for rendering window contents. +# See `compton-default-fshader-win.glsl` and `compton-fake-transparency-fshader-win.glsl` +# in the source tree for examples. +# +# glx-fshader-win = '' + +# Force all windows to be painted with blending. Useful if you +# have a glx-fshader-win that could turn opaque pixels transparent. +# +# force-win-blend = false + +# Do not use EWMH to detect fullscreen windows. +# Reverts to checking if a window is fullscreen based only on its size and coordinates. +# +# no-ewmh-fullscreen = false + +# Dimming bright windows so their brightness doesn't exceed this set value. +# Brightness of a window is estimated by averaging all pixels in the window, +# so this could comes with a performance hit. +# Setting this to 1.0 disables this behaviour. Requires --use-damage to be disabled. (default: 1.0) +# +# max-brightness = 1.0 + +# Make transparent windows clip other windows like non-transparent windows do, +# instead of blending on top of them. +# +# transparent-clipping = false + +# Set the log level. Possible values are: +# "trace", "debug", "info", "warn", "error" +# in increasing level of importance. Case doesn't matter. +# If using the "TRACE" log level, it's better to log into a file +# using *--log-file*, since it can generate a huge stream of logs. +# +# log-level = "debug" +log-level = "warn"; + +# Set the log file. +# If *--log-file* is never specified, logs will be written to stderr. +# Otherwise, logs will to written to the given file, though some of the early +# logs might still be written to the stderr. +# When setting this option from the config file, it is recommended to use an absolute path. +# +# log-file = '/path/to/your/log/file' + +# Show all X errors (for debugging) +# show-all-xerrors = false + +# Write process ID to a file. +# write-pid-path = '/path/to/your/log/file' + +# Window type settings +# +# 'WINDOW_TYPE' is one of the 15 window types defined in EWMH standard: +# "unknown", "desktop", "dock", "toolbar", "menu", "utility", +# "splash", "dialog", "normal", "dropdown_menu", "popup_menu", +# "tooltip", "notification", "combo", and "dnd". +# +# Following per window-type options are available: :: +# +# fade, shadow::: +# Controls window-type-specific shadow and fade settings. +# +# opacity::: +# Controls default opacity of the window type. +# +# focus::: +# Controls whether the window of this type is to be always considered focused. +# (By default, all window types except "normal" and "dialog" has this on.) +# +# full-shadow::: +# Controls whether shadow is drawn under the parts of the window that you +# normally won't be able to see. Useful when the window has parts of it +# transparent, and you want shadows in those areas. +# +# redir-ignore::: +# Controls whether this type of windows should cause screen to become +# redirected again after been unredirected. If you have unredir-if-possible +# set, and doesn't want certain window to cause unnecessary screen redirection, +# you can set this to `true`. +# +wintypes: +{ + tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; }; + dock = { shadow = false; } + dnd = { shadow = false; } + popup_menu = { opacity = 0.8; } + dropdown_menu = { opacity = 0.8; } +}; + +corner-radius = 12.0; +round-borders = 1; +rounded-corners-exclude = [ + "class_g = 'polybar'", + "class_g = 'awesome'", + "class_g = 'origin.exe'", + "window_type = 'dock'" +]; diff --git a/dot_config/qalculate/qalc.cfg b/dot_config/qalculate/qalc.cfg new file mode 100644 index 0000000..0397b91 --- /dev/null +++ b/dot_config/qalculate/qalc.cfg @@ -0,0 +1,84 @@ + +[General] +version=4.9.0 +save_mode_on_exit=1 +save_definitions_on_exit=1 +clear_history_on_exit=0 +ignore_locale=0 +colorize=1 +auto_update_exchange_rates=-1 +spacious=1 +vertical_space=1 +excessive_parenthesis=0 +short_multiplication=1 +use_unicode_signs=1 +use_unicode_exponents=1 +lower_case_numbers=0 +duodecimal_symbols=0 +lower_case_e=0 +imaginary_j=0 +base_display=1 +twos_complement=1 +hexadecimal_twos_complement=0 +spell_out_logical_operators=1 +digit_grouping=0 +decimal_comma=-1 +dot_as_separator=-1 +comma_as_separator=0 +multiplication_sign=2 +division_sign=0 + +[Mode] +min_deci=0 +use_min_deci=0 +max_deci=2 +use_max_deci=0 +precision=10 +interval_arithmetic=1 +interval_display=0 +min_exp=-1 +negative_exponents=0 +sort_minus_last=1 +number_fraction_format=-1 +complex_number_form=0 +use_prefixes=1 +use_prefixes_for_all_units=0 +use_prefixes_for_currencies=0 +use_binary_prefixes=0 +abbreviate_names=1 +all_prefixes_enabled=0 +denominator_prefix_enabled=1 +place_units_separately=1 +auto_post_conversion=3 +mixed_units_conversion=3 +local_currency_conversion=1 +number_base=10 +number_base_expression=10 +read_precision=0 +assume_denominators_nonzero=1 +warn_about_denominators_assumed_nonzero=1 +structuring=1 +angle_unit=1 +caret_as_xor=0 +concise_uncertainty_input=0 +functions_enabled=1 +variables_enabled=1 +calculate_variables=1 +calculate_functions=1 +variable_units_enabled=1 +sync_units=1 +unknownvariables_enabled=0 +units_enabled=1 +allow_complex=1 +allow_infinite=1 +indicate_infinite_series=0 +show_ending_zeroes=1 +rounding_mode=0 +approximation=-1 +interval_calculation=1 +in_rpn_mode=0 +rpn_syntax=0 +limit_implicit_multiplication=0 +parsing_mode=0 +default_assumption_type=4 +default_assumption_sign=0 diff --git a/dot_config/razercommander/macro_logic.json b/dot_config/razercommander/macro_logic.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/dot_config/razercommander/macro_logic.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/dot_config/razercommander/profiles b/dot_config/razercommander/profiles new file mode 100644 index 0000000..0176222 --- /dev/null +++ b/dot_config/razercommander/profiles @@ -0,0 +1 @@ +[{"name": "Empty", "colors": [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]}, {"name": "ESO", "colors": [[0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.7529411764705882, 0.10980392156862745, 0.1568627450980392], [0.7529411764705882, 0.10980392156862745, 0.1568627450980392], [0.7529411764705882, 0.10980392156862745, 0.1568627450980392], [0.7529411764705882, 0.10980392156862745, 0.1568627450980392], [0.7529411764705882, 0.10980392156862745, 0.1568627450980392], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.9019607843137255, 0.3803921568627451, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.5058823529411764, 0.23921568627450981, 0.611764705882353], [0.0, 0.0, 0.0], [0.9019607843137255, 0.3803921568627451, 0.0], [0.7529411764705882, 0.10980392156862745, 0.1568627450980392], [0.5058823529411764, 0.23921568627450981, 0.611764705882353], [0.9019607843137255, 0.3803921568627451, 0.0], [0.7529411764705882, 0.10980392156862745, 0.1568627450980392], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.5058823529411764, 0.23921568627450981, 0.611764705882353], [0.5058823529411764, 0.23921568627450981, 0.611764705882353], [0.5058823529411764, 0.23921568627450981, 0.611764705882353], [0.9019607843137255, 0.3803921568627451, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.5058823529411764, 0.23921568627450981, 0.611764705882353], [0.7529411764705882, 0.10980392156862745, 0.1568627450980392], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.9019607843137255, 0.3803921568627451, 0.0], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.9019607843137255, 0.3803921568627451, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.5058823529411764, 0.23921568627450981, 0.611764705882353], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.5058823529411764, 0.23921568627450981, 0.611764705882353], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355], [0.1803921568627451, 0.7607843137254902, 0.49411764705882355]]}] \ No newline at end of file diff --git a/dot_config/rofi/config.rasi b/dot_config/rofi/config.rasi new file mode 100644 index 0000000..8719876 --- /dev/null +++ b/dot_config/rofi/config.rasi @@ -0,0 +1,29 @@ +configuration { + modi: "window,run,drun,calc"; + icon-theme: "Papirus"; + show-icons: true; + terminal: "wezterm"; + drun-display-format: "{icon} {name}"; + location: 0; + disable-history: false; + hide-scrollbar: true; + display-drun: "  Apps "; + display-run: "  Run "; + display-window: " 󰕰 Window "; + display-Network: " 󰤨 Network "; + display-calc: " 󰪚 Calc "; + sidebar-mode: true; +} + +@theme "catppuccin-macchiato" + +* { + blue: #f5bde6; + border-col: @blue; + font: "FairiesevkaSans Nerd Font Propo 12"; +} + +window { + border: 1px; + border-radius: 12px; +} diff --git a/dot_config/starship.toml b/dot_config/starship.toml new file mode 100644 index 0000000..aa7775e --- /dev/null +++ b/dot_config/starship.toml @@ -0,0 +1,215 @@ +"$schema" = 'https://starship.rs/config-schema.json' + +palette = "catppuccin_mocha" + +[character] +success_symbol = "[[](pink) ](green)" +error_symbol = "[❯](red)" +vimcmd_symbol = "[❮](green)" +vimcmd_replace_one_symbol = "[❮](green)" +vimcmd_replace_symbol = "[❮](green)" +vimcmd_visual_symbol = "[❮](peach)" + +[status] +disabled = false +style = 'red' +symbol = '✗' +not_executable_symbol = '' +not_found_symbol = '' +sigint_symbol = '󱠰' +signal_symbol = '󱐋' + +[sudo] +disabled = false +style = 'blue' +symbol = '󰌋 ' + +[palettes.catppuccin_mocha] +rosewater = "#f5e0dc" +flamingo = "#f2cdcd" +pink = "#f5c2e7" +mauve = "#cba6f7" +red = "#f38ba8" +maroon = "#eba0ac" +peach = "#fab387" +yellow = "#f9e2af" +green = "#a6e3a1" +teal = "#94e2d5" +sky = "#89dceb" +sapphire = "#74c7ec" +blue = "#89b4fa" +lavender = "#b4befe" +text = "#cdd6f4" +subtext1 = "#bac2de" +subtext0 = "#a6adc8" +overlay2 = "#9399b2" +overlay1 = "#7f849c" +overlay0 = "#6c7086" +surface2 = "#585b70" +surface1 = "#45475a" +surface0 = "#313244" +base = "#1e1e2e" +mantle = "#181825" +crust = "#11111b" + +# Presets - NerdFonts +[aws] +symbol = " " + +[buf] +symbol = " " + +[c] +symbol = " " + +[conda] +symbol = " " + +[crystal] +symbol = " " + +[dart] +symbol = " " + +[directory] +read_only = " 󰌾" + +[docker_context] +symbol = " " + +[elixir] +symbol = " " + +[elm] +symbol = " " + +[fennel] +symbol = " " + +[fossil_branch] +symbol = " " + +[git_branch] +symbol = " " + +[golang] +symbol = " " + +[guix_shell] +symbol = " " + +[haskell] +symbol = " " + +[haxe] +symbol = " " + +[hg_branch] +symbol = " " + +[hostname] +ssh_symbol = " " + +[java] +symbol = " " + +[julia] +symbol = " " + +[kotlin] +symbol = " " + +[lua] +symbol = " " + +[memory_usage] +symbol = "󰍛 " + +[meson] +symbol = "󰔷 " + +[nim] +symbol = "󰆥 " + +[nix_shell] +symbol = " " + +[nodejs] +symbol = " " + +[ocaml] +symbol = " " + +[os.symbols] +Alpaquita = " " +Alpine = " " +Amazon = " " +Android = " " +Arch = " " +Artix = " " +CentOS = " " +Debian = " " +DragonFly = " " +Emscripten = " " +EndeavourOS = " " +Fedora = " " +FreeBSD = " " +Garuda = "󰛓 " +Gentoo = " " +HardenedBSD = "󰞌 " +Illumos = "󰈸 " +Linux = " " +Mabox = " " +Macos = " " +Manjaro = " " +Mariner = " " +MidnightBSD = " " +Mint = " " +NetBSD = " " +NixOS = " " +OpenBSD = "󰈺 " +openSUSE = " " +OracleLinux = "󰌷 " +Pop = " " +Raspbian = " " +Redhat = " " +RedHatEnterprise = " " +Redox = "󰀘 " +Solus = "󰠳 " +SUSE = " " +Ubuntu = " " +Unknown = " " +Windows = "󰍲 " + +[package] +symbol = "󰏗 " + +[perl] +symbol = " " + +[php] +symbol = " " + +[pijul_channel] +symbol = " " + +[python] +symbol = " " + +[rlang] +symbol = "󰟔 " + +[ruby] +symbol = " " + +[rust] +symbol = " " + +[scala] +symbol = " " + +[swift] +symbol = " " + +[zig] +symbol = " " diff --git a/dot_config/tmux/tmux.conf b/dot_config/tmux/tmux.conf new file mode 100644 index 0000000..f5c4387 --- /dev/null +++ b/dot_config/tmux/tmux.conf @@ -0,0 +1,151 @@ +################################################################################ +# Plugins # +################################################################################ + +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'tmux-plugins/tmux-sensible' +#set -g @plugin 'tmux-plugins/tmux-resurrect' +#set -g @plugin 'tmux-plugins/tmux-continuum' +set -g @plugin 'catppuccin/tmux' + +################################################################################ +# General # +################################################################################ + +# Set shell to fish. +set -g default-shell /bin/fish + +# Make window index start at 1. +set -g base-index 1 + +# Make pane index start at 1. +setw -g pane-base-index 1 + +# Automatically renumber windows when one is deleted. +set -g renumber-windows on + +set -g default-terminal "tmux-256color" +set -ag terminal-overrides ",*:RGB" + +set -g @continuum-boot 'on' +set -g @continuum-restore 'on' + +################################################################################ +# Key Mappings # +################################################################################ + +# Remap prefix. +unbind C-b +set-option -g prefix C-a +bind C-a send-prefix + +# Easy reload config. +bind r source-file ~/.config/tmux/tmux.conf \; display-message "Reloaded ~/.config/tmux/tmux.conf" + +# Better split commands. +bind -N 'vsplit' | split-window -h -c "#{pane_current_path}" +bind -N 'vsplit' \\ split-window -h -c "#{pane_current_path}" +bind -N 'hsplit' - split-window -v -c "#{pane_current_path}" +unbind '"' +unbind % + +# Smart pane switching with awareness of vim/fzf. +IS_VIM="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" +IS_FZF="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?fzf$'" + +bind -n -N 'Switch to pane (left)' C-h if-shell "${IS_VIM} || ${IS_FZF}" 'send C-h' 'select-pane -L' +bind -n -N 'Switch to pane (down)' C-j if-shell "${IS_VIM} || ${IS_FZF}" 'send C-j' 'select-pane -D' +bind -n -N 'Switch to pane (up)' C-k if-shell "${IS_VIM} || ${IS_FZF}" 'send C-k' 'select-pane -U' +bind -n -N 'Switch to pane (right)' C-l if-shell "${IS_VIM} || ${IS_FZF}" 'send C-l' 'select-pane -R' + +# Copy-mode. +bind -T copy-mode-vi -N 'Copy mode: switch to pane (left)' C-h if-shell "${IS_VIM} || ${IS_FZF}" 'send C-h' 'select-pane -L' +bind -T copy-mode-vi -N 'Copy mode: Switch to pane (down)' C-j if-shell "${IS_VIM} || ${IS_FZF}" 'send C-j' 'select-pane -D' +bind -T copy-mode-vn -N 'Copy mode: Switch to pane (up)' C-k if-shell "${IS_VIM} || ${IS_FZF}" 'send C-k' 'select-pane -U' +bind -T copy-mode-vn -N 'Copy mode: Switch to pane (right)' C-l if-shell "${IS_VIM} || ${IS_FZF}" 'send C-l' 'select-pane -R' + +# Vi-like resizing. +bind -r -N 'Resize pane (left)' M-h resize-pane -L 5 +bind -r -N 'Resize pane (down)' M-j resize-pane -D 5 +bind -r -N 'Resize pane (up)' M-k resize-pane -U 5 +bind -r -N 'Resize pane (right)' M-l resize-pane -R 5 + +# Even out panes. +bind -N 'Evenly distribute panes' = select-layout -E + +# Swap panes. +bind -r -N 'Swap current pane with the next' H swap-pane -U +bind -r -N 'Swap current pane with the previous' L swap-pane -D + +# Window switching. +bind -N 'Previous window' Left previous-window +bind -N 'Next window' Right next-window + +# Popup. +unbind i +bind -N 'Popup shell' i if-shell -F '#{==:#{session_name},scratch}' { + detach-client + } { + if-shell "tmux has-session -t scratch" { + display-popup -E -h 90% -w 90% "tmux attach-session -t scratch" + } { + display-popup -E -h 90% -w 90% "tmux new-session -d -c '#{pane_current_path}' -s scratch && tmux set-option -t scratch status off && tmux attach-session -t scratch" + } +} + +# Vi copy mode. +setw -g mode-keys vi +set -g set-clipboard external + +unbind [ +bind -N 'Enter normal (copy) mode' Escape copy-mode + +unbind p +bind p paste-buffer + +bind -T copy-mode-vi v send -X begin-selection +bind -T copy-mode-vi y send -X copy-pipe-and-cancel 'copyq copy -' +bind -T copy-mode-vi ? command-prompt -p '?' 'send -X search-backward %1' +bind -T copy-mode-vi / command-prompt -p '/' 'send -X search-forward %1' +bind -T copy-mode-vi q send -X cancel +bind -T copy-mode-vi Escape if-shell -F '#{selection_present}' 'send -X clear-selection' 'send -X cancel' + +################################################################################ +# Catppuccin # +################################################################################ + +# catppuccin +set -g @catppuccin_flavour 'macchiato' + +set -g @catppuccin_window_left_separator "" +set -g @catppuccin_window_right_separator " " +set -g @catppuccin_window_middle_separator " █" +set -g @catppuccin_window_number_position "right" + +set -g @catppuccin_window_default_fill "number" +set -g @catppuccin_window_default_text "#W" + +set -g @catppuccin_window_current_fill "number" +set -g @catppuccin_window_current_text "#W" + +set -g @catppuccin_status_modules_right "directory user host session" +set -g @catppuccin_status_left_separator " " +set -g @catppuccin_status_right_separator "" +set -g @catppuccin_status_right_separator_inverse "no" +set -g @catppuccin_status_fill "icon" +set -g @catppuccin_status_connect_separator "no" + +set -g @catppuccin_directory_text "#{pane_current_path}" +set -g @catppuccin_date_time_text "%b %d • %I:%M %p" + +################################################################################ +# tpm # +################################################################################ + +# Install tpm if not already installed. +if "test ! -d ~/.config/tmux/plugins/tpm" \ + "run 'git clone https://github.com/tmux-plugins/tpm ~/.config/tmux/plugins/tpm && ~/.config/tmux/plugins/tpm/bin/install_plugins'" + +# Init tmux plugin manager. +# Must be very last line!! +run '~/.config/tmux/plugins/tpm/tpm' diff --git a/dot_config/topgrade.d/00-misc.toml b/dot_config/topgrade.d/00-misc.toml new file mode 100644 index 0000000..263e024 --- /dev/null +++ b/dot_config/topgrade.d/00-misc.toml @@ -0,0 +1,68 @@ +[misc] +# Run `sudo -v` to cache credentials at the start of the run +# This avoids a blocking password prompt in the middle of an unattended run +# (default: false) +# pre_sudo = false + +# Sudo command to be used +# sudo_command = "sudo" + +# Disable specific steps - same options as the command line flag +disable = ["pnpm"] + +# Ignore failures for these steps +# ignore_failures = ["powershell"] + +# List of remote machines with Topgrade installed on them +# remote_topgrades = ["toothless", "pi", "parnas"] + +# Path to Topgrade executable on remote machines +# remote_topgrade_path = ".cargo/bin/topgrade" + +# Arguments to pass to SSH when upgrading remote systems +# ssh_arguments = "-o ConnectTimeout=2" + +# Arguments to pass tmux when pulling Repositories +# tmux_arguments = "-S /var/tmux.sock" + +# Do not set the terminal title (default: true) +# set_title = true + +# Display the time in step titles (default: true) +# display_time = true + +# Don't ask for confirmations (no default value) +# assume_yes = true + +# Do not ask to retry failed steps (default: false) +# no_retry = true + +# Run inside tmux (default: false) +# run_in_tmux = true + +# Cleanup temporary or old files (default: false) +cleanup = true + +# Send a notification for every step (default: false) +# notify_each_step = false + +# Skip sending a notification at the end of a run (default: false) +# skip_notify = true + +# The Bash-it branch to update (default: "stable") +# bashit_branch = "stable" + +# Run specific steps - same options as the command line flag +# only = ["system", "emacs"] + +# Whether to self update +# +# this will be ignored if the binary is built without self update support +# +# available also via setting the environment variable TOPGRADE_NO_SELF_UPGRADE) +# no_self_update = true + +# Extra tracing filter directives +# These are prepended to the `--log-filter` argument +# See: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives +# log_filters = ["topgrade::command=debug", "warn"] diff --git a/dot_config/topgrade.d/01-commands.toml b/dot_config/topgrade.d/01-commands.toml new file mode 100644 index 0000000..b51b0fc --- /dev/null +++ b/dot_config/topgrade.d/01-commands.toml @@ -0,0 +1,15 @@ +# Commands to run before anything +[pre_commands] +# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak" + + +# Commands to run after anything +[post_commands] +# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak" + + +# Custom commands +[commands] +"Fish Shell Completions" = "fish_update_completions" +"Update dotfiles dependencies" = "dotfiles submodule update --init --recursive" +"Update package list" = "yay -Qeq > ~/.config/packages/all && set_color green && printf '%s'  && set_color normal && printf '%s' ' done\n'" diff --git a/dot_config/topgrade.d/10-brew.toml b/dot_config/topgrade.d/10-brew.toml new file mode 100644 index 0000000..a6e54a4 --- /dev/null +++ b/dot_config/topgrade.d/10-brew.toml @@ -0,0 +1,19 @@ +[brew] +# For the BrewCask step +# If `Repo Cask Upgrade` exists, then use the `-a` option. +# Otherwise, use the `--greedy` option. +# greedy_cask = true + +# For the BrewCask step +# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` optoin. +# NOTE: the above entry `greedy_cask` contains this entry, though you can enable +# both of them, they won't clash with each other. +# greedy_latest = true + +# For the BrewFormula step +# Execute `brew autoremove` after the step. +autoremove = true + +# For the BrewFormula step +# Upgrade formulae built from the HEAD branch; `brew upgrade --fetch-HEAD` +# fetch_head = true diff --git a/dot_config/topgrade.d/10-composer.toml b/dot_config/topgrade.d/10-composer.toml new file mode 100644 index 0000000..ab92cec --- /dev/null +++ b/dot_config/topgrade.d/10-composer.toml @@ -0,0 +1,2 @@ +[composer] +# self_update = true diff --git a/dot_config/topgrade.d/10-firmware.toml b/dot_config/topgrade.d/10-firmware.toml new file mode 100644 index 0000000..d96eaba --- /dev/null +++ b/dot_config/topgrade.d/10-firmware.toml @@ -0,0 +1,3 @@ +[firmware] +# Offer to update firmware; if false just check for and display available updates +# upgrade = true diff --git a/dot_config/topgrade.d/10-git.toml b/dot_config/topgrade.d/10-git.toml new file mode 100644 index 0000000..b986166 --- /dev/null +++ b/dot_config/topgrade.d/10-git.toml @@ -0,0 +1,15 @@ +[git] +# How many repos to pull at max in parallel +# max_concurrency = 5 + +# Additional git repositories to pull +# repos = [ +# "~/src/*/", +# "~/.config/something" +# ] + +# Don't pull the predefined git repos +# pull_predefined = false + +# Arguments to pass Git when pulling Repositories +# arguments = "--rebase --autostash" diff --git a/dot_config/topgrade.d/10-linux.toml b/dot_config/topgrade.d/10-linux.toml new file mode 100644 index 0000000..7f8a97f --- /dev/null +++ b/dot_config/topgrade.d/10-linux.toml @@ -0,0 +1,43 @@ +[linux] +# Arch Package Manager to use. +# Allowed values: +# autodetect, aura, garuda_update, pacman, pamac, paru, pikaur, trizen, yay +arch_package_manager = "yay" + +# Arguments to pass yay (or paru) when updating packages +# yay_arguments = "--nodevel" + +# Arguments to pass dnf when updating packages +# dnf_arguments = "--refresh" + +# aura_aur_arguments = "-kx" + +# aura_pacman_arguments = "" +# garuda_update_arguments = "" + +# show_arch_news = true + +# trizen_arguments = "--devel" + +# pikaur_arguments = "" + +# pamac_arguments = "--no-devel" + +# enable_tlmgr = true + +# emerge_sync_flags = "-q" + +# emerge_update_flags = "-uDNa --with-bdeps=y world" + +# redhat_distro_sync = false + +# suse_dup = false + +# rpm_ostree = false + +# nix_arguments = "--flake" + +# nix_env_arguments = "--prebuilt-only" + +# Extra Home Manager arguments +# home_manager_arguments = ["--flake", "file"] diff --git a/dot_config/topgrade.d/10-npm.toml b/dot_config/topgrade.d/10-npm.toml new file mode 100644 index 0000000..f30d57c --- /dev/null +++ b/dot_config/topgrade.d/10-npm.toml @@ -0,0 +1,3 @@ +[npm] +# Use sudo if the NPM directory isn't owned by the current user +# use_sudo = true diff --git a/dot_config/transmission/settings.json b/dot_config/transmission/settings.json new file mode 100644 index 0000000..2f4e827 --- /dev/null +++ b/dot_config/transmission/settings.json @@ -0,0 +1,119 @@ +{ + "alt-speed-down": 50, + "alt-speed-enabled": false, + "alt-speed-time-begin": 540, + "alt-speed-time-day": 127, + "alt-speed-time-enabled": false, + "alt-speed-time-end": 1020, + "alt-speed-up": 50, + "announce-ip": "", + "announce-ip-enabled": false, + "anti-brute-force-enabled": false, + "anti-brute-force-threshold": 100, + "bind-address-ipv4": "0.0.0.0", + "bind-address-ipv6": "::", + "blocklist-enabled": false, + "blocklist-updates-enabled": true, + "blocklist-url": "http://www.example.com/blocklist", + "cache-size-mb": 4, + "compact-view": false, + "default-trackers": "", + "details-window-height": 500, + "details-window-width": 700, + "dht-enabled": true, + "download-dir": "/home/marley/data/piracy", + "download-queue-enabled": true, + "download-queue-size": 5, + "encryption": 1, + "idle-seeding-limit": 30, + "idle-seeding-limit-enabled": false, + "incomplete-dir": "/home/marley/Downloads", + "incomplete-dir-enabled": false, + "inhibit-desktop-hibernation": false, + "lpd-enabled": true, + "main-window-height": 465, + "main-window-is-maximized": false, + "main-window-width": 808, + "main-window-x": 50, + "main-window-y": 50, + "message-level": 4, + "open-dialog-dir": "/home/marley", + "peer-congestion-algorithm": "", + "peer-limit-global": 200, + "peer-limit-per-torrent": 50, + "peer-port": 51413, + "peer-port-random-high": 65535, + "peer-port-random-low": 49152, + "peer-port-random-on-start": false, + "peer-socket-tos": "le", + "pex-enabled": true, + "port-forwarding-enabled": true, + "preallocation": 1, + "prefetch-enabled": true, + "queue-stalled-enabled": true, + "queue-stalled-minutes": 30, + "ratio-limit": 2, + "ratio-limit-enabled": true, + "recent-download-dir-1": "/home/marley/data/piracy", + "recent-download-dir-2": "", + "recent-download-dir-3": "", + "recent-download-dir-4": "", + "rename-partial-files": false, + "rpc-authentication-required": false, + "rpc-bind-address": "0.0.0.0", + "rpc-enabled": false, + "rpc-host-whitelist": "", + "rpc-host-whitelist-enabled": true, + "rpc-password": "{5696d56b762c22da89f3034fd5fea64113da04b9OrSJjgb5", + "rpc-port": 9091, + "rpc-socket-mode": "0750", + "rpc-url": "/transmission/", + "rpc-username": "", + "rpc-whitelist": "127.0.0.1,::1", + "rpc-whitelist-enabled": true, + "scrape-paused-torrents-enabled": true, + "script-torrent-added-enabled": false, + "script-torrent-added-filename": "", + "script-torrent-done-enabled": false, + "script-torrent-done-filename": "", + "script-torrent-done-seeding-enabled": false, + "script-torrent-done-seeding-filename": "", + "seed-queue-enabled": false, + "seed-queue-size": 10, + "show-backup-trackers": false, + "show-extra-peer-details": false, + "show-filterbar": true, + "show-notification-area-icon": false, + "show-options-window": true, + "show-statusbar": true, + "show-toolbar": true, + "show-tracker-scrapes": false, + "sort-mode": "sort-by-name", + "sort-reversed": false, + "speed-limit-down": 100, + "speed-limit-down-enabled": false, + "speed-limit-up": 100, + "speed-limit-up-enabled": false, + "start-added-torrents": true, + "statusbar-stats": "total-ratio", + "tcp-enabled": true, + "torrent-added-notification-enabled": true, + "torrent-added-verify-mode": "fast", + "torrent-complete-notification-enabled": true, + "torrent-complete-sound-command": [ + "canberra-gtk-play", + "-i", + "complete-download", + "-d", + "transmission torrent downloaded" + ], + "torrent-complete-sound-enabled": true, + "trash-can-enabled": true, + "trash-original-torrent-files": false, + "umask": "022", + "upload-slots-per-torrent": 8, + "user-has-given-informed-consent": true, + "utp-enabled": true, + "watch-dir": "/home/marley/Desktop", + "watch-dir-enabled": false +} diff --git a/dot_config/wezterm/wezterm.lua b/dot_config/wezterm/wezterm.lua new file mode 100644 index 0000000..a6ca83d --- /dev/null +++ b/dot_config/wezterm/wezterm.lua @@ -0,0 +1,78 @@ +-- wezterm API +local wezterm = require("wezterm") + +local config = wezterm.config_builder() + +config.color_scheme = "Catppuccin Macchiato" +config.enable_tab_bar = false + +-- config.default_prog = { "/usr/bin/fish" } + +config.enable_wayland = false + +config.font = wezterm.font_with_fallback({ + { family = "FairiesevkaTerm Nerd Font Mono" }, + { + family = "FiraCode Nerd Font", + harfbuzz_features = { + "cv02", + "cv06", + "ss01", + "cv14", + "onum", + "ss04", + "cv18", + "cv31", + "cv30", + "cv25", + "cv26", + "cv32", + "ss06", + "ss07", + }, + }, + { family = "Apple Color Emoji" }, +}) +config.font_size = 11.0 + +config.hyperlink_rules = { + -- Linkify things that look like URLs and the host has a TLD name. + -- + -- Compiled-in default. Used if you don't specify any hyperlink_rules. + { + regex = "\\b\\w+://[\\w.-]+\\.[a-z]{2,15}\\S*\\b", + format = "$0", + }, + + -- linkify email addresses + -- Compiled-in default. Used if you don't specify any hyperlink_rules. + { + regex = [[\b\w+@[\w-]+(\.[\w-]+)+\b]], + format = "mailto:$0", + }, + + -- file:// URI + -- Compiled-in default. Used if you don't specify any hyperlink_rules. + { + regex = [[\bfile://\S*\b]], + format = "$0", + }, + + -- Linkify things that look like URLs with numeric addresses as hosts. + -- E.g. http://127.0.0.1:8000 for a local development server, + -- or http://192.168.1.1 for the web interface of many routers. + { + regex = [[\b\w+://(?:[\d]{1,3}\.){3}[\d]{1,3}\S*\b]], + format = "$0", + }, + + -- Make username/project paths clickable. This implies paths like the following are for GitHub. + -- As long as a full URL hyperlink regex exists above this it should not match a full URL to + -- GitHub or GitLab / BitBucket (i.e. https://gitlab.com/user/project.git is still a whole clickable URL) + { + regex = [[["]?([\w\d]{1}[-\w\d]+)(/){1}([-\w\d\.]+)["]?]], + format = "https://www.github.com/$1/$3", + }, +} + +return config diff --git a/dot_config/wgetrc b/dot_config/wgetrc new file mode 100644 index 0000000..0ba8ac2 --- /dev/null +++ b/dot_config/wgetrc @@ -0,0 +1,18 @@ +# Use the server-provided last modification date, if available. +timestamping = on + +# Wait 60 seconds before timing out. +timeout = 60 + +# Retry a few times when a download fails, but don't overdo it (the default is +# 20!). +tries = 3 + +# Retry even when the connection was refused. +retry_connrefused = on + +# Use the last component of a redirection URL for the local file name. +trust_server_names = on + +# Disguise as IE 9 on Windows 7 +user_agent = Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) diff --git a/dot_config/yay/config.json b/dot_config/yay/config.json new file mode 100644 index 0000000..77d058b --- /dev/null +++ b/dot_config/yay/config.json @@ -0,0 +1,50 @@ +{ + "aururl": "https://aur.archlinux.org", + "aurrpcurl": "https://aur.archlinux.org/rpc?", + "buildDir": "/home/marley/.cache/yay", + "editor": "", + "editorflags": "", + "makepkgbin": "makepkg", + "makepkgconf": "", + "pacmanbin": "pacman", + "pacmanconf": "/etc/pacman.conf", + "redownload": "no", + "answerclean": "None", + "answerdiff": "Installed", + "answeredit": "", + "answerupgrade": "", + "gitbin": "git", + "gpgbin": "gpg", + "gpgflags": "", + "mflags": "", + "sortby": "votes", + "searchby": "name-desc", + "gitflags": "", + "removemake": "yes", + "sudobin": "sudo", + "sudoflags": "", + "version": "12.3.0", + "requestsplitn": 150, + "completionrefreshtime": 7, + "maxconcurrentdownloads": 1, + "bottomup": true, + "sudoloop": false, + "timeupdate": false, + "devel": false, + "cleanAfter": false, + "keepSrc": false, + "provides": true, + "pgpfetch": true, + "cleanmenu": false, + "diffmenu": false, + "editmenu": false, + "combinedupgrade": true, + "useask": false, + "batchinstall": false, + "singlelineresults": false, + "separatesources": true, + "debug": false, + "rpc": true, + "doubleconfirm": true, + "rebuild": "no" +} diff --git a/dot_config/zathura/zathurarc b/dot_config/zathura/zathurarc new file mode 100644 index 0000000..2b870f7 --- /dev/null +++ b/dot_config/zathura/zathurarc @@ -0,0 +1 @@ +include catppuccin-macchiato diff --git a/dot_icons/default/index.theme b/dot_icons/default/index.theme new file mode 100644 index 0000000..d878bb7 --- /dev/null +++ b/dot_icons/default/index.theme @@ -0,0 +1,2 @@ +[icon theme] +Inherits=Catppuccin-Macchiato-Pink-Cursors diff --git a/dot_plugin-versions b/dot_plugin-versions new file mode 100644 index 0000000..fc960a4 --- /dev/null +++ b/dot_plugin-versions @@ -0,0 +1,3 @@ +# plugin-name git-url git-ref +asdf-plugin-manager https://github.com/asdf-community/asdf-plugin-manager.git 0ea8bb5 +php https://github.com/asdf-community/asdf-php.git 1eaf4de diff --git a/dot_screenlayout/executable_multihead.sh b/dot_screenlayout/executable_multihead.sh new file mode 100644 index 0000000..8ea044e --- /dev/null +++ b/dot_screenlayout/executable_multihead.sh @@ -0,0 +1,2 @@ +#!/bin/sh +xrandr --output DVI-I-0 --off --output DVI-I-1 --off --output HDMI-0 --off --output DP-0 --mode 1920x1200 --pos 0x0 --rotate normal --output DP-1 --off --output DVI-D-0 --mode 1680x1050 --pos 1920x75 --rotate normal --output None-1-1 --off diff --git a/dot_tool-versions b/dot_tool-versions new file mode 100644 index 0000000..53bf93f --- /dev/null +++ b/dot_tool-versions @@ -0,0 +1,2 @@ +asdf-plugin-manager 1.3.0 +php system diff --git a/dot_xprofile b/dot_xprofile new file mode 100644 index 0000000..e4eeab9 --- /dev/null +++ b/dot_xprofile @@ -0,0 +1,36 @@ +#!/usr/bin/env sh + +sysresources=/etc/X11/xinit/.Xresources +sysmodmap=/etc/X11/xinit/.Xmodmap +userresources=$HOME/.Xresources +usermodmap=$HOME/.Xmodmap + +if [ -f "$sysresources" ]; then + xrdb -merge "$sysresources" +fi + +if [ -f "$sysmodmap" ]; then + xmodmap "$sysmodmap" +fi + +if [ -f "$userresources" ]; then + xrdb -merge "$userresources" +fi + +if [ -f "$usermodmap" ]; then + xmodmap -merge "$usermodmap" +fi + +if [ -d /etc/X11/xinit/xinitrc.d ]; then + for f in /etc/X11/xinit/xinitrc.d/?*.sh; do + # shellcheck source=/dev/null + [ -x "$f" ] && . "$f" + done + + unset f +fi + +# "$HOME/.screenlayout/multihead.sh" + +copyq & +mopidy & diff --git a/private_dot_bash_history b/private_dot_bash_history new file mode 100644 index 0000000..bdb67b6 --- /dev/null +++ b/private_dot_bash_history @@ -0,0 +1,67 @@ +sudo pacman -S firefox +firefox +clear +sudo pacman -S git +sudo pacman -S openssh +clear +sudo pacman -S gh +mkdir hackin +cd hackin +git clone https://github.com/punkfairie/dotfiles.git +ls ~ +cd dotfiles/ +ls +ls -a +man cp +cp -r .config ~/.config +git branch dotfiles.sh +ls +git checkout dotfiles.sh +ls +cd .. +rm -rf dotfiles/ +git clone https://github.com/punkfairie/dotfiles.git +git switch dotfiles.sh +cd dotfiles +git switch dotfiles.sh +ls +ls -a +cp -r .config ~/.config +ls -a ~` +ls -a ~ +man xclip +cat ~/.ssh/id_ed25519.pub | xclip -clipboard +cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard +cd hackin/dotfiles +git submodule update --init --recursive +cp -r . ~/ +ls -a ~ +rm -rf ~/.git ~/.gitignore ~/.gitconfig ~/.gitmodules +ls -a ~/ +ls -a +ls -a ~/.themes +ls -a ~/.themes/bat/ +ls -a ~/.themes/bat/catppuccin/ +clear +fc-cache +fc-list +fc-list | grep Fairisevka +fc-list | grep Fairiesevka +fc-list | grep Fairiesevka | less +fc-list | grep "Fairiesevka Term" | less +fc-list | grep "Fairiesevka" | less +fc-list +yay -S ttf-fairisevka-term +yay -S ttf-fairiesevka-term +clear +yay -S --needed ttf-fairiesevka-term ttf-fairiesevka-propo +ls -a +nvim .config/nvim/ +ls +ls -a +rm .wakatime .wakatime.bdb .wakatime.cfg +rm -rf .wakatime .wakatime.bdb .wakatime.cfg +clear +which fish +echo "$(which fish)" | sudo tee -a /etc/shells +chsh -s "$(which fish)" diff --git a/private_dot_gnupg/private_common.conf b/private_dot_gnupg/private_common.conf new file mode 100644 index 0000000..5add401 --- /dev/null +++ b/private_dot_gnupg/private_common.conf @@ -0,0 +1 @@ +use-keyboxd diff --git a/private_dot_gnupg/private_gpg-agent.conf b/private_dot_gnupg/private_gpg-agent.conf new file mode 100644 index 0000000..ec6706d --- /dev/null +++ b/private_dot_gnupg/private_gpg-agent.conf @@ -0,0 +1,5 @@ +pinentry-program /usr/bin/pinentry-qt5 + +# Stop asking for password so often. +default-cache-ttl 60480000 +max-cache-ttl 60480000 diff --git a/tags b/tags new file mode 100644 index 0000000..f5e39be --- /dev/null +++ b/tags @@ -0,0 +1,817 @@ +!_TAG_EXTRA_DESCRIPTION anonymous /Include tags for non-named objects like lambda/ +!_TAG_EXTRA_DESCRIPTION fileScope /Include tags of file scope/ +!_TAG_EXTRA_DESCRIPTION pseudo /Include pseudo tags/ +!_TAG_EXTRA_DESCRIPTION subparser /Include tags generated by subparsers/ +!_TAG_FIELD_DESCRIPTION epoch /the last modified time of the input file (only for F\/file kind tag)/ +!_TAG_FIELD_DESCRIPTION file /File-restricted scoping/ +!_TAG_FIELD_DESCRIPTION input /input file/ +!_TAG_FIELD_DESCRIPTION name /tag name/ +!_TAG_FIELD_DESCRIPTION pattern /pattern/ +!_TAG_FIELD_DESCRIPTION typeref /Type and name of a variable or typedef/ +!_TAG_FIELD_DESCRIPTION!XML uri /uri associated with name prefix/ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_KIND_DESCRIPTION!CSS c,class /classes/ +!_TAG_KIND_DESCRIPTION!CSS i,id /identities/ +!_TAG_KIND_DESCRIPTION!CSS s,selector /selectors/ +!_TAG_KIND_DESCRIPTION!Iniconf k,key /keys/ +!_TAG_KIND_DESCRIPTION!Iniconf s,section /sections/ +!_TAG_KIND_DESCRIPTION!JSON a,array /arrays/ +!_TAG_KIND_DESCRIPTION!JSON b,boolean /booleans/ +!_TAG_KIND_DESCRIPTION!JSON n,number /numbers/ +!_TAG_KIND_DESCRIPTION!JSON o,object /objects/ +!_TAG_KIND_DESCRIPTION!JSON s,string /strings/ +!_TAG_KIND_DESCRIPTION!JSON z,null /nulls/ +!_TAG_KIND_DESCRIPTION!Lua f,function /functions/ +!_TAG_KIND_DESCRIPTION!SVG d,def /ids in defs tags/ +!_TAG_KIND_DESCRIPTION!Scheme f,function /functions/ +!_TAG_KIND_DESCRIPTION!Scheme s,set /sets/ +!_TAG_KIND_DESCRIPTION!Sh a,alias /aliases/ +!_TAG_KIND_DESCRIPTION!Sh f,function /functions/ +!_TAG_KIND_DESCRIPTION!Sh h,heredoc /label for here document/ +!_TAG_KIND_DESCRIPTION!Sh s,script /script files/ +!_TAG_KIND_DESCRIPTION!XML i,id /id attributes/ +!_TAG_KIND_DESCRIPTION!XML n,nsprefix /namespace prefixes/ +!_TAG_KIND_DESCRIPTION!XML r,root /root elements/ +!_TAG_KIND_DESCRIPTION!Yaml a,anchor /anchors/ +!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/ +!_TAG_OUTPUT_FILESEP slash /slash or backslash/ +!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/ +!_TAG_OUTPUT_VERSION 0.0 /current.age/ +!_TAG_PARSER_VERSION!CSS 0.0 /current.age/ +!_TAG_PARSER_VERSION!Iniconf 0.0 /current.age/ +!_TAG_PARSER_VERSION!JSON 0.0 /current.age/ +!_TAG_PARSER_VERSION!Lua 0.0 /current.age/ +!_TAG_PARSER_VERSION!SVG 0.0 /current.age/ +!_TAG_PARSER_VERSION!Scheme 0.0 /current.age/ +!_TAG_PARSER_VERSION!Sh 0.0 /current.age/ +!_TAG_PARSER_VERSION!XML 0.0 /current.age/ +!_TAG_PARSER_VERSION!Yaml 0.0 /current.age/ +!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/ +!_TAG_PROC_CWD /home/marley/.local/share/chezmoi/ // +!_TAG_PROGRAM_AUTHOR Universal Ctags Team // +!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ +!_TAG_PROGRAM_URL https://ctags.io/ /official site/ +!_TAG_PROGRAM_VERSION 6.1.0 /v6.1.0/ +!_TAG_ROLE_DESCRIPTION!Sh!heredoc endmarker /end marker/ +!_TAG_ROLE_DESCRIPTION!Sh!script loaded /loaded/ +!_TAG_ROLE_DESCRIPTION!Yaml!anchor alias /alias/ +#TabsToolbar .toolbar-items dot_config/firefox/userChrome.css /^#TabsToolbar .toolbar-items {$/;" c +#nav-bar dot_config/firefox/userChrome.css /^#nav-bar {$/;" i +#navigator-toolbox dot_config/firefox/userChrome.css /^#navigator-toolbox {$/;" i +#sidebar-header dot_config/firefox/userChrome.css /^#sidebar-header {$/;" i +#tabbrowser-tabs dot_config/firefox/userChrome.css /^#tabbrowser-tabs {$/;" i +#titlebar dot_config/firefox/userChrome.css /^#titlebar {$/;" i +#titlebar #TabsToolbar dot_config/firefox/userChrome.css /^#titlebar #TabsToolbar {$/;" i +#titlebar #TabsToolbar .titlebar-spacer dot_config/firefox/userChrome.css /^#titlebar #TabsToolbar .titlebar-spacer {$/;" c +#titlebar #TabsToolbar .titlebar-spacer[type="pre-tabs"] dot_config/firefox/userChrome.css /^#titlebar #TabsToolbar .titlebar-spacer[type="pre-tabs"] {$/;" c +0 dot_config/transmission/settings.json /^ "canberra-gtk-play",$/;" s array:torrent-complete-sound-command +1 dot_config/transmission/settings.json /^ "-i",$/;" s array:torrent-complete-sound-command +2 dot_config/transmission/settings.json /^ "complete-download",$/;" s array:torrent-complete-sound-command +3 dot_config/transmission/settings.json /^ "-d",$/;" s array:torrent-complete-sound-command +4 dot_config/transmission/settings.json /^ "transmission torrent downloaded"$/;" s array:torrent-complete-sound-command +Catppuccin-Macchiato-Standard-Pink-Dark dot_config/gtk-4.0/symlink_gtk-dark.css /^\/usr\/share\/themes\/Catppuccin-Macchiato-Standard-Pink-Dark\/gtk-4.0\/gtk-dark.css$/;" s +Catppuccin-Macchiato-Standard-Pink-Dark dot_config/gtk-4.0/symlink_gtk.css /^\/usr\/share\/themes\/Catppuccin-Macchiato-Standard-Pink-Dark\/gtk-4.0\/gtk.css$/;" s +Copy mode dot_config/tmux/tmux.conf /^bind -T copy-mode-vi -N 'Copy mode: Switch to pane (down)' C-j if-shell "${IS_VIM} || ${IS_FZF}/;" k +Copy mode dot_config/tmux/tmux.conf /^bind -T copy-mode-vi -N 'Copy mode: switch to pane (left)' C-h if-shell "${IS_VIM} || ${IS_FZF}/;" k +Copy mode dot_config/tmux/tmux.conf /^bind -T copy-mode-vn -N 'Copy mode: Switch to pane (right)' C-l if-shell "${IS_VIM} || ${IS_FZF}/;" k +Copy mode dot_config/tmux/tmux.conf /^bind -T copy-mode-vn -N 'Copy mode: Switch to pane (up)' C-k if-shell "${IS_VIM} || ${IS_FZF}/;" k +General dot_config/openrazer/razer.conf /^[General]$/;" s +IO2049F50104914 dot_config/openrazer/persistence.conf /^[IO2049F50104914]$/;" s +IS_FZF dot_config/tmux/tmux.conf /^IS_FZF="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\\\S+\\\\\/)?fzf$'"$/;" k +IS_VIM dot_config/tmux/tmux.conf /^IS_VIM="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\\\S+\\\\\/)?g?(view|n?/;" k +NEWS.md dot_config/nvim/lazyvim.json /^ "NEWS.md": "3314"$/;" s object:news +Notif_center_remove_notif dot_config/awesome/ui/notif-panel/init.lua /^Notif_center_remove_notif = function(box)$/;" f +Notif_center_reset_notifs_container dot_config/awesome/ui/notif-panel/init.lua /^Notif_center_reset_notifs_container = function()$/;" f +PM2038H11502057 dot_config/openrazer/persistence.conf /^[PM2038H11502057]$/;" s +Remember dot_config/awesome/lib/savefloats.lua /^function Remember(c)$/;" f +Restore dot_config/awesome/lib/savefloats.lua /^function Restore(c)$/;" f +Settings dot_config/gtk-3.0/settings.ini /^[Settings]$/;" s +Startup dot_config/openrazer/razer.conf /^[Startup]$/;" s +[""] dot_config/nvim/lua/plugins/nvim-cmp.lua /^ [""] = function(fallback)$/;" f +[""] dot_config/nvim/lua/plugins/example.lua /^ [""] = cmp.mapping(function(fallback)$/;" f +[""] dot_config/nvim/lua/plugins/example.lua /^ [""] = cmp.mapping(function(fallback)$/;" f +_get_widget_geometry dot_config/awesome/helpers/ui.lua /^local function _get_widget_geometry(_hierarchy, widget)$/;" f +abort dot_config/awesome/lib/animation/init.lua /^function animation:abort()$/;" f unknown:animation +add_hover_cursor dot_config/awesome/helpers/ui.lua /^function ui.add_hover_cursor(w, hover_cursor)$/;" f unknown:ui +alsamixer dot_config/mopidy/mopidy.conf /^[alsamixer]$/;" s +alt-speed-down dot_config/transmission/settings.json /^ "alt-speed-down": 50,$/;" n +alt-speed-enabled dot_config/transmission/settings.json /^ "alt-speed-enabled": false,$/;" b +alt-speed-time-begin dot_config/transmission/settings.json /^ "alt-speed-time-begin": 540,$/;" n +alt-speed-time-day dot_config/transmission/settings.json /^ "alt-speed-time-day": 127,$/;" n +alt-speed-time-enabled dot_config/transmission/settings.json /^ "alt-speed-time-enabled": false,$/;" b +alt-speed-time-end dot_config/transmission/settings.json /^ "alt-speed-time-end": 1020,$/;" n +alt-speed-up dot_config/transmission/settings.json /^ "alt-speed-up": 50,$/;" n +animations dot_config/picom.conf /^animations: false;$/;" k +announce-ip dot_config/transmission/settings.json /^ "announce-ip": "",$/;" s +announce-ip-enabled dot_config/transmission/settings.json /^ "announce-ip-enabled": false,$/;" b +answerclean dot_config/yay/config.json /^ "answerclean": "None",$/;" s +answerdiff dot_config/yay/config.json /^ "answerdiff": "Installed",$/;" s +answeredit dot_config/yay/config.json /^ "answeredit": "",$/;" s +answerupgrade dot_config/yay/config.json /^ "answerupgrade": "",$/;" s +anti-brute-force-enabled dot_config/transmission/settings.json /^ "anti-brute-force-enabled": false,$/;" b +anti-brute-force-threshold dot_config/transmission/settings.json /^ "anti-brute-force-threshold": 100,$/;" n +args dot_config/hyfetch.json /^ "args": null,$/;" z +ascii_bold dot_config/neofetch/config.conf /^ascii_bold="on"$/;" k +ascii_colors dot_config/neofetch/config.conf /^ascii_colors=(distro)$/;" k +ascii_distro dot_config/neofetch/config.conf /^ascii_distro="auto"$/;" k +audio dot_config/mopidy/mopidy.conf /^[audio]$/;" s +aurrpcurl dot_config/yay/config.json /^ "aurrpcurl": "https:\/\/aur.archlinux.org\/rpc?",$/;" s +aururl dot_config/yay/config.json /^ "aururl": "https:\/\/aur.archlinux.org",$/;" s +backend dot_config/hyfetch.json /^ "backend": "neofetch",$/;" s +backend dot_config/picom.conf /^backend = "glx";$/;" k +background_color dot_config/neofetch/config.conf /^background_color=$/;" k +background_update dot_config/btop/btop.conf /^background_update = True$/;" k +backlight_active dot_config/openrazer/persistence.conf /^backlight_active = True$/;" k section:IO2049F50104914 +backlight_brightness dot_config/openrazer/persistence.conf /^backlight_brightness = 75$/;" k section:IO2049F50104914 +backlight_colors dot_config/openrazer/persistence.conf /^backlight_colors = 0 255 0 0 255 255 0 0 255$/;" k section:IO2049F50104914 +backlight_effect dot_config/openrazer/persistence.conf /^backlight_effect = wave$/;" k section:IO2049F50104914 +backlight_speed dot_config/openrazer/persistence.conf /^backlight_speed = 1$/;" k section:IO2049F50104914 +backlight_wave_dir dot_config/openrazer/persistence.conf /^backlight_wave_dir = 1$/;" k section:IO2049F50104914 +bar_border dot_config/neofetch/config.conf /^bar_border="on"$/;" k +bar_char_elapsed dot_config/neofetch/config.conf /^bar_char_elapsed="-"$/;" k +bar_char_total dot_config/neofetch/config.conf /^bar_char_total="="$/;" k +bar_color_elapsed dot_config/neofetch/config.conf /^bar_color_elapsed="distro"$/;" k +bar_color_total dot_config/neofetch/config.conf /^bar_color_total="distro"$/;" k +bar_length dot_config/neofetch/config.conf /^bar_length=15$/;" k +base_10_sizes dot_config/btop/btop.conf /^base_10_sizes = False$/;" k +batchinstall dot_config/yay/config.json /^ "batchinstall": false,$/;" b +battery_display dot_config/neofetch/config.conf /^battery_display="off"$/;" k +battery_notifier dot_config/openrazer/razer.conf /^battery_notifier = True$/;" k section:Startup +battery_notifier_freq dot_config/openrazer/razer.conf /^battery_notifier_freq = 600$/;" k section:Startup +battery_notifier_percent dot_config/openrazer/razer.conf /^battery_notifier_percent = 33$/;" k section:Startup +bind-address-ipv4 dot_config/transmission/settings.json /^ "bind-address-ipv4": "0.0.0.0",$/;" s +bind-address-ipv6 dot_config/transmission/settings.json /^ "bind-address-ipv6": "::",$/;" s +block_height dot_config/neofetch/config.conf /^block_height=1$/;" k +block_range dot_config/neofetch/config.conf /^block_range=(0 15)$/;" k +block_width dot_config/neofetch/config.conf /^block_width=3$/;" k +blocklist-enabled dot_config/transmission/settings.json /^ "blocklist-enabled": false,$/;" b +blocklist-updates-enabled dot_config/transmission/settings.json /^ "blocklist-updates-enabled": true,$/;" b +blocklist-url dot_config/transmission/settings.json /^ "blocklist-url": "http:\/\/www.example.com\/blocklist",$/;" s +bold dot_config/neofetch/config.conf /^bold="on"$/;" k +borders dot_config/picom.conf /^round-borders = 1;$/;" k +bottomup dot_config/yay/config.json /^ "bottomup": true,$/;" b +box_widget dot_config/awesome/ui/info-panel/init.lua /^local function box_widget(widgets, _width, _height)$/;" f +buildDir dot_config/yay/config.json /^ "buildDir": "\/home\/marley\/.cache\/yay",$/;" s +cache-size-mb dot_config/transmission/settings.json /^ "cache-size-mb": 4,$/;" n +calculatePAS dot_config/awesome/lib/animation/tween.lua /^local function calculatePAS(p, a, c, d)$/;" f +callback dot_config/awesome/main/menu.lua /^ callback = function()$/;" f +callback dot_config/awesome/signals/cpu.lua /^ callback = function()$/;" f +callback dot_config/awesome/signals/disk.lua /^ callback = function()$/;" f +callback dot_config/awesome/signals/mem.lua /^ callback = function()$/;" f +callback dot_config/awesome/ui/info-panel/init.lua /^ callback = function()$/;" f +callback dot_config/awesome/ui/notif-panel/init.lua /^ callback = function()$/;" f +callback dot_config/awesome/ui/popups/layout/init.lua /^ callback = function()$/;" f +callback dot_config/awesome/ui/popups/volume/init.lua /^ callback = function()$/;" f +callback dot_config/awesome/ui/top-panel/widgets/clock.lua /^ callback = function()$/;" f +callback dot_config/awesome/ui/top-panel/widgets/date.lua /^ callback = function()$/;" f +callback dot_config/nvim/lua/config/autocmds.lua /^ callback = function()$/;" f +callback dot_config/nvim/lua/config/autocmds.lua /^ callback = function(args)$/;" f +catimg_size dot_config/neofetch/config.conf /^catimg_size="2"$/;" k +cc dot_config/awesome/themes/catppuccin/assets/volume.svg /^ inkscape:version="0.92.4 5da689c313, 2019-01-14">$/;" n uri:http://creativecommons.org/ns# +changed dot_config/awesome/ui/popups/layout/init.lua /^function layout_popup.changed()$/;" f unknown:layout_popup +checkNewParams dot_config/awesome/lib/animation/tween.lua /^local function checkNewParams(_, _, subject, target, easing)$/;" f +checkSubjectAndTargetRecursively dot_config/awesome/lib/animation/tween.lua /^local function checkSubjectAndTargetRecursively(subject, target, path)$/;" f +check_temp dot_config/btop/btop.conf /^check_temp = True$/;" k +clamping dot_config/picom.conf /^animation-clamping = false$/;" k +cleanAfter dot_config/yay/config.json /^ "cleanAfter": false,$/;" b +cleanmenu dot_config/yay/config.json /^ "cleanmenu": false,$/;" b +clock_format dot_config/btop/btop.conf /^clock_format = "%X"$/;" k +codepoint_to_utf8 dot_config/awesome/lib/json.lua /^local function codepoint_to_utf8(n)$/;" f +col_offset dot_config/neofetch/config.conf /^col_offset=49$/;" k +color_align dot_config/hyfetch.json /^ "color_align": {$/;" o +color_blocks dot_config/neofetch/config.conf /^color_blocks="on"$/;" k +color_theme dot_config/btop/btop.conf /^color_theme = "\/home\/marley\/.config\/btop\/themes\/catppuccin_macchiato.theme"$/;" k +colorize_text dot_config/awesome/helpers/ui.lua /^function ui.colorize_text(text, color)$/;" f unknown:ui +colors dot_config/neofetch/config.conf /^colors=(distro)$/;" k +combinedupgrade dot_config/yay/config.json /^ "combinedupgrade": true,$/;" b +compact-view dot_config/transmission/settings.json /^ "compact-view": false,$/;" b +completionrefreshtime dot_config/yay/config.json /^ "completionrefreshtime": 7,$/;" n +cond dot_config/nvim/lua/plugins/beacon.lua /^ cond = function()$/;" f +config dot_config/nvim/lua/plugins/example.lua /^ config = function()$/;" f +config dot_config/nvim/lua/plugins/luasnip.lua /^ config = function(_, opts)$/;" f +config dot_config/nvim/lua/plugins/nvim-emmet.lua /^ config = function()$/;" f +config dot_config/nvim/lua/plugins/nvim-treesitter.lua /^ config = function(_, opts)$/;" f +copyTables dot_config/awesome/lib/animation/tween.lua /^local function copyTables(destination, keysTable, valuesTable)$/;" f +core dot_config/mopidy/mopidy.conf /^[core]$/;" s +corners dot_config/picom.conf /^detect-rounded-corners = true;$/;" k +cpriego/valet-linux dot_config/composer/composer.json /^ "cpriego\/valet-linux": "^2.3"$/;" s object:require +cpu_bottom dot_config/btop/btop.conf /^cpu_bottom = False$/;" k +cpu_brand dot_config/neofetch/config.conf /^cpu_brand="on"$/;" k +cpu_core_map dot_config/btop/btop.conf /^cpu_core_map = ""$/;" k +cpu_cores dot_config/neofetch/config.conf /^cpu_cores="off"$/;" k +cpu_graph_lower dot_config/btop/btop.conf /^cpu_graph_lower = "Auto"$/;" k +cpu_graph_upper dot_config/btop/btop.conf /^cpu_graph_upper = "Auto"$/;" k +cpu_invert_lower dot_config/btop/btop.conf /^cpu_invert_lower = True$/;" k +cpu_sensor dot_config/btop/btop.conf /^cpu_sensor = "Auto"$/;" k +cpu_single_graph dot_config/btop/btop.conf /^cpu_single_graph = False$/;" k +cpu_speed dot_config/neofetch/config.conf /^cpu_speed="off"$/;" k +cpu_temp dot_config/neofetch/config.conf /^cpu_temp="off"$/;" k +create_button dot_config/awesome/lib/exit-screen.lua /^local create_button = function(symbol, hover_color, _, command)$/;" f +create_callback dot_config/awesome/ui/top-panel/widgets/taglist.lua /^ create_callback = function(self, c3, index, _)$/;" f +create_exit_screen dot_config/awesome/lib/exit-screen.lua /^local create_exit_screen = function(s)$/;" f +create_icon dot_config/awesome/helpers/ui.lua /^function ui.create_icon(i, c)$/;" f unknown:ui +create_notif dot_config/awesome/ui/notif-panel/init.lua /^local create_notif = function(icon, n)$/;" f +create_set dot_config/awesome/lib/json.lua /^local function create_set(...)$/;" f +crop_mode dot_config/neofetch/config.conf /^crop_mode="normal"$/;" k +crop_offset dot_config/neofetch/config.conf /^crop_offset="center"$/;" k +current-color-scheme dot_config/awesome/ui/info-panel/weather/icons/weather-clouds-night.svg /^