From b912d863ae7d0a28a4224608e1a3b32430ed988c Mon Sep 17 00:00:00 2001 From: Shubham Pawar Date: Sat, 8 Feb 2025 21:54:12 +0530 Subject: [PATCH] chore: updated neovim and nvim-astro config(important) chore: deleting files that i'm probably not gonna use chore: adding few snippets and fixing some minor issues chore: multiple cursors and few other fixes chore: update zsh to use zgenom chore: add lazy-lock json --- .config/awesome-another/rc.lua | 1069 ---------------- .config/awesome-another/theme.lua | 193 --- .config/awesome-another/widgets/calendar.lua | 279 ---- .config/awesome-another/widgets/volume.lua | 111 -- .config/awesome/README.md | 15 - .config/awesome/rc.lua | 1137 ----------------- .config/awesome/rc.lua.bkp | 1120 ---------------- .config/awesome/utils/ez_keys.lua | 159 --- .config/awesome/utils/helper.lua | 45 - .config/awesome/utils/sample.lua | 24 - .config/awesome/utils/theme.lua | 119 -- .config/awesome/widgets/battery/README.md | 75 -- .config/awesome/widgets/battery/bat-wid-1.png | Bin 700 -> 0 bytes .config/awesome/widgets/battery/bat-wid-2.png | Bin 18854 -> 0 bytes .../awesome/widgets/battery/bat-wid-22.png | Bin 10225 -> 0 bytes .config/awesome/widgets/battery/bat-wid-3.png | Bin 14886 -> 0 bytes .config/awesome/widgets/battery/init.lua | 212 --- .config/awesome/widgets/battery/spaceman.jpg | Bin 16738 -> 0 bytes .config/awesome/widgets/brightness/README.md | 86 -- .../awesome/widgets/brightness/br-wid-1.png | Bin 4912 -> 0 bytes .../awesome/widgets/brightness/brightness.svg | 153 --- .config/awesome/widgets/brightness/init.lua | 190 --- .config/awesome/widgets/calendar/README.md | 89 -- .../calendar/calendar_bottom_right.png | Bin 84358 -> 0 bytes .../calendar/calendar_start_sunday.png | Bin 8410 -> 0 bytes .../awesome/widgets/calendar/calendar_top.png | Bin 65350 -> 0 bytes .../widgets/calendar/calendar_top_right.png | Bin 133425 -> 0 bytes .config/awesome/widgets/calendar/dark.png | Bin 12055 -> 0 bytes .config/awesome/widgets/calendar/init.lua | 253 ---- .config/awesome/widgets/calendar/light.png | Bin 13020 -> 0 bytes .config/awesome/widgets/calendar/nord.png | Bin 10237 -> 0 bytes .config/awesome/widgets/calendar/outrun.png | Bin 9865 -> 0 bytes .config/awesome/widgets/vol.lua | 225 ---- .config/dk/dkrc | 119 -- .config/dk/scripts/bar.sh | 138 -- .config/dk/scripts/curwsinfo.sh | 17 - .config/dk/scripts/dzenws.sh | 45 - .config/dk/scripts/gap_alphaborder.sh | 76 -- .config/dk/scripts/layouts.sh | 4 - .config/dk/scripts/scratch.sh | 38 - .config/dk/scripts/title.sh | 20 - .config/dk/scripts/workspaces.sh | 4 - .config/dk/scripts/wsborders.sh | 70 - .config/dk/sxhkdrc | 123 -- .config/efm-langserver/config.yaml | 420 ------ .config/fish/conf.d/malias2.fish | 3 +- .config/fish/conf.d/mfunctions.fish | 22 +- .config/fish/conf.d/nix.fish | 2 - .config/fish/config.fish | 7 +- .config/fish/fish_variables | 3 - .config/ghostty/config | 4 +- .config/git/config | 3 + .config/home-manager/home.nix | 119 -- .config/nvim-astro/.neoconf.json | 6 +- .config/nvim-astro/after/plugin/keymaps.lua | 43 - .config/nvim-astro/after/plugin/options.lua | 27 +- .config/nvim-astro/lazy-lock.json | 140 +- .config/nvim-astro/lua/community.lua | 48 +- .../nvim-astro/lua/config/gruber-darker.lua | 20 - .config/nvim-astro/lua/config/kangawa.lua | 19 - .config/nvim-astro/lua/config/m-utils.lua | 13 - .config/nvim-astro/lua/config/nordic.lua | 22 - .config/nvim-astro/lua/lazy_setup.lua | 6 +- .config/nvim-astro/lua/plugins/ai.lua | 145 +++ .config/nvim-astro/lua/plugins/ai/avante.lua | 101 -- .../lua/plugins/ai/code-companion.lua | 56 - .config/nvim-astro/lua/plugins/astrocore.lua | 133 +- .config/nvim-astro/lua/plugins/astrolsp.lua | 371 ++---- .config/nvim-astro/lua/plugins/astroui.lua | 46 +- .../lua/plugins/color-highlight.lua | 24 - .config/nvim-astro/lua/plugins/conform.lua | 40 - .config/nvim-astro/lua/plugins/copilot.lua | 31 - .config/nvim-astro/lua/plugins/dial.lua | 172 --- .config/nvim-astro/lua/plugins/disabled.lua | 1 - .config/nvim-astro/lua/plugins/dooing.lua | 15 - .config/nvim-astro/lua/plugins/emmet.lua | 25 + .config/nvim-astro/lua/plugins/flash.lua | 18 - .config/nvim-astro/lua/plugins/grapple.lua | 5 - .config/nvim-astro/lua/plugins/gx-nvim.lua | 11 - .../lua/plugins/markdown-bullets.lua | 5 - .config/nvim-astro/lua/plugins/markdown.lua | 42 + .config/nvim-astro/lua/plugins/mini-nvim.lua | 187 +++ .config/nvim-astro/lua/plugins/mini/align.lua | 7 - .config/nvim-astro/lua/plugins/mini/move.lua | 29 - .../nvim-astro/lua/plugins/mini/operators.lua | 23 - .../nvim-astro/lua/plugins/mini/surround.lua | 26 - .../nvim-astro/lua/plugins/multi-cursor.lua | 18 - .../lua/plugins/multiple-cursors.lua | 17 + .config/nvim-astro/lua/plugins/neogen.lua | 15 - .config/nvim-astro/lua/plugins/neogit.lua | 41 - .config/nvim-astro/lua/plugins/nvim-cmp.lua | 171 +-- .../nvim-astro/lua/plugins/quick-scope.lua | 10 - .config/nvim-astro/lua/plugins/session.lua | 65 + .config/nvim-astro/lua/plugins/sessions.lua | 19 - .config/nvim-astro/lua/plugins/snacks.lua | 204 +++ .config/nvim-astro/lua/plugins/subversive.lua | 10 - .config/nvim-astro/lua/plugins/telescope.lua | 125 -- .../lua/plugins/template-string.lua | 7 +- .config/nvim-astro/lua/plugins/toggleterm.lua | 43 +- .config/nvim-astro/lua/plugins/tpope.lua | 13 - .config/nvim-astro/lua/plugins/treesitter.lua | 22 +- .config/nvim-astro/lua/plugins/undotree.lua | 8 - .config/nvim-astro/lua/plugins/yazi.lua | 31 - .config/nvim-astro/lua/polish.lua | 48 +- .config/nvim-astro/neovim.yml | 2 + .../nvim-astro/snippets/javascriptreact.json | 88 ++ .config/nvim-astro/snippets/lua.json | 73 ++ .config/nvim-astro/snippets/package.json | 29 + .../nvim-astro/snippets/typescriptreact.json | 91 ++ .config/nvim-lazy/lazy-lock.json | 112 +- .config/nvim-lazy/lua/config/lazy.lua | 8 +- .config/nvim-lazy/lua/config/nordic.lua | 9 +- .../nvim-lazy/lua/plugins/color-highlight.lua | 2 +- .config/nvim-lazy/lua/plugins/completion.lua | 18 +- .config/nvim-lazy/lua/plugins/copilot.lua | 2 +- .config/nvim-lazy/lua/plugins/disabled.lua | 1 - .config/nvim-lazy/lua/plugins/fzf-lua.lua | 14 +- .config/nvim-lazy/lua/plugins/grapple.lua | 1 + .config/nvim-lazy/lua/plugins/lazydo.lua | 13 - .config/nvim-lazy/lua/plugins/lsp/clang.lua | 11 + .config/nvim-lazy/lua/plugins/lsp/golang.lua | 15 + .../nvim-lazy/lua/plugins/lsp/mappings.lua | 26 +- .../lua/plugins/markdown-bullets.lua | 38 +- .../nvim-lazy/lua/plugins/mini/surround.lua | 33 +- .../nvim-lazy/lua/plugins/multi-cursor.lua | 67 +- .config/nvim-lazy/lua/plugins/neoterm.lua | 21 - .config/nvim-lazy/lua/plugins/notes.lua | 52 + .../nvim-lazy/lua/plugins/nvim-scissors.lua | 22 +- .config/nvim-lazy/lua/plugins/snacks.lua | 101 ++ .config/nvim-lazy/lua/plugins/subversive.lua | 10 - .../nvim-lazy/lua/plugins/template-string.lua | 4 +- .config/nvim-lazy/lua/plugins/theme.lua | 17 + .config/nvim-lazy/lua/plugins/yazi.lua | 31 - .config/nvim-lazy/snippets/lua.json | 41 +- .config/nvim-vscode/init.vim | 11 + .config/nvim/.DS_Store | Bin 0 -> 6148 bytes .config/nvim/.editorconfig | 7 + .config/nvim/after/ftplugin/markdown.lua | 8 - .config/nvim/after/plugin/keymaps.lua | 61 - .config/nvim/after/plugin/options.lua | 108 -- .config/nvim/init.lua | 15 +- .config/nvim/lazy-lock.json | 93 ++ .config/nvim/lua/.DS_Store | Bin 0 -> 6148 bytes .config/nvim/lua/chadrc.lua | 54 - .config/nvim/lua/lazy_init.lua | 38 - .config/nvim/lua/my_config/catppuccin.lua | 24 - .config/nvim/lua/my_config/gruber-darker.lua | 58 - .config/nvim/lua/my_config/kangawa.lua | 46 - .config/nvim/lua/my_config/nordic.lua | 23 - .config/nvim/lua/my_config/onenord.lua | 24 - .config/nvim/lua/my_config/tokyonight.lua | 27 - .config/nvim/lua/my_config/util.lua | 43 - .config/nvim/lua/plugins/avante.lua | 170 --- .config/nvim/lua/plugins/base64.lua | 54 - .config/nvim/lua/plugins/blink-cmp.lua | 209 --- .config/nvim/lua/plugins/conform.lua | 127 -- .config/nvim/lua/plugins/copilot.lua | 38 - .config/nvim/lua/plugins/dadbod.lua | 21 - .config/nvim/lua/plugins/dooing.lua | 16 - .config/nvim/lua/plugins/flash.lua | 17 - .config/nvim/lua/plugins/fzf-lua.lua | 454 ------- .config/nvim/lua/plugins/git-conflicts.lua | 6 - .config/nvim/lua/plugins/guess-indent.lua | 8 - .config/nvim/lua/plugins/indents.lua | 28 - .config/nvim/lua/plugins/init.lua | 333 ----- .config/nvim/lua/plugins/lazydo.lua | 13 - .config/nvim/lua/plugins/lsp/astrolsp.lua | 371 ------ .config/nvim/lua/plugins/lsp/cpp.lua | 66 - .config/nvim/lua/plugins/lsp/elixir.lua | 61 - .config/nvim/lua/plugins/lsp/gleam.lua | 13 - .config/nvim/lua/plugins/lsp/json.lua | 45 - .config/nvim/lua/plugins/lsp/lspconfig.lua | 39 - .config/nvim/lua/plugins/lsp/lua_ls.lua | 51 - .config/nvim/lua/plugins/lsp/mason.lua | 48 - .config/nvim/lua/plugins/lsp/nim.lua | 37 - .config/nvim/lua/plugins/lsp/php.lua | 131 -- .config/nvim/lua/plugins/lsp/prisma.lua | 21 - .config/nvim/lua/plugins/lsp/python.lua | 26 - .config/nvim/lua/plugins/lsp/rust.lua | 46 - .config/nvim/lua/plugins/lsp/svelte.lua | 63 - .config/nvim/lua/plugins/lsp/vue.lua | 22 - .config/nvim/lua/plugins/lsp/yaml.lua | 55 - .config/nvim/lua/plugins/lsp/zk.lua | 107 -- .config/nvim/lua/plugins/lualine.lua | 201 --- .config/nvim/lua/plugins/markdown-bullets.lua | 5 - .config/nvim/lua/plugins/mini/comment.lua | 57 - .config/nvim/lua/plugins/mini/misc.lua | 26 - .config/nvim/lua/plugins/mini/pairs.lua | 55 - .config/nvim/lua/plugins/mini/pick.lua | 58 - .config/nvim/lua/plugins/mini/statusline.lua | 10 - .config/nvim/lua/plugins/mini/surround.lua | 30 - .config/nvim/lua/plugins/mini/tabline.lua | 10 - .config/nvim/lua/plugins/multi-cursor.lua | 17 - .config/nvim/lua/plugins/neotree.lua | 119 -- .config/nvim/lua/plugins/nvim-cmp.lua | 331 ----- .config/nvim/lua/plugins/nvim-lint.lua | 113 -- .config/nvim/lua/plugins/nvim-scissors.lua | 28 - .config/nvim/lua/plugins/nvim-tree.lua | 98 -- .config/nvim/lua/plugins/snacks.lua | 84 -- .config/nvim/lua/plugins/subversive.lua | 10 - .config/nvim/lua/plugins/telescope.lua | 380 ------ .config/nvim/lua/plugins/template-string.lua | 8 - .config/nvim/lua/plugins/theme.lua | 58 - .config/nvim/lua/plugins/tmux.lua | 16 - .config/nvim/lua/plugins/toggleterm.lua | 30 - .config/nvim/lua/plugins/tpope.lua | 13 - .config/nvim/lua/plugins/tree-sitter.lua | 188 --- .../nvim/lua/plugins/ultimate-autopair.lua | 17 - .config/nvim/lua/plugins/whichkey.lua | 95 -- .../user/config/autocmds.lua} | 146 ++- .config/nvim/lua/user/config/keymaps.lua | 82 ++ .config/nvim/lua/user/config/options.lua | 102 ++ .config/nvim/lua/user/config/util.lua | 77 ++ .config/nvim/lua/user/lazy_init.lua | 36 + .config/nvim/lua/user/plugins/blink-cmp.lua | 196 +++ .../comment.lua => user/plugins/comments.lua} | 0 .config/nvim/lua/user/plugins/dadbod-sql.lua | 27 + .../dap.lua => user/plugins/debug-dap.lua} | 173 +-- .config/nvim/lua/{ => user}/plugins/dial.lua | 123 +- .../ufo.lua => user/plugins/folds.lua} | 6 +- .config/nvim/lua/user/plugins/formatting.lua | 102 ++ .../lua/user}/plugins/git-conflicts.lua | 0 .../plugins/git-signs.lua} | 20 +- .../nvim/lua/{ => user}/plugins/grapple.lua | 4 - .../nvim/lua/{ => user}/plugins/gx-nvim.lua | 0 .../nvim/lua/{ => user}/plugins/heirline.lua | 94 +- .../go.lua => user/plugins/lsp/golang.lua} | 37 +- .../lua/{ => user}/plugins/lsp/htmlcss.lua | 76 +- .config/nvim/lua/user/plugins/lsp/init.lua | 477 +++++++ .config/nvim/lua/user/plugins/lsp/json.lua | 29 + .config/nvim/lua/user/plugins/lsp/lua_ls.lua | 54 + .config/nvim/lua/user/plugins/lsp/prisma.lua | 5 + .config/nvim/lua/user/plugins/lsp/python.lua | 38 + .../plugins/lsp/tailwindcss.lua} | 27 +- .../lua/{ => user}/plugins/lsp/typescript.lua | 223 ++-- .config/nvim/lua/user/plugins/markdown.lua | 59 + .../nvim/lua/{ => user}/plugins/mini/ai.lua | 9 +- .../lua/{ => user}/plugins/mini/align.lua | 1 - .../lua/{ => user}/plugins/mini/files.lua | 97 +- .../plugins/mini/indentscope.lua} | 5 +- .../nvim/lua/user/plugins/mini/mini-icons.lua | 7 + .../nvim/lua/{ => user}/plugins/mini/move.lua | 1 - .../lua/{ => user}/plugins/mini/operators.lua | 2 - .config/nvim/lua/user/plugins/mini/pick.lua | 141 ++ .../nvim/lua/user/plugins/mini/surround.lua | 39 + .../nvim/lua/user/plugins/multi-cursor.lua | 73 ++ .../nvim/lua/{ => user}/plugins/neogen.lua | 0 .../nvim/lua/{ => user}/plugins/neogit.lua | 7 +- .config/nvim/lua/user/plugins/notes.lua | 51 + .../plugins/nvim-autopairs.lua} | 100 +- .../plugins/nvim-color-highlights.lua} | 7 +- .config/nvim/lua/user/plugins/nvim-lint.lua | 89 ++ .../nvim/lua/user/plugins/nvim-treesitter.lua | 98 ++ .../plugins/quickscope.lua} | 1 + .../lua/{ => user}/plugins/refactoring.lua | 0 .../nvim/lua/{ => user}/plugins/sessions.lua | 0 .config/nvim/lua/user/plugins/snacks.lua | 331 +++++ .../nvim/lua/{ => user}/plugins/surround.lua | 5 +- .../nvim/lua/user/plugins/template-string.lua | 9 + .config/nvim/lua/user/plugins/testing.lua | 78 ++ .config/nvim/lua/user/plugins/theme.lua | 129 ++ .../nvim/lua/{ => user}/plugins/undotree.lua | 0 .../nvim/lua/{ => user}/plugins/vim-swap.lua | 0 .config/nvim/lua/user/plugins/which-key.lua | 35 + .config/nvim/lua/{ => user}/plugins/yazi.lua | 9 +- .config/nvim/selene.toml | 1 - .config/nvim/snippets/lua.json | 35 +- .config/nvim/snippets/package.json | 10 +- .config/nvim/vim.toml | 55 - .config/spectrwm/spectrwm.conf | 167 --- .config/tmux-bkp/base.conf | 68 - .config/tmux-bkp/basic.tmuxtheme | 117 -- .config/tmux-bkp/keybind.conf | 90 -- .config/tmux-bkp/plug.conf | 6 - .config/tmux-bkp/tmux.conf | 10 - .config/tmux/tmux.conf | 7 +- .config/wezterm/wezterm.lua | 400 +++--- .config/zsh/.zshrc | 170 ++- .config/zsh/alias.zsh | 4 +- .emacs-profiles.el | 4 - neovim.yml | 8 + selene.toml | 9 +- vim.toml | 58 - 283 files changed, 5222 insertions(+), 15394 deletions(-) delete mode 100644 .config/awesome-another/rc.lua delete mode 100644 .config/awesome-another/theme.lua delete mode 100644 .config/awesome-another/widgets/calendar.lua delete mode 100644 .config/awesome-another/widgets/volume.lua delete mode 100644 .config/awesome/README.md delete mode 100644 .config/awesome/rc.lua delete mode 100644 .config/awesome/rc.lua.bkp delete mode 100644 .config/awesome/utils/ez_keys.lua delete mode 100644 .config/awesome/utils/helper.lua delete mode 100644 .config/awesome/utils/sample.lua delete mode 100644 .config/awesome/utils/theme.lua delete mode 100644 .config/awesome/widgets/battery/README.md delete mode 100644 .config/awesome/widgets/battery/bat-wid-1.png delete mode 100644 .config/awesome/widgets/battery/bat-wid-2.png delete mode 100644 .config/awesome/widgets/battery/bat-wid-22.png delete mode 100644 .config/awesome/widgets/battery/bat-wid-3.png delete mode 100644 .config/awesome/widgets/battery/init.lua delete mode 100644 .config/awesome/widgets/battery/spaceman.jpg delete mode 100644 .config/awesome/widgets/brightness/README.md delete mode 100644 .config/awesome/widgets/brightness/br-wid-1.png delete mode 100644 .config/awesome/widgets/brightness/brightness.svg delete mode 100644 .config/awesome/widgets/brightness/init.lua delete mode 100644 .config/awesome/widgets/calendar/README.md delete mode 100644 .config/awesome/widgets/calendar/calendar_bottom_right.png delete mode 100644 .config/awesome/widgets/calendar/calendar_start_sunday.png delete mode 100644 .config/awesome/widgets/calendar/calendar_top.png delete mode 100644 .config/awesome/widgets/calendar/calendar_top_right.png delete mode 100644 .config/awesome/widgets/calendar/dark.png delete mode 100644 .config/awesome/widgets/calendar/init.lua delete mode 100644 .config/awesome/widgets/calendar/light.png delete mode 100644 .config/awesome/widgets/calendar/nord.png delete mode 100644 .config/awesome/widgets/calendar/outrun.png delete mode 100644 .config/awesome/widgets/vol.lua delete mode 100755 .config/dk/dkrc delete mode 100644 .config/dk/scripts/bar.sh delete mode 100644 .config/dk/scripts/curwsinfo.sh delete mode 100644 .config/dk/scripts/dzenws.sh delete mode 100644 .config/dk/scripts/gap_alphaborder.sh delete mode 100644 .config/dk/scripts/layouts.sh delete mode 100644 .config/dk/scripts/scratch.sh delete mode 100644 .config/dk/scripts/title.sh delete mode 100755 .config/dk/scripts/workspaces.sh delete mode 100644 .config/dk/scripts/wsborders.sh delete mode 100755 .config/dk/sxhkdrc delete mode 100644 .config/efm-langserver/config.yaml delete mode 100644 .config/fish/conf.d/nix.fish delete mode 100644 .config/home-manager/home.nix delete mode 100644 .config/nvim-astro/after/plugin/keymaps.lua delete mode 100644 .config/nvim-astro/lua/config/gruber-darker.lua delete mode 100644 .config/nvim-astro/lua/config/kangawa.lua delete mode 100644 .config/nvim-astro/lua/config/m-utils.lua delete mode 100644 .config/nvim-astro/lua/config/nordic.lua create mode 100644 .config/nvim-astro/lua/plugins/ai.lua delete mode 100644 .config/nvim-astro/lua/plugins/ai/avante.lua delete mode 100644 .config/nvim-astro/lua/plugins/ai/code-companion.lua delete mode 100644 .config/nvim-astro/lua/plugins/color-highlight.lua delete mode 100644 .config/nvim-astro/lua/plugins/conform.lua delete mode 100644 .config/nvim-astro/lua/plugins/copilot.lua delete mode 100644 .config/nvim-astro/lua/plugins/dial.lua delete mode 100644 .config/nvim-astro/lua/plugins/dooing.lua create mode 100644 .config/nvim-astro/lua/plugins/emmet.lua delete mode 100644 .config/nvim-astro/lua/plugins/flash.lua delete mode 100644 .config/nvim-astro/lua/plugins/gx-nvim.lua delete mode 100644 .config/nvim-astro/lua/plugins/markdown-bullets.lua create mode 100644 .config/nvim-astro/lua/plugins/markdown.lua create mode 100644 .config/nvim-astro/lua/plugins/mini-nvim.lua delete mode 100644 .config/nvim-astro/lua/plugins/mini/align.lua delete mode 100644 .config/nvim-astro/lua/plugins/mini/move.lua delete mode 100644 .config/nvim-astro/lua/plugins/mini/operators.lua delete mode 100644 .config/nvim-astro/lua/plugins/mini/surround.lua delete mode 100644 .config/nvim-astro/lua/plugins/multi-cursor.lua create mode 100644 .config/nvim-astro/lua/plugins/multiple-cursors.lua delete mode 100644 .config/nvim-astro/lua/plugins/neogen.lua delete mode 100644 .config/nvim-astro/lua/plugins/neogit.lua delete mode 100644 .config/nvim-astro/lua/plugins/quick-scope.lua create mode 100644 .config/nvim-astro/lua/plugins/session.lua delete mode 100644 .config/nvim-astro/lua/plugins/sessions.lua create mode 100644 .config/nvim-astro/lua/plugins/snacks.lua delete mode 100644 .config/nvim-astro/lua/plugins/subversive.lua delete mode 100644 .config/nvim-astro/lua/plugins/telescope.lua delete mode 100644 .config/nvim-astro/lua/plugins/tpope.lua delete mode 100644 .config/nvim-astro/lua/plugins/undotree.lua delete mode 100644 .config/nvim-astro/lua/plugins/yazi.lua create mode 100644 .config/nvim-astro/snippets/javascriptreact.json create mode 100644 .config/nvim-astro/snippets/lua.json create mode 100644 .config/nvim-astro/snippets/package.json create mode 100644 .config/nvim-astro/snippets/typescriptreact.json delete mode 100644 .config/nvim-lazy/lua/plugins/lazydo.lua create mode 100644 .config/nvim-lazy/lua/plugins/lsp/clang.lua create mode 100644 .config/nvim-lazy/lua/plugins/lsp/golang.lua delete mode 100644 .config/nvim-lazy/lua/plugins/neoterm.lua create mode 100644 .config/nvim-lazy/lua/plugins/notes.lua create mode 100644 .config/nvim-lazy/lua/plugins/snacks.lua delete mode 100644 .config/nvim-lazy/lua/plugins/subversive.lua delete mode 100644 .config/nvim-lazy/lua/plugins/yazi.lua create mode 100644 .config/nvim/.DS_Store create mode 100644 .config/nvim/.editorconfig delete mode 100644 .config/nvim/after/ftplugin/markdown.lua delete mode 100644 .config/nvim/after/plugin/keymaps.lua delete mode 100644 .config/nvim/after/plugin/options.lua create mode 100644 .config/nvim/lazy-lock.json create mode 100644 .config/nvim/lua/.DS_Store delete mode 100644 .config/nvim/lua/chadrc.lua delete mode 100644 .config/nvim/lua/lazy_init.lua delete mode 100644 .config/nvim/lua/my_config/catppuccin.lua delete mode 100644 .config/nvim/lua/my_config/gruber-darker.lua delete mode 100644 .config/nvim/lua/my_config/kangawa.lua delete mode 100644 .config/nvim/lua/my_config/nordic.lua delete mode 100644 .config/nvim/lua/my_config/onenord.lua delete mode 100644 .config/nvim/lua/my_config/tokyonight.lua delete mode 100644 .config/nvim/lua/my_config/util.lua delete mode 100644 .config/nvim/lua/plugins/avante.lua delete mode 100644 .config/nvim/lua/plugins/base64.lua delete mode 100644 .config/nvim/lua/plugins/blink-cmp.lua delete mode 100644 .config/nvim/lua/plugins/conform.lua delete mode 100644 .config/nvim/lua/plugins/copilot.lua delete mode 100644 .config/nvim/lua/plugins/dadbod.lua delete mode 100644 .config/nvim/lua/plugins/dooing.lua delete mode 100644 .config/nvim/lua/plugins/flash.lua delete mode 100644 .config/nvim/lua/plugins/fzf-lua.lua delete mode 100644 .config/nvim/lua/plugins/git-conflicts.lua delete mode 100644 .config/nvim/lua/plugins/guess-indent.lua delete mode 100644 .config/nvim/lua/plugins/indents.lua delete mode 100644 .config/nvim/lua/plugins/init.lua delete mode 100644 .config/nvim/lua/plugins/lazydo.lua delete mode 100644 .config/nvim/lua/plugins/lsp/astrolsp.lua delete mode 100644 .config/nvim/lua/plugins/lsp/cpp.lua delete mode 100644 .config/nvim/lua/plugins/lsp/elixir.lua delete mode 100644 .config/nvim/lua/plugins/lsp/gleam.lua delete mode 100644 .config/nvim/lua/plugins/lsp/json.lua delete mode 100644 .config/nvim/lua/plugins/lsp/lspconfig.lua delete mode 100644 .config/nvim/lua/plugins/lsp/lua_ls.lua delete mode 100644 .config/nvim/lua/plugins/lsp/mason.lua delete mode 100644 .config/nvim/lua/plugins/lsp/nim.lua delete mode 100644 .config/nvim/lua/plugins/lsp/php.lua delete mode 100644 .config/nvim/lua/plugins/lsp/prisma.lua delete mode 100644 .config/nvim/lua/plugins/lsp/python.lua delete mode 100644 .config/nvim/lua/plugins/lsp/rust.lua delete mode 100644 .config/nvim/lua/plugins/lsp/svelte.lua delete mode 100644 .config/nvim/lua/plugins/lsp/vue.lua delete mode 100644 .config/nvim/lua/plugins/lsp/yaml.lua delete mode 100644 .config/nvim/lua/plugins/lsp/zk.lua delete mode 100644 .config/nvim/lua/plugins/lualine.lua delete mode 100644 .config/nvim/lua/plugins/markdown-bullets.lua delete mode 100644 .config/nvim/lua/plugins/mini/comment.lua delete mode 100644 .config/nvim/lua/plugins/mini/misc.lua delete mode 100644 .config/nvim/lua/plugins/mini/pairs.lua delete mode 100644 .config/nvim/lua/plugins/mini/pick.lua delete mode 100644 .config/nvim/lua/plugins/mini/statusline.lua delete mode 100644 .config/nvim/lua/plugins/mini/surround.lua delete mode 100644 .config/nvim/lua/plugins/mini/tabline.lua delete mode 100644 .config/nvim/lua/plugins/multi-cursor.lua delete mode 100644 .config/nvim/lua/plugins/neotree.lua delete mode 100644 .config/nvim/lua/plugins/nvim-cmp.lua delete mode 100644 .config/nvim/lua/plugins/nvim-lint.lua delete mode 100644 .config/nvim/lua/plugins/nvim-scissors.lua delete mode 100644 .config/nvim/lua/plugins/nvim-tree.lua delete mode 100644 .config/nvim/lua/plugins/snacks.lua delete mode 100644 .config/nvim/lua/plugins/subversive.lua delete mode 100644 .config/nvim/lua/plugins/telescope.lua delete mode 100644 .config/nvim/lua/plugins/template-string.lua delete mode 100644 .config/nvim/lua/plugins/theme.lua delete mode 100644 .config/nvim/lua/plugins/tmux.lua delete mode 100644 .config/nvim/lua/plugins/toggleterm.lua delete mode 100644 .config/nvim/lua/plugins/tpope.lua delete mode 100644 .config/nvim/lua/plugins/tree-sitter.lua delete mode 100644 .config/nvim/lua/plugins/ultimate-autopair.lua delete mode 100644 .config/nvim/lua/plugins/whichkey.lua rename .config/nvim/{after/plugin/autocommands.lua => lua/user/config/autocmds.lua} (67%) create mode 100644 .config/nvim/lua/user/config/keymaps.lua create mode 100644 .config/nvim/lua/user/config/options.lua create mode 100644 .config/nvim/lua/user/config/util.lua create mode 100644 .config/nvim/lua/user/lazy_init.lua create mode 100644 .config/nvim/lua/user/plugins/blink-cmp.lua rename .config/nvim/lua/{plugins/comment.lua => user/plugins/comments.lua} (100%) create mode 100644 .config/nvim/lua/user/plugins/dadbod-sql.lua rename .config/nvim/lua/{plugins/dap.lua => user/plugins/debug-dap.lua} (50%) rename .config/nvim/lua/{ => user}/plugins/dial.lua (69%) rename .config/nvim/lua/{plugins/ufo.lua => user/plugins/folds.lua} (92%) create mode 100644 .config/nvim/lua/user/plugins/formatting.lua rename .config/{nvim-astro/lua => nvim/lua/user}/plugins/git-conflicts.lua (100%) rename .config/nvim/lua/{plugins/gitsigns.lua => user/plugins/git-signs.lua} (74%) rename .config/nvim/lua/{ => user}/plugins/grapple.lua (88%) rename .config/nvim/lua/{ => user}/plugins/gx-nvim.lua (100%) rename .config/nvim/lua/{ => user}/plugins/heirline.lua (70%) rename .config/nvim/lua/{plugins/lsp/go.lua => user/plugins/lsp/golang.lua} (76%) rename .config/nvim/lua/{ => user}/plugins/lsp/htmlcss.lua (78%) create mode 100644 .config/nvim/lua/user/plugins/lsp/init.lua create mode 100644 .config/nvim/lua/user/plugins/lsp/json.lua create mode 100644 .config/nvim/lua/user/plugins/lsp/lua_ls.lua create mode 100644 .config/nvim/lua/user/plugins/lsp/prisma.lua create mode 100644 .config/nvim/lua/user/plugins/lsp/python.lua rename .config/nvim/lua/{plugins/lsp/tailwind.lua => user/plugins/lsp/tailwindcss.lua} (80%) rename .config/nvim/lua/{ => user}/plugins/lsp/typescript.lua (53%) create mode 100644 .config/nvim/lua/user/plugins/markdown.lua rename .config/nvim/lua/{ => user}/plugins/mini/ai.lua (87%) rename .config/nvim/lua/{ => user}/plugins/mini/align.lua (89%) rename .config/nvim/lua/{ => user}/plugins/mini/files.lua (71%) rename .config/nvim/lua/{plugins/mini/indent.lua => user/plugins/mini/indentscope.lua} (95%) create mode 100644 .config/nvim/lua/user/plugins/mini/mini-icons.lua rename .config/nvim/lua/{ => user}/plugins/mini/move.lua (97%) rename .config/nvim/lua/{ => user}/plugins/mini/operators.lua (95%) create mode 100644 .config/nvim/lua/user/plugins/mini/pick.lua create mode 100644 .config/nvim/lua/user/plugins/mini/surround.lua create mode 100644 .config/nvim/lua/user/plugins/multi-cursor.lua rename .config/nvim/lua/{ => user}/plugins/neogen.lua (100%) rename .config/nvim/lua/{ => user}/plugins/neogit.lua (60%) create mode 100644 .config/nvim/lua/user/plugins/notes.lua rename .config/nvim/lua/{plugins/autopairs.lua => user/plugins/nvim-autopairs.lua} (62%) rename .config/nvim/lua/{plugins/colorizer.lua => user/plugins/nvim-color-highlights.lua} (58%) create mode 100644 .config/nvim/lua/user/plugins/nvim-lint.lua create mode 100644 .config/nvim/lua/user/plugins/nvim-treesitter.lua rename .config/nvim/lua/{plugins/quick-scope.lua => user/plugins/quickscope.lua} (93%) rename .config/nvim/lua/{ => user}/plugins/refactoring.lua (100%) rename .config/nvim/lua/{ => user}/plugins/sessions.lua (100%) create mode 100644 .config/nvim/lua/user/plugins/snacks.lua rename .config/nvim/lua/{ => user}/plugins/surround.lua (60%) create mode 100644 .config/nvim/lua/user/plugins/template-string.lua create mode 100644 .config/nvim/lua/user/plugins/testing.lua create mode 100644 .config/nvim/lua/user/plugins/theme.lua rename .config/nvim/lua/{ => user}/plugins/undotree.lua (100%) rename .config/nvim/lua/{ => user}/plugins/vim-swap.lua (100%) create mode 100644 .config/nvim/lua/user/plugins/which-key.lua rename .config/nvim/lua/{ => user}/plugins/yazi.lua (79%) delete mode 100644 .config/nvim/selene.toml delete mode 100644 .config/nvim/vim.toml delete mode 100644 .config/spectrwm/spectrwm.conf delete mode 100644 .config/tmux-bkp/base.conf delete mode 100644 .config/tmux-bkp/basic.tmuxtheme delete mode 100644 .config/tmux-bkp/keybind.conf delete mode 100644 .config/tmux-bkp/plug.conf delete mode 100644 .config/tmux-bkp/tmux.conf delete mode 100644 .emacs-profiles.el create mode 100644 neovim.yml delete mode 100644 vim.toml diff --git a/.config/awesome-another/rc.lua b/.config/awesome-another/rc.lua deleted file mode 100644 index 8fd85e3..0000000 --- a/.config/awesome-another/rc.lua +++ /dev/null @@ -1,1069 +0,0 @@ --- If LuaRocks is installed, make sure that packages installed through it are --- found (e.g. lgi). If LuaRocks is not installed, do nothing. -pcall(require, 'luarocks.loader') - --- Standard awesome library -local gears = require 'gears' -local awful = require 'awful' -local common = require 'awful.widget.common' -require 'awful.autofocus' --- Widget and layout library -local wibox = require 'wibox' --- Theme handling library -local beautiful = require 'beautiful' --- Notification library -local naughty = require 'naughty' -local menubar = require 'menubar' -local hotkeys_popup = require 'awful.hotkeys_popup' --- Enable hotkeys help widget for VIM and other apps --- when client with a matching name is opened: -require 'awful.hotkeys_popup.keys' - -local volume_w = require 'widgets.volume' - --- {{{ 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 --- }}} - --- {{{ Variable definitions --- Themes define colours, icons, font and wallpapers. -beautiful.init(gears.filesystem.get_xdg_config_home() .. 'awesome/theme.lua') - --- This is used later as the default terminal and editor to run. -local terminal = os.getenv 'TERMINAL' or 'xterm' -local browser = os.getenv 'BROWSER' or 'firefox' -local editor = os.getenv 'EDITOR' or 'nano' -local editor_cmd = terminal .. ' -e ' .. editor -local modkey = 'Mod4' -local altkey = 'Mod1' - --- Table of layouts to cover with awful.layout.inc, order matters. -awful.layout.layouts = { - awful.layout.suit.tile, - -- awful.layout.suit.tile.left, - -- awful.layout.suit.tile.bottom, - -- awful.layout.suit.tile.top, - awful.layout.suit.floating, - awful.layout.suit.fair, - awful.layout.suit.fair.horizontal, - -- awful.layout.suit.spiral, - -- awful.layout.suit.spiral.dwindle, - awful.layout.suit.max, - -- awful.layout.suit.max.fullscreen, - awful.layout.suit.magnifier, - awful.layout.suit.corner.nw, - -- awful.layout.suit.corner.ne, - -- awful.layout.suit.corner.sw, - -- awful.layout.suit.corner.se, -} --- }}} - --- {{{ Menu --- Create a launcher widget and a main menu --- myawesomemenu = { --- { --- "hotkeys", --- function() --- hotkeys_popup.show_help(nil, awful.screen.focused()) --- end, --- }, --- { "manual", terminal .. " -e man awesome" }, --- { "edit config", editor_cmd .. " " .. awesome.conffile }, --- { "restart", awesome.restart }, --- { --- "quit", --- function() --- awesome.quit() --- end, --- }, --- } --- --- Menubar configuration -menubar.utils.terminal = terminal -- Set the terminal for applications that require it --- }}} - --- {{{ Wibar --- Create a textclock widget --- local mytextclock = wibox.widget.textclock("%a %b %d, %I:%M %p") -local systray = wibox.widget.systray() -systray:set_base_size(26) --- beautiful.get_cal(mytextclock) --- Create a wibox for each screen and add it -local taglist_buttons = gears.table.join( - awful.button({}, 1, function(t) - t:view_only() - end), - awful.button({ modkey }, 1, function(t) - if client.focus then - client.focus:move_to_tag(t) - end - end), - awful.button({}, 3, awful.tag.viewtoggle), - awful.button({ modkey }, 3, function(t) - if client.focus then - client.focus:toggle_tag(t) - end - end), - awful.button({}, 4, function(t) - awful.tag.viewnext(t.screen) - end), - awful.button({}, 5, function(t) - awful.tag.viewprev(t.screen) - end) -) - -local tasklist_buttons = gears.table.join( - awful.button({}, 1, function(c) - if c == client.focus then - c.minimized = true - else - c:emit_signal('request::activate', 'tasklist', { raise = true }) - end - end), - awful.button({}, 3, function() - awful.menu.client_list({ theme = { width = 250 } }) - end), - awful.button({}, 4, function() - awful.client.focus.byidx(1) - end), - awful.button({}, 5, function() - awful.client.focus.byidx(-1) - end) -) - --- local function set_wallpaper(s) --- -- Wallpaper --- if beautiful.wallpaper then --- local wallpaper = beautiful.wallpaper --- -- If wallpaper is a function, call it with the screen --- if type(wallpaper) == "function" then --- wallpaper = wallpaper(s) --- end --- gears.wallpaper.maximized(wallpaper, s, true) --- end --- end - --- Re-set wallpaper when a screen's geometry changes (e.g. different resolution) --- screen.connect_signal("property::geometry", set_wallpaper) - -local big_icon = function(icon) - return wibox.widget({ - widget = wibox.widget.textbox, - text = icon, - font = 'Hack Nerd Font 14', - }) -end -awful.screen.connect_for_each_screen(function(s) - -- Wallpaper - -- set_wallpaper(s) - - -- Each screen has its own tag table. - awful.tag({ '1', '2', '3', '4', '5', '6', '7', '8', '9' }, s, awful.layout.layouts[1]) - - -- Create a promptbox for each screen - s.mypromptbox = awful.widget.prompt() - -- Create an imagebox widget which will contain an icon indicating which layout we're using. - -- We need one layoutbox per screen. - s.mylayoutbox = awful.widget.layoutbox(s) - s.mylayoutbox:buttons(gears.table.join( - 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 a taglist widget - s.mytaglist = awful.widget.taglist({ - screen = s, - filter = awful.widget.taglist.filter.noempty, - buttons = taglist_buttons, - }) - - -- Create a tasklist widget - s.mytasklist = awful.widget.tasklist({ - screen = s, - filter = awful.widget.tasklist.filter.currenttags, - buttons = tasklist_buttons, - -- forced_height = 6, - }) - - -- Create the wibox - s.mywibox = awful.wibar({ position = 'top', screen = s }) - local my_widgets = { - clock = wibox.widget({ - big_icon '󰃭 ', - beautiful.clock, - spacing = beautiful.xresources.apply_dpi(2), - layout = wibox.layout.fixed.horizontal, - }), - memory = wibox.widget({ - big_icon '󰍛 ', - awful.widget.watch('bash -c "sb-memory | cut -d\' \' -f3"', 3), -- default 5 seconds timeout - spacing = beautiful.xresources.apply_dpi(2), - layout = wibox.layout.fixed.horizontal, - }), - cpu = wibox.widget({ - big_icon '󰻠 ', - awful.widget.watch('bash -c "sb-load | cut -d\' \' -f5"', 3), -- default 5 seconds timeout - spacing = beautiful.xresources.apply_dpi(2), - layout = wibox.layout.fixed.horizontal, - }), - wifi = wibox.widget({ - big_icon '󰤥 ', - awful.widget.watch('bash -c "nmcli connection show --active | awk \'NR==2 {print $1}\'"', 60), -- 60 seconds timeout - spacing = beautiful.xresources.apply_dpi(2), - layout = wibox.layout.fixed.horizontal, - }), - } - local right_side = { - layout = wibox.layout.fixed.horizontal, - spacing = beautiful.xresources.apply_dpi(10), - my_widgets.clock, - my_widgets.memory, - my_widgets.cpu, - volume_w.volume_widget, - my_widgets.wifi, - s.mylayoutbox, - systray, - } - -- Add widgets to the wibox - s.mywibox:setup({ - layout = wibox.layout.align.horizontal, - { - -- Left widgets - layout = wibox.layout.fixed.horizontal, - s.mytaglist, - s.mypromptbox, - }, - s.mytasklist, -- Middle widget - right_side, - -- { - -- Right widgets - -- layout = wibox.layout.fixed.horizontal, - -- big_icon("󰃭"), - -- beautiful.clock, - -- big_icon("󰍛"), - -- awful.widget.watch("bash -c \"sb-memory | cut -d' ' -f3\"", 3), -- default 5 seconds timeout - -- big_icon("󰻠"), - -- awful.widget.watch("bash -c \"sb-load | cut -d' ' -f5\"", 3), -- default 5 seconds timeout - -- -- beautiful.vol_icon, - -- -- beautiful.volume.widget, - -- volume_w.volume_widget, - -- big_icon("󰤥 "), - -- awful.widget.watch("bash -c \"nmcli connection show --active | awk 'NR==2 {print $1}'\"", 60), -- 60 seconds timeout - -- s.mylayoutbox, - -- systray, - -- }, - }) -end) --- }}} - --- {{{ Mouse bindings -root.buttons(gears.table.join( - awful.button({}, 3, function() - awful.spawn.with_shell 'rofi -show drun' - end), - awful.button({}, 4, awful.tag.viewnext), - awful.button({}, 5, awful.tag.viewprev) -)) --- }}} - --- {{{ Key bindings --- Helper functions {{{ - --- Defines to move the currently focused window. --- to next/previous adjacent tag. --- -1 for previous and 1 for next adjacent tag. --- @param val number this is either be 1 or -1 --- @param total_tags number total number of tags to cycle through (default total no. tags created) --- @see client.focus:move_to_tag() -local move_to_tag = function(val, total_tags) - local c = client.focus - local step = val == 1 and 0 or 2 - local total = total_tags or #awful.screen.focused().tags - -- get current tag - local t = c and c.first_tag or nil - if t == nil then - return - end - -- get previous tag (modulo 9 excluding 0 to wrap from 1 to 9) - local tag = c.screen.tags[(t.name - step) % total + 1] - c:move_to_tag(tag) - tag:view_only() -end --- Skim through non empty tags. --- @param direction number which can either be 1(forward)[default] or -1(backward) --- @param s awful.screen Which monitor to view non empty tag. By default currently focused screen --- @see lain.util.tag_view_nonempty() -local tag_view_nonempty = function(direction, s) - direction = direction or 1 - s = s or awful.screen.focused() - local tags = s.tags - local sel = s.selected_tag - - local i = sel.index - repeat - i = i + direction - - -- Wrap around when we reach one of the bounds - if i > #tags then - i = i - #tags - end - if i < 1 then - i = i + #tags - end - - local t = tags[i] - - -- Stop when we get back to where we started - if t == sel then - break - end - - -- If it's The One, view it. - if #t:clients() > 0 then - t:view_only() - return - end - until false -end --- Resize windows universally. --- @param direction string which direction to go left,right,up,down --- @param pixel number value to resize windows by, default is 0.05 --- @see awful.tag.incmwfact() --- @see awful.client.incwfact() -local resize_window_tiled = function(direction, pixel) - pixel = pixel or 0.05 - -- change pixel to negative if direction is "down/left" - if direction == 'down' or direction == 'left' then - pixel = -pixel - end - - if direction == 'left' or direction == 'right' then - awful.tag.incmwfact(pixel) - else - local master_win = awful.client.getmaster().window - local current_win = client.focus.window - if master_win == current_win then - awful.tag.incmwfact(pixel) - else - pixel = direction == 'up' and -0.05 or 0.05 - awful.client.incwfact(pixel) - end - end -end - -local resize_float = function(c, direction, move) - local move = move or 20 - local direction = direction or 'up' - local c = c or client.focus - if direction == 'left' then - c:relative_move(0, 0, -move, 0) - elseif direction == 'right' then - c:relative_move(0, 0, move, 0) - elseif direction == 'down' then - c:relative_move(0, 0, 0, move) - else - c:relative_move(0, 0, 0, -move) - end -end - -local resize_window = function(direction) - local c = client.focus - if c.floating then - resize_float(c, direction) - else - resize_window_tiled(direction) - end -end --- }}} - -globalkeys = gears.table.join( - -- Tag Browsing {{{ - awful.key({ modkey }, '[', awful.tag.viewprev, { description = 'view previous', group = 'tag' }), - awful.key({ modkey }, ']', awful.tag.viewnext, { description = 'view next', group = 'tag' }), - awful.key({ modkey, 'Shift' }, '[', function() - move_to_tag(-1) - end, { description = 'move the focused client to previous tag', group = 'tag' }), - awful.key({ modkey, 'Shift' }, ']', function() - move_to_tag(1) - end, { description = 'move the focused client to next tag', group = 'tag' }), - -- }}} - -- Focus clients {{{ - awful.key({ modkey }, 'Down', function() - awful.client.focus.global_bydirection 'down' - if client.focus then - client.focus:raise() - end - end, { description = 'focus down', group = 'client' }), - awful.key({ modkey }, 'Up', function() - awful.client.focus.global_bydirection 'up' - if client.focus then - client.focus:raise() - end - end, { description = 'focus up', group = 'client' }), - awful.key({ modkey }, 'Left', function() - awful.client.focus.global_bydirection 'left' - if client.focus then - client.focus:raise() - end - end, { description = 'focus left', group = 'client' }), - awful.key({ modkey }, 'Right', function() - awful.client.focus.global_bydirection 'right' - if client.focus then - client.focus:raise() - end - end, { description = 'focus right', group = 'client' }), - awful.key({ modkey }, 'j', function() - awful.client.focus.byidx(1) - if client.focus then - client.focus:raise() - end - end, { description = 'focus down', group = 'client' }), - awful.key({ modkey }, 'k', function() - awful.client.focus.byidx(-1) - if client.focus then - client.focus:raise() - end - end, { description = 'focus up', group = 'client' }), - awful.key({ modkey }, 'h', function() - awful.client.focus.global_bydirection 'left' - if client.focus then - client.focus:raise() - end - end, { description = 'focus left', group = 'client' }), - awful.key({ modkey }, 'l', function() - awful.client.focus.global_bydirection 'right' - if client.focus then - client.focus:raise() - end - end, { description = 'focus right', group = 'client' }), - - awful.key({ modkey }, 'Tab', function() - awful.tag.history.restore() - if client.focus then - client.focus:raise() - end - end, { description = 'go back', group = 'tag' }), - awful.key({ altkey, 'Shift' }, 'Tab', function() - awful.client.focus.byidx(-1) - if client.focus then - client.focus:raise() - end - end, { description = 'Focus to previous Client', group = 'client' }), - -- }}} - -- Non-empty tag browsing {{{ - awful.key({ modkey }, 'grave', function() - tag_view_nonempty(1) - end, { description = 'view next nonempty', group = 'tag' }), - - awful.key({ modkey, 'Shift' }, 'grave', function() - tag_view_nonempty(-1) - end, { description = 'view previous nonempty', group = 'tag' }), - - awful.key({ modkey }, 'comma', function() - tag_view_nonempty(-1) - end, { description = 'view previous nonempty', group = 'tag' }), - - awful.key({ modkey }, 'period', function() - tag_view_nonempty(1) - end, { description = 'view next nonempty', group = 'tag' }), - --- }}} - awful.key({ modkey }, 'F1', hotkeys_popup.show_help, { description = 'show help', group = 'awesome' }), - - -- Resize windows {{{ - awful.key({ modkey, 'Control' }, 'Left', function() - resize_window 'left' - end, { description = 'Resize left', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Right', function() - resize_window 'right' - end, { description = 'Resize Right', group = 'client' }), - --}}} - -- Standard program {{{ - awful.key({ modkey }, 'w', function() - awful.spawn.with_shell 'brave || brave-browser || flatpak run com.brave.Browser || firefox' - end, { description = 'open a ' .. browser, group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'w', function() - local cmd = browser ~= 'firefox' and 'firefox' - or 'brave || brave-browser || chromium || chromium-browser || flatpak run com.github.Eloston.UngoogledChromium' - -- local cmd = 'chromium || chromium-browser || brave || brave-browser' - awful.spawn.easy_async_with_shell(cmd, function(_, err) - if (err ~= '' or err ~= nil) and string.find(err, 'brave-browser') ~= nil then - naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Browser Not Found', - text = 'Brave or Chromium is not installed in the system ' .. err, - }) - end - end) - end, { description = 'open a firefox', group = 'launcher' }), - awful.key({ modkey }, 'e', function() - awful.spawn.with_shell 'thunar || pcmanfm-qt || pcmanfm' - end, { description = 'open a file manager', group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'e', function() - awful.spawn 'kitty -e vif' - end, { description = 'open a lfrun', group = 'launcher' }), - -- Standard program - awful.key({ modkey }, 'Return', function() - awful.spawn 'alacritty' - end, { description = 'open a ' .. terminal, group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'Return', function() - awful.spawn 'kitty' - end, { description = 'open a kitty', group = 'launcher' }), - --}}} - - -- Layout manipulation - awful.key({ modkey, 'Shift' }, 'j', function() - awful.client.swap.byidx(1) - end, { description = 'swap with next client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'k', function() - awful.client.swap.byidx(-1) - end, { description = 'swap with previous client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'Left', function() - awful.client.swap.byidx(-1) - end, { description = 'swap with next client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'Right', function() - awful.client.swap.byidx(1) - end, { description = 'swap with previous client by index', group = 'client' }), - awful.key({ modkey }, 'u', awful.client.urgent.jumpto, { description = 'jump to urgent client', group = 'client' }), - awful.key({ altkey }, 'Tab', function() - awful.client.focus.history.previous() - if client.focus then - client.focus:raise() - end - end, { description = 'go back', group = 'client' }), - - awful.key({ modkey, 'Shift' }, 'd', function() - awful.spawn 'dmenu_run_history -i' - end, { description = 'Launch Dmenu', group = 'launcher' }), - awful.key({ modkey }, 'd', function() - awful.spawn 'rofi -show run -async-read 10 -config ~/.config/rofi/dmenu.rasi' - end, { description = 'Launch Rofi with dmenu theme', group = 'launcher' }), - - awful.key({ 'altkey' }, 'Print', function() - awful.spawn.with_shell 'flameshot gui' - end, { description = 'Capture Screenshot(Fullscreen - flameshot)', group = 'launcher' }), - awful.key({}, 'Print', function() - awful.spawn.with_shell 'take_ss clip' - end, { description = 'Capture Screenshot(Fullscreen - Maim)', group = 'launcher' }), - awful.key({ 'Shift' }, 'Print', function() - awful.spawn.with_shell 'take_ss focus' - end, { description = 'Capture Screenshot(focus)', group = 'launcher' }), - - awful.key({ modkey }, 'v', function() - awful.spawn 'virt-manager' - end, { description = 'Launch VirtualBox', group = 'launcher' }), - awful.key({ modkey, 'Control' }, 'r', awesome.restart, { description = 'reload awesome', group = 'awesome' }), - awful.key({ modkey, 'Control' }, 'x', awesome.quit, { description = 'quit awesome', group = 'awesome' }), - awful.key({ modkey }, 'g', function() - local cmd = 'qalculate-gtk || gnome-calculator || galculator' - awful.spawn.easy_async_with_shell(cmd, function(_, err) - if err ~= '' or err ~= nil then - if string.find(err, 'galculator') ~= nil then - naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Calculator Not Found', - text = 'Qalculate-gtk, Gnome-calculator or Galculator is not installed in the system ' .. err, - }) - end - end - end) - end, { description = 'Launch Calculator', group = 'launcher' }), - -- awful.key({ modkey }, "l", function() - -- awful.tag.incmwfact(0.05) - -- end, { description = "increase master width factor", group = "layout" }), - -- awful.key({ modkey }, "h", function() - -- awful.tag.incmwfact( -0.05) - -- end, { description = "decrease master width factor", group = "layout" }), - -- awful.key({ modkey, "Shift" }, "h", function() - -- awful.tag.incnmaster(1, nil, true) - -- end, { description = "increase the number of master clients", group = "layout" }), - -- awful.key({ modkey, "Shift" }, "l", function() - -- awful.tag.incnmaster( -1, nil, true) - -- end, { description = "decrease the number of master clients", group = "layout" }), - -- awful.key({ modkey, "Control" }, "h", function() - -- awful.tag.incncol(1, nil, true) - -- end, { description = "increase the number of columns", group = "layout" }), - -- awful.key({ modkey, "Control" }, "l", function() - -- awful.tag.incncol( -1, nil, true) - -- end, { description = "decrease the number of columns", group = "layout" }), - - awful.key({ modkey }, 'space', function() - awful.layout.inc(1) - end, { description = 'select next', group = 'layout' }), - awful.key({ modkey, 'Shift' }, 'space', function() - awful.layout.inc(-1) - end, { description = 'select previous', group = 'layout' }), - - awful.key({ modkey, 'Control' }, 's', function() - awful.spawn.with_shell 'logout_prompt' - end, { description = 'Ask For Logout(ie shutdown,reboot or logout)', group = 'scripts' }), - awful.key({ modkey, altkey }, 'c', function() - awful.spawn 'open-rcs' - end, { description = 'Edit RC files', group = 'scripts' }), - awful.key({ modkey, altkey }, 'g', function() - awful.spawn 'open-games' - end, { description = 'Launch Game', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'p', function() - awful.spawn 'get-class-name' - end, { description = 'Get window class name', group = 'scripts' }), - awful.key({ 'Control', altkey }, 'c', function() - awful.spawn.with_shell 'xcolor -s' - end, { description = 'Color Selector', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'e', function() - awful.spawn 'rofie' - end, { description = 'Launch Emoji Selector', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'v', function() - awful.spawn 'pavucontrol' - end, { description = 'launch volume controller', group = 'launcher' }), - awful.key({ modkey, 'Control' }, 'n', function() - local c = awful.client.restore() - -- Focus restored client - if c then - c:emit_signal('request::activate', 'key.unminimize', { raise = true }) - end - end, { description = 'restore minimized', group = 'client' }), - - -- Prompt - awful.key({ modkey }, 'y', function() - awful.spawn.with_shell 'clipboard' - end, { description = 'Launch Clipboard Manager', group = 'scripts' }), - awful.key({ modkey }, 'r', function() - awful.spawn.with_shell 'rofi -show drun -async-pre-read' - end, { description = 'Rofi Application Launcher', group = 'launcher' }), - - awful.key({ modkey }, 'x', function() - awful.prompt.run({ - prompt = 'Run Lua code: ', - textbox = awful.screen.focused().mypromptbox.widget, - exe_callback = awful.util.eval, - history_path = awful.util.get_cache_dir() .. '/history_eval', - }) - end, { description = 'lua execute prompt', group = 'awesome' }), - - -- Brightness {{{ - - awful.key({}, 'XF86MonBrightnessUp', function() - awful.spawn.with_shell 'brightnessctl s 10+' - end, { description = 'Brightness +10%', group = 'hotkeys' }), - awful.key({}, 'XF86MonBrightnessDown', function() - awful.spawn.with_shell 'brightnessctl s 10-' - end, { description = 'Brightness -10%', group = 'hotkeys' }), - awful.key({ 'Shift' }, 'XF86MonBrightnessUp', function() - awful.spawn.with_shell 'brightnessctl s 200' - end, { description = '-10%', group = 'hotkeys' }), - awful.key({ 'Shift' }, 'XF86MonBrightnessDown', function() - awful.spawn.with_shell 'brightnessctl s 20' - end, { description = '-10%', group = 'hotkeys' }), - --- }}} - - -- Volume Control {{{ - - awful.key({}, 'XF86AudioRaiseVolume', function() - volume_w.volume_increase() - -- awful.spawn.with_shell("pactl set-sink-volume @DEFAULT_SINK@ +10%") - -- beautiful.volume.update() - end, { description = 'volume up', group = 'hotkeys' }), - awful.key({}, 'XF86AudioLowerVolume', function() - volume_w.volume_decrease() - -- awful.spawn.with_shell("pactl set-sink-volume @DEFAULT_SINK@ -10%") - -- beautiful.volume.update() - end, { description = 'volume down', group = 'hotkeys' }), - awful.key({}, 'XF86AudioMute', function() - volume_w.volume_toggle() - -- awful.spawn.with_shell("pactl set-sink-mute @DEFAULT_SINK@ toggle") - -- beautiful.volume.update() - end, { description = 'toggle mute', group = 'hotkeys' }), - -- Menubar - awful.key({ modkey }, 'p', function() - menubar.show() - end, { description = 'show the menubar', group = 'launcher' }) -) - -clientkeys = gears.table.join( - awful.key({ modkey }, 'f', function(c) - c.fullscreen = not c.fullscreen - local cur_tag = client.focus and client.focus.first_tag or nil - if not cur_tag then - return naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Not Found', - text = 'Current tag returned nil', - }) - end - for _, cls in ipairs(cur_tag:clients()) do - -- minimize all windows except the focused one - if c.window ~= cls.window then - cls.hidden = c.fullscreen - -- mouse.screen.mywibox.visible = not c.fullscreen - end - end - c:raise() - end, { description = 'toggle fullscreen', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'q', function(c) - c:kill() - end, { description = 'close', group = 'client' }), - awful.key({ modkey }, 's', awful.client.floating.toggle, { description = 'toggle floating', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Return', function(c) - c:swap(awful.client.getmaster()) - end, { description = 'move to master', group = 'client' }), - awful.key({ modkey, 'Shift' }, 't', function(c) - c.ontop = not c.ontop - end, { description = 'toggle keep on top', group = 'client' }), - - awful.key({ modkey }, 'm', function() - -- c.maximized = not c.maximized - -- c:raise() - local layout_name = awful.layout.get().name - local change_layout = layout_name == 'max' and awful.layout.suit.tile or awful.layout.suit.max - awful.layout.set(change_layout) - end, { description = 'Toggle Between max layout', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'm', function(c) - c.maximized = not c.maximized - c:raise() - end, { description = 'maximize focused window', group = 'client' }), - awful.key({ modkey }, 't', function() - -- c.fullscreen = false - -- c.sticky = false - -- c.floating = false - awful.layout.set(awful.layout.suit.tile) - end, { description = 'Change to tile layout', group = 'client' }) - -- awful.key({ modkey }, "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({ modkey }, "m", function(c) - -- c.maximized = not c.maximized - -- c:raise() - -- end, { description = "(un)maximize", group = "client" }), - -- awful.key({ modkey, "Control" }, "m", function(c) - -- c.maximized_vertical = not c.maximized_vertical - -- c:raise() - -- end, { description = "(un)maximize vertically", group = "client" }), - -- awful.key({ modkey, "Shift" }, "m", function(c) - -- c.maximized_horizontal = not c.maximized_horizontal - -- c:raise() - -- end, { description = "(un)maximize horizontally", group = "client" }) -) - --- Bind all key numbers to tags. --- Be careful: we use keycodes to make it work on any keyboard layout. --- This should map on the top row of your keyboard, usually 1 to 9. -for i = 1, 9 do - globalkeys = gears.table.join( - globalkeys, - -- View tag only. - awful.key({ modkey }, '#' .. i + 9, function() - local screen = awful.screen.focused() - local tag = screen.tags[i] - if tag then - tag:view_only() - end - end, { description = 'view tag #' .. i, group = 'tag' }), - -- Toggle tag display. - awful.key({ modkey, 'Control' }, '#' .. i + 9, function() - local screen = awful.screen.focused() - local tag = screen.tags[i] - if tag then - awful.tag.viewtoggle(tag) - end - end, { description = 'toggle tag #' .. i, group = 'tag' }), - -- Move client to tag. - awful.key({ modkey, 'Shift' }, '#' .. i + 9, function() - if client.focus then - local tag = client.focus.screen.tags[i] - if tag then - client.focus:move_to_tag(tag) - tag:view_only() - end - end - end, { description = 'move focused client to tag #' .. i, group = 'tag' }), - -- Toggle tag on focused client. - awful.key({ modkey, 'Control', 'Shift' }, '#' .. i + 9, function() - if client.focus then - local tag = client.focus.screen.tags[i] - if tag then - client.focus:toggle_tag(tag) - end - end - end, { description = 'toggle focused client on tag #' .. i, group = 'tag' }) - ) -end - -clientbuttons = gears.table.join( - awful.button({}, 1, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - end), - awful.button({ modkey }, 2, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - awful.client.floating.toggle(c) - end), - awful.button({ modkey }, 1, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - awful.mouse.client.move(c) - end), - awful.button({ modkey }, 3, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - awful.mouse.client.resize(c) - end) -) - --- Set keys -root.keys(globalkeys) --- }}} - --- {{{ Rules --- Rules to apply to new clients (through the "manage" signal). -awful.rules.rules = { - -- All clients will match this rule. - { - rule = {}, - properties = { - border_width = beautiful.border_width, - border_color = beautiful.border_normal, - focus = awful.client.focus.filter, - raise = true, - keys = clientkeys, - buttons = clientbuttons, - screen = awful.screen.preferred, - placement = awful.placement.no_overlap + awful.placement.no_offscreen, - }, - }, - - -- Floating clients. - { - rule_any = { - instance = { - 'DTA', -- Firefox addon DownThemAll. - 'copyq', -- Includes session name in class. - 'pinentry', - }, - class = { - 'Arandr', - 'Blueman-manager', - 'Gpick', - 'Kruler', - 'MessageWin', -- kalarm. - 'Sxiv', - 'Tor Browser', -- Needs a fixed window size to avoid fingerprinting by screen size. - 'Wpa_gui', - 'veromix', - 'xtightvncviewer', - 'Arcolinux-tweak-tool.py', - 'Arcologout.py', - 'albert', - 'feh', - 'Qalculate-gtk', - 'Galculator', - 'Gnome-calculator', - 'Nitrogen', - 'Grub-customizer', - 'Pavucontrol', - 'Minipad', - 'Evolution-alarm-notify', - 'Connman-gtk', - 'QuakeDD', - }, - -- Note that the name property shown in xprop might be set slightly after creation of the client - -- and the name shown there might not match defined rules here. - name = { - 'Event Tester', -- xev. - }, - role = { - 'AlarmWindow', -- Thunderbird's calendar. - 'ConfigManager', -- Thunderbird's about:config. - 'pop-up', -- e.g. Google Chrome's (detached) Developer Tools. - }, - }, - properties = { floating = true }, - }, - - -- Add titlebars to normal clients and dialogs - { rule_any = { type = { 'normal', 'dialog' } }, properties = { titlebars_enabled = true } }, - - -- Set Firefox to always map on the tag named "2" on screen 1. - -- { rule = { class = "Firefox" }, - -- properties = { screen = 1, tag = "2" } }, - { - rule_any = { - class = { 'firefox', 'LibreWolf', 'Brave-browser', 'qutebrowser', 'waterfox-current', 'Chromium' }, - }, - properties = { screen = 1, tag = awful.screen.focused().tags[2], switch_to_tags = true }, - }, - { - rule_any = { class = { 'Steam', 'Lutris', 'Timeshift-gtk' } }, - properties = { floating = true, screen = 1, tag = awful.screen.focused().tags[3], switch_to_tags = true }, - }, - - { - rule_any = { class = { 'Evolution', 'mpv', 'vlc', 'parole' } }, - properties = { screen = 1, tag = awful.screen.focused().tags[4], switch_to_tags = true }, - }, - - { - rule_any = { class = { 'VirtualBox Manager', 'Virt-manager' } }, - properties = { floating = true, screen = 1, tag = awful.screen.focused().tags[6], switch_to_tags = true }, - }, - { - rule_any = { class = { 'VirtualBox Machine' } }, - properties = { screen = 1, tag = awful.screen.focused().tags[6], switch_to_tags = true }, - }, -} --- }}} - --- {{{ Signals - -screen.connect_signal('arrange', function(s) - local only_one = #s.tiled_clients == 1 - local layout_name = awful.layout.get().name - for _, c in pairs(s.clients) do - if (only_one and not c.floating) or layout_name == 'max' then - c.border_width = 0 - else - c.border_width = beautiful.border_width - end - end -end) --- Signal function to execute when a new client appears. -client.connect_signal('manage', function(c) - -- Set the windows at the slave, - -- i.e. put it at the end of others instead of setting it master. - -- if not awesome.startup then awful.client.setslave(c) end - - 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) - --- 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:emit_signal('request::activate', 'titlebar', { raise = true }) - awful.mouse.client.move(c) - end), - awful.button({}, 3, function() - c:emit_signal('request::activate', 'titlebar', { raise = true }) - awful.mouse.client.resize(c) - end) - ) - - awful.titlebar(c):setup({ - { - -- Left - awful.titlebar.widget.iconwidget(c), - buttons = buttons, - layout = wibox.layout.fixed.horizontal, - }, - { - -- Middle - { - -- Title - align = 'center', - widget = awful.titlebar.widget.titlewidget(c), - }, - buttons = buttons, - layout = wibox.layout.flex.horizontal, - }, - { - -- Right - awful.titlebar.widget.floatingbutton(c), - awful.titlebar.widget.maximizedbutton(c), - awful.titlebar.widget.stickybutton(c), - awful.titlebar.widget.ontopbutton(c), - awful.titlebar.widget.closebutton(c), - layout = wibox.layout.fixed.horizontal(), - }, - layout = wibox.layout.align.horizontal, - }) -end) - -local function dynamic_title(c) - if c.floating or c.first_tag.layout.name == 'floating' then - awful.titlebar.show(c) - else - awful.titlebar.hide(c) - end -end - --- Enable sloppy focus, so that focus follows mouse. -client.connect_signal('mouse::enter', function(c) - c:emit_signal('request::activate', 'mouse_enter', { raise = false }) -end) - -client.connect_signal('focus', function(c) - c.border_color = beautiful.border_focus -end) -client.connect_signal('unfocus', function(c) - c.border_color = beautiful.border_normal -end) - -client.connect_signal('property::floating', function(c) - if c.floating then - awful.titlebar.show(c) - else - awful.titlebar.hide(c) - end -end) --- Focus urgent clients automatically -client.connect_signal('property::urgent', function(c) - local ignore_urgent = { 'teams-for-linux', 'microsoft teams - preview', 'Microsoft Teams - Preview' } - for _, ignore in ipairs(ignore_urgent) do - if c.class == ignore then - return - end - end - c.minimized = false - c:jump_to() -end) - -client.connect_signal('manage', dynamic_title) -client.connect_signal('tagged', dynamic_title) --- }}} -gears.timer({ - timeout = 30, - autostart = true, - callback = function() - collectgarbage() - end, -}) diff --git a/.config/awesome-another/theme.lua b/.config/awesome-another/theme.lua deleted file mode 100644 index bde85ac..0000000 --- a/.config/awesome-another/theme.lua +++ /dev/null @@ -1,193 +0,0 @@ ---------------------------- --- Default awesome theme -- ---------------------------- - -local theme_assets = require("beautiful.theme_assets") -local xresources = require("beautiful.xresources") -local awful = require("awful") -local gears = require("gears") -local dpi = xresources.apply_dpi -local wibox = require("wibox") - -local gfs = require("gears.filesystem") -local themes_path = gfs.get_themes_dir() -local my_table = awful.util.table or gears.table - -local theme = {} - -local icon_dir = gfs.get_xdg_data_home() .. "themes/Qogir-Dark/unity" -if not gfs.dir_readable(icon_dir) then - require("naughty").notify({ - preset = require("naughty").config.presets.critical, - title = "Current Layout", - timeout = 2, - text = "icon_dir " .. icon_dir .. " does not exist", - }) -end - --- theme.fg_normal = "#fcfae8" --- theme.fg_focus = "#F0DFAF" -theme.fg_urgent = "#CC9393" --- theme.fg_minimize = "#ffffff" -theme.fg_normal = "#abb2bf" -theme.fg_focus = "#d7dae0" --- theme.fg_urgent = "#ffffff" -theme.fg_minimize = "#777d86" - -theme.bg_normal = "#282c34" -theme.bg_focus = "#444444" -theme.bg_urgent = "#b74822" -theme.bg_systray = theme.bg_normal -theme.bg_minimize = "#111114" - -theme.notification_opacity = 0.84 --- theme.notification_bg = "#3F3F3F" --- theme.notification_fg = "#F0DFAF" -theme.notification_fg = theme.fg_focus -theme.notification_bg = theme.bg_normal - -theme.font = "Monospace Bold 10" - -theme.gap_single_client = false - -theme.useless_gap = dpi(2) -theme.border_width = dpi(2) -theme.border_focus = "#F0DFAF" -- "#abb2bf", -theme.border_normal = theme.bg_normal --- theme.border_color_normal = "#000000" --- theme.border_color_active = "#e7af61" --#535d6c" -theme.border_color_normal = theme.bg_normal -theme.border_color_active = theme.bg_focus -theme.border_marked = "#CC9393" -theme.border_urgent = theme.bg_urgent - --- theme.titlebar_bg_normal = "#3F3F3F" - -theme.tasklist_bg_focus = theme.bg_focus -theme.tasklist_bg_normal = theme.bg_normal --- theme.titlebar_fg_focus = theme.fg_focus -theme.taglist_fg_focus = theme.fg_focus -theme.taglist_bg_focus = theme.bg_focus -theme.taglist_fg_occupied = theme.fg_normal -theme.taglist_bg_occupied = theme.bg_normal --- overriding the default one when --- defined, the sets are: --- taglist_[bg|fg]_[focus|urgent|occupied|empty|volatile] --- tasklist_[bg|fg]_[focus|urgent] --- titlebar_[bg|fg]_[normal|focus] --- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] --- mouse_finder_[color|timeout|animate_timeout|radius|factor] --- prompt_[fg|bg|fg_cursor|bg_cursor|font] --- hotkeys_[bg|fg|border_width|border_color|shape|opacity|modifiers_fg|label_bg|label_fg|group_margin|font|description_font] --- Example: ---theme.taglist_bg_focus = "#ff0000" - --- Generate taglist squares: -local taglist_square_size = dpi(4) -theme.taglist_squares_sel = theme_assets.taglist_squares_sel(taglist_square_size, theme.fg_normal) -theme.taglist_squares_unsel = theme_assets.taglist_squares_unsel(taglist_square_size, theme.fg_normal) - --- Variables set for theming notifications: --- notification_font --- notification_[bg|fg] --- notification_[width|height|margin] --- notification_[border_color|border_width|shape|opacity] - --- Variables set for theming the menu: --- menu_[bg|fg]_[normal|focus] --- menu_[border_color|border_width] -theme.menu_submenu_icon = themes_path .. "default/submenu.png" -theme.menu_height = dpi(15) -theme.menu_width = dpi(100) - --- You can add as many variables as --- you wish and access them by using --- beautiful.variable in your rc.lua ---theme.bg_widget = "#cc0000" - --- Define the image to load --- theme.titlebar_close_button_normal = themes_path .. "default/titlebar/close_normal.png" --- theme.titlebar_close_button_focus = themes_path .. "default/titlebar/close_focus.png" -theme.titlebar_close_button_focus = icon_dir .. "/close_focused_prelight.svg" -theme.titlebar_close_button_normal = icon_dir .. "/close_focused_normal.svg" - --- theme.titlebar_minimize_button_normal = themes_path .. "default/titlebar/minimize_normal.png" --- theme.titlebar_minimize_button_focus = themes_path .. "default/titlebar/minimize_focus.png" -theme.titlebar_minimize_button_normal = icon_dir .. "/minimize_focused_normal.svg" -theme.titlebar_minimize_button_focus = icon_dir .. "/minimize_focused_prelight.svg" - -theme.titlebar_ontop_button_normal_inactive = themes_path .. "default/titlebar/ontop_normal_inactive.png" -theme.titlebar_ontop_button_focus_inactive = themes_path .. "default/titlebar/ontop_focus_inactive.png" -theme.titlebar_ontop_button_normal_active = themes_path .. "default/titlebar/ontop_normal_active.png" -theme.titlebar_ontop_button_focus_active = themes_path .. "default/titlebar/ontop_focus_active.png" - -theme.titlebar_sticky_button_normal_inactive = themes_path .. "default/titlebar/sticky_normal_inactive.png" -theme.titlebar_sticky_button_focus_inactive = themes_path .. "default/titlebar/sticky_focus_inactive.png" -theme.titlebar_sticky_button_normal_active = themes_path .. "default/titlebar/sticky_normal_active.png" -theme.titlebar_sticky_button_focus_active = themes_path .. "default/titlebar/sticky_focus_active.png" - -theme.titlebar_floating_button_normal_inactive = themes_path .. "default/titlebar/floating_normal_inactive.png" -theme.titlebar_floating_button_focus_inactive = themes_path .. "default/titlebar/floating_focus_inactive.png" -theme.titlebar_floating_button_normal_active = themes_path .. "default/titlebar/floating_normal_active.png" -theme.titlebar_floating_button_focus_active = themes_path .. "default/titlebar/floating_focus_active.png" - -theme.titlebar_maximized_button_normal_inactive = themes_path .. "default/titlebar/maximized_normal_inactive.png" -theme.titlebar_maximized_button_focus_inactive = themes_path .. "default/titlebar/maximized_focus_inactive.png" -theme.titlebar_maximized_button_normal_active = themes_path .. "default/titlebar/maximized_normal_active.png" -theme.titlebar_maximized_button_focus_active = themes_path .. "default/titlebar/maximized_focus_active.png" - -theme.wallpaper = themes_path .. "default/background.png" - --- You can use your own layout icons like this: -theme.layout_fairh = themes_path .. "default/layouts/fairhw.png" -theme.layout_fairv = themes_path .. "default/layouts/fairvw.png" -theme.layout_floating = themes_path .. "default/layouts/floatingw.png" -theme.layout_magnifier = themes_path .. "default/layouts/magnifierw.png" -theme.layout_max = themes_path .. "default/layouts/maxw.png" -theme.layout_fullscreen = themes_path .. "default/layouts/fullscreenw.png" -theme.layout_tilebottom = themes_path .. "default/layouts/tilebottomw.png" -theme.layout_tileleft = themes_path .. "default/layouts/tileleftw.png" -theme.layout_tile = themes_path .. "default/layouts/tilew.png" -theme.layout_tiletop = themes_path .. "default/layouts/tiletopw.png" -theme.layout_spiral = themes_path .. "default/layouts/spiralw.png" -theme.layout_dwindle = themes_path .. "default/layouts/dwindlew.png" -theme.layout_cornernw = themes_path .. "default/layouts/cornernww.png" -theme.layout_cornerne = themes_path .. "default/layouts/cornernew.png" -theme.layout_cornersw = themes_path .. "default/layouts/cornersww.png" -theme.layout_cornerse = themes_path .. "default/layouts/cornersew.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 = nil - -local calendar_widget = require("widgets.calendar") - -theme.clock = wibox.widget.textclock("%a %b %d, %I:%M %p") -theme.clock:set_font(theme.font) -local cw = calendar_widget({ - theme = "outrun", - placement = "top_right", - start_sunday = true, - -- radius = 8, - -- with customized next/previous (see table above) - previous_month_button = 1, - next_month_button = 3, -}) - -theme.clock:connect_signal("button::press", function(_, _, _, button) - -- if button == 1 or button == 4 then - -- cw.show_prev_month() - -- elseif button == 3 or button == 5 then - -- cw.show_next_month() - -- end - cw.show_month(button == 3) -end) -theme.clock:connect_signal("mouse::enter", cw.toggle) -theme.clock:connect_signal("mouse::leave", cw.toggle) - -return theme - --- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 diff --git a/.config/awesome-another/widgets/calendar.lua b/.config/awesome-another/widgets/calendar.lua deleted file mode 100644 index 80dcac0..0000000 --- a/.config/awesome-another/widgets/calendar.lua +++ /dev/null @@ -1,279 +0,0 @@ -------------------------------------------------- --- Calendar Widget for Awesome Window Manager --- Shows the current month and supports scroll up/down to switch month --- More details could be found here: --- https://github.com/streetturtle/awesome-wm-widgets/tree/master/calendar-widget - --- @author Pavel Makhov --- @copyright 2019 Pavel Makhov -------------------------------------------------- - -local awful = require("awful") -local beautiful = require("beautiful") -local wibox = require("wibox") -local gears = require("gears") -local naughty = require("naughty") - -local calendar_widget = {} - -local function worker(user_args) - local calendar_themes = { - nord = { - bg = "#2E3440", - fg = "#D8DEE9", - focus_date_bg = "#88C0D0", - focus_date_fg = "#000000", - weekend_day_bg = "#3B4252", - weekday_fg = "#88C0D0", - header_fg = "#E5E9F0", - border = "#4C566A", - }, - outrun = { - bg = "#0d0221", - fg = "#D8DEE9", - focus_date_bg = "#650d89", - focus_date_fg = "#2de6e2", - weekend_day_bg = "#261447", - weekday_fg = "#2de6e2", - header_fg = "#f6019d", - border = "#261447", - }, - dark = { - bg = "#000000", - fg = "#ffffff", - focus_date_bg = "#ffffff", - focus_date_fg = "#000000", - weekend_day_bg = "#444444", - weekday_fg = "#ffffff", - header_fg = "#ffffff", - border = "#333333", - }, - light = { - bg = "#ffffff", - fg = "#000000", - focus_date_bg = "#000000", - focus_date_fg = "#ffffff", - weekend_day_bg = "#AAAAAA", - weekday_fg = "#000000", - header_fg = "#000000", - border = "#CCCCCC", - }, - monokai = { - bg = "#272822", - fg = "#F8F8F2", - focus_date_bg = "#AE81FF", - focus_date_fg = "#ffffff", - weekend_day_bg = "#75715E", - weekday_fg = "#FD971F", - header_fg = "#F92672", - border = "#75715E", - }, - naughty = { - bg = beautiful.notification_bg or beautiful.bg, - fg = beautiful.notification_fg or beautiful.fg, - focus_date_bg = beautiful.notification_fg or beautiful.fg, - focus_date_fg = beautiful.notification_bg or beautiful.bg, - weekend_day_bg = beautiful.bg_focus, - weekday_fg = beautiful.fg, - header_fg = beautiful.fg, - border = beautiful.border_normal, - }, - } - - local args = user_args or {} - - if args.theme ~= nil and calendar_themes[args.theme] == nil then - naughty.notify({ - preset = naughty.config.presets.critical, - title = "Calendar Widget", - text = 'Theme "' .. args.theme .. '" not found, fallback to default', - }) - args.theme = "naughty" - end - - local theme = args.theme or "naughty" - local placement = args.placement or "top" - local radius = args.radius or 8 - local next_month_button = args.next_month_button or 4 - local previous_month_button = args.previous_month_button or 5 - local start_sunday = args.start_sunday or false - - local styles = {} - local function rounded_shape(size) - return function(cr, width, height) - gears.shape.rounded_rect(cr, width, height, size) - end - end - - styles.month = { - padding = 4, - bg_color = calendar_themes[theme].bg, - border_width = 0, - } - - styles.normal = { - markup = function(t) - return t - end, - shape = rounded_shape(4), - } - - styles.focus = { - fg_color = calendar_themes[theme].focus_date_fg, - bg_color = calendar_themes[theme].focus_date_bg, - markup = function(t) - return "" .. t .. "" - end, - shape = rounded_shape(4), - } - - styles.header = { - fg_color = calendar_themes[theme].header_fg, - bg_color = calendar_themes[theme].bg, - markup = function(t) - return "" .. t .. "" - end, - } - - styles.weekday = { - fg_color = calendar_themes[theme].weekday_fg, - bg_color = calendar_themes[theme].bg, - markup = function(t) - return "" .. t .. "" - end, - } - - local function decorate_cell(widget, flag, date) - if flag == "monthheader" and not styles.monthheader then - flag = "header" - end - - -- highlight only today's day - if flag == "focus" then - local today = os.date("*t") - if not (today.month == date.month and today.year == date.year) then - flag = "normal" - end - 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 d = { year = date.year, month = (date.month or 1), day = (date.day or 1) } - local weekday = tonumber(os.date("%w", os.time(d))) - local default_bg = (weekday == 0 or weekday == 6) and calendar_themes[theme].weekend_day_bg - or calendar_themes[theme].bg - local ret = wibox.widget({ - { - { - widget, - halign = "center", - widget = wibox.container.place, - }, - margins = (props.padding or 2) + (props.border_width or 0), - widget = wibox.container.margin, - }, - shape = props.shape, - shape_border_color = props.border_color or "#000000", - shape_border_width = props.border_width or 0, - fg = props.fg_color or calendar_themes[theme].fg, - bg = props.bg_color or default_bg, - widget = wibox.container.background, - }) - - return ret - end - - local cal = wibox.widget({ - date = os.date("*t"), - font = beautiful.get_font(), - fn_embed = decorate_cell, - long_weekdays = true, - start_sunday = start_sunday, - widget = wibox.widget.calendar.month, - }) - - local popup = awful.popup({ - ontop = true, - visible = false, - shape = rounded_shape(radius), - offset = { y = 5 }, - border_width = 1, - border_color = calendar_themes[theme].border, - widget = cal, - }) - - popup:buttons(awful.util.table.join( - awful.button({}, next_month_button, function() - local a = cal:get_date() - a.month = a.month + 1 - cal:set_date(nil) - cal:set_date(a) - popup:set_widget(cal) - end), - awful.button({}, previous_month_button, function() - local a = cal:get_date() - a.month = a.month - 1 - cal:set_date(nil) - cal:set_date(a) - popup:set_widget(cal) - end) - )) - - ---Show month - ---@param next boolean - function calendar_widget.show_month(next) - local var = next == true and 1 or -1 - local a = cal:get_date() - a.month = a.month + var - cal:set_date(nil) - cal:set_date(a) - popup:set_widget(cal) - end - - function calendar_widget.toggle() - if popup.visible then - -- to faster render the calendar refresh it and just hide - cal:set_date(nil) -- the new date is not set without removing the old one - cal:set_date(os.date("*t")) - popup:set_widget(nil) -- just in case - popup:set_widget(cal) - popup.visible = not popup.visible - else - if placement == "top" then - awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) - elseif placement == "top_right" then - awful.placement.top_right( - popup, - { margins = { top = 30, right = 10 }, parent = awful.screen.focused() } - ) - elseif placement == "top_left" then - awful.placement.top_left(popup, { margins = { top = 30, left = 10 }, parent = awful.screen.focused() }) - elseif placement == "bottom_right" then - awful.placement.bottom_right( - popup, - { margins = { bottom = 30, right = 10 }, parent = awful.screen.focused() } - ) - elseif placement == "bottom_left" then - awful.placement.bottom_left( - popup, - { margins = { bottom = 30, left = 10 }, parent = awful.screen.focused() } - ) - else - awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) - end - - popup.visible = true - end - end - - return calendar_widget -end - -return setmetatable(calendar_widget, { - __call = function(_, ...) - return worker(...) - end, -}) diff --git a/.config/awesome-another/widgets/volume.lua b/.config/awesome-another/widgets/volume.lua deleted file mode 100644 index 03363d2..0000000 --- a/.config/awesome-another/widgets/volume.lua +++ /dev/null @@ -1,111 +0,0 @@ ---[[ -create an awesomewm volume widget with following requirements: -- use pactl cli -- show icon and text. icon contains nerd icons for different volume levels(a separate icon for mute) and text contains volume level. -- the volume widget should only update on keypress(like XF86AudioRaiseVolume,XF86AudioLowerVolume,XF86AudioMute) ---]] -local awful = require("awful") -local wibox = require("wibox") -local gears = require("gears") -local naughty = require("naughty") - --- Define the widget icon fonts -local icon_mute = "󰖁 " -- Nerd Fonts: Volume Mute -local icon_low = " " -- Nerd Fonts: Volume Low -local icon_medium = "󰕾 " -- Nerd Fonts: Volume Medium -local icon_high = " " -- Nerd Fonts: Volume High - -local M = {} --- local volume_get_command = "pactl get-sink-volume @DEFAULT_SINK@ | cut -s -d/ -f2,4; pactl get-sink-mute @DEFAULT_SINK@" -local volume_get_command = "wpctl get-volume @DEFAULT_AUDIO_SINK@" -local volume_set_command = - "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ 0;wpctl set-mute @DEFAULT_AUDIO_SINK@ 0;wpctl set-volume @DEFAULT_AUDIO_SINK@ %s" -local volume_mute_command = "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle;wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" - --- Define the volume widget -M.volume_widget = wibox.widget({ - { - id = "vol_my_icon", - widget = wibox.widget.textbox, - font = "FiraCode Nerd Font 14", - text = icon_high, - }, - { - id = "vol_my_text", - widget = wibox.widget.textbox, - font = "sans 10", - text = "100%", - }, - layout = wibox.layout.fixed.horizontal, -}) -local noti = nil --- Update the widget function -M.update_volume = function(widget) - awful.spawn.easy_async_with_shell(volume_get_command, function(stdout) - -- local volume = stdout:match("(%d?%d?%d)%% /") - -- local mute = stdout:match("Mute: (%a+)") - local volume = stdout:match("%d+%.%d+") - local mute = stdout:match("[MUTED]") - if mute ~= nil then - widget.vol_my_icon.text = icon_mute - widget.vol_my_text.text = "Mute" - elseif volume then - -- volume = tonumber(string.format("% 3d", volume)) - volume = tonumber(volume) * 100 - if volume < 20 then - widget.vol_my_icon.text = icon_low - elseif volume < 70 then - widget.vol_my_icon.text = icon_medium - else - widget.vol_my_icon.text = icon_high - end - widget.vol_my_text.text = volume .. "%" - end - if noti ~= nil then - naughty.destroy(noti) - end - noti = naughty.notify({ - text = "Volume: " .. widget.vol_my_text.text, - timeout = 1, - font = "FiraCode Nerd Font 28", - preset = naughty.config.presets.low, - }) - end) -end - --- Update the widget on keypress -awesome.connect_signal("daemon::signal::volume", function() - M.update_volume(M.volume_widget) -end) - --- Initial update of the widget -M.update_volume(M.volume_widget) - -M.volume_increase = function() - awful.spawn.easy_async_with_shell(string.format(volume_set_command, "10%+"), function() - M.update_volume(M.volume_widget) - end) -end - -M.volume_decrease = function() - awful.spawn.easy_async_with_shell(string.format(volume_set_command, "10%-"), function() - M.update_volume(M.volume_widget) - end) -end - -M.volume_toggle = function() - awful.spawn.easy_async_with_shell(volume_mute_command, function() - M.update_volume(M.volume_widget) - end) -end - -M.volume_widget:buttons(gears.table.join( - awful.button({}, 1, M.volume_toggle), - awful.button({}, 3, function() - awful.spawn("pavucontrol") - end), - awful.button({}, 4, M.volume_increase), - awful.button({}, 5, M.volume_decrease) -)) - -return M diff --git a/.config/awesome/README.md b/.config/awesome/README.md deleted file mode 100644 index f381c26..0000000 --- a/.config/awesome/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Personal Awesomewm config - -## Awesomewm setup with some bloated features -- Title bar for floating windows only -- Cycle Through Non empty(Active) tags -- Better way to resize windows -- Don't show borders on max layout or if only 1 window exists -- Move the window to immediate right/left tag -- Move/resize floating windows using keybindings -- And much more - -## Credits -- [Copycats](https://github.com/lcpz/awesome-copycats.git) : Making it possible to configure statusbar -- [Lain](https://github.com/lcpz/lain.git) : Widget library and also providing extra functionalities -- [awesome-wm-widgets](https://pavelmakhov.com/awesome-wm-widgets/) : The brightness widget comes from here diff --git a/.config/awesome/rc.lua b/.config/awesome/rc.lua deleted file mode 100644 index f9e58d3..0000000 --- a/.config/awesome/rc.lua +++ /dev/null @@ -1,1137 +0,0 @@ ---[[ - If LuaRocks is installed, make sure that packages installed through it are - found (e.g. lgi). If LuaRocks is not installed, do nothing. ---]] -pcall(require, 'luarocks.loader') - ---[[ Standard awesome library --]] -local gears = require 'gears' -local gfs = gears.filesystem -local awful = require 'awful' -require 'awful.autofocus' ---[[ Widget and layout library]] -local wibox = require 'wibox' --- Theme handling library -local beautiful = require 'beautiful' --- Notification library -local naughty = require 'naughty' -local menubar = require 'menubar' -local hotkeys_popup = require 'awful.hotkeys_popup' --- Enable hotkeys help widget for VIM and other apps --- when client with a matching name is opened: -require 'awful.hotkeys_popup.keys' --- Awesome widgets {{{ -local brightness_widget = require 'widgets.brightness' -local calendar_widget = require 'widgets.calendar' -local volume = require 'widgets.vol' -local battery_widget = require 'widgets.battery' ---}}} - --- {{{ 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 --- }}} - --- {{{ Variable definitions --- Themes define colours, icons, font and wallpapers. -if not beautiful.init(gfs.get_configuration_dir() .. 'utils/theme.lua') then - local dpi = beautiful.xresources.apply_dpi - beautiful.init({ - font = 'Monospace Bold 10', - useless_gap = 3, - gap_single_client = true, - border_width = dpi(2), - border_normal = '#3F3F3F', - border_focus = '#fae3b0', - }) -end --- beautiful.useless_gap = 2 --- beautiful.gap_single_client = false - --- This is used later as the default terminal and editor to run. -local terminal = os.getenv 'TERMINAL' or 'xterm' -local editor = os.getenv 'EDITOR' or 'nano' -local editor_cmd = terminal .. ' -e ' .. editor -local browser = os.getenv 'BROWSER' or 'firefox' - --- Default modkey. --- Usually, Mod4 is the key with a logo between Control and Alt. --- If you do not like this or do not have such a key, --- I suggest you to remap Mod4 to another key using xmodmap or other tools. --- However, you can use another modifier like Mod1, but it may interact with others. -local modkey = 'Mod4' -local altkey = 'Mod1' - --- Table of layouts to cover with awful.layout.inc, order matters. -awful.layout.layouts = { - awful.layout.suit.tile, - -- awful.layout.suit.tile.left, - -- awful.layout.suit.tile.bottom, - -- awful.layout.suit.tile.top, - -- awful.layout.suit.fair, - -- awful.layout.suit.fair.horizontal, - -- awful.layout.suit.spiral, - -- awful.layout.suit.spiral.dwindle, - awful.layout.suit.max, - awful.layout.suit.floating, - -- awful.layout.suit.max.fullscreen, - -- awful.layout.suit.magnifier, - -- awful.layout.suit.corner.nw, - -- awful.layout.suit.corner.ne, - -- awful.layout.suit.corner.sw, - -- awful.layout.suit.corner.se, -} --- }}} - --- {{{ Menu --- Create a launcher widget and a main menu -myawesomemenu = { - { - 'hotkeys', - function() - hotkeys_popup.show_help(nil, awful.screen.focused()) - end, - }, - { 'manual', terminal .. ' -e man awesome' }, - { 'edit config', editor_cmd .. ' ' .. awesome.conffile }, - { 'restart', awesome.restart }, - { - 'quit', - function() - awesome.quit() - end, - }, -} - -mymainmenu = awful.menu({ - items = { - { 'awesome', myawesomemenu, beautiful.awesome_icon }, - { 'open terminal', terminal }, - }, -}) - -mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, menu = mymainmenu }) - --- Menubar configuration -menubar.utils.terminal = terminal -- Set the terminal for applications that require it --- }}} - --- {{{ Wibar --- Create a textclock widget -local spr = wibox.widget.textbox ' | ' --- local spr = wibox.widget({ --- shape = gears.shape.powerline, --- widget = wibox.widget.separator, --- }) -local big_icon = function(icon) - return wibox.widget({ - widget = wibox.widget.textbox, - text = icon, - font = 'Hack Nerd Font 12', - }) -end --- local clock_icon = big_icon(" ") -local mytextclock = wibox.widget.textclock '%a %b %d, %I:%M %p' -local systray = wibox.widget.systray() -systray:set_base_size(26) --- local systray_margin = wibox.layout.margin() --- systray_margin:set_margins(2) --- systray_margin:set_widget(systray) - --- systray.forced_width = 38 -local cw = calendar_widget({ - theme = 'outrun', - placement = 'top_right', - previous_month_button = 1, - next_month_button = 3, -}) -mytextclock:connect_signal('button::press', function(_, _, _, button) - if button == 1 then - cw.toggle() - end -end) - --- Create a wibox for each screen and add it -local taglist_buttons = gears.table.join( - awful.button({}, 1, function(t) - t:view_only() - end), - awful.button({ modkey }, 1, function(t) - if client.focus then - client.focus:move_to_tag(t) - end - end), - awful.button({}, 3, awful.tag.viewtoggle), - awful.button({ modkey }, 3, function(t) - if client.focus then - client.focus:toggle_tag(t) - end - end), - awful.button({}, 4, function(t) - awful.tag.viewnext(t.screen) - end), - awful.button({}, 5, function(t) - awful.tag.viewprev(t.screen) - end) -) - -local tasklist_buttons = gears.table.join( - awful.button({}, 1, function(c) - if c == client.focus then - c.minimized = true - else - c:emit_signal('request::activate', 'tasklist', { raise = true }) - end - end), - awful.button({}, 3, function() - awful.menu.client_list({ theme = { width = 250 } }) - end), - awful.button({}, 4, function() - awful.client.focus.byidx(1) - end), - awful.button({}, 5, function() - awful.client.focus.byidx(-1) - end) -) - -awful.screen.connect_for_each_screen(function(s) - -- Each screen has its own tag table. - awful.tag({ '1', '2', '3', '4', '5', '6', '7', '8', '9' }, s, awful.layout.layouts[1]) - - -- Create a promptbox for each screen - s.mypromptbox = awful.widget.prompt() - -- Create an imagebox widget which will contain an icon indicating which layout we're using. - -- We need one layoutbox per screen. - s.mylayoutbox = awful.widget.layoutbox(s) - s.mylayoutbox:buttons(gears.table.join( - 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 a taglist widget - s.mytaglist = awful.widget.taglist({ - screen = s, - filter = awful.widget.taglist.filter.noempty, - buttons = taglist_buttons, - }) - - -- Create a tasklist widget - s.mytasklist = awful.widget.tasklist({ - screen = s, - filter = awful.widget.tasklist.filter.currenttags, - buttons = tasklist_buttons, - }) - - -- Create the wibox - s.mywibox = awful.wibar({ position = 'top', screen = s }) - - -- Add widgets to the wibox - s.mywibox:setup({ - layout = wibox.layout.align.horizontal, - { - -- Left widgets - layout = wibox.layout.fixed.horizontal, - mylauncher, - s.mytaglist, - s.mypromptbox, - }, - s.mytasklist, -- Middle widget - { - -- Right widgets - layout = wibox.layout.fixed.horizontal, - -- spr, - -- awful.widget.watch('bash -c "dwm_bat"', 10), - -- battery_widget({ - -- display_notification = true, - -- show_current_level = true, - -- font = beautiful.font, - -- warning_msg_position = 'top_right', - -- -- path_to_icons = '/usr/share/icons/Qogir/symbolic/status/', - -- -- path_to_icons = gfs.get_xdg_data_home() .. 'icons/Fluent-grey-dark/symbolic/status/', - -- }), - -- spr, - big_icon ' ', - awful.widget.watch('bash -c "printf %d%% $(expr 100 - $(vmstat 1 2 | tail -1 | awk \'{print $15}\'))"', 3), - spr, - big_icon ' ', - awful.widget.watch('sh -c "free -h | awk \'/^Mem/ {print $3}\'"', 5), - spr, - volume(), - -- spr, - -- brightness_widget({ - -- type = 'icon_and_text', - -- program = 'brightnessctl', - -- font = beautiful.font, - -- tooltip = true, - -- timeout = 120, - -- }), - -- spr, - -- awful.widget.watch('bash -c "curl wttr.in/411043\\?format=1"', 3600), - spr, - big_icon ' ', - mytextclock, - spr, - s.mylayoutbox, - spr, - systray, - }, - }) -end) --- }}} - --- {{{ Mouse bindings -root.buttons(gears.table.join( - awful.button({}, 3, function() - mymainmenu:toggle() - end), - awful.button({}, 4, awful.tag.viewnext), - awful.button({}, 5, awful.tag.viewprev) -)) --- }}} - --- {{{ Key bindings - --- Helper functions {{{ - --- Defines to move the currently focused window. --- to next/previous adjacent tag. --- -1 for previous and 1 for next adjacent tag. --- @param val number this is either be 1 or -1 --- @param total_tags number total number of tags to cycle through (default total no. tags created) --- @see client.focus:move_to_tag() -local move_to_tag = function(val, total_tags) - local c = client.focus - local step = val == 1 and 0 or 2 - local total_tags = total_tags or #awful.screen.focused().tags - -- get current tag - local t = c and c.first_tag or nil - if t == nil then - return - end - -- get previous tag (modulo 9 excluding 0 to wrap from 1 to 9) - local tag = c.screen.tags[(t.name - step) % total_tags + 1] - c:move_to_tag(tag) - tag:view_only() -end --- Skim through non empty tags. --- @param direction number which can either be 1(forward)[default] or -1(backward) --- @param s awful.screen Which monitor to view non empty tag. By default currently focused screen --- @see lain.util.tag_view_nonempty() -local tag_view_nonempty = function(direction, s) - direction = direction or 1 - s = s or awful.screen.focused() - local tags = s.tags - local sel = s.selected_tag - - local i = sel.index - repeat - i = i + direction - - -- Wrap around when we reach one of the bounds - if i > #tags then - i = i - #tags - end - if i < 1 then - i = i + #tags - end - - local t = tags[i] - - -- Stop when we get back to where we started - if t == sel then - break - end - - -- If it's The One, view it. - if #t:clients() > 0 then - t:view_only() - return - end - until false -end --- Resize windows universally. --- @param direction string which direction to go left,right,up,down --- @param pixel number value to resize windows by, default is 0.05 --- @see awful.tag.incmwfact() --- @see awful.client.incwfact() -local resize_window_tiled = function(direction, pixel) - pixel = pixel or 0.05 - -- change pixel to negative if direction is "down/left" - if direction == 'down' or direction == 'left' then - pixel = -pixel - end - - if direction == 'left' or direction == 'right' then - awful.tag.incmwfact(pixel) - else - local master_win = awful.client.getmaster().window - local current_win = client.focus.window - if master_win == current_win then - awful.tag.incmwfact(pixel) - else - pixel = direction == 'up' and -0.05 or 0.05 - awful.client.incwfact(pixel) - end - end -end - -local resize_float = function(c, direction, move) - local move = move or 20 - local direction = direction or 'up' - local c = c or client.focus - if direction == 'left' then - c:relative_move(0, 0, -move, 0) - elseif direction == 'right' then - c:relative_move(0, 0, move, 0) - elseif direction == 'down' then - c:relative_move(0, 0, 0, move) - else - c:relative_move(0, 0, 0, -move) - end -end - -local resize_window = function(direction) - local c = client.focus - if c.floating then - resize_float(c, direction) - else - resize_window_tiled(direction) - end -end - -local launch_calculator = function() - local cmd = 'qalculate-gtk ||gnome-calculator || galculator' - awful.spawn.easy_async_with_shell(cmd, function(_, err) - if err ~= '' or err ~= nil then - naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Calculator Not Found', - text = 'Qalculate-gtk, Gnome-calculator or Galculator is not installed in the system ' .. err, - }) - end - end) -end --- }}} - -globalkeys = gears.table.join( - - -- Tag browsing {{{ - - -- This is for testing something or anything - -- awful.key({ modkey, }, "backslash", - -- function () - -- local c = client.focus - -- local layout_name = awful.layout.get().name - -- naughty.notify({ preset = naughty.config.presets.normal, - -- title = "Current Layout", - -- timeout = 2, - -- text = tostring(c.floating) }) - -- end, {description = "Testing purpose", group = "tag"}), - - awful.key({ modkey }, '[', awful.tag.viewprev, { description = 'view previous', group = 'tag' }), - awful.key({ modkey }, ']', awful.tag.viewnext, { description = 'view next', group = 'tag' }), - -- awful.key({ modkey, 'Shift' }, '[', function() - -- move_to_tag( -1) - -- end, { description = 'move the focused client to previous tag', group = 'tag' }), - -- awful.key({ modkey, 'Shift' }, ']', function() - -- move_to_tag(1) - -- end, { description = 'move the focused client to next tag', group = 'tag' }), - awful.key({ modkey }, 'Tab', function() - awful.tag.history.restore() - if client.focus then - client.focus:raise() - end - end, { description = 'go back', group = 'tag' }), - - --- }}} - - -- Non-empty tag browsing {{{ - awful.key({ modkey }, 'grave', function() - tag_view_nonempty(1) - end, { description = 'view next nonempty', group = 'tag' }), - - awful.key({ modkey, 'Shift' }, 'grave', function() - tag_view_nonempty(-1) - end, { description = 'view previous nonempty', group = 'tag' }), - - awful.key({ modkey }, 'comma', function() - tag_view_nonempty(-1) - end, { description = 'view previous nonempty', group = 'tag' }), - - awful.key({ modkey }, 'period', function() - tag_view_nonempty(1) - end, { description = 'view next nonempty', group = 'tag' }), - --- }}} - - -- By direction client focus {{{ - - awful.key({ modkey }, 'Down', function() - awful.client.focus.global_bydirection 'down' - if client.focus then - client.focus:raise() - end - end, { description = 'focus down', group = 'client' }), - awful.key({ modkey }, 'Up', function() - awful.client.focus.global_bydirection 'up' - if client.focus then - client.focus:raise() - end - end, { description = 'focus up', group = 'client' }), - awful.key({ modkey }, 'Left', function() - awful.client.focus.global_bydirection 'left' - if client.focus then - client.focus:raise() - end - end, { description = 'focus left', group = 'client' }), - awful.key({ modkey }, 'Right', function() - awful.client.focus.global_bydirection 'right' - if client.focus then - client.focus:raise() - end - end, { description = 'focus right', group = 'client' }), - awful.key({ modkey }, 'j', function() - awful.client.focus.byidx(1) - if client.focus then - client.focus:raise() - end - end, { description = 'focus down', group = 'client' }), - awful.key({ modkey }, 'k', function() - awful.client.focus.byidx(-1) - if client.focus then - client.focus:raise() - end - end, { description = 'focus up', group = 'client' }), - awful.key({ modkey }, 'h', function() - awful.client.focus.global_bydirection 'left' - if client.focus then - client.focus:raise() - end - end, { description = 'focus left', group = 'client' }), - awful.key({ modkey }, 'l', function() - awful.client.focus.global_bydirection 'right' - if client.focus then - client.focus:raise() - end - end, { description = 'focus right', group = 'client' }), - awful.key({ altkey }, 'Tab', function() - awful.client.focus.byidx(1) - if client.focus then - client.focus:raise() - end - end, { description = 'Focus to next Client', group = 'client' }), - awful.key({ altkey, 'Shift' }, 'Tab', function() - awful.client.focus.byidx(-1) - if client.focus then - client.focus:raise() - end - end, { description = 'Focus to previous Client', group = 'client' }), - -- }}} - - -- Layout manipulation {{{ - - awful.key({ modkey, 'Shift' }, 'j', function() - awful.client.swap.byidx(1) - end, { description = 'swap with next client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'k', function() - awful.client.swap.byidx(-1) - end, { description = 'swap with previous client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'Left', function() - awful.client.swap.byidx(-1) - end, { description = 'swap with next client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'Right', function() - awful.client.swap.byidx(1) - end, { description = 'swap with previous client by index', group = 'client' }), - --- }}} - - -- On the fly useless gaps change {{{ - - -- awful.key({ modkey, 'Shift' }, '=', function() - -- awful.tag.setmwfact(0.85) - -- end, { description = 'increment useless gaps', group = 'tag' }), - -- awful.key({ modkey }, '-', function() - -- awful.tag.setmwfact(0.50) - -- end, { description = 'decrement useless gaps', group = 'tag' }), - --- }}} - - -- Standard program {{{ - - awful.key({ modkey }, 'Return', function() - awful.spawn 'alacritty' - end, { description = 'open a ' .. terminal, group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'Return', function() - awful.spawn 'kitty' - end, { description = 'open a kitty', group = 'launcher' }), - awful.key({ modkey }, 'w', function() - awful.spawn(browser) - end, { description = 'open a ' .. browser, group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'w', function() - -- local cmd = browser ~= 'firefox' and 'firefox' or 'brave || brave-browser || chromium' - awful.spawn 'firefox' - end, { description = 'open a firefox', group = 'launcher' }), - awful.key({ modkey }, 'e', function() - awful.spawn 'thunar' - end, { description = 'open a file manager', group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'e', function() - awful.spawn 'alacritty -e vif' - end, { description = 'open a vif', group = 'launcher' }), - --- }}} - - -- User programs {{{ - -- awful.key({ modkey, "Shift" }, "d", function() - -- awful.spawn("rofi -show run -async-pre-read") - -- end, { description = "Launch Rofi", group = "launcher" }), - - awful.key({ modkey }, 'd', function() - awful.spawn 'dmenu_run_history -i' - end, { description = 'Launch Dmenu', group = 'launcher' }), - - awful.key({ 'altkey' }, 'Print', function() - awful.spawn.with_shell 'flameshot gui' - end, { description = 'Capture Screenshot(Fullscreen - flameshot)', group = 'launcher' }), - awful.key({}, 'Print', function() - awful.spawn.with_shell 'take_ss clip' - end, { description = 'Capture Screenshot(Fullscreen - Maim)', group = 'launcher' }), - awful.key({ 'Shift' }, 'Print', function() - awful.spawn.with_shell 'take_ss focus' - end, { description = 'Capture Screenshot(focus)', group = 'launcher' }), - - awful.key({ modkey }, 'v', function() - awful.spawn 'virt-manager' - end, { description = 'Launch VirtualBox', group = 'launcher' }), - awful.key({ modkey }, 'g', launch_calculator, { description = 'Launch Calculator', group = 'launcher' }), - --- }}} - - -- Custom Scripts {{{ - - awful.key({ modkey, 'Control' }, 'Left', function() - resize_window 'left' - end, { description = 'Resize left', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Right', function() - resize_window 'right' - end, { description = 'Resize Right', group = 'client' }), - - awful.key({ modkey, 'Control' }, 's', function() - awful.spawn.with_shell 'logout_prompt' - end, { description = 'Ask For Logout(ie shutdown,reboot or logout)', group = 'scripts' }), - awful.key({ modkey, altkey }, 'c', function() - awful.spawn 'open-rcs' - end, { description = 'Edit RC files', group = 'scripts' }), - awful.key({ modkey, altkey }, 'g', function() - awful.spawn 'open-games' - end, { description = 'Launch Game', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'p', function() - awful.spawn 'get-class-name' - end, { description = 'Get window class name', group = 'scripts' }), - awful.key({ 'Control', altkey }, 'c', function() - awful.spawn.with_shell 'xcolor -s' - end, { description = 'Color Selector', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'e', function() - awful.spawn 'rofie' - end, { description = 'Launch Emoji Selector', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'v', function() - awful.spawn 'pavucontrol' - end, { description = 'launch volume controller', group = 'launcher' }), - - -- awful.key({ modkey }, "F12", function() - -- awful.spawn.with_shell("tdrop -am -w 60% -h 55% -x 20% -y 25% st -c 'Minipad'") - -- end, { description = "launch Dropdown(Scratch pad) Terminal", group = "launcher" }), - - awful.key({ modkey }, 'y', function() - awful.spawn.with_shell 'clipboard' - end, { description = 'Launch Clipboard Manager', group = 'scripts' }), - awful.key({ modkey }, 'r', function() - awful.spawn.with_shell 'rofi -show drun -async-pre-read' - end, { description = 'Rofi Application Launcher', group = 'launcher' }), - -- awful.key({ modkey }, "z", function() - -- quake:toggle() - -- end), - - --- }}} - - -- Standard program {{{ - awful.key({ modkey }, 'F1', hotkeys_popup.show_help, { description = 'show help', group = 'awesome' }), - awful.key({ modkey, 'Control' }, 'r', awesome.restart, { description = 'reload awesome', group = 'awesome' }), - awful.key({ modkey, 'Control' }, 'x', awesome.quit, { description = 'quit awesome', group = 'awesome' }), - awful.key({ modkey, 'Control' }, 'l', function() - awful.spawn( - string.format( - 'i3lock -k --time-pos "100:1000" --greeter-text="Welcome Back" --wrong-text="Incorrect password!" -i %s/Pictures/Wallpapers/canvas.jpg', - os.getenv 'HOME' - ) - ) - end, { description = 'i3lock', group = 'awesome' }), - - awful.key({ modkey, 'Control' }, 'n', function() - local c = awful.client.restore() - -- Focus restored client - if c then - c:emit_signal('request::activate', 'key.unminimize', { raise = true }) - end - end, { description = 'restore minimized', group = 'client' }), - - -- Prompt - -- awful.key({ modkey }, 'r', function() - -- awful.screen.focused().mypromptbox:run() - -- end, { description = 'run prompt', group = 'launcher' }), - - awful.key({ modkey }, 'x', function() - awful.prompt.run({ - prompt = 'Run Lua code: ', - textbox = awful.screen.focused().mypromptbox.widget, - exe_callback = awful.util.eval, - history_path = awful.util.get_cache_dir() .. '/history_eval', - }) - end, { description = 'lua execute prompt', group = 'awesome' }), - -- }}} - - -- Brightness {{{ - - awful.key({}, 'XF86MonBrightnessUp', function() - brightness_widget:inc() - end, { description = 'Brightness +10%', group = 'hotkeys' }), - awful.key({}, 'XF86MonBrightnessDown', function() - brightness_widget:dec() - end, { description = 'Brightness -10%', group = 'hotkeys' }), - awful.key({ 'Shift' }, 'XF86MonBrightnessUp', function() - os.execute 'brightnessctl s 200' - end, { description = '-10%', group = 'hotkeys' }), - awful.key({ 'Shift' }, 'XF86MonBrightnessDown', function() - os.execute 'brightnessctl s 20' - end, { description = '-10%', group = 'hotkeys' }), - --- }}} - - -- Volume Control {{{ - - awful.key({}, 'XF86AudioRaiseVolume', function() - -- os.execute("pamixer -i 10 --allow-boost") - -- os.execute('pactl set-sink-volume @DEFAULT_SINK@ +10%') - volume:inc() - -- beautiful.volume.update() - end, { description = 'volume up', group = 'hotkeys' }), - awful.key({}, 'XF86AudioLowerVolume', function() - -- os.execute("pamixer -d 10 --allow-boost") - -- os.execute('pactl set-sink-volume @DEFAULT_SINK@ -10%') - volume:dec() - -- beautiful.volume.update() - end, { description = 'volume down', group = 'hotkeys' }), - awful.key({}, 'XF86AudioMute', function() - -- os.execute("pamixer --toggle-mute") - -- os.execute('pactl set-sink-mute @DEFAULT_SINK@ toggle') - volume:toggle() - -- beautiful.volume.update() - end, { description = 'toggle mute', group = 'hotkeys' }) - - --- }}} -) - --- Handle Windows(Like toggle floating,move to another tag,etc) {{{ -clientkeys = gears.table.join( - awful.key({ modkey, 'Shift' }, '[', function(c) - c:move_to_tag(awful.tag.viewprev()) - end, { description = 'move the focused client to previous tag', group = 'tag' }), - awful.key({ modkey, 'Shift' }, ']', function(c) - c:move_to_tag(awful.tag.viewnext()) - end, { description = 'move the focused client to next tag', group = 'tag' }), - awful.key({ modkey }, 'f', function(c) - c.fullscreen = not c.fullscreen - local cur_tag = client.focus and client.focus.first_tag or nil - if not cur_tag then - return naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Not Found', - text = 'Current tag returned nil', - }) - end - for _, cls in ipairs(cur_tag:clients()) do - -- minimize all windows except the focused one - if c.window ~= cls.window then - cls.hidden = c.fullscreen - -- mouse.screen.mywibox.visible = not c.fullscreen - end - end - c:raise() - end, { description = 'toggle fullscreen', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'q', function(c) - c:kill() - end, { description = 'close', group = 'client' }), - awful.key({ modkey }, 's', awful.client.floating.toggle, { description = 'toggle floating', group = 'client' }), - -- awful.key({ modkey,'Shift' }, 's', awful.client.sticky.toggle, { description = 'toggle sticky', group = 'client' }), - awful.key({ modkey }, 't', function() - -- c.fullscreen = false - -- c.sticky = false - -- c.floating = false - awful.layout.set(awful.layout.suit.tile) - end, { description = 'toggle keep on top', group = 'client' }), - awful.key({ modkey }, 'n', function(c) - c.minimized = not c.minimized - end, { description = 'minimize focused window', group = 'client' }), - awful.key({ modkey }, 'm', function() - -- c.maximized = not c.maximized - -- c:raise() - local layout_name = awful.layout.get().name - local change_layout = layout_name == 'max' and awful.layout.suit.tile or awful.layout.suit.max - awful.layout.set(change_layout) - end, { description = 'Toggle Between max layout', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'm', function(c) - c.maximized = not c.maximized - c:raise() - end, { description = 'maximize focused window', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Return', function(c) - c:swap(awful.client.getmaster()) - end, { description = 'move to master', group = 'client' }), - - awful.key({ modkey, 'Control' }, 'Up', function(c) - local move = 20 - if c.floating then - c:relative_move(0, -move, 0, 0) - end - end, { description = 'Move Floating Window towards up', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Down', function(c) - local move = 20 - if c.floating then - c:relative_move(0, move, 0, 0) - end - end, { description = 'Move Floating Window towards down', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Left', function(c) - local move = 20 - if c.floating then - c:relative_move(-move, 0, 0, 0) - end - end, { description = 'Move Floating Window towards left', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Right', function(c) - local move = 20 - if c.floating then - c:relative_move(move, 0, 0, 0) - end - end, { description = 'Move Floating Window towards right', group = 'client' }) -) - --- Bind all key numbers to tags. --- Be careful: we use keycodes to make it work on any keyboard layout. --- This should map on the top row of your keyboard, usually 1 to 9. -for i = 1, 9 do - globalkeys = gears.table.join( - globalkeys, - -- View tag only. - awful.key({ modkey }, '#' .. i + 9, function() - local screen = awful.screen.focused() - local tag = screen.tags[i] - if tag then - tag:view_only() - end - end, { description = 'view tag #' .. i, group = 'tag' }), - -- Toggle tag display. - awful.key({ modkey, 'Control' }, '#' .. i + 9, function() - local screen = awful.screen.focused() - local tag = screen.tags[i] - if tag then - awful.tag.viewtoggle(tag) - end - end, { description = 'toggle tag #' .. i, group = 'tag' }), - -- Move client to tag. - awful.key({ modkey, 'Shift' }, '#' .. i + 9, function() - if client.focus then - local tag = client.focus.screen.tags[i] - if tag then - client.focus:move_to_tag(tag) - end - end - end, { description = 'move focused client to tag #' .. i, group = 'tag' }), - -- Toggle tag on focused client. - awful.key({ modkey, 'Control', 'Shift' }, '#' .. i + 9, function() - if client.focus then - local tag = client.focus.screen.tags[i] - if tag then - client.focus:toggle_tag(tag) - end - end - end, { description = 'toggle focused client on tag #' .. i, group = 'tag' }) - ) -end - -clientbuttons = gears.table.join( - awful.button({}, 1, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - end), - awful.button({ modkey }, 1, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - awful.mouse.client.move(c) - end), - awful.button({ modkey }, 3, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - awful.mouse.client.resize(c) - end) -) --- }}} - --- Set keys -root.keys(globalkeys) --- }}} - --- {{{ Rules --- Rules to apply to new clients (through the "manage" signal). -awful.rules.rules = { - -- All clients will match this rule. - { - rule = {}, - properties = { - border_width = beautiful.border_width, - border_color = beautiful.border_normal, - focus = awful.client.focus.filter, - raise = true, - keys = clientkeys, - buttons = clientbuttons, - screen = awful.screen.preferred, - placement = awful.placement.no_overlap + awful.placement.no_offscreen, - }, - }, - - -- Floating clients. - { - rule_any = { - instance = { - 'DTA', -- Firefox addon DownThemAll. - 'copyq', -- Includes session name in class. - 'pinentry', - }, - class = { - 'Arandr', - 'Blueman-manager', - 'Gpick', - 'Kruler', - 'MessageWin', -- kalarm. - 'Sxiv', - 'Tor Browser', -- Needs a fixed window size to avoid fingerprinting by screen size. - 'Wpa_gui', - 'veromix', - 'xtightvncviewer', - 'Arcolinux-tweak-tool.py', - 'Arcologout.py', - 'albert', - 'feh', - 'Qalculate-gtk', - 'Galculator', - 'Gnome-calculator', - 'Nitrogen', - 'Grub-customizer', - 'Pavucontrol', - 'Minipad', - 'Evolution-alarm-notify', - 'Connman-gtk', - 'QuakeDD', - }, - -- Note that the name property shown in xprop might be set slightly after creation of the client - -- and the name shown there might not match defined rules here. - name = { - 'Event Tester', -- xev. - }, - role = { - 'AlarmWindow', -- Thunderbird's calendar. - 'ConfigManager', -- Thunderbird's about:config. - 'pop-up', -- e.g. Google Chrome's (detached) Developer Tools. - }, - }, - properties = { floating = true }, - }, - - -- Add titlebars to normal clients and dialogs - { rule_any = { type = { 'normal', 'dialog' } }, properties = { titlebars_enabled = true } }, - - { - rule_any = { - class = { 'firefox', 'LibreWolf', 'Brave-browser', 'qutebrowser', 'waterfox-current', 'Chromium' }, - }, - properties = { screen = 1, tag = awful.screen.focused().tags[2], switch_to_tags = true }, - }, - - { - rule_any = { class = { 'Steam', 'Lutris', 'Timeshift-gtk' } }, - properties = { floating = true, screen = 1, tag = awful.screen.focused().tags[3], switch_to_tags = true }, - }, - - { - rule_any = { class = { 'Evolution', 'mpv', 'vlc', 'parole' } }, - properties = { screen = 1, tag = awful.screen.focused().tags[4], switch_to_tags = true }, - }, - - { - rule_any = { class = { 'VirtualBox Manager', 'Virt-manager' } }, - properties = { floating = true, screen = 1, tag = awful.screen.focused().tags[6], switch_to_tags = true }, - }, - { - rule_any = { class = { 'VirtualBox Machine' } }, - properties = { screen = 1, tag = awful.screen.focused().tags[6], switch_to_tags = true }, - }, -} --- }}} - --- {{{ Signals - -screen.connect_signal('arrange', function(s) - local only_one = #s.tiled_clients == 1 - local layout_name = awful.layout.get().name - for _, c in pairs(s.clients) do - if (only_one and not c.floating) or layout_name == 'max' then - c.border_width = 0 - else - c.border_width = beautiful.border_width - end - end -end) --- Signal function to execute when a new client appears. -client.connect_signal('manage', function(c) - -- Set the windows at the slave, - -- i.e. put it at the end of others instead of setting it master. - -- if not awesome.startup then awful.client.setslave(c) end - - 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) - --- 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:emit_signal('request::activate', 'titlebar', { raise = true }) - awful.mouse.client.move(c) - end), - awful.button({}, 3, function() - c:emit_signal('request::activate', 'titlebar', { raise = true }) - awful.mouse.client.resize(c) - end) - ) - - awful.titlebar(c):setup({ - { - -- Left - awful.titlebar.widget.iconwidget(c), - buttons = buttons, - layout = wibox.layout.fixed.horizontal, - }, - { - -- Middle - { - -- Title - align = 'center', - widget = awful.titlebar.widget.titlewidget(c), - }, - buttons = buttons, - layout = wibox.layout.flex.horizontal, - }, - { - -- Right - awful.titlebar.widget.floatingbutton(c), - awful.titlebar.widget.stickybutton(c), - awful.titlebar.widget.ontopbutton(c), - awful.titlebar.widget.maximizedbutton(c), - awful.titlebar.widget.closebutton(c), - layout = wibox.layout.fixed.horizontal(), - }, - layout = wibox.layout.align.horizontal, - }) -end) - --- Enable sloppy focus, so that focus follows mouse. -client.connect_signal('mouse::enter', function(c) - c:emit_signal('request::activate', 'mouse_enter', { raise = false }) -end) - -client.connect_signal('focus', function(c) - c.border_color = beautiful.border_focus -end) -client.connect_signal('unfocus', function(c) - c.border_color = beautiful.border_normal -end) --- Focus urgent clients automatically -client.connect_signal('property::urgent', function(c) - local ignore_urgent = { 'teams-for-linux', 'microsoft teams - preview', 'Microsoft Teams - Preview' } - for _, ignore in ipairs(ignore_urgent) do - if c.class == ignore then - return - end - end - c.minimized = false - c:jump_to() -end) --- Titlebars only on floating windows {{{ --- Create a titlebar for the client. --- By default, awful.rules will create one, but all it does is to call this --- function. - -function dynamic_title(c) - if c.floating or c.first_tag.layout.name == 'floating' then - awful.titlebar.show(c) - else - awful.titlebar.hide(c) - end -end - -client.connect_signal('property::floating', function(c) - if c.floating then - awful.titlebar.show(c) - else - awful.titlebar.hide(c) - end -end) - -tag.connect_signal('property::layout', function(t) - local clients = t:clients() - for _, c in pairs(clients) do - if c.floating or c.first_tag.layout.name == 'floating' then - awful.titlebar.show(c) - else - awful.titlebar.hide(c) - end - end -end) - -client.connect_signal('manage', dynamic_title) -client.connect_signal('tagged', dynamic_title) --- }}} ---[[ -write me awesomewm widget for volume. Requirements: - - Only update on keypress(like XF86AudioRaiseVolume,XF86AudioLowerVolume,XF86AudioMute) -- Ability to toggle mute. -- Show different icons for volume levels and a separate icon for mute with the volume level itself. ---]] diff --git a/.config/awesome/rc.lua.bkp b/.config/awesome/rc.lua.bkp deleted file mode 100644 index d7920ad..0000000 --- a/.config/awesome/rc.lua.bkp +++ /dev/null @@ -1,1120 +0,0 @@ ---[[ - If LuaRocks is installed, make sure that packages installed through it are - found (e.g. lgi). If LuaRocks is not installed, do nothing. ---]] -pcall(require, 'luarocks.loader') - ---[[ Standard awesome library --]] -local gears = require 'gears' -local gfs = gears.filesystem -local awful = require 'awful' -require 'awful.autofocus' ---[[ Widget and layout library]] -local wibox = require 'wibox' --- Theme handling library -local beautiful = require 'beautiful' --- Notification library -local naughty = require 'naughty' -local menubar = require 'menubar' -local hotkeys_popup = require 'awful.hotkeys_popup' --- Enable hotkeys help widget for VIM and other apps --- when client with a matching name is opened: -require 'awful.hotkeys_popup.keys' --- Awesome widgets {{{ -local brightness_widget = require 'widgets.brightness' -local calendar_widget = require 'widgets.calendar' -local volume = require 'widgets.vol' -local battery_widget = require 'widgets.battery' ---}}} - --- {{{ 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 --- }}} - --- {{{ Variable definitions --- Themes define colours, icons, font and wallpapers. -if not beautiful.init(gfs.get_configuration_dir() .. 'utils/theme.lua') then - local dpi = beautiful.xresources.apply_dpi - beautiful.init({ - font = 'Monospace Bold 10', - useless_gap = 3, - gap_single_client = true, - border_width = dpi(2), - border_normal = '#3F3F3F', - border_focus = '#fae3b0', - }) -end --- beautiful.useless_gap = 2 --- beautiful.gap_single_client = false - --- This is used later as the default terminal and editor to run. -local terminal = os.getenv 'TERMINAL' or 'xterm' -local editor = os.getenv 'EDITOR' or 'nano' -local editor_cmd = terminal .. ' -e ' .. editor -local browser = os.getenv 'BROWSER' or 'firefox' - --- Default modkey. --- Usually, Mod4 is the key with a logo between Control and Alt. --- If you do not like this or do not have such a key, --- I suggest you to remap Mod4 to another key using xmodmap or other tools. --- However, you can use another modifier like Mod1, but it may interact with others. -local modkey = 'Mod4' -local altkey = 'Mod1' - --- Table of layouts to cover with awful.layout.inc, order matters. -awful.layout.layouts = { - awful.layout.suit.tile, - -- awful.layout.suit.tile.left, - -- awful.layout.suit.tile.bottom, - -- awful.layout.suit.tile.top, - -- awful.layout.suit.fair, - -- awful.layout.suit.fair.horizontal, - -- awful.layout.suit.spiral, - -- awful.layout.suit.spiral.dwindle, - awful.layout.suit.max, - awful.layout.suit.floating, - -- awful.layout.suit.max.fullscreen, - -- awful.layout.suit.magnifier, - -- awful.layout.suit.corner.nw, - -- awful.layout.suit.corner.ne, - -- awful.layout.suit.corner.sw, - -- awful.layout.suit.corner.se, -} --- }}} - --- {{{ Menu --- Create a launcher widget and a main menu -myawesomemenu = { - { - 'hotkeys', - function() - hotkeys_popup.show_help(nil, awful.screen.focused()) - end, - }, - { 'manual', terminal .. ' -e man awesome' }, - { 'edit config', editor_cmd .. ' ' .. awesome.conffile }, - { 'restart', awesome.restart }, - { - 'quit', - function() - awesome.quit() - end, - }, -} - -mymainmenu = awful.menu({ - items = { - { 'awesome', myawesomemenu, beautiful.awesome_icon }, - { 'open terminal', terminal }, - }, -}) - -mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, menu = mymainmenu }) - --- Menubar configuration -menubar.utils.terminal = terminal -- Set the terminal for applications that require it --- }}} - --- {{{ Wibar --- Create a textclock widget -local spr = wibox.widget.textbox ' | ' --- local spr = wibox.widget({ --- shape = gears.shape.powerline, --- widget = wibox.widget.separator, --- }) -local mytextclock = wibox.widget.textclock ' %a %b %d, %I:%M %p' -local systray = wibox.widget.systray() -systray:set_base_size(26) --- local systray_margin = wibox.layout.margin() --- systray_margin:set_margins(2) --- systray_margin:set_widget(systray) - --- systray.forced_width = 38 -local cw = calendar_widget({ - theme = 'outrun', - placement = 'top_right', - previous_month_button = 1, - next_month_button = 3, -}) -mytextclock:connect_signal('button::press', function(_, _, _, button) - if button == 1 then - cw.toggle() - end -end) - --- Create a wibox for each screen and add it -local taglist_buttons = gears.table.join( - awful.button({}, 1, function(t) - t:view_only() - end), - awful.button({ modkey }, 1, function(t) - if client.focus then - client.focus:move_to_tag(t) - end - end), - awful.button({}, 3, awful.tag.viewtoggle), - awful.button({ modkey }, 3, function(t) - if client.focus then - client.focus:toggle_tag(t) - end - end), - awful.button({}, 4, function(t) - awful.tag.viewnext(t.screen) - end), - awful.button({}, 5, function(t) - awful.tag.viewprev(t.screen) - end) -) - -local tasklist_buttons = gears.table.join( - awful.button({}, 1, function(c) - if c == client.focus then - c.minimized = true - else - c:emit_signal('request::activate', 'tasklist', { raise = true }) - end - end), - awful.button({}, 3, function() - awful.menu.client_list({ theme = { width = 250 } }) - end), - awful.button({}, 4, function() - awful.client.focus.byidx(1) - end), - awful.button({}, 5, function() - awful.client.focus.byidx(-1) - end) -) - -awful.screen.connect_for_each_screen(function(s) - -- Each screen has its own tag table. - awful.tag({ '1', '2', '3', '4', '5', '6', '7', '8', '9' }, s, awful.layout.layouts[1]) - - -- Create a promptbox for each screen - s.mypromptbox = awful.widget.prompt() - -- Create an imagebox widget which will contain an icon indicating which layout we're using. - -- We need one layoutbox per screen. - s.mylayoutbox = awful.widget.layoutbox(s) - s.mylayoutbox:buttons(gears.table.join( - 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 a taglist widget - s.mytaglist = awful.widget.taglist({ - screen = s, - filter = awful.widget.taglist.filter.noempty, - buttons = taglist_buttons, - }) - - -- Create a tasklist widget - s.mytasklist = awful.widget.tasklist({ - screen = s, - filter = awful.widget.tasklist.filter.currenttags, - buttons = tasklist_buttons, - }) - - -- Create the wibox - s.mywibox = awful.wibar({ position = 'top', screen = s }) - - -- Add widgets to the wibox - s.mywibox:setup({ - layout = wibox.layout.align.horizontal, - { -- Left widgets - layout = wibox.layout.fixed.horizontal, - mylauncher, - s.mytaglist, - s.mypromptbox, - }, - s.mytasklist, -- Middle widget - { -- Right widgets - layout = wibox.layout.fixed.horizontal, - -- spr, - -- awful.widget.watch('bash -c "dwm_bat"', 10), - battery_widget({ - display_notification = true, - show_current_level = true, - font = beautiful.font, - warning_msg_position = 'top_right', - -- path_to_icons = '/usr/share/icons/Qogir/symbolic/status/', - -- path_to_icons = gfs.get_xdg_data_home() .. 'icons/Fluent-grey-dark/symbolic/status/', - }), - spr, - wibox.widget.textbox ' ', - awful.widget.watch('bash -c "printf %d%% $(expr 100 - $(vmstat 1 2 | tail -1 | awk \'{print $15}\'))"', 3), - spr, - wibox.widget.textbox ' ', - awful.widget.watch('sh -c "free -h | awk \'/^Mem/ {print $3}\'"', 5), - spr, - volume(), - spr, - brightness_widget({ - type = 'icon_and_text', - program = 'brightnessctl', - font = beautiful.font, - tooltip = true, - timeout = 120, - }), - -- spr, - -- awful.widget.watch('bash -c "curl wttr.in/411043\\?format=1"', 3600), - spr, - mytextclock, - spr, - s.mylayoutbox, - spr, - systray, - }, - }) -end) --- }}} - --- {{{ Mouse bindings -root.buttons(gears.table.join( - awful.button({}, 3, function() - mymainmenu:toggle() - end), - awful.button({}, 4, awful.tag.viewnext), - awful.button({}, 5, awful.tag.viewprev) -)) --- }}} - --- {{{ Key bindings - --- Helper functions {{{ - --- Defines to move the currently focused window. --- to next/previous adjacent tag. --- -1 for previous and 1 for next adjacent tag. --- @param val number this is either be 1 or -1 --- @param total_tags number total number of tags to cycle through (default total no. tags created) --- @see client.focus:move_to_tag() -local move_to_tag = function(val, total_tags) - local step = val == 1 and 0 or 2 - local total_tags = total_tags or #awful.screen.focused().tags - -- get current tag - local t = client.focus and client.focus.first_tag or nil - if t == nil then - return - end - -- get previous tag (modulo 9 excluding 0 to wrap from 1 to 9) - local tag = client.focus.screen.tags[(t.name - step) % total_tags + 1] - awful.client.movetotag(tag) - tag:view_only() -end --- Skim through non empty tags. --- @param direction number which can either be 1(forward)[default] or -1(backward) --- @param s awful.screen Which monitor to view non empty tag. By default currently focused screen --- @see lain.util.tag_view_nonempty() -local tag_view_nonempty = function(direction, s) - direction = direction or 1 - s = s or awful.screen.focused() - local tags = s.tags - local sel = s.selected_tag - - local i = sel.index - repeat - i = i + direction - - -- Wrap around when we reach one of the bounds - if i > #tags then - i = i - #tags - end - if i < 1 then - i = i + #tags - end - - local t = tags[i] - - -- Stop when we get back to where we started - if t == sel then - break - end - - -- If it's The One, view it. - if #t:clients() > 0 then - t:view_only() - return - end - until false -end --- Resize windows universally. --- @param direction string which direction to go left,right,up,down --- @param pixel number value to resize windows by, default is 0.05 --- @see awful.tag.incmwfact() --- @see awful.client.incwfact() -local resize_window_tiled = function(direction, pixel) - pixel = pixel or 0.05 - -- change pixel to negative if direction is "down/left" - if direction == 'down' or direction == 'left' then - pixel = -pixel - end - - if direction == 'left' or direction == 'right' then - awful.tag.incmwfact(pixel) - else - local master_win = awful.client.getmaster().window - local current_win = client.focus.window - if master_win == current_win then - awful.tag.incmwfact(pixel) - else - pixel = direction == 'up' and -0.05 or 0.05 - awful.client.incwfact(pixel) - end - end -end - -local resize_float = function(c, direction, move) - local move = move or 20 - local direction = direction or 'up' - local c = c or client.focus - if direction == 'left' then - c:relative_move(0, 0, -move, 0) - elseif direction == 'right' then - c:relative_move(0, 0, move, 0) - elseif direction == 'down' then - c:relative_move(0, 0, 0, move) - else - c:relative_move(0, 0, 0, -move) - end -end - -local resize_window = function(direction) - local c = client.focus - if c.floating then - resize_float(c, direction) - else - resize_window_tiled(direction) - end -end --- }}} - -globalkeys = gears.table.join( - - -- Tag browsing {{{ - - -- This is for testing something or anything - -- awful.key({ modkey, }, "backslash", - -- function () - -- local c = client.focus - -- local layout_name = awful.layout.get().name - -- naughty.notify({ preset = naughty.config.presets.normal, - -- title = "Current Layout", - -- timeout = 2, - -- text = tostring(c.floating) }) - -- end, {description = "Testing purpose", group = "tag"}), - - awful.key({ modkey }, '[', awful.tag.viewprev, { description = 'view previous', group = 'tag' }), - awful.key({ modkey }, ']', awful.tag.viewnext, { description = 'view next', group = 'tag' }), - awful.key({ modkey, 'Shift' }, '[', function() - move_to_tag(-1) - end, { description = 'move the focused client to previous tag', group = 'tag' }), - awful.key({ modkey, 'Shift' }, ']', function() - move_to_tag(1) - end, { description = 'move the focused client to next tag', group = 'tag' }), - awful.key({ modkey }, 'Tab', function() - awful.tag.history.restore() - if client.focus then - client.focus:raise() - end - end, { description = 'go back', group = 'tag' }), - - --- }}} - - -- Non-empty tag browsing {{{ - awful.key({ modkey }, 'grave', function() - tag_view_nonempty(1) - end, { description = 'view next nonempty', group = 'tag' }), - - awful.key({ modkey, 'Shift' }, 'grave', function() - tag_view_nonempty(-1) - end, { description = 'view previous nonempty', group = 'tag' }), - - awful.key({ modkey }, 'comma', function() - tag_view_nonempty(-1) - end, { description = 'view previous nonempty', group = 'tag' }), - - awful.key({ modkey }, 'period', function() - tag_view_nonempty(1) - end, { description = 'view next nonempty', group = 'tag' }), - --- }}} - - -- By direction client focus {{{ - - awful.key({ modkey }, 'Down', function() - awful.client.focus.global_bydirection 'down' - if client.focus then - client.focus:raise() - end - end, { description = 'focus down', group = 'client' }), - awful.key({ modkey }, 'Up', function() - awful.client.focus.global_bydirection 'up' - if client.focus then - client.focus:raise() - end - end, { description = 'focus up', group = 'client' }), - awful.key({ modkey }, 'Left', function() - awful.client.focus.global_bydirection 'left' - if client.focus then - client.focus:raise() - end - end, { description = 'focus left', group = 'client' }), - awful.key({ modkey }, 'Right', function() - awful.client.focus.global_bydirection 'right' - if client.focus then - client.focus:raise() - end - end, { description = 'focus right', group = 'client' }), - awful.key({ modkey }, 'j', function() - awful.client.focus.byidx(1) - if client.focus then - client.focus:raise() - end - end, { description = 'focus down', group = 'client' }), - awful.key({ modkey }, 'k', function() - awful.client.focus.byidx(-1) - if client.focus then - client.focus:raise() - end - end, { description = 'focus up', group = 'client' }), - awful.key({ modkey }, 'h', function() - awful.client.focus.global_bydirection 'left' - if client.focus then - client.focus:raise() - end - end, { description = 'focus left', group = 'client' }), - awful.key({ modkey }, 'l', function() - awful.client.focus.global_bydirection 'right' - if client.focus then - client.focus:raise() - end - end, { description = 'focus right', group = 'client' }), - awful.key({ altkey }, 'Tab', function() - awful.client.focus.byidx(1) - if client.focus then - client.focus:raise() - end - end, { description = 'Focus to next Client', group = 'client' }), - awful.key({ altkey, 'Shift' }, 'Tab', function() - awful.client.focus.byidx(-1) - if client.focus then - client.focus:raise() - end - end, { description = 'Focus to previous Client', group = 'client' }), - -- }}} - - -- Layout manipulation {{{ - - awful.key({ modkey, 'Shift' }, 'j', function() - awful.client.swap.byidx(1) - end, { description = 'swap with next client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'k', function() - awful.client.swap.byidx(-1) - end, { description = 'swap with previous client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'Left', function() - awful.client.swap.byidx(-1) - end, { description = 'swap with next client by index', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'Right', function() - awful.client.swap.byidx(1) - end, { description = 'swap with previous client by index', group = 'client' }), - --- }}} - - -- On the fly useless gaps change {{{ - - -- awful.key({ modkey, 'Shift' }, '=', function() - -- awful.tag.setmwfact(0.85) - -- end, { description = 'increment useless gaps', group = 'tag' }), - -- awful.key({ modkey }, '-', function() - -- awful.tag.setmwfact(0.50) - -- end, { description = 'decrement useless gaps', group = 'tag' }), - --- }}} - - -- Standard program {{{ - - awful.key({ modkey }, 'Return', function() - awful.spawn 'alacritty' - end, { description = 'open a ' .. terminal, group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'Return', function() - awful.spawn 'kitty' - end, { description = 'open a kitty', group = 'launcher' }), - awful.key({ modkey }, 'w', function() - awful.spawn(browser) - end, { description = 'open a ' .. browser, group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'w', function() - local cmd = browser ~= 'firefox' and 'firefox' or 'brave || chromium' - awful.spawn.easy_async_with_shell(cmd, function(_, err) - if err ~= '' or err ~= nil then - naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Browser Not Found', - text = 'Brave or Chromium is not installed in the system ' + err, - }) - end - end) - end, { description = 'open a firefox', group = 'launcher' }), - awful.key({ modkey }, 'e', function() - awful.spawn 'thunar' - end, { description = 'open a file manager', group = 'launcher' }), - awful.key({ modkey, 'Shift' }, 'e', function() - awful.spawn 'alacritty -e vif' - end, { description = 'open a vif', group = 'launcher' }), - --- }}} - - -- User programs {{{ - -- awful.key({ modkey, "Shift" }, "d", function() - -- awful.spawn("rofi -show run -async-pre-read") - -- end, { description = "Launch Rofi", group = "launcher" }), - - awful.key({ modkey }, 'd', function() - awful.spawn 'dmenu_run_history -i' - end, { description = 'Launch Dmenu', group = 'launcher' }), - - awful.key({ 'altkey' }, 'Print', function() - awful.spawn.with_shell 'flameshot gui' - end, { description = 'Capture Screenshot(Fullscreen - flameshot)', group = 'launcher' }), - awful.key({}, 'Print', function() - awful.spawn.with_shell 'take_ss clip' - end, { description = 'Capture Screenshot(Fullscreen - Maim)', group = 'launcher' }), - awful.key({ 'Shift' }, 'Print', function() - awful.spawn.with_shell 'take_ss focus' - end, { description = 'Capture Screenshot(focus)', group = 'launcher' }), - - awful.key({ modkey }, 'v', function() - awful.spawn 'virt-manager' - end, { description = 'Launch VirtualBox', group = 'launcher' }), - awful.key({ modkey }, 'g', function() - local cmd = 'qalculate-gtk ||gnome-calculator || galculator' - awful.spawn.easy_async_with_shell(cmd, function(_, err) - if err ~= '' or err ~= nil then - naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Calculator Not Found', - text = 'Qalculate-gtk, Gnome-calculator or Galculator is not installed in the system ' + err, - }) - end - end) - end, { description = 'Launch Calculator', group = 'launcher' }), - --- }}} - - -- Custom Scripts {{{ - - awful.key({ modkey, 'Control' }, 'Left', function() - resize_window 'left' - end, { description = 'Resize left', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Right', function() - resize_window 'right' - end, { description = 'Resize Right', group = 'client' }), - - awful.key({ modkey, 'Control' }, 's', function() - awful.spawn.with_shell 'logout_prompt' - end, { description = 'Ask For Logout(ie shutdown,reboot or logout)', group = 'scripts' }), - - awful.key({ modkey, altkey }, 'c', function() - awful.spawn 'open-rcs' - end, { description = 'Edit RC files', group = 'scripts' }), - awful.key({ modkey, altkey }, 'g', function() - awful.spawn 'open-games' - end, { description = 'Launch Game', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'p', function() - awful.spawn 'get-class-name' - end, { description = 'Get window class name', group = 'scripts' }), - awful.key({ 'Control', altkey }, 'c', function() - awful.spawn.with_shell 'xcolor -s' - end, { description = 'Color Selector', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'e', function() - awful.spawn 'rofie' - end, { description = 'Launch Emoji Selector', group = 'scripts' }), - - awful.key({ 'Control', altkey }, 'v', function() - awful.spawn 'pavucontrol' - end, { description = 'launch volume controller', group = 'launcher' }), - - -- awful.key({ modkey }, "F12", function() - -- awful.spawn.with_shell("tdrop -am -w 60% -h 55% -x 20% -y 25% st -c 'Minipad'") - -- end, { description = "launch Dropdown(Scratch pad) Terminal", group = "launcher" }), - - awful.key({ modkey }, 'y', function() - awful.spawn.with_shell 'clipboard' - end, { description = 'Launch Clipboard Manager', group = 'scripts' }), - awful.key({ modkey }, 'r', function() - awful.spawn.with_shell 'rofi -show drun -async-pre-read' - end, { description = 'Rofi Application Launcher', group = 'launcher' }), - -- awful.key({ modkey }, "z", function() - -- quake:toggle() - -- end), - - --- }}} - - -- Standard program {{{ - awful.key({ modkey }, 'F1', hotkeys_popup.show_help, { description = 'show help', group = 'awesome' }), - - awful.key({ modkey, 'Control' }, 'r', awesome.restart, { description = 'reload awesome', group = 'awesome' }), - awful.key({ modkey, 'Control' }, 'x', awesome.quit, { description = 'quit awesome', group = 'awesome' }), - awful.key({ modkey, 'Control' }, 'l', function() - awful.spawn( - string.format( - 'i3lock -k --time-pos "100:1000" --greeter-text="Welcome Back" --wrong-text="Incorrect password!" -i %s/Pictures/Wallpapers/canvas.jpg', - os.getenv 'HOME' - ) - ) - end, { description = 'i3lock', group = 'awesome' }), - - awful.key({ modkey, 'Control' }, 'n', function() - local c = awful.client.restore() - -- Focus restored client - if c then - c:emit_signal('request::activate', 'key.unminimize', { raise = true }) - end - end, { description = 'restore minimized', group = 'client' }), - - -- Prompt - -- awful.key({ modkey }, 'r', function() - -- awful.screen.focused().mypromptbox:run() - -- end, { description = 'run prompt', group = 'launcher' }), - - awful.key({ modkey }, 'x', function() - awful.prompt.run({ - prompt = 'Run Lua code: ', - textbox = awful.screen.focused().mypromptbox.widget, - exe_callback = awful.util.eval, - history_path = awful.util.get_cache_dir() .. '/history_eval', - }) - end, { description = 'lua execute prompt', group = 'awesome' }), - -- }}} - - -- Brightness {{{ - - awful.key({}, 'XF86MonBrightnessUp', function() - brightness_widget:inc() - end, { description = 'Brightness +10%', group = 'hotkeys' }), - awful.key({}, 'XF86MonBrightnessDown', function() - brightness_widget:dec() - end, { description = 'Brightness -10%', group = 'hotkeys' }), - awful.key({ 'Shift' }, 'XF86MonBrightnessUp', function() - os.execute 'brightnessctl s 200' - end, { description = '-10%', group = 'hotkeys' }), - awful.key({ 'Shift' }, 'XF86MonBrightnessDown', function() - os.execute 'brightnessctl s 20' - end, { description = '-10%', group = 'hotkeys' }), - --- }}} - - -- Volume Control {{{ - - awful.key({}, 'XF86AudioRaiseVolume', function() - -- os.execute("pamixer -i 10 --allow-boost") - -- os.execute('pactl set-sink-volume @DEFAULT_SINK@ +10%') - volume:inc() - -- beautiful.volume.update() - end, { description = 'volume up', group = 'hotkeys' }), - awful.key({}, 'XF86AudioLowerVolume', function() - -- os.execute("pamixer -d 10 --allow-boost") - -- os.execute('pactl set-sink-volume @DEFAULT_SINK@ -10%') - volume:dec() - -- beautiful.volume.update() - end, { description = 'volume down', group = 'hotkeys' }), - awful.key({}, 'XF86AudioMute', function() - -- os.execute("pamixer --toggle-mute") - -- os.execute('pactl set-sink-mute @DEFAULT_SINK@ toggle') - volume:toggle() - -- beautiful.volume.update() - end, { description = 'toggle mute', group = 'hotkeys' }) - - --- }}} -) - --- Handle Windows(Like toggle floating,move to another tag,etc) {{{ -clientkeys = gears.table.join( - awful.key({ modkey }, 'f', function(c) - c.fullscreen = not c.fullscreen - local cur_tag = client.focus and client.focus.first_tag or nil - if not cur_tag then - naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Not Found', - text = 'Current tag returned nil', - }) - end - for _, cls in ipairs(cur_tag:clients()) do - -- minimize all windows except the focused one - if c.window ~= cls.window then - cls.hidden = c.fullscreen - -- mouse.screen.mywibox.visible = not c.fullscreen - end - end - c:raise() - end, { description = 'toggle fullscreen', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'q', function(c) - c:kill() - end, { description = 'close', group = 'client' }), - awful.key({ modkey }, 's', awful.client.floating.toggle, { description = 'toggle floating', group = 'client' }), - -- awful.key({ modkey,'Shift' }, 's', awful.client.sticky.toggle, { description = 'toggle sticky', group = 'client' }), - awful.key({ modkey }, 't', function() - -- c.fullscreen = false - -- c.sticky = false - -- c.floating = false - awful.layout.set(awful.layout.suit.tile) - end, { description = 'toggle keep on top', group = 'client' }), - awful.key({ modkey }, 'n', function(c) - c.minimized = not c.minimized - end, { description = 'minimize focused window', group = 'client' }), - awful.key({ modkey }, 'm', function() - -- c.maximized = not c.maximized - -- c:raise() - local layout_name = awful.layout.get().name - local change_layout = layout_name == 'max' and awful.layout.suit.tile or awful.layout.suit.max - awful.layout.set(change_layout) - end, { description = 'Toggle Between max layout', group = 'client' }), - awful.key({ modkey, 'Shift' }, 'm', function(c) - c.maximized = not c.maximized - c:raise() - end, { description = 'maximize focused window', group = 'client' }), - - awful.key({ modkey, 'Control' }, 'Return', function(c) - c:swap(awful.client.getmaster()) - end, { description = 'move to master', group = 'client' }), - - awful.key({ modkey, 'Control' }, 'Up', function(c) - local move = 20 - if c.floating then - c:relative_move(0, -move, 0, 0) - end - end, { description = 'Move Floating Window towards up', group = 'client' }), - - awful.key({ modkey, 'Control' }, 'Down', function(c) - local move = 20 - if c.floating then - c:relative_move(0, move, 0, 0) - end - end, { description = 'Move Floating Window towards down', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Left', function(c) - local move = 20 - if c.floating then - c:relative_move(-move, 0, 0, 0) - end - end, { description = 'Move Floating Window towards left', group = 'client' }), - awful.key({ modkey, 'Control' }, 'Right', function(c) - local move = 20 - if c.floating then - c:relative_move(move, 0, 0, 0) - end - end, { description = 'Move Floating Window towards right', group = 'client' }) -) - --- Bind all key numbers to tags. --- Be careful: we use keycodes to make it work on any keyboard layout. --- This should map on the top row of your keyboard, usually 1 to 9. -for i = 1, 9 do - globalkeys = gears.table.join( - globalkeys, - -- View tag only. - awful.key({ modkey }, '#' .. i + 9, function() - local screen = awful.screen.focused() - local tag = screen.tags[i] - if tag then - tag:view_only() - end - end, { description = 'view tag #' .. i, group = 'tag' }), - -- Toggle tag display. - awful.key({ modkey, 'Control' }, '#' .. i + 9, function() - local screen = awful.screen.focused() - local tag = screen.tags[i] - if tag then - awful.tag.viewtoggle(tag) - end - end, { description = 'toggle tag #' .. i, group = 'tag' }), - -- Move client to tag. - awful.key({ modkey, 'Shift' }, '#' .. i + 9, function() - if client.focus then - local tag = client.focus.screen.tags[i] - if tag then - client.focus:move_to_tag(tag) - end - end - end, { description = 'move focused client to tag #' .. i, group = 'tag' }), - -- Toggle tag on focused client. - awful.key({ modkey, 'Control', 'Shift' }, '#' .. i + 9, function() - if client.focus then - local tag = client.focus.screen.tags[i] - if tag then - client.focus:toggle_tag(tag) - end - end - end, { description = 'toggle focused client on tag #' .. i, group = 'tag' }) - ) -end - -clientbuttons = gears.table.join( - awful.button({}, 1, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - end), - awful.button({ modkey }, 1, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - awful.mouse.client.move(c) - end), - awful.button({ modkey }, 3, function(c) - c:emit_signal('request::activate', 'mouse_click', { raise = true }) - awful.mouse.client.resize(c) - end) -) --- }}} - --- Set keys -root.keys(globalkeys) --- }}} - --- {{{ Rules --- Rules to apply to new clients (through the "manage" signal). -awful.rules.rules = { - -- All clients will match this rule. - { - rule = {}, - properties = { - border_width = beautiful.border_width, - border_color = beautiful.border_normal, - focus = awful.client.focus.filter, - raise = true, - keys = clientkeys, - buttons = clientbuttons, - screen = awful.screen.preferred, - placement = awful.placement.no_overlap + awful.placement.no_offscreen, - }, - }, - - -- Floating clients. - { - rule_any = { - instance = { - 'DTA', -- Firefox addon DownThemAll. - 'copyq', -- Includes session name in class. - 'pinentry', - }, - class = { - 'Arandr', - 'Blueman-manager', - 'Gpick', - 'Kruler', - 'MessageWin', -- kalarm. - 'Sxiv', - 'Tor Browser', -- Needs a fixed window size to avoid fingerprinting by screen size. - 'Wpa_gui', - 'veromix', - 'xtightvncviewer', - 'Arcolinux-tweak-tool.py', - 'Arcologout.py', - 'albert', - 'feh', - 'Qalculate-gtk', - 'Galculator', - 'Gnome-calculator', - 'Nitrogen', - 'Grub-customizer', - 'Pavucontrol', - 'Minipad', - 'Evolution-alarm-notify', - 'Connman-gtk', - 'QuakeDD', - }, - - -- Note that the name property shown in xprop might be set slightly after creation of the client - -- and the name shown there might not match defined rules here. - name = { - 'Event Tester', -- xev. - }, - role = { - 'AlarmWindow', -- Thunderbird's calendar. - 'ConfigManager', -- Thunderbird's about:config. - 'pop-up', -- e.g. Google Chrome's (detached) Developer Tools. - }, - }, - properties = { floating = true }, - }, - - -- Add titlebars to normal clients and dialogs - { rule_any = { type = { 'normal', 'dialog' } }, properties = { titlebars_enabled = true } }, - - { - rule_any = { - class = { 'firefox', 'LibreWolf', 'Brave-browser', 'qutebrowser', 'waterfox-current', 'Chromium' }, - }, - properties = { screen = 1, tag = awful.screen.focused().tags[2], switch_to_tags = true }, - }, - - { - rule_any = { class = { 'Steam', 'Lutris', 'Timeshift-gtk' } }, - properties = { floating = true, screen = 1, tag = awful.screen.focused().tags[3], switch_to_tags = true }, - }, - - { - rule_any = { class = { 'Evolution', 'mpv', 'vlc', 'parole' } }, - properties = { screen = 1, tag = awful.screen.focused().tags[4], switch_to_tags = true }, - }, - - { - rule_any = { class = { 'VirtualBox Manager', 'Virt-manager' } }, - properties = { floating = true, screen = 1, tag = awful.screen.focused().tags[6], switch_to_tags = true }, - }, - { - rule_any = { class = { 'VirtualBox Machine' } }, - properties = { screen = 1, tag = awful.screen.focused().tags[6], switch_to_tags = true }, - }, -} --- }}} - --- {{{ Signals - -screen.connect_signal('arrange', function(s) - local only_one = #s.tiled_clients == 1 - local layout_name = awful.layout.get().name - for _, c in pairs(s.clients) do - if (only_one and not c.floating) or layout_name == 'max' then - c.border_width = 0 - else - c.border_width = beautiful.border_width - end - end -end) --- Signal function to execute when a new client appears. -client.connect_signal('manage', function(c) - -- Set the windows at the slave, - -- i.e. put it at the end of others instead of setting it master. - -- if not awesome.startup then awful.client.setslave(c) end - - 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) - --- 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:emit_signal('request::activate', 'titlebar', { raise = true }) - awful.mouse.client.move(c) - end), - awful.button({}, 3, function() - c:emit_signal('request::activate', 'titlebar', { raise = true }) - awful.mouse.client.resize(c) - end) - ) - - awful.titlebar(c):setup({ - { -- Left - awful.titlebar.widget.iconwidget(c), - buttons = buttons, - layout = wibox.layout.fixed.horizontal, - }, - { -- Middle - { -- Title - align = 'center', - widget = awful.titlebar.widget.titlewidget(c), - }, - buttons = buttons, - layout = wibox.layout.flex.horizontal, - }, - { -- Right - awful.titlebar.widget.floatingbutton(c), - awful.titlebar.widget.stickybutton(c), - awful.titlebar.widget.ontopbutton(c), - awful.titlebar.widget.maximizedbutton(c), - awful.titlebar.widget.closebutton(c), - layout = wibox.layout.fixed.horizontal(), - }, - layout = wibox.layout.align.horizontal, - }) -end) - --- Enable sloppy focus, so that focus follows mouse. -client.connect_signal('mouse::enter', function(c) - c:emit_signal('request::activate', 'mouse_enter', { raise = false }) -end) - -client.connect_signal('focus', function(c) - c.border_color = beautiful.border_focus -end) -client.connect_signal('unfocus', function(c) - c.border_color = beautiful.border_normal -end) --- Focus urgent clients automatically -client.connect_signal('property::urgent', function(c) - local ignore_urgent = { 'teams-for-linux', 'microsoft teams - preview', 'Microsoft Teams - Preview' } - for _, ignore in ipairs(ignore_urgent) do - if c.class == ignore then - return - end - end - c.minimized = false - c:jump_to() -end) --- Titlebars only on floating windows {{{ --- Create a titlebar for the client. --- By default, awful.rules will create one, but all it does is to call this --- function. - -function dynamic_title(c) - if c.floating or c.first_tag.layout.name == 'floating' then - awful.titlebar.show(c) - else - awful.titlebar.hide(c) - end -end - -client.connect_signal('property::floating', function(c) - if c.floating then - awful.titlebar.show(c) - else - awful.titlebar.hide(c) - end -end) - -tag.connect_signal('property::layout', function(t) - local clients = t:clients() - for _, c in pairs(clients) do - if c.floating or c.first_tag.layout.name == 'floating' then - awful.titlebar.show(c) - else - awful.titlebar.hide(c) - end - end -end) - -client.connect_signal('manage', dynamic_title) -client.connect_signal('tagged', dynamic_title) --- }}} diff --git a/.config/awesome/utils/ez_keys.lua b/.config/awesome/utils/ez_keys.lua deleted file mode 100644 index 7126b6e..0000000 --- a/.config/awesome/utils/ez_keys.lua +++ /dev/null @@ -1,159 +0,0 @@ --- This project is licensed under the MIT License (see LICENSE). - ---- Create key and button bindings from simple definitions. --- --- @author James Reed <jcrd@tuta.io> et al. --- @copyright 2019-2020 James Reed --- @module awesome-ez - -local awful = require("awful") -local gtable = require("gears.table") - -local ez = {} - -local modifiers = { - ["M"] = "Mod4", - ["A"] = "Mod1", - ["S"] = "Shift", - ["C"] = "Control", -} - ---- Split a string on a delimiter. --- --- @param s The string. --- @param sep The delimiter. --- @return A table of strings. -local function split(s, sep) - sep = sep or "%s" - local res = {} - for m in string.gmatch(s, string.format("([^%s]+)", sep)) do - table.insert(res, m) - end - return res -end - -ez.util = {} - ---- Convert a table into a callable function. --- --- The first element of the table should be a function, followed by arguments --- to this function. --- --- @param cb The callback or a table describing the callback. --- @usage local cb = ez.util.cb_from_table({awful.spawn, "xterm"}) --- @return The callback. -function ez.util.cb_from_table(cb) - if type(cb) == "table" and - not (getmetatable(cb) and getmetatable(cb).__call) then - local tbl = gtable.clone(cb, false) - local func = table.remove(tbl, 1) - cb = function () - return func(unpack(tbl)) - end - end - return cb -end - ---- Parse a key definition string into modifiers and a key. --- --- Key definition strings consist of modifier characters and a key separated --- by hyphens, e.g. "M-S-x" is the combination of Mod4, Shift, and the x key. --- If the key is surrounded by <>, it is interpreted as a key group, e.g. --- "M-<numrow> uses the modifier Mod4 and the key group "numrow". --- --- The modifier key strings are: M = Mod4, A = Mod1, S = Shift, C = Control. --- --- @param keydef The key definition string. --- @usage local modkeys, key = ez.util.parse_key("M-Return") --- @return A table of modifiers and the key. -function ez.util.parse_key(keydef) - local modkeys = {} - for _, key in ipairs(split(keydef, "-")) do - if modifiers[key] ~= nil then - table.insert(modkeys, modifiers[key]) - else - local group = string.match(key, "<(%w+)>") - if group then - return modkeys, nil, group - end - return modkeys, key - end - end -end - ---- Parse a button definition string into modifiers and a button. --- --- Button definition strings consist of modifier characters and a key separated --- by hyphens, e.g. "M-S-1" is the combination of Mod4, Shift, and button 1. --- --- The modifier key strings are: M = Mod4, A = Mod1, S = Shift, C = Control. --- --- @param btndef The button definition string. --- @usage local modkeys, btn = ez.util.parse_button("M-1") --- @return A table of modifiers and the button. -function ez.util.parse_button(btndef) - if type(btndef) == "number" then - return {}, btndef - end - local modkeys = {} - for _, key in ipairs(split(btndef, "-")) do - if modifiers[key] ~= nil then - table.insert(modkeys, modifiers[key]) - else - return modkeys, tonumber(key) - end - end -end - ---- Create a key binding from a key definition string and callback. --- --- @param keydef The key definition string. --- @param cb The callback or table describing the callback. --- @return A table with the key objects. -function ez.key(keydef, cb) - local modkeys, key, group = ez.util.parse_key(keydef) - if group then - return awful.key { - keygroup = group, - modifiers = modkeys, - on_press = cb, - } - end - return awful.key(modkeys, key, ez.util.cb_from_table(cb)) -end - ---- Create a button binding from a button definition string and callback. --- --- @param btndef The button definition string. --- @param cb The callback or table describing the callback. --- @return A table with the button objects. -function ez.btn(btndef, cb) - local modkeys, btn = ez.util.parse_button(btndef) - return awful.button(modkeys, btn, ez.util.cb_from_table(cb)) -end - ---- Create key bindings for elements of a table. --- --- @param tbl The table of key bindings. --- @return A table containing created key objects. -function ez.keytable(tbl) - local res = {} - for keydef, cb in pairs(tbl) do - table.insert(res, ez.key(keydef, cb)) - end - return res -end - ---- Create button bindings for elements of a table. --- --- @param tbl The table of button bindings. --- @return A table containing created button objects. -function ez.btntable(tbl) - local res = {} - for btndef, cb in pairs(tbl) do - table.insert(res, ez.btn(btndef, cb)) - end - return res -end - -return ez diff --git a/.config/awesome/utils/helper.lua b/.config/awesome/utils/helper.lua deleted file mode 100644 index 048dd6b..0000000 --- a/.config/awesome/utils/helper.lua +++ /dev/null @@ -1,45 +0,0 @@ -local M = {} - ---- Run a shell command and return output ----@param cmd string cmd to run ----@return string output of `cmd` -function M.shell_run(cmd) - local result = 0 - local output = io.popen(cmd) - if not output then - return 'pactl return error.' - end - result = output:read '*a' - output:close() - return result -end - ---- Function to return output of shell command or nil ----@param cmd string cmd to run ----@param raw boolean? whether or not to remove spaces and empty lines ----@return string? -function M.capture(cmd, raw) - local handle = assert(io.popen(cmd, 'r')) - local output = assert(handle:read '*a') - - handle:close() - - if raw then - return output - end - - output = string.gsub(string.gsub(string.gsub(output, '^%s+', ''), '%s+$', ''), '[\n\r]+', ' ') - - return output -end - -function M.tableToString(t) - local bytearr = {} - for _, v in ipairs(t) do - local utf8byte = v < 0 and (0xff + v + 1) or v - table.insert(bytearr, string.char(utf8byte)) - end - return table.concat(bytearr) -end - -return M diff --git a/.config/awesome/utils/sample.lua b/.config/awesome/utils/sample.lua deleted file mode 100644 index 29f577c..0000000 --- a/.config/awesome/utils/sample.lua +++ /dev/null @@ -1,24 +0,0 @@ -function capture(cmd, raw) - local handle = assert(io.popen(cmd, 'r')) - local output = assert(handle:read('*a')) - - handle:close() - - if raw then - return output - end - - output = string.gsub(string.gsub(string.gsub(output, '^%s+', ''), '%s+$', ''), '[\n\r]+', ' ') - - return output -- == '' and nil or output -end - --- local handle = capture('pactl get-sink-mute @DEFAULT_SINK@ | grep yes') -local handle = capture('pamixer --get-volume-human') --- if not handle then --- return 1 --- end --- local result = handle:read('*a') or 'Nothing found' --- print(string.len(handle) > 0 and handle or 'Unmute') -print(string.format('%s%%', handle)) --- handle:close() diff --git a/.config/awesome/utils/theme.lua b/.config/awesome/utils/theme.lua deleted file mode 100644 index d59058c..0000000 --- a/.config/awesome/utils/theme.lua +++ /dev/null @@ -1,119 +0,0 @@ -local xresources = require 'beautiful.xresources' -local gears = require 'gears' - -local gfs = gears.filesystem -local dpi = xresources.apply_dpi - --- local my_table = awful.util.table or gears.table -- 4.{0,1} compatibility -local icon_dir = gfs.get_xdg_data_home() .. 'icons/Papirus-Dark/symbolic/actions' -if not gfs.dir_readable(icon_dir) then - require('naughty').notify({ - preset = require('naughty').config.presets.critical, - title = 'Current Layout', - timeout = 2, - text = 'icon_dir ' .. icon_dir .. ' does not exist', - }) -end - -local theme_assets = require 'beautiful.theme_assets' -local themes_path = gfs.get_themes_dir() -local theme = {} --- theme.dir = homedir .. "/.config/awesome/themes/powerarrow-dark" --- theme.wallpaper = theme.dir .. "/wall.png" -theme.font = 'FuraCode Nerd Font Medium 9' -theme.fg_normal = '#DDDDFF' -theme.fg_focus = '#EA6F81' -theme.fg_urgent = '#CC9393' -theme.bg_normal = '#1A1A1A' -theme.bg_focus = '#313131' -theme.bg_urgent = '#1A1A1A' -theme.border_width = dpi(3) -theme.border_normal = '#3F3F3F' -theme.border_focus = '#bd93f9' -theme.border_marked = '#CC9393' -theme.tasklist_bg_focus = '#1A1A1A' -theme.titlebar_bg_focus = theme.bg_focus -theme.titlebar_bg_normal = theme.bg_normal -theme.titlebar_fg_focus = theme.fg_focus -theme.menu_height = dpi(15) -theme.menu_width = dpi(100) - --- theme.awesome_icon = theme_assets.awesome_icon(theme.menu_height, theme.bg_focus, theme.fg_focus) --- theme.menu_submenu_icon = theme.dir .. "/icons/submenu.png" - --- local taglist_square_size = dpi(4) --- theme.taglist_squares_sel = theme_assets.taglist_squares_sel(taglist_square_size, theme.fg_normal) --- theme.taglist_squares_unsel = theme_assets.taglist_squares_unsel(taglist_square_size, theme.fg_normal) -theme.layout_fairh = themes_path .. 'default/layouts/fairhw.png' -theme.layout_fairv = themes_path .. 'default/layouts/fairvw.png' -theme.layout_floating = themes_path .. 'default/layouts/floatingw.png' -theme.layout_magnifier = themes_path .. 'default/layouts/magnifierw.png' -theme.layout_max = themes_path .. 'default/layouts/maxw.png' -theme.layout_fullscreen = themes_path .. 'default/layouts/fullscreenw.png' -theme.layout_tilebottom = themes_path .. 'default/layouts/tilebottomw.png' -theme.layout_tileleft = themes_path .. 'default/layouts/tileleftw.png' -theme.layout_tile = themes_path .. 'default/layouts/tilew.png' -theme.layout_tiletop = themes_path .. 'default/layouts/tiletopw.png' -theme.layout_spiral = themes_path .. 'default/layouts/spiralw.png' -theme.layout_dwindle = themes_path .. 'default/layouts/dwindlew.png' -theme.layout_cornernw = themes_path .. 'default/layouts/cornernww.png' -theme.layout_cornerne = themes_path .. 'default/layouts/cornernew.png' -theme.layout_cornersw = themes_path .. 'default/layouts/cornersww.png' -theme.layout_cornerse = themes_path .. 'default/layouts/cornersew.png' --- theme.widget_ac = theme.dir .. "/icons/ac.png" --- theme.widget_battery = theme.dir .. "/icons/battery.png" --- theme.widget_battery_low = theme.dir .. "/icons/battery_low.png" --- theme.widget_battery_empty = theme.dir .. "/icons/battery_empty.png" --- theme.widget_mem = theme.dir .. "/icons/mem.png" --- theme.widget_cpu = theme.dir .. "/icons/cpu.png" --- theme.widget_temp = theme.dir .. "/icons/temp.png" --- theme.widget_net = theme.dir .. "/icons/net.png" --- theme.widget_hdd = theme.dir .. "/icons/hdd.png" --- theme.widget_music = theme.dir .. "/icons/note.png" --- theme.widget_music_on = theme.dir .. "/icons/note_on.png" --- theme.widget_vol = theme.dir .. "/icons/vol.png" --- theme.widget_vol_low = theme.dir .. "/icons/vol_low.png" --- theme.widget_vol_no = theme.dir .. "/icons/vol_no.png" --- theme.widget_vol_mute = theme.dir .. "/icons/vol_mute.png" --- theme.widget_mail = theme.dir .. "/icons/mail.png" --- theme.widget_mail_on = theme.dir .. "/icons/mail_on.png" -theme.tasklist_plain_task_name = true -theme.tasklist_disable_icon = false -theme.useless_gap = dpi(2) -theme.gap_single_client = false - -theme.titlebar_close_button_focus = icon_dir .. '/window-close-symbolic.svg' -theme.titlebar_close_button_normal = icon_dir .. '/window-close-symbolic.svg' - -theme.titlebar_minimize_button_normal = themes_path .. 'default/titlebar/minimize_normal.png' -theme.titlebar_minimize_button_focus = themes_path .. 'default/titlebar/minimize_focus.png' - -theme.titlebar_ontop_button_normal_inactive = themes_path .. 'default/titlebar/ontop_normal_inactive.png' -theme.titlebar_ontop_button_focus_inactive = themes_path .. 'default/titlebar/ontop_focus_inactive.png' -theme.titlebar_ontop_button_normal_active = themes_path .. 'default/titlebar/ontop_normal_active.png' -theme.titlebar_ontop_button_focus_active = themes_path .. 'default/titlebar/ontop_focus_active.png' - -theme.titlebar_sticky_button_normal_inactive = themes_path .. 'default/titlebar/sticky_normal_inactive.png' -theme.titlebar_sticky_button_focus_inactive = themes_path .. 'default/titlebar/sticky_focus_inactive.png' -theme.titlebar_sticky_button_normal_active = themes_path .. 'default/titlebar/sticky_normal_active.png' -theme.titlebar_sticky_button_focus_active = themes_path .. 'default/titlebar/sticky_focus_active.png' - -theme.titlebar_floating_button_normal_inactive = themes_path .. 'default/titlebar/floating_normal_inactive.png' -theme.titlebar_floating_button_focus_inactive = themes_path .. 'default/titlebar/floating_focus_inactive.png' -theme.titlebar_floating_button_normal_active = themes_path .. 'default/titlebar/floating_normal_active.png' -theme.titlebar_floating_button_focus_active = themes_path .. 'default/titlebar/floating_focus_active.png' - -theme.titlebar_maximized_button_normal_inactive = themes_path .. 'default/titlebar/maximized_normal_inactive.png' -theme.titlebar_maximized_button_focus_inactive = themes_path .. 'default/titlebar/maximized_focus_inactive.png' -theme.titlebar_maximized_button_normal_active = themes_path .. 'default/titlebar/maximized_normal_active.png' -theme.titlebar_maximized_button_focus_active = themes_path .. 'default/titlebar/maximized_focus_active.png' - -theme.notification_max_width = dpi(480) -theme.notification_max_height = dpi(160) -theme.notification_icon_size = dpi(32) -theme.notification_border_width = dpi(3) -theme.notification_border_color = '#89b4fa' - -theme.icon_theme = '/usr/share/icons/Arc' - -return theme diff --git a/.config/awesome/widgets/battery/README.md b/.config/awesome/widgets/battery/README.md deleted file mode 100644 index b15aac6..0000000 --- a/.config/awesome/widgets/battery/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Battery widget - -Simple and easy-to-install widget for Awesome Window Manager. - -This widget consists of: - - - an icon which shows the battery level: - ![Battery Widget](./bat-wid-1.png) - - a pop-up window, which shows up when you hover over an icon: - ![Battery Widget](./bat-wid-2.png) - Alternatively you can use a tooltip (check the code): - ![Battery Widget](./bat-wid-22.png) - - a pop-up warning message which appears on bottom right corner when battery level is less that 15% (you can get the image [here](https://vk.com/images/stickers/1933/512.png)): - ![Battery Widget](./bat-wid-3.png) - -Note that widget uses the Arc icon theme, so it should be [installed](https://github.com/horst3180/arc-icon-theme#installation) first under **/usr/share/icons/Arc/** folder. - -## Customization - -It is possible to customize widget by providing a table with all or some of the following config parameters: - -| Name | Default | Description | -|---|---|---| -| `font` | Play 8 | Fond | -| `path_to_icons` | `/usr/share/icons/Arc/status/symbolic/` | Path to the folder with icons* | -| `show_current_level`| false | Show current charge level | -| `margin_right`|0| The right margin of the widget| -| `margin_left`|0| The left margin of the widget| -| `display_notification` | `false` | Display a notification on mouseover | -| `notification_position` | `top_right` | The notification position | -| `timeout` | 10 | How often in seconds the widget refreshes | -| `warning_msg_title` | _Huston, we have a problem_ | Title of the warning popup | -| `warning_msg_text` | _Battery is dying_ | Text of the warning popup | -| `warning_msg_position` | `bottom_right` | Position of the warning popup | -| `warning_msg_icon` | ~/.config/awesome/awesome-wm-widgets/battery-widget/spaceman.jpg | Icon of the warning popup | -| `enable_battery_warning` | `true` | Display low battery warning | - -*Note: the widget expects following icons to be present in the folder: - - - battery-caution-charging-symbolic.svg - - battery-empty-charging-symbolic.svg - - battery-full-charged-symbolic.svg - - battery-full-symbolic.svg - - battery-good-symbolic.svg - - battery-low-symbolic.svg - - battery-caution-symbolic.svg - - battery-empty-symbolic.svg - - battery-full-charging-symbolic.svg - - battery-good-charging-symbolic.svg - - battery-low-charging-symbolic.svg - - battery-missing-symbolic.svg - -## Installation - -This widget reads the output of acpi tool. - -- install `acpi` and check the output: - -```bash -$ sudo apt-get install acpi -$ acpi -Battery 0: Discharging, 66%, 02:34:06 remaining -``` - -```lua -local battery_widget = require("awesome-wm-widgets.battery-widget.battery") - -... -s.mytasklist, -- Middle widget - { -- Right widgets - layout = wibox.layout.fixed.horizontal, - ... - battery_widget(), - ... -``` diff --git a/.config/awesome/widgets/battery/bat-wid-1.png b/.config/awesome/widgets/battery/bat-wid-1.png deleted file mode 100644 index 00e1618043b24e0449c2b2bd8e8381be053da1df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 700 zcmV;t0z>_YP)B<>O?fICAkZ>}H zq$St89TwvHcK_baj+9a<{r%+R=dW|E)HIkXrOF98^PijQCEGTyY(9GUz_IN=B@cq& z%hzxI#49NR|Tr=;{8$FVF~5UwKqdOg$Zpoz4}kt;d^wRGHE zpD0+65Ebo*u{HPH&<`pqJLPNX9kF{SY#e4^1B6ccD`UdKKSr) zaz3iU?z!%h!DBWD0+vV*kB&UgLs>4tczp1Fft>NhVRUwQTyvIQulIB?sQUHO@G~)U zs$rrnfIPCG|GP3itG#w(_x@U^vl>v|v%Hr}$QfV9b@yI8-{^0x$d`0u`bit4XDa@y_wcHfdEBO;Dt@8TkgBHOm7!Bh$vD% diff --git a/.config/awesome/widgets/battery/bat-wid-2.png b/.config/awesome/widgets/battery/bat-wid-2.png deleted file mode 100644 index ae20af2d525a19a8da631dd080d9bd42415a849c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18854 zcmXt=Wmp?s8?A$sVlD1a+#QO$YjJm%2B%nYcZxfqNT3vVm*N_%1c#!5V#OU!-tV0A zBbm(Px@I!6A6e_(iPcb3c!y4k4gdh&DJjZo!I!_`FDq0;_kPoWU1uSGzAhmL9eMZ3nL}Uu-?B!)DL`04jiztdx%L%5k?(7lpnTXAgA6 ze?Q$A%xda2_H(JfZCtlSwch>LAO*Q{pCp$U8fS#L+eIHTm(riCTmR6vf{`CD5C`$e z){;$Z4P6>+_*5F4_$rT-TMInx?9RG3D1mm6eD8R+=-c}z(VmvGc36G|u=c@pGqMrJ zPFKu@E;j80K>z?`ykr0X$jcs|lW%~z#XVN*%9KN=?YM@QbSx!p(-LJBHE z^0E*tCWeBSiv|}5QP|G=Js=qsCnu-C8XzrOEG@n{yWAf9DlRu}u;U*@92tj?)G9bl z=!0NsQaHVldbPm~z+tH6EtG1P2nh*^0kCCFC&XOHO^U|Zyo~|u&2$sG&kU2A@1<)& zNo79=rTkk>5wpwc{&z(}7f)wOc8>A+Iz5+?Wbe>@pC<(&q`En_siBdnmzs)~s#p}) z-t+-=FNJ#|Tv`?6fQ>wxLJRFM;h>aD;f{)FyFMArgiY_@Dg!3jSk!#jr87?x(y%^P z7kEO1f$VNwO{p0S(n+Hvno)P8&iFkHTiT_n_y~w8+k`4;TdmD}M5HteS9mUim(w-( zxwiSs(N9B{fwPtnAryH@xwx3B=5r&-;mJ6Q<%Z(7n3GVUk^G6hCMf7E{=Gb4#Kq(` zXC!!$I61U(G5&lT0WkbP8)d0TI#JLLj8} zi664cl$!v2hYH}WgZbSDn0@d7da9Y53ZS5=sHj-lM2KNi%?HKi z=kA0E(IHNXFWgx$#Gywb;$}?Pf@4UExpa&QemwFvZW0>_h2Pkp&!Nhf)Ao zXsVmFewr}1&NKu_r>EMDC_92jvoq~(BM!L-1H}0yt)Ha#?WmEMs#jLy6hAuuO_#$U zVgXlq8MivGw!VfmdbfRas&?iG9DP^g^xO*|uXUnBu>&Gl7lg(QCQ;Kc?2AEt>P-nNS^A=}|xNOg^U7Suo#cVy!W zqus62H?BNT+#=6}m?@;B9bwfXjnO@iktB+=EaeJm@m{yBuz~1r$E&^5#3J5}c`vTp z5wWlWe>Lht*8oJY)?r0?;fcuCrakRyEH*&y2=#X>%2DBc1FK~0*=)sQP9#D5oKV!* zbUua!)@^wjDw@yJtXV3`%Bc zFB4IQqd=b7H>0uFj7mvOBVu1oFP!qZ)_{qv`%hS_X#<;HozbltXl;I8n+czgEqil$ znU6sm#3rvMjRgLYJniZ2dH#wK83skSQYb$yf2gWEulM+xf7d9bQ9n$TQr@f;N0Ja5 zMny%3!Ve|2uJSt0_dL$Oj*raief}hw9?h|$)g_PIG)zf(xSZQ`|}foK@$%iM3~?(p#N?H`HWc=IZ@Z~wH-s!y<4 zeb7{}#?$QwoZVfG+`4Qu+!rYj1CnbV$DRG5t^qeS=3Jel7X*c`$Iub|?uUMq>Sm}g z`T!SZf#(l=YGGJaGw81DB0DXA!oTnbEowcyiX79(;WPOPn0$FmYm0h=25iCU`=`SBV>+_pS;uR)iW#R6A0KIJ8H-v>Z$#Q;B$3BbDe@+>gp9qci~w*af8oqP-`K-JS$ z@B3p3;tBdb%E&JFVv+iqvT%^ za1@y(&RDBs@c|-7ReYgZV+CWV<~Nc0qj_~K*!HH6BC8++-Q&|55lQ>AUDns#OV*yp zaN64AD*uUjGZsI9+u!XWSJM_u91#%_pOcj-%s3r*m^eAnEhTLnJ_KR)HtYz_ag+Ot zOuo}J{BIY%clQLF70ZnQo@Y^0<)&WkSra)_*+Cb@Ss-7JtvL)~fB$c%>jKxia?xfR zmMjQV96j3&kPS27JHL$%^Yz}>y%VCRjmL|V6HPEKX4c;le`*yr^J*ggS_vpT3NN)O@&ttn@dzL0(SK$5AoT=;Ssp*diwMB{ASC*w)OEc0 zzSd>wBm5dpZ(PSGjir^b87;N?oc$JH5AYh02V`?u8%=k$V+9-qQ~k+@XYKpcctE{# ze}w<*gKLb=>L40?TZxgXQj-7HS@$#vtw-HcaFA>NBuO{M{`#$caCpQeM9hA6h)Dc0 ztq`HlQ=+$XZSz}c&EwxfXXEA$*IST@I8mhLaW0PZ0*n!`bi1u5IojO%&D{(17>9auR*z3|jV166 zrc)9HNB6(dxeh`9AWNtTj~-nS_xKzDTbBhZ@azoWyM1h!6||4XDRHe@RC4)yg46#X zczyZGN)@}O!%|zj5ttz4UDey!sbc1`)Z{os`z`+^vo*p}rvh2lCShvNLkipGC;rsU zn(|#oCujTJw%*yx$hTm0M9has*=mE=iyy4# z?qEloh&^Cy@s_vIoQ<$knDgNv8e8(Q{ntRW5)haG1wn;bvhs|s%7dRzWwPE|{i<(-f~D#`RU@tsl|G2Q35{u-7ChN) z<>0lvo4GyxvV5iI5l!5u(=SHGk7!X}dBm=7(y}cg@k0pPE-?3D*Q#WBVLi>`Qk`Cc z=ybEX>9dF<0zk0j``_dyu1;{t2;Hohx}a4T^~1!y9O@AN)%adj0KK3;ECN5_4B4i^&>EB)Q`{FunSWZ|u_bh*Uy(k$*a z{7U9Gt>Aq;2Wmao26KvE5CbCi#%H_z)qDTO!EY9KoplmR#&(2D#>BEmEOvMPS+RyA zJIlB$5NM=~7AA>vFC>9UyHizx?2N~dTuzOSAog`m5|l&2QuW%zrw!a8vsOam@UC(*j2VsKY$7o`02pB93!6^uO&EC5-|vEqKjFOSElwN(ioDyOlBuny`qy4E_vA zeV0`1a0?PEprFt$zd2oQd|axxp5(~rz6!|^I};TDG(5$_!sOqx7yb$9y-;{}o_W3} zl;mwo4_(i~#+0#I@865^V2`X_l1K0EhYRiLo=YqV3SC5|`zD52o!qIWYdU*SyxC;{i+XHtdqK zI_T?WQh}DPd>^g9*?PCjfNkNkjsb`N{aOp79@aI5qY-;Pm-W}x2(*gbSV5ZYz2K|m zE6$1D%jcKwNAFtW;ANONLFTxbc&qbXnoOVqJX>*g?1ek_r7XN*u6y&@Y9M8BfP6#X z-zaAcld!j-XjiSrKi!IhI$)~N$nqs2eApazQzG&s@Wa1g6X4M3g(-7nWzBm-Qna+V5-xu^;wKZ5 z0st1XLn;Fvej|;*VWWmgs3_pgsm3)*WAL<&5Nb+j!A{e@I2YINKaNZ~$RWpU_G=Gi zq@O(b5|bpuPPUt{r_iuVB4dP@F&HS5UfrR47ec^-=6dIhhz{=kgIVha8S*@m3{DS^ z2TSa$>+4VXg7xPEfq{Wi*i2fH(w1%x$%;ZieCCPF&p>Fl5=94c5aV~^6n1NN9HEg5 z06^nKI)-~G(h!FkoU?2sqo}KbAO8mF`=h1G!HYk_kq}K{XTYI>}v#uC61U5rM`XEE}*l%P0PDRBeVFo{$xVTyLP46L3G8!^EXi5n{ zeL=3(UQm{5>t3@z7}>)G%T`BsY`BfurKNPS?z+Qcy4WeclUhfOP{E^Y!wXMk$Iy{X zcw?FlT`{Um7hdr><|{HHCBLDQTfw{%mcJZ724pKz(=_r9>+tUE$d!TB$PsyT!Yp7l zDOLh7Vzk8i?|nwB^?H>ujME=OFNUYBBcug!Qn=-r!Rai!7%8z%CY7I{4rRWS5k*X7 zQvFQySn90B@@!e6*0SlfOmdnwveZNJbN@3ah+A}|p&xMUh+tLvdcG{2Qu z!7=I3aboKPg5=0K7TDtn1x25z;K$#Hk{>@3tlYy|yy|!F;Su6q_=D>_B zN~}i@Csgk@C^jMAZ#%Cc1Z$V$9OzQ>J@Z?>LL!U&9QLGBbu)wo9Iz?VzcammZlF#V znKqcjfRhwaUAxSk#Ib6T=#}*50+_&@F=0uJj@!5#%fssndJ9P59wt4?Kl7udlBdPv z_JmB6Sobqs1yH8sleLEZA|&f1j!95r*2g|>4*=og6blkSg?<^40ZAm8X$VA`Q@CXY zWWvLdpoW{b<|Y5O4plfp1zH4JHizY1*TUeRBF+*|-fj6?`&&QOuH@29zW#)azr+GIzSaExi{3duFDp2^fLjkpUsPOpNiTqLeQtTg_UDJAPK^wc zJ*ho!`M45`66?t}QGPnNnfe5ck^-Q@pwxMFvPujqq-6B2XK{JDgPr!+_SesAXCsp4gocN z5@Mw0!cl&CgR^%w$DSd+$?z>MuSK?;4>3wRE2;SYyLhM}En_oJf3?l9p#rFduvssL zZj3rKuXVgFkXk0mY_WdNpogQ^bXhe;N z0#KFC0Pt30nW)D7NHQMZ#=(%ofWl?zfSsYI?5NI*WPIci1Tomr`XkOuHC$1jjWtLu z1J~&iXN`c>`6{y5^@I!k)?bYbR;$Is{z;`F3n!@%Dl)e(Dl>y)a#GO`1^pC^2pLK5 zb>*wnsT9}w8|0D3wli-=7QJ|f9ja4l8U}p38?;traj03;MMef>WMY0OQd8G?VM2vs zl<@M?hmC6?$Yu(%33HcBEZR8SZp0`M_o8IZU5unzp;cl{!Uu9GbMk;CO_v!dDv90Zdb|3R`U(3#bzUI>wTo(xw`*Z2*Y>f7mh{} zd8^eg-2@d5TA!-HpHJXJ{efR^eUwk*!6s?|6~IUKefeKi2UHS{Y`E?*!6*V_tFo?88enHTl zdc-E;-H%e5;o^G6lo3_Jgm^+-47-nuL8#&@W&(eWFHKSGKuFh{RCCy=^3>X;`0$|x z;s+{^K_naf?8QxkaRh{j{@fF)5v61(xXb>)&;Ph~H8M|{y)0y%(9G|xp}^G0zd7|| zU)+qqk@7`R4Ov-TfL_;}s&vu(pkfIM-Pn+qg%W!wDE5W5;jHnZo=f#V(45F{WJ*hG zee@vE6@P=KL`K6@o!{K|$Iq3s#A4q^;B{7nZ(hFAoG{1mdEx@)?J@$S`pLvHsNXioIhya^S&sabu?A2?Bv-Jr}g z=dN0WXvKoab}*Y;x-i3m@0#JuBw0XZ*~xms^8ocE2UE-|E4yFsN=p+IBV;jki8PpP zt4Nk%cue?+h~YE@$d=eB!=%=#8ffXb!pgrvnI%9lxo4Pe(zG^P4>wc@=4Yn57sXV* zE7&rd5-X}MV(&Z$Prw;I%k>5}c_9bb+MVHvDvATdVXB9FYU^cl^)J`AVs)4IUe%|= z`MlEy*`ki~anS|!0ItU>USS6Hm8K`lIzm)l4mwX7YQ>6HqsFKcKArHJF49O+|hfBk6qC&?31-fVM6>OIjnddy`ehmM=cE;|Xs z7?v&m#H2<(Y?P0x=_rejN{I8hI<_taDba{*`JrulX(LemWi_~}`*EWs7LSm<(>Fpy z{IP0&^9kaUtcOcDC3JbEy?OtB4jns(0;7S^1^v@waUKhylUnLf@&yvNXMiAB{-2Ot zA-pL+>q>7@({WkbBsKiO$32Xm;v&zVHE>=(bv=q8eb?#F1YP9{0FTA}Fl4ZlfbO}00IjJn{d1&Em z`E-C1Le>-X2;l=VPKha*ZQLcU`qUUc?tTjj7(O%MgH6tRIy?WG`Pae-T6>x)NrQo| zZq$RH783IqA-V1L&rwNAX=Oc*Tiu&aH-EMUVBKe8j0J)FwP$zGnG|u!gX|^GQ-9Y3 z5Vz?gh|lgh5R1d8rOCM;8PK*x)_P{r=sh)k+SBk=87WUsv?K6(UjNlFKzT9vWI_bw z{{q&nDuFd{rYlPlw~e-wok@5nOzgON!s|b@wQd8g+~dm z3CdeSXcZxco19bKs5~@F50ac(Jhn-vL0EX`DMYlO4^MQ@6hsjgwk9#qWalBS#9^Rr z7j&PRWUI=lr=)BoD%Q}%qhZ1K77{{brcWS|(s0CFGA=VBCBZD`FuDWvzH~hG1YYw3 zEW-Y5oxKL?R4`R%1s==5Rk-_`1@+hc*GI^kvtGaP{x`iZ!{+)?(MpvVo3EYPghQP6 zUH9o}obA3l;jCsx&sRBTJ%5`jIW}7^lpKKvAaUpUi|9x1lT-L`feWN+B72|0zfpo3 z+=loA~HY&Z9F3`{X!8Ko4ZY%lr|n~z&s*F?_k0}YNYUQVUh$9 zK)&1#oZ>vy1o>>7_1KTSTRdLvTAqM$KKy&T!k`AQ(^7VltpL#Q7r}>rZJ9S`GNZh+C+_>orS^F-7QF~W<8IUK26uE zqXes*52J5kg~1T`Fb}O9%gS*TYA*4)pq02Ac{XnCdDf;pE0Ev>a%ihFebR~}=epcr zUk!496jHx;Cpu%j{TDdG{!Zjj6TW2dDGH*XH zi0rUay1=oc{Qda-KIultKA->f$BZxZ55QokEQwLyiq2!5iLV*oaBB%M<{+BuOTxfEv)u(L~AX!uW4$V`#XK+TS z-G2MZ@s~!$+$N`gjbr4Gl1ryMM|yH8?3kZv$jLWNdgG)RjK07*{oN`)sDU*tUZf?q zTuP~FtRm~)Qick6Yb%vo9yf^n8Drld9lJVX*bHh!UDU`QM|0%V{}YGkflfDCNhQlu zPXI_cPwU`8*RPtUb$jIq3;tsVR6RVXPwe$$V#~O3{_4KbuEKHuY&?z>o}6=DcYUr4 zH-1cRX0f_2j&tpU0v4eoh53R&Xv4R_gADsc(aZTl=b*cKA$w5J5ap|sP6g&IMWEMC zd?NqR468`=V^Yhf{JNuiFSK%21WARnUC&K_nHmF|{g>yr{I$L!wXC}Tp9P4>X%)X2 z95m$pFUpC4OdGxSe)_>U{EkK>w8ZEEYU+p9lpAo#$o}<`=#k$w#~-o`*IC&aKFJ&( zoJ^hi?Oa65sh~9=8+$^V?iYxw5#~2H1(_Tstrnw6=#Pm>Molj8+EacLj_gM-$s@}ughS^Ix$I(! z+YTH?{_W^PkxFA-m8c521v>{>SbT4+OiS+P!tCdwKK8+6E6br~Xh4Y}J4YKO-C0_w z=wNs!8(lW3m8T#7Z_JAp+$QFf?>O63o1$P;a-Cf(j0|$hdU}cWhfO~Y>Gu%oBL3iC z&?9rIY{IEGl9#?H`mmbIJ%SC%hxRUW>Fdw-FpTjTY z72g0&%k|7Nhr$krty3asp0a_69qN&fI8@_H{@9j>AuBwDM}F!z964{R!r^h5Oax&R z<0EKO|Da#WO2sU*@#Vo%q>+_XQA}{M%EjRJpX`f}ott$?^?Mg{ycDV;IERozZ=2~2 zp;a>P*uB?i0LO7tJ1QzgSEh-OBRL|1Ye9v8iONa2Y7_47(M$>drK}e-U5JW- zLaYa!7#6>xy;FNj89kr+c{U9qju-1)V<@oiN>!+lAX$`bKaylUN{NfhQXfUDQ@+>Z zR(!t=gPHV0Ck%zN60}2NQE+^eReHNUlN5bT1u|MNwR%&lquj zc#?^(DoIyndcLPHzQ0bZLh(c`4r1j@Mk@!)kHy4AKcJ4Ik^HSZvY={#Z1{GNnaGRx z^yBorHRO^nqg&q15jY-&QhLO+OGBcE2?$~TCfWlROocAh2%8P^e)rci^_(+AM@OqT z4_Wyei->S!s7TREN~`;iP>+luw^v!(DgT}DYJC&i&xG4lfzkl+;Q1+8^Sj>qtt=fn z&%QQoh8nq+tfO=audJ*Gi|nqS(RbTENp!T?I_;{@%ZOZ`^h8DuLQp9h8~MG_(<~`a z6Vj2bz3_oK=BQ&A=jfE4I|KdurCryGH9DHxKRRkHJGNY%S@F@K%fCXU#zyai3Q6SY zVn+4y=6k=V3o7~YhaiMt=Y-;;aRT(TACxrSSx_JmgVTMzhKWxOk&i-Uvo8auZ$sO4 zI8+uR`x54J!m$|*8$RI!CZ*`zAaW^N$YcF+%~0HY{@q0b<~J5^PQIan&Jez1GHass z<~4IrSkrx?P849|LBSabwQ(Uu)SvypcVQ|ctW}cjOCCV<>01u&_2QHGi_W0pyk+VX z=dSC^4TYjkMS5aAZdIJfQ1x=h=S=$>t$Aj{dUb=q=wvP2j=#z>ZV={bG4@@c-i%0+ zDZV@dPnhmy;O3)c=QWX&*Xj(BE*=e6k>T}81=>L43(*N**d}6?V+B~rOwNHvnPWfnjX69$` zy`~Nt+0JTX&1=CA6T{%m@Qc>Q+Fk~hEc3S8U-hwX`2&kl-5wV7)j$FQ=qzxL4KDRx zW3i2Vl|uvk+vt6HnAxI5%tMN(X4UV$xbh654t`$jdD`I&h%F%V?@O83+lkQSXQC9E zN)`SJ2oi^X+xwKpxrUN2e#Zh)0a5Fh+-7gb+1AzC(p-pb3ImH3nRVIl#Wt~6GDfpU ziHDB;Ky#((Jes@Yw89DH{W#W>T$2}okUt~nHU?|`U16d_6~qhl?h@*WYo6*KB-aK$F?+9pH_n9Ute+tn^OPHe?66W z4fYnjG&wZrrOQn4L^QyiS;c#Oq7@pm@>$$_J@JH>Qzx6Pa8W)0!^E?5Q#n81GdpLR zaQ-9MT_$WabP2<{g0l22m(;%_k)9!llDz(JVr9n(_~XfxFc_nSQm&X9bJP4sm==#9 z-r16vFka4%lw3NA^)wo*;0zl1$)s60{%^4Dxj8ugdWk zaM@`2ThUn4-O=d7BLdsIJPPs(etmgfe7fa4G3zbze`xw)vV8xva#9IGjF=F=t$2r3 zv()MrFM5~+iv2ZH$ACCkhl@NgaDU2?I!nL#{A(-ANAaf1CC2&C;I+Q{v9tUWh4|Mi z)8K~@iTi%%p&AJNS-bd8WG&R-l75MWKkoMi!C&`TUv3`l&HTOWU2FL?b!x6AL0-4|XEXQt z|g;T8(LQ~ zuW9gZ5&<&Td<)RRT0pT#Z{OdXtzrSbZQOrrz=!l~<-+TFzXyq+ulrtSN#hyUw-TrT zPO*BUs()}ah6=A6j%2uPnm@k-OiH}2$xUR!&GgRnv+75<|N0X8239C?*(Bf^d{JRy z?Eko{^tPotT~#%SNNP<1?=nkdI%l=^Jj3mF*ES$mS5tE7$ABP9*pf=4+lcZImK-se=dyQLf8F+ z!NGO*HI9`5zYBy-Ykhts7=Is44fHaY{=2orGROe|rUv>(2DMzy# zO^oZ|e9+j4D*^!Sn12u@A3%N^4X{|mAcM5+o0@S*c+G|d=9%H6endLJr-`E)$bx4O zC*tl7_r{Pv1)dRHEYhBv`_+xp!aH%CPt-IY)-V5Rzn&KcQFD52J%l+`AjfF7SBYZb zG{HFA4~01k-|p8qYWs*&BE4rpl9@av!qCK~TZ&hn*Cp3ui8-Jt5uLv6lD1dCM=l1J zz6aUv4r;e=I}_i7)Dz z;~})C&!92Bp2Z3EQh6oOu5Ek4k9v5BGc}zjD$GAS_Pv4x+l;`U@#`NoqKKFjhyGV* zLD{F%tU4q6QQ)~>S!SS~yIsffF2~!BYhBU&FI{nq^q;xTt@9gWjF{!HwS_-|B)zvX z-=ciD-`G^ic{ObfwA`K~vHp1oPz$~si%d$24*rJ~$K8=P-2uiC?H_yp?Y-by-E|-9_e#MbMn(V+>fMvT@{>%vsgZtHueG&n| zTfEnM-?3ax*bxG6dBEo}o;4r2vRPY%Lb&1peVl|dOOVr3Lsuc)`<{L4shgtkaaw~a@!H?eWOUhX4|8r8}OZmr)` zYw65wrcchNeJSIG3fkM=P*MvYRe33E)@vO9{rj0M{wM_ll#M2s32!m^c@*Iy#$n-_ zE(y7j@76u6=XUsq)?p4W@HNvJQ0M;~b?MS`m|8)(+!!=}!>B(o(W-Vo3VKIo9&~Z2 z4+=VMka+r{gQi%?{;g)MF-XRH;dH(3KA)_16^_o3MOL%{tD~?eRxbM=d|sqPJ9ab5 zLGIv-2Y!ihe6yR^a2&%YSfl-cdI+1C_*o9p8_B7-c8Td_GF*UDQ&Zw70cIc?A{sV?os z)bX@zR5@V4YO#}dnD4_rvJ$(C^v#337-tY_Z(QTS+83j5meQe4f=bN*)okvQ?QcN` zpxPi_|M042Xl_6cm4`MPA*<97F{@H$&EY&eJj&cY4G9pL23Tsa^j;j3{(465Q@Uu? zBvwi*h8=RD7I?M?KuF1yKw!0thLg}8E%zMQl!m}=aqM(-EFP7(Io!j+j~f^mkis?q zM$DOs>LaH!_<3IV?JqyheU1D;KyPgSQkl4tj~PlUU8J2_MPM7#_p=lwyAL znV_TWQ=r$p9YCYB%CnzwdNTD(vbZQ7iM=Tpcd&X8LR}=E@iPanA*Hk;8%~``Ps58# zB+0|*Df{=$GNX;H|9@ENcJV=)~qnCCf;HfeDuH=VlsOAgsW91s;~{tV5O!j`Fo-lYOE2 z(zYq>LRhZ{ChXP%tccR7v8qr(tWt?r3_|DkcE+0hZy=B{djSkB*1qNgVih(0sV68NPKBU zK7Rf^kW@hYZ-hz%bql5yLf~*si{OjhlvYXXVe-rb> zL=)Ldn<(vIM381RWP*#IOJCo zQhp=&TofByWesB+c7Des4z8DHO^mQW(7*@e;VoegvfEq@W=xSPQjxZw3i6`=*o)vz zr($wJag!deOy5oqW(<9+c;vg2G|Uo^6?B>w33=~WE_gMb1Ur3r!wd2{SrGHIiw0}; zlvuxJR&%aBN-qAcus6Fr-6~O7Wl%GCK9gX+#mWyH;CtKJ+Wx&-WnY7*^mC<*cAs_ZrnJ}F&3!ywSiX`mC-diT>(Lx`|M;NOw1aWG)O7y zS2Es&glvC+%N(B4MjrAJ_d^!dN4+3`$$mHYf2 z5KCzGWs9@-B5{1iVq{k-EBM6|ep&k9Qvu$0H3h<@^y$FqYq3WA56kWLb4s3|$K~~$ zJVU%>Z?(e$e~4jk*E1RF0l?)hUSjiRS3Bb+^st;w_%he$KTG1Y-98@deV#}y>w97T z(n{wf@|CgoNL{=ajyx(K&DV52)o=z586E9;E(Tstw~D_+Bo^nYOx>%vbh#|95H&>i zJl=>b3C%sMth)Y>CRVB%KTfu~p<-Msp8P}3k{a}$dNSVinYc~ASovS2NYBF0793qG zd{tI;jJ(eHfbA=%;lRmM?iTDbE>yhmhKHC#n zg@HO{17d16l=K77d#mqGv67CL#?Yp11O+i;gtHcVh~5-6qX0^j|5Qy8#0$gBuZN~< z?;u$3yBm-Ike*YY7P0!DOX~&X9dHpg)6R}e4xYYxDm{OkIV8Y4|8)1r%~|jHk@<4V#h8h|@#1ghz)l~L2{Xu9F25Jt9)g3W zcmNZRBZZ%m*}*TZ7xkf)uUFrKpGM3tJlc&yEYa;0`0F_)~V)cZ;U8 zO{%k&W*@a2_{L`VMq-)*pUcE%rfiX<=?{!AB#1WTH?u2Jc?>zW<8@V2Ux=W>6sr+! zYDh52oj9s_1j4(Eo z@$gpf<)8WEEoH)vGBO~$aaR>DLbE*~LKw!n>64-a$kq5jY;dps3hjLj@$`m}l>0~a zPpFIe|J}=ik_*R6C!E;@NdMPfJW93)TWnY5XcIz+u*dr`rv2v|!0NBN9Dt>}KXDem zzWtMjuCKqVB|1-7Cq-}98e!&c8=!Z20D}-NK-+E<(5}nxT%}TPBw7X#a(&DBjV0sM zQG4_2k%C#kUH#7?;Kk_icZ@USC-GlccqUS)|uq@yp0@Lcf-TnFj9W62M4gnIN>FD0OZr+iSNxlJaiD6 zKeU){1V!@>Prz#L$FpvnHh2PdN5_L7QjiJDyN}|W;o8Z4Lu>1`DqV4wo0k?n2bluLxMsS*32xt?TJ*qfm^w>@>V3vny zNlGojfEuzK0SDBZ&e@;Ar>4EhuE>y41tsPpjaUp0ZkWu3O{eF3vD75&5psboM5bw8 zO&e7>l{rNY+6S$eJ=uqMj z^d7(>^?iA)6V;+XHIRYEM%;`M_h_yx#EH zyj&nF4UUL{GJHRN-~B{X5=NNu`#qM0ZUW3R3(x$JLzLaEBSIV!l^V2uuiYz`Bb6Ey z=bHaK%Viouug{vc57!%+bPpjBsHRSw1L8&%ai>^EClIpZC{2-S8+65=`_jHSUzS&? zdh^RIt?IpiH8N%8zwYPx*3X;Pc6)wDly~m{X*4^K4&IBH)?Gcp z{c~>gF#HS8wbc|;|0rVwdo4l#6_W5luKrR+B4h%VxagAiW;tFuyQet&iO9#gvheQ{*hzR#Z5&C~clchxoeViS4{dFe)SwWidBBDlq z6~4qBJz%h&Sc@Zo9dtR>zjR4)@XskhQ=^3di3hL_#F_ zo`_O)jmT zmMoQw@7sPsX`cQRaGMx0e@w@nK0iY6K(TM58dicjHzqidB(~WKeg7Wwv$_hEsq*NMG;7|H_)4Y~$fr(co;Lj=nAn*0{ej{oM?{CwoNnoaR zwt}xB#IRZnmhYv<%>EvI*qT2i$Fn_5>!%KB3v@ia5RWE6iukLM@lih)og70PTwwD5 zu=@3V^iH@hHUA$BV!)qSkziD`I;Pd6%H|rK@gA6vo#m(`U5Kv^B|y1bW!OnkmgdWh zCBAe*luyhblc!@X)Uq##L$%mxxKRmZMTEC_6pi2ig8db_NHR?!x2r30(dt$Ez@P34 z&Oa(hz`Euoli!!*4SuCQ?Xry_m0|T~CDl!%`rQ(mE zMXC!7*?kN}8cgve-uLjcdp|I9+r4zD;_h-@C$qc5J~T#NMHd)eI%-H1RRr^^rbx@q z2}R%{siv*_{t%7&>f^L_4BCm=rwt|j&2^(Rl9&*mkunzZ1<}z#1>WwM*o_zgsgpEH z^8?p4*xAFtzbCM<7~{&fzYY^4&lqX<4`>x6O^nF&q)+T&_ZhM}U}@U*oHgsA`UWf13v z1dA79mBfT9G3Sud+8tb*gL3e_<>7Ny`?&xi`DZFhw=Xma>jfH>mEd{V*A2f5eCD(L8w^k`U;L|nC|$zo!P>?B(ITx z{&tcq;WY8@!-eNA0|PQVI^ozET0Lj1;DqK^g0HnXD*Z{#dVS;(MSl`dP*7}7KiIrG zJ!e6gzKyt*23BVf+I_6OPCiCfiaY$SbsjIe=~@c?J=tqYIGo9B@qv9guZC0hO3WPS zT!l8EI8&e)!S9mU2m$?wmDpA*!uOUtp?+EXgaf&viFyCqC~uUmo*fRc$rsTKImUP5 zx8ZyvdW{}7vU~ey=qRW1mz(xbRueQHsD^kApCge&ovmcoWw*7{@%~a%Vxu2csgiik zbYE9$Zs0pJHhm9*Y2%~6fI^)`VfuD8GqJ{2?$05pXapj5HY9J|ws$e|^n;A}UgR`; zG$dJ_yNn!7D|FInaGh zyZ03SMsF<*3KkG1F*_VqjcfotCt zK;;F^?(U|4Ig}AXaC&a`g}sq~W3z%&iwb1XJk_`PEmT8Kwp}{x9G%F8ggAvZ0yto) zUkflR=@X(gCw?>u*6z0%oh$uRn&YYxQ(y6mNe=ylKh)RbYhlE57dwys7K}8GptVo5 zC_O)+^CsDnZmy1IL_N--v;5yvQ13i@87 z^S7S5eLw139%HmNm%|MOdF=W@#6dJyoE70`8sOB-j0QFe15e3Onh|6RN7NALwDyrh zfHWc|sj3-L-)wb^ogzDwbo4Z_=TWaQBV0Dk+|r!K#FC*L22mfg*e<%{r{GSWId1x$ zTB2Vn=opUM?2w=;Dd zLm+V9uzZ2yY_IG=9;FX#$*zBo$`dkUhXy;p_u!I$rWT9mam+@jZnkld9Wc)WY-@sY zX>cn)=-21l+UXb>{ht6#2($O_W2Cr@QXz82jN6g-JZZp@n;1o*b53a$&r=qn6XwKm zXQ*jVttGV>hr$IJvm3MJ3Cx{Am?vAMmV%&SA|pvncFsCWj+|ow{7Lm37?6;N>I|u% z*I9CegaDA0H+|^P!TJMsE@;BxjaByQYcHB5SO)D zH=mOe_fBi+`O3=M_~vjlj+;6`iVVhUKa4S2dvWq9$*{;DM-3GlUo_pnQaTQ6Vu~OH z0N?l1Ig1=~1c6f8jx*a5$*>Kr#dxtIX0X;VuyqbyLh+PD4C60}wCqRb)K{wxfgT~B z>QWyXF`hT>;tFzgtc|#s!d;oN^I)8nKt@RKPtI=_X+}gnW>KgiB*3cv;D)Z_5i1#>Yi*5X$Ee89<*YH(%v@I853S>weS}J=NP)3hFXj|` zA}?$B-7@FN?AqGehsTm+Zp_+qm5U|r*5s_<*JeIP)Q4l7h%ve8U=9VQn;M^Gh~2i_A^}H^J((N_#dH zdLGRWkoEx`aHS`!lwR5LhLixv+Xj;By zFp^4{A+=HrV6BmyzYO;>CPF~%X+pAKhlj_AYT+h9YOO>eXUbgFipglL3uAMfUtf~z zhB94qUndMh&-24DBqZPWE0v1xTt1f_5JiIY@k3Q(=@Dz7VH7DMOeWEX zK|EK|S_?KN*RhU)og?QWr$~`jLXSeE6p?@@#(S5ChK7ic*@?tBYbi#aWA@qN=+=sn zNF!QjBV&|OIX@@Sv9*>E3x$F;))>RoJPOdGibL~$9Ihn}=hO{J_-y!iWUoHKgYbIK z|7+zUm?$db^TVZ*=Xpx0AP5Tid?g6n(W8*UfTeT?aSM;kt_4CxWUN6TYMnpRS_PGW zWSllI60(Crp^(e@rBXQz;`!Dj!LU;7qI9?;A_)`z@l}Zm#NRAme(^;Y^-h_xfB$}Fo;GdTU3cAe;e{7Yn>Ov(v14HnSm#!)T6NWxR~CxJ zqeqWE^w2{$-E`C5y?eVlI{}~)1W_2uXD+<(!tSoF{(*t6&dy`~{Qz*_z=7@Cx1WFB zdHF(N_SF3^Zav!3;R8Sz+Ay-t@iS`{XK1_)2S@W7~}hX|FT}+36TNdrqyye zKPs26n@!*I_V>m-A)NE|YSr!aqA0Q`C6rp0CCf5ntkGzMVQ6AJpU?LuuhZ!SLGU5O z(`4ehF6VqUo9UW%+iu&AW7{_8d@vl=YPDqo-xeA&Jw+vV-9hyvTqJs_RC-Tx504|) zs|d**N3WxC?0X(EjPp}0q-epMK*83cejX~FQ`bYn1` z1jvR0KzCA^fc@GQUyGxG@6-fjqzMwB!sMkrs=J{Wi9V#rp!6KZEM|rb=!wM=FZ;B- z8@d&ok?PAzMblb>&>}C2|41cR^XO&*2@=GrJmvLvm;`=8HBc`Tp(D>23lJ{>;^P_1 z1Sq%zt=ypg7kTO=a%&Lnxf=GV6%3t0B9i|bVJDd-=YNTUyQCo!n83KEyIs!FAt7kM zra?apy`hQW*03Q2g@k<6k6;gb(n#c1);f!(;#qN zprD?RID&$pPFj|*H~lqM!UmoCkfKY%CbKRvdX9mJ!BY*QofROv3DyRsrsw|~p^@TY z*I5_r(vVU!q6zD$vJuHR>vu4HdUrpB7$``NM)SkNH|Pjy33ym;#=%iFWZ(A*n9#^1@`W<7x=08tJecFx^m|au@XQ;pRMS4kJ-gU`Em7 z%uEnQjs9Sv0et^i<1AE&YsPpux5V=JlQVO15z;&XfrisZKThW`tn7u+kLVJIseVWv zgGScDZunB@)dUNfHzAL>-eNp@3vq;mFl?frb{L9*FO|C2w^P`w7#BCOu|w}Q#AerB z^-kHh~5%Lt)^B?#ss*w&h#MGz*x))*pUI@fKB^P#! zj;?a29Oy7|GC{|p@VNMfN&zy(&szG##Kc=*L_W_G5PEgYgB@07 zmTG&STs3)2w;+icNP)aZydmpN$2HO`Cle>ca?D6LY4NOL5ik-$8fta^Mgu4rw_=0K z{l^hQHKMAjHuMrOCK!er^nfX3Ec0G$2sCNA^F>9nTEzLeUsF?;@FQWGnXua7q38N4 zP{Z+ri!-HfQIPlH$ei;iNxm)>V*2a%+QIUfSrVbsyI@to08B{mq*vDdJMhyXkeE+b zQ*UShqo|o0>9L7P9>Z(l&_J+Tj!1RNBRBz*8h* zh&I*54ATFd@+EEWPr{!bzqPaBn$Mn{aoV86LP){z^5n@`3h;-j^e{@rw^1=-Ric9_ z5Fxl31LHhxDrCUJV%Tg{KoV8*21sDpIz`z{_JW5}M$LGHEn1T_w+I#q$k> zdgRuyn=vd;5f?^ySRI_0yWZH$93+mh-zIkn3rmh~p1v~S+-~&6Fv-*J=enEspXAKR_K#vD18S$`*8;|!+TctYMBLOMlY-l- z+-8na9_sdn^j~*nPN}l5V1(^c8ZK(s3(|x?Gd5nVfN82|7-{%>h){33%N&gp@u%x% zW*!1cHt|O5rQome5=ANd-(NbZ*|AaZJyByib|`6X_SZk>Ko~vgm4bK4f(i-LlN`oQ&~e0#(a}YB3qNt><@OhCTl% zdjj)J6X;V5>!qLZa{&w|?^C>Dn6&|@FwbiWW;*bI^k>nxZM^SCHt!KbVIyjl!2Z~l_Q0WSJ|WXZ5y zV4IzXOI)>zNv4)uN3f9Tz(CMzqE&cy$hOzDeXU}pE8+)M`Z%hO<4%ar((N**m$#*V z|8`T_a8yd2(59}Vt82-pQa0Jws<*+{nVFfhb?~zg^rt`Qdu8>*Lj&7?US+!2+1o#) zt^XrfjK1nF8>bpasIupD!FMzuF5{Uw5<}(yjZ_*fO z+nP7vO}`6SB1FT5d2Tc7^7qJ6(C=b;vd$nCni4eUtg;>TiP##4%_?axMbW>NAydA| z1!dDPvZ~3^jnl%Kvc;V`AfZ&@#kW*nZ6ab_mINiQ+qUbA6TjnQ8O@E29BI2Dd)y=e zjXi~28rXAK*B~r}7&gBq@iKt;pRL`Cvz6B5?XtMwb16W(uy;6T#%bDsnVc-H*jxX6 z_-SsRV1#cMzq16=>d=4x9Ew>ll~TQvH`yNcN_l`E!}R^LnsUndBv zz{fzOAtD$pkY)i>X#Q%VA3`i{p%zl=r8N^p*u8!>A zO@@r@>FDb_IXGa}(jB;-(9&wJ9=|MZjUuby3%R$~Ufx_+=5@?M2-u|Eu8v-Z_n0f2 zJ}i+9|lakGlOFcGwb?HlamCc0xPS^E5)n*&X*>Db==>hP~Bv z-x1wqDY?t8?L|#fGEh2janbzVun($M2YZeWIe=ti{zT!zp%KyGCVSIOwVxUr3vBv&WtJpZ_{vQx%~brVj%uG`{*#a_7CoC;8%Rl=Ld?+J zwj&nqt~d7&$Kp|wD;LDFsp$Q4?{on<=i+vAob57qPhZ7lTZ0kX@n(%txkF5nw^ny- zmELo{Z+iZILqOd*M{dN&Zi=7}jdj+G4j)BoNRHAf=Inoyf()V|W8;#S$K{WOQXu|q z9CHl-7ZbVXH_N_t4s-38?{(yT`GTwM8OSo!PI<4oR;L>JyIk>e!OxZjrnu+rk<8Cw?!5QhoNk*-OgMUW@lGz+ytyw{nRH}s*8wq z$zMzO4ghZpu)Io&1RGcG+uPk&!eM&iZlO*;h&!(Kb6+_x&U%({@ZRiYs&qIGRo$F_ z)X$c48R@Nb&h^+|s@d;L$J%A^=>`*KAt2L~$~43(pT(WC^-Yq@P_o=6WNLTD$gMS-n-I21~OA{|~( z{hFIm!Yi>=x7fCEyJ4afc|XcS$bfX1x*h@^;0{GNI>s7tmhFBQOi6ige2hFlhhfrt zoYGS4i->D8# z-jW4_LCM@&!t2`FQJTeL`ddL0k{z+GBtWpZpC>k*;2ZWoG39zL)Xf7#8mgHb&|^h7 zs>67Jv)08wueRC(dUPkwUusl88aS(@d8V_sfGb_<)wh)`YyMQX8UHM`FBG`eT;E;% zcZa9wbTZ6u-58XQ8S1D;o z*(|}p1}?!uAOUS5G?E^$^{d4#HxL)YxQHmuy9Z!>){u+~0ezTAPA1g4#h4Ax1O%+` z^x?009(G2cE;%oi!P-uqMo1_@5_pZ(5rAucj&aw0(|JBNrv5_|pZ<)w`gR^Iwgn%x z6#G-Mk8OP6HdW5`wB)L3wUYVGr1gvPPCaCi9#u@h{2M!C71y_UTyWMZ6s#XTa^i2A zznlvY7b0(OuBDx?2mz770Zt|VPP4Vz+8RgPUuoz0qkVzF*%#BM6i#XpB!dIgqbHYS zs*h}6xbxJAyrH#-IK$+T!S1rKNVo4#6?JLlk2l8Zq>`F&0Mn`2xhO{uj|8uUXQ7cG zxS822kFxd(E)?cDpB?ZMx>R*@{Dt*CXRPBPJ~DU-T|&;4@0W2BJxECbmzY=uTo3** ze_Jhgh8eg0?m9EG@7oI@NxJKWEU`<~85f=C%TZwOR7 zCnGM7E88aAf0F`G(Y3THma;@d(vC+HW{xA1>d zEE}w{$=bGMm{>V78gFFXBvi5+<+t4asR;?*TSSOu8OGA+r=jGEDLYMq_e2g+_{rLA|66bAP|jPVVtxqk&-Ay@BD_^>tw` z{tgXLRB^OoX>()U-lqgDpR~&-PgqK+*hS{#oIA}FCW99Re7aBK(r6NPPA?_L1Qr67 z2ubJ0jSRcO3?Srh$hhZKx$@pztXnUYFLW%S$p|mTAb}aoNp5X4G+}+?zP}wzWu8iB zcFGA*A6*1x)e z;UCVPd^zb%ni-cY3z^~A{HgrdcOZTR`0y}Nx4u2&u~lnZ)hFkji<)}ekBnZ8#xWi&C&&hkkx-4VU~PZ{vi2)=uWN>2-POj> zgvp-59yz(L1M*&aMi*Yfl2?XZ)$gw)Vsv9jN~wOw4DWT1#De(G@Nc;XuzI z0=-)Myg{HkGi<4Tmy$39A0DJ9&BPp^-h89BJiJ*=L{!|YtXKxzPubxK=~D2~Z**J~ z;`M~$a72_by#TzT-28TcHS@Vp4-+m)q0<+{FP9-p-j}}Cm`Y7EnE7<-muuj)3&Nl1 z{mwCS0|A!}8$qjbrL7qh=gw{0=$RK|s8~{>$MqVcSzQ0BsY2#qAsOxS*>2W~{j+O4 z`-}`j8OiQ(tC%0+YPhqx4drDssB*xFdQG(Gdo%@tY0)Ohr#lwX-V-_XQm zt~C!Yk{;w%Tn1iuBSy5bg++6$1K>F%L%f6Rj?##bTj~Kf|46Q*&iB zNfWXc#`lgHA22pN5bk?Cwzg#*?{;}TN{cSq*sv8=Ua0-jN+&Xssq8Yccz|EKIJ)lJ z+8hnC*6*fF!Fog{uXTS6+h7$$MMt6c2c1sEzSmy6Fs%I@ne1ksLpM6~_l0Zp?6q~g z-Z&}&{_UJ}Vvf83QsPhvTwHGHe;#g*hcli2Qs+hhQ2*dnXN~7bman@OGa&nJx%%(l z>RP*Pu}9ooy1(y+-ju!A-KT~}IQTj5$Xk#W*5TymYv}%_&LP`%CQKZA96nCL>wKt=A8w}&beaK(|qc&RnD+<@!z?FY1OAo?II=;9i2<2A~~G@GzMLEqI!I@6OMPn#p5i?908{hx|CY6nX|UQKU*7Y z!1csuYhNKFEBG$8nqc`;IHbAileiLZ(AiHKhz@a8n4lojAkZY+PvP*pp?YQ5|EY+cX26!81Pu-q9rFtslGITt-5-1P`v6Gm=~zy(e;SAcj^nO5gCj zqX6(JkJQW^5GgTX$8{Gc$$chw$7jJ@)TT`rwZTCbz}M=Fi-u!+n{HiX{(9nQe1!@x zY%FG~!oPjNNTQm)^znj(?>s!xXIJ{h012O&HXHBo-y`C!K)xb532w5TCGu(cM(t_b zuyJ@$ZY?v#o)tKbbQS+Jcl7*>E!vSMZpx|jE5WCtn$ov}Q-*sTbClsso3>6UckGE&5N}4Jf3ftS8z54E) z&hOqOY*@0snMjQYjr6DBz+>tGTKfVqsMftjwaChDc7B!1T1vG$XDoZ%-h!R{-xHv> z8VE}l|GmW|*H-Td1jE_mJzt|`^+e&Un08ZC`}uW+IbcSFy6LuKU1O^EZV6@tPF>TRv5r z7VjPRLKY=?x2^~zS*hLZgSTBhl6FHKp03-EU0ZOAdFqivcz$oE8|rTOZ`G``b9yB{ ztp-{W-JUC@_ZBlxc+|h;4g3GWT zeaP_T1ik_W3)u=*tv4F^`pyH{eV}i<&fi-H+Q>`4NSOiJ+WFi z&SEJAf3-4{gPG^)}a{aa}YF%4Q) zHQ&Bh-F4Hs)T+GKvWGITfcUQ=r|z>qF@;~R9-@{pDJDiYS5ej*>oEuCflPYUsv^wt zRb?gdcQKQ^wAAs&vunqKg(-=n7semwQbjEJ8`0VB3!Av`hX-15cSHV$lEBi~^6G@{ zbAv4&V+FtJW=d3~{Kg1F%7SDJoUQb72HA`3ky!vjsgL6a#$C;BOkJqGa% z1lBfu8~amJA4I4+R})5EUth0g3d;1*BnAt|u0-pxdvA@>>xjR`-ZT9CCa^=5Yx(rD zz-T|5dB^f9JJ;<`v`2X|tr|cGhlNtZRf)^%m$5uivZ40FP4NDtiqBCZI=*e~27=$2 z!4I_!J6Y_@AJic&IkaGz(T`?p?cIVG|E$p>M-v}f-p3(V#Lxb+1I@b6pXe?yUp>fWLkdK10ZL#@%XKewGHZZ5stTdgXMn_=emEtwsUr_?hqo_$mh zx9G2oq1EaQA$`Xz{G!A?9_w+JG_{H;AJ?20-zCSWCTI{vry(#Vg$a#VCp7Rjp8O$W zq4LBB)ajg(TvOw?l>bmCUvJifSa_o>DmfUI#s0HBf4(sgEHs6bTkEWOj&skbaUuAC zlLzsI*^(c^$j5}*wWVpgG*vcYI8stG9cvEhdUI!f%^N{#co!M+3zF|~`s^rp>bg}X zL)_m{SWek~m))#L9#wDuPj`GpZKhzsCQ46Imm`jyB7%4mA~bG`eLlX&W{c=>{YWV&|1`hm& zA|pLTGvOb*Kj91SVGv+C-Fr_bbBoFtDj5;s4l0^61(z_X)0t>}{Z%K$<>=@-36+tS z%6_peBLbITo3xcE)N@($7Co7cm6JWSal{`P?M3;JR1I4_Sx(2FZd1MwlmV3 zBA*^C`|N~ZDt`O6v1qP=GIPF~f+!@+#Jsn=*-7Zm+Ony1w6mT4NDtoz{m zXi||uPqw}kTAFx?xf=OuJdR`HcVV4suW=C;vCPtV} zeZz4P`nMF!p3L{D#d|ZxSO_eHvdlA?VPN686ReFgoq(>~QsBkKoZ6oV*FO;` ziYixnFLfC&9jJ_#`j-MEe)|8zRVCqQ|B|c!F7r5XzwDBA4QwatcA|ngPYLU{)nm>m z_LO^edSvOI&57K4zPa1KqQbkGna1r${_4fL7IrgGA^x+3wg=W?X2Avdw16w>yvbzO z|2eWe@TOwQDsZJ&p`-FR_vc52$a8(g%*2E@(NteVte~wM2q67>SxM>c2}wxNY%|jB zw!Fxblkx3r_7{ipg0+g^bxNLtqN3r(&4!+lt74|E+^af^#-di!b1DnglF#F+J8Vi$>yUu|G>Q>UltmS6>kXZ%u<`cQv5jV!W%uCOpq-o5(SB40 zN&l&*THG$%!ANfFmA+We{$k`@YNb4jkflna)2Ye5G-va6a%P3g=)q_ebD5)~>V~Pq z87H?*3@fXHt7}DhmghoT`?Za&;g#^?mN3Vy#yR6M7SD_HHuH`cIwqh>kwbvm;&c+_ zV%}aeQkB;=A`d$?F{iuFaav)+s>r;tCGVwIl*E_+hn9-$n=Dm*U1p`BTZd5Xh!Ezm z_v6#gw}(FrbZ|2!RuPyV=lw*0dqFGDgAKuxr=H3aZiLuse_HS3= zZL7~4J@8G2WIH&NBl~BM@oHjL*y)_8Z1+3wxE>UCU&l@W0Li=m?FH~r3L|Bl4-7J1 zQZ7ImS}q8nt|WmYR=HKIU)sGn{tw5fpvq=vMgXgf_=`pi*R(BC-W~^^%goWbD!Phk ze4f0og2U{m{qR=LJ1AeuL7qPpTMU!|(zS%A+Hm!Z9cP!3N+kEc{}~U!t?Ccek-5on zJCv47a*7|kcioarow^4!ED5OV-H!4W;yC8(TMqpa^W;}zUS5%8Wu3ZS_fqVN2`Rva zUjWZ#edk-69bCJ4T1Wn2!zdcIuETlxF^n7m$DiFcFsuqyTvR}+(k7|{-~8L$>PVs7iNYi zaqrpijaq?+wgbm1H-9oz8lrQ3T`EjL>^nz7afYSEt)6D*g}qQ zA+4kHw0p`Ye899aCvY|fDP9Vi8?(2TZT-T=T-&z7R!B$MemX4{K*=F>xHv~Ct>8Lu z!MyOFiX?1o;&2IdRf0!8tk^Q$UFn#F3RUZ+;a{1Pc8v>NUvkC`hx<;>CS|IBH# zZoPbSSY4Hx?Y;Sf=s;7*CFsjnCPD7Qyr-f;C*f{daa3JX`Wc6dj!4QjlD7L&FA%L#5ce5f&g zleK8glzRv6|AI9^j{acU5L-P~>SU5ddd*r1aU_o30`Q zVvUXc#>bd8p(Qq~al3^hRoJeU!I+qr7w5f*%FHd z)Z{NuZvLTc$>Z28<*Q@2A7{~w)_1z!-{a4fMC~RnDU*O$mnb{>JUi#*!iA@bj{oe3 zvf2|ar)qHetlr@RA=Un%Zx1V)1}G!i&wr2W-Hi({siEvuqhHAupB@%#Ck){Y5Kb2U z91RAR|K%Lyt;l>}%Z*(7UNGl#8cf3D-S3|qYkuys^3$W(#k{)oH2xc2<^R4V=|@7L zkyvHBA&pHRz0!-&NCxHO77(I=-2(p=7G9Sz<+{3krBq0ax75UBp^a_k!js|a4CWv8 zNZ_Z2x7c3mw)Lb018^tpkpLZb=NAXpNCtH1ouIA^3m?8|%$U`})4`ID~3613AovvZwX^Mfla8CKUfIYkyW7+=j%kW9bR!Y@5tVD0s?6_A**WIO&&F@X4$> z*hZ}6G2 z+qTcshFkpG*N+{_RZy3fbTm<+cv6L@UPK)4waRQJTo$ewI}3Z|S0;e(_q+Bh*=N&OO)W$Mss$a7)yme|;l2LIc@&8SV%_b}22n z6Y}F;8s0P*1JgBs)@%+1)Q|m4Mn>e;yil4KWtV%2v4@jgalNY@eP3_xFzUfwoLf(} zZh?^0h=@~8)T5PUk3DeXH$5)=h6jzi3NIl!)L!Acx8{#9BOUvhcucLmxVruCwV$G^ zpv`dD%G$`;*^Ek1q`63(J>DFm{tYgDJ!R>M4O&(4y1AuVY4p0?)PaKSdJAtaUgPb0 z;*t_d?f%HEUb?u?@CU=ggzDFb!_28$$JW@r>r~e>6|K|ViVS=dcuV%DB48UI52n`P kSNNvj|3brxE)!29UBjKcS~1`&lC6nzzC=+zIyBZ zd#~Lm$H>cr!*}dpAFhAE<6*zVre;#hMoWv=`pJ|rAtWIoLykObM2#JPWrH|DnY?@W zbW29UGSy4{L?SjKg1zZ{4CxxB$8x_;h_Hb6-4}WQk=t zQK?Ge@Be-3e+Fnv`1?R2`GwQz*sT6~;qMBLQQHsi zpr2(OM_G_DgFM`^(yfmegWsrBIkTcDzBzI&KGzqW<#2<#JGqH#j&Lbda}I@?4haZfXeRnwe)AZOrn^f&JnecJKI zTOa0M(Qli04g9vZ%B|Fc;F;Y{Yr9Wh*UQdR*Qz`SHbuxfxBTSt8o=*dI=DNTJg7|f zsK5H0e)Vs|d1_uBu6LJHC)>*~$NXaZBxN;8C(Qcul>1UvmHF7~u2d24x`xJ0YciWZ zgIW4kUm#x1LShry_}4wnKQn}#DM|&6&#F6pPs(rMJqioP#gYOQmiB|wU$TcnD~Hkt z7R=GBP1WtE42`$FK?dzwE34t-z8813m{@w#O~uozjC!?@^3TbL2vY;Z=j@9t)RM`%jmuVthdxzQXq9WN zUIn83{$2FSOj_hHR^ZRd35_q3C!Q3JsCRQyrPH)H!sKvQJu`%hr;iFfTN&An(fcPx zI28@*D^@|yfBk@Z3b5Kt8vIKIN(49Ld94i{u(FU%Q@(-UBxLy6ir<2nZGgG=(E17K zcfZga?4_DHQo1lbEYqnmK(1$)^QD{>(>8@?WBd8^h8a=ah0$vQ`a(++|B@QJ7H3B< z{bsU0<-9;WO|7<|&B6EC0Yl7=JBK{|^e(Ms9&6{9m-cRzwh$HFfuFg__YjZ3^S~U6B`>QY+DC^Y7=0+^-rGH&{=3K zhlb*FvR;JHfE18H5@oa#g(cA+3p6Zq}+aBAO& zSaIEMp->#)o66!`F~Y+Fh-iS_m(|Y?2^ONBmRR=>3_L{R6eZw);4M2&0=q;`&YmWR zaIF^U-Y?ds+E$b&i)Kkl$+Hs)jtU-ERSHIIG7IVi{~|vHqaFN|yquhvH5D#PAxzW; zwp`yhS8+FAIb!DtO8=L`6wb#Hu7OxSYzWv@9*E%fYV-S!JVR5JPfrUTWXjt8AOQ5) z>X$r3)CS>GA(cZpm5`-_1$mrQu!ny}8+8+%{k{1=Hpu-q`~ z%E@a5d-Gqe-^J@Y7Mc|B#04b{4c;X{5?sJo6kWWG4}_GW74W#%2(ehyYuN94*y9-epcCZEn)Lu0Ozz!}AIRx{EVSPDBMUH>j6ZeGa zJ;|vkv0-B@FL($L6VKYg^eV7yhwGkJcB!1aOJ2rDMO zeH%eP^QAqxqq_A)`a7~|-lRF6LpcZm=CT4loC(Dbs8gEinos)l!_`v|m7nk=sC^$b zppL_)LCL|anIv4$xGqP=JuI&X6Hc%KI6gZuPJvZHtv>BAk$l29Jv_!@9Jw%W?&&YT zR9t^HQ~GBhUoZGy)yu0B-Wx|>_gSbaC=#zB?=Rt+6YsAN1fkfrPeO^yXWf%X$!uZ5 zeWq9uF{@d4!ZfudsYwu47o+7BRQUh{!6oab#40i@AVFnS>_fyzU54eI+MT7>nL`<$ zKBz2Z2AYg`O;aV7$rob>Z-EGO&P2sIl8^}}LLgjEY{ad7AOvior2eJfWlHVLlI5A@ z`If>|zF-$qY9+-UUO&}ka5tsAsM_buR-*-lsSbwC zicnH)IqdH#tMa5+hR+^Vd5go~5HLsyya|8zhBfKk3sCVd&|%Kf%p`$|y}ZU~YQz0L z%Db)=VxbckDaArYs+}a_sOf?~m8$BLV#XA*Y?S=eg>G~li&TNp3N-wPStF`p^%ua% zMFDz<4FaX6K=2b;4cMH>r-5Z#OM%cxPAozI5z(RtRy9)vh067l(lCFWjE`(U^n1c_ z(w&lfCLx{3qW39a5U4msiAM_ZEd`q#2G=7{kv*GdVheo}LsNb~Ny;3K_Ne!u&4b1O zfjl8b=A?VS%jmQFiK0W@^CYpcp>@R2BypV;785|8`|)280-g;tFvH-9UgD{Ed5i@J zFc&EF4YZRvbLd{GM5@@#*cuYAfMEEGKPhkHBz($*ZL}F{4MKnY1$E+*VFkNS`{+JK zmo8KyLV(geBeaW5E-k4lGmbu_a+a9z*NQ4pOhg1{2QW^GZAy-hN`=_LQtkx@+lCK@ zJX}v^{mO1&s0pV8@$$4-DLN?XCH+ljn{Ms%N4L@{jv}I1SeP}SWPqF=8w5|0Rlwm% zBchsOTI1GUbrhC5g#(CelOW?`3JqVC%DEb z;xDD0EAoFO;RK6|`gLKV3OH5GH5wG|H^Dauu0~uS!h6JIq~qPp5mtZZcp^;qo6m5x zy)H*-gAf>=Qm43+>WbiesK{PK)DmC~PFxKSV^9nlj(VrURz&%^)!HDKcZ-+C78?df zXxIx>E9#_DCJ|N%wdahd81if7ryyqDiWpM0EBUGnNa{MiQx>sh!HE1TXJ^Eo8qM_* zW%s6Y$+Ka@q+Pu~GNc{Z9Jw?R9i&!Y$2aHZyC8)+9gL_xbCsn)6+hEHJQq`C%u2O<+#7a8;MEel$bN__v`V@mlgWNJAr%HFDh5|kjaOx92@nlfRm&w52E=KrIdd&2Iz zU@)Ay>5-*^q;Y>FCgBkf?*4UMow-3TM%?dW7vOnh><^iuZh&l79vL4mNN7X3iiHzD zqA!%CP+2y5`02Yezz$AFJ?l)9k(8^f8pv zd$Li_#;7wE8f)y{30HATt94!FHhH@ygGW9alc9s2Nd+O&hKp zJ~4khO>c1VZf}|1K&e6a+oRVbAf`WAF>N{;JcjF=AFf$uzn}^XcyOqavO6Ilr5;up z&et;BT9-W9KADx?NnCYNMR)B|v-3!7EEC#X)sSTfI=E3T#Y77f_`Srn-0s_X)%uz>sOc9S7Gtim1?2$eM-F7Yx<`DbWy(aY0*4bpnXhowqA$1yc8m1-u$vW zci!7g{PIjQk4Q7uw}Ws<-puo0@wa7q;u_zFVxz`{!F53zWFuMP*LjORcM=XoMr@#; zT483iBbu_`MVN?cC-!%X$E=4vhtrP^|7E%H9ui6Itf2hWVz7SRu!eD<5~2}zc*Cx6 zrIlA;bM7>&W6^pnX0&bJLm~f8s+=%a?i-K&ZI->&+1`VJ6XT|8qaDywp8g0GTb`mB z#jIa{le6|lvWodNu$#QI58I4Li9EgBm`bTOInY!kRc&^@=&BB7hHbxHe)j2SO_VRC zTgDtvygU_6@4h22^XmO|+yjlpDKz6;8+C#$O^uFzE6bk<4PNYEB;Afi3rdk5yTSnh z3!$Gu=W*hq3!GVdy@teU#NwmZkB`!smnYXt#ri|1KvK;zY>?WRjGmGtc7zdhXyl6K_*=xG&Z3)2CP;XhR(NWN7 zetMTCTE7fR?aJgZTt}^-NNnmvk;NIc#usNiV1Qa$(&eO+@Y$J3)kj42Ii4+Mzvu^< zd^~?O#abZGZ$^aQE%p@Bugd(v?MJdB$|zzHqG~JMZawbv!}qd3yT7^}arS3{RwU)9 zIpc^gj$*7hC2x(gZr+GA!>}u=wP``~sYRdBSgqr?l(z&x#-SP(bwFlBw^$zRt;2AO z>rsikh-9b=&7q(Fw|VhVMJA{2Qo`I8SF{G8UNHa#P*k9&vTfITcAHhF|DG~nT517{&L>9iFS{e?O zRg3LnUrR^v8g_QHzR9593fe8nPRT_q$!b*^RLGuC9fye)TdzJWBvQjEW2NeL62@AW zXO+K~--rs6Wl*zwkxBMqi{osv7B?!u{A|CrqH5&wHZPXe0aX=h)+MB0&F>Ymx z0-P>FzpdSkQpMg9J&!ZTwvj9a$bgXu+OnBA4|_Pmy2#gI=|n#O-4UeLqfLXuj7N<& zDa4}c&~(nfg~bao*b}EdyuQ>w92^)gi!lmhJ3d`8UV2nK7I^90T|RrcboX>Ih+*+m zD}4e2;$=4G;Vnwh?hZgbg|vX#at2hBP68B<=}PI9z8D*aYvxMSJ7Sh^IV5i+;Gcd@ z1|VDG+%8Hq;vA9P6W+nC(MnAU2-q)3fl@a)4=-5JB`E{9yieC=QrC+#qhS-OzjN{& zgXqu6-#!@M`_p{W^$C4)f?wO{xp$3#o&405%1_3Dg8TxVrj5O*O4;)ViY zPiH%SqkZo~-_rd=f3oqp_rZcjAg|x0^Q+>|O*evZxgB`vQ%XiJ`jm?78%@^a`=ur` zyT1RF2QlGLb-Ni;C~HH#(1a{zLP*&O=}C7n)p5T|;c7&h$9x#^CyX8~aiPkY`^VI= zQHVr#10YA~#tV1qP*IH7{4^Qv5l*ncT7!V|{i(OLfSbrR_^A2#`kMZex79Ofa=PxP zEv#}XRCd4Uut4#n3n4N-(;CRTY5hvVQ&Tfon3gpDg;e`CY*bP`VY2h2b@?I~ZpU|&>mL@;*mW6 zx+3gtD(ikWl?L0@y2Z09*)~2X;i|T}8)xX=B?9DXRh$F4{sb}Ty|{cXOI)G%1@k%O zd=zzft7ivgSCBo6Zm=RIU8x@z3d%JMvb@N8e~sCMWc@d`X1shE&Z|dbIaWbO1{2V` z?kiIpYU-ZS_=z}U@A2I8lj;(p>u=M-cnVL$i2J{*KtxLiK7xA0M1EHuw7~g{W~XmP zwx>Bn9c-pgdWl8<8U+rQ>u&hV#H=aeFz0MEV9IL*uKkHgHTs#qsTZ3eK?|rpb z?oE}rAV~OF)ezQry*m+$F9#}4->-l_>J4!V^X^0NoXOnw_W1Dz-57gGj4KJ6JM6Z! z>mZF{N1kz}>YW|03;rzV|M^#rdd$n?%%~=~n8$ECIS5g-|AhnqSoyDZOPS)j>P}v^ z=bHox%A5mN<3XCTNA$njLIZY47#+S^ddUwi}W+}}w+LOvKZZ+$9-F71)bxsM$DfbIIF1(@@U0Lv2 zey~)WoBlJ-7y#mB8vI9xx|6aed&O=y-cM*$7l^h+ia0+6=4!|enkhQHWF430jad8Q zR+9i^G`HU)l^ zQ=#eSXMU8YpPP4i{r-B8Yw^6K^J=jZ6tj`QJuF`%ksBv&pwPWlL%my=PbtS zYUCcMYbNdXm8ojg;h66Xd`PF?iCJ(T)>>InSiZWH?!+@*ki$u{RCltOd8G;j`#$%^ z2GsJNMgel7e-x2>50HY)EvgwD41zO#gDz1Pa~%)z#0f627Xt5Ocoxp`!o6Ujld9ikeG!OtJB zi&SSf_x7W4f_bp)v87@;f7jT}M%LCA+9Mn!JnH6ba)#eYpOov5IxU&}!a;?HOAnNV znz6)1MlcEV8=>;5kvLSDzBk?DOziwQ^o~10o19-WWm-`N&UF3St8&Qa%NrOA1bzI!nnbL=TryISLd3cBj1 zy1Ujn3&LQ^`#!9FgurNaARvtoJKiY>e6&$SE=KfY!GLI9GVPkav2?qIGA~|ZC6p~S z%i!I2k!O4ET+HS%vEw5(oFlnk{&Fon{P*y;+e72l^e`j<%-ES;{(7e0h~{y6rUb}g z5DL6a*S4@nK#dED)VqD(BW;_V~9mS$2Tus(>X*bzkthia95 zsPm+;D0c7^h*S1-ICJn@E7ygT@u_}Hv{?C7rt|)Gipu^(BE7CPsO!V2SHFdXbQe21 zQsVh9p7sm1pj(cG_V(6Oqr>ga^JzQk_DcAL~uKd~3i_?BS z>^cNJ8y&^M_G3nVFl))|N4P&ogTF_{JaYQSgvF?NKJ(|gybPpQ9c}N~z!z z9-Z$w%NNFllS~OCr(g_U?ci&E4+76*o|!0go)7=s>NzL5yGts4e;zE>VQgdgbE&$F%pqQI4O5r$Vr70=V%YR zYHcM4{j3wMgl^28wk1A-apPfc(NlkDWP!(tFSYn-AuHn^Q&v6ZR+_S6kOn0!jhnW>ur8JWqF^E9);l)i)k0`zL z@8-(m8|(KMFH9ZQ%3o=u5Pyz2Kz4s@gxE4<_swn1q>!51xUR};Ege%{{dKPVdpSpQ zI*|Wv}ZRrnS8qizW>Pr>+nVOkC5U{W~B^icD}R zX00lmd}CNGb+Xlis{XMf=@oe8e77?V-k#qEF@=;NZI8-f4hps>j2rctJfFdX?F(pd*WmDg@q}s3e(f+`v*D0)0;5wEz@a( z6AJ^kn@3ywpB80W_Ag7^xccH>w_ta*fHyi8JGPsfU27RbmUCJg9e-^~jQPV}LzPv@ z+5XhceSDwqXh6tAh)cD`uMaMon%f-BdkcM-#Ul21MNshA9y_Rtta3{zmd1_LfF2f$!YW= zFsSTNpLT9v^Ya{o{6w1=6!c=!PZbkFu(WpB*R+PWqT)49xnK2w^ZOw z#b|_f6a%sGRUv0GtB#-`N~BUWkewGtz-r6P;3-uB!loC(y!!EdH9}&AZXEoG-lTP( zrSlGd&C;<0WxiRkh-$Pz^;PXrk&$(IwkIYg>TqZhz$lpXs*UXp^*GG3_qmGkjgOneg5!g`;-gH(sR zR7MVk`XkO*#!$Kf!<10PhO7sN(85OO0WT_vsqS?8ae(*UCeIP!kr6@JTjpMmYVXv8 zmbsD&vRbG;v!#$HEY{DU@z@M!izk)+%h#P2fUnt2e@=Iw=V`z_kgMNoRo8jN2!W6% zqFchXa%vvF57JwG6-Aj&YK&!S4=ab~W#oxK{S%7;fTr<3E}T&co>(_?BdUlF|H(pzk5zm@0fgsZ<^wg?abnC=OEJ6B&TOc*g_2&c<@ zgq2AJw8p9pJT?z%cK8=H&THJ)_*X~(QAb^%s&99h*&vds8nN{*4c(H5k%)lUgNmK@ zFg}Y6H>G#3m&cq;T&cq}OUMT5jZcp)-@#w(W|@6^dQm9G`@s#05uA6hIExe(7ypFnV$s*l&08$bx%?4)AAYi6{^|6___##?8}@XJ&-DstFdpXWx-g}RC*X&PpFn!&K;{K zv8HQi)KO6ng6;}#2bkB2MH8<0vT=t)zJ>Pdz>1LdS%2Pdga8Xw!C* z1pO|1LMuDnySv-{=a2OJ%c(C-3+$m2ijfE-drN2<_PdC<6m81UxVZh!wK#vTGq|%K zYNI;nW@6cN*+-R2ML|uF^Y=@U`e%kyPa;Tb4Ya}|Mn7ZCB2hZ~`-A5uUQA16kJO5- zxSqh^2~({2o1d3|mOlQ9Fytr=tkEeA+Hap|^d2@=BM+14>@IyYcPrJ+VJhs?KAp&D$R<*dO~XStABIZ(}Z8w$r>O zPIK>9x#mc~d!6ZT091M;jy`Nw0d3%Ru}`t4CcE!xGn2@FQ!CpW&Jc1T{?X{VU%wV2 zzNC7d9@Gnd$gLK1O!D_?>B~j)rmHo>pzN*me-3!KSif$?Np)aEz%h#)j(#UmRV%#- zj=KkZkupq~XV{&Ouuz3F^&@ZUi>GRG6RG3014N!JDNkq3aDoTt=htu_Usr4S7YGO@ za|&m(K4JQ8(Al!VEAaM=noB$`E3pewGvITP*a0tT)AgoQ_F_Mxi#+I8C_4j zYS}1d#IqR|xxV$Y~Y73lHlME|U{cz?OKbX&G`cjM@H zij${24DD&4mGqz-y4PsQHVq(D0R?PKM-Lv zJ~u~l!%?pHw?6+hP{Vz*az_{*X0|@#8niG^-$wX$ypU9ju5i@Qc39+esROwA(%>QK zFduf-K(M-Lb$Ap6Uk$JPis!I|-;8~G67&%8KH>oYvjk8XCf)?b1u1~J?X=9n*9(i z*d*na3R^0IJOK#v^}|N)?e2-l2o^SMLY@r>Sd298v2bXm(Z;UqDCPd(z#;v#2LL$> zry8J%XCs5_bkG1;%^Lr?j14jR8G1wP*zLgBWczd`@W(&98t(6U%Ueuy@a)UWm34fe zi_^|C#Aff-DCboIY$*$_xl9rNbAQ-&RKoxAms@4?>VEDoE3B?}jicb-r&U~eA*@(q z+4+6c=O$>A@heojSW!jkNy+OqJd0Sq7wfKqNB4-m`7u_Cn-8#zj#EW+|Gj#D`>*@l zJM~BrL`#Mx#K>fWO}ID~I&yYS*7Xx%pQ{OUklY;~NopsFNz59*@Z9 zs7c}ezX(W1w2#XqOdhrj(*7w-^rpilU384EEPa+#psyTHfi>InyEU*}KAYPBw zC)REzOkXtryR37W=CvH)^#GukEeX0!|2sI4eR;ZtC-X1icEVYX?u+Hh&Dm-XNnSim zi(%5QIz0c9MkPrpklr7BztfzruZukXm191VH2*Vz}oJ!=APj<$)QF5fVQ_ti) z&J%3dc$^j3lRa|sFV;D#|1@c-;PY6_G#J?{YUi+)G^93}H}~VrLfx2>LMYz6zY9kD zv?5@8JgL7y;o!1D78aMJk4!P8LmoLDRaHT4N4(!>18)<R>K;LGjNn|*a zSjj(Q@iF2~Dm9SNe2$&aG_|`*)_)sQniSHocn5P9?kRsxP;0_|0~K*Z;TESrpyE}S zA5KikgWe{kHqWy&RmITkh6mWse6Jdk$T=sctQ8%0NF?0GcRyUuN+g1XE zpux!%{w4XT=ilk?6VKcBK5%0RrIc%GjB06SIdQ*sDSlkXD;eymsH|d%io^IcGyeMF zBpIu!A}%04&->#EIP>4JppMS$YYTL*VnW>9g*J24TzJr0aS8q%>2`}ulq)1oOH&}M z1I=X4ix+c&Yt1GooI017_#K)G;Rgu2UdsU$gSsDre+XTa1@u~XQgbOOPP4F77SbC( zuz{gqh~GmWQR5$0zc(9c+P9atW&{36Vdpq?O?Fl0BB5M^(e*qBQYrVpU%58&4r^0h zflLze%pQc>ShoktcJ2PT|5cd)1$~RwDT7NsEOk2B$3Ri)LmRB`X_O6Q4Yq=ILS~8@ zy@0ztfgtvIjHTm%d>9_ivfv{Co=IaQQD)%v5iZDTZ=@#=?$1D9eZp)Cep-scQ6C%S zd0P=l+HdQCtsQE#pP88GOT8~0ATi+MyItgsHT?wOtw0`(TaCxWJ1*3vMyMlq$7H%j z>4RWNht0M8N5Ci28d&u+tO`=n1hNFsD-HqZ;ii#`;kQ3~m%(2nC=(d7)Cv+WKSx+h zI~CNUK3a=~r#-8c2h0A2BW{c>izyk&C+}^Bj9@aJ*|BLM36+~T(uH2qpOv9czevwM ziVDj(++5r-*RwAgyz%DTL7D1G_#Y@O>^!}&lDWK< zn$P}0;vdyHWE-RnzoGaDqhrJBs^d1Y%ad=#RjL@aMIC(jEz(@2tk~y}7V!f9+o;$a zTejqV3gu@)Gn8lZJOA}%CQ$EUqK@Zp3hut>;HsFdDBrzC2Txzm#-{3*R5;~FLrxl> z?G*@rMkGXFkpqQFG`|4q;Lz`}J{mZH60)^&F18Wwaueq7l@6(skOARng?vAx2L2fv z`<5-D=EYrToI_Ja>hQj1jM^1b79b=xrJ~j{+;~GsnOAZmTGWcgRP&zGJg?GgEHP$* zw25uqGZe#CkY8dfQ9uIWXGOfiT=VcjJ8~#ZLH_8o^y){BDP{|hFyXHc6-Ng~pChe~ z2+BH*PKWyDx3@3<05fw=I~TxUVW`HRH{F2aCKXC*a>t(pd37Gh(h{_OF%HegO+fMZeYa{7Aj$05*yLGuQm0bRAA24xn7zOh&+G{q zX_VJEqB<}VX-_yJ1!y$yfi>;+khm9JX;X#0yMw>E@8-Yx%ui@R9Tuf1wcIM8Mk|V? zF`4+9EwH3s$c%A^p6)}0h{a4y2f%164+wmF-XrAbN8U-o%Ei;8`v4!L*6ct%0JWb^=HXvh2~iPK4!+H!M>ckz^-{b_`txy9 z-M6{OyLQs!S7W@u$U_<+0c;lieed(E$R)DMG9t~gjGgBb8Fmu8X$fCim%IbvVEOXH zVmqnB%FQBCg@5y6Q*x-Yec^{L(Y9x5@TD=*xVPXJqbe1rj#ZeER7}RS&2+XeJ_t?>CE8?Hj%Gw{F9J2b(j)GS~82WWB6!sDlV^18N>znrQJ6E{7D0|wd+By=Ufg^q9Sz$8WId2vetAZ-KQ-L zeP7j>jngAtGHh2C)T023OiRZ*zTk&8Ed5F29A>(#I@-Me1q@yEZkY_!eAG{Sg@D=X z@8s^07Q{h3u-`xlnMnC#3Vf-vd~+2e#8it?@-RdskLe}FU60Qrzr9`)w*4yH7oAr1 zDlEb^bA-GHUU&+d_VL@uUhF0PqE}M&jmEy;G#k`A`q={@{8*`Hpt4$96WFE)Q_)Vx z_Re|v)cJN9S3}kAh{Ev3DD4;G@&1c@))qkNwusl`OC6@2^06wV&e5-?$=Sj6-*Wx9 zC&wU4S=j+xid*WPI0a7|#g=2rPJEvA*VV61ses4t?6Kn#{RaWh3Lp7;-5~4nTfIx1 z2XCMnqUE|jISTtTcRsV3qv{qfS4gOQ{Vc}5xmgWB0(sqJ$P(Uy3CdEUl2}*%)GXBP zy4HI8nw#Gx7SfC@dH4#Yvnv&OyG#rJl|t1?xUpu%NUKfo5BsiF-?i+Cg_$@A z3pB!>WcSQMk*kkX4Lqq8yl-%2f9zdidRX}G;*8A2V8TO{AuX=6qR}~M^lA|;rm3%= zzShEng<9nhQK|^Ffv-Cb9)%rcb{#GL%kFGGdwvihPUYCd!~2|Vei90s_HN`MB*U0d zv#E+C529T^9f&?#nI4E69~pJ7LB(e26fA2ljAwGk z6BR1cR1E&!uy{5t>nJ|fBy%;-i@GnSAnFNmlh;su7R&@y1eW>qj@w*Gy&H{pF|8Y3 zL0+R9=`Uw6wTYjeTU6U@OPd=EQ&0P`ulc1y1J+00E&Jh7D<#hSPW?w*U$3wKv~tEo z^Omm-u@Z?gc;MV;78{s@2azWx5}D<40*)3y$;L3$1ZzI-52{B4@pu|4Gb&MV#OI>F3PsH2tBn9zw6f$p>)0U4QxGSArj zhFI8K)f(kJslg?LbYA^6m#{ehBy7qkg7PKXHi2TOx}L3ub(63?o0RFm_YJEnXBb9% z-OuFi@}%1D?&|&7?O8HHDvtK(DDD9FqHROWs+uoOOH1QE%e7aQI9k#h!?XBU!j;6V zjGYK(>&1Idu!ds%c||29?G5z2${&<^gH(~+z`A6CSPkUTtR57?OI%wZS-3M0fU;W38@oAfF4yrwiDpP#_`|crC^q;IYwt~ZLTOEqRNQeFg8X(ff z5Fw`(KRU;Jhcb>P_LFQg7>@Ye9PJazZ{<70*DrgG%W8^lFH#}+HW;?(A|Yh*btjmFzwR_^vz zGxO_05}5g1wzPNkueF?%EcH{yM+*>f-Dhk!U`h44F~3)aOrnid{6^A9VydU4wOl-M zS}ypI1`GG^0Y{^v)juZD43dZbNZ2Jk*^@ehd2I>h=T%&$b(fZqfCAi~~hvbbq7eUX_Cq1y^yUF*nuhia^;8(u|8onnqJsN?=WCp)sAs}N+ ztpb_6sABJX*KD zxeDL^(zR2XZAasMHB@Sx`>E?TP!4E9gF^dwTIg#(ffQ=WlbY> z2UO$UuSAw@9~G^!&WB|JIm~_0@-&)8(#nb diff --git a/.config/awesome/widgets/battery/init.lua b/.config/awesome/widgets/battery/init.lua deleted file mode 100644 index 4dbbd93..0000000 --- a/.config/awesome/widgets/battery/init.lua +++ /dev/null @@ -1,212 +0,0 @@ -------------------------------------------------- --- Battery Widget for Awesome Window Manager --- Shows the battery status using the ACPI tool --- More details could be found here: --- https://github.com/streetturtle/awesome-wm-widgets/tree/master/battery-widget - --- @author Pavel Makhov --- @copyright 2017 Pavel Makhov -------------------------------------------------- - -local awful = require('awful') -local naughty = require('naughty') -local watch = require('awful.widget.watch') -local wibox = require('wibox') -local gfs = require('gears.filesystem') -local dpi = require('beautiful').xresources.apply_dpi - --- acpi sample outputs --- Battery 0: Discharging, 75%, 01:51:38 remaining --- Battery 0: Charging, 53%, 00:57:43 until charged - -local WIDGET_DIR = gfs.get_configuration_dir() .. 'widgets/battery' - -local battery_widget = {} -local function worker(user_args) - local args = user_args or {} - - local font = args.font or 'Play 8' - local path_to_icons = args.path_to_icons or '/usr/share/icons/Arc/status/symbolic/' - local show_current_level = args.show_current_level or false - local margin_left = args.margin_left or 0 - local margin_right = args.margin_right or 0 - - local display_notification = args.display_notification or false - local display_notification_onClick = args.display_notification_onClick or true - local position = args.notification_position or 'top_right' - local timeout = args.timeout or 10 - - local warning_msg_title = args.warning_msg_title or 'Huston, we have a problem' - local warning_msg_text = args.warning_msg_text or 'Battery is dying' - local warning_msg_position = args.warning_msg_position or 'bottom_right' - local warning_msg_icon = args.warning_msg_icon or WIDGET_DIR .. '/spaceman.jpg' - local enable_battery_warning = args.enable_battery_warning - if enable_battery_warning == nil then - enable_battery_warning = true - end - - if not gfs.dir_readable(path_to_icons) then - naughty.notify({ - title = 'Battery Widget', - text = "Folder with icons doesn't exist: " .. path_to_icons, - preset = naughty.config.presets.critical, - }) - end - - local icon_widget = wibox.widget({ - { - id = 'icon', - widget = wibox.widget.imagebox, - resize = false, - }, - valign = 'center', - layout = wibox.container.place, - }) - local level_widget = wibox.widget({ - font = font, - widget = wibox.widget.textbox, - }) - - battery_widget = wibox.widget({ - icon_widget, - level_widget, - layout = wibox.layout.fixed.horizontal, - }) - -- Popup with battery info - -- One way of creating a pop-up notification - naughty.notify - local notification - local function show_battery_status(batteryType) - awful.spawn.easy_async([[bash -c 'acpi']], function(stdout, _, _, _) - naughty.destroy(notification) - notification = naughty.notify({ - text = stdout, - title = 'Battery status', - icon = path_to_icons .. batteryType .. '.svg', - icon_size = dpi(16), - position = position, - timeout = 5, - hover_timeout = 0.5, - width = 200, - screen = mouse.screen, - }) - end) - end - - -- Alternative to naughty.notify - tooltip. You can compare both and choose the preferred one - --battery_popup = awful.tooltip({objects = {battery_widget}}) - - -- To use colors from beautiful theme put - -- following lines in rc.lua before require("battery"): - -- beautiful.tooltip_fg = beautiful.fg_normal - -- beautiful.tooltip_bg = beautiful.bg_normal - - local function show_battery_warning() - naughty.notify({ - icon = warning_msg_icon, - icon_size = 100, - text = warning_msg_text, - title = warning_msg_title, - timeout = 25, -- show the warning for a longer time - hover_timeout = 0.5, - position = warning_msg_position, - bg = '#F06060', - fg = '#EEE9EF', - width = 300, - screen = mouse.screen, - }) - end - local last_battery_check = os.time() - local batteryType = 'battery-good-symbolic' - - watch('acpi -i', timeout, function(widget, stdout) - local battery_info = {} - local capacities = {} - for s in stdout:gmatch('[^\r\n]+') do - local status, charge_str, _ = string.match(s, '.+: ([%a%s]+), (%d?%d?%d)%%,?(.*)') - if status ~= nil then - table.insert(battery_info, { status = status, charge = tonumber(charge_str) }) - else - local cap_str = string.match(s, '.+:.+last full capacity (%d+)') - table.insert(capacities, tonumber(cap_str)) - end - end - - local capacity = 0 - for _, cap in ipairs(capacities) do - capacity = capacity + cap - end - - local charge = 0 - local status - for i, batt in ipairs(battery_info) do - if capacities[i] ~= nil then - if batt.charge >= charge then - status = batt.status -- use most charged battery status - -- this is arbitrary, and maybe another metric should be used - end - - charge = charge + batt.charge * capacities[i] - end - end - charge = charge / capacity - - if show_current_level then - level_widget.text = string.format('%d%%', charge) - end - - if charge >= 1 and charge < 15 then - batteryType = 'battery-empty%s-symbolic' - if enable_battery_warning and status ~= 'Charging' and os.difftime(os.time(), last_battery_check) > 300 then - -- if 5 minutes have elapsed since the last warning - last_battery_check = os.time() - - show_battery_warning() - end - elseif charge >= 15 and charge < 40 then - batteryType = 'battery-caution%s-symbolic' - elseif charge >= 40 and charge < 60 then - batteryType = 'battery-low%s-symbolic' - elseif charge >= 60 and charge < 80 then - batteryType = 'battery-good%s-symbolic' - elseif charge >= 80 and charge <= 100 then - batteryType = 'battery-full%s-symbolic' - end - - if status == 'Charging' then - batteryType = string.format(batteryType, '-charging') - else - batteryType = string.format(batteryType, '') - end - - widget.icon:set_image(path_to_icons .. batteryType .. '.svg') - - -- Update popup text - -- battery_popup.text = string.gsub(stdout, "\n$", "") - end, icon_widget) - - if display_notification then - battery_widget:connect_signal('mouse::enter', function() - show_battery_status(batteryType) - end) - battery_widget:connect_signal('mouse::leave', function() - naughty.destroy(notification) - end) - elseif display_notification_onClick then - battery_widget:connect_signal('button::press', function(_, _, _, button) - if button == 3 then - show_battery_status(batteryType) - end - end) - battery_widget:connect_signal('mouse::leave', function() - naughty.destroy(notification) - end) - end - - return wibox.container.margin(battery_widget, margin_left, margin_right) -end - -return setmetatable(battery_widget, { - __call = function(_, ...) - return worker(...) - end, -}) diff --git a/.config/awesome/widgets/battery/spaceman.jpg b/.config/awesome/widgets/battery/spaceman.jpg deleted file mode 100644 index 73ddaf3757a16476b4a5de7bac8d5956f740a355..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16738 zcmbumQ+Q=t*EPCg+qP}nwrv}gRGd_7+qSKWZQHCksThCue!u@c=RD`~8|$LaHTs-m zU98@o*3stI>ens+QCeI|8~_9a1d#mx0KPT=BL95*U#))*`ClFI&%iD zupr+~L=Z#(0O(MlZ0}P#LGYhb2oj3o{(IX0=K|a$(mr=7735gnX(KSyrjfX!#6?GTbi4WlnvK5Qw11)Nt3$dUp8gU!*&9h}IuHoa~X;wr=1Wxs^aR?g7Gg)jpE zgIHs85;@H)OT)Y%1lPIHGc3*>Io#JNF$BdskDU5Xr#~|JYaA%B?Pq6e0&28=10Zdp zCZc@U?q0NCSU0Qd&4;J$KMD#@UufT!cGaw^ehhax_JnR5aGf=ytL3|d_iqQU>zO2{ zQzRVVz?o0FTA6&p)^Q3d@S}!Nl5hgOJ`FmlH`*LupB_Yw75^sbC5mtY>Vd))xbm+WCW|JbR_1aYA5*AK>!ltB92p<8I zOv`KF&;>+ew;&xj1Dzj+XXPBM_;_x=^&^Iv4!$>h&s$`Kc|Wz;3jhg843(~is$|9; zVGP6#?VQw&+N>yi(qt|1L)m;b3TxYVIV-eb?>Y4P!dXd4&KH66a)fWZB-!VVN?uIi zpeob5LCW^S_*Z22LF?H5Ro{y+UaXIfXp2wA?XT>ZN@?5kd~abT9F{3)PxF?Uw8)BZ5RPMb}EVwCWpt zWle!tPe#@ji1DzqWtuVAW;6|hbK^pxc2x5@UV^Yj;)Yvwq{ZD9}$ z_O7oN4}VG~8k|LdM5LSp^y8NqXGWr=57hj}-FV!{MOw4K6X5 zPr;b{(L{Wstcv6T*lnt#2mD3bqAZq<8oyRn6Fjm=+TT6guCBR4lj477fB1hc{SrxU z(rKDv51e4v!MX%LW4lgME_R{oNjEGUcMUXWLJN z@p=04#IGDQc2GCrP?OjGmTcx15nnQGCDUrCV)Sq!nW@wbXNB`4T`{(8DiVyKTItu< zD6>imw9bd2^$(PGN(w#Lx-8?k2j)WHkW!movDzpw%vqdyhp<+V$W)ZarF&7nbeE`e zU6gT#kD0wBN9I~nAcbyBkun{3WJC)EW`D1l>ab7}i@j0wK5L0@;FFN((d0EHCo_A( zRNjThCvm*>7RizqARB-e(a-(H4>!^`U_e1YA;2KO{=+c;un8yaOriUDkrc6nNg^Ha3ND zyQp0aNoU=O7*vz~oqeRxc~+rsVJ8d|tNJWahJ9o^m-vUss@BMivjYO(>2Zj4|4(U_ zGBlf5BMSn)v37hn304-3g@Qu%Yc^@4RY6C$0Wx@!7$N>vlM4qV`6b-BG1!im@JAuA zG*!CnCZa))a{OX(7d^z3_)~SNE-~DA2~y^B<|%G+Hl0_7bDEiqo%>s1_ezYjkT;?K+s7av1^c>#f7^&&{!{kBxITVAQZ8F?hY`U|K z@Thi3Oqcyu+;>$=^``RsaJ2E>4zCR-2s9V)h+W8^Zvw1atDpr!o+Km>q7mlkvmS=1 ze6%)U4+8?V`N~Dy>X%mM`5CPTi$lRq^m!xwxzCx;W{}MyXzX@nI-(B|`28TkY|5G9 z^fQDJa|kVTuASPa2H}R-`hWgbq*0OibW{5HY&DI)5b7^ zOOoUwXNc6hbr+TKwPaBTA(=cP+{e;f90JffYu&oB%kEqhr)e4P1a*E%+FLCem(yJv z-HMYkT2A93HjgVXf=f$d(ZT!>UrQ1>#Z0ACl4KR!q*?4zr3w>Wk{i#=vdmdwtazrG4zDNpoPJKGL;EC?>fdIo zp&&gzji)*lUSn&`unXe&dmal}K3 z4N%5mK363dM8w8q)ldVjK+>pK!LOB8;s&@!kWbp2JIbxW)=1-m3mckM5B#QW7^uId z3~-4JbR;zTMEHge$3O4^1_y@%`M>=04}6e7zu}{FgF?(K^bH+G7D1!<{Q5pH)IBu9 zxm#gH!+)^@{2%PZv~wpdPn9nQN)1H!D5qA>*RvtqN@a;krZz{_bjuN8$iYbUU?ZRp~CX?hxR zXFoW-cL`&uUMS243I@-YCBErJ`pO-kZBDUiVFa~a-=3@Et18zZ5ej1X*};(V zCGA0vL1y~^3n2d|$KRX1<&0Q~B&~@#F)IXi22lq2#*ua789!S!)M*^giO?rj2Jz2= z!_z<;1yYmgr4nJj1Vu47cw|?`A7JR=Tpc1~%0`xB4KnXBPVyZ)BV=M18#71txU-#4 z(ZvL+B&f>?CN@N1mWl!0O6g==Ol*&(oVK-P4R*X&B9;e-Sx|t{txzzrRTSid87>${ z;j0o>=mjESa4fm#b~w{Nq-9&Fr1bYsr#RB_pu7z8L4_FE@2P7dHb1CU0n6tl+?8~4 zjvioY%Bk0N;S~L9kd(a5>Q%GezG^rPhnYWedqrET$q#bHi0yEeB+%qC#gzRs;hltz zLTaGuRZlF>wUZadEj!Tp?KAH%Sw$c~3oZ(^|AH>_11R$4H2g*r) zhOkM~g35^o@2BI4o~MxyA>b)G;iBR55;Xz47!EI6qL zP~8%p4}-V$4BYf8V|rD{`p~!RXA;4#H>F5hc39K6O#}w+2XE=&)2aJ6C67qi$k?Oo z7K&iP-id=qrc*sA#a6u8lJ~5hWW1?xl`z+8If4nt2+6q_@rQ~fN05q&WXVS71{Zqn zWGcGJsTEBN&sz`~tgusACM+bKsIy!(sQJx(0lp(&5fK0k3uS_=5VmTUJqL*TA5@Jq&h5 zQ+fBB#*tt0Qrk>iFi{?ooeTmN-IYf_`ZIi(-*1Jm^b zF!Z}L%dhb93jpW$+2!q5d3>|bN?*Cw6(q0bVh@CJE875%a&p%lzjf46=Hseh>r3qK zY%so48dcP=$(zc|4xTMYXKutu^ar6 ziDq4e7d^Jc8+f725gZBQB`r4t0}EbP9JoNf_U@X+PBcG?uW1-yOD;aWQlD+)+h5Pe z6x6R=8?4U3v6zlWko@5D+1_t{vEKZS(EKa%dA|Oag!@_4xu6q@Ac1vv1Qx7XyVBZ- zUZd1xjdyaETb9*H#m>Z%@3eJoEJWV&>5V{tAeUA@9S0rruoFxUm5yeym;Z9GDa;x{ zEULOfvtCcH!N%?5yYE3>`@_aNNoDJg`*(GolH89T__fP0y}}24eGIknNSX%y=tjbj zWdYSA-aOEZ)=$;KyNmN&nWy+6j4XGl%yQ>smYmH7g<#!C!p_d(15>*VFt{G@%o9uD_sa>cY zF{qMgtP>HP@+Gy=2ugzvw*kN$-hoO=`AT}?++2*X8*3jkO~yy(cbC%AGrhnpmPYYQ z+7X0qwLmGF_Cac08#=}{VM;XnMQzuyzI10cy`@Bz+ok{@kz`s)hYH46o$8IohoCh0 zZ_pEe9~=m39n|&Se*tP^pCqP0utj}(qJ0VwD{^YiLN$q>#GqzOGL~6h+5E>8PVe0N z_E(V58@i1|@bq2pf@%)#9yC~(vF(oA+V0X)2`EU2egdiHwY2YvS6d6dA)^=#C=u!E zellsguw!(0qStS$6!i1fpVkUZJ7KCA_pY&Ygk2k)(F|S+gW|f|%#PMr8 zyI(_L&IqbAtf0P_jmKs+$QCu-M0?bz#&9!4{TiL}UMAKe*+vx)5|{qfw463-!cai1yBmC1zYGwksHqtCLa;zhI&qY7 zP&WA>a699LPIP)=Neex=RSjtoUwWVlo@X~#(&U2G9!7MFRiCfmsQ&_(*8H9S;Quw4 zs%WgErEWPpYa`TSYHqmzu%Goif{rmj>Dd1MEI)i_iReCr#wERGBj720#(Z6z9S$uv{@tZf+SV7m9%0q;p}#=4X;4xre2p0?JU}x(cWQT8 z9_Bmak$0^)qr@B^fp=P$!Aw(8v*glI{9Q22GvC`MTVg>zS{vCZL!zhk7Sb_Y52QmA z)RHw;rlfVT$v%VxGuxcD(!}%(!_ic~ZN?>Ed|uTo>^seQROrWHp7emnm3eTsDV-b~FRq1yjk7tOnw8pU=p?f4+!X>a`V3m~;MQY~pWOmD~o zQcj9IIU>7%*G{BAcQpD_f-UAcgy@J|vof}P{JU{d;N%(O2UgQFgTI-EpE+rU)G7a% zVT#IO!$fpOaWl8mK~84p{X94lk|ACiP^w}OT=j_J>RVs!Je>F--r>a`vvZ0W{>sOp zVz4$w6MN}?_pn~&*Ll+6_2UZ=)KG5v1+Y1d+3qa(`Kx#H^i|&NC3LRX+?bz*J2j>| z{cL=NX+I>|Phz!Z{OMwiOW%KdnbVfM+E>#p6u!d+* zydp@q$g6A6UX`?Mc(A)7ml?B6r()S7O7PMd{R==jyn1VKz)P}vtz^~*GJpe zHttlV$m1%Tg&p35bIF8Vvu{1ZE-`O70n<1JTk=%Uw_c#vwHUP zLz;${q@hBs&inU@Q5q{1@$fZN*=G2n-tTuE8XTd|!pyoNP}QbEO5}R9YQeTu8cm2e zbR-->kWmsulB2MTtmF#&v5juS@&l(a%cT=b(yT|#mfy~QRBM2lAHjaC8gW4b1VF0v z#`FZj^c(AJ4sh%?{N&bnQc=e~h>8uq08u{Kz4v$?uY5rM3vZeYxjUbD2|?rgy7M&rMsD-C%UIQJN(TGLPQU~3>W*|#^J;kMNo~U*+h&H)8={6)sLYt1onrRKE$!gj z4bNRRZ+qQ0HWx_2ZwuIc3IzDYD94K&=<{1OAH_tydO32vHmA>L2RER-X$1iV& zKU2CTxHvn@8%AN2AJ-vxysUwD?B^D77<&%oJTF^bBbaAKRyeeqCHDB55c%uybBQ zlTWcz>>eo513zK%%JZ%rbJO|^Av$C1!{<)&EsCNjvI_Jk* zIvP#l4k+xXMpp7E4LY5vwuJs=>RQW&z1xIZo9;lp?@%T;Im%EaQajCP4sjr=@G?3q(WsAa(_uw}GoyGihgL^|%ZpXj)GwVH zl_zMyjASUULpJmxmbP1+#&vWLm)a|!u=i+Mfc}8P7TOME!(s~6rIM&>7ussbD&(Hb zwoKYT$vC9=;)8SJ%Fjl_^w~T?Tv2G=L>sd`GfOD$d=$p!k<_`2LARilh`7f*fO3h| z+oho|DKC%t1T!(!ENUG&nt-%$%%>Ubfzy;x=?ooLzQ!n;lTCQ{SeYTWjSe6XnOy6% zAeZ5R$;*nRk!ziLr{4TvY0teuSIS>)^ts^xbDw8DQ;FIAD@|}1vIR#+a@e^Z7Pesmkty@#!GBs-%%bEGWE9!Y#!YMZ*Mkg za-NzUc@z#`y6bN*=50(37pU2Ji`kH63DaqG!T^=GNG`c_9u`UF{X+7F57V4{CN{)olFHGd^RiGKhd_+t@47vB{vtx`prqMGN{J3Jg z)^4xA983N2(~PHSQ)#qEUX7o^k{1vHj?yAv5WB$rZgG}t`ypVx&B-BqxBw$KQg;WH z{Qw9Rcaf3Slag7x-nwXIl8-@x-0F?NQ(d)jb0-a!R@reRvgXT&tAmFbp)6NZ7oO74 ztlHg6!+yk4?>`)wgtLw!HzS^w3jATR8hEIf<(+rgLPVEb{I(iv*{DLqMmI5NZHMyHW_(D3Zr zvvG?j6ge8&!dJg{bH6}y`}(12#gEUwJ@AxlL(JXxq+=D%xMBck-8zX2^@v1=NlUI^ zL-6VKp0A_XX8u{9nWBhNSV_tN>+$A>B{bjW}V1zFFQIUX`sh zR#Q!AhKz~t(MZYg2~z%eIuHNCPC@Q3Ok_WMDOi$`&AlZXhlfI_q4ul(6&(aIZRa8r zr}P*|I^J+)5k?yK#m*L$mIdxr@T65I#4jET@0;f+cg8D5GBeY%MKvo2B+n!=nmfwF zDWPW5VZ;d-0Tre}=Re*N5EYx3^(bQjsx`%hr0S3|6OWhY z;NbkM%A--(>!eR@AA^zBkH6nE=PsMVpu}hZdgqLZSrqoVgjyDJ|0c)BPT!f>U?kIVW29wjc0H3~ohY}#S z47_?c6;VWq7>|xsDykW_(8;%-l#oX~@7g05t9__q?cT$2MJ@woc9Dq4C+g1BaT{|l zL)69623t(H%%|(^HDTW!DV2^H|2X;Q1d}nk7>OT*37@Gpr17zJWGwe5$GJd-$!{;g zN+xenAEWCr)=J>SKb+4Qa8)Ie15?w^V~7FDV9sx##!>8$GjR-;zk%bJMTsK0%+)ExVR&slwy=QO6AuNz+w_r>AGBxiJ0EcIr zOXpZn(hMU($&=vdQkg^rO`{l!#6RWR0-TfM+ns1U0;&PN_B&52kI&D~Z@$-$3Nama z8`w$l-VhE02YjK)=H+aW!r0ZBNhaW=0tF(BA_7Qhxv}eF5zY@f3gjn|qPtJS{!N9y z+^u`W+8r_@S}0n?2;soNitAmk7$T&@X=9?pbsg`N8|*febw zZ2@+cec=(obYUT=lQ8a4>@x9i29>JlFLBwVCYINa5|tonHy7&mj8=;ZRgF$ldTw;q zd?h$l(*4@xgMFSEze6jekV_;ij5|1AMvMI~=9YvPpqGU^ZvXCz8vY^OhPLk$UlyF? zZZx81Z=0&NlEEHE!pemIft8MtBN<_Ct}yemZRZzn2Y%j`ZN#8VM{?waWG62xUtCjP z*L?f)PKL)_%3~2ngOh%^A{jWweKor* z_z1rw8?t{d`)E+itid4cja;daC@dgGnTSd)AVvam@BW{(!Ot)N1l@XCnVdFd26At` zhAqtsx1PIueNsxoJ$&1V0$BtMSs1LT$n8E1D?l(O7oXf|B-h3#J2Hk;#PtH1$w<)V zD9{i%IJi|#3tIi>Mcfz{)Z!eq* z@q6m?PdEH~3iLliR3st*laP`Tp;J5}W4>TO-_3W^`@aGN0ixmaq}c@i`}?dryp9}n z2Wro^8RyYLLwE|S6VUdxO{^belLl`~ecTTk`ln!zJAM3qtIbxHoaDhXkS z@JCB%=b9$-!8qk?&{R}Ha;I;hx}B<8xbrJ+4tx!6(6d2qKo0_Dqb&jjtWGmATh!~> zk(VrKVoPiY^LE%vI-VMmzaS__iGTo|bI4u&bkeYS9J9Zxtchp=A6l3f4^yIcp@&&QC7O9BW$$UL ztBAR>5Q4j_*5V#2DZT)@8r@Y=w1jKja!B7hK@YRDTFIG967N4VIIOF$P}&kW$DC^; zUjTlynaq|4?B0VdiA5C_oQ=^05-4<(5GA3095ms57_BT0Z&rvRj*Whs=c=3_M3Jug z5P5K|L0X2oBrpv)$M6(mVl5s$KM_={6Peib%ei0y$wX#Po_kF@*@q*gl76bhwA)po z&~rAfV3_B9!c>1O?wKlfq3E*nz)>F2|I;)(iU29a8! z@&-OFZDsmik)%8vy~1b=ul?f^b(I=Wf1>nb?RQl=J{!$eST!#{Lo$B?j z_{h}Y1$wvFO!~!QK2xM#a0sXE2=L55fNn|JTZx;VfY+Xrj=BMXcP=<$qW;c zc$qi>7$Rt{jX;k+tNXT;8v{!qLO@pC7XS(mW&H_+z6cx&m?#o|faFD?P810VRQLfE zYSe@nJdKx9m9%GxL^OWlre68qHsv#t@YZB6#g0eZ7YT|=3?IhN+;SHN2Fvrd**Fgp6n1yvt9UL7 z$xVkp0r`6wNS_(gB4zPdY9~COw9-xBDYQvfgM)J@{|}KMk*Gotv=SPomih~3%JK*U zkA-!zI2nyGsTwxnF|nau%Om@o&JVaih&;(Y;vgx1P*B0F5>#L_wJ6Ll0I%UwN!P(M zz&kiVdU#?beyvc1)7Q%ygGuW}Qk$`r;aHA(2NshHG9sjJKP&v~g?T{3VgwRNP#Brz z17gUBWL$^yFc}*g1u{2SK^~I@z10yeE>n;DjwOkRP63%YoDc-g4QN$)tIZacA@`1d z4hX3Rvh`AyTLKK)5~iON*Q`Y`NGygnOiz%_YM(FVMzT zBZNgnkc8m`<%@AFELIGPj1rey5n5Dm)b(jAV0y@IJ@QKgdU!~U%nf)4TSZCoKSf!F z&>GmkHB4@B96+*4kYX7IqJY7zVu|%DF%zMW1@4l%On6QH&iP}cqK}z>C^amjGs=kF zs?H9D9LzjGRw60eA>@KdBGax(ISF#E`~ktC>Hp@_WC~-5bp9ylrA{{)1o-1l%Fbf; z6K*Fpm3108;mAaHr&M=t+~Q#8-D;T>~E*@(SQ5xls zUmVyN0OakqNgw2uM(s0wdZs zNYR}Xu1@Y>bD)RG!!gv_uq!b*>`pX};+d<4FS)Bg%-0sm+W5t08D8va*`_#fG! z;C~E2xT{e=H~f`$7BL3Iaefq<#Yc{@-F&I>PUb@3jC|_pb$+;Q;_3zlDoX z!^Ynm(zYsAhROf{TrBcJ_ip6(jv8jsFL`5s0C3~Cyl4m69{}*NN9#230RTe+KTyYc zzkJ^#(e(QZFfa=MNP22R&Jum^0L<-w{bK+COy~dD?;n8#{3DvAM*3Dkf_!Hy|LBJQ zO<2AK$KQglf0SPJ@%eo>jB|o}w}goQ5vu$n@vF@#j$dptRgQD>VyNnn}gnI))vrUXLXc0Kb=YUOx1sXn(bcbbds z)R?+gn47Y^zSXA)dS=p(b;?V?On0yuuGORXslt&9zg%r&6X~$f+2br7N1D0rS%gGs zv0oD!OVBsjUkq0tibUF0M+A1G#ZG$xGpHlQMlS;|ZXU3R==cGdfEQjsSf{%O|IgQH59^D7AGI5$Y^~)TLF}DHQ&oRK1Xl521t9qZ8;*yj!aW@-V>krg78mCt(YiC2OOX7KQSTM5{!+N$1; zWI?xM0uCUbgzVUURd?uEhW|8pOHi?WD$iOYp!f*|+J%TCceBAs1yQnf!q?eURMO+u z@Y6}`3g#NRj5yfHUxw~pR`bP>IAyJF8ousj zkZ9O2jV0U`-Jm~dHZ+*8QO#5pnc7$}Y><{c<6J zl7xYJT2cT=Wzgu~jdO+5RAA;B^i{r)xQU7(A^>o80E8g$a=|8IDofGd^c7#?EU{Vg z!GLf(oBX8+jK<52=nB{KAggG6Z85Tr^NX3QItuP-+umnG_Ng8p7QS|F#StdHpKsTc z$;7(g=%hqVIab_rb(<7i6Cas#I1bLIgCLM_)SH>wTk?tci!e&?%YW>+Rh0*?JzmQC zi3N7v!0$}>uQwLJh?RyrY|me_&m7rIBxh`PirA@N2suBSQ}SI&gk)g539}6C(oGw+tIIMc1AfM4Yx7*jiVb*{wZf6Vuas zT(_w=S1~&ovDCrp>l)ch@`Vul({%f-8EsI+21?GJ^b z6Z|!?-4xkKiB;1M*1eiJk*{y8B-oPhwST9rkYRDG4W1IU0fOSDJ;&xIo5t~)GuW-{ zc=bNzCDdA}@C#R7HiCmmn_2qnn4$2IP)cu&GbT3!8^a$Qr#{Oe`Y6#Z3rJNP#W+6$ z8N4T1?wiHHf#qe7CA{paA^Sxo?YskS%cabLevjoG`hHM>P_~7IGBccXYXQj(q&xfm z5f1JfLHSJNR+6g2-XIphBh6DJ)PWxuXl=$H@nPDCW;ZV;*L-a882VcdFr3PED)FAw zFJ$AoeCGfAHpLP$(~kQEXnGB~_tWQIF3Dm)PL3KTA@Jl6cSf816(2eH5n^q< z1&QKMC;L(;+QwW%@nZptqZG^=lL3~i55>c^$w(PJQJx|uQ+!C!rKb9F!pqe-Gkrzl zsJdJ43|!@hhRpu!b)`61Sl8+?+jsT7=bvq|axI-qn0Z-svZ5f3jo!%+z{fI$Q(|xG z@Nsr2i9MoTRJH#0dG40j_}1Gg-I%b<(pRf>9E-+es=$rE$OCIPxKqmORvFJnmun*i z0Dj|H;b?p53{7-fJkE-#TEG|USOguiT5;85OpfG^=@3)u{OW;Q| z2e(?_srG=M&74R%;lsd9&pCc>HI{kgj$&plFTGL_v7T!uiQf`i-hZ~O7 zn@ei_isndoY5c&TVM3e<@t2DyTn4@R8DSZSwM5r2^lZu4lCeB$B0ITAXg*BW`6mOk zlxJjq5m9&NvOb2Px` z_V&`Vu(puzQ$GUgGe*CsqW#>8^Sk}sJ=-m*o5;AmU=_XpfC!F;wQRdBH7ErOTg(GQ zZYqgH-4zUd1WHPKQQ#j2Y`)tei$V>IksL)#^7Mf?zV4%j4rV;xP!FZ2_mWouDP+Fd z!EG)@{?tQ>Or&_=DjMk8!E>0N&a}eOyX_Hy43Ys2948qEOQxI;*7-_leCGGVp&Cmr zowmQoE*N}qP_q9~l3eI?Xr3O}997bB#QdOugv5$o#q1ur?s#ytK4sbXURL8Su3s>K zmiAW)SpX%OQEo`R=d%q*Y|zUZrHl>&ZB;&Vzva*v&yZpxW7oS|A+-!di$O>RDoaaf(-LYZwoXrFZ~^^@044Lr>u;yH)c^HIftBRu^GUtC+Y4AmL&!rcx` zfC(J%*IJIt6Px8zG_l~u+qst_TZ!gaslYON*zu#*^51poGPZ#ireG>M+hA#y3LM5? zb3mBV(hAus;QKgJ#TkJ|b6>uXU{!D{)o{k&WFE0O6? z;dr&+7}U>CD4H%()tpndHQ|K79-1nLC8}5QZ>6NZS&KNoLOKZZ7>lPuTozcLRdgrS;y=;GFfFq=}dE97RBYbgR@u34g)YUhjkeHHjj z7ls%)Bk`zac&(Nsy)N6{FN=`v6>=@^rLPrc_!buMUCx?GsakI*!drH3CNqD`;EZ%T z^S|G&^rHSDfA2k#KFWQezpi~qujD%TsM+4R1O;mS0>FH;#CHqyy9fGB5IY9xNnL3Tozkd%}em9DLSGG=DWnXRD_(cSCR`V8^DC>fGy9Isethc`pP zNt_axP6@ZXW!06BxC<_h6Qob)_Ip&U{1Y;*)6j7 zipIGzMW_uZx=jfh99KLRJ>(?qL2}j`!M{17Q>i3-h4l778cN%xrpjim*4ISeert{=Qr-gO5B)_$B<&J9bG{^Aj=<5 z*;WuSj*7g~KvQz3Hjou`JJ1|6)yjRYhMg#&7Z^P=yBI;QTkV#p7z3N*b zbzWE&?VQlt1yiOMT1QqQ*8GJ3{jR>w$0>Q4$A6T|m4*u5y&V~FO+U#6!j;m1bgMlL zY##D_{bK}hxXYD^UGSKb0ejrCya^+#g#Z8XzfoJKev|5)=m zCHM=V_WZMU*zsj$^qClM&Sf!L&>+>7SVFY8E4GX_yz+5w*g3Qa0b@uhYGMFJDtBJV z4)|P}E(cMQq8ySw+Ye{64aa`ixHw@3wDBFjBMU*;kbNQPaTv&umMVT;sd%bZ3i006 z>AS&_HCvfB+HRFhlMsrvkZX-U6DNx;Op@i_J4VYLmxeAa;?$^<)X*4JCqYoKMj?gjo@6IbVFNXC<2wV z5=}F;Y4cH3!WqZG78RV{h}Qf~LF`im=X^_eeqpP=+C^{xmS!0sCU}byM?|UH{F_-T zzkPt{3t+~wiVJG3CuG|P&L1Hj*a_F4iyKRNz~M_}2f2`VAXV+1GR9NN4bUkX*NPDG zfYb2S*FMPM2R(xvXs*O^^S4S-oB|QxOHEr6#u{y%_9zn~X9eG1cDLWj*d?s$aV}X7 zsyQzV04X^Va|gP82rYa?zzBB3gBh5Bxc^)2o|VkwSw7X5=iv=P2|6Vyibx`$NNqk` zGt$Xak9`p&Dnz$Eknu~Z&5{&>Z;EjN*yLBKQL{4ANpT81I9vcZopfEM-0e!iV4%995UzmaTq{9Mb(eRnFOY&0VPqObp1IbymnxA!Wnv2 zp5jEwLPl7jeCHHm0xfc#g&)D`pDkw@ot|epDLcOaoF}jCAS`PI@QVjBxQ0FNNswIg zoZ3ZXfndOF3qYE3m{3r(3{CvplKC>%HGSzH6Q+4U4Tt6&Erf0XS83mKm%;S#-M`VO zhpSq~>jTp4JmfHWEv z!PiPy;91r!wL;}0Vb1`kSR(NK^+NN^^jx&#AuL3bo)R-onkbPvFchA)Is~om;<#g- z`d=_AT%FmcWItJS@W48X99C8hq#n5dszAj7wFz^#HQU|PbMBM-o5B88fl+RGqWDX* z(;$}zh15g(4uVxo*t%eL*@p7QTk-8NX=ASe!7=g2tQxHMJej_~-RIs;dT6DXbLhHQ zv!_}ez0JMpW!)6<+3kLSWF|%w1z^ZE3FgzK-RN_>0qo6356sl772A~@v@b}&#MV@u zXr7ri1cm2nyblaYi463>f`H=)4^>q2q1;e!fV*YrLJ^&gM_=H{(J{Oa+1|~>`vSm} z#Q23lenZ$wpaPQ-(qsETP8Z%){Wi6rOqbbag_~mPoW~cza=`-3vHyqr0L7`F4x| z=1suVd}8dBD#2^NX<~5l&mDF|Gej%#-*HVmh}lUv-_{7e2J;US9A$%JV$w$~K2s8p Jcoq0s`#|+BiAmEOk<|DZ|VhX|QCOp{1as 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 - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/.config/awesome/widgets/brightness/init.lua b/.config/awesome/widgets/brightness/init.lua deleted file mode 100644 index d1e4d64..0000000 --- a/.config/awesome/widgets/brightness/init.lua +++ /dev/null @@ -1,190 +0,0 @@ -------------------------------------------------- --- Brightness Widget for Awesome Window Manager --- Shows the brightness level of the laptop display --- More details could be found here: --- https://github.com/streetturtle/awesome-wm-widgets/tree/master/brightness-widget - --- @author Pavel Makhov --- @copyright 2021 Pavel Makhov -------------------------------------------------- - -local awful = require('awful') -local beautiful = require('beautiful') -local wibox = require('wibox') -local gears = require('gears') -local watch = require('awful.widget.watch') -local spawn = require('awful.spawn') -local naughty = require('naughty') - -local ICON_DIR = gears.filesystem.get_configuration_dir() .. 'widgets/brightness/' -local get_brightness_cmd -local set_brightness_cmd -local inc_brightness_cmd -local dec_brightness_cmd - -local brightness_widget = {} - -local function show_warning(message) - naughty.notify({ - preset = naughty.config.presets.critical, - title = 'Brightness Widget', - text = message, - }) -end - -local function worker(user_args) - local args = user_args or {} - - local type = args.type or 'arc' -- arc or icon_and_text - local path_to_icon = args.path_to_icon or ICON_DIR .. 'brightness.svg' - local font = args.font or beautiful.font or 'Ubuntu Medium 11' - local timeout = args.timeout or 100 - - local program = args.program or 'brightnessctl' - local step = args.step or 10 - local base = args.base or 20 - local current_level = 0 -- current brightness value - local tooltip = args.tooltip or false - if program == 'brightnessctl' then - get_brightness_cmd = 'brightnessctl g' - set_brightness_cmd = 'brightnessctl s ' -- - inc_brightness_cmd = 'brightnessctl s +' .. step - dec_brightness_cmd = 'brightnessctl s ' .. step .. '-' - elseif program == 'xbacklight' then - get_brightness_cmd = 'xbacklight' - set_brightness_cmd = 'xbacklight -set ' -- - inc_brightness_cmd = 'xbacklight -inc ' .. step - dec_brightness_cmd = 'xbacklight -dec ' .. step - else - show_warning(program .. ' command is not supported by the widget') - return - end - - if type == 'icon_and_text' then - brightness_widget.widget = wibox.widget({ - { - { - image = path_to_icon, - resize = false, - widget = wibox.widget.imagebox, - }, - valigh = 'center', - layout = wibox.container.place, - }, - { - id = 'txt', - font = font, - widget = wibox.widget.textbox, - }, - spacing = 4, - layout = wibox.layout.fixed.horizontal, - set_value = function(self, level) - self:get_children_by_id('txt')[1]:set_text(level .. '%') - end, - }) - elseif type == 'arc' then - brightness_widget.widget = wibox.widget({ - { - { - image = path_to_icon, - resize = true, - widget = wibox.widget.imagebox, - }, - valigh = 'center', - layout = wibox.container.place, - }, - max_value = 100, - thickness = 2, - start_angle = 4.71238898, -- 2pi*3/4 - forced_height = 18, - forced_width = 18, - paddings = 2, - widget = wibox.container.arcchart, - set_value = function(self, level) - self:set_value(level) - end, - }) - else - show_warning(type .. ' type is not supported by the widget') - return - end - - local update_widget = function(widget, stdout, _, _, _) - local brightness_level = tonumber(string.format('%.0f', stdout)) - current_level = brightness_level - widget:set_value(brightness_level) - end - - function brightness_widget:set(value) - current_level = value - spawn.easy_async(set_brightness_cmd .. value, function() - spawn.easy_async(get_brightness_cmd, function(out) - update_widget(brightness_widget.widget, out) - end) - end) - end - local old_level = 0 - function brightness_widget:toggle() - if old_level < 0.1 then - -- avoid toggling between '0' and 'almost 0' - old_level = 1 - end - if current_level < 0.1 then - -- restore previous level - current_level = old_level - else - -- save current brightness for later - old_level = current_level - current_level = 0 - end - brightness_widget:set(current_level) - end - function brightness_widget:inc() - spawn.easy_async(inc_brightness_cmd, function() - spawn.easy_async(get_brightness_cmd, function(out) - update_widget(brightness_widget.widget, out) - end) - end) - end - function brightness_widget:dec() - spawn.easy_async(dec_brightness_cmd, function() - spawn.easy_async(get_brightness_cmd, function(out) - update_widget(brightness_widget.widget, out) - end) - end) - end - - brightness_widget.widget:buttons(awful.util.table.join( - awful.button({}, 1, function() - brightness_widget:set(base) - end), - awful.button({}, 3, function() - brightness_widget:toggle() - end), - awful.button({}, 4, function() - brightness_widget:inc() - end), - awful.button({}, 5, function() - brightness_widget:dec() - end) - )) - - watch(get_brightness_cmd, timeout, update_widget, brightness_widget.widget) - - if tooltip then - awful.tooltip({ - objects = { brightness_widget.widget }, - timer_function = function() - return current_level .. ' %' - end, - }) - end - - return brightness_widget.widget -end - -return setmetatable(brightness_widget, { - __call = function(_, ...) - return worker(...) - end, -}) diff --git a/.config/awesome/widgets/calendar/README.md b/.config/awesome/widgets/calendar/README.md deleted file mode 100644 index b663a18..0000000 --- a/.config/awesome/widgets/calendar/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# Calendar Widget - -Calendar widget for Awesome WM - slightly improved version of the `wibox.widget.calendar`. - -## Features - - -### Customization - -| Name | Default | Description | -|---|---|---| -| theme | `naughty` | The theme to use | -| placement | `top` | The position of the popup | -| radius | 8 | The popup radius | -| start_sunday | false | Start the week on Sunday | - - - themes: - - | Name | Screenshot | - |---|---| - | nord | ![nord_theme](./nord.png) | - | outrun | ![outrun_theme](./outrun.png) | - | light | ![outrun_theme](./light.png) | - | dark | ![outrun_theme](./dark.png) | - | naughty (default) | from local theme | - - - setup widget placement - - top center - in case you clock is centered: - - ![calendar_top](./calendar_top.png) - - top right - for default awesome config: - - ![calendar_top_right](./calendar_top_right.png) - - bottom right - in case your wibar at the bottom: - - ![calendar_bottom_right](./calendar_bottom_right.png) - - - setup first day of week - - By setting `start_sunday` to true: - ![calendar_start_sunday](./calendar_start_sunday.png) - - - mouse support: - move to the next and previous month. Using mouse buttons or scroll wheel. - - You can configure this by specifying the button to move to next/previous. - Usually these are configured as follows. If you want to use other mouse buttons, you can find their number using `xev`. - - | number | button | - |--------|---------------| - | 4 | scroll up | - | 5 | scroll down | - | 1 | left click | - | 2 | right click | - | 3 | middles click | - - By default `previous_month_button` is 5, `next_month_button` is 4. - - -## How to use - -This widget needs an 'anchor' - another widget which triggers visibility of the calendar. Default `mytextclock` is the perfect candidate! -Just after mytextclock is instantiated, create the widget and add the mouse listener to it. - -```lua -local calendar_widget = require("awesome-wm-widgets.calendar-widget.calendar") --- ... --- Create a textclock widget -mytextclock = wibox.widget.textclock() --- default -local cw = calendar_widget() --- or customized -local cw = calendar_widget({ - theme = 'outrun', - placement = 'bottom_right', - start_sunday = true, - radius = 8, --- with customized next/previous (see table above) - previous_month_button = 1, - next_month_button = 3, -}) -mytextclock:connect_signal("button::press", - function(_, _, _, button) - if button == 1 then cw.toggle() end - end) -``` diff --git a/.config/awesome/widgets/calendar/calendar_bottom_right.png b/.config/awesome/widgets/calendar/calendar_bottom_right.png deleted file mode 100644 index 2bc2e8279b158f6c5a5bc9562093dfae3e5a42b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84358 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 z 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 AVgLXD diff --git a/.config/awesome/widgets/calendar/calendar_start_sunday.png b/.config/awesome/widgets/calendar/calendar_start_sunday.png deleted file mode 100644 index 126a2186db090ebec080436a85d216fbd4b02d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8410 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 P{{n!NG!(1k%|rhK^XXPz diff --git a/.config/awesome/widgets/calendar/calendar_top.png b/.config/awesome/widgets/calendar/calendar_top.png deleted file mode 100644 index 3e6b66b860f1f3cac7c67d1f575bd2082a5cedb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65350 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

  • ~78D(&r91Bos@|Gs66=r5Me|7ta>s{Tf)u=Ud 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ξJswOHxWp$gDJ!nAi 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

    $0
    ", + " )", + "}", + "", + "export default ${1}" + ], + "description": "Creates a React Client Component" + }, + "reactFunctionalComponent": { + "prefix": "rfc", + "body": [ + "const ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}} = () => {", + " return (", + "
    $0
    ", + " )", + "}", + "", + "export default ${1}" + ], + "description": "Creates a React Functional Component with ES7 module system" + }, + "reactFunctionalLayoutComponent": { + "prefix": "rlc", + "body": [ + "const ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}}Layout = ({children}) => {", + " return (", + "
    $0", + " \t{children}", + "
    ", + " )", + "}", + "", + "export default ${1}Layout" + ], + "description": "Creates a React Layout Functional Component with ES7 module system" + }, + "reactNativeFC": { + "prefix": "rnf", + "body": [ + "import { View } from 'react-native';", + "", + "const ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}} = () => {", + " return $0", + "}", + "", + "export default ${1};" + ], + "description": "Create React Native Functional Component" + }, + "reactNativeFCWithStyles": { + "prefix": "rnfs", + "body": [ + "import { View, StyleSheet } from 'react-native';", + "", + "const ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}} = () => {", + " return $0", + "}", + "", + "const styles = StyleSheet.create({$2})", + "", + "export default ${1};" + ], + "description": "Create React Native Functional Component(with styles)" + }, + "jsx elements ternary": { + "prefix": "jc", + "body": "{${1:true} ?
    $0
    : ${2:null}}", + "description": "ternary jsx elements" + }, + "jsx elements ternaryNative": { + "prefix": "jcn", + "body": "{${1:true} ? $0 : ${2:null}}", + "description": "ternary jsx elements" + } +} diff --git a/.config/nvim-astro/snippets/lua.json b/.config/nvim-astro/snippets/lua.json new file mode 100644 index 0000000..6783c20 --- /dev/null +++ b/.config/nvim-astro/snippets/lua.json @@ -0,0 +1,73 @@ +{ + "localRequire": { + "prefix": ["preq", "lpca"], + "body": [ + "local ok_${1/.*\\.(.*)|.*/$1/}, ${1/.*\\.(.*)|.*/$1/} = pcall(require, '${1:module}')" + ], + "description": "Pcall require" + }, + "localRequireWithIf": { + "prefix": ["preqi", "lpcai"], + "body": [ + "local ok_${1}, ${1/.*\\.(.*)|.*/$1/} = pcall(require, '${1:module}')", + "if ok_${1} then\n\t${2:return}\nend" + ], + "description": "Pcall require(with if)" + }, + "mod": { + "prefix": ["mod", "plug"], + "body": ["---@type LazySpec", "return {", "\t'$1',", "\topts = {}", "}"], + "description": "Create a lazy plugin spec" + }, + "modConfig": { + "prefix": ["modc", "plugc"], + "body": [ + "---@type LazySpec", + "return {", + "\t'$1',", + "\tconfig = function()\n$0\n\tend", + "}" + ], + "description": "Create a lazy plugin spec - config" + }, + "autocmd (Filetype)": { + "prefix": "autocmd (Filetype)", + "body": [ + "vim.api.nvim_create_autocmd('FileType', {", + "\t-- desc = '',", + "\t-- group = '',", + "\tpattern = { '${1:ft}' },", + "\tcallback = function()", + "\t\t$0", + "\tend,", + "})" + ], + "description": "Create an autocmd for FileType" + }, + "autocmd (any)": { + "prefix": "autocmd (any)", + "body": [ + "vim.api.nvim_create_autocmd('$1', {", + "\t-- desc = '',", + "\t-- group = '',", + "\tpattern = { '${2:event}' },", + "\tcallback = function()", + "\t\t$0", + "\tend,", + "})" + ], + "description": "Create an autocmd for FileType" + }, + "augroup": { + "prefix": "augroup", + "body": [ + "local ${1:augroup} = vim.api.nvim_create_augroup('sp_${1}', {})$0" + ], + "description": "Create an augroup" + }, + "executable": { + "prefix": "exe", + "body": ["vim.fn.executable('${1:cmd}') == 1"], + "description": "Check if a command is executable" + } +} diff --git a/.config/nvim-astro/snippets/package.json b/.config/nvim-astro/snippets/package.json new file mode 100644 index 0000000..32eedad --- /dev/null +++ b/.config/nvim-astro/snippets/package.json @@ -0,0 +1,29 @@ +{ + "contributes": { + "snippets": [ + { + "language": [ + "lua" + ], + "path": "./lua.json" + }, + { + "language": [ + "javascriptreact", + "typescriptreact" + ], + "path": "./javascriptreact.json" + }, + { + "language": [ + "typescriptreact" + ], + "path": "./typescriptreact.json" + } + ] + }, + "engines": { + "vscode": "^1.11.0" + }, + "name": "my-snippets" +} diff --git a/.config/nvim-astro/snippets/typescriptreact.json b/.config/nvim-astro/snippets/typescriptreact.json new file mode 100644 index 0000000..8ff3d7d --- /dev/null +++ b/.config/nvim-astro/snippets/typescriptreact.json @@ -0,0 +1,91 @@ +{ + "typescriptReactFunctionalComponent": { + "prefix": "tfc", + "body": [ + "import { FunctionComponent } from 'react'", + "", + "type ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}}Props = {}", + "", + "const ${1}:FunctionComponent<${1}Props> = ({$2}) => {", + " return (", + "
    $0
    ", + " )", + "}", + "", + "export default ${1}" + ], + "description": "Creates a React Functional Component with TypeScript interface" + }, + "typescriptReactFunctionalLayoutComponent": { + "prefix": "tlc", + "body": [ + "import { FunctionComponent, ReactNode } from 'react'", + "", + "type ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}}LayoutProps = {\n\tchildren: ReactNode\n}", + "", + "const ${1}Layout:FunctionComponent<${1}LayoutProps> = ({children}) => {", + " return (", + "
    $0", + " \t{children}", + "
    ", + " )", + "}", + "", + "export default ${1}Layout" + ], + "description": "Creates a React Layout Functional Component with TypeScript interface" + }, + "typescriptReactClientComponent": { + "prefix": "tnc", + "body": [ + "\"use client\";", + "", + "import { FunctionComponent } from 'react'", + "", + "type ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}}Props = {}", + "", + "const ${1}:FunctionComponent<${1}Props> = ({$2}) => {", + " return (", + "
    $0
    ", + " )", + "}", + "", + "export default ${1}" + ], + "description": "Creates a React Client Component with TypeScript interface" + }, + "typescriptReactNativeFC": { + "prefix": "tnf", + "body": [ + "import { FunctionComponent } from 'react'", + "import { View } from 'react-native';", + "", + "type ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}}Props = {}", + "", + "const ${1}: FunctionComponent<${1}Props> = () => {", + " return $0", + "}", + "", + "export default ${1};" + ], + "description": "Create React Native Functional Component" + }, + "typescriptReactNativeFCWithStyles": { + "prefix": "tnfs", + "body": [ + "import { FunctionComponent } from 'react'", + "import { View, StyleSheet } from 'react-native';", + "", + "type ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}}Props = {}", + "", + "const ${1}: FunctionComponent<${1}Props> = () => {", + " return $0", + "}", + "", + "const styles = StyleSheet.create({$2})", + "", + "export default ${1};" + ], + "description": "Create React Native Functional Component(with styles)" + } +} diff --git a/.config/nvim-lazy/lazy-lock.json b/.config/nvim-lazy/lazy-lock.json index a12247c..38292e6 100644 --- a/.config/nvim-lazy/lazy-lock.json +++ b/.config/nvim-lazy/lazy-lock.json @@ -1,98 +1,100 @@ { - "LazyDo": { "branch": "main", "commit": "71c3c06f42c24e69df6c6d253cd3febbcbc87b81" }, - "LazyVim": { "branch": "main", "commit": "d1529f650fdd89cb620258bdeca5ed7b558420c7" }, + "LazyVim": { "branch": "main", "commit": "eb8ddea8c9438c34e71db097eb77a44185dd1093" }, "LuaSnip": { "branch": "master", "commit": "c9b9a22904c97d0eb69ccb9bab76037838326817" }, - "NeoTerm.lua": { "branch": "main", "commit": "f71a4a9663c52673a677a09894d945983c8da303" }, - "SchemaStore.nvim": { "branch": "main", "commit": "b992bb1821fabb11db7fea4ecc7f769b11678cb2" }, + "SchemaStore.nvim": { "branch": "main", "commit": "b265e7b68308c9b68581d57c3f79419ce5e8dca2" }, "age.nvim": { "branch": "main", "commit": "f1793e14123a7c5374a3744aacab9c283014fa1d" }, - "auto-session": { "branch": "main", "commit": "021b64ed7d4ac68a37be3ad28d8e1cba5bec582c" }, - "avante.nvim": { "branch": "main", "commit": "ba9f014b7563760ed217ad665a6f45c051f119d7" }, - "blink-ripgrep.nvim": { "branch": "main", "commit": "0a57ef0b41d0071daf820d8285bbdb45ae722325" }, - "blink.cmp": { "branch": "main", "commit": "1cc3b1a908fbcfd15451c4772759549724f38524" }, - "bufferline.nvim": { "branch": "main", "commit": "17083c826a004bcb87d3a830c7710d0796a73bbf" }, + "auto-session": { "branch": "main", "commit": "82630e2f70be140f8dcc75a12e2ee2839e8488c2" }, + "avante.nvim": { "branch": "main", "commit": "12cf3c041821652a5590c6baa361999a28190f03" }, + "blink-ripgrep.nvim": { "branch": "main", "commit": "519ac7894113f6a7b517b157c26e31fbd58a0de5" }, + "blink.cmp": { "branch": "main", "commit": "b6f11a0aa33e601c469a126e3ed6e35208fe3ea3" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, "bullets.vim": { "branch": "master", "commit": "2253f970e54320dbd76fd6bb4f5a0bf2436ce232" }, - "catppuccin": { "branch": "main", "commit": "f67b886d65a029f12ffa298701fb8f1efd89295d" }, - "clangd_extensions.nvim": { "branch": "main", "commit": "8f7b72100883e0e34400d9518d40a03f21e4d0a6" }, - "codecompanion.nvim": { "branch": "main", "commit": "2876b20e4f6cfbe8b032788e764f1557c4bd7568" }, - "conform.nvim": { "branch": "master", "commit": "70019124aa4f2e6838be9fbd2007f6d13b27a96d" }, + "catppuccin": { "branch": "main", "commit": "4965db2d6155c25db4e8417465fc2703fdf4c2b7" }, + "clangd_extensions.nvim": { "branch": "main", "commit": "db28f29be928d18cbfb86fbfb9f83f584f658feb" }, + "codecompanion.nvim": { "branch": "main", "commit": "e54ec7499513055077ce20f81d95de7ae60f2537" }, + "conform.nvim": { "branch": "master", "commit": "363243c03102a531a8203311d4f2ae704c620d9b" }, "copilot.lua": { "branch": "master", "commit": "886ee73b6d464b2b3e3e6a7ff55ce87feac423a9" }, "crates.nvim": { "branch": "main", "commit": "bd35b13e94a292ee6e32c351e05ca2202dc9f070" }, - "dial.nvim": { "branch": "master", "commit": "46b4375e84e8eb771129bff6b2b1e47746601ef9" }, + "dial.nvim": { "branch": "master", "commit": "34bbd9c387c358190e61ce71017faad3dffa7a74" }, "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, "dooing": { "branch": "main", "commit": "3c7cba4fa85c50c1719728e782c6de57a2d742ed" }, - "dressing.nvim": { "branch": "master", "commit": "3a45525bb182730fe462325c99395529308f431e" }, - "flash.nvim": { "branch": "main", "commit": "34c7be146a91fec3555c33fe89c7d643f6ef5cf1" }, + "dressing.nvim": { "branch": "master", "commit": "56ef6a969a4990d938c5fed40c370f65e125fc97" }, + "flash.nvim": { "branch": "main", "commit": "f899265876ecdcf7352dbc9f0adf87068cedefbb" }, "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" }, - "fzf-lua": { "branch": "main", "commit": "8efb28fd24e9d55694460d0ac8fa147d7276d984" }, + "fzf-lua": { "branch": "main", "commit": "aaf7604bca38890cb487b29738f8cb02586bc818" }, "git-conflict.nvim": { "branch": "main", "commit": "4bbfdd92d547d2862a75b4e80afaf30e73f7bbb4" }, - "gitsigns.nvim": { "branch": "main", "commit": "abcd00a7d5bc1a9470cb21b023c575acade3e4db" }, + "gitpad.nvim": { "branch": "main", "commit": "1e0f6fa335c72c05d1d3635120c572e198e5ae0d" }, + "gitsigns.nvim": { "branch": "main", "commit": "fc56fc25cfc3dc3f24266508aa4a7096102eb6a6" }, "grapple.nvim": { "branch": "main", "commit": "b41ddfc1c39f87f3d1799b99c2f0f1daa524c5f7" }, - "grug-far.nvim": { "branch": "main", "commit": "8e8f3429038d45a6d4144c0642d92f470e5480f3" }, + "grug-far.nvim": { "branch": "main", "commit": "3a8690461afac34c0e5bacb0f7b4bc3066aab665" }, "gx.nvim": { "branch": "main", "commit": "c7e6a0ace694a098a5248d92a866c290bd2da1cc" }, - "img-clip.nvim": { "branch": "main", "commit": "5ff183655ad98b5fc50c55c66540375bbd62438c" }, + "img-clip.nvim": { "branch": "main", "commit": "5ded6f468d633ccfb315905fe8901d6c95ae8f29" }, "lazy.nvim": { "branch": "main", "commit": "7e6c863bc7563efbdd757a310d17ebc95166cef3" }, - "lazydev.nvim": { "branch": "main", "commit": "8620f82ee3f59ff2187647167b6b47387a13a018" }, + "lazydev.nvim": { "branch": "main", "commit": "a1b78b2ac6f978c72e76ea90ae92a94edf380cfc" }, "lualine.nvim": { "branch": "master", "commit": "2a5bae925481f999263d6f5ed8361baef8df4f83" }, "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "97d9f1d3ad205dece6bcafd1d71cf1507608f3c7" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "f75e877f5266e87523eb5a18fcde2081820d087b" }, "mason-nvim-dap.nvim": { "branch": "main", "commit": "8b9363d83b5d779813cdd2819b8308651cec2a09" }, "mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, - "mini.ai": { "branch": "main", "commit": "ebb04799794a7f94628153991e6334c3304961b8" }, - "mini.align": { "branch": "main", "commit": "26111a737494bc39576ad67b52bbc2638ca23553" }, - "mini.files": { "branch": "main", "commit": "a3a9cce82115a69dba161ac45bda16f4e606f73b" }, - "mini.icons": { "branch": "main", "commit": "1c79feb7478ca773fa3dac5cadf43ced9180e861" }, - "mini.move": { "branch": "main", "commit": "4caa1c212f5ca3d1633d21cfb184808090ed74b1" }, - "mini.operators": { "branch": "main", "commit": "35b12f54bd5acb860f4297fd6d12fd07b1b065e2" }, - "mini.pairs": { "branch": "main", "commit": "7e834c5937d95364cc1740e20d673afe2d034cdb" }, - "mini.surround": { "branch": "main", "commit": "aa5e245829dd12d8ff0c96ef11da28681d6049aa" }, + "mini.ai": { "branch": "main", "commit": "53b4e4571e42913b94a12eff85dabe4db370d352" }, + "mini.align": { "branch": "main", "commit": "8d5f3254a4c25fdfd26b7467d2372f5deed3a78c" }, + "mini.files": { "branch": "main", "commit": "01001e0cfc1e79f581d055ae3f70fbac96a2f378" }, + "mini.icons": { "branch": "main", "commit": "ec61af6e606fc89ee3b1d8f2f20166a3ca917a36" }, + "mini.move": { "branch": "main", "commit": "c8b30e92dd2668dd6e56a9a23cb7d4ee38c2266d" }, + "mini.operators": { "branch": "main", "commit": "7cb4dc66c51a3d736d347bbc517dc73dc7d28888" }, + "mini.pairs": { "branch": "main", "commit": "1a3e73649c0eaef2f6c48ce1e761c6f0a7c11918" }, + "mini.surround": { "branch": "main", "commit": "5e815557148d2c93eceaa44195c5d89953225b02" }, + "multiple-cursors.nvim": { "branch": "main", "commit": "2f5e786c43aa9c0fc34b295cfcc9bfbacef8e926" }, "neo-tree.nvim": { "branch": "main", "commit": "343886b020cb6bfbb326c4a07a7c356eb5ee05b7" }, "neogen": { "branch": "main", "commit": "dd0301bfba1f83a3bc009b5430fce7aa3cee6941" }, - "neogit": { "branch": "master", "commit": "a1fc4e50fa494e04097cf2d02e86bcd7ac5760d6" }, + "neogit": { "branch": "master", "commit": "63124cf520ff24d09deb3b850e053908ab0fc66a" }, "neotest": { "branch": "master", "commit": "d66cf4e05a116957f0d3a7755a24291c7d1e1f72" }, - "neotest-elixir": { "branch": "master", "commit": "c5067bcc3ec6a0bba7b5694fa15aeb17f16aeb3c" }, - "neotest-golang": { "branch": "main", "commit": "b4dfab8cf95715d3ae8e74027ae56303d46b015c" }, + "neotest-elixir": { "branch": "master", "commit": "a242aebeaa6997c1c149138ff77f6cacbe33b6fc" }, + "neotest-golang": { "branch": "main", "commit": "059c5754a17629c25dce61eefcea40164ee62975" }, "neotest-python": { "branch": "master", "commit": "a2861ab3c9a0bf75a56b11835c2bfc8270f5be7e" }, - "noice.nvim": { "branch": "main", "commit": "eaed6cc9c06aa2013b5255349e4f26a6b17ab70f" }, - "nordic.nvim": { "branch": "main", "commit": "1ee4044077059b34eacd18d93613495a602c131f" }, + "neotest-zig": { "branch": "main", "commit": "c7a1a39626fa90e639fb640b6322739060a2acf3" }, + "noice.nvim": { "branch": "main", "commit": "cf758e9df66451889aab56613a21b8673f045ec2" }, + "nordic.nvim": { "branch": "main", "commit": "2e060bda700365af5ce936bec6bb2b8ff2daeb19" }, "nui.nvim": { "branch": "main", "commit": "53e907ffe5eedebdca1cd503b00aa8692068ca46" }, "nvim-cmp": { "branch": "main", "commit": "b555203ce4bd7ff6192e759af3362f9d217e8c89" }, - "nvim-dap": { "branch": "master", "commit": "99807078c5089ed30e0547aa4b52c5867933f426" }, - "nvim-dap-go": { "branch": "main", "commit": "6aa88167ea1224bcef578e8c7160fe8afbb44848" }, + "nvim-dap": { "branch": "master", "commit": "52302f02fea3a490e55475de52fa4deb8af2eb11" }, + "nvim-dap-go": { "branch": "main", "commit": "07739481317d36ddb3e3e8fbdfcd8f90b4167d73" }, "nvim-dap-python": { "branch": "master", "commit": "34282820bb713b9a5fdb120ae8dd85c2b3f49b51" }, - "nvim-dap-ui": { "branch": "master", "commit": "727c032a8f63899baccb42a1c26f27687e62fc5e" }, + "nvim-dap-ui": { "branch": "master", "commit": "bc81f8d3440aede116f821114547a476b082b319" }, "nvim-dap-virtual-text": { "branch": "master", "commit": "df66808cd78b5a97576bbaeee95ed5ca385a9750" }, "nvim-highlight-colors": { "branch": "main", "commit": "68a4df620cf58e2c7336e53738e8cf3a522ad694" }, - "nvim-lint": { "branch": "master", "commit": "dfa45de973c3ce7bd1b9a6d346f896a68ad07e44" }, - "nvim-lspconfig": { "branch": "master", "commit": "88157521e890fe7fdf18bee22438875edd6300a6" }, - "nvim-nio": { "branch": "master", "commit": "a428f309119086dc78dd4b19306d2d67be884eee" }, + "nvim-lint": { "branch": "master", "commit": "6e9dd545a1af204c4022a8fcd99727ea41ffdcc8" }, + "nvim-lspconfig": { "branch": "master", "commit": "696ac53289280a29a349f3e68624e23129341126" }, + "nvim-navic": { "branch": "master", "commit": "8649f694d3e76ee10c19255dece6411c29206a54" }, + "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, "nvim-scissors": { "branch": "main", "commit": "12d9f282b67525bb766c6fe33317caf25a19c86a" }, "nvim-snippets": { "branch": "main", "commit": "56b4052f71220144689caaa2e5b66222ba5661eb" }, - "nvim-treesitter": { "branch": "master", "commit": "097fb77312c731347180e8907424f6c967323f05" }, - "nvim-treesitter-context": { "branch": "master", "commit": "d0dd7ce5a9d0be1f28086e818e52fdc5c78975df" }, + "nvim-treesitter": { "branch": "master", "commit": "824bf8455fd670186986fb3eb46fcaa4c5460949" }, + "nvim-treesitter-context": { "branch": "master", "commit": "9a49f43a2ec9bf77aecfb0fcbc43af43338375c0" }, "nvim-treesitter-textobjects": { "branch": "master", "commit": "ad8f0a472148c3e0ae9851e26a722ee4e29b1595" }, "nvim-ts-autotag": { "branch": "main", "commit": "1cca23c9da708047922d3895a71032bc0449c52d" }, - "nvim-window-picker": { "branch": "main", "commit": "0031ae451fdbb928eafeb55ae7451232ebcc3438" }, + "nvim-window-picker": { "branch": "main", "commit": "0dfef64eaf063e1cd27983ab11a30e7bc5b74fac" }, "persistence.nvim": { "branch": "main", "commit": "f6aad7dde7fcf54148ccfc5f622c6d5badd0cc3d" }, "plenary.nvim": { "branch": "master", "commit": "3707cdb1e43f5cea73afb6037e6494e7ce847a66" }, - "quick-scope": { "branch": "master", "commit": "4d35d3b2bc6794666353dcc241b2680bd560416f" }, + "quick-scope": { "branch": "master", "commit": "f2b6043e04d9ef05205c8953e389304a4c1946f2" }, "refactoring.nvim": { "branch": "master", "commit": "2db6d378e873de31d18ade549c2edba64ff1c2e3" }, - "render-markdown.nvim": { "branch": "main", "commit": "d7b646f2e6136d963e1bd3abbb9e2ac3fa90837a" }, - "rustaceanvim": { "branch": "master", "commit": "ff10ab2bdcdbd55fdd9651d147a879bad7900647" }, - "snacks.nvim": { "branch": "main", "commit": "d2b2b7bcbf9814d61f2e8049affed750509f44e3" }, + "render-markdown.nvim": { "branch": "main", "commit": "5c2440d932a4ba96840e5ce5a7bd40f0624bdaa2" }, + "rustaceanvim": { "branch": "master", "commit": "f03035fa03ccb36cd26d0792c946fbacba1d1a39" }, + "snacks.nvim": { "branch": "main", "commit": "4a6ed6912e5b5cabeb3c3dbbecaedf7a1c743256" }, "telescope-egrepify.nvim": { "branch": "master", "commit": "a8070970a661330c4e00450d25f874f6c2b00af9" }, - "telescope.nvim": { "branch": "master", "commit": "2eca9ba22002184ac05eddbe47a7fe2d5a384dfc" }, "template-string.nvim": { "branch": "main", "commit": "da5f326b65fb74fd068aa1d8b55461b64c8fb23b" }, - "todo-comments.nvim": { "branch": "main", "commit": "ae0a2afb47cf7395dc400e5dc4e05274bf4fb9e0" }, + "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" }, "tokyonight.nvim": { "branch": "main", "commit": "c2725eb6d086c8c9624456d734bd365194660017" }, - "trouble.nvim": { "branch": "main", "commit": "46cf952fc115f4c2b98d4e208ed1e2dce08c9bf6" }, + "trouble.nvim": { "branch": "main", "commit": "6f380b8826fb819c752c8fd7daaee9ef96d4c689" }, "ts-comments.nvim": { "branch": "main", "commit": "872dcfa0418f4a33b7437fb4d9f4e89f2f000d74" }, + "vague.nvim": { "branch": "1.3", "commit": "ee51f05350431ca8a49a8d58f12074e07e12e174" }, "venv-selector.nvim": { "branch": "regexp", "commit": "e82594274bf7b54387f9a2abe65f74909ac66e97" }, "vim-abolish": { "branch": "master", "commit": "dcbfe065297d31823561ba787f51056c147aa682" }, + "vim-dadbod": { "branch": "master", "commit": "9f0ca8bcef704659820a95c3bbd2c262583a66a1" }, + "vim-dadbod-completion": { "branch": "master", "commit": "c7f1be21a08b8fc9d927a19db89a4aa995402787" }, + "vim-dadbod-ui": { "branch": "master", "commit": "f4d37b7312ae6489e5c04bee654ca521baac188a" }, "vim-dispatch": { "branch": "master", "commit": "a2ff28abdb2d89725192db5b8562977d392a4d3f" }, "vim-repeat": { "branch": "master", "commit": "65846025c15494983dafe5e3b46c8f88ab2e9635" }, - "vim-subversive": { "branch": "master", "commit": "cea98a62ded4028118ad71c3e81b26eff2e0b8a0" }, "vim-swap": { "branch": "master", "commit": "9358bfdc5e377aa13e7c2c2dd8699ba32b0dcf83" }, - "vim-visual-multi": { "branch": "master", "commit": "a6975e7c1ee157615bbc80fc25e4392f71c344d4" }, - "which-key.nvim": { "branch": "main", "commit": "1f8d414f61e0b05958c342df9b6a4c89ce268766" }, - "yazi.nvim": { "branch": "main", "commit": "229e12bc1791a4050bf7e43f6b16608eeaf8d2a8" } + "which-key.nvim": { "branch": "main", "commit": "0e76a87ac51772569aec678dc74baa8e2a86100c" } } diff --git a/.config/nvim-lazy/lua/config/lazy.lua b/.config/nvim-lazy/lua/config/lazy.lua index 1d1380c..86c5f17 100644 --- a/.config/nvim-lazy/lua/config/lazy.lua +++ b/.config/nvim-lazy/lua/config/lazy.lua @@ -14,6 +14,8 @@ if not (vim.uv or vim.loop).fs_stat(lazypath) then end vim.opt.rtp:prepend(lazypath) +vim.g.lazyvim_python_lsp = "basedpyright" + require("lazy").setup({ spec = { -- add LazyVim and import its plugins @@ -21,7 +23,8 @@ require("lazy").setup({ { import = "lazyvim.plugins.extras.editor.refactoring" }, { import = "lazyvim.plugins.extras.editor.dial" }, - -- { import = "lazyvim.plugins.extras.editor.telescope" }, + { import = "lazyvim.plugins.extras.editor.snacks_picker" }, + { import = "lazyvim.plugins.extras.editor.navic" }, { import = "lazyvim.plugins.extras.coding.luasnip" }, { import = "lazyvim.plugins.extras.ui.treesitter-context" }, @@ -43,6 +46,7 @@ require("lazy").setup({ { import = "lazyvim.plugins.extras.lang.markdown" }, { import = "lazyvim.plugins.extras.lang.prisma" }, + { import = "lazyvim.plugins.extras.lang.sql" }, { import = "lazyvim.plugins.extras.lang.gleam" }, { import = "lazyvim.plugins.extras.lang.elixir" }, @@ -51,6 +55,8 @@ require("lazy").setup({ { import = "lazyvim.plugins.extras.lang.python" }, { import = "lazyvim.plugins.extras.lang.rust" }, { import = "lazyvim.plugins.extras.lang.php" }, + { import = "lazyvim.plugins.extras.lang.zig" }, + { import = "lazyvim.plugins.extras.lang.elixir" }, -- import/override with your plugins { import = "plugins" }, diff --git a/.config/nvim-lazy/lua/config/nordic.lua b/.config/nvim-lazy/lua/config/nordic.lua index a503b8b..3fd95c0 100644 --- a/.config/nvim-lazy/lua/config/nordic.lua +++ b/.config/nvim-lazy/lua/config/nordic.lua @@ -1,15 +1,20 @@ +---@diagnostic disable: missing-fields require("nordic").setup({ transparent = { bg = true }, -- Enable brighter float border. bright_border = true, on_highlight = function(highlights, palette) - highlights.QuickScopePrimary = { + highlights.Visual = { + bg = palette.gray1, + bold = true, + } + highlights["QuickScopePrimary"] = { fg = palette.yellow.bright, bg = palette.gray0, bold = true, underline = true, } - highlights.QuickScopeSecondary = { + highlights["QuickScopeSecondary"] = { fg = palette.orange.dim, bg = palette.gray0, bold = true, diff --git a/.config/nvim-lazy/lua/plugins/color-highlight.lua b/.config/nvim-lazy/lua/plugins/color-highlight.lua index f6891c2..e7e3182 100644 --- a/.config/nvim-lazy/lua/plugins/color-highlight.lua +++ b/.config/nvim-lazy/lua/plugins/color-highlight.lua @@ -7,7 +7,7 @@ return { opts = { ---Render style ---@type 'background'|'foreground'|'virtual' - render = "virtual", + render = "background", enable_tailwind = true, }, } diff --git a/.config/nvim-lazy/lua/plugins/completion.lua b/.config/nvim-lazy/lua/plugins/completion.lua index e68b487..7e00625 100644 --- a/.config/nvim-lazy/lua/plugins/completion.lua +++ b/.config/nvim-lazy/lua/plugins/completion.lua @@ -2,31 +2,19 @@ local function feedkey(key, mode) vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true) end -local function deprio(kind) - return function(e1, e2) - if e1:get_kind() == kind then - return false - end - if e2:get_kind() == kind then - return true - end - end -end - ---@type LazySpec return { { "saghen/blink.cmp", enabled = vim.g.lazyvim_cmp == "blink.cmp" or vim.g.lazyvim_cmp == "auto", - dependencies = { - "mikavilpas/blink-ripgrep.nvim", - }, + dependencies = { "mikavilpas/blink-ripgrep.nvim" }, ---@module 'blink.cmp' ---@type blink.cmp.Config opts = { keymap = { preset = "enter", [""] = { "select_and_accept", "fallback" }, + [""] = { "select_and_accept", "fallback" }, [""] = { "select_prev", "fallback" }, [""] = { "select_next", "fallback" }, [""] = { "select_next", "snippet_forward", "fallback" }, @@ -69,7 +57,7 @@ return { ---@type blink-ripgrep.Options opts = { prefix_min_len = 4, - -- score_offset = -3, -- should be lower priority + score_offset = -3, -- should be lower priority max_filesize = "300K", search_casing = "--smart-case", }, diff --git a/.config/nvim-lazy/lua/plugins/copilot.lua b/.config/nvim-lazy/lua/plugins/copilot.lua index 033c4ed..5ca3ffa 100644 --- a/.config/nvim-lazy/lua/plugins/copilot.lua +++ b/.config/nvim-lazy/lua/plugins/copilot.lua @@ -4,7 +4,7 @@ return { cmd = "Copilot", build = ":Copilot auth", event = "InsertEnter", - enabled = true, + enabled = false, config = function() require("copilot").setup({ suggestion = { diff --git a/.config/nvim-lazy/lua/plugins/disabled.lua b/.config/nvim-lazy/lua/plugins/disabled.lua index add58ef..60c250e 100644 --- a/.config/nvim-lazy/lua/plugins/disabled.lua +++ b/.config/nvim-lazy/lua/plugins/disabled.lua @@ -3,6 +3,5 @@ return { { "dashboard-nvim", enabled = false }, { "folke/tokyonight.nvim", enabled = false }, { "folke/snacks.nvim", opts = { dashboard = { enabled = false } } }, - { "folke/snacks.nvim", opts = { dashboard = { enabled = false } } }, { "neo-tree.nvim", enabled = false }, } diff --git a/.config/nvim-lazy/lua/plugins/fzf-lua.lua b/.config/nvim-lazy/lua/plugins/fzf-lua.lua index 04816e3..5973cf0 100644 --- a/.config/nvim-lazy/lua/plugins/fzf-lua.lua +++ b/.config/nvim-lazy/lua/plugins/fzf-lua.lua @@ -11,16 +11,11 @@ local rg_cmd = { "!{" .. vim.iter(vim.opt.wildignore:get()):join(",") .. "}", } --- local keys = { --- ["alt-enter"] = { fnactions.file_tabedit }, --- ["ctrl-t"] = actions.file_tabedit, --- ["ctrl-x"] = actions.file_split, --- ["ctrl-i"] = actions.toggle_ignore, --- } ---@type LazySpec return { { "ibhagwan/fzf-lua", + enabled = vim.g.lazyvim_picker == "fzf", keys = { { "", @@ -121,7 +116,6 @@ return { git = { files = { cmd = "git ls-files --exclude-standard --cached --others", -- '--others' is used to show untracked files - -- actions = m_keys, winopts = { height = 0.55, width = 0.65, @@ -131,11 +125,9 @@ return { previewer = false, }, bcommits = { - -- actions = m_keys, winopts = { preview = { layout = "vertical", vertical = "up:60%" } }, }, commits = { - -- actions = m_keys, winopts = { preview = { layout = "vertical", vertical = "up:60%" } }, }, branches = { @@ -153,7 +145,6 @@ return { }, grep = { winopts = { preview = { layout = "vertical", vertical = "up:60%" } }, - -- actions = m_keys, multiprocess = true, rg_glob = true, glob_flah = "--glob", @@ -167,7 +158,7 @@ return { end, }, lsp = { - smbols = { + symbols = { winopts = { preview = { layout = "vertical", vertical = "up:60%" } }, }, finder = { @@ -182,6 +173,7 @@ return { { "ibhagwan/fzf-lua", cmd = "FzfLua", + enabled = vim.g.lazyvim_picker == "fzf", opts = function(_, opts) local fzf = require("fzf-lua") local config = fzf.config diff --git a/.config/nvim-lazy/lua/plugins/grapple.lua b/.config/nvim-lazy/lua/plugins/grapple.lua index 8f2a4b6..b12b11d 100644 --- a/.config/nvim-lazy/lua/plugins/grapple.lua +++ b/.config/nvim-lazy/lua/plugins/grapple.lua @@ -14,6 +14,7 @@ return { }, keys = { { "A", "Grapple toggle", desc = "Tag a file" }, + { "`", "Grapple toggle", desc = "Tag a file" }, { "", "Grapple toggle", desc = "Tag a file" }, { "", "Grapple toggle_tags", desc = "Toggle tags menu" }, diff --git a/.config/nvim-lazy/lua/plugins/lazydo.lua b/.config/nvim-lazy/lua/plugins/lazydo.lua deleted file mode 100644 index 9922816..0000000 --- a/.config/nvim-lazy/lua/plugins/lazydo.lua +++ /dev/null @@ -1,13 +0,0 @@ ----@type LazySpec -return { - 'Dan7h3x/LazyDo', - keys = { -- recommended keymap for easy toggle LazyDo in normal and insert modes (arbitrary) - { - '', - 'LazyDoToggle', - mode = { 'n', 'i' }, - desc = 'Toggle LazyDo', - }, - }, - opts = {}, -} diff --git a/.config/nvim-lazy/lua/plugins/lsp/clang.lua b/.config/nvim-lazy/lua/plugins/lsp/clang.lua new file mode 100644 index 0000000..55a6a39 --- /dev/null +++ b/.config/nvim-lazy/lua/plugins/lsp/clang.lua @@ -0,0 +1,11 @@ +---@type LazySpec +return { + "neovim/nvim-lspconfig", + opts = { + setup = { + clangd = function(_, opts) + opts.capabilities.offsetEncoding = { "utf-16" } + end, + }, + }, +} diff --git a/.config/nvim-lazy/lua/plugins/lsp/golang.lua b/.config/nvim-lazy/lua/plugins/lsp/golang.lua new file mode 100644 index 0000000..cdbc262 --- /dev/null +++ b/.config/nvim-lazy/lua/plugins/lsp/golang.lua @@ -0,0 +1,15 @@ +---@type LazySpec +return { + { + "mason.nvim", + opts = { ensure_installed = { "goimports", "gofumpt", "golangci-lint" } }, + }, + { + "mfussenegger/nvim-lint", + opts = { + linters_by_ft = { + go = { "golangcilint" }, + }, + }, + }, +} diff --git a/.config/nvim-lazy/lua/plugins/lsp/mappings.lua b/.config/nvim-lazy/lua/plugins/lsp/mappings.lua index b3d3b33..48dd4a1 100644 --- a/.config/nvim-lazy/lua/plugins/lsp/mappings.lua +++ b/.config/nvim-lazy/lua/plugins/lsp/mappings.lua @@ -3,7 +3,31 @@ return { "neovim/nvim-lspconfig", opts = function() local keys = require("lazyvim.plugins.lsp.keymaps").get() - -- change a keymap + if LazyVim.pick.want() == "fzf" then + keys[#keys + 1] = { "cw", "FzfLua lsp_document_symbols", desc = "Document symbols" } + keys[#keys + 1] = { "cW", "FzfLua lsp_live_workspace_symbols", desc = "Workspace symbols" } + elseif LazyVim.pick.want() == "telescope" then + keys[#keys + 1] = { "cw", "Telescope lsp_document_symbols", desc = "Document symbols" } + keys[#keys + 1] = { "cW", "Telescope lsp_workspace_symbols", desc = "Workspace symbols" } + elseif LazyVim.pick.want() == "snacks" then + keys[#keys + 1] = { + "cw", + function() + Snacks.picker.lsp_symbols() + end, + desc = "Document symbols", + } + keys[#keys + 1] = { + "cW", + function() + Snacks.picker.lsp_workspace_symbols() + end, + desc = "Workspace symbols", + } + else + keys[#keys + 1] = { "cw", vim.lsp.buf.document_symbol, desc = "Document symbols" } + keys[#keys + 1] = { "cW", vim.lsp.buf.workspace_symbol, desc = "Workspace symbols" } + end keys[#keys + 1] = { "gl", vim.diagnostic.open_float, desc = "Open diagnostic" } -- disable a keymap keys[#keys + 1] = { "", mode = "i", false } diff --git a/.config/nvim-lazy/lua/plugins/markdown-bullets.lua b/.config/nvim-lazy/lua/plugins/markdown-bullets.lua index 116a44f..4e2c9b5 100644 --- a/.config/nvim-lazy/lua/plugins/markdown-bullets.lua +++ b/.config/nvim-lazy/lua/plugins/markdown-bullets.lua @@ -1,5 +1,41 @@ +local fts = { "markdown", "gitcommit", "text", "Avante" } ---@type LazySpec return { "bullets-vim/bullets.vim", - ft = { "markdown", "gitcommit", "text" }, + ft = fts, + init = function() + vim.g.bullets_enabled_file_types = fts + vim.g.bullets_set_mappings = 0 + end, + config = function() + vim.api.nvim_create_autocmd("FileType", { + desc = "Setup Bullet-vim mappings because the default setup is messing up the snacks.picker input box", + group = vim.api.nvim_create_augroup("sp_markdow", { clear = true }), + pattern = fts, + callback = function(args) + local bufnr = args.buf + vim.keymap.set("i", "", "(bullets-newline)", { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set("i", "", "", { silent = true, buffer = bufnr }) + vim.keymap.set("n", "o", "(bullets-newline)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set({ "n", "v" }, "gN", "(bullets-renumber)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set("i", "", "(bullets-demote)", { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set("i", "", "(bullets-promote)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set("n", ">>", "(bullets-demote)", { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set("n", "<<", "(bullets-promote)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set("x", ">", "(bullets-demote)", { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set("x", "<", "(bullets-promote)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set( + "n", + "xx", + "(bullets-toggle-checkbox)", + { desc = "Toggle Checkbox", silent = true, buffer = bufnr, remap = true } + ) + end, + }) + end, } diff --git a/.config/nvim-lazy/lua/plugins/mini/surround.lua b/.config/nvim-lazy/lua/plugins/mini/surround.lua index ba25c22..5382065 100644 --- a/.config/nvim-lazy/lua/plugins/mini/surround.lua +++ b/.config/nvim-lazy/lua/plugins/mini/surround.lua @@ -1,25 +1,34 @@ +local mappings = { + add = "ys", + delete = "ds", + replace = "cs", + find = "gzf", + find_left = "gzF", + highlight = "gzh", + updates = "gzn", +} ---@type LazySpec return { "echasnovski/mini.surround", enabled = true, keys = { { "gz", "", desc = "+surround" }, - { "ys", mode = { "n", "v" }, desc = "Surround add" }, - { "ds", mode = { "n" }, desc = "Surround delete" }, - { "cs", mode = { "n" }, desc = "Surround replace" }, - { "gzf", mode = { "n" }, desc = "Surround find" }, - { "gzh", mode = { "n" }, desc = "Surround highlight" }, + { mappings.add, mode = { "n", "v" }, desc = "Surround add" }, + { mappings.delete, mode = { "n" }, desc = "Surround delete" }, + { mappings.replace, mode = { "n" }, desc = "Surround replace" }, + { mappings.find, mode = { "n" }, desc = "Surround find" }, + { mappings.highlight, mode = { "n" }, desc = "Surround highlight" }, }, opts = { n_lines = 500, mappings = { - add = "ys", -- Add surrounding in Normal and Visual modes - delete = "ds", -- Delete surrounding - replace = "cs", -- Replace surrounding - find = "gzf", -- Find surrounding (to the right) - find_left = "sF", -- Find surrounding (to the left) - highlight = "gzh", -- Highlight surrounding - update_n_lines = "gzn", -- Update `n_lines` + add = mappings.add, -- Add surrounding in Normal and Visual modes + delete = mappings.delete, -- Delete surrounding + replace = mappings.replace, -- Replace surrounding + find = mappings.find, -- Find surrounding (to the right) + find_left = mappings.find_left, -- Find surrounding (to the left) + highlight = mappings.highlight, -- Highlight surrounding + update_n_lines = mappings.updates, -- Update `n_lines` }, }, } diff --git a/.config/nvim-lazy/lua/plugins/multi-cursor.lua b/.config/nvim-lazy/lua/plugins/multi-cursor.lua index 891e6a3..b119a4d 100644 --- a/.config/nvim-lazy/lua/plugins/multi-cursor.lua +++ b/.config/nvim-lazy/lua/plugins/multi-cursor.lua @@ -1,18 +1,55 @@ ---@type LazySpec return { - "mg979/vim-visual-multi", - branch = "master", - enabled = true, - init = function() - vim.g.VM_maps = {} - vim.g.VM_mouse_mappings = 1 - vim.g.VM_maps = { - ["Find Under"] = "", - ["Find Subword Under"] = "", - ["Skip Region"] = "", - ["Select All"] = "", - ["Start Regex Search"] = "\\/", - } - end, - keys = { { "", mode = { "n", "v" } }, { "", mode = { "n", "v" } } }, + { + "brenton-leighton/multiple-cursors.nvim", + version = "*", + enabled = false, + cmd = { + "MultipleCursorsAddDown", + "MultipleCursorsAddUp", + "MultipleCursorsAddMatches", + "MultipleCursorsAddJumpNextMatch", + "MultipleCursorsJumpNextMatch", + "MultipleCursorsAddJumpPrevMatch", + "MultipleCursorsJumpPrevMatch", + }, + opts = {}, + keys = { + { "", "MultipleCursorsAddDown", mode = { "n", "x" }, desc = "Add cursor and move down" }, + { "", "MultipleCursorsAddUp", mode = { "n", "x" }, desc = "Add cursor and move up" }, + + { "", "MultipleCursorsMouseAddDelete", mode = { "n", "i" }, desc = "Add or remove cursor" }, + { "ma", "MultipleCursorsAddMatches", mode = { "n", "x" }, desc = "Add cursors to cword" }, + { + "mA", + "MultipleCursorsAddMatchesV", + mode = { "n", "x" }, + desc = "+cursors to cword in prev area", + }, + { + "mn", + "MultipleCursorsAddJumpNextMatch", + mode = { "n", "x" }, + desc = "+cursor & jump to next cword", + }, + { "mN", "MultipleCursorsJumpNextMatch", mode = { "n", "x" }, desc = "Jump to next cword" }, + { "ml", "MultipleCursorsLock", mode = { "n", "x" }, desc = "Lock virtual cursors" }, + }, + }, + { + "smoka7/multicursors.nvim", + dependencies = { + "nvimtools/hydra.nvim", + }, + opts = {}, + cmd = { "MCstart", "MCvisual", "MCclear", "MCpattern", "MCvisualPattern", "MCunderCursor" }, + keys = { + { + mode = { "v", "n" }, + "m", + "MCstart", + desc = "Create a selection for selected text or word under the cursor", + }, + }, + }, } diff --git a/.config/nvim-lazy/lua/plugins/neoterm.lua b/.config/nvim-lazy/lua/plugins/neoterm.lua deleted file mode 100644 index 67f6687..0000000 --- a/.config/nvim-lazy/lua/plugins/neoterm.lua +++ /dev/null @@ -1,21 +0,0 @@ ----@type LazySpec -return { - "nyngwang/NeoTerm.lua", - cmd = { "NeoTermToggle", "NeoTermEnterNormal" }, - keys = { - { "", "NeoTermToggle" }, - { "", "NeoTermToggle", mode = "t" }, - { "", "NeoTermEnterNormal" }, - { "", "NeoTermEnterNormal", mode = "t" }, - }, - config = function() - require("neo-term").setup({ - exclude_filetypes = { "oil", "qf", "TelescopePrompt" }, - -- exclude_buftypes = {}, -- 'terminal' will always be added by NeoTerm.lua - -- enabled by default! - -- presets = { - -- 'vim-test', - -- } - }) - end, -} diff --git a/.config/nvim-lazy/lua/plugins/notes.lua b/.config/nvim-lazy/lua/plugins/notes.lua new file mode 100644 index 0000000..ad52df3 --- /dev/null +++ b/.config/nvim-lazy/lua/plugins/notes.lua @@ -0,0 +1,52 @@ +---@type LazySpec +return { + "yujinyuz/gitpad.nvim", + opts = { + on_attach = function(bufnr) + vim.keymap.set("n", "q", "wq", { silent = true, bufnr = bufnr }) + end, + floating_win_opts = { + ---@type 'single'| 'double'| 'shadow'| 'rounded' + border = "rounded", + }, + }, + keys = { + { + "pp", + function() + require("gitpad").toggle_gitpad() -- or require('gitpad').toggle_gitpad({ title = 'Project notes' }) + end, + desc = "gitpad project", + }, + { + "pb", + function() + require("gitpad").toggle_gitpad_branch() -- or require('gitpad').toggle_gitpad_branch({ title = 'Branch notes' }) + end, + desc = "gitpad branch", + }, + -- Daily notes + { + "pd", + function() + local date_filename = "daily-" .. os.date("%Y-%m-%d.md") + require("gitpad").toggle_gitpad({ filename = date_filename }) -- or require('gitpad').toggle_gitpad({ filename = date_filename, title = 'Daily notes' }) + end, + desc = "gitpad daily notes", + }, + -- Per file notes + { + "pf", + function() + local filename = vim.fn.expand("%:p") -- or just use vim.fn.bufname() + if filename == "" then + vim.notify("empty bufname") + return + end + filename = vim.fn.pathshorten(filename, 2) .. ".md" + require("gitpad").toggle_gitpad({ filename = filename }) -- or require('gitpad').toggle_gitpad({ filename = filename, title = 'Current file notes' }) + end, + desc = "gitpad per file notes", + }, + }, +} diff --git a/.config/nvim-lazy/lua/plugins/nvim-scissors.lua b/.config/nvim-lazy/lua/plugins/nvim-scissors.lua index 669ced9..9e95599 100644 --- a/.config/nvim-lazy/lua/plugins/nvim-scissors.lua +++ b/.config/nvim-lazy/lua/plugins/nvim-scissors.lua @@ -1,28 +1,26 @@ ---@type LazySpec return { - 'chrisgrieser/nvim-scissors', + "chrisgrieser/nvim-scissors", opts = { - snippetDir = vim.fn.stdpath 'config' .. '/snippets/', -- this is already the default, but I want to be explicit + snippetDir = vim.fn.stdpath("config") .. "/snippets/", -- this is already the default, but I want to be explicit ---@type "yq"|"jq"|"none"|string[] - jsonFormatter = vim.fn.executable 'jq' == 1 and 'jq' or 'none', + jsonFormatter = vim.fn.executable("jq") == 1 and "jq" or "none", }, keys = { - { 's', '', desc = '+[S]nippets' }, { - 'se', + "se", function() - require('scissors').editSnippet() + require("scissors").editSnippet() end, - desc = 'Snippet: [E]dit', + desc = "Snippet: [E]dit", }, { - 'sn', + "sn", function() - require('scissors').addNewSnippet() + require("scissors").addNewSnippet() end, - mode = { 'n', 'x' }, - { desc = 'Snippet: [N]ew' }, + mode = { "n", "x" }, + desc = "Snippet: [N]ew", }, - { 'sd', 'AutoSession delete', desc = '[D]elte' }, }, } diff --git a/.config/nvim-lazy/lua/plugins/snacks.lua b/.config/nvim-lazy/lua/plugins/snacks.lua new file mode 100644 index 0000000..e105fd0 --- /dev/null +++ b/.config/nvim-lazy/lua/plugins/snacks.lua @@ -0,0 +1,101 @@ +---@type LazySpec +return { + "folke/snacks.nvim", + ---@type snacks.Config + opts = { + picker = { + enabled = true, + ui_select = true, + layout = { preset = "dropdown" }, + matcher = { frecency = true }, + formatters = { file = { filename_first = true } }, + -- jump = { reuse_win = true }, + win = { + -- input window + input = { + keys = { + [""] = { "edit_split", mode = { "i", "n" } }, + [""] = { "edit_tab", mode = { "i", "n" } }, + [""] = { "copy", mode = { "i", "n" } }, + }, + }, + list = { keys = { [""] = "edit_split" } }, + }, + }, + }, + keys = { + { + "uN", + function() + Snacks.notifier.show_history() + end, + desc = "Notification History", + }, + { + "", + function() + Snacks.terminal({ "yazi" }, { cwd = vim.uv.cwd() }) + end, + desc = "Toggle Yazi", + mode = { "n", "t" }, + }, + { + "", + function() + Snacks.picker.files({ layout = { preset = "vscode" } }) + end, + desc = "Find Files", + }, + { + "ff", + function() + Snacks.picker.files({ layout = { preset = "vscode" } }) + end, + desc = "Find Files", + }, + { + "fg", + function() + Snacks.picker.git_files({ layout = { preset = "vscode" } }) + end, + desc = "Find Files(git)", + }, + { + "fn", + function() + Snacks.picker.files({ cwd = vim.fn.stdpath("config"), layout = { preset = "vscode" } }) + end, + desc = "Find Config File", + }, + { + "fN", + function() + Snacks.picker.files({ cwd = vim.fn.stdpath("data") .. "/lazy", layout = { preset = "vscode" } }) + end, + desc = "Neovim Data dir", + }, + { + "fd", + function() + Snacks.picker.files({ cwd = vim.fn.expand("~/Documents/dotfiles/.config"), layout = { preset = "vscode" } }) + end, + desc = "Find Dotfiles", + }, + { + "fz", + function() + Snacks.picker.zoxide() + end, + desc = "Zoxided", + }, + }, + + -- init = function() + -- vim.api.nvim_create_user_command("NotificationHistory", function() + -- if not _G.Snacks then + -- return + -- end + -- Snacks.notifier.show_history() + -- end, { desc = "Show Notification History" }) + -- end, +} diff --git a/.config/nvim-lazy/lua/plugins/subversive.lua b/.config/nvim-lazy/lua/plugins/subversive.lua deleted file mode 100644 index ce38305..0000000 --- a/.config/nvim-lazy/lua/plugins/subversive.lua +++ /dev/null @@ -1,10 +0,0 @@ ----@type LazySpec -return { - "svermeulen/vim-subversive", - enabled = false, - keys = { - { "x", "(SubversiveSubstitute)", noremap = false }, - { "X", "(SubversiveSubstituteToEndOfLine)", noremap = false }, - { "xx", "(SubversiveSubstituteLine)", noremap = false }, - }, -} diff --git a/.config/nvim-lazy/lua/plugins/template-string.lua b/.config/nvim-lazy/lua/plugins/template-string.lua index b1e32a8..5458cac 100644 --- a/.config/nvim-lazy/lua/plugins/template-string.lua +++ b/.config/nvim-lazy/lua/plugins/template-string.lua @@ -2,7 +2,5 @@ return { "axelvc/template-string.nvim", event = "InsertEnter", - opts = { - remove_template_string = true, - }, + opts = {}, } diff --git a/.config/nvim-lazy/lua/plugins/theme.lua b/.config/nvim-lazy/lua/plugins/theme.lua index e1af4b9..37b9fa8 100644 --- a/.config/nvim-lazy/lua/plugins/theme.lua +++ b/.config/nvim-lazy/lua/plugins/theme.lua @@ -4,6 +4,23 @@ return { "LazyVim", opts = { colorscheme = "nordic" }, }, + -- { + -- "lualine.nvim", + -- opts = { + -- options = { + -- theme = "iceberg_dark", + -- }, + -- }, + -- }, + { + "vague2k/vague.nvim", + enabled = false, + event = "VimEnter", + opts = { transparent = false }, + config = function(_, opts) + require("vague").setup(opts) + end, + }, { "AlexvZyl/nordic.nvim", enabled = true, diff --git a/.config/nvim-lazy/lua/plugins/yazi.lua b/.config/nvim-lazy/lua/plugins/yazi.lua deleted file mode 100644 index 5ca98ba..0000000 --- a/.config/nvim-lazy/lua/plugins/yazi.lua +++ /dev/null @@ -1,31 +0,0 @@ ----@type LazySpec -return { - "mikavilpas/yazi.nvim", - version = false, - dependencies = { - "nvim-lua/plenary.nvim", - }, - cmd = "Yazi", - keys = { - { "", "Yazi toggle", desc = "Togggle Yazi" }, - { "-", "Yazi", desc = "Open Yazi at the current file" }, - { "tf", "Yazi cwd", desc = "File Manager in cwd(Yazi)" }, - }, - ---@type YaziConfig - opts = { - open_for_directories = false, - use_ya_for_events_reading = true, - use_yazi_client_id_flag = true, - highlight_hovered_buffers_in_same_directory = false, - integrations = { - --- What should be done when the user wants to grep in a directory - ----@param directory string - -- grep_in_directory = function(directory) - -- require("telescope.builtin").live_grep({ - -- prompt = "Search in " .. directory, - -- cwd = directory, - -- }) - -- end, - }, - }, -} diff --git a/.config/nvim-lazy/snippets/lua.json b/.config/nvim-lazy/snippets/lua.json index 603f332..6783c20 100644 --- a/.config/nvim-lazy/snippets/lua.json +++ b/.config/nvim-lazy/snippets/lua.json @@ -1,36 +1,31 @@ { - "mod": { - "prefix": "mod", - "body": ["---@type LazySpec", "return {", "\t'$1'", "\topts = {}", "}"], - "description": "Create a lazy plugin spec" + "localRequire": { + "prefix": ["preq", "lpca"], + "body": [ + "local ok_${1/.*\\.(.*)|.*/$1/}, ${1/.*\\.(.*)|.*/$1/} = pcall(require, '${1:module}')" + ], + "description": "Pcall require" }, - "modConfig": { - "prefix": "modc", + "localRequireWithIf": { + "prefix": ["preqi", "lpcai"], "body": [ - "---@type LazySpec", - "return {", - "\t'$1'", - "\tconfig = function()", - "\t\t$0", - "\tend", - "}" + "local ok_${1}, ${1/.*\\.(.*)|.*/$1/} = pcall(require, '${1:module}')", + "if ok_${1} then\n\t${2:return}\nend" ], - "description": "Create a lazy plugin spec - config" + "description": "Pcall require(with if)" }, - "plugin": { - "prefix": "plug", - "body": ["---@type LazySpec", "return {", "\t'$1'", "\topts = {$2}", "}"], + "mod": { + "prefix": ["mod", "plug"], + "body": ["---@type LazySpec", "return {", "\t'$1',", "\topts = {}", "}"], "description": "Create a lazy plugin spec" }, - "pluginConfig": { - "prefix": "plugc", + "modConfig": { + "prefix": ["modc", "plugc"], "body": [ "---@type LazySpec", "return {", - "\t'$1'", - "\tconfig = function()", - "\t\t$0", - "\tend", + "\t'$1',", + "\tconfig = function()\n$0\n\tend", "}" ], "description": "Create a lazy plugin spec - config" diff --git a/.config/nvim-vscode/init.vim b/.config/nvim-vscode/init.vim index d1bedbf..8d55bd8 100644 --- a/.config/nvim-vscode/init.vim +++ b/.config/nvim-vscode/init.vim @@ -106,6 +106,17 @@ if exists('g:vscode') map 15jzz map 15kzz + nnoremap o call VSCodeNotify('workbench.action.closeOtherEditors') + nnoremap C call VSCodeNotify('workbench.action.closeEditorsToTheRight') + + nnoremap 1 call VSCodeNotify('workbench.action.openEditorAtIndex1') + nnoremap 2 call VSCodeNotify('workbench.action.openEditorAtIndex2') + nnoremap 3 call VSCodeNotify('workbench.action.openEditorAtIndex3') + nnoremap 4 call VSCodeNotify('workbench.action.openEditorAtIndex4') + nnoremap 5 call VSCodeNotify('workbench.action.openEditorAtIndex5') + nnoremap 6 call VSCodeNotify('workbench.action.openEditorAtIndex6') + + nnoremap - call VSCodeNotify('eslint.executeAutofix') nnoremap = call VSCodeNotify('editor.action.formatSelection') vnoremap = call VSCodeNotifyRangePos('editor.action.formatSelection', line("v"), line("."), col("v"), col("."), 1) nnoremap g= call VSCodeNotify('eslint.executeAutofix') diff --git a/.config/nvim/.DS_Store b/.config/nvim/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1c6940b509e1ee4766564045fce002b9bd01f5d8 GIT binary patch literal 6148 zcmeHKO>fgM7=GOrmQW4#0D=orB(9|l_93QSLKz3H1i=ANNtQ6evbZ$qDyS;u3j7$3 z{1W&toZxwFPg>G)1To}SvLAmuZ|ppdU&llwhST^CQICimB*xAqWGjsOIW1Ysw75W_ zo>7vd2^}EMm)N$!Dqt1(*A(EryG{d2D5jLo?%&s_A3nV z-s90xcAU$Pm^e%za4K6jcnY6TFt25pb zGzPnD@>~4Wv-~a=qr?KK<;3FfCvi+!eU#R>h8L>V&YJ?}({sA#ZQ^#mRspNPA6J0m zgNMZE8>}>{(1A={0e~GeD?^!o6xhcz=o_pwq6a3lD^R-%bHxza9qpds`35VE+MR^C zdpHLHMC;J;EpboPV&AzsOx ztxGS*XRU|y3W<$*l}6=)%pAw6z(?_QBxUIHxB&DGRvOU)vp)h#2Af$0{;C4M0H9*0 AqyPW_ literal 0 HcmV?d00001 diff --git a/.config/nvim/.editorconfig b/.config/nvim/.editorconfig new file mode 100644 index 0000000..3ff902c --- /dev/null +++ b/.config/nvim/.editorconfig @@ -0,0 +1,7 @@ +# see https://github.com/CppCXY/EmmyLuaCodeStyle +[*.lua] +indent_size = 2 +quote_style = "single" +align_continuous_similar_call_args = true +align_chain_expr = "only_call_stmt" +auto_collapse_lines = true diff --git a/.config/nvim/after/ftplugin/markdown.lua b/.config/nvim/after/ftplugin/markdown.lua deleted file mode 100644 index c9322ea..0000000 --- a/.config/nvim/after/ftplugin/markdown.lua +++ /dev/null @@ -1,8 +0,0 @@ -vim.opt_local.colorcolumn = '100' -vim.opt_local.textwidth = 100 -vim.opt_local.spell = true -vim.opt_local.linebreak = true -vim.opt_local.spelllang = 'en' -vim.opt_local.concealcursor = 'nv' -vim.opt_local.formatoptions = 'tcqjn' -vim.opt_local.formatlistpat = '^\\s*\\([~]\\+\\|[-]\\+\\)\\s*' diff --git a/.config/nvim/after/plugin/keymaps.lua b/.config/nvim/after/plugin/keymaps.lua deleted file mode 100644 index f8ce199..0000000 --- a/.config/nvim/after/plugin/keymaps.lua +++ /dev/null @@ -1,61 +0,0 @@ -vim.keymap.set('', '0', '^', { noremap = false, silent = true }) -vim.keymap.set('n', ',w', 'w!', { desc = 'Save File' }) -vim.keymap.set('n', ',W', 'noautocmd w!', { desc = 'Save File(without autocmds)' }) -vim.keymap.set('n', '', ':nohl') - -vim.keymap.set('n', '', 'mz:m+`z') -vim.keymap.set('n', '', 'mz:m-2`z') -vim.keymap.set('n', '', ':tabp') -vim.keymap.set('n', '', ':tabn') - --- vim.keymap.set("n", "", "h") --- vim.keymap.set("n", "", "j") --- vim.keymap.set("n", "", "k") --- vim.keymap.set("n", "", "l") - -vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) -vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) - --- Pasting in visual mode doesn't copy -vim.keymap.set('x', 'p', [[ 'pgv"'.v:register.'y' ]], { expr = true }) -vim.keymap.set('n', 'dl', '"_dl') -vim.keymap.set({ 'n', 'x' }, 'c', '"_c') -vim.keymap.set('n', 'C', '"_C') - -vim.keymap.set('c', '', '', { silent = false }) -vim.keymap.set('c', '', '', { silent = false }) - -vim.cmd [[ nnoremap ,s :let @/='\<'.expand('').'\>'cgn ]] -vim.keymap.set('x', ',s', '"sy:let @/=@scgn') - --- vim.keymap.set('v', 'J', ":m '>+1gv=gv") --- vim.keymap.set('v', 'K', ":m '<-2gv=gv") --- vim.keymap.set('x', '<', '', '>gv') - -vim.keymap.set('i', ',', ',u') -vim.keymap.set('i', '.', '.u') -vim.keymap.set('i', '?', '?u') - -vim.keymap.set('x', 'y', '"+y') -vim.keymap.set('x', 'p', '"+p') - -vim.keymap.set('o', 'ie', ':exec "normal! ggVG"') -vim.keymap.set('o', 'iv', ':exec "normal! HVL"') -vim.keymap.set('n', ',e', ':e =expand("%:p:h") . "/" ', { silent = false, desc = 'Edit in same dir' }) -vim.keymap.set('n', ',t', ':tabe =expand("%:p:h") . "/" ', { silent = false, desc = 'Edit in same dir(Tab)' }) -vim.keymap.set( - 'n', - ',v', - ':vsplit =expand("%:p:h") . "/" ', - { silent = false, desc = 'Edit in same dir(Split)' } -) - -vim.keymap.set('n', 'R', function() - vim.cmd 'source %' - local file = vim.fn.substitute(vim.fn.expand '%:r', 'lua/', '', '') - local ok, mod = pcall(require, file) - if ok and type(mod) ~= 'boolean' and next(mod or {}) ~= nil and mod.config then - mod.config() - end -end, { silent = false, desc = 'Reload module' }) diff --git a/.config/nvim/after/plugin/options.lua b/.config/nvim/after/plugin/options.lua deleted file mode 100644 index 45435c8..0000000 --- a/.config/nvim/after/plugin/options.lua +++ /dev/null @@ -1,108 +0,0 @@ -local o = vim.opt -local g = vim.g - -o.number = true -o.relativenumber = true -o.expandtab = true -o.tabstop = 2 -o.softtabstop = -1 -o.shiftround = true -o.shiftwidth = 2 -o.smarttab = true -o.autoindent = true -o.smartindent = true -o.cindent = true -o.complete = '.,w,b,u,t,k' -o.smartcase = true -o.ignorecase = true -o.hlsearch = true -o.incsearch = true -o.splitright = true -o.splitbelow = true -o.cursorline = true -o.inccommand = 'split' -o.scrolloff = 16 -o.sidescrolloff = 8 -o.autoread = true -o.exrc = true -o.shortmess:append({ W = true, I = true, c = true }) -o.showmode = false -- Dont show mode since we have a statusline -o.showtabline = 2 -o.formatoptions = 'jcrqlnt' --- o.timeoutlen = 300 -o.swapfile = true -o.undofile = true -o.undolevels = 10000 -o.undodir = { vim.fn.stdpath 'state' .. '/undodir//' } -o.directory = { vim.fn.stdpath 'state' .. '/swap//' } -o.backupdir = { vim.fn.stdpath 'state' .. '/backup//' } -o.updatetime = 200 -o.foldcolumn = '1' -- '0' is not bad -o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value -o.foldlevelstart = 99 -o.foldenable = true -o.sessionoptions:append({ - 'globals', -}) -o.sessionoptions:remove 'folds' - -o.wildmode = 'longest:full,full' -o.wildignorecase = true -o.wildignore:append({ - '**/node_modules/*', - '**/.git/*', - '**/dist/*', - '**/build/*', - '**/static/*', - '**/.next/*', - '*.o', - '*.out', - '*.obj', - '*.exe', - '*.dll', - '*.jar', - '*.pyc', - '*.rbc', - '*.class', - '*.gif', - '*.ico', - '*.jpg', - '*.jpeg', - '*.png', - '*.mov', - '*.mht', - '*.swp', - '*.zip', - '*.tar.gz', - '*.tar.bz2', -}) - -o.completeopt = 'menu,menuone,noselect' -o.path:append '**' -vim.schedule(function() - o.clipboard:append(vim.env.SSH_TTY and '' or 'unnamedplus') -- Sync with system clipboard -end) -o.iskeyword:append '-' - --- credits - https://github.com/neovim/neovim/pull/17446 --- o.statuscolumn='%{foldlevel(v:lnum) > 0 ? (foldlevel(v:lnum) > foldlevel(v:lnum - 1) ? (foldclosed(v:lnum) == -1 ? " " : " ") : "") : " " }%=%l%s' --- o.statuscolumn = --- '%{foldlevel(v:lnum) > 0 ? (foldlevel(v:lnum) > foldlevel(v:lnum - 1) ? (foldclosed(v:lnum) == -1 ? "" : "") : "|") : " " }%=%{v:relnum?v:relnum:v:lnum}%s ' --- o.fillchars:append({ foldclose = '', foldopen = '',foldsep = '|' }) - -if vim.fn.executable 'rg' == 1 then - o.grepformat = '%f:%l:%c:%m' - o.grepprg = 'rg --vimgrep --smart-case' -- Also check RIPGREP_CONFIG_PATH="$HOME/.config/ripgreprc" -end - -vim.schedule(function() - if vim.fn.has 'nvim-0.9' == 1 then - o.splitkeep = 'screen' - o.shortmess:append({ C = true }) - o.backspace:append({ 'nostop' }) - o.diffopt:append 'linematch:60' - end -end) - --- Fix markdown indentation settings -g['markdown_recommended_style'] = 0 diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index bc414d7..27231d5 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -1,7 +1,10 @@ -vim.g.mapleader = ' ' -vim.g.maplocalleader = '\\' -vim.g.base46_cache = vim.fn.stdpath 'data' .. '/base46_cache/' +-- Make sure to setup `mapleader` and `maplocalleader` before +-- loading lazy.nvim so that mappings are correct. +-- This is also a good place to setup other settings (vim.opt) +vim.g.mapleader = " " +vim.g.maplocalleader = "\\" -vim.t['bufs'] = vim.t.bufs and vim.t.bufs or vim.api.nvim_list_bufs() -- initialize buffers for the current tab - -require 'lazy_init' +require("user.lazy_init") +require("user.config.options") +require("user.config.keymaps") +require("user.config.autocmds") diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json new file mode 100644 index 0000000..c50fbc4 --- /dev/null +++ b/.config/nvim/lazy-lock.json @@ -0,0 +1,93 @@ +{ + "FixCursorHold.nvim": { "branch": "master", "commit": "1900f89dc17c603eec29960f57c00bd9ae696495" }, + "LuaSnip": { "branch": "master", "commit": "03c8e67eb7293c404845b3982db895d59c0d1538" }, + "astrolsp": { "branch": "main", "commit": "292b2c9bf530182780e6f99acdf1c47efb53f656" }, + "auto-session": { "branch": "main", "commit": "82630e2f70be140f8dcc75a12e2ee2839e8488c2" }, + "blink-ripgrep.nvim": { "branch": "main", "commit": "519ac7894113f6a7b517b157c26e31fbd58a0de5" }, + "blink.cmp": { "branch": "main", "commit": "b6f11a0aa33e601c469a126e3ed6e35208fe3ea3" }, + "bullets.vim": { "branch": "master", "commit": "2253f970e54320dbd76fd6bb4f5a0bf2436ce232" }, + "catppuccin": { "branch": "main", "commit": "f67b886d65a029f12ffa298701fb8f1efd89295d" }, + "conform.nvim": { "branch": "master", "commit": "363243c03102a531a8203311d4f2ae704c620d9b" }, + "dial.nvim": { "branch": "master", "commit": "34bbd9c387c358190e61ce71017faad3dffa7a74" }, + "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, + "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" }, + "git-conflict.nvim": { "branch": "main", "commit": "4bbfdd92d547d2862a75b4e80afaf30e73f7bbb4" }, + "gitpad.nvim": { "branch": "main", "commit": "1e0f6fa335c72c05d1d3635120c572e198e5ae0d" }, + "gitsigns.nvim": { "branch": "main", "commit": "9772ce68a9a6d156f3f2166bfd0a17a09ab37eba" }, + "grapple.nvim": { "branch": "main", "commit": "b41ddfc1c39f87f3d1799b99c2f0f1daa524c5f7" }, + "gx.nvim": { "branch": "main", "commit": "c7e6a0ace694a098a5248d92a866c290bd2da1cc" }, + "heirline-components.nvim": { "branch": "main", "commit": "935f29dabd86f2669e0b3c8dd283b2d3b1cfaee7" }, + "heirline.nvim": { "branch": "master", "commit": "af3f441ea10f96105e1af14cd37bf213533812d2" }, + "hydra.nvim": { "branch": "main", "commit": "983852960cd4e4e9a1b272df0bd1447495aae755" }, + "jellybeans.nvim": { "branch": "main", "commit": "a2a38b87726189d887847841256b4ea82f0f999f" }, + "lazy.nvim": { "branch": "main", "commit": "7e6c863bc7563efbdd757a310d17ebc95166cef3" }, + "lazydev.nvim": { "branch": "main", "commit": "a1b78b2ac6f978c72e76ea90ae92a94edf380cfc" }, + "lexima.vim": { "branch": "master", "commit": "f851b232505766aff7bed7d20100ad31c9c0b33b" }, + "luvit-meta": { "branch": "main", "commit": "1df30b60b1b4aecfebc785aa98943db6c6989716" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "f75e877f5266e87523eb5a18fcde2081820d087b" }, + "mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, + "mini.ai": { "branch": "main", "commit": "25f598f5bcfa247de0be783882d0e02ae5432eb1" }, + "mini.align": { "branch": "main", "commit": "3bdf6f0b91b31db5300a7b04f53f296a7fb150c1" }, + "mini.extra": { "branch": "main", "commit": "4fe88ba62d10fd9698c3cb4a89812cd72e52e794" }, + "mini.files": { "branch": "main", "commit": "0db8f49088bcefff23c5cb8498a6c94e46a45a8e" }, + "mini.icons": { "branch": "main", "commit": "ec61af6e606fc89ee3b1d8f2f20166a3ca917a36" }, + "mini.indentscope": { "branch": "main", "commit": "8ce41a77eed7f4121c83c67fda5e2e86af999e6d" }, + "mini.move": { "branch": "main", "commit": "c8b30e92dd2668dd6e56a9a23cb7d4ee38c2266d" }, + "mini.operators": { "branch": "main", "commit": "81e5059268154f5a8b594c95748968febdd539e3" }, + "mini.pick": { "branch": "main", "commit": "6cb8d8a253e66fdd175c56e2815aa1ada0fb42a4" }, + "mini.snippets": { "branch": "main", "commit": "077566fb7eb918f3a4136913645eb57cd622a0c4" }, + "mini.surround": { "branch": "main", "commit": "ceddea5fe862f13b279d9bbe81c3327a0e66d56b" }, + "multicursors.nvim": { "branch": "main", "commit": "562809aaf203b4c65482a75199166d360f2b9298" }, + "multiple-cursors.nvim": { "branch": "main", "commit": "2f5e786c43aa9c0fc34b295cfcc9bfbacef8e926" }, + "neogen": { "branch": "main", "commit": "dd0301bfba1f83a3bc009b5430fce7aa3cee6941" }, + "neogit": { "branch": "master", "commit": "63124cf520ff24d09deb3b850e053908ab0fc66a" }, + "neotest": { "branch": "master", "commit": "d66cf4e05a116957f0d3a7755a24291c7d1e1f72" }, + "neotest-golang": { "branch": "main", "commit": "059c5754a17629c25dce61eefcea40164ee62975" }, + "neotest-jest": { "branch": "main", "commit": "514fd4eae7da15fd409133086bb8e029b65ac43f" }, + "neotest-minitest": { "branch": "main", "commit": "7ff057de8ab2c27491ff27c7be9826b8f3bb5ec1" }, + "neotest-plenary": { "branch": "master", "commit": "3523adcf9ffaad1911960c5813b0136c1b63a2ec" }, + "neotest-vitest": { "branch": "main", "commit": "9f8f05bee6e5b980a4d1e84adab119a8f9756a77" }, + "nightfox.nvim": { "branch": "main", "commit": "595ffb8f291fc4a9bef3201a28b7c0379a41cdee" }, + "nordic.nvim": { "branch": "main", "commit": "2e060bda700365af5ce936bec6bb2b8ff2daeb19" }, + "nui.nvim": { "branch": "main", "commit": "53e907ffe5eedebdca1cd503b00aa8692068ca46" }, + "nvim-autopairs": { "branch": "master", "commit": "3d02855468f94bf435db41b661b58ec4f48a06b7" }, + "nvim-dap": { "branch": "master", "commit": "12b846bedbc7221e833b5e6611de21917d7d9184" }, + "nvim-dap-go": { "branch": "main", "commit": "07739481317d36ddb3e3e8fbdfcd8f90b4167d73" }, + "nvim-dap-ui": { "branch": "master", "commit": "bc81f8d3440aede116f821114547a476b082b319" }, + "nvim-dap-virtual-text": { "branch": "master", "commit": "df66808cd78b5a97576bbaeee95ed5ca385a9750" }, + "nvim-highlight-colors": { "branch": "main", "commit": "68a4df620cf58e2c7336e53738e8cf3a522ad694" }, + "nvim-lint": { "branch": "master", "commit": "789b7ada1b4f00e08d026dffde410dcfa6a0ba87" }, + "nvim-lspconfig": { "branch": "master", "commit": "66bc018936c6ff76beb75f89d986af6442db4001" }, + "nvim-navic": { "branch": "master", "commit": "8649f694d3e76ee10c19255dece6411c29206a54" }, + "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, + "nvim-surround": { "branch": "main", "commit": "ae298105122c87bbe0a36b1ad20b06d417c0433e" }, + "nvim-treesitter": { "branch": "master", "commit": "9e0b5e7f0d148963d6ec71c48cec1a3f8607d619" }, + "nvim-treesitter-context": { "branch": "master", "commit": "9a49f43a2ec9bf77aecfb0fcbc43af43338375c0" }, + "nvim-treesitter-textobjects": { "branch": "master", "commit": "ad8f0a472148c3e0ae9851e26a722ee4e29b1595" }, + "nvim-ts-autotag": { "branch": "main", "commit": "1cca23c9da708047922d3895a71032bc0449c52d" }, + "nvim-ufo": { "branch": "main", "commit": "81f5ffa6e8ba27c48403cf681d4b383d924e03e4" }, + "nvim-vtsls": { "branch": "main", "commit": "45c6dfea9f83a126e9bfc5dd63430562b3f8af16" }, + "nvim-window-picker": { "branch": "main", "commit": "0dfef64eaf063e1cd27983ab11a30e7bc5b74fac" }, + "package-info.nvim": { "branch": "master", "commit": "3de4f3569ce60e248707df042b72769b3ec343b8" }, + "persistent-breakpoints.nvim": { "branch": "main", "commit": "4b199b1dcfd136cac8b0fa9c8dbbdeb81463f7a9" }, + "plenary.nvim": { "branch": "master", "commit": "3707cdb1e43f5cea73afb6037e6494e7ce847a66" }, + "poimandres.nvim": { "branch": "main", "commit": "a488957d803943a4201ac3b774913fcafa9e6b3a" }, + "promise-async": { "branch": "main", "commit": "119e8961014c9bfaf1487bf3c2a393d254f337e2" }, + "quick-scope": { "branch": "master", "commit": "f2b6043e04d9ef05205c8953e389304a4c1946f2" }, + "refactoring.nvim": { "branch": "master", "commit": "2db6d378e873de31d18ade549c2edba64ff1c2e3" }, + "render-markdown.nvim": { "branch": "main", "commit": "2a9e0ab6043bfb4996ce6a6a35594ab357e5d299" }, + "schemastore.nvim": { "branch": "main", "commit": "a5a94907ea85e35a359be0763233e9055a325d36" }, + "snacks.nvim": { "branch": "main", "commit": "f821b4a846647ef8aed2d382dfd10edfa7d4fb2c" }, + "template-string.nvim": { "branch": "main", "commit": "da5f326b65fb74fd068aa1d8b55461b64c8fb23b" }, + "ts-comments.nvim": { "branch": "main", "commit": "872dcfa0418f4a33b7437fb4d9f4e89f2f000d74" }, + "typescript-tools.nvim": { "branch": "master", "commit": "35e397ce467bedbbbb5bfcd0aa79727b59a08d4a" }, + "undotree": { "branch": "master", "commit": "2556c6800b210b2096b55b66e74b4cc1d9ebbe4f" }, + "vim-dadbod": { "branch": "master", "commit": "9f0ca8bcef704659820a95c3bbd2c262583a66a1" }, + "vim-dadbod-completion": { "branch": "master", "commit": "c7f1be21a08b8fc9d927a19db89a4aa995402787" }, + "vim-dadbod-ui": { "branch": "master", "commit": "f4d37b7312ae6489e5c04bee654ca521baac188a" }, + "vim-matchup": { "branch": "master", "commit": "aca23ce53ebfe34e02c4fe07e29e9133a2026481" }, + "vim-swap": { "branch": "master", "commit": "9358bfdc5e377aa13e7c2c2dd8699ba32b0dcf83" }, + "vim-visual-multi": { "branch": "master", "commit": "a6975e7c1ee157615bbc80fc25e4392f71c344d4" }, + "which-key.nvim": { "branch": "main", "commit": "0e76a87ac51772569aec678dc74baa8e2a86100c" }, + "yazi.nvim": { "branch": "main", "commit": "b81c3e54eb62245c909a6995c927caaae58747eb" } +} diff --git a/.config/nvim/lua/.DS_Store b/.config/nvim/lua/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..00cc1185c1673f61227f3491001915af011532a5 GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8CKRCuMUMfmMXPN^@e*r2cr~I2m718M!I&-iF^5vfRbR+A@pW`& zcT>>nNf0SBF#Bz0XEw~YVJE{FuNHSlfJ;A`_YVd3iF@=ltr8!XQaotv6n&))p3*48y1! z*Ur7jozzXUr02$$_;e;j=#_KVI}e8Wps{i!qSOtdVJrgze+VvD7eVBUyeG2APh_m4 z77Wug2aUDyxV_)BcDkKO(;DyZwVPIFw>z1b#_Gn_!Rg>3e2m1iVxGfiDP>t>2`@02 zrt{>)Q7EE2u$BI$A0aV73=jiz$$-A>jQU(=M@bO_#K3PD!27`hMYJ^*3gy)SgKPl+ zYhacFbNTBJXrTen)>tS63kX-CfGU*h7K7`~fva#>x3zzvP=zxt-wgZcH*?*gaNT%t zOS&^|E2NPaAO=1&fW03`1MC0s&;7r2qJbD72Ii9iUh6yk9^|HL>r9qdYc0?lP!#kl n6i!26B1&APCxEubLLpc{=tn@(Km#%Grwn`myBk#A literal 0 HcmV?d00001 diff --git a/.config/nvim/lua/chadrc.lua b/.config/nvim/lua/chadrc.lua deleted file mode 100644 index c363179..0000000 --- a/.config/nvim/lua/chadrc.lua +++ /dev/null @@ -1,54 +0,0 @@ ----@type ChadrcConfig -local M = {} - -M.ui = { - cmp = { - icons = true, - lspkind_text = true, - ---@type 'default'|'flat_light'|'flat_dark'|'atom'|'atom_colored' - style = 'default', -- - }, - tabufline = { - enabled = true, - }, - theme = 'gruvchad', --'poimandres' | 'tomorrow_night' | 'nightlamp' | 'gruvchad' | 'everforest' | 'kanagawa' -} -M.base46 = { - transparency = true, - integrations = { - 'defaults', - 'cmp', - 'dap', - 'codeactionmenu', - 'git', - 'lsp', - 'mason', - 'navic', - 'neogit', - 'whichkey', - 'treesitter', - 'semantic_tokens', - 'todo', - -- more - }, - hl_override = { - LspReferenceText = { bg = '#2D3031', fg = 'white', bold = true }, - LspReferenceRead = { bg = '#2D3031', fg = 'white', bold = true }, - LspReferenceWrite = { bg = '#2D3031', fg = 'white', bold = true }, - QuickScopePrimary = { fg = '#ffdd33', bg = '#2D3031', underline = true, bold = true }, - QuickScopeSecondary = { fg = '#cc8c3c', bg = '#2D3031', underline = true, bold = true }, - }, -} -vim.api.nvim_set_hl(0, 'QuickScopePrimary', { - fg = '#ffdd33', - bg = '#2D3031', - underline = true, - bold = true, -}) -vim.api.nvim_set_hl(0, 'QuickScopeSecondary', { - fg = '#cc8c3c', - bg = '#2D3031', - underline = true, - bold = true, -}) -return M diff --git a/.config/nvim/lua/lazy_init.lua b/.config/nvim/lua/lazy_init.lua deleted file mode 100644 index 8a2b46c..0000000 --- a/.config/nvim/lua/lazy_init.lua +++ /dev/null @@ -1,38 +0,0 @@ -local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' -if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - 'git', - 'clone', - '--filter=blob:none', - 'https://github.com/folke/lazy.nvim.git', - '--branch=stable', -- latest stable release - lazypath, - }) -end -vim.opt.rtp:prepend(lazypath) - -require('lazy').setup({ - { import = 'plugins' }, - { import = 'plugins.mini' }, - { import = 'plugins.lsp' }, -}, { - change_detection = { - enabled = true, - notify = false, - }, - lockfile = vim.fn.stdpath 'state' .. '/lazy-lock.json', -- lockfile generated after running update. - performance = { - rtp = { - ---@type string[] list any plugins you want to disable here - disabled_plugins = { - 'gzip', - 'matchit', - 'netrwPlugin', - 'tarPlugin', - 'tohtml', - 'tutor', - 'zipPlugin', - }, - }, - }, -}) diff --git a/.config/nvim/lua/my_config/catppuccin.lua b/.config/nvim/lua/my_config/catppuccin.lua deleted file mode 100644 index db81a95..0000000 --- a/.config/nvim/lua/my_config/catppuccin.lua +++ /dev/null @@ -1,24 +0,0 @@ -require('catppuccin').setup({ - ---@type "latte"| "frappe"| "macchiato"| "mocha"|"auto" - flavour = 'mocha', - transparent_background = true, - dim_inactive = { - enabled = false, -- dims the background color of inactive window - shade = 'dark', - percentage = 0.15, -- percentage of the shade to apply to the inactive window - }, - integrations = { - navic = { - enabled = true, - }, - blink_cmp = true, - fzf = true, - }, - custom_highlights = function(colors) - return { - QuickScopePrimary = { fg = '#dfbb78', bg = '#505050', style = { 'underline', 'bold' } }, - QuickScopeSecondary = { fg = '#61afef', bg = '#505050', style = { 'underline', 'bold' } }, - } - end, -}) -vim.cmd 'colorscheme catppuccin' diff --git a/.config/nvim/lua/my_config/gruber-darker.lua b/.config/nvim/lua/my_config/gruber-darker.lua deleted file mode 100644 index b4563a1..0000000 --- a/.config/nvim/lua/my_config/gruber-darker.lua +++ /dev/null @@ -1,58 +0,0 @@ ----@diagnostic disable-next-line: missing-fields -require('gruber-darker').setup({}) -vim.cmd.colorscheme 'gruber-darker' -local c = require 'gruber-darker.palette' --- local vim_hl = require("gruber-darker.highlights.vim").highlights -local gruber_hl = require('gruber-darker.highlights.colorscheme').highlights -vim.api.nvim_set_hl(0, 'MatchParenCur', { bold = true }) -vim.api.nvim_set_hl(0, 'lualine_c_12', { bg = c['bg+4']:to_string() }) -vim.api.nvim_set_hl(0, 'lualine_c_buffers_inactive', { bg = c['bg+1']:to_string() }) -vim.api.nvim_set_hl(0, 'lualine_x_tabs_active', { bg = c['bg+4']:to_string() }) -vim.api.nvim_set_hl(0, 'lualine_x_tabs_inactive', { bg = c['bg+1']:to_string() }) -vim.api.nvim_set_hl(0, '@lsp.type.keyword.lua', { fg = c['brown']:to_string(), bold = false }) -vim.api.nvim_set_hl(0, '@lsp.type.event.lua', { link = 'GruberDarkerYellowBold' }) -vim.api.nvim_set_hl(0, 'WinBar', { link = 'TreesitterContext' }) -vim.api.nvim_set_hl(0, 'WinBarNC', { link = 'Normal' }) -vim.api.nvim_set_hl( - 0, - 'QuickScopePrimary', - { fg = c['yellow']:to_string(), bg = c['bg+1']:to_string(), underline = true, bold = true } -) -vim.api.nvim_set_hl( - 0, - 'QuickScopeSecondary', - { fg = c['brown']:to_string(), bg = c['bg+1']:to_string(), underline = true, bold = true } -) ---[[ -local Color = require("gruber-darker.color") -local M = {} - ----@type table -M = { - none = Color.none(), - fg = Color.new(0xe4e4e4), - ["fg+1"] = Color.new(0xf4f4ff), - ["fg+2"] = Color.new(0xf5f5f5), - white = Color.new(0xffffff), - black = Color.new(0x000000), - ["bg-1"] = Color.new(0x101010), - bg = Color.new(0x181818), - ["bg+1"] = Color.new(0x282828), - ["bg+2"] = Color.new(0x453d41), - ["bg+3"] = Color.new(0x484848), - ["bg+4"] = Color.new(0x52494e), - ["red-1"] = Color.new(0xc73c3f), - red = Color.new(0xf43841), - ["red+1"] = Color.new(0xff4f58), - green = Color.new(0x73d936), - yellow = Color.new(0xffdd33), - brown = Color.new(0xcc8c3c), - quartz = Color.new(0x95a99f), - ["niagara-2"] = Color.new(0x303540), - ["niagara-1"] = Color.new(0x565f73), - niagara = Color.new(0x96a6c8), - wisteria = Color.new(0x9e95c7), -} - -return M ---]] diff --git a/.config/nvim/lua/my_config/kangawa.lua b/.config/nvim/lua/my_config/kangawa.lua deleted file mode 100644 index df8024e..0000000 --- a/.config/nvim/lua/my_config/kangawa.lua +++ /dev/null @@ -1,46 +0,0 @@ ----@type "wave" | "dragon" | "lotus" -local themeName = 'dragon' -require('kanagawa').setup({ - compile = true, - -- transparent = true, -- do not set background color - -- dimInactive = true, - ---@type "wave" | "dragon" | "lotus" - theme = themeName, - ---@type table - background = { -- map the value of 'background' option to a theme - dark = themeName, - light = 'lotus', - }, - overrides = function(colors) -- add/modify highlights - local theme = colors.theme - return { - Pmenu = { fg = theme.ui.shade0, bg = theme.ui.bg_p1 }, -- add `blend = vim.o.pumblend` to enable transparency - PmenuSel = { fg = 'NONE', bg = theme.ui.bg_p2 }, - PmenuSbar = { bg = theme.ui.bg_m1 }, - PmenuThumb = { bg = theme.ui.bg_p2 }, - QuickScopePrimary = { fg = theme.palette.autumnGreen, bg = theme.palette.sumiInk2, underline = true, bold = true }, - QuickScopeSecondary = { - fg = theme.palette.autumnYellow, - bg = theme.palette.sumiInk2, - underline = true, - bold = true, - }, - } - end, -}) -vim.cmd 'colorscheme kanagawa-wave' -local colors = require('kanagawa.colors').setup({ theme = themeName }) --- local palette_colors = colors.palette -vim.api.nvim_set_hl(0, 'QuickScopePrimary', { - fg = colors.palette.autumnGreen, - bg = colors.palette.sumiInk2, - underline = true, - bold = true, -}) - -vim.api.nvim_set_hl(0, 'QuickScopeSecondary', { - fg = colors.palette.autumnYellow, - bg = colors.palette.sumiInk2, - underline = true, - bold = true, -}) diff --git a/.config/nvim/lua/my_config/nordic.lua b/.config/nvim/lua/my_config/nordic.lua deleted file mode 100644 index b36a11e..0000000 --- a/.config/nvim/lua/my_config/nordic.lua +++ /dev/null @@ -1,23 +0,0 @@ -require('nordic').setup({ - transparent = { bg = true }, - -- Enable brighter float border. - bright_border = true, - on_highlight = function(highlights, palette) - highlights.QuickScopePrimary = { - fg = palette.yellow.bright, - bg = palette.gray0, - bold = true, - underline = true, - } - highlights.QuickScopeSecondary = { - fg = palette.orange.dim, - bg = palette.gray0, - bold = true, - underline = true, - } - highlights['@tag.attribute'] = { - fg = '#6cc3b7', -- #6dada4 | - } - end, -}) -vim.cmd.colorscheme 'nordic' diff --git a/.config/nvim/lua/my_config/onenord.lua b/.config/nvim/lua/my_config/onenord.lua deleted file mode 100644 index fe37272..0000000 --- a/.config/nvim/lua/my_config/onenord.lua +++ /dev/null @@ -1,24 +0,0 @@ -require('onenord').setup({ - fade_nc = true, - disable = { - background = true, - }, - styles = { - comments = 'italic', - strings = 'NONE', - keywords = 'NONE', - functions = 'bold', - variables = 'NONE', - diagnostics = 'underline', - }, - custom_highlights = { - QuickScopePrimary = { fg = '#dfbb78', bg = '#505050', style = 'underline,bold' }, - QuickScopeSecondary = { - fg = '#61afef', - bg = '#505050', - style = 'underline,bold', - }, - PmenuSel = { bg = '#61afef', fg = '#24253b' }, - }, -}) -vim.cmd 'colorscheme onenord' diff --git a/.config/nvim/lua/my_config/tokyonight.lua b/.config/nvim/lua/my_config/tokyonight.lua deleted file mode 100644 index 8da25b4..0000000 --- a/.config/nvim/lua/my_config/tokyonight.lua +++ /dev/null @@ -1,27 +0,0 @@ ----@diagnostic disable: missing-fields -require('tokyonight').setup( - ---@type tokyonight.Config - { - style = 'night', - transparent = false, - --- You can override specific highlights to use other groups or a hex color - --- function will be called with a Highlights and ColorScheme table - ---@param hl tokyonight.Highlights - ---@param c ColorScheme - on_highlights = function(hl, c) - local prompt = '#2d3149' - hl.TelescopeNormal = { bg = c.bg_dark, fg = c.fg_dark } - hl.TelescopeBorder = { bg = c.bg_dark, fg = c.bg_dark } - hl.TelescopePromptNormal = { bg = prompt } - hl.TelescopePromptBorder = { bg = prompt, fg = prompt } - hl.TelescopePromptTitle = { bg = prompt, fg = prompt } - hl.TelescopePreviewTitle = { bg = c.bg_dark, fg = c.bg_dark } - hl.TelescopeResultsTitle = { bg = c.bg_dark, fg = c.bg_dark } - - hl.QuickScopePrimary = { fg = c.todo, bg = c.fg_gutter, bold = true, underline = true } - hl.QuickScopeSecondary = { fg = c.rainbow[2], bg = c.fg_gutter, bold = true, underline = true } - end, - } -) - -vim.cmd.colorscheme 'tokyonight' diff --git a/.config/nvim/lua/my_config/util.lua b/.config/nvim/lua/my_config/util.lua deleted file mode 100644 index 5f7509f..0000000 --- a/.config/nvim/lua/my_config/util.lua +++ /dev/null @@ -1,43 +0,0 @@ -local M = {} - -M.unique_append_table = function(list, values) - local appendValues = {} - local l = list or {} - if not values or next(values) == nil then - return l - end - for _, value in ipairs(values) do - if not vim.tbl_contains(l, value) then - table.insert(appendValues, value) - end - end - return vim.list_extend(l, appendValues) -end - ---- A wrapper around `age.nvim` to get the credentials from the identity file. ----@param secret_file string The secret file to read the credentials from(`secret_file` should be in location `$HOME/.config/age/`). ----@return string|nil secret The credentials from the identity file. -M.get_age_credentials = function(secret_file) - local identity_file = vim.fn.expand '$HOME/.config/age/identity.txt' - - if 0 == vim.fn.filereadable(identity_file) then - return nil - end - - local secret = vim.fn.expand('$HOME/.config/age/' .. secret_file) - return require('age').get(secret, identity_file) -end - -function M.get_lsp_capabilities(override) - local ok_cmp, cmp_nvim_lsp = pcall(require, 'cmp_nvim_lsp') - local ok_blink, blink = pcall(require, 'blink.cmp') - local capabilities - if ok_cmp then - capabilities = cmp_nvim_lsp.default_capabilities(override) - elseif ok_blink then - capabilities = blink.get_lsp_capabilities(override) - end - return capabilities -end - -return M diff --git a/.config/nvim/lua/plugins/avante.lua b/.config/nvim/lua/plugins/avante.lua deleted file mode 100644 index a29c006..0000000 --- a/.config/nvim/lua/plugins/avante.lua +++ /dev/null @@ -1,170 +0,0 @@ -local function get_ollama_setup() - local ollama_setup = { - -- add any opts here - ---@type Provider - provider = 'gemini', - vendors = { - ---@type AvanteProvider - ollama = { - ['local'] = true, - endpoint = '127.0.0.1:11434/v1', - model = 'llama3.2', - parse_curl_args = function(opts, code_opts) - return { - url = opts.endpoint .. '/chat/completions', - headers = { - ['Accept'] = 'application/json', - ['Content-Type'] = 'application/json', - }, - body = { - model = opts.model, - messages = require('avante.providers').copilot.parse_message(code_opts), -- you can make your own message, but this is very advanced - max_tokens = 2048, - stream = true, - }, - } - end, - parse_response_data = function(data_stream, event_state, opts) - require('avante.providers').openai.parse_response(data_stream, event_state, opts) - end, - }, - }, - } - return ollama_setup -end - ----@type LazySpec -return { - { - 'yetone/avante.nvim', - event = 'VeryLazy', - version = false, - build = 'make', - opts = function() - vim.env.GEMINI_API_KEY = require('my_config.util').get_age_credentials 'gemini_api.age' - if not vim.env.GEMINI_API_KEY then - return get_ollama_setup() - end - return { - ---@type Provider - provider = 'gemini', - gemini = { - model = 'gemini-2.0-flash-exp', - }, - } - end, - dependencies = { - 'KingMichaelPark/age.nvim', -- Add age dependency - 'nvim-treesitter/nvim-treesitter', - { - 'stevearc/dressing.nvim', - opts = { - select = { - -- Priority list of preferred vim.select implementations - backend = { 'fzf_lua', 'telescope', 'fzf', 'builtin', 'nui' }, - -- Options for fzf-lua - fzf_lua = { - winopts = { - height = 0.5, - width = 0.8, - }, - }, - }, - }, - }, - 'nvim-lua/plenary.nvim', - 'MunifTanjim/nui.nvim', - --- The below dependencies are optional, - 'nvim-tree/nvim-web-devicons', -- or echasnovski/mini.icons - 'zbirenbaum/copilot.lua', -- for providers='copilot' - { - -- support for image pasting - 'HakonHarnes/img-clip.nvim', - event = 'VeryLazy', - opts = { - -- recommended settings - default = { - embed_image_as_base64 = false, - prompt_for_file_name = false, - drag_and_drop = { - insert_mode = true, - }, - -- required for Windows users - use_absolute_path = true, - }, - }, - }, - { - -- Make sure to set this up properly if you have lazy=true - 'MeanderingProgrammer/render-markdown.nvim', - opts = { - file_types = { 'markdown', 'Avante' }, - }, - ft = { 'markdown', 'Avante' }, - }, - }, - }, - { - 'olimorris/codecompanion.nvim', - cmd = { - 'CodeCompanion', - 'CodeCompanionChat', - 'CodeCompanionCmd', - 'CodeCompanionActions', - }, - keys = { - { 'cc', 'CodeCompanionChat toggle', desc = 'Chat Toggle', mode = { 'n', 'x' } }, - { 'cA', 'CodeCompanionChat add', desc = 'Chat Add Selection', mode = 'x' }, - { 'ca', 'CodeCompanionActions', desc = 'Chat Actions', mode = { 'n', 'x' } }, - { 'cd', 'CodeCompanionCmd/', desc = 'Chat Cmd' }, - }, - dependencies = { - 'nvim-lua/plenary.nvim', - 'nvim-treesitter/nvim-treesitter', - 'KingMichaelPark/age.nvim', - { - 'MeanderingProgrammer/render-markdown.nvim', - opts = { - file_types = { 'markdown', 'Avante', 'codecompanion' }, - }, - ft = { 'markdown', 'Avante', 'codecompanion' }, - }, - }, - config = function() - require('codecompanion').setup({ - display = { chat = { render_headers = false } }, - strategies = { - --NOTE: Change the adapter as required - chat = { adapter = 'gemini' }, - inline = { adapter = 'gemini' }, - }, - adapters = { - openai_compatible = function() - return require('codecompanion.adapters').extend('openai_compatible', { - env = { - url = 'https://glhf.chat', - api_key = function() - return require('my_config.util').get_age_credentials 'glhf.age' - end, - chat_url = '/api/openai/v1/chat/completions', - }, - schema = { - model = { default = 'hf:Qwen/Qwen2.5-Coder-32B-Instruct' }, - num_ctx = { default = 32768 }, - }, - }) - end, - gemini = function() - return require('codecompanion.adapters').extend('gemini', { - schema = { - model = { - default = 'gemini-2.0-flash-exp', - }, - }, - }) - end, - }, - }) - end, - }, -} diff --git a/.config/nvim/lua/plugins/base64.lua b/.config/nvim/lua/plugins/base64.lua deleted file mode 100644 index ddf7b39..0000000 --- a/.config/nvim/lua/plugins/base64.lua +++ /dev/null @@ -1,54 +0,0 @@ -if true then - return {} -end ----@type LazySpec -return { - { 'nvim-lua/plenary.nvim', lazy = true }, - - { - 'NvChad/base46', - lazy = true, - build = function() - require('base46').load_all_highlights() - end, - }, - - -- if u want nvchad's ui plugin :) - { - 'NvChad/ui', - config = function() - require 'nvchad' - -- dofile(vim.g.base46_cache .. 'defaults') - -- dofile(vim.g.base46_cache .. 'statusline') - end, - }, - - -- dependency for ui - { - 'nvim-tree/nvim-web-devicons', - lazy = true, - opts = function() - return { override = require 'nvchad.icons.devicons' } - end, - config = function(_, opts) - dofile(vim.g.base46_cache .. 'devicons') - require('nvim-web-devicons').setup(opts) - end, - }, - { - 'SmiteshP/nvim-navic', - lazy = true, - -- event = "LspAttach", - config = function() - dofile(vim.g.base46_cache .. 'navic') - vim.api.nvim_set_hl(0, 'WinBar', { link = 'TreesitterContext' }) - vim.api.nvim_set_hl(0, 'WinBarNC', { link = 'Normal' }) - require('nvim-navic').setup({ - highlight = true, - lsp = { auto_attach = true }, - }) - - vim.o.winbar = "%{%v:lua.require'nvim-navic'.get_location()%}" - end, - }, -} diff --git a/.config/nvim/lua/plugins/blink-cmp.lua b/.config/nvim/lua/plugins/blink-cmp.lua deleted file mode 100644 index 3e8a9da..0000000 --- a/.config/nvim/lua/plugins/blink-cmp.lua +++ /dev/null @@ -1,209 +0,0 @@ --- NOTE: Specify the trigger character(s) used for luasnip -local trigger_text = ';' ----@type LazySpec -return { - 'Saghen/blink.cmp', - enabled = true, - version = '*', - dependencies = { - 'mikavilpas/blink-ripgrep.nvim', - { - 'folke/lazydev.nvim', - ft = 'lua', -- only load on lua files - dependencies = { 'Bilal2453/luvit-meta' }, - opts = { - library = { - 'lazy.nvim', - -- See the configuration section for more details - -- Load luvit types when the `vim.uv` word is found - { path = '${3rd}/luv/library', words = { 'vim%.uv' } }, - }, - }, - }, - { - 'L3MON4D3/LuaSnip', - version = 'v2.*', - build = 'make install_jsregexp', - dependencies = { - 'rafamadriz/friendly-snippets', - config = function() - require('luasnip.loaders.from_vscode').lazy_load() - require('luasnip.loaders.from_vscode').lazy_load({ paths = { vim.fn.stdpath 'config' .. '/snippets' } }) - - local extends = { - typescript = { 'tsdoc' }, - javascript = { 'jsdoc' }, - lua = { 'luadoc' }, - python = { 'pydoc' }, - rust = { 'rustdoc' }, - cs = { 'csharpdoc' }, - java = { 'javadoc' }, - c = { 'cdoc' }, - cpp = { 'cppdoc' }, - php = { 'phpdoc' }, - kotlin = { 'kdoc' }, - ruby = { 'rdoc' }, - sh = { 'shelldoc' }, - } - -- friendly-snippets - enable standardized comments snippets - for ft, snips in pairs(extends) do - require('luasnip').filetype_extend(ft, snips) - end - end, - }, - opts = { history = true, delete_check_events = 'TextChanged' }, - }, - }, - ---@module 'blink.cmp' - ---@type blink.cmp.Config - opts = { - keymap = { - preset = 'enter', - [''] = { 'select_and_accept', 'fallback' }, - [''] = { 'select_prev', 'fallback' }, - [''] = { 'select_next', 'fallback' }, - [''] = { 'select_next', 'snippet_forward', 'fallback' }, - [''] = { 'select_prev', 'snippet_backward', 'fallback' }, - -- show with a list of providers - [''] = { - function(cmp) - cmp.show({ providers = { 'snippets' } }) - end, - 'fallback', - }, - cmdline = { - preset = 'enter', - [''] = {}, - [''] = {}, - [''] = { 'select_prev', 'fallback' }, - [''] = { 'select_next', 'fallback' }, - [''] = { 'select_next', 'fallback' }, - [''] = { 'select_prev', 'fallback' }, - }, - }, - completion = { - ghost_text = { enabled = false }, - menu = { border = 'rounded' }, - documentation = { window = { border = 'rounded' } }, - list = { - selection = { - preselect = function(ctx) - return ctx.mode ~= 'cmdline' - end, - }, - }, - }, - sources = { - default = { - 'lsp', - 'path', - 'buffer', - 'snippets', - 'ripgrep', - 'lazydev', - }, - providers = { - ripgrep = { - module = 'blink-ripgrep', - name = 'Ripgrep', - ---@module "blink-ripgrep" - ---@type blink-ripgrep.Options - opts = { - prefix_min_len = 4, - score_offset = 10, -- should be lower priority - max_filesize = '300K', - search_casing = '--smart-case', - }, - }, - lazydev = { - name = 'LazyDev', - module = 'lazydev.integrations.blink', - }, - lsp = { - name = 'LSP', - module = 'blink.cmp.sources.lsp', - fallbacks = { 'lazydev' }, - score_offset = 150, -- the higher the number, the higher the priority - -- Filter text items from the LSP provider, since we have the buffer provider for that - transform_items = function(_, items) - for _, item in ipairs(items) do - if item.kind == require('blink.cmp.types').CompletionItemKind.Snippet then - item.score_offset = item.score_offset - 3 - end - end - - return vim.tbl_filter(function(item) - return item.kind ~= require('blink.cmp.types').CompletionItemKind.Text - end, items) - end, - }, - path = { - name = 'Path', - module = 'blink.cmp.sources.path', - score_offset = 25, - -- fallbacks = { 'buffer' }, - opts = { - trailing_slash = false, - label_trailing_slash = true, - }, - }, - buffer = { - name = 'Buffer', - module = 'blink.cmp.sources.buffer', - min_keyword_length = 3, - score_offset = 15, -- the higher the number, the higher the priority - }, - snippets = { - name = 'Snippets', - module = 'blink.cmp.sources.snippets', - min_keyword_length = 2, - score_offset = 60, -- the higher the number, the higher the priority - -- -- Only show snippets if I type the trigger_text characters, so - -- -- to expand the "bash" snippet, if the trigger_text is ";" I have to - -- should_show_items = function() - -- local col = vim.api.nvim_win_get_cursor(0)[2] - -- local before_cursor = vim.api.nvim_get_current_line():sub(1, col) - -- -- NOTE: remember that `trigger_text` is modified at the top of the file - -- return before_cursor:match(trigger_text .. '%w*$') ~= nil - -- end, - -- -- After accepting the completion, delete the trigger_text characters - -- -- from the final inserted text - -- transform_items = function(_, items) - -- local col = vim.api.nvim_win_get_cursor(0)[2] - -- local before_cursor = vim.api.nvim_get_current_line():sub(1, col) - -- local trigger_pos = before_cursor:find(trigger_text .. '[^' .. trigger_text .. ']*$') - -- if trigger_pos then - -- for _, item in ipairs(items) do - -- item.textEdit = { - -- newText = item.insertText or item.label, - -- range = { - -- start = { line = vim.fn.line '.' - 1, character = trigger_pos - 1 }, - -- ['end'] = { line = vim.fn.line '.' - 1, character = col }, - -- }, - -- } - -- end - -- end - -- -- NOTE: After the transformation, I have to reload the luasnip source - -- -- Otherwise really crazy shit happens and I spent way too much time - -- -- figurig this out - -- vim.schedule(function() - -- require('blink.cmp').reload 'snippets' - -- end) - -- return items - -- end, - }, - }, - cmdline = function() - local type = vim.fn.getcmdtype() - if type == ':' then - return { 'path', 'cmdline' } - end - if type == '/' or type == '?' then - return { 'buffer' } - end - return {} - end, - }, - snippets = { preset = 'luasnip' }, - }, -} diff --git a/.config/nvim/lua/plugins/conform.lua b/.config/nvim/lua/plugins/conform.lua deleted file mode 100644 index 09e7da0..0000000 --- a/.config/nvim/lua/plugins/conform.lua +++ /dev/null @@ -1,127 +0,0 @@ -return { - 'stevearc/conform.nvim', - event = { 'BufWritePre' }, - cmd = { 'ConformInfo' }, - keys = { - { - -- Customize or remove this keymap to your liking - '=', - function() - require('conform').format({ async = true, lsp_fallback = true }) - end, - mode = { 'n', 'v' }, - desc = 'Format buffer(c)', - }, - }, - init = function() - -- If you want the formatexpr, here is the place to set it - vim.o.formatexpr = "v:lua.require'conform'.formatexpr()" - end, - config = function() - vim.env.ESLINT_D_PPID = vim.fn.getpid() - local prettier = { 'prettierd', 'prettier', stop_after_first = true } - local slow_format_filetypes = {} - - ---@param bufnr integer - ---@param ... string - ---@return string - local function first(bufnr, ...) - local conform = require 'conform' - for i = 1, select('#', ...) do - local formatter = select(i, ...) - if conform.get_formatter_info(formatter, bufnr).available then - return formatter - end - end - return select(1, ...) - end - - local function prettier_eslint(bufnr) - return { first(bufnr, 'prettierd', 'prettier'), 'eslint_d' } - end - - require('conform').setup({ - -- Define your formatters - formatters_by_ft = { - sh = { 'shfmt' }, - lua = { 'stylua' }, - bash = { 'shfmt' }, - c = { 'clang-format' }, - cpp = { 'clang-format' }, - go = function(bufnr) - return { 'goimports', first(bufnr, 'gofumpt', 'gofmt') } - end, - fish = { 'fish_indent' }, - css = prettier, - html = prettier, - jsonc = prettier, - json = prettier, - json5 = prettier, - less = prettier, - markdown = prettier, - sass = prettier, - scss = prettier, - astro = prettier_eslint, - javascript = prettier_eslint, - javascriptreact = prettier_eslint, - typescript = prettier_eslint, - typescriptreact = prettier_eslint, - svelte = prettier_eslint, - vue = prettier_eslint, - nim = { 'nimpretty' }, - zig = { 'zigfmt' }, - php = function(bufnr) - return { first(bufnr, 'pint', 'php-cs-fixer', 'phpcbf') } - end, - blade = { 'blade-formatter' }, - gleam = { 'gleam' }, - -- You can use a function here to determine the formatters dynamically - python = function(bufnr) - if require('conform').get_formatter_info('ruff_format', bufnr).available then - return { 'ruff_format', 'ruff_fix', 'ruff_organize_imports' } - else - return { 'isort', 'black' } - end - end, - -- Use the "_" filetype to run formatters on filetypes that don't - -- have other formatters configured. - ['_'] = { 'trim_whitespace', 'trim_newlines' }, - }, - default_format_opts = { - lsp_format = 'fallback', - }, - -- Set up format-on-save - -- format_on_save = { timeout_ms = 500, lsp_fallback = true }, - format_on_save = function(bufnr) - -- Disable autoformat for files in a certain path - local bufname = vim.api.nvim_buf_get_name(bufnr) - if bufname:match '/node_modules/' then - return - end - if slow_format_filetypes[vim.bo[bufnr].filetype] then - return - end - local function on_format(err) - if err and err:match 'timeout$' then - slow_format_filetypes[vim.bo[bufnr].filetype] = true - end - end - - return { timeout_ms = 200, lsp_fallback = true }, on_format - end, - - format_after_save = function(bufnr) - if not slow_format_filetypes[vim.bo[bufnr].filetype] then - return - end - return { lsp_fallback = true } - end, - -- Customize formatters - formatters = { - shfmt = { - prepend_args = { '-i', '2' }, - }, - }, - }) - end, -} diff --git a/.config/nvim/lua/plugins/copilot.lua b/.config/nvim/lua/plugins/copilot.lua deleted file mode 100644 index 859e6dc..0000000 --- a/.config/nvim/lua/plugins/copilot.lua +++ /dev/null @@ -1,38 +0,0 @@ ----@type LazySpec -return { - 'zbirenbaum/copilot.lua', - cmd = 'Copilot', - build = ':Copilot auth', - event = 'InsertEnter', - enabled = true, - config = function() - require('copilot').setup({ - suggestion = { - auto_trigger = true, - keymap = { accept = '' }, - }, - filetypes = { - yaml = true, - markdown = true, - help = false, - gitcommit = true, - gitrebase = true, - ['.'] = true, - sh = function() - if string.match(vim.fs.basename(vim.api.nvim_buf_get_name(0)), '^%.env.*') then - -- disable for .env files - return false - end - return true - end, - conf = function() - if string.match(vim.fs.basename(vim.api.nvim_buf_get_name(0)), '^%.env.*') then - -- disable for .env files - return false - end - return true - end, - }, - }) - end, -} diff --git a/.config/nvim/lua/plugins/dadbod.lua b/.config/nvim/lua/plugins/dadbod.lua deleted file mode 100644 index b58d053..0000000 --- a/.config/nvim/lua/plugins/dadbod.lua +++ /dev/null @@ -1,21 +0,0 @@ ----@type LazySpec -return { - 'kristijanhusak/vim-dadbod-ui', - dependencies = { - { 'tpope/vim-dadbod', lazy = true }, - { 'kristijanhusak/vim-dadbod-completion', ft = { 'sql', 'mysql', 'plsql' }, lazy = true }, -- Optional - }, - cmd = { - 'DBUI', - 'DBUIToggle', - 'DBUIAddConnection', - 'DBUIFindBuffer', - }, - keys = { - { 'tD', 'DBUIToggle', desc = 'Toggle DBUI' }, - }, - init = function() - -- Your DBUI configuration - vim.g.db_ui_use_nerd_fonts = 1 - end, -} diff --git a/.config/nvim/lua/plugins/dooing.lua b/.config/nvim/lua/plugins/dooing.lua deleted file mode 100644 index 4397787..0000000 --- a/.config/nvim/lua/plugins/dooing.lua +++ /dev/null @@ -1,16 +0,0 @@ ----@type LazySpec -return { - 'atiladefreitas/dooing', - keys = { 'td' }, - enabled = false, - cmd = { 'Dooing' }, - opts = { - -- Keymaps - keymaps = { - toggle_window = 'td', - }, - }, - config = function(_, opts) - require('dooing').setup(opts) - end, -} diff --git a/.config/nvim/lua/plugins/flash.lua b/.config/nvim/lua/plugins/flash.lua deleted file mode 100644 index fc90fc0..0000000 --- a/.config/nvim/lua/plugins/flash.lua +++ /dev/null @@ -1,17 +0,0 @@ -return { - 'folke/flash.nvim', - -- event = "VeryLazy", - ---@type Flash.Config - opts = { - modes = { char = { enabled = false, autohide = false } }, - }, - -- stylua: ignore - keys = { - { "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" }, - { "S", mode = { "n", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" }, - { "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" }, - { "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" }, - { "", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" }, - { "", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" }, - }, -} diff --git a/.config/nvim/lua/plugins/fzf-lua.lua b/.config/nvim/lua/plugins/fzf-lua.lua deleted file mode 100644 index 1310672..0000000 --- a/.config/nvim/lua/plugins/fzf-lua.lua +++ /dev/null @@ -1,454 +0,0 @@ ---- ivy fzf ---[[ -local fzf_lua = require("fzf-lua") -fzf_lua.files{ - prompt = "Files", - fzf_opts = { ["--layout"] = "reverse" }, - winopts = { - height = 0.35, - width = 1.00, - row = 1, - col = 1, - border = { " ", " ", " ", " ", " ", " ", " ", " " }, - preview = { - layout = "flex", - hidden = "nohidden", - flip_columns = 130, - scrollbar = "float", - scrolloff = "-1", - scrollchars = { "█", "░" }, - }, - }, -} ---]] - ----Dropdown fzf ---[[ -local fzf_lua = require("fzf-lua") -fzf_lua.files{ - prompt = "Files", -fzf_opts = { ["--layout"] = "reverse" }, - winopts = { - height = 0.70, - width = 0.45, - row = 0.1, - col = 0.5, - preview = { hidden = "hidden", layout = "vertical", vertical = "up:50%" }, - }, -} ---]] - ----@type LazySpec -return { - 'ibhagwan/fzf-lua', - dependencies = { 'nvim-tree/nvim-web-devicons' }, - cmd = 'FzfLua', - enabled = true, - keys = { - '', - 'ff', - 'fr', - 'fs', - 'fc', - 'fS', - - { 'fw', mode = { 'n', 'v' } }, - 'fW', - 'fo', - 'fb', - 'fz', - 'fk', - 'fh', - 'fD', - 'fd', - - 'fn', - - 'fg', - 'gt', - 'gS', - 'gb', - 'gc', - 'gC', - - { '', mode = 'i', desc = 'Complete bline' }, - { '', mode = 'i', desc = 'Complete line' }, - { '', mode = 'i', desc = 'Complete path' }, - }, - config = function() - local fzf = require 'fzf-lua' - local actions = require 'fzf-lua.actions' - local utils = require 'fzf-lua.utils' - - local function hl_validate(hl) - return not utils.is_hl_cleared(hl) and hl or nil - end - - local rg_cmd = - 'rg --files -l ".*" --follow --color=never --sortr=modified -g "!{.git/,*.png,*.jpeg,*.jpg,*.ico,*.exe,*.out,node_modules/,}"' - - local m_keys = { - ['alt-enter'] = actions.file_tabedit, - ['ctrl-t'] = actions.file_tabedit, - ['ctrl-x'] = actions.file_split, - ['ctrl-i'] = fzf.actions.toggle_ignore, - -- ['ctrl-q'] = actions.file_edit_or_qf, - } - -- calling `setup` is optional for customization - fzf.setup({ - defaults = { formatter = { 'path.filename_first', 2 } }, - fzf_opts = { - ['--layout'] = 'reverse', - ['--info'] = 'inline-right', - -- ['--tiebreak'] = 'end', - }, - winopts = { preview = { default = 'bat' } }, - -- hls = { - -- normal = hl_validate 'TelescopeNormal', - -- border = hl_validate 'TelescopeBorder', - -- title = hl_validate 'TelescopePromptTitle', - -- help_normal = hl_validate 'TelescopeNormal', - -- help_border = hl_validate 'TelescopeBorder', - -- preview_normal = hl_validate 'TelescopeNormal', - -- preview_border = hl_validate 'TelescopeBorder', - -- preview_title = hl_validate 'TelescopePreviewTitle', - -- -- builtin preview only - -- cursor = hl_validate 'Cursor', - -- cursorline = hl_validate 'TelescopeSelection', - -- cursorlinenr = hl_validate 'TelescopeSelection', - -- search = hl_validate 'IncSearch', - -- }, - keymap = { - fzf = { - true, - ['ctrl-j'] = 'down', - ['ctrl-k'] = 'up', - ['ctrl-f'] = 'half-page-down', - ['ctrl-b'] = 'half-page-up', - ['alt-a'] = 'toggle-all', - ['alt-p'] = 'toggle-preview', - ['pgdn'] = 'preview-page-down', - ['pgup'] = 'preview-page-up', - ['alt-j'] = 'preview-down', - ['alt-k'] = 'preview-up', - ['shift-down'] = 'preview-page-down', - ['shift-up'] = 'preview-page-up', - ['ctrl-q'] = 'select-all+accept', - }, - }, - icons = { - ['?'] = { icon = '?', color = 'magenta' }, - ['M'] = { icon = '★', color = 'red' }, - ['D'] = { icon = '✗', color = 'red' }, - ['A'] = { icon = '+', color = 'green' }, - }, - files = { - fzf_opts = { - ['--layout'] = 'reverse', - -- ['--tiebreak'] = 'end', - ['--tiebreak'] = 'length', - }, - winopts = { - height = 0.55, - width = 0.65, - row = 0.52, - col = 0.47, - preview = { - ---@type 'wrap'|'nowrap' - wrap = 'nowrap', - ---@type 'hidden'|'nohidden' - hidden = 'hidden', - }, - }, - actions = m_keys, - }, - git = { - files = { - cmd = 'git ls-files --exclude-standard --cached --others', -- '--others' is used to show untracked files - actions = m_keys, - winopts = { - height = 0.55, - width = 0.65, - row = 0.52, - col = 0.47, - }, - previewer = false, - }, - status = { - actions = m_keys, - prompt = ' ❯ ', - }, - bcommits = { - actions = m_keys, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }, - commits = { - actions = m_keys, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }, - branches = { - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - cmd = "git branch --all --color | sed 's#remotes/origin/##g'", - cmd_add = { 'git', 'checkout', '-b' }, - }, - }, - buffers = { - ignore_current_buffer = true, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - actions = vim.tbl_extend('force', m_keys, { - ['ctrl-d'] = { fn = actions.buf_del, reload = true }, - ['ctrl-x'] = actions.buf_split, - ['ctrl-v'] = actions.buf_vsplit, - ['ctrl-q'] = actions.buf_edit_or_qf, - }), - }, - keymaps = { winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } } }, - helptags = { winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } } }, - grep = { - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - multiprocess = true, - rg_opts = "--hidden --column --line-number --no-ignore-vcs --no-heading --color=always --smart-case --multiline --max-columns=512 -g '!{.git,node_modules,venv,.venv,.idea,build,out,__pycache__,__pypackages__,.gradle,android,ios,.env,.next,dist,package-lock.json,yarn.lock,pnpm-lock.yaml,.svelte-kit,*.aider.*}'", - rg_glob = true, - glob_separator = '%s%-%-', - glob_flag = '--iglob', -- for case sensitive globs use '--glob' - rg_glob_fn = function(query, opts) - -- this enables all `rg` arguments to be passed in after the `--` glob separator - local search_query, glob_str = query:match('(.*)' .. opts.glob_separator .. '(.*)') - local glob_args = glob_str:gsub('^%s+', ''):gsub('-', '%-') .. ' ' - - return search_query, glob_args - end, - }, - blines = { - actions = m_keys, - no_term_buffers = false, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }, - lsp = { - jump_to_single_result = true, - definitions = { actions = m_keys }, - declarations = { actions = m_keys }, - references = { ignore_current_line = true, actions = m_keys }, - symbols = { - actions = m_keys, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }, - finder = { - actions = m_keys, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }, - code_actions = { - actions = m_keys, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }, - }, - diagnostics = { - actions = m_keys, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }, - lines = { actions = m_keys }, - }) - local ok_dressing, _ = pcall(require, 'dressing') - if not ok_dressing then - fzf.register_ui_select() - end - - local function fzf_create_file() - local fzf = require 'fzf-lua' - local path = require 'fzf-lua.path' - local uv = vim.uv or vim.loop - local cmd = 'fd -t d . ' .. uv.cwd() - local function get_full_path(selected) - if #selected < 1 then - return - end - local entry = path.entry_to_file(selected[1], { cwd = uv.cwd() }) - if entry.path == '' then - return - end - - local fullpath = entry.path or entry.uri and entry.uri:match '^%a+://(.*)' - if not path.is_absolute(fullpath) then - fullpath = path.join({ uv.cwd(), fullpath }) - end - return fullpath - end - - --- This will create a file in the selected directory - ---@param split_dir ?"e" | "vs" | "sp" | "tabe" Default is "e" - ---@return function - local function perform_action(split_dir) - split_dir = split_dir or 'e' - return function(selected) - local fullpath = get_full_path(selected) - vim.ui.input({ prompt = 'File Name: ' }, function(name) - if name == nil then - return - end - vim.cmd(string.format('%s %s%s', split_dir, fullpath, name)) - vim.cmd 'w ++p' - end) - end - end - - fzf.fzf_exec(cmd, { - defaults = {}, - prompt = 'Create> ', - cwd = uv.cwd(), - cwd_prompt_shorten_len = 32, - cwd_prompt_shorten_val = 1, - fzf_opts = { - ['--tiebreak'] = 'end', - ['--preview-window'] = 'nohidden,50%', - ['--preview'] = { - type = 'cmd', - fn = function(selected) - local fullpath = get_full_path(selected) - local ls_cmd = 'command ls --color -hsv1F --group-directories-first' - local eza_cmd = - 'eza -al --color=always --icons=always --group-directories-first --no-user --no-permissions --no-time' - return string.format('%s %s', vim.fn.executable 'eza' == 1 and eza_cmd or ls_cmd, fullpath) - end, - }, - }, - fn_transform = function(x) - return fzf.make_entry.file(x, { file_icons = true, color_icons = true, cwd = uv.cwd() }) - end, - actions = { - ['default'] = perform_action(), - ['ctrl-x'] = perform_action 'sp', - ['ctrl-v'] = perform_action 'vs', - ['ctrl-t'] = perform_action 'tabe', - }, - }) - end - - local function project_files(default_opts) - local opts = vim.tbl_extend('force', { - fzf_opts = { - ['--layout'] = 'reverse', - ['--info'] = 'inline-right', - ['--tiebreak'] = 'index', - }, - }, default_opts or {}) - local fzf = require 'fzf-lua' - if vim.b.gitsigns_head then - -- Either use one of the following .local/bin/myscripts/sort_file.rs or .local/bin/myscripts/sorting_filev3.cpp - -- compile and then add to `PATH` - --`sort_files` is a program that sorts files based on modified time, recently modified files will be shown first - if vim.fn.executable 'sort_files' == 1 then - opts.cmd = 'git ls-files --exclude-standard --cached --others | sort_files' -- '--others' is used to show untracked files - else - vim.cmd 'echohl WarningMsg | echo "`sort_files` not found in `PATH`. Please compile the program" | echohl None' - end - fzf.git_files(opts) - else - opts.cmd = rg_cmd - fzf.files(opts) - end - end - - local keys = { - [''] = { project_files, { desc = 'Git [F]iles' } }, - ['ff'] = { - function() - fzf.files({ - cmd = rg_cmd, - fzf_opts = { - ['--layout'] = 'reverse', - ['--info'] = 'inline-right', - ['--tiebreak'] = 'index', - }, - }) - end, - { desc = '[F]iles' }, - }, - ['fr'] = { fzf.resume, { desc = '[R]esume' } }, - ['fs'] = { fzf.live_grep, { desc = '[S]earch(Project)' } }, - ['fc'] = { fzf_create_file, { desc = 'Create File' } }, - ['fS'] = { - function() - fzf.grep_curbuf({ winopts = { preview = { layout = 'vertical', { vertical = 'up:60%' } } } }) - end, - { desc = '[S]earch Current Buffer' }, - }, - ['fw'] = { fzf.grep_cword, { desc = '[W]ord under cursor' } }, - ['fW'] = { fzf.grep_cWORD, { desc = '[W]ord under cursor' } }, - ['fo'] = { - function() - fzf.oldfiles({ path_shorten = true }) - end, - { desc = '[O]ld Files' }, - }, - ['f/'] = { - function() - fzf.lgrep_curbuf({ - prompt = 'Buffer❫ ', - }) - end, - { desc = 'Grep buffer' }, - }, - ['*'] = { - function() - fzf.grep_curbuf({ - prompt = 'Buffer❫ ', - search = vim.fn.expand '', - }) - end, - { desc = 'Grep buffer with cword' }, - }, - ['fb'] = { fzf.buffers, { desc = '[B]uffers' } }, - ['fz'] = { fzf.spell_suggest, { desc = '[S]pelling' } }, - ['fk'] = { fzf.keymaps, { desc = '[K]eymaps' } }, - ['fh'] = { fzf.help_tags, { desc = '[H]elp Tags' } }, - ['fD'] = { fzf.diagnostics_document, { desc = '[D]iagnostics' } }, - ['fd'] = { - function() - fzf.files({ - cwd = vim.fn.expand '~/Documents/dotfiles', - cmd = rg_cmd .. ' --hidden', - fzf_opts = { - ['--layout'] = 'reverse', - ['--info'] = 'inline-right', - ['--tiebreak'] = 'index', - }, - }) - end, - { desc = '[D]otfiles' }, - }, - ['fn'] = { - function() - fzf.files({ - cwd = vim.fn.stdpath 'config', - cmd = rg_cmd, - fzf_opts = { - ['--layout'] = 'reverse', - ['--info'] = 'inline-right', - ['--tiebreak'] = 'index', - }, - }) - end, - { desc = '[N]eovim Config' }, - }, - ['fg'] = { fzf.git_status, { desc = '[S]tatus' } }, - ['gt'] = { fzf.git_status, { desc = '[S]tatus' } }, - ['gS'] = { fzf.git_stash, { desc = 'Stash' } }, - ['gb'] = { fzf.git_branches, { desc = '[B]ranches' } }, - ['gc'] = { fzf.git_commits, { desc = '[C]ommits' } }, - ['gC'] = { fzf.git_bcommits, { desc = '[B]ranch Commits' } }, - } - - vim.keymap.set('v', 'fw', fzf.grep_visual, { desc = 'Selection' }) - vim.keymap.set('i', '', fzf.complete_bline, { desc = 'Complete bline', silent = true, noremap = true }) - vim.keymap.set('i', '', fzf.complete_line, { desc = 'Complete line', silent = true, noremap = true }) - vim.keymap.set('i', '', fzf.complete_path, { desc = 'Complete path', silent = true, noremap = true }) - for key, value in pairs(keys) do - if value[1] == nil then - vim.print(key .. ' is nil') - goto continue - end - vim.keymap.set('n', key, value[1], vim.tbl_extend('force', { noremap = true, silent = true }, value[2] or {})) - ::continue:: - end - end, -} diff --git a/.config/nvim/lua/plugins/git-conflicts.lua b/.config/nvim/lua/plugins/git-conflicts.lua deleted file mode 100644 index 3a1cccb..0000000 --- a/.config/nvim/lua/plugins/git-conflicts.lua +++ /dev/null @@ -1,6 +0,0 @@ ----@type LazySpec -return { - 'akinsho/git-conflict.nvim', - version = '*', - config = true, -} diff --git a/.config/nvim/lua/plugins/guess-indent.lua b/.config/nvim/lua/plugins/guess-indent.lua deleted file mode 100644 index fb3493e..0000000 --- a/.config/nvim/lua/plugins/guess-indent.lua +++ /dev/null @@ -1,8 +0,0 @@ ----@type LazySpec -return { - 'nmac427/guess-indent.nvim', - event = 'BufRead', - config = function() - require('guess-indent').setup({}) - end, -} diff --git a/.config/nvim/lua/plugins/indents.lua b/.config/nvim/lua/plugins/indents.lua deleted file mode 100644 index 5c55f53..0000000 --- a/.config/nvim/lua/plugins/indents.lua +++ /dev/null @@ -1,28 +0,0 @@ -return { - 'lukas-reineke/indent-blankline.nvim', - event = 'BufReadPost', - enabled = false, - main = 'ibl', - opts = { - indent = { char = '▏' }, - scope = { show_start = false, show_end = false }, - exclude = { - buftypes = { 'nofile', 'prompt', 'quickfix', 'terminal' }, - filetypes = { - 'aerial', - 'alpha', - 'dashboard', - 'help', - 'lazy', - 'mason', - 'neo-tree', - 'NvimTree', - 'neogitstatus', - 'notify', - 'startify', - 'toggleterm', - 'Trouble', - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/init.lua b/.config/nvim/lua/plugins/init.lua deleted file mode 100644 index 019eb09..0000000 --- a/.config/nvim/lua/plugins/init.lua +++ /dev/null @@ -1,333 +0,0 @@ ----@type LazySpec -return { - 'iguanacucumber/magazine.nvim', - name = 'nvim-cmp', -- Otherwise highlighting gets messed up - enabled = true, - event = 'BufReadPre', - dependencies = { - 'hrsh7th/cmp-nvim-lsp', - 'hrsh7th/cmp-buffer', - -- 'hrsh7th/cmp-path', - 'https://codeberg.org/FelipeLema/cmp-async-path', - 'hrsh7th/cmp-cmdline', - 'lukas-reineke/cmp-rg', - -- 'lukas-reineke/cmp-under-comparator', - 'octaltree/cmp-look', - 'saadparwaiz1/cmp_luasnip', - { - 'L3MON4D3/LuaSnip', - build = 'make install_jsregexp', - dependencies = { 'rafamadriz/friendly-snippets' }, - event = 'User BaseFile', - opts = { history = true, delete_check_events = 'TextChanged', region_check_events = 'CursorMoved' }, - config = function(_, opts) - if opts then - require('luasnip').config.setup(opts) - end - - vim.tbl_map(function(type) - require('luasnip.loaders.from_' .. type).lazy_load() - end, { 'vscode', 'snipmate', 'lua' }) - - local extends = { - typescript = { 'tsdoc' }, - javascript = { 'jsdoc' }, - lua = { 'luadoc' }, - python = { 'pydoc' }, - rust = { 'rustdoc' }, - cs = { 'csharpdoc' }, - java = { 'javadoc' }, - c = { 'cdoc' }, - cpp = { 'cppdoc' }, - php = { 'phpdoc' }, - kotlin = { 'kdoc' }, - ruby = { 'rdoc' }, - sh = { 'shelldoc' }, - } - -- friendly-snippets - enable standardized comments snippets - for ft, snips in pairs(extends) do - require('luasnip').filetype_extend(ft, snips) - end - end, - }, - 'onsails/lspkind.nvim', - { - 'folke/lazydev.nvim', - ft = 'lua', -- only load on lua files - opts = { - library = { 'lazy.nvim', { path = 'luvit-meta/library', words = { 'vim%.uv' } } }, - }, - }, - { 'Bilal2453/luvit-meta', lazy = true }, - }, - config = function() - local cmp = require 'cmp' - local types = require 'cmp.types' - local sources = require 'cmp.config.sources' - local compare = require 'cmp.config.compare' - local lspkind = require 'lspkind' - local snippet = 'luasnip' - local luasnip = require 'luasnip' - - local function feedkey(key, mode) - vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true) - end - local function has_words_before() - 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 function deprio(kind) - return function(e1, e2) - if e1:get_kind() == kind then - return false - end - if e2:get_kind() == kind then - return true - end - end - end - - --- detect if the current completion item is an emmet completion item - --- @param entry cmp.Entry - --- @return boolean - local function isEmmet(entry) - return ( - entry:get_kind() == require('cmp.types').lsp.CompletionItemKind.Text - or entry:get_kind() == require('cmp.types').lsp.CompletionItemKind.Snippet - ) - and ( - entry.source:get_debug_name() == 'nvim_lsp:emmet_language_server' - or entry.source:get_debug_name() == 'nvim_lsp:emmet_ls' - ) - end - - cmp.setup({ - snippet = { - expand = function(args) - luasnip.lsp_expand(args.body) - end, - }, - experimental = { ghost_text = false, native_menu = false }, - window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered() }, - duplicates = { - nvim_lsp = 1, - lazydev = 1, - [snippet] = 1, - cmp_tabnine = 1, - buffer = 1, - path = 1, - }, - - mapping = { - [''] = cmp.mapping({ i = cmp.mapping.scroll_docs(-4) }), - [''] = cmp.mapping({ i = cmp.mapping.scroll_docs(4) }), - [''] = cmp.mapping.complete(), - [''] = cmp.mapping.close(), - [''] = cmp.mapping({ - i = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }), - c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }), - }), - [''] = cmp.mapping({ - i = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }), - c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }), - }), - [''] = cmp.mapping({ - i = function(fallback) - if cmp.visible() then - cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) - else - fallback() - end - end, - }), - [''] = cmp.mapping({ - i = function(fallback) - if cmp.visible() then - cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) - else - fallback() - end - end, - }), - [''] = cmp.mapping({ - c = function() - if cmp.visible() then - cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) - else - feedkey('', 'n') - end - end, - i = function(fallback) - if cmp.visible() then - cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) - else - fallback() - end - end, - }), - [''] = cmp.mapping({ - c = function() - if cmp.visible() then - cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) - else - feedkey('', 'n') - end - end, - i = function(fallback) - if cmp.visible() then - cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) - else - fallback() - end - end, - }), - [''] = cmp.mapping.complete({ - config = { sources = { { name = snippet } } }, - }), - [''] = cmp.mapping.complete({ - config = { - sources = { - { - name = 'nvim_lsp', - entry_filter = function(entry) - return isEmmet(entry) - end, - }, - }, - }, - }), - [''] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - -- elseif vim.snippet.active({ direction = 1 }) then - -- return 'lua vim.snippet.jump(1)' - -- vim.snippet.jump(1) - -- elseif vim.fn['vsnip#available'](1) == 1 then - -- feedkey('(vsnip-expand-or-jump)', '') - 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() - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.jumpable(-1) then - luasnip.jump(-1) - -- elseif vim.snippet.active({ direction = -1 }) then - -- return 'lua vim.snippet.jump(-1)' - -- vim.snippet.jump(-1) - -- elseif vim.fn['vsnip#jumpable'](-1) == 1 then - -- feedkey('(vsnip-jump-prev)', '') - end - end, { 'i', 's' }), - }, - sources = sources({ - { - name = 'nvim_lsp', - priority = 100, - max_item_count = 20, - entry_filter = function(entry) - return not isEmmet(entry) - end, - }, - { name = 'lazydev', priority = 95 }, - { name = snippet, priority = 90 }, - { - name = 'buffer', - max_item_count = 10, - option = { - keyword_length = 2, - -- get_bufnrs = function() - -- local bufIsSmall = function(bufnr) - -- return vim.api.nvim_buf_line_count(bufnr) < 2000 - -- end - -- return vim.tbl_filter(bufIsSmall, vim.api.nvim_list_bufs()) - -- end, - }, - priority = 40, - }, - { - name = 'rg', - keyword_length = 3, - max_item_count = 10, - priority_weight = 50, - option = { - additional_arguments = '--smart-case --hidden', - set_filetype = true, - marker = ' ❰❰❰', - }, - -- entry_filter = function(entry) - -- return not entry.exact - -- end, - }, - -- { name = 'path', priority = 50 }, - { name = 'async_path', priority = 50, option = { trailing_slash = false } }, - { - name = 'look', - keyword_length = 5, - priority = 30, - option = { - convert_case = true, - loud = true, - --dict = '/usr/share/dict/words' - }, - }, - }), - sorting = { - priority_weight = 100, - comparators = { - deprio(types.lsp.CompletionItemKind.Text), - compare.exact, - compare.offset, - compare.score, - compare.length, - compare.recently_used, - compare.kind, - compare.locality, - compare.order, - }, - }, - ---@diagnostic disable-next-line: missing-fields - formatting = { - fields = { 'kind', 'abbr', 'menu' }, - format = lspkind.cmp_format({ - mode = 'symbol', - maxwidth = 50, - ellipsis_char = '...', - symbol_map = { Copilot = '' }, - }), - }, - }) - cmp.setup.cmdline(':', { - sources = sources({ - { - name = 'cmdline', - option = { - ignore_cmds = { 'Man', '!', 'find', 'fin' }, - }, - }, - { name = 'path' }, - }), - matching = { disallow_symbol_nonprefix_matching = false }, - mapping = cmp.mapping.preset.cmdline(), - formatting = { fields = { 'abbr' } }, - window = { completion = cmp.config.window.bordered({ col_offset = 0 }) }, - }) - - cmp.setup.cmdline({ '/', '?' }, { - sources = sources({ - { name = 'buffer' }, - }), - mapping = cmp.mapping.preset.cmdline(), - formatting = { fields = { 'abbr' } }, - window = { completion = cmp.config.window.bordered({ col_offset = 0 }) }, - }) - end, -} diff --git a/.config/nvim/lua/plugins/lazydo.lua b/.config/nvim/lua/plugins/lazydo.lua deleted file mode 100644 index 9922816..0000000 --- a/.config/nvim/lua/plugins/lazydo.lua +++ /dev/null @@ -1,13 +0,0 @@ ----@type LazySpec -return { - 'Dan7h3x/LazyDo', - keys = { -- recommended keymap for easy toggle LazyDo in normal and insert modes (arbitrary) - { - '', - 'LazyDoToggle', - mode = { 'n', 'i' }, - desc = 'Toggle LazyDo', - }, - }, - opts = {}, -} diff --git a/.config/nvim/lua/plugins/lsp/astrolsp.lua b/.config/nvim/lua/plugins/lsp/astrolsp.lua deleted file mode 100644 index e1698cd..0000000 --- a/.config/nvim/lua/plugins/lsp/astrolsp.lua +++ /dev/null @@ -1,371 +0,0 @@ ----@type LazySpec -return { - 'AstroNvim/astrolsp', - lazy = true, - dependencies = { - 'AstroNvim/astrocore', - { - 'SmiteshP/nvim-navic', - init = function() - vim.g.navic_silence = true - end, - opts = { - highlight = true, - depth_limit = 5, - lazy_update_context = true, - }, - }, - 'williamboman/mason-lspconfig.nvim', - -- 'hrsh7th/nvim-cmp', - { - 'iguanacucumber/magazine.nvim', - name = 'nvim-cmp', -- Otherwise highlighting gets messed up - }, - }, - opts = { - -- Configuration table of features provided by AstroLSP - features = { - autoformat = true, -- enable or disable auto formatting on start - codelens = true, -- enable/disable codelens refresh on start - inlay_hints = false, -- enable/disable inlay hints on start - semantic_tokens = true, -- enable/disable semantic token highlighting - }, - -- Configure buffer local auto commands to add when attaching a language server - autocmds = { - -- first key is the `augroup` (:h augroup) - lsp_document_highlight = { - cond = 'textDocument/documentHighlight', - -- list of auto commands to set - { - -- events to trigger - event = { 'CursorHold', 'CursorHoldI' }, - -- the rest of the autocmd options (:h nvim_create_autocmd) - desc = 'Document Highlighting', - callback = vim.lsp.buf.document_highlight, - }, - { - event = { 'CursorMoved', 'CursorMovedI', 'BufLeave' }, - desc = 'Document Highlighting Clear', - callback = vim.lsp.buf.clear_references, - }, - }, - }, - commands = { - Format = { - function() - vim.lsp.buf.format({ async = true }) - end, - cond = 'textDocument/formatting', - desc = 'Format file with LSP', - }, - ImportsOrganize = { - function() - vim.lsp.buf.code_action({ - context = { only = { 'source.organizeImports' } }, - apply = true, - }) - end, - cond = 'textDocument/codeAction', - desc = 'Organize Imports', - }, - ImportsRemove = { - function() - vim.lsp.buf.code_action({ - context = { only = { 'source.removeUnused' } }, - apply = true, - }) - end, - cond = 'textDocument/codeAction', - desc = 'Remove Unused Imports', - }, - FixAll = { - function() - vim.lsp.buf.code_action({ - context = { only = { 'source.fixAll' } }, - apply = true, - }) - end, - cond = 'textDocument/codeAction', - desc = 'Fix All fixable diagnostics', - }, - }, - capabilities = { - textDocument = { foldingRange = { dynamicRegistration = false, lineFoldingOnly = true } }, - workspace = { - didChangeWatchedFiles = vim.fn.has 'nvim-0.10' == 0 and { dynamicRegistration = true }, - }, - }, - config = { - bashls = { - settings = { bashIde = { highlightParsingErrors = true } }, - }, - }, - mappings = { - n = { - K = { vim.lsp.buf.hover, desc = 'Hover', cond = 'textDocument/hover' }, - gl = { vim.diagnostic.open_float, desc = 'Hover diagnostics' }, - ['le'] = { vim.diagnostic.open_float, desc = 'Hover diagnostics' }, - ['ld'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.definition() - else - fzf.lsp_definitions({ - jump_to_single_result = true, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }) - end - end, - desc = 'Goto definition', - cond = 'textDocument/definition', - }, - gd = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.definition() - else - fzf.lsp_definitions({ - jump_to_single_result = true, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }) - end - end, - desc = 'Goto definition', - cond = 'textDocument/definition', - }, - ['lf'] = { - function() - vim.lsp.buf.code_action({ - context = { only = { 'source.fixAll' } }, - apply = true, - }) - end, - desc = 'Fix All', - cond = 'textDocument/codeAction', - }, - ['lo'] = { - function() - vim.lsp.buf.code_action({ - context = { only = { 'source.organizeImports' } }, - apply = true, - }) - vim.lsp.buf.code_action({ context = { only = { 'source.removeUnused' } }, apply = true }) - end, - desc = 'Oraganize imports', - cond = 'textDocument/codeAction', - }, - ['li'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.implementation() - else - fzf.lsp_implementations() - end - end, - desc = 'Goto implementation', - cond = 'textDocument/implementation', - }, - -- condition for only server with declaration capabilities - ['lD'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.declaration() - else - fzf.lsp_declarations({ - jump_to_single_result = true, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }) - end - end, - desc = 'Goto Declaration', - cond = 'textDocument/declaration', - }, - ['lt'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.type_definition() - else - fzf.lsp_typedefs() - end - end, - desc = 'Type definition', - cond = 'textDocument/typeDefinition', - }, - ['F'] = { - function() - vim.cmd [[EslintFixAll]] - end, - cond = function(client) - return client.name == 'eslint' - end, - }, - gr = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.references() - else - fzf.lsp_references({ - jump_to_single_result = true, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }) - end - end, - desc = 'Goto references', - cond = 'textDocument/references', - }, - ['lR'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.references() - else - fzf.lsp_references({ - jump_to_single_result = true, - winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, - }) - end - end, - desc = 'Goto references', - cond = 'textDocument/references', - }, - [']e'] = { - function() - vim.diagnostic.goto_next({ severity = vim.diagnostic.severity.ERROR }) - end, - desc = 'Goto Next Error', - }, - ['[e'] = { - function() - vim.diagnostic.goto_prev({ severity = vim.diagnostic.severity.ERROR }) - end, - desc = 'Goto Next Error', - }, - [']d'] = { - vim.diagnostic.goto_next, - desc = 'Goto Next diagnostic', - }, - ['[d'] = { - vim.diagnostic.goto_prev, - desc = 'Goto Next diagnostic', - }, - ['lw'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.document_symbol() - else - fzf.lsp_document_symbols() - end - end, - desc = 'Document symbols', - cond = 'textDocument/documentSymbol', - }, - ['lW'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.workspace_symbol() - else - fzf.lsp_workspace_symbols() - end - end, - desc = 'Workspace symbols', - cond = 'workspace/symbol', - }, - -- [''] = { - -- vim.lsp.buf.rename, - -- desc = 'Rename', - -- cond = 'textDocument/rename', - -- }, - ['lr'] = { - vim.lsp.buf.rename, - desc = 'Rename', - cond = 'textDocument/rename', - }, - ['la'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.code_action() - else - fzf.lsp_code_actions() - end - end, - desc = 'Code actions', - cond = 'textDocument/codeAction', - }, - ['lI'] = { - function() - vim.cmd 'LspInfo' - end, - desc = 'LspInfo', - }, - -- condition with a full function with `client` and `bufnr` - ['uY'] = { - function() - require('astrolsp.toggles').buffer_semantic_tokens() - end, - desc = 'Toggle LSP semantic highlight (buffer)', - cond = function(client) - return client.server_capabilities.semanticTokensProvider and vim.lsp.semantic_tokens - end, - }, - ['uI'] = { - function() - require('astrolsp.toggles').buffer_inlay_hints() - end, - desc = 'Toggle LSP inlay highlight (buffer)', - cond = function(client) - return client.server_capabilities.inlayHintProvider and vim.lsp.inlay_hint - end, - }, - }, - i = { - [''] = { - vim.lsp.buf.signature_help, - desc = 'Signature help', - cond = 'textDocument/signatureHelp', - }, - }, - x = { - ['la'] = { - function() - local ok, fzf = pcall(require, 'fzf-lua') - if not ok then - vim.lsp.buf.code_action() - else - fzf.lsp_code_actions() - end - end, - desc = 'Code actions', - cond = 'textDocument/codeAction', - }, - }, - }, - handlers = { - function(server, opts) - opts.capabilities = require('my_config.util').get_lsp_capabilities(opts.capabilities) - require('lspconfig')[server].setup(opts) - end, - efm = false, - }, - -- A list like table of servers that should be setup, useful for enabling language servers not installed with Mason. - servers = { - 'gleam', - 'zls', - 'roc_ls', - 'nim_langserver' --[[, 'rust_analyzer' ]], - }, - on_attach = function(client, bufnr) - if client.supports_method 'textDocument/documentSymbol' then - require('nvim-navic').attach(client, bufnr) - end - end, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/cpp.lua b/.config/nvim/lua/plugins/lsp/cpp.lua deleted file mode 100644 index ca431c3..0000000 --- a/.config/nvim/lua/plugins/lsp/cpp.lua +++ /dev/null @@ -1,66 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'clangd', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'c', - 'cpp', - 'make', - }) - return opts - end, - }, - { - 'AstroNvim/astrolsp', - opts = { - config = { - clangd = { - capabilities = { - offsetEncoding = { 'utf-16' }, - clangdInlayHintsProvider = true, - }, - settings = { - InlayHints = { - Enabled = true, - ParameterNames = true, - DeducedTypes = true, - }, - }, - cmd = { - -- 'clangd', - -- '--background-index', - -- '--clang-tidy', - -- '--suggest-missing-includes', - -- '--header-insertion=iwyu', - -- '--completion-style=detailed', - -- '--function-arg-placeholders', - -- '--pch-storage=memory', - -- '--fallback-style=llvm', - 'clangd', - '--background-index', - '--clang-tidy', - '--suggest-missing-includes', - '--header-insertion-decorators', - '--all-scopes-completion', - '--cross-file-rename', - '--log=info', - '--completion-style=detailed', - -- "--enable-config", -- clangd 11+ supports reading from .clangd configuration file - '--offset-encoding=utf-16', - '--header-insertion=never', - }, - }, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/elixir.lua b/.config/nvim/lua/plugins/lsp/elixir.lua deleted file mode 100644 index e42e39a..0000000 --- a/.config/nvim/lua/plugins/lsp/elixir.lua +++ /dev/null @@ -1,61 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'elixir-ls', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'elixir', - 'erlang', - 'eex', - 'heex', - }) - return opts - end, - }, - { - 'elixir-tools/elixir-tools.nvim', - version = '*', - lazy = true, - dependencies = { 'nvim-lua/plenary.nvim' }, - }, - { - 'AstroNvim/astrolsp', - opts = { - handlers = { - elixir_ls = function(_, opts) - local elixir = require 'elixir' - local elixirls = require 'elixir.elixirls' - opts.capabilities = require('my_config.util').get_lsp_capabilities(opts.capabilities) - - elixir.setup({ - nextls = { enable = false }, - credo = { enable = true }, - elixirls = { - enable = true, - capabilities = opts.capabilities, - settings = elixirls.settings({ - dialyzerEnabled = true, - enableTestLenses = true, - }), - on_attach = function(client, bufnr) - opts.on_attach(client, bufnr) - vim.keymap.set('n', 'lp', ':ElixirFromPipe', { buffer = bufnr, noremap = true }) - vim.keymap.set('n', 'lP', ':ElixirToPipe', { buffer = bufnr, noremap = true }) - vim.keymap.set('v', 'lm', ':ElixirExpandMacro', { buffer = bufnr, noremap = true }) - end, - }, - }) - end, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/gleam.lua b/.config/nvim/lua/plugins/lsp/gleam.lua deleted file mode 100644 index 1b32293..0000000 --- a/.config/nvim/lua/plugins/lsp/gleam.lua +++ /dev/null @@ -1,13 +0,0 @@ ----@type LazySpec -return { - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'gleam', - }) - return opts - end, - }, - { 'AstroNvim/astrolsp', opts = { servers = { 'gleam' } } }, -} diff --git a/.config/nvim/lua/plugins/lsp/json.lua b/.config/nvim/lua/plugins/lsp/json.lua deleted file mode 100644 index db3e821..0000000 --- a/.config/nvim/lua/plugins/lsp/json.lua +++ /dev/null @@ -1,45 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'json-lsp', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'json', - 'jsonc', - 'json5', - }) - return opts - end, - }, - { 'b0o/schemastore.nvim', lazy = true, version = false }, - { - 'AstroNvim/astrolsp', - opts = { - handlers = { - jsonls = function(server, opts) - opts.capabilities = require('my_config.util').get_lsp_capabilities(opts.capabilities) - opts.on_new_config = function(new_config) - new_config.settings.json.schemas = new_config.settings.json.schemas or {} - vim.list_extend(new_config.settings.json.schemas, require('schemastore').json.schemas()) - end - opts.settings = { - json = { - validate = { enable = true }, - format = { enable = false }, - }, - } - require('lspconfig')[server].setup(opts) - end, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/lspconfig.lua b/.config/nvim/lua/plugins/lsp/lspconfig.lua deleted file mode 100644 index eed51ab..0000000 --- a/.config/nvim/lua/plugins/lsp/lspconfig.lua +++ /dev/null @@ -1,39 +0,0 @@ ----@type LazySpec -return { - 'neovim/nvim-lspconfig', - event = 'BufReadPre', - dependencies = { - 'williamboman/mason.nvim', - 'williamboman/mason-lspconfig.nvim', - 'AstroNvim/astrolsp', - }, - config = function() - -- require('mason-lspconfig').setup(opts) - local diags = { Error = '', Warn = '', Info = '', Hint = '' } - for sign, icon in pairs(diags) do - vim.fn.sign_define('DiagnosticSign' .. sign, { text = icon, texthl = 'DiagnosticSign' .. sign }) - end - -- set up servers configured with AstroLSP - vim.tbl_map(require('astrolsp').lsp_setup, require('astrolsp').config.servers) - local lspconfig = require 'lspconfig' - local configs = require 'lspconfig.configs' - -- Configure it - configs.blade = { - default_config = { - -- Path to the executable: laravel-dev-generators - cmd = { '/home/shubham/.local/bin/laravel-dev-tools', 'lsp' }, - filetypes = { 'blade' }, - root_dir = function(fname) - return lspconfig.util.find_git_ancestor(fname) - end, - settings = {}, - }, - } - -- Set it up - -- lspconfig.blade.setup({ - -- Capabilities is specific to my setup. - -- capabilities = capabilities - -- on_attach = require('astrolsp').on_attach, - -- }) - end, -} diff --git a/.config/nvim/lua/plugins/lsp/lua_ls.lua b/.config/nvim/lua/plugins/lsp/lua_ls.lua deleted file mode 100644 index 13cf18e..0000000 --- a/.config/nvim/lua/plugins/lsp/lua_ls.lua +++ /dev/null @@ -1,51 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'lua-language-server', - 'stylua', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'lua', - 'luadoc', - }) - return opts - end, - }, - { - 'AstroNvim/astrolsp', - opts = { - config = { - lua_ls = { - settings = { - Lua = { - diagnostics = { - enable = true, - globals = { 'vim', 'describe' }, - disable = { 'lowercase-global' }, - }, - workspace = { - checkThirdParty = false, - library = { - vim.env.VIMRUNTIME, - }, - }, - runtime = { version = 'LuaJIT' }, - telemetry = { enable = false }, - completion = { callSnippet = 'Replace' }, - hint = { enable = true, arrayIndex = 'Disable' }, - }, - }, - }, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/mason.lua b/.config/nvim/lua/plugins/lsp/mason.lua deleted file mode 100644 index 6b5d7f6..0000000 --- a/.config/nvim/lua/plugins/lsp/mason.lua +++ /dev/null @@ -1,48 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - cmd = { 'Mason', 'MasonInstall', 'MasonUninstall', 'MasonUpdate' }, - event = 'BufReadPre', - opts = { - ---@type '"prepend"' | '"append"' | '"skip"' - PATH = 'append', - ui = { - icons = { - package_installed = '✓', - package_uninstalled = '✗', - package_pending = '⟳', - }, - }, - }, - opts_extend = { 'ensure_installed' }, - ---@param opts MasonSettings | {ensure_installed: string[]} - config = function(_, opts) - require('mason').setup(opts) - local mr = require 'mason-registry' - mr.refresh(function() - for _, tool in ipairs(opts.ensure_installed or {}) do - local p = mr.get_package(tool) - if not p:is_installed() then - p:install() - end - end - end) - end, - }, - { - 'williamboman/mason-lspconfig.nvim', - event = 'BufReadPre', - dependencies = { - 'mason.nvim', - }, - opts = { - -- use AstroLSP setup for mason-lspconfig - handlers = { - function(server) - require('astrolsp').lsp_setup(server) - end, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/nim.lua b/.config/nvim/lua/plugins/lsp/nim.lua deleted file mode 100644 index 5642c44..0000000 --- a/.config/nvim/lua/plugins/lsp/nim.lua +++ /dev/null @@ -1,37 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'nimlangserver', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'nim', - 'nim_format_string', - }) - return opts - end, - }, - { - 'AstroNvim/astrolsp', - opts = { - config = { - nim_langserver = { - settings = { - nim = { - nimsuggestPath = vim.fn.expand '~/.local/share/nim-2.0.4/bin/nimsuggest', - }, - }, - }, - }, - servers = { 'nim_langserver' }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/php.lua b/.config/nvim/lua/plugins/lsp/php.lua deleted file mode 100644 index 85224e9..0000000 --- a/.config/nvim/lua/plugins/lsp/php.lua +++ /dev/null @@ -1,131 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'phpcbf', - 'phpstan', - 'phpcs', - 'php-cs-fixer', - 'blade-formatter', - 'phpactor', - 'php-debug-adapter', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - 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' }, - branch = 'main', - }, - filetype = 'blade', - } - - vim.filetype.add({ - pattern = { - ['.*%.blade%.php'] = 'blade', - }, - }) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'php', - 'phpdoc', - 'blade', - }) - return opts - end, - }, - { - 'ricardoramirezr/blade-nav.nvim', - dependencies = { - -- 'hrsh7th/nvim-cmp', - { - 'iguanacucumber/magazine.nvim', - name = 'nvim-cmp', -- Otherwise highlighting gets messed up - }, - }, - ft = { 'blade', 'php' }, - }, - { - -- Add the Laravel.nvim plugin which gives the ability to run Artisan commands - -- from Neovim. - 'adalessa/laravel.nvim', - enabled = false, - dependencies = { - -- "nvim-telescope/telescope.nvim", - 'tpope/vim-dotenv', - 'MunifTanjim/nui.nvim', - -- "nvimtools/none-ls.nvim", - }, - cmd = { 'Sail', 'Artisan', 'Composer', 'Npm', 'Yarn', 'Laravel' }, - keys = { - { 'La', ':Laravel artisan' }, - { 'Lr', ':Laravel routes' }, - { 'Lm', ':Laravel related' }, - }, - ft = { 'blade', 'php' }, - opts = { - ---@type 'phpactor'|'intelephense' - lsp_server = 'phpactor', - features = { null_ls = { enable = false } }, - }, - }, - { - 'AstroNvim/astrolsp', - dependencies = { - { - 'gbprod/phpactor.nvim', - enabled = false, - dependencies = { - 'nvim-lua/plenary.nvim', - }, - ft = 'php', - build = function() - require 'phpactor.handler.update'() - end, - }, - }, - opts = { - config = { - blade = { - cmd = { 'laravel-dev-tools', 'lsp' }, - filetypes = { 'blade' }, - root_dir = function(fname) - return require('lspconfig').util.find_git_ancestor(fname) - end, - }, - }, - handlers = { - phpactor = false, - -- phpactor = function(_, opts) - -- require('phpactor').setup({ - -- install = { - -- -- path = os.getenv('HOME') .. '', - -- bin = vim.fn.expand '~/Downloads/GitClones/phpactor/bin/phpactor', - -- }, - -- lspconfig = { - -- enabled = true, - -- options = { - -- -- capabilities = opts.capabilities, - -- on_attach = opts.on_attach, - -- init_options = { - -- ['language_server_phpstan.enabled'] = true, - -- ['phpunit.enabled'] = true, - -- }, - -- }, - -- }, - -- }) - -- end, - -- intelephense = false, - blade = false, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/prisma.lua b/.config/nvim/lua/plugins/lsp/prisma.lua deleted file mode 100644 index 2f99d13..0000000 --- a/.config/nvim/lua/plugins/lsp/prisma.lua +++ /dev/null @@ -1,21 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'prisma-language-server', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'prisma', - }) - return opts - end, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/python.lua b/.config/nvim/lua/plugins/lsp/python.lua deleted file mode 100644 index 98374f1..0000000 --- a/.config/nvim/lua/plugins/lsp/python.lua +++ /dev/null @@ -1,26 +0,0 @@ -if true then - return {} -end ----@type LazySpec -return { - { 'williamboman/mason.nvim', opts = { ensure_installed = { 'pyright' } } }, - { 'nvim-treesitter/nvim-treesitter', opts = { ensure_installed = { 'pymanifest', 'requirements', 'python' } } }, - { - 'AstroNvim/astrolsp', - opts = { - config = { - pyright = { - settings = { - python = { - analysis = { - autoImportCompletions = true, - -- typeCheckingMode = 'basic', - }, - exclude = { '**/node_modules', '**/__pycache__' }, - }, - }, - }, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/rust.lua b/.config/nvim/lua/plugins/lsp/rust.lua deleted file mode 100644 index b03e92f..0000000 --- a/.config/nvim/lua/plugins/lsp/rust.lua +++ /dev/null @@ -1,46 +0,0 @@ ----@type LazySpec -return { - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'rust', - }) - return opts - end, - }, - { - 'mrcjkb/rustaceanvim', - enabled = false, - version = '^4', -- Recommended - lazy = false, -- This plugin is already lazy - }, - { - 'AstroNvim/astrolsp', - opts = { - config = { - rust_analyzer = { - settings = { - ['rust-analyzer'] = { - imports = { - granularity = { - group = 'module', - }, - prefix = 'self', - }, - cargo = { - buildScripts = { - enable = true, - }, - }, - procMacro = { - enable = true, - }, - }, - }, - }, - }, - servers = { 'rust_analyzer' }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/svelte.lua b/.config/nvim/lua/plugins/lsp/svelte.lua deleted file mode 100644 index ab13b70..0000000 --- a/.config/nvim/lua/plugins/lsp/svelte.lua +++ /dev/null @@ -1,63 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'svelte-language-server', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'svelte', - }) - return opts - end, - }, - { - 'AstroNvim/astrolsp', - opts = { - config = { - svelte = { - settings = { - typescript = { - updateImportsOnFileMove = { enabled = 'always' }, - inlayHints = { - parameterNames = { enabled = 'all' }, - parameterTypes = { enabled = true }, - variableTypes = { enabled = true }, - propertyDeclarationTypes = { enabled = true }, - functionLikeReturnTypes = { enabled = true }, - enumMemberValues = { enabled = true }, - }, - }, - javascript = { - updateImportsOnFileMove = { enabled = 'always' }, - inlayHints = { - parameterNames = { enabled = 'literals' }, - parameterTypes = { enabled = true }, - variableTypes = { enabled = true }, - propertyDeclarationTypes = { enabled = true }, - functionLikeReturnTypes = { enabled = true }, - enumMemberValues = { enabled = true }, - }, - }, - svelte = { - ['enable-ts-plugin'] = true, - plugin = { svelte = { defaultScriptLanguage = 'typescript' } }, - }, - }, - capabilities = { - workspace = { - didChangeWatchedFiles = vim.fn.has 'nvim-0.10' == 0 and { dynamicRegistration = true }, - }, - }, - }, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/vue.lua b/.config/nvim/lua/plugins/lsp/vue.lua deleted file mode 100644 index 169c4ce..0000000 --- a/.config/nvim/lua/plugins/lsp/vue.lua +++ /dev/null @@ -1,22 +0,0 @@ ----@type LazySpec -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'vue-language-server', - 'vtsls', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'vue', - }) - return opts - end, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/yaml.lua b/.config/nvim/lua/plugins/lsp/yaml.lua deleted file mode 100644 index a712f0f..0000000 --- a/.config/nvim/lua/plugins/lsp/yaml.lua +++ /dev/null @@ -1,55 +0,0 @@ -return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'yaml-language-server', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'yaml', - }) - return opts - end, - }, - { 'b0o/schemastore.nvim', lazy = true, version = false }, - { - 'AstroNvim/astrolsp', - opts = { - handlers = { - yamlls = function(server, opts) - local capabilities = vim.lsp.protocol.make_client_capabilities() - capabilities.textDocument.foldingRange = { - dynamicRegistration = false, - lineFoldingOnly = true, - } - opts.capabilities = capabilities - opts.on_new_config = function(new_config) - new_config.settings.yaml.schemas = vim.tbl_deep_extend( - 'force', - new_config.settings.yaml.schemas or {}, - require('schemastore').yaml.schemas() - ) - end - opts.settings = { - redhat = { telemetry = { enabled = false } }, - yaml = { - keyOrdering = false, - format = { - enable = true, - }, - validate = true, - schemaStore = { enable = false, url = '' }, - }, - } - require('lspconfig')[server].setup(opts) - end, - }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/lsp/zk.lua b/.config/nvim/lua/plugins/lsp/zk.lua deleted file mode 100644 index f05ac04..0000000 --- a/.config/nvim/lua/plugins/lsp/zk.lua +++ /dev/null @@ -1,107 +0,0 @@ -local config = { - { - 'mickael-menu/zk-nvim', - enabled = true, - ft = { 'markdown' }, - keys = { - { 'zn', "ZkNew { title = vim.fn.input('Title: ') }", desc = '[Z]k [N]ew' }, - { 'zf', "ZkNotes { sort = { 'modified' } }", desc = '[Z]k [O]pen Notes' }, - { 'zo', "ZkNotes { sort = { 'modified' } }", desc = '[Z]k [O]pen Notes' }, - { 'zt', 'ZkTags', desc = '[Z]k [T]ags' }, - { - 'zs', - "ZkNotes { sort = { 'modified' }, match = { vim.fn.input('Search: ') } }", - desc = '[Z]k Search Notes', - }, - { - 'zs', - ":'<,'>ZkMatch", - mode = 'v', - desc = '[Z]k Search Notes', - }, - { - 'zc', - 'ZkCd', - desc = '[Z]k [C]d into notes', - }, - { - 'zl', - 'ZkLinks', - desc = '[Z]k [L]inks picker', - }, - }, - config = function() - local picker = 'select' - local ok_fzf, _ = pcall(require, 'fzf-lua') - if ok_fzf then - picker = 'fzf_lua' - else - local ok_telescope, _ = pcall(require, 'telescope') - if ok_telescope then - picker = 'telescope' - end - end - - require('zk').setup({ - picker = picker, -- "telescope", "fzf", "fzf_lua" or "select" - lsp = { - config = { - on_attach = function(_, bufnr) - vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = bufnr }) - vim.keymap.set('n', '', vim.lsp.buf.definition, { buffer = bufnr }) - vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { buffer = bufnr }) - vim.keymap.set( - 'v', - 'za', - ":'<,'>lua vim.lsp.buf.range_code_action()", - { buffer = bufnr, desc = '[Z]k Code [A]ctions' } - ) - vim.keymap.set('n', 'zb', 'ZkBacklinks', { buffer = bufnr, desc = '[Z]k [B]acklinks' }) - vim.keymap.set( - 'v', - 'znt', - ":'<,'>ZkNewFromTitleSelection { dir = vim.fn.expand('%:p:h') }", - { buffer = bufnr } - ) - vim.keymap.set( - 'v', - 'znc', - ":'<,'>ZkNewFromContentSelection { dir = vim.fn.expand('%:p:h'), title = vim.fn.input('Title: ') }", - { buffer = bufnr, desc = '[Z]k [N]ew [C]ontent' } - ) - vim.keymap.set('v', 'zf', ":'<,'>ZkMatch", { buffer = bufnr, desc = '[Z]k Notes [F]ind' }) - end, - }, - auto_attach = { - enabled = true, - filetypes = { 'markdown' }, - }, - }, - }) - end, - }, - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'zk', - }) - return opts - end, - }, - { 'AstroNvim/astrolsp', opts = { handlers = { zk = false } } }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'markdown', - 'markdown_inline', - 'comment', - 'todotxt', - 'embedded_template', - }) - return opts - end, - }, -} -return config diff --git a/.config/nvim/lua/plugins/lualine.lua b/.config/nvim/lua/plugins/lualine.lua deleted file mode 100644 index 0ea04f1..0000000 --- a/.config/nvim/lua/plugins/lualine.lua +++ /dev/null @@ -1,201 +0,0 @@ ----@type LazySpec -return { - 'nvim-lualine/lualine.nvim', - enabled = false, - event = 'VeryLazy', - dependencies = { 'nvim-tree/nvim-web-devicons' }, - config = function() - local conditions = { - buffer_not_empty = function() - if vim.opt.filetype._value == 'toggleterm' then - return false - end - return vim.fn.empty(vim.fn.expand '%:t') ~= 1 - end, - hide_in_width = function() - return vim.fn.winwidth(0) > 80 - end, - lsp_active = function() - return vim.fn.winwidth(0) > 80 and next(vim.lsp.get_clients({ bufnr = 0 })) ~= nil - end, - } - local function servers_attached() - local msg = 'None' - local clients = vim - .iter(vim.lsp.get_clients({ bufnr = 0 })) - :map(function(client) - return client.name - end) - :flatten() - :join ',' - return clients == '' and msg or clients - end - - local navic = require 'nvim-navic' - local config = { - options = { - globalstatus = true, - component_separators = '', - section_separators = '', - theme = { - normal = { c = { bg = '#181818', fg = '#303540', blend = 100 } }, - inactive = { c = { bg = '#101010', fg = '#303540' } }, - }, - }, - sections = { - lualine_a = {}, - lualine_b = {}, - lualine_y = {}, - lualine_z = {}, - lualine_c = {}, - lualine_x = {}, - }, - inactive_sections = { - lualine_a = {}, - lualine_v = {}, - lualine_y = {}, - lualine_z = {}, - lualine_c = {}, - lualine_x = {}, - }, - tabline = { - lualine_a = {}, - lualine_v = {}, - lualine_y = {}, - lualine_z = {}, - lualine_c = {}, - lualine_x = {}, - }, - - winbar = { - lualine_c = { - { - 'navic', - ---@type "static"| "dynamic"| nil - color_correction = nil, - navic_opts = nil, - }, - }, - }, - inactive_winbar = { - lualine_c = { - { - 'filename', - path = 1, - condition = conditions.buffer_not_empty, - color = { fg = '#96a6c8', bg = '#181818', gui = 'bold,italic' }, - }, - }, - }, - extensions = { 'lazy', 'neo-tree', 'quickfix', 'toggleterm', 'man' }, - } - local function ins_left(component) - table.insert(config.sections.lualine_c, component) - end - local function ins_right(component) - table.insert(config.sections.lualine_x, component) - end - local function ins_left_tab(component) - table.insert(config.tabline.lualine_c, component) - end - local function ins_right_tab(component) - table.insert(config.tabline.lualine_x, component) - end - ins_left_tab({ - 'buffers', - buffers_color = { - -- Same values as the general color option can be used here. - active = { fg = '#96a6c8', bg = '#303540' }, -- Color for active tab. - inactive = { fg = '#52494e', bg = '#181818' }, -- Color for inactive tab. - }, - }) - ins_left_tab '%=' - ins_right_tab({ - 'tabs', - tabs_color = { - -- Same values as the general color option can be used here. - active = { fg = '#96a6c8', bg = '#303540' }, -- Color for active tab. - inactive = { fg = '#52494e', bg = '#181818' }, -- Color for inactive tab. - }, - }) - ins_left({ - 'filetype', - icon_only = true, - condition = conditions.buffer_not_empty, - left_padding = 0, - }) - ins_left({ - 'filename', - path = 1, - -- shorting_target = 40, - condition = conditions.buffer_not_empty, - color = { fg = '#96a6c8' }, - }) - ins_left({ - 'branch', - icon = '', - color = { fg = '#A3BE8C' }, - }) - ins_left({ - 'diff', - colored = true, - symbols = { added = ' ', modified = '󰇊 ', removed = ' ' }, - -- symbols = { added = ' ', modified = ' ', removed = ' ' }, - cond = conditions.hide_in_width, - }) - ins_left({ - 'diagnostics', - sources = { 'nvim_lsp' }, - }) - - -- ins_left({ - -- 'navic', - -- ---@type "static"| "dynamic"| nil - -- color_correction = nil, - -- navic_opts = nil, - -- }) - ins_right({ - servers_attached, - icon = ' LSPs:', - color = { fg = '#8992a7', gui = 'bold' }, - cond = conditions.lsp_active, - }) - ins_right({ 'progress', color = { fg = '#957FB8' } }) - ins_right({ 'location', color = { fg = '#6CAF95' } }) - ins_right({ - 'searchcount', - icon = '', - -- color = { fg = '#DCA561' }, - color = { fg = '#cc8c3c' }, - }) - ins_right({ - function() - if vim.fn.mode():find '[vV]' then - local ln_beg = vim.fn.line 'v' - local ln_end = vim.fn.line '.' - - local lines = ln_beg <= ln_end and ln_end - ln_beg + 1 or ln_beg - ln_end + 1 - - return 'sel: ' .. tostring(vim.fn.wordcount().visual_chars) .. ' | ' .. tostring(lines) - else - return '' - end - end, - color = { fg = '#c5c9c5' }, - }) - - require('lualine.components.buffers').buffers = function(self) - local buffers = {} - self.bufpos2nr = {} - for _, b in ipairs(vim.t['bufs']) do - if vim.fn.buflisted(b) ~= 0 and vim.api.nvim_buf_get_option(b, 'buftype') ~= 'quickfix' then - buffers[#buffers + 1] = self:new_buffer(b, #buffers + 1) - self.bufpos2nr[#buffers] = b - end - end - - return buffers - end - require('lualine').setup(config) - end, -} diff --git a/.config/nvim/lua/plugins/markdown-bullets.lua b/.config/nvim/lua/plugins/markdown-bullets.lua deleted file mode 100644 index da3de82..0000000 --- a/.config/nvim/lua/plugins/markdown-bullets.lua +++ /dev/null @@ -1,5 +0,0 @@ ----@type LazySpec -return { - 'bullets-vim/bullets.vim', - ft = { 'markdown', 'gitcommit', 'text' }, -} diff --git a/.config/nvim/lua/plugins/mini/comment.lua b/.config/nvim/lua/plugins/mini/comment.lua deleted file mode 100644 index 434ccf7..0000000 --- a/.config/nvim/lua/plugins/mini/comment.lua +++ /dev/null @@ -1,57 +0,0 @@ ----@type LazySpec -return { - 'echasnovski/mini.comment', - version = '*', - enabled = false, - keys = { - { 'gc', mode = { 'n', 'x', 'o' } }, - { 'gcc' }, - { - '/', - function() - return require('mini.comment').operator() .. '_' - end, - desc = 'Toggle comment', - expr = true, - mode = 'n', - }, - { - '/', - function() - return require('mini.comment').operator() - end, - desc = 'Toggle comment', - expr = true, - mode = 'x', - }, - }, - dependencies = { - { - 'JoosepAlviste/nvim-ts-context-commentstring', - -- config = function() - -- -- vim.g.skip_ts_context_commentstring_module = true - -- require('ts_context_commentstring').setup({ - -- enable_autocmd = false, - -- }) - -- end, - }, - }, - config = function() - ---@diagnostic disable-next-line: missing-fields - require('ts_context_commentstring').setup({ - custom_calculation = function(_, language_tree) - if vim.bo.filetype == 'blade' and language_tree._lang ~= 'javascript' and language_tree._lang ~= 'php' then - return '{{-- %s --}}' - end - end, - enable_autocmd = false, - }) - require('mini.comment').setup({ - options = { - custom_commentstring = function() - return require('ts_context_commentstring').calculate_commentstring() or vim.bo.commentstring - end, - }, - }) - end, -} diff --git a/.config/nvim/lua/plugins/mini/misc.lua b/.config/nvim/lua/plugins/mini/misc.lua deleted file mode 100644 index 9a59e71..0000000 --- a/.config/nvim/lua/plugins/mini/misc.lua +++ /dev/null @@ -1,26 +0,0 @@ ----@type LazySpec -return { - 'echasnovski/mini.misc', - version = '*', - event = 'BufWinEnter', - keys = { - { - 'wm', - function() - require('mini.misc').zoom() - end, - desc = 'Window zoom', - }, - { - 'm', - function() - require('mini.misc').zoom() - end, - desc = 'Window zoom', - }, - }, - config = function() - require('mini.misc').setup({}) - require('mini.misc').setup_restore_cursor() - end, -} diff --git a/.config/nvim/lua/plugins/mini/pairs.lua b/.config/nvim/lua/plugins/mini/pairs.lua deleted file mode 100644 index 6621d19..0000000 --- a/.config/nvim/lua/plugins/mini/pairs.lua +++ /dev/null @@ -1,55 +0,0 @@ ----@type LazySpec -return { - 'echasnovski/mini.pairs', - event = { 'InsertEnter', 'CmdlineEnter' }, - enabled = false, - opts = { - modes = { insert = true, command = true, terminal = false }, - -- skip autopair when next character is one of these - skip_next = [=[[%w%%%'%[%"%.%`%$]]=], - -- skip autopair when the cursor is inside these treesitter nodes - skip_ts = { 'string' }, - -- skip autopair when next character is closing pair - -- and there are more closing pairs than opening pairs - skip_unbalanced = true, - -- better deal with markdown code blocks - markdown = true, - }, - config = function(_, opts) - local pairs = require 'mini.pairs' - pairs.setup(opts) - local open = pairs.open - pairs.open = function(pair, neigh_pattern) - if vim.fn.getcmdline() ~= '' then - return open(pair, neigh_pattern) - end - local o, c = pair:sub(1, 1), pair:sub(2, 2) - local line = vim.api.nvim_get_current_line() - local cursor = vim.api.nvim_win_get_cursor(0) - local next = line:sub(cursor[2] + 1, cursor[2] + 1) - local before = line:sub(1, cursor[2]) - if opts.markdown and o == '`' and vim.bo.filetype == 'markdown' and before:match '^%s*``' then - return '`\n```' .. vim.api.nvim_replace_termcodes('', true, true, true) - end - if opts.skip_next and next ~= '' and next:match(opts.skip_next) then - return o - end - if opts.skip_ts and #opts.skip_ts > 0 then - local ok, captures = pcall(vim.treesitter.get_captures_at_pos, 0, cursor[1] - 1, math.max(cursor[2] - 1, 0)) - for _, capture in ipairs(ok and captures or {}) do - if vim.tbl_contains(opts.skip_ts, capture.capture) then - return o - end - end - end - if opts.skip_unbalanced and next == c and c ~= o then - local _, count_open = line:gsub(vim.pesc(pair:sub(1, 1)), '') - local _, count_close = line:gsub(vim.pesc(pair:sub(2, 2)), '') - if count_close > count_open then - return o - end - end - return open(pair, neigh_pattern) - end - end, -} diff --git a/.config/nvim/lua/plugins/mini/pick.lua b/.config/nvim/lua/plugins/mini/pick.lua deleted file mode 100644 index 6869dfd..0000000 --- a/.config/nvim/lua/plugins/mini/pick.lua +++ /dev/null @@ -1,58 +0,0 @@ ----@type LazySpec -return { - 'echasnovski/mini.pick', - enabled = false, - dependencies = { - { - 'echasnovski/mini.extra', - version = '*', - config = function() - require('mini.extra').setup() - end, - }, - }, - version = '*', - keys = function() - local pick = require 'mini.pick' - - return { - { 'p', '', desc = '+pick' }, - { - 'pb', - function() - pick.builtin.buffers({ include_current = false }) - end, - desc = '[B]uffer', - }, - { 'pf', pick.builtin.files, desc = '[F]ile' }, - { - 'pn', - function() - local opts = { source = { cwd = vim.fn.stdpath 'config' } } - local local_opts = { cwd = nil, tool = 'fd' } - pick.builtin.files(local_opts, opts) - end, - desc = '[N]eovim config', - }, - } - end, - config = function() - require('mini.pick').setup({ - mappings = { - choose_in_split = '', - mark = '', - mark_all = '', - move_down = '', - move_start = '', - move_up = '', - }, - -- General options - options = { - -- Whether to show content from bottom to top - content_from_bottom = false, - -- Whether to cache matches (more speed and memory on repeated prompts) - use_cache = true, - }, - }) - end, -} diff --git a/.config/nvim/lua/plugins/mini/statusline.lua b/.config/nvim/lua/plugins/mini/statusline.lua deleted file mode 100644 index 7012f6e..0000000 --- a/.config/nvim/lua/plugins/mini/statusline.lua +++ /dev/null @@ -1,10 +0,0 @@ ----@type LazySpec -return { - 'echasnovski/mini.statusline', - enabled = false, - event = 'VeryLazy', - dependencies = { 'nvim-tree/nvim-web-devicons' }, - config = function() - require('mini.statusline').setup({}) - end, -} diff --git a/.config/nvim/lua/plugins/mini/surround.lua b/.config/nvim/lua/plugins/mini/surround.lua deleted file mode 100644 index 8fedbb9..0000000 --- a/.config/nvim/lua/plugins/mini/surround.lua +++ /dev/null @@ -1,30 +0,0 @@ ----@type LazySpec -return { - 'echasnovski/mini.surround', - version = '*', - enabled = false, - keys = { - { 'gz', '', desc = '+surround' }, - { 'ys', mode = { 'n', 'v' }, desc = 'Surround add' }, - { 'ds', mode = { 'n' }, desc = 'Surround delete' }, - { 'cs', mode = { 'n' }, desc = 'Surround replace' }, - { 'gzf', mode = { 'n' }, desc = 'Surround find' }, - { 'gzh', mode = { 'n' }, desc = 'Surround highlight' }, - }, - opts = { - search_method = 'cover_or_next', - n_lines = 500, - mappings = { - add = 'ys', -- Add surrounding in Normal and Visual modes - delete = 'ds', -- Delete surrounding - replace = 'cs', -- Replace surrounding - find = 'gzf', -- Find surrounding (to the right) - find_left = 'sF', -- Find surrounding (to the left) - highlight = 'gzh', -- Highlight surrounding - update_n_lines = 'gzn', -- Update `n_lines` - }, - }, - config = function(_, opts) - require('mini.surround').setup(opts) - end, -} diff --git a/.config/nvim/lua/plugins/mini/tabline.lua b/.config/nvim/lua/plugins/mini/tabline.lua deleted file mode 100644 index 5146225..0000000 --- a/.config/nvim/lua/plugins/mini/tabline.lua +++ /dev/null @@ -1,10 +0,0 @@ ----@type LazySpec -return { - 'echasnovski/mini.tabline', - enabled = false, - event = 'VeryLazy', - dependencies = { 'nvim-tree/nvim-web-devicons', 'tiagovla/scope.nvim' }, - config = function() - require('mini.tabline').setup({}) - end, -} diff --git a/.config/nvim/lua/plugins/multi-cursor.lua b/.config/nvim/lua/plugins/multi-cursor.lua deleted file mode 100644 index 095cac6..0000000 --- a/.config/nvim/lua/plugins/multi-cursor.lua +++ /dev/null @@ -1,17 +0,0 @@ -return { - 'mg979/vim-visual-multi', - branch = 'master', - version = false, - init = function() - vim.g.VM_maps = {} - vim.g.VM_mouse_mappings = 1 - vim.g.VM_maps = { - ['Find Under'] = '', - ['Find Subword Under'] = '', - ['Skip Region'] = '', - ['Select All'] = '', - ['Start Regex Search'] = '\\/', - } - end, - keys = { { '', mode = { 'n', 'v' } }, { '', mode = { 'n', 'v' } } }, -} diff --git a/.config/nvim/lua/plugins/neotree.lua b/.config/nvim/lua/plugins/neotree.lua deleted file mode 100644 index 633041a..0000000 --- a/.config/nvim/lua/plugins/neotree.lua +++ /dev/null @@ -1,119 +0,0 @@ ---- if current buffer is a neotree buffer, toggle it ---- if we're currently not in focused for neotree then focus on the neotree buffer -local function better_toggle_neotree() - local bufnr = vim.api.nvim_get_current_buf() - local bufname = vim.fn.bufname(bufnr) - if bufname ~= '' and string.match(bufname, 'neo.tree %w+') ~= nil then - vim.cmd 'Neotree toggle' - else - vim.cmd 'Neotree reveal focus' - end -end -local cmd = 'trash' -if vim.fn.executable 'trash-put' == 1 then - cmd = 'trash-put' -end - ----@type LazySpec -return { - 'nvim-neo-tree/neo-tree.nvim', - version = 'v3.x', - cmd = 'Neotree', - enabled = false, - dependencies = { - 'nvim-lua/plenary.nvim', - 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended - 'MunifTanjim/nui.nvim', - 'antosha417/nvim-lsp-file-operations', - { - 's1n7ax/nvim-window-picker', - version = '2.*', - config = function() - require('window-picker').setup({ - filter_rules = { - include_current_win = false, - autoselect_one = true, - -- filter using buffer options - bo = { - -- if the file type is one of following, the window will be ignored - filetype = { 'neo-tree', 'neo-tree-popup', 'notify' }, - -- if the buffer type is one of following, the window will be ignored - buftype = { 'terminal', 'quickfix' }, - }, - }, - --- @type 'statusline-winbar' | 'floating-big-letter' - hint = 'floating-big-letter', - }) - end, - }, - }, - keys = { - { - 'e', - better_toggle_neotree, - desc = 'Open File [E]xplorer(Reveal)', - }, - { 'E', 'Neotree focus', desc = 'Open File [E]xplorer' }, - }, - init = function() - vim.g.neo_tree_remove_legacy_commands = 1 - end, - opts = { - window = { - mappings = { - l = 'open', - ['?'] = 'show_help', - ['<'] = 'prev_source', - ['>'] = 'next_source', - }, - }, - filesystem = { - use_libuv_file_watcher = true, - window = { - -- mappings = { }, - fuzzy_finder_mappings = { - [''] = 'move_cursor_down', - [''] = 'move_cursor_up', - [''] = 'move_cursor_down', - [''] = 'move_cursor_up', - }, - }, - - commands = { - -- Override delete to use trash instead of rm - delete = function(state) - local inputs = require 'neo-tree.ui.inputs' - local path = state.tree:get_node().path - local msg = 'Trash ' .. path .. ' ?' - inputs.confirm(msg, function(confirmed) - if not confirmed then - return - end - - vim.fn.system({ cmd, vim.fn.fnameescape(path) }) - require('neo-tree.sources.manager').refresh(state.name) - end) - end, - -- over write default 'delete_visual' command to 'trash' x n. - delete_visual = function(state, selected_nodes) - local inputs = require 'neo-tree.ui.inputs' - local count = #selected_nodes - local msg = 'Trash ' .. count .. ' files ?' - inputs.confirm(msg, function(confirmed) - if not confirmed then - return - end - for _, node in ipairs(selected_nodes) do - vim.fn.system({ cmd, vim.fn.fnameescape(node.path) }) - end - require('neo-tree.sources.manager').refresh(state.name) - end) - end, - }, - }, - }, - config = function(_, opts) - require('neo-tree').setup(opts) - require('lsp-file-operations').setup({}) - end, -} diff --git a/.config/nvim/lua/plugins/nvim-cmp.lua b/.config/nvim/lua/plugins/nvim-cmp.lua deleted file mode 100644 index 96f16e8..0000000 --- a/.config/nvim/lua/plugins/nvim-cmp.lua +++ /dev/null @@ -1,331 +0,0 @@ -local function feedkey(key, mode) - vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true) -end -local function has_words_before() - 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 function deprio(kind) - return function(e1, e2) - if e1:get_kind() == kind then - return false - end - if e2:get_kind() == kind then - return true - end - end -end - ---- detect if the current completion item is an emmet completion item ---- @param entry cmp.Entry ----@return boolean -local function isEmmet(entry) - local isTextOrSnippet = entry:get_kind() == require('cmp.types').lsp.CompletionItemKind.Text - or entry:get_kind() == require('cmp.types').lsp.CompletionItemKind.Snippet - local isEmmetls = entry.source:get_debug_name() == 'nvim_lsp:emmet_language_server' - or entry.source:get_debug_name() == 'nvim_lsp:emmet_ls' - - return isTextOrSnippet and isEmmetls -end - ----@type LazySpec -return { - 'iguanacucumber/magazine.nvim', - name = 'nvim-cmp', -- Otherwise highlighting gets messed up - enabled = false, - event = 'BufReadPre', - dependencies = { - 'hrsh7th/cmp-nvim-lsp', - 'hrsh7th/cmp-buffer', - -- 'hrsh7th/cmp-path', - 'https://codeberg.org/FelipeLema/cmp-async-path', - 'hrsh7th/cmp-cmdline', - 'lukas-reineke/cmp-rg', - -- 'lukas-reineke/cmp-under-comparator', - 'octaltree/cmp-look', - 'saadparwaiz1/cmp_luasnip', - { - 'L3MON4D3/LuaSnip', - build = 'make install_jsregexp', - dependencies = { 'rafamadriz/friendly-snippets' }, - event = 'User BaseFile', - opts = { history = true, delete_check_events = 'TextChanged', region_check_events = 'CursorMoved' }, - config = function(_, opts) - if opts then - require('luasnip').config.setup(opts) - end - - vim.tbl_map(function(type) - require('luasnip.loaders.from_' .. type).lazy_load() - end, { 'vscode', 'snipmate', 'lua' }) - require('luasnip.loaders.from_vscode').lazy_load({ paths = { vim.fn.stdpath 'config' .. '/snippets' } }) - - local extends = { - typescript = { 'tsdoc' }, - javascript = { 'jsdoc' }, - lua = { 'luadoc' }, - python = { 'pydoc' }, - rust = { 'rustdoc' }, - cs = { 'csharpdoc' }, - java = { 'javadoc' }, - c = { 'cdoc' }, - cpp = { 'cppdoc' }, - php = { 'phpdoc' }, - kotlin = { 'kdoc' }, - ruby = { 'rdoc' }, - sh = { 'shelldoc' }, - } - -- friendly-snippets - enable standardized comments snippets - for ft, snips in pairs(extends) do - require('luasnip').filetype_extend(ft, snips) - end - end, - }, - 'onsails/lspkind.nvim', - { - 'folke/lazydev.nvim', - ft = 'lua', -- only load on lua files - opts = { - library = { 'lazy.nvim', { path = 'luvit-meta/library', words = { 'vim%.uv' } } }, - }, - }, - { 'Bilal2453/luvit-meta', lazy = true }, - }, - config = function() - local cmp = require 'cmp' - local types = require 'cmp.types' - local sources = require 'cmp.config.sources' - local compare = require 'cmp.config.compare' - local lspkind = require 'lspkind' - local snippet = 'luasnip' - local luasnip = require 'luasnip' - - cmp.setup({ - snippet = { - expand = function(args) - luasnip.lsp_expand(args.body) - end, - }, - experimental = { ghost_text = false, native_menu = false }, - window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered() }, - duplicates = { - nvim_lsp = 1, - lazydev = 1, - [snippet] = 1, - cmp_tabnine = 1, - buffer = 1, - path = 1, - }, - - mapping = { - [''] = cmp.mapping({ i = cmp.mapping.scroll_docs(-4) }), - [''] = cmp.mapping({ i = cmp.mapping.scroll_docs(4) }), - [''] = cmp.mapping.complete(), - [''] = cmp.mapping.close(), - [''] = cmp.mapping({ - i = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }), - c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }), - }), - [''] = cmp.mapping({ - i = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }), - c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }), - }), - [''] = cmp.mapping({ - i = function(fallback) - if cmp.visible() then - cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) - else - fallback() - end - end, - }), - [''] = cmp.mapping({ - i = function(fallback) - if cmp.visible() then - cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) - else - fallback() - end - end, - }), - [''] = cmp.mapping({ - c = function() - if cmp.visible() then - cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) - else - feedkey('', 'n') - end - end, - i = function(fallback) - if cmp.visible() then - cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) - else - fallback() - end - end, - }), - [''] = cmp.mapping({ - c = function() - if cmp.visible() then - cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) - else - feedkey('', 'n') - end - end, - i = function(fallback) - if cmp.visible() then - cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) - else - fallback() - end - end, - }), - [''] = cmp.mapping.complete({ - config = { sources = { { name = snippet } } }, - }), - [''] = cmp.mapping.complete({ - config = { - sources = { - { - name = 'nvim_lsp', - entry_filter = function(entry) - return isEmmet(entry) - end, - }, - }, - }, - }), - [''] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - -- elseif vim.snippet.active({ direction = 1 }) then - -- return 'lua vim.snippet.jump(1)' - -- vim.snippet.jump(1) - -- elseif vim.fn['vsnip#available'](1) == 1 then - -- feedkey('(vsnip-expand-or-jump)', '') - 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() - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.jumpable(-1) then - luasnip.jump(-1) - -- elseif vim.snippet.active({ direction = -1 }) then - -- return 'lua vim.snippet.jump(-1)' - -- vim.snippet.jump(-1) - -- elseif vim.fn['vsnip#jumpable'](-1) == 1 then - -- feedkey('(vsnip-jump-prev)', '') - end - end, { 'i', 's' }), - }, - sources = sources({ - { - name = 'nvim_lsp', - priority = 100, - max_item_count = 20, - entry_filter = function(entry) - return not isEmmet(entry) - end, - }, - { name = 'lazydev', priority = 95 }, - { name = snippet, priority = 90 }, - { - name = 'buffer', - max_item_count = 10, - option = { - keyword_length = 2, - -- get_bufnrs = function() - -- local bufIsSmall = function(bufnr) - -- return vim.api.nvim_buf_line_count(bufnr) < 2000 - -- end - -- return vim.tbl_filter(bufIsSmall, vim.api.nvim_list_bufs()) - -- end, - }, - priority = 40, - }, - { - name = 'rg', - keyword_length = 3, - max_item_count = 10, - priority_weight = 50, - option = { - additional_arguments = '--smart-case --hidden', - set_filetype = true, - marker = ' ❰❰❰', - }, - -- entry_filter = function(entry) - -- return not entry.exact - -- end, - }, - -- { name = 'path', priority = 50 }, - { name = 'async_path', priority = 50, option = { trailing_slash = false } }, - { - name = 'look', - keyword_length = 5, - priority = 30, - option = { - convert_case = true, - loud = true, - --dict = '/usr/share/dict/words' - }, - }, - }), - sorting = { - priority_weight = 100, - comparators = { - deprio(types.lsp.CompletionItemKind.Text), - compare.exact, - compare.score, - compare.offset, - compare.kind, - compare.recently_used, - compare.length, - compare.locality, - }, - }, - ---@diagnostic disable-next-line: missing-fields - formatting = { - fields = { 'kind', 'abbr', 'menu' }, - format = lspkind.cmp_format({ - mode = 'symbol', - maxwidth = 50, - ellipsis_char = '...', - symbol_map = { Copilot = '' }, - }), - }, - }) - cmp.setup.cmdline(':', { - sources = sources({ - { - name = 'cmdline', - option = { - ignore_cmds = { 'Man', '!', 'find', 'fin' }, - }, - }, - { name = 'path' }, - }), - matching = { disallow_symbol_nonprefix_matching = false }, - mapping = cmp.mapping.preset.cmdline(), - formatting = { fields = { 'abbr' } }, - window = { completion = cmp.config.window.bordered({ col_offset = 0 }) }, - }) - - cmp.setup.cmdline({ '/', '?' }, { - sources = sources({ - { name = 'buffer' }, - }), - mapping = cmp.mapping.preset.cmdline(), - formatting = { fields = { 'abbr' } }, - window = { completion = cmp.config.window.bordered({ col_offset = 0 }) }, - }) - end, -} diff --git a/.config/nvim/lua/plugins/nvim-lint.lua b/.config/nvim/lua/plugins/nvim-lint.lua deleted file mode 100644 index 6f68031..0000000 --- a/.config/nvim/lua/plugins/nvim-lint.lua +++ /dev/null @@ -1,113 +0,0 @@ -local au_group = vim.api.nvim_create_augroup('sp_nvim_lint', {}) -local languages = { - sh = { 'shellcheck', 'cspell' }, - bash = { 'shellcheck', 'cspell' }, - fish = { 'fish' }, - zsh = { 'shellcheck', 'zsh', 'cspell' }, - -- c = { 'clangtidy' }, - -- cpp = { 'clangtidy' }, - go = { 'golangcilint', 'cspell' }, - -- markdown = { 'vale' }, - html = { 'htmlhint', 'cspell' }, - css = { 'stylelint', 'cspell' }, - scss = { 'stylelint', 'cspell' }, - sass = { 'stylelint', 'cspell' }, - less = { 'stylelint', 'cspell' }, - python = { 'ruff', 'cspell' }, - astro = { 'cspell' }, - svelte = { 'cspell' }, - javascript = { 'cspell' }, - javascriptreact = { 'cspell' }, - typescript = { 'cspell' }, - typescriptreact = { 'cspell' }, - vue = { 'cspell' }, - yaml = { 'yamllint', 'cspell' }, - php = { 'php', 'phpstan', 'phpcs', 'cspell' }, -} -local linters = { - eslint_d = { - condition = function(ctx) - return vim.fs.find({ - 'eslint.config.js', - 'eslint.config.mjs', - 'eslint.config.cjs', - '.eslintrc.json', - '.eslintrc', - '.eslintrc.js', - '.eslintrc.yaml', - '.eslintrc.yml', - }, { path = ctx.filename, upward = true })[1] - end, - }, -} - -local function debounce(ms, fn) - local timer = vim.uv.new_timer() - return function(...) - local argv = { ... } - timer:start(ms, 0, function() - timer:stop() - vim.schedule_wrap(fn)(unpack(argv)) - end) - end -end - ----@type LazySpec -return { - 'mfussenegger/nvim-lint', - enabled = true, - ft = vim.tbl_keys(languages), - config = function(_, opts) - local lint = require 'lint' - vim.env.ESLINT_D_PPID = vim.fn.getpid() - languages = vim.tbl_deep_extend('force', languages, opts.languages or {}) - linters = vim.tbl_deep_extend('force', linters, opts.linters or {}) - - lint.linters_by_ft = languages - - local function run() - -- Use nvim-lint's logic first: - -- * checks if linters exist for the full filetype first - -- * otherwise will split filetype by "." and add all those linters - -- * this differs from conform.nvim which only uses the first filetype that has a formatter - local names = lint._resolve_linter_by_ft(vim.bo.filetype) - - -- Create a copy of the names table to avoid modifying the original. - names = vim.list_extend({}, names) - - -- Add fallback linters. - if #names == 0 then - vim.list_extend(names, lint.linters_by_ft['_'] or {}) - end - - -- Add global linters. - vim.list_extend(names, lint.linters_by_ft['*'] or {}) - - -- Filter out linters that don't exist or don't match the condition. - local ctx = { filename = vim.api.nvim_buf_get_name(0) } - ctx.dirname = vim.fn.fnamemodify(ctx.filename, ':h') - names = vim.tbl_filter(function(name) - local linter = lint.linters[name] - return linter and not (type(linter) == 'table' and linter.condition and not linter.condition(ctx)) - end, names) - - -- Run linters. - if #names > 0 then - lint.try_lint(names) - end - end - for name, linter in pairs(linters) do - if type(linter) == 'table' and type(lint.linters[name]) == 'table' then - lint.linters[name] = vim.tbl_deep_extend('force', lint.linters[name], linter) - else - lint.linters[name] = linter - end - end - vim.api.nvim_create_autocmd({ 'BufWritePost', 'BufRead', 'InsertLeave', 'FocusGained' }, { - group = au_group, - desc = 'Lint on save', - pattern = '*', - callback = debounce(100, run), - }) - end, -} diff --git a/.config/nvim/lua/plugins/nvim-scissors.lua b/.config/nvim/lua/plugins/nvim-scissors.lua deleted file mode 100644 index 669ced9..0000000 --- a/.config/nvim/lua/plugins/nvim-scissors.lua +++ /dev/null @@ -1,28 +0,0 @@ ----@type LazySpec -return { - 'chrisgrieser/nvim-scissors', - opts = { - snippetDir = vim.fn.stdpath 'config' .. '/snippets/', -- this is already the default, but I want to be explicit - ---@type "yq"|"jq"|"none"|string[] - jsonFormatter = vim.fn.executable 'jq' == 1 and 'jq' or 'none', - }, - keys = { - { 's', '', desc = '+[S]nippets' }, - { - 'se', - function() - require('scissors').editSnippet() - end, - desc = 'Snippet: [E]dit', - }, - { - 'sn', - function() - require('scissors').addNewSnippet() - end, - mode = { 'n', 'x' }, - { desc = 'Snippet: [N]ew' }, - }, - { 'sd', 'AutoSession delete', desc = '[D]elte' }, - }, -} diff --git a/.config/nvim/lua/plugins/nvim-tree.lua b/.config/nvim/lua/plugins/nvim-tree.lua deleted file mode 100644 index eb5d337..0000000 --- a/.config/nvim/lua/plugins/nvim-tree.lua +++ /dev/null @@ -1,98 +0,0 @@ -local au_group = vim.api.nvim_create_augroup('sp_nvim_tree', { clear = true }) - ----Description: NvimTree configuration ----Use single hotkeys to toggle/focus nvim-tree ----If nvim-tree is focused - close it, otherwise focus it ----@param isFind boolean -local nvimTreeFocusOrToggle = function(isFind) - local nvimTree = require 'nvim-tree.api' - local localIsFind = isFind or false - local currentBuf = vim.api.nvim_get_current_buf() - local currentBufFt = vim.api.nvim_get_option_value('filetype', { buf = currentBuf }) - if currentBufFt == 'NvimTree' then - nvimTree.tree.toggle() - else - nvimTree.tree.focus({ find_file = localIsFind }) - end -end - -local function my_on_attach(bufnr) - local api = require 'nvim-tree.api' - - local function opts(desc) - return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true } - end - - -- default mappings - api.config.mappings.default_on_attach(bufnr) - - -- custom mappings - - vim.keymap.del('n', 'U', { buffer = bufnr }) - vim.keymap.del('n', 'L', { buffer = bufnr }) - vim.keymap.del('n', 'M', { buffer = bufnr }) - vim.keymap.set('n', 'H', api.node.navigate.parent, opts 'Goto parent') - vim.keymap.set('n', 'l', api.node.open.edit, opts 'Open') - vim.keymap.set('n', 'L', api.node.open.no_windown_picker, opts 'Open(no window select)') - vim.keymap.set('n', '?', api.tree.toggle_help, opts 'Help') - vim.keymap.set('n', 'D', api.fs.remove, opts 'Delete') - vim.keymap.set('n', 'd', api.fs.trash, opts 'Trash') - - vim.keymap.set('n', 'tl', api.node.open.toggle_group_empty, opts 'Toggle Group Empty') - vim.keymap.set('n', 'tm', api.tree.toggle_no_bookmark_filter, opts 'Toggle Filter: No Bookmark') - vim.keymap.set('n', 'td', api.tree.toggle_hidden_filter, opts 'Toggle Dotfiles') - vim.keymap.set('n', 'tg', api.tree.toggle_gitignore_filter, opts 'Toggle Gitignore') - vim.keymap.set('n', 'tc', api.tree.toggle_custom_filter, opts 'Toggle Custom filters') -end - ----@type LazySpec -return { - 'nvim-tree/nvim-tree.lua', - enabled = false, - dependencies = { 'nvim-tree/nvim-web-devicons', 'antosha417/nvim-lsp-file-operations', 'nvim-lua/plenary.nvim' }, - cmd = 'NvimTreeToggle', - keys = { - { - 'e', - function() - nvimTreeFocusOrToggle(true) - end, - desc = 'Toggle NvimTree(Find)', - }, - { 'E', nvimTreeFocusOrToggle, desc = 'Toggle NvimTree' }, - }, - init = function() - -- disable netrw at the very start of your init.lua - vim.g.loaded_netrw = 1 - vim.g.loaded_netrwPlugin = 1 - - vim.api.nvim_create_autocmd('BufEnter', { - group = au_group, - desc = "Close nvim-tree if it's the only window", - pattern = 'NvimTree_*', - callback = function() - local layout = vim.api.nvim_call_function('winlayout', {}) - if - layout[1] == 'leaf' - and vim.api.nvim_get_option_value('filetype', { buf = vim.api.nvim_win_get_buf(layout[2]) }) == 'NvimTree' - and layout[3] == nil - then - vim.cmd 'confirm quit' - end - end, - }) - end, - config = function() - require('nvim-tree').setup({ - view = { width = 40 }, - ui = { - confirm = { - remove = true, - trash = false, - }, - }, - on_attach = my_on_attach, - }) - require('lsp-file-operations').setup() - end, -} diff --git a/.config/nvim/lua/plugins/snacks.lua b/.config/nvim/lua/plugins/snacks.lua deleted file mode 100644 index 4d0ac64..0000000 --- a/.config/nvim/lua/plugins/snacks.lua +++ /dev/null @@ -1,84 +0,0 @@ ----@type LazySpec -return { - 'folke/snacks.nvim', - priority = 1000, - lazy = false, - opts = { - bigfile = { enabled = true }, - notifier = { enabled = true }, - quickfile = { enabled = true }, - statuscolumn = { - enabled = true, - folds = { - open = true, -- show open fold icons - }, - }, - words = { enabled = true }, - scope = { enabled = true }, - indent = { - enabled = true, - indent = { - only_current = true, - chunk = { - -- when enabled, scopes will be rendered as chunks, except for the - -- top-level scope which will be rendered as a scope. - enabled = true, - }, - }, - chunk = { - -- when enabled, scopes will be rendered as chunks, except for the - -- top-level scope which will be rendered as a scope. - enabled = true, - }, - }, - }, - keys = { - { - 'gg', - function() - Snacks.lazygit() - end, - desc = 'Lazygit', - }, - { - 'gL', - function() - Snacks.git.blame_line() - end, - desc = 'Git Blame Line', - }, - { - 'go', - function() - Snacks.gitbrowse.open() - end, - desc = 'Git Open Line', - }, - { - ']]', - function() - Snacks.words.jump(vim.v.count1) - end, - desc = 'Next Reference', - mode = { 'n', 't' }, - }, - { - '[[', - function() - Snacks.words.jump(-vim.v.count1) - end, - desc = 'Prev Reference', - mode = { 'n', 't' }, - }, - - -- { "lR", function() Snacks.rename.rename_file() end, desc = "Rename File" }, - }, - init = function() - vim.api.nvim_create_user_command('NotificationHistory', function() - if not _G.Snacks then - return - end - Snacks.notifier.show_history() - end, { desc = 'Show Notification History' }) - end, -} diff --git a/.config/nvim/lua/plugins/subversive.lua b/.config/nvim/lua/plugins/subversive.lua deleted file mode 100644 index ac251dc..0000000 --- a/.config/nvim/lua/plugins/subversive.lua +++ /dev/null @@ -1,10 +0,0 @@ ----@type LazySpec -return { - 'svermeulen/vim-subversive', - enabled = false, - keys = { - { 'x', '(SubversiveSubstitute)', noremap = false }, - { 'X', '(SubversiveSubstituteToEndOfLine)', noremap = false }, - { 'xx', '(SubversiveSubstituteLine)', noremap = false }, - }, -} diff --git a/.config/nvim/lua/plugins/telescope.lua b/.config/nvim/lua/plugins/telescope.lua deleted file mode 100644 index a371ac2..0000000 --- a/.config/nvim/lua/plugins/telescope.lua +++ /dev/null @@ -1,380 +0,0 @@ -local au_telescope = vim.api.nvim_create_augroup('au_telescope', { clear = true }) - -local function getVisualSelection() - vim.cmd 'noau normal! "vy"' - local text = vim.fn.getreg 'v' - vim.fn.setreg('v', {}) - - text = string.gsub(text, '\n', '') - if #text > 0 then - return text - else - return '' - end -end - -local function filename_first(_, path) - local tail = vim.fs.basename(path) - local parent = vim.fs.dirname(path) - if parent == '.' then - return tail - end - return string.format('%s\t\t%s', tail, parent) -end - -local function telescope_create_file() - require('telescope.builtin').find_files({ - prompt_title = 'Create File', - find_command = { 'fd', '--type', 'd', '.', vim.fn.getcwd() }, - attach_mappings = function(_, map) - local state = require 'telescope.actions.state' - local actions = require 'telescope.actions' - map('i', '', function(prompt_bufnr) - local content = state.get_selected_entry() - actions.close(prompt_bufnr) - -- vim.print('content : ' .. content.cwd .. '/' .. content.value) - local dir = content.value - local name = vim.fn.input 'File Name: ' - vim.cmd('e ' .. dir .. name) - vim.cmd 'w ++p' - end) - return true - end, - }) -end - -local function project_files() - local opts = { - path_display = filename_first, - previewer = false, - } -- define here if you want to define something - - if vim.b.gitsigns_head then - opts.show_untracked = true - require('telescope.builtin').git_files(opts) - else - require('telescope.builtin').find_files(opts) - end -end - ----@type LazySpec -return { - 'nvim-telescope/telescope.nvim', - cmd = 'Telescope', - enabled = false, - dependencies = { - 'nvim-lua/plenary.nvim', - { 'nvim-telescope/telescope-fzf-native.nvim', build = 'make', enabled = false }, - 'natecraddock/telescope-zf-native.nvim', - 'nvim-telescope/telescope-ui-select.nvim', - { 'fdschmidt93/telescope-egrepify.nvim', dependencies = 'nvim-lua/plenary.nvim' }, - }, - keys = function() - local builtin = require 'telescope.builtin' - return { - { - '', - project_files, - desc = 'Git/Files', - }, - { - 'ff', - function() - builtin.find_files({ path_display = filename_first }) - end, - desc = 'Files', - }, - { - 'fF', - function() - builtin.git_files({ show_untracked = true, use_file_path = true, path_display = filename_first }) - end, - desc = 'Git Files(use_file_path)', - }, - { 'fp', telescope_create_file, desc = 'CreateFile' }, - { 'fc', telescope_create_file, desc = 'CreateFile' }, - { 'fk', builtin.keymaps, desc = 'keymaps' }, - { 'fS', builtin.current_buffer_fuzzy_find, desc = 'Search(Buffer)' }, - -- { 'fs', builtin.live_grep, desc = 'Search(Project)' }, - { 'fs', 'Telescope egrepify', desc = 'Search(Project)' }, - { 'fw', builtin.grep_string, desc = 'Search Current Word', mode = { 'n', 'x' } }, - { 'fb', builtin.buffers, desc = 'Buffers' }, - { 'fh', builtin.help_tags, desc = 'Help' }, - { 'fR', builtin.oldfiles, desc = 'Old Files' }, - { 'fr', builtin.resume, desc = 'Resume' }, - { - 'fs', - function() - local text = getVisualSelection() - builtin.live_grep({ default_text = text }) - end, - mode = 'v', - desc = '[S]earch [S]election', - }, - { - 'fS', - function() - local text = getVisualSelection() - builtin.current_buffer_fuzzy_find({ default_text = text }) - end, - mode = 'v', - desc = '[S]earch [S]election(Buffer)', - }, - { - 'fn', - function() - builtin.find_files({ - cwd = vim.fn.stdpath 'config', - path_display = filename_first, - }) - end, - desc = 'Neovim Config', - }, - { - 'fd', - function() - builtin.git_files({ - cwd = vim.fn.expand '$HOME/Documents/dotfiles', - path_display = filename_first, - show_untracked = true, - }) - end, - desc = 'Dotfiles', - }, - { 'gb', builtin.git_branches, desc = 'Git Branches' }, - { 'fg', builtin.git_status, desc = 'Git Status' }, - { 'gS', builtin.git_stash, desc = 'Git Stash' }, - { 'gc', builtin.git_commits, desc = 'Git Commits' }, - { 'gC', builtin.git_bcommits, desc = 'Git Buffer Commits' }, - } - end, - config = function() - vim.api.nvim_create_autocmd('FileType', { - pattern = 'TelescopeResults', - group = au_telescope, - callback = function(ctx) - vim.api.nvim_buf_call(ctx.buf, function() - vim.fn.matchadd('TelescopeParent', '\t\t.*$') - vim.api.nvim_set_hl(0, 'TelescopeParent', { link = 'Comment' }) - end) - end, - }) - local actions = require 'telescope.actions' - local action_layout = require 'telescope.actions.layout' - local builtin = require 'telescope.builtin' - - local dropdown = { - layout_strategy = 'vertical', - layout_config = { width = 0.6, preview_cutoff = 1, prompt_position = 'top' }, - } - require('telescope').setup({ - defaults = { - -- path_display = { "truncate" }, - sorting_strategy = 'ascending', - set_env = { ['COLORTERM'] = 'truecolor' }, - layout_config = { - horizontal = { prompt_position = 'top', preview_width = 0.40 }, - vertical = { mirror = false }, - width = 0.87, - height = 0.80, - preview_cutoff = 120, - }, - mappings = { - i = { - [''] = actions.move_selection_next, - [''] = actions.move_selection_previous, - [''] = actions.cycle_history_next, - [''] = actions.cycle_history_prev, - [''] = actions.close, - [''] = action_layout.toggle_preview, - - [''] = actions.toggle_selection + actions.move_selection_next, - [''] = actions.toggle_selection + actions.move_selection_previous, - [''] = actions.smart_send_to_qflist + actions.open_qflist, - }, - n = { - q = actions.close, - [''] = action_layout.toggle_preview, - [''] = actions.toggle_selection, - }, - }, - vimgrep_arguments = { - 'rg', - '--color=never', - '--no-heading', - '--with-filename', - '--line-number', - '--column', - '--smart-case', - '--hidden', - '--trim', -- add this value - '--glob=!.git/', - '--glob=!node_modules/', - '--glob=!.venv/', - '--glob=!venv/', - }, - }, - - pickers = { - buffers = { - ignore_current_buffer = true, - sort_lastused = true, - mappings = { - i = { [''] = 'delete_buffer' }, - n = { d = 'delete_buffer' }, - }, - prompt_title = 'Buffers', - results_title = 'Command History', - prompt_prefix = ' ', - sorting_strategy = 'ascending', - layout_strategy = 'bottom_pane', - layout_config = { - prompt_position = 'top', - }, - border = true, - borderchars = { - prompt = { ' ', ' ', '─', ' ', ' ', ' ', '─', '─' }, - results = { '─', ' ', ' ', ' ', '─', '─', ' ', ' ' }, - preview = { '─', ' ', '─', '│', '┬', '─', '─', '╰' }, - }, - }, - help_tags = { - prompt_title = 'Help', - results_title = 'Help Tags', - prompt_prefix = ' ', - sorting_strategy = 'ascending', - layout_strategy = 'bottom_pane', - layout_config = { - prompt_position = 'top', - height = 25, - }, - border = true, - borderchars = { - prompt = { ' ', ' ', '─', ' ', ' ', ' ', '─', '─' }, - results = { '─', ' ', ' ', ' ', '─', '─', ' ', ' ' }, - preview = { '─', ' ', '─', '│', '┬', '─', '─', '╰' }, - }, - }, - keymaps = { - prompt_title = 'keymaps', - results_title = 'keymaps', - prompt_prefix = ' ', - sorting_strategy = 'ascending', - layout_strategy = 'bottom_pane', - layout_config = { - prompt_position = 'top', - height = 25, - }, - border = true, - borderchars = { - prompt = { ' ', ' ', '─', ' ', ' ', ' ', '─', '─' }, - results = { '─', ' ', ' ', ' ', '─', '─', ' ', ' ' }, - preview = { '─', ' ', '─', '│', '┬', '─', '─', '╰' }, - }, - }, - command_history = { - prompt_title = '', - results_title = 'Command History', - - --            - --  卑 喝   - prompt_prefix = ' ', - -- prompt_prefix = " ", - -- prompt_prefix = " ", - -- prompt_prefix = " ", - - sorting_strategy = 'ascending', - layout_strategy = 'bottom_pane', - layout_config = { - prompt_position = 'top', - height = 25, - }, - border = true, - borderchars = { - prompt = { ' ', ' ', '─', ' ', ' ', ' ', '─', '─' }, - results = { '─', ' ', ' ', ' ', '─', '─', ' ', ' ' }, - preview = { '─', ' ', '─', '│', '┬', '─', '─', '╰' }, - }, - mappings = { - i = { [''] = actions.edit_command_line }, - n = { [''] = actions.edit_command_line }, - }, - }, - lsp_references = dropdown, - lsp_definitions = dropdown, - git_branches = dropdown, - git_commits = dropdown, - git_bcommits = dropdown, - lsp_document_symbols = dropdown, - lsp_workspace_symbols = dropdown, - grep_string = vim.tbl_extend('force', dropdown, { - path_display = { 'truncate' }, - }), - }, - extensions = { - ['zf-native'] = { - -- options for sorting file-like items - file = { - -- override default telescope file sorter - enable = true, - -- highlight matching text in results - highlight_results = true, - -- enable zf filename match priority - match_filename = true, - -- optional function to define a sort order when the query is empty - initial_sort = nil, - }, - - -- options for sorting all other items - generic = { - -- override default telescope generic item sorter - enable = true, - -- highlight matching text in results - highlight_results = true, - -- disable zf filename match priority - match_filename = false, - -- optional function to define a sort order when the query is empty - initial_sort = nil, - }, - }, - ['ui-select'] = require('telescope.themes').get_dropdown({}), - egrepify = { - prefixes = { - ['>'] = { - flag = 'type', - cb = function(input) - -- check if the input has any commas - if string.find(input, ',') then - return string.format([[{%s}]], input) - end - return string.format([[%s]], input) - end, - }, - ['<'] = { - flag = 'type-not', - cb = function(input) - -- check if the input has any commas - if string.find(input, ',') then - return string.format([[{%s}]], input) - end - return string.format([[%s]], input) - end, - }, - }, - }, - }, - }) - require('telescope').load_extension 'zf-native' - require('telescope').load_extension 'ui-select' - require('telescope').load_extension 'egrepify' - - vim.lsp.handlers['textDocument/definition'] = builtin.lsp_definitions - vim.lsp.handlers['textDocument/typeDefinition'] = builtin.lsp_type_definitions - vim.lsp.handlers['textDocument/implementation'] = builtin.lsp_implementations - vim.lsp.handlers['textDocument/references'] = builtin.lsp_references - vim.lsp.handlers['textDocument/documentSymbol'] = builtin.lsp_document_symbols - vim.lsp.handlers['workspace/symbol'] = builtin.lsp_workspace_symbols - vim.lsp.handlers['callHierarchy/incomingCalls'] = builtin.lsp_incoming_calls - vim.lsp.handlers['callHierarchy/outgoingCalls'] = builtin.lsp_outgoing_calls - end, -} diff --git a/.config/nvim/lua/plugins/template-string.lua b/.config/nvim/lua/plugins/template-string.lua deleted file mode 100644 index 223c579..0000000 --- a/.config/nvim/lua/plugins/template-string.lua +++ /dev/null @@ -1,8 +0,0 @@ ----@type LazySpec -return { - 'axelvc/template-string.nvim', - event = 'InsertEnter', - opts = { - remove_template_string = true, - }, -} diff --git a/.config/nvim/lua/plugins/theme.lua b/.config/nvim/lua/plugins/theme.lua deleted file mode 100644 index e30488b..0000000 --- a/.config/nvim/lua/plugins/theme.lua +++ /dev/null @@ -1,58 +0,0 @@ ----@type LazySpec -return { - { - 'catppuccin/nvim', - name = 'catppuccin', - event = 'VimEnter', - enabled = true, - config = function() - require 'my_config.catppuccin' - end, - }, - { - 'rebelot/kanagawa.nvim', - event = 'VimEnter', - enabled = false, - config = function() - require 'my_config.kangawa' - end, - }, - { - 'blazkowolf/gruber-darker.nvim', - enabled = false, - event = 'VimEnter', - config = function() - require 'my_config.gruber-darker' - end, - }, - { - 'folke/tokyonight.nvim', - enabled = false, - event = 'VimEnter', - config = function() - require 'my_config.tokyonight' - end, - }, - { - 'rose-pine/neovim', - enabled = false, - event = 'VimEnter', - name = 'rose-pine', - config = function() - require('rose-pine').setup({ - styles = { - transparency = true, - }, - }) - vim.cmd.colorscheme 'rose-pine' - end, - }, - { - 'AlexvZyl/nordic.nvim', - enabled = false, - event = 'VimEnter', - config = function() - require 'my_config.nordic' - end, - }, -} diff --git a/.config/nvim/lua/plugins/tmux.lua b/.config/nvim/lua/plugins/tmux.lua deleted file mode 100644 index 4fc4afe..0000000 --- a/.config/nvim/lua/plugins/tmux.lua +++ /dev/null @@ -1,16 +0,0 @@ -return { - { - 'alexghergh/nvim-tmux-navigation', - enabled = true, - config = function() - -- return require('tmux').setup() - require('nvim-tmux-navigation').setup({}) - end, - keys = { - { '', 'NvimTmuxNavigateLeft' }, - { '', 'NvimTmuxNavigateDown' }, - { '', 'NvimTmuxNavigateUp' }, - { '', 'NvimTmuxNavigateRight' }, - }, - }, -} diff --git a/.config/nvim/lua/plugins/toggleterm.lua b/.config/nvim/lua/plugins/toggleterm.lua deleted file mode 100644 index b90c6d2..0000000 --- a/.config/nvim/lua/plugins/toggleterm.lua +++ /dev/null @@ -1,30 +0,0 @@ ----@type LazySpec -return { - 'akinsho/nvim-toggleterm.lua', - version = '*', - keys = { 'tl', '' }, - opts = { - shell = vim.o.shell == '/bin/fish' and '/bin/zsh' or vim.o.shell, - direction = 'float', - open_mapping = [[]], - highlights = { FloatBorder = { link = 'FloatBorder' } }, - float_opts = { border = 'single' }, - }, - config = function(_, opts) - local Terminal = require('toggleterm.terminal').Terminal - local toggleterm = require 'toggleterm' - local lazygit = Terminal:new({ - cmd = 'lazygit', - dir = 'git_dir', - direction = 'float', - float_opts = { border = 'curved' }, - }) - - local function lazygit_toggle() - lazygit:toggle() - end - - toggleterm.setup(opts) - vim.keymap.set('n', 'tl', lazygit_toggle, { desc = '[T]erminal [L]azygit' }) - end, -} diff --git a/.config/nvim/lua/plugins/tpope.lua b/.config/nvim/lua/plugins/tpope.lua deleted file mode 100644 index 3a3cb3d..0000000 --- a/.config/nvim/lua/plugins/tpope.lua +++ /dev/null @@ -1,13 +0,0 @@ ----@type LazySpec -return { - { 'tpope/vim-repeat', event = 'VeryLazy' }, - { - 'tpope/vim-abolish', - keys = { 'cr' }, - cmd = { 'Abolish', 'Subvert', 'S' }, - }, - { - 'tpope/vim-dispatch', - cmd = { 'Dispatch', 'Make', 'Focus', 'Start', 'FocusDispatch', 'Spawn', 'Copen', 'AbortDispatch' }, - }, -} diff --git a/.config/nvim/lua/plugins/tree-sitter.lua b/.config/nvim/lua/plugins/tree-sitter.lua deleted file mode 100644 index 2e71a4f..0000000 --- a/.config/nvim/lua/plugins/tree-sitter.lua +++ /dev/null @@ -1,188 +0,0 @@ ----@type LazySpec -return { - { - 'nvim-treesitter/nvim-treesitter', - event = { 'BufReadPre', 'BufNewFile' }, - lazy = vim.fn.argc(-1) == 0, - version = false, -- last release is way too old and doesn't work on Windows - build = ':TSUpdate', - init = function() - require 'nvim-treesitter.query_predicates' - end, - cmd = { 'TSUpdateSync', 'TSUpdate', 'TSInstall' }, - dependencies = { - 'nvim-treesitter/nvim-treesitter-textobjects', - 'andymass/vim-matchup', - 'windwp/nvim-ts-autotag', - { - 'nvim-treesitter/nvim-treesitter-context', - opts = { - mode = 'cursor', - max_lines = 3, - }, - }, - }, - config = function() - local configs = require 'nvim-treesitter.configs' - ---@diagnostic disable-next-line: missing-fields - configs.setup({ - highlight = { - enable = true, - -- additional_vim_regex_highlighting = { 'markdown', 'xml' }, - disable = function(_, bufnr) - local line_count = vim.api.nvim_buf_line_count(bufnr) - if line_count > 2500 then - return true - end - end, - }, - indent = { enable = false }, - matchup = { enable = true }, - ensure_installed = { - 'bash', - 'dockerfile', - 'fish', - 'query', - 'regex', - 'rasi', - 'sxhkdrc', - 'vim', - 'vimdoc', - 'diff', - 'git_config', - 'git_rebase', - 'gitattributes', - 'gitcommit', - 'gitignore', - 'hyprlang', - 'ini', - 'sql', - 'ssh_config', - 'tmux', - 'toml', - 'xml', - 'zathurarc', - }, - incremental_selection = { - enable = true, - keymaps = { - init_selection = '', - node_incremental = '', - scope_incremental = false, - node_decremental = '', - }, - }, - textobjects = { - -- select = { - -- enable = true, - -- lookahead = true, - -- keymaps = { - -- ['af'] = '@function.outer', - -- ['if'] = '@function.inner', - -- ['ac'] = '@class.outer', - -- ['ic'] = { query = '@class.inner', desc = 'Select inner part of a class region' }, - -- ['al'] = { query = '@scope', query_group = 'locals', desc = 'Select language scope' }, - -- ['a/'] = { query = '@comment.outer', desc = 'Select outer comment' }, - -- ['i/'] = { query = '@comment.inner', desc = 'Select inner comment' }, - -- }, - -- selection_modes = { - -- ['@parameter.outer'] = 'v', -- charwise - -- ['@function.outer'] = 'V', -- linewise - -- ['@class.outer'] = '', -- blockwise - -- }, - -- include_surrounding_whitespace = true, - -- }, - move = { - enable = true, - set_jumps = true, -- whether to set jumps in the jumplist - goto_next_start = { - [']m'] = '@function.outer', - [']C'] = { query = '@class.outer', desc = 'Next class start' }, - [']l'] = '@loop.*', - -- ["]o"] = { query = { "@loop.inner", "@loop.outer" } } - [']s'] = { query = '@scope', query_group = 'locals', desc = 'Next scope' }, - [']z'] = { query = '@fold', query_group = 'folds', desc = 'Next fold' }, - }, - goto_next_end = { - [']M'] = '@function.outer', - [']['] = '@class.outer', - }, - goto_previous_start = { - ['[m'] = '@function.outer', - ['[C'] = '@class.outer', - }, - goto_previous_end = { - ['[M'] = '@function.outer', - ['[]'] = '@class.outer', - }, - goto_next = { - [']i'] = '@conditional.outer', - }, - goto_previous = { - ['[i'] = '@conditional.outer', - }, - }, - swap = { - enable = true, - swap_next = { - ['k'] = { query = '@block.outer', desc = 'Swap next block' }, - ['f'] = { query = '@function.outer', desc = 'Swap next function' }, - ['a'] = { query = '@parameter.inner', desc = 'Swap next argument' }, - }, - swap_previous = { - ['K'] = { query = '@block.outer', desc = 'Swap previous block' }, - ['F'] = { query = '@function.outer', desc = 'Swap previous function' }, - ['A'] = { query = '@parameter.inner', desc = 'Swap previous argument' }, - }, - }, - }, - }) - - require('nvim-ts-autotag').setup({ - -- Defaults - opts = { - enable_close = true, -- Auto close tags - enable_rename = true, -- Auto rename pairs of tags - enable_close_on_slash = false, -- Auto close on trailing c', function() - require('treesitter-context').go_to_context(vim.v.count1) - end, { silent = true, desc = 'Goto Context' }) - vim.keymap.set('n', '', function() - require('treesitter-context').go_to_context(vim.v.count1) - end, { silent = true, desc = 'Goto Context' }) - - -- for _, v in ipairs(vim.fn.readdir(vim.g.base46_cache)) do - -- dofile(vim.g.base46_cache .. v) - -- end - end, - }, - { - 'Wansmer/treesj', - keys = { - { 'm', 'TSJToggle' }, - { - 'M', - function() - require('treesj').toggle({ split = { recursive = true } }) - end, - desc = 'Toggle Treesitter Join(recursive)', - }, - { 'j', 'TSJJoin' }, - { 's', 'TSJSplit' }, - }, - dependencies = { 'nvim-treesitter/nvim-treesitter' }, -- if you install parsers with `nvim-treesitter` - cmd = { 'TSJToggle', 'TSJSplit', 'TSJJoin' }, - opts = { - use_default_keymaps = false, - }, - config = function(_, opts) - require('treesj').setup(opts) - end, - }, -} diff --git a/.config/nvim/lua/plugins/ultimate-autopair.lua b/.config/nvim/lua/plugins/ultimate-autopair.lua deleted file mode 100644 index 684c9a5..0000000 --- a/.config/nvim/lua/plugins/ultimate-autopair.lua +++ /dev/null @@ -1,17 +0,0 @@ ----@type LazySpec -return { - 'altermo/ultimate-autopair.nvim', - event = { 'InsertEnter', 'CmdlineEnter' }, - branch = 'v0.6', --recommended as each new version will have breaking changes - enabled = false, - config = function() - local ok_cmp, _ = pcall(require, 'cmp') - local inits = { - require('ultimate-autopair').extend_default({}), - } - if ok_cmp then - table.insert(inits, { profile = require('ultimate-autopair.experimental.cmpair').init }) - end - require('ultimate-autopair').init(inits) - end, -} diff --git a/.config/nvim/lua/plugins/whichkey.lua b/.config/nvim/lua/plugins/whichkey.lua deleted file mode 100644 index af8dbfe..0000000 --- a/.config/nvim/lua/plugins/whichkey.lua +++ /dev/null @@ -1,95 +0,0 @@ --- Picked up from Astronvim - ---- Close a given buffer ----@param bufnr? number The buffer to close or the current buffer if not provided ----@param force? boolean Whether or not to foce close the buffers or confirm changes (default: false) -function close(bufnr, force) - if not bufnr or bufnr == 0 then - bufnr = vim.api.nvim_get_current_buf() - end - - local buftype = vim.api.nvim_get_option_value('buftype', { buf = bufnr }) - vim.cmd(('silent! %s %d'):format((force or buftype == 'terminal') and 'bdelete!' or 'confirm bdelete', bufnr)) -end - ---- Close all buffers ----@param keep_current? boolean Whether or not to keep the current buffer (default: false) ----@param force? boolean Whether or not to foce close the buffers or confirm changes (default: false) -function close_all(keep_current, force) - if keep_current == nil then - keep_current = false - end - local current = vim.api.nvim_get_current_buf() - for _, bufnr in ipairs(vim.t.bufs) do - if not keep_current or bufnr ~= current then - close(bufnr, force) - end - end -end - -return { - 'folke/which-key.nvim', - event = 'VeryLazy', - keys = { '', ']', '[', '' }, - init = function() - vim.o.timeout = true - vim.o.timeoutlen = 300 - end, - opts = {}, - config = function(_, opts) - local wk = require 'which-key' - wk.setup(opts) - wk.add({ - { 'f', group = 'Files' }, - { 'l', group = 'Lsp', mode = { 'n', 'x' } }, - { 'lr', desc = '[R]ename' }, - { 'la', desc = 'Code [A]ction' }, - { 'lI', desc = '[I]nfo' }, - { 't', group = 'Terminal' }, - { 'g', group = 'Git' }, - { 'o', group = 'Open' }, - { 'n', group = 'Neogen' }, - { 's', group = 'Sessions' }, - { 'r', group = 'Refactor' }, - { 'w', group = 'Window' }, - { 'u', group = 'Ui' }, - { 'z', group = 'Zk(Notes)' }, - { 'b', group = 'Buffers' }, - { 'ba', ':badd', desc = 'Add', silent = false }, - { - 'bc', - function() - close_all(true, true) - end, - desc = 'Close(except current)', - }, - { - 'bC', - function() - close_all(false, true) - end, - desc = 'Close All(yes ALL)', - }, - { 'bD', 'bd', desc = 'Delete' }, - { 'bn', 'bn', desc = 'Next' }, - { 'bp', 'bp', desc = 'Prev' }, - { '1', '1gt', desc = 'Goto tab 1' }, - { '2', '2gt', desc = 'Goto tab 2' }, - { '3', '3gt', desc = 'Goto tab 3' }, - { '4', '4gt', desc = 'Goto tab 4' }, - { '5', '5gt', desc = 'Goto tab 5' }, - { '6', '6gt', desc = 'Goto tab 6' }, - { '7', '7gt', desc = 'Goto tab 7' }, - { '8', '8gt', desc = 'Goto tab 8' }, - { '9', '9gt', desc = 'Goto tab 9' }, - }) - wk.add({ - { ']q', 'cnext', desc = 'Quickfix next' }, - { '[q', 'cprev', desc = 'Quickfix prev' }, - { ']l', 'lnext', desc = 'Local next' }, - { '[l', 'lprev', desc = 'Local prev' }, - { ']b', 'bnext', desc = 'Buffer next' }, - { '[b', 'bprev', desc = 'Buffer prev' }, - }) - end, -} diff --git a/.config/nvim/after/plugin/autocommands.lua b/.config/nvim/lua/user/config/autocmds.lua similarity index 67% rename from .config/nvim/after/plugin/autocommands.lua rename to .config/nvim/lua/user/config/autocmds.lua index 73d1918..42c299b 100644 --- a/.config/nvim/after/plugin/autocommands.lua +++ b/.config/nvim/lua/user/config/autocmds.lua @@ -4,6 +4,7 @@ end local au_buffer = augroup 'buffer' local au_term = augroup 'term' +local au_ft = augroup 'fts' vim.api.nvim_create_autocmd('CmdlineEnter', { group = au_buffer, @@ -16,13 +17,7 @@ vim.api.nvim_create_autocmd('CmdlineLeave', { vim.api.nvim_create_autocmd('TermOpen', { group = au_term, - command = 'startinsert', - pattern = 'term://*', - desc = 'Start with insert mode in terminal', -}) - -vim.api.nvim_create_autocmd('TermOpen', { - group = au_term, + desc = 'set some mappings for terminal', pattern = 'term://*', callback = function() vim.keymap.set('t', '', '', { buffer = true }) @@ -50,7 +45,7 @@ vim.api.nvim_create_autocmd('FileType', { }) vim.api.nvim_create_autocmd('FileType', { - group = au_buffer, + group = au_ft, pattern = 'lazy', callback = function() vim.opt_local.signcolumn = 'no' @@ -60,37 +55,91 @@ vim.api.nvim_create_autocmd('FileType', { }) vim.api.nvim_create_autocmd({ 'FocusGained', 'TermClose', 'TermLeave' }, { - group = augroup 'checktime', + group = au_ft, command = 'checktime', desc = 'Check if the file was changed', }) +vim.api.nvim_create_autocmd({ 'VimResized' }, { + group = au_ft, + desc = 'resize splits if window got resized', + callback = function() + local current_tab = vim.fn.tabpagenr() + vim.cmd 'tabdo wincmd =' + vim.cmd('tabnext ' .. current_tab) + end, +}) + +vim.api.nvim_create_autocmd('BufReadPost', { + group = au_buffer, + desc = 'go to last loc when opening a buffer', + callback = function(event) + local exclude = { 'gitcommit' } + local buf = event.buf + if vim.tbl_contains(exclude, vim.bo[buf].filetype) or vim.b[buf].lazyvim_last_loc then + return + end + vim.b[buf].lazyvim_last_loc = true + local mark = vim.api.nvim_buf_get_mark(buf, '"') + local lcount = vim.api.nvim_buf_line_count(buf) + if mark[1] > 0 and mark[1] <= lcount then + pcall(vim.api.nvim_win_set_cursor, 0, mark) + end + end, +}) + vim.api.nvim_create_autocmd('TextYankPost', { - group = augroup 'highlight_yank', + group = au_buffer, callback = function() - vim.highlight.on_yank() + vim.highlight.on_yank({ higroup = 'Visual', timeout = 80 }) end, desc = 'Highlight on yank', }) vim.api.nvim_create_autocmd('FileType', { group = au_buffer, + desc = 'close some filetypes with ', pattern = { - 'qf', + 'PlenaryTestPopup', + 'checkhealth', + 'dbout', + 'gitsigns-blame', + 'grug-far', 'help', - 'man', - 'notify', 'lspinfo', + 'neotest-output', + 'neotest-output-panel', + 'neotest-summary', + 'notify', + 'qf', 'spectre_panel', 'startuptime', 'tsplayground', - 'PlenaryTestPopup', }, callback = function(event) vim.bo[event.buf].buflisted = false - vim.keymap.set('n', 'q', 'close', { buffer = event.buf, silent = true }) + vim.schedule(function() + vim.keymap.set('n', 'q', function() + vim.cmd 'close' + pcall(vim.api.nvim_buf_delete, event.buf, { force = true }) + end, { + buffer = event.buf, + silent = true, + desc = 'Quit buffer', + }) + end) + end, +}) + +vim.api.nvim_create_autocmd('FileType', { + group = au_ft, + desc = 'make it easier to close man-files when opened inline', + pattern = { 'man' }, + callback = function(event) + vim.bo[event.buf].buflisted = false end, }) + vim.api.nvim_create_autocmd('FileType', { group = augroup 'webdev', desc = 'Some extra settings', @@ -148,7 +197,7 @@ vim.api.nvim_create_autocmd('FileType', { }) vim.api.nvim_create_autocmd('FileType', { - group = au_buffer, + group = au_ft, desc = 'Fix Comment Continuation', callback = function() vim.opt_local.formatoptions = 'jcrqlnt' @@ -156,67 +205,27 @@ vim.api.nvim_create_autocmd('FileType', { }) vim.api.nvim_create_autocmd('FileType', { - group = augroup 'wrap_spell', + group = au_ft, desc = 'wrap and check for spell in text filetypes', - pattern = { 'gitcommit', 'markdown' }, + pattern = { 'text', 'plaintex', 'typst', 'gitcommit', 'markdown' }, callback = function() vim.opt_local.wrap = true vim.opt_local.spell = true end, }) -local function is_valid(bufnr) - if not bufnr then - bufnr = 0 - end - return vim.api.nvim_buf_is_valid(bufnr) and vim.bo[bufnr].buflisted -end - -vim.api.nvim_create_autocmd({ 'BufAdd', 'BufEnter', 'TabNewEntered' }, { - desc = 'Update buffers when adding new buffers', - group = au_buffer, - callback = function(args) - vim.opt_local.formatoptions = 'jcrqlnt' - if not vim.t.bufs then - vim.t['bufs'] = {} - end - if not is_valid(args.buf) then - return - end - local bufs = vim.t['bufs'] - if not vim.tbl_contains(bufs, args.buf) then - table.insert(bufs, args.buf) - vim.t['bufs'] = bufs - end - vim.t['bufs'] = vim.tbl_filter(is_valid, vim.t.bufs) - end, -}) - -vim.api.nvim_create_autocmd({ 'BufDelete', 'TermClose' }, { - desc = 'Update buffers when deleting buffers', - group = au_buffer, - callback = function(args) - for _, tab in ipairs(vim.api.nvim_list_tabpages()) do - local bufs = vim.t[tab].bufs - if bufs then - for i, bufnr in ipairs(bufs) do - if bufnr == args.buf then - -- removed = true - table.remove(bufs, i) - vim.t[tab].bufs = bufs - break - end - end - end - end - vim.t['bufs'] = vim.tbl_filter(is_valid, vim.t['bufs']) - vim.cmd.redrawtabline() +vim.api.nvim_create_autocmd({ 'FileType' }, { + group = au_ft, + desc = 'Fix conceallevel for json files', + pattern = { 'json', 'jsonc', 'json5' }, + callback = function() + vim.opt_local.conceallevel = 0 end, }) vim.api.nvim_create_autocmd('FileType', { pattern = 'hyprlang', - group = au_buffer, + group = au_ft, callback = function(event) local bufnr = event.buf vim.bo[bufnr].commentstring = '# %s' @@ -243,6 +252,9 @@ vim.filetype.add({ ['*.kbd'] = 'lisp', ['.eslintrc'] = 'jsonc', ['tsconfig.*.json'] = 'jsonc', - ['.*/hyprland%.conf'] = 'hyprlang', + ['.*/waybar/config'] = 'jsonc', + ['.*/kitty/.+%.conf'] = 'kitty', + ['.*/hypr/.+%.conf'] = 'hyprlang', }, }) +vim.treesitter.language.register('bash', 'kitty') diff --git a/.config/nvim/lua/user/config/keymaps.lua b/.config/nvim/lua/user/config/keymaps.lua new file mode 100644 index 0000000..cf9bbc4 --- /dev/null +++ b/.config/nvim/lua/user/config/keymaps.lua @@ -0,0 +1,82 @@ +vim.keymap.set('', '0', '^', { noremap = false, silent = true }) +vim.keymap.set('n', ',w', 'w!', { desc = 'Save File' }) +vim.keymap.set('n', ',W', 'noautocmd w!', { desc = 'Save File(without autocmds)' }) +vim.keymap.set('n', '', function() + vim.cmd 'noh' + return '' +end, { expr = true, silent = true, desc = 'Escape and Clear hlsearch' }) + +vim.keymap.set('n', '', 'h') +vim.keymap.set('n', '', 'j') +vim.keymap.set('n', '', 'k') +vim.keymap.set('n', '', 'l') + +-- https://github.com/mhinz/vim-galore#saner-behavior-of-n-and-n +vim.keymap.set('n', 'n', "'Nn'[v:searchforward].'zv'", { expr = true, desc = 'Next Search Result' }) +vim.keymap.set('x', 'n', "'Nn'[v:searchforward]", { expr = true, desc = 'Next Search Result' }) +vim.keymap.set('o', 'n', "'Nn'[v:searchforward]", { expr = true, desc = 'Next Search Result' }) +vim.keymap.set('n', 'N', "'nN'[v:searchforward].'zv'", { expr = true, desc = 'Prev Search Result' }) +vim.keymap.set('x', 'N', "'nN'[v:searchforward]", { expr = true, desc = 'Prev Search Result' }) +vim.keymap.set('o', 'N', "'nN'[v:searchforward]", { expr = true, desc = 'Prev Search Result' }) + +-- Add undo break-points +vim.keymap.set('i', ',', ',u') +vim.keymap.set('i', '.', '.u') +vim.keymap.set('i', ';', ';u') + +-- commenting +vim.keymap.set('n', 'gco', 'oVcxnormal gccfxa', { desc = 'Add Comment Below' }) +vim.keymap.set('n', 'gcO', 'OVcxnormal gccfxa', { desc = 'Add Comment Above' }) + +vim.keymap.set('n', '[q', vim.cmd.cprev, { desc = 'Previous Quickfix' }) +vim.keymap.set('n', ']q', vim.cmd.cnext, { desc = 'Next Quickfix' }) +vim.keymap.set('n', '[l', 'lprev', { desc = 'Prev LocalFix' }) +vim.keymap.set('n', ']l', 'lnext', { desc = 'Next LocalFix' }) +vim.keymap.set('n', '[t', 'tabprev', { desc = 'Prev Tab' }) +vim.keymap.set('n', ']t', 'tabnext', { desc = 'Next Tab' }) +vim.keymap.set('n', '[b', 'bprevious', { desc = 'Prev Buffer' }) +vim.keymap.set('n', ']b', 'bnext', { desc = 'Next Buffer' }) + +-- Pasting in visual mode doesn't copy +vim.keymap.set('x', 'p', [[ 'pgv"'.v:register.'y' ]], { expr = true }) +vim.keymap.set('n', 'dl', '"_dl') +vim.keymap.set({ 'n', 'x' }, 'c', '"_c') +vim.keymap.set('n', 'C', '"_C') + +vim.keymap.set('c', '', '', { silent = false }) +vim.keymap.set('c', '', '', { silent = false }) + +vim.keymap.set( + 'n', + 'e', + ':e =expand("%:p:h") . "/" ', + { silent = false, desc = 'Edit in same dir' } +) +vim.keymap.set( + 'n', + 't', + ':tabe =expand("%:p:h") . "/" ', + { silent = false, desc = 'Edit in same dir(Tab)' } +) +vim.keymap.set( + 'n', + 'v', + ':vsplit =expand("%:p:h") . "/" ', + { silent = false, desc = 'Edit in same dir(Split)' } +) + +vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) +vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) + +for i = 1, 9 do + vim.keymap.set('n', '' .. i, i .. 'gt', { desc = 'Goto tab ' .. i }) +end + +vim.keymap.set('n', 'R', function() + vim.cmd 'source %' + local file = vim.fn.substitute(vim.fn.expand '%:r', 'lua/', '', '') + local ok, mod = pcall(require, file) + if ok and type(mod) ~= 'boolean' and next(mod or {}) ~= nil and mod.config then + mod.config() + end +end, { silent = false, desc = 'Reload module' }) diff --git a/.config/nvim/lua/user/config/options.lua b/.config/nvim/lua/user/config/options.lua new file mode 100644 index 0000000..e5c03d5 --- /dev/null +++ b/.config/nvim/lua/user/config/options.lua @@ -0,0 +1,102 @@ +local opt = vim.opt + +opt.number = true +opt.relativenumber = true +opt.path:append '**' +opt.iskeyword:append '-' -- for css make 'is-active' as one word +opt.cursorline = true -- Enable highlighting of the current line +opt.expandtab = true -- Use spaces instead of tabs +opt.autowrite = true -- Enable auto write +opt.completeopt = 'menu,menuone,noselect' +opt.conceallevel = 2 -- Hide * markup for bold and italic, but not markers with substitutions +opt.fillchars = { + foldopen = '', + foldclose = '', + fold = ' ', + foldsep = ' ', + diff = '╱', + eob = ' ', +} +opt.ignorecase = true -- Ignore case +opt.smartcase = true -- Ignore case +opt.foldlevel = 99 +opt.jumpoptions = 'view' +opt.inccommand = 'nosplit' -- preview incremental substitute +opt.formatoptions = 'jcroqlnt' -- tcqj +opt.laststatus = 3 -- global statusline +opt.linebreak = true -- Wrap lines at convenient points +opt.list = true -- Show some invisible characters (tabs... +opt.mouse = 'a' -- Enable mouse mode +opt.pumblend = 10 -- Popup blend +opt.pumheight = 10 -- Maximum number of entries in a popup +opt.scrolloff = 8 -- Lines of context +opt.shiftround = true -- Round indent +opt.tabstop = 2 +opt.shiftwidth = 0 -- will use the value from `tabstop` +opt.signcolumn = 'yes' -- Always show the signcolumn, otherwise it would shift the text each time +opt.showmode = false -- Dont show mode since we have a statusline +opt.smartindent = true -- Insert indents automatically +opt.splitbelow = true -- Put new windows below current +opt.splitright = true -- Put new windows right of current +opt.splitkeep = 'screen' +opt.termguicolors = true -- True color support +opt.undofile = true +opt.undolevels = 10000 +opt.updatetime = 200 -- Save swap file and trigger CursorHold +opt.timeoutlen = vim.g.vscode and 1000 or 500 -- Lower than default (1000) to quickly trigger which-key +opt.backupdir = { vim.fn.stdpath 'state' .. '/backup//' } +opt.virtualedit = 'block' -- Allow cursor to move where there is no text in visual block mode +opt.exrc = true -- allows to create project specific settings + +opt.wildmode = 'longest:full,full' +opt.wildignorecase = true +opt.wildignore:append({ + '**/node_modules/*', + '**/.git/*', + '**/dist/*', + '**/build/*', + '**/static/*', + '**/.next/*', + '*.o', + '*.out', + '*.obj', + '*.exe', + '*.dll', + '*.jar', + '*.pyc', + '*.rbc', + '*.class', + '*.gif', + '*.ico', + '*.jpg', + '*.jpeg', + '*.png', + '*.mov', + '*.mht', + '*.swp', + '*.zip', + '*.tar.gz', + '*.tar.bz2', +}) + +opt.sessionoptions:append({ + 'globals', +}) +opt.sessionoptions:remove 'folds' + +vim.schedule(function() + opt.shell = '/opt/homebrew/bin/fish' + opt.clipboard = vim.env.SSH_TTY and '' or 'unnamedplus' -- Sync with system clipboard + opt.shortmess:append({ W = true, I = true, c = true, C = true }) + opt.diffopt:append 'linematch:60' + if vim.fn.has 'nvim-0.10' == 1 then + opt.smoothscroll = true + end +end) + +if vim.fn.executable 'rg' == 1 then + opt.grepformat = '%f:%l:%c:%m' + opt.grepprg = 'rg --vimgrep --smart-case' +end + +vim.g['markdown_recommended_style'] = 0 diff --git a/.config/nvim/lua/user/config/util.lua b/.config/nvim/lua/user/config/util.lua new file mode 100644 index 0000000..3d5f982 --- /dev/null +++ b/.config/nvim/lua/user/config/util.lua @@ -0,0 +1,77 @@ +local M = {} + +--- A wrapper around `age.nvim` to get the credentials from the identity file. +---@param secret_file string The secret file to read the credentials from(`secret_file` should be in location `$HOME/.config/age/`). +---@return string|nil secret The credentials from the identity file. +M.get_age_credentials = function(secret_file) + local identity_file = vim.fn.expand '$HOME/.config/age/identity.txt' + + if 0 == vim.fn.filereadable(identity_file) then + return nil + end + + local secret = vim.fn.expand('$HOME/.config/age/' .. secret_file) + return require('age').get(secret, identity_file) +end + +---@param override? lsp.ClientCapabilities +---@return lsp.ClientCapabilities +function M.get_lsp_capabilities(override) + local ok_cmp, cmp_nvim_lsp = pcall(require, 'cmp_nvim_lsp') + local ok_blink, blink = pcall(require, 'blink.cmp') + local capabilities + if ok_cmp then + capabilities = cmp_nvim_lsp.default_capabilities(override or {}) + elseif ok_blink then + capabilities = blink.get_lsp_capabilities(override) + end + return capabilities +end + +---Remove duplicates from table +---@param tbl table +---@return table +function M.dedup(tbl) + local unique = {} + local result = {} + + for _, value in ipairs(tbl) do + if not unique[value] then + table.insert(result, value) + unique[value] = true + end + end + + return result +end + +---A little helper for conform.nvim, to select configure formatters the old way +---[Github Source](https://github.com/stevearc/conform.nvim/blob/master/doc/recipes.md#run-the-first-available-formatter-followed-by-more-formatters) +---Example: +---```lua +---require('conform').setup({ +--- formatters_by_ft = { +--- go = function(bufnr) +--- return { 'goimports', first(bufnr, 'gofumpt', 'gofmt') } +--- end, +--- typescript = function(bufnr) +--- return { first(bufnr, 'prettierd', 'prettier'), 'eslint_d' } +--- end, +--- } +--- }) +---``` +---@param bufnr integer +---@param ... string +---@return string +function M.first_formatter(bufnr, ...) + local conform = require 'conform' + for i = 1, select('#', ...) do + local formatter = select(i, ...) + if conform.get_formatter_info(formatter, bufnr).available then + return formatter + end + end + return select(1, ...) +end + +return M diff --git a/.config/nvim/lua/user/lazy_init.lua b/.config/nvim/lua/user/lazy_init.lua new file mode 100644 index 0000000..2319ff2 --- /dev/null +++ b/.config/nvim/lua/user/lazy_init.lua @@ -0,0 +1,36 @@ +-- Bootstrap lazy.nvim +local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = 'https://github.com/folke/lazy.nvim.git' + local out = vim.fn.system({ 'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { 'Failed to clone lazy.nvim:\n', 'ErrorMsg' }, + { out, 'WarningMsg' }, + { '\nPress any key to exit...' }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) + +-- Setup lazy.nvim +require('lazy').setup({ + spec = { + { import = 'user.plugins' }, + { import = 'user.plugins.lsp' }, + { import = 'user.plugins.mini' }, + }, + install = { colorscheme = { 'habamax' } }, + performance = { + rtp = { + ---@type string[] list any plugins you want to disable here + disabled_plugins = { + 'matchit', + 'netrwPlugin', + 'tutor', + }, + }, + }, +}) diff --git a/.config/nvim/lua/user/plugins/blink-cmp.lua b/.config/nvim/lua/user/plugins/blink-cmp.lua new file mode 100644 index 0000000..f486dfd --- /dev/null +++ b/.config/nvim/lua/user/plugins/blink-cmp.lua @@ -0,0 +1,196 @@ +---@type 'luasnip'|'mini_snippets' +local snippet_preset = 'luasnip' +---@type LazySpec +return { + 'saghen/blink.cmp', + event = 'InsertEnter', + version = '*', + dependencies = { + 'mikavilpas/blink-ripgrep.nvim', + 'kristijanhusak/vim-dadbod-completion', + { + 'folke/lazydev.nvim', + ft = 'lua', -- only load on lua files + dependencies = { 'Bilal2453/luvit-meta' }, + opts = { + library = { + 'lazy.nvim', + -- See the configuration section for more details + -- Load luvit types when the `vim.uv` word is found + { path = '${3rd}/luv/library', words = { 'vim%.uv' } }, + }, + }, + }, + { + 'saghen/blink.compat', + optional = true, -- make optional so it's only enabled if any extras need it + opts = {}, + }, + { + 'L3MON4D3/LuaSnip', + version = 'v2.*', + enabled = true, + build = 'make install_jsregexp', + dependencies = { + { + 'rafamadriz/friendly-snippets', + config = function() + require('luasnip.loaders.from_vscode').lazy_load() + require('luasnip.loaders.from_vscode').lazy_load({ paths = { vim.fn.stdpath 'config' .. '/snippets' } }) + + local extends = { + typescript = { 'tsdoc' }, + javascript = { 'jsdoc' }, + lua = { 'luadoc' }, + python = { 'pydoc' }, + rust = { 'rustdoc' }, + cs = { 'csharpdoc' }, + java = { 'javadoc' }, + c = { 'cdoc' }, + cpp = { 'cppdoc' }, + php = { 'phpdoc' }, + kotlin = { 'kdoc' }, + ruby = { 'rdoc' }, + sh = { 'shelldoc' }, + } + -- friendly-snippets - enable standardized comments snippets + for ft, snips in pairs(extends) do + require('luasnip').filetype_extend(ft, snips) + end + end, + }, + }, + init = function() + snippet_preset = 'mini_snippets' + end, + opts = { history = true, delete_check_events = 'TextChanged' }, + }, + { + 'echasnovski/mini.snippets', + enabled = false, + dependencies = { 'rafamadriz/friendly-snippets' }, + init = function() + snippet_preset = 'mini_snippets' + end, + config = function() + local gen_loader = require('mini.snippets').gen_loader + require('mini.snippets').setup({ + mappings = { expand = '', jump_next = '', jump_prev = '' }, + snippets = { + -- Load snippets based on current language by reading files from + -- "snippets/" subdirectories from 'runtimepath' directories. + gen_loader.from_lang(), + }, + }) + end, + }, + }, + ---@module 'blink.cmp' + ---@type blink.cmp.Config + opts = { + keymap = { + preset = 'enter', + [''] = { 'select_and_accept', 'fallback' }, + [''] = { 'select_prev', 'fallback' }, + [''] = { 'select_next', 'fallback' }, + [''] = { 'select_next', 'snippet_forward', 'fallback' }, + [''] = { 'select_prev', 'snippet_backward', 'fallback' }, + cmdline = { + preset = 'enter', + [''] = {}, + [''] = {}, + [''] = { 'select_prev', 'fallback' }, + [''] = { 'select_next', 'fallback' }, + [''] = { 'select_next', 'fallback' }, + [''] = { 'select_prev', 'fallback' }, + }, + }, + completion = { + accept = { auto_brackets = { enabled = true } }, + menu = { border = 'rounded', draw = { treesitter = { 'lsp' } } }, + documentation = { window = { border = 'rounded' }, auto_show = true, auto_show_delay_ms = 200 }, + list = { + selection = { + preselect = function(ctx) + return ctx.mode ~= 'cmdline' + end, + }, + }, + }, + sources = { + default = { + 'lsp', + 'snippets', + 'path', + 'buffer', + 'ripgrep', + 'lazydev', + 'markdown', + 'dadbod', + }, + providers = { + dadbod = { name = 'Dadbod', module = 'vim_dadbod_completion.blink' }, + ripgrep = { + module = 'blink-ripgrep', + name = 'Ripgrep', + ---@module "blink-ripgrep" + ---@type blink-ripgrep.Options + opts = { + prefix_min_len = 4, + score_offset = 10, -- should be lower priority + max_filesize = '300K', + search_casing = '--smart-case', + }, + }, + lazydev = { + name = 'LazyDev', + module = 'lazydev.integrations.blink', + }, + markdown = { + name = 'RenderMarkdown', + module = 'render-markdown.integ.blink', + fallbacks = { 'lsp' }, + }, + lsp = { + name = 'LSP', + module = 'blink.cmp.sources.lsp', + fallbacks = { 'lazydev' }, + score_offset = 150, -- the higher the number, the higher the priority + -- Filter text items from the LSP provider, since we have the buffer provider for that + transform_items = function(_, items) + for _, item in ipairs(items) do + if item.kind == require('blink.cmp.types').CompletionItemKind.Snippet then + item.score_offset = item.score_offset - 50 + end + end + + return vim.tbl_filter(function(item) + return item.kind ~= require('blink.cmp.types').CompletionItemKind.Text + end, items) + end, + }, + -- snippets = { + -- name = 'Snippets', + -- module = 'blink.cmp.sources.snippets', + -- score_offset = 40, + -- }, + path = { + name = 'Path', + module = 'blink.cmp.sources.path', + score_offset = 25, + opts = { + trailing_slash = false, + label_trailing_slash = true, + }, + }, + buffer = { + name = 'Buffer', + module = 'blink.cmp.sources.buffer', + min_keyword_length = 3, + score_offset = 15, + }, + }, + }, + snippets = { preset = snippet_preset }, + }, +} diff --git a/.config/nvim/lua/plugins/comment.lua b/.config/nvim/lua/user/plugins/comments.lua similarity index 100% rename from .config/nvim/lua/plugins/comment.lua rename to .config/nvim/lua/user/plugins/comments.lua diff --git a/.config/nvim/lua/user/plugins/dadbod-sql.lua b/.config/nvim/lua/user/plugins/dadbod-sql.lua new file mode 100644 index 0000000..4329ad3 --- /dev/null +++ b/.config/nvim/lua/user/plugins/dadbod-sql.lua @@ -0,0 +1,27 @@ +---@type LazySpec +return { + { + 'kristijanhusak/vim-dadbod-ui', + dependencies = { + { 'tpope/vim-dadbod', lazy = true }, + { 'kristijanhusak/vim-dadbod-completion', ft = { 'sql', 'mysql', 'plsql' }, lazy = true }, -- Optional + }, + cmd = { + 'DBUI', + 'DBUIToggle', + 'DBUIAddConnection', + 'DBUIFindBuffer', + }, + init = function() + local data_path = vim.fn.stdpath 'data' + -- Your DBUI configuration + vim.g.db_ui_auto_execute_table_helpers = 1 + vim.g.db_ui_save_location = data_path .. '/dadbod_ui' + vim.g.db_ui_show_database_icon = true + vim.g.db_ui_tmp_query_location = data_path .. '/dadbod_ui/tmp' + vim.g.db_ui_use_nerd_fonts = true + vim.g.db_ui_use_nvim_notify = true + end, + }, + { 'mason.nvim', opts = { ensure_installed = { 'sqlfluff' } } }, +} diff --git a/.config/nvim/lua/plugins/dap.lua b/.config/nvim/lua/user/plugins/debug-dap.lua similarity index 50% rename from .config/nvim/lua/plugins/dap.lua rename to .config/nvim/lua/user/plugins/debug-dap.lua index 190370c..7a7826e 100644 --- a/.config/nvim/lua/plugins/dap.lua +++ b/.config/nvim/lua/user/plugins/debug-dap.lua @@ -1,44 +1,42 @@ +---@param config {type?:string, args?:string[]|fun():string[]?} +local function get_args(config) + local args = type(config.args) == 'function' and (config.args() or {}) or config.args or {} --[[@as string[] | string ]] + local args_str = type(args) == 'table' and table.concat(args, ' ') or args --[[@as string]] + + config = vim.deepcopy(config) + ---@cast args string[] + config.args = function() + local new_args = vim.fn.expand(vim.fn.input('Run with args: ', args_str)) --[[@as string]] + if config.type and config.type == 'java' then + ---@diagnostic disable-next-line: return-type-mismatch + return new_args + end + return require('dap.utils').splitstr(new_args) + end + return config +end + ---@type LazySpec return { 'mfussenegger/nvim-dap', dependencies = { - { - 'theHamsta/nvim-dap-virtual-text', - opts = { virt_text_win_col = 80 }, - }, 'rcarriga/nvim-dap-ui', 'nvim-neotest/nvim-nio', 'Weissle/persistent-breakpoints.nvim', 'leoluz/nvim-dap-go', - -- 'mxsdev/nvim-dap-vscode-js', - -- { - -- 'microsoft/vscode-js-debug', - -- version = false, - -- build = 'npm install --legacy-peer-deps && npx gulp vsDebugServerBundle && mv dist out', - -- }, + -- virtual text for the debugger + { + 'theHamsta/nvim-dap-virtual-text', + opts = {}, + }, }, - keys = function() - local dap, dapui, pb = require 'dap', require 'dapui', require 'persistent-breakpoints.api' +-- stylua: ignore + keys = function () + local dap, dapui, pb = require 'dap', require 'dapui', require 'persistent-breakpoints.api' return { - { 'd', '', desc = '+debug', mode = { 'n', 'v' } }, - { 'dO', dap.step_out, desc = 'Step Out' }, - { 'do', dap.step_over, desc = 'Step Over' }, - { 'di', dap.step_into, desc = 'Step Into' }, - { 'dc', dap.continue, desc = 'Continue' }, - { 'dp', dap.pause, desc = 'Pause' }, - { 'dr', dap.repl.toggle, desc = 'Toggle REPL' }, - { 'ds', dap.session, desc = 'Session' }, - { 'dt', dap.terminate, desc = 'Terminate' }, - { 'dT', pb.clear_all_breakpoints, desc = 'Clear All Breakpoints' }, - { - 'dw', - function() - require('dap.ui.widgets').hover() - end, - desc = 'Widgets', - }, - { 'db', pb.toggle_breakpoint, desc = 'Toggle Breakpoint' }, + -- { "dB", function() dap.set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = "Breakpoint Condition" }, + -- { "db", dap.toggle_breakpoint, desc = "Toggle Breakpoint" }, { 'dB', function() @@ -46,18 +44,34 @@ return { end, desc = 'Breakpoint Condition', }, - + { 'db', pb.toggle_breakpoint, desc = 'Toggle Breakpoint' }, + { 'dT', pb.clear_all_breakpoints, desc = 'Clear All Breakpoints' }, + { "dc", dap.continue, desc = "Run/Continue" }, { 'du', dapui.toggle, desc = 'DapUI' }, { 'de', dapui.eval, desc = 'DapUI Eval', mode = { 'v', 'n' } }, - - { '', dap.continue, desc = 'Continue' }, - { '', dap.step_over, desc = 'Step Over' }, - { '', dap.step_into, desc = 'Step Into' }, - { '', dap.step_over, desc = 'Step Over' }, + { "da", function() dap.continue({ before = get_args }) end, desc = "Run with Args" }, + { "dC", dap.run_to_cursor, desc = "Run to Cursor" }, + { "dg", dap.goto_, desc = "Go to Line (No Execute)" }, + { "di", dap.step_into, desc = "Step Into" }, + { "dj", dap.down, desc = "Down" }, + { "dk", dap.up, desc = "Up" }, + { "dl", dap.run_last, desc = "Run Last" }, + { "do", dap.step_out, desc = "Step Out" }, + { "dO", dap.step_over, desc = "Step Over" }, + { "dP", dap.pause, desc = "Pause" }, + { "dr", dap.repl.toggle, desc = "Toggle REPL" }, + { "ds", dap.session, desc = "Session" }, + { "dt", dap.terminate, desc = "Terminate" }, + { "dw", function () + require('dap.ui.widgets').hover() + end, desc = "Widgets" }, } end, config = function() - local dap, dapui = require 'dap', require 'dapui' + local dap = require 'dap' + local dapui = require 'dapui' + + vim.api.nvim_set_hl(0, 'DapStoppedLine', { default = true, link = 'Visual' }) local dap_icons = { Stopped = { '󰁕 ', 'DiagnosticWarn', 'DapStoppedLine' }, Breakpoint = ' ', @@ -65,8 +79,6 @@ return { BreakpointRejected = { ' ', 'DiagnosticError' }, LogPoint = '.>', } - vim.api.nvim_set_hl(0, 'DapStoppedLine', { default = true, link = 'Visual' }) - for name, sign in pairs(dap_icons) do sign = type(sign) == 'table' and sign or { sign } vim.fn.sign_define( @@ -74,17 +86,24 @@ return { { text = sign[1], texthl = sign[2] or 'DiagnosticInfo', linehl = sign[3], numhl = sign[3] } ) end + require('persistent-breakpoints').setup({ load_breakpoints_event = { 'BufReadPost' }, }) - ---@diagnostic disable-next-line: missing-fields - -- require('dap-vscode-js').setup({ - -- debugger_path = vim.fn.stdpath 'data' .. '/lazy/vscode-js-debug', - -- adapters = { 'pwa-node', 'pwa-chrome', 'pwa-msedge', 'node-terminal', 'pwa-extensionHost' }, -- which adapters to register in nvim-dap - -- }) + + dap.listeners.after.event_initialized['dapui_config'] = function() + dapui.open({}) + end + dap.listeners.before.event_terminated['dapui_config'] = function() + dapui.close({}) + end + dap.listeners.before.event_exited['dapui_config'] = function() + dapui.close({}) + end + dap.adapters.bashdb = { type = 'executable', - command = vim.fn.stdpath 'data' .. '/mason/packages/bash-debug-adapter/bash-debug-adapter', + command = require('mason-registry').get_package('bash-debug-adapter'):get_install_path() .. '/bash-debug-adapter', name = 'bashdb', } dap.adapters.mix_task = { @@ -96,18 +115,20 @@ return { local vscode = require 'dap.ext.vscode' local json = require 'plenary.json' vscode.json_decode = function(str) - return vim.json.decode(json.json_strip_comments(str, { whitespace = true })) + return vim.json.decode(json.json_strip_comments(str)) end + if not dap.adapters['pwa-node'] then require('dap').adapters['pwa-node'] = { type = 'server', host = 'localhost', port = '${port}', executable = { - command = require('mason-registry').get_package('js-debug-adapter'):get_install_path() .. '/js-debug-adapter', + command = 'node', + -- 💀 Make sure to update this path to point to your installation args = { - -- require('mason-registry').get_package('js-debug-adapter'):get_install_path() - -- .. '/js-debug/src/dapDebugServer.js', + require('mason-registry').get_package('js-debug-adapter'):get_install_path() + .. '/js-debug/src/dapDebugServer.js', '${port}', }, }, @@ -152,59 +173,5 @@ return { } end end - - dap.adapters.php = { - type = 'executable', - command = require('mason-registry').get_package('php-debug-adapter'):get_install_path() .. 'php-debug-adapter', - -- command = 'node', - -- args = { require('mason-registry').get_package('php-debug-adapter'):get_install_path() .. '/out/phpDebug.js' } - } - - dap.configurations.php = { - { - type = 'php', - request = 'launch', - name = 'Listen for Xdebug', - port = 9000, - }, - } - - dap.configurations.elixir = { - { - type = 'mix_task', - name = 'mix (Default task)', - request = 'launch', - projectDir = '${workspaceRoot}', - }, - { - type = 'mix_task', - name = 'mix test', - task = 'test', - taskArgs = { '--trace' }, - request = 'launch', - startApps = true, -- for Phoenix projects - projectDir = '${workspaceFolder}', - requireFiles = { - 'test/**/test_helper.exs', - 'test/**/*_test.exs', - }, - }, - } - require('dap-go').setup() - dapui.setup() - require('nvim-dap-virtual-text').setup({}) - - dap.listeners.before.attach.dapui_config = function() - dapui.open() - end - dap.listeners.before.launch.dapui_config = function() - dapui.open() - end - dap.listeners.before.event_terminated.dapui_config = function() - dapui.close() - end - dap.listeners.before.event_exited.dapui_config = function() - dapui.close() - end end, } diff --git a/.config/nvim/lua/plugins/dial.lua b/.config/nvim/lua/user/plugins/dial.lua similarity index 69% rename from .config/nvim/lua/plugins/dial.lua rename to .config/nvim/lua/user/plugins/dial.lua index 3e5029b..d13e04e 100644 --- a/.config/nvim/lua/plugins/dial.lua +++ b/.config/nvim/lua/user/plugins/dial.lua @@ -1,6 +1,3 @@ ----@type table> -local dials_by_ft = {} - ---@param increment boolean ---@param g? boolean local function dial(increment, g) @@ -8,53 +5,23 @@ local function dial(increment, g) -- Use visual commands for VISUAL 'v', VISUAL LINE 'V' and VISUAL BLOCK '\22' local is_visual = mode == 'v' or mode == 'V' or mode == '\22' local func = (increment and 'inc' or 'dec') .. (g and '_g' or '_') .. (is_visual and 'visual' or 'normal') - local group = dials_by_ft[vim.bo.filetype] or 'default' + local group = vim.g.dials_by_ft[vim.bo.filetype] or 'default' return require('dial.map')[func](group) end ---@type LazySpec return { 'monaqa/dial.nvim', - version = '0.4.*', + recommended = true, + desc = 'Increment and decrement numbers, dates, and more', + -- stylua: ignore keys = { - { - '', - function() - return dial(true) - end, - expr = true, - desc = 'Increment', - mode = { 'n', 'v' }, - }, - { - '', - function() - return dial(false) - end, - expr = true, - desc = 'Decrement', - mode = { 'n', 'v' }, - }, - { - 'g', - function() - return dial(true, true) - end, - expr = true, - desc = 'Increment', - mode = { 'n', 'v' }, - }, - { - 'g', - function() - return dial(false, true) - end, - expr = true, - desc = 'Decrement', - mode = { 'n', 'v' }, - }, + { "", function() return dial(true) end, expr = true, desc = "Increment", mode = {"n", "v"} }, + { "", function() return dial(false) end, expr = true, desc = "Decrement", mode = {"n", "v"} }, + { "g", function() return dial(true, true) end, expr = true, desc = "Increment", mode = {"n", "v"} }, + { "g", function() return dial(false, true) end, expr = true, desc = "Decrement", mode = {"n", "v"} }, }, - config = function() + opts = function() local augend = require 'dial.augend' local logical_alias = augend.constant.new({ @@ -127,39 +94,43 @@ return { cyclic = true, }) - local opts = { + return { dials_by_ft = { - lua = 'lua', - json = 'json', - jsonc = 'json', - json5 = 'json', - markdown = 'markdown', - python = 'python', css = 'css', - sass = 'css', - scss = 'css', + vue = 'vue', javascript = 'typescript', - javascriptreact = 'typescript', typescript = 'typescript', typescriptreact = 'typescript', + javascriptreact = 'typescript', + json = 'json', + lua = 'lua', + markdown = 'markdown', + sass = 'css', + scss = 'css', + python = 'python', }, groups = { default = { augend.integer.alias.decimal, -- nonnegative decimal number (0, 1, 2, 3, ...) + augend.integer.alias.decimal_int, -- nonnegative and negative decimal number augend.integer.alias.hex, -- nonnegative hex number (0x01, 0x1a1f, etc.) augend.date.alias['%Y/%m/%d'], -- date (2022/02/19, etc.) - }, - typescript = { - augend.integer.alias.decimal, -- nonnegative and negative decimal number - augend.constant.alias.bool, -- boolean value (true <-> false) - logical_alias, - augend.constant.new({ elements = { 'let', 'const' } }), ordinal_numbers, weekdays, months, + capitalized_boolean, + augend.constant.alias.bool, -- boolean value (true <-> false) + logical_alias, + }, + vue = { + augend.constant.new({ elements = { 'let', 'const' } }), + augend.hexcolor.new({ case = 'lower' }), + augend.hexcolor.new({ case = 'upper' }), + }, + typescript = { + augend.constant.new({ elements = { 'let', 'const' } }), }, css = { - augend.integer.alias.decimal, -- nonnegative and negative decimal number augend.hexcolor.new({ case = 'lower', }), @@ -168,39 +139,39 @@ return { }), }, markdown = { + augend.constant.new({ + elements = { '[ ]', '[x]' }, + word = false, + cyclic = true, + }), augend.misc.alias.markdown_header, - ordinal_numbers, - weekdays, - months, }, json = { - augend.integer.alias.decimal, -- nonnegative and negative decimal number - augend.constant.alias.bool, -- boolean value (true <-> false) augend.semver.alias.semver, -- versioning (v1.1.2) }, lua = { - augend.integer.alias.decimal, -- nonnegative and negative decimal number - augend.constant.alias.bool, augend.constant.new({ elements = { 'and', 'or' }, word = true, -- if false, "sand" is incremented into "sor", "doctor" into "doctand", etc. cyclic = true, -- "or" is incremented into "and". }), - ordinal_numbers, - weekdays, - months, }, python = { - augend.integer.alias.decimal, -- nonnegative and negative decimal number - capitalized_boolean, - logical_alias, - ordinal_numbers, - weekdays, - months, + augend.constant.new({ + elements = { 'and', 'or' }, + }), }, }, } + end, + config = function(_, opts) + -- copy defaults to each group + for name, group in pairs(opts.groups) do + if name ~= 'default' then + vim.list_extend(group, opts.groups.default) + end + end require('dial.config').augends:register_group(opts.groups) - dials_by_ft = opts.dials_by_ft + vim.g.dials_by_ft = opts.dials_by_ft end, } diff --git a/.config/nvim/lua/plugins/ufo.lua b/.config/nvim/lua/user/plugins/folds.lua similarity index 92% rename from .config/nvim/lua/plugins/ufo.lua rename to .config/nvim/lua/user/plugins/folds.lua index 02895a0..9fa6e5a 100644 --- a/.config/nvim/lua/plugins/ufo.lua +++ b/.config/nvim/lua/user/plugins/folds.lua @@ -1,8 +1,8 @@ +---@type LazySpec return { 'kevinhwang91/nvim-ufo', dependencies = 'kevinhwang91/promise-async', event = 'BufRead', - keys = function() local ufo = require 'ufo' return { @@ -10,7 +10,8 @@ return { { 'zM', ufo.closeAllFolds, desc = 'Close Folds' }, } end, - config = function() + opts = {}, + init = function() local filetype_exclude = { 'help', 'alpha', 'dashboard', 'neo-tree', 'Trouble', 'lazy', 'mason' } vim.api.nvim_create_autocmd('FileType', { group = vim.api.nvim_create_augroup('local_detach_ufo', { clear = true }), @@ -20,6 +21,5 @@ return { require('ufo').detach() end, }) - require('ufo').setup({}) end, } diff --git a/.config/nvim/lua/user/plugins/formatting.lua b/.config/nvim/lua/user/plugins/formatting.lua new file mode 100644 index 0000000..602af4a --- /dev/null +++ b/.config/nvim/lua/user/plugins/formatting.lua @@ -0,0 +1,102 @@ +local prettier = { 'prettierd', 'prettier', stop_after_first = true } +local function prettier_eslint(bufnr) + return { require('user.config.util').first_formatter(bufnr, 'prettierd', 'prettier'), 'eslint_d' } +end +---@type LazySpec +return { + 'stevearc/conform.nvim', + dependencies = { 'mason.nvim' }, + cmd = 'ConformInfo', + keys = { + { + '=', + function() + require('conform').format({ async = true }) + end, + mode = { 'n', 'v' }, + desc = 'Format Injected Langs', + }, + }, + opts_extend = { 'formatters_by_ft' }, + -- This will provide type hinting with LuaLS + ---@module "conform" + ---@type conform.setupOpts + opts = { + default_format_opts = { + timeout_ms = 3000, + async = false, -- not recommended to change + quiet = false, -- not recommended to change + lsp_format = 'fallback', -- not recommended to change + }, + formatters_by_ft = { + lua = { 'stylua' }, + fish = { 'fish_indent' }, + sh = { 'shfmt' }, + bash = { 'shfmt' }, + astro = prettier_eslint, + javascript = prettier_eslint, + javascriptreact = prettier_eslint, + typescript = prettier_eslint, + typescriptreact = prettier_eslint, + svelte = prettier_eslint, + vue = prettier_eslint, + jsonc = prettier, + json = prettier, + json5 = prettier, + css = prettier, + html = prettier, + less = prettier, + markdown = prettier, + sass = prettier, + scss = prettier, + sql = { 'sqlfluff' }, + go = function(bufnr) + return { 'goimports', require('user.config.util').first_formatter(bufnr, 'gofumpt', 'gofmt') } + end, + python = function(bufnr) + if require('conform').get_formatter_info('ruff_format', bufnr).available then + return { 'ruff_format', 'ruff_fix', 'ruff_organize_imports' } + else + return { 'isort', 'black' } + end + end, + -- ['_'] = { 'trim_whitespace', 'trim_newlines' }, + }, + -- formatters = { + -- sqlfluff = { args = { 'format', '--dialect=ansi', '-' } }, + -- }, + -- Set up format-on-save + -- format_on_save = { timeout_ms = 500, lsp_fallback = true }, + format_on_save = function(bufnr) + -- Disable autoformat for files in a certain path + local bufname = vim.api.nvim_buf_get_name(bufnr) + if bufname:match '/node_modules/' then + return + end + -- Disable with a global or buffer-local variable + if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then + return + end + return { timeout_ms = 300, lsp_format = 'fallback' } + end, + }, + config = function(_, opts) + -- If you want the formatexpr, here is the place to set it + vim.o.formatexpr = "v:lua.require'conform'.formatexpr()" + vim.env.ESLINT_D_PPID = vim.fn.getpid() + require('conform').setup(opts) + + vim.api.nvim_create_user_command('FormatDisable', function(args) + if args.bang then + -- FormatDisable! will disable formatting just for this buffer + vim.b.disable_autoformat = true + else + vim.g.disable_autoformat = true + end + end, { desc = 'Disable autoformat-on-save', bang = true }) + vim.api.nvim_create_user_command('FormatEnable', function() + vim.b.disable_autoformat = false + vim.g.disable_autoformat = false + end, { desc = 'Re-enable autoformat-on-save' }) + end, +} diff --git a/.config/nvim-astro/lua/plugins/git-conflicts.lua b/.config/nvim/lua/user/plugins/git-conflicts.lua similarity index 100% rename from .config/nvim-astro/lua/plugins/git-conflicts.lua rename to .config/nvim/lua/user/plugins/git-conflicts.lua diff --git a/.config/nvim/lua/plugins/gitsigns.lua b/.config/nvim/lua/user/plugins/git-signs.lua similarity index 74% rename from .config/nvim/lua/plugins/gitsigns.lua rename to .config/nvim/lua/user/plugins/git-signs.lua index 8f86a5f..320486e 100644 --- a/.config/nvim/lua/plugins/gitsigns.lua +++ b/.config/nvim/lua/user/plugins/git-signs.lua @@ -1,3 +1,4 @@ +---@type LazySpec return { 'lewis6991/gitsigns.nvim', event = 'BufRead', @@ -32,27 +33,18 @@ return { return '' end, { expr = true, desc = 'Prev Hunk' }) - -- Actions - map('n', 'gs', gs.stage_hunk, { desc = 'Stage Hunk' }) map('n', 'gr', gs.reset_hunk, { desc = 'Reset Hunk' }) - map('v', 'gs', function() - gs.stage_hunk({ vim.fn.line '.', vim.fn.line 'v' }) - end, { desc = 'Stage Hunk' }) map('v', 'gr', function() gs.reset_hunk({ vim.fn.line '.', vim.fn.line 'v' }) end, { desc = 'Reset Hunk' }) - -- map("n", "hS", gs.stage_buffer) - -- map("n", "gu", gs.undo_stage_hunk) + map('n', 'gS', gs.stage_hunk, { desc = 'Stage Hunk' }) + map('v', 'gS', function() + gs.stage_hunk({ vim.fn.line '.', vim.fn.line 'v' }) + end, { desc = 'Stage Hunk' }) map('n', 'gR', gs.reset_buffer, { desc = 'Reset Buffer' }) map('n', 'gp', gs.preview_hunk, { desc = 'Preview Hunk' }) - map('n', 'gl', gs.blame_line, { desc = 'Blame' }) - map('n', 'gL', function() - gs.blame_line({ full = true }) - end, { desc = 'Blame(full)' }) + map('n', 'gL', gs.blame_line, { desc = 'Blame' }) map('n', 'gd', gs.diffthis, { desc = 'Diffthis' }) - map('n', 'gD', function() - gs.diffthis '~' - end, { desc = 'Diff Full' }) -- Text object map({ 'o', 'x' }, 'ih', ':Gitsigns select_hunk', { desc = 'Inside hunk' }) diff --git a/.config/nvim/lua/plugins/grapple.lua b/.config/nvim/lua/user/plugins/grapple.lua similarity index 88% rename from .config/nvim/lua/plugins/grapple.lua rename to .config/nvim/lua/user/plugins/grapple.lua index bc315d3..a70ec7d 100644 --- a/.config/nvim/lua/plugins/grapple.lua +++ b/.config/nvim/lua/user/plugins/grapple.lua @@ -1,9 +1,5 @@ return { 'cbochs/grapple.nvim', - enabled = true, - dependencies = { - 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended - }, cmd = 'Grapple', opts = { --- @type "git_branch"|"git"|"cwd"|"global"|"static"|"lsp" diff --git a/.config/nvim/lua/plugins/gx-nvim.lua b/.config/nvim/lua/user/plugins/gx-nvim.lua similarity index 100% rename from .config/nvim/lua/plugins/gx-nvim.lua rename to .config/nvim/lua/user/plugins/gx-nvim.lua diff --git a/.config/nvim/lua/plugins/heirline.lua b/.config/nvim/lua/user/plugins/heirline.lua similarity index 70% rename from .config/nvim/lua/plugins/heirline.lua rename to .config/nvim/lua/user/plugins/heirline.lua index 12effc3..d549bb2 100644 --- a/.config/nvim/lua/plugins/heirline.lua +++ b/.config/nvim/lua/user/plugins/heirline.lua @@ -2,10 +2,11 @@ ---@type LazySpec return { 'rebelot/heirline.nvim', - enabled = true, event = 'VeryLazy', - dependencies = { 'nvim-tree/nvim-web-devicons', 'Zeioth/heirline-components.nvim' }, + dependencies = { 'Zeioth/heirline-components.nvim' }, config = function() + vim.opt.showtabline = 2 + local heirline = require 'heirline' local lib = require 'heirline-components.all' local hl = require 'heirline-components.core.hl' @@ -18,22 +19,6 @@ return { self.filename = vim.api.nvim_buf_get_name(0) end, } - -- We can now define some children separately and add them later - - local FileIcon = { - init = function(self) - local filename = self.filename - local extension = vim.fn.fnamemodify(filename, ':e') - self.icon, self.icon_color = - require('nvim-web-devicons').get_icon_color(filename, extension, { default = true }) - end, - provider = function(self) - return self.icon and (self.icon .. ' ') - end, - hl = function(self) - return { fg = self.icon_color } - end, - } local FileName = { provider = function(self) @@ -139,10 +124,6 @@ return { init = function(self) self.bufnr = vim.api.nvim_get_current_buf() end, - -- Regular winbar - -- lib.component.neotree(), - -- lib.component.compiler_play(), - -- lib.component.fill(), { hl = hl.get_attributes('winbar', true), condition = function() @@ -153,26 +134,67 @@ return { end, update = 'CursorMoved', }, - -- lib.component.fill(), - -- lib.component.compiler_redo(), - -- lib.component.aerial(), }, - -- statuscolumn = { -- UI left column - -- init = function(self) - -- self.bufnr = vim.api.nvim_get_current_buf() - -- end, - -- lib.component.foldcolumn(), - -- lib.component.numbercolumn(), - -- lib.component.signcolumn(), - -- } or nil, statusline = { -- UI statusbar hl = { fg = 'fg', bg = 'bg' }, lib.component.mode(), - lib.component.git_branch(), + lib.component.git_branch({ + on_click = { + name = 'heirline_branch', + callback = function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + if ok_telescope then + builtin.git_branches({ use_file_path = true }) + elseif ok_fzf then + fzf.git_branches() + elseif ok_snacks then + picker.git_branches() + end + end, + }, + }), FileNameBlock, lib.component.file_info(), - lib.component.git_diff(), - lib.component.diagnostics(), + lib.component.git_diff({ + on_click = { + name = 'heirline_git', + callback = function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + if ok_telescope then + builtin.git_status({ use_file_path = true }) + elseif ok_fzf then + fzf.git_status() + elseif ok_snacks then + picker.git_status() + end + end, + }, + }), + lib.component.diagnostics({ + on_click = { + name = 'heirline_diagnostic', + callback = function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.diagnostics() + elseif ok_fzf then + fzf.diagnostics() + elseif ok_telescope then + builtin.diagnostics() + elseif ok_mini then + mini_pick.pickers.diagnostic() + end + end, + }, + }), lib.component.fill(), lib.component.fill(), lib.component.lsp(), diff --git a/.config/nvim/lua/plugins/lsp/go.lua b/.config/nvim/lua/user/plugins/lsp/golang.lua similarity index 76% rename from .config/nvim/lua/plugins/lsp/go.lua rename to .config/nvim/lua/user/plugins/lsp/golang.lua index eddad3c..46b7fde 100644 --- a/.config/nvim/lua/plugins/lsp/go.lua +++ b/.config/nvim/lua/user/plugins/lsp/golang.lua @@ -1,31 +1,8 @@ ---@type LazySpec return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'gopls', - 'goimports', - 'golangci-lint', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'go', - 'gomod', - 'gosum', - 'gotmpl', - 'gowork', - }) - return opts - end, - }, { 'AstroNvim/astrolsp', + ---@type AstroLSPConfig opts = { config = { gopls = { @@ -78,4 +55,16 @@ return { }, }, }, + { 'nvim-treesitter', opts = { ensure_installed = { 'go', 'gowork', 'gomod', 'gosum', 'gotmpl' } } }, + { + 'mason.nvim', + opts = { + ensure_installed = { 'delve', 'gopls', 'golangci-lint', 'goimports', 'gofumpt' }, + }, + }, + { 'nvim-lint', opts = { + linters_by_ft = { + go = { 'golangcilint' }, + }, + } }, } diff --git a/.config/nvim/lua/plugins/lsp/htmlcss.lua b/.config/nvim/lua/user/plugins/lsp/htmlcss.lua similarity index 78% rename from .config/nvim/lua/plugins/lsp/htmlcss.lua rename to .config/nvim/lua/user/plugins/lsp/htmlcss.lua index 3574812..d9f237c 100644 --- a/.config/nvim/lua/plugins/lsp/htmlcss.lua +++ b/.config/nvim/lua/user/plugins/lsp/htmlcss.lua @@ -1,42 +1,10 @@ ---@type LazySpec return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'cspell', - 'html-lsp', - 'stylelint', - 'css-lsp', - 'css-variables-language-server', - 'cssmodules-language-server', - 'prettierd', - 'emmet-language-server', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'html', - 'css', - 'scss', - 'robot', - 'http', - 'regex', - }) - return opts - end, - }, { 'AstroNvim/astrolsp', - opts = function(_, opts) - opts.config = vim.tbl_extend('force', opts.config or {}, { - html = {}, - css_variables = {}, - cssmodules_ls = {}, + ---@type AstroLSPConfig + opts = { + config = { cssls = { settings = { css = { @@ -109,8 +77,40 @@ return { end, { buffer = bufnr, desc = 'Emmet Expand', noremap = true }) end, }, - }) - return opts - end, + }, + }, + }, + { + 'nvim-treesitter', + opts = { + ensure_installed = { 'html', 'css', 'scss' }, + }, + }, + { + 'mason.nvim', + opts = { + ensure_installed = { + 'html-lsp', + 'htmlhint', + 'stylelint', + 'css-lsp', + 'css-variables-language-server', + 'cssmodules-language-server', + 'prettierd', + 'emmet-language-server', + }, + }, + }, + { + 'nvim-lint', + opts = { + linters_by_ft = { + html = { 'htmlhint' }, + css = { 'stylelint' }, + scss = { 'stylelint' }, + sass = { 'stylelint' }, + less = { 'stylelint' }, + }, + }, }, } diff --git a/.config/nvim/lua/user/plugins/lsp/init.lua b/.config/nvim/lua/user/plugins/lsp/init.lua new file mode 100644 index 0000000..fd1f8ea --- /dev/null +++ b/.config/nvim/lua/user/plugins/lsp/init.lua @@ -0,0 +1,477 @@ +---@type LazySpec +return { + { + 'neovim/nvim-lspconfig', + event = { 'BufWinEnter' }, + dependencies = { + 'SmiteshP/nvim-navic', + { + 'AstroNvim/astrolsp', + ---@type AstroLSPConfig + opts = { + -- Configuration table of features provided by AstroLSP + features = { + codelens = true, -- enable/disable codelens refresh on start + inlay_hints = true, -- enable/disable inlay hints on start + semantic_tokens = true, -- enable/disable semantic token highlighting + }, + -- Configure buffer local auto commands to add when attaching a language server + autocmds = { + lsp_document_highlight = { + cond = 'textDocument/documentHighlight', + { + event = { 'CursorHold', 'CursorHoldI' }, + desc = 'Document Highlighting', + callback = function() + vim.lsp.buf.document_highlight() + end, + }, + { + event = { 'CursorMoved', 'CursorMovedI', 'BufLeave' }, + desc = 'Document Highlighting Clear', + callback = function() + vim.lsp.buf.clear_references() + end, + }, + }, + }, + commands = { + -- Format = { + -- function() vim.lsp.buf.format() end, + -- -- condition to create the user command + -- -- can either be a string of a client capability or a function of `fun(client, bufnr): boolean` + -- cond = "textDocument/formatting", + -- -- the rest of the user command options (:h nvim_create_user_command) + -- desc = "Format file with LSP", + -- }, + ImportsOrganize = { + function() + vim.lsp.buf.code_action({ context = { only = { 'source.organizeImports' } }, apply = true }) + end, + cond = 'textDocument/codeAction', + desc = 'Organize Imports', + }, + ImportsRemove = { + function() + vim.lsp.buf.code_action({ context = { only = { 'source.removeUnused' } }, apply = true }) + end, + cond = 'textDocument/codeAction', + desc = 'Remove Unused Imports', + }, + FixAll = { + function() + vim.lsp.buf.code_action({ context = { only = { 'source.fixAll' } }, apply = true }) + end, + cond = 'textDocument/codeAction', + desc = 'Fix All fixable diagnostics', + }, + }, + capabilities = { + textDocument = { foldingRange = { dynamicRegistration = false } }, + workspace = { fileOperations = { didRename = true, willRename = true } }, + }, + mappings = { + n = { + gl = { + function() + vim.diagnostic.open_float() + end, + desc = 'Hover diagnostics', + }, + ['le'] = { vim.diagnostic.open_float, desc = 'Hover diagnostics' }, + ['ld'] = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.diagnostics() + elseif ok_fzf then + fzf.diagnostics() + elseif ok_telescope then + builtin.diagnostics() + elseif ok_mini then + mini_pick.pickers.diagnostic() + end + end, + desc = 'Diagnostics', + }, + gd = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_definitions() + elseif ok_fzf then + fzf.lsp_definitions({ + jump_to_single_result = true, + winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, + }) + elseif ok_telescope then + builtin.lsp_definitions() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'definition' }) + else + vim.lsp.buf.definiton() + end + end, + desc = 'Goto definition', + cond = 'textDocument/definition', + }, + ['lD'] = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_definitions() + elseif ok_fzf then + fzf.lsp_definitions({ + jump_to_single_result = true, + winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, + }) + elseif ok_telescope then + builtin.lsp_definitions() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'definition' }) + else + vim.lsp.buf.definiton() + end + end, + desc = 'Goto definition', + cond = 'textDocument/definition', + }, + gD = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_declarations() + elseif ok_fzf then + fzf.lsp_declarations({ + jump_to_single_result = true, + winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, + }) + elseif ok_telescope then + builtin.lsp_declarations() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'declaration' }) + else + vim.lsp.buf.declaration() + end + end, + desc = 'Declaration of current symbol', + cond = 'textDocument/declaration', + }, + ['lf'] = { + function() + vim.lsp.buf.code_action({ context = { only = { 'source.fixAll' } }, apply = true }) + end, + desc = 'Fix All', + cond = 'textDocument/codeAction', + }, + ['lo'] = { + function() + vim.lsp.buf.code_action({ context = { only = { 'source.organizeImports' } }, apply = true }) + vim.lsp.buf.code_action({ context = { only = { 'source.removeUnused' } }, apply = true }) + end, + desc = 'Oraganize imports', + cond = 'textDocument/codeAction', + }, + ['li'] = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_implementations() + elseif ok_fzf then + fzf.lsp_implementations({ winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } } }) + elseif ok_telescope then + builtin.lsp_implementations() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'implementation' }) + else + vim.lsp.buf.implementation() + end + end, + desc = 'Goto implementation', + cond = 'textDocument/implementation', + }, + ['lt'] = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_type_definitions() + elseif ok_fzf then + fzf.lsp_type_definitions({ + jump_to_single_result = true, + winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, + }) + elseif ok_telescope then + builtin.lsp_type_definitions() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'type_definition' }) + else + vim.lsp.buf.type_definition() + end + end, + desc = 'Type definition', + cond = 'textDocument/typeDefinition', + }, + ['F'] = { + function() + vim.cmd [[EslintFixAll]] + end, + cond = function(client) + return client.name == 'eslint' + end, + }, + gr = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_references() + elseif ok_fzf then + fzf.lsp_references({ + jump_to_single_result = true, + winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, + }) + elseif ok_telescope then + builtin.lsp_references() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'references' }) + else + vim.lsp.buf.references() + end + end, + desc = 'Goto references', + cond = 'textDocument/references', + }, + ['lR'] = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_references() + elseif ok_fzf then + fzf.lsp_references({ + jump_to_single_result = true, + winopts = { preview = { layout = 'vertical', vertical = 'up:60%' } }, + }) + elseif ok_telescope then + builtin.lsp_references() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'references' }) + else + vim.lsp.buf.references() + end + end, + desc = 'Goto references', + cond = 'textDocument/references', + }, + [']e'] = { + function() + vim.diagnostic.goto_next({ severity = vim.diagnostic.severity.ERROR }) + end, + desc = 'Goto Next Error', + }, + ['[e'] = { + function() + vim.diagnostic.goto_prev({ severity = vim.diagnostic.severity.ERROR }) + end, + desc = 'Goto Next Error', + }, + [']d'] = { vim.diagnostic.goto_next, desc = 'Goto Next diagnostic' }, + ['[d'] = { vim.diagnostic.goto_prev, desc = 'Goto Next diagnostic' }, + ['lw'] = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_symbols() + elseif ok_fzf then + fzf.lsp_document_symbols() + elseif ok_telescope then + builtin.lsp_document_symbols() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'document_symbol' }) + else + vim.lsp.buf.document_symbol() + end + end, + desc = 'Document symbols', + cond = 'textDocument/documentSymbol', + }, + ['lW'] = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + local ok_telescope, builtin = pcall(require, 'telescope.builtin') + local ok_snacks, picker = pcall(require, 'snacks.picker') + local ok_mini, mini_pick = pcall(require, 'mini.pick') + + if ok_snacks then + picker.lsp_workspace_symbols() + elseif ok_fzf then + fzf.lsp_workspace_symbols() + elseif ok_telescope then + builtin.lsp_dynamic_workspace_symbols() + elseif ok_mini then + mini_pick.pickers.lsp({ scope = 'workspace_symbol' }) + else + vim.lsp.buf.workspace_symbol() + end + end, + desc = 'Workspace symbols', + cond = 'workspace/symbol', + }, + ['lr'] = { vim.lsp.buf.rename, desc = 'Rename', cond = 'textDocument/rename' }, + ['la'] = { + function() + local ok_fzf, fzf = pcall(require, 'fzf-lua') + if ok_fzf then + fzf.lsp_code_actions() + else + vim.lsp.buf.code_action() + end + end, + desc = 'Code actions', + cond = 'textDocument/codeAction', + }, + ['lI'] = { + function() + vim.cmd 'LspInfo' + end, + desc = 'LspInfo', + }, + ['uY'] = { + function() + require('astrolsp.toggles').buffer_semantic_tokens() + end, + desc = 'Toggle LSP semantic highlight (buffer)', + cond = function(client, bufnr) + return client.server_capabilities.semanticTokensProvider and vim.lsp.semantic_tokens + end, + }, + ['uI'] = { + function() + require('astrolsp.toggles').buffer_inlay_hints() + end, + desc = 'Toggle LSP inlay highlight (buffer)', + cond = function(client) + return client.server_capabilities.inlayHintProvider and vim.lsp.inlay_hint + end, + }, + }, + i = { + [''] = { vim.lsp.buf.signature_help, desc = 'Signature help', cond = 'textDocument/signatureHelp' }, + }, + x = { + ['la'] = { + function() + local ok, fzf = pcall(require, 'fzf-lua') + if not ok then + vim.lsp.buf.code_action() + else + fzf.lsp_code_actions() + end + end, + desc = 'Code actions', + cond = 'textDocument/codeAction', + }, + }, + }, + handlers = { + function(server, opts) + opts.capabilities = require('user.config.util').get_lsp_capabilities(opts.capabilities) + require('lspconfig')[server].setup(opts) + end, + efm = false, + }, + on_attach = function(client, bufnr) + local ok_navic, navic = pcall(require, 'nvim-navic') + if ok_navic and client.supports_method 'textDocument/documentSymbol' then + navic.attach(client, bufnr) + end + end, + }, + }, + 'mason.nvim', + { + 'williamboman/mason-lspconfig.nvim', -- MUST be set up before `nvim-lspconfig` + opts = function() + return { + handlers = { + function(server) + require('astrolsp').lsp_setup(server) + end, + }, + } + end, + }, + }, + }, + { + 'williamboman/mason.nvim', + cmd = 'Mason', + build = ':MasonUpdate', + opts_extend = { 'ensure_installed' }, + opts = { + ---@type '"prepend"' | '"append"' | '"skip"' + PATH = 'append', + ui = { icons = { package_installed = '✓', package_uninstalled = '✗', package_pending = '⟳' } }, + ensure_installed = { 'stylua', 'shfmt' }, + }, + ---@param opts MasonSettings | {ensure_installed: string[]} + config = function(_, opts) + local diags = { Error = '', Warn = '', Info = '', Hint = '' } + for sign, icon in pairs(diags) do + vim.fn.sign_define('DiagnosticSign' .. sign, { text = icon, texthl = 'DiagnosticSign' .. sign }) + end + + require('mason').setup(opts) + local mr = require 'mason-registry' + mr:on('package:install:success', function() + vim.defer_fn(function() + -- trigger FileType event to possibly load this newly installed LSP server + require('lazy.core.handler.event').trigger({ event = 'FileType', buf = vim.api.nvim_get_current_buf() }) + end, 100) + end) + + mr.refresh(function() + for _, tool in ipairs(opts.ensure_installed) do + local p = mr.get_package(tool) + if not p:is_installed() then + p:install() + end + end + end) + end, + }, +} diff --git a/.config/nvim/lua/user/plugins/lsp/json.lua b/.config/nvim/lua/user/plugins/lsp/json.lua new file mode 100644 index 0000000..357b76b --- /dev/null +++ b/.config/nvim/lua/user/plugins/lsp/json.lua @@ -0,0 +1,29 @@ +---@type LazySpec +return { + { + 'AstroNvim/astrolsp', + opts = { + handlers = { + jsonls = function(server, opts) + opts.capabilities = require('user.config.util').get_lsp_capabilities(opts.capabilities) + opts.on_new_config = function(new_config) + new_config.settings.json.schemas = new_config.settings.json.schemas or {} + vim.list_extend(new_config.settings.json.schemas, require('schemastore').json.schemas()) + end + opts.settings = { json = { validate = { enable = true }, format = { enable = false } } } + require('lspconfig')[server].setup(opts) + end, + }, + }, + }, + { 'b0o/schemastore.nvim', lazy = true, version = false }, + { 'nvim-treesitter', opts = { ensure_installed = { 'json', 'jsonc', 'json5' } } }, + { 'mason.nvim', opts = { ensure_installed = { 'json-lsp', 'yamllint' } } }, + { 'nvim-lint', opts = { linters_by_ft = { yaml = { 'yamllint' } } } }, + { + 'vuki656/package-info.nvim', + dependencies = { 'MunifTanjim/nui.nvim' }, + opts = {}, + event = 'BufRead package.json', + }, +} diff --git a/.config/nvim/lua/user/plugins/lsp/lua_ls.lua b/.config/nvim/lua/user/plugins/lsp/lua_ls.lua new file mode 100644 index 0000000..9f3ce4b --- /dev/null +++ b/.config/nvim/lua/user/plugins/lsp/lua_ls.lua @@ -0,0 +1,54 @@ +---@type LazySpec +return { + { + 'AstroNvim/astrolsp', + ---@type AstroLSPConfig + opts = { + -- Configure language servers for `lspconfig` (`:h lspconfig-setup`) + config = { + lua_ls = { + settings = { + Lua = { + format = { + enable = true, + }, + diagnostics = { + enable = true, + globals = { 'vim', 'describe', 'Snacks' }, + disable = { 'lowercase-global' }, + }, + workspace = { + checkThirdParty = false, + library = { vim.env.VIMRUNTIME }, + }, + telemetry = { enable = false }, + codeLens = { enable = true }, + completion = { callSnippet = 'Replace' }, + doc = { privateName = { '^_' } }, + hint = { + enable = true, + setType = false, + paramType = true, + paramName = 'Disable', + semicolon = 'Disable', + arrayIndex = 'Disable', + }, + }, + }, + }, + }, + }, + }, + { + 'nvim-treesitter', + opts = { + ensure_installed = { 'lua', 'luadoc' }, + }, + }, + { + 'mason.nvim', + opts = { + ensure_installed = { 'lua-language-server' }, + }, + }, +} diff --git a/.config/nvim/lua/user/plugins/lsp/prisma.lua b/.config/nvim/lua/user/plugins/lsp/prisma.lua new file mode 100644 index 0000000..5958981 --- /dev/null +++ b/.config/nvim/lua/user/plugins/lsp/prisma.lua @@ -0,0 +1,5 @@ +---@type LazySpec +return { + { 'williamboman/mason.nvim', opts = { ensure_installed = { 'prisma-language-server' } } }, + { 'nvim-treesitter', opts = { ensure_installed = { 'prisma' } } }, +} diff --git a/.config/nvim/lua/user/plugins/lsp/python.lua b/.config/nvim/lua/user/plugins/lsp/python.lua new file mode 100644 index 0000000..7504729 --- /dev/null +++ b/.config/nvim/lua/user/plugins/lsp/python.lua @@ -0,0 +1,38 @@ +---@type LazySpec +return { + { + 'AstroNvim/astrolsp', + ---@type AstroLSPConfig + opts = { + handlers = { + ruff = function(server, opts) + local default_attach = opts.on_attach + opts.on_attach = function(client, _) + -- Disable hover in favor of Pyright + client.server_capabilities.hoverProvider = false + end + require('lspconfig')[server].setup(opts) + end, + }, + }, + }, + { 'nvim-treesitter', opts = { ensure_installed = { 'python', 'pymanifest' } } }, + { + 'mason.nvim', + opts = { + ensure_installed = { + 'ruff', + 'basedpyright', + 'isort', + }, + }, + }, + { + 'nvim-lint', + opts = { + linters_by_ft = { + python = { 'ruff' }, + }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/lsp/tailwind.lua b/.config/nvim/lua/user/plugins/lsp/tailwindcss.lua similarity index 80% rename from .config/nvim/lua/plugins/lsp/tailwind.lua rename to .config/nvim/lua/user/plugins/lsp/tailwindcss.lua index 1b062f2..0c8c18c 100644 --- a/.config/nvim/lua/plugins/lsp/tailwind.lua +++ b/.config/nvim/lua/user/plugins/lsp/tailwindcss.lua @@ -1,29 +1,12 @@ ---@type LazySpec return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'tailwindcss-language-server', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'styled', - }) - return opts - end, - }, { 'AstroNvim/astrolsp', + ---@type AstroLSPConfig opts = { handlers = { tailwindcss = function(server, opts) - opts.capabilities = require('my_config.util').get_lsp_capabilities(opts.capabilities) + opts.capabilities = require('user.config.util').get_lsp_capabilities(opts.capabilities) opts.init_options = { userLanguages = { eelixir = 'html-eex', @@ -85,4 +68,10 @@ return { }, }, }, + { + 'mason.nvim', + opts = { + ensure_installed = { 'tailwindcss-language-server' }, + }, + }, } diff --git a/.config/nvim/lua/plugins/lsp/typescript.lua b/.config/nvim/lua/user/plugins/lsp/typescript.lua similarity index 53% rename from .config/nvim/lua/plugins/lsp/typescript.lua rename to .config/nvim/lua/user/plugins/lsp/typescript.lua index 6dd5e27..ff6321a 100644 --- a/.config/nvim/lua/plugins/lsp/typescript.lua +++ b/.config/nvim/lua/user/plugins/lsp/typescript.lua @@ -1,66 +1,28 @@ local augroup = vim.api.nvim_create_augroup('sp_eslint', {}) + ---@type LazySpec return { - { - 'williamboman/mason.nvim', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'vtsls', - 'css-lsp', - 'prettierd', - 'eslint_d', - 'eslint-lsp', - }) - return opts - end, - }, - { - 'nvim-treesitter/nvim-treesitter', - opts = function(_, opts) - opts.ensure_installed = require('my_config.util').unique_append_table(opts.ensure_installed, { - 'astro', - 'javascript', - 'typescript', - 'jsdoc', - 'tsx', - 'styled', - }) - return opts - end, - }, + { 'pmizio/typescript-tools.nvim', dependencies = { 'nvim-lua/plenary.nvim' }, lazy = true, enabled = false }, { 'yioneko/nvim-vtsls', lazy = true, - opts = {}, + opts = { + -- automatically trigger renaming of extracted symbol + refactor_auto_rename = true, + }, config = function(_, opts) require('vtsls').config(opts) end, }, { 'AstroNvim/astrolsp', + ---@type AstroLSPConfig opts = { handlers = { - tsserver = false, - ts_ls = false, - eslint = function(server, opts) - local default_attach = opts.on_attach - opts.on_attach = function(client, bufnr) - default_attach(client, bufnr) - vim.api.nvim_create_autocmd('BufWritePre', { - buffer = bufnr, - desc = 'Run Eslint fix before save', - group = augroup, - callback = function() - vim.cmd 'EslintFixAll' - end, - }) - end - require('lspconfig')[server].setup(opts) - end, + tsserver = false, -- old deprecated server vtsls = function(server, opts) - require('lspconfig.configs').vtsls = require('vtsls').lspconfig + require('lspconfig.configs')[server] = require('vtsls').lspconfig local default_attach = opts.on_attach - opts.capabilities = require('my_config.util').get_lsp_capabilities(opts.capabilities) opts.filetypes = { 'javascript', 'javascriptreact', @@ -70,12 +32,46 @@ return { 'typescript.tsx', 'vue', } + opts.on_attach = function(client, buffer) + default_attach(client, buffer) + local map = function(lhs, rhs, desc) + vim.keymap.set('n', lhs, rhs, { + buffer = buffer, + noremap = true, + desc = desc, + }) + end + map('gD', function() + vim.cmd 'VtsExec goto_source_definition' + end, 'Goto Source Definition') + + map('gR', function() + require('vtsls').commands.file_references(buffer) + end, 'File References') + + map('go', function() + require('vtsls').commands.organize_imports(buffer) + end, 'Organize Imports') + map('lo', function() + require('vtsls').commands.organize_imports(buffer) + end, 'Organize Imports') + map('lF', function() + require('vtsls').commands.fix_all(buffer) + end, 'Fix All') + map('lv', function() + require('vtsls').commands.select_ts_version(buffer) + end, 'Select Version') + map('lR', function() + require('vtsls').commands.rename_file(buffer) + end, 'Rename File') + end opts.settings = { complete_function_calls = true, vtsls = { enableMoveToFileCodeAction = true, autoUseWorkspaceTsdk = true, experimental = { + -- maxInlayHintLength = 30, completion = { enableServerSideFuzzyMatch = true, }, @@ -100,112 +96,57 @@ return { }, }, typescript = { - suggest = { completeFunctionCalls = true }, updateImportsOnFileMove = { enabled = 'always' }, - inlayHints = { - parameterNames = { enabled = 'all' }, - parameterTypes = { enabled = true }, - variableTypes = { enabled = true }, - propertyDeclarationTypes = { enabled = true }, - functionLikeReturnTypes = { enabled = true }, - enumMemberValues = { enabled = true }, + suggest = { + completeFunctionCalls = true, }, + -- inlayHints = { + -- enumMemberValues = { enabled = true }, + -- functionLikeReturnTypes = { enabled = true }, + -- parameterNames = { enabled = 'literals' }, + -- parameterTypes = { enabled = true }, + -- propertyDeclarationTypes = { enabled = true }, + -- variableTypes = { enabled = false }, + -- }, }, } - opts.settings.javascript = vim.tbl_deep_extend('force', {}, opts.settings.typescript, {}) - opts.on_attach = function(client, buffer) - default_attach(client, buffer) - ---@diagnostic disable-next-line: redefined-local - local map = function(lhs, rhs, opts) - local o = { - buffer = buffer, - noremap = true, - desc = opts, - } - vim.keymap.set('n', lhs, rhs, o) - end - - map('gD', function() - -- require('vtsls').commands.goto_source_definition(buffer) - vim.cmd 'VtsExec goto_source_definition' - end, 'Goto Source Definition') - - map('gR', function() - require('vtsls').commands.file_references(buffer) - end, 'File References') - - map('go', function() - require('vtsls').commands.organize_imports(buffer) - end, 'Organize Imports') - map('lo', function() - require('vtsls').commands.organize_imports(buffer) - -- require('vtsls').commands.add_missing_imports(buffer) - -- require('vtsls').commands.remove_unused_imports(buffer) - end, 'Organize Imports') - map('lF', function() - require('vtsls').commands.fix_all(buffer) - end, 'Fix All') - map('lv', function() - require('vtsls').commands.select_ts_version(buffer) - end, 'Select Version') - map('lR', function() - require('vtsls').commands.rename_file(buffer) - end, 'Rename File') + -- copy typescript settings to javascript + opts.settings.javascript = + vim.tbl_deep_extend('force', {}, opts.settings.typescript, opts.settings.javascript or {}) + require('lspconfig')[server].setup(opts) + end, + eslint = function(server, opts) + local default_attach = opts.on_attach + opts.on_attach = function(client, bufnr) + default_attach(client, bufnr) + vim.api.nvim_create_autocmd('BufWritePre', { + buffer = bufnr, + desc = 'Run Eslint fix before save', + group = augroup, + callback = function() + vim.cmd 'EslintFixAll' + end, + }) end require('lspconfig')[server].setup(opts) end, + ts_ls = false, + -- ts_ls = function(_, opts) + -- require('typescript-tools').setup({ + -- on_attach = opts.on_attach, + -- expose_as_code_action = 'all', + -- tsserver_plugins = { '@styled/typescript-styled-plugin' }, + -- }) + -- end, }, }, }, { - 'vuki656/package-info.nvim', - dependencies = { 'MunifTanjim/nui.nvim' }, - opts = {}, - event = 'BufRead package.json', + 'nvim-treesitter', + opts = { ensure_installed = { 'javascript', 'typescript', 'tsx', 'jsdoc', 'astro', 'styled' } }, }, - -- { - -- 'dmmulroy/ts-error-translator.nvim', - -- ft = { - -- 'typescript', - -- 'typescriptreact', - -- 'javascript', - -- 'javascriptreact', - -- }, - -- opts = {}, - -- }, { - 'dmmulroy/ts-error-translator.nvim', - lazy = true, - dependencies = { - 'AstroNvim/astrolsp', - ---@param opts AstroLSPOpts - opts = function(_, opts) - if not opts.lsp_handlers then - opts.lsp_handlers = {} - end - local event = 'textDocument/publishDiagnostics' - local orig = opts.lsp_handlers[event] or vim.lsp.handlers[event] - opts.lsp_handlers[event] = function(err, result, ctx, config) - local client = vim.lsp.get_client_by_id(ctx.client_id) - if - client - and vim.tbl_contains({ - 'astro', - 'svelte', - 'tsserver', - 'typescript-tools', - 'volar', - 'vtsls', - }, client.name) - then - vim.tbl_map(require('ts-error-translator').translate, result.diagnostics) - end - orig(err, result, ctx, config) - end - end, - }, - opts = function() - return { auto_override_publish_diagnostics = not require('astrocore').is_available 'astrolsp' } - end, + 'mason.nvim', + opts = { ensure_installed = { 'typescript-language-server', 'eslint-lsp', 'eslint_d', 'vtsls' } }, }, } diff --git a/.config/nvim/lua/user/plugins/markdown.lua b/.config/nvim/lua/user/plugins/markdown.lua new file mode 100644 index 0000000..01701a3 --- /dev/null +++ b/.config/nvim/lua/user/plugins/markdown.lua @@ -0,0 +1,59 @@ +local fts = { 'markdown', 'vimwiki', 'Avante' } +local bullets_fts = { 'markdown', 'gitcommit', 'text', 'Avante' } +---@type LazySpec +return { + { + 'bullets-vim/bullets.vim', + ft = bullets_fts, + init = function() + vim.g.bullets_enabled_file_types = bullets_fts + vim.g.bullets_set_mappings = 0 + end, + config = function() + vim.api.nvim_create_autocmd('FileType', { + desc = 'Setup Bullet-vim mappings because the default setup is messing up the snacks.picker input box', + group = vim.api.nvim_create_augroup('sp_markdow', { clear = true }), + pattern = bullets_fts, + callback = function(args) + local bufnr = args.buf + vim.keymap.set('i', '', '(bullets-newline)', { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set('i', '', '', { silent = true, buffer = bufnr }) + vim.keymap.set('n', 'o', '(bullets-newline)', { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set( + { 'n', 'v' }, + 'gN', + '(bullets-renumber)', + { silent = true, buffer = bufnr, remap = true } + ) + + vim.keymap.set('i', '', '(bullets-demote)', { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set('i', '', '(bullets-promote)', { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set('n', '>>', '(bullets-demote)', { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set('n', '<<', '(bullets-promote)', { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set('x', '>', '(bullets-demote)', { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set('x', '<', '(bullets-promote)', { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set( + 'n', + 'xx', + '(bullets-toggle-checkbox)', + { desc = 'Toggle Checkbox', silent = true, buffer = bufnr, remap = true } + ) + end, + }) + end, + }, + { + 'MeanderingProgrammer/render-markdown.nvim', + dependencies = { 'nvim-treesitter/nvim-treesitter', 'echasnovski/mini.icons' }, + ft = fts, + ---@module 'render-markdown' + ---@type render.md.UserConfig + opts = { + file_types = fts, + }, + }, +} diff --git a/.config/nvim/lua/plugins/mini/ai.lua b/.config/nvim/lua/user/plugins/mini/ai.lua similarity index 87% rename from .config/nvim/lua/plugins/mini/ai.lua rename to .config/nvim/lua/user/plugins/mini/ai.lua index b760a08..9df19ea 100644 --- a/.config/nvim/lua/plugins/mini/ai.lua +++ b/.config/nvim/lua/user/plugins/mini/ai.lua @@ -1,18 +1,15 @@ ---@type LazySpec return { 'echasnovski/mini.ai', - version = '*', - event = { 'BufReadPost', 'BufNewFile' }, - enabled = true, + event = 'VeryLazy', dependencies = { { 'echasnovski/mini.extra', - version = '*', - opts = {}, config = function() require('mini.extra').setup() end, }, + 'nvim-treesitter', }, opts = function() local ai = require 'mini.ai' @@ -27,7 +24,7 @@ return { f = ai.gen_spec.treesitter({ a = '@function.outer', i = '@function.inner' }), -- function c = ai.gen_spec.treesitter({ a = '@class.outer', i = '@class.inner' }), -- class t = { '<([%p%w]-)%f[^<%w][^<>]->.-', '^<.->().*()$' }, -- tags - B = gen_ai_spec.buffer(), + e = gen_ai_spec.buffer(), D = gen_ai_spec.diagnostic(), L = gen_ai_spec.line(), }, diff --git a/.config/nvim/lua/plugins/mini/align.lua b/.config/nvim/lua/user/plugins/mini/align.lua similarity index 89% rename from .config/nvim/lua/plugins/mini/align.lua rename to .config/nvim/lua/user/plugins/mini/align.lua index 6e72beb..aaf9298 100644 --- a/.config/nvim/lua/plugins/mini/align.lua +++ b/.config/nvim/lua/user/plugins/mini/align.lua @@ -1,7 +1,6 @@ ---@type LazySpec return { 'echasnovski/mini.align', - version = '*', keys = { 'ga', 'gA' }, config = function() require('mini.align').setup({}) diff --git a/.config/nvim/lua/plugins/mini/files.lua b/.config/nvim/lua/user/plugins/mini/files.lua similarity index 71% rename from .config/nvim/lua/plugins/mini/files.lua rename to .config/nvim/lua/user/plugins/mini/files.lua index e6d586a..482218d 100644 --- a/.config/nvim/lua/plugins/mini/files.lua +++ b/.config/nvim/lua/user/plugins/mini/files.lua @@ -12,11 +12,48 @@ local minifiles_toggle = function(...) end end +local map_split = function(buf_id, lhs, direction, close_on_file) + local rhs = function() + local new_target_window + local cur_target_window = require('mini.files').get_explorer_state().target_window + if cur_target_window ~= nil then + vim.api.nvim_win_call(cur_target_window, function() + vim.cmd('belowright ' .. direction .. ' split') + new_target_window = vim.api.nvim_get_current_win() + end) + + require('mini.files').set_target_window(new_target_window) + require('mini.files').go_in({ close_on_file = close_on_file }) + end + end + + local desc = 'Open in ' .. direction .. ' split' + if close_on_file then + desc = desc .. ' and close' + end + vim.keymap.set('n', lhs, rhs, { buffer = buf_id, desc = desc }) +end + +local function open_in_window_picker() + local f = require 'mini.files' + local fs_entry = f.get_fs_entry() + if fs_entry ~= nil and fs_entry.fs_type == 'file' then + local picked_window_id = require('window-picker').pick_window() + if picked_window_id == nil then + return + end + f.set_target_window(picked_window_id) + end + f.go_in({ + close_on_file = true, + }) +end + ---@type LazySpec return { 'echasnovski/mini.files', dependencies = { - 'nvim-tree/nvim-web-devicons', + 'echasnovski/mini.icons', { 's1n7ax/nvim-window-picker', version = '2.*', @@ -40,67 +77,31 @@ return { }, -- { 'antosha417/nvim-lsp-file-operations', dependencies = { 'nvim-lua/plenary.nvim' } }, }, - version = '*', - enabled = true, keys = { { - 'E', + 'e', minifiles_toggle, desc = 'Toggle file explorer', }, { - 'e', + 'E', function() minifiles_toggle(vim.api.nvim_buf_get_name(0), false) end, desc = 'Toggle file explorer(current file)', }, }, - config = function() - require('mini.files').setup({ - options = { - permanent_delete = false, - use_as_default_explorer = true, - }, - windows = { preview = true, width_preview = 45 }, - }) + opts = { + options = { + permanent_delete = false, + use_as_default_explorer = true, + }, + windows = { preview = true, width_preview = 45 }, + }, + config = function(_, opts) + require('mini.files').setup(opts) -- require('lsp-file-operations').setup() - local map_split = function(buf_id, lhs, direction, close_on_file) - local rhs = function() - local new_target_window - local cur_target_window = require('mini.files').get_explorer_state().target_window - if cur_target_window ~= nil then - vim.api.nvim_win_call(cur_target_window, function() - vim.cmd('belowright ' .. direction .. ' split') - new_target_window = vim.api.nvim_get_current_win() - end) - - require('mini.files').set_target_window(new_target_window) - require('mini.files').go_in({ close_on_file = close_on_file }) - end - end - - local desc = 'Open in ' .. direction .. ' split' - if close_on_file then - desc = desc .. ' and close' - end - vim.keymap.set('n', lhs, rhs, { buffer = buf_id, desc = desc }) - end - local function open_in_window_picker() - local f = require 'mini.files' - local fs_entry = f.get_fs_entry() - if fs_entry ~= nil and fs_entry.fs_type == 'file' then - local picked_window_id = require('window-picker').pick_window() - if picked_window_id == nil then - return - end - f.set_target_window(picked_window_id) - end - f.go_in({ - close_on_file = true, - }) - end vim.api.nvim_create_autocmd('User', { pattern = 'MiniFilesBufferCreate', group = au_group, diff --git a/.config/nvim/lua/plugins/mini/indent.lua b/.config/nvim/lua/user/plugins/mini/indentscope.lua similarity index 95% rename from .config/nvim/lua/plugins/mini/indent.lua rename to .config/nvim/lua/user/plugins/mini/indentscope.lua index 2a99c87..dcca75e 100644 --- a/.config/nvim/lua/plugins/mini/indent.lua +++ b/.config/nvim/lua/user/plugins/mini/indentscope.lua @@ -3,13 +3,12 @@ local au_group = vim.api.nvim_create_augroup('sp_indent', { clear = true }) ---@type LazySpec return { 'echasnovski/mini.indentscope', - version = false, - enabled = false, event = 'BufReadPost', + enabled = false, config = function() require('mini.indentscope').setup({ -- Which character to use for drawing scope indicator - symbol = '╎', + symbol = '│', options = { try_as_border = true }, }) end, diff --git a/.config/nvim/lua/user/plugins/mini/mini-icons.lua b/.config/nvim/lua/user/plugins/mini/mini-icons.lua new file mode 100644 index 0000000..6e5e756 --- /dev/null +++ b/.config/nvim/lua/user/plugins/mini/mini-icons.lua @@ -0,0 +1,7 @@ +---@type LazySpec +return { + 'echasnovski/mini.icons', + config = function() + require('mini.icons').setup() + end, +} diff --git a/.config/nvim/lua/plugins/mini/move.lua b/.config/nvim/lua/user/plugins/mini/move.lua similarity index 97% rename from .config/nvim/lua/plugins/mini/move.lua rename to .config/nvim/lua/user/plugins/mini/move.lua index 9d227c6..0b90f5f 100644 --- a/.config/nvim/lua/plugins/mini/move.lua +++ b/.config/nvim/lua/user/plugins/mini/move.lua @@ -1,7 +1,6 @@ ---@type LazySpec return { 'echasnovski/mini.move', - version = '*', keys = { { '<', mode = { 'n', 'v' } }, { '>', mode = { 'n', 'v' } }, diff --git a/.config/nvim/lua/plugins/mini/operators.lua b/.config/nvim/lua/user/plugins/mini/operators.lua similarity index 95% rename from .config/nvim/lua/plugins/mini/operators.lua rename to .config/nvim/lua/user/plugins/mini/operators.lua index 09a962e..3e12f0d 100644 --- a/.config/nvim/lua/plugins/mini/operators.lua +++ b/.config/nvim/lua/user/plugins/mini/operators.lua @@ -1,8 +1,6 @@ ---@type LazySpec return { 'echasnovski/mini.operators', - version = '*', - enabled = true, keys = { { 'g=', mode = { 'n', 'x' }, desc = 'Evalute' }, { 'ge', mode = { 'n', 'x' }, desc = 'Exchange' }, diff --git a/.config/nvim/lua/user/plugins/mini/pick.lua b/.config/nvim/lua/user/plugins/mini/pick.lua new file mode 100644 index 0000000..36ba3f5 --- /dev/null +++ b/.config/nvim/lua/user/plugins/mini/pick.lua @@ -0,0 +1,141 @@ +local function pick_cmd(cmd) + return 'Pick ' .. cmd .. '' +end +---@type LazySpec +return { + 'echasnovski/mini.pick', + enabled = false, + dependencies = { + 'echasnovski/mini.icons', + { + 'echasnovski/mini.extra', + config = function() + require('mini.extra').setup() + end, + }, + }, + cmd = { 'Pick' }, + keys = { + { '', pick_cmd 'files', desc = '[F]ile' }, + { 'f', '', desc = '+pick' }, + { + 'fb', + pick_cmd 'buffers include_current = false', + desc = '[B]uffer', + }, + { 'ff', pick_cmd 'files', desc = '[F]ile' }, + { + 'fn', + pick_cmd(string.format("files cwd='%s'", vim.fn.stdpath 'config')), + desc = '[N]eovim config', + }, + { + 'fN', + pick_cmd(string.format("files cwd='%s'", vim.fn.stdpath 'data' .. '/lazy')), + desc = '[N]eovim data directory', + }, + { + 'fd', + pick_cmd(string.format("files cwd='%s'", vim.fn.expand '~/Documents/dotfiles/.config')), + desc = '[D]ot config', + }, + { 'fs', pick_cmd 'grep_live', desc = '[S]earch' }, + { 'fw', pick_cmd "grep pattern=''", desc = '[W]ord under cursor' }, + { 'fh', pick_cmd 'help', desc = '[H]elp' }, + { 'fr', pick_cmd 'resume', desc = '[R]esume' }, + { 'fo', pick_cmd 'oldfiles', desc = '[O]ldfiles' }, + { 'fk', pick_cmd 'keymaps', desc = '[K]eymaps' }, + { 'fO', pick_cmd 'oldfiles current_dir = true', desc = '[O]ldfiles(Current Dir)' }, + }, + opts = function() + local picker = require 'mini.pick' + return { + mappings = { + choose_in_split = '', + mark = '', + -- choose_marked = '', + move_down = '', + move_up = '', + send_to_qflist = { + char = '', + func = function() + local list = {} + local matches = picker.get_picker_matches().all + + for _, match in ipairs(matches) do + if type(match) == 'table' then + table.insert(list, match) + else + local path, lnum, col, search = string.match(match, '(.-)%z(%d+)%z(%d+)%z%s*(.+)') + local text = path and string.format('%s [%s:%s] %s', path, lnum, col, search) + local filename = path or vim.trim(match):match '%s+(.+)' + + table.insert(list, { + filename = filename or match, + lnum = lnum or 1, + col = col or 1, + text = text or match, + }) + end + end + + vim.fn.setqflist(list, 'r') + end, + }, + }, + options = { use_cache = true }, + -- source = { + -- show = function(buf_id, items, query, opts) + -- picker.default_show( + -- buf_id, + -- items, + -- query, + -- vim.tbl_deep_extend('force', { show_icons = false, icons = {} }, opts or {}) + -- ) + -- end, + -- }, + -- Window related options + window = { + config = function() + local height, width, starts, ends + local win_width = vim.o.columns + local win_height = vim.o.lines + + if win_height <= 25 then + height = math.min(win_height, 18) + width = win_width + starts = 1 + ends = win_height + else + width = math.floor(win_width * 0.5) -- 50% + height = math.floor(win_height * 0.6) -- 30% + starts = math.floor((win_width - width) / 2) + -- center prompt: height * (50% + 30%) + -- center window: height * [50% + (30% / 2)] + ends = math.floor(win_height * 0.85) + end + + return { + col = starts, + row = ends, + height = height, + width = width, + style = 'minimal', + border = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }, + } + end, + }, + } + end, + config = function(_, opts) + local picker = require 'mini.pick' + picker.setup(opts) + -- Make `:Pick files` accept `cwd` + MiniPick.registry.files = function(local_opts) + local opts = { source = { cwd = local_opts.cwd } } + local_opts.cwd = nil + return MiniPick.builtin.files(local_opts, opts) + end + vim.ui.select = picker.ui_select + end, +} diff --git a/.config/nvim/lua/user/plugins/mini/surround.lua b/.config/nvim/lua/user/plugins/mini/surround.lua new file mode 100644 index 0000000..f3da532 --- /dev/null +++ b/.config/nvim/lua/user/plugins/mini/surround.lua @@ -0,0 +1,39 @@ +local mappings = { + add = 'ys', + delete = 'ds', + replace = 'cs', + find = 'gzf', + find_left = 'gzF', + highlight = 'gzh', + updates = 'gzn', +} + +---@type LazySpec +return { + 'echasnovski/mini.surround', + enabled = true, + keys = { + { 'gz', '', desc = '+surround' }, + { mappings.add, mode = { 'n', 'v' }, desc = 'Surround add' }, + { mappings.delete, mode = { 'n' }, desc = 'Surround delete' }, + { mappings.replace, mode = { 'n' }, desc = 'Surround replace' }, + { mappings.find, mode = { 'n' }, desc = 'Surround find' }, + { mappings.highlight, mode = { 'n' }, desc = 'Surround highlight' }, + }, + opts = { + -- search_method = 'cover_or_next', + n_lines = 500, + mappings = { + add = mappings.add, -- Add surrounding in Normal and Visual modes + delete = mappings.delete, -- Delete surrounding + replace = mappings.replace, -- Replace surrounding + find = mappings.find, -- Find surrounding (to the right) + find_left = mappings.find_left, -- Find surrounding (to the left) + highlight = mappings.highlight, -- Highlight surrounding + update_n_lines = mappings.updates, -- Update `n_lines` + }, + }, + config = function(_, opts) + require('mini.surround').setup(opts) + end, +} diff --git a/.config/nvim/lua/user/plugins/multi-cursor.lua b/.config/nvim/lua/user/plugins/multi-cursor.lua new file mode 100644 index 0000000..6198683 --- /dev/null +++ b/.config/nvim/lua/user/plugins/multi-cursor.lua @@ -0,0 +1,73 @@ +---@type LazySpec +return { + { + 'mg979/vim-visual-multi', + branch = 'master', + version = false, + enabled = false, + init = function() + vim.g.VM_maps = {} + vim.g.VM_mouse_mappings = 1 + vim.g.VM_maps = { + ['Find Under'] = '', + ['Find Subword Under'] = '', + ['Skip Region'] = '', + ['Select All'] = '', + ['Start Regex Search'] = '\\/', + } + end, + keys = { { '', mode = { 'n', 'v' } }, { '', mode = { 'n', 'v' } } }, + }, + { + 'brenton-leighton/multiple-cursors.nvim', + version = '*', + enabled = false, + cmd = { + 'MultipleCursorsAddDown', + 'MultipleCursorsAddUp', + 'MultipleCursorsAddMatches', + 'MultipleCursorsAddJumpNextMatch', + 'MultipleCursorsJumpNextMatch', + 'MultipleCursorsAddJumpPrevMatch', + 'MultipleCursorsJumpPrevMatch', + }, + opts = {}, + keys = { + { '', 'MultipleCursorsAddDown', mode = { 'n', 'x' }, desc = 'Add cursor and move down' }, + { '', 'MultipleCursorsAddUp', mode = { 'n', 'x' }, desc = 'Add cursor and move up' }, + + { '', 'MultipleCursorsMouseAddDelete', mode = { 'n', 'i' }, desc = 'Add or remove cursor' }, + { 'ma', 'MultipleCursorsAddMatches', mode = { 'n', 'x' }, desc = 'Add cursors to cword' }, + { + 'mA', + 'MultipleCursorsAddMatchesV', + mode = { 'n', 'x' }, + desc = '+cursors to cword in prev area', + }, + { + 'mn', + 'MultipleCursorsAddJumpNextMatch', + mode = { 'n', 'x' }, + desc = '+cursor & jump to next cword', + }, + { 'mN', 'MultipleCursorsJumpNextMatch', mode = { 'n', 'x' }, desc = 'Jump to next cword' }, + { 'ml', 'MultipleCursorsLock', mode = { 'n', 'x' }, desc = 'Lock virtual cursors' }, + }, + }, + { + 'smoka7/multicursors.nvim', + dependencies = { + 'nvimtools/hydra.nvim', + }, + opts = {}, + cmd = { 'MCstart', 'MCvisual', 'MCclear', 'MCpattern', 'MCvisualPattern', 'MCunderCursor' }, + keys = { + { + mode = { 'v', 'n' }, + 'm', + 'MCstart', + desc = 'Create a selection for selected text or word under the cursor', + }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/neogen.lua b/.config/nvim/lua/user/plugins/neogen.lua similarity index 100% rename from .config/nvim/lua/plugins/neogen.lua rename to .config/nvim/lua/user/plugins/neogen.lua diff --git a/.config/nvim/lua/plugins/neogit.lua b/.config/nvim/lua/user/plugins/neogit.lua similarity index 60% rename from .config/nvim/lua/plugins/neogit.lua rename to .config/nvim/lua/user/plugins/neogit.lua index 1bdf6eb..424a599 100644 --- a/.config/nvim/lua/plugins/neogit.lua +++ b/.config/nvim/lua/user/plugins/neogit.lua @@ -2,16 +2,11 @@ return { 'NeogitOrg/neogit', cmd = 'Neogit', keys = { - { 'og', 'Neogit kind=floating', desc = 'Neogit' }, { 'gn', 'Neogit kind=floating', desc = 'Neogit' }, }, dependencies = { 'nvim-lua/plenary.nvim', -- required { 'sindrets/diffview.nvim', cmd = 'DiffviewOpen', opts = {} }, -- optional - Diff integration }, - opts = { - telescope_sorter = function() - return require('telescope').extensions.fzf.native_fzf_sorter() - end, - }, + opts = {}, } diff --git a/.config/nvim/lua/user/plugins/notes.lua b/.config/nvim/lua/user/plugins/notes.lua new file mode 100644 index 0000000..6d87273 --- /dev/null +++ b/.config/nvim/lua/user/plugins/notes.lua @@ -0,0 +1,51 @@ +---@type LazySpec +return { + 'yujinyuz/gitpad.nvim', + opts = { + on_attach = function(bufnr) + vim.keymap.set('n', 'q', 'wq', { silent = true, buffer = bufnr }) + end, + floating_win_opts = { + ---@type 'single'| 'double'| 'shadow'| 'rounded' + border = 'rounded', + }, + }, + keys = function() + local g = require 'gitpad' + return { + { + 'pp', + g.toggle_gitpad, -- or g.toggle_gitpad({ title = 'Project notes' }) + desc = 'gitpad project', + }, + { + 'pb', + g.toggle_gitpad_branch, -- or g.toggle_gitpad_branch({ title = 'Branch notes' }) + desc = 'gitpad branch', + }, + -- Daily notes + { + 'pd', + function() + local date_filename = 'daily-' .. os.date '%Y-%m-%d.md' + g.toggle_gitpad({ filename = date_filename }) -- or g.toggle_gitpad({ filename = date_filename, title = 'Daily notes' }) + end, + desc = 'gitpad daily notes', + }, + -- Per file notes + { + 'pf', + function() + local filename = vim.fn.expand '%:p' -- or just use vim.fn.bufname() + if filename == '' then + vim.notify 'empty bufname' + return + end + filename = vim.fn.pathshorten(filename, 2) .. '.md' + g.toggle_gitpad({ filename = filename }) -- or g.toggle_gitpad({ filename = filename, title = 'Current file notes' }) + end, + desc = 'gitpad per file notes', + }, + } + end, +} diff --git a/.config/nvim/lua/plugins/autopairs.lua b/.config/nvim/lua/user/plugins/nvim-autopairs.lua similarity index 62% rename from .config/nvim/lua/plugins/autopairs.lua rename to .config/nvim/lua/user/plugins/nvim-autopairs.lua index e2a9790..c47c6a6 100644 --- a/.config/nvim/lua/plugins/autopairs.lua +++ b/.config/nvim/lua/user/plugins/nvim-autopairs.lua @@ -80,88 +80,40 @@ local function rule_add_space_on_equal() :with_move(cond.none()) :with_del(cond.none()) end --- https://github.com/rstacruz/vim-closer/blob/master/autoload/closer.vim -local get_closing_for_line = function(line) - local i = -1 - local clo = '' - - while true do - i, _ = string.find(line, '[%(%)%{%}%[%]]', i + 1) - if i == nil then - break - end - local ch = string.sub(line, i, i) - local st = string.sub(clo, 1, 1) - - if ch == '{' then - clo = '}' .. clo - elseif ch == '}' then - if st ~= '}' then - return '' - end - clo = string.sub(clo, 2) - elseif ch == '(' then - clo = ')' .. clo - elseif ch == ')' then - if st ~= ')' then - return '' - end - clo = string.sub(clo, 2) - elseif ch == '[' then - clo = ']' .. clo - elseif ch == ']' then - if st ~= ']' then - return '' - end - clo = string.sub(clo, 2) - end - end - - return clo -end - -local function rule_expand_multiple_on_enter(autopairs) - local Rule = require 'nvim-autopairs.rule' - - autopairs.remove_rule '(' - autopairs.remove_rule '{' - autopairs.remove_rule '[' - - autopairs.add_rule(Rule('[%(%{%[]', '') - :use_regex(true) - :replace_endpair(function(opts) - return get_closing_for_line(opts.line) - end) - :end_wise(function(opts) - -- Do not endwise if there is no closing - return get_closing_for_line(opts.line) ~= '' - end)) -end ---@type LazySpec return { - 'windwp/nvim-autopairs', - event = 'InsertEnter', - enabled = true, - config = function(_, opts) - local options = vim.tbl_deep_extend('force', { + { + 'windwp/nvim-autopairs', + event = 'InsertEnter', + enabled = false, + opts = { disable_filetype = { 'TelescopePrompt' }, ignored_next_char = '[%w%.]', check_ts = false, map_c_w = true, + map_cr = true, fast_wrap = {}, - }, opts) - local npairs = require 'nvim-autopairs' - npairs.setup(options) + }, + config = function(_, opts) + local npairs = require 'nvim-autopairs' + npairs.setup(opts) - rule_add_spaces_between_paren() - rule_add_space_on_equal() - -- rule_expand_multiple_on_enter(npairs) + rule_add_spaces_between_paren() + rule_add_space_on_equal() - local ok, cmp = pcall(require, 'cmp') - if ok then - local cmp_autopairs = require 'nvim-autopairs.completion.cmp' - cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done()) - end - end, + local ok, cmp = pcall(require, 'cmp') + if ok then + local cmp_autopairs = require 'nvim-autopairs.completion.cmp' + cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done()) + end + end, + }, + { + 'cohama/lexima.vim', + branch = 'master', + config = function() + vim.cmd [[call lexima#add_rule({'at': '\%#\w', 'char': '(', 'input': '('})]] + end, + }, } diff --git a/.config/nvim/lua/plugins/colorizer.lua b/.config/nvim/lua/user/plugins/nvim-color-highlights.lua similarity index 58% rename from .config/nvim/lua/plugins/colorizer.lua rename to .config/nvim/lua/user/plugins/nvim-color-highlights.lua index 777b573..e7e3182 100644 --- a/.config/nvim/lua/plugins/colorizer.lua +++ b/.config/nvim/lua/user/plugins/nvim-color-highlights.lua @@ -1,12 +1,13 @@ ---@type LazySpec return { - 'brenoprata10/nvim-highlight-colors', - event = 'BufReadPost', + "brenoprata10/nvim-highlight-colors", + event = "BufReadPost", + enabled = true, lazy = true, opts = { ---Render style ---@type 'background'|'foreground'|'virtual' - render = 'virtual', + render = "background", enable_tailwind = true, }, } diff --git a/.config/nvim/lua/user/plugins/nvim-lint.lua b/.config/nvim/lua/user/plugins/nvim-lint.lua new file mode 100644 index 0000000..8fec8f5 --- /dev/null +++ b/.config/nvim/lua/user/plugins/nvim-lint.lua @@ -0,0 +1,89 @@ +local au_group = vim.api.nvim_create_augroup('sp_nvim_lint', {}) + +---@type LazySpec +return { + 'mfussenegger/nvim-lint', + event = { 'BufRead', 'BufNewFile' }, + opts = { + linters_by_ft = { + sh = { 'shellcheck' }, + bash = { 'shellcheck' }, + fish = { 'fish' }, + zsh = { 'shellcheck', 'zsh' }, + sql = { 'sqlfluff' }, + }, + linters = {}, + }, + config = function(_, opts) + local M = {} + + local lint = require 'lint' + for name, linter in pairs(opts.linters) do + if type(linter) == 'table' and type(lint.linters[name]) == 'table' then + lint.linters[name] = vim.tbl_deep_extend('force', lint.linters[name], linter) + if type(linter.prepend_args) == 'table' then + lint.linters[name].args = lint.linters[name].args or {} + vim.list_extend(lint.linters[name].args, linter.prepend_args) + end + else + lint.linters[name] = linter + end + end + lint.linters_by_ft = opts.linters_by_ft + + function M.debounce(ms, fn) + local timer = vim.uv.new_timer() + return function(...) + local argv = { ... } + timer:start(ms, 0, function() + timer:stop() + vim.schedule_wrap(fn)(unpack(argv)) + end) + end + end + + function M.lint() + -- Use nvim-lint's logic first: + -- * checks if linters exist for the full filetype first + -- * otherwise will split filetype by "." and add all those linters + -- * this differs from conform.nvim which only uses the first filetype that has a formatter + local names = lint._resolve_linter_by_ft(vim.bo.filetype) + + -- Create a copy of the names table to avoid modifying the original. + names = vim.list_extend({}, names) + + -- Add fallback linters. + if #names == 0 then + vim.list_extend(names, lint.linters_by_ft['_'] or {}) + end + + -- Add global linters. + vim.list_extend(names, lint.linters_by_ft['*'] or {}) + + -- Filter out linters that don't exist or don't match the condition. + local ctx = { filename = vim.api.nvim_buf_get_name(0) } + ctx.dirname = vim.fn.fnamemodify(ctx.filename, ':h') + names = vim.tbl_filter(function(name) + local linter = lint.linters[name] + if not linter then + LazyVim.warn('Linter not found: ' .. name, { title = 'nvim-lint' }) + end + return linter and not (type(linter) == 'table' and linter.condition and not linter.condition(ctx)) + end, names) + + -- Run linters. + if #names > 0 then + lint.try_lint(names) + end + end + + vim.api.nvim_create_autocmd( + { 'BufWritePost', 'BufRead', 'InsertLeave', 'ModeChanged', 'TabEnter', 'FocusGained' }, + { + group = au_group, + desc = 'Lint on save', + callback = M.debounce(100, M.lint), + } + ) + end, +} diff --git a/.config/nvim/lua/user/plugins/nvim-treesitter.lua b/.config/nvim/lua/user/plugins/nvim-treesitter.lua new file mode 100644 index 0000000..5648a19 --- /dev/null +++ b/.config/nvim/lua/user/plugins/nvim-treesitter.lua @@ -0,0 +1,98 @@ +---@type LazySpec +return { + { + 'nvim-treesitter/nvim-treesitter', + version = false, -- last release is way too old and doesn't work on Windows + build = ':TSUpdate', + lazy = false, + cmd = { 'TSUpdateSync', 'TSUpdate', 'TSInstall' }, + dependencies = { + 'nvim-treesitter/nvim-treesitter-textobjects', + 'andymass/vim-matchup', + }, + opts_extend = { 'ensure_installed' }, + ---@type TSConfig + ---@diagnostic disable-next-line: missing-fields + opts = { + highlight = { + enable = true, + disable = function(_, bufnr) + local line_count = vim.api.nvim_buf_line_count(bufnr) + if line_count > 2500 then + return true + end + end, + }, + indent = { enable = true }, + ensure_installed = { + 'bash', + 'dockerfile', + 'fish', + 'query', + 'regex', + 'rasi', + 'sxhkdrc', + 'vim', + 'vimdoc', + 'diff', + 'git_config', + 'git_rebase', + 'gitattributes', + 'gitcommit', + 'gitignore', + 'hyprlang', + 'ini', + 'sql', + 'ssh_config', + 'tmux', + 'toml', + 'xml', + 'zathurarc', + }, + textobjects = { + swap = { + enable = true, + swap_next = { + ['k'] = { query = '@block.outer', desc = 'Swap next block' }, + ['f'] = { query = '@function.outer', desc = 'Swap next function' }, + ['a'] = { query = '@parameter.inner', desc = 'Swap next argument' }, + }, + swap_previous = { + ['K'] = { query = '@block.outer', desc = 'Swap previous block' }, + ['F'] = { query = '@function.outer', desc = 'Swap previous function' }, + ['A'] = { query = '@parameter.inner', desc = 'Swap previous argument' }, + }, + }, + }, + }, + ---@param opts TSConfig + config = function(_, opts) + if type(opts.ensure_installed) == 'table' then + opts.ensure_installed = require('user.config.util').dedup(opts.ensure_installed) + end + require('nvim-treesitter.configs').setup(opts) + end, + }, + { + 'nvim-treesitter/nvim-treesitter-context', + event = 'BufRead', + opts = {}, + cmd = { 'TSContextEnable', 'TSContextDisable', 'TSContextToggle' }, + keys = { + { + 'c', + function() + require('treesitter-context').go_to_context(vim.v.count1) + end, + silent = true, + desc = 'Jumping to context (upwards)', + }, + { 'uc', 'TSContextToggle', desc = 'TSContextToggle' }, + }, + }, + { + 'windwp/nvim-ts-autotag', + event = 'VeryLazy', + opts = {}, + }, +} diff --git a/.config/nvim/lua/plugins/quick-scope.lua b/.config/nvim/lua/user/plugins/quickscope.lua similarity index 93% rename from .config/nvim/lua/plugins/quick-scope.lua rename to .config/nvim/lua/user/plugins/quickscope.lua index 665d850..49260cc 100644 --- a/.config/nvim/lua/plugins/quick-scope.lua +++ b/.config/nvim/lua/user/plugins/quickscope.lua @@ -1,3 +1,4 @@ +---@type LazySpec return { 'unblevable/quick-scope', keys = { 'f', 'F', 't', 'T' }, diff --git a/.config/nvim/lua/plugins/refactoring.lua b/.config/nvim/lua/user/plugins/refactoring.lua similarity index 100% rename from .config/nvim/lua/plugins/refactoring.lua rename to .config/nvim/lua/user/plugins/refactoring.lua diff --git a/.config/nvim/lua/plugins/sessions.lua b/.config/nvim/lua/user/plugins/sessions.lua similarity index 100% rename from .config/nvim/lua/plugins/sessions.lua rename to .config/nvim/lua/user/plugins/sessions.lua diff --git a/.config/nvim/lua/user/plugins/snacks.lua b/.config/nvim/lua/user/plugins/snacks.lua new file mode 100644 index 0000000..f83b9ce --- /dev/null +++ b/.config/nvim/lua/user/plugins/snacks.lua @@ -0,0 +1,331 @@ +---@param picker snacks.Picker +local function copy_path_full(picker) + local selected = picker:selected({ fallback = true })[1] + if not selected or selected == nil then + return + end + vim.schedule(function() + local full_path = vim.fn.fnamemodify(selected.file, ':p') + vim.fn.setreg('+', full_path) + vim.notify(full_path, vim.log.levels.INFO, { title = 'File Path Copied' }) + end) +end +---FIXME: not working currently +---@param picker snacks.Picker +local function copy_path_relative(picker) + local selected = picker:selected({ fallback = true })[1] + if not selected or selected == nil then + return + end + vim.schedule(function() + local full_path = vim.fs.normalize(selected.file) + vim.fn.setreg('+', full_path) + vim.notify(full_path, vim.log.levels.INFO, { title = 'File Path Copied' }) + end) +end +---@type LazySpec +return { + { + 'folke/snacks.nvim', + lazy = false, + ---@type snacks.Config + opts = { + bigfile = { enabled = true }, + input = { enabled = true }, + notifier = { enabled = true }, + picker = { + enabled = true, + ui_select = true, + layout = { preset = 'dropdown' }, + matcher = { frecency = true }, + formatters = { file = { filename_first = true } }, + sources = { + explorer = { + layout = { layout = { position = 'right' }, cycle = false }, + actions = { + copy_path_full = copy_path_full, + copy_path_relative = copy_path_relative, + }, + win = { + list = { + keys = { + ['Y'] = { 'copy_path_full', mode = { 'n' } }, + ['gy'] = { 'copy_path_relative', mode = { 'n' } }, + -- ['g.'] = { 'toggle_hidden', mode = { 'n' } }, + -- ['gI'] = { 'toggle_hidden', mode = { 'n' } }, + }, + }, + }, + }, + }, + -- jump = { reuse_win = true }, + win = { + -- input window + input = { + keys = { + [''] = { 'edit_split', mode = { 'i', 'n' } }, + [''] = { 'edit_tab', mode = { 'i', 'n' } }, + [''] = { 'copy', mode = { 'i', 'n' } }, + }, + }, + list = { keys = { [''] = 'edit_split' } }, + }, + }, + indent = { + enabled = true, + char = '│', + only_current = true, + }, + scope = { enabled = true }, + explorer = { enabled = true }, + quickfile = { enabled = true }, + scroll = { enabled = true }, + statuscolumn = { enabled = true }, + }, + keys = { + { + 'Z', + function() + Snacks.zen() + end, + desc = 'Toggle Zen Mode', + }, + { + 'un', + function() + Snacks.notifier.show_history() + end, + desc = 'Notification History', + }, + { + 'm', + function() + Snacks.zen.zoom() + end, + desc = 'Toggle Zoom', + }, + { + 'gg', + function() + Snacks.lazygit() + end, + desc = 'Lazygit', + }, + { + 'gs', + function() + Snacks.picker.git_status() + end, + desc = 'Git Status', + }, + { + 'gl', + function() + Snacks.git.blame_line() + end, + desc = 'Git Blame Line', + }, + { + 'gb', + function() + Snacks.picker.git_branches() + end, + desc = 'Git Branches', + }, + { + 'bc', + function() + Snacks.bufdelete.other() + end, + desc = 'Close All(Except current buffer)', + }, + { + 'bd', + function() + Snacks.bufdelete.delete() + end, + desc = 'Close current(Buffer)', + }, + { + 'bC', + function() + Snacks.bufdelete.all() + end, + desc = 'Close All(Buffer)', + }, + { + '', + function() + Snacks.terminal({ 'yazi' }, { cwd = vim.uv.cwd() }) + end, + desc = 'Toggle Yazi', + mode = { 'n', 't' }, + }, + { + '', + function() + Snacks.terminal(nil, { win = { style = 'float', border = 'rounded' } }) + end, + desc = 'Toggle Terminal', + }, + { 'f', '', desc = '+pick' }, + { + '', + function() + Snacks.picker.files({ layout = { preset = 'vscode' } }) + end, + desc = 'Find Files', + }, + { + 'ff', + function() + Snacks.picker.files({ layout = { preset = 'vscode' } }) + end, + desc = 'Find Files', + }, + { + 'fn', + function() + Snacks.picker.files({ cwd = vim.fn.stdpath 'config', layout = { preset = 'vscode' } }) + end, + desc = 'Find Config File', + }, + { + 'fN', + function() + Snacks.picker.files({ cwd = vim.fn.stdpath 'data' .. '/lazy', layout = { preset = 'vscode' } }) + end, + desc = 'Neovim Data dir', + }, + { + 'fd', + function() + Snacks.picker.files({ cwd = vim.fn.expand '~/Documents/dotfiles/.config', layout = { preset = 'vscode' } }) + end, + desc = 'Find Dotfiles', + }, + { + 'fb', + function() + Snacks.picker.buffers() + end, + desc = 'Buffers', + }, + { + 'fg', + function() + Snacks.picker.git_files({ layout = { preset = 'vscode' } }) + end, + desc = 'Find Git Files', + }, + { + '/', + function() + Snacks.picker.lines() + end, + desc = 'Buffer Lines', + }, + { + 'fs', + function() + Snacks.picker.grep() + end, + desc = 'Grep', + }, + { + 'fS', + function() + Snacks.picker.grep_buffers() + end, + desc = 'Grep Open Buffers', + }, + { + 'fw', + function() + Snacks.picker.grep_word() + end, + desc = 'Visual selection or word', + mode = { 'n', 'x' }, + }, + { + 'fh', + function() + Snacks.picker.help() + end, + desc = 'Help Pages', + }, + { + 'fk', + function() + Snacks.picker.keymaps() + end, + desc = 'Keymaps', + }, + { + 'fq', + function() + Snacks.picker.qflist() + end, + desc = 'Quickfix List', + }, + { + 'fm', + function() + Snacks.picker.man() + end, + desc = 'Man Pages', + }, + { + 'fr', + function() + Snacks.picker.resume() + end, + desc = 'Resume', + }, + { + 'fo', + function() + Snacks.picker.recent({ layout = { preset = 'vertical' } }) + end, + desc = 'Old Files(recent)', + }, + { + 'fH', + function() + Snacks.picker.highlights() + end, + desc = 'Highlights', + }, + { + 'fz', + function() + Snacks.picker.zoxide() + end, + desc = 'Zoxided', + }, + { + 'ld', + function() + Snacks.picker.diagnostics() + end, + desc = 'Diagnostics', + }, + { + '', + function() + Snacks.explorer() + end, + desc = 'explorer', + }, + }, + init = function() + vim.api.nvim_create_user_command('NotificationHistory', function() + if not _G.Snacks then + return + end + Snacks.notifier.show_history() + end, { desc = 'Show Notification History' }) + vim.keymap.set('t', '', 'close', { desc = 'Hide Terminal' }) + end, + }, +} diff --git a/.config/nvim/lua/plugins/surround.lua b/.config/nvim/lua/user/plugins/surround.lua similarity index 60% rename from .config/nvim/lua/plugins/surround.lua rename to .config/nvim/lua/user/plugins/surround.lua index b07cbb7..ecc8707 100644 --- a/.config/nvim/lua/plugins/surround.lua +++ b/.config/nvim/lua/user/plugins/surround.lua @@ -1,10 +1,7 @@ ---@type LazySpec return { 'kylechui/nvim-surround', - enabled = true, + enabled = false, config = true, - -- config = function() - -- require("nvim-surround").setup() - -- end, keys = { 'ys', 'ds', 'cs', { 'S', mode = 'x', silent = false } }, } diff --git a/.config/nvim/lua/user/plugins/template-string.lua b/.config/nvim/lua/user/plugins/template-string.lua new file mode 100644 index 0000000..0380753 --- /dev/null +++ b/.config/nvim/lua/user/plugins/template-string.lua @@ -0,0 +1,9 @@ +---@type LazySpec +return { + 'axelvc/template-string.nvim', + ft = { 'html', 'typescript', 'javascript', 'typescriptreact', 'javascriptreact', 'vue', 'svelte', 'python', 'cs' }, -- filetypes where the plugin is active + dependencies = { + 'nvim-treesitter', + }, + opts = {}, +} diff --git a/.config/nvim/lua/user/plugins/testing.lua b/.config/nvim/lua/user/plugins/testing.lua new file mode 100644 index 0000000..0514f1c --- /dev/null +++ b/.config/nvim/lua/user/plugins/testing.lua @@ -0,0 +1,78 @@ +---@type LazySpec +return { + 'nvim-neotest/neotest', + dependencies = { + 'nvim-neotest/nvim-nio', + 'nvim-lua/plenary.nvim', + 'antoinemadec/FixCursorHold.nvim', + 'nvim-treesitter/nvim-treesitter', + 'zidhuss/neotest-minitest', + 'marilari88/neotest-vitest', + 'nvim-neotest/neotest-jest', + { 'fredrikaverpil/neotest-golang', version = '*' }, -- Installation + 'nvim-neotest/neotest-plenary', + }, + cmd = { 'Neotest' }, + opts = function() + return { + adapters = { + require 'neotest-plenary', + require 'neotest-golang', + require 'neotest-vitest'({ + -- Filter directories when searching for test files. Useful in large projects (see Filter directories notes). + filter_dir = function(name, rel_path, root) + return name ~= 'node_modules' + end, + }), + require 'neotest-jest'({ + -- Filter directories when searching for test files. Useful in large projects (see Filter directories notes). + filter_dir = function(name, rel_path, root) + return name ~= 'node_modules' + end, + }), + }, + } + end, + keys = { + { + 'ts', + 'Neotest summary', + desc = 'Test Summary', + }, + { + 'tt', + function() + require('neotest').run.run(vim.fn.expand '%') + end, + desc = 'Run Test(file)', + }, + { + 'twj', + function() + require('neotest').run.run({ vim.fn.expand '%', jestCommand = 'npx jest --watch ' }) + end, + desc = 'Run Test(jest - watch)', + }, + { + 'twJ', + function() + require('neotest').run.run({ jestCommand = 'npx jest --watch' }) + end, + desc = 'Run Test(jest - watch - project)', + }, + { + 'twv', + function() + require('neotest').run.run({ vim.fn.expand '%', vitestCommand = 'npx vitest --watch' }) + end, + desc = 'Run Test(vitest - watch)', + }, + { + 'twV', + function() + require('neotest').run.run({ vitestCommand = 'npx vitest --watch' }) + end, + desc = 'Run Test(vitest - watch - project)', + }, + }, +} diff --git a/.config/nvim/lua/user/plugins/theme.lua b/.config/nvim/lua/user/plugins/theme.lua new file mode 100644 index 0000000..9145c19 --- /dev/null +++ b/.config/nvim/lua/user/plugins/theme.lua @@ -0,0 +1,129 @@ +---@type LazySpec +return { + { + 'catppuccin/nvim', + enabled = false, + name = 'catppuccin', + priority = 1000, + opts = { + ---@type 'latte'|'frappe'| 'macchiato'| 'mocha' + flavour = 'mocha', + transparent_background = true, -- disables setting the background color. + -- dim_inactive = { enabled = true }, + integrations = { + blink_cmp = true, + dadbod_ui = true, + diffview = true, + navic = { enabled = true }, + snacks = true, + which_key = true, + window_picker = true, + }, + custom_highlights = function() + return { + QuickScopePrimary = { fg = '#dfbb78', bg = '#505050', style = { 'underline', 'bold' } }, + QuickScopeSecondary = { fg = '#61afef', bg = '#505050', style = { 'underline', 'bold' } }, + } + end, + }, + config = function(_, opts) + require('catppuccin').setup(opts) + vim.cmd.colorscheme 'catppuccin' + end, + }, + { + 'olivercederborg/poimandres.nvim', + enabled = false, + priority = 1000, + opts = { + bold_vert_split = false, -- use bold vertical separators + dim_nc_background = false, -- dim 'non-current' window backgrounds + disable_background = true, -- disable background + disable_float_background = false, -- disable background for floats + disable_italics = false, -- disable italics + }, + config = function(_, opts) + require('poimandres').setup(opts) + vim.cmd.colorscheme 'poimandres' + vim.api.nvim_set_hl(0, 'LspReferenceRead', { bg = 'NvimDarkGray4', bold = true }) + vim.api.nvim_set_hl(0, 'LspReferenceText', { bg = 'NvimDarkGray4', bold = true }) + vim.api.nvim_set_hl(0, 'LspReferenceWrite', { bg = 'NvimDarkGray4', bold = true }) + end, + }, + { + 'vague2k/vague.nvim', + branch = '1.3', + enabled = false, + priority = 1000, + opts = { transparent = false }, + config = function(_, opts) + require('vague').setup(opts) + vim.cmd.colorscheme 'vague' + vim.api.nvim_set_hl(0, 'StatusLine', { bg = '#181818' }) + end, + }, + { + 'AlexvZyl/nordic.nvim', + enabled = false, + priority = 1000, + opts = { + transparent = { bg = true }, + bright_border = true, + on_highlight = function(highlights, palette) + highlights.Visual = { + bg = palette.gray1, + bold = true, + } + highlights['QuickScopePrimary'] = { + fg = palette.yellow.bright, + bg = palette.gray0, + bold = true, + underline = true, + } + highlights['QuickScopeSecondary'] = { + fg = palette.orange.dim, + bg = palette.gray0, + bold = true, + underline = true, + } + highlights['@tag.attribute'] = { + fg = '#6cc3b7', -- #6dada4 | + } + end, + }, + config = function(_, opts) + require('nordic').setup(opts) + vim.cmd.colorscheme 'nordic' + end, + }, + { + 'EdenEast/nightfox.nvim', + enabled = false, + priority = 1000, + opts = { + options = { + transparent = true, + styles = { + comments = 'italic', + }, + }, + }, + config = function(_, opts) + require('nightfox').setup(opts) + vim.cmd.colorscheme 'Duskfox' + end, + }, + { + 'wtfox/jellybeans.nvim', + enabled = true, + priority = 1000, + opts = { + style = 'dark', -- "dark" or "light" + transparent = true, + }, + config = function(_, opts) + require('jellybeans').setup(opts) + vim.cmd.colorscheme 'jellybeans' + end, + }, +} diff --git a/.config/nvim/lua/plugins/undotree.lua b/.config/nvim/lua/user/plugins/undotree.lua similarity index 100% rename from .config/nvim/lua/plugins/undotree.lua rename to .config/nvim/lua/user/plugins/undotree.lua diff --git a/.config/nvim/lua/plugins/vim-swap.lua b/.config/nvim/lua/user/plugins/vim-swap.lua similarity index 100% rename from .config/nvim/lua/plugins/vim-swap.lua rename to .config/nvim/lua/user/plugins/vim-swap.lua diff --git a/.config/nvim/lua/user/plugins/which-key.lua b/.config/nvim/lua/user/plugins/which-key.lua new file mode 100644 index 0000000..b5ceefd --- /dev/null +++ b/.config/nvim/lua/user/plugins/which-key.lua @@ -0,0 +1,35 @@ +---@type LazySpec +return { + 'folke/which-key.nvim', + event = 'VeryLazy', + opts_extend = { 'spec' }, + opts = { + ---@type 'modern'|'helix'|'classic' + preset = 'helix', + spec = { + { + mode = { 'n', 'v' }, + { 'r', group = 'refactoring' }, + { 't', group = 'tests' }, + { 'l', group = 'lsp' }, + { 'u', group = 'toggle' }, + { 'm', group = 'multi-cursor' }, + { 'g', group = 'git' }, + { 'n', group = 'neogen' }, + { '[', group = 'prev' }, + { ']', group = 'next' }, + { 'g', group = 'goto' }, + { 'sa', group = 'surround' }, + { 'z', group = 'fold' }, + -- better descriptions + { 'gx', desc = 'Open with system app' }, + }, + { + mode = { 'n' }, + { 'S', group = 'session' }, + { 'b', group = 'buffer' }, + { 'o', group = 'open' }, + }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/yazi.lua b/.config/nvim/lua/user/plugins/yazi.lua similarity index 79% rename from .config/nvim/lua/plugins/yazi.lua rename to .config/nvim/lua/user/plugins/yazi.lua index b152301..9d33a38 100644 --- a/.config/nvim/lua/plugins/yazi.lua +++ b/.config/nvim/lua/user/plugins/yazi.lua @@ -2,14 +2,13 @@ return { 'mikavilpas/yazi.nvim', version = false, - dependencies = { - 'nvim-lua/plenary.nvim', - }, + enabled = true, + dependencies = { 'nvim-lua/plenary.nvim' }, cmd = 'Yazi', keys = { - { '', 'Yazi toggle', desc = 'Togggle Yazi' }, + { '', 'Yazi toggle', desc = 'Togggle Yazi' }, { '-', 'Yazi', desc = 'Open Yazi at the current file' }, - { 'tf', 'Yazi cwd', desc = 'File Manager in cwd(Yazi)' }, + { 'uf', 'Yazi cwd', desc = 'File Manager in cwd(Yazi)' }, }, ---@type YaziConfig opts = { diff --git a/.config/nvim/selene.toml b/.config/nvim/selene.toml deleted file mode 100644 index da20589..0000000 --- a/.config/nvim/selene.toml +++ /dev/null @@ -1 +0,0 @@ -std="vim" \ No newline at end of file diff --git a/.config/nvim/snippets/lua.json b/.config/nvim/snippets/lua.json index e014a7d..6783c20 100644 --- a/.config/nvim/snippets/lua.json +++ b/.config/nvim/snippets/lua.json @@ -1,31 +1,30 @@ { - "mod": { - "prefix": "mod", - "body": ["---@type LazySpec", "return {", "\t'$1'", "\topts = {}", "}"], - "description": "Create a lazy plugin spec" + "localRequire": { + "prefix": ["preq", "lpca"], + "body": [ + "local ok_${1/.*\\.(.*)|.*/$1/}, ${1/.*\\.(.*)|.*/$1/} = pcall(require, '${1:module}')" + ], + "description": "Pcall require" }, - "modConfig": { - "prefix": "modc", + "localRequireWithIf": { + "prefix": ["preqi", "lpcai"], "body": [ - "---@type LazySpec", - "return {", - "\t'$1'", - "\tconfig = function()\n$0\n\tend", - "}" + "local ok_${1}, ${1/.*\\.(.*)|.*/$1/} = pcall(require, '${1:module}')", + "if ok_${1} then\n\t${2:return}\nend" ], - "description": "Create a lazy plugin spec - config" + "description": "Pcall require(with if)" }, - "plugin": { - "prefix": "plug", - "body": ["---@type LazySpec", "return {", "\t'$1'", "\topts = {$2}", "}"], + "mod": { + "prefix": ["mod", "plug"], + "body": ["---@type LazySpec", "return {", "\t'$1',", "\topts = {}", "}"], "description": "Create a lazy plugin spec" }, - "pluginConfig": { - "prefix": "plugc", + "modConfig": { + "prefix": ["modc", "plugc"], "body": [ "---@type LazySpec", "return {", - "\t'$1'", + "\t'$1',", "\tconfig = function()\n$0\n\tend", "}" ], diff --git a/.config/nvim/snippets/package.json b/.config/nvim/snippets/package.json index 4c400a9..32eedad 100644 --- a/.config/nvim/snippets/package.json +++ b/.config/nvim/snippets/package.json @@ -1,8 +1,4 @@ { - "name": "my-snippets", - "engines": { - "vscode": "^1.11.0" - }, "contributes": { "snippets": [ { @@ -25,5 +21,9 @@ "path": "./typescriptreact.json" } ] - } + }, + "engines": { + "vscode": "^1.11.0" + }, + "name": "my-snippets" } diff --git a/.config/nvim/vim.toml b/.config/nvim/vim.toml deleted file mode 100644 index 77b3b7f..0000000 --- a/.config/nvim/vim.toml +++ /dev/null @@ -1,55 +0,0 @@ -[selene] -base = "lua51" -name = "vim" - -[vim] -any = true - -[[describe.args]] -type = "string" -[[describe.args]] -type = "function" - -[[it.args]] -type = "string" -[[it.args]] -type = "function" - -[[before_each.args]] -type = "function" -[[after_each.args]] -type = "function" - -[assert.is_not] -any = true - -[assert.matches] -any = true - -[assert.has_error] -any = true - -[[assert.equals.args]] -type = "any" -[[assert.equals.args]] -type = "any" -[[assert.equals.args]] -type = "any" -required = false - -[[assert.same.args]] -type = "any" -[[assert.same.args]] -type = "any" - -[[assert.truthy.args]] -type = "any" - -[[assert.falsy.args]] -type = "any" - -[[assert.spy.args]] -type = "any" - -[[assert.stub.args]] -type = "any" diff --git a/.config/spectrwm/spectrwm.conf b/.config/spectrwm/spectrwm.conf deleted file mode 100644 index d9692a8..0000000 --- a/.config/spectrwm/spectrwm.conf +++ /dev/null @@ -1,167 +0,0 @@ -bar_font = JetBrainsMono Nerd Font:pixelsize=14:antialias=true -disable_border = 1 -focus_close = last -focus_close_wrap = 1 -focus_default = first -# focus_mode = follow -fullscreen_hide_other = 1 -maximize_hide_other = 1 -modkey = Mod4 -spawn_position = first -tile_gap = 3 -warp_focus = 1 -warp_pointer = 0 -workspace_clamp = 1 -workspace_indicator = listcurrent,listactive,listurgent,markcurrent - -border_width = 1 -region_padding = 4 -color_focus = rgb:67/90/eb -color_focus_maximized = rgb:ff/a5/00 -color_unfocus = rgb:88/88/88 -color_unfocus_maximized = rgb:88/88/00 - -bar_action = ~/.config/polybar/launch.sh -bar_action_expand = 1 -bar_enabled = 0 -bar_border_width = 2 -bar_border[1] = rgb:28/2a/36 -bar_border_unfocus[1] = rgb:28/2a/36 -bar_color[1] = rgb:28/2a/36, rgb:00/80/80 -bar_color_selected[1] = rgb:00/80/80 -bar_delay = 1 -bar_font_color[1] = rgb:bb/c5/ff, rgb:e1/ac/ff, rgb:dd/ff/a7, rgb:ff/8b/92, rgb:ff/e5/85, rgb:89/dd/ff -bar_font_color_selected = black -bar_justify = center -bar_format = +N:+I +S (+D) | +A -workspace_indicator = listcurrent,listactive,markcurrent,printnames -bar_at_bottom = 0 -stack_enabled = 1 -clock_enabled = 1 -clock_format = %a %b %d %R %Z %Y -iconic_enabled = 0 -maximize_hide_bar = 0 -window_class_enabled = 1 -window_instance_enabled = 1 -window_name_enabled = 1 -verbose_layout = 1 -urgent_enabled = 1 - -bind[float_toggle] = MOD+s -bind[fullscreen_toggle] = MOD+f -bind[maximize_toggle] = MOD+m -bind[focus_next] = MOD+j -bind[focus_next] = Mod1+Tab -bind[focus_prev] = MOD+k -bind[focus_prev] = Mod1+Shift+Tab -bind[focus_urgent] = MOD+u -bind[bar_toggle] = MOD+b -bind[bar_toggle_ws] = MOD+Shift+b -bind[cycle_layout] = MOD+space -bind[height_grow] = MOD+Shift+equal -bind[height_shrink] = MOD+Shift+minus -bind[width_grow] = MOD+equal -bind[width_shrink] = MOD+minus -bind[master_grow] = MOD+l -bind[master_shrink] = MOD+h -bind[swap_main] = MOD+Shift+m - - -bind[wind_del] = MOD+Shift+q -bind[wind_kill] = MOD+Control+q -bind[raise] = MOD+Shift+r -bind[quit] = MOD+Control+x -bind[restart] = MOD+Control+r -bind[mvws_1] = MOD+Shift+1 -bind[mvws_2] = MOD+Shift+2 -bind[mvws_3] = MOD+Shift+3 -bind[mvws_4] = MOD+Shift+4 -bind[mvws_5] = MOD+Shift+5 -bind[mvws_6] = MOD+Shift+6 -bind[mvws_7] = MOD+Shift+7 -bind[mvws_8] = MOD+Shift+8 -bind[mvws_9] = MOD+Shift+9 -bind[mvws_10] = MOD+Shift+0 -bind[ws_1] = MOD+1 -bind[ws_2] = MOD+2 -bind[ws_3] = MOD+3 -bind[ws_4] = MOD+4 -bind[ws_5] = MOD+5 -bind[ws_6] = MOD+6 -bind[ws_7] = MOD+7 -bind[ws_8] = MOD+8 -bind[ws_9] = MOD+9 -bind[ws_10] = MOD+0 - -bind[swap_next] = MOD+Shift+j -bind[swap_prev] = MOD+Shift+k -bind[ws_next] = MOD+Right -bind[ws_next] = MOD+grave -bind[ws_next] = MOD+apostrophe -bind[ws_next_move] = MOD+Shift+Right -bind[ws_next_move] = MOD+Shift+grave -bind[ws_next_move] = MOD+Shift+apostrophe -bind[ws_prev] = MOD+Left -bind[ws_prev] = MOD+Shift+grave -bind[ws_prev] = MOD+semicolon -bind[ws_prev_move] = MOD+Shift+Left -bind[ws_prev_move] = MOD+Shift+semicolon -bind[ws_next_all] = MOD+bracketright -bind[ws_next_move] = MOD+Shift+bracketright -bind[ws_prev_all] = MOD+bracketleft -bind[ws_prev_move] = MOD+Shift+bracketleft -bind[ws_prior] = MOD+Tab - -program[term] = alacritty -bind[term] = MOD+Return -program[kitty] = kitty -bind[kitty] = MOD+Shift+Return -program[thunar] = thunar -bind[thunar] = MOD+e -program[lfv] = kitty -e lfv -bind[lfv] = MOD+Shift+e -program[firefox] = firefox -bind[firefox] = MOD+w -program[ungoogle] = flatpak run com.github.Eloston.UngoogledChromium -bind[ungoogle] = MOD+Shift+w -program[calculator] = bash -c 'qalculate-gtk || gnome-calculator || galculator || notify-send "Error" "Calculator App not installed" -u critical' -bind[calculator] = MOD+g -program[rofirun] = rofi -show run -async-pre-read 10 -config ~/.config/rofi/dmenu.rasi -bind[rofirun] = MOD+d -program[rofidrun] = rofi -show drun -async-pre-read 10 -bind[rofidrun] = MOD+r -program[clipboard] = clipboard -bind[clipboard] = MOD+y -program[logout] = logout_prompt -bind[logout] = MOD+Control+s -program[classname] = get-class-name -bind[classname] = Mod1+Control+c -program[pavucontrol] = bash -c 'pavucontrol || pavucontrol-qt' -bind[pavucontrol] = Mod1+Control+v -program[rofimoji] = rofie -bind[rofimoji] = Mod1+Control+e -program[screenss] = flameshot gui -bind[screenss] = F1 -program[volup] = audio inc -bind[volup] = XF86AudioRaiseVolume -program[voldown] = audio dec -bind[voldown] = XF86AudioLowerVolume -program[volmute] = audio toggle -bind[volmute] = XF86AudioMute -program[brightup] = bash -c 'brightnessctl s 10+ && notify-send "Brightness: " -t 2000 -i display-brightness -h int:value:$(brightnessctl g) -h string:x-canonical-private-synchronous:backlight && polybar-msg hook mbrightness 1' -bind[brightup] = XF86MonBrightnessUp -program[brightdown] = bash -c 'brightnessctl s 10- && notify-send "Brightness: " -t 2000 -i display-brightness -h int:value:$(brightnessctl g) -h string:x-canonical-private-synchronous:backlight && polybar-msg hook mbrightness 1' -bind[brightdown] = XF86MonBrightnessDown - -# Unbind lock command -bind[] = MOD+Shift+Delete - -quirk[Firefox:Navigator] = FLOAT -quirk[firefox:Navigator] = FLOAT -quirk[mpv] = FULLSCREEN + WS[3] -quirk[firefox] = WS[2] + FOCUSONMAP_SINGLE -quirk[Firefox] = WS[2] + FOCUSONMAP_SINGLE -quirk[floorp] = WS[2] + FOCUSONMAP_SINGLE -quirk[Floorp] = WS[2] + FOCUSONMAP_SINGLE -quirk[Chromium] = WS[2] + FOCUSONMAP_SINGLE -quirk[Chromium-browser] = WS[2] + FOCUSONMAP_SINGLE diff --git a/.config/tmux-bkp/base.conf b/.config/tmux-bkp/base.conf deleted file mode 100644 index 90029f2..0000000 --- a/.config/tmux-bkp/base.conf +++ /dev/null @@ -1,68 +0,0 @@ -# vim:fileencoding=utf-8:ft=tmux:foldmethod=marker:foldlevel=99 - -# Refresh status line every 5 seconds - Good for when music is playing / update time etc -set -g status-interval 10 - -set-option -g detach-on-destroy off - -# Focus events will trigger autoread inside vim -set -g focus-events on - -# vi is good -setw -g mode-keys vi - -# mouse behavior -setw -g mouse on -set -g -s set-clipboard on - -# Set the default terminal mode to 256color mode -# set -g default-terminal "tmux-256color" -# set -g default-terminal "screen-256color" -set -g default-terminal "xterm-256color" -set -ag terminal-features ":UTF8" -set -ag terminal-overrides ",xterm-256color:Tc" -set -ag terminal-overrides ",alacritty:RGB" -set -g -a terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q' - -# Start window and pane indices at 1. -set -g base-index 1 -set -g pane-base-index 1 - -setw -g history-limit 50000000 - -set-window-option -g xterm-keys on -set-option -g renumber-windows on - -set -sg escape-time 0 -# word separators for automatic word selection -setw -g word-separators ' @"=()[]' -setw -ag word-separators "'" - -# Tmux-yank Settings {{{ - -# Default mouse selection yanks to primary, dont want that -# set -g @yank_selection_mouse 'clipboard' -# tmux-yank will exit copy mode after yanking text -# set -g @yank_action 'copy-pipe' -# set -g @yank_action 'copy-pipe-no-clear' -# set -g @yank_with_mouse on - -# }}} - -# Tmux-copycat {{{ - -# Predefined searches - -# prefix + ctrl-f - simple file search -# prefix + ctrl-g - jumping over git status files (best used after git status command) -# prefix + alt-h - jumping over SHA-1/SHA-256 hashes (best used after git log command) -# prefix + ctrl-u - url search (http, ftp and git urls) -# prefix + ctrl-d - number search (mnemonic d, as digit) -# prefix + alt-i - ip address search - -# use prefix + C-e to search for emails -# set -g @copycat_search_e "*[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}*" -# }}} - -# set -g default-command /usr/bin/fish -# set -g default-shell /usr/bin/fish diff --git a/.config/tmux-bkp/basic.tmuxtheme b/.config/tmux-bkp/basic.tmuxtheme deleted file mode 100644 index 98ec79d..0000000 --- a/.config/tmux-bkp/basic.tmuxtheme +++ /dev/null @@ -1,117 +0,0 @@ -# -# Basic theme -# - -# Themepack format options -set -goq @themepack-status-left-area-left-format "#S" -set -goq @themepack-status-left-area-middle-format "#I" -set -goq @themepack-status-left-area-right-format "#P" -set -goq @themepack-status-right-area-left-format "#H" -set -goq @themepack-status-right-area-middle-format "%I:%M %p" -set -goq @themepack-status-right-area-right-format "%d-%b-%y" -set -goq @themepack-window-status-current-format "#I:#W - #{b:pane_current_path}#F" -set -goq @themepack-window-status-format "#I:#W - #{b:pane_current_path}#F" - -# Customizable prefixes and suffixes for @themepack-* format options -set -goq @themepack-status-left-area-left-prefix "" -set -goq @themepack-status-left-area-left-suffix "" -set -goq @themepack-status-left-area-middle-prefix "" -set -goq @themepack-status-left-area-middle-suffix "" -set -goq @themepack-status-left-area-right-prefix "" -set -goq @themepack-status-left-area-right-suffix "" -set -goq @themepack-status-right-area-left-prefix "" -set -goq @themepack-status-right-area-left-suffix "" -set -goq @themepack-status-right-area-middle-prefix "" -set -goq @themepack-status-right-area-middle-suffix "" -set -goq @themepack-status-right-area-right-prefix "" -set -goq @themepack-status-right-area-right-suffix "" -set -goq @themepack-window-status-current-prefix "" -set -goq @themepack-window-status-current-suffix "" -set -goq @themepack-window-status-prefix "" -set -goq @themepack-window-status-suffix "" - -# Apply prefixes and suffixes to @themepack-* format options -set -gqF @themepack-status-left-area-left-format "#{@themepack-status-left-area-left-prefix}#{@themepack-status-left-area-left-format}#{@themepack-status-left-area-left-suffix}" -set -gqF @themepack-status-left-area-middle-format "#{@themepack-status-left-area-middle-prefix}#{@themepack-status-left-area-middle-format}#{@themepack-status-left-area-middle-suffix}" -set -gqF @themepack-status-left-area-right-format "#{@themepack-status-left-area-right-prefix}#{@themepack-status-left-area-right-format}#{@themepack-status-left-area-right-suffix}" -set -gqF @themepack-status-right-area-left-format "#{@themepack-status-right-area-left-prefix}#{@themepack-status-right-area-left-format}#{@themepack-status-right-area-left-suffix}" -set -gqF @themepack-status-right-area-middle-format "#{@themepack-status-right-area-middle-prefix}#{@themepack-status-right-area-middle-format}#{@themepack-status-right-area-middle-suffix}" -set -gqF @themepack-status-right-area-right-format "#{@themepack-status-right-area-right-prefix}#{@themepack-status-right-area-right-format}#{@themepack-status-right-area-right-suffix}" -set -gqF @themepack-window-status-current-format "#{@themepack-window-status-current-prefix}#{@themepack-window-status-current-format}#{@themepack-window-status-current-suffix}" -set -gqF @themepack-window-status-format "#{@themepack-window-status-prefix}#{@themepack-window-status-format}#{@themepack-window-status-suffix}" - -# Theme options -set -goq @theme-clock-mode-colour red -set -goq @theme-clock-mode-style 24 -set -goq @theme-display-panes-active-colour default -set -goq @theme-display-panes-colour default -set -goq @theme-message-bg default -set -goq @theme-message-command-bg default -set -goq @theme-message-command-fg default -set -goq @theme-message-fg default -set -goq @theme-mode-bg red -set -goq @theme-mode-fg default -set -goq @theme-pane-active-border-bg default -set -goq @theme-pane-active-border-fg green -set -goq @theme-pane-border-bg default -set -goq @theme-pane-border-fg default -set -goq @theme-status-bg black -set -goq @theme-status-fg cyan -set -goq @theme-status-interval 1 -set -goq @theme-status-justify centre -set -goqF @theme-status-left "#{@themepack-status-left-area-left-format} #[fg=white]» #[fg=yellow]#{@themepack-status-left-area-middle-format} #[fg=cyan]#{@themepack-status-left-area-right-format}" -set -goq @theme-status-left-bg black -set -goq @theme-status-left-fg green -set -goq @theme-status-left-length 40 -set -goqF @theme-status-right "#{@themepack-status-right-area-left-format} #[fg=white]« #[fg=yellow]#{@themepack-status-right-area-middle-format} #[fg=green]#{@themepack-status-right-area-right-format}" -set -goq @theme-status-right-bg black -set -goq @theme-status-right-fg cyan -set -goq @theme-status-right-length 40 -set -goq @theme-window-status-activity-bg black -set -goq @theme-window-status-activity-fg yellow -set -goq @theme-window-status-current-bg red -set -goq @theme-window-status-current-fg black -set -goqF @theme-window-status-current-format " #{@themepack-window-status-current-format} " -set -goqF @theme-window-status-format " #{@themepack-window-status-format} " -set -goq @theme-window-status-separator "" - -# Customizable prefixes and suffixes for @theme-* format options -set -goq @theme-status-left-prefix "" -set -goq @theme-status-left-suffix "" -set -goq @theme-status-right-prefix "" -set -goq @theme-status-right-suffix "" -set -goq @theme-window-status-current-prefix "" -set -goq @theme-window-status-current-suffix "" -set -goq @theme-window-status-prefix "" -set -goq @theme-window-status-suffix "" - -# Apply prefixes and suffixes to @theme-* format options -set -gqF @theme-status-left "#{@theme-status-left-prefix}#{@theme-status-left}#{@theme-status-left-suffix}" -set -gqF @theme-status-right "#{@theme-status-right-prefix}#{@theme-status-right}#{@theme-status-right-suffix}" -set -gqF @theme-window-status-current-format "#{@theme-window-status-current-prefix}#{@theme-window-status-current-format}#{@theme-window-status-current-suffix}" -set -gqF @theme-window-status-format "#{@theme-window-status-prefix}#{@theme-window-status-format}#{@theme-window-status-suffix}" - -# Apply @theme-* options to Tmux -set -gF display-panes-active-colour "#{@theme-display-panes-active-colour}" -set -gF display-panes-colour "#{@theme-display-panes-colour}" -set -gF message-command-style "fg=#{@theme-message-command-fg},bg=#{@theme-message-command-bg}" -set -gF message-style "fg=#{@theme-message-fg},bg=#{@theme-message-bg}" -set -gF status-interval "#{@theme-status-interval}" -set -gF status-justify "#{@theme-status-justify}" -set -gF status-left "#{@theme-status-left}" -set -gF status-left-length "#{@theme-status-left-length}" -set -gF status-left-style "fg=#{@theme-status-left-fg},bg=#{@theme-status-left-bg}" -set -gF status-right "#{@theme-status-right}" -set -gF status-right-length "#{@theme-status-right-length}" -set -gF status-right-style "fg=#{@theme-status-right-fg},bg=#{@theme-status-right-bg}" -set -gF status-style "fg=#{@theme-status-fg},bg=#{@theme-status-bg}" -set -gwF clock-mode-colour "#{@theme-clock-mode-colour}" -set -gwF clock-mode-style "#{@theme-clock-mode-style}" -set -gwF mode-style "fg=#{@theme-mode-fg},bg=#{@theme-mode-bg}" -set -gwF pane-active-border-style "fg=#{@theme-pane-active-border-fg},bg=#{@theme-pane-active-border-bg}" -set -gwF pane-border-style "fg=#{@theme-pane-border-fg},bg=#{@theme-pane-border-bg}" -set -gwF window-status-activity-style "fg=#{@theme-window-status-activity-fg},bg=#{@theme-window-status-activity-bg}" -set -gwF window-status-current-format "#{@theme-window-status-current-format}" -set -gwF window-status-current-style "fg=#{@theme-window-status-current-fg},bg=#{@theme-window-status-current-bg}" -set -gwF window-status-format "#{@theme-window-status-format}" -set -gwF window-status-separator "#{@theme-window-status-separator}" diff --git a/.config/tmux-bkp/keybind.conf b/.config/tmux-bkp/keybind.conf deleted file mode 100644 index 4ab4340..0000000 --- a/.config/tmux-bkp/keybind.conf +++ /dev/null @@ -1,90 +0,0 @@ -# vim:fileencoding=utf-8:ft=tmux:foldmethod=marker - -set-option -g prefix C-s -unbind-key C-a -bind-key C-s send-prefix - -# Easy config reload -unbind r -bind-key r source-file ~/.config/tmux/tmux.conf \; display-message "tmux.conf reloaded." - -bind-key space next-window -bind-key bspace previous-window -bind-key enter next-layout - -bind-key : command-prompt -bind-key R refresh-client -bind-key L clear-history - -# use vim-like keys for splits and windows -bind-key v split-window -h -c "#{pane_current_path}" -bind-key s split-window -v -c "#{pane_current_path}" -bind-key h select-pane -L -bind-key j select-pane -D -bind-key k select-pane -U -bind-key l select-pane -R - -bind-key C-o rotate-window - -bind-key + select-layout main-horizontal -bind-key = select-layout main-vertical - -# Selection with mouse should copy to clipboard right away, in addition to the default action. -# unbind -n -Tcopy-mode-vi MouseDragEnd1Pane -# bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-selection-and-cancel\; run "tmux save-buffer - | xclip -r -i -sel clipboard > /dev/null" - -# Setup 'v' to begin selection as in Vim -unbind -T copy-mode-vi y -bind -T copy-mode-vi v send -X begin-selection -bind -T copy-mode-vi i send -X cancel -bind -T copy-mode-vi Y send-keys -X copy-line -bind -T copy-mode-vi y send -X copy-pipe-and-cancel "xclip -i -sel clip" -bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -i -sel clip" - -# Update default binding of `Enter` to also use copy-pipe -# unbind -T copy-mode-vi Enter -# bind-key -T copy-mode-vi Enter send -X copy-pipe-and-cancel "xclip -sel clip -i" -# Moving between windows, gnome-terminal style -bind -n C-PgUp select-window -t :- -bind -n C-M-j select-window -t :- -bind -n C-PgDn select-window -t :+ -bind -n C-M-k select-window -t :+ - -# open new window gnome-terminal style -bind-key t new-window -c "#{pane_current_path}" -bind-key -n M-t new-window -bind-key x kill-window -bind-key q kill-pane - -# move windows forward and backwards, gnome-terminal style -bind-key -n C-S-Left swap-window -t -1 -bind-key -n C-S-Right swap-window -t +1 - -# Pane resizing -bind -r H resize-pane -L 5 -bind -r J resize-pane -D 5 -bind -r K resize-pane -U 5 -bind -r L resize-pane -R 5 -bind-key -n M-Up resize-pane -U 5 -bind-key -n M-Down resize-pane -D 5 -bind-key -n M-Left resize-pane -L 5 -bind-key -n M-Right resize-pane -R 5 - -bind-key -n M-1 select-window -t 1 -bind-key -n M-2 select-window -t 2 -bind-key -n M-3 select-window -t 3 -bind-key -n M-4 select-window -t 4 - -bind -n MouseDown2Pane run "tmux set-buffer -b primary_selection \"$(xclip -r -o -sel clip)\"; tmux paste-buffer; tmux delete-buffer" - -# Searching using fzf -# URl open -bind C-u run -b "tmux capture-pane -J -p | grep -oE '(https?):\/\/.*[^>]' | fzf-tmux --prompt='open link => ' -d20 --multi --bind alt-a:select-all,alt-d:deselect-all | xargs -r xdg-open" -# URL copy -bind C-y run -b "xclip -r -i -sel clip <(tmux capture-pane -J -p | grep -oE '(https?):\/\/.*[^>]' | fzf-tmux --prompt='copy link => ' -d20 --multi --bind alt-a:select-all,alt-d:deselect-all | xargs -r)" -# EMAIl copy -bind C-e run -b "xclip -r -i -sel clip <(tmux capture-pane -J -p | grep -oE '*[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}*' | fzf-tmux --prompt='copy email => ' -d20 --multi --bind alt-a:select-all,alt-d:deselect-all | xargs -r)" -# IP paste -bind C-i run -b "tmux set-buffer -b primary_selection \"$(tmux capture-pane -J -p | grep -oE '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' | fzf-tmux -d20 --multi --bind alt-a:select-all,alt-d:deselect-all)\"; tmux paste-buffer; tmux delete-buffer" -# Filename paste -bind C-f run -b "tmux set-buffer -b primary_selection \"$(tmux capture-pane -J -p | grep -oE '(^|^\.|[[:space:]]|[[:space:]]\.|[[:space:]]\.\.|^\.\.)[[:alnum:]~_-]*/[][[:alnum:]_.#$%&+=/@-]*' | fzf-tmux -d20 --multi --bind alt-a:select-all,alt-d:deselect-all)\"; tmux paste-buffer; tmux delete-buffer" diff --git a/.config/tmux-bkp/plug.conf b/.config/tmux-bkp/plug.conf deleted file mode 100644 index 02198b1..0000000 --- a/.config/tmux-bkp/plug.conf +++ /dev/null @@ -1,6 +0,0 @@ -# vim:fileencoding=utf-8:ft=tmux:foldmethod=marker -# List of plugins -set -g @plugin 'tmux-plugins/tpm' - -set -g @plugin 'tmux-plugins/tmux-copycat' -set -g @plugin 'tmux-plugins/tmux-yank' diff --git a/.config/tmux-bkp/tmux.conf b/.config/tmux-bkp/tmux.conf deleted file mode 100644 index 8a0bc64..0000000 --- a/.config/tmux-bkp/tmux.conf +++ /dev/null @@ -1,10 +0,0 @@ -# vim:fileencoding=utf-8:ft=tmux:foldmethod=marker -# source-file ~/.config/tmux/plug.conf - -source-file ~/.config/tmux/base.conf -source-file ~/.config/tmux/basic.tmuxtheme -# run -b ~/Downloads/Gits/tmux-themes/dracula-tmux/dracula.tmux -source-file ~/.config/tmux/keybind.conf - -# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf) -# run '~/.config/tmux/plugins/tpm/tpm' diff --git a/.config/tmux/tmux.conf b/.config/tmux/tmux.conf index e12cf9a..e3ea98e 100644 --- a/.config/tmux/tmux.conf +++ b/.config/tmux/tmux.conf @@ -2,6 +2,7 @@ setw -g mode-keys vi set-option -g prefix C-s unbind-key C-a bind-key C-s send-prefix +bind-key -T prefix C-s send-keys C-s setw -g mouse on set -g detach-on-destroy off @@ -67,7 +68,7 @@ set -g @plugin 'catppuccin/tmux' set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-sensible' set -g @plugin 'tmux-plugins/tmux-yank' -set -g @plugin 'tmux-plugins/tmux-resurrect' +# set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'Morantron/tmux-fingers' # set -g @plugin 'tmux-plugins/tmux-continuum' # set -g @plugin 'christoomey/vim-tmux-navigator' @@ -75,8 +76,8 @@ setenv -g TMUX_PLUGIN_MANAGER_PATH "$HOME/.config/tmux/plugins/" 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'" run -b '~/.config/tmux/plugins/tpm/tpm' -set -g default-command /bin/fish -set -g default-shell /bin/fish +# set -g default-command /bin/fish +# set -g default-shell /bin/fish set -g set-clipboard on # set -g @override_copy_command 'xclip -i -r -sel clip' diff --git a/.config/wezterm/wezterm.lua b/.config/wezterm/wezterm.lua index dcf6faa..3a06230 100644 --- a/.config/wezterm/wezterm.lua +++ b/.config/wezterm/wezterm.lua @@ -1,68 +1,182 @@ +-- -- Pull in the wezterm API +-- local wezterm = require "wezterm" +-- local session_manager = require "session-manager" +-- local bar = wezterm.plugin.require "https://github.com/adriankarlen/bar.wezterm" +-- +-- -- This table will hold the configuration. +-- local config = {} +-- local keys = {} +-- local alt_keys = {} +-- -- In newer versions of wezterm, use the config_builder which will +-- -- help provide clearer error messages +-- if wezterm.config_builder then +-- config = wezterm.config_builder() +-- end +-- -- For example, changing the color scheme: +-- config.color_scheme = "Ayu Mirage" -- Everforest Dark Hard (Gogh) +-- config.colors = { background = "#14131A" } +-- config.window_background_opacity = 0.95 +-- config.scrollback_lines = 13500 +-- +-- config.font_size = 12.5 +-- config.font = wezterm.font_with_fallback({ +-- -- "Iosevka SP Extended", +-- "FiraCode Nerd Font", +-- -- "RecMonoDuotone Nerd Font", +-- -- "CaskaydiaCove Nerd Font", +-- "JetBrainsMono Nerd Font", +-- "FontAwesome", +-- }) +-- +-- config.hyperlink_rules = wezterm.default_hyperlink_rules() +-- +-- for i = 1, 8 do +-- -- ALT + number to activate that tab +-- table.insert(keys, { +-- key = tostring(i), +-- mods = "ALT", +-- action = wezterm.action.ActivateTab(i - 1), +-- }) +-- table.insert(alt_keys, { +-- key = tostring(i), +-- mods = "ALT", +-- action = wezterm.action.ActivateTab(i - 1), +-- }) +-- end +-- +-- config.keys = alt_keys +-- +-- -- bar.apply_to_config(config, { +-- -- position = "top", +-- -- modules = { +-- -- workspace = { enabled = false }, +-- -- clock = { enabled = false }, +-- -- hostname = { enabled = false }, +-- -- username = { enabled = false }, +-- -- }, +-- -- }) +-- -- tab bar +-- config.hide_tab_bar_if_only_one_tab = false +-- config.tab_bar_at_bottom = false +-- config.use_fancy_tab_bar = false +-- config.tab_and_split_indices_are_zero_based = true +-- +-- local function get_current_working_dir(tab) +-- local pane = tab.active_pane +-- local current_dir = pane and pane.current_working_dir or { file_path = "" } +-- local HOME_DIR = os.getenv "HOME" +-- +-- return current_dir.file_path == HOME_DIR and "~" or string.gsub(current_dir.file_path, "(.*[/\\])(.*)", "%2") +-- end +-- +-- wezterm.on("update-right-status", function(window, _) +-- local SOLID_LEFT_ARROW = "" +-- local ARROW_FOREGROUND = { Foreground = { Color = "#c6a0f6" } } +-- local prefix = "" +-- +-- if window:leader_is_active() then +-- prefix = " " .. utf8.char(0x1f30a) -- ocean wave +-- SOLID_LEFT_ARROW = utf8.char(0xe0b2) +-- end +-- +-- if window:active_tab():tab_id() ~= 0 then +-- ARROW_FOREGROUND = { Foreground = { Color = "#1e2030" } } +-- end -- arrow color based on if tab is first pane +-- +-- window:set_left_status(wezterm.format({ +-- { Background = { Color = "#b7bdf8" } }, +-- { Text = prefix }, +-- { Text = get_current_working_dir(window:active_tab()) }, +-- ARROW_FOREGROUND, +-- { Text = SOLID_LEFT_ARROW }, +-- })) +-- end) +-- +-- return config +-- WezTerm Keybindings Documentation by dragonlobster +-- =================================================== +-- Leader Key: +-- The leader key is set to ALT + q, with a timeout of 2000 milliseconds (2 seconds). +-- To execute any keybinding, press the leader key (ALT + q) first, then the corresponding key. + +-- Keybindings: +-- 1. Tab Management: +-- - LEADER + c: Create a new tab in the current pane's domain. +-- - LEADER + x: Close the current pane (with confirmation). +-- - LEADER + b: Switch to the previous tab. +-- - LEADER + n: Switch to the next tab. +-- - LEADER + : Switch to a specific tab (0–9). + +-- 2. Pane Splitting: +-- - LEADER + |: Split the current pane horizontally into two panes. +-- - LEADER + -: Split the current pane vertically into two panes. + +-- 3. Pane Navigation: +-- - LEADER + h: Move to the pane on the left. +-- - LEADER + j: Move to the pane below. +-- - LEADER + k: Move to the pane above. +-- - LEADER + l: Move to the pane on the right. + +-- 4. Pane Resizing: +-- - LEADER + LeftArrow: Increase the pane size to the left by 5 units. +-- - LEADER + RightArrow: Increase the pane size to the right by 5 units. +-- - LEADER + DownArrow: Increase the pane size downward by 5 units. +-- - LEADER + UpArrow: Increase the pane size upward by 5 units. + +-- 5. Status Line: +-- - The status line indicates when the leader key is active, displaying an ocean wave emoji (🌊). + +-- Miscellaneous Configurations: +-- - Tabs are shown even if there's only one tab. +-- - The tab bar is located at the bottom of the terminal window. +-- - Tab and split indices are zero-based. + -- Pull in the wezterm API local wezterm = require "wezterm" -local session_manager = require "session-manager" -- This table will hold the configuration. local config = {} -local keys = {} -local alt_keys = {} + -- In newer versions of wezterm, use the config_builder which will -- help provide clearer error messages if wezterm.config_builder then config = wezterm.config_builder() end + -- For example, changing the color scheme: -config.color_scheme = "ChallengerDeep" -- Everforest Dark Hard (Gogh) -config.colors = { - background = "#14131A", -} --- Spawn a fish shell in login mode --- config.default_prog = { "/bin/fish", "-l" } +config.color_scheme = "Ashes (dark) (terminal.sexy)" +-- config.colors = { background = "#14131A" } -config.font_size = 11.5 config.font = wezterm.font_with_fallback({ "FiraCode Nerd Font", "JetBrainsMono Nerd Font", "FontAwesome", }) +config.window_background_opacity = 0.95 +config.font_size = 13 config.harfbuzz_features = { "calt=0", "clig=0", "liga=0" } config.switch_to_last_active_tab_when_closing_tab = true - --- default is true, has more "native" look -config.use_fancy_tab_bar = false -config.enable_wayland = false --- config.front_end = "OpenGL" -config.hide_tab_bar_if_only_one_tab = true -config.window_background_opacity = 0.93 --- I don't like putting anything at the ege if I can help it. -config.enable_scroll_bar = false +config.scrollback_lines = 10000 config.check_for_updates = false +config.default_cursor_style = "SteadyBar" + config.window_padding = { left = 0, right = 0, top = 0, bottom = 0, } -config.tab_bar_at_bottom = true -config.freetype_load_target = "Light" -config.hyperlink_rules = wezterm.default_hyperlink_rules() -config.mouse_bindings = { - -- { event = { Up = { streak = 1, button = 'Left' } }, mods = 'NONE', action = wezterm.action.CompleteSelection('PrimarySelection'), }, - { event = { Up = { streak = 1, button = "Left" } }, mods = "CTRL", action = wezterm.action.OpenLinkAtMouseCursor }, -} -config.default_cursor_style = "SteadyBar" -wezterm.on("save_session", function(window) - session_manager.save_state(window) -end) -wezterm.on("load_session", function(window) - session_manager.load_state(window) -end) -wezterm.on("restore_session", function(window) - session_manager.restore_state(window) -end) +local alt_keys = {} +for i = 1, 8 do + -- ALT + number to activate that tab + table.insert(alt_keys, { + key = tostring(i), + mods = "ALT", + action = wezterm.action.ActivateTab(i - 1), + }) +end --- table.insert(alt_keys, { key = "q", mods = "ALT", action = wezterm.action.CloseCurrentPane({ confirm = false }) }) table.insert(alt_keys, { key = "c", mods = "ALT", action = wezterm.action.CloseCurrentPane({ confirm = false }) }) table.insert(alt_keys, { key = "x", mods = "ALT", action = wezterm.action.CloseCurrentTab({ confirm = false }) }) table.insert(alt_keys, { key = "j", mods = "ALT", action = wezterm.action.ActivatePaneDirection "Down" }) @@ -86,8 +200,6 @@ table.insert( alt_keys, { key = "s", mods = "ALT", action = wezterm.action.SplitVertical({ domain = "CurrentPaneDomain" }) } ) --- table.insert(alt_keys, { key = "j", mods = "ALT|SHIFT", action = wezterm.action.ActivatePaneDirection "Next" }) --- table.insert(alt_keys, { key = "k", mods = "ALT|SHIFT", action = wezterm.action.ActivatePaneDirection "Prev" }) table.insert(alt_keys, { key = "p", mods = "SHIFT|ALT", action = wezterm.action.MoveTabRelative(-1) }) table.insert(alt_keys, { key = "n", mods = "SHIFT|ALT", action = wezterm.action.MoveTabRelative(1) }) @@ -98,174 +210,104 @@ table.insert(alt_keys, { key = ".", mods = "ALT", action = wezterm.action.Activa table.insert(alt_keys, { key = "q", mods = "SHIFT|ALT", action = wezterm.action.QuickSelect }) table.insert(alt_keys, { key = "c", mods = "SHIFT|ALT", action = wezterm.action.ActivateCopyMode }) -table.insert(alt_keys, { key = "c", mods = "SHIFT|ALT", action = wezterm.action.ActivateCopyMode }) - --- table.insert(alt_keys, { key = "j", mods = "SHIFT|ALT", action = wezterm.action.RotatePanes "Clockwise" }) --- table.insert(alt_keys, { key = "k", mods = "SHIFT|ALT", action = wezterm.action.RotatePanes "CounterClockwise" }) - -table.insert(alt_keys, { key = "h", mods = "SHIFT|ALT", action = wezterm.action.AdjustPaneSize({ "Left", 5 }) }) -table.insert(alt_keys, { key = "j", mods = "SHIFT|ALT", action = wezterm.action.AdjustPaneSize({ "Down", 5 }) }) -table.insert(alt_keys, { key = "k", mods = "SHIFT|ALT", action = wezterm.action.AdjustPaneSize({ "Up", 5 }) }) -table.insert(alt_keys, { key = "l", mods = "SHIFT|ALT", action = wezterm.action.AdjustPaneSize({ "Right", 5 }) }) - -table.insert(keys, { key = "s", mods = "LEADER|CTRL", action = wezterm.action({ EmitEvent = "save_session" }) }) -table.insert(keys, { key = "r", mods = "LEADER|CTRL", action = wezterm.action({ EmitEvent = "restore_session" }) }) -table.insert(keys, { key = "l", mods = "LEADER|CTRL", action = wezterm.action({ EmitEvent = "load_session" }) }) - --- table.insert(keys, { --- key = "s", --- mods = "LEADER|CTRL", --- action = wezterm.action.SendKey({ key = "s", mods = "CTRL" }), --- }) -table.insert(keys, { key = "j", mods = "LEADER", action = wezterm.action.ActivatePaneDirection "Down" }) -table.insert(keys, { key = "k", mods = "LEADER", action = wezterm.action.ActivatePaneDirection "Up" }) -table.insert(keys, { key = "l", mods = "LEADER", action = wezterm.action.ActivatePaneDirection "Right" }) -table.insert(keys, { key = "h", mods = "LEADER", action = wezterm.action.ActivatePaneDirection "Left" }) -table.insert(keys, { key = "z", mods = "LEADER", action = wezterm.action.TogglePaneZoomState }) -table.insert(keys, { key = "t", mods = "LEADER", action = wezterm.action.SpawnTab "CurrentPaneDomain" }) -table.insert(keys, { key = "g", mods = "LEADER", action = wezterm.action.ShowTabNavigator }) -table.insert(keys, { key = "o", mods = "LEADER", action = wezterm.action.ActivateLastTab }) -table.insert(keys, { key = "p", mods = "LEADER", action = wezterm.action.PaneSelect }) -table.insert(keys, { key = "q", mods = "LEADER", action = wezterm.action.CloseCurrentPane({ confirm = false }) }) -table.insert(keys, { key = "x", mods = "LEADER", action = wezterm.action.CloseCurrentTab({ confirm = false }) }) - -table.insert( - keys, - { key = "v", mods = "LEADER", action = wezterm.action.SplitHorizontal({ domain = "CurrentPaneDomain" }) } -) -table.insert( - keys, - { key = "s", mods = "LEADER", action = wezterm.action.SplitVertical({ domain = "CurrentPaneDomain" }) } -) -table.insert(keys, { - key = "P", - mods = "LEADER|SHIFT", - action = wezterm.action.PaneSelect({ - mode = "SwapWithActive", - }), -}) - -table.insert( - keys, - { key = "Enter", mods = "CTRL|SHIFT", action = wezterm.action.SplitHorizontal({ domain = "CurrentPaneDomain" }) } -) -table.insert( - keys, - { key = "Backspace", mods = "CTRL|SHIFT", action = wezterm.action.SplitVertical({ domain = "CurrentPaneDomain" }) } -) +table.insert(alt_keys, { key = "h", mods = "SHIFT|ALT", action = wezterm.action.AdjustPaneSize({ "Left", 2 }) }) +table.insert(alt_keys, { key = "j", mods = "SHIFT|ALT", action = wezterm.action.AdjustPaneSize({ "Down", 2 }) }) +table.insert(alt_keys, { key = "k", mods = "SHIFT|ALT", action = wezterm.action.AdjustPaneSize({ "Up", 2 }) }) +table.insert(alt_keys, { key = "l", mods = "SHIFT|ALT", action = wezterm.action.AdjustPaneSize({ "Right", 2 }) }) -table.insert(keys, { key = "c", mods = "CTRL|SHIFT", action = wezterm.action.CopyTo "ClipboardAndPrimarySelection" }) -table.insert(keys, { key = "v", mods = "CTRL|SHIFT", action = wezterm.action.PasteFrom "Clipboard" }) -table.insert(keys, { key = "t", mods = "SHIFT|CTRL", action = wezterm.action.SpawnTab "CurrentPaneDomain" }) -table.insert(keys, { key = "l", mods = "CTRL", action = wezterm.action.DisableDefaultAssignment }) -table.insert(keys, { key = "w", mods = "SHIFT|CTRL", action = wezterm.action.CloseCurrentTab({ confirm = false }) }) +config.keys = alt_keys -table.insert(keys, { key = "}", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection "Next" }) -table.insert(keys, { key = "{", mods = "CTRL|SHIFT", action = wezterm.action.ActivatePaneDirection "Prev" }) -table.insert(keys, { key = "{", mods = "SHIFT|ALT", action = wezterm.action.MoveTabRelative(-1) }) -table.insert(keys, { key = "}", mods = "SHIFT|ALT", action = wezterm.action.MoveTabRelative(1) }) -table.insert(keys, { key = "j", mods = "CTRL|ALT", action = wezterm.action.ActivateTabRelative(-1) }) -table.insert(keys, { key = "k", mods = "CTRL|ALT", action = wezterm.action.ActivateTabRelative(1) }) -table.insert(keys, { key = ".", mods = "LEADER", action = wezterm.action.ActivateCommandPalette }) +-- tab bar +config.hide_tab_bar_if_only_one_tab = false +config.tab_bar_at_bottom = true +config.use_fancy_tab_bar = false +config.tab_and_split_indices_are_zero_based = true local process_icons = { + ["bash"] = wezterm.nerdfonts.cod_terminal_bash, + ["btm"] = wezterm.nerdfonts.mdi_chart_donut_variant, + ["cargo"] = wezterm.nerdfonts.dev_rust, + ["curl"] = wezterm.nerdfonts.mdi_flattr, ["docker"] = wezterm.nerdfonts.linux_docker, ["docker-compose"] = wezterm.nerdfonts.linux_docker, - ["psql"] = "󱤢", - ["usql"] = "󱤢", - ["kuberlr"] = wezterm.nerdfonts.linux_docker, - ["ssh"] = wezterm.nerdfonts.fa_exchange, - ["ssh-add"] = wezterm.nerdfonts.fa_exchange, - ["kubectl"] = wezterm.nerdfonts.linux_docker, - ["stern"] = wezterm.nerdfonts.linux_docker, - ["nvim"] = wezterm.nerdfonts.custom_vim, - ["make"] = wezterm.nerdfonts.seti_makefile, - ["vim"] = wezterm.nerdfonts.dev_vim, - ["node"] = wezterm.nerdfonts.mdi_hexagon, + ["gh"] = wezterm.nerdfonts.dev_github_badge, + ["git"] = wezterm.nerdfonts.fa_git, ["go"] = wezterm.nerdfonts.seti_go, - ["python3"] = "", - ["zsh"] = wezterm.nerdfonts.dev_terminal, - ["bash"] = wezterm.nerdfonts.cod_terminal_bash, - ["btm"] = wezterm.nerdfonts.mdi_chart_donut_variant, ["htop"] = wezterm.nerdfonts.mdi_chart_donut_variant, - ["cargo"] = wezterm.nerdfonts.dev_rust, - ["sudo"] = wezterm.nerdfonts.fa_hashtag, + ["kubectl"] = wezterm.nerdfonts.linux_docker, + ["kuberlr"] = wezterm.nerdfonts.linux_docker, ["lazydocker"] = wezterm.nerdfonts.linux_docker, - ["git"] = wezterm.nerdfonts.dev_git, + ["lazygit"] = wezterm.nerdfonts.oct_git_compare, ["lua"] = wezterm.nerdfonts.seti_lua, - ["wget"] = wezterm.nerdfonts.mdi_arrow_down_box, - ["curl"] = wezterm.nerdfonts.mdi_flattr, - ["gh"] = wezterm.nerdfonts.dev_github_badge, + ["make"] = wezterm.nerdfonts.seti_makefile, + ["node"] = wezterm.nerdfonts.mdi_hexagon, + ["nvim"] = wezterm.nerdfonts.custom_vim, + ["psql"] = "󱤢", ["ruby"] = wezterm.nerdfonts.cod_ruby, + ["stern"] = wezterm.nerdfonts.linux_docker, + ["sudo"] = wezterm.nerdfonts.fa_hashtag, + ["usql"] = "󱤢", + ["vim"] = wezterm.nerdfonts.dev_vim, + ["wget"] = wezterm.nerdfonts.mdi_arrow_down_box, + ["zsh"] = wezterm.nerdfonts.dev_terminal, } -local function get_current_working_dir(tab) - local pane = tab.active_pane - local current_dir = pane and pane.current_working_dir or { file_path = "" } - local HOME_DIR = os.getenv "HOME" - return current_dir.file_path == HOME_DIR and "~" or string.gsub(current_dir.file_path, "(.*[/\\])(.*)", "%2") +-- Return the Tab's current working directory +local function get_cwd(tab) + return tab.active_pane.current_working_dir.file_path or "" end - +local function remove_abs_path(path) + return path:gsub("(.*[/\\])(.*)", "%2") +end +-- Return the pretty path of the tab's current working directory +local function get_display_cwd(tab) + local current_dir = get_cwd(tab) + local HOME_DIR = string.format("file://%s", os.getenv "HOME") + return current_dir == HOME_DIR and "~/" or remove_abs_path(current_dir) +end +-- Return the concise name or icon of the running process for display local function get_process(tab) - local pane = tab.active_pane - if not pane or pane.foreground_process_name == "" then - return nil + if not tab.active_pane or tab.active_pane.foreground_process_name == "" then + return "[?]" end - local process_name = string.gsub(pane.foreground_process_name, "(.*[/\\])(.*)", "%2") - if string.find(process_name, "kubectl") then + local process_name = remove_abs_path(tab.active_pane.foreground_process_name) + if process_name:find "kubectl" then process_name = "kubectl" end - return process_icons[process_name] or string.format("%s", process_name) + return process_icons[process_name] or string.format("[%s]", process_name) end +-- Pretty format the tab title +local function format_title(tab) + local cwd = get_display_cwd(tab) + local process = get_process(tab) -wezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width) - local has_unseen_output = false - if not tab.is_active then - for _, pane in ipairs(tab.panes) do - if pane.has_unseen_output then - has_unseen_output = true - break - end - end + local active_title = tab.active_pane.title + if active_title:find "- NVIM" then + active_title = active_title:gsub("^([^ ]+) .*", "%1") end + return string.format(" %d:%s %s ", tab.tab_index + 1, process, cwd) +end +-- Returns manually set title (from `tab:set_title()` or `wezterm cli set-tab-title`) or creates a new one +local function get_tab_title(tab) + local title = tab.tab_title + if title and #title > 0 then + return title + end + return format_title(tab) +end +wezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width) + local title = get_tab_title(tab) - local cwd = wezterm.format({ - { Text = get_current_working_dir(tab) }, - }) - - local process = get_process(tab) or "" - local title = string.format("[%s] %s ", cwd, process) or " [?] " - - if has_unseen_output then + if tab.is_active then return { - { Foreground = { Color = "#28719c" } }, + { Attribute = { Intensity = "Bold" } }, { Text = title }, } end - - return { - { Text = title }, - } + return title end) -for i = 1, 8 do - -- ALT + number to activate that tab - table.insert(keys, { - key = tostring(i), - mods = "ALT", - action = wezterm.action.ActivateTab(i - 1), - }) - table.insert(alt_keys, { - key = tostring(i), - mods = "ALT", - action = wezterm.action.ActivateTab(i - 1), - }) -end - --- config.leader = { key = "s", mods = "CTRL", timeout_milliseconds = 1000 } --- config.keys = keys -config.keys = alt_keys - +-- and finally, return the configuration to wezterm return config diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index 810e9b7..877f245 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -1,102 +1,96 @@ -# Set the directory we want to store zinit and plugins -ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git" -# Download Zinit, if it's not there yet -if [ ! -d "$ZINIT_HOME" ]; then - mkdir -p "$(dirname $ZINIT_HOME)" - git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME" -fi - -# Source/Load zinit -source "${ZINIT_HOME}/zinit.zsh" +export ZGEN_DIR=$HOME/.cache/zgendir +export ZSH_CACHE_DIR=$HOME/.cache/zsh-cache -# Add in Powerlevel10k -# zinit ice depth=1; zinit light romkatv/powerlevel10k +# WORDCHARS=${WORDCHARS//\/[&.;]} +HISTFILE=~/.cache/zhistory +ZSH_TMUX_FIXTERM=true -fpath+=~/.local/share/zsh/site-functions -autoload -Uz colors edit-command-line +zstyle ':completion:*:git-checkout:*' sort false +autoload -Uz edit-command-line # Smart Url autoload -Uz url-quote-magic zle -N self-insert url-quote-magic -autoload -Uz compinit && compinit -zt(){ zinit depth3 lucid ${1/#[0-9][a-c]/wait${1}} ${@:2}; } -# Add in zsh plugins -zinit light zdharma-continuum/fast-syntax-highlighting -zinit light zsh-users/zsh-completions -zinit light zsh-users/zsh-autosuggestions -zinit light zsh-users/zsh-history-substring-search -zinit light QuarticCat/zsh-smartcache -zinit light Aloxaf/fzf-tab -zinit ice as"command" from"gh-r" \ - atclone"./starship init zsh > init.zsh; ./starship completions zsh > _starship" \ - atpull"%atclone" src"init.zsh" -zinit light starship/starship +source "$HOME/.cache/.zgenom/zgenom.zsh" -zinit ice trigger-load!npm wait'0' lucid; zinit light lukechilds/zsh-better-npm-completion -zinit ice trigger-load!man wait'0' lucid; zinit snippet OMZP::colored-man-pages +# zgenom autoupdate --background -zinit ice wait"2" as"command" from"gh-r" lucid \ - mv"zoxide*/zoxide -> zoxide" \ - atclone"./zoxide init zsh > zo_init.zsh" \ - atpull"%atclone" src"zo_init.zsh" -zinit light ajeetdsouza/zoxide -# zinit ice wait"2" as"command" from"gh-r" lucid \ -# atclone"./fnm env --use-on-cd > fnmenv.zsh" \ -# atpull"%atclone" pick"fnm" src"fnmenv.zsh" nocompile'!' -# zinit light Schniz/fnm -# Add in snippets -zinit snippet OMZP::git -# zinit snippet OMZP::sudo -# zinit snippet OMZP::archlinux -# Load completions -# autoload -Uz compinit && compinit -zinit cdreplay -q +if ! zgenom saved; then + zgenom compdef -# History -export ZSH_CACHE_DIR=$HOME/.cache/zsh-cache -HISTSIZE=5000 -HISTFILE=~/.cache/zhistory -SAVEHIST=$HISTSIZE -HISTDUP=erase -WORDCHARS=${WORDCHARS//\/[&.;]} -setopt appendhistory -setopt sharehistory -setopt hist_ignore_space -setopt hist_ignore_all_dups -setopt hist_save_no_dups -setopt hist_ignore_dups -setopt hist_find_no_dups -setopt auto_cd -setopt auto_pushd -setopt pushd_ignore_dups -setopt pushdminus -setopt extendedglob numericglobsort + zgenom load jandamm/zgenom-ext-eval -# Completion styling -zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' -# zstyle ':completion:*' menu no -# zstyle ':completion:*' squeeze-slashes true -# zstyle ':fzf-tab:complete:cd:*' fzf-preview 'ls --color $realpath' -# disable sort when completing `git checkout` -zstyle ':completion:*:git-checkout:*' sort false -zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} -zstyle ':completion:*' menu no -zstyle ':fzf-tab:complete:cd:*' fzf-preview 'eza -1 --color=always $realpath' -zstyle ':fzf-tab:complete:__zoxide_z:*' fzf-preview 'eza -1 --color=always $realpath' -zstyle ':fzf-tab:*' switch-group '<' '>' -zinit snippet ~/Documents/dotfiles/.config/zsh/alias.zsh -zinit snippet ~/Documents/dotfiles/.config/zsh/bindings.zsh -zinit snippet ~/Documents/dotfiles/.config/zsh/mfunctions.zsh + zgenom ohmyzsh lib/git.zsh + zgenom ohmyzsh lib/completion.zsh + zgenom ohmyzsh lib/grep.zsh + zgenom ohmyzsh lib/history.zsh + zgenom ohmyzsh lib/directories.zsh + zgenom ohmyzsh plugins/colored-man-pages + + if hash git &>/dev/null; then + zgenom ohmyzsh plugins/git + zgenom ohmyzsh plugins/gitfast + fi + # if hash mise &>/dev/null; then + # zgenom ohmyzsh plugins/mise + # fi + if hash tmux &>/dev/null; then + zgenom ohmyzsh plugins/tmux + fi + if hash npm &>/dev/null; then + zgenom ohmyzsh plugins/npm + fi + if hash zoxide &>/dev/null; then + zgenom ohmyzsh plugins/zoxide + fi + if hash starship &>/dev/null; then + zgenom ohmyzsh plugins/starship + fi + if hash fzf &>/dev/null; then + zgenom ohmyzsh plugins/fzf + fi + # zgenom ohmyzsh plugins/rust + + zgenom ohmyzsh --completion plugins/docker-compose + zgenom load zsh-users/zsh-completions + zgenom load zsh-users/zsh-autosuggestions + zgenom load zsh-users/zsh-history-substring-search + zgenom load zdharma-continuum/fast-syntax-highlighting + zgenom load lukechilds/zsh-better-npm-completion + zgenom load QuarticCat/zsh-smartcache + zgenom load Aloxaf/fzf-tab + # Compile your zsh files + if test -d "$ZDOTDIR" then + zgenom compile "$ZDOTDIR" + else + zgenom compile "$HOME/.zshrc" + fi + if hash rustup &>/dev/null; then + zgenom eval --name rustup <<($HOME/.cargo/bin/rustup completions zsh) + fi -# Shell integrations -# eval "$(fnm env --use-on-cd)" -[ -x "$(which fzf)" ] && smartcache eval fzf --zsh -[ -x "$(which register-python-argcomplete)" ] && smartcache eval register-python-argcomplete pipx -[ -x "$(which mise)" ] && smartcache eval $HOME/.local/bin/mise activate zsh -[ -x "$(which rustup)" ] && smartcache comp rustup completions zsh + # if hash fnm &>/dev/null; then + # zgenom eval --name mise <<(fnm env --use-on-cd) + # fi + # if hash fzf &>/dev/null; then + # zgenom eval --name mise <<(fzf --zsh) + # fi + if hash mise &>/dev/null; then + zgenom eval --name mise <<(mise activate zsh) + fi + if hash register-python-argcomplete; &>/dev/null then + zgenom eval --name pipx <<(register-python-argcomplete pipx) + fi -# Ensure unique path -typeset -gU cdpath fpath mailpath path + zgenom save +fi + +source "$HOME/Documents/dotfiles/.config/zsh/alias.zsh" +source "$HOME/Documents/dotfiles/.config/zsh/bindings.zsh" +source "$HOME/Documents/dotfiles/.config/zsh/mfunctions.zsh" # bun completions -[ -s "/home/shubham/.local/share/bun/_bun" ] && source "/home/shubham/.local/share/bun/_bun" +[ -s "~/.bun/_bun" ] && source "~/.bun/_bun" +# zprof + +[ -f "/Users/shubham.pawar01/.ghcup/env" ] && . "/Users/shubham.pawar01/.ghcup/env" # ghcup-env diff --git a/.config/zsh/alias.zsh b/.config/zsh/alias.zsh index cd2d1f8..40b1311 100644 --- a/.config/zsh/alias.zsh +++ b/.config/zsh/alias.zsh @@ -12,8 +12,8 @@ alias lt="eza -aT --color=auto --icons --group-directories-first" # tree listing alias l="ll --no-filesize --no-permissions --no-time" alias rr="/bin/rm -rf" -alias rm="trash-put" -alias rmd="trash-put -rf" +alias rm="trash" +alias rmd="trash -rf" alias tls="trash-list" alias cls="clear" diff --git a/.emacs-profiles.el b/.emacs-profiles.el deleted file mode 100644 index f0516aa..0000000 --- a/.emacs-profiles.el +++ /dev/null @@ -1,4 +0,0 @@ -(("default" . ((user-emacs-directory . "~/.config/emacs-my"))) - ("alt" . ((user-emacs-directory . "~/.config/emacs-alt"))) - ("doom" . ((user-emacs-directory . "~/.config/emacs-doom") - (env . (("DOOMDIR" . "~/.config/doom")))))) diff --git a/neovim.yml b/neovim.yml new file mode 100644 index 0000000..55edf45 --- /dev/null +++ b/neovim.yml @@ -0,0 +1,8 @@ +--- +base: lua51 + +globals: + vim: + any: true + Snacks: + any: true diff --git a/selene.toml b/selene.toml index da20589..e7005c3 100644 --- a/selene.toml +++ b/selene.toml @@ -1 +1,8 @@ -std="vim" \ No newline at end of file +std = "neovim" + +[rules] +global_usage = "allow" +if_same_then_else = "allow" +incorrect_standard_library_use = "allow" +mixed_table = "allow" +multiple_statements = "allow" diff --git a/vim.toml b/vim.toml deleted file mode 100644 index 03abe14..0000000 --- a/vim.toml +++ /dev/null @@ -1,58 +0,0 @@ -[selene] -base = "lua51" -name = "vim" - -[vim] -any = true - -[astronvim] -any = true - -[[describe.args]] -type = "string" -[[describe.args]] -type = "function" - -[[it.args]] -type = "string" -[[it.args]] -type = "function" - -[[before_each.args]] -type = "function" -[[after_each.args]] -type = "function" - -[assert.is_not] -any = true - -[assert.matches] -any = true - -[assert.has_error] -any = true - -[[assert.equals.args]] -type = "any" -[[assert.equals.args]] -type = "any" -[[assert.equals.args]] -type = "any" -required = false - -[[assert.same.args]] -type = "any" -[[assert.same.args]] -type = "any" - -[[assert.truthy.args]] -type = "any" - -[[assert.falsy.args]] -type = "any" - -[[assert.spy.args]] -type = "any" - -[[assert.stub.args]] -type = "any"

    f2>Ia=wwnj$=bc-Mj{BH=wnmeY1DSlL;+ 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%0DZAgQjjU& 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 P00000NkvXXu0mjfeQ4(Y diff --git a/.config/awesome/widgets/calendar/dark.png b/.config/awesome/widgets/calendar/dark.png deleted file mode 100644 index 540289f0ba3275dbc1ee0d3720957b1f3dc0719d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12055 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' .. t .. '' end, - shape = rounded_shape(4) - } - - styles.header = { - fg_color = calendar_themes[theme].header_fg, - bg_color = calendar_themes[theme].bg, - markup = function(t) return '' .. t .. '' end - } - - styles.weekday = { - fg_color = calendar_themes[theme].weekday_fg, - bg_color = calendar_themes[theme].bg, - markup = function(t) return '' .. t .. '' end, - } - - local function decorate_cell(widget, flag, date) - if flag == 'monthheader' and not styles.monthheader then - flag = 'header' - end - - -- highlight only today's day - if flag == 'focus' then - local today = os.date('*t') - if not (today.month == date.month and today.year == date.year) then - flag = 'normal' - end - 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 d = { year = date.year, month = (date.month or 1), day = (date.day or 1) } - local weekday = tonumber(os.date('%w', os.time(d))) - local default_bg = (weekday == 0 or weekday == 6) - and calendar_themes[theme].weekend_day_bg - or calendar_themes[theme].bg - local ret = wibox.widget { - { - { - widget, - halign = 'center', - widget = wibox.container.place - }, - margins = (props.padding or 2) + (props.border_width or 0), - widget = wibox.container.margin - }, - shape = props.shape, - shape_border_color = props.border_color or '#000000', - shape_border_width = props.border_width or 0, - fg = props.fg_color or calendar_themes[theme].fg, - bg = props.bg_color or default_bg, - widget = wibox.container.background - } - - return ret - end - - local cal = wibox.widget { - date = os.date('*t'), - font = beautiful.get_font(), - fn_embed = decorate_cell, - long_weekdays = true, - start_sunday = start_sunday, - widget = wibox.widget.calendar.month - } - - local popup = awful.popup { - ontop = true, - visible = false, - shape = rounded_shape(radius), - offset = { y = 5 }, - border_width = 1, - border_color = calendar_themes[theme].border, - widget = cal - } - - popup:buttons( - awful.util.table.join( - awful.button({}, next_month_button, function() - local a = cal:get_date() - a.month = a.month + 1 - cal:set_date(nil) - cal:set_date(a) - popup:set_widget(cal) - end), - awful.button({}, previous_month_button, function() - local a = cal:get_date() - a.month = a.month - 1 - cal:set_date(nil) - cal:set_date(a) - popup:set_widget(cal) - end) - ) - ) - - function calendar_widget.toggle() - - if popup.visible then - -- to faster render the calendar refresh it and just hide - cal:set_date(nil) -- the new date is not set without removing the old one - cal:set_date(os.date('*t')) - popup:set_widget(nil) -- just in case - popup:set_widget(cal) - popup.visible = not popup.visible - else - if placement == 'top' then - awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) - elseif placement == 'top_right' then - awful.placement.top_right(popup, { margins = { top = 30, right = 10}, parent = awful.screen.focused() }) - elseif placement == 'bottom_right' then - awful.placement.bottom_right(popup, { margins = { bottom = 30, right = 10}, - parent = awful.screen.focused() }) - else - awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) - end - - popup.visible = true - - end - end - - return calendar_widget - -end - -return setmetatable(calendar_widget, { __call = function(_, ...) - return worker(...) -end }) diff --git a/.config/awesome/widgets/calendar/light.png b/.config/awesome/widgets/calendar/light.png deleted file mode 100644 index ab675d1b4fc6ad3cd25bd9d4e36b864c3f547b2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13020 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 diff --git a/.config/awesome/widgets/calendar/outrun.png b/.config/awesome/widgets/calendar/outrun.png deleted file mode 100644 index d59c123972385e694d90781bb391703abf9cccf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9865 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 0 then - return icons[1] - end - local v = level or 0 - if v > 90 then - return icons[5] - elseif v > 50 then - return icons[4] - elseif v > 20 then - return icons[3] - else - return icons[2] - end -end - -local function worker(user_args) - local args = user_args or {} - local timeout = 120 -- 2mins - local program = args.program or 'pactl' - local step = args.step or 5 - local current_level = 0 - if program == 'pamixer' then - get_volume_cmd = 'pamixer --get-volume-human' - set_volume_cmd = 'pamixer --set-volume %s' -- - inc_volume_cmd = 'pamixer -i ' .. step - dec_volume_cmd = 'pamixer -d ' .. step - toggle_volume_cmd = 'pamixer -t' - elseif program == 'pactl' then - get_volume_cmd = 'sb-volume' -- "pactl get-sink-volume @DEFAULT_SINK@ | awk -F/ 'NR==1{print $2}' " - set_volume_cmd = 'pactl set-sink-volume @DEFAULT_SINK@ %s' -- - inc_volume_cmd = 'pactl set-sink-volume @DEFAULT_SINK@ +' .. step .. '%' - dec_volume_cmd = 'pactl set-sink-volume @DEFAULT_SINK@ -' .. step .. '%' - toggle_volume_cmd = 'pactl set-sink-mute @DEFAULT_SINK@ toggle' - end - local val = spawn.easy_async_with_shell(get_volume_cmd, function(out) - return out - end) - vol_widget.widget = wibox.widget({ - { - id = 'vol_txt_icon', - widget = wibox.widget.textbox, - markup = val, - font = 'Hack Nerd Font 14', - }, - { - id = 'vol_txt', - widget = wibox.widget.textbox, - markup = val, - }, - spacing = 4, - layout = wibox.layout.fixed.horizontal, - set_value = function(self, level) - -- naughty.notify({ - -- preset = naughty.config.presets.low, - -- title = 'Volume', - -- font = 'Iosevka Nerd Font 12', - -- icon = icon_path, - -- replaces_id = 1, - -- text = level, - -- }) - -- local display_text = get_icon( - -- tonumber(string.gsub(level, '[^0-9]', '')), - -- { '婢', '奄', ' ', '墳 ', ' ' } - -- ) .. ' ' .. string.gsub(level, '[^0-9]', '') - local display_text = - get_icon(tonumber(string.gsub(level, '[^0-9]', '')), { '婢', '奄', ' ', '󰕾 ', ' ' }) - self:get_children_by_id('vol_txt_icon')[1]:set_markup_silently(display_text) - self:get_children_by_id('vol_txt')[1]:set_markup_silently(string.gsub(level, '[^0-9]', '')) - -- show_popup(level) - end, - }) - local update_widget = function(widget, stdout, _, _, _) - -- local brightness_level = tonumber(string.format('%.0f', stdout)) - current_level = 'pamixer --get-volume-human' - -- show_popup({ level = 10, text = stdout }) - widget:set_value(stdout) - end - - function vol_widget:set(value) - current_level = value - spawn.easy_async_with_shell(set_volume_cmd, function() - spawn.easy_async_with_shell(get_volume_cmd, function(out) - update_widget(vol_widget.widget, out) - -- show_popup({ level = 10, text = 'From set\n' .. out }) - - -- naughty.notify({ - -- preset = naughty.config.presets.low, - -- title = 'Volume', - -- font = 'Iosevka Nerd Font 12', - -- icon = icon_path, - -- replaces_id = 1, - -- text = out, - -- }) - show_popup({ level = out, text = 'Volume level: ' }) - end) - end) - end - - function vol_widget:toggle() - spawn.easy_async_with_shell(toggle_volume_cmd, function() - spawn.easy_async_with_shell(get_volume_cmd, function(out) - update_widget(vol_widget.widget, out) - show_popup({ text = 'Volume: ' .. out }) - end) - end) - end - - function vol_widget:inc() - spawn.easy_async_with_shell(inc_volume_cmd, function() - spawn.easy_async_with_shell(get_volume_cmd, function(out, err, reason, code) - update_widget(vol_widget.widget, out) - show_popup({ level = out, text = 'Volume level: ' }) - - popup_progressbar:set_value(tonumber(string.sub(out, 1, 2))) - -- popup_progressbar.visible = true - end) - end) - end - - function vol_widget:dec() - spawn.easy_async_with_shell(dec_volume_cmd, function() - spawn.easy_async_with_shell(get_volume_cmd, function(out) - update_widget(vol_widget.widget, out) - - show_popup({ level = out, text = 'Volume level: ' }) - popup_progressbar:set_value(tonumber(string.sub(out, 1, 2))) - end) - end) - end - - vol_widget.widget:buttons(awful.util.table.join( - awful.button({}, 1, function() - vol_widget:set(20) - end), - -- awful.button({}, 3, function() - -- vol_widget:toggle() - -- end), - awful.button({}, 4, function() - vol_widget:inc() - end), - awful.button({}, 5, function() - vol_widget:dec() - end) - )) - watch(get_volume_cmd, timeout, update_widget, vol_widget.widget) - awful.tooltip({ - objects = { vol_widget.widget }, - timer_function = function() - return current_level -- .. tonumber(current_level) and ' %' or ' ' - end, - }) - return vol_widget.widget -end - -return setmetatable(vol_widget, { - __call = function(_, ...) - return worker(...) - end, -}) - --- return Volume diff --git a/.config/dk/dkrc b/.config/dk/dkrc deleted file mode 100755 index bafc400..0000000 --- a/.config/dk/dkrc +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/sh - -# example dkrc to show some basic command usage and error reporting - -# determine where to place the log file -logfile="$HOME/.cache/dkrc.log" -[ -d "$HOME/.local/share/xorg" ] && logfile="$HOME/.local/share/xorg/dkrc.log" -: >"$logfile" - -# (re)load sxhkd for keybinds -if hash sxhkd >/dev/null 2>&1; then - pkill sxhkd - sxhkd -c "$HOME/.config/dk/sxhkdrc" & -fi -pgrep polybar >/dev/null 2>&1 || setsid -f polybar xmonad - -# adjust border widths based on the DPI of the monitor -px=$(xrandr | grep ' connected' | tail -n1 | grep -o '[0-9]\+x[0-9]\+' | cut -d'x' -f2) -mm=$(xrandr | grep ' connected' | tail -n1 | grep -o '[0-9]\+mm' | tail -n1 | sed 's/mm//') -dpi=$(( (px / mm) * 25 )) - -if [ $dpi -ge 140 ]; then - border_width=5 - border_outer_width=3 -elif [ $dpi -ge 120 ]; then - border_width=4 - border_outer_width=2 -else - border_width=2 - border_outer_width=1 -fi - -{ # compound command to redirect all output - - dkcmd set numws=10 - - # default workspace '_' values used when allocating new workspaces - # can be applied to all existing workspaces when passed 'apply' after ws=_ - # dkcmd set ws=_ apply layout=tile master=1 stack=3 gap=0 msplit=0.5 ssplit=0.5 - dkcmd set master +1 - dkcmd set ws=_ apply layout=tile master=1 stack=3 gap=3 msplit=0.5 ssplit=0.5 - - # global settings - # --------------------- - - # focus windows when receiving activation and enable focus-follows-mouse - dkcmd set focus_open=true focus_urgent=true focus_mouse=true - - # place clients at the tail and ignore size hints on tiled windows - dkcmd set tile_tohead=true tile_hints=false - - # minimum width/height for resizing, and minimum allowed on-screen when moving - dkcmd set win_minwh=50 win_minxy=10 - - # disable gaps and borders in single window layouts - dkcmd set smart_gap=true smart_border=true - - # define mouse mod and move/resize buttons - dkcmd set mouse mod=super move=button1 resize=button3 - - # borders - # --------- - - # traditional - # set border width and colour for each window state - # dkcmd set border width=1 colour focus='#6699cc' unfocus='#000000' urgent='#ee5555' - - # alternative - # enable split borders and colours, width is overall width, outer width consumes some of width. - # outer width must be less than width, outer width of 0 will be single borders - dkcmd set border width=$border_width outer_width=$border_outer_width \ - colour \ - focus='#6699cc' \ - unfocus='#444444' \ - urgent='#ee5555' \ - outer_focus='#222222' \ - outer_unfocus='#222222' \ - outer_urgent='#222222' - - # window rules - # -------------- - - # rule class, instance, and title regexes (*ALWAYS* CASE INSENSITIVE) - - # open window(s) on a specific workspace (assigned monitor) - dkcmd rule class="^gimp$" ws=2 - - # open window(s) on a monitor by number or name (active workspace on monitor) - dkcmd rule class="^(chromium|firefox|brave|brave-browser)$" ws=2 focus=true - dkcmd rule class="^(waterfox-current|qutebrowser|LibreWolf)$" ws=2 focus=true - - dkcmd rule class="^(mpv|Evolution|thunderbird)$" ws=4 focus=true - - # open window(s) in a floating state - dkcmd rule class="^([pP]avucontrol|transmission-gtk|steam|lxappearance)$" float=true - dkcmd rule class="^(albert|feh|Galculator|Qalculate|Gnome-calculator)$" float=true - dkcmd rule class="^(nitrogen|oblogout|noiseTorch)$" float=true - - # open window(s) with sticky and floating enabled to view on all workspaces. - dkcmd rule class="^stickyterm$" stick=true float=true - dkcmd rule class="^scratchpad$" float=true - # set a window to never absorb other windows, like the xev event tester - dkcmd rule title="^Event Tester$" no_absorb=true - # define some terminals and allow them to be absorbed by spawned windows - dkcmd rule class="^(st|st-256color|urxvt|kitty|alacritty|xterm|xterm-256colors)$" terminal=true - - # apply current rule set to all existing windows - dkcmd rule apply '*' - -} >>"$logfile" 2>&1 # append responses - -# inform of any errors in a notification -if grep -q 'error:' "$logfile"; then - hash notify-send && notify-send -t 0 -u critical "dkrc has errors" \ - "$(awk '/error:/ {sub(/^error: /, ""); gsub(/<>" -[grid]="###" -[spiral]="(@)" -[dwindle]="[\\]" -[tstack]="F^F" -) - -clock() -{ - if [[ $1 ]]; then - while :; do - date +"T%%{A1:$1:} %a %H:%M %%{A}" - sleep 10 - done - else - while :; do - date +"T %a %H:%M " - sleep 10 - done - fi -} - -battery() -{ - if [[ $1 ]]; then - while :; do - printf 'B%s\n' "%{A1:$1:} $(acpi --battery 2>/dev/null | cut -d, -f2 | tr -d '[:space:]') %{A}" - sleep 10 - done - else - while :; do - printf 'B%s\n' " $(acpi --battery 2>/dev/null | cut -d, -f2 | tr -d '[:space:]') " - sleep 10 - done - fi -} - -volume() -{ - if [[ $1 ]]; then - while :; do - printf 'V%s\n' "%{A1:$1:} $(pamixer --get-volume-human) %{A}" - sleep 0.2 - done - else - while :; do - printf 'V%s\n' " $(pamixer --get-volume-human) " - sleep 0.2 - done - fi -} - -parsefifo() -{ - typeset f='' b='' u='' wm='' time='' bat='' vol='' title='' layout='' s="$separator" - - while read -r line; do - case $line in - T*) time="${line#?}" ;; - V*) vol="${line#?}" ;; - B*) bat="${line#?}" ;; - A*) title="${line#?}" ;; - L*) l="${line#?}"; layout="${layouts[$l]}" ;; - W*) - wm='' IFS=':' # set the internal field separator to ':' - set -- ${line#?} # split the line into arguments ($@) based on the field separator - for item in "$@"; do - name=${item#?} - case $item in - A*) f="$highlight" b="$bg" u="$highlight" ;; # occupied - focused - a*) f="$fg" b="$bg" u="$highlight" ;; # occupied - unfocused - I*) f="$highlight" b="$bg" u="$fg" ;; # unoccupied - focused - i*) f="$fg" b="$bg" u="$fg" ;; # unoccupied - unfocused - esac - wm="$wm%{F$f}%{B$b}%{+u}%{U$u}%{A:dkcmd ws $name:} $name %{A}%{-u}%{B-}%{F-}" - done - ;; - esac - printf "%s\n" "%{l}$wm $s $layout%{c}$title%{r}${bat}${s}${vol}${s}${time}" - done -} - - -# kill the process and cleanup if we exit or get killed -trap "trap - TERM; kill 0; rm -f '$fifo'" INT TERM QUIT EXIT - -# make the fifo -[ -e "$fifo" ] && rm "$fifo" -mkfifo "$fifo" - - -# here we dump info into the FIFO, order does not matter things are parsed -# out using the first character of the line. Click commands for left button -# can be added by passing an argument containing the command (like volume below) -clock '' > "$fifo" & -battery '' > "$fifo" & -volume 'pavucontrol' > "$fifo" & -dkcmd status type=bar > "$fifo" & - - -# run the pipeline -if [[ $1 == '-b' ]]; then - parsefifo < "$fifo" | lemonbar -b -a 32 -u $underline -B "$bg" -F "$fg" -f "$font0" -f "$font1" -f "$font2" -f "$font3" | sh -else - parsefifo < "$fifo" | lemonbar -a 32 -u $underline -B "$bg" -F "$fg" -f "$font0" -f "$font1" -f "$font2" -f "$font3" | sh -fi - -# vim:ft=sh:fdm=marker:fmr={,} diff --git a/.config/dk/scripts/curwsinfo.sh b/.config/dk/scripts/curwsinfo.sh deleted file mode 100644 index b093532..0000000 --- a/.config/dk/scripts/curwsinfo.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -awk '{ - if (!s && $1 == "workspaces:") { - for (i = 1; i <= NF; i++) { - if ($i ~ "*") { - sub(/\*/, ""); - gsub(/:[a-z]* /, " "); - s = $i; - } - } - } else if (s && $1 == s) { - sub(/^\s*/, ""); - print; - exit; - } -}' <(dkcmd status type=full num=1) diff --git a/.config/dk/scripts/dzenws.sh b/.config/dk/scripts/dzenws.sh deleted file mode 100644 index a079de7..0000000 --- a/.config/dk/scripts/dzenws.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -# show current workspace in a dzen2 window - - -width=100 # enough to fit one character plus padding -height=100 # roughly font size * 3, e.g. 36pt * 3 = 108 = 100px -font="Liberation:size=36:style=bold" - -if ! hash dzen2 >/dev/null 2>&1; then - echo "requires dzen2 installed" >&2 - exit 1 -fi - -stat=$(dkcmd status type=full num=1) - -# get current monitor width and height -typeset -i w=0 h=0 -eval "$(awk '{ - if (!s && $1 == "monitors:") { - for (i = 1; i <= NF; i++) { - if ($i ~ "*") { - gsub(/\*|:[0-9]+/, ""); - s = $i; - } - } - } else if (s && $1 == s) { - print "w="$5, "h="$6; - exit; - } -}' <<< "$stat")" - -# determine current workspace number -WS=$(awk '/^workspaces:/ { - for (i = 1; i <= NF; i++) { - if ($i ~ "*") - print i - 1 - } -}' <<< "$stat") - -# find center of the screen -x=$(( (w / 2) - (width / 2) )) -y=$(( (h / 2) - (height / 2) )) - -dzen2 -fn "$font" -p 1 -x $x -y $y -tw $width <<< "$WS" diff --git a/.config/dk/scripts/gap_alphaborder.sh b/.config/dk/scripts/gap_alphaborder.sh deleted file mode 100644 index 53137af..0000000 --- a/.config/dk/scripts/gap_alphaborder.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -# simple script to toggle dk border opacity based on the gap width -# written by Nathaniel Maia, 2020 - -# example usage bind with sxhkd -# alt + {equal,minus,apostrophe} -# /path/to/script {+5,-5,reset} - -# first runs `dkcmd set gap width $1`, then checks to see what the current -# gap setting is if it's >=threshold we add slight border transparency - -# does not have to be transparency were toggling, could be any setting where -# multiple states may be desired depending on the situation, but this is just -# an example - -# alpha value to use for when borders should be semi-transparent, 00 - ff -# this will get changed to 'ff' when gap width is < threshold -alpha='80' - -# gap width threshold for when to turn borders semi-transparent, 1 - N -# 0 would be always setting them semi-transparent, which is wasteful -thresh=10 - -# border colours, #000000 - #ffffff -typeset -A col=( - [f]='#6699cc' - [u]='#ee5555' - [uf]='#444444' - [of]='#222222' - [ou]='#222222' - [ouf]='#222222' -) - -if (( $# == 0 )); then - echo "usage: $0 " - exit 2 -fi - - -currentwsgap() -{ - awk '{ - if (!s && $1 == "workspaces:") { - for (i = 1; i <= NF; i++) { - if ($i ~ "*") { - sub(/\*/, ""); - gsub(/:[a-z]* /, " "); - s = $i; - } - } - } else if (s && $1 == s) { - print $7; - exit; - } - }' <(dkcmd status type=full num=1) -} - -# store the gap width before and after changing -old=$(currentwsgap) -dkcmd set gap width "$1" -ret=$? # if we don't cross the threshold this will be our exit code -new=$(currentwsgap) - -# did we cross the threshold, if so we need to update the border colours alpha -if (( (old >= thresh && new < thresh) || (old < thresh && new >= thresh) )); then - (( new < thresh )) && alpha='ff' - for i in "${!col[@]}"; do - c="${col[$i]}" - col[$i]="${c/\#/\#$alpha}" - done - dkcmd set border colour focus="${col[f]}" urgent="${col[u]}" unfocus="${col[uf]}" \ - outer_focus="${col[of]}" outer_urgent="${col[ou]}" outer_unfocus="${col[ouf]}" -else - exit $ret -fi diff --git a/.config/dk/scripts/layouts.sh b/.config/dk/scripts/layouts.sh deleted file mode 100644 index 5dcd686..0000000 --- a/.config/dk/scripts/layouts.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -# print workspace layouts -awk '/^workspaces:/ {sub(/^workspaces: /, ""); gsub(/(*)?[0-9]*:\w*:/, ""); print}' <(dkcmd status type=full num=1) diff --git a/.config/dk/scripts/scratch.sh b/.config/dk/scripts/scratch.sh deleted file mode 100644 index f189e63..0000000 --- a/.config/dk/scripts/scratch.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# basic scratchpad functionality for dk -# spawns a set command with a known title if not already open -# if open toggle between the current workspace and the last -# written by Nathaniel Maia - 2021 - - -# these can be edited by the user to be any window, just make sure to set the class -# to our title using whatever flag is needed: --class, -c, etc. -title="scratchpad" -cmd=( - st -c "$title" -) - - -# window ID, we need to printf it as 8 hex digits to later match with dk status -win=$(printf '0x%08x' "$(xwininfo -root -children | awk '/'"$title"'/ {print $1}')") - -if (( win != 0 )); then - # window is already open so toggle it - stat=$(dkcmd status num=1 type=full) - ws=$(awk '/^workspaces:/ { for (i = 1; i <= NF; i++) { if ($i ~ "*") print i - 1 } }' <<< "$stat") - wins=$(sed -n '/^windows:/,/^$/p' <<< "$stat") - win_ws=$(grep "^\s*${win}" <<< "$wins" | awk -F'" ' '{print $4}' | cut -d' ' -f1) - - if (( win_ws == ws )); then - # hide it - # we could create a new workspace and place it there instead to not mess with the users existing workspaces - dkcmd ws send "$win" "$(awk '/numws/{print $2}' <<< "$stat")" - else - # show it - dkcmd ws send "$win" "$ws" - fi -else - # the window is not yet spawned so do so - "${cmd[@]}" &>/dev/null & disown -fi diff --git a/.config/dk/scripts/title.sh b/.config/dk/scripts/title.sh deleted file mode 100644 index 359576e..0000000 --- a/.config/dk/scripts/title.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -# print the active window title - -# using dkcmd - -dkcmd status num=1 | grep '^A' | sed 's/^A//' - - -# using xprop - -# active="$(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | cut -d' ' -f2)" -# [[ $active ]] || exit 1 -# title=$(xprop -id "$active" -f _NET_WM_NAME 0u " \$0\\n" _NET_WM_NAME | cut -d'"' -f2) -# if [[ -n $title ]]; then -# title=$(xprop -id "$active" -f WM_NAME 0u " \$0\\n" WM_NAME | cut -d'"' -f2) -# [[ $title ]] || exit 1 -# fi - -# echo "$title" diff --git a/.config/dk/scripts/workspaces.sh b/.config/dk/scripts/workspaces.sh deleted file mode 100755 index 6d5c6d9..0000000 --- a/.config/dk/scripts/workspaces.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -# print workspace numbers -awk '/^workspaces:/ {sub(/^workspaces: /, ""); gsub(/:\w*/, ""); print}' <(dkcmd status type=full num=1) diff --git a/.config/dk/scripts/wsborders.sh b/.config/dk/scripts/wsborders.sh deleted file mode 100644 index 38afbad..0000000 --- a/.config/dk/scripts/wsborders.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash - -# simple script to change dk border colour based on the workspace -# written by Nathaniel Maia, 2021 - -# example usage bind with sxhkd -# alt + {_,shift + ,ctrl + }{1-9,0} -# /path/to/script ws {view,send,follow} {1-9,10} - -if (( $# == 0 )); then - echo "usage: $0 [action] " - exit 2 -fi - - -currentws() -{ - awk '{ - if (!s && $1 == "workspaces:") { - for (i = 1; i <= NF; i++) { - if ($i ~ "*") { - sub(/\*/, ""); - gsub(/:[a-z]* /, " "); - s = $i; - } - } - } else if (s && $1 == s) { - sub(/:.*/, ""); - print $0; - exit; - } - }' <(dkcmd status type=full num=1) -} - -if [[ $1 =~ (view|send|follow) ]]; then - [[ $1 == send ]] && { dkcmd ws "$1" "$2"; exit; } - action="$1" - shift -else - action="send" -fi - -(( $1 == $(currentws) )) && exit 0 - -case "$1" in - [1-5]) - typeset -A col=( - [f]='#6699cc' - [u]='#ee5555' - [uf]='#444444' - [of]='#222222' - [ou]='#222222' - [ouf]='#222222' - ) - ;; - [6-9]|10) - typeset -A col=( - [f]='#ee5555' - [u]='#6699cc' - [uf]='#444444' - [of]='#222222' - [ou]='#222222' - [ouf]='#222222' - ) - ;; -esac - -dkcmd set border colour focus="${col[f]}" urgent="${col[u]}" unfocus="${col[uf]}" \ - outer_focus="${col[of]}" outer_urgent="${col[ou]}" outer_unfocus="${col[ouf]}" || exit -dkcmd ws "$action" "$1" diff --git a/.config/dk/sxhkdrc b/.config/dk/sxhkdrc deleted file mode 100755 index cadc0b0..0000000 --- a/.config/dk/sxhkdrc +++ /dev/null @@ -1,123 +0,0 @@ -# vim:ft=sxhkdrc:fileencoding=utf-8 - -# terminal -super {_, + shift } + Return - { $TERMINAL || xterm,kitty } - -# screenshot and selection capture -{_,shift + }@Print - take_ss {focus,full} - -# Browser -super {_, + shift } + w - { $BROWSER || firefox,brave || brave-browser || chromium } -# File Manager -super {_, + shift } + e - { thunar,alacritty -e lfv } - -super + control + s - logout_prompt - -super + {r,d} - {rofi -show drun,rofi -show run -async-read 10 -config ~/.config/rofi/dmenu.rasi} - -super + @g - qalculate-gtk || galculator || gnome-calculator || notify-send "Error" "Calculator App not installed" -u critical -super + {r,v,y,p} - {rofi -show drun -async-pre-read,virt-manager || virtualbox || VirtualBox,clipboard,superp} - -control + alt + {p,c,v,e} - {get-class-name,xcolor -s,pavucontrol || pavucontrol-qt,rofie} - -# dedicated volume keys -XF86Audio{Raise,Lower}Volume - audio {inc,dec} -XF86AudioMute - audio toggle - -# dedicated backlight keys -XF86MonBrightness{Up,Down} - brightnessctl s 10{+,-} ;notify-send "Brightness: " -t 2000 -i display-brightness-symbolic -h int:value:$(brightnessctl g) ;polybar-msg action mbrightness hook 0 - -# reload sxhkd -super + Escape - pkill -USR1 -x sxhkd && notify-send "SXHKD" "Restarted" - -# quit dk -super + ctrl + x - dkcmd exit - -# reload dkrc -super + shift + r - $HOME/.config/dk/dkrc - -# restart dk -super + ctrl + shift + r - dkcmd restart - -# focus next or previous window -super + {j,k} - dkcmd win focus {next,prev} -alt + {_,shift + } Tab - dkcmd win focus {next,prev} -super + Tab - dkcmd ws view last - -# close window, swap tiled window in/out of master, cycle tiled windows in place -super + { shift + q,space} - dkcmd win {kill,swap} - -# toggle fullscreen and fake fullscreen (enable manipulating fullscreen window) -{_,super + }F11 - dkcmd win {full,fakefull} - -super + {_,shift + } f - dkcmd win {full,fakefull} - -# toggle floating or sticky -super + {s, shift + s} - dkcmd win {float,stick} - -# move window, signed (+/-) for relative changes -super + shift + {h,j,k,l} - dkcmd win resize {x=-20,y=+20,y=-20,x=+20} - -# resize window, signed (+/-) for relative changes -super + ctrl + {h,j,k,l} - dkcmd win resize {w=-20,h=+20,h=-20,w=+20} - -# move the active window up/down the stack -super + {Up,Down} - dkcmd win mvstack {up,down} - -# view, send, or follow to a workspace (by number) -super + {_,shift + ,ctrl + }{1-9,0} - dkcmd ws {view,send,follow} {1-9,10} - -# view, send, or follow to the next, previous, last active, -# next non-empty, or prev non-empty workspace -super + {_,ctrl + ,shift + }{bracketleft,bracketright,BackSpace} - dkcmd ws {view,send,follow} {prev,next,last} - -super + {_,shift + ,ctrl + } grave - dkcmd ws {view,send,follow} nextne - -# view, send, or follow to the next, previous, or last active monitor -super + {_,shift + ,ctrl + }{comma,period,backslash} - dkcmd mon {view,send,follow} {prev,next,last} - -# change active workspace layout -super + {t,m,g,c} - dkcmd set layout {tile,mono,grid,cycle} - -# change number of windows in master or first stack -# super + {_,shift + }{i,d} -# dkcmd set {master,stack} {+1,-1} - -# change gap width -super + {equal,minus} - dkcmd set gap width {+5,-5} - -# change border widths -super + ctrl + {_,shift + }{equal,minus} - dkcmd set border {width,outer_width} {+1,-1} diff --git a/.config/efm-langserver/config.yaml b/.config/efm-langserver/config.yaml deleted file mode 100644 index c88f817..0000000 --- a/.config/efm-langserver/config.yaml +++ /dev/null @@ -1,420 +0,0 @@ -version: 2 -lint-debounce: 1s -root-markers: - - RCS/ - - SCCS/ - - CVS/ - - .git/ - - .svn/ - - .hg/ - - .bzr/ - - _darcs/ - - .git -# command define -commands: - - title: Reload - command: :reload-config - - title: Editor (notepad) - os: windows - command: notepad - arguments: - - "${FILENAME}" - - title: Editor (gedit) - os: linux - command: xdg-open - # Linux no method generic GUI editor open - arguments: - - "${FILENAME}" - - title: Editor (default) - os: darwin - command: open - arguments: - - "-e" - - "${FILENAME}" -# linter,formatter setting -tools: - cppcheck-lint: &cppcheck-lint - prefix: cppcheck - lint-command: "cppcheck --quiet --force --enable=style --error-exitcode=1 ${INPUT}" - lint-stdin: false - lint-formats: - - "%f:%l:%c: %m" - root-markers: - - compile_commands.json - clang-format: &clang-format - format-command: "clang-format ${INPUT}" - format-stdin: true - clang-tidy: &clang-tidy - prefix: clang-tidy - lint-command: "clang-tidy ${INPUT}" - lint-stdin: false - lint-formats: - - "%f:%l:%c: %trror: %m" - - "%f:%l:%c: %tarning: %m" - - "%f:%l:%c: %tote: %m" - - vint-lint: &vint-lint - prefix: vint - lint-command: "vint --enable-neovim --style-problem ${INPUT}" - lint-formats: - - "%f:%l:%c: %m" - - markdownlint-lint: &markdownlint-lint - prefix: markdownlint - lint-command: "markdownlint --stdin" - lint-stdin: true - lint-formats: - - "%f:%l:%c MD%n/%*[^ ] %m" - - "%f:%l MD%n/%*[^ ] %m" - commands: - - title: "markdownlint fix" - command: markdownlint - arguments: - - "--fix" - - "${INPUT}" - - jsonlint-lint: &jsonlint-lint - prefix: jsonlint - lint-command: "jsonlint -c" - lint-stdin: true - lint-formats: - - "line %l, col %c, found: %m" - - fixjson-format: &fixjson-format - format-command: "fixjson -i 2" - format-stdin: true - - shellcheck-lint: &shellcheck-lint - prefix: shellcheck - lint-command: "shellcheck -f gcc -x -" - lint-stdin: true - lint-formats: - - "%f:%l:%c: %t%*[^:]: %m [SC%n]" - - shfmt-format: &shfmt-format - format-command: shfmt -ln bash -i 2 -bn -ci -sr -kp - format-stdin: true - - flake8-lint: &flake8-lint - prefix: flake8 - lint-command: flake8 --stdin-display-name ${INPUT} - - lint-stdin: true - lint-formats: - - "%f:%l:%c: %m" - root-markers: - - setup.cfg - - tox.ini - - .flake8 - - pylint-lint: &pylint-lint - prefix: pylint - lint-command: "pylint --output-format=text --score=no --msg-template {path}:{line}:{column}:{C}:{msg} ${INPUT}" - lint-stdin: false - lint-formats: - - "%f:%l:%c:%t:%m" - lint-offset-columns: 1 - lint-category-map: - I: H - R: I - C: I - W: W - E: E - F: E - root-markers: - - setup.cfg - - .pylintrc - - mypy-lint: &mypy-lint - prefix: mypy - lint-command: "mypy --show-column-numbers --strict --strict-equality" - lint-formats: - - "%f:%l:%c: %t%*[^:]: %m" - root-markers: - - setup.cfg - - mypy.ini - - black-action-format: &black-action-format - commands: - - title: "black format" - command: black - arguments: - - "--quiet" - - "--safe" - - "${INPUT}" - - yapf-action-format: &yapf-action-format - commands: - - title: "yapf format" - command: yapf - arguments: - - "-i" - - "${INPUT}" - - pydocstyle-lint: &pydocstyle-lint - prefix: pydocstyle - lint-command: "pydocstyle ${INPUT}" - lint-stdin: false - lint-ignore-exit-code: true - lint-formats: - - "%I%f:%l %.%#:" - - '%Z%*\sD%n: %m' - - yamllint-lint: &yamllint-lint - prefix: yamllint - lint-command: "yamllint --strict --format parsable ${INPUT}" - lint-stdin: false - lint-formats: - - "%f:%l:%c: [%t%*[a-z]] %m" - env: - - "PYTHONIOENCODING=UTF-8" - - actionlint-lint: &actionlint-lint - prefix: actionlint - lint-command: "bash -c \"[[ '${INPUT}' =~ \\\\.github/workflows/ ]]\" && actionlint -oneline -no-color -" - lint-stdin: true - lint-formats: - - "%f:%l:%c: %m" - root-markers: - - .github - - eslint-lint: &eslint-lint - prefix: eslint - lint-command: "npx --no-install eslint -f unix --stdin --stdin-filename ${INPUT}" - lint-ignore-exit-code: true - lint-stdin: true - root-markers: - # - package.json - - .eslintrc.js - - .eslintrc.cjs - - .eslintrc.yaml - - .eslintrc.yml - - .eslintrc.json - - .eslintrc - commands: - - title: "eslint fix" - command: npx - arguments: - - "--no-install" - - "eslint" - - "--fix" - - "${INPUT}" - eslintd: &eslintd - prefix: eslint_d - lint-command: "eslint_d --no-color --format unix --stdin --stdin-filename ${INPUT}" - # lint-formats: %f(%l,%c): %trror %m', '%f(%l,%c): %tarning %m - lint-ignore-exit-code: true - lint-stdin: true - root-markers: - # - package.json - - .eslintrc - - .eslintrc.js - - .eslintrc.cjs - - .eslintrc.yaml - - .eslintrc.yml - - .eslintrc.json - eslintd-fix: &eslintd-fix - prefix: eslint_d - format-command: eslint_d --fix-to-stdout --stdin --stdin-filename ${INPUT} - format-stdin: true - commands: - - title: "eslint_d fix" - command: eslint_d - arguments: - - "--fix" - - "${INPUT}" - root-markers: - # - package.json - - .eslintrc - - .eslintrc.js - - .eslintrc.cjs - - .eslintrc.yaml - - .eslintrc.yml - - .eslintrc.json - - stylelint-lint: &stylelint-lint - prefix: stylelint - lint-command: "npx --no-install stylelint --formatter unix --stdin --stdin-filename ${INPUT}" - lint-ignore-exit-code: false - lint-stdin: true - lint-formats: - - "%f:%l:%c: %m [%t%*[a-z]]" - root-markers: - - package.json - - .stylelintrc.json - commands: - - title: "stylelint fix" - command: npx - arguments: - - "--no-install" - - "stylelint" - - "--fix" - - "${INPUT}" - - htmllint-lint: &htmllint-lint - prefix: htmllint - lint-command: "npx --no-install htmllint ${INPUT}" - lint-stdin: false - lint-formats: - - "%f: line %l, col %c, %m" - root-markers: - - package.json - - .htmllintrc - - prettier-action-fix: &prettier-action-fix - format-command: prettier --stdin --stdin-filepath '${INPUT}' ${--range-start:charStart} ${--range-end:charEnd} ${--tab-width:tabSize} ${--use-tabs:!insertSpaces} - format-stdin: true - format-can-range: true - root-markers: - - package.json - - .prettierrc - - .prettierrc.json - - .prettierrc.js - - .prettierrc.yml - - .prettierrc.yaml - - .prettierrc.json5 - - .prettierrc.mjs - - .prettierrc.cjs - - .prettierrc.toml - - prettierd: &prettierd - format-command: prettierd ${INPUT} ${--range-start=charStart} ${--range-end=charEnd} ${--tab-width:tabSize} ${--use-tabs:!insertSpaces} - format-stdin: true - format-can-range: true - root-markers: - - package.json - - .prettierrc - - .prettierrc.json - - .prettierrc.js - - .prettierrc.yml - - .prettierrc.yaml - - .prettierrc.json5 - - .prettierrc.mjs - - .prettierrc.cjs - - .prettierrc.toml - - denofmt: &denofmt - format-command: > - deno fmt ${INPUT} ${--indent-width=tabSize} ${--use-tabs=!insertSpaces} - format-stdin: false - root-markers: - - deno.json - denolint: &denolint - prefix: denolint - lint-command: "deno lint ${INPUT}" - lint-stdin: false - root-markers: - - deno.json - - fish-indent: &fish-indent - format-command: fish_indent - format-stdin: true - fish: &fish - lint-command: fish --no-execute ${INPUT} - lint-ignore-exit-code: true - lint-formats: - - "%.%#(line %l): %m" - - goimports: &goimports - format-command: goimports - format-stdin: true - golines: &golines - format-command: golines - format-stdin: true - golangci-lint: &golangci-lint - prefix: golangci-lint - lint-command: golangci-lint run --color never --out-format tab ${INPUT} - lint-stdin: false - lint-formats: - - "%.%#:%l:%c %m" - - stylua: &stylua - format-command: stylua ${--indent-width:tabSize} ${--range-start:charStart} ${--range-end:charEnd} --color Never - - format-stdin: true - format-can-range: true - -# languages setting -languages: - c: - - <<: *cppcheck-lint - - <<: *clang-tidy - - <<: *clang-format - cpp: - - <<: *cppcheck-lint - - <<: *clang-tidy - - <<: *clang-format - sh: - - <<: *shellcheck-lint - - <<: *shfmt-format - fish: - - <<: *fish - - <<: *fish-indent - python: - - <<: *flake8-lint - - <<: *black-action-format - lua: - - <<: *stylua - markdown: - - <<: *markdownlint-lint - - <<: *prettier-action-fix - html: - - <<: *htmllint-lint - - <<: *stylelint-lint - - <<: *prettier-action-fix - css: - - <<: *prettierd - scss: - - <<: *stylelint-lint - - <<: *prettierd - sass: - - <<: *stylelint-lint - - <<: *prettierd - less: - - <<: *stylelint-lint - - <<: *prettierd - json: - - <<: *jsonlint-lint - - <<: *fixjson-format - jsonc: - - <<: *jsonlint-lint - - <<: *fixjson-format - json5: - - <<: *jsonlint-lint - - <<: *fixjson-format - yaml: - - <<: *yamllint-lint - - <<: *prettier-action-fix - javascript: - - <<: *prettier-action-fix - - <<: *eslintd-fix - - <<: *eslintd - typescript: - - <<: *prettier-action-fix - - <<: *eslintd-fix - - <<: *eslintd - javascriptreact: - - <<: *prettier-action-fix - - <<: *eslintd-fix - - <<: *eslintd - typescriptreact: - - <<: *prettier-action-fix - - <<: *eslintd-fix - - <<: *eslintd - vue: - - <<: *prettier-action-fix - - <<: *eslintd-fix - - <<: *eslintd - svelte: - - <<: *prettier-action-fix - # - <<: *prettierd - # - <<: *eslintd-fix - # - <<: *eslintd - - graphql: - - <<: *prettier-action-fix - go: - - <<: *golangci-lint - - <<: *goimports - - <<: *golines - - vim: - - <<: *vint-lint diff --git a/.config/fish/conf.d/malias2.fish b/.config/fish/conf.d/malias2.fish index 26ae0ee..7dda775 100644 --- a/.config/fish/conf.d/malias2.fish +++ b/.config/fish/conf.d/malias2.fish @@ -13,7 +13,8 @@ alias lt="eza -aT --color=auto --icons --group-directories-first" alias l="ll --no-filesize --no-permissions --no-time" alias rr="/bin/rm -rf" -alias rm="trash-put" +alias rm="trash" +alias rmd="trash-put -rf" alias tls="trash-list" alias cls="clear" alias xcp="xclip -i -r -sel clip" diff --git a/.config/fish/conf.d/mfunctions.fish b/.config/fish/conf.d/mfunctions.fish index 2adfaac..c2dc0ba 100644 --- a/.config/fish/conf.d/mfunctions.fish +++ b/.config/fish/conf.d/mfunctions.fish @@ -1,22 +1,24 @@ function mkd -d "Create a New directory and cd into it" - [ -n "$argv[1]" ]; and mkdir -p "$argv[1]"; and cd "$argv[1]"; or echo "Please provide a valid directory name" + [ -n "$argv[1]" ]; and mkdir -p "$argv[1]"; and cd "$argv[1]"; or echo "Please provide a valid directory name" end -function which -d "Print alias for program or print location of program" +if test -x /usr/bin/which + function which -d "Print alias for program or print location of program" if [ -n "$argv[1]" ] - functions "$argv[1]"; or /bin/which "$argv[1]" + functions "$argv[1]"; or /usr/bin/which "$argv[1]" else - echo "Please provide a valid program name" + echo "Please provide a valid program name" end + end end function yy -d "yy shell wrapper that provides the ability to change the current working directory when exiting Yazi" - set tmp (mktemp -t "yazi-cwd.XXXXXX") - yazi $argv --cwd-file="$tmp" - if set cwd (cat -- "$tmp"); and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] - cd -- "$cwd" - end - rm -f -- "$tmp" + set tmp (mktemp -t "yazi-cwd.XXXXXX") + yazi $argv --cwd-file="$tmp" + if set cwd (cat -- "$tmp"); and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] + cd -- "$cwd" + end + rm -f -- "$tmp" end # function jnb -d "Start jupyter lab in background" diff --git a/.config/fish/conf.d/nix.fish b/.config/fish/conf.d/nix.fish deleted file mode 100644 index a056ff5..0000000 --- a/.config/fish/conf.d/nix.fish +++ /dev/null @@ -1,2 +0,0 @@ - -if test -e /home/shubham/.nix-profile/etc/profile.d/nix.fish; . /home/shubham/.nix-profile/etc/profile.d/nix.fish; end # added by Nix installer diff --git a/.config/fish/config.fish b/.config/fish/config.fish index 541ae56..e3dbf42 100644 --- a/.config/fish/config.fish +++ b/.config/fish/config.fish @@ -5,17 +5,12 @@ fish_add_path -aP $HOME/.config/emacs/bin $HOME/Programming/Flutter/flutter/bin fish_add_path -aP $HOME/.local/share/zinit/plugins/ajeetdsouza---zoxide/ set -x EDITOR nvim - -# pyenv init --path | source -# pyenv init - | source -# zoxide init fish --cmd j | source - set -g fish_cursor_default block set -g fish_cursor_insert line set -g fish_cursor_visual underscore set fish_prompt_pwd_full_dirs 2 - set -U SXHKD_SHELL /usr/bin/sh + starship init fish | source zoxide init fish | source #fnm env --use-on-cd | source diff --git a/.config/fish/fish_variables b/.config/fish/fish_variables index e43f5d8..bccbdff 100644 --- a/.config/fish/fish_variables +++ b/.config/fish/fish_variables @@ -3,9 +3,6 @@ SETUVAR --export FIGNORE:\x2eclass\x3a\x2eout SETUVAR --path PATH:/home/shubham/\x2epyenv/shims\x1e/usr/local/bin\x1e/usr/bin\x1e/bin\x1e/usr/local/sbin\x1e/usr/lib/jvm/default/bin\x1e/usr/bin/site_perl\x1e/usr/bin/vendor_perl\x1e/usr/bin/core_perl\x1e/home/shubham/\x2elocal/bin/\x1e/home/shubham/\x2elocal/bin/myscripts/\x1e/home/shubham/\x2elocal/share/luarocks/bin/\x1e/home/shubham/\x2elocal/share/golib/bin/\x1e/home/shubham/\x2elocal/share/npm/bin/\x1e/home/shubham/\x2elocal/share/suckless/dwm\x2d62/status\x2dbar/scripts/\x1e/home/shubham/\x2econfig/emacs/bin/\x1e/home/shubham/\x2epyenv/bin/\x1e/home/shubham/\x2econfig/emacs/bin SETUVAR SXHKD_SHELL:/usr/bin/sh -SETUVAR --export ZDOTDIR:/home/shubham/\x2econfig/zsh/ -SETUVAR _ZL_DATA:/home/shubham/\x2elocal/share/zlua/zlua\x2etxt -SETUVAR _ZL_DATA_DIR:/home/shubham/\x2elocal/share/zlua SETUVAR __fish_initialized:3400 SETUVAR _fish_abbr_chx:chmod\x20\x2bx SETUVAR _fish_abbr_emc:emacsclient\x20\x2dcn diff --git a/.config/ghostty/config b/.config/ghostty/config index 545b478..7c5114d 100644 --- a/.config/ghostty/config +++ b/.config/ghostty/config @@ -2,8 +2,10 @@ window-padding-color = background font-family = "RecMonoDuotone Nerd Font" font-feature = -liga -font-size = 11 +font-feature = -dlig +font-feature = -calt0 theme = "catppuccin-mocha" +# shell-integration = fish background =#0f0f11 background-opacity=0.95 diff --git a/.config/git/config b/.config/git/config index 84ad160..43cd411 100644 --- a/.config/git/config +++ b/.config/git/config @@ -22,3 +22,6 @@ keepBackup = false [mergetool "diffview"] cmd = nvim -n -c "DiffviewOpen" "$MERGE" + +[push] + autoSetupRemote = true diff --git a/.config/home-manager/home.nix b/.config/home-manager/home.nix deleted file mode 100644 index 008d949..0000000 --- a/.config/home-manager/home.nix +++ /dev/null @@ -1,119 +0,0 @@ -{ config, pkgs, ... }: - -{ - # Home Manager needs a bit of information about you and the paths it should - # manage. - home = { - username = "shubham"; - homeDirectory = "/home/shubham"; - stateVersion = "23.05"; # Please read the comment before changing. - sessionVariables = { - # EDITOR = "neovim"; - }; - }; - # The home.packages option allows you to install Nix packages into your - # environment. - home.packages = with pkgs; [ - atool - alacritty - kitty - tmux - nodejs - fd - ripgrep - brave - fnm - qbittorrent - gnome.file-roller - evince - xclip - exa - starship - luajit - rofi - rofimoji - openjdk - # gcc - clang - go - xwallpaper - # # It is sometimes useful to fine-tune packages, for example, by applying - # # overrides. You can do that directly here, just don't forget the - # # parentheses. Maybe you want to install Nerd Fonts with a limited number of - # # fonts? - # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; }) - - # # You can also create simple shell scripts directly inside your - # # configuration. For example, this adds a command 'my-hello' to your - # # environment: - # (pkgs.writeShellScriptBin "my-hello" '' - # echo "Hello, ${config.home.username}!" - # '') - ]; - - # Home Manager is pretty good at managing dotfiles. The primary way to manage - # plain files is through 'home.file'. - home.file = { - # # Building this configuration will create a copy of 'dotfiles/screenrc' in - # # the Nix store. Activating the configuration will then make '~/.screenrc' a - # # symlink to the Nix store copy. - # ".screenrc".source = dotfiles/screenrc; - - # # You can also set the file content immediately. - # ".gradle/gradle.properties".text = '' - # org.gradle.console=verbose - # org.gradle.daemon.idletimeout=3600000 - # ''; - }; - - # You can also manage environment variables but you will have to manually - # source - # - # ~/.nix-profile/etc/profile.d/hm-session-vars.sh - # - # or - # - # /etc/profiles/per-user/shubham/etc/profile.d/hm-session-vars.sh - # - # if you don't want to manage your shell through Home Manager. - - # Let Home Manager install and manage itself. - programs.home-manager.enable = true; - programs.git = { - enable = true; - userName = "Shubham Pawar(shubham-cpp)"; - userEmail = "shubhampawar3007@gmail.com"; - delta = { - enable = true; - }; - aliases = { - logline = "log --graph --pretty=format:'%C(ul red)%h%Creset %Cgreen%as%Creset |%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"; - ll = "log --graph --pretty=format:'%C(ul red)%h%Creset %Cgreen%as%Creset |%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"; - }; - includes = [{ - contents = { - init.defaultBranch = "main"; - core.excludesfile = "~/.config/git/ignore"; - }; - }]; - }; - programs.neovim = { - enable = true; - defaultEditor = true; - viAlias = true; - withNodeJs = true; - }; - programs.vscode = { - enable = true; - enableExtensionUpdateCheck = false; - enableUpdateCheck = false; - package = pkgs.vscodium; - }; - programs.fzf = { - enable = true; - changeDirWidgetCommand = "fd -t d"; - defaultCommand = "fd -t f"; - fileWidgetCommand = "fd -t f"; - fileWidgetOptions = [ "--preview 'head {}'" ]; - }; -} diff --git a/.config/nvim-astro/.neoconf.json b/.config/nvim-astro/.neoconf.json index 2d7a81f..6d75afc 100644 --- a/.config/nvim-astro/.neoconf.json +++ b/.config/nvim-astro/.neoconf.json @@ -14,7 +14,11 @@ }, "lspconfig": { "lua_ls": { - "Lua.format.enable": false + "Lua.format.enable": false, + "Lua.diagnostics.globals": [ + "Snacks", + "vim" + ] } } } diff --git a/.config/nvim-astro/after/plugin/keymaps.lua b/.config/nvim-astro/after/plugin/keymaps.lua deleted file mode 100644 index 749e7b0..0000000 --- a/.config/nvim-astro/after/plugin/keymaps.lua +++ /dev/null @@ -1,43 +0,0 @@ -vim.keymap.set("", "0", "^", { noremap = false, silent = true }) -vim.keymap.set("n", ",w", "w!", { desc = "Save File" }) -vim.keymap.set("n", ",W", "noautocmd w!", { desc = "Save File(without autocmds)" }) -vim.keymap.set("n", "", ":nohl") - -vim.keymap.set("n", "", ":tabp") -vim.keymap.set("n", "", ":tabn") - --- Pasting in visual mode doesn't copy -vim.keymap.set("x", "p", [[ 'pgv"'.v:register.'y' ]], { expr = true }) -vim.keymap.set("n", "dl", '"_dl') -vim.keymap.set({ "n", "x" }, "c", '"_c') -vim.keymap.set("n", "C", '"_C') - -vim.keymap.set("c", "", "", { silent = false }) -vim.keymap.set("c", "", "", { silent = false }) - -vim.cmd [[ nnoremap ,s :let @/='\<'.expand('').'\>'cgn ]] -vim.keymap.set("x", ",s", '"sy:let @/=@scgn', { desc = "Replace" }) - -vim.keymap.set("o", "ie", ':exec "normal! ggVG"') -vim.keymap.set("o", "iv", ':exec "normal! HVL"') -vim.keymap.set("n", ",e", ':e =expand("%:p:h") . "/" ', { silent = false, desc = "Edit in same dir" }) -vim.keymap.set("n", ",t", ':tabe =expand("%:p:h") . "/" ', { silent = false, desc = "Edit in same dir(Tab)" }) -vim.keymap.set( - "n", - ",v", - ':vsplit =expand("%:p:h") . "/" ', - { silent = false, desc = "Edit in same dir(Split)" } -) - -vim.keymap.set("n", "R", function() - vim.cmd "source %" - local file = vim.fn.substitute(vim.fn.expand "%:r", "lua/", "", "") - local ok, mod = pcall(require, file) - if ok and type(mod) ~= "boolean" and next(mod or {}) ~= nil and mod.config then mod.config() end -end, { silent = false, desc = "Reload module" }) - -for i = 1, 9 do - vim.keymap.set("n", "" .. i, i .. "gt", { desc = "Goto Tab " .. i }) -end --- Output of neovim/vim command into buffer --- enew|pu=execute('map') diff --git a/.config/nvim-astro/after/plugin/options.lua b/.config/nvim-astro/after/plugin/options.lua index ed51687..3e2560c 100644 --- a/.config/nvim-astro/after/plugin/options.lua +++ b/.config/nvim-astro/after/plugin/options.lua @@ -1,22 +1,6 @@ -local o = vim.opt - -o.iskeyword:append "-" -o.path:append "**" - -o.scrolloff = 9 - -o.exrc = true - -o.wrap = true -o.showbreak = "󰄾 " - -o.backupdir = { vim.fn.stdpath "state" .. "/backup//" } - -o.sessionoptions:append { "globals" } -o.sessionoptions:remove "folds" - -o.wildignorecase = true -o.wildignore:append { +vim.opt.path:append "**" +vim.opt.iskeyword:append "-" -- for css make 'is-active' as one word +vim.opt.wildignore:append { "**/node_modules/*", "**/.git/*", "**/dist/*", @@ -44,7 +28,6 @@ o.wildignore:append { "*.tar.gz", "*.tar.bz2", } - -if vim.fn.executable "rg" == 1 then - o.grepprg = "rg --vimgrep --smart-case" -- Also check RIPGREP_CONFIG_PATH="$HOME/.config/ripgreprc" +for i = 1, 9 do + vim.keymap.set("n", "" .. i, i .. "gt", { desc = "Goto tab " .. i }) end diff --git a/.config/nvim-astro/lazy-lock.json b/.config/nvim-astro/lazy-lock.json index 83fa168..c45d3db 100644 --- a/.config/nvim-astro/lazy-lock.json +++ b/.config/nvim-astro/lazy-lock.json @@ -1,120 +1,122 @@ { - "AstroNvim": { "branch": "main", "commit": "4697961743f500bfa2a8ccd9aef5863219a8bb8d" }, + "AstroNvim": { "branch": "main", "commit": "56e5d8c4a73237c100a8271155c24760ec58d7f7" }, "Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" }, "LuaSnip": { "branch": "master", "commit": "03c8e67eb7293c404845b3982db895d59c0d1538" }, - "SchemaStore.nvim": { "branch": "main", "commit": "bb03860b59f17dfada46d6d9563c48b7b12fecaf" }, - "aerial.nvim": { "branch": "master", "commit": "9c29a1a66eb31384888e413e510ba72496e06770" }, + "SchemaStore.nvim": { "branch": "main", "commit": "b265e7b68308c9b68581d57c3f79419ce5e8dca2" }, + "aerial.nvim": { "branch": "master", "commit": "1160fb7a15a34b03b7381d95d45560712b5f19d0" }, "age.nvim": { "branch": "main", "commit": "f1793e14123a7c5374a3744aacab9c283014fa1d" }, "alpha-nvim": { "branch": "main", "commit": "de72250e054e5e691b9736ee30db72c65d560771" }, - "astrocommunity": { "branch": "main", "commit": "f401d9b0b5a4e019c5d32f3d4932136a4ca30505" }, + "astrocommunity": { "branch": "main", "commit": "dfa9d294cd24c5799e52a8c39837d1de705066d7" }, "astrocore": { "branch": "main", "commit": "0fcaac66d115948605c14eaf45a41d3923eaafeb" }, "astrolsp": { "branch": "main", "commit": "2f6b0a4059775a1dac011d2944dd41fd4a8fe7a8" }, - "astrotheme": { "branch": "main", "commit": "e612ee356bbf42dc28f181cb966730ed3befb1ab" }, + "astrotheme": { "branch": "main", "commit": "7aa05c0ada35ff127f151f70b0ba2d042953eeb4" }, "astroui": { "branch": "main", "commit": "076766c1d422db486378354729f8fa7c1a68b745" }, - "auto-session": { "branch": "main", "commit": "021b64ed7d4ac68a37be3ad28d8e1cba5bec582c" }, - "avante.nvim": { "branch": "main", "commit": "8067cb0240df4c3b360783ab0809b1e0f1bde9f0" }, + "avante.nvim": { "branch": "main", "commit": "faa6728d4b85e0001b7fda5f30115982e957f4bb" }, "better-escape.nvim": { "branch": "master", "commit": "199dcc2643dec5d8dbdab4ec672cf405224dcb3b" }, + "blade-nav.nvim": { "branch": "main", "commit": "56601aaf230698388ed687d1d9d468599d277ac2" }, "bullets.vim": { "branch": "master", "commit": "2253f970e54320dbd76fd6bb4f5a0bf2436ce232" }, + "clangd_extensions.nvim": { "branch": "main", "commit": "db28f29be928d18cbfb86fbfb9f83f584f658feb" }, + "cmake-tools.nvim": { "branch": "master", "commit": "83268ea6f969f1e6eaa85f72118a11acb6198bf0" }, "cmp-async-path": { "branch": "main", "commit": "d6d1ffa2075039632a2d71e8fa139818e15ac757" }, "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, - "cmp-cmdline": { "branch": "main", "commit": "bc85ff5323f4d314f92556bea15ebaac94d58054" }, + "cmp-cmdline": { "branch": "main", "commit": "2c3bee4d1168670b7eb8f572378e309e8cdca79e" }, "cmp-dap": { "branch": "master", "commit": "ea92773e84c0ad3288c3bc5e452ac91559669087" }, "cmp-nvim-lsp": { "branch": "main", "commit": "99290b3ec1322070bcfb9e846450a46f6efa50f0" }, "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, "cmp-rg": { "branch": "master", "commit": "70a43543f61b6083ba9c3b7deb9ccee671410ac6" }, "cmp-tailwind-colors": { "branch": "main", "commit": "4b200e280e9051a26ade776589c2ac246350f5dc" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, - "codecompanion.nvim": { "branch": "main", "commit": "49d38f78db7f33da7d3eca6daadcce951bce6764" }, - "conform.nvim": { "branch": "master", "commit": "f4e8837878fc5712d053ba3091a73d27d96a09e2" }, - "copilot.lua": { "branch": "master", "commit": "d3783b9283a7c35940ed8d71549030d5f5f9f980" }, - "crates.nvim": { "branch": "main", "commit": "8bf8358ee326d5d8c11dcd7ac0bcc9ff97dbc785" }, - "dial.nvim": { "branch": "master", "commit": "46b4375e84e8eb771129bff6b2b1e47746601ef9" }, - "dooing": { "branch": "main", "commit": "4c2847ce959eafe2593f1fe1c709e1ca64a40af7" }, - "dressing.nvim": { "branch": "master", "commit": "43b8f74e0b1e3f41e51f640f8efa3bcd401cea0d" }, - "flash.nvim": { "branch": "main", "commit": "34c7be146a91fec3555c33fe89c7d643f6ef5cf1" }, + "codecompanion.nvim": { "branch": "main", "commit": "5a0c93ea807661dcc3fc2e0b8e81a94842d1750c" }, + "crates.nvim": { "branch": "main", "commit": "1d92a7f449a2a76d8f4c3459bd98f450e76d2ea3" }, + "dial.nvim": { "branch": "master", "commit": "34bbd9c387c358190e61ce71017faad3dffa7a74" }, + "dressing.nvim": { "branch": "master", "commit": "3a45525bb182730fe462325c99395529308f431e" }, + "emmet-vim": { "branch": "master", "commit": "6c511a8d7d2863066f32e25543e2bb99d505172c" }, + "flash.nvim": { "branch": "main", "commit": "f899265876ecdcf7352dbc9f0adf87068cedefbb" }, "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" }, - "git-conflict.nvim": { "branch": "main", "commit": "4bbfdd92d547d2862a75b4e80afaf30e73f7bbb4" }, "gitsigns.nvim": { "branch": "main", "commit": "0b04035bb7b3c83e999b9676e2fb46fd0aa9f910" }, - "gopher.nvim": { "branch": "main", "commit": "f55c15ada8e02398000c04a96ef44d986cd01051" }, + "gopher.nvim": { "branch": "main", "commit": "0ed14a40d9799ac8d92aaf9eb1cd9be22ffd6b14" }, "grapple.nvim": { "branch": "main", "commit": "b41ddfc1c39f87f3d1799b99c2f0f1daa524c5f7" }, "guess-indent.nvim": { "branch": "main", "commit": "6cd61f7a600bb756e558627cd2e740302c58e32d" }, - "gx.nvim": { "branch": "main", "commit": "b01db725a001e4215f363159fc04727f6fde0a1c" }, + "haskell-snippets.nvim": { "branch": "master", "commit": "bd893770dd7a0c1a473601c3c919e61670745b36" }, + "haskell-tools.nvim": { "branch": "master", "commit": "24fa520bd7ab67013265c06fbb2e98a570ae5ee9" }, "heirline.nvim": { "branch": "master", "commit": "cc359b628266cb9a84b2d71c883f2b99e16473a0" }, - "img-clip.nvim": { "branch": "main", "commit": "5ff183655ad98b5fc50c55c66540375bbd62438c" }, - "indent-blankline.nvim": { "branch": "master", "commit": "259357fa4097e232730341fa60988087d189193a" }, + "hydra.nvim": { "branch": "main", "commit": "983852960cd4e4e9a1b272df0bd1447495aae755" }, + "img-clip.nvim": { "branch": "main", "commit": "5ded6f468d633ccfb315905fe8901d6c95ae8f29" }, + "indent-blankline.nvim": { "branch": "master", "commit": "e10626f7fcd51ccd56d7ffc00883ba7e0aa28f78" }, + "jellybeans.nvim": { "branch": "main", "commit": "a2a38b87726189d887847841256b4ea82f0f999f" }, + "laravel-ide-helper.nvim": { "branch": "main", "commit": "d36ab889153cda9ce67ef3fbbf2b6c30e079d7c9" }, + "laravel.nvim": { "branch": "main", "commit": "a6baaa1b09fd6c62361f2330060a61635a746cc7" }, "lazy.nvim": { "branch": "main", "commit": "7e6c863bc7563efbdd757a310d17ebc95166cef3" }, "lazydev.nvim": { "branch": "main", "commit": "f59bd14a852ca43db38e3662395354cb2a9b13e0" }, "lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" }, - "luvit-meta": { "branch": "main", "commit": "57d464c4acb5c2e66bd4145060f5dc9e96a7bbb7" }, - "mag-buffer": { "branch": "main", "commit": "11159370b51495c9848b0b6bb2b933df27672a7a" }, - "mag-nvim-lsp": { "branch": "main", "commit": "56cffa9992469b9676494744f09667808392c1b3" }, - "magazine.nvim": { "branch": "main", "commit": "a584e53ec057199cf1ca6e3615ce68b7da361d47" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "8e46de9241d3997927af12196bd8faa0ed08c29a" }, + "magazine.nvim": { "branch": "main", "commit": "cf8afed0f22f68e8cfdd28ed9ef86cbae8b36645" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "f75e877f5266e87523eb5a18fcde2081820d087b" }, "mason-null-ls.nvim": { "branch": "main", "commit": "2b8433f76598397fcc97318d410e0c4f7a4bea6a" }, "mason-nvim-dap.nvim": { "branch": "main", "commit": "8b9363d83b5d779813cdd2819b8308651cec2a09" }, "mason.nvim": { "branch": "main", "commit": "c43eeb5614a09dc17c03a7fb49de2e05de203924" }, - "mini.align": { "branch": "main", "commit": "26111a737494bc39576ad67b52bbc2638ca23553" }, + "mini.align": { "branch": "main", "commit": "3bdf6f0b91b31db5300a7b04f53f296a7fb150c1" }, "mini.bufremove": { "branch": "main", "commit": "1ee294a97e091d3cf967974df622c0d887890dc2" }, - "mini.move": { "branch": "main", "commit": "4caa1c212f5ca3d1633d21cfb184808090ed74b1" }, - "mini.operators": { "branch": "main", "commit": "7cb4dc66c51a3d736d347bbc517dc73dc7d28888" }, - "mini.surround": { "branch": "main", "commit": "aa5e245829dd12d8ff0c96ef11da28681d6049aa" }, - "neo-tree.nvim": { "branch": "main", "commit": "a77af2e764c5ed4038d27d1c463fa49cd4794e07" }, - "neoconf.nvim": { "branch": "main", "commit": "05d25c121e07c464d6b4203204aa113453eca152" }, - "neogen": { "branch": "main", "commit": "37dd095892e3f846418c465852f7b21f81d0f46c" }, - "neogit": { "branch": "master", "commit": "9dc580789aaf978ba94403874e23a0896a92dbbc" }, - "neotest": { "branch": "master", "commit": "6d3d22cdad49999ef774ebe1bc250a4994038964" }, + "mini.files": { "branch": "main", "commit": "0db8f49088bcefff23c5cb8498a6c94e46a45a8e" }, + "mini.move": { "branch": "main", "commit": "c8b30e92dd2668dd6e56a9a23cb7d4ee38c2266d" }, + "mini.operators": { "branch": "main", "commit": "81e5059268154f5a8b594c95748968febdd539e3" }, + "multicursors.nvim": { "branch": "main", "commit": "562809aaf203b4c65482a75199166d360f2b9298" }, + "neo-tree.nvim": { "branch": "main", "commit": "5d172e8315444dbc32867d1c7b04d8e7e68ec4e1" }, + "neoconf.nvim": { "branch": "main", "commit": "b8ea8a1fe16b9c24a4dd701c7a03f414aee2c9ff" }, + "neotest": { "branch": "master", "commit": "d66cf4e05a116957f0d3a7755a24291c7d1e1f72" }, "neotest-go": { "branch": "main", "commit": "92950ad7be2ca02a41abca5c6600ff6ffaf5b5d6" }, + "neotest-haskell": { "branch": "master", "commit": "0a487915ef5fa317e620766f3505d900d2bdd07f" }, "neotest-jest": { "branch": "main", "commit": "514fd4eae7da15fd409133086bb8e029b65ac43f" }, "neotest-python": { "branch": "master", "commit": "a2861ab3c9a0bf75a56b11835c2bfc8270f5be7e" }, - "none-ls.nvim": { "branch": "main", "commit": "c279e541f73a2deea9deb5231b9c037678dd6353" }, + "none-ls.nvim": { "branch": "main", "commit": "ed8f80849ef1ad31c2f74679fafdef7801091247" }, "nui.nvim": { "branch": "main", "commit": "a0fd35fcbb4cb479366f1dc5f20145fd718a3733" }, - "nvim-autopairs": { "branch": "master", "commit": "b464658e9b880f463b9f7e6ccddd93fb0013f559" }, - "nvim-cmp": { "branch": "main", "commit": "3403e2e9391ed0a28c3afddd8612701b647c8e26" }, - "nvim-colorizer.lua": { "branch": "master", "commit": "4acf88d31b3a7a1a7f31e9c30bf2b23c6313abdb" }, - "nvim-dap": { "branch": "master", "commit": "b08e05d7cff6024a9c29b64287d295db7c191450" }, - "nvim-dap-go": { "branch": "main", "commit": "6aa88167ea1224bcef578e8c7160fe8afbb44848" }, + "nvim-autopairs": { "branch": "master", "commit": "3d02855468f94bf435db41b661b58ec4f48a06b7" }, + "nvim-cmp": { "branch": "main", "commit": "12509903a5723a876abd65953109f926f4634c30" }, + "nvim-colorizer.lua": { "branch": "master", "commit": "9b5fe0450bfb2521c6cea29391e5ec571f129136" }, + "nvim-dap": { "branch": "master", "commit": "b4f27d451c187de912fa8d3229025a952917eb9e" }, + "nvim-dap-go": { "branch": "main", "commit": "07739481317d36ddb3e3e8fbdfcd8f90b4167d73" }, "nvim-dap-python": { "branch": "master", "commit": "34282820bb713b9a5fdb120ae8dd85c2b3f49b51" }, - "nvim-dap-ui": { "branch": "master", "commit": "ffa89839f97bad360e78428d5c740fdad9a0ff02" }, - "nvim-highlight-colors": { "branch": "main", "commit": "e967e2ba13fd4ca731b41d0e5cc1ac2edcd6e25e" }, + "nvim-dap-repl-highlights": { "branch": "master", "commit": "a7512fc0a0de0c0be8d58983939856dda6f72451" }, + "nvim-dap-ui": { "branch": "master", "commit": "bc81f8d3440aede116f821114547a476b082b319" }, + "nvim-dap-virtual-text": { "branch": "master", "commit": "df66808cd78b5a97576bbaeee95ed5ca385a9750" }, "nvim-lsp-file-operations": { "branch": "master", "commit": "9744b738183a5adca0f916527922078a965515ed" }, - "nvim-lspconfig": { "branch": "master", "commit": "5a812abc65d529ea7673059a348814c21d7f87ff" }, - "nvim-nio": { "branch": "master", "commit": "a428f309119086dc78dd4b19306d2d67be884eee" }, - "nvim-notify": { "branch": "master", "commit": "fbef5d32be8466dd76544a257d3f3dce20082a07" }, - "nvim-treesitter": { "branch": "master", "commit": "337b503688eccb3046547661e4c738e674548fcf" }, - "nvim-treesitter-context": { "branch": "master", "commit": "8fd989b6b457a448606b4a2e51f9161700f609a7" }, + "nvim-lspconfig": { "branch": "master", "commit": "66bc018936c6ff76beb75f89d986af6442db4001" }, + "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, + "nvim-notify": { "branch": "master", "commit": "a3020c2cf4dfc4c4f390c4a21e84e35e46cf5d17" }, + "nvim-surround": { "branch": "main", "commit": "ae298105122c87bbe0a36b1ad20b06d417c0433e" }, + "nvim-treesitter": { "branch": "master", "commit": "53a6b3993f5803378d4d031bf114c0b125a52ba8" }, + "nvim-treesitter-context": { "branch": "master", "commit": "9a49f43a2ec9bf77aecfb0fcbc43af43338375c0" }, "nvim-treesitter-textobjects": { "branch": "master", "commit": "ad8f0a472148c3e0ae9851e26a722ee4e29b1595" }, "nvim-ts-autotag": { "branch": "main", "commit": "1cca23c9da708047922d3895a71032bc0449c52d" }, "nvim-ts-context-commentstring": { "branch": "main", "commit": "1b212c2eee76d787bbea6aa5e92a2b534e7b4f8f" }, "nvim-ufo": { "branch": "main", "commit": "a5390706f510d39951dd581f6d2a972741b3fa26" }, "nvim-vtsls": { "branch": "main", "commit": "45c6dfea9f83a126e9bfc5dd63430562b3f8af16" }, - "nvim-web-devicons": { "branch": "master", "commit": "e73d2774d12d0ecf9e05578d692ba1ea50508cf2" }, - "nvim-window-picker": { "branch": "main", "commit": "41cfaa428577c53552200a404ae9b3a0b5719706" }, + "nvim-web-devicons": { "branch": "master", "commit": "402377242b04be3f4f0f3720bd952df86e946c30" }, + "nvim-window-picker": { "branch": "main", "commit": "0dfef64eaf063e1cd27983ab11a30e7bc5b74fac" }, "package-info.nvim": { "branch": "master", "commit": "3de4f3569ce60e248707df042b72769b3ec343b8" }, - "plenary.nvim": { "branch": "master", "commit": "2d9b06177a975543726ce5c73fca176cedbffe9d" }, + "persistent-breakpoints.nvim": { "branch": "main", "commit": "4b199b1dcfd136cac8b0fa9c8dbbdeb81463f7a9" }, + "plenary.nvim": { "branch": "master", "commit": "3707cdb1e43f5cea73afb6037e6494e7ce847a66" }, "promise-async": { "branch": "main", "commit": "38a4575da9497326badd3995e768b4ccf0bb153e" }, - "quick-scope": { "branch": "master", "commit": "4d35d3b2bc6794666353dcc241b2680bd560416f" }, - "quicker.nvim": { "branch": "master", "commit": "049d66534d3de5920663ee1b8dd0096d70f55a67" }, + "quicker.nvim": { "branch": "master", "commit": "92e0f61a5d6422424cf7728ad323d2a06e3ab2d5" }, "refactoring.nvim": { "branch": "master", "commit": "2db6d378e873de31d18ade549c2edba64ff1c2e3" }, - "render-markdown.nvim": { "branch": "main", "commit": "0022a579ac7355966be5ade77699b88c76b6a549" }, + "render-markdown.nvim": { "branch": "main", "commit": "5c2440d932a4ba96840e5ce5a7bd40f0624bdaa2" }, "resession.nvim": { "branch": "master", "commit": "cc819b0489938d03e4f3532a583354f0287c015b" }, - "rustaceanvim": { "branch": "master", "commit": "0a618c1d1c05a8059880076feccb15301da6993d" }, - "smart-splits.nvim": { "branch": "master", "commit": "00fba7a0e912a8d82da91a3b6b11d641fa500bd8" }, - "telescope-egrepify.nvim": { "branch": "master", "commit": "a8070970a661330c4e00450d25f874f6c2b00af9" }, - "telescope-fzf-native.nvim": { "branch": "main", "commit": "cf48d4dfce44e0b9a2e19a008d6ec6ea6f01a83b" }, - "telescope.nvim": { "branch": "0.1.x", "commit": "2eca9ba22002184ac05eddbe47a7fe2d5a384dfc" }, - "template-string.nvim": { "branch": "main", "commit": "419bfb2e4d5f0e6ddd0d4435f85b69da0d88d524" }, + "rustaceanvim": { "branch": "master", "commit": "f03035fa03ccb36cd26d0792c946fbacba1d1a39" }, + "smart-splits.nvim": { "branch": "master", "commit": "4a231987665d3c6e02ca88833d050e918afe3e1e" }, + "snacks.nvim": { "branch": "main", "commit": "268ce8faa0cd83262328af5fe09cba5186558e82" }, + "sqls.nvim": { "branch": "main", "commit": "a514379f5f89bf72955ed3bf5c1c31a40b8a1472" }, + "telescope.nvim": { "branch": "master", "commit": "415af52339215926d705cccc08145f3782c4d132" }, + "template-string.nvim": { "branch": "main", "commit": "da5f326b65fb74fd068aa1d8b55461b64c8fb23b" }, "todo-comments.nvim": { "branch": "main", "commit": "ae0a2afb47cf7395dc400e5dc4e05274bf4fb9e0" }, - "toggleterm.nvim": { "branch": "main", "commit": "022ff5594acccc8d90d2e46dc43994f7722ebdf7" }, + "toggleterm.nvim": { "branch": "main", "commit": "50ea089fc548917cc3cc16b46a8211833b9e3c7c" }, + "tree-sitter-haskell": { "branch": "master", "commit": "0975ef72fc3c47b530309ca93937d7d143523628" }, "ts-error-translator.nvim": { "branch": "main", "commit": "47e5ba89f71b9e6c72eaaaaa519dd59bd6897df4" }, "tsc.nvim": { "branch": "main", "commit": "59abb6f3f24a3ca80708f694af4e2b727a1a3211" }, - "undotree": { "branch": "master", "commit": "78b5241191852ffa9bb5da5ff2ee033160798c3b" }, "venv-selector.nvim": { "branch": "regexp", "commit": "e82594274bf7b54387f9a2abe65f74909ac66e97" }, - "vim-dadbod": { "branch": "master", "commit": "f740950d0703099e0f172016f10e0e39f50fd0ba" }, - "vim-dadbod-completion": { "branch": "master", "commit": "04485bfb53a629423233a4178d71cd4f8abf7406" }, - "vim-dadbod-ui": { "branch": "master", "commit": "0fec59e3e1e619e302198cd491b7d27f8d398b7c" }, + "vim-dadbod": { "branch": "master", "commit": "9f0ca8bcef704659820a95c3bbd2c262583a66a1" }, + "vim-dadbod-completion": { "branch": "master", "commit": "c7f1be21a08b8fc9d927a19db89a4aa995402787" }, + "vim-dadbod-ui": { "branch": "master", "commit": "f4d37b7312ae6489e5c04bee654ca521baac188a" }, + "vim-dotenv": { "branch": "master", "commit": "5c51cfcf8d87280d6414e03cd6b253eb70ecb800" }, "vim-illuminate": { "branch": "master", "commit": "5eeb7951fc630682c322e88a9bbdae5c224ff0aa" }, - "vim-subversive": { "branch": "master", "commit": "cea98a62ded4028118ad71c3e81b26eff2e0b8a0" }, - "vim-visual-multi": { "branch": "master", "commit": "a6975e7c1ee157615bbc80fc25e4392f71c344d4" }, - "which-key.nvim": { "branch": "main", "commit": "8ab96b38a2530eacba5be717f52e04601eb59326" }, - "yazi.nvim": { "branch": "main", "commit": "2d6e9b9e2bda2294a978f60367598b75ea5b59d0" } + "vim-matchup": { "branch": "master", "commit": "aca23ce53ebfe34e02c4fe07e29e9133a2026481" }, + "which-key.nvim": { "branch": "main", "commit": "b74a3c85f03225bc91f4f5a9056518d3fa9a3470" } } diff --git a/.config/nvim-astro/lua/community.lua b/.config/nvim-astro/lua/community.lua index 159ed80..8a79af5 100644 --- a/.config/nvim-astro/lua/community.lua +++ b/.config/nvim-astro/lua/community.lua @@ -1,41 +1,55 @@ --- AstroCommunity: import any community modules here --- We import this file in `lazy_setup.lua` before the `plugins/` folder. --- This guarantees that the specs are processed before any user plugins. - ---@type LazySpec return { "AstroNvim/astrocommunity", - -- languages + { import = "astrocommunity.pack.lua" }, { import = "astrocommunity.pack.astro" }, { import = "astrocommunity.pack.bash" }, + { import = "astrocommunity.pack.blade" }, + { import = "astrocommunity.pack.cpp" }, { import = "astrocommunity.pack.docker" }, + { import = "astrocommunity.pack.elixir-phoenix" }, { import = "astrocommunity.pack.fish" }, { import = "astrocommunity.pack.go" }, - { import = "astrocommunity.pack.full-dadbod" }, + { import = "astrocommunity.pack.gleam" }, + { import = "astrocommunity.pack.haskell" }, { import = "astrocommunity.pack.html-css" }, { import = "astrocommunity.pack.json" }, + { import = "astrocommunity.pack.laravel" }, { import = "astrocommunity.pack.markdown" }, { import = "astrocommunity.pack.prisma" }, { import = "astrocommunity.pack.python-ruff" }, + { import = "astrocommunity.pack.rust" }, + { import = "astrocommunity.pack.sql" }, { import = "astrocommunity.pack.svelte" }, + { import = "astrocommunity.pack.tailwindcss" }, + { import = "astrocommunity.pack.templ" }, { import = "astrocommunity.pack.typescript" }, { import = "astrocommunity.pack.vue" }, { import = "astrocommunity.pack.yaml" }, - { import = "astrocommunity.pack.lua" }, - { import = "astrocommunity.pack.rust" }, - { import = "astrocommunity.pack.elixir-phoenix" }, + { import = "astrocommunity.pack.hyprlang" }, + { import = "astrocommunity.pack.full-dadbod" }, - { import = "astrocommunity.lsp.nvim-lsp-file-operations" }, - { import = "astrocommunity.lsp.ts-error-translator-nvim" }, + { import = "astrocommunity.quickfix.quicker-nvim" }, + { import = "astrocommunity.file-explorer.mini-files" }, + + { import = "astrocommunity.completion.magazine-nvim" }, - { import = "astrocommunity.editing-support.conform-nvim" }, - { import = "astrocommunity.editing-support.mini-operators" }, + { import = "astrocommunity.debugging.nvim-dap-repl-highlights" }, + { import = "astrocommunity.debugging.nvim-dap-virtual-text" }, + { import = "astrocommunity.debugging.persistent-breakpoints-nvim" }, + + { import = "astrocommunity.editing-support.dial-nvim" }, + -- { import = "astrocommunity.editing-support.multiple-cursors-nvim" }, { import = "astrocommunity.editing-support.nvim-treesitter-context" }, { import = "astrocommunity.editing-support.refactoring-nvim" }, - { import = "astrocommunity.quickfix.quicker-nvim" }, - { import = "astrocommunity.test.neotest" }, + { import = "astrocommunity.fuzzy-finder.snacks-picker" }, + { import = "astrocommunity.lsp.ts-error-translator-nvim" }, + { import = "astrocommunity.lsp.nvim-lsp-file-operations" }, - { import = "astrocommunity.recipes.telescope-nvchad-theme" }, - { import = "astrocommunity.recipes.telescope-lsp-mappings" }, + { import = "astrocommunity.markdown-and-latex.render-markdown-nvim" }, + { import = "astrocommunity.motion.flash-nvim" }, + { import = "astrocommunity.motion.nvim-surround" }, + { import = "astrocommunity.motion.vim-matchup" }, + { import = "astrocommunity.motion.vim-matchup" }, } diff --git a/.config/nvim-astro/lua/config/gruber-darker.lua b/.config/nvim-astro/lua/config/gruber-darker.lua deleted file mode 100644 index 0c358c4..0000000 --- a/.config/nvim-astro/lua/config/gruber-darker.lua +++ /dev/null @@ -1,20 +0,0 @@ ----@diagnostic disable-next-line: missing-fields -require("gruber-darker").setup({}) -local c = require("gruber-darker.palette") - -vim.api.nvim_set_hl(0, "MatchParenCur", { bold = true }) - -vim.api.nvim_set_hl(0, "@lsp.type.keyword.lua", { fg = c["brown"]:to_string(), bold = false }) -vim.api.nvim_set_hl(0, "@lsp.type.event.lua", { link = "GruberDarkerYellowBold" }) -vim.api.nvim_set_hl(0, "WinBar", { link = "TreesitterContext" }) --- vim.api.nvim_set_hl(0, 'WinBarNC', { link = 'NormalNC' }) -vim.api.nvim_set_hl( - 0, - "QuickScopePrimary", - { fg = c["yellow"]:to_string(), bg = c["bg+1"]:to_string(), underline = true, bold = true } -) -vim.api.nvim_set_hl( - 0, - "QuickScopeSecondary", - { fg = c["brown"]:to_string(), bg = c["bg+1"]:to_string(), underline = true, bold = true } -) diff --git a/.config/nvim-astro/lua/config/kangawa.lua b/.config/nvim-astro/lua/config/kangawa.lua deleted file mode 100644 index 44101f1..0000000 --- a/.config/nvim-astro/lua/config/kangawa.lua +++ /dev/null @@ -1,19 +0,0 @@ -require("kanagawa").setup({ - compile = true, - -- transparent = true, - -- dimInactive = false, - ---@type "wave" | "dragon" | "lotus" - theme = "dragon", - overrides = function(colors) -- add/modify highlights - local theme = colors.theme - return { - Pmenu = { fg = theme.ui.shade0, bg = theme.ui.bg_p1 }, -- add `blend = vim.o.pumblend` to enable transparency - PmenuSel = { fg = "NONE", bg = theme.ui.bg_p2 }, - PmenuSbar = { bg = theme.ui.bg_m1 }, - PmenuThumb = { bg = theme.ui.bg_p2 }, - QuickScopePrimary = { bold = true, underline = true, fg = colors.palette.carpYellow }, - QuickScopeSecondary = { bold = true, underline = true, fg = theme.syn.type }, - } - end, -}) -vim.cmd.colorscheme("kanagawa-dragon") diff --git a/.config/nvim-astro/lua/config/m-utils.lua b/.config/nvim-astro/lua/config/m-utils.lua deleted file mode 100644 index e0751f5..0000000 --- a/.config/nvim-astro/lua/config/m-utils.lua +++ /dev/null @@ -1,13 +0,0 @@ -local M = {} - ---- A wrapper around `age.nvim` to get the credentials from the identity file. ----@param secret_file string The secret file to read the credentials from(`secret_file` should be in location `$HOME/.config/age/`). ----@return string|nil secret The credentials from the identity file. -function M.get_age_credentials(secret_file) - if 0 == vim.fn.filereadable(vim.fn.expand "$HOME/.config/age/identity.txt") then return nil end - local identity = vim.fn.expand "$HOME/.config/age/identity.txt" - local secret = vim.fn.expand("$HOME/.config/age/" .. secret_file) - return require("age").get(secret, identity) -end - -return M diff --git a/.config/nvim-astro/lua/config/nordic.lua b/.config/nvim-astro/lua/config/nordic.lua deleted file mode 100644 index a503b8b..0000000 --- a/.config/nvim-astro/lua/config/nordic.lua +++ /dev/null @@ -1,22 +0,0 @@ -require("nordic").setup({ - transparent = { bg = true }, - -- Enable brighter float border. - bright_border = true, - on_highlight = function(highlights, palette) - highlights.QuickScopePrimary = { - fg = palette.yellow.bright, - bg = palette.gray0, - bold = true, - underline = true, - } - highlights.QuickScopeSecondary = { - fg = palette.orange.dim, - bg = palette.gray0, - bold = true, - underline = true, - } - highlights["@tag.attribute"] = { - fg = "#6cc3b7", -- #6dada4 | - } - end, -}) diff --git a/.config/nvim-astro/lua/lazy_setup.lua b/.config/nvim-astro/lua/lazy_setup.lua index c029505..5a55539 100644 --- a/.config/nvim-astro/lua/lazy_setup.lua +++ b/.config/nvim-astro/lua/lazy_setup.lua @@ -5,16 +5,14 @@ require("lazy").setup({ import = "astronvim.plugins", opts = { -- AstroNvim options must be set here with the `import` key mapleader = " ", -- This ensures the leader key must be configured before Lazy is set up - maplocalleader = ",", -- This ensures the localleader key must be configured before Lazy is set up + maplocalleader = "\\", -- This ensures the localleader key must be configured before Lazy is set up icons_enabled = true, -- Set to false to disable icons (if no Nerd Font is available) pin_plugins = nil, -- Default will pin plugins when tracking `version` of AstroNvim, set to true/false to override - update_notifications = false, -- Enable/disable notification about running `:Lazy update` twice to update pinned plugins + update_notifications = true, -- Enable/disable notification about running `:Lazy update` twice to update pinned plugins }, }, { import = "community" }, { import = "plugins" }, - { import = "plugins.ai" }, - { import = "plugins.mini" }, } --[[@as LazySpec]], { -- Configure any other `lazy.nvim` configuration options here install = { colorscheme = { "astrotheme", "habamax" } }, diff --git a/.config/nvim-astro/lua/plugins/ai.lua b/.config/nvim-astro/lua/plugins/ai.lua new file mode 100644 index 0000000..4206c74 --- /dev/null +++ b/.config/nvim-astro/lua/plugins/ai.lua @@ -0,0 +1,145 @@ +--- A wrapper around `age.nvim` to get the credentials from the identity file. +---@param secret_file string The secret file to read the credentials from(`secret_file` should be in location `$HOME/.config/age/`). +---@return string|nil secret The credentials from the identity file. +local function get_age_credentials(secret_file) + if 0 == vim.fn.filereadable(vim.fn.expand "$HOME/.config/age/identity.txt") then return nil end + local identity = vim.fn.expand "$HOME/.config/age/identity.txt" + local secret = vim.fn.expand("$HOME/.config/age/" .. secret_file) + return require("age").get(secret, identity) +end + +local function get_ollama_setup() + local ollama_setup = { + -- add any opts here + ---@type Provider + provider = "gemini", + vendors = { + ---@type AvanteProvider + ollama = { + ["local"] = true, + endpoint = "127.0.0.1:11434/v1", + model = "llama3.2", + parse_curl_args = function(opts, code_opts) + return { + url = opts.endpoint .. "/chat/completions", + headers = { + ["Accept"] = "application/json", + ["Content-Type"] = "application/json", + }, + body = { + model = opts.model, + messages = require("avante.providers").copilot.parse_message(code_opts), -- you can make your own message, but this is very advanced + max_tokens = 2048, + stream = true, + }, + } + end, + parse_response_data = function(data_stream, event_state, opts) + require("avante.providers").openai.parse_response(data_stream, event_state, opts) + end, + }, + }, + } + return ollama_setup +end + +---@type LazySpec +return { + { + "olimorris/codecompanion.nvim", + cmd = { + "CodeCompanion", + "CodeCompanionChat", + "CodeCompanionCmd", + "CodeCompanionActions", + }, + keys = { + { "c", "", desc = "+codecompanion", mode = { "n", "x" } }, + { "cc", "CodeCompanionChat toggle", desc = "Chat Toggle", mode = { "n", "x" } }, + { "cA", "CodeCompanionChat add", desc = "Chat Add Selection", mode = "x" }, + { "ca", "CodeCompanionActions", desc = "Chat Actions", mode = { "n", "x" } }, + { "cd", "CodeCompanionCmd/", desc = "Chat Cmd" }, + }, + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-treesitter/nvim-treesitter", + "KingMichaelPark/age.nvim", + { + "MeanderingProgrammer/render-markdown.nvim", + opts = { + file_types = { "markdown", "Avante", "codecompanion" }, + }, + ft = { "markdown", "Avante", "codecompanion" }, + }, + }, + config = function() + require("codecompanion").setup { + display = { chat = { render_headers = false } }, + strategies = { + --NOTE: Change the adapter as required + chat = { adapter = "gemini" }, + inline = { adapter = "gemini" }, + }, + adapters = { + gemini = function() + return require("codecompanion.adapters").extend("gemini", { + env = { + api_key = function() return get_age_credentials "gemini_api.age" end, + }, + schema = { + model = { + default = "gemini-2.0-flash", + -- default = "gemini-2.0-flash-thinking-exp-01-21", + }, + }, + }) + end, + }, + } + end, + }, + { + "yetone/avante.nvim", + version = false, + build = "make", + event = "InsertEnter", + opts = function() + vim.env.GEMINI_API_KEY = get_age_credentials "gemini_api.age" + if not vim.env.GEMINI_API_KEY then return get_ollama_setup() end + return { + ---@type Provider + provider = "gemini", + gemini = { + model = "gemini-2.0-flash", + -- model = "gemini-exp-1206", + }, + } + end, + dependencies = { + "KingMichaelPark/age.nvim", -- Add age dependency + "nvim-treesitter/nvim-treesitter", + "nvim-lua/plenary.nvim", + "MunifTanjim/nui.nvim", + "MeanderingProgrammer/render-markdown.nvim", + --- The below dependencies are optional, + "nvim-tree/nvim-web-devicons", -- or echasnovski/mini.icons + { + -- support for image pasting + "HakonHarnes/img-clip.nvim", + event = "VeryLazy", + opts = { + -- recommended settings + default = { + embed_image_as_base64 = false, + prompt_for_file_name = false, + drag_and_drop = { + insert_mode = true, + }, + -- required for Windows users + use_absolute_path = true, + }, + }, + }, + }, + }, +} diff --git a/.config/nvim-astro/lua/plugins/ai/avante.lua b/.config/nvim-astro/lua/plugins/ai/avante.lua deleted file mode 100644 index 485fe61..0000000 --- a/.config/nvim-astro/lua/plugins/ai/avante.lua +++ /dev/null @@ -1,101 +0,0 @@ ----@type LazySpec -return { - "yetone/avante.nvim", - version = false, - build = "make", - keys = { - { "a", "", mode = { "n", "x" }, desc = "+avante" }, - { "aa", mode = { "n", "x" }, desc = "Ask" }, - { "ae", mode = { "n", "x" }, desc = "Edit" }, - }, - opts = function() - vim.env.GEMINI_API_KEY = require("config.m-utils").get_age_credentials("gemini_api.age") - local ollama_setup = { - -- add any opts here - ---@type Provider - provider = "gemini", - vendors = { - ---@type AvanteProvider - ollama = { - ["local"] = true, - endpoint = "127.0.0.1:11434/v1", - model = "llama3.2", - parse_curl_args = function(opts, code_opts) - return { - url = opts.endpoint .. "/chat/completions", - headers = { - ["Accept"] = "application/json", - ["Content-Type"] = "application/json", - }, - body = { - model = opts.model, - messages = require("avante.providers").copilot.parse_message(code_opts), -- you can make your own message, but this is very advanced - max_tokens = 2048, - stream = true, - }, - } - end, - parse_response_data = function(data_stream, event_state, opts) - require("avante.providers").openai.parse_response(data_stream, event_state, opts) - end, - }, - }, - } - if not vim.env.GEMINI_API_KEY then - return ollama_setup - end - return { - ---@type Provider - provider = "gemini", - } - end, - dependencies = { - "KingMichaelPark/age.nvim", - "nvim-treesitter/nvim-treesitter", - { - "stevearc/dressing.nvim", - opts = { - select = { - -- Priority list of preferred vim.select implementations - backend = { "telescope", "fzf_lua", "fzf", "builtin", "nui" }, - -- Options for fzf-lua - fzf_lua = { - winopts = { - height = 0.5, - width = 0.8, - }, - }, - }, - }, - }, - "nvim-lua/plenary.nvim", - "MunifTanjim/nui.nvim", - --- The below dependencies are optional, - "nvim-tree/nvim-web-devicons", -- or echasnovski/mini.icons - { - -- support for image pasting - "HakonHarnes/img-clip.nvim", - event = "VeryLazy", - opts = { - -- recommended settings - default = { - embed_image_as_base64 = false, - prompt_for_file_name = false, - drag_and_drop = { - insert_mode = true, - }, - -- required for Windows users - use_absolute_path = true, - }, - }, - }, - { - -- Make sure to set this up properly if you have lazy=true - "MeanderingProgrammer/render-markdown.nvim", - opts = { - file_types = { "markdown", "Avante" }, - }, - ft = { "markdown", "Avante" }, - }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/ai/code-companion.lua b/.config/nvim-astro/lua/plugins/ai/code-companion.lua deleted file mode 100644 index 6c19ed4..0000000 --- a/.config/nvim-astro/lua/plugins/ai/code-companion.lua +++ /dev/null @@ -1,56 +0,0 @@ ----@type LazySpec -return { - "olimorris/codecompanion.nvim", - cmd = { - "CodeCompanion", - "CodeCompanionChat", - "CodeCompanionCmd", - "CodeCompanionActions", - }, - keys = { - { "C", "", desc = "+codecompanion", mode = { "n", "x" } }, - { "Cc", "CodeCompanionChat toggle", desc = "Chat Toggle", mode = { "n", "x" } }, - { "CA", "CodeCompanionChat add", desc = "Chat Add Selection", mode = "x" }, - { "Ca", "CodeCompanionActions", desc = "Chat Actions", mode = { "n", "x" } }, - { "Cd", "CodeCompanionCmd/", desc = "Chat Cmd" }, - }, - dependencies = { - "nvim-lua/plenary.nvim", - "nvim-treesitter/nvim-treesitter", - "KingMichaelPark/age.nvim", - { - "MeanderingProgrammer/render-markdown.nvim", - opts = { - file_types = { "markdown", "Avante", "codecompanion" }, - }, - ft = { "markdown", "Avante", "codecompanion" }, - }, - }, - config = function() - require("codecompanion").setup({ - display = { chat = { render_headers = false } }, - strategies = { - --NOTE: Change the adapter as required - chat = { adapter = "openai_compatible" }, - inline = { adapter = "openai_compatible" }, - }, - adapters = { - openai_compatible = function() - return require("codecompanion.adapters").extend("openai_compatible", { - env = { - url = "https://glhf.chat", - api_key = function() - return require("config.m-utils").get_age_credentials("glhf.age") - end, - chat_url = "/api/openai/v1/chat/completions", - }, - schema = { - model = { default = "hf:Qwen/Qwen2.5-Coder-32B-Instruct" }, - num_ctx = { default = 32768 }, - }, - }) - end, - }, - }) - end, -} diff --git a/.config/nvim-astro/lua/plugins/astrocore.lua b/.config/nvim-astro/lua/plugins/astrocore.lua index cda56a8..22e3fa8 100644 --- a/.config/nvim-astro/lua/plugins/astrocore.lua +++ b/.config/nvim-astro/lua/plugins/astrocore.lua @@ -1,24 +1,17 @@ -if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE - --- AstroCore provides a central place to modify mappings, vim options, autocommands, and more! --- Configuration documentation can be found with `:h astrocore` --- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`) --- as this provides autocomplete and documentation while editing - ---@type LazySpec return { "AstroNvim/astrocore", ---@type AstroCoreOpts opts = { -- Configure core features of AstroNvim - features = { - large_buf = { size = 1024 * 256, lines = 10000 }, -- set global limits for large files for disabling features like treesitter - autopairs = true, -- enable autopairs at start - cmp = true, -- enable completion at start - diagnostics_mode = 3, -- diagnostic mode on start (0 = off, 1 = no signs/virtual text, 2 = no virtual text, 3 = on) - highlighturl = true, -- highlight URLs at start - notifications = true, -- enable notifications at start - }, + -- features = { + -- large_buf = { size = 1024 * 256, lines = 10000 }, -- set global limits for large files for disabling features like treesitter + -- autopairs = true, -- enable autopairs at start + -- cmp = true, -- enable completion at start + -- diagnostics_mode = 3, -- diagnostic mode on start (0 = off, 1 = no signs/virtual text, 2 = no virtual text, 3 = on) + -- highlighturl = true, -- highlight URLs at start + -- notifications = true, -- enable notifications at start + -- }, -- Diagnostics configuration (for vim.diagnostics.config({...})) when diagnostics are on diagnostics = { virtual_text = true, @@ -31,41 +24,103 @@ return { number = true, -- sets vim.opt.number spell = false, -- sets vim.opt.spell signcolumn = "yes", -- sets vim.opt.signcolumn to yes - wrap = false, -- sets vim.opt.wrap + wrap = true, -- sets vim.opt.wrap + undolevels = 10000, + exrc = true, -- allows to create project specific settings + wildmode = "longest:full,full", + sessionoptions = { "blank", "buffers", "curdir", "globals", "help", "tabpages", "winsize", "terminal" }, + smoothscroll = true, + grepprg = "rg --vimgrep --smart-case", + scrolloff = 8, }, g = { -- vim.g. - -- configure global vim variables (vim.g) - -- NOTE: `mapleader` and `maplocalleader` must be set in the AstroNvim opts or before `lazy.setup` - -- This can be found in the `lua/lazy_setup.lua` file + markdown_recommended_style = 0, }, }, -- Mappings can be configured through AstroCore as well. -- NOTE: keycodes follow the casing in the vimdocs. For example, `` must be capitalized mappings = { - -- first key is the mode n = { - -- second key is the lefthand side of the map - - -- navigate buffer tabs - ["]b"] = { function() require("astrocore.buffer").nav(vim.v.count1) end, desc = "Next buffer" }, - ["[b"] = { function() require("astrocore.buffer").nav(-vim.v.count1) end, desc = "Previous buffer" }, - - -- mappings seen under group name "Buffer" - ["bd"] = { + ["\\"] = false, + ["c"] = false, + [",w"] = { "w!", desc = "Save File" }, + [",W"] = { "noautocmd w!", desc = "Save File(noautocmd)" }, + ["0"] = { "^", desc = "Goto Beginning" }, + dl = { '"_dl' }, + c = { '"_c' }, + C = { '"_C' }, + ["e"] = { + ':e =expand("%:p:h") . "/" ', + silent = false, + desc = "Edit in same dir", + }, + ["t"] = { + ':tabe =expand("%:p:h") . "/" ', + silent = false, + desc = "Edit in same dir(Tab)", + }, + ["v"] = { + ':vs =expand("%:p:h") . "/" ', + silent = false, + desc = "Edit in same dir(vsplit)", + }, + ["R"] = { function() - require("astroui.status.heirline").buffer_picker( - function(bufnr) require("astrocore.buffer").close(bufnr) end - ) + vim.cmd "source %" + local file = vim.fn.substitute(vim.fn.expand "%:r", "lua/", "", "") + local ok, mod = pcall(require, file) + if ok and type(mod) ~= "boolean" and next(mod or {}) ~= nil and mod.config then mod.config() end end, - desc = "Close buffer from tabline", + silent = false, + desc = "Reload module", + }, + ["="] = { + function() vim.lsp.buf.format(require("astrolsp").format_opts) end, + desc = "Format buffer", + }, + }, + v = { + ["0"] = { "^", desc = "Goto Beginning" }, + ["="] = { + function() vim.lsp.buf.format(require("astrolsp").format_opts) end, + desc = "Format buffer", + }, + }, + x = { + c = { '"_c' }, + p = { + [[ 'pgv"'.v:register.'y' ]], + expr = true, + desc = "Paste without overriding clipboard", + }, + }, + }, + filetypes = { + filename = { + vimfrc = "vim", + dwm_sxhkdrc = "sxhkdrc", + [".env"] = "conf", + [".env.*"] = "conf", + ["package.json"] = "jsonc", + }, + pattern = { + ["*profile"] = "sh", + ["*.postcss"] = "css", + ["*.kbd"] = "lisp", + [".eslintrc"] = "jsonc", + ["tsconfig.*.json"] = "jsonc", + [".*/waybar/config"] = "jsonc", + [".*/kitty/.+%.conf"] = "kitty", + [".*/hypr/.+%.conf"] = "hyprlang", + }, + }, + autocmds = { + fix_comment_continuation = { + { + event = "FileType", + desc = "Fix Comment Continuation", + callback = function() vim.opt_local.formatoptions = "jcrqlnt" end, }, - - -- tables with just a `desc` key will be registered with which-key if it's installed - -- this is useful for naming menus - -- ["b"] = { desc = "Buffers" }, - - -- setting a mapping to false will disable it - -- [""] = false, }, }, }, diff --git a/.config/nvim-astro/lua/plugins/astrolsp.lua b/.config/nvim-astro/lua/plugins/astrolsp.lua index 32477be..720b9d3 100644 --- a/.config/nvim-astro/lua/plugins/astrolsp.lua +++ b/.config/nvim-astro/lua/plugins/astrolsp.lua @@ -1,300 +1,105 @@ +if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE + +-- AstroLSP allows you to customize the features in AstroNvim's LSP configuration engine +-- Configuration documentation can be found with `:h astrolsp` +-- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`) +-- as this provides autocomplete and documentation while editing + ---@type LazySpec return { - { - "AstroNvim/astrolsp", - ---@type AstroLSPOpts - opts = { - -- Configuration table of features provided by AstroLSP - features = { - codelens = true, -- enable/disable codelens refresh on start - inlay_hints = true, -- enable/disable inlay hints on start - semantic_tokens = true, -- enable/disable semantic token highlighting - }, - -- customize lsp formatting options - formatting = { - -- control auto formatting on save - format_on_save = { - enabled = true, -- enable or disable format on save globally - allow_filetypes = { -- enable format on save for specified filetypes only - -- "go", - }, - ignore_filetypes = { -- disable format on save for specified filetypes - -- "python", - }, + "AstroNvim/astrolsp", + ---@type AstroLSPOpts + opts = { + -- Configuration table of features provided by AstroLSP + features = { + codelens = true, -- enable/disable codelens refresh on start + inlay_hints = false, -- enable/disable inlay hints on start + semantic_tokens = true, -- enable/disable semantic token highlighting + }, + -- customize lsp formatting options + formatting = { + -- control auto formatting on save + format_on_save = { + enabled = true, -- enable or disable format on save globally + allow_filetypes = { -- enable format on save for specified filetypes only + -- "go", }, - disabled = { -- disable formatting capabilities for the listed language servers - -- disable lua_ls formatting capability if you want to use StyLua to format your lua code - -- "lua_ls", + ignore_filetypes = { -- disable format on save for specified filetypes + -- "python", }, - timeout_ms = 1000, -- default format timeout - -- filter = function(client) -- fully override the default formatting function - -- return true - -- end - }, - -- enable servers that you already have installed without mason - servers = { - -- "pyright" }, - -- customize language server configuration options passed to `lspconfig` - ---@diagnostic disable: missing-fields - config = { - clangd = { capabilities = { offsetEncoding = "utf-8" } }, + disabled = { -- disable formatting capabilities for the listed language servers + -- disable lua_ls formatting capability if you want to use StyLua to format your lua code + -- "lua_ls", }, - -- customize how language servers are attached - handlers = { - -- a function without a key is simply the default handler, functions take two parameters, the server name and the configured options table for that server - -- function(server, opts) require("lspconfig")[server].setup(opts) end + timeout_ms = 1000, -- default format timeout + -- filter = function(client) -- fully override the default formatting function + -- return true + -- end + }, + -- enable servers that you already have installed without mason + servers = { + -- "pyright" + }, + -- customize language server configuration options passed to `lspconfig` + ---@diagnostic disable: missing-fields + config = { + -- clangd = { capabilities = { offsetEncoding = "utf-8" } }, + }, + -- customize how language servers are attached + handlers = { + -- a function without a key is simply the default handler, functions take two parameters, the server name and the configured options table for that server + -- function(server, opts) require("lspconfig")[server].setup(opts) end - -- the key is the server that is being setup with `lspconfig` - -- rust_analyzer = false, -- setting a handler to false will disable the set up of that language server - -- pyright = function(_, opts) require("lspconfig").pyright.setup(opts) end -- or a custom handler function can be passed - emmet_ls = function(_, opts) - opts.on_attach = function(client, bufnr) - vim.keymap.set("i", "", function() - client.request( - "textDocument/completion", - vim.lsp.util.make_position_params(0, client.offset_encoding), - function(_, result) - local textEdit = result.items[1].textEdit - local snip_string = textEdit.newText - textEdit.newText = "" - vim.lsp.util.apply_text_edits({ textEdit }, bufnr, client.offset_encoding) - local ok, luasnip = pcall(require, "luasnip") - if ok then - luasnip.lsp_expand(snip_string) - else - vim.snippet.expand(snip_string) - end - end, - bufnr - ) - end, { buffer = bufnr, desc = "Emmet Expand", noremap = true }) - end - require("lspconfig").emmet_ls.setup(opts) - end, - emmet_language_server = function(_, opts) - opts.on_attach = function(client, bufnr) - vim.keymap.set("i", "", function() - client.request( - "textDocument/completion", - vim.lsp.util.make_position_params(0, client.offset_encoding), - function(_, result) - local textEdit = result.items[1].textEdit - local snip_string = textEdit.newText - textEdit.newText = "" - vim.lsp.util.apply_text_edits({ textEdit }, bufnr, client.offset_encoding) - local ok, luasnip = pcall(require, "luasnip") - if ok then - luasnip.lsp_expand(snip_string) - else - vim.snippet.expand(snip_string) - end - end, - bufnr - ) - end, { buffer = bufnr, desc = "Emmet Expand", noremap = true }) - end - require("lspconfig").emmet_ls.setup(opts) - end, - }, - -- Configure buffer local auto commands to add when attaching a language server - autocmds = { - -- first key is the `augroup` to add the auto commands to (:h augroup) - lsp_codelens_refresh = { - -- Optional condition to create/delete auto command group - -- can either be a string of a client capability or a function of `fun(client, bufnr): boolean` - -- condition will be resolved for each client on each execution and if it ever fails for all clients, - -- the auto commands will be deleted for that buffer - cond = "textDocument/codeLens", - -- cond = function(client, bufnr) return client.name == "lua_ls" end, - -- list of auto commands to set - { - -- events to trigger - event = { "InsertLeave", "BufEnter" }, - -- the rest of the autocmd options (:h nvim_create_autocmd) - desc = "Refresh codelens (buffer)", - callback = function(args) - if require("astrolsp").config.features.codelens then vim.lsp.codelens.refresh { bufnr = args.buf } end - end, - }, - }, - }, - commands = { - ImportsOrganize = { - function() - vim.lsp.buf.code_action { - context = { only = { "source.organizeImports" } }, - apply = true, - } - end, - cond = "textDocument/codeAction", - desc = "Organize Imports", - }, - ImportsRemove = { - function() - vim.lsp.buf.code_action { - context = { only = { "source.removeUnused" } }, - apply = true, - } - end, - cond = "textDocument/codeAction", - desc = "Remove Unused Imports", - }, - FixAll = { - function() - vim.lsp.buf.code_action { - context = { only = { "source.fixAll" } }, - apply = true, - } + -- the key is the server that is being setup with `lspconfig` + -- rust_analyzer = false, -- setting a handler to false will disable the set up of that language server + -- pyright = function(_, opts) require("lspconfig").pyright.setup(opts) end -- or a custom handler function can be passed + }, + -- Configure buffer local auto commands to add when attaching a language server + autocmds = { + -- first key is the `augroup` to add the auto commands to (:h augroup) + lsp_codelens_refresh = { + -- Optional condition to create/delete auto command group + -- can either be a string of a client capability or a function of `fun(client, bufnr): boolean` + -- condition will be resolved for each client on each execution and if it ever fails for all clients, + -- the auto commands will be deleted for that buffer + cond = "textDocument/codeLens", + -- cond = function(client, bufnr) return client.name == "lua_ls" end, + -- list of auto commands to set + { + -- events to trigger + event = { "InsertLeave", "BufEnter" }, + -- the rest of the autocmd options (:h nvim_create_autocmd) + desc = "Refresh codelens (buffer)", + callback = function(args) + if require("astrolsp").config.features.codelens then vim.lsp.codelens.refresh { bufnr = args.buf } end end, - cond = "textDocument/codeAction", - desc = "Fix All fixable diagnostics", }, }, - -- mappings to be set up on attaching of a language server - mappings = { - n = { - -- a `cond` key can provided as the string of a server capability to be required to attach, or a function with `client` and `bufnr` parameters from the `on_attach` that returns a boolean - gD = { - function() vim.lsp.buf.declaration() end, - desc = "Declaration of current symbol", - cond = "textDocument/declaration", - }, - ["uY"] = { - function() require("astrolsp.toggles").buffer_semantic_tokens() end, - desc = "Toggle LSP semantic highlight (buffer)", - cond = function(client) - return client.supports_method "textDocument/semanticTokens/full" and vim.lsp.semantic_tokens ~= nil - end, - }, - gd = { - function() - local ok, builtin = pcall(require, "telescope.builtin") - if not ok then - vim.lsp.buf.references() - else - builtin.lsp_definitions() - end - end, - desc = "Goto references", - cond = "textDocument/definition", - }, - [""] = { - vim.lsp.buf.rename, - desc = "Rename", - cond = "textDocument/rename", - }, - grr = { - function() - local ok, builtin = pcall(require, "telescope.builtin") - if not ok then - vim.lsp.buf.references() - else - builtin.lsp_references() - end - end, - desc = "Goto references", - cond = "textDocument/references", - }, - ["grw"] = { - function() - local ok, builtin = pcall(require, "telescope.builtin") - if not ok then - vim.lsp.buf.document_symbol() - else - builtin.lsp_document_symbols() - end - end, - desc = "Document symbol", - cond = "textDocument/documentSymbol", - }, - ["grW"] = { - function() - local ok, builtin = pcall(require, "telescope.builtin") - if not ok then - vim.lsp.buf.workspace_symbol() - else - builtin.lsp_workspace_symbols() - end - end, - desc = "Workspace symbols", - cond = "workspace/symbol", - }, - ["lw"] = { - function() - local ok, builtin = pcall(require, "telescope.builtin") - if not ok then - vim.lsp.buf.document_symbol() - else - builtin.lsp_document_symbols() - end - end, - desc = "Document symbol", - cond = "textDocument/documentSymbol", - }, - ["lW"] = { - function() - local ok, builtin = pcall(require, "telescope.builtin") - if not ok then - vim.lsp.buf.workspace_symbol() - else - builtin.lsp_workspace_symbols() - end - end, - desc = "Workspace symbols", - cond = "workspace/symbol", - }, - ["="] = { - vim.lsp.buf.format, - desc = "Format buffer", - }, - ["lo"] = { - function() - vim.lsp.buf.code_action { - context = { only = { "source.organizeImports" } }, - apply = true, - } - end, - desc = "Oraganize imports", - cond = "textDocument/codeAction", - }, - ["lF"] = { - function() - vim.lsp.buf.code_action { - context = { only = { "source.fixAll" } }, - apply = true, - } - end, - desc = "Fix All", - cond = "textDocument/codeAction", - }, + }, + -- mappings to be set up on attaching of a language server + mappings = { + n = { + -- a `cond` key can provided as the string of a server capability to be required to attach, or a function with `client` and `bufnr` parameters from the `on_attach` that returns a boolean + gD = { + function() vim.lsp.buf.declaration() end, + desc = "Declaration of current symbol", + cond = "textDocument/declaration", }, - i = { - [""] = { - vim.lsp.buf.signature_help, - desc = "Signature help", - cond = "textDocument/signatureHelp", - }, + ["uY"] = { + function() require("astrolsp.toggles").buffer_semantic_tokens() end, + desc = "Toggle LSP semantic highlight (buffer)", + cond = function(client) + return client.supports_method "textDocument/semanticTokens/full" and vim.lsp.semantic_tokens ~= nil + end, }, }, - -- A custom `on_attach` function to be run after the default `on_attach` function - -- takes two parameters `client` and `bufnr` (`:h lspconfig-setup`) - on_attach = function(client, bufnr) - -- this would disable semanticTokensProvider for all clients - -- client.server_capabilities.semanticTokensProvider = nil - end, }, - }, - { - "williamboman/mason-lspconfig.nvim", - optional = true, - opts = function(_, opts) - -- opts.ensure_installed = vim.tbl_filter( - -- function(server_name) return server_name ~= "emmet_ls" end, - -- opts.ensure_installed or {} - -- ) - opts.ensure_installed = - require("astrocore").list_insert_unique(opts.ensure_installed, { "css_variables", "cssmodules_ls" }) + -- A custom `on_attach` function to be run after the default `on_attach` function + -- takes two parameters `client` and `bufnr` (`:h lspconfig-setup`) + on_attach = function(client, bufnr) + -- this would disable semanticTokensProvider for all clients + -- client.server_capabilities.semanticTokensProvider = nil end, }, } diff --git a/.config/nvim-astro/lua/plugins/astroui.lua b/.config/nvim-astro/lua/plugins/astroui.lua index 28aa924..7cd0803 100644 --- a/.config/nvim-astro/lua/plugins/astroui.lua +++ b/.config/nvim-astro/lua/plugins/astroui.lua @@ -1,12 +1,44 @@ ---@type LazySpec return { - "AstroNvim/astroui", - ---@type AstroUIOpts - opts = { - status = { - colors = { - buffer_active_bg = "#182b3f", - }, + { + "AstroNvim/astroui", + ---@type AstroUIOpts + opts = { + -- change colorscheme + -- colorscheme = "astrodark", + colorscheme = "jellybeans", + -- AstroUI allows you to easily modify highlight groups easily for any and all colorschemes + -- highlights = { + -- init = { -- this table overrides highlights in all themes + -- -- Normal = { bg = "#000000" }, + -- }, + -- astrodark = { -- a table of overrides/changes when applying the astrotheme theme + -- -- Normal = { bg = "#000000" }, + -- }, + -- }, + -- Icons can be configured throughout the interface + -- icons = { + -- -- configure the loading of the lsp in the status line + -- LSPLoading1 = "⠋", + -- LSPLoading2 = "⠙", + -- LSPLoading3 = "⠹", + -- LSPLoading4 = "⠸", + -- LSPLoading5 = "⠼", + -- LSPLoading6 = "⠴", + -- LSPLoading7 = "⠦", + -- LSPLoading8 = "⠧", + -- LSPLoading9 = "⠇", + -- LSPLoading10 = "⠏", + -- }, + }, + }, + { + "wtfox/jellybeans.nvim", + enabled = true, + opts = { + ---@type 'dark'|'light' + style = "dark", + transparent = true, }, }, } diff --git a/.config/nvim-astro/lua/plugins/color-highlight.lua b/.config/nvim-astro/lua/plugins/color-highlight.lua deleted file mode 100644 index e517539..0000000 --- a/.config/nvim-astro/lua/plugins/color-highlight.lua +++ /dev/null @@ -1,24 +0,0 @@ ----@type LazySpec -return { - "brenoprata10/nvim-highlight-colors", - event = "User AstroFile", - cmd = "HighlightColors", - opts = { - ---Render style - ---@type 'background'|'foreground'|'virtual' - render = "virtual", - enable_tailwind = true, - }, - dependencies = { - { - "AstroNvim/astrocore", - opts = function(_, opts) - local maps = opts.mappings - maps.n["uz"] = { function() vim.cmd.HighlightColors "Toggle" end, desc = "Toggle color highlight" } - end, - }, - }, - specs = { - { "NvChad/nvim-colorizer.lua", optional = true, enabled = false }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/conform.lua b/.config/nvim-astro/lua/plugins/conform.lua deleted file mode 100644 index d493b16..0000000 --- a/.config/nvim-astro/lua/plugins/conform.lua +++ /dev/null @@ -1,40 +0,0 @@ -local prettier = { "prettierd", "prettier", stop_after_first = true } - ----@param bufnr integer ----@param ... string ----@return string -local function first(bufnr, ...) - local conform = require "conform" - for i = 1, select("#", ...) do - local formatter = select(i, ...) - if conform.get_formatter_info(formatter, bufnr).available then return formatter end - end - return select(1, ...) -end - -local function prettier_eslint(bufnr) return { first(bufnr, "prettierd", "prettier"), "eslint_d" } end - ----@type LazySpec -return { - "stevearc/conform.nvim", - opts = { - formatters_by_ft = { - css = prettier, - html = prettier, - jsonc = prettier, - json = prettier, - json5 = prettier, - less = prettier, - markdown = prettier, - sass = prettier, - scss = prettier, - astro = prettier_eslint, - javascript = prettier_eslint, - javascriptreact = prettier_eslint, - typescript = prettier_eslint, - typescriptreact = prettier_eslint, - svelte = prettier_eslint, - vue = prettier_eslint, - }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/copilot.lua b/.config/nvim-astro/lua/plugins/copilot.lua deleted file mode 100644 index 033c4ed..0000000 --- a/.config/nvim-astro/lua/plugins/copilot.lua +++ /dev/null @@ -1,31 +0,0 @@ ----@type LazySpec -return { - "zbirenbaum/copilot.lua", - cmd = "Copilot", - build = ":Copilot auth", - event = "InsertEnter", - enabled = true, - config = function() - require("copilot").setup({ - suggestion = { - auto_trigger = true, - keymap = { accept = "" }, - }, - filetypes = { - yaml = true, - markdown = true, - help = false, - gitcommit = true, - gitrebase = true, - ["."] = true, - sh = function() - if string.match(vim.fs.basename(vim.api.nvim_buf_get_name(0)), "^%.env.*") then - -- disable for .env files - return false - end - return true - end, - }, - }) - end, -} diff --git a/.config/nvim-astro/lua/plugins/dial.lua b/.config/nvim-astro/lua/plugins/dial.lua deleted file mode 100644 index 7d9020a..0000000 --- a/.config/nvim-astro/lua/plugins/dial.lua +++ /dev/null @@ -1,172 +0,0 @@ -local M = {} - ----@param increment boolean ----@param g? boolean -function M.dial(increment, g) - local mode = vim.fn.mode(true) - -- Use visual commands for VISUAL 'v', VISUAL LINE 'V' and VISUAL BLOCK '\22' - local is_visual = mode == "v" or mode == "V" or mode == "\22" - local func = (increment and "inc" or "dec") .. (g and "_g" or "_") .. (is_visual and "visual" or "normal") - local group = vim.g.dials_by_ft[vim.bo.filetype] or "default" - return require("dial.map")[func](group) -end - ----@type LazySpec -return { - "monaqa/dial.nvim", - recommended = true, - desc = "Increment and decrement numbers, dates, and more", - -- stylua: ignore - keys = { - { "", function() return M.dial(true) end, expr = true, desc = "Increment", mode = {"n", "v"} }, - { "", function() return M.dial(false) end, expr = true, desc = "Decrement", mode = {"n", "v"} }, - { "g", function() return M.dial(true, true) end, expr = true, desc = "Increment", mode = {"n", "v"} }, - { "g", function() return M.dial(false, true) end, expr = true, desc = "Decrement", mode = {"n", "v"} }, - }, - opts = function() - local augend = require "dial.augend" - - local logical_alias = augend.constant.new { - elements = { "&&", "||" }, - word = false, - cyclic = true, - } - - local ordinal_numbers = augend.constant.new { - -- elements through which we cycle. When we increment, we go down - -- On decrement we go up - elements = { - "first", - "second", - "third", - "fourth", - "fifth", - "sixth", - "seventh", - "eighth", - "ninth", - "tenth", - }, - -- if true, it only matches strings with word boundary. firstDate wouldn't work for example - word = false, - -- do we cycle back and forth (tenth to first on increment, first to tenth on decrement). - -- Otherwise nothing will happen when there are no further values - cyclic = true, - } - - local weekdays = augend.constant.new { - elements = { - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday", - }, - word = true, - cyclic = true, - } - - local months = augend.constant.new { - elements = { - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - }, - word = true, - cyclic = true, - } - - local capitalized_boolean = augend.constant.new { - elements = { - "True", - "False", - }, - word = true, - cyclic = true, - } - - return { - dials_by_ft = { - css = "css", - vue = "vue", - javascript = "typescript", - typescript = "typescript", - typescriptreact = "typescript", - javascriptreact = "typescript", - json = "json", - lua = "lua", - markdown = "markdown", - sass = "css", - scss = "css", - python = "python", - }, - groups = { - default = { - augend.integer.alias.decimal, -- nonnegative decimal number (0, 1, 2, 3, ...) - augend.integer.alias.decimal_int, -- nonnegative and negative decimal number - augend.integer.alias.hex, -- nonnegative hex number (0x01, 0x1a1f, etc.) - augend.date.alias["%Y/%m/%d"], -- date (2022/02/19, etc.) - ordinal_numbers, - weekdays, - months, - capitalized_boolean, - augend.constant.alias.bool, -- boolean value (true <-> false) - logical_alias, - }, - vue = { - augend.constant.new { elements = { "let", "const" } }, - augend.hexcolor.new { case = "lower" }, - augend.hexcolor.new { case = "upper" }, - }, - typescript = { - augend.constant.new { elements = { "let", "const" } }, - }, - css = { - augend.hexcolor.new { - case = "lower", - }, - augend.hexcolor.new { - case = "upper", - }, - }, - markdown = { - augend.misc.alias.markdown_header, - }, - json = { - augend.semver.alias.semver, -- versioning (v1.1.2) - }, - lua = { - augend.constant.new { - elements = { "and", "or" }, - word = true, -- if false, "sand" is incremented into "sor", "doctor" into "doctand", etc. - cyclic = true, -- "or" is incremented into "and". - }, - }, - python = { - augend.constant.new { - elements = { "and", "or" }, - }, - }, - }, - } - end, - config = function(_, opts) - -- copy defaults to each group - for name, group in pairs(opts.groups) do - if name ~= "default" then vim.list_extend(group, opts.groups.default) end - end - require("dial.config").augends:register_group(opts.groups) - vim.g.dials_by_ft = opts.dials_by_ft - end, -} diff --git a/.config/nvim-astro/lua/plugins/disabled.lua b/.config/nvim-astro/lua/plugins/disabled.lua index 0569e40..4a198f1 100644 --- a/.config/nvim-astro/lua/plugins/disabled.lua +++ b/.config/nvim-astro/lua/plugins/disabled.lua @@ -1,5 +1,4 @@ ---@type LazySpec return { { "goolord/alpha-nvim", enabled = false }, - { "stevearc/resession.nvim", enabled = false }, } diff --git a/.config/nvim-astro/lua/plugins/dooing.lua b/.config/nvim-astro/lua/plugins/dooing.lua deleted file mode 100644 index 1bc171b..0000000 --- a/.config/nvim-astro/lua/plugins/dooing.lua +++ /dev/null @@ -1,15 +0,0 @@ ----@type LazySpec -return { - 'atiladefreitas/dooing', - keys = { 'td' }, - cmd = { 'Dooing' }, - opts = { - -- Keymaps - keymaps = { - toggle_window = 'td', - }, - }, - config = function(_, opts) - require('dooing').setup(opts) - end, -} diff --git a/.config/nvim-astro/lua/plugins/emmet.lua b/.config/nvim-astro/lua/plugins/emmet.lua new file mode 100644 index 0000000..469e84f --- /dev/null +++ b/.config/nvim-astro/lua/plugins/emmet.lua @@ -0,0 +1,25 @@ +---@type LazySpec +return { + { + "mattn/emmet-vim", + cmd = "EmmetInstall", + keys = { { "", desc = "Emmet plugin", mode = { "i", "n" } } }, + init = function() vim.g.user_emmet_install_global = 0 end, + }, + { + "AstroNvim/astrocore", + ---@type AstroCoreOpts + opts = { + autocmds = { + enable_emmet_in_fts = { + { + event = "FileType", + desc = "Enabled emmet plugin for specific filetypes", + pattern = { "html", "css", "scss", "javascriptreact", "typescriptreact", "astro", "vue", "svelte" }, + command = "EmmetInstall", + }, + }, + }, + }, + }, +} diff --git a/.config/nvim-astro/lua/plugins/flash.lua b/.config/nvim-astro/lua/plugins/flash.lua deleted file mode 100644 index 5feb9fa..0000000 --- a/.config/nvim-astro/lua/plugins/flash.lua +++ /dev/null @@ -1,18 +0,0 @@ ----@type LazySpec -return { - "folke/flash.nvim", - -- event = "VeryLazy", - ---@type Flash.Config - opts = { - modes = { char = { enabled = false, autohide = false } }, - }, - -- stylua: ignore - keys = { - { "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" }, - { "S", mode = { "n", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" }, - { "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" }, - { "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" }, - { "", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" }, - { "", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/grapple.lua b/.config/nvim-astro/lua/plugins/grapple.lua index 8f647e0..0ad3831 100644 --- a/.config/nvim-astro/lua/plugins/grapple.lua +++ b/.config/nvim-astro/lua/plugins/grapple.lua @@ -1,10 +1,6 @@ ---@type LazySpec return { "cbochs/grapple.nvim", - enabled = true, - dependencies = { - "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended - }, cmd = "Grapple", opts = { --- @type "git_branch"|"git"|"cwd"|"global"|"static"|"lsp" @@ -15,7 +11,6 @@ return { keys = { { "A", "Grapple toggle", desc = "Tag a file" }, { "`", "Grapple toggle", desc = "Tag a file" }, - { "", "Grapple toggle", desc = "Tag a file" }, { "", "Grapple toggle_tags", desc = "Toggle tags menu" }, { "'1", "Grapple select index=1", desc = "Select first tag" }, diff --git a/.config/nvim-astro/lua/plugins/gx-nvim.lua b/.config/nvim-astro/lua/plugins/gx-nvim.lua deleted file mode 100644 index 65ce90f..0000000 --- a/.config/nvim-astro/lua/plugins/gx-nvim.lua +++ /dev/null @@ -1,11 +0,0 @@ ----@type LazySpec -return { - "chrishrb/gx.nvim", - keys = { { "gx", "Browse", mode = { "n", "x" } } }, - cmd = { "Browse" }, - init = function() - vim.g.netrw_nogx = 1 -- disable netrw gx - end, - dependencies = { "nvim-lua/plenary.nvim" }, - config = true, -- default settings -} diff --git a/.config/nvim-astro/lua/plugins/markdown-bullets.lua b/.config/nvim-astro/lua/plugins/markdown-bullets.lua deleted file mode 100644 index 116a44f..0000000 --- a/.config/nvim-astro/lua/plugins/markdown-bullets.lua +++ /dev/null @@ -1,5 +0,0 @@ ----@type LazySpec -return { - "bullets-vim/bullets.vim", - ft = { "markdown", "gitcommit", "text" }, -} diff --git a/.config/nvim-astro/lua/plugins/markdown.lua b/.config/nvim-astro/lua/plugins/markdown.lua new file mode 100644 index 0000000..bcbb2cc --- /dev/null +++ b/.config/nvim-astro/lua/plugins/markdown.lua @@ -0,0 +1,42 @@ +local fts = { "markdown", "gitcommit", "text", "Avante" } +---@type LazySpec +return { + "bullets-vim/bullets.vim", + ft = fts, + enabled = true, + init = function() + vim.g.bullets_enabled_file_types = fts + vim.g.bullets_set_mappings = 0 + end, + config = function() + vim.api.nvim_create_autocmd("FileType", { + desc = "Setup Bullet-vim mappings because the default setup is messing up the snacks.picker input box", + group = vim.api.nvim_create_augroup("sp_markdow", { clear = true }), + pattern = fts, + callback = function(args) + local bufnr = args.buf + vim.keymap.set("i", "", "(bullets-newline)", { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set("i", "", "", { silent = true, buffer = bufnr }) + vim.keymap.set("n", "o", "(bullets-newline)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set({ "n", "v" }, "gN", "(bullets-renumber)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set("i", "", "(bullets-demote)", { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set("i", "", "(bullets-promote)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set("n", ">>", "(bullets-demote)", { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set("n", "<<", "(bullets-promote)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set("x", ">", "(bullets-demote)", { silent = true, buffer = bufnr, remap = true }) + vim.keymap.set("x", "<", "(bullets-promote)", { silent = true, buffer = bufnr, remap = true }) + + vim.keymap.set( + "n", + "xx", + "(bullets-toggle-checkbox)", + { desc = "Toggle Checkbox", silent = true, buffer = bufnr, remap = true } + ) + end, + }) + end, +} diff --git a/.config/nvim-astro/lua/plugins/mini-nvim.lua b/.config/nvim-astro/lua/plugins/mini-nvim.lua new file mode 100644 index 0000000..da895f9 --- /dev/null +++ b/.config/nvim-astro/lua/plugins/mini-nvim.lua @@ -0,0 +1,187 @@ +local mini_files = vim.api.nvim_create_augroup("sp_mini_files", {}) + +local minifiles_toggle = function(...) + local f = require "mini.files" + local arg_len = ... == nil and 0 or #... + if not f.close() then + if arg_len == 0 then + f.open(f.get_latest_path()) + else + f.open(...) + end + end +end + +---@type LazySpec +return { + { + "echasnovski/mini.files", + dependencies = { + { + "s1n7ax/nvim-window-picker", + version = "2.*", + config = function() + require("window-picker").setup { + filter_rules = { + include_current_win = false, + autoselect_one = true, + -- filter using buffer options + bo = { + -- if the file type is one of following, the window will be ignored + filetype = { "neo-tree", "neo-tree-popup", "notify" }, + -- if the buffer type is one of following, the window will be ignored + buftype = { "terminal", "quickfix" }, + }, + }, + --- @type 'statusline-winbar' | 'floating-big-letter' + hint = "floating-big-letter", + } + end, + }, + { + "AstroNvim/astrocore", + opts = { + mappings = { + n = { + ["e"] = { minifiles_toggle, desc = "Explorer" }, + ["E"] = { + function() minifiles_toggle(vim.api.nvim_buf_get_name(0), false) end, + desc = "Explorer(current file)", + }, + }, + }, + }, + }, + }, + opts = { + options = { + permanent_delete = false, + use_as_default_explorer = true, + }, + windows = { + preview = true, + width_focus = 30, + width_preview = 30, + }, + }, + config = function(_, opts) + require("mini.files").setup(opts) + + local map_split = function(buf_id, lhs, direction, close_on_file) + local rhs = function() + local new_target_window + local cur_target_window = require("mini.files").get_explorer_state().target_window + if cur_target_window ~= nil then + vim.api.nvim_win_call(cur_target_window, function() + vim.cmd("belowright " .. direction .. " split") + new_target_window = vim.api.nvim_get_current_win() + end) + + require("mini.files").set_target_window(new_target_window) + require("mini.files").go_in { close_on_file = close_on_file } + end + end + + local desc = "Open in " .. direction .. " split" + if close_on_file then desc = desc .. " and close" end + vim.keymap.set("n", lhs, rhs, { buffer = buf_id, desc = desc }) + end + + local function open_in_window_picker() + local f = require "mini.files" + local fs_entry = f.get_fs_entry() + if fs_entry ~= nil and fs_entry.fs_type == "file" then + local picked_window_id = require("window-picker").pick_window() + if picked_window_id == nil then return end + f.set_target_window(picked_window_id) + end + f.go_in { + close_on_file = true, + } + end + + vim.api.nvim_create_autocmd("User", { + pattern = "MiniFilesBufferCreate", + desc = "Setup mappings for MiniFiles", + group = mini_files, + callback = function(args) + local buf_id = args.data.buf_id + + map_split(buf_id, "gs", "horizontal", false) + map_split(buf_id, "gv", "vertical", false) + + map_split(buf_id, "s", "horizontal", false) + map_split(buf_id, "v", "vertical", false) + map_split(buf_id, "S", "horizontal", true) + map_split(buf_id, "V", "vertical", true) + + vim.keymap.set("n", "gw", open_in_window_picker, { buffer = buf_id, desc = "Open in target window" }) + end, + }) + vim.api.nvim_create_autocmd("User", { + pattern = "MiniFilesActionRename", + desc = "LSP renamed file", + group = mini_files, + callback = function(event) + local ok, snacks = pcall(require, "snacks") + if ok then snacks.rename.on_rename_file(event.data.from, event.data.to) end + end, + }) + end, + }, + { + "echasnovski/mini.operators", + keys = { + { "g=", mode = { "n", "x" }, desc = "Evalute" }, + { "ge", mode = { "n", "x" }, desc = "Exchange" }, + { "gm", mode = { "n", "x" }, desc = "Duplicate" }, + { "x", mode = { "n", "x" }, desc = "Replace with register" }, + { "gS", mode = { "n", "x" }, desc = "Sort" }, + "X", + }, + opts = { + -- Exchange text regions + exchange = { prefix = "ge" }, + replace = { prefix = "x" }, + sort = { prefix = "gS" }, + }, + config = function(_, opts) + require("mini.operators").setup(opts) + vim.keymap.set("n", "X", "x$", { desc = "Replace to end of line", remap = true }) + end, + }, + { + "echasnovski/mini.move", + keys = { + { "<", mode = { "n", "v" } }, + { ">", mode = { "n", "v" } }, + { "J", mode = "v" }, + { "K", mode = "v" }, + }, + opts = { + mappings = { + -- Move visual selection in Visual mode. Defaults are Alt (Meta) + hjkl. + left = "<", + right = ">", + down = "J", + up = "K", + + -- Move current line in Normal mode + line_left = "<", + line_right = ">", + line_down = "", + line_up = "", + }, + }, + -- config = function(_, opts) require("mini.move").setup(opts) end, + }, + { + + "echasnovski/mini.align", + keys = { "ga", "gA" }, + opts = {}, + -- config = function() + -- require('mini.align').setup({}) + -- end, + }, +} diff --git a/.config/nvim-astro/lua/plugins/mini/align.lua b/.config/nvim-astro/lua/plugins/mini/align.lua deleted file mode 100644 index 243ec36..0000000 --- a/.config/nvim-astro/lua/plugins/mini/align.lua +++ /dev/null @@ -1,7 +0,0 @@ ----@type LazySpec -return { - "echasnovski/mini.align", - version = "*", - keys = { "ga", "gA" }, - config = function() require("mini.align").setup {} end, -} diff --git a/.config/nvim-astro/lua/plugins/mini/move.lua b/.config/nvim-astro/lua/plugins/mini/move.lua deleted file mode 100644 index 87f4daf..0000000 --- a/.config/nvim-astro/lua/plugins/mini/move.lua +++ /dev/null @@ -1,29 +0,0 @@ ----@type LazySpec -return { - "echasnovski/mini.move", - keys = { - { ">", mode = "v" }, - { "<", mode = "v" }, - { "K", mode = "v" }, - { "J", mode = "v" }, - "", - "", - "", - "", - }, - opts = { - -- Move current line in Visual mode - mappings = { - left = "<", - right = ">", - down = "J", - up = "K", - - -- Move current line in Normal mode - line_left = "", - line_right = "", - line_down = "", - line_up = "", - }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/mini/operators.lua b/.config/nvim-astro/lua/plugins/mini/operators.lua deleted file mode 100644 index 15e23a1..0000000 --- a/.config/nvim-astro/lua/plugins/mini/operators.lua +++ /dev/null @@ -1,23 +0,0 @@ ----@type LazySpec -return { - "echasnovski/mini.operators", - version = "*", - enabled = true, - keys = { - { "g=", mode = { "n", "x" }, desc = "Evalute" }, - { "ge", mode = { "n", "x" }, desc = "Exchange" }, - { "gm", mode = { "n", "x" }, desc = "Duplicate" }, - { "x", mode = { "n", "x" }, desc = "Replace with register" }, - { "gs", mode = { "n", "x" }, desc = "Sort" }, - "X", - }, - opts = { - -- Exchange text regions - exchange = { prefix = "ge" }, - replace = { prefix = "x" }, - }, - config = function(_, opts) - require("mini.operators").setup(opts) - vim.keymap.set("n", "X", "x$", { desc = "Replace to end of line", remap = true }) - end, -} diff --git a/.config/nvim-astro/lua/plugins/mini/surround.lua b/.config/nvim-astro/lua/plugins/mini/surround.lua deleted file mode 100644 index 2b40a63..0000000 --- a/.config/nvim-astro/lua/plugins/mini/surround.lua +++ /dev/null @@ -1,26 +0,0 @@ ----@type LazySpec -return { - "echasnovski/mini.surround", - enabled = true, - keys = { - { "gz", "", desc = "+surround" }, - { "ys", mode = { "n", "v" }, desc = "Surround add" }, - { "ds", mode = { "n" }, desc = "Surround delete" }, - { "cs", mode = { "n" }, desc = "Surround replace" }, - { "gzf", mode = { "n" }, desc = "Surround find" }, - { "gzh", mode = { "n" }, desc = "Surround highlight" }, - }, - opts = { - search_method = "cover_or_prev", - n_lines = 500, - mappings = { - add = "ys", -- Add surrounding in Normal and Visual modes - delete = "ds", -- Delete surrounding - replace = "cs", -- Replace surrounding - find = "gzf", -- Find surrounding (to the right) - find_left = "gzF", -- Find surrounding (to the left) - highlight = "gzh", -- Highlight surrounding - update_n_lines = "gzn", -- Update `n_lines` - }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/multi-cursor.lua b/.config/nvim-astro/lua/plugins/multi-cursor.lua deleted file mode 100644 index 891e6a3..0000000 --- a/.config/nvim-astro/lua/plugins/multi-cursor.lua +++ /dev/null @@ -1,18 +0,0 @@ ----@type LazySpec -return { - "mg979/vim-visual-multi", - branch = "master", - enabled = true, - init = function() - vim.g.VM_maps = {} - vim.g.VM_mouse_mappings = 1 - vim.g.VM_maps = { - ["Find Under"] = "", - ["Find Subword Under"] = "", - ["Skip Region"] = "", - ["Select All"] = "", - ["Start Regex Search"] = "\\/", - } - end, - keys = { { "", mode = { "n", "v" } }, { "", mode = { "n", "v" } } }, -} diff --git a/.config/nvim-astro/lua/plugins/multiple-cursors.lua b/.config/nvim-astro/lua/plugins/multiple-cursors.lua new file mode 100644 index 0000000..90621f4 --- /dev/null +++ b/.config/nvim-astro/lua/plugins/multiple-cursors.lua @@ -0,0 +1,17 @@ +---@type LazySpec +return { + "smoka7/multicursors.nvim", + dependencies = { + "nvimtools/hydra.nvim", + }, + opts = {}, + cmd = { "MCstart", "MCvisual", "MCclear", "MCpattern", "MCvisualPattern", "MCunderCursor" }, + keys = { + { + mode = { "v", "n" }, + "m", + "MCstart", + desc = "Create a selection for selected text or word under the cursor", + }, + }, +} diff --git a/.config/nvim-astro/lua/plugins/neogen.lua b/.config/nvim-astro/lua/plugins/neogen.lua deleted file mode 100644 index ceaaf27..0000000 --- a/.config/nvim-astro/lua/plugins/neogen.lua +++ /dev/null @@ -1,15 +0,0 @@ ----@type LazySpec -return { - "danymat/neogen", - cmd = "Neogen", - keys = { - { "n", "", desc = "+neogen" }, - { "nn", "Neogen", desc = "Default" }, - { "nt", "Neogen type", desc = "Type" }, - { "nf", "Neogen file", desc = "File" }, - { "nc", "Neogen class", desc = "Class" }, - }, - opts = { - snippet_engine = "luasnip", - }, -} diff --git a/.config/nvim-astro/lua/plugins/neogit.lua b/.config/nvim-astro/lua/plugins/neogit.lua deleted file mode 100644 index 577a302..0000000 --- a/.config/nvim-astro/lua/plugins/neogit.lua +++ /dev/null @@ -1,41 +0,0 @@ ----@type LazySpec -return { - "NeogitOrg/neogit", - cmd = "Neogit", - dependencies = { - "nvim-lua/plenary.nvim", - { "AstroNvim/astroui", opts = { icons = { Neogit = "󰰔" } } }, - { - "AstroNvim/astrocore", - opts = function(_, opts) - local maps = opts.mappings - local prefix = "g" - maps.n[prefix .. "n"] = { "Neogit kind=floating", desc = "Toggle Neogit" } - end, - }, - }, - specs = { - { - "catppuccin", - optional = true, - ---@type CatppuccinOptions - opts = { integrations = { neogit = true } }, - }, - }, - event = "User AstroGitFile", - opts = function(_, opts) - local utils = require "astrocore" - local disable_builtin_notifications = utils.is_available "nvim-notify" or utils.is_available "noice.nvim" - - return utils.extend_tbl(opts, { - disable_builtin_notifications = disable_builtin_notifications, - disable_signs = true, - telescope_sorter = function() - if utils.is_available "telescope-fzf-native.nvim" then - return require("telescope").extensions.fzf.native_fzf_sorter() - end - end, - integrations = { telescope = utils.is_available "telescope.nvim" }, - }) - end, -} diff --git a/.config/nvim-astro/lua/plugins/nvim-cmp.lua b/.config/nvim-astro/lua/plugins/nvim-cmp.lua index 66cda32..570aa4d 100644 --- a/.config/nvim-astro/lua/plugins/nvim-cmp.lua +++ b/.config/nvim-astro/lua/plugins/nvim-cmp.lua @@ -1,111 +1,78 @@ ---- detect if the current completion item is an emmet completion item ---- @param entry cmp.Entry ---- @return boolean -local function isEmmet(entry) - return ( - entry:get_kind() == require("cmp.types").lsp.CompletionItemKind.Text - or entry:get_kind() == require("cmp.types").lsp.CompletionItemKind.Snippet - ) - and ( - entry.source:get_debug_name() == "nvim_lsp:emmet_language_server" - or entry.source:get_debug_name() == "nvim_lsp:emmet_ls" - ) -end ---@type LazySpec return { { - "iguanacucumber/magazine.nvim", - lazy = true, - config = function() - vim.opt.rtp:remove(require("astrocore").get_plugin("nvim-cmp").dir) - vim.opt.rtp:remove(require("astrocore").get_plugin("cmp-buffer").dir) - vim.opt.rtp:remove(require("astrocore").get_plugin("cmp-nvim-lsp").dir) - end, - specs = { - "hrsh7th/nvim-cmp", - dependencies = { - "iguanacucumber/magazine.nvim", - { "hrsh7th/cmp-path", enabled = false }, - { "hrsh7th/cmp-buffer", enabled = true }, - { "hrsh7th/cmp-nvim-lsp", enabled = true }, - }, - opts = function(_, opts) - local cmp = require "cmp" - - opts.mapping[""] = cmp.mapping.complete { - config = { sources = { { name = "luasnip" } } }, - } - opts.mapping[""] = cmp.mapping.complete { - config = { - sources = { - { - name = "nvim_lsp", - entry_filter = function(entry) return isEmmet(entry) end, - }, - }, - }, - } - opts.mapping[""] = cmp.mapping { - i = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true }, - c = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }, - } - opts.mapping[""] = cmp.mapping { - i = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true }, - c = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }, - } - end, - config = function(_, opts) - local cmp, astro = require "cmp", require "astrocore" - local sources = {} - for source_plugin, source in pairs { - ["lazydev.nvim"] = { - name = "lazydev", - group_index = 0, -- set group index to 0 to skip loading LuaLS completions - }, - ["mag-buffer"] = { name = "buffer", priority = 500, group_index = 2 }, - ["cmp_luasnip"] = { name = "luasnip", priority = 750 }, - ["mag-nvim-lsp"] = { - name = "nvim_lsp", - priority = 1000, - entry_filter = function(entry) return not isEmmet(entry) end, - }, - ["cmp-path"] = { name = "path", priority = 250 }, - ["cmp-async-path"] = { name = "async_path", priority = 250 }, - ["cmp-rg"] = { name = "rg", priority = 350, group_index = 2 }, - } do - if astro.is_available(source_plugin) then table.insert(sources, source) end - end - opts.sources = sources - cmp.setup(opts) - - cmp.setup.cmdline("/", { - mapping = cmp.mapping.preset.cmdline(), - sources = { - { name = "buffer" }, - }, - }) - cmp.setup.cmdline(":", { - mapping = cmp.mapping.preset.cmdline(), - sources = cmp.config.sources({ - { name = "path" }, - }, { - { - name = "cmdline", - option = { - ignore_cmds = { "Man", "!" }, - }, - }, - }), - }) - end, - }, - keys = { ":", "/", "?" }, + "nvim-cmp", + keys = { ":", "/", "?" }, -- lazy load cmp on more keys along with insert mode dependencies = { - { "iguanacucumber/mag-nvim-lsp", opts = {} }, - { "iguanacucumber/mag-buffer" }, - { "iguanacucumber/mag-cmdline", name = "cmp-cmdline", lazy = true }, + -- { "hrsh7th/cmp-path", enabled = false }, + -- { "hrsh7th/cmp-nvim-lsp", enabled = false }, + -- { "hrsh7th/cmp-buffer", enabled = false }, + { "iguanacucumber/mag-cmdline", name = "cmp-cmdline" }, + { "iguanacucumber/mag-nvim-lsp", name = "cmp-nvim-lsp", opts = {} }, + { "iguanacucumber/mag-buffer", name = "cmp-buffer" }, + { "iguanacucumber/mag-cmdline", name = "cmp-cmdline" }, "lukas-reineke/cmp-rg", "https://codeberg.org/FelipeLema/cmp-async-path", }, + opts = function(_, opts) + local cmp = require "cmp" + opts.mapping[""] = cmp.mapping.complete { + config = { sources = { { name = "luasnip" } } }, + } + opts.mapping[""] = cmp.mapping { + i = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true }, + c = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }, + } + opts.mapping[""] = cmp.mapping { + i = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true }, + c = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }, + } + -- modify the sources part of the options table + opts.sources = cmp.config.sources { + { name = "nvim_lsp", priority = 1000 }, + { name = "luasnip", priority = 750 }, + { name = "buffer", priority = 500 }, + { name = "async_path", priority = 600 }, + { + name = "rg", + keyword_length = 3, + max_item_count = 10, + priority = 200, + }, + } + end, + config = function(_, opts) + local cmp = require "cmp" + -- run cmp setup + cmp.setup(opts) + + -- configure `cmp-cmdline` as described in their repo: https://github.com/hrsh7th/cmp-cmdline#setup + cmp.setup.cmdline("/", { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = "buffer" }, + }, + }) + cmp.setup.cmdline(":", { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = "path" }, + }, { + { + name = "cmdline", + option = { + ignore_cmds = { "Man", "!", "find", "fin" }, + }, + }, + }), + }) + end, + }, + { + "LuaSnip", + config = function(...) + require "astronvim.plugins.configs.luasnip"(...) + require("luasnip.loaders.from_vscode").lazy_load { paths = { vim.fn.stdpath "config" .. "/snippets" } } + end, }, } diff --git a/.config/nvim-astro/lua/plugins/quick-scope.lua b/.config/nvim-astro/lua/plugins/quick-scope.lua deleted file mode 100644 index 0eb7409..0000000 --- a/.config/nvim-astro/lua/plugins/quick-scope.lua +++ /dev/null @@ -1,10 +0,0 @@ ----@type LazySpec -return { - "unblevable/quick-scope", - keys = { "f", "F", "t", "T" }, - init = function() - vim.g.qs_highlight_on_keys = { "f", "F", "t", "T" } - vim.g.qs_buftype_blacklist = { "terminal", "nofile", "dashboard", "startify" } - vim.g.qs_lazy_highlight = 1 - end, -} diff --git a/.config/nvim-astro/lua/plugins/session.lua b/.config/nvim-astro/lua/plugins/session.lua new file mode 100644 index 0000000..96113f2 --- /dev/null +++ b/.config/nvim-astro/lua/plugins/session.lua @@ -0,0 +1,65 @@ +-- function for calculating the current session name +local get_session_name = function() + local name = vim.fn.getcwd() + local branch = vim.fn.system "git branch --show-current" + if vim.v.shell_error == 0 then + return name .. vim.trim(branch --[[@as string]]) + else + return name + end +end + +---@type LazySpec +return { + "AstroNvim/astrocore", + ---@type AstroCoreOpts + opts = { + sessions = { + -- disable the auto-saving of directory sessions + autosave = { cwd = false }, + }, + mappings = { + n = { + -- update save dirsession mapping to get the correct session name + ["SS"] = { + function() require("resession").save(get_session_name(), { dir = "dirsession" }) end, + desc = "Save this dirsession", + }, + -- update load dirsession mapping to get the correct session name + ["S."] = { + function() require("resession").load(get_session_name(), { dir = "dirsession" }) end, + desc = "Load current dirsession", + }, + }, + }, + autocmds = { + -- disable alpha autostart. I've disabled `alpha-nvim` + -- alpha_autostart = false, + git_branch_sessions = { + -- auto save directory sessions on leaving + { + event = "VimLeavePre", + desc = "Save git branch directory sessions on close", + callback = vim.schedule_wrap(function() + if require("astrocore.buffer").is_valid_session() then + require("resession").save(get_session_name(), { dir = "dirsession", notify = false }) + end + end), + }, + -- auto restore previous previous directory session, remove if necessary + { + event = "VimEnter", + desc = "Restore previous directory session if neovim opened with no arguments", + nested = true, -- trigger other autocommands as buffers open + callback = function() + -- Only load the session if nvim was started with no args + if vim.fn.argc(-1) == 0 then + -- try to load a directory session using the current working directory + require("resession").load(get_session_name(), { dir = "dirsession", silence_errors = true }) + end + end, + }, + }, + }, + }, +} diff --git a/.config/nvim-astro/lua/plugins/sessions.lua b/.config/nvim-astro/lua/plugins/sessions.lua deleted file mode 100644 index ef14f83..0000000 --- a/.config/nvim-astro/lua/plugins/sessions.lua +++ /dev/null @@ -1,19 +0,0 @@ ----@type LazySpec -return { - "rmagatti/auto-session", - lazy = false, - cmd = { "AutoSession", "SessionManager" }, - ---enables autocomplete for opts - ---@module "auto-session" - ---@type AutoSession.Config - opts = { - suppressed_dirs = { "~/", "~/Projects", "~/Downloads", "/" }, - use_git_branch = true, - }, - keys = { - { "S", "", desc = "+[S]ession" }, - { "Ss", "SessionSave", desc = "[S]ave" }, - { "Sl", "AutoSession search", desc = "[L]ist" }, - { "Sd", "AutoSession delete", desc = "[D]elte" }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/snacks.lua b/.config/nvim-astro/lua/plugins/snacks.lua new file mode 100644 index 0000000..25d3fbc --- /dev/null +++ b/.config/nvim-astro/lua/plugins/snacks.lua @@ -0,0 +1,204 @@ +---@param picker snacks.Picker +local function copy_path_full(picker) + local selected = picker:selected({ fallback = true })[1] + if not selected or selected == nil then return end + vim.schedule(function() + local full_path = vim.fn.fnamemodify(selected.file, ":p") + vim.fn.setreg("+", full_path) + vim.notify(full_path, vim.log.levels.INFO, { title = "File Path Copied" }) + end) +end +---FIXME: not working currently +---@param picker snacks.Picker +local function copy_path_relative(picker) + local selected = picker:selected({ fallback = true })[1] + if not selected or selected == nil then return end + vim.schedule(function() + local full_path = vim.fs.normalize(selected.file) + vim.fn.setreg("+", full_path) + vim.notify(full_path, vim.log.levels.INFO, { title = "File Path Copied" }) + end) +end + +---@type LazySpec +return { + { + "snacks.nvim", + ---@type snacks.Config + opts = { + picker = { + enabled = true, + layout = { preset = "dropdown" }, + matcher = { frecency = true, history_bonus = true }, + ---@class snacks.picker.formatters.Config + formatters = { file = { filename_first = true } }, + sources = { + explorer = { + layout = { layout = { position = "right" }, cycle = false }, + actions = { + copy_path_full = copy_path_full, + copy_path_relative = copy_path_relative, + }, + win = { + list = { + keys = { + ["/"] = false, + ["f"] = { "toggle_focus", mode = { "n" } }, + ["Y"] = { "copy_path_full", mode = { "n" } }, + ["gy"] = { "copy_path_relative", mode = { "n" } }, + }, + }, + }, + }, + }, + win = { + -- input window + input = { + keys = { + [""] = { "edit_split", mode = { "i", "n" } }, + [""] = { "edit_tab", mode = { "i", "n" } }, + [""] = { "copy", mode = { "i", "n" } }, + }, + }, + list = { keys = { [""] = "edit_split" } }, + }, + }, + lazygit = {}, + }, + keys = { + { + "", + function() Snacks.lazygit() end, + desc = "Toggle Lazygit", + }, + { + "m", + function() Snacks.zen.zoom() end, + desc = "Toggle Zoom", + }, + { + "", + function() Snacks.picker.files { layout = { preset = "vscode" } } end, + desc = "Find Files", + }, + { + "ff", + function() Snacks.picker.files { layout = { preset = "vscode" } } end, + desc = "Find Files", + }, + { + "fF", + function() Snacks.picker.files { layout = { preset = "vscode" }, hidden = true, ignored = true } end, + desc = "Find all files", + }, + { + "fn", + function() Snacks.picker.files { cwd = vim.fn.stdpath "config", layout = { preset = "vscode" } } end, + desc = "Find Config File", + }, + { + "fN", + function() Snacks.picker.files { cwd = vim.fn.stdpath "data" .. "/lazy", layout = { preset = "vscode" } } end, + desc = "Neovim Data dir", + }, + { + "fd", + function() + Snacks.picker.files { cwd = vim.fn.expand "~/Documents/dotfiles/.config", layout = { preset = "vscode" } } + end, + desc = "Find Dotfiles", + }, + { + "fg", + function() Snacks.picker.git_files { layout = { preset = "vscode" } } end, + desc = "Find Git Files", + }, + { + "fs", + function() Snacks.picker.grep() end, + desc = "Search/Grep", + }, + { + "fS", + function() Snacks.picker.grep_buffers() end, + desc = "Search/Grep in Open Buffers", + }, + { + "fo", + function() Snacks.picker.smart() end, + desc = "Find buffers/recent/files", + }, + { + "fr", + function() Snacks.picker.resume() end, + desc = "Resume", + }, + { + "fO", + function() Snacks.picker.recent { layout = { preset = "vertical" } } end, + desc = "Old Files", + }, + { + "f,", + function() Snacks.picker.recent { layout = { preset = "vertical" }, filter = { cwd = true } } end, + desc = "Old Files(cwd)", + }, + { + "fz", + function() Snacks.picker.zoxide { layout = { preset = "vertical" } } end, + desc = "Zoxided", + }, + { + "fw", + function() Snacks.picker.grep_word() end, + desc = "Visual selection or word", + mode = { "n", "x" }, + }, + { + "fW", + function() Snacks.picker.grep_word { hidden = true, ignored = true } end, + desc = "Visual selection or word", + mode = { "n", "x" }, + }, + { + "-", + function() Snacks.explorer() end, + desc = "Explorer", + }, + }, + }, + { + "AstroNvim/astrolsp", + ---@param opts AstroLSPOpts + opts = function(_, opts) + if opts.mappings.n.gd then + opts.mappings.n.gd[1] = function() + require("snacks").picker.lsp_definitions { layout = { preset = "ivy_split" } } + end + end + if opts.mappings.n.gI then + opts.mappings.n.gI[1] = function() + require("snacks").picker.lsp_implementations { layout = { preset = "ivy_split" } } + end + end + if opts.mappings.n.gy then + opts.mappings.n.gy[1] = function() + require("snacks").picker.lsp_type_definitions { layout = { preset = "ivy_split" } } + end + end + if opts.mappings.n["lG"] then + opts.mappings.n["lG"][1] = require("snacks").picker.lsp_workspace_symbols + end + if opts.mappings.n["lR"] then + opts.mappings.n["lR"][1] = function() + require("snacks").picker.lsp_references { layout = { preset = "ivy_split" } } + end + end + opts.mappings.n["grr"] = { + function() require("snacks").picker.lsp_references { layout = { preset = "ivy_split" } } end, + desc = "LSP References", + } + -- opts.mappings.n["gra"][1] = require("snacks").picker.lsp_references + end, + }, +} diff --git a/.config/nvim-astro/lua/plugins/subversive.lua b/.config/nvim-astro/lua/plugins/subversive.lua deleted file mode 100644 index ce38305..0000000 --- a/.config/nvim-astro/lua/plugins/subversive.lua +++ /dev/null @@ -1,10 +0,0 @@ ----@type LazySpec -return { - "svermeulen/vim-subversive", - enabled = false, - keys = { - { "x", "(SubversiveSubstitute)", noremap = false }, - { "X", "(SubversiveSubstituteToEndOfLine)", noremap = false }, - { "xx", "(SubversiveSubstituteLine)", noremap = false }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/telescope.lua b/.config/nvim-astro/lua/plugins/telescope.lua deleted file mode 100644 index 53b3379..0000000 --- a/.config/nvim-astro/lua/plugins/telescope.lua +++ /dev/null @@ -1,125 +0,0 @@ -local function filename_first(_, path) - local tail = vim.fs.basename(path) - local parent = vim.fs.dirname(path) - if parent == "." then return tail end - return string.format("%s\t\t%s", tail, parent) -end - ----@type LazySpec -return { - { - "nvim-telescope/telescope.nvim", - opts = { - extensions = { - egrepify = { - prefixes = { - --- trying to use flag `--type` - ["@"] = { - flag = "type", - cb = function(input) - -- check if the input has any commas - if string.find(input, ",") then return string.format([[{%s}]], input) end - return string.format([[%s]], input) - end, - }, - ["<"] = { - flag = "type-not", - cb = function(input) - -- check if the input has any commas - if string.find(input, ",") then return string.format([[{%s}]], input) end - return string.format([[%s]], input) - end, - }, - }, - }, - }, - pickers = { - find_files = { path_display = filename_first, previewer = false }, - buffers = { - ignore_current_buffer = true, - sort_lastused = true, - mappings = { - i = { [""] = "delete_buffer" }, - n = { d = "delete_buffer" }, - }, - }, - }, - defaults = { - vimgrep_arguments = { - "rg", - "--color=never", - "--no-heading", - "--with-filename", - "--line-number", - "--column", - "--smart-case", - "--hidden", - "--trim", -- add this value - "--glob=!.git/", - "--glob=!node_modules/", - "--glob=!.venv/", - "--glob=!venv/", - }, - }, - }, - keys = { - { "", function() require("telescope.builtin").find_files() end, desc = "Find files" }, - { - "fn", - function() require("telescope.builtin").find_files { cwd = vim.fn.stdpath "config" } end, - desc = "Neovim Config", - }, - { - "fd", - function() - require("telescope.builtin").find_files { cwd = vim.fn.expand "~/Documents/dotfiles", hidden = true } - end, - desc = "Dotfiles", - }, - { - "fl", - function() require("telescope.builtin").find_files { cwd = vim.fn.stdpath "data" .. "/lazy" } end, - desc = "All Plugins", - }, - { "fN", "Telescope notify", desc = "Notification" }, - }, - }, - { - "fdschmidt93/telescope-egrepify.nvim", - lazy = true, - dependencies = "nvim-lua/plenary.nvim", - specs = { - { - "nvim-telescope/telescope.nvim", - dependencies = { - { "fdschmidt93/telescope-egrepify.nvim", dependencies = "nvim-lua/plenary.nvim" }, - { - "AstroNvim/astrocore", - opts = { - mappings = { - n = { - ["fs"] = { "Telescope egrepify", desc = "Search" }, - }, - }, - }, - }, - }, - opts = function() require("telescope").load_extension "egrepify" end, - }, - }, - }, - -- { - -- "natecraddock/telescope-zf-native.nvim", - -- lazy = true, - -- specs = { - -- { - -- "nvim-telescope/telescope.nvim", - -- dependencies = { - -- "natecraddock/telescope-zf-native.nvim", - -- { "nvim-telescope/telescope-fzf-native.nvim", build = "make", enabled = false }, - -- }, - -- opts = function() require("telescope").load_extension "zf-native" end, - -- }, - -- }, - -- }, -} diff --git a/.config/nvim-astro/lua/plugins/template-string.lua b/.config/nvim-astro/lua/plugins/template-string.lua index b1e32a8..903e184 100644 --- a/.config/nvim-astro/lua/plugins/template-string.lua +++ b/.config/nvim-astro/lua/plugins/template-string.lua @@ -1,8 +1,9 @@ ---@type LazySpec return { "axelvc/template-string.nvim", - event = "InsertEnter", - opts = { - remove_template_string = true, + ft = { "html", "typescript", "javascript", "typescriptreact", "javascriptreact", "vue", "svelte", "python", "cs" }, -- filetypes where the plugin is active + dependencies = { + "nvim-treesitter", }, + opts = {}, } diff --git a/.config/nvim-astro/lua/plugins/toggleterm.lua b/.config/nvim-astro/lua/plugins/toggleterm.lua index f8a184c..8b966d1 100644 --- a/.config/nvim-astro/lua/plugins/toggleterm.lua +++ b/.config/nvim-astro/lua/plugins/toggleterm.lua @@ -1,9 +1,42 @@ ---@type LazySpec return { - "akinsho/toggleterm.nvim", - keys = { "" }, - opts = { - direction = "float", - open_mapping = [[]], + { + "toggleterm.nvim", + keys = { "" }, + opts = { + open_mapping = [[]], + direction = "float", + -- shell = "fish", + on_open = function(t) + local bufnr = t.bufnr + vim.opt_local.foldexpr = "" + vim.opt_local.foldmethod = "manual" + vim.keymap.set("t", "", "", { buffer = bufnr, desc = "Goto normal mode" }) + vim.keymap.set("n", "A", "A", { buffer = bufnr }) + vim.keymap.set("n", "D", "A", { buffer = bufnr }) + vim.keymap.set("n", "cc", "A", { buffer = bufnr }) + vim.keymap.set("n", "dd", "A", { buffer = bufnr }) + end, + }, }, + -- { + -- + -- "AstroNvim/astrocore", + -- ---@type AstroCoreOpts + -- opts = { + -- autocmds = { + -- togglerm_fixes = { + -- { + -- event = "FileType", + -- pattern = "toggleterm", + -- desc = "fix: to disable foldexpr for terminal to fix this issue. Takes too much time to open terminal.", + -- callback = function() + -- vim.opt_local.foldexpr = "" + -- vim.opt_local.foldmethod = "manual" + -- end, + -- }, + -- }, + -- }, + -- }, + -- }, } diff --git a/.config/nvim-astro/lua/plugins/tpope.lua b/.config/nvim-astro/lua/plugins/tpope.lua deleted file mode 100644 index 3a3cb3d..0000000 --- a/.config/nvim-astro/lua/plugins/tpope.lua +++ /dev/null @@ -1,13 +0,0 @@ ----@type LazySpec -return { - { 'tpope/vim-repeat', event = 'VeryLazy' }, - { - 'tpope/vim-abolish', - keys = { 'cr' }, - cmd = { 'Abolish', 'Subvert', 'S' }, - }, - { - 'tpope/vim-dispatch', - cmd = { 'Dispatch', 'Make', 'Focus', 'Start', 'FocusDispatch', 'Spawn', 'Copen', 'AbortDispatch' }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/treesitter.lua b/.config/nvim-astro/lua/plugins/treesitter.lua index 94436aa..a762ff0 100644 --- a/.config/nvim-astro/lua/plugins/treesitter.lua +++ b/.config/nvim-astro/lua/plugins/treesitter.lua @@ -1,15 +1,21 @@ -if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE - --- Customize Treesitter - ---@type LazySpec return { "nvim-treesitter/nvim-treesitter", opts = { - ensure_installed = { - "lua", - "vim", - -- add more arguments for adding more treesitter parsers + textobjects = { + swap = { + enable = true, + swap_next = { + ["k"] = { query = "@block.outer", desc = "Swap next block" }, + ["f"] = { query = "@function.outer", desc = "Swap next function" }, + ["a"] = { query = "@parameter.inner", desc = "Swap next argument" }, + }, + swap_previous = { + ["K"] = { query = "@block.outer", desc = "Swap previous block" }, + ["F"] = { query = "@function.outer", desc = "Swap previous function" }, + ["A"] = { query = "@parameter.inner", desc = "Swap previous argument" }, + }, + }, }, }, } diff --git a/.config/nvim-astro/lua/plugins/undotree.lua b/.config/nvim-astro/lua/plugins/undotree.lua deleted file mode 100644 index c4facec..0000000 --- a/.config/nvim-astro/lua/plugins/undotree.lua +++ /dev/null @@ -1,8 +0,0 @@ ----@type LazySpec -return { - "mbbill/undotree", - keys = { - { "", "UndotreeToggle" }, - { "tu", "UndotreeToggle", desc = "UndotreeToggle" }, - }, -} diff --git a/.config/nvim-astro/lua/plugins/yazi.lua b/.config/nvim-astro/lua/plugins/yazi.lua deleted file mode 100644 index 71b1edd..0000000 --- a/.config/nvim-astro/lua/plugins/yazi.lua +++ /dev/null @@ -1,31 +0,0 @@ ----@type LazySpec -return { - "mikavilpas/yazi.nvim", - version = false, - dependencies = { - "nvim-lua/plenary.nvim", - }, - cmd = "Yazi", - keys = { - { "", "Yazi toggle", desc = "Togggle Yazi" }, - { "-", "Yazi", desc = "Open Yazi at the current file" }, - { "ty", "Yazi cwd", desc = "File Manager in cwd(Yazi)" }, - }, - ---@type YaziConfig - opts = { - open_for_directories = false, - use_ya_for_events_reading = true, - use_yazi_client_id_flag = true, - highlight_hovered_buffers_in_same_directory = false, - integrations = { - --- What should be done when the user wants to grep in a directory - ---@param directory string - grep_in_directory = function(directory) - require("fzf-lua").live_grep_native { - prompt = "Search in " .. directory, - cwd = directory, - } - end, - }, - }, -} diff --git a/.config/nvim-astro/lua/polish.lua b/.config/nvim-astro/lua/polish.lua index f973e96..5b65b7d 100644 --- a/.config/nvim-astro/lua/polish.lua +++ b/.config/nvim-astro/lua/polish.lua @@ -1,52 +1,18 @@ -local sp_group = vim.api.nvim_create_augroup("sp_custom", { clear = true }) +if true then return end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE -vim.api.nvim_create_autocmd("TermOpen", { - group = sp_group, - pattern = "term://*", - desc = "Keybindings for Terminal", - callback = function(args) - local bufnr = args.buf - vim.keymap.set("t", "", "", { buffer = bufnr }) - end, -}) - -vim.api.nvim_create_autocmd("FileType", { - group = sp_group, - pattern = "toggleterm", - desc = "fix: to disable foldexpr for terminal to fix this issue. Takes too much time to open terminal.", - callback = function() - vim.opt_local.foldexpr = "" - vim.opt_local.foldmethod = "manual" - end, -}) - -vim.api.nvim_create_autocmd("FileType", { - group = sp_group, - pattern = "qf", - desc = "load cfilter", - command = "packadd cfilter", -}) +-- This will run last in the setup process and is a good place to configure +-- things like custom filetypes. This is just pure lua so anything that doesn't +-- fit in the normal config locations above can go here -- Set up custom filetypes vim.filetype.add { extension = { - fish = "fish", - ocaml = "ocaml", - rasi = "rasi", - roc = "roc", + foo = "fooscript", }, filename = { - vimfrc = "vim", - dwm_sxhkdrc = "sxhkdrc", - [".env"] = "conf", - [".env.*"] = "conf", - ["package.json"] = "jsonc", + ["Foofile"] = "fooscript", }, pattern = { - ["*profile"] = "sh", - ["*.postcss"] = "css", - ["*.kbd"] = "lisp", - ["tsconfig.*.json"] = "jsonc", - [".*/hyprland%.conf"] = "hyprlang", + ["~/%.config/foo/.*"] = "fooscript", }, } diff --git a/.config/nvim-astro/neovim.yml b/.config/nvim-astro/neovim.yml index b9235ab..55edf45 100644 --- a/.config/nvim-astro/neovim.yml +++ b/.config/nvim-astro/neovim.yml @@ -4,3 +4,5 @@ base: lua51 globals: vim: any: true + Snacks: + any: true diff --git a/.config/nvim-astro/snippets/javascriptreact.json b/.config/nvim-astro/snippets/javascriptreact.json new file mode 100644 index 0000000..49b9870 --- /dev/null +++ b/.config/nvim-astro/snippets/javascriptreact.json @@ -0,0 +1,88 @@ +{ + "useClient": { + "prefix": "uc", + "body": ["\"use client\";$0"], + "description": "use client for next.js" + }, + "reactClientComponent": { + "prefix": "rnc", + "body": [ + "\"use client\";", + "", + "const ${1:${TM_FILENAME_BASE/(?:^|[-_])(\\w)/${1:/upcase}/g}} = () => {", + " return (", + "