From 28e8bdf7f8286bd431b7f3b709e79f3827b31469 Mon Sep 17 00:00:00 2001 From: TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> Date: Wed, 24 Dec 2025 13:54:03 +0900 Subject: updates --- debian/.config/LazyVim/.gitignore | 8 + debian/.config/LazyVim/.neoconf.json | 15 + debian/.config/LazyVim/LICENSE | 201 + debian/.config/LazyVim/README.md | 4 + debian/.config/LazyVim/init.lua | 2 + debian/.config/LazyVim/lua/config/autocmds.lua | 8 + debian/.config/LazyVim/lua/config/keymaps.lua | 3 + debian/.config/LazyVim/lua/config/lazy.lua | 53 + debian/.config/LazyVim/lua/config/options.lua | 3 + debian/.config/LazyVim/lua/plugins/example.lua | 197 + debian/.config/LazyVim/stylua.toml | 3 + debian/.config/NvChad/.stylua.toml | 6 + debian/.config/NvChad/LICENSE | 24 + debian/.config/NvChad/README.md | 9 + debian/.config/NvChad/init.lua | 37 + debian/.config/NvChad/lua/autocmds.lua | 1 + debian/.config/NvChad/lua/chadrc.lua | 30 + debian/.config/NvChad/lua/configs/conform.lua | 15 + debian/.config/NvChad/lua/configs/lazy.lua | 47 + debian/.config/NvChad/lua/configs/lspconfig.lua | 55 + debian/.config/NvChad/lua/mappings.lua | 10 + debian/.config/NvChad/lua/options.lua | 6 + debian/.config/NvChad/lua/plugins/init.lua | 52 + .../after/queries/markdown/textobjects.scm | 3 + debian/.config/TheSiahxyz/ftplugin/markdown.lua | 518 + debian/.config/TheSiahxyz/ftplugin/quarto.lua | 6 + debian/.config/TheSiahxyz/init.lua | 1 + .../TheSiahxyz/lua/TheSiahxyz/core/autocmds.lua | 388 + .../TheSiahxyz/lua/TheSiahxyz/core/keymaps.lua | 807 + .../TheSiahxyz/lua/TheSiahxyz/core/lazy.lua | 257 + .../TheSiahxyz/lua/TheSiahxyz/core/options.lua | 48 + .../.config/TheSiahxyz/lua/TheSiahxyz/health.lua | 60 + debian/.config/TheSiahxyz/lua/TheSiahxyz/init.lua | 15 + .../TheSiahxyz/lua/TheSiahxyz/plugins/ai.lua | 901 + .../TheSiahxyz/lua/TheSiahxyz/plugins/cloak.lua | 42 + .../TheSiahxyz/lua/TheSiahxyz/plugins/cmp.lua | 331 + .../lua/TheSiahxyz/plugins/colorizer.lua | 76 + .../lua/TheSiahxyz/plugins/colorschemes.lua | 350 + .../TheSiahxyz/lua/TheSiahxyz/plugins/comment.lua | 8 + .../TheSiahxyz/lua/TheSiahxyz/plugins/compiler.lua | 53 + .../TheSiahxyz/lua/TheSiahxyz/plugins/context.lua | 25 + .../TheSiahxyz/lua/TheSiahxyz/plugins/csv.lua | 55 + .../TheSiahxyz/lua/TheSiahxyz/plugins/dadbod.lua | 56 + .../TheSiahxyz/lua/TheSiahxyz/plugins/dap.lua | 337 + .../TheSiahxyz/lua/TheSiahxyz/plugins/docker.lua | 251 + .../TheSiahxyz/lua/TheSiahxyz/plugins/git.lua | 229 + .../TheSiahxyz/lua/TheSiahxyz/plugins/goyo.lua | 39 + .../TheSiahxyz/lua/TheSiahxyz/plugins/grug-far.lua | 31 + .../TheSiahxyz/lua/TheSiahxyz/plugins/harpoon2.lua | 124 + .../TheSiahxyz/lua/TheSiahxyz/plugins/image.lua | 210 + .../TheSiahxyz/lua/TheSiahxyz/plugins/init.lua | 87 + .../TheSiahxyz/lua/TheSiahxyz/plugins/keys.lua | 121 + .../TheSiahxyz/lua/TheSiahxyz/plugins/lsp.lua | 707 + .../TheSiahxyz/lua/TheSiahxyz/plugins/lualine.lua | 355 + .../TheSiahxyz/lua/TheSiahxyz/plugins/macro.lua | 172 + .../TheSiahxyz/lua/TheSiahxyz/plugins/markdown.lua | 554 + .../TheSiahxyz/lua/TheSiahxyz/plugins/marks.lua | 16 + .../TheSiahxyz/lua/TheSiahxyz/plugins/mini.lua | 1178 + .../TheSiahxyz/lua/TheSiahxyz/plugins/navic.lua | 52 + .../TheSiahxyz/lua/TheSiahxyz/plugins/neo-tree.lua | 167 + .../TheSiahxyz/lua/TheSiahxyz/plugins/obsidian.lua | 616 + .../TheSiahxyz/lua/TheSiahxyz/plugins/outline.lua | 11 + .../TheSiahxyz/lua/TheSiahxyz/plugins/project.lua | 12 + .../TheSiahxyz/lua/TheSiahxyz/plugins/python.lua | 54 + .../TheSiahxyz/lua/TheSiahxyz/plugins/quickfix.lua | 76 + .../lua/TheSiahxyz/plugins/refactoring.lua | 78 + .../TheSiahxyz/lua/TheSiahxyz/plugins/rest.lua | 133 + .../TheSiahxyz/lua/TheSiahxyz/plugins/sessions.lua | 60 + .../TheSiahxyz/lua/TheSiahxyz/plugins/silicon.lua | 152 + .../TheSiahxyz/lua/TheSiahxyz/plugins/snippets.lua | 72 + .../TheSiahxyz/lua/TheSiahxyz/plugins/ssh.lua | 427 + .../lua/TheSiahxyz/plugins/stay-centered.lua | 29 + .../TheSiahxyz/lua/TheSiahxyz/plugins/surround.lua | 14 + .../lua/TheSiahxyz/plugins/telescope.lua | 1133 + .../lua/TheSiahxyz/plugins/textobject.lua | 173 + .../TheSiahxyz/lua/TheSiahxyz/plugins/todo.lua | 77 + .../lua/TheSiahxyz/plugins/treesitter.lua | 38 + .../TheSiahxyz/lua/TheSiahxyz/plugins/ufo.lua | 138 + .../TheSiahxyz/lua/TheSiahxyz/plugins/urlview.lua | 132 + .../lua/TheSiahxyz/plugins/virt-column.lua | 17 + .../TheSiahxyz/lua/TheSiahxyz/plugins/wiki.lua | 173 + .../TheSiahxyz/lua/TheSiahxyz/plugins/yazi.lua | 270 + .../TheSiahxyz/lua/TheSiahxyz/plugins/zenmode.lua | 82 + .../TheSiahxyz/lua/TheSiahxyz/snippets/journal.lua | 119 + .../lua/TheSiahxyz/snippets/markdown.lua | 187 + .../lua/TheSiahxyz/snippets/neetcode1.lua | 103 + .../lua/TheSiahxyz/snippets/neetcode2.lua | 104 + .../TheSiahxyz/lua/TheSiahxyz/snippets/quarto.lua | 28 + .../lua/TheSiahxyz/snippets/recordings.lua | 30 + .../lua/TheSiahxyz/snippets/whichkey.lua | 18 + .../TheSiahxyz/lua/TheSiahxyz/utils/cheatsheet.lua | 13 + .../lua/TheSiahxyz/utils/cheatsheet/grid.lua | 105 + .../lua/TheSiahxyz/utils/cheatsheet/init.lua | 116 + .../TheSiahxyz/lua/TheSiahxyz/utils/icons.lua | 168 + .../TheSiahxyz/lua/TheSiahxyz/utils/markdown.lua | 26 + .../TheSiahxyz/lua/TheSiahxyz/utils/snippet.lua | 38 + .../TheSiahxyz/lua/TheSiahxyz/utils/tasks.lua | 227 + .../TheSiahxyz/lua/TheSiahxyz/utils/tmux.lua | 63 + .../TheSiahxyz/lua/TheSiahxyz/utils/utils.lua | 147 + debian/.config/TheSiahxyz/spell/en.utf-8.add | 114 + debian/.config/TheSiahxyz/spell/en.utf-8.add.spl | Bin 0 -> 1376 bytes debian/.config/TheSiahxyz/spell/ko.utf-8.dic | 101599 ++++++++++++++++++ debian/.config/TheSiahxyz/spell/ko.utf-8.spl | Bin 0 -> 275220 bytes debian/.config/asus_jack_audio_issue.txt | 7 + debian/.config/atuin/config.toml | 210 + debian/.config/bash/bash_profile | 40 + debian/.config/bash/bashrc | 705 + debian/.config/bat/config | 8 + .../.config/bat/themes/Catppuccin Frappe.tmTheme | 2059 + debian/.config/bat/themes/Catppuccin Latte.tmTheme | 2059 + .../bat/themes/Catppuccin Macchiato.tmTheme | 2059 + debian/.config/bat/themes/Catppuccin Mocha.tmTheme | 2059 + debian/.config/blacklist.conf | 1 + debian/.config/calcurse/conf | 33 + debian/.config/calcurse/keys | 56 + debian/.config/crons | 10 + debian/.config/fastfetch/config.jsonc | 167 + debian/.config/firefox/chrome/userChrome.css | 106 + debian/.config/firefox/enhanceforyoutube.json | 109 + debian/.config/firefox/thesiah.js | 34 + debian/.config/firefox/vdh-settings.json | 90 + debian/.config/firefox/vimium-options.json | 32 + debian/.config/fontconfig/fonts.conf | 70 + debian/.config/gem/gemrc | 3 + debian/.config/git/attributes | 95 + debian/.config/git/config | 88 + debian/.config/git/gitk | 64 + debian/.config/git/ignore | 117 + debian/.config/gitmux/gitmux.conf | 86 + debian/.config/gtk-2.0/gtkrc-2.0 | 21 + debian/.config/gtk-3.0/settings.ini | 20 + debian/.config/htop/htoprc | 53 + debian/.config/latexmk/latexmkrc | 10 + debian/.config/lazygit/config.yml | 15 + debian/.config/lf/cleaner | 5 + debian/.config/lf/icons | 336 + debian/.config/lf/lfrc | 617 + debian/.config/lf/rooticons | 336 + debian/.config/lf/scope | 83 + debian/.config/lynx/.lynxrc | 344 + debian/.config/lynx/lynx.cfg | 3835 + debian/.config/lynx/lynx.lss | 116 + debian/.config/mimeapps.list | 38 + debian/.config/mpd/mpd.conf | 20 + debian/.config/mpd/playlists/entire.m3u | 890 + debian/.config/mpd/playlists/jpop.m3u | 156 + debian/.config/mpd/playlists/kpop.m3u | 113 + debian/.config/mpd/playlists/pop.m3u | 56 + debian/.config/mpv/input.conf | 123 + debian/.config/mpv/mpv.conf | 11 + debian/.config/mpv/osc.conf | 1 + .../.config/mpv/script-modules/extended-menu.lua | 1214 + debian/.config/mpv/script-modules/gallery.lua | 581 + .../.config/mpv/script-modules/input-console.lua | 935 + debian/.config/mpv/script-modules/mpvSockets.lua | 36 + debian/.config/mpv/script-modules/scroll-list.lua | 293 + debian/.config/mpv/script-modules/sha1.lua | 334 + .../mpv/script-modules/user-input-module.lua | 126 + debian/.config/mpv/script-modules/utf8/LICENSE | 21 + debian/.config/mpv/script-modules/utf8/README.md | 93 + .../utf8/begins/compiletime/parser.lua | 17 + .../utf8/begins/compiletime/vanilla.lua | 60 + .../utf8/charclass/compiletime/builder.lua | 128 + .../utf8/charclass/compiletime/parser.lua | 21 + .../utf8/charclass/compiletime/range.lua | 44 + .../utf8/charclass/compiletime/stub.lua | 9 + .../utf8/charclass/compiletime/vanilla.lua | 131 + .../script-modules/utf8/charclass/runtime/base.lua | 184 + .../utf8/charclass/runtime/dummy.lua | 41 + .../script-modules/utf8/charclass/runtime/init.lua | 22 + .../utf8/charclass/runtime/native.lua | 47 + .../script-modules/utf8/context/compiletime.lua | 18 + .../mpv/script-modules/utf8/context/runtime.lua | 112 + .../utf8/ends/compiletime/parser.lua | 17 + .../utf8/ends/compiletime/vanilla.lua | 46 + .../mpv/script-modules/utf8/functions/lua53.lua | 152 + debian/.config/mpv/script-modules/utf8/init.lua | 71 + .../utf8/modifier/compiletime/frontier.lua | 50 + .../utf8/modifier/compiletime/parser.lua | 20 + .../utf8/modifier/compiletime/simple.lua | 23 + .../utf8/modifier/compiletime/stub.lua | 28 + .../utf8/modifier/compiletime/vanilla.lua | 270 + .../mpv/script-modules/utf8/primitives/dummy.lua | 555 + .../mpv/script-modules/utf8/primitives/init.lua | 23 + .../mpv/script-modules/utf8/primitives/native.lua | 57 + .../script-modules/utf8/primitives/tarantool.lua | 13 + .../mpv/script-modules/utf8/regex_parser.lua | 80 + debian/.config/mpv/script-modules/utf8/test.sh | 23 + .../utf8/test/charclass_compiletime.lua | 165 + .../script-modules/utf8/test/charclass_runtime.lua | 116 + .../script-modules/utf8/test/context_runtime.lua | 82 + .../mpv/script-modules/utf8/test/strict.lua | 42 + .../.config/mpv/script-modules/utf8/test/test.lua | 205 + .../mpv/script-modules/utf8/test/test_compat.lua | 109 + .../mpv/script-modules/utf8/test/test_pm.lua | 392 + .../mpv/script-modules/utf8/test/test_utf8data.lua | 15 + .../.config/mpv/script-modules/utf8/test/util.lua | 75 + debian/.config/mpv/script-modules/utf8/util.lua | 64 + debian/.config/mpv/script-modules/utf8_data.lua | 1865 + debian/.config/mpv/script-opts/SimpleBookmark.conf | 311 + .../.config/mpv/script-opts/SmartCopyPaste_II.conf | 343 + debian/.config/mpv/script-opts/SmartSkip.conf | 221 + debian/.config/mpv/script-opts/blur_edges.conf | 26 + .../.config/mpv/script-opts/command_palette.conf | 19 + debian/.config/mpv/script-opts/gallery_worker.conf | 18 + debian/.config/mpv/script-opts/mdmenu.conf | 13 + .../.config/mpv/script-opts/mpv_crop_script.conf | 5 + debian/.config/mpv/script-opts/playlist_view.conf | 123 + debian/.config/mpv/script-opts/thumbfast.conf | 41 + debian/.config/mpv/scripts/Rename.lua | 99 + debian/.config/mpv/scripts/SimpleBookmark.lua | 2907 + debian/.config/mpv/scripts/SmartCopyPaste_II.lua | 3797 + debian/.config/mpv/scripts/SmartSkip.lua | 1936 + debian/.config/mpv/scripts/UndoRedo.lua | 212 + debian/.config/mpv/scripts/blackout.lua | 73 + debian/.config/mpv/scripts/blur-edges.lua | 174 + .../.config/mpv/scripts/change-OSD-media-title.lua | 30 + debian/.config/mpv/scripts/command_palette.lua | 1229 + debian/.config/mpv/scripts/cycle-video-rotate.lua | 36 + debian/.config/mpv/scripts/delete_current_file.lua | 168 + debian/.config/mpv/scripts/fuzzydir.lua | 278 + debian/.config/mpv/scripts/gallery-thumbgen.lua | 342 + debian/.config/mpv/scripts/history.lua | 138 + debian/.config/mpv/scripts/mdmenu.lua | 285 + debian/.config/mpv/scripts/misc.lua | 594 + debian/.config/mpv/scripts/modules.lua | 5 + debian/.config/mpv/scripts/mpv_crop_script.lua | 3438 + debian/.config/mpv/scripts/navigator.lua | 605 + debian/.config/mpv/scripts/osc-show-hide.lua | 40 + debian/.config/mpv/scripts/osc.lua | 3109 + debian/.config/mpv/scripts/playlist-view.lua | 925 + debian/.config/mpv/scripts/playlistmanager.lua | 1755 + debian/.config/mpv/scripts/reload.lua | 19 + .../.config/mpv/scripts/sponsorblock_minimal.lua | 141 + debian/.config/mpv/scripts/subtitle-search.lua | 682 + debian/.config/mpv/scripts/thumbfast.lua | 951 + debian/.config/mpv/scripts/user-input.lua | 890 + debian/.config/mpv/scripts/xscreensaver.lua | 24 + debian/.config/mpv/scripts/youtube-search.lua | 419 + debian/.config/mpv/scripts/ytdl-preload.lua | 433 + debian/.config/mpv/unused_scipts/xrandr.lua | 382 + debian/.config/mutt/README.md | 414 + debian/.config/ncmpcpp/bindings | 468 + debian/.config/ncmpcpp/config | 628 + debian/.config/newsboat/config | 70 + debian/.config/newsboat/urls | 42 + debian/.config/npm/.npmrc | 2 + debian/.config/nsxiv/exec/key-handler | 61 + debian/.config/openvpn/thesiah.ovpn | 78 + debian/.config/pam-gnupg | 2 + .../.config/pass-git-helper/git-pass-mapping.ini | 2 + debian/.config/pinentry/preexec | 5 + debian/.config/pip/pip.conf | 2 + debian/.config/pipe-viewer/pipe-viewer.conf | 143 + .../pipewire/media-session.d/bluez-monitor.conf | 10 + .../pipewire/pipewire.conf.d/user-session.conf | 4 + debian/.config/profanity/profrc | 94 + debian/.config/pulse/daemon.conf | 4 + debian/.config/python/pythonrc | 2 + debian/.config/qutebrowser/config.py | 2661 + debian/.config/qutebrowser/greasemonkey/0x0.css.js | 29 + .../qutebrowser/greasemonkey/arstechnica.css.js | 21 + .../qutebrowser/greasemonkey/cnn-lite.css.js | 31 + .../qutebrowser/greasemonkey/csmonitor-text.css.js | 43 + .../.config/qutebrowser/greasemonkey/dienet.css.js | 67 + debian/.config/qutebrowser/greasemonkey/dir.css.js | 72 + .../.config/qutebrowser/greasemonkey/fandom.css.js | 27 + .../qutebrowser/greasemonkey/git-scm.css.js | 38 + .../.config/qutebrowser/greasemonkey/google.css.js | 12 + .../.config/qutebrowser/greasemonkey/imdb.css.js | 12 + .../qutebrowser/greasemonkey/leadertelegram.css.js | 18 + .../qutebrowser/greasemonkey/manpages.css.js | 75 + .../qutebrowser/greasemonkey/npr-text.css.js | 33 + .../qutebrowser/greasemonkey/opengroup.css.js | 50 + .../.config/qutebrowser/greasemonkey/rarbg.css.js | 12 + .../.config/qutebrowser/greasemonkey/reddit.css.js | 41 + .../qutebrowser/greasemonkey/smbc-comics.css.js | 31 + .../qutebrowser/greasemonkey/stackexchange.css.js | 44 + .../qutebrowser/greasemonkey/termbin.css.js | 32 + .../.config/qutebrowser/greasemonkey/wiki.css.js | 33 + .../.config/qutebrowser/greasemonkey/xkcd.css.js | 44 + .../qutebrowser/greasemonkey/ycombinator.css.js | 74 + .../qutebrowser/greasemonkey/youtube-ads.js | 23 + .../qutebrowser/greasemonkey/youtube.css.js | 31 + .../qutebrowser/themes/base16-brogrammer.config.py | 302 + .../themes/base16-catppuccin-frappe.config.py | 302 + .../themes/base16-catppuccin-latte.config.py | 302 + .../themes/base16-catppuccin-macchiato.config.py | 302 + .../themes/base16-catppuccin-mocha.config.py | 302 + .../qutebrowser/themes/base16-catppuccin.config.py | 302 + .../qutebrowser/themes/base16-dracula.config.py | 302 + .../themes/base16-everforest-dark-hard.config.py | 302 + .../themes/base16-everforest-dark-soft.config.py | 302 + .../qutebrowser/themes/base16-everforest.config.py | 302 + .../themes/base16-github-dark.config.py | 302 + .../qutebrowser/themes/base16-github.config.py | 302 + .../themes/base16-gruvbox-dark-hard.config.py | 302 + .../themes/base16-gruvbox-dark-medium.config.py | 302 + .../themes/base16-gruvbox-dark-pale.config.py | 302 + .../themes/base16-gruvbox-dark-soft.config.py | 302 + .../themes/base16-gruvbox-dark.config.py | 302 + .../themes/base16-material-darker.config.py | 302 + .../themes/base16-material-palenight.config.py | 302 + .../qutebrowser/themes/base16-monokai.config.py | 302 + .../qutebrowser/themes/base16-nord-light.config.py | 302 + .../qutebrowser/themes/base16-nord.config.py | 302 + .../themes/base16-oceanicnext.config.py | 302 + .../themes/base16-onedark-dark.config.py | 302 + .../qutebrowser/themes/base16-onedark.config.py | 302 + .../themes/base16-rose-pine-dawn.config.py | 302 + .../themes/base16-rose-pine-moon.config.py | 302 + .../qutebrowser/themes/base16-rose-pine.config.py | 302 + .../themes/base16-solarized-dark.config.py | 302 + .../themes/base16-solarized-light.config.py | 302 + .../themes/base16-tokyo-night-dark.config.py | 302 + .../themes/base16-tokyo-night-light.config.py | 302 + .../themes/base16-tokyo-night-moon.config.py | 302 + .../themes/base16-tokyo-night-storm.config.py | 302 + .../base16-tokyo-night-terminal-dark.config.py | 302 + .../base16-tokyo-night-terminal-light.config.py | 302 + .../base16-tokyo-night-terminal-storm.config.py | 302 + debian/.config/qutebrowser/themes/catppuccin.py | 342 + debian/.config/qutebrowser/themes/dracula.py | 286 + debian/.config/qutebrowser/themes/gruvbox.py | 334 + .../.config/qutebrowser/themes/solarized-dark.py | 517 + .../.config/qutebrowser/themes/solarized-light.py | 517 + debian/.config/qutebrowser/themes/xresources.py | 276 + .../userscripts/add-nextcloud-bookmarks | 173 + .../qutebrowser/userscripts/add-nextcloud-cookbook | 131 + debian/.config/qutebrowser/userscripts/code_select | 64 + debian/.config/qutebrowser/userscripts/gitclone | 74 + debian/.config/qutebrowser/userscripts/qr | 8 + debian/.config/qutebrowser/userscripts/qute-pass | 415 + debian/.config/qutebrowser/userscripts/substiqute | 61 + debian/.config/qutebrowser/userscripts/tab-manager | 529 + debian/.config/qutebrowser/userscripts/translate | 116 + debian/.config/qutebrowser/userscripts/usage.txt | 99 + debian/.config/sc-im/scimrc | 6 + debian/.config/sesh/sesh.toml | 54 + debian/.config/shell/aliasrc | 493 + debian/.config/shell/bm-dirs | 111 + debian/.config/shell/bm-files | 54 + debian/.config/shell/git-aliasrc | 415 + debian/.config/shell/inputrc | 31 + debian/.config/shell/profile | 271 + debian/.config/starship/starship.toml | 204 + debian/.config/stig/rc | 1 + debian/.config/stig/themerc | 600 + debian/.config/task/taskrc | 192 + debian/.config/taskopen/taskopenrc | 30 + debian/.config/tmux/tmux.conf | 350 + debian/.config/transmission-daemon/settings.json | 83 + debian/.config/user-dirs.dirs | 11 + debian/.config/vim/UltiSnips/all.snippets | 30 + debian/.config/vim/init.vim | 446 + debian/.config/vim/plugins.vim | 42 + debian/.config/vim/vimrc | 579 + debian/.config/vscode/argv.json | 21 + debian/.config/wal/postrun | 33 + debian/.config/wal/templates/dunstrc | 27 + debian/.config/wal/templates/zathurarc | 46 + debian/.config/wget/wgetrc | 1 + debian/.config/yazi/flavors/ayu-dark.yazi/LICENSE | 21 + .../yazi/flavors/ayu-dark.yazi/LICENSE-tmtheme | 21 + .../.config/yazi/flavors/ayu-dark.yazi/README.md | 32 + .../.config/yazi/flavors/ayu-dark.yazi/flavor.toml | 137 + .../.config/yazi/flavors/ayu-dark.yazi/preview.png | Bin 0 -> 316943 bytes .../.config/yazi/flavors/ayu-dark.yazi/tmtheme.xml | 1025 + .../yazi/flavors/catppuccin-frappe.yazi/LICENSE | 21 + .../flavors/catppuccin-frappe.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/catppuccin-frappe.yazi/README.md | 36 + .../flavors/catppuccin-frappe.yazi/flavor.toml | 189 + .../flavors/catppuccin-frappe.yazi/preview.png | Bin 0 -> 587309 bytes .../flavors/catppuccin-frappe.yazi/tmtheme.xml | 2112 + .../yazi/flavors/catppuccin-latte.yazi/LICENSE | 21 + .../flavors/catppuccin-latte.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/catppuccin-latte.yazi/README.md | 36 + .../yazi/flavors/catppuccin-latte.yazi/flavor.toml | 189 + .../yazi/flavors/catppuccin-latte.yazi/preview.png | Bin 0 -> 734865 bytes .../yazi/flavors/catppuccin-latte.yazi/tmtheme.xml | 2112 + .../yazi/flavors/catppuccin-macchiato.yazi/LICENSE | 21 + .../catppuccin-macchiato.yazi/LICENSE-tmtheme | 21 + .../flavors/catppuccin-macchiato.yazi/README.md | 36 + .../flavors/catppuccin-macchiato.yazi/flavor.toml | 189 + .../flavors/catppuccin-macchiato.yazi/preview.png | Bin 0 -> 690459 bytes .../flavors/catppuccin-macchiato.yazi/tmtheme.xml | 2112 + .../yazi/flavors/catppuccin-mocha.yazi/LICENSE | 21 + .../flavors/catppuccin-mocha.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/catppuccin-mocha.yazi/README.md | 36 + .../yazi/flavors/catppuccin-mocha.yazi/flavor.toml | 189 + .../yazi/flavors/catppuccin-mocha.yazi/preview.png | Bin 0 -> 675868 bytes .../yazi/flavors/catppuccin-mocha.yazi/tmtheme.xml | 2112 + debian/.config/yazi/flavors/dracula.yazi/LICENSE | 21 + .../yazi/flavors/dracula.yazi/LICENSE-tmtheme | 21 + debian/.config/yazi/flavors/dracula.yazi/README.md | 36 + .../.config/yazi/flavors/dracula.yazi/flavor.toml | 189 + .../.config/yazi/flavors/dracula.yazi/preview.png | Bin 0 -> 855046 bytes .../.config/yazi/flavors/dracula.yazi/tmtheme.xml | 940 + .../yazi/flavors/everforest-medium.yazi/LICENSE | 21 + .../flavors/everforest-medium.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/everforest-medium.yazi/README.md | 45 + .../flavors/everforest-medium.yazi/flavor.toml | 229 + .../flavors/everforest-medium.yazi/preview.png | Bin 0 -> 78490 bytes .../flavors/everforest-medium.yazi/tmtheme.xml | 3186 + .../.config/yazi/flavors/gruvbox-dark.yazi/LICENSE | 22 + .../yazi/flavors/gruvbox-dark.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/gruvbox-dark.yazi/README.md | 32 + .../yazi/flavors/gruvbox-dark.yazi/flavor.toml | 176 + .../yazi/flavors/gruvbox-dark.yazi/preview.png | Bin 0 -> 7036575 bytes .../yazi/flavors/gruvbox-dark.yazi/tmtheme.xml | 1509 + .../yazi/flavors/kanagawa-dragon.yazi/LICENSE | 21 + .../flavors/kanagawa-dragon.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/kanagawa-dragon.yazi/README.md | 32 + .../yazi/flavors/kanagawa-dragon.yazi/flavor.toml | 137 + .../yazi/flavors/kanagawa-dragon.yazi/preview.png | Bin 0 -> 1212654 bytes .../yazi/flavors/kanagawa-dragon.yazi/tmtheme.xml | 448 + .../yazi/flavors/kanagawa-lotus.yazi/LICENSE | 21 + .../flavors/kanagawa-lotus.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/kanagawa-lotus.yazi/README.md | 41 + .../yazi/flavors/kanagawa-lotus.yazi/flavor.toml | 130 + .../yazi/flavors/kanagawa-lotus.yazi/preview.png | Bin 0 -> 264566 bytes .../yazi/flavors/kanagawa-lotus.yazi/tmtheme.xml | 448 + debian/.config/yazi/flavors/kanagawa.yazi/LICENSE | 21 + .../yazi/flavors/kanagawa.yazi/LICENSE-tmtheme | 21 + .../.config/yazi/flavors/kanagawa.yazi/README.md | 36 + .../.config/yazi/flavors/kanagawa.yazi/flavor.toml | 140 + .../.config/yazi/flavors/kanagawa.yazi/preview.png | Bin 0 -> 166757 bytes .../.config/yazi/flavors/kanagawa.yazi/tmtheme.xml | 448 + .../yazi/flavors/rose-pine-dawn.yazi/LICENSE | 21 + .../flavors/rose-pine-dawn.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/rose-pine-dawn.yazi/README.md | 36 + .../yazi/flavors/rose-pine-dawn.yazi/flavor.toml | 230 + .../yazi/flavors/rose-pine-dawn.yazi/preview.png | Bin 0 -> 496676 bytes .../yazi/flavors/rose-pine-dawn.yazi/tmtheme.xml | 316 + .../yazi/flavors/rose-pine-moon.yazi/LICENSE | 21 + .../flavors/rose-pine-moon.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/rose-pine-moon.yazi/README.md | 36 + .../yazi/flavors/rose-pine-moon.yazi/flavor.toml | 230 + .../yazi/flavors/rose-pine-moon.yazi/preview.png | Bin 0 -> 1008743 bytes .../yazi/flavors/rose-pine-moon.yazi/tmtheme.xml | 316 + debian/.config/yazi/flavors/rose-pine.yazi/LICENSE | 21 + .../yazi/flavors/rose-pine.yazi/LICENSE-tmtheme | 21 + .../.config/yazi/flavors/rose-pine.yazi/README.md | 36 + .../yazi/flavors/rose-pine.yazi/flavor.toml | 230 + .../yazi/flavors/rose-pine.yazi/preview.png | Bin 0 -> 983910 bytes .../yazi/flavors/rose-pine.yazi/tmtheme.xml | 316 + debian/.config/yazi/flavors/scripts/README.md | 36 + debian/.config/yazi/flavors/scripts/generate.js | 169 + debian/.config/yazi/flavors/scripts/template.toml | 189 + .../.config/yazi/flavors/tokyo-night.yazi/LICENSE | 21 + .../yazi/flavors/tokyo-night.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/tokyo-night.yazi/README.md | 47 + .../yazi/flavors/tokyo-night.yazi/flavor.toml | 190 + .../yazi/flavors/tokyo-night.yazi/preview.png | Bin 0 -> 729541 bytes .../yazi/flavors/tokyo-night.yazi/tmtheme.xml | 1329 + .../yazi/flavors/vscode-dark-modern.yazi/LICENSE | 21 + .../vscode-dark-modern.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/vscode-dark-modern.yazi/README.md | 50 + .../flavors/vscode-dark-modern.yazi/flavor.toml | 186 + .../yazi/flavors/vscode-dark-modern.yazi/img/1.png | Bin 0 -> 465582 bytes .../yazi/flavors/vscode-dark-modern.yazi/img/2.png | Bin 0 -> 591609 bytes .../yazi/flavors/vscode-dark-modern.yazi/img/3.png | Bin 0 -> 646085 bytes .../yazi/flavors/vscode-dark-modern.yazi/img/4.png | Bin 0 -> 590651 bytes .../vscode-dark-modern.yazi/img/preview.png | Bin 0 -> 474310 bytes .../flavors/vscode-dark-modern.yazi/preview.png | Bin 0 -> 474310 bytes .../flavors/vscode-dark-modern.yazi/tmtheme.xml | 250 + .../yazi/flavors/vscode-dark-plus.yazi/LICENSE | 21 + .../flavors/vscode-dark-plus.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/vscode-dark-plus.yazi/README.md | 50 + .../yazi/flavors/vscode-dark-plus.yazi/flavor.toml | 186 + .../yazi/flavors/vscode-dark-plus.yazi/img/1.png | Bin 0 -> 465477 bytes .../yazi/flavors/vscode-dark-plus.yazi/img/2.png | Bin 0 -> 591518 bytes .../yazi/flavors/vscode-dark-plus.yazi/img/3.png | Bin 0 -> 646158 bytes .../yazi/flavors/vscode-dark-plus.yazi/img/4.png | Bin 0 -> 589782 bytes .../flavors/vscode-dark-plus.yazi/img/preview.png | Bin 0 -> 474215 bytes .../yazi/flavors/vscode-dark-plus.yazi/preview.png | Bin 0 -> 474215 bytes .../yazi/flavors/vscode-dark-plus.yazi/tmtheme.xml | 250 + .../yazi/flavors/vscode-light-modern.yazi/LICENSE | 21 + .../vscode-light-modern.yazi/LICENSE-tmtheme | 21 + .../flavors/vscode-light-modern.yazi/README.md | 50 + .../flavors/vscode-light-modern.yazi/flavor.toml | 186 + .../flavors/vscode-light-modern.yazi/img/1.png | Bin 0 -> 451099 bytes .../flavors/vscode-light-modern.yazi/img/2.png | Bin 0 -> 595482 bytes .../flavors/vscode-light-modern.yazi/img/3.png | Bin 0 -> 643205 bytes .../flavors/vscode-light-modern.yazi/img/4.png | Bin 0 -> 568228 bytes .../vscode-light-modern.yazi/img/preview.png | Bin 0 -> 457221 bytes .../flavors/vscode-light-modern.yazi/preview.png | Bin 0 -> 457221 bytes .../flavors/vscode-light-modern.yazi/tmtheme.xml | 250 + .../yazi/flavors/vscode-light-plus.yazi/LICENSE | 21 + .../flavors/vscode-light-plus.yazi/LICENSE-tmtheme | 21 + .../yazi/flavors/vscode-light-plus.yazi/README.md | 50 + .../flavors/vscode-light-plus.yazi/flavor.toml | 186 + .../yazi/flavors/vscode-light-plus.yazi/img/1.png | Bin 0 -> 444447 bytes .../yazi/flavors/vscode-light-plus.yazi/img/2.png | Bin 0 -> 581698 bytes .../yazi/flavors/vscode-light-plus.yazi/img/3.png | Bin 0 -> 630738 bytes .../yazi/flavors/vscode-light-plus.yazi/img/4.png | Bin 0 -> 566333 bytes .../flavors/vscode-light-plus.yazi/img/preview.png | Bin 0 -> 447989 bytes .../flavors/vscode-light-plus.yazi/preview.png | Bin 0 -> 447989 bytes .../flavors/vscode-light-plus.yazi/tmtheme.xml | 250 + debian/.config/yazi/init.lua | 72 + debian/.config/yazi/keymap-default.toml | 490 + debian/.config/yazi/plugins/chmod.yazi/README.md | 28 + debian/.config/yazi/plugins/chmod.yazi/main.lua | 42 + debian/.config/yazi/plugins/compress.yazi/LICENSE | 21 + .../.config/yazi/plugins/compress.yazi/README.md | 173 + debian/.config/yazi/plugins/compress.yazi/main.lua | 496 + debian/.config/yazi/plugins/diff.yazi/README.md | 28 + debian/.config/yazi/plugins/diff.yazi/main.lua | 41 + .../yazi/plugins/folder-rules.yazi/main.lua | 12 + .../yazi/plugins/full-border.yazi/README.md | 32 + .../.config/yazi/plugins/full-border.yazi/main.lua | 43 + debian/.config/yazi/plugins/git.yazi/README.md | 78 + debian/.config/yazi/plugins/git.yazi/main.lua | 261 + debian/.config/yazi/plugins/git.yazi/types.lua | 12 + .../yazi/plugins/jump-to-char.yazi/README.md | 28 + .../yazi/plugins/jump-to-char.yazi/main.lua | 32 + debian/.config/yazi/plugins/lsar.yazi/README.md | 43 + debian/.config/yazi/plugins/lsar.yazi/main.lua | 43 + debian/.config/yazi/plugins/mactag.yazi/README.md | 79 + debian/.config/yazi/plugins/mactag.yazi/main.lua | 105 + .../.config/yazi/plugins/mime-ext.yazi/README.md | 56 + debian/.config/yazi/plugins/mime-ext.yazi/main.lua | 1126 + debian/.config/yazi/plugins/mount.yazi/README.md | 48 + debian/.config/yazi/plugins/mount.yazi/main.lua | 304 + debian/.config/yazi/plugins/office.yazi/LICENSE | 21 + debian/.config/yazi/plugins/office.yazi/README.md | 76 + debian/.config/yazi/plugins/office.yazi/main.lua | 121 + .../yazi/plugins/parent-arrow.yazi/main.lua | 24 + debian/.config/yazi/plugins/piper.yazi/README.md | 90 + debian/.config/yazi/plugins/piper.yazi/main.lua | 70 + .../yazi/plugins/smart-enter.yazi/README.md | 40 + .../.config/yazi/plugins/smart-enter.yazi/main.lua | 11 + .../yazi/plugins/smart-filter.yazi/README.md | 28 + .../yazi/plugins/smart-filter.yazi/main.lua | 51 + .../yazi/plugins/smart-paste.yazi/README.md | 26 + .../.config/yazi/plugins/smart-paste.yazi/main.lua | 14 + .../.config/yazi/plugins/sudo-demo.yazi/README.md | 25 + .../.config/yazi/plugins/sudo-demo.yazi/main.lua | 45 + .../yazi/plugins/toggle-pane.yazi/README.md | 78 + .../.config/yazi/plugins/toggle-pane.yazi/main.lua | 45 + debian/.config/yazi/plugins/zoom.yazi/README.md | 56 + debian/.config/yazi/plugins/zoom.yazi/main.lua | 119 + debian/.config/yazi/theme.toml | 278 + debian/.config/yazi/yazi.toml | 278 + debian/.config/zsh/.zshrc | 141 + debian/.config/zsh/autocomplete.zsh | 70 + debian/.config/zsh/git.zsh | 7 + debian/.config/zsh/keymaps.zsh | 342 + debian/.config/zsh/p10k.zsh | 1721 + debian/.config/zsh/packages.zsh | 23 + debian/.config/zsh/plugins.zsh | 105 + debian/.config/zsh/scripts.zsh | 880 + debian/.gitmodules | 3 + debian/.gnupg/gpg-agent.conf | 4 + debian/.local/bin/albumsplit | 45 + debian/.local/bin/bash-preexec | 380 + debian/.local/bin/bookmarks | 211 + debian/.local/bin/browse | 88 + debian/.local/bin/browserprofile | 108 + debian/.local/bin/clonerepo | 61 + debian/.local/bin/compiler | 84 + debian/.local/bin/concatvideo | 56 + debian/.local/bin/createsh | 104 + debian/.local/bin/cron/README.md | 11 + debian/.local/bin/cron/crontog | 26 + debian/.local/bin/cron/mediaup | 34 + debian/.local/bin/cron/newsup | 15 + debian/.local/bin/cutvideo | 41 + debian/.local/bin/cwmx | 3 + debian/.local/bin/decodetitle | 17 + debian/.local/bin/displayselect | 95 + debian/.local/bin/dmenubrowse | 44 + debian/.local/bin/dmenudelmusic | 44 + debian/.local/bin/dmenugithub | 25 + debian/.local/bin/dmenuhandler | 24 + debian/.local/bin/dmenuman | 4 + debian/.local/bin/dmenumountcifs | 19 + debian/.local/bin/dmenupass | 6 + debian/.local/bin/dmenurecord | 220 + debian/.local/bin/dmenusmbadd | 58 + debian/.local/bin/dmenusmbdel | 55 + debian/.local/bin/dmenuunicode | 18 + debian/.local/bin/dmenuupgrade | 115 + debian/.local/bin/dmenuvirt | 28 + debian/.local/bin/dvdburn | 46 + debian/.local/bin/ecrypt | 39 + debian/.local/bin/emojiupdate | 65 + debian/.local/bin/ethwifi | 31 + debian/.local/bin/extract | 41 + debian/.local/bin/extractkeys | 164 + debian/.local/bin/fzffiles | 99 + debian/.local/bin/fzffns | 74 + debian/.local/bin/fzfpass | 88 + debian/.local/bin/getbib | 71 + debian/.local/bin/getcomproot | 9 + debian/.local/bin/getkeys | 7 + debian/.local/bin/gitfiles | 72 + debian/.local/bin/gitopenbranch | 24 + debian/.local/bin/gitstagedfiles | 11 + debian/.local/bin/gitupdate | 85 + debian/.local/bin/gpt | 26 + debian/.local/bin/gracefulkill | 25 + debian/.local/bin/hugow | 70 + debian/.local/bin/iconupdate | 19 + debian/.local/bin/ifinstalled | 13 + debian/.local/bin/lastfiles | 77 + debian/.local/bin/lfub | 24 + debian/.local/bin/linkhandler | 31 + debian/.local/bin/maimpick | 23 + debian/.local/bin/mbackup | 14 + debian/.local/bin/monitorbright | 24 + debian/.local/bin/mounter | 212 + debian/.local/bin/mpdmenu | 113 + debian/.local/bin/mpvplay | 210 + debian/.local/bin/noisereduce | 81 + debian/.local/bin/openfiles | 34 + debian/.local/bin/opensessions | 37 + debian/.local/bin/opentasktui | 27 + debian/.local/bin/openurl | 16 + debian/.local/bin/opout | 16 + debian/.local/bin/otp | 54 + debian/.local/bin/ovpn | 22 + debian/.local/bin/partlabel | 90 + debian/.local/bin/passmenu2 | 38 + debian/.local/bin/pauseallmpv | 10 + debian/.local/bin/peertubetorrent | 9 + debian/.local/bin/podentr | 7 + debian/.local/bin/ppts | 123 + debian/.local/bin/qndl | 130 + debian/.local/bin/queueandnotify | 14 + debian/.local/bin/rbackup | 187 + debian/.local/bin/refreshbrowser | 42 + debian/.local/bin/remapd | 8 + debian/.local/bin/remaps | 69 + debian/.local/bin/restartnvim | 25 + debian/.local/bin/rgafiles | 120 + debian/.local/bin/rotdir | 12 + debian/.local/bin/rssadd | 18 + debian/.local/bin/rssget | 126 + debian/.local/bin/schedule | 22 + debian/.local/bin/screenshotactivewindow | 37 + debian/.local/bin/sd | 22 + debian/.local/bin/sessionizer | 36 + debian/.local/bin/setbg | 71 + debian/.local/bin/setfirmware | 22 + debian/.local/bin/setlock | 23 + debian/.local/bin/setmonitor | 35 + debian/.local/bin/shortcuts | 93 + debian/.local/bin/slider | 132 + debian/.local/bin/sshadd | 31 + debian/.local/bin/stw | 78 + debian/.local/bin/syncdic | 33 + debian/.local/bin/syncdot | 46 + debian/.local/bin/synctime | 22 + debian/.local/bin/sysact | 36 + debian/.local/bin/tablet | 39 + debian/.local/bin/tag | 49 + .../task/taskwarrior-tui/annotate-with-new-note | 41 + .../bin/task/taskwarrior-tui/annotate-with-note | 41 + .../.local/bin/task/taskwarrior-tui/cycle-priority | 35 + .../bin/task/taskwarrior-tui/cycle-tmux-projects | 31 + .../bin/task/taskwarrior-tui/decrease-priority | 15 + .../.local/bin/task/taskwarrior-tui/git-issue-sync | 185 + .../bin/task/taskwarrior-tui/increase-priority | 60 + .../bin/task/taskwarrior-tui/lib-task-interop | 82 + .../bin/task/taskwarrior-tui/task-switch-context | 23 + .../bin/task/taskwarrior-tui/taskopen-annotation | 11 + .../.local/bin/task/taskwarrior-tui/taskopen-line | 51 + debian/.local/bin/task/taskwarrior-tui/tasks-sync | 11 + .../bin/task/taskwarrior-tui/toggle-review-label | 13 + debian/.local/bin/td-toggle | 11 + debian/.local/bin/timer | 14 + debian/.local/bin/timer_ | 14 + debian/.local/bin/timezones | 21 + debian/.local/bin/tmuxcreate | 42 + debian/.local/bin/tmuxcycleborder | 7 + debian/.local/bin/tmuxdbussync | 15 + debian/.local/bin/tmuxopen | 208 + debian/.local/bin/tmuxtogglebar | 6 + debian/.local/bin/tmuxtoggleterm | 11 + debian/.local/bin/toggleoutput | 47 + debian/.local/bin/tordone | 10 + debian/.local/bin/torwrap | 8 + debian/.local/bin/transadd | 29 + debian/.local/bin/unix | 26 + debian/.local/bin/unmounter | 57 + debian/.local/bin/vimwikitodo | 8 + debian/.local/bin/vipy | 42 + debian/.local/bin/wallset | 295 + debian/.local/bin/weath | 46 + debian/.local/bin/webcam | 48 + debian/.local/bin/whereami | 24 + debian/.local/bin/xdg-terminal-exec | 3 + debian/.local/bin/xdotmouse | 13 + debian/.local/bin/xinputconf | 39 + debian/.local/bin/xkeys | Bin 0 -> 15816 bytes debian/.local/bin/ylog | 359 + debian/.stow-local-ignore | 34 + debian/.urlview | 2 + 699 files changed, 236954 insertions(+) create mode 100644 debian/.config/LazyVim/.gitignore create mode 100644 debian/.config/LazyVim/.neoconf.json create mode 100644 debian/.config/LazyVim/LICENSE create mode 100644 debian/.config/LazyVim/README.md create mode 100644 debian/.config/LazyVim/init.lua create mode 100644 debian/.config/LazyVim/lua/config/autocmds.lua create mode 100644 debian/.config/LazyVim/lua/config/keymaps.lua create mode 100644 debian/.config/LazyVim/lua/config/lazy.lua create mode 100644 debian/.config/LazyVim/lua/config/options.lua create mode 100644 debian/.config/LazyVim/lua/plugins/example.lua create mode 100644 debian/.config/LazyVim/stylua.toml create mode 100644 debian/.config/NvChad/.stylua.toml create mode 100644 debian/.config/NvChad/LICENSE create mode 100644 debian/.config/NvChad/README.md create mode 100644 debian/.config/NvChad/init.lua create mode 100644 debian/.config/NvChad/lua/autocmds.lua create mode 100644 debian/.config/NvChad/lua/chadrc.lua create mode 100644 debian/.config/NvChad/lua/configs/conform.lua create mode 100644 debian/.config/NvChad/lua/configs/lazy.lua create mode 100644 debian/.config/NvChad/lua/configs/lspconfig.lua create mode 100644 debian/.config/NvChad/lua/mappings.lua create mode 100644 debian/.config/NvChad/lua/options.lua create mode 100644 debian/.config/NvChad/lua/plugins/init.lua create mode 100644 debian/.config/TheSiahxyz/after/queries/markdown/textobjects.scm create mode 100644 debian/.config/TheSiahxyz/ftplugin/markdown.lua create mode 100644 debian/.config/TheSiahxyz/ftplugin/quarto.lua create mode 100644 debian/.config/TheSiahxyz/init.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/core/autocmds.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/core/keymaps.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/core/lazy.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/core/options.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/health.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/init.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ai.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/cloak.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/cmp.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/colorizer.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/colorschemes.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/comment.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/compiler.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/context.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/csv.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/dadbod.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/dap.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/docker.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/git.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/goyo.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/grug-far.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/harpoon2.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/image.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/init.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/keys.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/lsp.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/lualine.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/macro.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/markdown.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/marks.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/mini.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/navic.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/neo-tree.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/obsidian.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/outline.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/project.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/python.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/quickfix.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/refactoring.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/rest.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/sessions.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/silicon.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/snippets.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ssh.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/stay-centered.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/surround.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/telescope.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/textobject.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/todo.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/treesitter.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ufo.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/urlview.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/virt-column.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/wiki.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/yazi.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/zenmode.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/snippets/journal.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/snippets/markdown.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/snippets/neetcode1.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/snippets/neetcode2.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/snippets/quarto.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/snippets/recordings.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/snippets/whichkey.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/cheatsheet.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/cheatsheet/grid.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/cheatsheet/init.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/icons.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/markdown.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/snippet.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/tasks.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/tmux.lua create mode 100644 debian/.config/TheSiahxyz/lua/TheSiahxyz/utils/utils.lua create mode 100644 debian/.config/TheSiahxyz/spell/en.utf-8.add create mode 100644 debian/.config/TheSiahxyz/spell/en.utf-8.add.spl create mode 100644 debian/.config/TheSiahxyz/spell/ko.utf-8.dic create mode 100644 debian/.config/TheSiahxyz/spell/ko.utf-8.spl create mode 100644 debian/.config/asus_jack_audio_issue.txt create mode 100644 debian/.config/atuin/config.toml create mode 100644 debian/.config/bash/bash_profile create mode 100644 debian/.config/bash/bashrc create mode 100644 debian/.config/bat/config create mode 100644 debian/.config/bat/themes/Catppuccin Frappe.tmTheme create mode 100644 debian/.config/bat/themes/Catppuccin Latte.tmTheme create mode 100644 debian/.config/bat/themes/Catppuccin Macchiato.tmTheme create mode 100644 debian/.config/bat/themes/Catppuccin Mocha.tmTheme create mode 100644 debian/.config/blacklist.conf create mode 100644 debian/.config/calcurse/conf create mode 100644 debian/.config/calcurse/keys create mode 100644 debian/.config/crons create mode 100644 debian/.config/fastfetch/config.jsonc create mode 100644 debian/.config/firefox/chrome/userChrome.css create mode 100644 debian/.config/firefox/enhanceforyoutube.json create mode 100644 debian/.config/firefox/thesiah.js create mode 100644 debian/.config/firefox/vdh-settings.json create mode 100644 debian/.config/firefox/vimium-options.json create mode 100644 debian/.config/fontconfig/fonts.conf create mode 100644 debian/.config/gem/gemrc create mode 100644 debian/.config/git/attributes create mode 100644 debian/.config/git/config create mode 100644 debian/.config/git/gitk create mode 100644 debian/.config/git/ignore create mode 100644 debian/.config/gitmux/gitmux.conf create mode 100644 debian/.config/gtk-2.0/gtkrc-2.0 create mode 100644 debian/.config/gtk-3.0/settings.ini create mode 100644 debian/.config/htop/htoprc create mode 100644 debian/.config/latexmk/latexmkrc create mode 100644 debian/.config/lazygit/config.yml create mode 100755 debian/.config/lf/cleaner create mode 100644 debian/.config/lf/icons create mode 100644 debian/.config/lf/lfrc create mode 100644 debian/.config/lf/rooticons create mode 100755 debian/.config/lf/scope create mode 100644 debian/.config/lynx/.lynxrc create mode 100644 debian/.config/lynx/lynx.cfg create mode 100644 debian/.config/lynx/lynx.lss create mode 100644 debian/.config/mimeapps.list create mode 100644 debian/.config/mpd/mpd.conf create mode 100644 debian/.config/mpd/playlists/entire.m3u create mode 100644 debian/.config/mpd/playlists/jpop.m3u create mode 100644 debian/.config/mpd/playlists/kpop.m3u create mode 100644 debian/.config/mpd/playlists/pop.m3u create mode 100644 debian/.config/mpv/input.conf create mode 100644 debian/.config/mpv/mpv.conf create mode 100644 debian/.config/mpv/osc.conf create mode 100644 debian/.config/mpv/script-modules/extended-menu.lua create mode 100644 debian/.config/mpv/script-modules/gallery.lua create mode 100644 debian/.config/mpv/script-modules/input-console.lua create mode 100644 debian/.config/mpv/script-modules/mpvSockets.lua create mode 100644 debian/.config/mpv/script-modules/scroll-list.lua create mode 100644 debian/.config/mpv/script-modules/sha1.lua create mode 100644 debian/.config/mpv/script-modules/user-input-module.lua create mode 100644 debian/.config/mpv/script-modules/utf8/LICENSE create mode 100644 debian/.config/mpv/script-modules/utf8/README.md create mode 100644 debian/.config/mpv/script-modules/utf8/begins/compiletime/parser.lua create mode 100644 debian/.config/mpv/script-modules/utf8/begins/compiletime/vanilla.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/compiletime/builder.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/compiletime/parser.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/compiletime/range.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/compiletime/stub.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/compiletime/vanilla.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/runtime/base.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/runtime/dummy.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/runtime/init.lua create mode 100644 debian/.config/mpv/script-modules/utf8/charclass/runtime/native.lua create mode 100644 debian/.config/mpv/script-modules/utf8/context/compiletime.lua create mode 100644 debian/.config/mpv/script-modules/utf8/context/runtime.lua create mode 100644 debian/.config/mpv/script-modules/utf8/ends/compiletime/parser.lua create mode 100644 debian/.config/mpv/script-modules/utf8/ends/compiletime/vanilla.lua create mode 100644 debian/.config/mpv/script-modules/utf8/functions/lua53.lua create mode 100644 debian/.config/mpv/script-modules/utf8/init.lua create mode 100644 debian/.config/mpv/script-modules/utf8/modifier/compiletime/frontier.lua create mode 100644 debian/.config/mpv/script-modules/utf8/modifier/compiletime/parser.lua create mode 100644 debian/.config/mpv/script-modules/utf8/modifier/compiletime/simple.lua create mode 100644 debian/.config/mpv/script-modules/utf8/modifier/compiletime/stub.lua create mode 100644 debian/.config/mpv/script-modules/utf8/modifier/compiletime/vanilla.lua create mode 100644 debian/.config/mpv/script-modules/utf8/primitives/dummy.lua create mode 100644 debian/.config/mpv/script-modules/utf8/primitives/init.lua create mode 100644 debian/.config/mpv/script-modules/utf8/primitives/native.lua create mode 100644 debian/.config/mpv/script-modules/utf8/primitives/tarantool.lua create mode 100644 debian/.config/mpv/script-modules/utf8/regex_parser.lua create mode 100755 debian/.config/mpv/script-modules/utf8/test.sh create mode 100644 debian/.config/mpv/script-modules/utf8/test/charclass_compiletime.lua create mode 100644 debian/.config/mpv/script-modules/utf8/test/charclass_runtime.lua create mode 100644 debian/.config/mpv/script-modules/utf8/test/context_runtime.lua create mode 100644 debian/.config/mpv/script-modules/utf8/test/strict.lua create mode 100644 debian/.config/mpv/script-modules/utf8/test/test.lua create mode 100644 debian/.config/mpv/script-modules/utf8/test/test_compat.lua create mode 100644 debian/.config/mpv/script-modules/utf8/test/test_pm.lua create mode 100644 debian/.config/mpv/script-modules/utf8/test/test_utf8data.lua create mode 100644 debian/.config/mpv/script-modules/utf8/test/util.lua create mode 100644 debian/.config/mpv/script-modules/utf8/util.lua create mode 100644 debian/.config/mpv/script-modules/utf8_data.lua create mode 100644 debian/.config/mpv/script-opts/SimpleBookmark.conf create mode 100644 debian/.config/mpv/script-opts/SmartCopyPaste_II.conf create mode 100644 debian/.config/mpv/script-opts/SmartSkip.conf create mode 100644 debian/.config/mpv/script-opts/blur_edges.conf create mode 100644 debian/.config/mpv/script-opts/command_palette.conf create mode 100644 debian/.config/mpv/script-opts/gallery_worker.conf create mode 100644 debian/.config/mpv/script-opts/mdmenu.conf create mode 100644 debian/.config/mpv/script-opts/mpv_crop_script.conf create mode 100644 debian/.config/mpv/script-opts/playlist_view.conf create mode 100644 debian/.config/mpv/script-opts/thumbfast.conf create mode 100644 debian/.config/mpv/scripts/Rename.lua create mode 100644 debian/.config/mpv/scripts/SimpleBookmark.lua create mode 100644 debian/.config/mpv/scripts/SmartCopyPaste_II.lua create mode 100644 debian/.config/mpv/scripts/SmartSkip.lua create mode 100644 debian/.config/mpv/scripts/UndoRedo.lua create mode 100644 debian/.config/mpv/scripts/blackout.lua create mode 100644 debian/.config/mpv/scripts/blur-edges.lua create mode 100644 debian/.config/mpv/scripts/change-OSD-media-title.lua create mode 100644 debian/.config/mpv/scripts/command_palette.lua create mode 100644 debian/.config/mpv/scripts/cycle-video-rotate.lua create mode 100644 debian/.config/mpv/scripts/delete_current_file.lua create mode 100644 debian/.config/mpv/scripts/fuzzydir.lua create mode 100644 debian/.config/mpv/scripts/gallery-thumbgen.lua create mode 100644 debian/.config/mpv/scripts/history.lua create mode 100644 debian/.config/mpv/scripts/mdmenu.lua create mode 100644 debian/.config/mpv/scripts/misc.lua create mode 100644 debian/.config/mpv/scripts/modules.lua create mode 100644 debian/.config/mpv/scripts/mpv_crop_script.lua create mode 100644 debian/.config/mpv/scripts/navigator.lua create mode 100644 debian/.config/mpv/scripts/osc-show-hide.lua create mode 100644 debian/.config/mpv/scripts/osc.lua create mode 100644 debian/.config/mpv/scripts/playlist-view.lua create mode 100644 debian/.config/mpv/scripts/playlistmanager.lua create mode 100644 debian/.config/mpv/scripts/reload.lua create mode 100644 debian/.config/mpv/scripts/sponsorblock_minimal.lua create mode 100644 debian/.config/mpv/scripts/subtitle-search.lua create mode 100644 debian/.config/mpv/scripts/thumbfast.lua create mode 100644 debian/.config/mpv/scripts/user-input.lua create mode 100644 debian/.config/mpv/scripts/xscreensaver.lua create mode 100644 debian/.config/mpv/scripts/youtube-search.lua create mode 100644 debian/.config/mpv/scripts/ytdl-preload.lua create mode 100644 debian/.config/mpv/unused_scipts/xrandr.lua create mode 100644 debian/.config/mutt/README.md create mode 100644 debian/.config/ncmpcpp/bindings create mode 100644 debian/.config/ncmpcpp/config create mode 100644 debian/.config/newsboat/config create mode 100644 debian/.config/newsboat/urls create mode 100644 debian/.config/npm/.npmrc create mode 100755 debian/.config/nsxiv/exec/key-handler create mode 100644 debian/.config/openvpn/thesiah.ovpn create mode 100644 debian/.config/pam-gnupg create mode 100644 debian/.config/pass-git-helper/git-pass-mapping.ini create mode 100755 debian/.config/pinentry/preexec create mode 100644 debian/.config/pip/pip.conf create mode 100644 debian/.config/pipe-viewer/pipe-viewer.conf create mode 100644 debian/.config/pipewire/media-session.d/bluez-monitor.conf create mode 100644 debian/.config/pipewire/pipewire.conf.d/user-session.conf create mode 100644 debian/.config/profanity/profrc create mode 100644 debian/.config/pulse/daemon.conf create mode 100644 debian/.config/python/pythonrc create mode 100644 debian/.config/qutebrowser/config.py create mode 100644 debian/.config/qutebrowser/greasemonkey/0x0.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/arstechnica.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/cnn-lite.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/csmonitor-text.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/dienet.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/dir.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/fandom.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/git-scm.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/google.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/imdb.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/leadertelegram.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/manpages.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/npr-text.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/opengroup.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/rarbg.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/reddit.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/smbc-comics.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/stackexchange.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/termbin.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/wiki.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/xkcd.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/ycombinator.css.js create mode 100644 debian/.config/qutebrowser/greasemonkey/youtube-ads.js create mode 100644 debian/.config/qutebrowser/greasemonkey/youtube.css.js create mode 100644 debian/.config/qutebrowser/themes/base16-brogrammer.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-catppuccin-frappe.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-catppuccin-latte.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-catppuccin-macchiato.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-catppuccin-mocha.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-catppuccin.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-dracula.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-everforest-dark-hard.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-everforest-dark-soft.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-everforest.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-github-dark.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-github.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-gruvbox-dark-hard.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-gruvbox-dark-medium.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-gruvbox-dark-pale.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-gruvbox-dark-soft.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-gruvbox-dark.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-material-darker.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-material-palenight.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-monokai.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-nord-light.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-nord.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-oceanicnext.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-onedark-dark.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-onedark.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-rose-pine-dawn.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-rose-pine-moon.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-rose-pine.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-solarized-dark.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-solarized-light.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-tokyo-night-dark.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-tokyo-night-light.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-tokyo-night-moon.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-tokyo-night-storm.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-tokyo-night-terminal-dark.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-tokyo-night-terminal-light.config.py create mode 100644 debian/.config/qutebrowser/themes/base16-tokyo-night-terminal-storm.config.py create mode 100644 debian/.config/qutebrowser/themes/catppuccin.py create mode 100644 debian/.config/qutebrowser/themes/dracula.py create mode 100644 debian/.config/qutebrowser/themes/gruvbox.py create mode 100644 debian/.config/qutebrowser/themes/solarized-dark.py create mode 100644 debian/.config/qutebrowser/themes/solarized-light.py create mode 100644 debian/.config/qutebrowser/themes/xresources.py create mode 100755 debian/.config/qutebrowser/userscripts/add-nextcloud-bookmarks create mode 100755 debian/.config/qutebrowser/userscripts/add-nextcloud-cookbook create mode 100755 debian/.config/qutebrowser/userscripts/code_select create mode 100755 debian/.config/qutebrowser/userscripts/gitclone create mode 100755 debian/.config/qutebrowser/userscripts/qr create mode 100755 debian/.config/qutebrowser/userscripts/qute-pass create mode 100755 debian/.config/qutebrowser/userscripts/substiqute create mode 100755 debian/.config/qutebrowser/userscripts/tab-manager create mode 100755 debian/.config/qutebrowser/userscripts/translate create mode 100644 debian/.config/qutebrowser/userscripts/usage.txt create mode 100644 debian/.config/sc-im/scimrc create mode 100644 debian/.config/sesh/sesh.toml create mode 100644 debian/.config/shell/aliasrc create mode 100644 debian/.config/shell/bm-dirs create mode 100644 debian/.config/shell/bm-files create mode 100644 debian/.config/shell/git-aliasrc create mode 100644 debian/.config/shell/inputrc create mode 100644 debian/.config/shell/profile create mode 100644 debian/.config/starship/starship.toml create mode 100644 debian/.config/stig/rc create mode 100644 debian/.config/stig/themerc create mode 100644 debian/.config/task/taskrc create mode 100644 debian/.config/taskopen/taskopenrc create mode 100644 debian/.config/tmux/tmux.conf create mode 100644 debian/.config/transmission-daemon/settings.json create mode 100644 debian/.config/user-dirs.dirs create mode 100644 debian/.config/vim/UltiSnips/all.snippets create mode 100644 debian/.config/vim/init.vim create mode 100644 debian/.config/vim/plugins.vim create mode 100644 debian/.config/vim/vimrc create mode 100644 debian/.config/vscode/argv.json create mode 100755 debian/.config/wal/postrun create mode 100644 debian/.config/wal/templates/dunstrc create mode 100644 debian/.config/wal/templates/zathurarc create mode 100644 debian/.config/wget/wgetrc create mode 100755 debian/.config/yazi/flavors/ayu-dark.yazi/LICENSE create mode 100755 debian/.config/yazi/flavors/ayu-dark.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/ayu-dark.yazi/README.md create mode 100755 debian/.config/yazi/flavors/ayu-dark.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/ayu-dark.yazi/preview.png create mode 100755 debian/.config/yazi/flavors/ayu-dark.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/catppuccin-frappe.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/catppuccin-frappe.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/catppuccin-frappe.yazi/README.md create mode 100644 debian/.config/yazi/flavors/catppuccin-frappe.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/catppuccin-frappe.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/catppuccin-frappe.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/catppuccin-latte.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/catppuccin-latte.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/catppuccin-latte.yazi/README.md create mode 100644 debian/.config/yazi/flavors/catppuccin-latte.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/catppuccin-latte.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/catppuccin-latte.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/catppuccin-macchiato.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/catppuccin-macchiato.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/catppuccin-macchiato.yazi/README.md create mode 100644 debian/.config/yazi/flavors/catppuccin-macchiato.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/catppuccin-macchiato.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/catppuccin-macchiato.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/catppuccin-mocha.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/catppuccin-mocha.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/catppuccin-mocha.yazi/README.md create mode 100644 debian/.config/yazi/flavors/catppuccin-mocha.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/catppuccin-mocha.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/catppuccin-mocha.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/dracula.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/dracula.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/dracula.yazi/README.md create mode 100644 debian/.config/yazi/flavors/dracula.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/dracula.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/dracula.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/everforest-medium.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/everforest-medium.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/everforest-medium.yazi/README.md create mode 100644 debian/.config/yazi/flavors/everforest-medium.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/everforest-medium.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/everforest-medium.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/gruvbox-dark.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/gruvbox-dark.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/gruvbox-dark.yazi/README.md create mode 100644 debian/.config/yazi/flavors/gruvbox-dark.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/gruvbox-dark.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/gruvbox-dark.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/kanagawa-dragon.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/kanagawa-dragon.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/kanagawa-dragon.yazi/README.md create mode 100644 debian/.config/yazi/flavors/kanagawa-dragon.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/kanagawa-dragon.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/kanagawa-dragon.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/kanagawa-lotus.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/kanagawa-lotus.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/kanagawa-lotus.yazi/README.md create mode 100644 debian/.config/yazi/flavors/kanagawa-lotus.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/kanagawa-lotus.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/kanagawa-lotus.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/kanagawa.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/kanagawa.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/kanagawa.yazi/README.md create mode 100644 debian/.config/yazi/flavors/kanagawa.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/kanagawa.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/kanagawa.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/rose-pine-dawn.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/rose-pine-dawn.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/rose-pine-dawn.yazi/README.md create mode 100644 debian/.config/yazi/flavors/rose-pine-dawn.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/rose-pine-dawn.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/rose-pine-dawn.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/rose-pine-moon.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/rose-pine-moon.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/rose-pine-moon.yazi/README.md create mode 100644 debian/.config/yazi/flavors/rose-pine-moon.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/rose-pine-moon.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/rose-pine-moon.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/rose-pine.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/rose-pine.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/rose-pine.yazi/README.md create mode 100644 debian/.config/yazi/flavors/rose-pine.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/rose-pine.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/rose-pine.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/scripts/README.md create mode 100644 debian/.config/yazi/flavors/scripts/generate.js create mode 100644 debian/.config/yazi/flavors/scripts/template.toml create mode 100644 debian/.config/yazi/flavors/tokyo-night.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/tokyo-night.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/tokyo-night.yazi/README.md create mode 100644 debian/.config/yazi/flavors/tokyo-night.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/tokyo-night.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/tokyo-night.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/README.md create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/img/1.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/img/2.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/img/3.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/img/4.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/img/preview.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-modern.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/README.md create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/img/1.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/img/2.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/img/3.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/img/4.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/img/preview.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/vscode-dark-plus.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/README.md create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/img/1.png create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/img/2.png create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/img/3.png create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/img/4.png create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/img/preview.png create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/vscode-light-modern.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/LICENSE create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/LICENSE-tmtheme create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/README.md create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/flavor.toml create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/img/1.png create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/img/2.png create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/img/3.png create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/img/4.png create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/img/preview.png create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/preview.png create mode 100644 debian/.config/yazi/flavors/vscode-light-plus.yazi/tmtheme.xml create mode 100644 debian/.config/yazi/init.lua create mode 100644 debian/.config/yazi/keymap-default.toml create mode 100644 debian/.config/yazi/plugins/chmod.yazi/README.md create mode 100644 debian/.config/yazi/plugins/chmod.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/compress.yazi/LICENSE create mode 100644 debian/.config/yazi/plugins/compress.yazi/README.md create mode 100644 debian/.config/yazi/plugins/compress.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/diff.yazi/README.md create mode 100644 debian/.config/yazi/plugins/diff.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/folder-rules.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/full-border.yazi/README.md create mode 100644 debian/.config/yazi/plugins/full-border.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/git.yazi/README.md create mode 100644 debian/.config/yazi/plugins/git.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/git.yazi/types.lua create mode 100644 debian/.config/yazi/plugins/jump-to-char.yazi/README.md create mode 100644 debian/.config/yazi/plugins/jump-to-char.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/lsar.yazi/README.md create mode 100644 debian/.config/yazi/plugins/lsar.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/mactag.yazi/README.md create mode 100644 debian/.config/yazi/plugins/mactag.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/mime-ext.yazi/README.md create mode 100644 debian/.config/yazi/plugins/mime-ext.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/mount.yazi/README.md create mode 100644 debian/.config/yazi/plugins/mount.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/office.yazi/LICENSE create mode 100644 debian/.config/yazi/plugins/office.yazi/README.md create mode 100644 debian/.config/yazi/plugins/office.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/parent-arrow.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/piper.yazi/README.md create mode 100644 debian/.config/yazi/plugins/piper.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/smart-enter.yazi/README.md create mode 100644 debian/.config/yazi/plugins/smart-enter.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/smart-filter.yazi/README.md create mode 100644 debian/.config/yazi/plugins/smart-filter.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/smart-paste.yazi/README.md create mode 100644 debian/.config/yazi/plugins/smart-paste.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/sudo-demo.yazi/README.md create mode 100644 debian/.config/yazi/plugins/sudo-demo.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/toggle-pane.yazi/README.md create mode 100644 debian/.config/yazi/plugins/toggle-pane.yazi/main.lua create mode 100644 debian/.config/yazi/plugins/zoom.yazi/README.md create mode 100644 debian/.config/yazi/plugins/zoom.yazi/main.lua create mode 100644 debian/.config/yazi/theme.toml create mode 100644 debian/.config/yazi/yazi.toml create mode 100644 debian/.config/zsh/.zshrc create mode 100644 debian/.config/zsh/autocomplete.zsh create mode 100644 debian/.config/zsh/git.zsh create mode 100644 debian/.config/zsh/keymaps.zsh create mode 100644 debian/.config/zsh/p10k.zsh create mode 100644 debian/.config/zsh/packages.zsh create mode 100644 debian/.config/zsh/plugins.zsh create mode 100644 debian/.config/zsh/scripts.zsh create mode 100644 debian/.gitmodules create mode 100644 debian/.gnupg/gpg-agent.conf create mode 100755 debian/.local/bin/albumsplit create mode 100755 debian/.local/bin/bash-preexec create mode 100755 debian/.local/bin/bookmarks create mode 100755 debian/.local/bin/browse create mode 100755 debian/.local/bin/browserprofile create mode 100755 debian/.local/bin/clonerepo create mode 100755 debian/.local/bin/compiler create mode 100755 debian/.local/bin/concatvideo create mode 100755 debian/.local/bin/createsh create mode 100644 debian/.local/bin/cron/README.md create mode 100755 debian/.local/bin/cron/crontog create mode 100755 debian/.local/bin/cron/mediaup create mode 100755 debian/.local/bin/cron/newsup create mode 100755 debian/.local/bin/cutvideo create mode 100755 debian/.local/bin/cwmx create mode 100755 debian/.local/bin/decodetitle create mode 100755 debian/.local/bin/displayselect create mode 100755 debian/.local/bin/dmenubrowse create mode 100755 debian/.local/bin/dmenudelmusic create mode 100755 debian/.local/bin/dmenugithub create mode 100755 debian/.local/bin/dmenuhandler create mode 100755 debian/.local/bin/dmenuman create mode 100755 debian/.local/bin/dmenumountcifs create mode 100755 debian/.local/bin/dmenupass create mode 100755 debian/.local/bin/dmenurecord create mode 100755 debian/.local/bin/dmenusmbadd create mode 100755 debian/.local/bin/dmenusmbdel create mode 100755 debian/.local/bin/dmenuunicode create mode 100755 debian/.local/bin/dmenuupgrade create mode 100755 debian/.local/bin/dmenuvirt create mode 100755 debian/.local/bin/dvdburn create mode 100755 debian/.local/bin/ecrypt create mode 100755 debian/.local/bin/emojiupdate create mode 100755 debian/.local/bin/ethwifi create mode 100755 debian/.local/bin/extract create mode 100755 debian/.local/bin/extractkeys create mode 100755 debian/.local/bin/fzffiles create mode 100755 debian/.local/bin/fzffns create mode 100755 debian/.local/bin/fzfpass create mode 100755 debian/.local/bin/getbib create mode 100755 debian/.local/bin/getcomproot create mode 100755 debian/.local/bin/getkeys create mode 100755 debian/.local/bin/gitfiles create mode 100755 debian/.local/bin/gitopenbranch create mode 100755 debian/.local/bin/gitstagedfiles create mode 100755 debian/.local/bin/gitupdate create mode 100755 debian/.local/bin/gpt create mode 100755 debian/.local/bin/gracefulkill create mode 100755 debian/.local/bin/hugow create mode 100755 debian/.local/bin/iconupdate create mode 100755 debian/.local/bin/ifinstalled create mode 100755 debian/.local/bin/lastfiles create mode 100755 debian/.local/bin/lfub create mode 100755 debian/.local/bin/linkhandler create mode 100755 debian/.local/bin/maimpick create mode 100755 debian/.local/bin/mbackup create mode 100755 debian/.local/bin/monitorbright create mode 100755 debian/.local/bin/mounter create mode 100755 debian/.local/bin/mpdmenu create mode 100755 debian/.local/bin/mpvplay create mode 100755 debian/.local/bin/noisereduce create mode 100755 debian/.local/bin/openfiles create mode 100755 debian/.local/bin/opensessions create mode 100755 debian/.local/bin/opentasktui create mode 100755 debian/.local/bin/openurl create mode 100755 debian/.local/bin/opout create mode 100755 debian/.local/bin/otp create mode 100755 debian/.local/bin/ovpn create mode 100755 debian/.local/bin/partlabel create mode 100755 debian/.local/bin/passmenu2 create mode 100755 debian/.local/bin/pauseallmpv create mode 100755 debian/.local/bin/peertubetorrent create mode 100755 debian/.local/bin/podentr create mode 100755 debian/.local/bin/ppts create mode 100755 debian/.local/bin/qndl create mode 100755 debian/.local/bin/queueandnotify create mode 100755 debian/.local/bin/rbackup create mode 100755 debian/.local/bin/refreshbrowser create mode 100755 debian/.local/bin/remapd create mode 100755 debian/.local/bin/remaps create mode 100755 debian/.local/bin/restartnvim create mode 100755 debian/.local/bin/rgafiles create mode 100755 debian/.local/bin/rotdir create mode 100755 debian/.local/bin/rssadd create mode 100755 debian/.local/bin/rssget create mode 100755 debian/.local/bin/schedule create mode 100755 debian/.local/bin/screenshotactivewindow create mode 100755 debian/.local/bin/sd create mode 100755 debian/.local/bin/sessionizer create mode 100755 debian/.local/bin/setbg create mode 100755 debian/.local/bin/setfirmware create mode 100755 debian/.local/bin/setlock create mode 100755 debian/.local/bin/setmonitor create mode 100755 debian/.local/bin/shortcuts create mode 100755 debian/.local/bin/slider create mode 100755 debian/.local/bin/sshadd create mode 100755 debian/.local/bin/stw create mode 100755 debian/.local/bin/syncdic create mode 100755 debian/.local/bin/syncdot create mode 100755 debian/.local/bin/synctime create mode 100755 debian/.local/bin/sysact create mode 100755 debian/.local/bin/tablet create mode 100755 debian/.local/bin/tag create mode 100755 debian/.local/bin/task/taskwarrior-tui/annotate-with-new-note create mode 100755 debian/.local/bin/task/taskwarrior-tui/annotate-with-note create mode 100755 debian/.local/bin/task/taskwarrior-tui/cycle-priority create mode 100755 debian/.local/bin/task/taskwarrior-tui/cycle-tmux-projects create mode 100755 debian/.local/bin/task/taskwarrior-tui/decrease-priority create mode 100755 debian/.local/bin/task/taskwarrior-tui/git-issue-sync create mode 100755 debian/.local/bin/task/taskwarrior-tui/increase-priority create mode 100755 debian/.local/bin/task/taskwarrior-tui/lib-task-interop create mode 100755 debian/.local/bin/task/taskwarrior-tui/task-switch-context create mode 100755 debian/.local/bin/task/taskwarrior-tui/taskopen-annotation create mode 100755 debian/.local/bin/task/taskwarrior-tui/taskopen-line create mode 100755 debian/.local/bin/task/taskwarrior-tui/tasks-sync create mode 100755 debian/.local/bin/task/taskwarrior-tui/toggle-review-label create mode 100755 debian/.local/bin/td-toggle create mode 100755 debian/.local/bin/timer create mode 100755 debian/.local/bin/timer_ create mode 100755 debian/.local/bin/timezones create mode 100755 debian/.local/bin/tmuxcreate create mode 100755 debian/.local/bin/tmuxcycleborder create mode 100755 debian/.local/bin/tmuxdbussync create mode 100755 debian/.local/bin/tmuxopen create mode 100755 debian/.local/bin/tmuxtogglebar create mode 100755 debian/.local/bin/tmuxtoggleterm create mode 100755 debian/.local/bin/toggleoutput create mode 100755 debian/.local/bin/tordone create mode 100755 debian/.local/bin/torwrap create mode 100755 debian/.local/bin/transadd create mode 100755 debian/.local/bin/unix create mode 100755 debian/.local/bin/unmounter create mode 100755 debian/.local/bin/vimwikitodo create mode 100755 debian/.local/bin/vipy create mode 100755 debian/.local/bin/wallset create mode 100755 debian/.local/bin/weath create mode 100755 debian/.local/bin/webcam create mode 100755 debian/.local/bin/whereami create mode 100755 debian/.local/bin/xdg-terminal-exec create mode 100755 debian/.local/bin/xdotmouse create mode 100755 debian/.local/bin/xinputconf create mode 100755 debian/.local/bin/xkeys create mode 100755 debian/.local/bin/ylog create mode 100644 debian/.stow-local-ignore create mode 100644 debian/.urlview (limited to 'debian') diff --git a/debian/.config/LazyVim/.gitignore b/debian/.config/LazyVim/.gitignore new file mode 100644 index 0000000..cc5457a --- /dev/null +++ b/debian/.config/LazyVim/.gitignore @@ -0,0 +1,8 @@ +tt.* +.tests +doc/tags +debug +.repro +foo.* +*.log +data diff --git a/debian/.config/LazyVim/.neoconf.json b/debian/.config/LazyVim/.neoconf.json new file mode 100644 index 0000000..7c48087 --- /dev/null +++ b/debian/.config/LazyVim/.neoconf.json @@ -0,0 +1,15 @@ +{ + "neodev": { + "library": { + "enabled": true, + "plugins": true + } + }, + "neoconf": { + "plugins": { + "lua_ls": { + "enabled": true + } + } + } +} diff --git a/debian/.config/LazyVim/LICENSE b/debian/.config/LazyVim/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/debian/.config/LazyVim/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/debian/.config/LazyVim/README.md b/debian/.config/LazyVim/README.md new file mode 100644 index 0000000..185280b --- /dev/null +++ b/debian/.config/LazyVim/README.md @@ -0,0 +1,4 @@ +# 💤 LazyVim + +A starter template for [LazyVim](https://github.com/LazyVim/LazyVim). +Refer to the [documentation](https://lazyvim.github.io/installation) to get started. diff --git a/debian/.config/LazyVim/init.lua b/debian/.config/LazyVim/init.lua new file mode 100644 index 0000000..2514f9e --- /dev/null +++ b/debian/.config/LazyVim/init.lua @@ -0,0 +1,2 @@ +-- bootstrap lazy.nvim, LazyVim and your plugins +require("config.lazy") diff --git a/debian/.config/LazyVim/lua/config/autocmds.lua b/debian/.config/LazyVim/lua/config/autocmds.lua new file mode 100644 index 0000000..4221e75 --- /dev/null +++ b/debian/.config/LazyVim/lua/config/autocmds.lua @@ -0,0 +1,8 @@ +-- Autocmds are automatically loaded on the VeryLazy event +-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua +-- +-- Add any additional autocmds here +-- with `vim.api.nvim_create_autocmd` +-- +-- Or remove existing autocmds by their group name (which is prefixed with `lazyvim_` for the defaults) +-- e.g. vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell") diff --git a/debian/.config/LazyVim/lua/config/keymaps.lua b/debian/.config/LazyVim/lua/config/keymaps.lua new file mode 100644 index 0000000..2c134f7 --- /dev/null +++ b/debian/.config/LazyVim/lua/config/keymaps.lua @@ -0,0 +1,3 @@ +-- Keymaps are automatically loaded on the VeryLazy event +-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua +-- Add any additional keymaps here diff --git a/debian/.config/LazyVim/lua/config/lazy.lua b/debian/.config/LazyVim/lua/config/lazy.lua new file mode 100644 index 0000000..d73bfa1 --- /dev/null +++ b/debian/.config/LazyVim/lua/config/lazy.lua @@ -0,0 +1,53 @@ +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) + +require("lazy").setup({ + spec = { + -- add LazyVim and import its plugins + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, + -- import/override with your plugins + { import = "plugins" }, + }, + defaults = { + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. + -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. + lazy = false, + -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, + -- have outdated releases, which may break your Neovim install. + version = false, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + }, + install = { colorscheme = { "tokyonight", "habamax" } }, + checker = { + enabled = true, -- check for plugin updates periodically + notify = false, -- notify on update + }, -- automatically check for plugin updates + performance = { + rtp = { + -- disable some rtp plugins + disabled_plugins = { + "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + "tarPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/debian/.config/LazyVim/lua/config/options.lua b/debian/.config/LazyVim/lua/config/options.lua new file mode 100644 index 0000000..3ea1454 --- /dev/null +++ b/debian/.config/LazyVim/lua/config/options.lua @@ -0,0 +1,3 @@ +-- Options are automatically loaded before lazy.nvim startup +-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua +-- Add any additional options here diff --git a/debian/.config/LazyVim/lua/plugins/example.lua b/debian/.config/LazyVim/lua/plugins/example.lua new file mode 100644 index 0000000..17f53d6 --- /dev/null +++ b/debian/.config/LazyVim/lua/plugins/example.lua @@ -0,0 +1,197 @@ +-- since this is just an example spec, don't actually load anything here and return an empty spec +-- stylua: ignore +if true then return {} end + +-- every spec file under the "plugins" directory will be loaded automatically by lazy.nvim +-- +-- In your plugin files, you can: +-- * add extra plugins +-- * disable/enabled LazyVim plugins +-- * override the configuration of LazyVim plugins +return { + -- add gruvbox + { "ellisonleao/gruvbox.nvim" }, + + -- Configure LazyVim to load gruvbox + { + "LazyVim/LazyVim", + opts = { + colorscheme = "gruvbox", + }, + }, + + -- change trouble config + { + "folke/trouble.nvim", + -- opts will be merged with the parent spec + opts = { use_diagnostic_signs = true }, + }, + + -- disable trouble + { "folke/trouble.nvim", enabled = false }, + + -- override nvim-cmp and add cmp-emoji + { + "hrsh7th/nvim-cmp", + dependencies = { "hrsh7th/cmp-emoji" }, + ---@param opts cmp.ConfigSchema + opts = function(_, opts) + table.insert(opts.sources, { name = "emoji" }) + end, + }, + + -- change some telescope options and a keymap to browse plugin files + { + "nvim-telescope/telescope.nvim", + keys = { + -- add a keymap to browse plugin files + -- stylua: ignore + { + "fp", + function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end, + desc = "Find Plugin File", + }, + }, + -- change some options + opts = { + defaults = { + layout_strategy = "horizontal", + layout_config = { prompt_position = "top" }, + sorting_strategy = "ascending", + winblend = 0, + }, + }, + }, + + -- add pyright to lspconfig + { + "neovim/nvim-lspconfig", + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- pyright will be automatically installed with mason and loaded with lspconfig + pyright = {}, + }, + }, + }, + + -- add tsserver and setup with typescript.nvim instead of lspconfig + { + "neovim/nvim-lspconfig", + dependencies = { + "jose-elias-alvarez/typescript.nvim", + init = function() + require("lazyvim.util").lsp.on_attach(function(_, buffer) + -- stylua: ignore + vim.keymap.set( "n", "co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" }) + vim.keymap.set("n", "cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer }) + end) + end, + }, + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- tsserver will be automatically installed with mason and loaded with lspconfig + tsserver = {}, + }, + -- you can do any additional lsp server setup here + -- return true if you don't want this server to be setup with lspconfig + ---@type table + setup = { + -- example to setup with typescript.nvim + tsserver = function(_, opts) + require("typescript").setup({ server = opts }) + return true + end, + -- Specify * to use this function as a fallback for any server + -- ["*"] = function(server, opts) end, + }, + }, + }, + + -- for typescript, LazyVim also includes extra specs to properly setup lspconfig, + -- treesitter, mason and typescript.nvim. So instead of the above, you can use: + { import = "lazyvim.plugins.extras.lang.typescript" }, + + -- add more treesitter parsers + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "bash", + "html", + "javascript", + "json", + "lua", + "markdown", + "markdown_inline", + "python", + "query", + "regex", + "tsx", + "typescript", + "vim", + "yaml", + }, + }, + }, + + -- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above + -- would overwrite `ensure_installed` with the new value. + -- If you'd rather extend the default config, use the code below instead: + { + "nvim-treesitter/nvim-treesitter", + opts = function(_, opts) + -- add tsx and treesitter + vim.list_extend(opts.ensure_installed, { + "tsx", + "typescript", + }) + end, + }, + + -- the opts function can also be used to change the default opts: + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function(_, opts) + table.insert(opts.sections.lualine_x, { + function() + return "😄" + end, + }) + end, + }, + + -- or you can return new options to override all the defaults + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function() + return { + --[[add your custom lualine config here]] + } + end, + }, + + -- use mini.starter instead of alpha + { import = "lazyvim.plugins.extras.ui.mini-starter" }, + + -- add jsonls and schemastore packages, and setup treesitter for json, json5 and jsonc + { import = "lazyvim.plugins.extras.lang.json" }, + + -- add any tools you want to have installed below + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "stylua", + "shellcheck", + "shfmt", + "flake8", + }, + }, + }, +} diff --git a/debian/.config/LazyVim/stylua.toml b/debian/.config/LazyVim/stylua.toml new file mode 100644 index 0000000..5d6c50d --- /dev/null +++ b/debian/.config/LazyVim/stylua.toml @@ -0,0 +1,3 @@ +indent_type = "Spaces" +indent_width = 2 +column_width = 120 \ No newline at end of file diff --git a/debian/.config/NvChad/.stylua.toml b/debian/.config/NvChad/.stylua.toml new file mode 100644 index 0000000..ecb6dca --- /dev/null +++ b/debian/.config/NvChad/.stylua.toml @@ -0,0 +1,6 @@ +column_width = 120 +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 2 +quote_style = "AutoPreferDouble" +call_parentheses = "None" diff --git a/debian/.config/NvChad/LICENSE b/debian/.config/NvChad/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/debian/.config/NvChad/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/debian/.config/NvChad/README.md b/debian/.config/NvChad/README.md new file mode 100644 index 0000000..769fbdf --- /dev/null +++ b/debian/.config/NvChad/README.md @@ -0,0 +1,9 @@ +**This repo is supposed to be used as config by NvChad users!** + +- The main nvchad repo (NvChad/NvChad) is used as a plugin by this repo. +- So you just import its modules , like `require "nvchad.options" , require "nvchad.mappings"` +- So you can delete the .git from this repo ( when you clone it locally ) or fork it :) + +# Credits + +1) Lazyvim starter https://github.com/LazyVim/starter as nvchad's starter was inspired by Lazyvim's . It made a lot of things easier! diff --git a/debian/.config/NvChad/init.lua b/debian/.config/NvChad/init.lua new file mode 100644 index 0000000..494360c --- /dev/null +++ b/debian/.config/NvChad/init.lua @@ -0,0 +1,37 @@ +vim.g.base46_cache = vim.fn.stdpath "data" .. "/nvchad/base46/" +vim.g.mapleader = " " + +-- bootstrap lazy and all plugins +local lazypath = vim.fn.stdpath "data" .. "/lazy/lazy.nvim" + +if not vim.uv.fs_stat(lazypath) then + local repo = "https://github.com/folke/lazy.nvim.git" + vim.fn.system { "git", "clone", "--filter=blob:none", repo, "--branch=stable", lazypath } +end + +vim.opt.rtp:prepend(lazypath) + +local lazy_config = require "configs.lazy" + +-- load plugins +require("lazy").setup({ + { + "NvChad/NvChad", + lazy = false, + branch = "v2.5", + import = "nvchad.plugins", + }, + + { import = "plugins" }, +}, lazy_config) + +-- load theme +dofile(vim.g.base46_cache .. "defaults") +dofile(vim.g.base46_cache .. "statusline") + +require "options" +require "autocmds" + +vim.schedule(function() + require "mappings" +end) diff --git a/debian/.config/NvChad/lua/autocmds.lua b/debian/.config/NvChad/lua/autocmds.lua new file mode 100644 index 0000000..d2db0bb --- /dev/null +++ b/debian/.config/NvChad/lua/autocmds.lua @@ -0,0 +1 @@ +require "nvchad.autocmds" diff --git a/debian/.config/NvChad/lua/chadrc.lua b/debian/.config/NvChad/lua/chadrc.lua new file mode 100644 index 0000000..86cccf1 --- /dev/null +++ b/debian/.config/NvChad/lua/chadrc.lua @@ -0,0 +1,30 @@ +-- This file needs to have same structure as nvconfig.lua +-- https://github.com/NvChad/ui/blob/v3.0/lua/nvconfig.lua +-- Please read that file to know all available options :( + +---@type ChadrcConfig +local M = {} + +M.base46 = { + theme = "onedark", -- default theme + hl_add = {}, + hl_override = {}, + integrations = {}, + changed_themes = {}, + transparency = false, + theme_toggle = { "onedark", "one_light" }, + + -- hl_override = { + -- Comment = { italic = true }, + -- ["@comment"] = { italic = true }, + -- }, +} + +-- M.nvdash = { load_on_startup = true } +-- M.ui = { +-- tabufline = { +-- lazyload = false +-- } +--} + +return M diff --git a/debian/.config/NvChad/lua/configs/conform.lua b/debian/.config/NvChad/lua/configs/conform.lua new file mode 100644 index 0000000..35ba6cf --- /dev/null +++ b/debian/.config/NvChad/lua/configs/conform.lua @@ -0,0 +1,15 @@ +local options = { + formatters_by_ft = { + lua = { "stylua" }, + -- css = { "prettier" }, + -- html = { "prettier" }, + }, + + -- format_on_save = { + -- -- These options will be passed to conform.format() + -- timeout_ms = 500, + -- lsp_fallback = true, + -- }, +} + +return options diff --git a/debian/.config/NvChad/lua/configs/lazy.lua b/debian/.config/NvChad/lua/configs/lazy.lua new file mode 100644 index 0000000..cd170bd --- /dev/null +++ b/debian/.config/NvChad/lua/configs/lazy.lua @@ -0,0 +1,47 @@ +return { + defaults = { lazy = true }, + install = { colorscheme = { "nvchad" } }, + + ui = { + icons = { + ft = "", + lazy = "󰂠 ", + loaded = "", + not_loaded = "", + }, + }, + + performance = { + rtp = { + disabled_plugins = { + "2html_plugin", + "tohtml", + "getscript", + "getscriptPlugin", + "gzip", + "logipat", + "netrw", + "netrwPlugin", + "netrwSettings", + "netrwFileHandlers", + "matchit", + "tar", + "tarPlugin", + "rrhelper", + "spellfile_plugin", + "vimball", + "vimballPlugin", + "zip", + "zipPlugin", + "tutor", + "rplugin", + "syntax", + "synmenu", + "optwin", + "compiler", + "bugreport", + "ftplugin", + }, + }, + }, +} diff --git a/debian/.config/NvChad/lua/configs/lspconfig.lua b/debian/.config/NvChad/lua/configs/lspconfig.lua new file mode 100644 index 0000000..7bcabca --- /dev/null +++ b/debian/.config/NvChad/lua/configs/lspconfig.lua @@ -0,0 +1,55 @@ +require("nvchad.configs.lspconfig").defaults() + +local servers = { "html", "cssls" } +vim.lsp.enable(servers) + +-- read :h vim.lsp.config for changing options of lsp servers +vim.lsp.config("lua_ls", { + on_init = function(client) + if client.workspace_folders then + local path = client.workspace_folders[1].name + if + path ~= vim.fn.stdpath "config" + and (vim.uv.fs_stat(path .. "/.luarc.json") or vim.uv.fs_stat(path .. "/.luarc.jsonc")) + then + return + end + end + + client.config.settings.Lua = vim.tbl_deep_extend("force", client.config.settings.Lua, { + runtime = { + -- Tell the language server which version of Lua you're using (most + -- likely LuaJIT in the case of Neovim) + version = "LuaJIT", + -- Tell the language server how to find Lua modules same way as Neovim + -- (see `:h lua-module-load`) + path = { + "lua/?.lua", + "lua/?/init.lua", + }, + }, + -- Make the server aware of Neovim runtime files + workspace = { + checkThirdParty = false, + library = { + vim.env.VIMRUNTIME, + -- Depending on the usage, you might want to add additional paths + -- here. + -- '${3rd}/luv/library' + -- '${3rd}/busted/library' + }, + -- Or pull in all of 'runtimepath'. + -- NOTE: this is a lot slower and will cause issues when working on + -- your own configuration. + -- See https://github.com/neovim/nvim-lspconfig/issues/3189 + -- library = { + -- vim.api.nvim_get_runtime_file('', true), + -- } + }, + }) + end, + settings = { + Lua = {}, + }, +}) +vim.lsp.enable "lua_ls" diff --git a/debian/.config/NvChad/lua/mappings.lua b/debian/.config/NvChad/lua/mappings.lua new file mode 100644 index 0000000..783b78f --- /dev/null +++ b/debian/.config/NvChad/lua/mappings.lua @@ -0,0 +1,10 @@ +require "nvchad.mappings" + +-- add yours here + +local map = vim.keymap.set + +map("n", ";", ":", { desc = "CMD enter command mode" }) +map("i", "jk", "") + +-- map({ "n", "i", "v" }, "", " w ") diff --git a/debian/.config/NvChad/lua/options.lua b/debian/.config/NvChad/lua/options.lua new file mode 100644 index 0000000..738f20b --- /dev/null +++ b/debian/.config/NvChad/lua/options.lua @@ -0,0 +1,6 @@ +require "nvchad.options" + +-- add yours here! + +-- local o = vim.o +-- o.cursorlineopt ='both' -- to enable cursorline! diff --git a/debian/.config/NvChad/lua/plugins/init.lua b/debian/.config/NvChad/lua/plugins/init.lua new file mode 100644 index 0000000..e67fc7e --- /dev/null +++ b/debian/.config/NvChad/lua/plugins/init.lua @@ -0,0 +1,52 @@ +return { + { + "stevearc/conform.nvim", + -- event = 'BufWritePre', -- uncomment for format on save + opts = require "configs.conform", + }, + + -- These are some examples, uncomment them if you want to see them work! + { + "neovim/nvim-lspconfig", + config = function() + require "configs.lspconfig" + end, + }, + + -- test new blink + { import = "nvchad.blink.lazyspec" }, + + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "vim", + "lua", + "vimdoc", + "html", + "css", + }, + }, + }, + + "nvim-lua/plenary.nvim", + { "nvim-tree/nvim-web-devicons", lazy = true }, + + { + "nvchad/ui", + config = function() + require "nvchad" + end, + }, + + { + "nvchad/base46", + lazy = true, + build = function() + require("base46").load_all_highlights() + end, + }, + + "nvchad/volt", -- optional, needed for theme switcher + -- or just use Telescope themes +} diff --git a/debian/.config/TheSiahxyz/after/queries/markdown/textobjects.scm b/debian/.config/TheSiahxyz/after/queries/markdown/textobjects.scm new file mode 100644 index 0000000..2882dd2 --- /dev/null +++ b/debian/.config/TheSiahxyz/after/queries/markdown/textobjects.scm @@ -0,0 +1,3 @@ +;; extends + +(fenced_code_block (code_fence_content) @code_cell.inner) @code_cell.outer diff --git a/debian/.config/TheSiahxyz/ftplugin/markdown.lua b/debian/.config/TheSiahxyz/ftplugin/markdown.lua new file mode 100644 index 0000000..ae6adbf --- /dev/null +++ b/debian/.config/TheSiahxyz/ftplugin/markdown.lua @@ -0,0 +1,518 @@ +-- Function to check if the current file is in the Obsidian repository +local function is_in_obsidian_repo() + local current_file_path = vim.fn.expand("%:p:h") + local user = os.getenv("USER") -- Get the current user's name from the environment variable + local obsidian_path = "/home/" .. user .. "/Private/repos/Obsidian/" + + return string.find(current_file_path, obsidian_path) ~= nil +end + +function BoldMe() + -- Get the start and end positions of the visual selection + local start_pos = vim.fn.getpos("'<") + local end_pos = vim.fn.getpos("'>") + local start_line, start_col = start_pos[2], start_pos[3] + local end_line, end_col = end_pos[2], end_pos[3] + local lines = vim.api.nvim_buf_get_lines(0, start_line - 1, end_line, false) + + if start_line == end_line then + lines[1] = lines[1]:sub(1, start_col - 1) + .. "**" + .. lines[1]:sub(start_col, end_col) + .. "**" + .. lines[1]:sub(end_col + 1) + else + lines[1] = lines[1]:sub(1, start_col - 1) .. "**" .. lines[1]:sub(start_col) + lines[#lines] = lines[#lines]:sub(1, end_col) .. "**" .. lines[#lines]:sub(end_col + 1) + end + vim.api.nvim_buf_set_lines(0, start_line - 1, end_line, false, lines) +end + +local function MarkdownCodeBlock(outside) + vim.cmd("call search('```', 'cb')") + vim.cmd(outside and "normal! Vo" or "normal! j0Vo") + vim.cmd("call search('```')") + if not outside then + vim.cmd("normal! k") + end +end + +-- Code block text objects +for _, mode in ipairs({ "o", "x" }) do + for _, mapping in ipairs({ + { "am", true }, + { "im", false }, + }) do + vim.keymap.set(mode, mapping[1], function() + MarkdownCodeBlock(mapping[2]) + end, { buffer = 0 }) + end +end + +-- Function to fold all headings of a specific level +local function set_foldmethod_expr() + -- These are lazyvim.org defaults but setting them just in case a file + -- doesn't have them set + if vim.fn.has("nvim-0.10") == 1 then + vim.opt.foldmethod = "expr" + vim.wo.foldexpr = "v:lua.require'TheSiahxyz.utils.markdown'.foldexpr()" + vim.opt.foldtext = "" + else + vim.opt.foldmethod = "indent" + vim.wo.foldtext = "v:lua.require'TheSiahxyz.utils.markdown'.foldexpr()" + end + vim.opt.foldlevel = 99 +end + +local function fold_headings_of_level(level) + -- Move to the top of the file + vim.cmd("normal! gg") + -- Get the total number of lines + local total_lines = vim.fn.line("$") + for line = 1, total_lines do + -- Get the content of the current line + local line_content = vim.fn.getline(line) + -- "^" -> Ensures the match is at the start of the line + -- string.rep("#", level) -> Creates a string with 'level' number of "#" characters + -- "%s" -> Matches any whitespace character after the "#" characters + -- So this will match `## `, `### `, `#### ` for example, which are markdown headings + if line_content:match("^" .. string.rep("#", level) .. "%s") then + -- Move the cursor to the current line + vim.fn.cursor(line, 1) + -- Fold the heading if it matches the level + if vim.fn.foldclosed(line) == -1 then + vim.cmd("normal! za") + end + end + end +end + +local function fold_markdown_headings(levels) + set_foldmethod_expr() + -- I save the view to know where to jump back after folding + local saved_view = vim.fn.winsaveview() + for _, level in ipairs(levels) do + fold_headings_of_level(level) + end + vim.cmd("nohlsearch") + -- Restore the view to jump to where I was + vim.fn.winrestview(saved_view) +end + +local function make_heading_content() + -- Get the total number of lines in the buffer + local total_lines = vim.api.nvim_buf_line_count(0) + + -- Iterate through all lines + for line = 1, total_lines do + -- Get the content of the current line + local line_content = vim.api.nvim_buf_get_lines(0, line - 1, line, false)[1] + -- Match headings with at least two '#' characters + local heading = line_content:match("^(##+)%s(.+)") + if heading then + -- Extract the heading text + local heading_text = line_content:match("^#+%s(.+)") + if heading_text then + -- Create the content line with markdown link syntax + local content_line = string.format("%s [%s]()", heading, heading_text) + -- Replace the current line with the modified content + vim.api.nvim_buf_set_lines(0, line - 1, line, false, { content_line }) + end + end + end + -- Notify the user that the headings have been updated + vim.notify("Headings transformed into content format", vim.log.levels.INFO) +end + +-- Generate/update a Markdown TOC +-- To generate the TOC I use the markdown-toc plugin +-- https://github.com/jonschlinkert/markdown-toc +-- And the markdown-toc plugin installed as a LazyExtra +-- Function to update the Markdown TOC with customizable headings +local function update_markdown_toc(heading2, heading3) + -- local path = vim.fn.expand("%") -- Expands the current file name to a full path + local path = vim.api.nvim_buf_get_name(0) + local bufnr = 0 -- The current buffer number, 0 references the current active buffer + -- Save the current view + -- If I don't do this, my folds are lost when I run this keymap + vim.cmd("mkview") + -- Retrieves all lines from the current buffer + local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) + local toc_exists = false -- Flag to check if TOC marker exists + local frontmatter_end = 0 -- To store the end line number of frontmatter + -- Check for frontmatter and TOC marker + for i, line in ipairs(lines) do + if i == 1 and line:match("^---$") then + -- Frontmatter start detected, now find the end + for j = i + 1, #lines do + if lines[j]:match("^---$") then + frontmatter_end = j + break + end + end + end + -- Checks for the TOC marker + if line:match("^%s*%s*$") then + toc_exists = true + break + end + end + -- Inserts H2 and H3 headings and at the appropriate position + if not toc_exists then + local insertion_line = 1 -- Default insertion point after first line + if frontmatter_end > 0 then + -- Find H1 after frontmatter + for i = frontmatter_end + 1, #lines do + if lines[i]:match("^#%s+") then + insertion_line = i + 1 + break + end + end + else + -- Find H1 from the beginning + for i, line in ipairs(lines) do + if line:match("^#%s+") then + insertion_line = i + 1 + break + end + end + end + -- Insert the specified headings and without blank lines + -- Insert the TOC inside a H2 and H3 heading right below the main H1 at the top lamw25wmal + vim.api.nvim_buf_set_lines(bufnr, insertion_line, insertion_line, false, { heading2, heading3, "" }) + end + -- Silently save the file, in case TOC is being created for the first time + vim.cmd("silent write") + -- Silently run markdown-toc to update the TOC without displaying command output + -- vim.fn.system('markdown-toc -i "' .. path .. '"') + -- I want my bulletpoints to be created only as "-" so passing that option as + -- an argument according to the docs + -- https://github.com/jonschlinkert/markdown-toc?tab=readme-ov-file#optionsbullets + vim.fn.system('markdown-toc --bullets "-" -i "' .. path .. '"') + vim.cmd("edit!") -- Reloads the file to reflect the changes made by markdown-toc + vim.cmd("silent write") -- Silently save the file + vim.notify("TOC updated and file saved", vim.log.levels.INFO) + -- -- In case a cleanup is needed, leaving this old code here as a reference + -- -- I used this code before I implemented the frontmatter check + -- -- Moves the cursor to the top of the file + -- vim.api.nvim_win_set_cursor(bufnr, { 1, 0 }) + -- -- Deletes leading blank lines from the top of the file + -- while true do + -- -- Retrieves the first line of the buffer + -- local line = vim.api.nvim_buf_get_lines(bufnr, 0, 1, false)[1] + -- -- Checks if the line is empty + -- if line == "" then + -- -- Deletes the line if it's empty + -- vim.api.nvim_buf_set_lines(bufnr, 0, 1, false, {}) + -- else + -- -- Breaks the loop if the line is not empty, indicating content or TOC marker + -- break + -- end + -- end + -- Restore the saved view (including folds) + vim.cmd("loadview") +end + +-- Show LSP diagnostics (inlay hints) in a hover window / popup lamw26wmal +vim.api.nvim_create_autocmd("FileType", { + pattern = { + "markdown", + "markdown.mdx", + "vimwiki", + "quarto", + "mdx", + "mdown", + "mkd", + "mkdn", + "mdwn", + }, + callback = function() + vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, { + buffer = 0, + callback = function() + vim.diagnostic.open_float(nil, { + focus = false, + border = "rounded", + }) + end, + }) + end, +}) + +-- FileType autocmd for markdown files +vim.api.nvim_create_autocmd("FileType", { + pattern = { "markdown", "mdx", "mdown", "mkd", "mkdn", "mdwn" }, + callback = function() + local ok, in_obsidian = pcall(function() + return is_in_obsidian_repo() + end) + local tw = (ok and in_obsidian) and 175 or 80 + + vim.bo.textwidth = tw + vim.bo.formatoptions = vim.bo.formatoptions:gsub("a", "") + vim.opt_local.wrap = true + vim.opt_local.linebreak = true + vim.opt_local.breakindent = true + vim.opt_local.expandtab = true + vim.opt_local.shiftwidth = 4 + vim.opt_local.softtabstop = 4 + vim.opt_local.showbreak = "…" + vim.opt_local.spell = true + vim.opt_local.spelllang = { "en", "ko", "cjk" } + vim.opt_local.spellsuggest = "best,9" + + vim.cmd([[iabbrev >> →]]) + vim.cmd([[iabbrev << ←]]) + vim.cmd([[iabbrev ^^ ↑]]) + vim.cmd([[iabbrev VV ↓]]) + end, +}) + +-- this setting makes markdown auto-set the 80 text width limit when typing +-- vim.cmd('set fo+=a') +if is_in_obsidian_repo() then + vim.bo.textwidth = 175 -- No limit for Obsidian repository +end + +-- Makrdown.nvim settings +local markdown_settings = { + auto_insert_bullets = 0, + autowrite = 1, + conceal = 0, + conceal_code_blocks = 0, + folding_disabled = 0, + folding_level = 2, + folding_style_pythonic = 1, + follow_anchor = 1, + new_list_item_indent = 0, + no_extensions_in_markdown = 1, + no_default_key_mappings = 1, + toc_autofit = 1, +} + +for key, value in pairs(markdown_settings) do + vim.g["vim_markdown_" .. key] = value +end + +-- MarkdownPreview settings +-- Get the BROWSER environment variable +local markdown_preview_settings = { + browser = os.getenv("BROWSER") or "/usr/bin/firefox", + echo_preview_url = 0, +} + +for key, value in pairs(markdown_preview_settings) do + vim.g["mkdp_" .. key] = value +end + +-- Save the cursor position globally to access it across different mappings +_G.saved_positions = {} + +local wk = require("which-key") +wk.add({ + mode = { "n", "v", "x" }, + { "ct", group = "Copy" }, + { "i", group = "Image" }, + { "m", group = "Markdown" }, + { "mh", group = "Headings" }, +}) + +-- bold +vim.api.nvim_buf_set_keymap( + 0, + "v", + "mb", + ":lua BoldMe()", + { noremap = true, silent = true, desc = "Bold selection" } +) + +-- copy +vim.keymap.set("n", "mcd", "4wvg$y", { desc = "Copy description" }) + +-- heading +vim.keymap.set("n", "mhi", function() + -- Save the current cursor position + local cursor_pos = vim.api.nvim_win_get_cursor(0) + -- I'm using [[ ]] to escape the special characters in a command + vim.cmd([[:g/\(^$\n\s*#\+\s.*\n^$\)/ .+1 s/^#\+\s/#&/]]) + -- Restore the cursor position + vim.api.nvim_win_set_cursor(0, cursor_pos) + -- Clear search highlight + vim.cmd("nohlsearch") +end, { desc = "Increase headings without confirmation" }) + +vim.keymap.set("n", "mhd", function() + -- Save the current cursor position + local cursor_pos = vim.api.nvim_win_get_cursor(0) + -- I'm using [[ ]] to escape the special characters in a command + vim.cmd([[:g/^\s*#\{2,}\s/ s/^#\(#\+\s.*\)/\1/]]) + -- Restore the cursor position + vim.api.nvim_win_set_cursor(0, cursor_pos) + -- Clear search highlight + vim.cmd("nohlsearch") +end, { desc = "Decrease headings without confirmation" }) + +local function make_heading_content() + -- Get the total number of lines in the buffer + local total_lines = vim.api.nvim_buf_line_count(0) + + -- Iterate through all lines + for line = 1, total_lines do + -- Get the content of the current line + local line_content = vim.api.nvim_buf_get_lines(0, line - 1, line, false)[1] + -- Match headings with at least two '#' characters + local heading = line_content:match("^(##+)%s(.+)") + if heading then + -- Extract the heading text + local heading_text = line_content:match("^#+%s(.+)") + if heading_text then + -- Create the content line with markdown link syntax + local content_line = string.format("%s [%s]()", heading, heading_text) + -- Replace the current line with the modified content + vim.api.nvim_buf_set_lines(0, line - 1, line, false, { content_line }) + end + end + end + -- Notify the user that the headings have been updated + vim.notify("Headings transformed into content format", vim.log.levels.INFO) +end +vim.keymap.set("n", "mhl", make_heading_content, { desc = "Make heading content" }) + +-- line to list +vim.keymap.set( + "n", + "ml", + "^I-[]^j", + { remap = true, silent = false, desc = "Make a line into a list" } +) + +-- folding +-- Keymap for unfolding markdown headings of level 2 or above +-- Changed all the markdown folding and unfolding keymaps from mfj to +-- zj, zk, zl, z; and zu respectively lamw25wmal +vim.keymap.set("n", "zu", function() + -- vim.keymap.set("n", "mfu", function() + -- Reloads the file to reflect the changes + vim.cmd("edit!") + vim.cmd("normal! zR") -- Unfold all headings +end, { desc = "Unfold all headings level 2 or above" }) + +-- gk jummps to the markdown heading above and then folds it +-- zi by default toggles folding, but I don't need it lamw25wmal +vim.keymap.set("n", "zh", function() + -- Difference between normal and normal! + -- - `normal` executes the command and respects any mappings that might be defined. + -- - `normal!` executes the command in a "raw" mode, ignoring any mappings. + vim.cmd("normal gk") + -- This is to fold the line under the cursor + vim.cmd("normal! za") +end, { desc = "Fold the heading cursor currently on" }) + +-- Keymap for folding markdown headings of level 1 or above +vim.keymap.set("n", "zj", function() + -- vim.keymap.set("n", "mfj", function() + -- Reloads the file to refresh folds, otherwise you have to re-open neovim + vim.cmd("edit!") + -- Unfold everything first or I had issues + vim.cmd("normal! zR") + fold_markdown_headings({ 6, 5, 4, 3, 2, 1 }) +end, { desc = "Fold all headings level 1 or above" }) + +-- Keymap for folding markdown headings of level 2 or above +-- I know, it reads like "madafaka" but "k" for me means "2" +vim.keymap.set("n", "zk", function() + -- vim.keymap.set("n", "mfk", function() + -- Reloads the file to refresh folds, otherwise you have to re-open neovim + vim.cmd("edit!") + -- Unfold everything first or I had issues + vim.cmd("normal! zR") + fold_markdown_headings({ 6, 5, 4, 3, 2 }) +end, { desc = "Fold all headings level 2 or above" }) + +-- Keymap for folding markdown headings of level 3 or above +vim.keymap.set("n", "zl", function() + -- vim.keymap.set("n", "mfl", function() + -- Reloads the file to refresh folds, otherwise you have to re-open neovim + vim.cmd("edit!") + -- Unfold everything first or I had issues + vim.cmd("normal! zR") + fold_markdown_headings({ 6, 5, 4, 3 }) +end, { desc = "Fold all headings level 3 or above" }) + +-- Keymap for folding markdown headings of level 4 or above +vim.keymap.set("n", "z;", function() + -- vim.keymap.set("n", "mf;", function() + -- Reloads the file to refresh folds, otherwise you have to re-open neovim + vim.cmd("edit!") + -- Unfold everything first or I had issues + vim.cmd("normal! zR") + fold_markdown_headings({ 6, 5, 4 }) +end, { desc = "Fold all headings level 4 or above" }) + +-- link text objects for i and a +vim.keymap.set( + { "o", "x" }, + "il", + "lua require('various-textobjs').mdlink('inner')", + { buffer = true, desc = "Link" } +) +vim.keymap.set( + { "o", "x" }, + "al", + "lua require('various-textobjs').mdlink('outer')", + { buffer = true, desc = "Link" } +) + +-- preview +vim.keymap.set("n", "mp", ":MarkdownPreview", { desc = "Markdown preview" }) + +-- traversal +vim.keymap.set("n", "", "Markdown_Fold", { desc = "Tab is for moving around only" }) + +vim.keymap.set("n", "]]", "Markdown_MoveToNextHeader", { desc = "Go to next header" }) +vim.keymap.set("n", "[[", "Markdown_MoveToPreviousHeader", { desc = "Go to previous header. Contrast with ]c" }) +vim.keymap.set("n", "][", "Markdown_MoveToNextSiblingHeader", { desc = "Go to next sibling header if any" }) +vim.keymap.set( + "n", + "[]", + "Markdown_MoveToPreviousSiblingHeader", + { desc = "Go to previous sibling header if any" } +) +vim.keymap.set("n", "]c", "Markdown_MoveToCurHeader", { desc = "Go to Current header" }) +vim.keymap.set("n", "]u", "Markdown_MoveToParentHeader", { desc = "Go to parent header (Up)" }) +vim.keymap.set("n", "", "Markdown_Checkbox", { desc = "Toggle checkboxes" }) +vim.keymap.set("n", "Tab", "Markdown_Fold", { desc = "Fold headers/lists" }) +vim.keymap.set("n", "Return", "Markdown_FollowLink", { desc = "Follow links" }) +vim.keymap.set("i", "Tab", "Markdown_Jump", { desc = "Indent new bullets, jump through empty fields in links" }) +vim.keymap.set({ "i", "v" }, "", "Markdown_CreateLink", { desc = "Create new links" }) +vim.keymap.set("i", "", "Markdown_NewLineAbove", { desc = "New line above, overrides default" }) +vim.keymap.set("i", "", "Markdown_NewLineBelow", { desc = "New line below, overrides default" }) +vim.keymap.set("i", "Return", "Markdown_NewLineBelow", { desc = "New line below, overrides default" }) +-- jump to the first line of the TOC +vim.keymap.set("n", "mm", function() + -- Save the current cursor position + _G.saved_positions["toc_return"] = vim.api.nvim_win_get_cursor(0) + -- Perform a silent search for the marker and move the cursor two lines below it + vim.cmd("silent! /\\n\\n\\zs.*") + -- Clear the search highlight without showing the "search hit BOTTOM, continuing at TOP" message + vim.cmd("nohlsearch") + -- Retrieve the current cursor position (after moving to the TOC) + local cursor_pos = vim.api.nvim_win_get_cursor(0) + local row = cursor_pos[1] + -- local col = cursor_pos[2] + -- Move the cursor to column 15 (starts counting at 0) + -- I like just going down on the TOC and press gd to go to a section + vim.api.nvim_win_set_cursor(0, { row, 14 }) +end, { desc = "Jump to the first line of the TOC" }) +-- return to the previously saved cursor position +vim.keymap.set("n", "mn", function() + local pos = _G.saved_positions["toc_return"] + if pos then + vim.api.nvim_win_set_cursor(0, pos) + end +end, { desc = "Return to position before jumping" }) + +-- TOC (english) +vim.keymap.set("n", "mt", function() + update_markdown_toc("## Contents", "### Table of contents") +end, { desc = "Insert/update Markdown TOC (English)" }) diff --git a/debian/.config/TheSiahxyz/ftplugin/quarto.lua b/debian/.config/TheSiahxyz/ftplugin/quarto.lua new file mode 100644 index 0000000..92e0025 --- /dev/null +++ b/debian/.config/TheSiahxyz/ftplugin/quarto.lua @@ -0,0 +1,6 @@ +-- set some options for quarto files, but they're set on the window, so they'll apply to other +-- buffers too +vim.wo.linebreak = true +vim.wo.breakindent = true +vim.wo.showbreak = "|" +vim.wo.conceallevel = 0 diff --git a/debian/.config/TheSiahxyz/init.lua b/debian/.config/TheSiahxyz/init.lua new file mode 100644 index 0000000..c459a26 --- /dev/null +++ b/debian/.config/TheSiahxyz/init.lua @@ -0,0 +1 @@ +require("TheSiahxyz") diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/autocmds.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/autocmds.lua new file mode 100644 index 0000000..3bd702a --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/autocmds.lua @@ -0,0 +1,388 @@ +local function augroup(name) + return vim.api.nvim_create_augroup("TheSiahxyz_" .. name, { clear = true }) +end + +local autocmd = vim.api.nvim_create_autocmd +local home = os.getenv("HOME") + +-- Change the color of symlink files to distinguish between directory and symlink files +autocmd("FileType", { + group = augroup("highlight_linked_files"), + pattern = "netrw", + callback = function() + vim.cmd("highlight NetrwSymlink guifg=#689D6A ctermfg=214") + end, +}) + +-- Check if we need to reload the file when it changed +autocmd({ "FocusGained", "TermClose", "TermLeave" }, { + group = augroup("check_time"), + callback = function() + if vim.o.buftype ~= "nofile" then + vim.cmd("checktime") + end + end, +}) + +-- Highlight on yank +autocmd("TextYankPost", { + group = augroup("highlight_yank"), + callback = function() + vim.highlight.on_yank() + end, +}) + +-- Resize splits if window got resized +autocmd({ "VimResized" }, { + group = augroup("window_config"), + callback = function() + local current_tab = vim.fn.tabpagenr() + vim.cmd("tabdo wincmd =") + vim.cmd("tabnext " .. current_tab) + end, +}) + +-- Go to last loc when opening a buffer +autocmd("BufReadPost", { + group = augroup("last_loc"), + callback = function(event) + local exclude = { "gitcommit" } + local buf = event.buf + if vim.tbl_contains(exclude, vim.bo[buf].filetype) or vim.b[buf].TheSiahxyz_last_loc then + return + end + vim.b[buf].TheSiahxyz_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, +}) + +-- Close some filetypes with +autocmd("FileType", { + group = augroup("close_with_q"), + pattern = { + "checkhealth", + "dbout", + "gitsigns-blame", + "grug-far", + "help", + "lspinfo", + "Lazy", + "neotest-output", + "neotest-output-panel", + "neotest-summary", + "notify", + "PlenaryTestPopup", + "qf", + "query", + "spectre_panel", + "startuptime", + "terminal", + "tsplayground", + }, + callback = function(event) + vim.bo[event.buf].buflisted = false + vim.keymap.set("n", "q", "close", { buffer = event.buf, silent = true }) + end, +}) +autocmd("FileType", { + group = augroup("q_as_bd"), + pattern = "netrw", + callback = function(event) + vim.bo[event.buf].buflisted = false + vim.keymap.set("n", "q", function() + vim.cmd("bd") + end, { buffer = event.buf, silent = true }) + end, +}) + +-- Make it easier to close man-files when opened inline +autocmd("FileType", { + group = augroup("man_close"), + pattern = { "man" }, + callback = function(event) + vim.bo[event.buf].buflisted = false + end, +}) + +-- Fix conceallevel for json files +autocmd({ "FileType" }, { + group = augroup("json_config"), + pattern = { "json", "jsonc", "json5" }, + callback = function() + vim.opt_local.conceallevel = 0 + end, +}) + +-- Auto create dir when saving a file, in case some intermediate directory does not exist +autocmd({ "BufWritePre" }, { + group = augroup("create_dir"), + callback = function(event) + if event.match:match("^%w%w+:[\\/][\\/]") then + return + end + local file = vim.uv.fs_realpath(event.match) or event.match + vim.fn.mkdir(vim.fn.fnamemodify(file, ":p:h"), "p") + end, +}) + +-- Automatically delete all trailing whitespace and newlines at end of file on save +local file_save = augroup("file_save") +autocmd("BufWritePre", { + group = file_save, + pattern = "*", + callback = function() + local cursor_pos = vim.api.nvim_win_get_cursor(0) + vim.cmd([[ %s/\s\+$//e ]]) -- Remove trailing spaces + vim.cmd([[ %s/\n\+\%$//e ]]) -- Remove trailing newlines + local line_count = vim.api.nvim_buf_line_count(0) + local line = math.min(cursor_pos[1], line_count) + local col = cursor_pos[2] + -- Optional: clamp column if line got shorter + local line_text = vim.api.nvim_buf_get_lines(0, line - 1, line, false)[1] or "" + col = math.min(col, #line_text) + vim.api.nvim_win_set_cursor(0, { line, col }) + end, +}) + +-- Add a trailing newline for C files +autocmd("BufWritePre", { + group = file_save, + pattern = "*.[ch]", + callback = function() + vim.cmd([[ %s/\%$/\r/e ]]) + end, +}) + +-- Go to insert mode in terminal +local win_enter = augroup("win_enter") +autocmd("WinEnter", { + group = win_enter, + callback = function() + if vim.bo.buftype == "terminal" then + vim.cmd("startinsert") + end + end, +}) + +-- Correct email signature delimiter in neomutt files +autocmd("BufWritePre", { + group = file_save, + pattern = "*neomutt*", + callback = function() + vim.cmd([[ %s/^--$/-- /e ]]) + end, +}) + +local function organize_imports() + local params = { + command = "pyright.organizeimports", + arguments = { vim.uri_from_bufnr(0) }, + } + local clients = vim.lsp.get_clients({ bufnr = 0 }) + for _, client in ipairs(clients) do + client:exec_cmd(params, { bufnr = 0 }) + end +end + +autocmd("LspAttach", { + group = augroup("lsp_attach"), + callback = function(e) + local client = vim.lsp.get_client_by_id(e.data.client_id) + if client and client.name == "pyright" then + vim.api.nvim_create_user_command( + "PyrightOrganizeImports", + organize_imports, + { desc = "Organize imports (lsp)" } + ) + end + vim.keymap.set("n", "gD", function() + vim.lsp.buf.definition() + end, { buffer = e.buf, desc = "Go to definition (lsp)" }) + vim.keymap.set("n", "K", function() + vim.lsp.buf.hover() + end, { buffer = e.buf, desc = "Go to keywords (lsp)" }) + vim.keymap.set("n", "ls", function() + vim.lsp.buf.workspace_symbol() + end, { buffer = e.buf, desc = "Workspace symbol (lsp)" }) + vim.keymap.set("n", "lo", function() + vim.diagnostic.open_float() + end, { buffer = e.buf, desc = "Open diagnostic" }) + vim.keymap.set("n", "lc", function() + vim.lsp.buf.code_action() + end, { buffer = e.buf, desc = "Code action (lsp)" }) + vim.keymap.set("n", "lr", function() + vim.lsp.buf.references() + end, { buffer = e.buf, desc = "References (lsp)" }) + vim.keymap.set("n", "ln", function() + vim.lsp.buf.rename() + end, { buffer = e.buf, desc = "Rename (lsp)" }) + vim.keymap.set("n", "lh", function() + vim.lsp.buf.signature_help() + end, { buffer = e.buf, desc = "Signature help (lsp)" }) + vim.keymap.set("n", "]d", function() + vim.diagnostic.goto_next() + end, { buffer = e.buf, desc = "Next diagnostic" }) + vim.keymap.set("n", "[d", function() + vim.diagnostic.goto_prev() + end, { buffer = e.buf, desc = "Previous diagnostic" }) + end, +}) + +-- Save file as sudo on files that require root permission +vim.api.nvim_create_user_command("SudoWrite", function() + vim.cmd([[ + write !sudo tee % 2>/dev/null + edit! + ]]) +end, {}) +vim.api.nvim_create_user_command("SudoWritequit", function() + vim.cmd([[ + write !sudo tee % 2>/dev/null + edit! + quit! + ]]) +end, {}) + +-- Markdown for specific files and directories +autocmd({ "BufRead", "BufNewFile" }, { + pattern = { "/tmp/calcurse*", "~/.calcurse/notes/*" }, + command = "set filetype=markdown", +}) + +-- Groff for specific file extensions +autocmd({ "BufRead", "BufNewFile" }, { + pattern = { "*.ms", "*.me", "*.mom", "*.man" }, + callback = function() + vim.cmd([[ + set columns=90 + set filetype=groff + set linebreak + set textwidth=0 + set wrap + set wrapmargin=0 + ]]) + end, +}) + +-- TeX for .tex files +autocmd({ "BufRead", "BufNewFile" }, { + pattern = { "*.tex" }, + command = "set filetype=tex", +}) + +-- When shortcut files are updated, renew bash and lf configs with new material: +autocmd("BufWritePost", { + group = augroup("bookmarks"), + pattern = { "bm-files", "bm-dirs" }, + callback = function() + -- Execute the 'shortcuts' shell command + local result = vim.fn.system("shortcuts") + -- Display an error message only if the 'shortcuts' command fails + if vim.v.shell_error ~= 0 then + -- Display an error message if the 'shortcuts' command fails + vim.api.nvim_echo({ { "failed to update shortcuts: " .. result, "ErrorMsg" } }, true, {}) + end + end, +}) + +-- Source lfrc if it's edited +local lf_config = augroup("lf_config") +autocmd("BufWritePost", { + group = lf_config, + pattern = { "lfrc" }, + callback = function() + vim.cmd("silent !source ~/.config/lf/lfrc") + end, +}) + +-- Set vimwiki's index filetype to vimwiki instead of markdown +local vimwiki_config = augroup("vimwiki_config") +autocmd({ "BufRead", "BufNewFile" }, { + group = vimwiki_config, + pattern = vim.fn.expand("~/.local/share/vimwiki") .. "/**/*.md", + callback = function(args) + vim.bo[args.buf].filetype = "vimwiki" + end, +}) + +-- Run xrdb whenever Xdefaults or Xresources are updated. +local x_config = augroup("x_config") +autocmd({ "BufRead", "BufNewFile" }, { + group = x_config, + pattern = { "Xresources", "Xdefaults", "xresources", "xdefaults" }, + callback = function() + vim.bo.filetype = "xdefaults" + end, +}) +autocmd("BufWritePost", { + group = x_config, + pattern = { "Xresources", "Xdefaults", "xresources", "xdefaults" }, + callback = function() + vim.cmd("silent !xrdb %") + end, +}) + +-- Recompile suckless programs on config edit. +local suckless_config = vim.api.nvim_create_augroup("suckless_config", { clear = true }) +autocmd("BufWritePost", { + group = suckless_config, + pattern = home .. "/.local/src/suckless/dmenu/config.def.h", + callback = function() + vim.cmd("silent !cd " .. home .. "/.local/src/suckless/dmenu/ && sudo make clean install && rm -f config.h") + end, +}) + +autocmd("BufWritePost", { + group = suckless_config, + pattern = home .. "/.local/src/suckless/dwmblocks/config.def.h", + callback = function() + vim.cmd( + "silent !cd " + .. home + .. "/.local/src/suckless/dwmblocks/ && sudo make clean install && rm -f config.h && { killall -q dwmblocks; setsid -f dwmblocks; }" + ) + end, +}) + +autocmd("BufWritePost", { + group = suckless_config, + pattern = home .. "/.local/src/suckless/slock/config.def.h", + callback = function() + vim.cmd("silent !cd " .. home .. "/.local/src/suckless/slock/ && sudo make clean install && rm -f config.h") + end, +}) + +local suckless_keys = augroup("suckless_keys") +autocmd("BufWritePost", { + group = suckless_keys, + pattern = { home .. "/.local/src/suckless/dwm/config.def.h", home .. "/.local/src/suckless/st/config.def.h" }, + callback = function() + local choice = vim.fn.confirm("Extract key bindings?", "&Yes\n&No", 2) + if choice == 1 then + vim.cmd("silent !" .. home .. "/.local/bin/extractkeys") + end + end, +}) + +autocmd("BufWritePost", { + group = augroup("suckless_doc"), + pattern = home .. "/.local/src/suckless/dwm/thesiah-default.mom", + callback = function() + vim.cmd("silent !cd " .. home .. "/.local/src/suckless/dwm/ && rm -f thesiah.mom") + end, +}) + +autocmd({ "BufRead", "BufEnter" }, { + pattern = { "*.c", "*.cpp", "*.h", "*.hpp" }, + callback = function() + local suckless_path = vim.fn.expand("~/.local/src/suckless"):gsub("/+$", "") + local file_path = vim.fn.expand("%:p"):gsub("/+$", "") + if file_path:sub(1, #suckless_path) == suckless_path then + vim.b.autoformat = false + end + end, +}) diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/keymaps.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/keymaps.lua new file mode 100644 index 0000000..7de0645 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/keymaps.lua @@ -0,0 +1,807 @@ +-- Ascii +vim.keymap.set("n", "a1", ":.!toilet -w 200 -f bfraktur", { desc = "Ascii art bfraktur" }) +vim.keymap.set("n", "a2", ":.!toilet -w 200 -f emboss", { desc = "Ascii art emboss" }) +vim.keymap.set("n", "a3", ":.!toilet -w 200 -f emboss2", { desc = "Ascii art emboss2" }) +vim.keymap.set("n", "a4", ":.!toilet -w 200 -f future", { desc = "Ascii art future" }) +vim.keymap.set("n", "a5", ":.!toilet -w 200 -f pagga", { desc = "Ascii art pagga" }) +vim.keymap.set("n", "a6", ":.!toilet -w 200 -f wideterm", { desc = "Ascii art wideterm" }) +vim.keymap.set("n", "a7", ":.!figlet -w 200 -f standard", { desc = "Ascii art standard" }) +vim.keymap.set("n", "a8", ":.!figlet -w 200 -f slant", { desc = "Ascii art slant" }) +vim.keymap.set("n", "a9", ":.!figlet -w 200 -f big", { desc = "Ascii art big" }) +vim.keymap.set("n", "a0", ":.!figlet -w 200 -f shadow", { desc = "Ascii art shadow" }) + +-- Buffers +vim.keymap.set({ "n", "v", "x", "t" }, "", "bd!", { desc = "Delete buffer" }) +vim.keymap.set({ "i", "n", "t" }, "", "bprevious", { desc = "Previous buffer" }) +vim.keymap.set({ "i", "n", "t" }, "", "bnext", { desc = "Next buffer" }) +vim.keymap.set("n", "", "e #", { desc = "Switch to last buffer" }) +vim.keymap.set({ "n", "v", "x", "t" }, "bd", ":bd", { desc = "Close buffer" }) +vim.keymap.set({ "n", "v", "x", "t" }, "BD", ":bd!", { desc = "Force close buffer" }) +vim.keymap.set("n", "bn", "enew", { desc = "Open new buffer" }) +vim.keymap.set({ "n", "i" }, "", function() + if not vim.bo.modified then + return + end + local choice = vim.fn.confirm("Discard changes and reload file?", "&Yes\n&No", 2) + if choice == 1 then + vim.cmd("e!") + end +end, { desc = "Confirm and reload file" }) +vim.keymap.set({ "i", "x", "n", "s" }, "", "w", { desc = "Save current buffer" }) +vim.keymap.set({ "n", "v" }, "ZZ", "wq", { desc = "Save current buffer and quit" }) +vim.keymap.set({ "n", "v" }, "ZA", "wqa", { desc = "Save all buffers and quit" }) +vim.keymap.set({ "n", "v" }, "qq", "q!", { desc = "Force quit" }) +vim.keymap.set({ "n", "v" }, "QQ", "qa!", { desc = "Force quit all" }) +vim.keymap.set("n", "rnf", function() + local current_name = vim.fn.expand("%:p") -- Get the full path of the current file + local directory = vim.fn.expand("%:p:h") -- Get the directory of the current file + local new_name = vim.fn.input("New filename: ", directory .. "/") -- Prompt for the new name + if new_name == "" or new_name == current_name then + return -- Do nothing if no input or name hasn't changed + end + vim.cmd("silent !mv " .. vim.fn.shellescape(current_name) .. " " .. vim.fn.shellescape(new_name)) + vim.cmd("edit " .. vim.fn.fnameescape(new_name)) + vim.cmd("bdelete " .. vim.fn.bufnr(current_name)) +end, { noremap = true, silent = true, desc = "Rename file" }) +vim.keymap.set("n", "ms", function() + vim.cmd("new | put=execute('messages') | setlocal buftype=nofile") + local buf = vim.api.nvim_get_current_buf() + local lines = vim.api.nvim_buf_get_lines(buf, 0, -1, false) + local filtered_lines = {} + for _, line in ipairs(lines) do + local trimmed_line = line:match("^%s*(.-)%s*$") -- Remove leading and trailing whitespace + if trimmed_line ~= "" then + table.insert(filtered_lines, trimmed_line) -- Only add non-empty lines + end + end + vim.fn.setreg('"', table.concat(filtered_lines, "\n")) + vim.api.nvim_buf_set_lines(buf, 0, -1, false, filtered_lines) + vim.keymap.set("n", "q", function() + vim.api.nvim_buf_delete(buf, { force = true }) + end, { buffer = buf, desc = "Close message buffer" }) +end, { desc = "Open messages, trim, and copy content" }) + +-- Cd +vim.keymap.set("n", "gcd", ":cd %:p:h:pwd", { desc = "Go to current file path" }) +vim.keymap.set("n", "gcD", function() + local realpath = vim.fn.systemlist("readlink -f " .. vim.fn.shellescape(vim.fn.expand("%:p")))[1] + vim.cmd("cd " .. vim.fn.fnameescape(vim.fn.fnamemodify(realpath, ":h"))) + vim.cmd("pwd") +end, { desc = "Go to real path of current file" }) +vim.keymap.set("n", "gc.", ":cd ..:pwd", { desc = "Go to parent file path" }) + +-- Check health +vim.keymap.set("n", "ch", ":checkhealth", { desc = "Check neovim health" }) + +-- Clear search with +vim.keymap.set({ "i", "n" }, "", "noh", { desc = "Clear search highlights" }) + +-- Clear search / diff update / redraw +vim.keymap.set( + "n", + "R", + "nohlsearchdiffupdatenormal! ", + { desc = "Redraw / Clear hlsearch / Diff Update" } +) + +-- Copy +vim.keymap.set("n", "cp", function() + local filepath = vim.fn.expand("%") -- Get the current filepath + local filename = vim.fn.expand("%:t") -- Get the current filename + local file_root = vim.fn.expand("%:r") -- Get the file root (without extension) + local file_ext = vim.fn.expand("%:e") -- Get the file extension + local new_filename = file_root .. "_copied" -- Start with the base for new filename + local num = 1 + while vim.fn.filereadable(new_filename .. "." .. file_ext) == 1 do + new_filename = file_root .. "_copied_" .. num + num = num + 1 + end + new_filename = new_filename .. "." .. file_ext + local cmd = "cp " .. filepath .. " " .. new_filename + + -- Wrap input in pcall to handle Ctrl-c interruptions + local ok, confirm = pcall(vim.fn.input, 'Do you want to copy "' .. filename .. '"? (y/n): ') + + -- If interrupted (Ctrl-c), return silently + if not ok or confirm == nil or confirm == "" then + return + end + + -- Handle positive confirmation + if confirm:lower() == "y" or confirm:lower() == "yes" then + vim.cmd("silent !" .. cmd) + vim.cmd("silent edit " .. new_filename) + end +end, { silent = true, desc = "Copy current file" }) +vim.keymap.set( + "n", + "cP", + ':let @+ = expand("%:p"):lua print("Copied path to: " .. vim.fn.expand("%:p"))', + { desc = "Copy current file name and path" } +) + +-- Cut, Yank & Paste +vim.keymap.set({ "n", "v" }, "y", [["+y]], { desc = "Yank to clipboard" }) +vim.keymap.set("n", "Y", [["+Y]], { desc = "Yank line to clipboard" }) +vim.keymap.set({ "n", "v" }, "", ":%y", { desc = "Yank current file to clipboard" }) +vim.keymap.set({ "n", "v", "x" }, "pp", [["+p]], { desc = "Paste from clipboard after cursor" }) +vim.keymap.set({ "n", "v", "x" }, "PP", [["+P]], { desc = "Paste from clipboard before cursor" }) +vim.keymap.set({ "n", "v", "x" }, "pP", [["_dP]], { desc = "Paste over and preserve clipboard" }) +vim.keymap.set({ "n", "v" }, "dd", [["+d]], { desc = "Delete and yank to clipboard" }) +vim.keymap.set({ "n", "v" }, "DD", [["_d]], { desc = "Delete without storing in clipboard" }) +vim.keymap.set("n", "", ":%d_", { desc = "Delete all lines to black hole register" }) + +-- Diagnostic +local diagnostic_goto = function(next, severity) + local go = next and vim.diagnostic.goto_next or vim.diagnostic.goto_prev + severity = severity and vim.diagnostic.severity[severity] or nil + return function() + go({ severity = severity }) + end +end +-- vim.keymap.set("n", "[d", diagnostic_goto(false), { desc = "Previous diagnostic" }) +-- vim.keymap.set("n", "]d", diagnostic_goto(true), { desc = "Next diagnostic" }) +vim.keymap.set("n", "[e", diagnostic_goto(false, "ERROR"), { desc = "Previous error" }) +vim.keymap.set("n", "]e", diagnostic_goto(true, "ERROR"), { desc = "Next error" }) +vim.keymap.set("n", "[w", diagnostic_goto(false, "WARN"), { desc = "Previous warning" }) +vim.keymap.set("n", "]w", diagnostic_goto(true, "WARN"), { desc = "Next warning" }) +vim.keymap.set("n", "od", vim.diagnostic.open_float, { desc = "Open diagnostic message" }) +vim.keymap.set("n", "la", vim.diagnostic.setloclist, { desc = "Add diagnostics to location list" }) + +-- Disable +vim.keymap.set("n", "Q", "", { desc = "Disable q command" }) + +-- Explore +vim.keymap.set("n", "ex", vim.cmd.Ex, { desc = "Open explorer" }) +vim.keymap.set("n", "es", vim.cmd.Sex, { desc = "Open explorer (horizontal split)" }) +vim.keymap.set("n", "ev", vim.cmd.Vex, { desc = "Open explorer (vertical split)" }) +vim.keymap.set("n", "qe", function() + if vim.bo.filetype == "netrw" then + vim.cmd("bd") + end +end, { desc = "Close explorer (netrw)" }) + +-- Fix List & Trouble +vim.keymap.set("n", "[o", "lprevzz", { desc = "Previous location" }) +vim.keymap.set("n", "]o", "lnextzz", { desc = "Next location" }) +vim.keymap.set("n", "[q", "cprevzz", { desc = "Previous quickfix" }) +vim.keymap.set("n", "]q", "cnextzz", { desc = "Next quickfix" }) +vim.keymap.set( + "n", + "rw", + [[:%s/\<\>//gI]], + { desc = "Search and replace word under cursor" } +) +vim.keymap.set("n", "oo", "lopen", { desc = "Open location list" }) +vim.keymap.set("n", "oq", "copen", { desc = "Open quickfix list" }) + +-- Formats +vim.keymap.set("n", "cF", vim.lsp.buf.format, { desc = "Format buffer by default lsp" }) + +-- Full path +vim.keymap.set("n", "zf", function() + local word = vim.fn.expand("") -- Get full text under the cursor (handles paths with slashes) + if word:match("%$") then + local expanded_path = vim.fn.expand(word) + if expanded_path ~= word then + vim.cmd("normal! ciW" .. expanded_path) -- Replace entire word under cursor + end + end +end, { desc = "Expand and replace path under cursor" }) + +-- Git +-- create repository +vim.keymap.set("n", "gR", function() + -- Check if GitHub CLI is installed + local gh_installed = vim.fn.system("command -v gh") + if gh_installed == "" then + print("GitHub CLI is not installed. Please install it using 'brew install gh'.") + return + end + -- Get the current working directory and extract the repository name + local cwd = vim.fn.getcwd() + local repo_name = vim.fn.fnamemodify(cwd, ":t") + if repo_name == "" then + print("Failed to extract repository name from the current directory.") + return + end + -- Display the message and ask for confirmation + local confirmation = vim.fn.input('The name of the repo will be: "' .. repo_name .. '"\nType "yes" to continue: ') + if confirmation:lower() ~= "yes" then + print("Operation canceled.") + return + end + -- Check if the repository already exists on GitHub + local check_repo_command = + string.format("gh repo view %s/%s", vim.fn.system("gh api user --jq '.login'"):gsub("%s+", ""), repo_name) + local check_repo_result = vim.fn.systemlist(check_repo_command) + if not string.find(table.concat(check_repo_result), "Could not resolve to a Repository") then + print("Repository '" .. repo_name .. "' already exists on GitHub.") + return + end + -- Prompt for repository type + local repo_type = vim.fn.input("Enter the repository type (private/public): "):lower() + if repo_type ~= "private" and repo_type ~= "public" then + print("Invalid repository type. Please enter 'private' or 'public'.") + return + end + -- Set the repository type flag + local repo_type_flag = repo_type == "private" and "--private" or "--public" + -- Initialize the git repository and create the GitHub repository + local init_command = string.format("cd %s && git init", vim.fn.shellescape(cwd)) + vim.fn.system(init_command) + local create_command = + string.format("cd %s && gh repo create %s %s --source=.", vim.fn.shellescape(cwd), repo_name, repo_type_flag) + local create_result = vim.fn.system(create_command) + -- Print the result of the repository creation command + if string.find(create_result, "https://github.com") then + print("Repository '" .. repo_name .. "' created successfully.") + else + print("Failed to create the repository: " .. create_result) + end +end, { desc = "Create GitHub repository" }) +-- open repository +local function open_github_link(use_root) + -- Get the full path of the current file + local file_path = vim.fn.expand("%:p") + if file_path == "" then + print("No file is currently open") + return + end + + -- Get the Git repository root + local git_root = vim.fn.systemlist("git rev-parse --show-toplevel")[1] + if not git_root or git_root == "" then + print("Could not determine the root directory for the GitHub repository") + return + end + + -- Get the origin URL of the repository + local origin_url = vim.fn.systemlist("git config --get remote.origin.url")[1] + if not origin_url or origin_url == "" then + print("Could not determine the origin URL for the GitHub repository") + return + end + + -- Get the current branch name + local branch_name = vim.fn.systemlist("git rev-parse --abbrev-ref HEAD")[1] + if not branch_name or branch_name == "" then + print("Could not determine the current branch name") + return + end + + -- Convert the origin URL to a GitHub HTTPS URL + local repo_url = origin_url:gsub("git@github.com:", "https://github.com/"):gsub("%.git$", "") + + local github_url + if use_root then + -- Use the root repository URL + github_url = repo_url + else + -- Generate the link for the current file + local relative_path = file_path:sub(#git_root + 2) -- Extract the relative path + github_url = repo_url .. "/blob/" .. branch_name .. "/" .. relative_path + end + + -- Open the URL in the default browser + local command = "xdg-open " .. vim.fn.shellescape(github_url) + vim.fn.system(command) + + -- Print the opened URL + print("Opened GitHub link: " .. github_url) +end + +-- Keybinding for opening the current file link +vim.keymap.set("n", "go", function() + open_github_link(false) -- Use the current file link +end, { desc = "Open GitHub link for the current file" }) + +-- Keybinding for opening the repository root link +vim.keymap.set("n", "gO", function() + open_github_link(true) -- Use the root repository URL +end, { desc = "Open GitHub repository root" }) + +-- paste a github link and add it in this format +vim.keymap.set({ "n", "v", "i" }, "", function() + -- Insert the text in the desired format + vim.cmd('normal! a[](){:target="_blank"} ') + vim.cmd("normal! F(pv2F/lyF[p") + -- Leave me in normal mode or command mode + vim.cmd("stopinsert") +end, { desc = "Paste github link" }) + +-- Health +vim.keymap.set("n", "ch", ":checkhealth", { desc = "Check neovim health" }) + +-- Highlights under cursor +vim.keymap.set("n", "ip", vim.show_pos, { desc = "Inspect position" }) + +-- Keywordprg +vim.keymap.set("n", "K", "norm! K", { desc = "Look up keyword" }) + +-- Lines +-- vim.keymap.set("n", "", "m .-2==", { desc = "Move line up" }) +-- vim.keymap.set("n", "", "m .+1==", { desc = "Move line down" }) +vim.keymap.set( + "i", + "", + "m .-2==gi", + { noremap = true, silent = true, desc = "Move line up in insert mode" } +) +vim.keymap.set( + "i", + "", + "m .+1==gi", + { noremap = true, silent = true, desc = "Move line down in insert mode" } +) +vim.keymap.set("v", "", ":m '<-2gv=gv", { desc = "Move selected lines up" }) +vim.keymap.set("v", "", ":m '>+1gv=gv", { desc = "Move selected lines down" }) + +-- Markdown +vim.keymap.set({ "n", "v" }, "gk", function() + -- `?` - Start a search backwards from the current cursor position. + -- `^` - Match the beginning of a line. + -- `##` - Match 2 ## symbols + -- `\\+` - Match one or more occurrences of prev element (#) + -- `\\s` - Match exactly one whitespace character following the hashes + -- `.*` - Match any characters (except newline) following the space + -- `$` - Match extends to end of line + vim.cmd("silent! ?^##\\+\\s.*$") + -- Clear the search highlight + vim.cmd("nohlsearch") +end, { desc = "Go to previous markdown header" }) +vim.keymap.set({ "n", "v" }, "gj", function() + -- `/` - Start a search forwards from the current cursor position. + -- `^` - Match the beginning of a line. + -- `##` - Match 2 ## symbols + -- `\\+` - Match one or more occurrences of prev element (#) + -- `\\s` - Match exactly one whitespace character following the hashes + -- `.*` - Match any characters (except newline) following the space + -- `$` - Match extends to end of line + vim.cmd("silent! /^##\\+\\s.*$") + -- Clear the search highlight + vim.cmd("nohlsearch") +end, { desc = "Go to next markdown header" }) + +-- Marks +vim.keymap.set("n", "mD", function() + -- Delete all marks in the current buffer + vim.cmd("delmarks!") + print("All marks deleted.") +end, { desc = "Delete all marks" }) + +-- Ownerships +vim.keymap.set("n", "zx", "!chmod +x %", { silent = true, desc = "Make file executable" }) + +-- Remap Default +vim.keymap.set("i", "jk", "", { noremap = true, silent = true, desc = "Escape to normal mode" }) +vim.keymap.set("n", "", ":", { noremap = true, desc = "Enter command mode" }) +vim.keymap.set("n", "J", "mzJ`z", { noremap = true, desc = "Join lines and keep cursor position" }) +vim.keymap.set("n", "n", "'Nn'[v:searchforward].'zv'", { expr = true, desc = "Next search result and center" }) +vim.keymap.set("x", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next search result in visual mode" }) +vim.keymap.set("o", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next search result in operator-pending mode" }) +vim.keymap.set("n", "N", "'nN'[v:searchforward].'zv'", { expr = true, desc = "Previous search result and center" }) +vim.keymap.set("x", "N", "'nN'[v:searchforward]", { expr = true, desc = "Previous search result in visual mode" }) +vim.keymap.set( + "o", + "N", + "'nN'[v:searchforward]", + { expr = true, desc = "Previous search result in operator-pending mode" } +) +vim.keymap.set("n", "x", '"_x', { desc = "Delete character without yanking" }) +local scroll_percentage = 0.50 +vim.keymap.set("n", "", function() + local lines = math.floor(vim.api.nvim_win_get_height(0) * scroll_percentage) + vim.cmd("normal! " .. lines .. "jzz") +end, { noremap = true, silent = true, desc = "Scroll down and center" }) +vim.keymap.set("n", "", function() + local lines = math.floor(vim.api.nvim_win_get_height(0) * scroll_percentage) + vim.cmd("normal! " .. lines .. "kzz") +end, { noremap = true, silent = true, desc = "Scroll up and center" }) +-- vim.keymap.set("n", "", "zz", { noremap = true, silent = true, desc = "Scroll down and center" }) +-- vim.keymap.set("n", "", "zz", { noremap = true, silent = true, desc = "Scroll up and center" }) +-- vim.keymap.set("n", "", "zz", { noremap = true, silent = true, desc = "Page up and center" }) +-- vim.keymap.set("n", "", "zz", { noremap = true, silent = true, desc = "Page down and center" }) +vim.keymap.set("n", "{", "{zz", { noremap = true, silent = true, desc = "Move to previous paragraph and center" }) +vim.keymap.set("n", "}", "}zz", { noremap = true, silent = true, desc = "Move to next paragraph and center" }) +vim.keymap.set("n", "G", "Gzz", { noremap = true, silent = true, desc = "Go to bottom of file and center" }) +vim.keymap.set("n", "gg", "ggzz", { noremap = true, silent = true, desc = "Go to top of file and center" }) +vim.keymap.set("n", "gd", "gdzz", { noremap = true, silent = true, desc = "Go to definition and center" }) +vim.keymap.set("n", "", "zz", { noremap = true, silent = true, desc = "Jump forward in jumplist and center" }) +vim.keymap.set( + "n", + "", + "zz", + { noremap = true, silent = true, desc = "Jump backward in jumplist and center" } +) +vim.keymap.set( + "n", + "%", + "%zz", + { noremap = true, silent = true, desc = "Jump to matching pair (e.g. brackets) and center" } +) +vim.keymap.set( + "n", + "*", + "*zz", + { noremap = true, silent = true, desc = "Search for next occurrence of word under cursor and center" } +) +vim.keymap.set( + "n", + "#", + "#zz", + { noremap = true, silent = true, desc = "Search for previous occurrence of word under cursor and center" } +) + +vim.keymap.set( + { "n", "x" }, + "j", + "v:count == 0 ? 'gj' : 'j'", + { expr = true, silent = true, desc = "Move down (visual line)" } +) +vim.keymap.set( + { "n", "x" }, + "", + "v:count == 0 ? 'gj' : 'j'", + { expr = true, silent = true, desc = "Move down (visual line)" } +) +vim.keymap.set( + { "n", "x" }, + "k", + "v:count == 0 ? 'gk' : 'k'", + { expr = true, silent = true, desc = "Move up (visual line)" } +) +vim.keymap.set( + { "n", "x" }, + "", + "v:count == 0 ? 'gk' : 'k'", + { expr = true, silent = true, desc = "Move up (visual line)" } +) +vim.keymap.set("v", "<", "", ">gv", { desc = "Indent right and stay in visual mode" }) +vim.keymap.set("v", "J", ":m '>+1gv=gv", { desc = "Move line down in visual mode" }) +vim.keymap.set("v", "K", ":m '<-2gv=gv", { desc = "Move line up in visual mode" }) +vim.keymap.set("n", "sl", "vg_", { desc = "Select to end of line" }) +vim.keymap.set("n", "sp", "ggVGp", { desc = "Select all and paste" }) +vim.keymap.set("n", "sv", "ggVG", { desc = "Select all" }) +vim.keymap.set("n", "gp", "`[v`]", { desc = "Select pasted text" }) +vim.keymap.set("n", "ss", ":s/\\v", { desc = "Search and replace on line" }) +vim.keymap.set("n", "SS", ":%s/\\v", { desc = "Search and replace in file" }) +vim.keymap.set("v", "", ":s/\\%V", { desc = "Search only in visual selection using %V atom" }) +vim.keymap.set("v", "", '"hy:%s/\\vh//g', { desc = "Change selection" }) + +-- Remove +local function delete_current_file() + local filepath = vim.fn.expand("%:p") + local filename = vim.fn.expand("%:t") -- Get the current filename + if filepath and filepath ~= "" then + -- Check if trash utility is installed + if vim.fn.executable("trash") == 0 then + vim.api.nvim_echo({ + { "- Trash utility not installed. Make sure to install it first\n", "ErrorMsg" }, + { "- Install `trash-cli`\n", nil }, + }, false, {}) + return + end + -- Prompt for confirmation before deleting the file + vim.ui.input({ + prompt = 'Do you want to delete "' .. filename .. '"? (y/n): ', + }, function(input) + if input == nil then + return + end + + if input:lower() == "y" or input:lower() == "yes" then + -- Delete the file using trash app + local success, _ = pcall(function() + vim.fn.system({ "trash", vim.fn.fnameescape(filepath) }) + end) + if success then + vim.api.nvim_echo({ + { "File deleted from disk:\n", "Normal" }, + { filepath, "Normal" }, + }, false, {}) + -- Close the buffer after deleting the file + vim.cmd("bd!") + else + vim.api.nvim_echo({ + { "Failed to delete file:\n", "ErrorMsg" }, + { filepath, "ErrorMsg" }, + }, false, {}) + end + else + vim.api.nvim_echo({ + { "File deletion canceled.", "Normal" }, + }, false, {}) + end + end) + else + vim.api.nvim_echo({ + { "No file to delete", "WarningMsg" }, + }, false, {}) + end +end + +vim.keymap.set("n", "rm", function() + delete_current_file() +end, { desc = "Remove current file" }) + +-- Scripts +vim.keymap.set("n", "rr", function() + vim.cmd("w") + local file = vim.fn.shellescape(vim.fn.expand("%:p")) + vim.cmd("split | resize 10 | terminal compiler " .. file) +end, { noremap = true, silent = true, desc = "Run compiler interactively" }) +vim.api.nvim_set_keymap( + "n", + "RR", + ":!opout %", + { noremap = true, silent = true, desc = "Docs viewer" } +) + +-- Source +-- source nvim config +vim.keymap.set("n", "SO", function() + vim.cmd("so") +end, { desc = "Source current file" }) +-- reload zsh configuration by sourcing ~/.config/zsh/.zshrc in a separate shell +vim.keymap.set("n", "SZ", function() + -- Define the command to source zshrc + local command = "source ~/.config/zsh/.zshrc" + -- Execute the command in a new Zsh shell + local full_command = "zsh -c '" .. command .. "'" + -- Run the command and capture the output + local output = vim.fn.system(full_command) + -- Check the exit status of the command + local exit_code = vim.v.shell_error + if exit_code == 0 then + vim.api.nvim_echo({ { "Successfully sourced ~/.config/zsh/.zshrc", "NormalMsg" } }, false, {}) + else + vim.api.nvim_echo({ + { "Failed to source ~/.config/zsh/.zshrc:", "ErrorMsg" }, + { output, "ErrorMsg" }, + }, false, {}) + end +end, { desc = "Source zshrc" }) +-- source shortcuts from bm-files and bm-folders +local shortcuts_file = vim.fn.expand("~/.config/nvim/shortcuts.lua") +local file = io.open(shortcuts_file, "r") +if file then + file:close() + vim.cmd("silent! source " .. shortcuts_file) +end + +-- Spell +vim.keymap.set("n", "zp", function() + vim.opt.spelllang = { "en", "ko", "cjk" } + vim.cmd("echo 'Spell language set to English, Korean, and CJK'") +end, { desc = "Spelling language English, Korean, and CJK" }) +-- repeat the replacement done by |z=| for all matches with the replaced word in the current window. +vim.keymap.set("n", "z.", function() + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(":spellr\n", true, false, true), "m", true) +end, { desc = "Spelling repeat" }) + +-- Sudo +vim.keymap.set("n", "SW", "SudoWrite", { silent = true, desc = "Save file with sudo" }) +vim.keymap.set("n", "SWQ", "SudoWritequit", { silent = true, desc = "Save and quit with sudo" }) + +-- Surround +vim.keymap.set("n", "sau", function() + local line = vim.api.nvim_get_current_line() + local col = vim.api.nvim_win_get_cursor(0)[2] + 1 -- Adjust for 0-index in Lua + -- This makes the `s` optional so it matches both http and https + local pattern = "https?://[^ ,;'\"<>%s)]*" + -- Find the starting and ending positions of the URL + local s, e = string.find(line, pattern) + while s and e do + if s <= col and e >= col then + -- When the cursor is within the URL + local url = string.sub(line, s, e) + -- Update the line with backticks around the URL + local new_line = string.sub(line, 1, s - 1) .. "`" .. url .. "`" .. string.sub(line, e + 1) + vim.api.nvim_set_current_line(new_line) + vim.cmd("silent write") + return + end + -- Find the next URL in the line + s, e = string.find(line, pattern, e + 1) + -- Save the file to update trouble list + end + print("No URL found under cursor") +end, { desc = "Add surrounding to URL" }) +vim.keymap.set("v", "bl", function() + -- Get the selected text range + local start_row, start_col = unpack(vim.fn.getpos("'<"), 2, 3) + local end_row, end_col = unpack(vim.fn.getpos("'>"), 2, 3) + -- Get the selected lines + local lines = vim.api.nvim_buf_get_lines(0, start_row - 1, end_row, false) + local selected_text = table.concat(lines, "\n"):sub(start_col, #lines == 1 and end_col or -1) + if selected_text:match("^%*%*.*%*%*$") then + vim.notify("Text already bold", vim.log.levels.INFO) + else + vim.cmd("normal 2gsa*") + end +end, { desc = "Bold current selection" }) +vim.keymap.set("n", "gbd", function() + local cursor_pos = vim.api.nvim_win_get_cursor(0) + local current_buffer = vim.api.nvim_get_current_buf() + local start_row = cursor_pos[1] - 1 + local col = cursor_pos[2] + -- Get the current line + local line = vim.api.nvim_buf_get_lines(current_buffer, start_row, start_row + 1, false)[1] + -- Check if the cursor is on an asterisk + if line:sub(col + 1, col + 1):match("%*") then + vim.notify("Cursor is on an asterisk, run inside the bold text", vim.log.levels.WARN) + return + end + -- Search for '**' to the left of the cursor position + local left_text = line:sub(1, col) + local bold_start = left_text:reverse():find("%*%*") + if bold_start then + bold_start = col - bold_start + end + -- Search for '**' to the right of the cursor position and in following lines + local right_text = line:sub(col + 1) + local bold_end = right_text:find("%*%*") + local end_row = start_row + while not bold_end and end_row < vim.api.nvim_buf_line_count(current_buffer) - 1 do + end_row = end_row + 1 + local next_line = vim.api.nvim_buf_get_lines(current_buffer, end_row, end_row + 1, false)[1] + if next_line == "" then + break + end + right_text = right_text .. "\n" .. next_line + bold_end = right_text:find("%*%*") + end + if bold_end then + bold_end = col + bold_end + end + -- Remove '**' markers if found, otherwise bold the word + if bold_start and bold_end then + -- Extract lines + local text_lines = vim.api.nvim_buf_get_lines(current_buffer, start_row, end_row + 1, false) + local text = table.concat(text_lines, "\n") + -- Calculate positions to correctly remove '**' + -- vim.notify("bold_start: " .. bold_start .. ", bold_end: " .. bold_end) + local new_text = text:sub(1, bold_start - 1) .. text:sub(bold_start + 2, bold_end - 1) .. text:sub(bold_end + 2) + local new_lines = vim.split(new_text, "\n") + -- Set new lines in buffer + vim.api.nvim_buf_set_lines(current_buffer, start_row, end_row + 1, false, new_lines) + -- vim.notify("Unbolded text", vim.log.levels.INFO) + else + -- Bold the word at the cursor position if no bold markers are found + local before = line:sub(1, col) + local after = line:sub(col + 1) + local inside_surround = before:match("%*%*[^%*]*$") and after:match("^[^%*]*%*%*") + if inside_surround then + vim.cmd("normal gsd*.") + else + vim.cmd("normal viw") + vim.cmd("normal 2gsa*") + end + vim.notify("Bolded current word", vim.log.levels.INFO) + end +end, { desc = "Toggle bold" }) + +-- Tab +vim.keymap.set("n", "l", "tablast", { desc = "Last Tab" }) +vim.keymap.set("n", "]]", "tablast", { desc = "Last Tab" }) +vim.keymap.set("n", "o", "tabonly", { desc = "Close Other Tabs" }) +vim.keymap.set("n", "f", "tabfirst", { desc = "First Tab" }) +vim.keymap.set("n", "[[", "tabfirst", { desc = "First Tab" }) +vim.keymap.set("n", "", "tabnew", { desc = "New Tab" }) +vim.keymap.set("n", "n", "tabnext", { desc = "Next Tab" }) +vim.keymap.set("n", "]", "tabnext", { desc = "Next Tab" }) +vim.keymap.set("n", "d", "tabclose", { desc = "Close Tab" }) +vim.keymap.set("n", "p", "tabprevious", { desc = "Previous Tab" }) +vim.keymap.set("n", "[", "tabprevious", { desc = "Previous Tab" }) + +-- Terminal +vim.keymap.set("n", "te", "term", { desc = "Open terminal" }) +vim.keymap.set("n", "t-", "sp term://zsh | startinsert", { desc = "Split terminal (horizontal)" }) +vim.keymap.set("n", "t|", "vsp term://zsh | startinsert", { desc = "Split terminal (vertical)" }) +vim.keymap.set("t", "", "", { desc = "Escape terminal mode" }) +vim.keymap.set("t", "", "wincmd h", { desc = "Move to left window" }) +vim.keymap.set("t", "", "wincmd j", { desc = "Move to window below" }) +vim.keymap.set("t", "", "wincmd k", { desc = "Move to window above" }) +vim.keymap.set("t", "", "wincmd l", { desc = "Move to right window" }) +vim.keymap.set("t", "l", "clear", { silent = true, desc = "Clear terminal" }) +vim.keymap.set("t", "", "iexit", { desc = "Close terminal" }) +vim.keymap.set("t", "", "close", { desc = "Close terminal" }) +vim.keymap.set("t", "", "close", { desc = "Close terminal" }) + +-- Tmux +if vim.env.TMUX then + vim.keymap.set( + "n", + "tm", + "silent !~/.config/tmux/plugins/tmux-fzf/scripts/session.sh", + { desc = "Find tmux session" } + ) + vim.keymap.set("n", "RS", function() + vim.fn.system("restartnvim") + end, { noremap = true, silent = true, desc = "Restart nvim (tmux)" }) +end + +-- Todo +-- detect todos and toggle between ":" and ";", or show a message if not found +-- this is to "mark them as done" +vim.keymap.set("n", "td", function() + -- Get the current line + local current_line = vim.fn.getline(".") + -- Get the current line number + local line_number = vim.fn.line(".") + if string.find(current_line, "TODO:") then + -- Replace the first occurrence of ":" with ";" + local new_line = current_line:gsub("TODO:", "TODO;") + -- Set the modified line + vim.fn.setline(line_number, new_line) + elseif string.find(current_line, "TODO;") then + -- Replace the first occurrence of ";" with ":" + local new_line = current_line:gsub("TODO;", "TODO:") + -- Set the modified line + vim.fn.setline(line_number, new_line) + else + vim.cmd("echo 'todo item not detected'") + end +end, { desc = "Toggle TODO item done or not" }) + +-- Windows +vim.keymap.set("n", "", "", { desc = "Move to left window" }) +vim.keymap.set("n", "", "", { desc = "Move to window below" }) +vim.keymap.set("n", "", "", { desc = "Move to window above" }) +vim.keymap.set("n", "", "", { desc = "Move to right window" }) +-- vim.keymap.set("n", "", "resize +2", { desc = "Increase window height" }) +-- vim.keymap.set("n", "", "resize -2", { desc = "Decrease window height" }) +-- vim.keymap.set("n", "", "vertical resize -2", { desc = "Decrease window width" }) +-- vim.keymap.set("n", "", "vertical resize +2", { desc = "Increase window width" }) + +function WordDefinition(input) + -- Function to run the dict command and return its output + local function get_output(word) + local escaped_word = vim.fn.shellescape(word) + return vim.fn.system("dict " .. escaped_word) + end + + -- Function to process the word for singular/plural handling + local function get_definition(word) + -- Attempt to derive the singular form + local singular = word + if word:sub(-2) == "es" then + singular = word:sub(1, -3) -- Remove 'es' + elseif word:sub(-1) == "s" then + singular = word:sub(1, -2) -- Remove 's' + end + + -- Fetch output for both singular and original word + local singular_output = get_output(singular) + local original_output = get_output(word) + + -- Determine which output to prioritize + if singular ~= word and not vim.startswith(singular_output, "No definitions found") then + return singular_output -- Use singular if valid and different + else + return original_output -- Otherwise, use the original word + end + end + + -- Get the definition and output for the word + local output = get_definition(input) + + -- Create a new buffer and display the result + local bufnr = vim.api.nvim_create_buf(false, true) + vim.api.nvim_set_current_buf(bufnr) + vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, vim.split(output, "\n")) +end +vim.api.nvim_set_keymap( + "n", + "k", + ":lua WordDefinition(vim.fn.expand(''))", + { noremap = true, silent = true, desc = "Word definition" } +) + +-- Lazy +vim.keymap.set("n", "L", "Lazy", { desc = "Open lazy plugin manager" }) + +-- Mason +vim.keymap.set("n", "M", "Mason", { desc = "Open mason" }) diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/lazy.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/lazy.lua new file mode 100644 index 0000000..802a3a5 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/lazy.lua @@ -0,0 +1,257 @@ +-- 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) + +-- 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 = "\\" + +-- Setup lazy.nvim +require("lazy").setup({ + root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed + defaults = { + -- Set this to `true` to have all your plugins lazy-loaded by default. + -- Only do this if you know what you are doing, as it can lead to unexpected behavior. + lazy = false, -- should plugins be lazy-loaded? + -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, + -- have outdated releases, which may break your Neovim install. + version = nil, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + -- default `cond` you can use to globally disable a lot of plugins + -- when running inside vscode for example + cond = nil, ---@type boolean|fun(self:LazyPlugin):boolean|nil + }, + -- leave nil when passing the spec as the first argument to setup() + -- highlight-start + spec = { + -- import your plugins + { import = "TheSiahxyz.plugins" }, + }, + local_spec = true, -- load project specific .lazy.lua spec files. They will be added at the end of the spec. + lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. + ---@type number? limit the maximum amount of concurrent tasks + concurrency = jit.os:find("Windows") and (vim.uv.available_parallelism() * 2) or nil, + git = { + -- defaults for the `Lazy log` command + -- log = { "--since=3 days ago" }, -- show commits from the last 3 days + log = { "-8" }, -- show the last 8 commits + timeout = 120, -- kill processes that take more than 2 minutes + url_format = "https://github.com/%s.git", + -- lazy.nvim requires git >=2.19.0. If you really want to use lazy with an older version, + -- then set the below to false. This should work, but is NOT supported and will + -- increase downloads a lot. + filter = true, + -- rate of network related git operations (clone, fetch, checkout) + throttle = { + enabled = false, -- not enabled by default + -- max 2 ops every 5 seconds + rate = 2, + duration = 5 * 1000, -- in ms + }, + -- Time in seconds to wait before running fetch again for a plugin. + -- Repeated update/check operations will not run again until this + -- cooldown period has passed. + cooldown = 0, + }, + pkg = { + enabled = true, + cache = vim.fn.stdpath("state") .. "/lazy/pkg-cache.lua", + -- the first package source that is found for a plugin will be used. + sources = { + "lazy", + "rockspec", -- will only be used when rocks.enabled is true + "packspec", + }, + }, + rocks = { + enabled = true, + root = vim.fn.stdpath("data") .. "/lazy-rocks", + server = "https://lumen-oss.github.io/rocks-binaries/", + -- use hererocks to install luarocks? + -- set to `nil` to use hererocks when luarocks is not found + -- set to `true` to always use hererocks + -- set to `false` to always use luarocks + hererocks = nil, + }, + dev = { + -- Directory where you store your local plugin projects. If a function is used, + -- the plugin directory (e.g. `~/projects/plugin-name`) must be returned. + ---@type string | fun(plugin: LazyPlugin): string + path = "~/projects", + ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub + patterns = {}, -- For example {"folke"} + fallback = false, -- Fallback to git when local plugin doesn't exist + }, + install = { + -- install missing plugins on startup. This doesn't increase startup time. + missing = true, + -- try to load one of these colorschemes when starting an installation during startup + colorscheme = { "catppuccin" }, + }, + ui = { + -- a number <1 is a percentage., >1 is a fixed size + size = { width = 0.8, height = 0.8 }, + wrap = true, -- wrap the lines in the ui + -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. + border = "none", + -- The backdrop opacity. 0 is fully opaque, 100 is fully transparent. + backdrop = 60, + title = nil, ---@type string only works when border is not "none" + title_pos = "center", ---@type "center" | "left" | "right" + -- Show pills on top of the Lazy window + pills = true, ---@type boolean + icons = { + cmd = " ", + config = "", + debug = "● ", + event = " ", + favorite = " ", + ft = " ", + init = " ", + import = " ", + keys = " ", + lazy = "󰒲 ", + loaded = "●", + not_loaded = "○", + plugin = " ", + runtime = " ", + require = "󰢱 ", + source = " ", + start = " ", + task = "✔ ", + list = { + "●", + "➜", + "★", + "‒", + }, + }, + -- leave nil, to automatically select a browser depending on your OS. + -- If you want to use a specific browser, you can define it here + browser = nil, ---@type string? + throttle = 1000 / 30, -- how frequently should the ui process render events + custom_keys = { + -- You can define custom key maps here. If present, the description will + -- be shown in the help menu. + -- To disable one of the defaults, set it to false. + + ["gL"] = { + function(plugin) + require("lazy.util").float_term({ "lazygit", "log" }, { + cwd = plugin.dir, + }) + end, + desc = "Open lazygit log", + }, + + ["is"] = { + function(plugin) + Util.notify(vim.inspect(plugin), { + title = "Inspect " .. plugin.name, + lang = "lua", + }) + end, + desc = "Inspect Plugin", + }, + + [""] = { + function(plugin) + require("lazy.util").float_term(nil, { + cwd = plugin.dir, + }) + end, + desc = "Open terminal in plugin dir", + }, + }, + }, + -- Output options for headless mode + headless = { + -- show the output from process commands like git + process = true, + -- show log messages + log = true, + -- show task start/end + task = true, + -- use ansi colors + colors = true, + }, + diff = { + -- diff command can be one of: + -- * browser: opens the github compare view. Note that this is always mapped to as well, + -- so you can have a different command for diff + -- * git: will run git diff and open a buffer with filetype git + -- * terminal_git: will open a pseudo terminal with git diff + -- * diffview.nvim: will open Diffview to show the diff + cmd = "git", + }, + checker = { + -- automatically check for plugin updates + enabled = false, + concurrency = nil, ---@type number? set to 1 to check for updates very slowly + notify = true, -- get a notification when new updates are found + frequency = 3600, -- check for updates every hour + check_pinned = false, -- check for pinned packages that can't be updated + }, + change_detection = { + -- automatically check for config file changes and reload the ui + enabled = false, + notify = false, -- get a notification when changes are found + }, + performance = { + cache = { + enabled = true, + }, + reset_packpath = true, -- reset the package path to improve startup time + rtp = { + reset = true, -- reset the runtime path to $VIMRUNTIME and your config directory + ---@type string[] + paths = {}, -- add any custom paths here that you want to includes in the rtp + ---@type string[] list any plugins you want to disable here + disabled_plugins = { + -- "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + -- "tarPlugin", + -- "tohtml", + -- "tutor", + -- "zipPlugin", + }, + }, + }, + -- lazy can generate helptags from the headings in markdown readme files, + -- so :help works even for plugins that don't have vim docs. + -- when the readme opens with :help it will be correctly displayed as markdown + readme = { + enabled = true, + root = vim.fn.stdpath("state") .. "/lazy/readme", + files = { "README.md", "lua/**/README.md" }, + -- only generate markdown helptags for plugins that don't have docs + skip_if_doc_exists = true, + }, + state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things + -- Enable profiling of lazy.nvim. This will add some overhead, + -- so only enable this when you are debugging lazy.nvim + profiling = { + -- Enables extra stats on the debug tab related to the loader cache. + -- Additionally gathers stats about all package.loaders + loader = false, + -- Track each new require in the Lazy profiling tab + require = false, + }, +}) diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/options.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/options.lua new file mode 100644 index 0000000..a4b373f --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/core/options.lua @@ -0,0 +1,48 @@ +vim.g.have_nerd_font = true +-- vim.g.netrw_browse_split = 0 +-- vim.g.netrw_banner = 1 +-- vim.g.netrw_browsex_viewer = "xdg-open" +-- vim.g.netrw_liststyle = 0 +-- vim.g.netrw_list_hide = "^.git" +-- vim.g.netrw_winsize = 25 +-- vim.g.loaded_netrw = 1 +-- vim.g.loaded_netrwPlugin = 1 +vim.g.mapleader = " " +vim.g.maplocalleader = "\\" +vim.o.sessionoptions = "blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal,localoptions" +vim.opt.backup = false +vim.opt.breakindent = true +vim.opt.conceallevel = 1 +vim.opt.cursorline = true +vim.opt.encoding = "utf-8" +vim.opt.expandtab = true +vim.opt.fileencoding = "utf-8" +vim.opt.hlsearch = true +vim.opt.ignorecase = true +vim.opt.inccommand = "split" +vim.opt.incsearch = true +vim.opt.isfname:append("@-@") +vim.opt.list = true +vim.opt.listchars = { tab = " ", trail = " ", nbsp = " " } +vim.opt.mouse = "a" +vim.opt.number = true +vim.opt.relativenumber = true +vim.opt.scrolloff = 8 +vim.opt.shiftwidth = 2 +vim.opt.showmode = false +vim.opt.signcolumn = "yes" +vim.opt.smartcase = true +vim.opt.smartindent = true +vim.opt.softtabstop = 2 +vim.opt.spell = false +vim.opt.spellfile = vim.fn.stdpath("config") .. "/spell/en.utf-8.add" +vim.opt.splitbelow = true +vim.opt.splitright = true +vim.opt.swapfile = false +vim.opt.tabstop = 2 +vim.opt.termguicolors = true +vim.opt.timeoutlen = 300 +vim.opt.updatetime = 300 +vim.opt.undofile = true +vim.opt.undodir = os.getenv("HOME") .. "/.local/share/history/vim_history" +vim.opt.wrap = false diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/health.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/health.lua new file mode 100644 index 0000000..b2cbba2 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/health.lua @@ -0,0 +1,60 @@ +local start = vim.health.start or vim.health.report_start +local ok = vim.health.ok or vim.health.report_ok +local warn = vim.health.warn or vim.health.report_warn +local error = vim.health.error or vim.health.report_error + +local check_version = function() + local version = vim.version() + local verstr = ("%d.%d.%d"):format(version.major, version.minor, version.patch) + + if not vim.version.cmp then + error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) + return + end + + if vim.version.cmp(vim.version(), { 0, 10, 0 }) >= 0 then + ok(string.format("Neovim version is: '%s'", verstr)) + else + error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) + end +end + +local check_external_reqs = function() + for _, cmd in ipairs({ "git", "make", "unzip", "rg", { "fd", "fdfind" }, "lazygit", "fzf", "curl" }) do + local name = type(cmd) == "string" and cmd or vim.inspect(cmd) + local commands = type(cmd) == "string" and { cmd } or cmd + ---@cast commands string[] + local found = false + + for _, c in ipairs(commands) do + if vim.fn.executable(c) == 1 then + name = c + found = true + end + end + + if found then + ok(("`%s` is installed"):format(name)) + else + warn(("`%s` is not installed"):format(name)) + end + end +end + +return { + check = function() + start("TheSiahxyz") + + vim.health.info([[NOTE: Not every warning is a 'must-fix' in `:checkhealth` + + Fix only warnings for plugins and languages you intend to use. + Mason will give warnings for languages that are not installed. + You do not need to install, unless you want to use those languages!]]) + + local uv = vim.uv or vim.loop + vim.health.info("System Information: " .. vim.inspect(uv.os_uname())) + + check_version() + check_external_reqs() + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/init.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/init.lua new file mode 100644 index 0000000..58a3470 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/init.lua @@ -0,0 +1,15 @@ +-- Core +require("TheSiahxyz.core.options") +require("TheSiahxyz.core.keymaps") +require("TheSiahxyz.core.autocmds") +require("TheSiahxyz.core.lazy") + +-- Custom +for _, file in ipairs(vim.fn.readdir(vim.fn.stdpath("config") .. "/lua/TheSiahxyz/utils", [[v:val =~ '\.lua$']])) do + require("TheSiahxyz.utils." .. file:gsub("%.lua$", "")) +end + +-- Plenary +function R(name) + require("plenary.reload").reload_module(name) +end diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ai.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ai.lua new file mode 100644 index 0000000..6ff4ac6 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ai.lua @@ -0,0 +1,901 @@ +return { + { + "ravitemer/mcphub.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + }, + build = "npm install -g mcp-hub@latest", -- Installs `mcp-hub` node binary globally + config = function() + local mcphub = require("mcphub") + mcphub.setup({ + --- `mcp-hub` binary related options------------------- + config = vim.fn.expand("~/.config/mcphub/servers.json"), -- Absolute path to MCP Servers config file (will create if not exists) + port = 37373, -- The port `mcp-hub` server listens to + shutdown_delay = 5 * 60 * 000, -- Delay in ms before shutting down the server when last instance closes (default: 5 minutes) + use_bundled_binary = false, -- Use local `mcp-hub` binary (set this to true when using build = "bundled_build.lua") + mcp_request_timeout = 60000, --Max time allowed for a MCP tool or resource to execute in milliseconds, set longer for long running tasks + global_env = {}, -- Global environment variables available to all MCP servers (can be a table or a function returning a table) + workspace = { + enabled = true, -- Enable project-local configuration files + look_for = { ".mcphub/servers.json", ".vscode/mcp.json", ".cursor/mcp.json" }, -- Files to look for when detecting project boundaries (VS Code format supported) + reload_on_dir_changed = true, -- Automatically switch hubs on DirChanged event + port_range = { min = 40000, max = 41000 }, -- Port range for generating unique workspace ports + get_port = nil, -- Optional function returning custom port number. Called when generating ports to allow custom port assignment logic + }, + + ---Chat-plugin related options----------------- + auto_approve = function(params) + -- Auto-approve GitHub issue reading + if params.server_name == "github" and params.tool_name == "get_issue" then + return true -- Auto approve + end + + -- Block access to private repos + if params.arguments.repo == "private" then + return "You can't access my private repo" -- Error message + end + + -- Auto-approve safe file operations in current project + if params.tool_name == "read_file" then + local path = params.arguments.path or "" + if path:match("^" .. vim.fn.getcwd()) then + return true -- Auto approve + end + end + + -- Check if tool is configured for auto-approval in servers.json + if params.is_auto_approved_in_server then + return true -- Respect servers.json configuration + end + + return false -- Show confirmation prompt + end, -- Auto approve mcp tool calls + auto_toggle_mcp_servers = true, -- Let LLMs start and stop MCP servers automatically + extensions = { + avante = { + make_slash_commands = true, -- make /slash commands from MCP server prompts + }, + }, + + --- Plugin specific options------------------- + native_servers = {}, -- add your custom lua native servers here + builtin_tools = { + edit_file = { + parser = { + track_issues = true, + extract_inline_content = true, + }, + locator = { + fuzzy_threshold = 0.8, + enable_fuzzy_matching = true, + }, + ui = { + go_to_origin_on_complete = true, + keybindings = { + accept = ".", + reject = ",", + next = "n", + prev = "p", + accept_all = "ga", + reject_all = "gr", + }, + }, + }, + }, + ui = { + window = { + width = 0.8, -- 0-1 (ratio); "50%" (percentage); 50 (raw number) + height = 0.8, -- 0-1 (ratio); "50%" (percentage); 50 (raw number) + align = "center", -- "center", "top-left", "top-right", "bottom-left", "bottom-right", "top", "bottom", "left", "right" + relative = "editor", + zindex = 50, + border = "rounded", -- "none", "single", "double", "rounded", "solid", "shadow" + }, + wo = { -- window-scoped options (vim.wo) + winhl = "Normal:MCPHubNormal,FloatBorder:MCPHubBorder", + }, + }, + json_decode = nil, -- Custom JSON parser function (e.g., require('json5').parse for JSON5 support) + on_ready = function(hub) + -- Called when hub is ready + end, + on_error = function(err) + -- Called on errors + end, + log = { + level = vim.log.levels.WARN, + to_file = false, + file_path = nil, + prefix = "MCPHub", + }, + }) + + -- LSP diagnostics as a resource + mcphub.add_resource("neovim", { + name = "Diagnostics: Current File", + description = "Get diagnostics for the current file", + uri = "neovim://diagnostics/current", + mimeType = "text/plain", + handler = function(req, res) + -- Get active buffer + local buf_info = req.editor_info.last_active + if not buf_info then + return res:error("No active buffer") + end + + -- Get diagnostics + local diagnostics = vim.diagnostic.get(buf_info.bufnr) + + -- Format header + local text = string.format("Diagnostics for: %s\n%s\n", buf_info.filename, string.rep("-", 40)) + + -- Format diagnostics + for _, diag in ipairs(diagnostics) do + local severity = vim.diagnostic.severity[diag.severity] + text = text + .. string.format( + "\n%s: %s\nLine %d: %s\n", + severity, + diag.source or "unknown", + diag.lnum + 1, + diag.message + ) + end + + return res:text(text):send() + end, + }) + + mcphub.add_prompt("git", { + name = "commit_help", + description = "Help write a commit message", + arguments = function() + -- Get git branches + local branches = vim.fn.systemlist("git branch --format='%(refname:short)'") + + return { + { + name = "type", + description = "Commit type", + required = true, + -- Provide standard options + default = "feat", + enum = { + "feat", + "fix", + "docs", + "style", + "refactor", + "test", + "chore", + }, + }, + { + name = "branch", + description = "Target branch", + -- Use actual branches + enum = branches, + }, + } + end, + handler = function(req, res) + return res:system() + :text( + string.format("Help write a %s commit for branch: %s", req.params.type, req.params.branch) + ) + :send() + end, + }) + + mcphub.add_prompt("editor", { + name = "review_code", + arguments = { + { + name = "style", + description = "Review style", + enum = { "brief", "detailed" }, + }, + }, + handler = function(req, res) + -- Get current buffer + local buf = req.editor_info.last_active + if not buf then + return res:error("No active buffer") + end + + -- Generate code overview + local overview = generate_overview(buf) + + return res + -- Set review context + :system() + :text("You are a code reviewer.\n" .. "Style: " .. req.params.style) + -- Add code visualization + :image(overview, "image/png") + :text("Above is a visualization of the code structure.") + -- Add relevant resources + :resource({ + uri = "neovim://diagnostics/current", + mimeType = "text/plain", + }) + :text("Above are the current diagnostics.") + -- Send prompt + :send() + end, + }) + + mcphub.add_prompt("context", { + name = "explain_code", + handler = function(req, res) + -- Start with base behavior + res:system():text("You are a code explanation assistant.") + + -- Add context based on caller + if req.caller.type == "codecompanion" then + -- Add CodeCompanion chat context + local chat = req.caller.codecompanion.chat + res:text("\nPrevious discussion:\n" .. chat.history) + elseif req.caller.type == "avante" then + -- Add Avante code context + local code = req.caller.avante.code + res:text("\nSelected code:\n" .. code) + end + + -- Add example interactions + res:user():text("Explain this code"):llm():text("I'll explain the code in detail...") + + return res:send() + end, + }) + end, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "mc", group = "MCP" }, + }) + end, + keys = { + { "mcp", ":MCPHub", desc = "MCP Hub" }, + }, + }, + { + "kkrampis/codex.nvim", + lazy = true, + cmd = { "Codex", "CodexToggle" }, -- Optional: Load only on command execution + keys = { + { + "cd", -- Change this to your preferred keybinding + function() + require("codex").toggle() + end, + desc = "Toggle Codex popup or side-panel", + mode = { "n", "t" }, + }, + }, + opts = { + keymaps = { + toggle = nil, -- Keybind to toggle Codex window (Disabled by default, watch out for conflicts) + quit = "", -- Keybind to close the Codex window (default: Ctrl + q) + }, -- Disable internal default keymap (cc -> :CodexToggle) + border = "rounded", -- Options: 'single', 'double', or 'rounded' + width = 0.8, -- Width of the floating window (0.0 to 1.0) + height = 0.8, -- Height of the floating window (0.0 to 1.0) + model = nil, -- Optional: pass a string to use a specific model (e.g., 'o3-mini') + autoinstall = true, -- Automatically install the Codex CLI if not found + panel = false, -- Open Codex in a side-panel (vertical split) instead of floating window + use_buffer = false, -- Capture Codex stdout into a normal buffer instead of a terminal buffer + }, + }, + { + "yetone/avante.nvim", + -- if you want to build from source then do `make BUILD_FROM_SOURCE=true` + -- ⚠️ must add this setting! ! ! + build = vim.fn.has("win32") ~= 0 + and "powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false" + or "make", + event = "VeryLazy", + version = false, -- Never set this value to "*"! Never! + dependencies = { + "ravitemer/mcphub.nvim", + "nvim-lua/plenary.nvim", + "MunifTanjim/nui.nvim", + --- The below dependencies are optional, + -- "echasnovski/mini.pick", -- for file_selector provider mini.pick + -- "nvim-telescope/telescope.nvim", -- for file_selector provider telescope + -- "hrsh7th/nvim-cmp", -- autocompletion for avante commands and mentions + -- "ibhagwan/fzf-lua", -- for file_selector provider fzf + -- "stevearc/dressing.nvim", -- for input provider dressing + -- "folke/snacks.nvim", -- for input provider snacks + -- "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" }, + }, + }, + config = function() + require("avante").setup({ + instructions_file = "avante.md", + ---@alias Provider "claude" | "openai" | "azure" | "gemini" | "cohere" | "copilot" | string + ---@type Provider + provider = "openai", -- The provider used in Aider mode or in the planning phase of Cursor Planning Mode + ---@alias Mode "agentic" | "legacy" + ---@type Mode + mode = "agentic", -- The default mode for interaction. "agentic" uses tools to automatically generate code, "legacy" uses the old planning method to generate code. + -- WARNING: Since auto-suggestions are a high-frequency operation and therefore expensive, + -- currently designating it as `copilot` provider is dangerous because: https://github.com/yetone/avante.nvim/issues/1048 + -- Of course, you can reduce the request frequency by increasing `suggestion.debounce`. + auto_suggestions_provider = "claude", + providers = { + claude = { + endpoint = "https://api.anthropic.com", + model = "claude-sonnet-4-20250514", + timeout = 30000, -- Timeout in milliseconds + extra_request_body = { + temperature = 0.75, + max_tokens = 20480, + }, + }, + openai = { + endpoint = "https://api.openai.com/v1", -- The LLM API endpoint + model = "gpt-5", + timeout = 30000, + extra = { + temperature = 0.7, + max_tokens = 20480, + }, + }, + moonshot = { + endpoint = "https://api.moonshot.ai/v1", + model = "kimi-k2-0711-preview", + timeout = 30000, -- Timeout in milliseconds + extra_request_body = { + temperature = 0.75, + max_tokens = 32768, + }, + }, + }, + acp_providers = { + ["gemini-cli"] = { + command = "gemini", + args = { "--experimental-acp" }, + env = { + NODE_NO_WARNINGS = "1", + GEMINI_API_KEY = os.getenv("GEMINI_API_KEY"), + }, + }, + ["claude-code"] = { + command = "npx", + args = { "@zed-industries/claude-code-acp" }, + env = { + NODE_NO_WARNINGS = "1", + ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY"), + }, + }, + ["goose"] = { + command = "goose", + args = { "acp" }, + }, + ["codex"] = { + command = "codex-acp", + env = { + NODE_NO_WARNINGS = "1", + OPENAI_API_KEY = os.getenv("OPENAI_API_KEY"), + }, + }, + }, + ---Specify the special dual_boost mode + ---1. enabled: Whether to enable dual_boost mode. Default to false. + ---2. first_provider: The first provider to generate response. Default to "openai". + ---3. second_provider: The second provider to generate response. Default to "claude". + ---4. prompt: The prompt to generate response based on the two reference outputs. + ---5. timeout: Timeout in milliseconds. Default to 60000. + ---How it works: + --- When dual_boost is enabled, avante will generate two responses from the first_provider and second_provider respectively. Then use the response from the first_provider as provider1_output and the response from the second_provider as provider2_output. Finally, avante will generate a response based on the prompt and the two reference outputs, with the default Provider as normal. + ---Note: This is an experimental feature and may not work as expected. + dual_boost = { + enabled = false, + first_provider = "openai", + second_provider = "claude", + prompt = "Based on the two reference outputs below, generate a response that incorporates elements from both but reflects your own judgment and unique perspective. Do not provide any explanation, just give the response directly. Reference Output 1: [{{provider1_output}}], Reference Output 2: [{{provider2_output}}]", + timeout = 60000, -- Timeout in milliseconds + }, + behaviour = { + auto_suggestions = false, -- Experimental stage + auto_set_highlight_group = true, + auto_set_keymaps = true, + auto_apply_diff_after_generation = false, + support_paste_from_clipboard = false, + minimize_diff = true, -- Whether to remove unchanged lines when applying a code block + enable_token_counting = true, -- Whether to enable token counting. Default to true. + auto_approve_tool_permissions = false, -- Default: show permission prompts for all tools + -- Examples: + -- auto_approve_tool_permissions = true, -- Auto-approve all tools (no prompts) + -- auto_approve_tool_permissions = {"bash", "replace_in_file"}, -- Auto-approve specific tools only + }, + prompt_logger = { -- logs prompts to disk (timestamped, for replay/debugging) + enabled = true, -- toggle logging entirely + log_dir = vim.fn.stdpath("cache") .. "/avante_prompts", -- directory where logs are saved + fortune_cookie_on_success = false, -- shows a random fortune after each logged prompt (requires `fortune` installed) + next_prompt = { + normal = "", -- load the next (newer) prompt log in normal mode + insert = "", + }, + prev_prompt = { + normal = "", -- load the previous (older) prompt log in normal mode + insert = "", + }, + }, + mappings = { + --- @class AvanteConflictMappings + diff = { + ours = "co", + theirs = "ct", + all_theirs = "ca", + both = "cb", + cursor = "cc", + next = "]x", + prev = "[x", + }, + suggestion = { + accept = "", + next = "", + prev = "", + dismiss = "", + }, + jump = { + next = "]]", + prev = "[[", + }, + submit = { + normal = "", + insert = "", + }, + cancel = { + normal = { "", "", "q" }, + insert = { "" }, + }, + sidebar = { + apply_all = "A", + apply_cursor = "a", + retry_user_request = "r", + edit_user_request = "e", + switch_windows = "", + reverse_switch_windows = "", + remove_file = "d", + add_file = "@", + close = { "", "q" }, + close_from_input = nil, -- e.g., { normal = "", insert = "" } + }, + }, + selection = { + enabled = true, + hint_display = "delayed", + }, + windows = { + ---@type "right" | "left" | "top" | "bottom" + position = "right", -- the position of the sidebar + wrap = true, -- similar to vim.o.wrap + width = 30, -- default % based on available width + sidebar_header = { + enabled = true, -- true, false to enable/disable the header + align = "center", -- left, center, right for title + rounded = true, + }, + spinner = { + editing = { + "⡀", + "⠄", + "⠂", + "⠁", + "⠈", + "⠐", + "⠠", + "⢀", + "⣀", + "⢄", + "⢂", + "⢁", + "⢈", + "⢐", + "⢠", + "⣠", + "⢤", + "⢢", + "⢡", + "⢨", + "⢰", + "⣰", + "⢴", + "⢲", + "⢱", + "⢸", + "⣸", + "⢼", + "⢺", + "⢹", + "⣹", + "⢽", + "⢻", + "⣻", + "⢿", + "⣿", + }, + generating = { "·", "✢", "✳", "∗", "✻", "✽" }, -- Spinner characters for the 'generating' state + thinking = { "🤯", "🙄" }, -- Spinner characters for the 'thinking' state + }, + input = { + prefix = "> ", + height = 8, -- Height of the input window in vertical layout + }, + edit = { + border = "rounded", + start_insert = true, -- Start insert mode when opening the edit window + }, + ask = { + floating = false, -- Open the 'AvanteAsk' prompt in a floating window + start_insert = true, -- Start insert mode when opening the ask window + border = "rounded", + ---@type "ours" | "theirs" + focus_on_apply = "ours", -- which diff to focus after applying + }, + }, + highlights = { + ---@type AvanteConflictHighlights + diff = { + current = "DiffText", + incoming = "DiffAdd", + }, + }, + --- @class AvanteConflictUserConfig + diff = { + autojump = true, + ---@type string | fun(): any + list_opener = "copen", + --- Override the 'timeoutlen' setting while hovering over a diff (see :help timeoutlen). + --- Helps to avoid entering operator-pending mode with diff mappings starting with `c`. + --- Disable by setting to -1. + override_timeoutlen = 500, + }, + suggestion = { + debounce = 600, + throttle = 600, + }, + system_prompt = function() + local hub = require("mcphub").get_hub_instance() + return hub and hub:get_active_servers_prompt() or "" + end, + -- Using function prevents requiring mcphub before it's loaded + custom_tools = function() + return { + require("mcphub.extensions.avante").mcp_tool(), + } + end, + }) + end, + keys = { + { + "ae", + function() + require("avante.api").edit() + end, + desc = "avante: edit", + mode = { "n", "v" }, + }, + { + "ai", + function() + return vim.bo.filetype == "AvanteInput" and require("avante.clipboard").paste_image() + or require("img-clip").paste_image() + end, + desc = "clip: paste image", + }, + }, + }, + -- { + -- "robitx/gp.nvim", + -- init = function() + -- local wk = require("which-key") + -- wk.add({ + -- mode = { "n", "v", "x" }, + -- { "G", group = "GPT" }, + -- { "Gg", group = "Gp" }, + -- { "GW", group = "Whisper" }, + -- }) + -- end, + -- config = function() + -- local function keymapOptions(desc) + -- return { + -- noremap = true, + -- silent = true, + -- nowait = true, + -- desc = desc, + -- } + -- end + -- + -- local conf = { + -- -- For customization, refer to Install > Configuration in the Documentation/Readme + -- -- openai_api_key = { "pass", "show", "api/chatGPT/nvim" }, + -- openai_api_key = { "pass", "show", "api/chatGPT/nvim" }, + -- providers = { + -- openai = { + -- disable = false, + -- endpoint = "https://api.openai.com/v1/chat/completions", + -- -- secret = { "pass", "show", "api/chatGPT/nvim" }, + -- }, + -- }, + -- hooks = { + -- -- GpInspectPlugin provides a detailed inspection of the plugin state + -- InspectPlugin = function(plugin, params) + -- local bufnr = vim.api.nvim_create_buf(false, true) + -- local copy = vim.deepcopy(plugin) + -- local key = copy.config.openai_api_key or "" + -- copy.config.openai_api_key = key:sub(1, 3) .. string.rep("*", #key - 6) .. key:sub(-3) + -- local plugin_info = string.format("Plugin structure:\n%s", vim.inspect(copy)) + -- local params_info = string.format("Command params:\n%s", vim.inspect(params)) + -- local lines = vim.split(plugin_info .. "\n" .. params_info, "\n") + -- vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines) + -- vim.api.nvim_win_set_buf(0, bufnr) + -- end, + -- + -- -- GpInspectLog for checking the log file + -- InspectLog = function(plugin, params) + -- local log_file = plugin.config.log_file + -- local buffer = plugin.helpers.get_buffer(log_file) + -- if not buffer then + -- vim.cmd("e " .. log_file) + -- else + -- vim.cmd("buffer " .. buffer) + -- end + -- end, + -- + -- -- GpImplement rewrites the provided selection/range based on comments in it + -- Implement = function(gp, params) + -- local template = "Having following from {{filename}}:\n\n" + -- .. "```{{filetype}}\n{{selection}}\n```\n\n" + -- .. "Please rewrite this according to the contained instructions." + -- .. "\n\nRespond exclusively with the snippet that should replace the selection above." + -- + -- local agent = gp.get_command_agent() + -- gp.logger.info("Implementing selection with agent: " .. agent.name) + -- + -- gp.Prompt( + -- params, + -- gp.Target.rewrite, + -- agent, + -- template, + -- nil, -- command will run directly without any prompting for user input + -- nil -- no predefined instructions (e.g. speech-to-text from Whisper) + -- ) + -- end, + -- + -- -- your own functions can go here, see README for more examples like + -- -- :GpExplain, :GpUnitTests.., :GpTranslator etc. + -- + -- -- example of making :%GpChatNew a dedicated command which + -- -- opens new chat with the entire current buffer as a context + -- BufferChatNew = function(gp, _) + -- -- call GpChatNew command in range mode on whole buffer + -- vim.api.nvim_command("%" .. gp.config.cmd_prefix .. "ChatNew") + -- end, + -- + -- -- example of adding command which opens new chat dedicated for translation + -- Translator = function(gp, params) + -- local chat_system_prompt = "You are a Translator, please translate between English and Korean." + -- gp.cmd.ChatNew(params, chat_system_prompt) + -- + -- -- -- you can also create a chat with a specific fixed agent like this: + -- -- local agent = gp.get_chat_agent("ChatGPT4o") + -- -- gp.cmd.ChatNew(params, chat_system_prompt, agent) + -- end, + -- + -- -- example of adding command which writes unit tests for the selected code + -- UnitTests = function(gp, params) + -- local template = "I have the following code from {{filename}}:\n\n" + -- .. "```{{filetype}}\n{{selection}}\n```\n\n" + -- .. "Please respond by writing table driven unit tests for the code above." + -- local agent = gp.get_command_agent() + -- gp.Prompt(params, gp.Target.enew, agent, template) + -- end, + -- + -- -- example of adding command which explains the selected code + -- Explain = function(gp, params) + -- local template = "I have the following code from {{filename}}:\n\n" + -- .. "```{{filetype}}\n{{selection}}\n```\n\n" + -- .. "Please respond by explaining the code above." + -- local agent = gp.get_chat_agent() + -- gp.Prompt(params, gp.Target.popup, agent, template) + -- end, + -- + -- -- example of usig enew as a function specifying type for the new buffer + -- CodeReview = function(gp, params) + -- local template = "I have the following code from {{filename}}:\n\n" + -- .. "```{{filetype}}\n{{selection}}\n```\n\n" + -- .. "Please analyze for code smells and suggest improvements." + -- local agent = gp.get_chat_agent() + -- gp.Prompt(params, gp.Target.enew("markdown"), agent, template) + -- end, + -- }, + -- } + -- require("gp").setup(conf) + -- + -- -- Setup shortcuts here (see Usage > Shortcuts in the Documentation/Readme) + -- vim.keymap.set("n", "Gc", "GpChatNew", keymapOptions("New chat")) + -- vim.keymap.set("n", "Gb", "GpBufferChatNew", keymapOptions("New buffer chat")) + -- vim.keymap.set("n", "Gt", "GpChatToggle", keymapOptions("Toggle chat")) + -- vim.keymap.set("n", "Gf", "GpChatFinder", keymapOptions("Chat finder")) + -- + -- vim.keymap.set("v", "Gc", ":'<,'>GpChatNew", keymapOptions("Chat new")) + -- vim.keymap.set("v", "Gb", ":'<,'>GpBufferChatNew", keymapOptions("Buffer chat new")) + -- vim.keymap.set("v", "Gp", ":'<,'>GpChatPaste", keymapOptions("Chat paste")) + -- vim.keymap.set("v", "Gt", ":'<,'>GpChatToggle", keymapOptions("Toggle chat")) + -- + -- vim.keymap.set("n", "Gh", "gpchatnew split", keymapOptions("New chat split")) + -- vim.keymap.set("n", "Gv", "gpchatnew vsplit", keymapOptions("New chat vsplit")) + -- vim.keymap.set("n", "Gn", "gpchatnew tabnew", keymapOptions("New chat tabnew")) + -- + -- vim.keymap.set("v", "Gh", ":'<,'>GpChatNew split", keymapOptions("Chat new split")) + -- vim.keymap.set("v", "Gv", ":'<,'>GpChatNew vsplit", keymapOptions("Chat new vsplit")) + -- vim.keymap.set("v", "Gn", ":'<,'>GpChatNew tabnew", keymapOptions("Chat new tabnew")) + -- + -- -- Prompt commands + -- vim.keymap.set("n", "Gw", "GpRewrite", keymapOptions("Inline rewrite")) + -- vim.keymap.set("n", "Gr", "GpCodeReview", keymapOptions("Code review")) + -- vim.keymap.set("n", "G]", "GpAppend", keymapOptions("Append (after)")) + -- vim.keymap.set("n", "G[", "GpPrepend", keymapOptions("Prepend (before)")) + -- + -- vim.keymap.set("v", "Gw", ":'<,'>GpRewrite", keymapOptions("Rewrite")) + -- vim.keymap.set("v", "Gr", ":'<,'>GpCodeReview", keymapOptions("Code review")) + -- vim.keymap.set("v", "G]", ":'<,'>GpAppend", keymapOptions("Append (after)")) + -- vim.keymap.set("v", "G[", ":'<,'>GpPrepend", keymapOptions("Prepend (before)")) + -- vim.keymap.set("v", "Gi", ":'<,'>GpImplement", keymapOptions("Implement selection")) + -- + -- vim.keymap.set("n", "Ggp", "GpPopup", keymapOptions("Popup")) + -- vim.keymap.set("n", "Gge", "GpEnew", keymapOptions("GpEnew")) + -- vim.keymap.set("n", "Ggc", "GpNew", keymapOptions("GpNew")) + -- vim.keymap.set("n", "Ggv", "GpVnew", keymapOptions("GpVnew")) + -- vim.keymap.set("n", "Ggn", "GpTabnew", keymapOptions("GpTabnew")) + -- + -- vim.keymap.set("v", "Ggp", ":'<,'>GpPopup", keymapOptions("Popup")) + -- vim.keymap.set("v", "Gge", ":'<,'>GpEnew", keymapOptions("GpEnew")) + -- vim.keymap.set("v", "Ggc", ":'<,'>GpNew", keymapOptions("GpNew")) + -- vim.keymap.set("v", "Ggv", ":'<,'>GpVnew", keymapOptions("GpVnew")) + -- vim.keymap.set("v", "Ggn", ":'<,'>GpTabnew", keymapOptions("GpTabnew")) + -- + -- vim.keymap.set("n", "Gx", "GpContext", keymapOptions("Toggle context")) + -- vim.keymap.set("v", "Gx", ":'<,'>GpContext", keymapOptions("Toggle context")) + -- + -- vim.keymap.set({ "n", "v", "x" }, "Ggs", "GpStop", keymapOptions("Stop")) + -- vim.keymap.set({ "n", "v", "x" }, "Gg]", "GpNextAgent", keymapOptions("Next agent")) + -- + -- -- optional Whisper commands with prefix w + -- vim.keymap.set("n", "GWw", "GpWhisper", keymapOptions("Whisper")) + -- vim.keymap.set("v", "GWw", ":'<,'>GpWhisper", keymapOptions("Whisper")) + -- + -- vim.keymap.set("n", "GWr", "GpWhisperRewrite", keymapOptions("Inline rewrite")) + -- vim.keymap.set("n", "GW]", "GpWhisperAppend", keymapOptions("Append (after)")) + -- vim.keymap.set("n", "GW[", "GpWhisperPrepend", keymapOptions("Prepend (before) ")) + -- + -- vim.keymap.set("v", "GWr", ":'<,'>GpWhisperRewrite", keymapOptions("Rewrite")) + -- vim.keymap.set("v", "GW]", ":'<,'>GpWhisperAppend", keymapOptions("Append (after)")) + -- vim.keymap.set("v", "GW[", ":'<,'>GpWhisperPrepend", keymapOptions("Prepend (before)")) + -- + -- vim.keymap.set("n", "GWp", "GpWhisperPopup", keymapOptions("Popup")) + -- vim.keymap.set("n", "GWe", "GpWhisperEnew", keymapOptions("Enew")) + -- vim.keymap.set("n", "GWc", "GpWhisperNew", keymapOptions("New")) + -- vim.keymap.set("n", "GWv", "GpWhisperVnew", keymapOptions("Vnew")) + -- vim.keymap.set("n", "GWn", "GpWhisperTabnew", keymapOptions("Tabnew")) + -- + -- vim.keymap.set("v", "GWp", ":'<,'>GpWhisperPopup", keymapOptions("Popup")) + -- vim.keymap.set("v", "GWe", ":'<,'>GpWhisperEnew", keymapOptions("Enew")) + -- vim.keymap.set("v", "GWc", ":'<,'>GpWhisperNew", keymapOptions("New")) + -- vim.keymap.set("v", "GWv", ":'<,'>GpWhisperVnew", keymapOptions("Vnew")) + -- vim.keymap.set("v", "GWn", ":'<,'>GpWhisperTabnew", keymapOptions("Tabnew")) + -- end, + -- }, + -- { + -- "zbirenbaum/copilot.lua", + -- cmd = "Copilot", + -- build = ":Copilot auth", + -- event = "InsertEnter", + -- dependencies = { + -- "hrsh7th/nvim-cmp", + -- { "AndreM222/copilot-lualine" }, + -- { + -- "zbirenbaum/copilot-cmp", + -- config = function() + -- require("copilot_cmp").setup() + -- end, + -- }, + -- }, + -- config = function() + -- require("copilot").setup({ + -- panel = { + -- enabled = true, + -- auto_refresh = true, + -- keymap = { + -- jump_prev = "[a", + -- jump_next = "]a", + -- accept = "", + -- refresh = "gr", + -- open = "", + -- }, + -- layout = { + -- position = "right", -- | top | left | right + -- ratio = 0.4, + -- }, + -- }, + -- suggestion = { + -- enabled = true, + -- auto_trigger = true, + -- hide_during_completion = true, + -- debounce = 75, + -- keymap = { + -- accept = "", + -- accept_word = false, + -- accept_line = false, + -- next = "", + -- prev = "", + -- dismiss = "", + -- }, + -- }, + -- filetypes = { + -- cvs = false, + -- gitcommit = false, + -- gitrebase = false, + -- help = true, + -- hgcommit = false, + -- markdown = 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, + -- svn = false, + -- yaml = false, + -- ["."] = false, + -- ["*"] = true, + -- }, + -- copilot_node_command = "node", -- Node.js version must be > 18.x + -- server_opts_overrides = {}, + -- }) + -- + -- local cmp = require("cmp") + -- cmp.event:on("menu_opened", function() + -- vim.b.copilot_suggestion_hidden = true + -- end) + -- + -- cmp.event:on("menu_closed", function() + -- vim.b.copilot_suggestion_hidden = false + -- end) + -- end, + -- + -- vim.keymap.set("n", "ct", function() + -- require("copilot.suggestion").toggle_auto_trigger() + -- end, { noremap = true, silent = true, desc = "Toggle copilot" }), + -- }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/cloak.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/cloak.lua new file mode 100644 index 0000000..29c94c0 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/cloak.lua @@ -0,0 +1,42 @@ +return { + "laytan/cloak.nvim", + lazy = false, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "c", group = "Cloak" }, + }) + end, + config = function() + require("cloak").setup({ + enabled = true, + cloak_character = "*", + -- The applied highlight group (colors) on the cloaking, see `:h highlight`. + highlight_group = "Comment", + patterns = { + { + -- Match any file starting with ".env". + -- This can be a table to match multiple file patterns. + file_pattern = { + ".env*", + "wrangler.toml", + ".dev.vars", + "address*", + "*api*", + }, + -- Match an equals sign and any character after it. + -- This can also be a table of patterns to cloak, + -- example: cloak_pattern = { ":.+", "-.+" } for yaml files. + cloak_pattern = { "=.+", ":.+", "-.+" }, + }, + }, + }) + end, + keys = { + { "ce", "CloakEnable", desc = "Enable cloak" }, + { "cx", "CloakDisable", desc = "Disable cloak" }, + { "cl", "CloakPreviewLine", desc = "Preview line cloak" }, + { "zC", "CloakToggle", desc = "Toggle cloak" }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/cmp.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/cmp.lua new file mode 100644 index 0000000..2dd46f3 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/cmp.lua @@ -0,0 +1,331 @@ +local trigger_text = ";" + +return { + { + "hrsh7th/nvim-cmp", + event = "InsertEnter", + dependencies = { + "hrsh7th/cmp-buffer", -- source for text in buffer + "hrsh7th/cmp-path", -- source for file system paths + "hrsh7th/cmp-cmdline", -- source for cmd + "hrsh7th/cmp-vsnip", + "hrsh7th/vim-vsnip", + { + "L3MON4D3/LuaSnip", + version = "v2.*", -- Replace by the latest released major (first number of latest release) + build = "make install_jsregexp", + }, + "saadparwaiz1/cmp_luasnip", -- for autocompletion + "rafamadriz/friendly-snippets", -- useful snippets + "onsails/lspkind.nvim", -- vs-code like pictograms + "uga-rosa/cmp-dictionary", -- dictionary & spell + }, + config = function() + local cmp = require("cmp") + local luasnip = require("luasnip") + local has_words_before = function() + unpack = unpack or table.unpack + local line, col = unpack(vim.api.nvim_win_get_cursor(0)) + return col ~= 0 + and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil + end + + require("luasnip.loaders.from_vscode").lazy_load() + + cmp.setup({ + completion = { + completeopt = "menu,menuone,preview,noselect", + }, + snippet = { -- configure how nvim-cmp interacts with snippet engine + expand = function(args) + require("luasnip").lsp_expand(args.body) + end, + }, + mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.select_prev_item(), -- previous suggestion + [""] = cmp.mapping.select_next_item(), -- next suggestion + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.scroll_docs(4), + [""] = cmp.mapping.complete(), -- show completion suggestions + [""] = cmp.mapping.abort(), -- close completion window + [""] = cmp.mapping.close(), + [""] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + -- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable() + -- this way you will only jump inside the snippet region + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + }), + -- sources for autocompletion + sources = cmp.config.sources({ + { name = "buffer" }, -- text within current buffer + { name = "crates" }, + { name = "copilot" }, + { name = "dictionary", keyword_length = 2 }, + { name = "emoji" }, + { name = "luasnip" }, -- snippets + { name = "nvim_lsp" }, + { name = "nvim_lua", priority = 100 }, + { name = "path" }, -- file system paths + { name = "projects", priority = 100 }, + { name = "snippets" }, + { name = "vim-dadbod-completion" }, -- Enable dadbod completion source + { name = "vsnip" }, + }), + + -- configure lspkind for vs-code like pictograms in completion menu + formatting = { + expandable_indicator = true, + fields = { + "abbr", + "kind", + "menu", + }, + format = require("lspkind").cmp_format({ + mode = "symbol_text", + maxwidth = 50, + ellipsis_char = "...", + menu = { + buffer = "[Buffer]", + luasnip = "[LuaSnip]", + nvim_lsp = "[LSP]", + nvim_lua = "[Lua]", + projects = "[Projects]", + emoji = "[Emoji]", + vsnip = "[Snippet]", + }, + }), + }, + }) + + -- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore). + cmp.setup.cmdline({ "/", "?" }, { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = "buffer" }, + }, + }) + + -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). + cmp.setup.cmdline(":", { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = "path" }, + }, { + { name = "cmdline" }, + }), + matching = { disallow_symbol_nonprefix_matching = false }, + }) + + -- sql + cmp.setup.filetype({ "sql" }, { + sources = { + { name = "vim-dadbod-completion" }, + { name = "buffer" }, + }, + }) + + local lspkind = require("lspkind") + lspkind.init({ + symbol_map = { + Copilot = "", + }, + }) + + vim.api.nvim_set_hl(0, "CmpItemKindCopilot", { fg = "#6CC644" }) + + require("cmp_dictionary").setup({ + paths = { "/usr/share/dict/words" }, + exact_length = 2, + first_case_insensitive = true, + document = { + enable = true, + command = { "wn", "${label}", "-over" }, + }, + }) + end, + }, + -- { + -- "saghen/blink.cmp", + -- version = "*", + -- -- build = "cargo build --release", + -- opts_extend = { + -- "sources.completion.enabled_providers", + -- "sources.compat", + -- "sources.default", + -- }, + -- enabled = true, + -- dependencies = { + -- { + -- "L3MON4D3/LuaSnip", + -- version = "v2.*", + -- build = "make install_jsregexp", + -- }, + -- "rafamadriz/friendly-snippets", + -- { + -- "saghen/blink.compat", + -- optional = true, -- make optional so it's only enabled if any extras need it + -- opts = {}, + -- version = "*", + -- }, + -- "kristjanhusak/vim-dadbod-completion", + -- "giuxtaposition/blink-cmp-copilot", + -- }, + -- event = "InsertEnter", + -- opts = function(_, opts) + -- opts.sources = vim.tbl_deep_extend("force", opts.sources or {}, { + -- default = { "lsp", "path", "snippets", "buffer", "copilot", "luasnip", "dadbod" }, + -- providers = { + -- lsp = { + -- name = "lsp", + -- enabled = true, + -- module = "blink.cmp.sources.lsp", + -- fallbacks = { "snippets", "luasnip", "buffer" }, + -- score_offset = 90, -- the higher the number, the higher the priority + -- }, + -- luasnip = { + -- name = "luasnip", + -- enabled = true, + -- module = "blink.cmp.sources.luasnip", + -- min_keyword_length = 2, + -- fallbacks = { "snippets" }, + -- score_offset = 85, + -- max_items = 8, + -- }, + -- path = { + -- name = "Path", + -- module = "blink.cmp.sources.path", + -- score_offset = 3, + -- -- When typing a path, I would get snippets and text in the + -- -- suggestions, I want those to show only if there are no path + -- -- suggestions + -- fallbacks = { "snippets", "luasnip", "buffer" }, + -- opts = { + -- trailing_slash = false, + -- label_trailing_slash = true, + -- get_cwd = function(context) + -- return vim.fn.expand(("#%d:p:h"):format(context.bufnr)) + -- end, + -- show_hidden_files_by_default = true, + -- }, + -- }, + -- buffer = { + -- name = "Buffer", + -- enabled = true, + -- max_items = 3, + -- module = "blink.cmp.sources.buffer", + -- min_keyword_length = 4, + -- }, + -- snippets = { + -- name = "Snippets", + -- enabled = true, + -- max_items = 3, + -- module = "blink.cmp.sources.snippets", + -- min_keyword_length = 4, + -- score_offset = 80, -- the higher the number, the higher the priority + -- }, + -- -- Example on how to configure dadbod found in the main repo + -- -- https://github.com/kristijanhusak/vim-dadbod-completion + -- dadbod = { + -- name = "Dadbod", + -- module = "vim_dadbod_completion.blink", + -- score_offset = 85, -- the higher the number, the higher the priority + -- }, + -- -- Third class citizen mf always talking shit + -- copilot = { + -- name = "Copilot", + -- enabled = true, + -- module = "blink-cmp-copilot", + -- min_keyword_length = 6, + -- score_offset = -100, -- the higher the number, the higher the priority + -- async = true, + -- }, + -- }, + -- -- command line completion, thanks to dpetka2001 in reddit + -- -- https://www.reddit.com/r/neovim/comments/1hjjf21/comment/m37fe4d/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button + -- cmdline = function() + -- local type = vim.fn.getcmdtype() + -- if type == "/" or type == "?" then + -- return { "buffer" } + -- end + -- if type == ":" then + -- return { "cmdline" } + -- end + -- return {} + -- end, + -- }) + -- + -- -- This comes from the luasnip extra, if you don't add it, won't be able to + -- -- jump forward or backward in luasnip snippets + -- opts.snippets = { + -- expand = function(snippet) + -- require("luasnip").lsp_expand(snippet) + -- end, + -- active = function(filter) + -- if filter and filter.direction then + -- return require("luasnip").jumpable(filter.direction) + -- end + -- return require("luasnip").in_snippet() + -- end, + -- jump = function(direction) + -- require("luasnip").jump(direction) + -- end, + -- } + -- + -- opts.appearance = { + -- -- sets the fallback highlight groups to nvim-cmp's highlight groups + -- -- useful for when your theme doesn't support blink.cmp + -- -- will be removed in a future release, assuming themes add support + -- use_nvim_cmp_as_default = false, + -- -- set to 'mono' for 'Nerd Font Mono' or 'normal' for 'Nerd Font' + -- -- adjusts spacing to ensure icons are aligned + -- nerd_font_variant = "mono", + -- } + -- + -- opts.completion = { + -- accept = { + -- -- experimental auto-brackets support + -- auto_brackets = { + -- enabled = true, + -- }, + -- }, + -- menu = { + -- draw = { + -- treesitter = { "lsp" }, + -- }, + -- }, + -- documentation = { + -- auto_show = true, + -- auto_show_delay_ms = 200, + -- }, + -- ghost_text = { enabled = true }, + -- } + -- + -- opts.keymap = { + -- preset = "super-tab", + -- } + -- + -- return opts + -- end, + -- }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/colorizer.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/colorizer.lua new file mode 100644 index 0000000..7356619 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/colorizer.lua @@ -0,0 +1,76 @@ +return { + "catgoose/nvim-colorizer.lua", + event = "BufReadPre", + opts = { -- set to setup table + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "zh", group = "Colorizer" }, + }) + end, + config = function() + require("colorizer").setup({ + filetypes = { "*" }, -- Filetype options. Accepts table like `user_default_options` + buftypes = {}, -- Buftype options. Accepts table like `user_default_options` + -- Boolean | List of usercommands to enable. See User commands section. + user_commands = true, -- Enable all or some usercommands + lazy_load = false, -- Lazily schedule buffer highlighting setup function + user_default_options = { + names = false, -- "Name" codes like Blue or red. Added from `vim.api.nvim_get_color_map()` + names_opts = { -- options for mutating/filtering names. + lowercase = true, -- name:lower(), highlight `blue` and `red` + camelcase = true, -- name, highlight `Blue` and `Red` + uppercase = true, -- name:upper(), highlight `BLUE` and `RED` + strip_digits = false, -- ignore names with digits, + -- highlight `blue` and `red`, but not `blue3` and `red4` + }, + -- Expects a table of color name to #RRGGBB value pairs. # is optional + -- Example: { cool = "#107dac", ["notcool"] = "#ee9240" } + -- Set to false to disable, for example when setting filetype options + names_custom = false, -- Custom names to be highlighted: table|function|false + RGB = true, -- #RGB hex codes + RGBA = true, -- #RGBA hex codes + RRGGBB = true, -- #RRGGBB hex codes + RRGGBBAA = true, -- #RRGGBBAA hex codes + AARRGGBB = false, -- 0xAARRGGBB hex codes + rgb_fn = true, -- CSS rgb() and rgba() functions + hsl_fn = true, -- CSS hsl() and hsla() functions + css = true, -- Enable all CSS *features*: + -- names, RGB, RGBA, RRGGBB, RRGGBBAA, AARRGGBB, rgb_fn, hsl_fn + css_fn = false, -- Enable all CSS *functions*: rgb_fn, hsl_fn + -- Tailwind colors. boolean|'normal'|'lsp'|'both'. True sets to 'normal' + tailwind = true, -- Enable tailwind colors + tailwind_opts = { -- Options for highlighting tailwind names + update_names = false, -- When using tailwind = 'both', update tailwind names from LSP results. See tailwind section + }, + -- parsers can contain values used in `user_default_options` + sass = { enable = false, parsers = { "css" } }, -- Enable sass colors + -- Highlighting mode. 'background'|'foreground'|'virtualtext' + mode = "background", -- Set the display mode + -- Virtualtext character to use + virtualtext = "■", + -- Display virtualtext inline with color. boolean|'before'|'after'. True sets to 'after' + virtualtext_inline = false, + -- Virtualtext highlight mode: 'background'|'foreground' + virtualtext_mode = "foreground", + -- update color values even if buffer is not focused + -- example use: cmp_menu, cmp_docs + always_update = false, + -- hooks to invert control of colorizer + hooks = { + -- called before line parsing. Accepts boolean or function that returns boolean + -- see hooks section below + disable_line_highlight = false, + }, + }, + }) + end, + keys = { + { "zha", "ColorizerAttachToBuffer", desc = "Attach colorizer" }, + { "zhd", "ColorizerDetachFromBuffer", desc = "Detach colorizer" }, + { "zhr", "ColorizerReloadAllBuffers", desc = "Refresh colorizer" }, + { "zht", "ColorizerToggle", desc = "Toggle colorizer" }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/colorschemes.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/colorschemes.lua new file mode 100644 index 0000000..8fce515 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/colorschemes.lua @@ -0,0 +1,350 @@ +function ColorMyPencils(color) + color = color or "catppuccin" + vim.cmd.colorscheme(color) + local set = vim.api.nvim_set_hl + set(0, "Normal", { bg = "NONE" }) + set(0, "NormalFloat", { bg = "NONE" }) + set(0, "@comment.todo", { bg = "NONE" }) + set(0, "@comment.note", { bg = "NONE" }) + set(0, "@comment.warning", { bg = "NONE" }) + set(0, "@comment.error", { bg = "NONE" }) + set(0, "@number", { bg = "NONE" }) + set(0, "@string.special.url", { bg = "NONE" }) +end + +return { + { "junegunn/seoul256.vim" }, + { + "catppuccin/nvim", + name = "catppuccin", + config = function() + require("catppuccin").setup({ + flavour = "auto", -- latte, frappe, macchiato, mocha + background = { -- :h background + light = "latte", + dark = "mocha", + }, + transparent_background = true, -- disables setting the background color. + show_end_of_buffer = false, -- shows the '~' characters after the end of buffers + term_colors = false, -- sets terminal colors (e.g. `g:terminal_color_0`) + dim_inactive = { + enabled = true, -- dims the background color of inactive window + shade = "dark", + percentage = 0.15, -- percentage of the shade to apply to the inactive window + }, + no_italic = false, -- Force no italic + no_bold = false, -- Force no bold + no_underline = false, -- Force no underline + styles = { -- Handles the styles of general hi groups (see `:h highlight-args`): + comments = { "italic" }, -- Change the style of comments + conditionals = { "italic" }, + loops = {}, + functions = {}, + keywords = {}, + strings = {}, + variables = {}, + numbers = {}, + booleans = {}, + properties = {}, + types = {}, + operators = {}, + -- miscs = {}, -- Uncomment to turn off hard-coded styles + }, + color_overrides = {}, + custom_highlights = {}, + default_integrations = true, + integrations = { + aerial = true, + alpha = true, + blink_cmp = true, + cmp = true, + dashboard = true, + flash = true, + gitsigns = true, + headlines = true, + illuminate = true, + indent_blankline = { enabled = true, scope_color = "peach", colored_indent_levels = true }, + leap = true, + lsp_trouble = true, + mason = true, + markdown = true, + mini = true, + native_lsp = { + enabled = true, + underlines = { + errors = { "undercurl" }, + hints = { "undercurl" }, + warnings = { "undercurl" }, + information = { "undercurl" }, + }, + }, + navic = { enabled = true, custom_bg = "NONE" }, + neotest = true, + neotree = true, + noice = true, + notify = true, + semantic_tokens = true, + telescope = true, + treesitter = true, + treesitter_context = true, + which_key = true, + }, + highlight_overrides = { + mocha = function(mocha) + return { + LineNr = { fg = mocha.overlay2 }, + CursorLineNr = { fg = mocha.sky }, + Normal = { bg = "NONE" }, -- normal text + NormalNC = { bg = "NONE" }, + } + end, + }, + }) + + ColorMyPencils() + end, + }, + { + "ellisonleao/gruvbox.nvim", + priority = 1000, + -- opts = ..., + config = function() + require("gruvbox").setup({ + terminal_colors = true, -- add neovim terminal colors + undercurl = true, + underline = true, + bold = true, + italic = { + strings = true, + emphasis = true, + comments = true, + operators = false, + folds = true, + }, + strikethrough = true, + invert_selection = false, + invert_signs = false, + invert_tabline = false, + invert_intend_guides = false, + inverse = true, -- invert background for search, diffs, statuslines and errors + contrast = "", -- can be "hard", "soft" or empty string + palette_overrides = { + dark1 = "NONE", + }, + overrides = {}, + dim_inactive = true, + transparent_mode = true, + }) + end, + }, + { + "rose-pine/neovim", + name = "rose-pine", + config = function() + require("rose-pine").setup({ + variant = "auto", -- auto, main, moon, or dawn + dark_variant = "main", -- main, moon, or dawn + dim_inactive_windows = false, + extend_background_behind_borders = true, + enable = { + terminal = true, + legacy_highlights = true, -- Improve compatibility for previous versions of Neovim + migrations = true, -- Handle deprecated options automatically + }, + styles = { + bold = true, + italic = false, + transparency = true, + }, + groups = { + border = "muted", + link = "iris", + panel = "surface", + + error = "love", + hint = "iris", + info = "foam", + note = "pine", + todo = "rose", + warn = "gold", + + git_add = "foam", + git_change = "rose", + git_delete = "love", + git_dirty = "rose", + git_ignore = "muted", + git_merge = "iris", + git_rename = "pine", + git_stage = "iris", + git_text = "rose", + git_untracked = "subtle", + + h1 = "iris", + h2 = "foam", + h3 = "rose", + h4 = "gold", + h5 = "pine", + h6 = "foam", + }, + palette = { + -- Override the builtin palette per variant + -- moon = { + -- base = '#18191a', + -- overlay = '#363738', + -- }, + }, + highlight_groups = { + -- Comment = { fg = "foam" }, + -- VertSplit = { fg = "muted", bg = "muted" }, + }, + before_highlight = function(group, highlight, palette) + -- Disable all undercurls + -- if highlight.undercurl then + -- highlight.undercurl = false + -- end + -- + -- Change palette colour + -- if highlight.fg == palette.pine then + -- highlight.fg = palette.foam + -- end + end, + }) + -- vim.cmd("colorscheme rose-pine") + -- vim.cmd("colorscheme rose-pine-main") + -- vim.cmd("colorscheme rose-pine-moon") + -- vim.cmd("colorscheme rose-pine-dawn") + end, + }, + { + "Mofiqul/dracula.nvim", + config = function() + local dracula = require("dracula") + dracula.setup({ + -- customize dracula color palette + colors = { + bg = "#282A36", + fg = "#F8F8F2", + selection = "#44475A", + comment = "#6272A4", + red = "#FF5555", + orange = "#FFB86C", + yellow = "#F1FA8C", + green = "#50fa7b", + purple = "#BD93F9", + cyan = "#8BE9FD", + pink = "#FF79C6", + bright_red = "#FF6E6E", + bright_green = "#69FF94", + bright_yellow = "#FFFFA5", + bright_blue = "#D6ACFF", + bright_magenta = "#FF92DF", + bright_cyan = "#A4FFFF", + bright_white = "#FFFFFF", + menu = "#21222C", + visual = "#3E4452", + gutter_fg = "#4B5263", + nontext = "#3B4048", + white = "#ABB2BF", + black = "#191A21", + }, + -- show the '~' characters after the end of buffers + show_end_of_buffer = true, -- default false + -- use transparent background + transparent_bg = true, -- default false + -- set custom lualine background color + lualine_bg_color = "#44475a", -- default nil + -- set italic comment + italic_comment = true, -- default false + -- overrides the default highlights with table see `:h synIDattr` + overrides = {}, + -- You can use overrides as table like this + -- overrides = { + -- NonText = { fg = "white" }, -- set NonText fg to white + -- NvimTreeIndentMarker = { link = "NonText" }, -- link to NonText highlight + -- Nothing = {} -- clear highlight of Nothing + -- }, + -- Or you can also use it like a function to get color from theme + -- overrides = function (colors) + -- return { + -- NonText = { fg = colors.white }, -- set NonText fg to white of theme + -- } + -- end, + }) + end, + }, + { + "neanias/everforest-nvim", + priority = 1000, -- make sure to load this before all the other start plugins + -- Optional; default configuration will be used if setup isn't called. + config = function() + require("everforest").setup({ + ---Controls the "hardness" of the background. Options are "soft", "medium" or "hard". + ---Default is "medium". + background = "hard", + ---How much of the background should be transparent. 2 will have more UI + ---components be transparent (e.g. status line background) + transparent_background_level = 2, + ---Whether italics should be used for keywords and more. + italics = false, + ---Disable italic fonts for comments. Comments are in italics by default, set + ---this to `true` to make them _not_ italic! + disable_italic_comments = false, + ---By default, the colour of the sign column background is the same as the as normal text + ---background, but you can use a grey background by setting this to `"grey"`. + sign_column_background = "none", + ---The contrast of line numbers, indent lines, etc. Options are `"high"` or + ---`"low"` (default). + ui_contrast = "low", + ---Dim inactive windows. Only works in Neovim. Can look a bit weird with Telescope. + --- + ---When this option is used in conjunction with show_eob set to `false`, the + ---end of the buffer will only be hidden inside the active window. Inside + ---inactive windows, the end of buffer filler characters will be visible in + ---dimmed symbols. This is due to the way Vim and Neovim handle `EndOfBuffer`. + dim_inactive_windows = false, + ---Some plugins support highlighting error/warning/info/hint texts, by + ---default these texts are only underlined, but you can use this option to + ---also highlight the background of them. + diagnostic_text_highlight = false, + ---Which colour the diagnostic text should be. Options are `"grey"` or `"coloured"` (default) + diagnostic_virtual_text = "coloured", + ---Some plugins support highlighting error/warning/info/hint lines, but this + ---feature is disabled by default in this colour scheme. + diagnostic_line_highlight = false, + ---By default, this color scheme won't colour the foreground of |spell|, instead + ---colored under curls will be used. If you also want to colour the foreground, + ---set this option to `true`. + spell_foreground = false, + ---Whether to show the EndOfBuffer highlight. + show_eob = true, + ---Style used to make floating windows stand out from other windows. `"bright"` + ---makes the background of these windows lighter than |hl-Normal|, whereas + ---`"dim"` makes it darker. + --- + ---Floating windows include for instance diagnostic pop-ups, scrollable + ---documentation windows from completion engines, overlay windows from + ---installers, etc. + --- + ---NB: This is only significant for dark backgrounds as the light palettes + ---have the same colour for both values in the switch. + float_style = "bright", + ---Inlay hints are special markers that are displayed inline with the code to + ---provide you with additional information. You can use this option to customize + ---the background color of inlay hints. + --- + ---Options are `"none"` or `"dimmed"`. + inlay_hints_background = "none", + ---You can override specific highlights to use other groups or a hex colour. + ---This function will be called with the highlights and colour palette tables. + ---@param highlight_groups Highlights + ---@param palette Palette + on_highlights = function(highlight_groups, palette) end, + ---You can override colours in the palette to use different hex colours. + ---This function will be called once the base and background colours have + ---been mixed on the palette. + ---@param palette Palette + colours_override = function(palette) end, + }) + end, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/comment.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/comment.lua new file mode 100644 index 0000000..eb93c01 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/comment.lua @@ -0,0 +1,8 @@ +return { + "numToStr/Comment.nvim", + lazy = false, + opts = {}, + config = function() + require("Comment").setup() + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/compiler.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/compiler.lua new file mode 100644 index 0000000..9dad4f8 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/compiler.lua @@ -0,0 +1,53 @@ +return { + { -- This plugin + "Zeioth/compiler.nvim", + cmd = { "CompilerOpen", "CompilerToggleResults", "CompilerRedo" }, + dependencies = { "stevearc/overseer.nvim", "nvim-telescope/telescope.nvim" }, + opts = {}, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "r", group = "Compiler/Refactoring" }, + }) + end, + keys = { + -- Open compiler + vim.api.nvim_set_keymap( + "n", + "ro", + "CompilerOpen", + { noremap = true, silent = true, desc = "Open compiler" } + ), + + -- Redo last selected option + vim.api.nvim_set_keymap( + "n", + "re", + "CompilerStop" -- (Optional, to dispose all tasks before redo) + .. "CompilerRedo", + { noremap = true, silent = true, desc = "Recompile" } + ), + -- Toggle compiler results + vim.api.nvim_set_keymap( + "n", + "rt", + "CompilerToggleResults", + { noremap = true, silent = true, desc = "Toggle compiler" } + ), + }, + }, + { -- The task runner we use + "stevearc/overseer.nvim", + commit = "6271cab7ccc4ca840faa93f54440ffae3a3918bd", + cmd = { "CompilerOpen", "CompilerToggleResults", "CompilerRedo" }, + opts = { + task_list = { + direction = "bottom", + min_height = 25, + max_height = 25, + default_detail = 1, + }, + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/context.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/context.lua new file mode 100644 index 0000000..e2d8d2b --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/context.lua @@ -0,0 +1,25 @@ +return { + "nvim-treesitter/nvim-treesitter-context", + cmd = { "TSContextEnable", "TSContextDisable", "TSContextToggle" }, + config = function() + require("treesitter-context").setup({ + enable = false, -- Enable this plugin (Can be enabled/disabled later via commands) + max_lines = 3, -- How many lines the window should span. Values <= 0 mean no limit. + min_window_height = 1, -- Minimum editor window height to enable context. Values <= 0 mean no limit. + line_numbers = true, + multiline_threshold = 20, -- Maximum number of lines to show for a single context + trim_scope = "outer", -- Which context lines to discard if `max_lines` is exceeded. Choices: 'inner', 'outer' + mode = "cursor", -- Line used to calculate context. Choices: 'cursor', 'topline' + -- Separator between context and content. Should be a single character string, like '-'. + -- When separator is set, the context will only show up when there are at least 2 lines above cursorline. + separator = nil, + zindex = 20, -- The Z-index of the context window + on_attach = nil, -- (fun(buf: integer): boolean) return false to disable attaching + }) + + vim.keymap.set("n", "[t", function() + require("treesitter-context").go_to_context(vim.v.count1) + end, { silent = true, desc = "Go to context" }) + vim.keymap.set({ "n", "v" }, "zc", "TSContextToggle", { desc = "Toggle context" }) + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/csv.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/csv.lua new file mode 100644 index 0000000..bcf0239 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/csv.lua @@ -0,0 +1,55 @@ +return { + { + "hat0uma/csvview.nvim", + cmd = { "CsvViewEnable", "CsvViewDisable", "CsvViewToggle" }, + event = { "BufReadPre *.csv" }, -- Lazy-load the plugin when a CSV file is about to be read + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v", "x" }, + { "cs", group = "csv" }, + }) + end, + config = function() + require("csvview").setup() + + vim.api.nvim_create_autocmd("BufRead", { + pattern = "*.csv", + callback = function() + vim.cmd("CsvViewEnable") + end, + }) + + vim.api.nvim_create_autocmd("FileType", { + pattern = "csv", + callback = function() + vim.keymap.set( + "n", + "zv", + "CsvViewToggle", + { desc = "Toggle CSV view", buffer = true } + ) + end, + }) + end, + keys = { + { + "csv", + function() + local delimiter = vim.fn.input("Delimiter (e.g., ,): ") + local quote_char = vim.fn.input("Quote char (e.g., '): ") + local comment = vim.fn.input("Comment char (e.g., #): ") + local command = string.format( + ":CsvViewToggle delimiter=%s quote_char=%s comment=%s", + delimiter, + quote_char, + comment + ) + + vim.cmd(command) + end, + desc = "Toggle CSV view", + }, + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/dadbod.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/dadbod.lua new file mode 100644 index 0000000..7d4fb9e --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/dadbod.lua @@ -0,0 +1,56 @@ +return { + "kristijanhusak/vim-dadbod-ui", + dependencies = { + { "tpope/vim-dadbod", lazy = true }, + { "kristijanhusak/vim-dadbod-completion", ft = { "sql", "mysql", "plsql" }, lazy = true }, + }, + cmd = { + "DBUI", + "DBUIToggle", + "DBUIAddConnection", + "DBUIFindBuffer", + }, + init = function() + -- Your DBUI configuration + local home = vim.fn.expand("~") + vim.g.db_ui_use_nerd_fonts = 1 + vim.g.dbs = { + -- firefox = "sqlite://" .. home .. "/.mozilla/firefox/si.default/places.sqlite", + -- librewolf = "sqlite://" .. home .. "/.librewolf/si.default/places.sqlite", + mysql = "mariadb://ms:password@localhost:5432/mysql", + postsql = "postgresql://ps:password@localhost:5432/postgresql", + dts = "postgresql://dts:dujinDTS2@localhost:5432/evcp", + dts_aws = "postgresql://dts:dujinDTS2@127.0.0.1:15432/evcp", + -- qutebrowser = "sqlite://" .. home .. "/.local/share/qutebrowser/history.sqlite", + -- sqlite = "sqlite://" .. home .. "/.local/share/db/sqlite.db", + } + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "d", group = "DB" }, + }) + end, + config = function() + local function db_completion() + require("cmp").setup.buffer({ sources = { { name = "vim-dadbod-completion" } } }) + end + vim.api.nvim_create_autocmd("FileType", { + pattern = { + "sql", + "mysql", + "plsql", + }, + callback = function() + vim.schedule(db_completion) + end, + }) + end, + keys = { + { "du", "DBUI", desc = "DB UI" }, + { "dt", "DBUIToggle", desc = "Toggle DB UI" }, + { "da", "DBUIAddConnection", desc = "Add connection" }, + { "df", "DBUIFindBuffer", desc = "Find buffer" }, + { "dr", "DBUIRenameBuffer", desc = "Rename buffer" }, + { "di", "DBUILastQueryInfo", desc = "Last query info" }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/dap.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/dap.lua new file mode 100644 index 0000000..6a4118a --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/dap.lua @@ -0,0 +1,337 @@ +local function get_args(config) + local args = type(config.args) == "function" and (config.args() or {}) or config.args or {} + config = vim.deepcopy(config) + ---@cast args string[] + config.args = function() + local new_args = vim.fn.input("Run with args: ", table.concat(args, " ")) --[[@as string]] + return vim.split(vim.fn.expand(new_args) --[[@as string]], " ") + end + return config +end + +return { + { + "mfussenegger/nvim-dap", + recommended = true, + desc = "Debugging support. Requires language specific adapters to be configured. (see lang extras)", + dependencies = { + "rcarriga/nvim-dap-ui", + -- virtual text for the debugger + { + "theHamsta/nvim-dap-virtual-text", + opts = {}, + }, + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "db", group = "Debug" }, + { "dB", group = "Debug (Python)" }, + }) + end, + config = function() + -- load mason-nvim-dap here, after all adapters have been setup + vim.api.nvim_set_hl(0, "DapStoppedLine", { default = true, link = "Visual" }) + + local dap = require("dap") + + dap.adapters["pwa-node"] = { + type = "server", + host = "localhost", + port = "${port}", + executable = { + command = "node", + -- 💀 Make sure to update this path to point to your installation + args = { + vim.fn.stdpath("data") .. "/mason/packages/js-debug-adapter/js-debug/src/dapDebugServer.js", + "${port}", + }, + }, + } + + dap.configurations.java = { + { + type = "java", + request = "attach", + name = "Debug (Attach) - Remote", + hostName = "127.0.0.1", + port = 5005, + }, + } + + for _, language in ipairs({ "javascript", "typescript" }) do + dap.configurations[language] = { + { + type = "pwa-node", + request = "launch", + name = "Launch file", + program = "${file}", + cwd = "${workspaceFolder}", + }, + } + end + + local dap_icons = { + Stopped = { "󰁕 ", "DiagnosticWarn", "DapStoppedLine" }, + Breakpoint = " ", + BreakpointCondition = " ", + BreakpointRejected = { " ", "DiagnosticError" }, + LogPoint = ".>", + } + + for name, sign in pairs(dap_icons) do + sign = type(sign) == "table" and sign or { sign } + vim.fn.sign_define( + "Dap" .. name, + { text = sign[1], texthl = sign[2] or "DiagnosticInfo", linehl = sign[3], numhl = sign[3] } + ) + end + + -- setup dap config by VsCode launch.json file + 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)) + end + end, + keys = { + { + "dbB", + function() + require("dap").set_breakpoint(vim.fn.input("Breakpoint condition: ")) + end, + desc = "Dap breakpoint condition", + }, + { + "dbb", + function() + require("dap").toggle_breakpoint() + end, + desc = "Dap toggle breakpoint", + }, + { + "dbc", + function() + require("dap").continue() + end, + desc = "Dap continue", + }, + { + "dba", + function() + require("dap").continue({ before = get_args }) + end, + desc = "Dap run with args", + }, + { + "dbC", + function() + require("dap").run_to_cursor() + end, + desc = "Dap run to cursor", + }, + { + "dbg", + function() + require("dap").goto_() + end, + desc = "Dap go to line (no execute)", + }, + { + "dbi", + function() + require("dap").step_into() + end, + desc = "Dap step into", + }, + { + "dbj", + function() + require("dap").down() + end, + desc = "Dap down", + }, + { + "dbk", + function() + require("dap").up() + end, + desc = "Dap up", + }, + { + "dbl", + function() + require("dap").run_last() + end, + desc = "Dap run last", + }, + { + "dbo", + function() + require("dap").step_out() + end, + desc = "Dap step out", + }, + { + "dbO", + function() + require("dap").step_over() + end, + desc = "Dap step over", + }, + { + "dbp", + function() + require("dap").pause() + end, + desc = "Dap pause", + }, + { + "dbr", + function() + require("dap").repl.toggle() + end, + desc = "Dap toggle repl", + }, + { + "dbs", + function() + require("dap").session() + end, + desc = "Dap session", + }, + { + "dbt", + function() + require("dap").terminate() + end, + desc = "Dap terminate", + }, + { + "dbw", + function() + require("dap.ui.widgets").hover() + end, + desc = "Dap widgets", + }, + { + "dbR", + "lua require('dapui').open({ reset = true })", + desc = "Dap UI reset", + }, + }, + }, + { + "mfussenegger/nvim-dap-python", + ft = "python", + dependencies = { "mfussenegger/nvim-dap", "rcarriga/nvim-dap-ui" }, + config = function() + local path = "~/.local/share/nvim/mason/packages/debugpy/venv/bin/python" + require("dap-python").setup(path) + end, + keys = { + { + "dBt", + function() + require("dap-python").test_method() + end, + desc = "Dap debug method", + ft = "python", + }, + { + "dBc", + function() + require("dap-python").test_class() + end, + desc = "Dap debug class", + ft = "python", + }, + }, + }, + { + "rcarriga/nvim-dap-ui", + dependencies = { "mfussenegger/nvim-dap", "nvim-neotest/nvim-nio" }, + config = function() + local dap = require("dap") + local dapui = require("dapui") + dapui.setup({ + icons = { expanded = "▾", collapsed = "▸", current_frame = "*" }, + controls = { + icons = { + pause = "⏸", + play = "▶", + step_into = "⏎", + step_over = "⏭", + step_out = "⏮", + step_back = "b", + run_last = "▶▶", + terminate = "⏹", + disconnect = "⏏", + }, + }, + }) + + 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 + + dap.listeners.after.event_initialized["dapui_config"] = function() + dapui.open() + end + dap.listeners.after.event_terminated["dapui_config"] = function() + dapui.close() + end + dap.listeners.after.event_exited["dapui_config"] = function() + dapui.close() + end + end, + keys = { + { + "dbu", + function() + require("dapui").toggle() + end, + desc = "Dap UI", + }, + { + "dbe", + function() + require("dapui").eval() + end, + desc = "Dap eval", + }, + }, + }, + { + "jay-babu/mason-nvim-dap.nvim", + dependencies = "mason.nvim", + cmd = { "DapInstall", "DapUninstall" }, + opts = { + -- Makes a best effort to setup the various debuggers with + -- reasonable debug configurations + automatic_installation = true, + + -- You can provide additional configuration to the handlers, + -- see mason-nvim-dap README for more information + handlers = {}, + + -- You'll need to check that you have the required things installed + -- online, please don't ask me how to install them :) + ensure_installed = { + -- Update this to ensure that you have the debuggers for the langs you want + }, + }, + -- mason-nvim-dap is loaded when nvim-dap loads + config = function() end, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/docker.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/docker.lua new file mode 100644 index 0000000..3244fc9 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/docker.lua @@ -0,0 +1,251 @@ +return { + "https://codeberg.org/esensar/nvim-dev-container", + dependencies = "nvim-treesitter/nvim-treesitter", + config = function() + vim.api.nvim_create_autocmd("User", { + pattern = "DevcontainerBuildProgress", + callback = function() + vim.cmd("redrawstatus") + end, + }) + require("devcontainer").setup({ + config_search_start = function() + if vim.g.devcontainer_selected_config == nil or vim.g.devcontainer_selected_config == "" then + local candidates = vim.split( + vim.fn.glob(vim.loop.cwd() .. "/.devcontainer/**/devcontainer.json"), + "\n", + { trimempty = true } + ) + if #candidates < 2 then + vim.g.devcontainer_selected_config = vim.loop.cwd() + else + local choices = { "Select devcontainer config file to use:" } + for idx, candidate in ipairs(candidates) do + table.insert(choices, idx .. ". - " .. candidate) + end + local choice_idx = vim.fn.inputlist(choices) + if choice_idx > #candidates then + choice_idx = 1 + end + vim.g.devcontainer_selected_config = + string.gsub(candidates[choice_idx], "/devcontainer.json", "") + end + end + return vim.g.devcontainer_selected_config + end, + workspace_folder_provider = function() + -- By default this function uses first workspace folder for integrated lsp if available and vim.loop.cwd() as a fallback + -- This is used to replace `${localWorkspaceFolder}` in devcontainer.json + -- Also used for creating default .devcontainer.json file + local bufdir = vim.fn.expand("%:p:h") + if bufdir ~= nil and bufdir ~= "" then + return bufdir + end + return vim.loop.cwd() or vim.fn.getcwd() or "." + end, + -- terminal_handler = function(command) + -- -- By default this function creates a terminal in a new tab using :terminal command + -- -- It also removes statusline when that tab is active, to prevent double statusline + -- -- It can be overridden to provide custom terminal handling + -- end, + -- nvim_installation_commands_provider = function(path_binaries, version_string) + -- -- Returns table - list of commands to run when adding neovim to container + -- -- Each command can either be a string or a table (list of command parts) + -- -- Takes binaries available in path on current container and version_string passed to the command or current version of neovim + -- end, + -- devcontainer_json_template = function() + -- -- Returns table - list of lines to set when creating new devcontainer.json files + -- -- As a template + -- -- Used only when using functions from commands module or created commands + -- end, + -- Can be set to false to prevent generating default commands + -- Default commands are listed below + generate_commands = true, + -- By default no autocommands are generated + -- This option can be used to configure automatic starting and cleaning of containers + autocommands = { + -- can be set to true to automatically start containers when devcontainer.json is available + init = false, + -- can be set to true to automatically remove any started containers and any built images when exiting vim + clean = false, + -- can be set to true to automatically restart containers when devcontainer.json file is updated + update = false, + }, + -- can be changed to increase or decrease logging from library + log_level = "info", + -- can be set to true to disable recursive search + -- in that case only .devcontainer.json and .devcontainer/devcontainer.json files will be checked relative + -- to the directory provided by config_search_start + disable_recursive_config_search = false, + -- can be set to false to disable image caching when adding neovim + -- by default it is set to true to make attaching to containers faster after first time + cache_images = true, + -- By default all mounts are added (config, data and state) + -- This can be changed to disable mounts or change their options + -- This can be useful to mount local configuration + -- And any other mounts when attaching to containers with this plugin + attach_mounts = { + neovim_config = { + -- enables mounting local config to /root/.config/nvim in container + enabled = true, + -- makes mount readonly in container + options = { "readonly" }, + }, + neovim_data = { + -- enables mounting local data to /root/.local/share/nvim in container + enabled = false, + -- no options by default + options = {}, + }, + -- Only useful if using neovim 0.8.0+ + neovim_state = { + -- enables mounting local state to /root/.local/state/nvim in container + enabled = false, + -- no options by default + options = {}, + }, + }, + -- This takes a list of mounts (strings) that should always be added to every run container + -- This is passed directly as --mount option to docker command + -- Or multiple --mount options if there are multiple values + always_mount = {}, + -- This takes a string (usually either "podman" or "docker") representing container runtime - "devcontainer-cli" is also partially supported + -- That is the command that will be invoked for container operations + -- If it is nil, plugin will use whatever is available (trying "podman" first) + container_runtime = "docker", + -- Similar to container runtime, but will be used if main runtime does not support an action - useful for "devcontainer-cli" + backup_runtime = nil, + -- This takes a string (usually either "podman-compose" or "docker-compose") representing compose command - "devcontainer-cli" is also partially supported + -- That is the command that will be invoked for compose operations + -- If it is nil, plugin will use whatever is available (trying "podman-compose" first) + compose_command = "docker-compose", + -- Similar to compose command, but will be used if main command does not support an action - useful for "devcontainer-cli" + backup_compose_command = nil, + }) + end, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "d", group = "Docker" }, + { "db", group = "Build (docker)" }, + { "dc", group = "Compose (docker)" }, + { "do", group = "Open (docker)" }, + { "dr", group = "Run (docker)" }, + }) + end, + keys = { + { + "dcu", + function() + require("devcontainer.commands").compose_up() + end, + desc = "Compose up (docker)", + }, + { + "dcd", + function() + require("devcontainer.commands").compose_down() + end, + desc = "Compose down (docker)", + }, + { + "dcD", + function() + require("devcontainer.commands").compose_rm() + end, + desc = "Compose remove (docker)", + }, + { + "dbb", + function() + require("devcontainer.commands").docker_build() + end, + desc = "Build (docker)", + }, + { + "dri", + function() + require("devcontainer.commands").docker_image_run() + end, + desc = "Image run (docker)", + }, + { + "dbr", + function() + require("devcontainer.commands").docker_build_and_run() + end, + desc = "Build & run (docker)", + }, + { + "dba", + function() + require("devcontainer.commands").docker_build_run_and_attach() + end, + desc = "Build & attach (docker)", + }, + { + "ds", + function() + require("devcontainer.commands").start_auto() + end, + desc = "Start (docker)", + }, + { + "da", + function() + require("devcontainer.commands").attach_auto() + end, + desc = "Attach (docker)", + }, + { + "drr", + function() + require("devcontainer.commands").exec("devcontainer", "ls", { on_success = function(result) end }) + end, + desc = "Execute (docker)", + }, + { + "dx", + function() + require("devcontainer.commands").stop_auto() + end, + desc = "Stop (docker)", + }, + { + "dX", + function() + require("devcontainer.commands").stop_all() + end, + desc = "Stop all (docker)", + }, + { + "dD", + function() + require("devcontainer.commands").remove_all() + end, + desc = "Remove all (docker)", + }, + { + "dol", + function() + require("devcontainer.commands").open_logs() + end, + desc = "Open logs (docker)", + }, + { + "doc", + function() + require("devcontainer.commands").open_nearest_devcontainer_config() + end, + desc = "Open nearest config (docker)", + }, + { + "de", + function() + require("devcontainer.commands").edit_devcontainer_config() + end, + desc = "Edit nearest config (docker)", + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/git.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/git.lua new file mode 100644 index 0000000..cc8b747 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/git.lua @@ -0,0 +1,229 @@ +return { + { + "moyiz/git-dev.nvim", + event = "VeryLazy", + opts = {}, + config = function() + require("git-dev").setup() + + local function copy_git_repo_url() + -- Get the Git repository root + local git_root = vim.fn.system("git rev-parse --show-toplevel"):gsub("\n", "") + if git_root == "" then + vim.notify("Not inside a Git repository", vim.log.levels.WARN) + return nil + end + + -- Get the remote URL + local remote_url = vim.fn.system("git config --get remote.origin.url"):gsub("\n", "") + if remote_url == "" then + vim.notify("No remote URL found", vim.log.levels.WARN) + return nil + end + + -- Convert SSH URL to HTTPS if needed + if remote_url:match("^git@") then + remote_url = remote_url:gsub("git@", "https://"):gsub(":", "/") + end + + -- Remove `.git` from the remote URL + remote_url = remote_url:gsub("%.git$", "") + + -- Get the relative path of the current file + local file_path = vim.fn.expand("%:~:.") + if file_path == "" then + vim.notify("No file currently open", vim.log.levels.WARN) + return nil + end + + -- Get the relative path to the repository root + local relative_path = + vim.fn.system("git ls-files --full-name " .. vim.fn.shellescape(file_path)):gsub("\n", "") + + -- Combine the remote URL with the relative file path + local full_url = remote_url .. "/" .. relative_path + + -- Copy to clipboard + vim.fn.setreg("+", full_url) + vim.notify("Copied to clipboard: " .. full_url, vim.log.levels.INFO) + + return full_url + end + + -- Keybinding to copy the Git repository URL + vim.keymap.set("n", "cg", function() + copy_git_repo_url() + end, { desc = "Copy git repository URL to clipboard" }) + + -- Function to open a repository from the clipboard + vim.keymap.set("n", "eg", function() + local url = vim.fn.getreg("+") -- Get URL from clipboard + if not url or url == "" then + vim.notify("Clipboard is empty. Copy a valid URL first.", vim.log.levels.WARN) + return + end + if url:match("^https://") then + require("git-dev").open(url) + else + vim.notify("Not a valid URL: " .. url, vim.log.levels.ERROR) + end + end, { desc = "Open Git repository from clipboard" }) + end, + }, + { + "lewis6991/gitsigns.nvim", + opts = { + signs = { + add = { text = "▎" }, + change = { text = "▎" }, + delete = { text = "" }, + topdelete = { text = "" }, + changedelete = { text = "▎" }, + untracked = { text = "▎" }, + }, + signs_staged = { + add = { text = "▎" }, + change = { text = "▎" }, + delete = { text = "" }, + topdelete = { text = "" }, + changedelete = { text = "▎" }, + }, + on_attach = function(buffer) + local gs = package.loaded.gitsigns + + local function map(mode, l, r, desc) + vim.keymap.set(mode, l, r, { buffer = buffer, desc = desc }) + end + + -- stylua: ignore start + map("n", "]h", function() + if vim.wo.diff then + vim.cmd.normal({ "]c", bang = true }) + else + gs.nav_hunk("next") + end + end, "Next hunk") + map("n", "[h", function() + if vim.wo.diff then + vim.cmd.normal({ "[c", bang = true }) + else + gs.nav_hunk("prev") + end + end, "Previous hunk") + map("n", "]H", function() gs.nav_hunk("last") end, "Last hunk") + map("n", "[H", function() gs.nav_hunk("first") end, "First hunk") + map("n", "gs", gs.stage_hunk, "Stage hunk") + map("v", "gs", function() gs.stage_hunk({ vim.fn.line('.'), vim.fn.line('v')}) end, "Stage hunk") + map("n", "gr", gs.reset_hunk, "Reset hunk") + map("v", "gr", function() gs.reset_hunk({ vim.fn.line('.'), vim.fn.line('v')}) end, "Reset hunk") + map("n", "gS", gs.stage_buffer, "Stage buffer") + map("n", "gu", gs.undo_stage_hunk, "Undo stage hunk") + map("n", "gR", gs.reset_buffer, "Reset buffer") + map("n", "gpv", gs.preview_hunk_inline, "Preview hunk inline") + map("n", "gb", function() gs.blame_line({ full = true }) end, "Blame line") + map("n", "gB", function() gs.blame() end, "Blame buffer") + map("n", "gd", gs.diffthis, "Diff this") + map("n", "gD", function() gs.diffthis("~") end, "Diff this ~") + map({ "o", "x" }, "ih", ":Gitsigns select_hunk", "Select hunk") + map("n", "gtb", gs.toggle_current_line_blame, "Toggle line blame") + map("n", "gtd", gs.toggle_deleted, "Toggle delete") + end, + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v", "x" }, + { "g", group = "Git" }, + { "gt", group = "Toggle" }, + }) + end, + }, + { + "kdheepak/lazygit.nvim", + cmd = { + "LazyGit", + "LazyGitConfig", + "LazyGitCurrentFile", + "LazyGitFilter", + "LazyGitFilterCurrentFile", + }, + -- optional for floating window border decoration + dependencies = { + "nvim-lua/plenary.nvim", + }, + -- setting the keybinding for LazyGit with 'keys' is recommended in + -- order to load the plugin when the command is run for the first time + keys = { + { "gg", "LazyGit", desc = "Lazygit" }, + }, + }, + { + "mbbill/undotree", + config = function() + vim.keymap.set("n", "gu", vim.cmd.UndotreeToggle, { desc = "Undo tree" }) + end, + }, + { + "tpope/vim-fugitive", + config = function() + local TheSiahxyz_Fugitive = vim.api.nvim_create_augroup("TheSiahxyz_Fugitive", {}) + local autocmd = vim.api.nvim_create_autocmd + autocmd("BufWinEnter", { + group = TheSiahxyz_Fugitive, + pattern = "*", + callback = function() + if vim.bo.ft ~= "fugitive" then + return + end + + local bufnr = vim.api.nvim_get_current_buf() + vim.keymap.set("n", "P", function() + vim.cmd.Git("push") + end, { buffer = bufnr, remap = false, desc = "Git push" }) + vim.keymap.set("n", "p", function() + vim.cmd.Git({ "pull", "--rebase" }) + end, { buffer = bufnr, remap = false, desc = "Git pull" }) + vim.keymap.set( + "n", + "o", + ":Git push -u origin ", + { buffer = bufnr, remap = false, desc = "Git push origin" } + ) + vim.keymap.set( + "n", + "h", + ":Git push home ", + { buffer = bufnr, remap = false, desc = "Git push home" } + ) + end, + }) + autocmd("FileType", { + group = TheSiahxyz_Fugitive, + pattern = "fugitive", + callback = function(event) + vim.bo[event.buf].buflisted = false + vim.keymap.set("n", "q", "close", { buffer = event.buf, silent = true }) + end, + }) + end, + keys = { + { mode = "n", "g", ":Git ", desc = "Git" }, + { mode = "n", "gf", vim.cmd.Git, desc = "Git fugitive" }, + { mode = "n", "gm", "diffget //2", desc = "Git diff on my side" }, + { mode = "n", "go", "diffget //3", desc = "Git diff on their side" }, + }, + }, + { + "pwntester/octo.nvim", + requires = { + "nvim-lua/plenary.nvim", + "nvim-telescope/telescope.nvim", + -- OR 'ibhagwan/fzf-lua', + -- OR 'folke/snacks.nvim', + "nvim-tree/nvim-web-devicons", + }, + config = function() + require("octo").setup() + end, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/goyo.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/goyo.lua new file mode 100644 index 0000000..86b9a03 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/goyo.lua @@ -0,0 +1,39 @@ +return { + "junegunn/goyo.vim", + dependencies = "junegunn/seoul256.vim", + config = function() + -- Enable Goyo by default for mutt writing + vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, { + group = vim.api.nvim_create_augroup("TheSiahxyz_goyo_config", { clear = true }), + pattern = "/tmp/neomutt*", + callback = function() + vim.g.goyo_width = 80 + vim.g.seoul256_background = 235 + vim.cmd([[ + Goyo + set bg=light + set linebreak + set wrap + set textwidth=0 + set wrapmargin=0 + set background=dark + colorscheme seoul256 + ]]) + vim.api.nvim_buf_set_keymap( + 0, + "n", + "gd", + ":Goyo|x!", + { noremap = true, silent = true, desc = "Goyo quit" } + ) + vim.api.nvim_buf_set_keymap( + 0, + "n", + "gq", + ":Goyo|q!", + { noremap = true, silent = true, desc = "Goyo abort" } + ) + end, + }) + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/grug-far.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/grug-far.lua new file mode 100644 index 0000000..ca0de7d --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/grug-far.lua @@ -0,0 +1,31 @@ +return { + "MagicDuck/grug-far.nvim", + --- Ensure existing keymaps and opts remain unaffected + config = function(_, opts) + require("grug-far").setup(opts) + vim.api.nvim_create_autocmd("FileType", { + pattern = "grug-far", + callback = function() + -- Map to quit after ensuring we're in normal mode + vim.keymap.set({ "i", "n" }, "", "stopinsert | bd!", { buffer = true }) + end, + }) + end, + keys = { + { + "rc", + function() + local grug = require("grug-far") + local ext = vim.bo.buftype == "" and vim.fn.expand("%:e") + grug.open({ + transient = true, + prefills = { + filesFilter = ext and ext ~= "" and "*." .. ext or nil, + }, + }) + end, + mode = { "n", "v" }, + desc = "Search and Replace", + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/harpoon2.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/harpoon2.lua new file mode 100644 index 0000000..1db778f --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/harpoon2.lua @@ -0,0 +1,124 @@ +return { + "ThePrimeagen/harpoon", + branch = "harpoon2", + opts = { + menu = { + width = vim.api.nvim_win_get_width(0) - 4, + }, + settings = { + save_on_toggle = true, + sync_on_ui_close = false, -- save over session + key = function() -- define how to identify list + return vim.loop.cwd() + end, + }, + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "h", group = "Harpoon" }, + { "hr", group = "Replace harpoon slot" }, + { "", group = "Harpoon list delete" }, + }) + end, + config = function(_, opts) + local harpoon = require("harpoon") + local extensions = require("harpoon.extensions") + + -- Apply the base configuration + harpoon.setup(opts) + + -- Extend functionality + harpoon:extend({ + UI_CREATE = function(cx) + vim.keymap.set("n", "", function() + harpoon.ui:select_menu_item({ vsplit = true }) + end, { buffer = cx.bufnr }) + + vim.keymap.set("n", "", function() + harpoon.ui:select_menu_item({ split = true }) + end, { buffer = cx.bufnr }) + + vim.keymap.set("n", "", function() + harpoon.ui:select_menu_item({ tabedit = true }) + end, { buffer = cx.bufnr }) + end, + }) + + -- Highlight current file + harpoon:extend(extensions.builtins.highlight_current_file()) + harpoon:extend(extensions.builtins.navigate_with_number()) + end, + keys = function() + local keys = { + { + "ha", + function() + require("harpoon"):list():add() + end, + mode = { "n", "i", "v", "x" }, + desc = "Add buffer to harpoon list", + }, + { + "ht", + function() + require("harpoon"):list():prepend() + end, + mode = { "n", "i", "v", "x" }, + desc = "Prepend buffer to harpoon list", + }, + { + "", + function() + local harpoon = require("harpoon") + harpoon.ui:toggle_quick_menu(harpoon:list()) + end, + mode = { "n", "i" }, + desc = "Open harpoon list menu", + }, + { + "", + function() + require("harpoon"):list():prev({ ui_nav_wrap = false }) + end, + mode = { "n", "i", "v", "x" }, + desc = "Previous harpoon list", + }, + { + "", + function() + require("harpoon"):list():next({ ui_nav_wrap = false }) + end, + mode = { "n", "i", "v", "x" }, + desc = "Next harpoon list", + }, + } + + for i = 0, 9 do + table.insert(keys, { + "", + function() + require("harpoon"):list():select(i) + end, + desc = "Harpoon list " .. i, + }) + table.insert(keys, { + "h" .. i, + function() + require("harpoon"):list():select(i) + end, + desc = "Harpoon list " .. i, + }) + table.insert(keys, { + "hr" .. i, + function() + require("harpoon"):list():replace_at(i) + end, + desc = "Replace buffer at harpoon slot " .. i, + }) + end + + return keys + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/image.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/image.lua new file mode 100644 index 0000000..a4f126f --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/image.lua @@ -0,0 +1,210 @@ +return { + "HakonHarnes/img-clip.nvim", + event = "VeryLazy", + opts = { + -- add options here + -- or leave it empty to use the default settings + }, + config = function(_, opts) + require("img-clip").setup(opts) + + vim.keymap.set({ "n", "v", "i" }, "", function() + local pasted_image = require("img-clip").paste_image() + if pasted_image then + -- "Update" saves only if the buffer has been modified since the last save + vim.cmd("silent! update") + -- Get the current line + local line = vim.api.nvim_get_current_line() + -- Move cursor to end of line + vim.api.nvim_win_set_cursor(0, { vim.api.nvim_win_get_cursor(0)[1], #line }) + -- I reload the file, otherwise I cannot view the image after pasted + vim.cmd("edit!") + end + end, { desc = "Paste image from clipboard" }) + + vim.keymap.set("n", "oi", function() + local function get_image_path() + -- Get the current line + local line = vim.api.nvim_get_current_line() + -- Patterns to match image paths + local patterns = { + "%[.-%]%((.-)%)", -- Markdown style: ![alt text](image_path) + "%[%[(.-)%]%]", -- Double square brackets: [[image_path]] + } + + for _, pattern in ipairs(patterns) do + local _, _, image_path = string.find(line, pattern) + if image_path then + return image_path + end + end + + return nil -- Return nil if no pattern matches + end + + local function file_exists(filepath) + -- Check if the file exists + local f = io.open(filepath, "r") + if f then + f:close() + return true + end + return false + end + + -- Get the image path + local image_path = get_image_path() + if image_path then + -- Check if the image path starts with "http" or "https" + if string.sub(image_path, 1, 4) == "http" then + print("URL image, use 'gx' to open it in the default browser.") + else + -- Construct absolute image path + local current_file_path = vim.fn.expand("%:p:h") + local absolute_image_path = current_file_path .. "/" .. image_path + -- Check if the image exists in the current path + if not file_exists(absolute_image_path) then + -- If not found, search ../Screenshots/ + local fallback_path = vim.fn.fnamemodify(current_file_path, ":h") + .. "/Screenshots/" + .. image_path + if file_exists(fallback_path) then + absolute_image_path = fallback_path + else + print("Image not found in either current directory or ../Screenshots/") + return + end + end + -- Construct command to open image in Preview + local command = "nsxiv -aiop " .. vim.fn.shellescape(absolute_image_path) + -- Execute the command + local success = os.execute(command) + if success then + print("Opened image: " .. absolute_image_path) + else + print("Failed to open image: " .. absolute_image_path) + end + end + else + print("No image found under the cursor") + end + end, { desc = "Open image under cursor" }) + + vim.keymap.set("n", "di", function() + local function get_image_path() + local line = vim.api.nvim_get_current_line() + -- Patterns to match image paths + local patterns = { + "%[.-%]%((.-)%)", -- Markdown style: ![alt text](image_path) + "%[%[(.-)%]%]", -- Double square brackets: [[image_path]] + } + + for _, pattern in ipairs(patterns) do + local _, _, image_path = string.find(line, pattern) + if image_path then + return image_path + end + end + + return nil -- Return nil if no pattern matches + end + + local function file_exists(filepath) + local f = io.open(filepath, "r") + if f then + f:close() + return true + end + return false + end + + local image_path = get_image_path() + if image_path then + if string.sub(image_path, 1, 4) == "http" then + vim.api.nvim_echo({ { "URL image cannot be deleted from disk.", "WarningMsg" } }, false, {}) + return + end + + local current_file_path = vim.fn.expand("%:p:h") + local absolute_image_path = current_file_path .. "/" .. image_path + + -- Check if file exists + if not file_exists(absolute_image_path) then + -- Search fallback directory + local fallback_path = vim.fn.fnamemodify(current_file_path, ":h") .. "/Screenshots/" .. image_path + if file_exists(fallback_path) then + absolute_image_path = fallback_path + else + print("Image not found in either current directory or ../Screenshots/") + return + end + end + + -- Verify if trash utility exists + if vim.fn.executable("trash") == 0 then + vim.api.nvim_echo({ + { "- Trash utility not installed. Install `trash-cli`.\n", "ErrorMsg" }, + }, false, {}) + return + end + + vim.ui.select({ "yes", "no" }, { prompt = "Delete image file? " }, function(choice) + if choice == "yes" then + -- Attempt to delete using trash + local command = { "trash", absolute_image_path } + local success, err = pcall(vim.fn.system, command) + + -- Debug message for troubleshooting + print("Debug: Trash command -", table.concat(command, " ")) + + if success and vim.fn.filereadable(absolute_image_path) == 0 then + vim.api.nvim_echo({ + { "Image file deleted using trash:\n", "Normal" }, + { absolute_image_path, "Normal" }, + }, false, {}) + require("image").clear() + vim.cmd("edit!") + vim.cmd("normal! dd") + else + -- If trash fails, log the error + vim.api.nvim_echo({ + { "Trash deletion failed. Error:\n", "ErrorMsg" }, + { err or "Unknown error", "ErrorMsg" }, + }, false, {}) + end + else + vim.api.nvim_echo({ { "Image deletion canceled.", "Normal" } }, false, {}) + end + end) + else + print("No image found under the cursor") + end + end, { desc = "Delete image file under cursor" }) + + -- Refresh the images in the current buffer + -- Useful if you delete an actual image file and want to see the changes + -- without having to re-open neovim + vim.keymap.set("n", "ir", function() + -- First I clear the images + require("image").clear() + -- I'm using [[ ]] to escape the special characters in a command + -- vim.cmd([[lua require("image").clear()]]) + -- Reloads the file to reflect the changes + vim.cmd("edit!") + print("Images refreshed") + end, { desc = "Refresh images" }) + + -- Set up a keymap to clear all images in the current buffer + vim.keymap.set("n", "ic", function() + -- This is the command that clears the images + require("image").clear() + -- I'm using [[ ]] to escape the special characters in a command + -- vim.cmd([[lua require("image").clear()]]) + print("Images cleared") + end, { desc = "Clear images" }) + end, + keys = { + -- suggested keymap + { "pi", "PasteImage", desc = "Paste image from clipboard" }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/init.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/init.lua new file mode 100644 index 0000000..1a533b9 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/init.lua @@ -0,0 +1,87 @@ +return { + { "nvim-lua/plenary.nvim" }, + { + "aserowy/tmux.nvim", + config = function() + require("tmux").setup({ + copy_sync = { + -- enables copy sync. by default, all registers are synchronized. + -- to control which registers are synced, see the `sync_*` options. + enable = false, + + -- ignore specific tmux buffers e.g. buffer0 = true to ignore the + -- first buffer or named_buffer_name = true to ignore a named tmux + -- buffer with name named_buffer_name :) + ignore_buffers = { empty = false }, + + -- TMUX >= 3.2: all yanks (and deletes) will get redirected to system + -- clipboard by tmux + redirect_to_clipboard = false, + + -- offset controls where register sync starts + -- e.g. offset 2 lets registers 0 and 1 untouched + register_offset = 0, + + -- overwrites vim.g.clipboard to redirect * and + to the system + -- clipboard using tmux. If you sync your system clipboard without tmux, + -- disable this option! + sync_clipboard = true, + + -- synchronizes registers *, +, unnamed, and 0 till 9 with tmux buffers. + sync_registers = true, + + -- synchronizes registers when pressing p and P. + sync_registers_keymap_put = true, + + -- synchronizes registers when pressing (C-r) and ". + sync_registers_keymap_reg = true, + + -- syncs deletes with tmux clipboard as well, it is adviced to + -- do so. Nvim does not allow syncing registers 0 and 1 without + -- overwriting the unnamed register. Thus, ddp would not be possible. + sync_deletes = true, + + -- syncs the unnamed register with the first buffer entry from tmux. + sync_unnamed = true, + }, + navigation = { + -- cycles to opposite pane while navigating into the border + cycle_navigation = false, + + -- enables default keybindings (C-hjkl) for normal mode + enable_default_keybindings = true, + + -- prevents unzoom tmux when navigating beyond vim border + persist_zoom = true, + }, + resize = { + -- enables default keybindings (A-hjkl) for normal mode + enable_default_keybindings = false, + + -- sets resize steps for x axis + resize_step_x = 2, + + -- sets resize steps for y axis + resize_step_y = 2, + }, + }) + + vim.keymap.set("i", "", "lua require('tmux').move_left()", { desc = "Move to left" }) + vim.keymap.set("i", "", "lua require('tmux').move_right()", { desc = "Move to right" }) + vim.keymap.set("i", "", "lua require('tmux').move_bottom()", { desc = "Move to bottom" }) + vim.keymap.set("i", "", "lua require('tmux').move_top()", { desc = "Move to top" }) + vim.keymap.set("n", "", function() + require("tmux").resize_left() + end, { desc = "Decrease window width" }) + vim.keymap.set("n", "", function() + require("tmux").resize_bottom() + end, { desc = "Decrease window height" }) + vim.keymap.set("n", "", function() + require("tmux").resize_top() + end, { desc = "Increase window height" }) + vim.keymap.set("n", "", function() + require("tmux").resize_right() + end, { desc = "Increase window width" }) + end, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/keys.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/keys.lua new file mode 100644 index 0000000..0f95202 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/keys.lua @@ -0,0 +1,121 @@ +return { + { + "nvzone/showkeys", + cmd = "ShowkeysToggle", + opts = {}, + keys = { + { "zk", "ShowkeysToggle", desc = "Toggle keys" }, + }, + }, + { + "folke/which-key.nvim", + event = "VeryLazy", + cmd = "WhichKey", + dependencies = { "echasnovski/mini.icons", "nvim-tree/nvim-web-devicons" }, + opts = { + preset = "classic", -- false | "classic" | "modern" | "helix" + keys = { + scroll_down = "", + scroll_up = "", + }, + }, + config = function(_, opts) + local wk = require("which-key") + wk.setup(opts) + wk.add({ + { + mode = { "n", "v" }, + { "g", group = "Goto" }, + { "g`", group = "Marks" }, + { "g'", group = "Marks" }, + { "gr", group = "Lsp buf" }, + { "gs", group = "Search/Surround" }, + { "gx", desc = "Open with system app" }, + { "s", group = "Surround/Search & replace on line" }, + { "S", group = "Surround/Search & replace in file" }, + { "z", group = "Fold" }, + { "`", group = "Marks" }, + { "'", group = "Marks" }, + { '"', group = "Registers" }, + { "]", group = "Next" }, + { "]]", group = "Next" }, + { "[", group = "Prev" }, + { "[[", group = "Prev" }, + { "=", group = "Line paste" }, + { "", group = "Windows" }, + { "", group = "Leader" }, + { "a", group = "Ascii" }, + { + "b", + group = "Buffer", + expand = function() + return require("which-key.extras").expand.buf() + end, + }, + { "B", group = "Buffer (force)" }, + { "C", group = "Goto realpath" }, + { "d", group = "Delete" }, + { "D", group = "Delete (blackhole)" }, + { "e", group = "Explorer" }, + { "i", group = "Inspect" }, + { "l", group = "Location" }, + { "L", group = "Lazy" }, + { "M", group = "Mason" }, + { "o", group = "Open" }, + { "p", group = "Paste" }, + { "P", group = "Paste" }, + { "q", group = "Quit" }, + { "rn", group = "Rename" }, + { "sk", group = "Keys" }, + { "S", group = "Save/Source" }, + { "w", group = "Which-key" }, + { "W", group = "Save all" }, + { "z", group = "Toggle" }, + { "Z", group = "All buffer" }, + { "", group = "Tabs" }, + { "", group = "Local Leader (bookmarks)" }, + { "", group = "Bookmarks (explorer)" }, + { "", group = "Bookmarks (mini)" }, + { "t", group = "Task" }, + }, + { + mode = { "n", "v", "x" }, + { "gw", desc = "Visible in window" }, + { "g%", desc = "Match backward" }, + { "g;", desc = "Last change" }, + { "Q", group = "Quit all" }, + }, + { + mode = { "i" }, + { "", desc = "Execute one command" }, + { "", desc = "Paste from registers" }, + }, + }) + end, + keys = { + { + "?", + function() + require("which-key").show({ global = false }) + end, + desc = "Buffer local keymaps (which-key)", + }, + { + "wk", + function() + local ok, input = pcall(vim.fn.input, "WhichKey: ") + if ok and input ~= "" then + vim.cmd("WhichKey " .. input) + end + end, + desc = "Which-key query lookup", + }, + { + "wK", + "WhichKey", + mode = { "n", "v", "x" }, + desc = "Which-key all key", + }, + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/lsp.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/lsp.lua new file mode 100644 index 0000000..da49976 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/lsp.lua @@ -0,0 +1,707 @@ +return { + { + "neovim/nvim-lspconfig", + event = { "BufReadPre", "BufNewFile" }, + dependencies = { + "mason-org/mason.nvim", + "mason-org/mason-lspconfig.nvim", + "WhoIsSethDaniel/mason-tool-installer.nvim", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "hrsh7th/cmp-cmdline", + "hrsh7th/nvim-cmp", + { + "L3MON4D3/LuaSnip", + version = "v2.*", + build = "make install_jsregexp", + }, + "mfussenegger/nvim-lint", + "saadparwaiz1/cmp_luasnip", + "j-hui/fidget.nvim", + { "folke/neoconf.nvim", cmd = "Neoconf", config = false, dependencies = { "nvim-lspconfig" } }, + { + "folke/lazydev.nvim", + ft = "lua", -- only load on lua files + opts = { + library = { + -- See the configuration section for more details + -- Load luvit types when the `vim.uv` word is found + { path = "${3rd}/luv/library", words = { "vim%.uv" } }, + }, + }, + }, + "stevearc/conform.nvim", + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v", "x" }, + { "tf", group = "Format" }, + }) + end, + config = function() + local cmp = require("cmp") + local cmp_lsp = require("cmp_nvim_lsp") + local capabilities = vim.tbl_deep_extend( + "force", + {}, + vim.lsp.protocol.make_client_capabilities(), + cmp_lsp.default_capabilities() + ) + local lspconfig = require("lspconfig") + + require("fidget").setup({ + progress = { + poll_rate = false, -- How and when to poll for progress messages + suppress_on_insert = true, -- Suppress new messages while in insert mode + ignore_done_already = true, -- Ignore new tasks that are already complete + ignore_empty_message = true, -- Ignore new tasks that don't contain a message + clear_on_detach = function(client_id) -- Clear notification group when LSP server detaches + local client = vim.lsp.get_client_by_id(client_id) + return client and client.name or nil + end, + -- ignore = { "lua_ls" }, + }, + notification = { + window = { + normal_hl = "Comment", -- Base highlight group in the notification window + winblend = 0, -- Background color opacity in the notification window + border = "none", -- Border around the notification window + zindex = 45, -- Stacking priority of the notification window + max_width = 0, -- Maximum width of the notification window + max_height = 0, -- Maximum height of the notification window + x_padding = 1, -- Padding from right edge of window boundary + y_padding = 0, -- Padding from bottom edge of window boundary + align = "bottom", -- How to align the notification window + relative = "editor", -- What the notification window position is relative to + }, + }, + integration = { + ["nvim-tree"] = { + enable = false, -- Integrate with nvim-tree/nvim-tree.lua (if installed) + }, + }, + }) + + require("mason").setup({ + pip = { + use_python3_host_prog = true, + }, + }) + require("mason-lspconfig").setup({ + ensure_installed = { + "bashls", + "dockerls", + "docker_compose_language_service", + "harper_ls", + "jdtls", + "jsonls", + "lua_ls", + -- "mutt_ls", + "pyright", + "ruff", + "sqls", + "ts_ls", + }, + automatic_enable = true, + handlers = { + function(server_name) -- default handler (optional) + require("lspconfig")[server_name].setup({ + capabilities = capabilities, + }) + end, + ["bashls"] = function() + lspconfig.bashls.setup({ + capabilities = capabilities, + }) + end, + ["dockerls"] = function() + lspconfig.dockerls.setup({ + capabilities = capabilities, + -- settings = { + -- python = { + -- disableLanguageServices = false, + -- disableOrganizeImports = false, + -- }, + -- }, + }) + end, + ["docker_compose_language_service"] = function() + lspconfig.docker_compose_language_service.setup({ + capabilities = capabilities, + -- settings = { + -- python = { + -- disableLanguageServices = false, + -- disableOrganizeImports = false, + -- }, + -- }, + }) + end, + ["harper_ls"] = function() + lspconfig.harper_ls.setup({ + capabilities = capabilities, + filetypes = { "markdown", "python" }, + settings = { + ToDoHyphen = false, + -- SentenceCapitalization = true, + -- SpellCheck = true, + isolateEnglish = true, + markdown = { + -- [ignores this part]() + -- [[ also ignores my marksman links ]] + IgnoreLinkTitle = true, + }, + }, + }) + end, + ["jdtls"] = function() + lspconfig.jdtls.setup({ + capabilities = capabilities, + }) + end, + ["jsonls"] = function() + lspconfig.jsonls.setup({ + capabilities = capabilities, + settings = { + json = { + format = { + enable = true, + }, + validate = { enable = true }, + }, + }, + }) + end, + ["lua_ls"] = function() + lspconfig.lua_ls.setup({ + capabilities = capabilities, + settings = { + Lua = { + runtime = { version = "Lua 5.4" }, + diagnostics = { + globals = { "bit", "vim", "it", "describe", "before_each", "after_each" }, + }, + }, + }, + }) + end, + ["mutt_ls"] = function() + lspconfig.mutt_ls.setup({ + capabilities = capabilities, + }) + end, + ["pyright"] = function() + lspconfig.pyright.setup({ + capabilities = capabilities, + settings = { + python = { + disableLanguageServices = false, + disableOrganizeImports = false, + }, + }, + }) + end, + ["ruff"] = function() + lspconfig.ruff.setup({ + capabilities = capabilities, + -- settings = { + -- python = { + -- disableLanguageServices = false, + -- disableOrganizeImports = false, + -- }, + -- }, + }) + end, + ["sqls"] = function() + lspconfig.sqls.setup({ + capabilities = capabilities, + }) + end, + ["ts_ls"] = function() + lspconfig.ruff.setup({ + capabilities = capabilities, + }) + end, + }, + }) + + local lint = require("lint") + lint.linters_by_ft = { + dockerfile = { "hadolint" }, + javascript = { "eslint_d" }, + javascriptreact = { "eslint_d" }, + python = { "pylint" }, + sh = { "shellcheck" }, + sql = { "sqlfluff" }, + svelte = { "eslint_d" }, + typescript = { "eslint_d" }, + typescriptreact = { "eslint_d" }, + } + + local lint_augroup = vim.api.nvim_create_augroup("lint", { clear = true }) + vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave", "TextChanged" }, { + group = lint_augroup, + callback = function() + lint.try_lint() + end, + }) + + require("mason-tool-installer").setup({ + ensure_installed = { + "beautysh", -- zsh formatter + "black", -- python formatter + "debugpy", -- python debuger + "eslint_d", -- eslint linter + -- "hadolint", -- docker linter + "isort", -- python formatter + "java-debug-adapter", -- java debugger + "java-test", -- java test + "js-debug-adapter", -- javascript debugger + "markdown-toc", -- markdown toc + "prettier", -- prettier formatter + "pylint", -- python linter + "ruff", -- python formatter + "shellcheck", -- bash lint + "shfmt", -- sh formatter + "sqlfluff", -- sql linter + "sql-formatter", -- sql formatter + "stylua", -- lua formatter + }, + integrations = { + ["mason-lspconfig"] = true, + ["mason-null-ls"] = false, + ["mason-nvim-dap"] = true, + }, + }) + + local cmp_select = { behavior = cmp.SelectBehavior.Select } + local luasnip = require("luasnip") + + cmp.setup({ + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) -- For `luasnip` users. + end, + }, + mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.scroll_docs(-4), -- Up + [""] = cmp.mapping.scroll_docs(4), -- Down + [""] = cmp.mapping.select_prev_item(cmp_select), + [""] = cmp.mapping.select_next_item(cmp_select), + [""] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }), + [""] = cmp.mapping.complete(), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + }), + sources = cmp.config.sources({ + { name = "nvim_lsp" }, + { name = "luasnip" }, -- For luasnip users. + { name = "buffer" }, + }), + }) + + vim.diagnostic.config({ + update_in_insert = true, + float = { + header = "", + border = "rounded", + prefix = "", + source = "if_many", + }, + }) + + require("conform").setup({ + formatters_by_ft = { + bash = { "shfmt" }, + css = { "prettier" }, + graphql = { "prettier" }, + html = { "prettier" }, + javascript = { "prettier" }, + javascriptreact = { "prettier" }, + json = { "prettier" }, + liquid = { "prettier" }, + lua = { "stylua" }, + markdown = { "prettier" }, + python = { "ruff", "isort", "black" }, + sh = { "shfmt" }, + sql = { "sql-formatter" }, + svelte = { "prettier" }, + typescript = { "prettier" }, + typescriptreact = { "prettier" }, + vimwiki = { "prettier" }, + yaml = { "prettier" }, + zsh = { "beautysh" }, + }, + default_format_opts = {}, + format_on_save = function(bufnr) + -- Disable with a global or buffer-local variable + if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then + return + end + local ft = vim.bo[bufnr].filetype + local off = { + javascript = true, + typescript = true, + javascriptreact = true, + typescriptreact = true, + json = true, + css = true, + } + if off[ft] then + return false + end + return { lsp_fallback = true, timeout_ms = 1000, async = false } + end, + }) + + vim.api.nvim_create_user_command("FormatDisable", function(args) + if args.bang then + 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, + keys = { + { + "lf", + function() + require("conform").format({ async = true }) + end, + mode = { "n", "v" }, + desc = "Format buffer by lsp", + }, + { + "ci", + "PyrightOrganizeImports", + desc = "Organize imports", + }, + { + "bl", + function() + require("lint").try_lint() + end, + desc = "Buffer lint", + }, + { + "le", + "FormatEnable", + desc = "Enable format", + }, + { + "ld", + "FormatDisable", + desc = "Disable format", + }, + { + "lD", + "FormatDisable!", + desc = "Disable current buffer format", + }, + }, + }, + -- { + -- "neovim/nvim-lspconfig", + -- event = { "BufReadPre", "BufNewFile" }, + -- dependencies = { + -- "mason-org/mason.nvim", + -- "mason-org/mason-lspconfig.nvim", + -- "WhoIsSethDaniel/mason-tool-installer.nvim", + -- "hrsh7th/cmp-nvim-lsp", + -- "hrsh7th/cmp-buffer", + -- "hrsh7th/cmp-path", + -- "hrsh7th/cmp-cmdline", + -- { + -- "L3MON4D3/LuaSnip", + -- version = "v2.*", + -- build = "make install_jsregexp", + -- }, + -- "mfussenegger/nvim-lint", + -- "saadparwaiz1/cmp_luasnip", + -- "j-hui/fidget.nvim", + -- { "folke/neoconf.nvim", cmd = "Neoconf", config = false, dependencies = { "nvim-lspconfig" } }, + -- { + -- "folke/lazydev.nvim", + -- ft = "lua", -- only load on lua files + -- opts = { + -- library = { + -- -- See the configuration section for more details + -- -- Load luvit types when the `vim.uv` word is found + -- { path = "${3rd}/luv/library", words = { "vim%.uv" } }, + -- }, + -- }, + -- }, + -- "stevearc/conform.nvim", + -- "saghen/blink.cmp", + -- }, + -- init = function() + -- local wk = require("which-key") + -- wk.add({ + -- mode = { "n", "v", "x" }, + -- { "tf", group = "Format" }, + -- }) + -- end, + -- opts = { + -- servers = { + -- lua_ls = { + -- settings = { + -- Lua = { + -- workspace = { + -- checkThirdParty = false, + -- }, + -- codeLens = { + -- enable = true, + -- }, + -- completion = { + -- callSnippet = "Replace", + -- }, + -- doc = { + -- privateName = { "^_" }, + -- }, + -- hint = { + -- enable = true, + -- setType = false, + -- paramType = true, + -- paramName = "Disable", + -- semicolon = "Disable", + -- arrayIndex = "Disable", + -- }, + -- runtime = { version = "Lua 5.4" }, + -- diagnostics = { + -- globals = { "bit", "vim", "it", "describe", "before_each", "after_each" }, + -- }, + -- }, + -- }, + -- }, + -- pyright = { + -- settings = { + -- python = { + -- disableLanguageServices = false, + -- disableOrganizeImports = false, + -- }, + -- }, + -- }, + -- }, + -- }, + -- config = function(_, opts) + -- local cmp = require("blink.cmp") + -- local lspconfig = require("lspconfig") + -- + -- require("mason").setup() + -- + -- for server, config in pairs(opts.servers) do + -- -- passing config.capabilities to blink.cmp merges with the capabilities in your + -- -- `opts[server].capabilities, if you've defined it + -- config.capabilities = cmp.get_lsp_capabilities(config.capabilities) + -- lspconfig[server].setup(config) + -- require("mason-lspconfig").setup({ + -- ensure_installed = { server }, + -- handlers = { + -- [server] = function() + -- lspconfig[server].setup(config) + -- end, + -- }, + -- }) + -- end + -- + -- require("fidget").setup({ + -- progress = { + -- poll_rate = 0, -- How and when to poll for progress messages + -- suppress_on_insert = true, -- Suppress new messages while in insert mode + -- ignore_done_already = true, -- Ignore new tasks that are already complete + -- ignore_empty_message = true, -- Ignore new tasks that don't contain a message + -- clear_on_detach = function(client_id) -- Clear notification group when LSP server detaches + -- local client = vim.lsp.get_client_by_id(client_id) + -- return client and client.name or nil + -- end, + -- ignore = { "lua_ls" }, + -- }, + -- notification = { + -- window = { + -- normal_hl = "Comment", -- Base highlight group in the notification window + -- winblend = 0, -- Background color opacity in the notification window + -- border = "none", -- Border around the notification window + -- zindex = 45, -- Stacking priority of the notification window + -- max_width = 0, -- Maximum width of the notification window + -- max_height = 0, -- Maximum height of the notification window + -- x_padding = 1, -- Padding from right edge of window boundary + -- y_padding = 0, -- Padding from bottom edge of window boundary + -- align = "bottom", -- How to align the notification window + -- relative = "editor", -- What the notification window position is relative to + -- }, + -- }, + -- integration = { + -- ["nvim-tree"] = { + -- enable = false, -- Integrate with nvim-tree/nvim-tree.lua (if installed) + -- }, + -- }, + -- }) + -- + -- local lint = require("lint") + -- lint.linters_by_ft = { + -- javascript = { "eslint_d" }, + -- typescript = { "eslint_d" }, + -- javascriptreact = { "eslint_d" }, + -- typescriptreact = { "eslint_d" }, + -- svelte = { "eslint_d" }, + -- python = { "pylint" }, + -- sh = { "shellcheck" }, + -- } + -- + -- local lint_augroup = vim.api.nvim_create_augroup("lint", { clear = true }) + -- vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave", "TextChanged" }, { + -- group = lint_augroup, + -- callback = function() + -- lint.try_lint() + -- end, + -- }) + -- + -- require("mason-tool-installer").setup({ + -- ensure_installed = { + -- "beautysh", -- zsh formatter + -- "black", -- python formatter + -- "debugpy", -- python debuger + -- "eslint_d", -- eslint linter + -- "isort", -- python formatter + -- "markdown-toc", -- markdown toc + -- "prettier", -- prettier formatter + -- "pylint", -- python linter + -- "ruff", -- python formatter + -- "shellcheck", -- bash lint + -- "shfmt", -- sh formatter + -- "stylua", -- lua formatter + -- }, + -- integrations = { + -- ["mason-lspconfig"] = true, + -- ["mason-null-ls"] = false, + -- ["mason-nvim-dap"] = true, + -- }, + -- }) + -- + -- vim.diagnostic.config({ + -- -- update_in_insert = true, + -- float = { + -- focusable = false, + -- style = "minimal", + -- border = "rounded", + -- source = "always", + -- header = "", + -- prefix = "", + -- }, + -- }) + -- + -- require("conform").setup({ + -- formatters_by_ft = { + -- bash = { "shfmt" }, + -- css = { "prettier" }, + -- graphql = { "prettier" }, + -- html = { "prettier" }, + -- javascript = { "prettier" }, + -- javascriptreact = { "prettier" }, + -- json = { "prettier" }, + -- liquid = { "prettier" }, + -- lua = { "stylua" }, + -- markdown = { "prettier" }, + -- python = { "ruff", "isort", "black" }, + -- sh = { "shfmt" }, + -- svelte = { "prettier" }, + -- typescript = { "prettier" }, + -- typescriptreact = { "prettier" }, + -- yaml = { "prettier" }, + -- zsh = { "beautysh" }, + -- }, + -- default_format_opts = {}, + -- format_on_save = function(bufnr) + -- -- Disable with a global or buffer-local variable + -- if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then + -- return + -- end + -- return { lsp_format = "fallback", timeout_ms = 1000, async = false } + -- end, + -- }) + -- + -- vim.api.nvim_create_user_command("FormatDisable", function(args) + -- if args.bang then + -- 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, + -- keys = { + -- { + -- mode = { "n", "v" }, + -- "lf", + -- function() + -- require("conform").format({ async = true }) + -- end, + -- desc = "Format buffer by lsp", + -- }, + -- { + -- "ci", + -- "PyrightOrganizeImports", + -- desc = "Organize imports", + -- }, + -- { + -- "bl", + -- function() + -- require("lint").try_lint() + -- end, + -- desc = "Buffer lint", + -- }, + -- { + -- "le", + -- "FormatEnable", + -- desc = "Enable format", + -- }, + -- { + -- "ld", + -- "FormatDisable", + -- desc = "Disable format", + -- }, + -- { + -- "lD", + -- "FormatDisable!", + -- desc = "Disable current buffer format", + -- }, + -- }, + -- }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/lualine.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/lualine.lua new file mode 100644 index 0000000..b1b3159 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/lualine.lua @@ -0,0 +1,355 @@ +return { + "nvim-lualine/lualine.nvim", + dependencies = { "nvim-tree/nvim-web-devicons" }, + config = function() + local navic = require("nvim-navic") + require("lualine").setup({ + options = { + icons_enabled = true, + theme = "auto", + section_separators = { left = "", right = "" }, + component_separators = { left = "", right = "" }, + disabled_filetypes = { + statusline = {}, + winbar = {}, + }, + ignore_focus = {}, + always_divide_middle = true, + globalstatus = false, + refresh = { + statusline = 100, + tabline = 100, + winbar = 100, + }, + }, + sections = { + lualine_a = { + { + "mode", + fmt = function(str) + return str:sub(1, 1) + end, + }, + { + function() + local has_noice, noice = pcall(require, "noice") + if has_noice and noice.api and noice.api.status and noice.api.status.mode then + return noice.api.status.mode.get() or "" + else + return "" + end + end, + cond = function() + local has_noice, noice = pcall(require, "noice") + return has_noice + and noice.api + and noice.api.status + and noice.api.status.mode + and noice.api.status.mode.has() + end, + color = { bg = "#ff9e64" }, + }, + }, + lualine_b = { + { + function() + return vim.g.remote_neovim_host and ("Remote: %s"):format(vim.uv.os_gethostname()) or "" + end, + }, + { + function() + local build_status_last = require("devcontainer.status").find_build({ running = true }) + if build_status_last then + return string.format( + "[%s/%s]%s", + build_status_last.current_step or "", + build_status_last.step_count or "", + build_status_last.progress and ("(" .. build_status_last.progress .. "%%)") or "" + ) + else + return "" + end + end, + }, + "branch", + { + "diff", + colored = true, -- Displays a colored diff status if set to true + diff_color = { + -- Same color values as the general color option can be used here. + added = "LuaLineDiffAdd", -- Changes the diff's added color + modified = "LuaLineDiffChange", -- Changes the diff's modified color + removed = "LuaLineDiffDelete", -- Changes the diff's removed color you + }, + symbols = { added = "+", modified = "~", removed = "-" }, -- Changes the symbols used by the diff. + source = nil, -- A function that works as a data source for diff. + -- It must return a table as such: + -- { added = add_count, modified = modified_count, removed = removed_count } + -- or nil on failure. count <= 0 won't be displayed. + }, + { + "diagnostics", + -- Table of diagnostic sources, available sources are: + -- 'nvim_lsp', 'nvim_diagnostic', 'nvim_workspace_diagnostic', 'coc', 'ale', 'vim_lsp'. + -- or a function that returns a table as such: + -- { error=error_cnt, warn=warn_cnt, info=info_cnt, hint=hint_cnt } + sources = { "nvim_lsp", "nvim_diagnostic", "nvim_workspace_diagnostic", "coc" }, + + -- Displays diagnostics for the defined severity types + sections = { "error", "warn", "info", "hint" }, + + diagnostics_color = { + -- Same values as the general color option can be used here. + error = "DiagnosticError", -- Changes diagnostics' error color. + warn = "DiagnosticWarn", -- Changes diagnostics' warn color. + info = "DiagnosticInfo", -- Changes diagnostics' info color. + hint = "DiagnosticHint", -- Changes diagnostics' hint color. + }, + symbols = { + error = " ", + warn = " ", + info = " ", + hint = " ", + }, + colored = true, -- Displays diagnostics status in color if set to true. + update_in_insert = true, -- Update diagnostics in insert mode. + always_visible = false, -- Show diagnostics even if there are none. + }, + { + function() + local ok, neocomposer = pcall(require, "NeoComposer.ui") + if ok and neocomposer and neocomposer.status_recording then + return neocomposer.status_recording() + end + return "" + end, + }, + }, + lualine_c = { + { + "filename", + file_status = true, -- Displays file status (readonly status, modified status) + newfile_status = true, -- Display new file status (new file means no write after created) + path = 3, -- 0: Just the filename + -- 1: Relative path + -- 2: Absolute path + -- 3: Absolute path, with tilde as the home directory + -- 4: Filename and parent dir, with tilde as the home directory + + shorting_target = 40, -- Shortens path to leave 40 spaces in the window + -- for other components. (terrible name, any suggestions?) + symbols = { + modified = "[*]", -- Text to show when the file is modified. + readonly = "[r]", -- Text to show when the file is non-modifiable or readonly. + unnamed = "[?]", -- Text to show for unnamed buffers. + newfile = "[%%]", -- Text to show for newly created file before first write + }, + }, + }, + lualine_x = { + { + function() + local ok, rest = pcall(require, "rest") + if ok and rest then + return "rest" + end + return "" + end, + }, + { + function() + -- Check if MCPHub is loaded + if not vim.g.loaded_mcphub then + return "󰐻 -" + end + + local count = vim.g.mcphub_servers_count or 0 + local status = vim.g.mcphub_status or "stopped" + local executing = vim.g.mcphub_executing + + -- Show "-" when stopped + if status == "stopped" then + return "󰐻 -" + end + + -- Show spinner when executing, starting, or restarting + if executing or status == "starting" or status == "restarting" then + local frames = { "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏" } + local frame = math.floor(vim.loop.now() / 100) % #frames + 1 + return "󰐻 " .. frames[frame] + end + + return "󰐻 " .. count + end, + color = function() + if not vim.g.loaded_mcphub then + return { fg = "#6c7086" } -- Gray for not loaded + end + + local status = vim.g.mcphub_status or "stopped" + if status == "ready" or status == "restarted" then + return { fg = "#50fa7b" } -- Green for connected + elseif status == "starting" or status == "restarting" then + return { fg = "#ffb86c" } -- Orange for connecting + else + return { fg = "#ff5555" } -- Red for error/stopped + end + end, + }, + { + function() + local has_noice, noice = pcall(require, "noice") + if has_noice and noice.api and noice.api.status and noice.api.status.mode then + return noice.api.status.search.get() or "" + else + return "" + end + end, + cond = function() + local has_noice, noice = pcall(require, "noice") + return has_noice + and noice.api + and noice.api.status + and noice.api.status.search + and noice.api.status.search.has() + end, + color = { bg = "#ff9e64" }, + }, + "copilot", + { + function() + return require("molten.status").initialized() + end, + }, + "encoding", + "fileformat", + { + "filetype", + colored = true, -- Displays filetype icon in color if set to true + icon_only = true, -- Display only an icon for filetype + icon = { align = "right" }, -- Display filetype icon on the right hand side + -- icon = {'X', align='right'} + -- Icon string ^ in table is ignored in filetype component + }, + }, + lualine_y = { + "progress", + }, + lualine_z = { + { + function() + local is_tmux = os.getenv("TMUX") ~= nil + if is_tmux then + return "" + end + return os.date("%H:%M") + end, + }, + { + function() + if not package.loaded["korean_ime"] then + return "" + end + local mode = require("korean_ime").get_mode() + if mode == "en" then + return "A " + elseif mode == "ko" then + return "한" + end + end, + }, + }, + }, + inactive_sections = {}, + tabline = { + lualine_a = { + { + "tabs", + tab_max_length = 40, -- Maximum width of each tab. The content will be shorten dynamically (example: apple/orange -> a/orange) + max_length = vim.o.columns / 3, -- Maximum width of tabs component. + -- Note: + -- It can also be a function that returns + -- the value of `max_length` dynamically. + mode = 0, -- 0: Shows tab_nr + -- 1: Shows tab_name + -- 2: Shows tab_nr + tab_name + + path = nil, -- 0: just shows the filename + -- 1: shows the relative path and shorten $HOME to ~ + -- 2: shows the full path + -- 3: shows the full path and shorten $HOME to ~ + + -- Automatically updates active tab color to match color of other components (will be overidden if buffers_color is set) + use_mode_colors = true, + + -- tabs_color = { + -- -- Same values as the general color option can be used here. + -- active = "lualine_{section}_normal", -- Color for active tab. + -- inactive = "lualine_{section}_inactive", -- Color for inactive tab. + -- }, + -- + show_modified_status = false, -- Shows a symbol next to the tab name if the file has been modified. + symbols = { + modified = "*", -- Text to show when the file is modified. + }, + + fmt = function(name, context) + -- Show + if buffer is modified in tab + local buflist = vim.fn.tabpagebuflist(context.tabnr) + local winnr = vim.fn.tabpagewinnr(context.tabnr) + local bufnr = buflist[winnr] + local mod = vim.fn.getbufvar(bufnr, "&mod") + + return name .. (mod == 1 and " +" or "") + end, + }, + }, + lualine_b = { + { + function() + local function buffer_status() + local buffers = vim.fn.getbufinfo({ buflisted = true }) + local current_buf = vim.fn.bufnr() + local current_buffer_index = 0 + local modified_symbol = vim.bo.modified and "●" or "" + for i, buf in ipairs(buffers) do + if buf.bufnr == current_buf then + current_buffer_index = i + break + end + end + return string.format("%s%d/%d", modified_symbol, current_buffer_index, #buffers) + end + return buffer_status() + end, + }, + }, + lualine_c = { + { + function() + return navic.get_location() + end, + cond = function() + return navic.is_available() + end, + }, + }, + lualine_x = {}, + lualine_y = {}, + lualine_z = {}, + }, + winbar = {}, + inactive_winbar = {}, + extensions = {}, + }) + + local lualine_hidden = true + vim.keymap.set({ "n", "v" }, "zl", function() + lualine_hidden = not lualine_hidden + require("lualine").hide({ + place = { "statusline", "tabline", "winbar" }, + unhide = lualine_hidden, + }) + end, { desc = "Toggle lualine" }) + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/macro.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/macro.lua new file mode 100644 index 0000000..b69d000 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/macro.lua @@ -0,0 +1,172 @@ +return { + -- { + -- "kr40/nvim-macros", + -- lazy = false, + -- cmd = { "MacroSave", "MacroYank", "MacroSelect", "MacroDelete" }, + -- opts = {}, + -- config = function() + -- require("nvim-macros").setup({ + -- json_file_path = vim.fn.expand("~/.local/share/thesiah/macros.json"), -- Location where the macros will be stored + -- default_macro_register = "q", -- Use as default register for :MacroYank and :MacroSave and :MacroSelect Raw functions + -- json_formatter = "none", -- can be "none" | "jq" | "yq" used to pretty print the json file (jq or yq must be installed!) + -- }) + -- vim.keymap.set("n", "yQ", ":MacroYank", { desc = "Yank macro" }) + -- vim.keymap.set("n", "wQ", ":MacroSave", { desc = "Save macro" }) + -- vim.keymap.set("n", "fQ", ":MacroSelect", { desc = "Search macro" }) + -- vim.keymap.set("n", "xQ", ":MacroDelete", { desc = "Delete macro" }) + -- end, + -- }, + { + "desdic/macrothis.nvim", + opts = {}, + config = function() + require("macrothis").setup({ + datafile = (function() + local path = vim.fn.expand("~/.local/share/thesiah/macros.json") + + -- Create directory if it doesn't exist + local dir = vim.fn.fnamemodify(path, ":h") + if vim.fn.isdirectory(dir) == 0 then + vim.fn.mkdir(dir, "p") + end + + -- Create file if it doesn't exist or is empty + if vim.fn.filereadable(path) == 0 or vim.fn.getfsize(path) == 0 then + local file = io.open(path, "w") + if file then + file:write("[]") + file:close() + end + end + + return path + end)(), + run_register = "Q", -- content of register z is replaced when running/editing a macro + editor = { -- Edit window + width = 100, + height = 2, + style = "minimal", + border = "rounded", + }, + clipboard_register = '"', + default_register = "q", -- Use this register when loading a macro (will never prompt for register if set) + }) + require("telescope").load_extension("macrothis") + vim.keymap.set("n", "fq", ":Telescope macrothis", { desc = "Find macro" }) + end, + keys = { + { + "dq", + function() + require("macrothis").delete() + end, + desc = "Delete macro", + }, + { + "eq", + function() + require("macrothis").edit() + end, + desc = "Edit macro", + }, + { + "lq", + function() + require("macrothis").load() + end, + desc = "Load macro", + }, + { + "rnq", + function() + require("macrothis").rename() + end, + desc = "Rename macro", + }, + { + "rQ", + function() + require("macrothis").quickfix() + end, + desc = "Run macro on all files in quickfix", + }, + { + "rq", + function() + require("macrothis").run() + end, + desc = "Run macro", + }, + { + "wq", + function() + require("macrothis").save() + end, + desc = "Save macro", + }, + { + 'e"', + function() + require("macrothis").register() + end, + desc = "Edit register", + }, + { + 'y"', + function() + require("macrothis").copy_register_printable() + end, + desc = "Copy register as printable", + }, + { + "yq", + function() + require("macrothis").copy_macro_printable() + end, + desc = "Copy macro as printable", + }, + }, + }, + -- { + -- "ecthelionvi/NeoComposer.nvim", + -- dependencies = { "kkharji/sqlite.lua" }, + -- opts = {}, + -- config = function() + -- require("NeoComposer").setup({ + -- notify = true, + -- delay_timer = 150, + -- queue_most_recent = false, + -- window = { + -- width = 80, + -- height = 10, + -- border = "rounded", + -- winhl = { + -- Normal = "ComposerNormal", + -- }, + -- }, + -- colors = { + -- bg = "NONE", + -- fg = "#ff9e64", + -- red = "#ec5f67", + -- blue = "#5fb3b3", + -- green = "#99c794", + -- }, + -- keymaps = { + -- play_macro = "Q", + -- yank_macro = "yq", + -- stop_macro = "cq", + -- toggle_record = "q", + -- cycle_next = "", + -- cycle_prev = "", + -- toggle_macro_menu = "", + -- }, + -- }) + -- + -- require("telescope").load_extension("macros") + -- + -- vim.keymap.set("n", "sm", ":Telescope macros", { desc = "Search macros" }) + -- vim.keymap.set("n", "em", ":EditMacros", { desc = "Edit macros" }) + -- vim.keymap.set("n", "xm", ":ClearNeoComposer", { desc = "Clear macros" }) + -- end, + -- }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/markdown.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/markdown.lua new file mode 100644 index 0000000..3aa19b5 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/markdown.lua @@ -0,0 +1,554 @@ +-- Select the current cell +local function select_cell() + local bufnr = vim.api.nvim_get_current_buf() + local current_row = vim.api.nvim_win_get_cursor(0)[1] + local current_col = vim.api.nvim_win_get_cursor(0)[2] + + local start_line = nil + local end_line = nil + local line_count = vim.api.nvim_buf_line_count(bufnr) + + -- Find the start of the cell (looking for opening markers or headers) + for line = current_row, 1, -1 do + local line_content = vim.api.nvim_buf_get_lines(bufnr, line - 1, line, false)[1] + if line_content:match("^```%s*[%w_%-]+") then + start_line = line + break + end + end + + -- If no start line is found, assume start of the file + if not start_line then + start_line = 1 + end + + -- Find the end of the cell (looking for the next opening marker or header) + for line = start_line + 1, line_count do + local line_content = vim.api.nvim_buf_get_lines(bufnr, line - 1, line, false)[1] + if line_content:match("^```%s*[%w_%-]+") then + end_line = line - 1 + break + end + end + + -- If no end line is found, assume end of the file + if not end_line then + end_line = line_count + end + + return current_row, current_col, start_line, end_line +end + +-- Delete the current cell +local function delete_cell() + local _, _, start_line, end_line = select_cell() -- Use select_cell to get start and end lines of the cell + if start_line and end_line then + -- Move cursor to the start of the cell + vim.api.nvim_win_set_cursor(0, { start_line, 0 }) + + -- Enter visual line mode to select the cell + vim.cmd("normal! V") + -- Move cursor to the end of the cell to extend selection + vim.api.nvim_win_set_cursor(0, { end_line, 0 }) + + -- Delete the selected lines + vim.cmd("normal! d") + end +end + +-- Navigate to the next or previous cell +local function navigate_cell(up) + local bufnr = vim.api.nvim_get_current_buf() + local line_count = vim.api.nvim_buf_line_count(bufnr) + local _, _, start_line, end_line = select_cell() -- Get the start and end lines of the current cell + + local target_line = nil + + if up then + -- Find the previous cell start, skipping any closing markers + for line = start_line - 1, 1, -1 do + local line_content = vim.api.nvim_buf_get_lines(bufnr, line - 1, line, false)[1] + if line_content:match("^```%s*[%w_%-]+") or line_content:match("^%s*#+%s") then + target_line = line + break + end + end + else + -- Find the next cell start, skipping any closing markers + for line = end_line + 1, line_count do + local line_content = vim.api.nvim_buf_get_lines(bufnr, line - 1, line, false)[1] + if line_content:match("^```%s*[%w_%-]+") or line_content:match("^%s*#+%s") then + target_line = line + break + end + end + end + + -- Navigate to the target line if found, otherwise stay at the current position + if target_line then + -- If the target is a code block, move cursor to the line right after the opening marker + local target_line_content = vim.api.nvim_buf_get_lines(bufnr, target_line - 1, target_line, false)[1] + if target_line_content:match("^```%s*[%w_%-]+") then + vim.api.nvim_win_set_cursor(0, { target_line + 1, 0 }) -- Move inside the code block + else + vim.api.nvim_win_set_cursor(0, { target_line, 0 }) -- Move to the markdown header line + end + else + if up then + vim.api.nvim_win_set_cursor(0, { 1, 0 }) -- Move to start of file if no previous cell found + else + vim.api.nvim_win_set_cursor(0, { line_count, 0 }) -- Move to end of file if no next cell found + end + end +end + +-- Insert a new cell with specific content +local function insert_cell(content) + local _, _, _, end_line = select_cell() + local bufnr = vim.api.nvim_get_current_buf() + local line = end_line + if end_line ~= 1 then + line = end_line - 1 + vim.api.nvim_win_set_cursor(0, { end_line - 1, 0 }) + else + line = end_line + vim.api.nvim_win_set_cursor(0, { end_line, 0 }) + end + + vim.cmd("normal!2o") + vim.api.nvim_buf_set_lines(bufnr, line, line + 1, false, { content }) + vim.cmd("normal!2o") + vim.cmd("normal!k") +end + +-- Insert a new code cell +local function insert_code_cell() + insert_cell("```python") -- For regular code cells +end + +return { + { + "ixru/nvim-markdown", + config = function() + vim.g.vim_markdown_no_default_key_mappings = 1 + end, + }, + { + "MeanderingProgrammer/render-markdown.nvim", + -- dependencies = { "nvim-treesitter/nvim-treesitter", "echasnovski/mini.nvim" }, -- if you use the mini.nvim suite + dependencies = { "nvim-treesitter/nvim-treesitter", "echasnovski/mini.icons" }, -- if you use standalone mini plugins + -- dependencies = { 'nvim-treesitter/nvim-treesitter', 'nvim-tree/nvim-web-devicons' }, -- if you prefer nvim-web-devicons + ---@module 'render-markdown' + ---@type render.md.UserConfig + opts = {}, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "mr", group = "Markdown render" }, + }) + end, + config = function() + -- require("obsidian").get_client().opts.ui.enable = false + -- vim.api.nvim_buf_clear_namespace(0, vim.api.nvim_get_namespaces()["ObsidianUI"], 0, -1) + require("render-markdown").setup({ + bullet = { + -- Turn on / off list bullet rendering + enabled = false, + }, + code = { + enabled = true, -- disable code rendering for .ipynb files + sign = true, + -- Width of the code block background. + -- | block | width of the code block | + -- | full | full width of the window | + width = "block", + }, + file_types = { "markdown", "vimwiki" }, + heading = { + enabled = true, + sign = false, + icons = { "", "", "", "", "", "" }, + -- icons = { "󰎤 ", "󰎧 ", "󰎪 ", "󰎭 ", "󰎱 ", "󰎳 " }, + }, + ignore = function(bufnr) + local name = vim.api.nvim_buf_get_name(bufnr) + return name:lower():match("%.ipynb$") ~= nil + end, + }) + + vim.treesitter.language.register("markdown", "vimwiki") + + local opts = { noremap = true, silent = true } + vim.keymap.set("n", "mrt", function() + require("render-markdown").buf_toggle() + end, vim.tbl_extend("force", opts, { desc = "Toggle render-markdown" })) + vim.keymap.set("n", "mre", function() + require("render-markdown").buf_enable() + end, vim.tbl_extend("force", opts, { desc = "Enable render-markdown" })) + vim.keymap.set("n", "mrx", function() + require("render-markdown").buf_disable() + end, vim.tbl_extend("force", opts, { desc = "Disable render-markdown" })) + vim.keymap.set("n", "mr+", function() + require("render-markdown").expand() + end, vim.tbl_extend("force", opts, { desc = "Expand conceal margin" })) + vim.keymap.set("n", "mr-", function() + require("render-markdown").contract() + end, vim.tbl_extend("force", opts, { desc = "Contract conceal margin" })) + vim.keymap.set("n", "mrl", function() + require("render-markdown").log() + end, vim.tbl_extend("force", opts, { desc = "Open render-markdown log" })) + vim.keymap.set("n", "mrc", function() + require("render-markdown").config() + end, vim.tbl_extend("force", opts, { desc = "Show render-markdown config diff" })) + vim.keymap.set("n", "mrd", function() + require("render-markdown").debug() + end, vim.tbl_extend("force", opts, { desc = "Debug render-markdown marks" })) + end, + }, + { + -- Install markdown preview, use npm if available. + "iamcco/markdown-preview.nvim", + cmd = { "MarkdownPreviewToggle", "MarkdownPreview", "MarkdownPreviewStop" }, + ft = { "markdown" }, + build = function(plugin) + if vim.fn.executable("npm") then + vim.cmd("!cd " .. plugin.dir .. " && cd app && npm install") + else + vim.cmd([[Lazy load markdown-preview.nvim]]) + vim.fn["mkdp#util#install"]() + end + end, + init = function() + if vim.fn.executable("npm") then + vim.g.mkdp_filetypes = { "markdown" } + end + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "m", group = "Markdown/Map" }, + }) + end, + keys = { + { "mp", "MarkdownPreview", desc = "Markdown preview" }, + { "mx", "MarkdownPreviewStop", desc = "Markdown stop" }, + { "md", "MarkdownPreviewToggle", desc = "Markdown toggle" }, + }, + }, + { + "brianhuster/live-preview.nvim", + dependencies = { + -- You can choose one of the following pickers + "nvim-telescope/telescope.nvim", + -- "ibhagwan/fzf-lua", + -- "echasnovski/mini.pick", + }, + cmd = { "LivePreview start", "LivePreview close", "LivePreview pick", "LivePreview help" }, + init = function() + if vim.fn.executable("npm") then + vim.g.mkdp_filetypes = { "markdown" } + end + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "ml", group = "Markdown live" }, + }) + end, + keys = { + { "mlp", "LivePreview start", desc = "Markdown live preview" }, + { "mlx", "LivePreview close", desc = "Markdown live close" }, + { "mlc", "LivePreview pick", desc = "Markdown live pick" }, + { "mlh", "LivePreview help", desc = "Markdown live help" }, + }, + }, + { + "ellisonleao/glow.nvim", + cmd = "Glow", + config = function() + require("glow").setup({ + border = "single", -- floating window border config + style = "dark", -- filled automatically with your current editor background, you can override using glow json style + }) + end, + keys = { + { "mf", "Glow", desc = "Floating markdown preview" }, + }, + }, + { + "dhruvasagar/vim-open-url", + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "g", group = "Search word under curosr" }, + { "gB", group = "Open url in browser" }, + { "gG", group = "Google search word under cursor" }, + { "gW", group = "Wikipedia search word under cursor" }, + }) + end, + }, + { + "AckslD/nvim-FeMaco.lua", + config = function() + require("femaco").setup() + end, + }, + { + "goerz/jupytext.nvim", + version = "0.2.0", + lazy = false, + config = function() + require("jupytext").setup({ + jupytext = "jupytext", + format = "markdown", + update = true, + filetype = require("jupytext").get_filetype, + new_template = require("jupytext").default_new_template(), + sync_patterns = { "*.md", "*.py", "*.jl", "*.R", "*.Rmd", "*.qmd" }, + autosync = true, + handle_url_schemes = true, + }) + end, + keys = { + { "", insert_code_cell, desc = "Insert Code Cell" }, + { "", delete_cell, desc = "Delete Cell" }, + { + "", + function() + navigate_cell(true) + end, + desc = "Previous Cell", + }, + { "", navigate_cell, desc = "Next Cell" }, + }, + }, + { + "vhyrro/luarocks.nvim", + priority = 1001, -- this plugin needs to run before anything else + init = function() + package.path = package.path + .. ";" + .. vim.fn.expand("$HOME") + .. "/.config/luarocks/share/lua/5.1/magick/init.lua;" + end, + opt = { + rocks = { "magick" }, + }, + }, + { "benlubas/image-save.nvim", cmd = "SaveImage" }, + { + "3rd/image.nvim", + build = build, + dependencies = { "leafo/magick", "vhyrro/luarocks.nvim" }, + config = function() + require("image").setup({ + backend = "ueberzug", -- "ueberzug" or "kitty", whatever backend you would like to use + processor = "magick_rock", -- "magick_rock" or "magick_cli" + integrations = { + markdown = { + enabled = true, + clear_in_insert_mode = false, + download_remote_images = false, + only_render_image_at_cursor = false, + floating_windows = false, -- if true, images will be rendered in floating markdown windows + filetypes = { "markdown", "quarto" }, -- markdown extensions (ie. quarto) can go here + }, + neorg = { + enabled = true, + filetypes = { "norg" }, + }, + typst = { + enabled = true, + filetypes = { "typst" }, + }, + html = { + enabled = false, + }, + css = { + enabled = false, + }, + }, + max_width = 100, + max_height = 8, + max_height_window_percentage = math.huge, + max_width_window_percentage = math.huge, + window_overlap_clear_enabled = true, -- toggles images when windows are overlapped + window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs", "fidget", "" }, + editor_only_render_when_focused = true, -- auto show/hide images when the editor gains/looses focus + tmux_show_only_in_active_window = true, -- auto show/hide images in the correct Tmux window (needs visual-activity off) + hijack_file_patterns = { "*.png", "*.jpg", "*.jpeg", "*.gif", "*.webp", "*.avif" }, -- render image files as images when opened + }) + end, + }, + { + "quarto-dev/quarto-nvim", + dependencies = { + { + "jmbuhr/otter.nvim", + lazy = false, + dependencies = { + "nvim-treesitter/nvim-treesitter", + }, + opts = {}, + config = function() + require("otter").setup() + end, + }, + "hrsh7th/nvim-cmp", + "neovim/nvim-lspconfig", + }, + ft = { "quarto", "markdown" }, + command = "QuartoActivate", + config = function() + require("quarto").setup({ + debug = false, + closePreviewOnExit = true, + lspFeatures = { + languages = { "r", "python", "rust" }, + chunks = "all", + diagnostics = { + enabled = true, + triggers = { "BufWritePost" }, + }, + completion = { + enabled = true, + }, + }, + keymap = { + hover = "H", + definition = "gd", + rename = "rn", + references = "gr", + format = "gf", + }, + codeRunner = { + enabled = true, + default_method = "molten", + ft_runners = { + bash = "slime", + python = "molten", + }, + never_run = { "yaml" }, -- filetypes which are never sent to a code runner + }, + }) + local runner = require("quarto.runner") + vim.keymap.set("n", "jc", runner.run_cell, { silent = true, desc = "Run cell" }) + vim.keymap.set("n", "jC", runner.run_above, { silent = true, desc = "Run above cell" }) + vim.keymap.set("n", "jl", runner.run_line, { silent = true, desc = "Run line" }) + vim.keymap.set("v", "jv", runner.run_range, { silent = true, desc = "Run block" }) + vim.keymap.set("n", "ja", runner.run_all, { silent = true, desc = "Run all" }) + vim.keymap.set("n", "jA", function() + runner.run_all(true) + end, { desc = "run all cells of all languages", silent = true }) + vim.keymap.set( + "n", + "jp", + require("quarto").quartoPreview, + { noremap = true, silent = true, desc = "Preview the quarto document" } + ) + -- to create a cell in insert mode, I have the ` snippet + vim.keymap.set( + "n", + "cc", + "i```python\n```O", + { silent = true, desc = "Create a new code cell" } + ) + vim.keymap.set( + "n", + "cs", + "i```\r\r```{}", + { noremap = true, silent = true, desc = "Split code cell" } + ) + end, + }, + { + "benlubas/molten-nvim", + version = "^1.0.0", -- use version <2.0.0 to avoid breaking changes + dependencies = { "3rd/image.nvim" }, + build = ":UpdateRemotePlugins", + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v", "x" }, + { "j", group = "Molten (Jupyter)" }, + }) + + vim.g.molten_auto_image_popup = true + vim.g.molten_auto_init_behavior = "raise" + vim.g.molten_auto_open_html_in_browser = false + -- I find auto open annoying, keep in mind setting this option will require setting + -- a keybind for `:noautocmd MoltenEnterOutput` to open the output again + vim.g.molten_auto_open_output = false + vim.g.molten_cover_empty_lines = false + vim.g.molten_cover_lines_starting_with = {} + vim.g.molten_copy_output = false + vim.g.molten_enter_output_behavior = "open_then_enter" + -- this guide will be using image.nvim + -- Don't forget to setup and install the plugin if you want to view image outputs + vim.g.molten_image_provider = "image.nvim" + vim.g.molten_output_show_more = false + vim.g.molten_output_win_max_height = 30 + vim.g.molten_output_win_style = "minimal" + -- this will make it so the output shows up below the \`\`\` cell delimiter + vim.g.molten_virt_lines_off_by_1 = true + -- Output as virtual text. Allows outputs to always be shown, works with images, but can + -- be buggy with longer images + vim.g.molten_virt_text_output = true + -- optional, works for virt text and the output window + vim.g.molten_wrap_output = true + vim.g.molten_virt_text_max_lines = 20 + end, + config = function() + -- image nvim options table. Pass to `require('image').setup` + vim.keymap.set("n", "jJ", ":MoltenInit", { silent = true, desc = "Init molten" }) + vim.keymap.set("n", "j[", ":MoltenPrev", { silent = true, desc = "Go to prev code cell" }) + vim.keymap.set("n", "j]", ":MoltenNext", { silent = true, desc = "Go to next code cell" }) + vim.keymap.set( + "n", + "jo", + ":MoltenEvaluateOperator", + { silent = true, desc = "Evaluate operator" } + ) + vim.keymap.set("n", "jL", ":MoltenEvaluateLine", { silent = true, desc = "Evaluate line" }) + vim.keymap.set("n", "jr", ":MoltenReevaluateCell", { silent = true, desc = "Re-evaluate cell" }) + vim.keymap.set( + "v", + "jV", + ":MoltenEvaluateVisualgv", + { silent = true, desc = "Evaluate visual block" } + ) + vim.keymap.set("n", "jd", ":MoltenDelete", { silent = true, desc = "Delete molten" }) + vim.keymap.set("n", "js", ":MoltenShowOutput", { silent = true, desc = "Show output" }) + vim.keymap.set("n", "jh", ":MoltenHideOutput", { silent = true, desc = "Hide output" }) + vim.keymap.set( + "n", + "jm", + ":noautocmd MoltenEnterOutput", + { silent = true, desc = "Enter output" } + ) + vim.api.nvim_create_autocmd("User", { + pattern = "MoltenInitPost", + callback = function() + require("quarto").activate() + end, + }) + vim.keymap.set("n", "ji", ":MoltenImagePopup", { silent = true, desc = "Pop-up image" }) + vim.keymap.set("n", "jw", ":MoltenOpenInBrowser", { silent = true, desc = "Open in browser" }) + vim.keymap.set("n", "jj", function() + local venv_path = os.getenv("VIRTUAL_ENV") + if venv_path then + local venv_name = vim.fn.fnamemodify(venv_path, ":t") + vim.cmd(("MoltenInit %s"):format(venv_name)) + else + vim.cmd("MoltenInit /opt/homebrew/bin/python@3.13") + end + end, { desc = "Init default molten" }) + end, + }, + { + "mipmip/vim-scimark", + config = function() + vim.keymap.set("n", "si", ":OpenInScim", { desc = "Sc-im" }) + end, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/marks.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/marks.lua new file mode 100644 index 0000000..d59d0f1 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/marks.lua @@ -0,0 +1,16 @@ +return { + "chentoast/marks.nvim", + config = function() + require("marks").setup() + end, + init = function() + local wk = require("which-key") + wk.add({ + { + mode = { "n", "v" }, + { "m", group = "Marks" }, + { "dm", desc = "Delete marks" }, + }, + }) + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/mini.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/mini.lua new file mode 100644 index 0000000..993b02c --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/mini.lua @@ -0,0 +1,1178 @@ +-- Updated pattern to match what Echasnovski has in the documentation +-- https://github.com/echasnovski/mini.nvim/blob/c6eede272cfdb9b804e40dc43bb9bff53f38ed8a/doc/mini-files.txt#L508-L529 + +-- Define a function to update MiniJump highlight based on Search +local function update_mini_jump_highlight() + local search_hl = vim.api.nvim_get_hl(0, { name = "Search" }) + vim.api.nvim_set_hl(0, "MiniJump", { + fg = search_hl.fg, + bg = search_hl.bg, + bold = search_hl.bold or false, + }) +end + +return { + { + "echasnovski/mini.ai", + version = false, + config = function() + require("mini.ai").setup({ + -- Table with textobject id as fields, textobject specification as values. + -- Also use this to disable builtin textobjects. See |MiniAi.config|. + custom_textobjects = nil, + + -- Module mappings. Use `''` (empty string) to disable one. + mappings = { + -- Main textobject prefixes + around = "a", + inside = "i", + + -- Next/last variants + around_next = "an", + inside_next = "in", + around_last = "al", + inside_last = "il", + + -- Move cursor to corresponding edge of `a` textobject + goto_left = "g[", + goto_right = "g]", + }, + + -- Number of lines within which textobject is searched + n_lines = 50, + + -- How to search for object (first inside current line, then inside + -- neighborhood). One of 'cover', 'cover_or_next', 'cover_or_prev', + -- 'cover_or_nearest', 'next', 'previous', 'nearest'. + search_method = "cover_or_next", + + -- Whether to disable showing non-error feedback + -- This also affects (purely informational) helper messages shown after + -- idle time if user input is required. + silent = false, + }) + end, + }, + { + "echasnovski/mini.bracketed", + version = false, + config = function() + require("mini.bracketed").setup({ + buffer = { suffix = "", options = {} }, + comment = { suffix = "", options = {} }, + conflict = { suffix = "", options = {} }, + diagnostic = { suffix = "", options = {} }, + file = { suffix = "", options = {} }, + indent = { suffix = "", options = {} }, + jump = { suffix = "", options = {} }, + location = { suffix = "", options = {} }, + oldfile = { suffix = "", options = {} }, + quickfix = { suffix = "", options = {} }, + treesitter = { suffix = "", options = {} }, + undo = { suffix = "", options = {} }, + window = { suffix = "", options = {} }, + yank = { suffix = "", options = {} }, + }) + + vim.keymap.set("n", "[B", "lua MiniBracketed.buffer('first')", { desc = "Buffer first" }) + vim.keymap.set( + "n", + "[b", + "lua MiniBracketed.buffer('backward')", + { desc = "Buffer backward" } + ) + vim.keymap.set( + "n", + "]b", + "lua MiniBracketed.buffer('forward')", + { desc = "Buffer forward" } + ) + vim.keymap.set("n", "]B", "lua MiniBracketed.buffer('last')", { desc = "Buffer last" }) + vim.keymap.set("n", "[C", "lua MiniBracketed.comment('first')", { desc = "Comment first" }) + vim.keymap.set( + "n", + "[c", + "lua MiniBracketed.comment('backward')", + { desc = "Comment backward" } + ) + vim.keymap.set( + "n", + "]c", + "lua MiniBracketed.comment('forward')", + { desc = "Comment forward" } + ) + vim.keymap.set("n", "]C", "lua MiniBracketed.comment('last')", { desc = "Comment last" }) + vim.keymap.set( + "n", + "[X", + "lua MiniBracketed.conflict('first')", + { desc = "Conflict first" } + ) + vim.keymap.set( + "n", + "[x", + "lua MiniBracketed.conflict('backward')", + { desc = "Conflict backward" } + ) + vim.keymap.set( + "n", + "]x", + "lua MiniBracketed.conflict('forward')", + { desc = "Conflict forward" } + ) + vim.keymap.set("n", "]X", "lua MiniBracketed.conflict('last')", { desc = "Conflict last" }) + vim.keymap.set( + "n", + "[D", + "lua MiniBracketed.diagnostic('first')", + { desc = "Diagnostic first" } + ) + vim.keymap.set( + "n", + "[d", + "lua MiniBracketed.diagnostic('backward')", + { desc = "Diagnostic backward" } + ) + vim.keymap.set( + "n", + "]d", + "lua MiniBracketed.diagnostic('forward')", + { desc = "Diagnostic forward" } + ) + vim.keymap.set( + "n", + "]D", + "lua MiniBracketed.diagnostic('last')", + { desc = "Diagnostic last" } + ) + vim.keymap.set("n", "[F", "lua MiniBracketed.file('first')", { desc = "File first" }) + vim.keymap.set("n", "[f", "lua MiniBracketed.file('backward')", { desc = "File backward" }) + vim.keymap.set("n", "]f", "lua MiniBracketed.file('forward')", { desc = "File forward" }) + vim.keymap.set("n", "]F", "lua MiniBracketed.file('last')", { desc = "File last" }) + vim.keymap.set("n", "[I", "lua MiniBracketed.indent('first')", { desc = "Indent first" }) + vim.keymap.set( + "n", + "[i", + "lua MiniBracketed.indent('backward')", + { desc = "Indent backward" } + ) + vim.keymap.set( + "n", + "]i", + "lua MiniBracketed.indent('forward')", + { desc = "Indent forward" } + ) + vim.keymap.set("n", "]I", "lua MiniBracketed.indent('last')", { desc = "Indent last" }) + vim.keymap.set("n", "[J", "lua MiniBracketed.jump('first')", { desc = "Jump first" }) + vim.keymap.set("n", "[j", "lua MiniBracketed.jump('backward')", { desc = "Jump backward" }) + vim.keymap.set("n", "]j", "lua MiniBracketed.jump('forward')", { desc = "Jump forward" }) + vim.keymap.set("n", "]J", "lua MiniBracketed.jump('last')", { desc = "Jump last" }) + vim.keymap.set( + "n", + "[L", + "lua MiniBracketed.location('first')", + { desc = "Location first" } + ) + vim.keymap.set( + "n", + "[l", + "lua MiniBracketed.location('backward')", + { desc = "Location backward" } + ) + vim.keymap.set( + "n", + "]l", + "lua MiniBracketed.location('forward')", + { desc = "Location forward" } + ) + vim.keymap.set("n", "]L", "lua MiniBracketed.location('last')", { desc = "Location last" }) + vim.keymap.set("n", "[O", "lua MiniBracketed.oldfile('first')", { desc = "Oldfile first" }) + vim.keymap.set( + "n", + "[o", + "lua MiniBracketed.oldfile('backward')", + { desc = "Oldfile backward" } + ) + vim.keymap.set( + "n", + "]o", + "lua MiniBracketed.oldfile('forward')", + { desc = "Oldfile forward" } + ) + vim.keymap.set("n", "]O", "lua MiniBracketed.oldfile('last')", { desc = "Oldfile last" }) + vim.keymap.set( + "n", + "[Q", + "lua MiniBracketed.quickfix('first')", + { desc = "Quickfix first" } + ) + vim.keymap.set( + "n", + "[q", + "lua MiniBracketed.quickfix('backward')", + { desc = "Quickfix backward" } + ) + vim.keymap.set( + "n", + "]q", + "lua MiniBracketed.quickfix('forward')", + { desc = "Quickfix forward" } + ) + vim.keymap.set("n", "]Q", "lua MiniBracketed.quickfix('last')", { desc = "Quickfix last" }) + vim.keymap.set( + "n", + "[T", + "lua MiniBracketed.treesitter('first')", + { desc = "Treesitter first" } + ) + vim.keymap.set( + "n", + "[t", + "lua MiniBracketed.treesitter('backward')", + { desc = "Treesitter backward" } + ) + vim.keymap.set( + "n", + "]t", + "lua MiniBracketed.treesitter('forward')", + { desc = "Treesitter forward" } + ) + vim.keymap.set( + "n", + "]T", + "lua MiniBracketed.treesitter('last')", + { desc = "Treesitter last" } + ) + vim.keymap.set("n", "[U", "lua MiniBracketed.undo('first')", { desc = "Undo first" }) + vim.keymap.set("n", "[u", "lua MiniBracketed.undo('backward')", { desc = "Undo backward" }) + vim.keymap.set("n", "]u", "lua MiniBracketed.undo('forward')", { desc = "Undo forward" }) + vim.keymap.set("n", "]U", "lua MiniBracketed.undo('last')", { desc = "Undo last" }) + vim.keymap.set("n", "w0", "lua MiniBracketed.window('first')", { desc = "Window first" }) + vim.keymap.set( + "n", + "w[", + "lua MiniBracketed.window('backward')", + { desc = "Window backward" } + ) + vim.keymap.set( + "n", + "w]", + "lua MiniBracketed.window('forward')", + { desc = "Window forward" } + ) + vim.keymap.set("n", "w$", "lua MiniBracketed.window('last')", { desc = "Window last" }) + vim.keymap.set("n", "[Y", "lua MiniBracketed.yank('first')", { desc = "Yank first" }) + vim.keymap.set("n", "[y", "lua MiniBracketed.yank('backward')", { desc = "Yank backward" }) + vim.keymap.set("n", "]y", "lua MiniBracketed.yank('forward')", { desc = "Yank forward" }) + vim.keymap.set("n", "]Y", "lua MiniBracketed.yank('last')", { desc = "Yank last" }) + end, + }, + { + "echasnovski/mini.files", + opts = { + -- I didn't like the default mappings, so I modified them + -- Module mappings created only inside explorer. + -- Use `''` (empty string) to not create one. + mappings = { + close = "q", + -- Use this if you want to open several files + go_in = "l", + -- This opens the file, but quits out of mini.files (default L) + go_in_plus = "", + -- I swapped the following 2 (default go_out: h) + -- go_out_plus: when you go out, it shows you only 1 item to the right + -- go_out: shows you all the items to the right + go_out = "H", + go_out_plus = "h", + -- Default + reset = ",", + -- Default @ + reveal_cwd = ".", + show_help = "g?", + -- Default = + synchronize = "s", + trim_left = "<", + trim_right = ">", + toggle_hidden = nil, + change_cwd = nil, + go_in_horizontal = nil, + go_in_vertical = nil, + go_in_horizontal_plus = nil, + go_in_vertical_plus = nil, + }, + options = { + use_as_default_explorer = true, + permanent_delete = false, + }, + windows = { + preview = true, + width_focus = 25, + width_preview = 40, + }, + }, + keys = { + { + "ee", + function() + if not MiniFiles.close() then + require("mini.files").open(vim.api.nvim_buf_get_name(0), true) + end + end, + desc = "Open mini.files", + }, + { + "eE", + function() + require("mini.files").open(vim.uv.cwd(), true) + end, + desc = "Open mini.files (cwd)", + }, + }, + config = function(_, opts) + require("mini.files").setup(opts) + + local show_dotfiles = true + local filter_show = function(fs_entry) + return true + end + local filter_hide = function(fs_entry) + return not vim.startswith(fs_entry.name, ".") + end + + local toggle_dotfiles = function() + show_dotfiles = not show_dotfiles + local new_filter = show_dotfiles and filter_show or filter_hide + require("mini.files").refresh({ content = { filter = new_filter } }) + 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().arget_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 files_set_cwd = function() + local cur_entry_path = MiniFiles.get_fs_entry().path + local cur_directory = vim.fs.dirname(cur_entry_path) + if cur_directory ~= nil then + vim.fn.chdir(cur_directory) + end + end + + local mini_files = require("mini.files") + local tmux_pane_function = require("TheSiahxyz.utils.tmux").tmux_pane_function + + local open_tmux_pane = function() + local curr_entry = mini_files.get_fs_entry() + if curr_entry then + if curr_entry.fs_type == "directory" then + tmux_pane_function(curr_entry.path) + elseif curr_entry.fs_type == "file" then + local parent_dir = vim.fn.fnamemodify(curr_entry.path, ":h") + tmux_pane_function(parent_dir) + elseif curr_entry.fs_type == "link" then + local resolved_path = vim.fn.resolve(curr_entry.path) + if vim.fn.isdirectory(resolved_path) == 1 then + tmux_pane_function(resolved_path) + else + local parent_dir = vim.fn.fnamemodify(resolved_path, ":h") + tmux_pane_function(parent_dir) + end + else + vim.notify("Unsupported file system entry type", vim.log.levels.WARN) + end + else + vim.notify("No entry selected", vim.log.levels.WARN) + end + end + + local copy_to_clipboard = function() + local curr_entry = mini_files.get_fs_entry() + if curr_entry then + local path = curr_entry.path + -- Escape the path for shell command + local escaped_path = vim.fn.fnameescape(path) + local cmd = vim.fn.has("mac") == 1 + and string.format([[osascript -e 'set the clipboard to POSIX file "%s"']], escaped_path) + or string.format([[echo -n %s | xclip -selection clipboard]], escaped_path) + local result = vim.fn.system(cmd) + if vim.v.shell_error ~= 0 then + vim.notify("Copy failed: " .. result, vim.log.levels.ERROR) + else + vim.notify(vim.fn.fnamemodify(path, ":t"), vim.log.levels.INFO) + vim.notify("Copied to system clipboard", vim.log.levels.INFO) + end + else + vim.notify("No file or directory selected", vim.log.levels.WARN) + end + end + + local zip_and_copy_to_clipboard = function() + local curr_entry = require("mini.files").get_fs_entry() + if curr_entry then + local path = curr_entry.path + local name = vim.fn.fnamemodify(path, ":t") -- Extract the file or directory name + local parent_dir = vim.fn.fnamemodify(path, ":h") -- Get the parent directory + local timestamp = os.date("%y%m%d%H%M%S") -- Append timestamp to avoid duplicates + local zip_path = string.format("/tmp/%s_%s.zip", name, timestamp) -- Path in macOS's tmp directory + -- Create the zip file + local zip_cmd = string.format( + "cd %s && zip -r %s %s", + vim.fn.shellescape(parent_dir), + vim.fn.shellescape(zip_path), + vim.fn.shellescape(name) + ) + local result = vim.fn.system(zip_cmd) + if vim.v.shell_error ~= 0 then + vim.notify("Failed to create zip file: " .. result, vim.log.levels.ERROR) + return + end + -- Copy the zip file to the system clipboard + local copy_cmd = vim.fn.has("mac") == 1 + and string.format([[osascript -e 'set the clipboard to POSIX file "%s"']], zip_path) + or string.format([[echo -n %s | xclip -selection clipboard]], zip_path) + local copy_result = vim.fn.system(copy_cmd) + if vim.v.shell_error ~= 0 then + vim.notify("Failed to copy zip file to clipboard: " .. copy_result, vim.log.levels.ERROR) + return + end + vim.notify(zip_path, vim.log.levels.INFO) + vim.notify("Zipped and copied to clipboard: ", vim.log.levels.INFO) + else + vim.notify("No file or directory selected", vim.log.levels.WARN) + end + end + + local paste_from_clipboard = function() + -- vim.notify("Starting the paste operation...", vim.log.levels.INFO) + if not mini_files then + vim.notify("mini.files module not loaded.", vim.log.levels.ERROR) + return + end + local curr_entry = mini_files.get_fs_entry() -- Get the current file system entry + if not curr_entry then + vim.notify("Failed to retrieve current entry in mini.files.", vim.log.levels.ERROR) + return + end + local curr_dir = curr_entry.fs_type == "directory" and curr_entry.path + or vim.fn.fnamemodify(curr_entry.path, ":h") -- Use parent directory if entry is a file + -- vim.notify("Current directory: " .. curr_dir, vim.log.levels.INFO) + local script = [[ +tell application "System Events" + try + set theFile to the clipboard as alias + set posixPath to POSIX path of theFile + return posixPath + on error + return "error" + end try +end tell +]] + local output = vim.fn.has("mac") == 1 and vim.fn.system("osascript -e " .. vim.fn.shellescape(script)) + or vim.fn.system("xclip -o -selection clipboard") + if vim.v.shell_error ~= 0 or output:find("error") then + vim.notify("Clipboard does not contain a valid file or directory.", vim.log.levels.WARN) + return + end + local source_path = output:gsub("%s+$", "") -- Trim whitespace from clipboard output + if source_path == "" then + vim.notify("Clipboard is empty or invalid.", vim.log.levels.WARN) + return + end + local dest_path = curr_dir .. "/" .. vim.fn.fnamemodify(source_path, ":t") -- Destination path in current directory + local copy_cmd = vim.fn.isdirectory(source_path) == 1 and { "cp", "-R", source_path, dest_path } + or { "cp", source_path, dest_path } -- Construct copy command + local result = vim.fn.system(copy_cmd) -- Execute the copy command + if vim.v.shell_error ~= 0 then + vim.notify("Paste operation failed: " .. result, vim.log.levels.ERROR) + return + end + -- vim.notify("Pasted " .. source_path .. " to " .. dest_path, vim.log.levels.INFO) + mini_files.synchronize() -- Refresh mini.files to show updated directory content + vim.notify("Pasted successfully.", vim.log.levels.INFO) + end + + local copy_path_to_clipboard = function() + -- Get the current entry (file or directory) + local curr_entry = mini_files.get_fs_entry() + if curr_entry then + -- Convert path to be relative to home directory + local home_dir = vim.fn.expand("~") + local relative_path = curr_entry.path:gsub("^" .. home_dir, "~") + vim.fn.setreg("+", relative_path) -- Copy the relative path to the clipboard register + vim.notify(vim.fn.fnamemodify(relative_path, ":t"), vim.log.levels.INFO) + vim.notify("Path copied to clipboard: ", vim.log.levels.INFO) + else + vim.notify("No file or directory selected", vim.log.levels.WARN) + end + end + + local preview_image = function() + local curr_entry = mini_files.get_fs_entry() + if curr_entry then + -- Preview the file using Quick Look + if vim.fn.has("mac") == 1 then + vim.system({ "qlmanage", "-p", curr_entry.path }, { + stdout = false, + stderr = false, + }) + vim.defer_fn(function() + vim.system({ "osascript", "-e", 'tell application "qlmanage" to activate' }) + end, 200) + else + -- TODO: add previewer for linux + vim.notify("Preview not supported on Linux.", vim.log.levels.WARN) + end + else + vim.notify("No file selected", vim.log.levels.WARN) + end + end + + local preview_image_popup = function() + -- Clear any existing images before rendering the new one + require("image").clear() + local curr_entry = mini_files.get_fs_entry() + if curr_entry and curr_entry.fs_type == "file" then + local ext = vim.fn.fnamemodify(curr_entry.path, ":e"):lower() + local supported_image_exts = { "png", "jpg", "jpeg", "gif", "bmp", "webp", "avif" } + -- Check if the file has a supported image extension + if vim.tbl_contains(supported_image_exts, ext) then + -- Save mini.files state (current path and focused entry) + local current_dir = vim.fn.fnamemodify(curr_entry.path, ":h") + local focused_entry = vim.fn.fnamemodify(curr_entry.path, ":t") -- Extract filename + -- Create a floating window for the image preview + local popup_width = math.floor(vim.o.columns * 0.6) + local popup_height = math.floor(vim.o.lines * 0.6) + local col = math.floor((vim.o.columns - popup_width) / 2) + local row = math.floor((vim.o.lines - popup_height) / 2) + local buf = vim.api.nvim_create_buf(false, true) -- Create a scratch buffer + local win = vim.api.nvim_open_win(buf, true, { + relative = "editor", + row = row, + col = col, + width = popup_width, + height = popup_height, + style = "minimal", + border = "rounded", + }) + -- Declare img_width and img_height at the top + local img_width, img_height + -- Get image dimensions using ImageMagick's identify command + local dimensions = vim.fn.systemlist( + string.format("identify -format '%%w %%h' %s", vim.fn.shellescape(curr_entry.path)) + ) + if #dimensions > 0 then + img_width, img_height = dimensions[1]:match("(%d+) (%d+)") + img_width = tonumber(img_width) + img_height = tonumber(img_height) + end + -- Calculate image display size while maintaining aspect ratio + local display_width = popup_width + local display_height = popup_height + if img_width and img_height then + local aspect_ratio = img_width / img_height + if aspect_ratio > (popup_width / popup_height) then + -- Image is wider than the popup window + display_height = math.floor(popup_width / aspect_ratio) + else + -- Image is taller than the popup window + display_width = math.floor(popup_height * aspect_ratio) + end + end + -- Center the image within the popup window + local image_x = math.floor((popup_width - display_width) / 2) + local image_y = math.floor((popup_height - display_height) / 2) + -- Use image.nvim to render the image + local img = require("image").from_file(curr_entry.path, { + id = curr_entry.path, -- Unique ID + window = win, -- Bind the image to the popup window + buffer = buf, -- Bind the image to the popup buffer + x = image_x, + y = image_y, + width = display_width, + height = display_height, + with_virtual_padding = true, + }) + -- Render the image + if img ~= nil then + img:render() + end + -- Use `stat` or `ls` to get the file size in bytes + local file_size_bytes = "" + if vim.fn.has("mac") == 1 or vim.fn.has("unix") == 1 then + -- For macOS or Linux systems + local handle = io.popen( + "stat -f%z " + .. vim.fn.shellescape(curr_entry.path) + .. " || ls -l " + .. vim.fn.shellescape(curr_entry.path) + .. " | awk '{print $5}'" + ) + if handle then + file_size_bytes = handle:read("*a"):gsub("%s+$", "") -- Trim trailing whitespace + handle:close() + end + else + -- Fallback message if the command isn't available + file_size_bytes = "0" + end + -- Convert the size to MB (if valid) + local file_size_mb = tonumber(file_size_bytes) and tonumber(file_size_bytes) / (1024 * 1024) + or 0 + local file_size_mb_str = string.format("%.2f", file_size_mb) -- Format to 2 decimal places as a string + -- Add image information (filename, size, resolution) + local image_info = {} + table.insert(image_info, "Image File: " .. focused_entry) -- Add only the filename + if tonumber(file_size_bytes) > 0 then + table.insert(image_info, "Size: " .. file_size_mb_str .. " MB") -- Use the formatted string + else + table.insert(image_info, "Size: Unable to detect") -- Fallback if size isn't found + end + if img_width and img_height then + table.insert(image_info, "Resolution: " .. img_width .. " x " .. img_height) + else + table.insert(image_info, "Resolution: Unable to detect") + end + -- Append the image information after the image + local line_count = vim.api.nvim_buf_line_count(buf) + vim.api.nvim_buf_set_lines(buf, line_count, -1, false, { "", "", "" }) -- Add 3 empty lines + vim.api.nvim_buf_set_lines(buf, -1, -1, false, image_info) + -- Keymap for closing the popup and reopening mini.files + local function reopen_mini_files() + if img ~= nil then + img:clear() + end + vim.api.nvim_win_close(win, true) + -- Reopen mini.files in the same directory + require("mini.files").open(current_dir, true) + vim.defer_fn(function() + -- Simulate navigation to the file by searching for the line matching the file + local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) -- Get all lines in the buffer + for i, line in ipairs(lines) do + if line:match(focused_entry) then + vim.api.nvim_win_set_cursor(0, { i, 0 }) -- Move cursor to the matching line + break + end + end + end, 50) -- Small delay to ensure mini.files is initialized + end + vim.keymap.set("n", "", reopen_mini_files, { buffer = buf, noremap = true, silent = true }) + else + vim.notify("Not an image file.", vim.log.levels.WARN) + end + else + vim.notify("No file selected or not a file.", vim.log.levels.WARN) + end + end + + local follow_symlink = function() + local curr_entry = mini_files.get_fs_entry() + if curr_entry and curr_entry.fs_type == "file" then + local resolved_path = vim.fn.resolve(curr_entry.path) -- Resolve symlink to original file + if resolved_path ~= curr_entry.path then + vim.notify("Following symlink to: " .. resolved_path, vim.log.levels.INFO) + mini_files.open(resolved_path, true) -- Open the original file in mini.files + else + vim.notify("The file is not a symlink.", vim.log.levels.WARN) + end + else + vim.notify("No file selected or not a valid file.", vim.log.levels.WARN) + end + end + + vim.api.nvim_create_autocmd("User", { + pattern = "MiniFilesBufferCreate", + callback = function() + local buf_id = vim.api.nvim_get_current_buf() + + vim.keymap.set( + "n", + opts.mappings and opts.mappings.toggle_hidden or "g.", + toggle_dotfiles, + { buffer = buf_id, desc = "Toggle hidden files" } + ) + + vim.keymap.set( + "n", + opts.mappings and opts.mappings.change_cwd or "gc", + files_set_cwd, + { buffer = buf_id, desc = "Set cwd" } + ) + + map_split(buf_id, opts.mappings and opts.mappings.go_in_horizontal or "s", "horizontal", false) + map_split(buf_id, opts.mappings and opts.mappings.go_in_vertical or "v", "vertical", false) + map_split( + buf_id, + opts.mappings and opts.mappings.go_in_horizontal_plus or "S", + "horizontal", + true + ) + map_split(buf_id, opts.mappings and opts.mappings.go_in_vertical_plus or "V", "vertical", true) + + vim.keymap.set( + "n", + "zt", + open_tmux_pane, + { buffer = buf_id, noremap = true, silent = true, desc = "Open tmux pane" } + ) + vim.keymap.set( + "n", + "zy", + copy_to_clipboard, + { buffer = buf_id, noremap = true, silent = true, desc = "Copy to clipboard" } + ) + vim.keymap.set( + "n", + "zY", + copy_path_to_clipboard, + { buffer = buf_id, desc = "Copy path to clipboard" } + ) + vim.keymap.set( + "n", + "zc", + zip_and_copy_to_clipboard, + { buffer = buf_id, noremap = true, silent = true, desc = "Zip and copy" } + ) + vim.keymap.set( + "n", + "zp", + paste_from_clipboard, + { buffer = buf_id, noremap = true, silent = true, desc = "Paste from clipboard" } + ) + vim.keymap.set( + "n", + "zi", + preview_image, + { buffer = buf_id, noremap = true, silent = true, desc = "Preview image" } + ) + vim.keymap.set( + "n", + "zI", + preview_image_popup, + { buffer = buf_id, noremap = true, silent = true, desc = "Pop-up preview image" } + ) + vim.keymap.set( + "n", + "gl", + follow_symlink, + { buffer = buf_id, noremap = true, silent = true, desc = "Follow link" } + ) + end, + }) + + -- Git status + local nsMiniFiles = vim.api.nvim_create_namespace("mini_files_git") + local autocmd = vim.api.nvim_create_autocmd + local _, MiniFiles = pcall(require, "mini.files") + + -- Cache for git status + local gitStatusCache = {} + local cacheTimeout = 2000 -- Cache timeout in milliseconds + + local function isSymlink(path) + local stat = vim.loop.fs_lstat(path) + return stat and stat.type == "link" + end + + ---@type table + ---@param status string + ---@return string symbol, string hlGroup + local function mapSymbols(status, is_symlink) + local statusMap = { +-- stylua: ignore start +[" M"] = { symbol = "✹", hlGroup = "MiniDiffSignChange"}, -- Modified in the working directory +["M "] = { symbol = "•", hlGroup = "MiniDiffSignChange"}, -- modified in index +["MM"] = { symbol = "≠", hlGroup = "MiniDiffSignChange"}, -- modified in both working tree and index +["A "] = { symbol = "+", hlGroup = "MiniDiffSignAdd" }, -- Added to the staging area, new file +["AA"] = { symbol = "≈", hlGroup = "MiniDiffSignAdd" }, -- file is added in both working tree and index +["D "] = { symbol = "-", hlGroup = "MiniDiffSignDelete"}, -- Deleted from the staging area +["AM"] = { symbol = "⊕", hlGroup = "MiniDiffSignChange"}, -- added in working tree, modified in index +["AD"] = { symbol = "-•", hlGroup = "MiniDiffSignChange"}, -- Added in the index and deleted in the working directory +["R "] = { symbol = "→", hlGroup = "MiniDiffSignChange"}, -- Renamed in the index +["U "] = { symbol = "‖", hlGroup = "MiniDiffSignChange"}, -- Unmerged path +["UU"] = { symbol = "⇄", hlGroup = "MiniDiffSignAdd" }, -- file is unmerged +["UA"] = { symbol = "⊕", hlGroup = "MiniDiffSignAdd" }, -- file is unmerged and added in working tree +["??"] = { symbol = "?", hlGroup = "MiniDiffSignDelete"}, -- Untracked files +["!!"] = { symbol = "!", hlGroup = "MiniDiffSignChange"}, -- Ignored files + -- stylua: ignore end + } + + local result = statusMap[status] or { symbol = "?", hlGroup = "NonText" } + local gitSymbol = result.symbol + local gitHlGroup = result.hlGroup + + local symlinkSymbol = is_symlink and "↩" or "" + + -- Combine symlink symbol with Git status if both exist + local combinedSymbol = (symlinkSymbol .. gitSymbol):gsub("^%s+", ""):gsub("%s+$", "") + -- Change the color of the symlink icon from "MiniDiffSignDelete" to something else + local combinedHlGroup = is_symlink and "MiniDiffSignDelete" or gitHlGroup + + return combinedSymbol, combinedHlGroup + end + + ---@param cwd string + ---@param callback function + ---@return nil + local function fetchGitStatus(cwd, callback) + local function on_exit(content) + if content.code == 0 then + callback(content.stdout) + vim.g.content = content.stdout + end + end + vim.system({ "git", "status", "--ignored", "--porcelain" }, { text = true, cwd = cwd }, on_exit) + end + + ---@param str string|nil + ---@return string + local function escapePattern(str) + if not str then + return "" + end + return (str:gsub("([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1")) + end + + ---@param buf_id integer + ---@param gitStatusMap table + ---@return nil + local function updateMiniWithGit(buf_id, gitStatusMap) + vim.schedule(function() + local nlines = vim.api.nvim_buf_line_count(buf_id) + local cwd = vim.fs.root(buf_id, ".git") + local escapedcwd = escapePattern(cwd) + if vim.fn.has("win32") == 1 then + escapedcwd = escapedcwd:gsub("\\", "/") + end + + for i = 1, nlines do + local entry = MiniFiles.get_fs_entry(buf_id, i) + if not entry then + break + end + local relativePath = entry.path:gsub("^" .. escapedcwd .. "/", "") + local status = gitStatusMap[relativePath] + + if status then + local is_symlink = isSymlink(entry.path) + local symbol, hlGroup = mapSymbols(status, is_symlink) + vim.api.nvim_buf_set_extmark(buf_id, nsMiniFiles, i - 1, 0, { + -- NOTE: if you want the signs on the right uncomment those and comment + -- the 3 lines after + -- virt_text = { { symbol, hlGroup } }, + -- virt_text_pos = "right_align", + sign_text = symbol, + sign_hl_group = hlGroup, + priority = 2, + }) + else + end + end + end) + end + + -- Thanks for the idea of gettings https://github.com/refractalize/oil-git-status.nvim signs for dirs + ---@param content string + ---@return table + local function parseGitStatus(content) + local gitStatusMap = {} + -- lua match is faster than vim.split (in my experience ) + for line in content:gmatch("[^\r\n]+") do + local status, filePath = string.match(line, "^(..)%s+(.*)") + -- Split the file path into parts + local parts = {} + for part in filePath:gmatch("[^/]+") do + table.insert(parts, part) + end + -- Start with the root directory + local currentKey = "" + for i, part in ipairs(parts) do + if i > 1 then + -- Concatenate parts with a separator to create a unique key + currentKey = currentKey .. "/" .. part + else + currentKey = part + end + -- If it's the last part, it's a file, so add it with its status + if i == #parts then + gitStatusMap[currentKey] = status + else + -- If it's not the last part, it's a directory. Check if it exists, if not, add it. + if not gitStatusMap[currentKey] then + gitStatusMap[currentKey] = status + end + end + end + end + return gitStatusMap + end + + ---@param buf_id integer + ---@return nil + local function updateGitStatus(buf_id) + local cwd = vim.uv.cwd() + if not cwd or not vim.fs.root(cwd, ".git") then + return + end + + local currentTime = os.time() + if gitStatusCache[cwd] and currentTime - gitStatusCache[cwd].time < cacheTimeout then + updateMiniWithGit(buf_id, gitStatusCache[cwd].statusMap) + else + fetchGitStatus(cwd, function(content) + local gitStatusMap = parseGitStatus(content) + gitStatusCache[cwd] = { + time = currentTime, + statusMap = gitStatusMap, + } + updateMiniWithGit(buf_id, gitStatusMap) + end) + end + end + + ---@return nil + local function clearCache() + gitStatusCache = {} + end + + local function augroup(name) + return vim.api.nvim_create_augroup("MiniFiles_" .. name, { clear = true }) + end + + autocmd("User", { + group = augroup("start"), + pattern = "MiniFilesExplorerOpen", + -- pattern = { "minifiles" }, + callback = function() + local bufnr = vim.api.nvim_get_current_buf() + updateGitStatus(bufnr) + end, + }) + + autocmd("User", { + group = augroup("close"), + pattern = "MiniFilesExplorerClose", + callback = function() + clearCache() + end, + }) + + autocmd("User", { + group = augroup("update"), + pattern = "MiniFilesBufferUpdate", + callback = function(sii) + local bufnr = sii.data.buf_id + local cwd = vim.fn.expand("%:p:h") + if gitStatusCache[cwd] then + updateMiniWithGit(bufnr, gitStatusCache[cwd].statusMap) + end + end, + }) + end, + }, + { + "echasnovski/mini.indentscope", + version = false, -- wait till new 0.7.0 release to put it back on semver + event = "VeryLazy", + opts = { + mappings = { + -- Textobjects + object_scope = "i-", + object_scope_with_border = "a-", + + -- Motions (jump to respective border line; if not present - body line) + goto_top = "g,", + goto_bottom = "g;", + }, + draw = { + animation = function() + return 0 + end, + }, + options = { try_as_border = true }, + symbol = "│", + }, + init = function() + vim.api.nvim_create_autocmd("FileType", { + pattern = { + "help", + "Trouble", + "trouble", + "lazy", + "mason", + }, + callback = function() + vim.b.miniindentscope_disable = true + end, + }) + end, + }, + { + "echasnovski/mini.map", + version = false, + config = function() + require("mini.map").setup( + -- No need to copy this inside `setup()`. Will be used automatically. + { + -- Highlight integrations (none by default) + integrations = nil, + + -- Symbols used to display data + symbols = { + -- Encode symbols. See `:h MiniMap.config` for specification and + -- `:h MiniMap.gen_encode_symbols` for pre-built ones. + -- Default: solid blocks with 3x2 resolution. + encode = nil, + + -- Scrollbar parts for view and line. Use empty string to disable any. + scroll_line = "█", + scroll_view = "┃", + }, + + -- Window options + window = { + -- Whether window is focusable in normal way (with `wincmd` or mouse) + focusable = true, + + -- Side to stick ('left' or 'right') + side = "right", + + -- Whether to show count of multiple integration highlights + show_integration_count = true, + + -- Total width + width = 10, + + -- Value of 'winblend' option + winblend = 25, + + -- Z-index + zindex = 10, + }, + } + ) + end, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "zm", group = "Map" }, + }) + end, + keys = { + { "zmo", "lua MiniMap.open()", desc = "Open map" }, + { "zmm", "lua MiniMap.refresh()", desc = "Refresh map" }, + { "zmq", "lua MiniMap.close()", desc = "Close map" }, + { "zmm", "lua MiniMap.toggle()", desc = "Toggle map" }, + { "zms", "lua MiniMap.toggle_side()", desc = "Toggle side map" }, + }, + }, + { + "echasnovski/mini.move", + version = false, + config = function() + -- No need to copy this inside `setup()`. Will be used automatically. + require("mini.move").setup({ + -- Module mappings. Use `''` (empty string) to disable one. + mappings = { + -- Move visual selection in Visual mode. Defaults are Alt (Meta) + hjkl. + left = "", + right = "", + -- down = "", + -- up = "", + + -- Move current line in Normal mode + line_left = "", + line_right = "", + -- line_down = "", + -- line_up = "", + }, + + -- Options which control moving behavior + options = { + -- Automatically reindent selection during linewise vertical move + reindent_linewise = true, + }, + }) + end, + }, + { + "echasnovski/mini.pairs", + version = false, + event = "VeryLazy", + config = function() + require("mini.pairs").setup() + end, + keys = { + { + "zp", + function() + vim.g.minipairs_disable = not vim.g.minipairs_disable + end, + desc = "Toggle auto pairs", + }, + }, + }, + { + "echasnovski/mini.splitjoin", + version = false, + config = function() + require("mini.splitjoin").setup() + + vim.keymap.set( + "n", + "zj", + ":lua MiniSplitjoin.toggle()", + { noremap = true, silent = true, desc = "Toggle split-join" } + ) + vim.keymap.set( + "n", + "J", + ":lua MiniSplitjoin.join()", + { noremap = true, silent = true, desc = "Join" } + ) + vim.keymap.set( + "n", + "", + ":lua MiniSplitjoin.split()", + { noremap = true, silent = true, desc = "Split" } + ) + end, + }, + { + "echasnovski/mini.trailspace", + version = false, + config = function() + require("mini.trailspace").setup() + vim.keymap.set( + "n", + "zW", + ":lua MiniTrailspace.trim()", + { noremap = true, silent = true, desc = "Trim trailing whitespace" } + ) + vim.keymap.set( + "n", + "zL", + ":lua MiniTrailspace.trim_last_lines()", + { noremap = true, silent = true, desc = "Trim trailing empty lines" } + ) + end, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/navic.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/navic.lua new file mode 100644 index 0000000..89cfa81 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/navic.lua @@ -0,0 +1,52 @@ +return { + "SmiteshP/nvim-navic", + dependencies = { + "neovim/nvim-lspconfig", + }, + config = function() + require("nvim-navic").setup({ + icons = { + File = "󰈙 ", + Module = " ", + Namespace = "󰌗 ", + Package = " ", + Class = "󰌗 ", + Method = "󰆧 ", + Property = " ", + Field = " ", + Constructor = " ", + Enum = "󰕘", + Interface = "󰕘", + Function = "󰊕 ", + Variable = "󰆧 ", + Constant = "󰏿 ", + String = "󰀬 ", + Number = "󰎠 ", + Boolean = "◩ ", + Array = "󰅪 ", + Object = "󰅩 ", + Key = "󰌋 ", + Null = "󰟢 ", + EnumMember = " ", + Struct = "󰌗 ", + Event = " ", + Operator = "󰆕 ", + TypeParameter = "󰊄 ", + }, + lsp = { + auto_attach = true, + preference = nil, + }, + highlight = true, + separator = " > ", + depth_limit = 5, + depth_limit_indicator = "..", + safe_output = true, + lazy_update_context = false, + click = true, + format_text = function(text) + return text + end, + }) + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/neo-tree.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/neo-tree.lua new file mode 100644 index 0000000..c05716d --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/neo-tree.lua @@ -0,0 +1,167 @@ +return { + { + "nvim-neo-tree/neo-tree.nvim", + branch = "v3.x", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended + "MunifTanjim/nui.nvim", + { + "s1n7ax/nvim-window-picker", -- for open_with_window_picker keymaps + 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" }, + }, + }, + }) + end, + }, + { "3rd/image.nvim", opts = {} }, -- Optional image support in preview window: See `# Preview Mode` for more information + }, + lazy = false, -- neo-tree will lazily load itself + ---@module "neo-tree" + ---@type neotree.Config? + opts = { + filesystem = { + hijack_netrw_behavior = "disabled", -- open_default, open_current + follow_current_file = { enabled = false }, + commands = { + -- over write default 'delete' command to 'trash'. + delete = function(state) + if vim.fn.executable("trash") == 0 then + vim.api.nvim_echo({ + { "- Trash utility not installed. Make sure to install it first\n", nil }, + { "- In macOS run `brew install trash`\n", nil }, + { "- Or delete the `custom delete command` section in neo-tree", nil }, + }, false, {}) + return + end + local inputs = require("neo-tree.ui.inputs") + local path = state.tree:get_node().path + local msg = "Are you sure you want to trash " .. path + inputs.confirm(msg, function(confirmed) + if not confirmed then + return + end + + vim.fn.system({ "trash", vim.fn.fnameescape(path) }) + require("neo-tree.sources.manager").refresh(state.name) + end) + end, + -- Overwrite default 'delete_visual' command to 'trash' x n. + delete_visual = function(state, selected_nodes) + if vim.fn.executable("trash") == 0 then + vim.api.nvim_echo({ + { "- Trash utility not installed. Make sure to install it first\n", nil }, + { "- In macOS run `brew install trash`\n", nil }, + { "- Or delete the `custom delete command` section in neo-tree", nil }, + }, false, {}) + return + end + local inputs = require("neo-tree.ui.inputs") + + -- Function to get the count of items in a table + local function GetTableLen(tbl) + local len = 0 + for _ in pairs(tbl) do + len = len + 1 + end + return len + end + + local count = GetTableLen(selected_nodes) + local msg = "Are you sure you want to trash " .. count .. " files?" + inputs.confirm(msg, function(confirmed) + if not confirmed then + return + end + for _, node in ipairs(selected_nodes) do + vim.fn.system({ "trash", vim.fn.fnameescape(node.path) }) + end + require("neo-tree.sources.manager").refresh(state.name) + end) + end, + avante_add_files = function(state) + local node = state.tree:get_node() + local filepath = node:get_id() + local relative_path = require("avante.utils").relative_path(filepath) + + local sidebar = require("avante").get() + + local open = sidebar:is_open() + -- ensure avante sidebar is open + if not open then + require("avante.api").ask() + sidebar = require("avante").get() + end + + sidebar.file_selector:add_selected_file(relative_path) + + -- remove neo tree buffer + if not open then + sidebar.file_selector:remove_selected_file("neo-tree filesystem [1]") + end + end, + }, + window = { + mappings = { + ["oa"] = "avante_add_files", + }, + }, + }, + }, + keys = { + { "e", false }, + { "E", false }, + { + "en", + function() + local buf_name = vim.api.nvim_buf_get_name(0) + -- Function to check if NeoTree is open in any window + local function is_neo_tree_open() + for _, win in ipairs(vim.api.nvim_list_wins()) do + local buf = vim.api.nvim_win_get_buf(win) + if vim.bo[buf].filetype == "neo-tree" then + return true + end + end + return false + end + -- Check if the current file exists + if + vim.fn.filereadable(buf_name) == 1 + or vim.fn.isdirectory(vim.fn.fnamemodify(buf_name, ":p:h")) == 1 + then + if is_neo_tree_open() then + -- Close NeoTree if it's open + vim.cmd("Neotree close") + else + -- Open NeoTree and reveal the current file + vim.cmd("Neotree reveal") + end + else + -- If the file doesn't exist, execute the logic for R + require("neo-tree.command").execute({ toggle = true, dir = vim.uv.cwd() }) + end + end, + desc = "Open neo-tree", + }, + { + "eN", + function() + require("neo-tree.command").execute({ toggle = true, dir = vim.uv.cwd() }) + end, + desc = "Open neo-tree (cwd)", + }, + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/obsidian.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/obsidian.lua new file mode 100644 index 0000000..c5f3a59 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/obsidian.lua @@ -0,0 +1,616 @@ +return { + "epwalsh/obsidian.nvim", + version = "*", -- recommended, use latest release instead of latest commit + lazy = true, + ft = "markdown", + -- Replace the above line with this if you only want to load obsidian.nvim for markdown files in your vault: + -- event = { + -- -- If you want to use the home shortcut '~' here you need to call 'vim.fn.expand'. + -- -- E.g. "BufReadPre " .. vim.fn.expand "~" .. "/my-vault/*.md" + -- -- refer to `:h file-pattern` for more examples + -- "BufReadPre path/to/my-vault/*.md", + -- "BufNewFile path/to/my-vault/*.md", + -- }, + dependencies = { + -- Required. + "nvim-lua/plenary.nvim", + -- see below for full list of optional dependencies 👇 + "hrsh7th/nvim-cmp", + "nvim-telescope/telescope.nvim", + "nvim-treesitter/nvim-treesitter", + { + "epwalsh/pomo.nvim", + dependencies = "nvim-lualine/lualine.nvim", + config = function() + require("lualine").setup({ + sections = { + lualine_x = { + function() + local ok, pomo = pcall(require, "pomo") + if not ok then + return "" + end + + local timer = pomo.get_first_to_finish() + if timer == nil then + return "" + end + + return "󰄉 " .. tostring(timer) + end, + "encoding", + "fileformat", + "filetype", + }, + }, + }) + + require("telescope").load_extension("pomodori") + + vim.keymap.set("n", "mp", function() + require("telescope").extensions.pomodori.timers() + end, { desc = "Manage pomodori" }) + end, + }, + }, + cmd = { + "ObsidianOpen", + "ObsidianNew", + "ObsidianQuickSwitch", + "ObsidianFollowLink", + "ObsidianBacklinks", + "ObsidianTags", + "ObsidianToday", + "ObsidianYesterday", + "ObsidianTomorrow", + "ObsidianDailies", + "ObsidianTemplate", + "ObsidianSearch", + "ObsidianLink", + "ObsidianLinkNew", + "ObsidianExtractNote", + "ObsidianWorkspace", + "ObsidianPasteImg", + "ObsidianRename", + "ObsidianToggleCheckbox", + "ObsidianNewFromTemplate", + "ObsidianTOC", + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v", "x" }, + { "o", group = "Open/Obsidian" }, + { "of", group = "Find files (Obsidian)" }, + { "on", group = "Notes (Obsidian)" }, + { "op", group = "Paste (Obsidian)" }, + { "ot", group = "Templates (Obsidian)" }, + }) + end, + config = function() + require("obsidian").setup({ + -- A list of workspace names, paths, and configuration overrides. + -- If you use the Obsidian app, the 'path' of a workspace should generally be + -- your vault root (where the `.obsidian` folder is located). + -- When obsidian.nvim is loaded by your plugin manager, it will automatically set + -- the workspace to the first workspace in the list whose `path` is a parent of the + -- current markdown file being edited. + workspaces = { + { + name = "personal", + path = "~/Private/repos/Obsidian/SI", + -- Optional, override certain settings. + overrides = { + notes_subdir = "", + }, + }, + }, + + -- Alternatively - and for backwards compatibility - you can set 'dir' to a single path instead of + -- 'workspaces'. For example: + -- dir = "~/vaults/work", + + -- Optional, if you keep notes in a specific subdirectory of your vault. + notes_subdir = "", + + -- Optional, set the log level for obsidian.nvim. This is an integer corresponding to one of the log + -- levels defined by "vim.log.levels.*". + log_level = vim.log.levels.INFO, + + daily_notes = { + -- Optional, if you keep daily notes in a separate directory. + folder = "Area/Notes", + -- Optional, if you want to change the date format for the ID of daily notes. + date_format = "%Y-%m-%d", + -- Optional, if you want to change the date format of the default alias of daily notes. + alias_format = "%B %-d, %Y", + -- Optional, default tags to add to each new daily note created. + default_tags = { "daily-notes" }, + -- Optional, if you want to automatically insert a template from your template directory like 'daily.md' + template = nil, + }, + + -- Optional, completion of wiki links, local markdown links, and tags using nvim-cmp. + completion = { + -- Set to false to disable completion. + nvim_cmp = true, + -- Trigger completion at 2 chars. + min_chars = 2, + }, + + -- Optional, configure key mappings. These are the defaults. If you don't want to set any keymappings this + -- way then set 'mappings = {}'. + mappings = { + -- Smart action depending on context, either follow link or toggle checkbox. + [""] = { + action = function() + return require("obsidian").util.smart_action() + end, + opts = { buffer = true, expr = true }, + }, + }, + + -- Where to put new notes. Valid options are + -- * "current_dir" - put new notes in same directory as the current buffer. + -- * "notes_subdir" - put new notes in the default notes subdirectory. + new_notes_location = "current_dir", + + -- Optional, customize how note IDs are generated given an optional title. + ---@param title string|? + ---@return string + note_id_func = function(title) + -- Create note IDs in a Zettelkasten format with a timestamp and a suffix. + -- In this case a note with the title 'My new note' will be given an ID that looks + -- like '1657296016-my-new-note', and therefore the file name '1657296016-my-new-note.md' + local suffix = "" + if title ~= nil then + -- If title is given, transform it into valid file name. + suffix = title:gsub(" ", "-"):gsub("[^A-Za-z0-9-]", ""):lower() + else + -- If title is nil, just add 4 random uppercase letters to the suffix. + for _ = 1, 4 do + suffix = suffix .. string.char(math.random(65, 90)) + end + end + return suffix + end, + + -- Optional, customize how note file names are generated given the ID, target directory, and title. + ---@param spec { id: string, dir: obsidian.Path, title: string|? } + ---@return string|obsidian.Path The full path to the new note. + note_path_func = function(spec) + -- This is equivalent to the default behavior. + local path = spec.dir / "Contents" / tostring(spec.title) + return path:with_suffix(".md") + end, + + -- Optional, customize how wiki links are formatted. You can set this to one of: + -- * "use_alias_only", e.g. '[[Foo Bar]]' + -- * "prepend_note_id", e.g. '[[foo-bar|Foo Bar]]' + -- * "prepend_note_path", e.g. '[[foo-bar.md|Foo Bar]]' + -- * "use_path_only", e.g. '[[foo-bar.md]]' + -- Or you can set it to a function that takes a table of options and returns a string, like this: + wiki_link_func = function(opts) + return require("obsidian.util").wiki_link_path_prefix(opts) + end, + + -- Optional, customize how markdown links are formatted. + markdown_link_func = function(opts) + return require("obsidian.util").markdown_link(opts) + end, + + -- Either 'wiki' or 'markdown'. + preferred_link_style = "wiki", + + -- Optional, boolean or a function that takes a filename and returns a boolean. + -- `true` indicates that you don't want obsidian.nvim to manage frontmatter. + disable_frontmatter = false, + + -- -- Optional, alternatively you can customize the frontmatter data. + -- ---@return table + -- note_frontmatter_func = function(note) + -- -- Add the title of the note as an alias. + -- if note.title then + -- note:add_alias(note.title) + -- end + -- + -- local out = { id = note.id, aliases = note.aliases, tags = note.tags } + -- + -- -- `note.metadata` contains any manually added fields in the frontmatter. + -- -- So here we just make sure those fields are kept in the frontmatter. + -- if note.metadata ~= nil and not vim.tbl_isempty(note.metadata) then + -- for k, v in pairs(note.metadata) do + -- out[k] = v + -- end + -- end + -- + -- return out + -- end, + + -- Optional, for templates (see below). + templates = { + folder = "Resource/Templates", + date_format = "%Y-%m-%d", + time_format = "%H:%M", + -- A map for custom variables, the key should be the variable and the value a function + substitutions = {}, + }, + + -- Optional, by default when you use `:ObsidianFollowLink` on a link to an external + -- URL it will be ignored but you can customize this behavior here. + ---@param url string + follow_url_func = function(url) + -- Open the URL in the default web browser. + -- vim.fn.jobstart({ "open", url }) -- Mac OS + vim.fn.jobstart({ "xdg-open", url }) -- linux + -- vim.cmd(':silent exec "!start ' .. url .. '"') -- Windows + -- vim.ui.open(url) -- need Neovim 0.10.0+ + end, + + -- Optional, by default when you use `:ObsidianFollowLink` on a link to an image + -- file it will be ignored but you can customize this behavior here. + ---@param img string + follow_img_func = function(img) + -- vim.fn.jobstart({ "qlmanage", "-p", img }) -- Mac OS quick look preview + vim.fn.jobstart({ "nsxiv", "-aiop", img }) -- linux + -- vim.cmd(':silent exec "!start ' .. url .. '"') -- Windows + end, + + -- Optional, set to true if you use the Obsidian Advanced URI plugin. + -- https://github.com/Vinzent03/obsidian-advanced-uri + use_advanced_uri = false, + + -- Optional, set to true to force ':ObsidianOpen' to bring the app to the foreground. + open_app_foreground = false, + + picker = { + -- Set your preferred picker. Can be one of 'telescope.nvim', 'fzf-lua', or 'mini.pick'. + name = "telescope.nvim", + -- Optional, configure key mappings for the picker. These are the defaults. + -- Not all pickers support all mappings. + note_mappings = { + -- Create a new note from your query. + new = "", + -- Insert a link to the selected note. + insert_link = "", + }, + tag_mappings = { + -- Add tag(s) to current note. + tag_note = "", + -- Insert a tag at the current location. + insert_tag = "", + }, + }, + + -- Optional, sort search results by "path", "modified", "accessed", or "created". + -- The recommend value is "modified" and `true` for `sort_reversed`, which means, for example, + -- that `:ObsidianQuickSwitch` will show the notes sorted by latest modified time + sort_by = "modified", + sort_reversed = true, + + -- Set the maximum number of lines to read from notes on disk when performing certain searches. + search_max_lines = 1000, + + -- Optional, determines how certain commands open notes. The valid options are: + -- 1. "current" (the default) - to always open in the current window + -- 2. "vsplit" - to open in a vertical split if there's not already a vertical split + -- 3. "hsplit" - to open in a horizontal split if there's not already a horizontal split + open_notes_in = "current", + + -- Optional, define your own callbacks to further customize behavior. + callbacks = { + -- Runs at the end of `require("obsidian").setup()`. + ---@param client obsidian.Client + post_setup = function(client) end, + + -- Runs anytime you enter the buffer for a note. + ---@param client obsidian.Client + ---@param note obsidian.Note + enter_note = function(client, note) end, + + -- Runs anytime you leave the buffer for a note. + ---@param client obsidian.Client + ---@param note obsidian.Note + leave_note = function(client, note) end, + + -- Runs right before writing the buffer for a note. + ---@param client obsidian.Client + ---@param note obsidian.Note + pre_write_note = function(client, note) end, + + -- Runs anytime the workspace is set/changed. + ---@param client obsidian.Client + ---@param workspace obsidian.Workspace + post_set_workspace = function(client, workspace) end, + }, + + -- Optional, configure additional syntax highlighting / extmarks. + -- This requires you have `conceallevel` set to 1 or 2. See `:help conceallevel` for more details. + ui = { + enable = false, -- set to false to disable all additional syntax features + update_debounce = 200, -- update delay after a text change (in milliseconds) + max_file_length = 5000, -- disable UI features for files with more than this many lines + -- Define how various check-boxes are displayed + checkboxes = { + -- NOTE: the 'char' value has to be a single character, and the highlight groups are defined below. + [" "] = { char = "󰄱", hl_group = "ObsidianTodo" }, + ["x"] = { char = "", hl_group = "ObsidianDone" }, + [">"] = { char = "", hl_group = "ObsidianRightArrow" }, + ["~"] = { char = "󰰱", hl_group = "ObsidianTilde" }, + ["!"] = { char = "", hl_group = "ObsidianImportant" }, + -- Replace the above with this if you don't have a patched font: + -- [" "] = { char = "☐", hl_group = "ObsidianTodo" }, + -- ["x"] = { char = "✔", hl_group = "ObsidianDone" }, + + -- You can also add more custom ones... + }, + -- Use bullet marks for non-checkbox lists. + bullets = { char = "•", hl_group = "ObsidianBullet" }, + external_link_icon = { char = "", hl_group = "ObsidianExtLinkIcon" }, + -- Replace the above with this if you don't have a patched font: + -- external_link_icon = { char = "", hl_group = "ObsidianExtLinkIcon" }, + reference_text = { hl_group = "ObsidianRefText" }, + highlight_text = { hl_group = "ObsidianHighlightText" }, + tags = { hl_group = "ObsidianTag" }, + block_ids = { hl_group = "ObsidianBlockID" }, + hl_groups = { + -- The options are passed directly to `vim.api.nvim_set_hl()`. See `:help nvim_set_hl`. + ObsidianTodo = { bold = true, fg = "#f78c6c" }, + ObsidianDone = { bold = true, fg = "#89ddff" }, + ObsidianRightArrow = { bold = true, fg = "#f78c6c" }, + ObsidianTilde = { bold = true, fg = "#ff5370" }, + ObsidianImportant = { bold = true, fg = "#d73128" }, + ObsidianBullet = { bold = true, fg = "#89ddff" }, + ObsidianRefText = { underline = true, fg = "#c792ea" }, + ObsidianExtLinkIcon = { fg = "#c792ea" }, + ObsidianTag = { italic = true, fg = "#89ddff" }, + ObsidianBlockID = { italic = true, fg = "#89ddff" }, + ObsidianHighlightText = { bg = "#75662e" }, + }, + }, + + -- Specify how to handle attachments. + attachments = { + -- The default folder to place images in via `:ObsidianPasteImg`. + -- If this is a relative path it will be interpreted as relative to the vault root. + -- You can always override this per image by passing a full path to the command instead of just a filename. + img_folder = "assets/imgs", -- This is the default + + -- Optional, customize the default name or prefix when pasting images via `:ObsidianPasteImg`. + ---@return string + img_name_func = function() + -- Prefix image names with timestamp. + return string.format("%s-", os.time()) + end, + + -- A function that determines the text to insert in the note when pasting an image. + -- It takes two arguments, the `obsidian.Client` and an `obsidian.Path` to the image file. + -- This is the default implementation. + ---@param client obsidian.Client + ---@param path obsidian.Path the absolute path to the image file + ---@return string + img_text_func = function(client, path) + path = client:vault_relative_path(path) or path + return string.format("![%s](%s)", path.name, path) + end, + }, + }) + + vim.api.nvim_create_autocmd("FileType", { + pattern = "markdown", + callback = function() + vim.keymap.set("n", "gl", function() + if require("obsidian").util.cursor_on_markdown_link() then + return "ObsidianFollowLink" + else + return "gl" + end + end, { noremap = false, expr = true, desc = "Follow link (Obsidian)" }) + end, + }) + end, + keys = { + { + "zb", + function() + return require("obsidian").util.toggle_checkbox() + end, + buffer = true, + ft = "markdown", + desc = "Toggle check box (Obsidian)", + }, + { + "ob", + function() + local query = vim.fn.input("Enter query: ") + if query and #query > 0 then + vim.cmd("ObsidianOpen " .. query) + end + end, + ft = "markdown", + desc = "Open note (Obsidian)", + }, + { + "onn", + function() + local title = vim.fn.input("Enter title: ") + if title and #title > 0 then + vim.cmd("ObsidianNew " .. title) + end + end, + ft = "markdown", + desc = "New note (Obsidian)", + }, + { + "os", + "ObsidianQuickSwitch", + ft = "markdown", + desc = "Quick switch (Obsidian)", + }, + { + "oL", + "ObsidianFollowLink", + ft = "markdown", + desc = "Follow link (Obsidian)", + }, + { + "oH", + "ObsidianBacklinks", + ft = "markdown", + desc = "Back link (Obsidian)", + }, + { + "oft", + function() + local tags = vim.fn.input("Enter tag: ") + if tags and #tags > 0 then + vim.cmd("ObsidianTags " .. tags) + end + end, + ft = "markdown", + desc = "Search tag notes (Obsidian)", + }, + { + "ont", + function() + local offset = vim.fn.input("Enter offset: ") + if offset and #offset > 0 then + vim.cmd("ObsidianToday " .. offset) + else + vim.cmd("ObsidianToday") + end + end, + ft = "markdown", + desc = "Today note (Obsidian)", + }, + { + "ony", + "ObsidianYesterday", + ft = "markdown", + desc = "Yesterday note (Obsidian)", + }, + { + "ont", + "ObsidianTomorrow", + ft = "markdown", + desc = "Tomorrow note (Obsidian)", + }, + { + "ond", + function() + local offset = vim.fn.input("Enter offset: ") + if offset and #offset > 0 then + vim.cmd("ObsidianDailies " .. offset) + else + vim.cmd("ObsidianDailies") + end + end, + ft = "markdown", + desc = "Daily notes (Obsidian)", + }, + { + "oti", + "ObsidianTemplate", + ft = "markdown", + desc = "Insert templates (Obsidian)", + }, + { + "ofn", + function() + local note = vim.fn.input("Enter note: ") + if note and #note > 0 then + vim.cmd("ObsidianSearch " .. note) + end + end, + ft = "markdown", + desc = "Search note (Obsidian)", + }, + { + "ow", + function() + local name = vim.fn.input("Enter name: ") + if name and #name > 0 then + vim.cmd("ObsidianWorkspace " .. name) + end + end, + ft = "markdown", + desc = "Workspace name (Obsidian)", + }, + { + "opi", + function() + local image = vim.fn.input("Enter image: ") + if image and #image > 0 then + vim.cmd("ObsidianPasteImg " .. image) + end + end, + ft = "markdown", + desc = "Paste image (Obsidian)", + }, + { + "onr", + function() + local name = vim.fn.input("Enter name: ") + if name and #name > 0 then + vim.cmd("ObsidianRename " .. name) + end + end, + ft = "markdown", + desc = "Rename note (Obsidian)", + }, + { + mode = "v", + "ol", + function() + local query = vim.fn.input("Enter query: ") + if query and #query > 0 then + vim.cmd("ObsidianLink " .. query) + else + vim.cmd("ObsidianLink") + end + end, + ft = "markdown", + desc = "Link query (Obsidian)", + }, + { + mode = "v", + "onl", + function() + local note = vim.fn.input("Enter note: ") + if note and #note > 0 then + vim.cmd("ObsidianLinkNew " .. note) + else + vim.cmd("ObsidianLinkNew") + end + end, + ft = "markdown", + desc = "New link note (Obsidian)", + }, + { + mode = "v", + "ox", + function() + local note = vim.fn.input("Enter note: ") + if note and #note > 0 then + vim.cmd("ObsidianExtractNote " .. note) + else + vim.cmd("ObsidianExtractNote") + end + end, + ft = "markdown", + desc = "New extract text (Obsidian)", + }, + { + "otn", + "ObsidianNewFromTemplate", + ft = "markdown", + desc = "Open new note with template (Obsidian)", + }, + { + "oc", + "ObsidianTOC", + ft = "markdown", + desc = "Open contents (Obsidian)", + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/outline.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/outline.lua new file mode 100644 index 0000000..5d28f7d --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/outline.lua @@ -0,0 +1,11 @@ +return { + "hedyhli/outline.nvim", + lazy = true, + cmd = { "Outline", "OutlineOpen" }, + keys = { -- Example mapping to toggle outline + { "zo", "Outline", desc = "Toggle outline" }, + }, + opts = { + -- Your setup opts here + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/project.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/project.lua new file mode 100644 index 0000000..13ee82b --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/project.lua @@ -0,0 +1,12 @@ +return { + "Zeioth/project.nvim", + dependencies = "nvim-telescope/telescope.nvim", + config = function() + require("project_nvim").setup() + require("telescope").load_extension("projects") + + vim.keymap.set("n", "fpj", function() + require("telescope").extensions.projects.projects() + end, { desc = "Find projects" }) + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/python.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/python.lua new file mode 100644 index 0000000..75b1ce7 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/python.lua @@ -0,0 +1,54 @@ +return { + -- { + -- "bps/vim-textobj-python", + -- dependencies = { "kana/vim-textobj-user" }, + -- }, + { + "nvim-neotest/neotest", + optional = true, + dependencies = { + "nvim-neotest/neotest-python", + }, + opts = { + adapters = { + ["neotest-python"] = { + -- Here you can specify the settings for the adapter, i.e. + -- runner = "pytest", + -- python = ".venv/bin/python", + }, + }, + }, + }, + { + "linux-cultist/venv-selector.nvim", + dependencies = { + "neovim/nvim-lspconfig", + "mfussenegger/nvim-dap", + "mfussenegger/nvim-dap-python", --optional + { "nvim-telescope/telescope.nvim", branch = "0.1.x", dependencies = { "nvim-lua/plenary.nvim" } }, + }, + lazy = false, + ft = "python", + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "v", group = "Virtual envs" }, + }) + end, + config = function() + require("venv-selector").setup({ + notify_user_on_activate = true, + search = { + venvs = { + command = "fd /bin/python$ ~/.local/share/venvs --full-path", + }, + }, + }) + end, + keys = { + { "vs", "VenvSelect", desc = "Select virtual env", ft = "python" }, + { "vc", "VenvSelectCached", desc = "Select venv (cache)", ft = "python" }, + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/quickfix.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/quickfix.lua new file mode 100644 index 0000000..f586310 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/quickfix.lua @@ -0,0 +1,76 @@ +return { + { + "folke/trouble.nvim", + cmd = { "Trouble" }, + opts = { + modes = { + lsp = { + win = { position = "right" }, + }, + preview_float = { + mode = "diagnostics", + preview = { + type = "float", + relative = "editor", + border = "rounded", + title = "Preview", + title_pos = "center", + position = { 0, -2 }, + size = { width = 0.3, height = 0.3 }, + zindex = 200, + }, + }, + }, + }, + config = function(_, opts) + require("trouble").setup(opts) + end, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v", "x" }, + { "x", group = "Quickfix (trouble)" }, + }) + end, + keys = { + { "xd", "Trouble diagnostics toggle", desc = "Toggle diagnostics (Trouble)" }, + { + "xD", + "Trouble diagnostics toggle filter.buf=0", + desc = "Toggle buffer Diagnostics (Trouble)", + }, + { "xs", "Trouble symbols toggle", desc = "Toggle symbols (Trouble)" }, + { "xS", "Trouble lsp toggle", desc = "Toggle LSP def/ref/... (Trouble)" }, + { "xl", "Trouble loclist toggle", desc = "Toggle location List (Trouble)" }, + { "xq", "Trouble qflist toggle", desc = "Toggle quickfix List (Trouble)" }, + { + "[x", + function() + if require("trouble").is_open() then + require("trouble").prev({ skip_groups = true, jump = true }) + else + local ok, err = pcall(vim.cmd.cprev) + if not ok then + vim.notify(err, vim.log.levels.ERROR) + end + end + end, + desc = "Previous quickfix (trouble)", + }, + { + "]x", + function() + if require("trouble").is_open() then + require("trouble").next({ skip_groups = true, jump = true }) + else + local ok, err = pcall(vim.cmd.cnext) + if not ok then + vim.notify(err, vim.log.levels.ERROR) + end + end + end, + desc = "Next quickfix (trouble)", + }, + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/refactoring.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/refactoring.lua new file mode 100644 index 0000000..8bcf274 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/refactoring.lua @@ -0,0 +1,78 @@ +return { + "ThePrimeagen/refactoring.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-treesitter/nvim-treesitter", + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v", "x" }, + { "r", group = "Compiler/Refactoring" }, + { "rb", group = "Extract block" }, + }) + end, + lazy = false, + config = function() + require("refactoring").setup({ + prompt_func_return_type = { + c = true, + cpp = true, + cxx = true, + go = true, + h = true, + hpp = true, + java = true, + lua = true, + python = true, + }, + prompt_func_param_type = { + c = true, + cpp = true, + cxx = true, + go = true, + h = true, + hpp = true, + java = true, + lua = true, + python = true, + }, + printf_statements = {}, + print_var_statements = {}, + show_success_message = false, + }) + vim.keymap.set({ "n", "x" }, "re", function() + return require("refactoring").refactor("Extract Function") + end, { expr = true, desc = "Extract" }) + vim.keymap.set({ "n", "x" }, "rf", function() + return require("refactoring").refactor("Extract Function To File") + end, { expr = true, desc = "Extract to file" }) + vim.keymap.set({ "n", "x" }, "rv", function() + return require("refactoring").refactor("Extract Variable") + end, { expr = true, desc = "Extract variable" }) + vim.keymap.set({ "n", "x" }, "rI", function() + return require("refactoring").refactor("Inline Function") + end, { expr = true, desc = "Refactor inline function" }) + vim.keymap.set({ "n", "x" }, "ri", function() + return require("refactoring").refactor("Inline Variable") + end, { expr = true, desc = "Refactor inline variable" }) + + vim.keymap.set({ "n", "x" }, "rbb", function() + return require("refactoring").refactor("Extract Block") + end, { expr = true, desc = "Extract block" }) + vim.keymap.set({ "n", "x" }, "rbf", function() + return require("refactoring").refactor("Extract Block To File") + end, { expr = true, desc = "Extract block to file" }) + + -- prompt for a refactor to apply when the remap is triggered + vim.keymap.set({ "n", "x" }, "rs", function() + require("refactoring").select_refactor({ prefer_ex_cmd = true }) + end, { desc = "Refactor selection" }) + -- Note that not all refactor support both normal and visual mode + -- load refactoring Telescope extension + require("telescope").load_extension("refactoring") + vim.keymap.set({ "n", "x" }, "rf", function() + require("telescope").extensions.refactoring.refactors() + end, { desc = "Open refactor" }) + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/rest.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/rest.lua new file mode 100644 index 0000000..33586d3 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/rest.lua @@ -0,0 +1,133 @@ +return { + "rest-nvim/rest.nvim", + dependencies = { + { + "nvim-treesitter/nvim-treesitter", + opts = function(_, opts) + opts.ensure_installed = opts.ensure_installed or {} + table.insert(opts.ensure_installed, "http") + end, + }, + }, + config = function() + ---rest.nvim default configuration + ---@class rest.Config + local default_config = { + ---@type table Table of custom dynamic variables + custom_dynamic_variables = {}, + ---@class rest.Config.Request + request = { + ---@type boolean Skip SSL verification, useful for unknown certificates + skip_ssl_verification = false, + ---Default request hooks + ---@class rest.Config.Request.Hooks + hooks = { + ---@type boolean Encode URL before making request + encode_url = true, + ---@type string Set `User-Agent` header when it is empty + user_agent = "rest.nvim v" .. require("rest-nvim.api").VERSION, + ---@type boolean Set `Content-Type` header when it is empty and body is provided + set_content_type = true, + }, + }, + ---@class rest.Config.Response + response = { + ---Default response hooks + ---@class rest.Config.Response.Hooks + hooks = { + ---@type boolean Decode the request URL segments on response UI to improve readability + decode_url = true, + ---@type boolean Format the response body using `gq` command + format = true, + }, + }, + ---@class rest.Config.Clients + clients = { + ---@class rest.Config.Clients.Curl + curl = { + ---Statistics to be shown, takes cURL's `--write-out` flag variables + ---See `man curl` for `--write-out` flag + ---@type RestStatisticsStyle[] + statistics = { + { id = "time_total", winbar = "take", title = "Time taken" }, + { id = "size_download", winbar = "size", title = "Download size" }, + }, + ---Curl-secific request/response hooks + ---@class rest.Config.Clients.Curl.Opts + opts = { + ---@type boolean Add `--compressed` argument when `Accept-Encoding` header includes + ---`gzip` + set_compressed = false, + ---@type table Table containing certificates for each domains + certificates = {}, + }, + }, + }, + ---@class rest.Config.Cookies + cookies = { + ---@type boolean Whether enable cookies support or not + enable = true, + ---@type string Cookies file path + path = vim.fs.joinpath(vim.fn.stdpath("data") --[[@as string]], "rest-nvim.cookies"), + }, + ---@class rest.Config.Env + env = { + ---@type boolean + enable = true, + ---@type string + pattern = ".*%.env.*", + ---@type fun():string[] + find = function() + local config = require("rest-nvim.config") + return vim.fs.find(function(name, _) + return name:match(config.env.pattern) + end, { + path = vim.fn.getcwd(), + type = "file", + limit = math.huge, + }) + end, + }, + ---@class rest.Config.UI + ui = { + ---@type boolean Whether to set winbar to result panes + winbar = true, + ---@class rest.Config.UI.Keybinds + keybinds = { + ---@type string Mapping for cycle to previous result pane + prev = "H", + ---@type string Mapping for cycle to next result pane + next = "L", + }, + }, + ---@class rest.Config.Highlight + highlight = { + ---@type boolean Whether current request highlighting is enabled or not + enable = true, + ---@type number Duration time of the request highlighting in milliseconds + timeout = 750, + }, + ---@see vim.log.levels + ---@type integer log level + _log_level = vim.log.levels.WARN, + } + end, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "h", group = "HTTP" }, + }) + end, + keys = { + { "ho", ":Rest open", desc = "Open result pane" }, + { "hr", ":Rest run", desc = "Run request under the cursor" }, + { "hn", ":Rest run", desc = "Run request with name" }, + { "hq", ":Rest last", desc = "Run last request" }, + { "hl", ":Rest logs", desc = "Edit logs file" }, + { "hc", ":Rest cookies", desc = "Edit cookies file" }, + { "hd", ":Rest env show", desc = "Show dotenv file registered to current .http file" }, + { "hs", ":Rest env select", desc = "Select & register .env file" }, + { "ha", ":Rest env set", desc = "Register .env file to current .http file" }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/sessions.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/sessions.lua new file mode 100644 index 0000000..3a644c1 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/sessions.lua @@ -0,0 +1,60 @@ +return { + "rmagatti/auto-session", + lazy = false, + config = function() + require("auto-session").setup({ + enabled = true, -- Enables/disables auto creating, saving and restoring + root_dir = vim.fn.stdpath("data") .. "/sessions/", -- Root dir where sessions will be stored + auto_save = true, -- Enables/disables auto saving session on exit + auto_restore = false, -- Enables/disables auto restoring session on start + auto_create = true, -- Enables/disables auto creating new session files. Can take a function that should return true/false if a new session file should be created or not + suppressed_dirs = nil, -- Suppress session restore/create in certain directories + allowed_dirs = nil, -- Allow session restore/create in certain directories + auto_restore_last_session = false, -- On startup, loads the last saved session if session for cwd does not exist + git_use_branch_name = true, -- Include git branch name in session name + git_auto_restore_on_branch_change = true, -- Should we auto-restore the session when the git branch changes. Requires git_use_branch_name + lazy_support = true, -- Automatically detect if Lazy.nvim is being used and wait until Lazy is done to make sure session is restored correctly. Does nothing if Lazy isn't being used. Can be disabled if a problem is suspected or for debugging + bypass_save_filetypes = nil, -- List of filetypes to bypass auto save when the only buffer open is one of the file types listed, useful to ignore dashboards + close_unsupported_windows = true, -- Close windows that aren't backed by normal file before autosaving a session + args_allow_single_directory = true, -- Follow normal sesion save/load logic if launched with a single directory as the only argument + args_allow_files_auto_save = false, -- Allow saving a session even when launched with a file argument (or multiple files/dirs). It does not load any existing session first. While you can just set this to true, you probably want to set it to a function that decides when to save a session when launched with file args. See documentation for more detail + continue_restore_on_error = true, -- Keep loading the session even if there's an error + show_auto_restore_notif = false, -- Whether to show a notification when auto-restoring + cwd_change_handling = false, -- Follow cwd changes, saving a session before change and restoring after + lsp_stop_on_restore = false, -- Should language servers be stopped when restoring a session. Can also be a function that will be called if set. Not called on autorestore from startup + restore_error_handler = nil, -- Called when there's an error restoring. By default, it ignores fold errors otherwise it displays the error and returns false to disable auto_save + purge_after_minutes = nil, -- Sessions older than purge_after_minutes will be deleted asynchronously on startup, e.g. set to 14400 to delete sessions that haven't been accessed for more than 10 days, defaults to off (no purging), requires >= nvim 0.10 + log_level = "error", -- Sets the log level of the plugin (debug, info, warn, error). + + session_lens = { + load_on_setup = true, -- Initialize on startup (requires Telescope) + theme_conf = { -- Pass through for Telescope theme options + layout_config = { -- As one example, can change width/height of picker + -- width = 0.8, -- percent of window + -- height = 0.5, + }, + }, + previewer = false, -- File preview for session picker + + mappings = { + -- Mode can be a string or a table, e.g. {"i", "n"} for both insert and normal mode + delete_session = { "i", "" }, + alternate_session = { "i", "" }, + copy_session = { "i", "" }, + }, + + session_control = { + control_dir = vim.fn.stdpath("data") .. "/auto_session/", -- Auto session control dir, for control files, like alternating between two sessions with session-lens + control_filename = "session_control.json", -- File name of the session control file + }, + }, + }) + end, + keys = { + { "fs", "SessionSearch", desc = "Session search" }, + { "ws", "SessionSave", desc = "Save session" }, + { "wx", "SessionDisableAutoSave", desc = "Disable autosave" }, + { "wp", "SessionPurgeOrphaned", desc = "Purge autosave" }, + { "wa", "SessionToggleAutoSave", desc = "Toggle autosave" }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/silicon.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/silicon.lua new file mode 100644 index 0000000..b708e60 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/silicon.lua @@ -0,0 +1,152 @@ +return { + "michaelrommel/nvim-silicon", + lazy = true, + cmd = "Silicon", + main = "nvim-silicon", + opts = { + -- Configuration here, or leave empty to use defaults + -- disable_defaults will disable all builtin default settings apart + -- from the base arguments, that are needed to call silicon at all, see + -- mandatory_options below, also those options can be overridden + -- all of the settings could be overridden in the lua setup call, + -- but this clashes with the use of an external silicon --config=file, + -- see issue #9 + disable_defaults = false, + -- turn on debug messages + debug = false, + -- most of them could be overridden with other + -- the font settings with size and fallback font + -- Example: font = "VictorMono NF=34;Noto Emoji", + font = nil, + -- the theme to use, depends on themes available to silicon + theme = "gruvbox-dark", + -- the background color outside the rendered os window + -- (in hexcode string e.g "#076678") + background = nil, + -- a path to a background image + background_image = nil, + -- the paddings to either side + pad_horiz = 100, + pad_vert = 80, + -- whether to have the os window rendered with rounded corners + no_round_corner = false, + -- whether to put the close, minimize, maximise traffic light + -- controls on the border + no_window_controls = false, + -- whether to turn off the line numbers + no_line_number = false, + -- with which number the line numbering shall start + line_offset = 1, + -- here a function is used to return the actual source code line number + -- line_offset = function(args) + -- return args.line1 + -- end, + + -- the distance between lines of code + line_pad = 0, + -- the rendering of tab characters as so many space characters + tab_width = 4, + -- with which language the syntax highlighting shall be done, should be + -- a function that returns either a language name or an extension like "js" + -- it is set to nil, so you can override it, if you do not set it, we try the + -- filetype first, and if that fails, the extension + language = nil, + -- language = function() + -- return vim.bo.filetype + -- end, + -- language = function() + -- return vim.fn.fnamemodify( + -- vim.api.nvim_buf_get_name(vim.api.nvim_get_current_buf()), + -- ":e" + -- ) + -- end, + + -- if the shadow below the os window should have be blurred + shadow_blur_radius = 16, + -- the offset of the shadow in x and y directions + shadow_offset_x = 8, + shadow_offset_y = 8, + -- the color of the shadow (in hexcode string e.g "#100808") + shadow_color = nil, + -- whether to strip of superfluous leading whitespace + gobble = true, + -- a string to pad each line with after gobbling removed larger indents, + num_separator = nil, + -- here a bar glyph is used to draw a vertial line and some space + -- num_separator = "\u{258f} ", + + -- whether to put the image onto the clipboard, may produce an error, + -- if run on WSL2 + to_clipboard = false, + -- a string or function returning a string that defines the title + -- showing in the image, only works in silicon versions greater than v0.5.1 + window_title = nil, + -- here a function is used to get the name of the current buffer + -- window_title = function() + -- return vim.fn.fnamemodify( + -- vim.api.nvim_buf_get_name(vim.api.nvim_get_current_buf()), + -- ":t" + -- ) + -- end, + + -- how to deal with the clipboard on WSL2 + -- possible values are: never, always, auto + wslclipboard = nil, + -- what to do with the temporary screenshot image file when using the Windows + -- clipboard from WSL2, possible values are: keep, delete + wslclipboardcopy = nil, + -- the silicon command, put an absolute location here, if the + -- command is not in your ${PATH} + command = "silicon", + -- a string or function that defines the path to the output image + -- output = nil, + -- here a function is used to create a file in the current directory + output = function() + local home_dir = vim.fn.expand("~") -- Get home directory + local timestamp = os.date("!%Y-%m-%d_%H-%M-%S") -- Get timestamp + local file_name = vim.fn.expand("%:t:r") -- Get the file name without extension + local file_extension = vim.fn.expand("%:e") + return home_dir + .. "/Pictures/screenshots" + .. timestamp + .. "_" + .. file_name + .. "_" + .. file_extension + .. ".png" + end, + }, + keys = { + { + "sc", + function() + require("nvim-silicon").clip() + end, + mode = "v", + desc = "Copy code screenshot to clipboard", + }, + { + "sf", + function() + require("nvim-silicon").file() + end, + mode = "v", + desc = "Save code screenshot as file", + }, + { + "ss", + function() + require("nvim-silicon").shoot() + end, + mode = "v", + desc = "Create code screenshot", + }, + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "v" }, + { "s", group = "Snapshot" }, + }) + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/snippets.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/snippets.lua new file mode 100644 index 0000000..96c52a7 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/snippets.lua @@ -0,0 +1,72 @@ +return { + { + "L3MON4D3/LuaSnip", + version = "v2.*", + build = "make install_jsregexp", + dependencies = { + "rafamadriz/friendly-snippets", + config = function() + require("luasnip.loaders.from_vscode").lazy_load() + end, + }, + config = function() + local ls = require("luasnip") + ls.setup({ + link_children = true, + link_roots = false, + keep_roots = false, + update_events = { "TextChanged", "TextChangedI" }, + }) + local c = ls.choice_node + ls.choice_node = function(pos, choices, opts) + if opts then + opts.restore_cursor = true + else + opts = { restore_cursor = true } + end + return c(pos, choices, opts) + end + + require("luasnip.loaders.from_vscode").lazy_load({ + paths = { '"' .. vim.fn.stdpath("config") .. '/lua/TheSiahxyz/snippets"' }, + }) + + vim.cmd.runtime({ args = { "lua/TheSiahxyz/snippets/*.lua" }, bang = true }) -- load custom snippets + + vim.keymap.set({ "i", "x" }, "", function() + if ls.expand_or_jumpable() then + ls.expand_or_jump() + end + end, { silent = true, desc = "Expand snippet or jump to the next snippet node" }) + + vim.keymap.set({ "i", "x" }, "", function() + if ls.jumpable(-1) then + ls.jump(-1) + end + end, { silent = true, desc = "Previous spot in the snippet" }) + + vim.keymap.set({ "i", "x" }, "", function() + if ls.choice_active() then + ls.change_choice(1) + end + end, { silent = true, desc = "Next snippet choice" }) + + vim.keymap.set({ "i", "x" }, "", function() + if ls.choice_active() then + ls.change_choice(-1) + end + end, { silent = true, desc = "Previous snippet choice" }) + end, + keys = { + vim.keymap.set("i", "", function() + return require("luasnip").jumpable(1) and "luasnip-jump-next" or "" + end, { expr = true, silent = true, desc = "Jump to next snippet" }), + vim.keymap.set("s", "", function() + require("luasnip").jump(1) + end, { desc = "Jump to next snippet" }), + vim.keymap.set({ "i", "s" }, "", function() + require("luasnip").jump(-1) + end, { desc = "Jump to Previous Snippet" }), + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ssh.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ssh.lua new file mode 100644 index 0000000..df8aad5 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/ssh.lua @@ -0,0 +1,427 @@ +return { + { + "amitds1997/remote-nvim.nvim", + version = "*", + dependencies = { + "nvim-lua/plenary.nvim", + "MunifTanjim/nui.nvim", + "nvim-telescope/telescope.nvim", + }, + config = true, + init = function() + local ok, wk = pcall(require, "which-key") + if ok then + wk.add({ { "r", group = "SSH Remote" } }) + end + end, + keys = { + { "rs", "RemoteStart", desc = "Start/Connect", mode = "n", silent = true }, + { "rx", "RemoteStop", desc = "Stop/Close", mode = "n", silent = true }, + { "ri", "RemoteInfo", desc = "Info/Progress Viewer", mode = "n", silent = true }, + { "rC", "RemoteCleanup", desc = "Cleanup workspace", mode = "n", silent = true }, + + -- Delete saved config: show a list, allow multi-select, then run :RemoteConfigDel + { + "rd", + function() + local function get_names() + -- use command-line completion if the command supports it + local list = vim.fn.getcompletion("RemoteConfigDel ", "cmdline") or {} + return list + end + + local names = get_names() + if #names == 0 then + return vim.notify( + "No saved remote configs found (completion empty)", + vim.log.levels.INFO, + { title = "Remote" } + ) + end + + -- Prefer Telescope if present + local ok_picker, pickers = pcall(require, "telescope.pickers") + if ok_picker then + local finders = require("telescope.finders") + local conf = require("telescope.config").values + local actions = require("telescope.actions") + local state = require("telescope.actions.state") + + pickers + .new({}, { + prompt_title = "Delete Remote Config(s)", + finder = finders.new_table(names), + sorter = conf.generic_sorter({}), + attach_mappings = function(_, map) + local function run_delete(prompt_bufnr, picked) + local function del(name) + vim.api.nvim_cmd({ cmd = "RemoteConfigDel", args = { name } }, {}) + end + if picked and #picked > 0 then + for _, entry in ipairs(picked) do + del(entry.value or entry[1] or entry.text) + end + else + local entry = state.get_selected_entry() + if entry then + del(entry.value or entry[1] or entry.text) + end + end + actions.close(prompt_bufnr) + end + + actions.select_default:replace(function(bufnr) + local picker = state.get_current_picker(bufnr) + local multi = picker:get_multi_selection() + run_delete(bufnr, multi) + end) + + -- quality of life: also deletes without closing (optional) + map("i", "", function(bufnr) + local picker = state.get_current_picker(bufnr) + local multi = picker:get_multi_selection() + local function del(name) + vim.api.nvim_cmd({ cmd = "RemoteConfigDel", args = { name } }, {}) + end + if multi and #multi > 0 then + for _, e in ipairs(multi) do + del(e.value or e[1] or e.text) + end + else + local e = state.get_selected_entry() + if e then + del(e.value or e[1] or e.text) + end + end + -- keep picker open + end) + + return true + end, + }) + :find() + else + -- Fallback: vim.ui.select (single delete) + vim.ui.select(names, { prompt = "Select remote config to delete" }, function(choice) + if choice and choice ~= "" then + vim.api.nvim_cmd({ cmd = "RemoteConfigDel", args = { choice } }, {}) + end + end) + end + end, + desc = "Delete saved config (pick from list)", + mode = "n", + silent = true, + }, + + { "rl", "RemoteLog", desc = "Open log", mode = "n", silent = true }, + }, + }, + { + "nosduco/remote-sshfs.nvim", + dependencies = { "nvim-telescope/telescope.nvim", "nvim-lua/plenary.nvim" }, + opts = { + -- Refer to the configuration section below + -- or leave empty for defaults + }, + config = function() + require("remote-sshfs").setup({ + connections = { + ssh_configs = { -- which ssh configs to parse for hosts list + vim.fn.expand("$HOME") .. "/.ssh/config", + "/etc/ssh/ssh_config", + -- "/path/to/custom/ssh_config" + }, + ssh_known_hosts = vim.fn.expand("$HOME") .. "/.ssh/known_hosts", + -- NOTE: Can define ssh_configs similarly to include all configs in a folder + -- ssh_configs = vim.split(vim.fn.globpath(vim.fn.expand "$HOME" .. "/.ssh/configs", "*"), "\n") + sshfs_args = { -- arguments to pass to the sshfs command + "-o reconnect", + "-o ConnectTimeout=5", + }, + }, + mounts = { + base_dir = vim.fn.expand("$HOME") .. "/.sshfs/", -- base directory for mount points + unmount_on_exit = true, -- run sshfs as foreground, will unmount on vim exit + }, + handlers = { + on_connect = { + change_dir = true, -- when connected change vim working directory to mount point + }, + on_disconnect = { + clean_mount_folders = false, -- remove mount point folder on disconnect/unmount + }, + on_edit = {}, -- not yet implemented + }, + ui = { + select_prompts = false, -- not yet implemented + confirm = { + connect = true, -- prompt y/n when host is selected to connect to + change_dir = false, -- prompt y/n to change working directory on connection (only applicable if handlers.on_connect.change_dir is enabled) + }, + }, + log = { + enabled = false, -- enable logging + truncate = false, -- truncate logs + types = { -- enabled log types + all = false, + util = false, + handler = false, + sshfs = false, + }, + }, + }) + local api = require("remote-sshfs.api") + vim.keymap.set("n", "rc", api.connect, { desc = "Connect SSH" }) + vim.keymap.set("n", "rd", function() + local mountpoint = vim.fn.getcwd() + local ok = vim.system({ "diskutil", "unmount", "force", mountpoint }):wait().code == 0 + if not ok then + ok = vim.system({ "umount", "-f", mountpoint }):wait().code == 0 + end + print(ok and ("✅ Unmounted: " .. mountpoint) or ("⚠️ Failed to unmount: " .. mountpoint)) + end, { desc = "Force unmount macFUSE mount (quiet)" }) + vim.keymap.set("n", "re", api.edit, { desc = "Edit SSH" }) + + -- (optional) Override telescope find_files and live_grep to make dynamic based on if connected to host + local builtin = require("telescope.builtin") + local connections = require("remote-sshfs.connections") + vim.keymap.set("n", "rf", function() + if connections.is_connected() then + api.find_files() + else + builtin.find_files() + end + end, { desc = "Find SSH files" }) + vim.keymap.set("n", "rg", function() + if connections.is_connected() then + api.live_grep() + else + builtin.live_grep() + end + end, { desc = "Live SSH grep" }) + require("telescope").load_extension("remote-sshfs") + end, + }, + { + "inhesrom/remote-ssh.nvim", + branch = "master", + dependencies = { + "inhesrom/telescope-remote-buffer", --See https://github.com/inhesrom/telescope-remote-buffer for features + "nvim-telescope/telescope.nvim", + "nvim-lua/plenary.nvim", + "neovim/nvim-lspconfig", + -- nvim-notify is recommended, but not necessarily required into order to get notifcations during operations - https://github.com/rcarriga/nvim-notify + "rcarriga/nvim-notify", + }, + config = function() + require("telescope-remote-buffer").setup( + -- Default keymaps to open telescope and search open buffers including "remote" open buffers + --fzf = "fz", + --match = "gb", + --oldfiles = "rb" + ) + + -- setup lsp_config here or import from part of neovim config that sets up LSP + require("remote-ssh").setup({ + -- Optional: Custom on_attach function for LSP clients + on_attach = function(client, bufnr) + -- Your LSP keybindings and setup + end, + + -- Optional: Custom capabilities for LSP clients + capabilities = vim.lsp.protocol.make_client_capabilities(), + + -- Custom mapping from filetype to LSP server name + filetype_to_server = { + -- Example: Use pylsp for Python (default and recommended) + python = "pylsp", + -- More customizations... + }, + + -- Custom server configurations + server_configs = { + -- Custom config for clangd + clangd = { + filetypes = { "c", "cpp", "objc", "objcpp" }, + root_patterns = { ".git", "compile_commands.json" }, + init_options = { + usePlaceholders = true, + completeUnimported = true, + }, + }, + -- More server configs... + }, + + -- Async write configuration + async_write_opts = { + timeout = 30, -- Timeout in seconds for write operations + debug = false, -- Enable debug logging + log_level = vim.log.levels.INFO, + autosave = true, -- Enable automatic saving on text changes (default: true) + -- Set to false to disable auto-save while keeping manual saves (:w) working + save_debounce_ms = 3000, -- Delay before initiating auto-save to handle rapid editing (default: 3000) + }, + }) + + -- Custom function to parse SSH config and extract Host entries + local function parse_ssh_hosts() + local ssh_config_path = vim.fn.expand("$HOME") .. "/.ssh/config" + local hosts = {} + local seen = {} + + -- Check if file exists + if vim.fn.filereadable(ssh_config_path) == 0 then + return hosts + end + + -- Read and parse SSH config file + local lines = vim.fn.readfile(ssh_config_path) + for _, line in ipairs(lines) do + -- Trim whitespace + local trimmed = vim.fn.trim(line) + -- Skip comments and empty lines + if trimmed ~= "" and not vim.startswith(trimmed, "#") then + -- Match "Host" keyword exactly (case-insensitive) followed by whitespace + -- Use pattern to ensure it's "Host " not "HostName" or other keywords + local host_match = string.match(string.lower(trimmed), "^host%s+(.+)$") + if host_match then + -- Handle multiple hosts on same line (space or comma separated) + for host in vim.gsplit(host_match, "[%s,]+") do + host = vim.fn.trim(host) + -- Skip wildcards and empty strings + if host ~= "" and host ~= "*" and not string.match(host, "^%*") and not seen[host] then + table.insert(hosts, host) + seen[host] = true + end + end + end + end + end + + return hosts + end + + -- Custom function to open RemoteTreeBrowser with selected SSH host + local function remote_tree_browser_picker() + local hosts = parse_ssh_hosts() + if #hosts == 0 then + return vim.notify( + "No SSH hosts found in ~/.ssh/config", + vim.log.levels.WARN, + { title = "Remote SSH" } + ) + end + + -- Use vim.ui.select (default Neovim UI) + vim.ui.select(hosts, { prompt = "Select SSH host for RemoteTreeBrowser" }, function(choice) + if choice and choice ~= "" then + -- Use rsync:// protocol with double slash (//) for SSH config Host aliases + -- Format: rsync://host-alias//path (double slash is required for SSH config aliases) + -- The plugin automatically detects and handles SSH config settings + local rsync_url = "rsync://" .. choice .. "//" + + -- Run RemoteTreeBrowser command + -- rsync:// protocol will use SSH config to resolve Host alias + vim.schedule(function() + -- Step 1: Create browser + vim.api.nvim_cmd({ cmd = "RemoteTreeBrowser", args = { rsync_url } }, {}) + -- Step 2: Hide browser (needed for proper positioning) + vim.defer_fn(function() + vim.api.nvim_cmd({ cmd = "RemoteTreeBrowserHide" }, {}) + -- Step 3: Show browser (will open on the right side) + vim.defer_fn(function() + vim.api.nvim_cmd({ cmd = "RemoteTreeBrowserShow" }, {}) + end, 50) + end, 100) + end) + end + end) + end + + -- Toggle function for RemoteTreeBrowser show/hide + local function remote_tree_browser_toggle() + -- Try to access remote-ssh.nvim's TreeBrowser module + local ok, tree_browser = pcall(require, "remote-ssh.tree_browser") + if ok and tree_browser then + -- Check if browser buffer exists (like show_tree() does) + local bufnr = tree_browser.bufnr + if not bufnr or not vim.api.nvim_buf_is_valid(bufnr) then + -- Browser doesn't exist, show SSH config picker to create one + remote_tree_browser_picker() + return + end + + -- Browser buffer exists, check if window is visible (like hide_tree() does) + local win_id = tree_browser.win_id + local is_visible = win_id and vim.api.nvim_win_is_valid(win_id) + + if is_visible then + -- Browser is visible, hide it + if tree_browser.hide_tree then + tree_browser.hide_tree() + else + vim.api.nvim_cmd({ cmd = "RemoteTreeBrowserHide" }, {}) + end + -- After hiding, return early to prevent any further actions + return + else + -- Browser exists but hidden, show it + -- Directly use command instead of show_tree() to avoid any callbacks + vim.api.nvim_cmd({ cmd = "RemoteTreeBrowserShow" }, {}) + end + else + -- Fallback: only use this if module is not accessible + -- Check if browser buffer exists (not just visible windows) + local browser_buf_found = false + local browser_visible = false + + -- Check all buffers, not just visible windows + for _, buf in ipairs(vim.api.nvim_list_bufs()) do + if vim.api.nvim_buf_is_valid(buf) then + local buf_name = vim.api.nvim_buf_get_name(buf) + -- Check if it's a remote tree browser buffer + if buf_name:match("rsync://") then + browser_buf_found = true + -- Check if this buffer is visible in any window + for _, win in ipairs(vim.api.nvim_list_wins()) do + if vim.api.nvim_win_get_buf(win) == buf then + browser_visible = true + break + end + end + break + end + end + end + + if browser_buf_found then + -- Browser buffer exists + if browser_visible then + -- Browser is visible, hide it + vim.api.nvim_cmd({ cmd = "RemoteTreeBrowserHide" }, {}) + else + -- Browser exists but hidden, show it + vim.api.nvim_cmd({ cmd = "RemoteTreeBrowserShow" }, {}) + end + else + -- Browser not found, show SSH config picker + remote_tree_browser_picker() + end + end + end + + -- Keymap for custom RemoteTreeBrowser picker + vim.keymap.set("n", "er", remote_tree_browser_picker, { + desc = "RemoteTreeBrowser (pick SSH host)", + silent = true, + }) + + -- Keymap for toggle RemoteTreeBrowser show/hide + vim.keymap.set("n", "ef", remote_tree_browser_toggle, { + desc = "Toggle RemoteTreeBrowser", + silent = true, + }) + end, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/stay-centered.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/stay-centered.lua new file mode 100644 index 0000000..a2d5aa2 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/stay-centered.lua @@ -0,0 +1,29 @@ +return { + "arnamak/stay-centered.nvim", + lazy = false, + ft = { "markdown", "ipynb" }, + config = function() + require("stay-centered").setup({ + -- The filetype is determined by the vim filetype, not the file extension. In order to get the filetype, open a file and run the command: + -- :lua print(vim.bo.filetype) + skip_filetypes = {}, + -- Set to false to disable by default + enabled = true, + -- allows scrolling to move the cursor without centering, default recommended + allow_scroll_move = true, + -- temporarily disables plugin on left-mouse down, allows natural mouse selection + -- try disabling if plugin causes lag, function uses vim.on_key + disable_on_mouse = false, + }) + end, + keys = { + { + "zs", + function() + require("stay-centered").toggle() + end, + mode = { "n", "v" }, + desc = "Toggle stay center", + }, + }, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/surround.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/surround.lua new file mode 100644 index 0000000..f3e0174 --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/surround.lua @@ -0,0 +1,14 @@ +return { + "echasnovski/mini.surround", + version = "*", + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "s", group = "Surround/Search & replace on line" }, + }) + end, + config = function() + require("mini.surround").setup() + end, +} diff --git a/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/telescope.lua b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/telescope.lua new file mode 100644 index 0000000..ddb31de --- /dev/null +++ b/debian/.config/TheSiahxyz/lua/TheSiahxyz/plugins/telescope.lua @@ -0,0 +1,1133 @@ +local have_make = vim.fn.executable("make") == 1 +local have_cmake = vim.fn.executable("cmake") == 1 + +function vim.live_grep_from_project_git_root() + local function get_git_toplevel() + local path = vim.fn.system("git rev-parse --show-toplevel") + if vim.v.shell_error then + return nil + end + return path + end + + local opts = { cwd = get_git_toplevel() } + + require("telescope.builtin").live_grep(opts) +end + +local function find_nvim_plugin_files(prompt_bufnr) + local actions = require("telescope.actions") + local action_state = require("telescope.actions.state") + + actions.close(prompt_bufnr) + + local selection = action_state.get_selected_entry() + if selection and selection.value then + -- Construct the full path + local base_path = vim.fn.stdpath("data") + local full_path = vim.fn.resolve(base_path .. "/" .. selection.value) + + require("mini.files").open(full_path, true) + end +end + +return { + { + "nvim-telescope/telescope-file-browser.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-telescope/telescope.nvim", + }, + -- init = function() + -- vim.api.nvim_create_autocmd("VimEnter", { + -- group = vim.api.nvim_create_augroup("TelescopeFileBrowserStartDirectory", { clear = true }), + -- desc = "Start telescope-file-browser with directory", + -- once = true, + -- callback = function() + -- if package.loaded["telescope-file-browser.nvim"] then + -- return + -- else + -- local stats = vim.uv.fs_stat(vim.fn.argv(0)) + -- if stats and stats.type == "directory" then + -- require("telescope").extensions.file_browser.file_browser() + -- end + -- end + -- end, + -- }) + -- end, + config = function() + local fb_actions = require("telescope._extensions.file_browser.actions") + + require("telescope").setup({ + extensions = { + file_browser = { + path = vim.uv.cwd(), + cwd = vim.uv.cwd(), + cwd_to_path = false, + grouped = true, + files = true, + add_dirs = true, + depth = 1, + auto_depth = true, + select_buffer = true, + hidden = { file_browser = false, folder_browser = false }, + respect_gitignore = vim.fn.executable("fd") == 1, + no_ignore = true, + follow_symlinks = true, + browse_files = require("telescope._extensions.file_browser.finders").browse_files, + browse_folders = require("telescope._extensions.file_browser.finders").browse_folders, + hide_parent_dir = false, + collapse_dirs = true, + prompt_path = true, + quiet = true, + dir_icon = "", + dir_icon_hl = "Default", + display_stat = { date = true, size = true, mode = true }, + hijack_netrw = false, + use_fd = true, + git_status = true, + mappings = { + ["i"] = { + [""] = fb_actions.create, + [""] = fb_actions.create_from_prompt, + [""] = fb_actions.rename, + [""] = fb_actions.move, + [""] = fb_actions.copy, + [""] = fb_actions.remove, + [""] = fb_actions.open, + [""] = fb_actions.goto_parent_dir, + [""] = fb_actions.goto_home_dir, + [""] = fb_actions.goto_cwd, + [""] = fb_actions.change_cwd, + [""] = fb_actions.toggle_browser, + [""] = fb_actions.toggle_hidden, + [""] = fb_actions.toggle_all, + [""] = fb_actions.backspace, + }, + ["n"] = { + ["a"] = fb_actions.create, + ["n"] = fb_actions.create_from_prompt, + ["r"] = fb_actions.rename, + ["d"] = fb_actions.move, + ["y"] = fb_actions.copy, + ["Del"] = fb_actions.remove, + ["o"] = fb_actions.open, + ["h"] = fb_actions.goto_parent_dir, + ["gh"] = fb_actions.goto_home_dir, + [""] = fb_actions.goto_cwd, + [""] = fb_actions.change_cwd, + ["f"] = fb_actions.toggle_browser, + ["/"] = fb_actions.toggle_hidden, + ["t"] = fb_actions.toggle_all, + }, + }, + results_title = vim.fn.fnamemodify(vim.uv.cwd(), ":~"), + }, + }, + }) + + require("telescope").load_extension("file_browser") + + vim.keymap.set( + "n", + "et", + ":Telescope file_browser path=%:p:h select_buffer=true", + { desc = "File browser (cwd)" } + ) + vim.keymap.set("n", "eT", ":Telescope file_browser", { desc = "File browser" }) + end, + }, + { + "nvim-telescope/telescope.nvim", + branch = "master", + dependencies = { + { "nvim-lua/plenary.nvim" }, + { + "nvim-telescope/telescope-fzf-native.nvim", + build = have_make and "make" + or "cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build", + enabled = have_make or have_cmake, + config = function() + require("telescope").load_extension("fzf") + end, + }, + { + "nvim-telescope/telescope-github.nvim", + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "gh", group = "gh" }, + }) + end, + config = function() + require("telescope").load_extension("gh") + vim.keymap.set({ "n", "v" }, "gi", ":Telescope gh issues ", { desc = "Find gh issues" }) + vim.keymap.set( + { "n", "v" }, + "gp", + ":Telescope gh pull_request ", + { desc = "Find gh pull request" } + ) + vim.keymap.set({ "n", "v" }, "ght", ":Telescope gh gist ", { desc = "Find gh gist" }) + vim.keymap.set({ "n", "v" }, "ghr", ":Telescope gh run ", { desc = "Find gh run" }) + end, + }, + { + "nvim-telescope/telescope-ui-select.nvim", + config = function() + require("telescope").setup({ + extensions = { + ["ui-select"] = { + require("telescope.themes").get_dropdown({ + -- even more opts + }), + + -- pseudo code / specification for writing custom displays, like the one + -- for "codeactions" + -- specific_opts = { + -- make_indexed = function(items) -> indexed_items, width, + -- [kind] = { + -- make_displayer = function(widths) -> displayer + -- make_display = function(displayer) -> function(e) + -- make_ordinal = function(e) -> string + -- }, + -- -- for example to disable the custom builtin "codeactions" display + -- do the following + -- codeactions = false, + -- } + }, + }, + }) + require("telescope").load_extension("ui-select") + end, + }, + { + "jvgrootveld/telescope-zoxide", + dependencies = { "nvim-lua/popup.nvim" }, + config = function() + require("telescope").setup({ + extensions = { + zoxide = { + prompt_title = "[ TheSiahxyz ]", + mappings = { + default = { + action = function(selection) + vim.cmd.cd(selection.path) + end, + after_action = function(selection) + print("Update to (" .. selection.z_score .. ") " .. selection.path) + end, + }, + [""] = { + action = require("telescope._extensions.zoxide.utils").create_basic_command( + "split" + ), + opts = { desc = "split" }, + }, + [""] = { + action = require("telescope._extensions.zoxide.utils").create_basic_command( + "vsplit" + ), + }, + [""] = { + action = require("telescope._extensions.zoxide.utils").create_basic_command( + "edit" + ), + }, + [""] = { + keepinsert = true, + action = function(selection) + require("telescope").extensions.file_browser.file_browser({ + cwd = selection.path, + }) + end, + }, + }, + }, + }, + }) + require("telescope").load_extension("zoxide") + + vim.keymap.set("n", "fz", function() + require("telescope").extensions.zoxide.list() + end, { desc = "Find files (zoxide)" }) + end, + }, + { + "nvim-telescope/telescope-live-grep-args.nvim", + -- This will not install any breaking changes. + -- For major updates, this must be adjusted manually. + version = "^1.0.0", + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n", "v" }, + { "f", group = "Find" }, + { "F", group = "Find (root)" }, + { "fl", group = "Live grep" }, + }) + end, + config = function() + local lga_actions = require("telescope-live-grep-args.actions") + local actions = require("telescope.actions") + + require("telescope").setup({ + extensions = { + live_grep_args = { + auto_quoting = true, -- enable/disable auto-quoting + -- define mappings, e.g. + mappings = { -- extend mappings + i = { + [""] = lga_actions.quote_prompt(), + [""] = lga_actions.quote_prompt({ postfix = " --iglob " }), + -- freeze the current list and start a fuzzy search in the frozen list + [""] = actions.to_fuzzy_refine, + }, + }, + vimgrep_arguments = { + "rg", + "--color=never", + "--no-heading", + "--with-filename", + "--line-number", + "--column", + "--smart-case", + "--follow", + "--hidden", + "--no-ignore", + }, + -- ... also accepts theme settings, for example: + -- theme = "dropdown", -- use dropdown theme + -- theme = { }, -- use own theme spec + -- layout_config = { mirror=true }, -- mirror preview pane + }, + }, + }) + require("telescope").load_extension("live_grep_args") + vim.keymap.set("n", "flf", function() + require("telescope").extensions.live_grep_args.live_grep_args() + end, { desc = "Find live grep args" }) + + local live_grep_args_shortcuts = require("telescope-live-grep-args.shortcuts") + vim.keymap.set( + "n", + "ss", + live_grep_args_shortcuts.grep_word_under_cursor, + { desc = "Search shortcuts (Live grep)" } + ) + + local function search_git(visual) + -- Retrieve the git root path + local handle = io.popen("git rev-parse --show-toplevel") + if not handle then + print("Error: Unable to open git handle") + return + end + + local git_root_path = handle:read("*a"):gsub("%s+", "") + handle:close() + + if not git_root_path or git_root_path == "" then + print("Error: Unable to retrieve git root path") + return + end + + local opts = { + prompt_title = visual and ("Visual-Grep in " .. git_root_path) + or ("Live-Grep in " .. git_root_path), + shorten_path = false, + cwd = git_root_path, + file_ignore_patterns = { ".git", ".png", "tags" }, + initial_mode = "insert", + selection_strategy = "reset", + theme = require("telescope.themes").get_dropdown({}), + } + + if visual then + -- Capture the selected text in visual mode + vim.cmd('normal! "vy') + local visual_selection = vim.fn.getreg("v") + opts.search = visual_selection + require("telescope.builtin").grep_string(opts) + else + require("telescope.builtin").live_grep(opts) + end + end + + vim.keymap.set("n", "flg", function() + search_git(false) + end, { remap = true, silent = false, desc = "Live grep in the git root folder" }) + + vim.keymap.set("v", "flg", function() + search_git(true) + end, { remap = true, silent = false, desc = "Grep in the git root folder" }) + -- Retrieve the current tmux session path + -- This will not change when we navigate to a different pane + local function search_tmux(visual) + local handle = io.popen("tmux display-message -p '#{session_path}'") + if not handle then + print("Error: Unable to open tmux handle") + return + end + + local tmux_session_path = handle:read("*a"):gsub("%s+", "") + handle:close() + + if not tmux_session_path or tmux_session_path == "" then + print("Error: Unable to retrieve tmux session path") + return + end + + local opts = { + prompt_title = visual and ("Visual-Grep in " .. tmux_session_path) + or ("Live-Grep in " .. tmux_session_path), + shorten_path = false, + cwd = tmux_session_path, + file_ignore_patterns = { ".git", ".png", "tags" }, + initial_mode = "insert", + selection_strategy = "reset", + theme = require("telescope.themes").get_dropdown({}), + } + + if visual then + require("telescope.builtin").grep_string(opts) + else + require("telescope.builtin").live_grep(opts) + end + end + + vim.keymap.set("n", "flt", function() + search_tmux(false) + end, { remap = true, silent = false, desc = "Live grep in the current tmux session folder" }) + + vim.keymap.set("v", "flt", function() + search_tmux(true) + end, { remap = true, silent = false, desc = "Grep string in the current tmux session folder" }) + vim.api.nvim_set_keymap( + "v", + "fls", + 'y:Telescope live_grep default_text=0 search_dirs={"$PWD"}', + { noremap = true, silent = true, desc = "Live grep default text" } + ) + vim.keymap.set("n", "f/", function() + require("telescope.builtin").current_buffer_fuzzy_find( + require("telescope.themes").get_dropdown({ + winblend = 10, + previewer = false, + relative = "editor", + }) + ) + end, { desc = "Find in current buffer" }) + end, + }, + { + "xiyaowong/telescope-emoji.nvim", + config = function() + require("telescope").setup({ + extensions = { + emoji = { + action = function(emoji) + -- argument emoji is a table. + -- {name="", value="", cagegory="", description=""} + + vim.fn.setreg("*", emoji.value) + print([[Press p or "*p to paste this emoji]] .. emoji.value) + + -- insert emoji when picked + -- vim.api.nvim_put({ emoji.value }, 'c', false, true) + end, + }, + }, + }) + require("telescope").load_extension("emoji") + end, + keys = { + { "se", ":Telescope emoji", desc = "Search emoji" }, + }, + }, + { + "nvim-telescope/telescope-bibtex.nvim", + requires = { + { "nvim-telescope/telescope.nvim" }, + }, + config = function() + local bibtex_actions = require("telescope-bibtex.actions") + require("telescope").setup({ + extensions = { + bibtex = { + -- Use context awareness + context = true, + -- Use non-contextual behavior if no context found + -- This setting has no effect if context = false + context_fallback = true, + mappings = { + i = { + [""] = bibtex_actions.key_append("%s"), -- format is determined by filetype if the user has not set it explictly + [""] = bibtex_actions.entry_append, + [""] = bibtex_actions.citation_append("{{author}} ({{year}}), {{title}}."), + }, + }, + }, + }, + }) + require("telescope").load_extension("bibtex") + end, + keys = { + { + "sB", + function() + require("telescope").extensions.bibtex.bibtex() + end, + desc = "Search bibtex", + }, + }, + }, + { + "mzlogin/vim-markdown-toc", + keys = { + { "tg", "GenTocGFM", desc = "Generate ToC to GFM" }, + { "tr", "GenTocRedcarpet", desc = "Generate ToC to Redcarpet" }, + { "tl", "GenTocGitLab", desc = "Generate ToC to Gitlab" }, + { "tm", "GenTocMarked", desc = "Generate ToC to Marked" }, + }, + }, + { + "ThePrimeagen/harpoon", + branch = "harpoon2", + dependencies = { "nvim-lua/plenary.nvim" }, + }, + { + "folke/trouble.nvim", + }, + }, + init = function() + local wk = require("which-key") + wk.add({ + mode = { "n" }, + { "f", group = "Find" }, + { "fp", group = "Private/Public" }, + { "s", group = "Search" }, + { "sb", group = "Buffer" }, + }) + end, + config = function() + local actions = require("telescope.actions") + local actions_state = require("telescope.actions.state") + local actions_layout = require("telescope.actions.layout") + local open_with_trouble = require("trouble.sources.telescope").open + local add_to_trouble = require("trouble.sources.telescope").add + + local function telescope_open_single_or_multi(prompt_bufnr) + local picker = actions_state.get_current_picker(prompt_bufnr) + local multi = picker:get_multi_selection() + + -- If you selected multiple (with ), open them all. + if not vim.tbl_isempty(multi) then + actions.close(prompt_bufnr) + + for _, entry in ipairs(multi) do + -- Try to get a filepath across different pickers + local path = entry.path -- find_files, oldfiles, etc. + or entry.filename -- live_grep/grep_string + or (type(entry.value) == "string" and entry.value) + or (entry.value and entry.value.path) + + if path then + vim.cmd("edit " .. vim.fn.fnameescape(path)) + + -- (Optional) jump to the matched line/col for grep results + local lnum = entry.lnum or entry.row + local col = entry.col + if lnum then + vim.api.nvim_win_set_cursor(0, { lnum, math.max((col or 1) - 1, 0) }) + end + elseif entry.bufnr then + -- buffers picker + vim.cmd("buffer " .. entry.bufnr) + end + end + return + end + + -- Single selection → let Telescope handle it + -- This respects picker-specific behavior (e.g. jumping to lnum for grep). + actions.select_default(prompt_bufnr) + end + require("telescope").setup({ + defaults = { + mappings = { + i = { + [""] = add_to_trouble, + [""] = actions.complete_tag, + [""] = function(prompt_bufnr) + local selection = actions_state.get_selected_entry() + local dir = vim.fn.fnamemodify(selection.path, ":p:h") + actions.close(prompt_bufnr) + -- Depending on what you want put `cd`, `lcd`, `tcd` + vim.cmd(string.format("silent lcd %s", dir)) + end, + [""] = actions.nop, + [""] = actions.nop, + [""] = actions.nop, + [""] = actions_layout.toggle_preview, + [""] = actions.preview_scrolling_down, + [""] = actions.preview_scrolling_up, + [""] = actions.preview_scrolling_left, + [""] = actions.preview_scrolling_right, + [""] = actions.send_to_qflist + actions.open_qflist, + [""] = actions.send_selected_to_qflist + actions.open_qflist, + [""] = open_with_trouble, + [""] = actions.select_horizontal, + [""] = { "", type = "command" }, + [""] = actions.insert_original_cword, + [""] = actions.insert_original_cWORD, + [""] = actions.insert_original_cfile, + [""] = actions.insert_original_cline, + [""] = actions.nop, + [""] = actions.nop, + [""] = telescope_open_single_or_multi, + }, + n = { + ["q"] = actions.close, + [""] = add_to_trouble, + [""] = actions.close, + [""] = actions.nop, + [""] = actions.nop, + [""] = actions_layout.toggle_preview, + [""] = actions.nop, + [""] = actions.complete_tag, + [""] = { + function(prompt_bufnr) + local selection = actions_state.get_selected_entry() + local dir = vim.fn.fnamemodify(selection.path, ":p:h") + actions.close(prompt_bufnr) + -- Depending on what you want put `cd`, `lcd`, `tcd` + vim.cmd(string.format("silent lcd %s", dir)) + end, + opts = { desc = "Change directory" }, + }, + [""] = actions.preview_scrolling_down, + [""] = actions.preview_scrolling_up, + [""] = actions.preview_scrolling_left, + [""] = actions.preview_scrolling_right, + [""] = actions.send_to_qflist + actions.open_qflist, + [""] = actions.send_selected_to_qflist + actions.open_qflist, + [""] = open_with_trouble, + [""] = actions.select_horizontal, + ["