Author SHA1 Message Date
rootiest 0c2027c14b feat(snacks): add snacks-tea.nvim for Gitea/Forgejo PR integration
Wires up sbulav/snacks-tea.nvim as a Snacks extension via the tea CLI,
mirroring the existing GitHub gh_issue/gh_pr picker integration for
Gitea/Forgejo remotes. Adds <leader>gt/<leader>gT/<leader>gc keymaps
and documents the tea CLI dependency in the README.
2026-08-24 22:52:35 -04:00
rootiest 8bfdd6e20c chore: merge history from sunset rootiest-nvim config
The old Neovim configuration (formerly github.com/rootiest/rootiest-nvim,
now preserved on the 'legacy' branch) has been superseded by this repo.
This merge links its history in for continuity without altering the
current tree.
2026-08-24 22:24:53 -04:00
rootiest abda95b98f Merge pull request 'feat(mini.pairs): smart Markdown code-fence expansion on 3rd backtick' (#5) from feat/markdown-smart-backtick-fence into main
Reviewed-on: #5
2026-08-25 02:03:14 +00:00
rootiest fc535b6688 feat(mini.pairs): smart Markdown code-fence expansion on 3rd backtick
Typing a 3rd backtick after mini.pairs' `` pair now expands into a fenced
code block instead of pairing into 4 backticks: the cursor lands right
after the opener (ready for a language id), and backspacing the fence
back out removes the empty closing fence too.

Also includes an already-in-progress .gitignore expansion (AGENTS/ and
agent-generated docs/ subdirs) and a plugins.lua tabs-to-spaces reformat
that were sitting uncommitted in the working tree.
2026-08-24 22:01:49 -04:00
rootiest 1a1963232e docs: fix links 2026-05-31 00:46:50 -04:00
rootiest c867d55228 Merge pull request 'feat: NES normal-mode Tab, native inline completion, clippy LSP, and .gitignore expansion' (#4) from feat/nes-normal-tab-inline-completion-clippy into main
Reviewed-on: #4
2026-05-31 04:45:30 +00:00
rootiest 11a5bc1266 feat(keymaps): add normal-mode NES keymap and enable native inline completion
Adds a normal-mode <Tab> binding that calls sidekick.nes_jump_or_apply() so
NES suggestions can be accepted without entering insert mode. Enables
vim.lsp.inline_completion so the insert-mode <Tab> chain (snippet → NES →
native inline completion → fallback) is fully wired. Updates the README
keymaps table to reflect both modes and the complete Tab chain.
2026-05-31 00:44:34 -04:00
rootiest 7e68bc3391 feat(lsp): configure rust-analyzer to use clippy for checks
Sets the check command to clippy via both vim.lsp.config (for system-installed
rust-analyzer via rustup) and the mason-lspconfig handler, so diagnostics
reflect clippy lints rather than cargo check output.
2026-05-31 00:44:12 -04:00
rootiest 5c980a8b57 chore: expand .gitignore with Lua, Vim, and AI session patterns
Replaces the minimal hand-written ignore list with generated gitignore.io
patterns for Lua and Vim, plus a boilerplate template covering OS artefacts,
temp directories, and AI session/rules files (CLAUDE.md, GEMINI.md, .claud*,
.gemin*, .remember, etc.).
2026-05-31 00:43:11 -04:00
rootiest 17a2b4d25b Merge pull request 'feat: add sidekick.nvim and haunt.nvim with AI and bookmark integration' (#3) from feat/add-sidekick-and-haunt into main
Reviewed-on: #3
2026-05-11 16:39:12 +00:00
rootiest 58fc3e53ac feat(noice): suppress Diagnosing and semantic tokens LSP progress notifications 2026-05-11 12:38:19 -04:00
rootiest 7f9c380eaa feat: add sidekick.nvim and haunt.nvim with AI and bookmark integration
- Add sidekick.nvim: Next Edit Suggestions (NES) via Copilot LSP, integrated
  AI CLI terminal, and Snacks picker send action (<Alt-a>)
- Add haunt.nvim: in-buffer annotation/bookmark manager with Snacks picker
  and 6 keymaps (<leader>ha/ht/hd/hn/hp/hl)
- Wire blink.cmp <Tab> to chain snippet_forward -> NES -> inline completion
- Expose haunt_all and haunt_buffer as Sidekick prompt contexts
- Suppress lua_ls "Loading workspace" progress bar via Noice route
- Update README to document all new plugins, keymaps, and post-install steps
2026-05-11 12:32:19 -04:00
rootiest 859cfc3793 Merge pull request 'feat: add bootstrap module and update docs' (#2) from feat/add-bootstrap-and-update-docs into main
Reviewed-on: #2
2026-05-08 18:21:52 +00:00
rootiestandClaude Sonnet 4.6 d43128c2d0 feat: add bootstrap module and update docs
- Add lua/bootstrap.lua: redirects Neovim data/state paths when running
  as root (e.g. via symlinked ~/.config/nvim) to prevent root sessions
  from conflicting with the user-level install
- Update init.lua to require("bootstrap") before any other module
- Standardize license headers across all Lua files (capitalize author,
  add SPDX-License-Identifier)
- Update README with full plugin stack section, bootstrap docs,
  machine-local override docs, qalculate dependency, and blink.cmp
  auto-rebuild note

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 14:19:11 -04:00
rootiest 2153591cf5 Merge pull request 'feat: add new plugins, refactor options, and improve blink.cmp detection' (#1) from feat/add-plugins-refactor-options into main
Reviewed-on: #1
2026-05-08 16:44:41 +00:00
rootiestandClaude Sonnet 4.6 c28e6c3e59 feat: add new plugins, refactor options, and improve blink.cmp detection
- Add focusline.nvim for scroll-aware cursor centering
- Add kitty-scrollback.nvim for Kitty terminal scrollback integration
- Add qalc.nvim for inline calculator support
- Add blink.lib as explicit dependency for blink.cmp
- Fix blink.cmp binary detection to check v2 install path first
- Add PackChanged autocmd to auto-rebuild blink.cmp after updates
- Expand inc-rename.nvim config with all available options documented
- Add luv library path to lazydev for vim.uv completions
- Consolidate leader key setup into options.lua (remove duplicate in init.lua)
- Add autoread + FocusGained/CursorHold triggers for external file changes
- Add BufReadPost autocmd to restore last cursor position on file open
- Reorganize options.lua with section headers and logical grouping
- Update plugin lockfile revisions (blink.cmp, conform, gitsigns, lualine, etc.)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 12:30:14 -04:00
rootiestandClaude Sonnet 4.6 93d8f9a28d feat: add gx.nvim, comment-box, and machine-local override support
- Add gx.nvim for smart URL opening (GitHub, plugins, package.json, search)
- Add comment-box.nvim with keymaps for creating/deleting comment boxes
- Load machine-local secrets.lua and local.lua from ~/.config/.user-dots/nvim/
- Update README with new plugins, keymaps, and portability highlight

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 18:45:03 -04:00
rootiest 1b6a354c86 docs: update code line count in README 2026-04-22 12:38:14 -04:00
rootiest cdb72cff4d feat: add silent fallback for blink.cmp if binary or cargo is missing 2026-04-22 12:35:44 -04:00
rootiest 688eec7498 docs: add code line count to highlights in README 2026-04-22 12:32:53 -04:00
rootiest 0058de2a77 feat: improve portability and add Grug-far QoL improvements
- Refactor terminal title logic in lua/options.lua with Kitty detection and OSC 2 fallback.
- Set mapleader and maplocalleader explicitly at the top of lua/options.lua.
- Add <leader>sr mapping for Grug-far search and replace in lua/keymaps.lua.
- Add autocommand to close Grug-far window with 'q'.
- Update README.md with system dependencies (Debian/Arch) and new keymaps.
- Highlight portability features (terminal titles, root detection) in README.md.
2026-04-22 12:30:11 -04:00
rootiest 8d6103ec07 feat: add mini.pairs plugin
Automatically enters closing symbol after the cursor when user inserts
an opening symbol.

Ex: Type { and a } is added after the cursor.
2026-04-17 19:05:58 -04:00
rootiest 2e499ca1cb chore: commit nvim-pack-lock.json to maintain package versions across clones 2026-04-17 19:03:23 -04:00
rootiest 0990818e07 docs: add lua/const.lua to modular config list 2026-04-17 18:59:21 -04:00
rootiest 68ba1e3b87 chore: rename data.lua to const.lua to clarify use-case 2026-04-17 18:58:28 -04:00
rootiest 06d86cf46e docs: add initial basic readme for repository 2026-04-17 18:53:48 -04:00
rootiest cfd451eae1 chore: clean out .gemini_session file as well 2026-04-17 18:53:31 -04:00
rootiest fbb6655722 chore: add GPLv3 (or later) licensing to repository
NOTE: lua/lazyload.lua is an MIT licensed file borrowed from another
user's repository. The license header in that file reflects this.
2026-04-17 18:43:38 -04:00
rootiest 8feb5c8415 chore: add gitignore file to exclude any unnecessary files from git 2026-04-17 18:28:26 -04:00
rootiest d448e591d8 fix: include the data.lua file which provides the dashboard header 2026-04-17 18:25:51 -04:00
rootiestandClaude Sonnet 4.6 21ec297431 feat: add plugins, formatting, and editor quality-of-life improvements
- Add leap.nvim (<CR> to jump, S for cross-window) with LeapBackdrop dimming
- Add mini.surround with default s-prefix keymaps
- Add conform.nvim with format-on-save and <leader>cf keymap
- Add undotree with <leader>uu toggle and nerd font shapes
- Add nvim-treesitter-context for sticky scope header (max 3 lines)
- Add inc-rename.nvim with Noice input dialog and <leader>cr keymap
- Add lazydev.nvim for proper Neovim Lua type definitions in lua_ls
- Enable Snacks modules: scratch, zen, terminal (<C-/> toggle), and expand picker with flash integration and frecency matcher
- Configure flash to suppress default keymaps (owned by leap/mini.surround)
- Switch gitsigns from numhl to signcolumn for Snacks.statuscolumn rendering
- Set 2-space indentation with expandtab
- Enable persistent undo via undofile
- Auto-restore persistence session on startup when no file args given

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 18:24:47 -04:00
rootiest 444b5739bd initial commit 2026-04-17 04:46:48 -04:00
128 changed files with 2513 additions and 99618 deletions
-5
View File
@@ -1,5 +0,0 @@
default_units = true
warnings_as_errors = false
recipe_ref_check = true
max_depth = 10
extensions = "all"
-7
View File
@@ -1,7 +0,0 @@
[tool.commitizen]
name = "cz_gitmoji"
tag_format = "$version"
version_scheme = "semver"
version = "0.0.1"
update_changelog_on_bump = true
major_version_zero = true
+190 -20
View File
@@ -1,20 +1,190 @@
lazy-lock.json
.luarc.json
.neoconf.json
lazyvim.json
debug/
.aitool
.colorscheme
.hardtime
.leader
.useimage
.wakatime
.ignore-deps
profile.json
rocks.toml
extras/
/home/rootiest/.cache/nvim
qalc
test.lua
.cache/
deprecated/
# Plugin installs (managed by vim.pack)
/pack/
# Compiled / cached Lua
**/*.luac
/lua/__pycache__/
# LSP and tool data
/.luarc.json.bak
/lsp/
# Session and state files
/session/
/sessions/
/.session
# Swap, backup, undo files
*.swp
*.swo
*~
*.bak
# Logs
*.log
# id: gi-patterns-aa0d0d1d58f24039fa0491e40c78bb9f
# Created by https://www.toptal.com/developers/gitignore/api/lua
# Edit at https://www.toptal.com/developers/gitignore?templates=lua
### Lua ###
# Compiled Lua sources
luac.out
# luarocks build files
*.src.rock
*.zip
*.tar.gz
# Object files
*.o
*.os
*.ko
*.obj
*.elf
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
*.def
*.exp
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# End of https://www.toptal.com/developers/gitignore/api/lua
# id: gi-patterns-be86a7264ac20631fa0112bcaff396d7
# Created by https://www.toptal.com/developers/gitignore/api/vim
# Edit at https://www.toptal.com/developers/gitignore?templates=vim
### Vim ###
# Swap
[._]*.s[a-v][a-z]
!*.svg # comment out if you don't need vector files
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Session
Session.vim
Sessionx.vim
# Temporary
.netrwhist
*~
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~
# End of https://www.toptal.com/developers/gitignore/api/vim
# id: gitig-boilerplate-129366cbf5c6513e388d0725c2e4923b
# ╭──────────────────────────────────────────────────────────╮
# │ GitIgnore Boilerplate Template │
# ╰──────────────────────────────────────────────────────────╯
#
# ──────────────────── OS-Generated Files ────────────────────
# automatic backup files created by some editors (e.g., Vim, Emacs)
*~
# temporary files created if a process still has a handle to a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# MacOS junk
.DS_Store
Thumbs.db
# Linux trash folder which might appear on any partition or disk
.Trash-*
# files created when an open file is removed but is still being accessed
.nfs*
# ─────────────────── Debug/Temporary/Testing ────────────────
# Matches OLD / .OLD
[Oo][Ll][Dd]/
.[Oo][Ll][Dd]/
# Matches DISABLE / .DISABLE
[Dd][Ii][Ss][Aa][Bb][Ll][Ee]/
.[Dd][Ii][Ss][Aa][Bb][Ll][Ee]/
# Matches DISABLED / .DISABLED
[Dd][Ii][Ss][Aa][Bb][Ll][Ee][Dd]/
.[Dd][Ii][Ss][Aa][Bb][Ll][Ee][Dd]/
# Matches DEBUG / .DEBUG
[Dd][Ee][Bb][Uu][Gg]/
.[Dd][Ee][Bb][Uu][Gg]/
# Matches TMP / .TMP
[Tt][Mm][Pp]/
.[Tt][Mm][Pp]/
# Matches TEMP / .TEMP
[Tt][Ee][Mm][Pp]/
.[Tt][Ee][Mm][Pp]/
# Matches TEMPORARY / .TEMPORARY
[Tt][Ee][Mm][Pp][Oo][Rr][Aa][Rr][Yy]/
.[Tt][Ee][Mm][Pp][Oo][Rr][Aa][Rr][Yy]/
# Matches TESTING / .TESTING
[Tt][Ee][Ss][Tt][Ii][Nn][Gg]/
.[Tt][Ee][Ss][Tt][Ii][Nn][Gg]/
# ─────────────────── AI Sessions and Rules ──────────────────
# Matches CLAUDE.md, .claud*, etc.
[Cc][Ll][Aa][Uu][Dd][Ee].[Mm][Dd]
.[Cc][Ll][Aa][Uu][Dd]*
# Matches GEMINI.md, .gemin*, etc.
[Gg][Ee][Mm][Ii][Nn][Ii].[Mm][Dd]
.[Gg][Ee][Mm][Ii][Nn]*
# Matches ANTIGRAVITY.md, .antigrav*, etc.
[Aa][nN][Tt][Ii][Gg][Rr][Aa][Vv][Ii][Tt][Yy].[Mm][Dd]
.[Aa][Nn][Tt][Ii][Gg][Rr][Aa][Vv]*
# Matches AGENTS.md, .remember, etc.
[Aa][Gg][Ee][Nn][Tt][Ss].[Mm][Dd]
.[Rr][Ee][Mm][Ee][Mm][Bb][Ee][Rr]
# ──────────────────────────────────────────────────────────────
# ──────────────── Added by agents-init ──────────────────
# agents-init --agents
AGENTS/
# ────────────────────────────────────────────────────────
# ──────────────── Added by agents-init ──────────────────
# agents-init --plugins
docs/superpowers
docs/plans
docs/specs
docs/devlogs
# ────────────────────────────────────────────────────────
Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 KiB

+668 -17
View File
@@ -1,23 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
MIT License
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Copyright (c) 2024 Rootiest (https://github.com/rootiest)
Preamble
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
+141 -215
View File
@@ -1,231 +1,157 @@
# Rootiest Neovim Configuration
# 🌙 Rootiest Neovim
[![Plugins](https://dotfyle.com/rootiest/rootiest-nvim/badges/plugins?style=flat)](https://dotfyle.com/rootiest/rootiest-nvim)
[![Leaderkey](https://dotfyle.com/rootiest/rootiest-nvim/badges/leaderkey?style=flat)](https://dotfyle.com/rootiest/rootiest-nvim)
[![Plugin Manager](https://dotfyle.com/rootiest/rootiest-nvim/badges/plugin-manager?style=flat)](https://dotfyle.com/rootiest/rootiest-nvim)
A modern, modular, and high-performance Neovim configuration built from scratch with a focus on simplicity, speed, and standard Neovim primitives.
```none
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░ ░░░░ ░░░░ ░░░ ░░ ░░ ░░░ ░░░ ░
▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒
▓ ▓▓▓ ▓▓▓▓ ▓▓ ▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓
█ ███ ████ ████ ███ ████ ██████ ██████████ ██████ ███████████████ ███████ ████
█ ████ ████ ████ ████████ ██████ ██ ███ ████████ ████
█████████████████████████████████████████████████████████████████████████████████████████████
░░░░░░░░░░░ ░░░ ░░ ░░░ ░░░ ░░░░ ░░ ░░ ░░░░ ░░░░░░░░░░░
▒▒▒▒▒▒▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓
█████████████ ██ ███ █████████ ████ ████ █████████ ██████ █ █ █████████████
█████████████ ███ ███ ███ ██████ ███████ ██ ████ ██████████████
█████████████████████████████████████████████████████████████████████████████████████████████
,l; c,
.:ooool' loo:.
.,oooooooo:. looooc, /VVVVVVVV\++++ /VVVVVVVV\
ll:,loooooool, looooool \VVVVVVVV/++++++\VVVVVVVV/
llll,;ooooooooc. looooooo |VVVVVV|++++++++/VVVVV/'
lllllc,coooooooo; looooooo |VVVVVV|++++++/VVVVV/'
lllllll;,loooooool' looooooo +|VVVVVV|++++/VVVVV/'+
lllllllc .:oooooooo:. looooooo +++|VVVVVV|++/VVVVV/'+++++
lllllllc 'loooooool,:ooooooo +++++|VVVVVV|/VVV___++++++++++
lllllllc ;ooooooooc,cooooo +++|VVVVVVVVVV/##/ +_+_+_+
lllllllc .coooooooo;;looo +|VVVVVVVVV___ +/#_#,#_#,\
lllllllc ,loooooool,:ol |VVVVVVV//##/+/#/+/#/'/#/
'cllllc .:oooooooo;. |VVVVV/'+/#/+/#/+/#/ /#/
.;llc .loooo:. |VVV/'++/#/+/#/ /#/ /#/
,; ;l; 'V/' /##//##//##//###/
![Neovim](https://img.shields.io/badge/Neovim-0.10+-blue?logo=neovim)
![License](https://img.shields.io/badge/License-GPLv3+-green)
## ✨ Highlights
- **Built-in Package Management**: Exclusively uses `vim.pack` for lightweight, native plugin management.
- **Phased Loading**: Async, non-blocking startup using a phased `VimEnter` queue for a snappy experience.
- **Unified Registry**: Configuration is managed via a global `_G.Config` registry, ensuring cross-plugin consistency.
- **High Performance**: Featuring **blink.cmp** (Rust-based completion) and optimized **Snacks.nvim** components.
- **AI-Powered**: Native integration with **GitHub Copilot** — inline completions via **blink-copilot** and multi-line refactoring via **Sidekick.nvim** Next Edit Suggestions (NES).
- **User-Centric QoL**: Hybrid line numbers, autosave-on-edit, and seamless system clipboard integration.
- **Resilient & Portable**: Intelligent terminal title management (Kitty + Fallback), automatic project root detection, and machine-local override support.
- **Lean & Readable**: ~980 lines of Lua code (excluding comments and blanks).
## 📁 Architecture
The configuration is strictly modular:
- `init.lua`: Entry point, bootstrap, global state initialization, and machine-local overrides.
- `lua/bootstrap.lua`: Early runtime setup — redirects Neovim's data/state paths when running as root (e.g. via a symlinked `~/.config/nvim`), preventing root sessions from polluting or conflicting with the user-level install.
- `lua/lazyload.lua`: Logic for async and phased plugin loading.
- `lua/options.lua`: Global Vim settings, auto-reload, root management, and terminal title logic.
- `lua/plugins.lua`: Plugin declarations and detailed registry-based configurations.
- `lua/keymaps.lua`: Centralized user-facing keybindings.
- `lua/const.lua`: Stores constant values (like dashboard headers) for the configuration.
## 🔌 Plugin Stack
### Core UI
- **Catppuccin**: Primary colorscheme (Mocha flavour).
- **Lualine**: Statusline with Git diff and line-by-line Gitsigns blame.
- **Noice**: Modern UI for cmdline (popup), messages, and LSP hover.
- **Snacks**: High-performance dashboard, explorer, and pickers.
- **Snacks-tea**: Gitea/Forgejo extension for Snacks (via the `tea` CLI) — Pull Request picker, review, and creation UI, mirroring the built-in GitHub PR/issue integration.
- **Nvim-web-devicons**: Consistent icons across UI components.
### Editing & Navigation
- **Flash**: Enhanced motion and search.
- **Focusline**: Keeps the active line at a configurable screen position (30%) during scrolling motions.
- **Mini.ai**: Better text objects (including `g` for entire buffer).
- **Mini.surround**: Surround text objects (add/delete/change).
- **Mini.pairs**: Auto-close brackets and quotes. In Markdown, a 3rd backtick expands `` `` `` into a fenced code block (cursor after the opener, ready for a language id) instead of pairing into 4 backticks; backspacing the fence back out removes the closing fence too.
- **Persistence**: Session management.
- **Which-key**: Interactive keybinding documentation.
- **Gitsigns**: In-buffer git indicators and line highlights.
- **Grug-far**: Project-wide search and replace.
- **Gx.nvim**: Smart URL/reference opener under cursor.
- **Comment-box**: Decorative comment boxes and lines.
- **Undotree**: Visual undo history browser.
- **Haunt.nvim**: In-buffer annotation and bookmark manager. Integrates with the Snacks picker for browsing bookmarks and exposes `haunt_all` / `haunt_buffer` prompt contexts to Sidekick AI sessions.
- **Zen Mode**: Distraction-free editing.
- **Qalc**: Inline calculator via `qalculate`.
### LSP & Completion
- **Blink.cmp** + **blink.lib**: High-performance Rust-based completion. Auto-detects binary across install layouts; falls back gracefully if unavailable. Rebuilds automatically on `PackChanged`.
- **blink-copilot**: Surfaces GitHub Copilot inline suggestions inside the blink.cmp completion menu.
- **Sidekick.nvim**: AI assistant providing Next Edit Suggestions (NES) for multi-line refactoring via the Copilot LSP, plus an integrated AI CLI terminal (`<leader>aa`) with context-aware prompts. Snacks picker integration sends selections to the active AI session via `<Alt-a>`.
- **LSPConfig + Mason**: Managed LSP support for Lua, C/C++, Rust, Python, Fish, and Shell.
- **Conform**: Formatter with format-on-save and range formatting.
- **Inc-rename**: Incremental LSP rename with live preview.
- **Lazydev**: Neovim Lua type definitions for `lua_ls`.
### Terminal
- **Kitty Scrollback**: Browse Kitty terminal scrollback buffer inside Neovim.
## 🛠️ System Dependencies
To ensure all features (pickers, formatters, and LSPs) work correctly, the following packages are required:
### Essential Tools
- `git`, `curl`, `unzip`, `build-essential` (or `base-devel`)
- `ripgrep` (Grep support)
- `fd` (Fast file finding)
- `fzf` (Fuzzy finder fallback)
- `lazygit` (Git TUI)
- `gh` (GitHub CLI integration)
- `tea` (Gitea/Forgejo CLI integration, for Snacks-tea)
- `xclip` / `xsel` (X11) or `wl-copy` (Wayland) for clipboard sync.
### Runtime Environments
- `Node.js` & `npm` (Copilot and various LSPs)
- `Python3` & `pip` (Python LSPs)
- `Cargo` (Rust toolchain, required for building `blink.cmp`)
- `qalculate` (optional, required for the Qalc calculator plugin)
### Installation Commands
**Debian / Ubuntu:**
```bash
sudo apt install git ripgrep fd-find fzf lazygit gh xclip nodejs npm build-essential curl unzip
# tea: no apt package; install via `go install gitea.com/gitea/tea@latest` or a release binary.
```
The rootiest neovim configuration you will ever see!
## Pre-requisites
> Note:
> While Neovim may run without these prerequisites,
> functionality will be limited.
> For the full experience, it is recommended to install the pre-requisites.
### Required
- [git](https://git-scm.com/) -
Version control system
- [luarocks](https://luarocks.org/) -
Lua package manager
- [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts/) -
Font with extended glyphs
Your terminal/client application **_must_** have a Nerd Font installed
and support the Nerd Font glyphs.
WezTerm, Kitty, or NeoVide are recommended.
### Optional
- [ripgrep](https://github.com/BurntSushi/ripgrep) -
A faster grep
- [fzf](https://github.com/junegunn/fzf) -
A command-line fuzzy finder
- [fd](https://github.com/sharkdp/fd) -
A simple, fast and user-friendly alternative to 'find'
- [lazygit](https://github.com/jesseduffield/lazygit) -
A simple terminal UI for git commands
- [kitty](https://sw.kovidgoyal.net/kitty/) -
A fast, feature-rich, GPU based terminal emulator
- [NeoVide](https://neovide.dev/) -
A fast, feature-rich, and modern Neovim GUI
- [fish](https://fishshell.com/) -
A smart and user-friendly command line shell
## Installation
1. Install [Neovim](https://github.com/neovim/neovim/blob/master/INSTALL.md) (0.9+)
2. Install Pre-requisites
3. Backup your current nvim configuration (if you have one)
```sh
mv ~/.config/nvim ~/.config/nvim.bak
```
4. Clone the repository
```sh
git clone git@github.com:rootiest/rootiest-nvim ~/.config/nvim
```
5. Enjoy! 🎉
## Keep your current nvim configuration
This will download and open the Rootiest Neovim configuration
without replacing your current Neovim configuration.
1. Clone the repository
```sh
git clone git@github.com:rootiest/rootiest-nvim ~/.config/rootiest/rootiest-nvim
```
2. Open Neovim with this config:
```sh
NVIM_APPNAME=rootiest/rootiest-nvim/ nvim
```
3. Enjoy! 🎉
4. Fall in love and see [Installation](#installation)
## Features
- Comfortable keybindings and PDE-like features
- Automatically check for Neovim updates
- Able to build Neovim updates from source for nightly or any release (on Linux)
- Built like a distro. Highly customizable and extensible without writing any code!
- Designed to be quick to load and easy to use without compromising on features
- Leans heavily on lazy and luarocks for plugin management and lazy-loading
- Catppuccin theme is default but a selection of others are also included
- Automatic light/dark mode switching based on system theme
- Extensive special configurations for kitty, including theme matching
- Kitty scrollback and keybinding support
- Special configuration for neovide
- Detects terminal client and adjusts accordingly
- ToggleTerm, fzf-lua, neotree, etc. for quick access to files and terminal
- Many UI elements to enhance the experience
- LSP support for many languages and automatic setup for many more
- Remotely spawn a Neovim instance over ssh, in a container, or from a git repo
- Dashboard logo adjusts to the size of the window
- Beautiful, unique, and feature-rich lualine statusline
- When available, git-blame, WakaTime and music player stats components displayed
in lualine ![Lualine](.screenshots/lualine.png)
- Warning system for missing dependencies
- User-selected AI completion tool:
`codeium`, `copilot`, `tabnine`, `minuet`, or `none`
- WakaTime integration: Tracking time spent on code
- Hardtime integration: Trains better use of vim motions and shortcuts
- Colorscheme is remembered between sessions with [astral.nvim](https://github.com/rootiest/astral.nvim)
- Highlight group customizations that are colorscheme-compliant
- Lean and fast while providing a complete professional experience
- Achieves sub-75ms startup time on my personal laptop, goal to never exceed 100ms
- Now with more efficient, refactored keymappings!
## Screenshots
Features and
<details>
<summary>Main Neovim PDE</summary>
![Neovim UI](.screenshots/nvim-ui.png)
</details>
<details>
<summary>Dashboard</summary>
![Neovim Dashboard](.screenshots/dashboard.png)
</details>
<details>
<summary>Markdown view with inline images</summary>
![Neovim Markdown](.screenshots/markdown.png)
</details>
<details>
<summary>Neovide Transparency</summary>
![NeoVide Features](.screenshots/neovide.png)
</details>
## Options
Options are configured in the `config/options.lua` file.
All of the options are documented showing their possible values.
This file allows you to select between various plugins and configurations without
needing to write any configuration code yourself.
```lua
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ROOTIEST ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
vim.g.aitool = "codeium" --Options: codeium, copilot, tabnine, minuet, none
vim.g.usewakatime = true --Options: true, false
vim.g.usehardtime = false --Options: true, false
vim.g.useimage = true --Options: true, false
**Arch Linux:**
```bash
sudo pacman -S git ripgrep fd fzf lazygit github-cli tea xclip nodejs npm base-devel curl unzip
```
## Companion Tools
## 🚀 Getting Started
[Rootiest WezTerm](https://github.com/rootiest/rootiest-wezterm) -
A wezterm configuration that is designed to work with this Neovim configuration.
### Installation
[Rootiest Kitty](https://github.com/rootiest/rootiest-kitty) -
A kitty configuration that is designed to work with this Neovim configuration.
```bash
git clone https://git.rootiest.dev/rootiest/neovim-config.git ~/.config/nvim
nvim
```
[Rootiest Fish](https://github.com/rootiest/rootiest-fish) -
A fish configuration that pairs well with this Neovim configuration.
### Post-Install
[Rootiest Tmux](https://github.com/rootiest/rootiest-tmux) -
A tmux configuration that is designed to work with this Neovim configuration.
1. **Build Blink**: Completion auto-rebuilds on `PackChanged`. If it still isn't working, run `cargo build --release` inside `~/.local/share/nvim/site/pack/core/opt/blink.cmp`.
2. **LSP Servers**: Run `:Mason` to monitor the installation of Language Servers.
3. **Copilot**: Run `:LspCopilotSignIn` to authenticate, then `:checkhealth sidekick` to verify the Sidekick NES integration is working.
[Rootiest Vim](https://github.com/rootiest/rootiest-vim) -
A Vim configuration that pairs well with this Neovim configuration.
### Machine-Local Overrides
[Rootiest Iosevka Font](https://github.com/rootiest/rootiest-iosevka) -
A custom Iosevka font that is designed by developers, for developers.
Place machine-specific or secret configuration in `~/.config/.user-dots/nvim/local.lua` or `~/.config/.user-dots/nvim/secrets.lua`. These files are sourced automatically at startup if present, and are intentionally outside the repo to avoid accidental commits.
[Nerd Fonts](https://github.com/ryanoasis/nerd-fonts/) -
A collection of fonts that includes many icons and glyphs used in this configuration.
## ⌨️ Key Features & Mappings
## Dotfiles
| Key | Description |
| :--- | :--- |
| `<leader><space>` | Smart Find Files (Snacks) |
| `<leader>e` | File Explorer (Snacks) |
| `<leader>sr` | Search and Replace (Grug-far) |
| `<leader>gg` | Open Lazygit |
| `<leader>qs` | Restore Last Session (Persistence) |
| `<leader>cf` | Format Buffer (Conform) |
| `<leader>uu` | Toggle Undo Tree |
| `<leader>z` | Toggle Zen Mode |
| `gd` / `gr` | Goto Definition / References |
| `K` | Hover Documentation |
| `s` / `S` | Leap Motion (Normal/Window) |
| `ys` / `ds` / `cs` | Surround (Add/Delete/Change) |
| `gx` / `gX` | Open URL under cursor (Gx.nvim) |
| `<Tab>` *(insert)* | Advance snippet → NES suggestion → native inline completion → fallback |
| `<Tab>` *(normal)* | Jump to / apply Sidekick NES suggestion |
| `<leader>aa` | Toggle Sidekick AI CLI terminal |
| `<leader>as` | Select AI tool (Sidekick) |
| `<Alt-a>` *(picker)* | Send picker selection to active AI CLI session |
| `<leader>ha` | Annotate current position (Haunt) |
| `<leader>ht` | Toggle annotation visibility (Haunt) |
| `<leader>hd` | Delete bookmark (Haunt) |
| `<leader>hn` / `<leader>hp` | Next / Previous bookmark (Haunt) |
| `<leader>hl` | Browse all bookmarks in picker (Haunt) |
| `<leader>cbb` | Create Centered Comment Box |
| `<leader>cbl` | Create Centered Comment Line |
| `<leader>cbd` | Delete Comment Box/Line |
| `<leader>cbk` | Browse Box Style Catalog |
| `:Q` | Forced Write-All and Quit |
[Rootiest Dotfiles](https://github.com/rootiest/dotfiles)
## 📜 License
## Credits
- [Folke Lamaitre](https://github.com/folke)
- [Evgeni Chasnovski](https://github.com/echasnovski)
- [LazyVim](https://github.com/LazyVim/LazyVim)
- [Elijah Manor](https://github.com/elijahmanor/elijahmanor)
Distributed under the **GPLv3 or later** License. See `LICENSE` for more information.
-392
View File
@@ -1,392 +0,0 @@
-- This file is generated by ex-colors. The credit goes to the authors and contributors of the original colorscheme catppuccin-mocha.
vim.api.nvim_set_var('colors_name', 'ex-catppuccin-mocha')
vim.api.nvim_set_hl(0, '@attribute', { link = 'Constant' })
vim.api.nvim_set_hl(0, '@comment.documentation', { link = 'Comment' })
vim.api.nvim_set_hl(0, '@comment.error', { bg = 15961000, fg = 1973806 })
vim.api.nvim_set_hl(0, '@comment.note', { bg = 9024762, fg = 1973806 })
vim.api.nvim_set_hl(0, '@comment.todo', { bg = 15912397, fg = 1973806 })
vim.api.nvim_set_hl(0, '@comment.warning', { bg = 16376495, fg = 1973806 })
vim.api.nvim_set_hl(0, '@constant.builtin', { fg = 16429959 })
vim.api.nvim_set_hl(0, '@constant.macro', { link = 'Macro' })
vim.api.nvim_set_hl(0, '@constructor', { fg = 7653356 })
vim.api.nvim_set_hl(0, '@diff.delta', { link = 'diffChanged' })
vim.api.nvim_set_hl(0, '@diff.minus', { link = 'diffRemoved' })
vim.api.nvim_set_hl(0, '@diff.plus', { link = 'diffAdded' })
vim.api.nvim_set_hl(0, '@function.builtin', { fg = 16429959 })
vim.api.nvim_set_hl(0, '@function.call', { link = 'Function' })
vim.api.nvim_set_hl(0, '@function.macro', { fg = 9757397 })
vim.api.nvim_set_hl(0, '@function.method', { link = 'Function' })
vim.api.nvim_set_hl(0, '@function.method.call', { link = 'Function' })
vim.api.nvim_set_hl(0, '@keyword.conditional', { link = 'Conditional' })
vim.api.nvim_set_hl(0, '@keyword.conditional.ternary', { link = 'Operator' })
vim.api.nvim_set_hl(0, '@keyword.coroutine', { link = 'Keyword' })
vim.api.nvim_set_hl(0, '@keyword.debug', { link = 'Exception' })
vim.api.nvim_set_hl(0, '@keyword.directive', { link = 'PreProc' })
vim.api.nvim_set_hl(0, '@keyword.directive.define', { link = 'Define' })
vim.api.nvim_set_hl(0, '@keyword.exception', { link = 'Exception' })
vim.api.nvim_set_hl(0, '@keyword.function', { fg = 13346551 })
vim.api.nvim_set_hl(0, '@keyword.import', { link = 'Include' })
vim.api.nvim_set_hl(0, '@keyword.modifier', { link = 'Keyword' })
vim.api.nvim_set_hl(0, '@keyword.operator', { link = 'Operator' })
vim.api.nvim_set_hl(0, '@keyword.repeat', { link = 'Repeat' })
vim.api.nvim_set_hl(0, '@keyword.return', { fg = 13346551 })
vim.api.nvim_set_hl(0, '@keyword.type', { link = 'Keyword' })
vim.api.nvim_set_hl(0, '@lsp.type.interface', { fg = 15912397 })
vim.api.nvim_set_hl(
0,
'@markup.heading',
{ bold = true, cterm = { bold = true }, fg = 9024762 }
)
vim.api.nvim_set_hl(
0,
'@markup.italic',
{ cterm = { italic = true }, fg = 15442092, italic = true }
)
vim.api.nvim_set_hl(0, '@markup.link', { link = 'Tag' })
vim.api.nvim_set_hl(0, '@markup.link.label', { link = 'Label' })
vim.api.nvim_set_hl(0, '@markup.link.url', {
cterm = { italic = true, underline = true },
fg = 16113884,
italic = true,
underline = true,
})
vim.api.nvim_set_hl(0, '@markup.list', { link = 'Special' })
vim.api.nvim_set_hl(0, '@markup.list.checked', { fg = 10937249 })
vim.api.nvim_set_hl(0, '@markup.list.unchecked', { fg = 8357020 })
vim.api.nvim_set_hl(0, '@markup.math', { fg = 9024762 })
vim.api.nvim_set_hl(
0,
'@markup.quote',
{ bold = true, cterm = { bold = true }, fg = 15442092 }
)
vim.api.nvim_set_hl(0, '@markup.raw', { fg = 9757397 })
vim.api.nvim_set_hl(
0,
'@markup.strikethrough',
{ cterm = { strikethrough = true }, fg = 13489908, strikethrough = true }
)
vim.api.nvim_set_hl(
0,
'@markup.strong',
{ bold = true, cterm = { bold = true }, fg = 15442092 }
)
vim.api.nvim_set_hl(0, '@markup.underline', { link = 'Underlined' })
vim.api.nvim_set_hl(
0,
'@module',
{ cterm = { italic = true }, fg = 11845374, italic = true }
)
vim.api.nvim_set_hl(0, '@property', { fg = 11845374 })
vim.api.nvim_set_hl(0, '@punctuation.bracket', { fg = 9673138 })
vim.api.nvim_set_hl(0, '@punctuation.delimiter', { link = 'Delimiter' })
vim.api.nvim_set_hl(0, '@string.documentation', { fg = 9757397 })
vim.api.nvim_set_hl(0, '@string.escape', { fg = 16106215 })
vim.api.nvim_set_hl(0, '@string.regexp', { fg = 16429959 })
vim.api.nvim_set_hl(0, '@string.special', { link = 'Special' })
vim.api.nvim_set_hl(0, '@string.special.path', { link = 'Special' })
vim.api.nvim_set_hl(0, '@string.special.symbol', { fg = 15912397 })
vim.api.nvim_set_hl(0, '@string.special.url', {
cterm = { italic = true, underline = true },
fg = 16113884,
italic = true,
underline = true,
})
vim.api.nvim_set_hl(0, '@tag', { fg = 13346551 })
vim.api.nvim_set_hl(
0,
'@tag.attribute',
{ cterm = { italic = true }, fg = 9757397, italic = true }
)
vim.api.nvim_set_hl(0, '@tag.delimiter', { fg = 9034987 })
vim.api.nvim_set_hl(0, '@type.builtin', { fg = 16376495 })
vim.api.nvim_set_hl(0, '@type.definition', { link = 'Type' })
vim.api.nvim_set_hl(0, '@variable', { fg = 13489908 })
vim.api.nvim_set_hl(0, '@variable.builtin', { fg = 15961000 })
vim.api.nvim_set_hl(0, '@variable.member', { fg = 11845374 })
vim.api.nvim_set_hl(0, '@variable.parameter', { fg = 15442092 })
vim.api.nvim_set_hl(0, 'Boolean', { fg = 16429959 })
vim.api.nvim_set_hl(0, 'Character', { fg = 9757397 })
vim.api.nvim_set_hl(0, 'ColorColumn', { bg = 3224132 })
vim.api.nvim_set_hl(
0,
'Comment',
{ cterm = { italic = true }, fg = 9673138, italic = true }
)
vim.api.nvim_set_hl(0, 'Conceal', { fg = 8357020 })
vim.api.nvim_set_hl(
0,
'Conditional',
{ cterm = { italic = true }, fg = 13346551, italic = true }
)
vim.api.nvim_set_hl(0, 'Constant', { fg = 16429959 })
vim.api.nvim_set_hl(0, 'CurSearch', { bg = 15961000, fg = 1579045 })
vim.api.nvim_set_hl(0, 'Cursor', { bg = 13489908, fg = 1973806 })
vim.api.nvim_set_hl(0, 'CursorColumn', { bg = 1579045 })
vim.api.nvim_set_hl(0, 'CursorIM', { bg = 13489908, fg = 1973806 })
vim.api.nvim_set_hl(0, 'CursorLine', { bg = 2763580 })
vim.api.nvim_set_hl(0, 'CursorLineNr', { fg = 11845374 })
vim.api.nvim_set_hl(0, 'Delimiter', { fg = 9673138 })
vim.api.nvim_set_hl(
0,
'DiagnosticError',
{ cterm = { italic = true }, fg = 15961000, italic = true }
)
vim.api.nvim_set_hl(0, 'DiagnosticFloatingError', { fg = 15961000 })
vim.api.nvim_set_hl(0, 'DiagnosticFloatingHint', { fg = 9757397 })
vim.api.nvim_set_hl(0, 'DiagnosticFloatingInfo', { fg = 9034987 })
vim.api.nvim_set_hl(0, 'DiagnosticFloatingOk', { fg = 10937249 })
vim.api.nvim_set_hl(0, 'DiagnosticFloatingWarn', { fg = 16376495 })
vim.api.nvim_set_hl(
0,
'DiagnosticHint',
{ cterm = { italic = true }, fg = 9757397, italic = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticInfo',
{ cterm = { italic = true }, fg = 9034987, italic = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticOk',
{ cterm = { italic = true }, fg = 10937249, italic = true }
)
vim.api.nvim_set_hl(0, 'DiagnosticSignError', { fg = 15961000 })
vim.api.nvim_set_hl(0, 'DiagnosticSignHint', { fg = 9757397 })
vim.api.nvim_set_hl(0, 'DiagnosticSignInfo', { fg = 9034987 })
vim.api.nvim_set_hl(0, 'DiagnosticSignOk', { fg = 10937249 })
vim.api.nvim_set_hl(0, 'DiagnosticSignWarn', { fg = 16376495 })
vim.api.nvim_set_hl(
0,
'DiagnosticUnderlineError',
{ cterm = { underline = true }, sp = 15961000, underline = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticUnderlineHint',
{ cterm = { underline = true }, sp = 9757397, underline = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticUnderlineInfo',
{ cterm = { underline = true }, sp = 9034987, underline = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticUnderlineOk',
{ cterm = { underline = true }, sp = 10937249, underline = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticUnderlineWarn',
{ cterm = { underline = true }, sp = 16376495, underline = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticVirtualTextError',
{ bg = 3287098, cterm = { italic = true }, fg = 15961000, italic = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticVirtualTextHint',
{ bg = 2699582, cterm = { italic = true }, fg = 9757397, italic = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticVirtualTextInfo',
{ bg = 2633792, cterm = { italic = true }, fg = 9034987, italic = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticVirtualTextOk',
{ bg = 2699582, cterm = { italic = true }, fg = 10937249, italic = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticVirtualTextWarn',
{ bg = 3354938, cterm = { italic = true }, fg = 16376495, italic = true }
)
vim.api.nvim_set_hl(
0,
'DiagnosticWarn',
{ cterm = { italic = true }, fg = 16376495, italic = true }
)
vim.api.nvim_set_hl(0, 'DiffAdd', { bg = 3555651 })
vim.api.nvim_set_hl(0, 'DiffChange', { bg = 2435388 })
vim.api.nvim_set_hl(0, 'DiffDelete', { bg = 4469316 })
vim.api.nvim_set_hl(0, 'DiffText', { bg = 4082539 })
vim.api.nvim_set_hl(0, 'Directory', { fg = 9024762 })
vim.api.nvim_set_hl(0, 'EndOfBuffer', { fg = 1973806 })
vim.api.nvim_set_hl(0, 'Error', { fg = 15961000 })
vim.api.nvim_set_hl(
0,
'ErrorMsg',
{
bold = true,
cterm = { bold = true, italic = true },
fg = 15961000,
italic = true,
}
)
vim.api.nvim_set_hl(0, 'Exception', { fg = 13346551 })
vim.api.nvim_set_hl(0, 'FloatBorder', { fg = 9024762 })
vim.api.nvim_set_hl(0, 'FloatTitle', { fg = 10923464 })
vim.api.nvim_set_hl(0, 'FoldColumn', { fg = 7106694 })
vim.api.nvim_set_hl(0, 'Folded', { bg = 4540250, fg = 9024762 })
vim.api.nvim_set_hl(0, 'Function', { fg = 9024762 })
vim.api.nvim_set_hl(0, 'Identifier', { fg = 15912397 })
vim.api.nvim_set_hl(0, 'IncSearch', { bg = 8309208, fg = 1579045 })
vim.api.nvim_set_hl(0, 'Include', { fg = 13346551 })
vim.api.nvim_set_hl(0, 'Keyword', { fg = 13346551 })
vim.api.nvim_set_hl(0, 'Label', { fg = 7653356 })
vim.api.nvim_set_hl(0, 'LineNr', { fg = 4540250 })
vim.api.nvim_set_hl(0, 'LspCodeLens', { fg = 7106694 })
vim.api.nvim_set_hl(0, 'LspInlayHint', { bg = 2763580, fg = 7106694 })
vim.api.nvim_set_hl(0, 'LspReferenceRead', { bg = 4540250 })
vim.api.nvim_set_hl(0, 'LspReferenceText', { bg = 4540250 })
vim.api.nvim_set_hl(0, 'LspReferenceWrite', { bg = 4540250 })
vim.api.nvim_set_hl(
0,
'LspSignatureActiveParameter',
{ bg = 3224132, bold = true, cterm = { bold = true } }
)
vim.api.nvim_set_hl(0, 'Macro', { fg = 13346551 })
vim.api.nvim_set_hl(
0,
'MatchParen',
{ bg = 4540250, bold = true, cterm = { bold = true }, fg = 16429959 }
)
vim.api.nvim_set_hl(
0,
'ModeMsg',
{ bold = true, cterm = { bold = true }, fg = 13489908 }
)
vim.api.nvim_set_hl(0, 'MoreMsg', { fg = 9024762 })
vim.api.nvim_set_hl(0, 'NonText', { fg = 7106694 })
vim.api.nvim_set_hl(0, 'Normal', { bg = 1973806, fg = 13489908 })
vim.api.nvim_set_hl(0, 'NormalFloat', { bg = 1579045, fg = 13489908 })
vim.api.nvim_set_hl(0, 'NormalNC', { bg = 1973806, fg = 13489908 })
vim.api.nvim_set_hl(0, 'Number', { fg = 16429959 })
vim.api.nvim_set_hl(0, 'Operator', { fg = 9034987 })
vim.api.nvim_set_hl(0, 'Pmenu', { bg = 2829116, fg = 9673138 })
vim.api.nvim_set_hl(0, 'PmenuMatch', { bold = true, cterm = { bold = true } })
vim.api.nvim_set_hl(
0,
'PmenuMatchSel',
{ bold = true, cterm = { bold = true } }
)
vim.api.nvim_set_hl(0, 'PmenuSbar', { bg = 4540250 })
vim.api.nvim_set_hl(
0,
'PmenuSel',
{ bg = 4540250, bold = true, cterm = { bold = true } }
)
vim.api.nvim_set_hl(0, 'PmenuThumb', { bg = 7106694 })
vim.api.nvim_set_hl(0, 'PreProc', { fg = 16106215 })
vim.api.nvim_set_hl(0, 'Question', { fg = 9024762 })
vim.api.nvim_set_hl(
0,
'QuickFixLine',
{ bg = 4540250, bold = true, cterm = { bold = true } }
)
vim.api.nvim_set_hl(0, 'Repeat', { fg = 13346551 })
vim.api.nvim_set_hl(0, 'Search', { bg = 4085607, fg = 13489908 })
vim.api.nvim_set_hl(0, 'SignColumn', { fg = 4540250 })
vim.api.nvim_set_hl(0, 'Special', { fg = 16106215 })
vim.api.nvim_set_hl(0, 'SpecialKey', { link = 'NonText' })
vim.api.nvim_set_hl(
0,
'SpellBad',
{ cterm = { undercurl = true }, sp = 15961000, undercurl = true }
)
vim.api.nvim_set_hl(
0,
'SpellCap',
{ cterm = { undercurl = true }, sp = 16376495, undercurl = true }
)
vim.api.nvim_set_hl(
0,
'SpellLocal',
{ cterm = { undercurl = true }, sp = 9024762, undercurl = true }
)
vim.api.nvim_set_hl(
0,
'SpellRare',
{ cterm = { undercurl = true }, sp = 10937249, undercurl = true }
)
vim.api.nvim_set_hl(0, 'Statement', { fg = 13346551 })
vim.api.nvim_set_hl(0, 'StatusLine', { bg = 1579045, fg = 13489908 })
vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 1579045, fg = 4540250 })
vim.api.nvim_set_hl(0, 'StatusLineTerm', { link = 'StatusLine' })
vim.api.nvim_set_hl(0, 'StatusLineTermNC', { link = 'StatusLineNC' })
vim.api.nvim_set_hl(0, 'StorageClass', { fg = 16376495 })
vim.api.nvim_set_hl(0, 'String', { fg = 10937249 })
vim.api.nvim_set_hl(0, 'Structure', { fg = 16376495 })
vim.api.nvim_set_hl(0, 'Substitute', { bg = 4540250, fg = 16106215 })
vim.api.nvim_set_hl(0, 'TabLine', { bg = 1118491, fg = 7106694 })
vim.api.nvim_set_hl(0, 'TabLineFill', { bg = 1579045 })
vim.api.nvim_set_hl(0, 'TabLineSel', { link = 'Normal' })
vim.api.nvim_set_hl(
0,
'Tag',
{ bold = true, cterm = { bold = true }, fg = 11845374 }
)
vim.api.nvim_set_hl(0, 'TermCursor', { bg = 16113884, fg = 1973806 })
vim.api.nvim_set_hl(
0,
'Title',
{ bold = true, cterm = { bold = true }, fg = 9024762 }
)
vim.api.nvim_set_hl(
0,
'Todo',
{ bg = 15912397, bold = true, cterm = { bold = true }, fg = 1973806 }
)
vim.api.nvim_set_hl(0, 'Type', { fg = 16376495 })
vim.api.nvim_set_hl(
0,
'Visual',
{ bg = 4540250, bold = true, cterm = { bold = true } }
)
vim.api.nvim_set_hl(
0,
'VisualNOS',
{ bg = 4540250, bold = true, cterm = { bold = true } }
)
vim.api.nvim_set_hl(0, 'WarningMsg', { fg = 16376495 })
vim.api.nvim_set_hl(0, 'Whitespace', { fg = 4540250 })
vim.api.nvim_set_hl(0, 'WildMenu', { bg = 7106694 })
vim.api.nvim_set_hl(0, 'WinBar', { fg = 16113884 })
vim.api.nvim_set_hl(0, 'WinBarNC', { link = 'WinBar' })
vim.api.nvim_set_hl(0, 'WinSeparator', { fg = 1118491 })
vim.api.nvim_set_hl(0, 'diffAdded', { fg = 10937249 })
vim.api.nvim_set_hl(0, 'diffChanged', { fg = 9024762 })
vim.api.nvim_set_hl(0, 'diffFile', { fg = 9024762 })
vim.api.nvim_set_hl(0, 'diffIndexLine', { fg = 9757397 })
vim.api.nvim_set_hl(0, 'diffLine', { fg = 7106694 })
vim.api.nvim_set_hl(0, 'diffNewFile', { fg = 16429959 })
vim.api.nvim_set_hl(0, 'diffOldFile', { fg = 16376495 })
vim.api.nvim_set_hl(0, 'diffRemoved', { fg = 15961000 })
vim.api.nvim_set_hl(
0,
'htmlH1',
{ bold = true, cterm = { bold = true }, fg = 16106215 }
)
vim.api.nvim_set_hl(
0,
'htmlH2',
{ bold = true, cterm = { bold = true }, fg = 9024762 }
)
vim.api.nvim_set_hl(0, 'lCursor', { bg = 13489908, fg = 1973806 })
vim.api.nvim_set_hl(0, 'markdownH1', { link = 'rainbow1' })
vim.api.nvim_set_hl(0, 'markdownH2', { link = 'rainbow2' })
vim.api.nvim_set_hl(0, 'markdownH3', { link = 'rainbow3' })
vim.api.nvim_set_hl(0, 'markdownH4', { link = 'rainbow4' })
vim.api.nvim_set_hl(0, 'markdownH5', { link = 'rainbow5' })
vim.api.nvim_set_hl(0, 'markdownH6', { link = 'rainbow6' })
vim.api.nvim_set_hl(0, 'rainbow1', { fg = 15961000 })
vim.api.nvim_set_hl(0, 'rainbow2', { fg = 16429959 })
vim.api.nvim_set_hl(0, 'rainbow3', { fg = 16376495 })
vim.api.nvim_set_hl(0, 'rainbow4', { fg = 10937249 })
vim.api.nvim_set_hl(0, 'rainbow5', { fg = 7653356 })
vim.api.nvim_set_hl(0, 'rainbow6', { fg = 11845374 })
File diff suppressed because it is too large Load Diff
-294
View File
@@ -1,294 +0,0 @@
[
[
"🎨",
"Improve structure / format of the code."
],
[
"⚡️",
"Improve performance."
],
[
"🔥",
"Remove code or files."
],
[
"🐛",
"Fix a bug."
],
[
"🚑️",
"Critical hotfix."
],
[
"✨",
"Introduce new features."
],
[
"📝",
"Add or update documentation."
],
[
"🚀",
"Deploy stuff."
],
[
"💄",
"Add or update the UI and style files."
],
[
"🎉",
"Begin a project."
],
[
"✅",
"Add, update, or pass tests."
],
[
"🔒️",
"Fix security or privacy issues."
],
[
"🔐",
"Add or update secrets."
],
[
"🔖",
"Release / Version tags."
],
[
"🚨",
"Fix compiler / linter warnings."
],
[
"🚧",
"Work in progress."
],
[
"💚",
"Fix CI Build."
],
[
"⬇️",
"Downgrade dependencies."
],
[
"⬆️",
"Upgrade dependencies."
],
[
"📌",
"Pin dependencies to specific versions."
],
[
"👷",
"Add or update CI build system."
],
[
"📈",
"Add or update analytics or track code."
],
[
"♻️",
"Refactor code."
],
[
"",
"Add a dependency."
],
[
"",
"Remove a dependency."
],
[
"🔧",
"Add or update configuration files."
],
[
"🔨",
"Add or update development scripts."
],
[
"🌐",
"Internationalization and localization."
],
[
"✏️",
"Fix typos."
],
[
"💩",
"Write bad code that needs to be improved."
],
[
"⏪️",
"Revert changes."
],
[
"🔀",
"Merge branches."
],
[
"📦️",
"Add or update compiled files or packages."
],
[
"👽️",
"Update code due to external API changes."
],
[
"🚚",
"Move or rename resources (e.g.: files, paths, routes)."
],
[
"📄",
"Add or update license."
],
[
"💥",
"Introduce breaking changes."
],
[
"🍱",
"Add or update assets."
],
[
"♿️",
"Improve accessibility."
],
[
"💡",
"Add or update comments in source code."
],
[
"🍻",
"Write code drunkenly."
],
[
"💬",
"Add or update text and literals."
],
[
"🗃️",
"Perform database related changes."
],
[
"🔊",
"Add or update logs."
],
[
"🔇",
"Remove logs."
],
[
"👥",
"Add or update contributor(s)."
],
[
"🚸",
"Improve user experience / usability."
],
[
"🏗️",
"Make architectural changes."
],
[
"📱",
"Work on responsive design."
],
[
"🤡",
"Mock things."
],
[
"🥚",
"Add or update an easter egg."
],
[
"🙈",
"Add or update a .gitignore file."
],
[
"📸",
"Add or update snapshots."
],
[
"⚗️",
"Perform experiments."
],
[
"🔍️",
"Improve SEO."
],
[
"🏷️",
"Add or update types."
],
[
"🌱",
"Add or update seed files."
],
[
"🚩",
"Add, update, or remove feature flags."
],
[
"🥅",
"Catch errors."
],
[
"💫",
"Add or update animations and transitions."
],
[
"🗑️",
"Deprecate code that needs to be cleaned up."
],
[
"🛂",
"Work on code related to authorization, roles and permissions."
],
[
"🩹",
"Simple fix for a non-critical issue."
],
[
"🧐",
"Data exploration/inspection."
],
[
"⚰️",
"Remove dead code."
],
[
"🧪",
"Add a failing test."
],
[
"👔",
"Add or update business logic."
],
[
"🩺",
"Add or update healthcheck."
],
[
"🧱",
"Infrastructure related changes."
],
[
"🧑‍💻",
"Improve developer experience."
],
[
"💸",
"Add sponsorships or money related infrastructure."
],
[
"🧵",
"Add or update code related to multithreading or concurrency."
],
[
"🦺",
"Add or update code related to validation."
]
]
File diff suppressed because it is too large Load Diff
-178
View File
@@ -1,178 +0,0 @@
[
[
"(╯°□°)╯︵ ┻━┻",
"angry table 生氣 翻桌 幹"
],
[
"_:(´ཀ`」∠):_",
"bleeding 吐血"
],
[
"∩ __∩ y",
"hehe 真是個壞女孩"
],
[
"・゚・。・゚・(つД`)",
"cry 泣き"
],
[
"(´;ω;`)",
"cry 泣き 哭哭"
],
[
"(´;д;`)",
"cry 泣き 哭哭"
],
[
"(;´༎ຶД༎ຶ`)",
"cry miserably"
],
[
"ˊ_>ˋ",
"dandin 淡定 淡定紅茶"
],
[
"♥",
"heart ハート 愛心"
],
[
"┌(┌ o^)┐ホモォ",
"homo ホモ"
],
[
"┌(┌ ^o^)┐しょた。。。",
"rail02000 ショタ しょた shota"
],
[
"へ(゜∇、°)へ",
"ehehe えへへ エヘヘ"
],
[
"キタ――(゚∀゚)――!!",
"kita 来たー キター きたー"
],
[
"_(:3 」∠ )_ ",
"lazy 懶"
],
[
"ˊ・ω・ˋ",
"owo"
],
[
"ˊvˋ",
"relax"
],
[
"( ˘ω˘ )",
"uwu"
],
[
"(´・_・`)",
"sad"
],
[
"(゚⊿゚)",
"Huh? 不知所云 摳妞臉"
],
[
"(。ŏ_ŏ)",
"WTF 什麼啦"
],
[
"( ˘•ω•˘ )",
"owo"
],
[
"(´-ω-) ",
"relax"
],
[
"(。A。) ",
"happy 爽翻"
],
[
"(ノ>ω<)ノ ",
"yeah >w<"
],
[
"\\\\m/ >_< \\\\m/",
"rock"
],
[
"。:.゚ヽ(*´∀`)ノ゚.:。 ",
"cheers 歡呼"
],
[
" ヾ(*´∀ ˋ*)ノ ",
"cheers 歡呼"
],
[
"(´・ω・`)",
"owo"
],
[
"(゚∀。)",
"happy 爽爽"
],
[
"(つд⊂) ",
"don't see 非禮勿視"
],
[
"╮(╯_╰)╭ ",
"alas 無奈 面對國民黨支持者的表情 面對中國五毛的表情"
],
[
"σ ゚∀ ゚) ゚∀゚)σ",
"haha 你看看你 UCCU uccu"
],
[
"σ(´∀`*)",
"me? 我嗎?"
],
[
"il||li _| ̄|○ヽ(・ω・`) ",
"don't mind"
],
[
"_(:3 ⌒゙)_ ",
"butt お尻 おしり 摳屁股"
],
[
"(・∀・)つ➄ ",
"five cent hello 五毛你好"
],
[
"ε≡ヘ( ´∀`)ノ ",
"yeah 耶"
],
[
"(・`ω´・)",
"i would be angry 我要生氣了"
],
[
"(≖ᴗ≖๑)",
"really? orly 呵呵 是嗎 是喔"
],
[
"(゚д゚)",
"shocked 震驚 驚訝"
],
[
"。・゚・(つд`゚)つ⑩))Д´)",
"so pity 你好可憐喔"
],
[
"ლ(´ڡ`ლ)",
"come here 來來來"
],
[
"(/‵Д′)~ ╧╧ ",
"angry furious"
],
[
"#゚Å゚)⊂彡☆))゚Д゚)・∵",
"angry punch"
]
]
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-13033
View File
File diff suppressed because it is too large Load Diff
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-57
View File
@@ -1,57 +0,0 @@
# Rootiest Iosevka Fonts
This is a collection of Iosevka font variants that are used in the rootiest configurations.
![Rootiest Iosevka V2 Font - Regular](./iosevka-v2-regular.png)
## Version
This font was built using
[Iosevka](https://github.com/be5invis/Iosevka) version 31.7.1
The Nerd Font patches were built using
[Nerd Fonts](https://github.com/ryanoasis/nerd-fonts) version 3.2.1
## Installation
[Install the Rootiest Neovim config](../README.md#installation)
### Linux
```bash
cd ~/.config/nvim/fonts
cp *.{otf,ttf} ~/.local/share/fonts
fc-cache -fv
```
### Windows
```powershell
$home = $env:USERPROFILE
cd $home\.config\nvim\fonts
cp *.{otf,ttf} $env:LOCALAPPDATA\Microsoft\Windows\Fonts
```
### MacOS
```bash
cd ~/.config/nvim/fonts
cp *.{otf,ttf} ~/Library/Fonts
```
## Thanks
This font wouldn't be possible without the following projects:
- [Iosevka](https://github.com/be5invis/Iosevka) -
This is the base font whose character variants are used in this font.
- [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts) -
The Nerd Font variant is built using this patch.
## License
This font is licensed under the [MIT License](../LICENSE).
---
Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

+27 -108
View File
@@ -1,113 +1,32 @@
-- Copyright (C) 2024 Chris Laprade (chris@rootiest.com)
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Affero General Public License as
-- published by the Free Software Foundation, either version 3 of the
-- License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU Affero General Public License for more details.
--
-- You should have received a copy of the GNU Affero General Public License
-- along with this program. If not, see <https://www.gnu.org/licenses/>.
--
-- ██████╗ ██████╗ ██████╗ ████████╗██╗███████╗███████╗████████╗
-- ██╔══██╗██╔═══██╗██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝╚══██╔══╝
-- ██████╔╝██║ ██║██║ ██║ ██║ ██║█████╗ ███████╗ ██
-- ██╔══██╗██║ ██║██║ ██║ ██║ ██║██╔══╝ ╚════██║ ██║
-- ██║ ██║╚██████╔╝╚██████╔╝ ██║ ██║███████╗███████║ ██║
-- ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ ╚═╝
--
-- ███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗
-- ████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║
-- ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║
-- ██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║
-- ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║
-- ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═╝╚═╝ ╚═╝
--
-- ,l; c,
-- .:ooool' loo:.
-- .,oooooooo:. looooc, /VVVVVVVV\++++ /VVVVVVVV\
-- ll:,loooooool, looooool \VVVVVVVV/++++++\VVVVVVVV/
-- llll,;ooooooooc. looooooo |VVVVVV|++++++++/VVVVV/'
-- lllllc,coooooooo; looooooo |VVVVVV|++++++/VVVVV/'
-- lllllll;,loooooool' looooooo +|VVVVVV|++++/VVVVV/'+
-- lllllllc .:oooooooo:. looooooo +++|VVVVVV|++/VVVVV/'+++++
-- lllllllc 'loooooool,:ooooooo +++++|VVVVVV|/VVV___++++++++++
-- lllllllc ;ooooooooc,cooooo +++|VVVVVVVVVV/##/ +_+_+_+
-- lllllllc .coooooooo;;looo +|VVVVVVVVV___ +/#_#,#_#,\
-- lllllllc ,loooooool,:ol |VVVVVVV//##/+/#/+/#/'/#/
-- 'cllllc .:oooooooo;. |VVVVV/'+/#/+/#/+/#/ /#/
-- .;llc .loooo:. |VVV/'++/#/+/#/ /#/ /#/
-- ,; ;l;  'V/' /##//##//##//###/
--
-- ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
-- ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
-- ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ Rootiest NVim ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
-- ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ Configuration ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
-- ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
-- ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
-- The rootiest NeoVim configuration!
--[[
Rootiest Neovim
--]]
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PROFILING ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Load profiling package if startup profiler triggered
require('config.profiler')
-- Copyright (C) 2026 Rootiest
-- SPDX-License-Identifier: AGPL-3.0-or-later
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ROOTIEST ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Rootiest Configuration
require('config.rootiest').setup() -- Set up Rootiest options
-- Trigger bootstrap (runtime path, etc.)
require("bootstrap")
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ LAZY ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Load Lazy package manager and plugins
require('config.lazy') -- Bootstrap lazy.nvim and initialize plugins
-- Initialize global registry
_G.Config = {
plugins = {},
called = {},
}
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ROCKS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Load LuaRocks package manager and plugins
require('config.rocks') -- Bootstrap LuaRocks and initialize plugins
-- Load core modules
require("lazyload") -- Plugin lazy-loading module
require("options") -- Configuration options
require("plugins") -- Plugin specifications and setup
require("keymaps") -- Key mappings
-- ╔═════════════════════════════════════════════════════════╗
-- ║ CONFIGURATION STRUCTURE ║
-- ╚═════════════════════════════════════════════════════════╝
-- ╭─────────────────────────────────────────────────────────────────────╮
-- │ Configuration modules are organized into categories: │
-- │ - Options │
-- │ - Keymaps │
-- │ - Autocommands │
-- │ - Utility functions │
-- │ - Plugins │
-- │ - Commands │
-- │ - Dashboards │
-- │ - Types │
-- │ - Dependencies │
-- ╰─────────────────────────────────────────────────────────────────────╯
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ OPTIONS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Neovim options are configured in the lua/config/options.lua file
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ KEYMAPS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Keymaps are configured in the lua/data/keys.lua file
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ AUTOCOMMANDS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Autocommands are configured in the lua/config/autocmds.lua file
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ UTILITY FUNCTIONS ━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Utility functions can be found in the lua/data/func.lua file
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PLUGINS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Plugin specs are defined in the lua/config/plugins.lua file
-- Plugin keys, cmds, dependencies, and opts/config tables are
-- defined in the lua/data/*.lua files. All plugin configurations
-- are defined in a centralized location to keep them organised.
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ COMMANDS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- User and plugin commands are configured in the lua/data/cmds.lua file
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ DASHBOARDS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Dashboard configurations can be found in the lua/data/dash.lua file
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ TYPES ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Plugin configuration tables are located in the lua/data/types.lua file
---━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ DEPENDENCIES ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Plugin depenendencies are defined in the lua/data/deps.lua file
-- Source machine-local and secret overrides (silently ignored if absent)
local user_dots = vim.fn.expand("~/.config/.user-dots/nvim/")
for _, file in ipairs({ "secrets.lua", "local.lua" }) do
local path = user_dots .. file
if vim.fn.filereadable(path) == 1 then
dofile(path)
end
end
-22
View File
@@ -1,22 +0,0 @@
                 ...........  ...                                .cd,                  .l'          
            .........                                          'lxxxxl.                .xxo;        
         ......                                              ;oxxxxxddd;               .dddddc.     
      .....                                               .,dxxxxxxxddddl.             .dddddddl'   
    ....                                                .;cccdxxxxxddddddd;            .dddddddddo; 
   ....                                                 ,cccc:lddddddddddddl.          .ddddddddddo 
  ...  ..                                               ,cccccccodddddddddddo;         .ooooooooooo 
 ......                                                 'ccccccc:cddooooooooool.       .ooooooooooo 
......     ...                                          '::::::::::loooooooooooo:      .ooooooooooo 
.....        ........                                   '::::::::::''loooooooooool'     ooooooooooo 
.....           ..............                       .  '::::::::::'  :oooooooooooo:    lllllllllll 
....                 ..............            ......   '::::::::::'   .loooooooooool'  lllllllllll 
....                  ..     .............    ......    ';;;;;;;;;;'     ;looooooooooo:.lllllllllll 
 ....   .               ..................   ......     .;;;;;;;;;;'      .clllllllllllllllllllllll 
 ....   ..                 ................   . ..      .;;;;;;;;;;'        ,lllllllllllollcccccccc 
  ....  ..                  .................  ...      .;;;;;;;;;;.         .:lllllllllooolccccccc 
   ........                        ..............       .,,,,,,,,,,.           'cllllllllllllcccccc 
     .......                        ............         ',,,,,,,,,.            .:llllllllllllccc:' 
       .......                         ........            .',,,,,,.              'ccccclllllll:.   
         ........     .            ..........                .',,,,.                ;ccclllll;.     
             .............................                      .''.                 .:cllc,        
                  ...................                             ..                   ,:.          
-19
View File
@@ -1,19 +0,0 @@
▀
▄▄▀
▄▄▄▄▄▀▄
▄▄▀▀▀▀▀▀▀▀▀▀▀▀▀▄▄
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▄▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀
▀

View File
-33
View File
@@ -1,33 +0,0 @@
,,,:,:;lc::clllc::,:,,,
.:,c:c,,lc;::,,', .';:ldcdoc:,.
.,:;:....:oo::;;. ,; ':cllc .cd; l:.
.;c;'...,;;;,;;''';:, .. ,oxxxxo. oxxl'
;c;...,l::, .cdxxxxxdddc oxxxxo:.
cl,..,o;, ;oxxxxxxxxddddd; odddddddl'
,c'..;;' .;dxxxxxxxxxxddddddl. ldddddddddo:.
.c;..:;. :ccccc:odxxxxxxddddddddddo, lddddddddddddddl
,:...l. .,. ccccccc:codddddddddddddddddl. lddddddddddddddo
;:..'c.,:coc. :cccccccc:cdddddddddddddddddo: cooooooooooooooo
';...c:o,:: . :ccccccccc::ldddddddddddddddddl' cooooooooooooooo
,o....c'.;' ,x;. :cccccccccc:::odooooooooooooooooc. cooooooooooooooo
c......'o ,c:c;. ::::::::::::::;:oooooooooooooooooo; cooooooooooooool
.c......c .:c.;:;;,. :::::::::::::::, :oooooooooooooooool. :ooooooooooooool
o'.....c; .;:....,c;,:,,,,'. :::::::::::::::, .cooooooooooooooooo:. :lllllllllllllll
c......l ;c:'.........';c:c;::;' ,;:cc ;::::::::::::::, ,looooooooooooooool, :lllllllllllllll
c.....,, ;;,,:l;'...........':l;;'; ,,';:cc,c:. ;::::::::::::::, :oooooooooooooooooc. :lllllllllllllll
l'....c' ,:,:::cc:'.........'::: 'o,......:, ;;;;;;;;;;;;;;;' .cooooooooooooooool:.;lllllllllllllll
,;....l : ll:,. ,,,cl;........:c,;',;;: :c.......l' ;;;;;;;;;;;;;;;' ,llllllllllllllllllcllllllllllllllc
:....:' ,o. 'l;,cl;::;lc,...............:: ,:......'o. ;;;;;;;;;;;;;;;' ;lllllllllllllllloolccccccccccccc
l;...'; o:d .'::c,....................; kl;....'c ,;;;;;;;;;;;;;;' .cllllllllllllllloolcccccccccccc
c....o. '''l cl::,:cc;c,...........;: lccc..;o ,;;;;;;;;;;;;;;' ,lllllllllllllloooolcccccccccc
o...'c :..c .lc;:ccc:;'............;:. :c c..d. ,,,,,,,,,,,,,,,' .:llllllllllllllllllccccccccc
:'..'l.:..;c ;:cc;'................;c::c,.,; ',,,,,,,,,,,,,,' .cllllllllllllllllllcccccc:
:,...:c,..l. ..;'c::c:co,............'o .',,,,,,,,,,,,. ,ccccccccllllllllllc::;.
,c,...'...:, ',cll,'.............;: .',,,,,,,,,. .;ccccccllllllllllc,.
:l'......;c .':oo.........c; ..,,,,,,,. .:ccccclllllll:'
;c,......:;. :; .c:........;:. .',,,,. 'ccccllllc,.
;:c'.....;:,; ,l:'. .,:;........:l' ..''. .;cccc:.
,::,.....';:;;,,':l:;,;;.',,,'';;,::,........,l;. .. .:,.
,;;:;'......,:c:ol;...',,,''..........':c;,
.,,;:c:'....................';c:;;,
,,,:,::;:llllc,:c,:;;'.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

-6
View File
@@ -1,6 +0,0 @@
██████╗ ██████╗ ██████╗ ████████╗██╗███████╗███████╗████████╗ ███╗ ██╗██╗ ██╗██╗███╗ ███╗
██╔══██╗██╔═══██╗██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝╚══██╔══╝ ████╗ ██║██║ ██║██║████╗ ████║
██████╔╝██║ ██║██║ ██║ ██║ ██║█████╗ ███████╗ ██║ ██╔██╗ ██║██║ ██║██║██╔████╔██║
██╔══██╗██║ ██║██║ ██║ ██║ ██║██╔══╝ ╚════██║ ██║ ██║╚██╗██║╚██╗ ██╔╝██║██║╚██╔╝██║
██║ ██║╚██████╔╝╚██████╔╝ ██║ ██║███████╗███████║ ██║ ██║ ╚████║ ╚████╔╝ ██║██║ ╚═╝ ██║
╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═══╝ ╚═╝╚═╝ ╚═╝
-18
View File
@@ -1,18 +0,0 @@
▄▄▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▄▄▀▀▄
▄ ▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▄▄▀▀▀▀▀▀ ▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▄▄▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▄▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀

-1
View File
@@ -1 +0,0 @@
𝙀 𝙊 𝙑 𝙄 𝙈
-15
View File
@@ -1,15 +0,0 @@
███ ███
████ ████
 ████ █████
█ ████ █████
██ ████ █████
███ ████ █████
████ ████ ████
█████ ████████
█████ ███████
█████ ██████
█████ █████
████ ████
███ ███
 𝙀 𝙊 𝙑 𝙄 𝙈
-20
View File
@@ -1,20 +0,0 @@
        ▒░               ▒░       
      ▒▓▓▓▒              ▒▓▒░     
    ▒▓▓▓▓▓▓▓             ▒▓▓▓▒░   
  ▒▓▓▓▓▓▓▓▓▓▓░           ▒▓▓▓▓▓▒░ 
▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒          ▒▓▓▓▓▓▓▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒         ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░       ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░      ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▓▓▓▓▒     ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ░▓▓▓▓▓▓▓▓▓▒    ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓   ▒▓▓▓▓▓▓▓▓▓░  ▒▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓    ▒▓▓▓▓▓▓▓▓▓▒ ░▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓     ░▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓      ░▒▒▒▒▒▒▒▒▒▓▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓        ▒▒▒▒▒▒▒▒▓▓▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓         ░▒▒▒▒▒▒▒▓▓▒▒▒▒▒▒
▒▓▓▓▓▓▓▓▓          ░▒▒▒▒▒▒▓▓▓▒▒▒▒▒
  ▒▓▓▓▓▓▓            ▒▒▒▒▒▒▒▒▒▒▒  
    ▒▓▓▓▓             ░▒▒▒▒▒▒▒░   
      ▒▓▓              ░▒▒▒▒░     
-20
View File
@@ -1,20 +0,0 @@
        ▒░               ▒░       
      ▒▓▓▓▒              ▒▓▒░     
    ▒▓▓▓▓▓▓▓             ▒▓▓▓▒░   
  ▒▓▓▓▓▓▓▓▓▓▓░           ▒▓▓▓▓▓▒░ 
▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒          ▒▓▓▓▓▓▓▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒         ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░       ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░      ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▓▓▓▓▒     ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ░▓▓▓▓▓▓▓▓▓▒    ▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓   ▒▓▓▓▓▓▓▓▓▓░  ▒▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓    ▒▓▓▓▓▓▓▓▓▓▒ ░▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓     ░▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓      ░▒▒▒▒▒▒▒▒▒▓▒▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓        ▒▒▒▒▒▒▒▒▓▓▒▒▒▒▒▒▒
▓▓▓▓▓▓▓▓▓         ░▒▒▒▒▒▒▒▓▓▒▒▒▒▒▒
▒▓▓▓▓▓▓▓▓          ░▒▒▒▒▒▒▓▓▓▒▒▒▒▒
  ▒▓▓▓▓▓▓            ▒▒▒▒▒▒▒▒▒▒▒  
    ▒▓▓▓▓             ░▒▒▒▒▒▒▒░   
      ▒▓▓              ░▒▒▒▒░     
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

-24
View File
@@ -1,24 +0,0 @@
.ld, cc.
,oxxxxl. lxxl'
.:dxxxxxddd; lddddo;.
'lxxxxxxxxddddl. cdddddddc.
':coxxxxxxxddddddd: cdddddddddl,
ccccccoxxxxxddddddddo, cdddddddddddo
cccccc:lddddddddddddddc. cdddddddddddo
:ccccccc:ldddddddddddddo; :oooooooooooo
:cccccccc:codooooooooooool. :oooooooooooo
::::::::::::coooooooooooooo: :oooooooooool
::::::::::::'.coooooooooooool' ;oooooooooool
;:::::::::::' ,looooooooooooo:. ;llllllllllll
;:::::::::::' :oooooooooooool, ;llllllllllll
;;;;;;;;;;;;' .coooooooooooooc.;llllllllllll
;;;;;;;;;;;;' ,llllllllllllllclllllllllllc
;;;;;;;;;;;;. .:lllllllllllloolcccccccccc
,;;;;;;;;;;;. 'lllllllllllloolccccccccc
,;;;;;;;;;;;. ;llllllllllooollccccccc
,,,,,,,,,,,,. .:llllllllllllllccccc:
.',,,,,,,,,. ,ccccccllllllllc:;'
..,,,,,,,. .;ccccllllllll:.
.',,,,. .ccccllllc,.
..''. ,cclc:.
.. .:,.
-11
View File
@@ -1,11 +0,0 @@
▄▀▀ ▄▄
▄▀▀▀ ▄▄▄▄▀▀▀▀▄
▄▀▀▀▀ ▄▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▄▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀
▀▀▀▀

-19
View File
@@ -1,19 +0,0 @@
▄▀▄
▀▀▀
▀▀▀▀▄
▄▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▄▄
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀
▄▀▀▀▄▄ ▄▀▀▀▄▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▄▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀
▄▀▀▀
▄▀▀▀▀▀
▀▀▀▀▀
▀▀▀▀

-27
View File
@@ -1,27 +0,0 @@
                          .''.'''.                              
                 .';:;::ll::;;,,,,cclcc:;,.                     
             .;;c:..:llc,,           ,;.',:ccc.                 
          .;:;.':;,,,;...;,                   .                 
       ':c,'c:,'.                                               
     .:;.,;'.                                                   
    ;:..;'                                                      
   c'.;l.,;c.                                                   
 .:..,lc:::,.                                                   
 l...,',;  'o:,                                                 
;:....;:    .::c;,'.                                            
l....'c       .;:'.,;:;;,,,'..                                 .
:....:.          ':::'.......,::::;;,.                   .';;:l,
c....:               .',;;:;;:'......';:;,.          ;:;;'..:'  
c'...:    ',            .l;,'',,':l:......:;,,',,.  ;,.....l'   
.l...:   .c;              ;;:,;::;,.............c. ;:....'c.    
 ;:..;'  :.,                 .::,;;::;'.........c. ,:c;'.l      
  ';..c, d.c                  ';cc;:::,..........;,.',:,'o      
   ':..;:l.,l                    .,;;;;:cc:;c'.....;c:'.l.      
    .:,..:..;c                        ';:::;...........:.       
      ;c;....':.                         .'':o;......;c         
        .;:,...,;''    :'.                ''c'.....:;'          
           ';:;...':,;,';;c:,,'''''.'',;,:......,:;'            
              .,;,:;....,::lc'..',,'........:;;;'               
                   .',;,;;;::;,,,,;:c;::;;,..                   
                              ,'''.                             
-33
View File
@@ -1,33 +0,0 @@
,,,:,:;lc::clllc::,:,,,
.:,c:c,,lc;::,,', .';:ldcdoc:,.
.,:;:....:oo::;;. ,; ':cllc
.;c;'...,;;;,;;''';:, ..
;c;...,l::,
cl,..,o;,
,c'..;;'
.c;..:;.
,:...l. .,.
;:..'c.,:coc.
';...c:o,:: .
,o....c'.;' ,x;.
c......'o ,c:c;.
.c......c .:c.;:;;,.
o'.....c; .;:....,c;,:,,,,'.
c......l ;c:'.........';c:c;::;' ,;:cc
c.....,, ;;,,:l;'...........':l;;'; ,,';:cc,c:.
l'....c' ,:,:::cc:'.........'::: 'o,......:,
,;....l : ll:,. ,,,cl;........:c,;',;;: :c.......l'
:....:' ,o. 'l;,cl;::;lc,...............:: ,:......'o.
l;...'; o:d .'::c,....................; kl;....'c
c....o. '''l cl::,:cc;c,...........;: lccc..;o
o...'c :..c .lc;:ccc:;'............;:. :c c..d.
:'..'l.:..;c ;:cc;'................;c::c,.,;
:,...:c,..l. ..;'c::c:co,............'o
,c,...'...:, ',cll,'.............;:
:l'......;c .':oo.........c;
;c,......:;. :; .c:........;:.
;:c'.....;:,; ,l:'. .,:;........:l'
,::,.....';:;;,,':l:;,;;.',,,'';;,::,........,l;.
,;;:;'......,:c:ol;...',,,''..........':c;,
.,,;:c:'....................';c:;;,
,,,:,::;:llllc,:c,:;;'.
-3
View File
@@ -1,3 +0,0 @@
░█▀▄░█▀█░█▀█░▀█▀░▀█▀░█▀▀░█▀▀░▀█▀░░░█▀█░█░█░▀█▀░█▄█
░█▀▄░█░█░█░█░░█░░░█░░█▀▀░▀▀█░░█░░░░█░█░▀▄▀░░█░░█░█
░▀░▀░▀▀▀░▀▀▀░░▀░░▀▀▀░▀▀▀░▀▀▀░░▀░░░░▀░▀░░▀░░▀▀▀░▀░▀
-26
View File
@@ -1,26 +0,0 @@
▄▀▀▄▄
▄▀▀▀▀▀▀▀▀▄▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▄▄▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄▄▀▀▀▀
▀▀▀▀▀▀▀▀▀▀ ▄▄▀▀▀▀▀▀▀▀▄▄
▄▀▀▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄▄▄▄▄
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄▄
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▄▄▀▀▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀

-16
View File
@@ -1,16 +0,0 @@

▄▄▄▄ ▄▄ ▄▄▄▄▄▄
▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄ 
▄▄▄▄ ▄ ▄▄▄▄▄ ▄ ▄ ▄  ▄▄▄
▄▄▄▄ ▄▄▄▄▄ ▄ ▄ ▄ ▄▄▄
▄▄▄▄▄▄▄▄▄ ▄ ▄ ▄ ▄   
▄▄▄ ▄ ▄▄   ▄ ▄ ▄ ▄ ▄ ▄▄ 
 ▄▄▄▄▄▄  ▄ ▄ ▄ ▄▄▄▄▄  
▄▄▄▄▄▄▄▄▄   ▄▄ ▄ ▄▄▄▄ ▄▄▄▄ ▄
 ▄▄ ▄▄▄   ▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▀▀
▀▄ ▄  ▄   ▄▄▄▄ ▄▄▄▄ ▄▄▀▀
 ▄▄ ▄▄▄▄▄ ▄▄▄▄ ▄▄▀▀
▄▄▄▄ ▄▄▄▄▄ ▄▄▀▀
▀▀▄▄▄▄▄▄▀▀▀


-16
View File
@@ -1,16 +0,0 @@
███████████ █████ ███ █████
░░███░░░░░███ ░░███ ░░░ ░░███
░███ ░███ ██████ ██████ ███████ ████ ██████ █████ ███████
░██████████ ███░░███ ███░░███░░░███░ ░░███ ███░░███ ███░░ ░░░███░
░███░░░░░███ ░███ ░███░███ ░███ ░███ ░███ ░███████ ░░█████ ░███
░███ ░███ ░███ ░███░███ ░███ ░███ ███ ░███ ░███░░░ ░░░░███ ░███ ███
█████ █████░░██████ ░░██████ ░░█████ █████░░██████ ██████ ░░█████
░░░░░ ░░░░░ ░░░░░░ ░░░░░░ ░░░░░ ░░░░░ ░░░░░░ ░░░░░░ ░░░░░
██████ █████ █████ █████ ███
░░██████ ░░███ ░░███ ░░███ ░░░
░███░███ ░███ ░███ ░███ ████ █████████████
░███░░███░███ ░███ ░███ ░░███ ░░███░░███░░███
░███ ░░██████ ░░███ ███ ░███ ░███ ░███ ░███
░███ ░░█████ ░░░█████░ ░███ ░███ ░███ ░███
█████ ░░█████ ░░███ █████ █████░███ █████
░░░░░ ░░░░░ ░░░ ░░░░░ ░░░░░ ░░░ ░░░░░
-1
View File
@@ -1 +0,0 @@
NeoVim
-25
View File
@@ -1,25 +0,0 @@
▄ ▄▀▄ ▄ ▄ ▄
▀▀▀ ▀▀▀▀ ▀▀▀ ▀▀▀ ▀▀▀
▀▀▄ ▀▀▀▀ ▀▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▄▄
▀▀▀▀▀ ▀▀▀▄ ▀▀▀▀▄▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀ ▀▀▀▄ ▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▄▀▀▀▀▀▀▄▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▄▀▀▀▀▀▀▀▀▀▀▀▄▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▀▄
▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▀▀▀▀▀▀▀▄
▀▀▀ ▀▀▀▀▀ ▄▄▄▄ ▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▄▄▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▄▀▄ ▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▄ ▀▀▀ ▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▄▀▀▀▀
▀▀▀▀▀▀▀ ▀ ▀▀▀▀▀
▀▀▀▀▀ ▀
▀

-1
View File
@@ -1 +0,0 @@
options.lua
+20
View File
@@ -0,0 +1,20 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ Bootstaps │
-- ╰─────────────────────────────────────────────────────────╯
---- Copyright (C) 2026 Rootiest
-- SPDX-License-Identifier: GPL-3.0-or-later
-- This file is sourced before anything else so it can be used to set up
-- the runtime path and other fundamental settings.
-- ─────────────── Manage root user permissions for Neovim ───────────────
-- Redirect data directories if running as root to avoid permission issues
if os.getenv("USER") == "root" or os.getenv("SUDO_USER") ~= nil then
local root_data = "/root/.local/share/nvim-root"
vim.opt.packpath:prepend(root_data .. "/site")
vim.opt.runtimepath:prepend(root_data .. "/site")
-- Prevent root from writing shada to your user home
vim.opt.shadafile = "/root/.local/state/nvim-root.shada"
end
-171
View File
@@ -1,171 +0,0 @@
--- @module "config.autocmds"
--- This module defines the autocommands for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Autocommands │
-- ╰─────────────────────────────────────────────────────────╯
local autogrp = vim.api.nvim_create_augroup
local autocmd = vim.api.nvim_create_autocmd
-- LazyGit root detection
-- if pcall(require, 'lazygit.utils') then
-- autocmd('BufEnter', {
-- pattern = '*',
-- callback = function()
-- require('lazygit.utils').project_root_dir()
-- end,
-- })
-- end
-- ━━━━━━━━━━━━━━━━━━━━━━━ Set up Qalc keymappings ━━━━━━━━━━━━━━━━━━━━━━━
-- Create a group for filetype-specific mappings
autogrp('QalcFileTypeMappings', { clear = true })
-- Create an autocommand for the qalc filetype
autocmd('FileType', {
pattern = 'qalc',
group = 'QalcFileTypeMappings',
callback = function()
-- Set the key mapping: 'y' to run the :QalcYank command in normal mode
vim.keymap.set( -- Yank Result
'n',
'y',
':QalcYank +<CR>',
{ noremap = true, silent = true }
)
-- Set the key mapping: 'q' to run the :QalcClose command in normal mode
vim.keymap.set( -- Close Qalc
'n',
'q',
':QalcClose<CR>',
{ noremap = true, silent = true }
)
end,
})
-- Define a custom command to close the Qalc buffer
vim.api.nvim_create_user_command('QalcClose', function()
local buf_name = vim.api.nvim_buf_get_name(0)
if buf_name ~= '' then
vim.cmd('bd!')
else
-- If the buffer has no name, just remove it without invoking :bd!
vim.api.nvim_buf_delete(0, { force = true })
end
end, { bang = true })
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Set up highlights ━━━━━━━━━━━━━━━━━━━━━━━━━━
local load_highlight = require('utils.highlight')
load_highlight.setup_autocommands()
load_highlight.setup_dashboard_highlight()
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Set up cpp picker ━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Adds a keymap for quicker picking when in cpp files
require('data.autocmd').cpp_picker()
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Set up nvim_exec ━━━━━━━━━━━━━━━━━━━━━━━
-- Function to check and execute the NVIM_EXEC environment variable
local function execute_nvim_exec()
local exec_command = os.getenv('NVIM_EXEC')
-- If NVIM_EXEC is set, execute the command
if exec_command then
vim.cmd(exec_command)
end
end
-- Define an autogroup for the NvimExec autocmd
autogrp('NvimExec', { clear = true })
-- Define an autocmd to run the function at startup
autocmd('VimEnter', {
group = 'NvimExec',
callback = execute_nvim_exec,
})
-- Create an autogroup for managing command-line abbreviations
local abbrev_group = autogrp('LazyAbbreviationGroup', { clear = true })
-- Create an autocmd for unwrapping the 'lazy' abbreviation
autocmd('CmdlineEnter', {
group = abbrev_group,
callback = function()
vim.cmd([[
cnoreabbrev <expr> lazy ((getcmdtype() == ':' && getcmdline() == 'lazy') ? 'Lazy' : 'lazy')
]])
end,
})
-- change line number based on mode:
-- for command mode: make it absolute for ranges etc
-- for normal mode: relative movements <3
local cmdline_group = vim.api.nvim_create_augroup('CmdlineLinenr', {})
-- debounce cmdline enter events to make sure we dont have flickering for non user cmdline use
-- e.g. mappings using : instead of <cmd>
local cmdline_debounce_timer
autocmd('CmdlineEnter', {
group = cmdline_group,
callback = function()
cmdline_debounce_timer = vim.uv.new_timer()
cmdline_debounce_timer:start(
100,
0,
vim.schedule_wrap(function()
if vim.o.number then
vim.o.relativenumber = false
vim.api.nvim__redraw({ statuscolumn = true })
end
end)
)
end,
})
autocmd('CmdlineLeave', {
group = cmdline_group,
callback = function()
if cmdline_debounce_timer then
cmdline_debounce_timer:stop()
cmdline_debounce_timer = nil
end
if vim.o.number then
vim.o.relativenumber = true
end
end,
})
autogrp('RootyCustomEvent', { clear = true })
autocmd({ 'BufReadPost', 'BufNewFile' }, {
group = 'RootyCustomEvent',
callback = function(args)
local ignored_filetypes = require('data.types').general.ft
local ft = vim.bo[args.buf].filetype
if not vim.tbl_contains(ignored_filetypes, ft) then
vim.api.nvim_exec_autocmds('User', { pattern = 'LazyFileOpen' })
end
end,
})
-- Don't comment next line when using `o`
vim.api.nvim_create_autocmd('FileType', {
pattern = '*',
callback = function()
vim.opt_local.formatoptions:remove({ 'o' })
end,
})
-- Run async commands with output to split
vim.api.nvim_create_user_command('RunAsync', function(async_opts)
-- Save current buffer first
vim.cmd('w')
-- Construct the full command
local cmd = table.concat(async_opts.fargs, ' ')
-- Open a horizontal split with the terminal running the command
vim.cmd('belowright split | terminal ' .. cmd)
-- Optional: return focus to original window
vim.cmd('wincmd p')
end, {
nargs = '+', -- Require at least one argument
})
-13
View File
@@ -1,13 +0,0 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ Early interventions │
-- ╰─────────────────────────────────────────────────────────╯
-- Execute project-specific configuration if it exists
local project_config = vim.fn.getcwd() .. '/.nvim.lua'
if vim.fn.filereadable(project_config) == 1 then
dofile(project_config)
end
-- Address vim.hl bug impacting `:Inspect` command
---@see https://github.com/neovim/neovim/issues/31675
vim.hl = vim.highlight
-65
View File
@@ -1,65 +0,0 @@
--- @module "config.keymaps"
--- This module defines the keymapping operations for the Neovim configuration.
--- The actual keybindings are defined in lua/data/keys.lua
-- ╭─────────────────────────────────────────────────────────╮
-- │ Keybinds │
-- ╰─────────────────────────────────────────────────────────╯
-- All keybinds are defined in lua/data/keys.lua
-- This allows both plugin and general keybinds to
-- be defined in a single central location
-- Add keymapper function
local add_keymap = require('data.func').add_keymap
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━ Group Keybinds ━━━━━━━━━━━━━━━━━━━━━━━━
-- Add keymaps for menu groups
for _, item in ipairs(require('data.keys').groups) do
add_keymap(item)
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ General Keybinds ━━━━━━━━━━━━━━━━━━━━━━━
-- Add keymaps for miscellaneous keybinds
for _, item in ipairs(require('data.keys').misc) do
add_keymap(item)
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━━ Telescope Keybinds ━━━━━━━━━━━━━━━━━━━━━━
-- Add keymaps for telescope symbols
for _, item in ipairs(require('data.keys').telescope.symbols) do
add_keymap(item)
end
if require('data.cond').use_splits() then
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━ Resizing splits ━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Add keymaps for resizing splits
for _, map in ipairs(require('data.keys').splits.resize) do
add_keymap(map[1], map[2], map[3], require('data.types').all_modes)
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━ Moving between splits ━━━━━━━━━━━━━━━━━━━━━━━━
-- Add keymaps for moving between splits
for _, map in ipairs(require('data.keys').splits.move) do
add_keymap(map[1], map[2], map[3], require('data.types').all_modes)
end
-- ━━━━━━━━━━━━━━━━━━ Swapping buffers between windows ━━━━━━━━━━━━━━━
-- Add keymaps for swapping buffers
for _, map in ipairs(require('data.keys').splits.swap) do
add_keymap(map[1], map[2], map[3], require('data.types').all_modes)
end
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ MultiCursor ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Add keymaps for multicursor
for _, item in ipairs(require('data.keys').multicursor) do
add_keymap(item)
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Terminal ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Snacks Terminal
for _, item in ipairs(require('data.keys').snacksterm) do
add_keymap(item)
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Overrides ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
require('config.overrides')
-112
View File
@@ -1,112 +0,0 @@
---@module "config.lazy"
--- This module bootstraps Lazy.nvim.
--- Lazy is a plugin manager for Neovim.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Lazy │
-- ╰─────────────────────────────────────────────────────────╯
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
if not vim.uv.fs_stat(lazypath) then
-- stylua: ignore
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", lazypath
})
end
vim.opt.rtp:prepend(vim.env.LAZY or lazypath)
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PLUGINS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
local plugin_specs = {
{ -- LazyVim
'LazyVim/LazyVim',
-- dev = true,
priority = 900,
opts = require('data.types').lazyvim.opts,
},
{
import = 'lazyvim.plugins', -- LazyVim Core Plugins
},
{ -- VSCode
import = 'lazyvim.plugins.extras.vscode',
},
{ import = 'lvplugs' }, -- LazyVim Plugins
{ import = 'plugins' }, -- General Plugins
}
-- ━━━━━━━━━━━━━━━━━━━━━━━━━ Lazy Configuration ━━━━━━━━━━━━━━━━━━━━━━
local lazy_spec = {
spec = plugin_specs,
rocks = {
hererocks = vim.g.use_luarocks,
},
---@diagnostic disable-next-line: assign-type-mismatch
dev = {
fallback = true,
},
install = {
missing = true,
colorscheme = {
-- 'ex-catppuccin-mocha',
'catppuccin-mocha',
'tokyonight',
'default',
},
},
defaults = {
lazy = true,
version = nil,
event = 'VeryLazy',
},
checker = {
-- automatically check for plugin updates
enabled = true,
notify = true,
frequency = 3600,
check_pinned = false,
},
change_detection = {
-- automatically check for config file changes and reload the ui
enabled = true,
notify = false,
},
performance = {
cache = {
enabled = true,
},
reset_packpath = true,
rtp = {
reset = true, -- reset the runtime path to $VIMRUNTIME and your config directory
disabled_plugins = require('data.types').lazy.disabled_plugins,
},
},
profiling = {
loader = true,
require = true,
},
ui = {
border = 'rounded',
title = ' Plugin Manager ',
},
}
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━ Import Plugins ━━━━━━━━━━━━━━━━━━━━━━━━
-- Automatically import all subdirectories of `lua/plugins`
local plugin_dirs = vim.fn.glob('~/.config/nvim/lua/plugins/*', true, true)
for _, dir in ipairs(plugin_dirs) do
if vim.fn.isdirectory(dir) == 1 then
table.insert( -- Add directory to the plugin import table
plugin_specs,
{ import = 'plugins.' .. vim.fn.fnamemodify(dir, ':t') }
)
end
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Setup Lazy ━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Initialize Lazy plugin manager
require('lazy').setup(lazy_spec)
-196
View File
@@ -1,196 +0,0 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ Setup Git Signs for Mini.Files │
-- ╰─────────────────────────────────────────────────────────╯
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
---@type table<string, {symbol: string, hlGroup: string}>
---@param status string
---@return string symbol, string hlGroup
local function mapSymbols(status)
local statusMap = {
-- stylua: ignore start
[" M"] = { symbol = "", hlGroup = "GitSignsChange"}, -- Modified in the working directory
["M "] = { symbol = "", hlGroup = "GitSignsChange"}, -- modified in index
["MM"] = { symbol = "", hlGroup = "GitSignsChange"}, -- modified in both working tree and index
["A "] = { symbol = "+", hlGroup = "GitSignsAdd" }, -- Added to the staging area, new file
["AA"] = { symbol = "", hlGroup = "GitSignsAdd" }, -- file is added in both working tree and index
["D "] = { symbol = "-", hlGroup = "GitSignsDelete"}, -- Deleted from the staging area
["AM"] = { symbol = "", hlGroup = "GitSignsChange"}, -- added in working tree, modified in index
["AD"] = { symbol = "-•", hlGroup = "GitSignsChange"}, -- Added in the index and deleted in the working directory
["R "] = { symbol = "", hlGroup = "GitSignsChange"}, -- Renamed in the index
["U "] = { symbol = "", hlGroup = "GitSignsChange"}, -- Unmerged path
["UU"] = { symbol = "", hlGroup = "GitSignsAdd" }, -- file is unmerged
["UA"] = { symbol = "", hlGroup = "GitSignsAdd" }, -- file is unmerged and added in working tree
["??"] = { symbol = "?", hlGroup = "GitSignsDelete"}, -- Untracked files
["!!"] = { symbol = "!", hlGroup = "GitSignsChange"}, -- Ignored files
-- stylua: ignore end
}
local result = statusMap[status] or { symbol = '?', hlGroup = 'NonText' }
return result.symbol, result.hlGroup
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?
local function escapePattern(str)
---@diagnostic disable-next-line: need-check-nil
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 symbol, hlGroup = mapSymbols(status)
vim.api.nvim_buf_set_extmark(buf_id, nsMiniFiles, i - 1, 0, {
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)
---@diagnostic disable-next-line: param-type-mismatch
if not vim.fs.root(vim.uv.cwd(), '.git') then
return
end
local cwd = vim.fn.expand('%:p:h')
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,
})
-64
View File
@@ -1,64 +0,0 @@
--- @module "config.neovide"
--- This module defines the neovide options for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Neovide │
-- ╰─────────────────────────────────────────────────────────╯
-- Set GUI font
vim.opt.guifont = 'Iosevka Rootiest V2:#e-subpixelantialias:h12'
-- refresh rate and translucency
vim.g.neovide_refresh_rate = 120
vim.g.neovide_opacity = 0.85
vim.g.neovide_window_blurred = true
vim.g.neovide_floating_blur_amount_x = 2.0
vim.g.neovide_floating_blur_amount_y = 2.0
-- cursor fx
vim.g.neovide_cursor_vfx_mode = 'pixiedust'
vim.g.neovide_cursor_smooth_blink = true
vim.g.neovide_cursor_vfx_particle_density = 16.8
vim.g.neovide_cursor_vfx_particle_lifetime = 2.2
vim.g.neovide_cursor_vfx_particle_phase = 1.2
vim.g.neovide_cursor_vfx_particle_curl = 1.0
vim.g.neovide_cursor_animation_length = 0.08
vim.g.neovide_cursor_trail_size = 0.8
-- floating shadow
vim.g.neovide_floating_shadow = true
vim.g.neovide_floating_z_height = 10
vim.g.neovide_light_angle_degrees = 45
vim.g.neovide_light_radius = 3
vim.g.neovide_floating_blur_amount_x = 1.0
vim.g.neovide_floating_blur_amount_y = 1.0
vim.g.neovide_floating_corner_radius = 0.50
-- scaling
vim.g.neovide_scale_factor = 1.0
-- padding
vim.g.neovide_padding_top = 0
vim.g.neovide_padding_bottom = 0
vim.g.neovide_padding_right = 0
vim.g.neovide_padding_left = 0
-- ━━━━━━━━━━━━━━━━━━━━━━━━━ Clipboard mappings ━━━━━━━━━━━━━━━━━━━━━━
local modes = { 'n', 'v', 'c', 'i' }
-- System clipboard mappings
for _, mode in ipairs(modes) do
if mode == 'c' or mode == 'i' then
vim.keymap.set(mode, '<C-v>', '<C-r>+', { silent = true })
vim.keymap.set(mode, '<C-c>', '<C-r>+', { silent = true })
else
vim.keymap.set(mode, '<C-v>', ':r !xsel -b<CR>', { silent = true })
vim.keymap.set(mode, '<C-c>', ':w !xsel -i -b<CR>', { silent = true })
end
end
-- Wezterm-style clipboard mappings (Control-Shift)
for _, mode in ipairs(modes) do
if mode == 'c' or mode == 'i' then
vim.keymap.set(mode, '<C-S-v>', '<C-r>+', { silent = true })
vim.keymap.set(mode, '<C-S-c>', '<C-r>+', { silent = true })
else
vim.keymap.set(mode, '<C-S-v>', ':r !xsel -b<CR>', { silent = true })
vim.keymap.set(mode, '<C-S-c>', ':w !xsel -i -b<CR>', { silent = true })
end
end
-17
View File
@@ -1,17 +0,0 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ Neovim Updater Debug Functions │
-- ╰─────────────────────────────────────────────────────────╯
local D = {}
-- local P = require("nvim_updater")
local U = require('nvim_updater.utils')
function D.test_floating_window()
local output = U.run_hidden_command(
"cd ~/.local/src/neovim && git --no-pager log --pretty=format:'%s' HEAD..origin/master"
)
U.draw_floating_window(output)
end
return D
-257
View File
@@ -1,257 +0,0 @@
--- @module "config.options"
--- This module defines the user options for the Neovim configuration.
--- Variables defined here set configuration options for the rest
--- of the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Options │
-- ╰─────────────────────────────────────────────────────────╯
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ KEYS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
vim.opt.foldlevel = 99
-- Set the mapleader variable to the space key
vim.g.mapleader = " " ---@type string Options: <leader>
-- Set the maplocalleader variable to the space key
vim.g.maplocalleader = "\\" ---@type string Options: <localleader>
-- Set the timeout length for key combinations
vim.g.timeoutlen = 1000 ---@type integer Options: <ms>
-- Allow horizontal motion keys to wrap to next line at start/end of line
vim.opt.whichwrap:append("h,l,<,>,[,]")
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ LSP ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- We don't need perl
vim.g.loaded_perl_provider = 0 ---@type integer Options: <0|1>
-- or ruby
vim.g.loaded_ruby_provider = 0 ---@type integer Options: <0|1>
-- Prefer basedpyright for python
vim.g.lazyvim_python_lsp = "pyright" ---@type string Options: [python lsp]
-- Use tiny-inline-diagnostic
vim.g.usetinyinline = true ---@type boolean Options: <true|false>
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ GIT ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Github username for dashboard and other customizations
vim.g.gitname = 'rootiest' ---@type string Options: <github username>
-- Show GitHub Contributions on dashboard
vim.g.show_github_contrib = true ---@type boolean Options: <true|false>
-- Highlight lines with git changes
vim.g.git_line_hl = false ---@type boolean Options: <true|false>
-- Highlight words with git changes
vim.g.git_word_hl = false ---@type boolean Options: <true|false>
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━ FORMAT AND SAVE ━━━━━━━━━━━━━━━━━━━━━━━━━━━
vim.opt.foldlevel = 99 ---@type integer Options: <0-99>
-- Auto-format
vim.g.autoformat = true ---@type boolean Options: <true|false>
-- Auto-save
vim.g.autosave = true ---@type boolean Options: <true|false>
-- Enable encouraging feedback
vim.g.encourage_me = true ---@type boolean Options: <true|false>
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ MISCELLANEOUS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Use WakaTime for code stats
vim.g.usewakatime = true ---@type boolean Options: <true|false>
-- Allow music controls and stats
vim.g.usemusic = false ---@type boolean Options: <true|false>
-- Allow discord presence
vim.g.usediscord = true ---@type boolean Options: <true|false>
-- Enable HardTime on startup
vim.g.usehardtime = false ---@type boolean Options: <true|false>
-- Enable Image plugin on compatible terminals
vim.g.useimage = true ---@type boolean Options: <true|false>
-- Enable LazyGit plugin
vim.g.uselazygit = true ---@type boolean Options: <true|false>
-- Ignore missing lazy.nvim plugin manager
vim.g.ignore_no_lazy = false ---@type boolean Options: <true|false>
-- Enable codesnap for code screenshots
vim.g.codesnap = true ---@type boolean Options: <true|false>
-- Enable Auto-hiding cursorline
vim.g.auto_cursorline = false ---@type boolean Options: <true|false>
-- Toggle cursorline (when not auto)
vim.o.cursorline = false ---@type boolean Options: <true|false>
-- Enable Smart Scrolloff
vim.g.smart_scrolloff = false ---@type boolean Options: <true|false>
-- Enable Dead Column
vim.g.dead_column = false ---@type boolean Options: <true|false>
-- Animate blinky cursor
vim.g.blinky = true ---@type boolean Options: <true|false>
-- Enable todo-comments features
vim.g.usetodo = true ---@type boolean Options: <true|false>
-- Use Floating help window
vim.g.usefloatinghelp = false ---@type boolean Options: <true|false>
-- Use dev mode for rootiest plugins
vim.g.rootiest_dev = true ---@type boolean Options: <true|false>
-- Enable luarocks package manager
vim.g.use_luarocks = false ---@type boolean Options: <true|false>
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PICKER ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Select default fallback picker
vim.g.lazyvim_picker = "auto" ---@type string Options: [picker]
-- ╭───────────────────────────╮  auto
-- │ │  telescope
-- │ Pickers: │  fzf
-- │ Choose a picker │
-- │ from the list  │
-- │ │
-- ╰───────────────────────────╯
-- Use snacks picker by default
vim.g.use_snacks_picker = true ---@type boolean Options: <true|false>
-- Use the Telescope plugin
vim.g.use_telescope = false ---@type boolean Options: <true|false>
-- Use the Fzf plugin
vim.g.use_fzf_lua = false ---@type boolean Options: <true|false>
-- Use oil file manager
vim.g.useoil = false ---@type boolean Options: <true|false>
-- Use NeoTree file manager
vim.g.useneotree = false ---@type boolean Options: <true|false>
-- Use Yazy file manager
vim.g.useyazi = true ---@type boolean Options: <true|false>
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ AI TOOL ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Configure the AI completion provider
vim.g.aitool = "copilot" ---@type string Options: [ai tool]
-- ╭───────────────────────────╮  neocodeium
-- │ │  codeium
-- │ AI Tools: │  copilot
-- │ Choose an AI provider │  tabnine
-- │ from the list  │  minuet
-- │ │  ollama
-- ╰───────────────────────────╯  none
-- Enable ChatGPT plugin for AI chat
vim.g.usechatgpt = false ---@type boolean Options: <true|false>
-- Enable Avante plugin for AI chat
vim.g.useavante = false ---@type boolean Options: <true|false>
-- Enable Code-Companion plugin for AI chat
vim.g.usecodecomp = true ---@type boolean Options: <true|false>
-- Enable GP plugin for AI chat
vim.g.usegpai = false ---@type boolean Options: <true|false>
-- Use Blink instead of nvim-cmp
vim.g.useblinkcmp = true ---@type boolean Options: <true|false>
-- Use experimental performance fork
vim.g.cmp_performance_enabled = false ---@type boolean Options: <true|false>
-- When using cmp_performance_enabled with blink, blink will follow main branch
-- Requires a working rust toolchain
---@see vim.g.lazyvim_blink_main
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ STATUS COLUMN ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
vim.g.statuscolumn = "snacks" ---@type string Options: [statuscolumn]
-- ╭───────────────────────────╮  barsNlines
-- │ │  snacks
-- │ Status Columns: │  native
-- │ Choose a plugin from │
-- │ the list  │
-- │ │
-- ╰───────────────────────────╯
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BUFFER LINE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
vim.g.tabline = "none" ---@type string Options: [tabline]
-- ╭───────────────────────────╮  bufferline
-- │ │  barsNlines
-- │ Tab Lines: │  none
-- │ Choose a plugin from │
-- │ the list  │
-- │ │
-- ╰───────────────────────────╯
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ DASHBOARD ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
vim.g.dashboard = "snacks" ---@type string Options: [dashboard]
-- ╭───────────────────────────╮  alpha
-- │ │  nvim-dashboard
-- │ Dashboards: │  snacks
-- │ Choose a plugin from │  none
-- │ the list  │
-- │ │
-- ╰───────────────────────────╯
-- Dashboard logo file
vim.g.dash_logo = "mini.txt" ---@type string Options: [dash logo]
-- Dashboard header color
vim.g.DashboardHeaderColor = "#88fc9a" ---@type string Options: [hex color]
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ STATUS LINE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
vim.g.statusline = "lualine" ---@type string Options: [statusline]
-- ╭───────────────────────────╮  lualine
-- │ │  heirline
-- │ Status Lines: │  barsNlines
-- │ Choose a plugin from │  basic
-- │ the list  │  none
-- │ │
-- ╰───────────────────────────╯
-- Click git components on statusline to open LazyGit
vim.g.statusline_clickable_git = true ---@type boolean Options: <true|false>
-- Show wakatime stats on statusline
vim.g.stats_wakatime = false ---@type boolean Options: <true|false>
-- Show music stats on statusline
vim.g.stats_music = true ---@type boolean Options: <true|false>
-- Ignored player sources for music stats
vim.g.stats_ignored_players = { ---@type string[] Options: [ignored players]
"chromium",
"firefox",
"kdeconnect",
"haruna",
"plasma-browser-integration",
"plasma-browser-integration-76042",
}
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ COLOR ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Background color
vim.o.background = "dark" ---@type string Options: <dark|light>
-- Disable Transparency
vim.g.disable_transparency = true ---@type boolean Options: <true|false>
-- Auto Dark-mode
vim.g.autodarkmode = false ---@type boolean Options: <true|false>
-- Set colorcolumn
--vim.opt.colorcolumn = "120" ---@type string|table Options: [column]
--Use Astral colorscheme management
vim.g.use_astral = false ---@type boolean Options: <true|false>
-- ━━━━━━━━━━━━━━━━━━━━━━━━━ TABS AND INDENTATION ━━━━━━━━━━━━━━━━━━━━━━━━
-- Define characters for tabs, indents, and scopes
-- Option [2] will override [1] if both are defined
-- ──────────────── [1] Choose a preset character ──────────────────
-- Specify a character/table from the presets
-- See: data.types.ibl.char for a list of available characters
-- This option can provide multi-character cycling configurations
-- Tab characters
vim.g.tab_char_name = "none" ---@type string Options: [tab char]
-- Indent characters
vim.g.indent_char_name = "none" ---@type string Options: [indent char]
-- Scope characters
vim.g.scope_char_name = "scope" ---@type string Options: [scope char]
-- ──────────────── [2] Choose a specific character ────────────────
-- Define a character to be used in the whitespace to represent tabs/indents
-- This option allows use of any single character string
-- Multi-character cycling configurations are not possible with this option
-- Multi-character strings are not possible with any of the options
-- Tab character
vim.g.tab_char = " " ---@type string Options: [tab char]
-- -- Indent character
vim.g.indent_char = " " ---@type string Options: [indent char]
-- Scope character
vim.g.scope_char = "" ---@type string Options: [scope char]
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Completion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Cmp Window Border
vim.g.completion_borders = "rounded" ---@type string Options: [round|sharp|flat]
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-- Execute post-opts functions
require("config.postopts")
-182
View File
@@ -1,182 +0,0 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ Overrides │
-- ╰─────────────────────────────────────────────────────────╯
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Keymap Overrides ━━━━━━━━━━━━━━━━━━━━━━━
-- Add keymapper function
local add_keymap = require('data.func').add_keymap
-- Add keymaps for overrides
add_keymap(require('data.keys').overrides)
-- Replace '...' with '…' (ellipsis) on InsertLeave
require('data.func').setup_replace_ellipsis(true)
-- Search selected text in visual mode
add_keymap('/', '*<Esc>', 'Search selected text', 'v')
-- Use modern cipher instead of rot13
add_keymap(require('data.keys').cipher.hex)
-- Help keybinds
for _, item in ipairs(require('data.keys').help) do
add_keymap(item)
end
-- Remap Command Mode List
require('data.keys').cmd_mode()
-- ━━━━━━━━━━━━━━━━━━━━━━━━ Additional Overrides ━━━━━━━━━━━━━━━━━━━━━
-- Disable NeoMiniMap in Termux
if vim.g.is_termux then
if require('data.func').is_installed('neominimap') then
-- Disable NeoMiniMap
vim.cmd('Neominimap off')
end
end
-- Allow directional motions to wrap to next line
-- vim.cmd('set whichwrap+=h,l')
-- Stop snippet when leaving insert mode
vim.keymap.set({ 'i', 's' }, '<Esc>', function()
vim.snippet.stop()
return '<Esc>'
end, { expr = true, desc = 'Close snippet session' })
-- Swap the behavior of 'p' and 'P' while preserving plugin-defined behaviors
local opts = { noremap = false, silent = true, remap = true }
vim.keymap.set('n', 'p', 'P', opts)
vim.keymap.set('n', 'P', 'p', opts)
vim.keymap.set('n', 'q:', function()
Pick('command_history')
end, opts)
vim.api.nvim_create_user_command('LspListClients', function()
local clients =
vim.lsp.get_clients({ bufnr = vim.api.nvim_get_current_buf() })
if #clients == 0 then
print('No LSP attached')
else
local names = {}
for _, client in ipairs(clients) do
table.insert(names, client.name)
end
print('Attached LSP(s): ' .. table.concat(names, ', '))
end
end, {})
-- Statuscolumn Tweaks
require('config.statuscolumn')
-- Macro recording cursor color
local api = vim.api
-- Store current cursor color
local current_cursor_color = api.nvim_get_hl(0, { name = 'Cursor' }).bg
api.nvim_create_autocmd('RecordingEnter', {
callback = function()
api.nvim_set_hl(0, 'Cursor', { bg = '#ff5080' })
end,
})
api.nvim_create_autocmd('RecordingLeave', {
callback = function()
api.nvim_set_hl(0, 'Cursor', { bg = current_cursor_color })
end,
})
-- Remap 'q' to 'Q' to reduce accidental macros
if pcall(require, 'which-key') then
require('which-key').add({
lhs = 'q',
rhs = '<nop>',
mode = 'n',
hidden = true,
})
else
vim.keymap.set('n', 'q', '<nop>', { noremap = true })
end
vim.keymap.set('n', 'Q', 'q', { noremap = true, desc = 'Record macro' })
vim.keymap.set(
'n',
'<M-q>',
'Q',
{ noremap = true, desc = 'Replay last register' }
)
-- Duplicate and comment lines
vim.keymap.set('n', 'ycc', function()
vim.cmd('normal! ' .. vim.v.count1 .. 'yy')
vim.cmd('normal ' .. vim.v.count1 .. 'gcc')
vim.cmd("normal! ']$p")
end, { desc = 'Duplicate and comment lines' })
---------------------------------------------------------------------------
-- ╓─────────────────────────────────────────────────────────╖
-- ║ Scroll half a screen with <C-d> and <C-u> ║
-- ║ (with count and memory) ║
-- ╙─────────────────────────────────────────────────────────╜
local last_scroll_count = 1 -- Store the last used count
-- Define the ScrollDirection type
---@alias ScrollDirection 'up'|'down'
--- Scroll half a screen up or down
---@param direction ScrollDirection The direction to scroll in
local function scroll(direction)
-- Set the count to the provided count or the last used count
local count = vim.v.count > 0 and vim.v.count or last_scroll_count
-- Remember the count for next time
last_scroll_count = count
-- To remove the memory feature, uncomment the following line
-- count = vim.v.count > 0 and vim.v.count or 1 -- Use current count or default to 1
-- Calculate the number of lines in a half-screen
local half_screen = math.floor(vim.api.nvim_win_get_height(0) / 2)
-- Generate the key sequence
local keys = count * half_screen .. (direction == 'down' and '\x04' or '\x15')
-- Execute the key sequence
vim.api.nvim_feedkeys(
vim.api.nvim_replace_termcodes(keys, true, false, true),
'n',
false
)
end
-- Map the scroll functions to <C-d> and <C-u>
vim.keymap.set('n', '<C-d>', function()
scroll('down')
end, { silent = true })
vim.keymap.set('n', '<C-u>', function()
scroll('up')
end, { silent = true })
---------------------------------------------------------------------------
-- Dump floating window info to file
vim.keymap.set(
'n',
'<leader>fd',
require('data.func').dump_floating_window_info,
{ desc = 'Dump floating window info to file' }
)
---------------------------------------------------------------------------
-- Obsidian Project Configuration:
local function run_obsidian_config()
-- Reduce conceallevel for Obsidian UI
vim.o.conceallevel = 2
vim.cmd('Neominimap off')
end
vim.api.nvim_create_augroup('obsidian_config', { clear = true })
vim.api.nvim_create_autocmd({ 'BufNewFile', 'BufRead', 'BufEnter' }, {
group = 'obsidian_config',
pattern = vim.fn.expand('~') .. '/vaults/Rootiest Notes/**',
callback = run_obsidian_config,
})
---------------------------------------------------------------------------
-50
View File
@@ -1,50 +0,0 @@
-- ━━━━━━━━━━━━━━━━━━━━━━━━ Post-Config Functions ━━━━━━━━━━━━━━━━━━━━━━━━
--- Function to setup post-opts
local function setup()
-- Setup blinky cursor
require('utils.blinky').setup(vim.g.blinky)
-- Setup nvim-remote
if vim.fn.executable('nvr') == 1 then
vim.env.GIT_EDITOR = "nvr -cc split --remote-wait +'set bufhidden=wipe'"
end
-- Check for termux
local prefix = vim.env.PREFIX
-- Check if prefix contains "com.termux"
if prefix ~= nil then
if prefix:match('com.termux') then
vim.g.useimage = false
vim.g.is_termux = true
vim.g.useavante = false
end
end
-- Define intel_arch
local intel_arch = { x64 = true, x86 = true }
local cur_arch = require('data.func').get_system_arch()
-- Check the platform and disable incompatible plugins
if not intel_arch[cur_arch] then
vim.g.useimage = false
vim.g.useavante = false
end
end
local function define_globals()
-- Define Pick function
Pick = require('data.func').pick
-- Define Pick command
vim.api.nvim_create_user_command('Pick', function(opts)
Pick(unpack(opts.fargs))
end, { nargs = '*' })
end
-- Run Setup function
setup()
-- Define Global Functions
define_globals()
-23
View File
@@ -1,23 +0,0 @@
--- @module "config.profiler"
--- This module configures the profiler for the Neovim configuration.
--- This tool can be used to profile specific modules or all modules.
---
--- The profiler can be toggled with the leader keybinding `d<f1>`
--- or with the `PROF` environment variable.
-- ╭─────────────────────────────────────────────────────────╮
-- │ PROFILER │
-- ╰─────────────────────────────────────────────────────────╯
if vim.env.PROF then
-- example for lazy.nvim
-- change this to the correct path for your plugin manager
local snacks = vim.fn.stdpath('data') .. '/lazy/snacks.nvim'
vim.opt.rtp:append(snacks)
require('snacks.profiler').startup({
startup = {
event = 'VimEnter', -- stop profiler on this event. Defaults to `VimEnter`
-- event = "UIEnter",
-- event = "VeryLazy",
},
})
end
-145
View File
@@ -1,145 +0,0 @@
--- @module "config.rocks"
--- This module bootstraps rocks.nvim.
--- Rocks is a package manager for Neovim.
-- ╭─────────────────────────────────────────────────────────╮
-- │ ROCKS │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
-- ━━━━━━━━━━━━━━━━━━━━━━━━ Bootstrap rocks.nvim ━━━━━━━━━━━━━━━━━━━━━
function M.bootstrap()
do
local rocks_config = {
rocks_path = vim.env.HOME .. '/.local/share/nvim/rocks',
}
vim.g.rocks_nvim = rocks_config
local luarocks_path = {
vim.fs.joinpath(rocks_config.rocks_path, 'share', 'lua', '5.1', '?.lua'),
vim.fs.joinpath(
rocks_config.rocks_path,
'share',
'lua',
'5.1',
'?',
'init.lua'
),
}
package.path = package.path .. ';' .. table.concat(luarocks_path, ';')
local luarocks_cpath = {
vim.fs.joinpath(rocks_config.rocks_path, 'lib', 'lua', '5.1', '?.so'),
vim.fs.joinpath(rocks_config.rocks_path, 'lib64', 'lua', '5.1', '?.so'),
-- Remove the dylib and dll paths if you do not need macos or windows support
vim.fs.joinpath(rocks_config.rocks_path, 'lib', 'lua', '5.1', '?.dylib'),
vim.fs.joinpath(
rocks_config.rocks_path,
'lib64',
'lua',
'5.1',
'?.dylib'
),
vim.fs.joinpath(rocks_config.rocks_path, 'lib', 'lua', '5.1', '?.dll'),
vim.fs.joinpath(rocks_config.rocks_path, 'lib64', 'lua', '5.1', '?.dll'),
}
package.cpath = package.cpath .. ';' .. table.concat(luarocks_cpath, ';')
vim.opt.runtimepath:append(
vim.fs.joinpath(
rocks_config.rocks_path,
'lib',
'luarocks',
'rocks-5.1',
'rocks.nvim',
'*'
)
)
end
-- If rocks.nvim is not installed then install it!
if not pcall(require, 'rocks') then
local rocks_location =
---@diagnostic disable-next-line: param-type-mismatch
vim.fs.joinpath(vim.fn.stdpath('cache'), 'rocks.nvim')
if not vim.uv.fs_stat(rocks_location) then
-- Pull down rocks.nvim
vim.fn.system({
'git',
'clone',
'--filter=blob:none',
'https://github.com/nvim-neorocks/rocks.nvim',
rocks_location,
})
end
-- If the clone was successful then source the bootstrapping script
assert(
vim.v.shell_error == 0,
'rocks.nvim installation failed. Try exiting and re-entering Neovim!'
)
vim.cmd.source(vim.fs.joinpath(rocks_location, 'bootstrap.lua'))
vim.fn.delete(rocks_location, 'rf')
end
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━ Ensure Luarocks ━━━━━━━━━━━━━━━━━━━━━━━
function M.ensure_luarocks()
-- Check if 'luarocks' command is available
if os.execute('luarocks --version') ~= 0 then
-- 'luarocks' is not installed, set up 'luarocks.nvim' plugin
local status_ok, lazy = pcall(require, 'lazy')
if not status_ok then
vim.notify(
'Lazy.nvim not found. Please install it to manage plugins.',
vim.log.levels.ERROR
)
return
end
lazy.setup({
{
'vhyrro/luarocks.nvim',
priority = 1000, -- Ensure this plugin loads first
opts = {
rocks = { 'magick' }, -- Example of a rock that you want to install
},
config = function()
-- Restart Neovim to apply changes after 'luarocks.nvim' sets up
vim.cmd('source $MYVIMRC | qa')
end,
},
})
end
end
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Rocks plugin spec ━━━━━━━━━━━━━━━━━━━━━━
M.plugin_spec = {
'vhyrro/luarocks.nvim',
priority = 1000, -- Very high priority is required
opts = {
rocks = { 'magick' }, -- specifies a list of rocks to install
},
}
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Load plugins ━━━━━━━━━━━━━━━━━━━━━━━━━
-- Load rocks package manager
M.load_rocks = function()
require('rocks')
end
-- Perform setup
M.setup = function()
if vim.g.use_luarocks and not vim.g.is_termux then
M.bootstrap()
M.ensure_luarocks()
M.load_rocks()
end
end
-- Execute the setup function
M.setup()
return M
-158
View File
@@ -1,158 +0,0 @@
---@module "config.rootiest"
--- This module contains the configuration options and functions
--- for the rootiest distro.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Rootiest Module │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
--- Function to trigger an error message
---@param message string The error message to trigger
---@return boolean condition true if the error message was triggered, false otherwise
local function trigger_error(message)
return require('data').func.notify(message, 'ERROR')
end
local function setup_os_vars()
-- Check if we are on windows
vim.g.is_windows = vim.fn.has('win32') == 1 or vim.fn.has('win64') == 1
end
--- Yank line without leading/trailing whitespace
---@return nil
function M.yank_line()
vim.api.nvim_feedkeys('_v$hy$', 'n', true)
end
-- Variable to track if the precognition plugin has been called once
local precog_first_time = true
--- Toggle the precognition plugin
---@return nil
function M.toggle_precognition()
if pcall(require, 'precognition') then
-- Initialize precognition plugin
local precognition = require('precognition')
-- Toggle the plugin
if precog_first_time then
precognition.toggle()
precognition.toggle() -- Call toggle twice
precog_first_time = false
else
precognition.toggle() -- Call toggle once
end
else
trigger_error('precognition plugin is not installed')
end
end
--- Toggle Hardtime and Precognition together
---@return nil
function M.toggle_hardmode()
if pcall(require, 'hardtime') then
local hardtime = require('hardtime')
hardtime.toggle()
M.toggle_precognition()
else
trigger_error('hardtime plugin is not installed')
end
end
--- Load remote-nvim plugin
---@return boolean condition true if the plugin was loaded, false otherwise
function M.load_remote()
if pcall(require, 'remote-nvim') then
---@diagnostic disable-next-line: missing-parameter
require('remote-nvim').setup()
vim.cmd('RemoteStart')
return true
else
trigger_error('remote-nvim plugin is not installed')
return false
end
end
--- Yank text inside quotes on the current line and paste it into text inside quotes at various marks.
--- @return boolean true if any text was pasted successfully, false otherwise
function M.YankAndPasteInQuotes()
-- Yank text inside quotes on the current line
vim.cmd('normal! yiq')
-- Get the yanked text from the "0 register (the unnamed register)
local yanked_text = vim.fn.getreg('"')
-- List of marks to check ('a' to 'z')
local marks = 'abcdefghijklmnopqrstuvwxyz'
-- Flag to track if any pasting was successful
local was_pasted = false
-- Loop through each mark
for mark in marks:gmatch('.') do
-- Check if the mark exists (returns the line number or nil)
local position = vim.fn.getpos("'" .. mark)
if position[1] ~= 0 then
-- Go to the mark
vim.cmd("normal! '" .. mark)
-- Select text inside quotes and paste the yanked text
vim.cmd('normal! viq')
vim.cmd('normal! "' .. yanked_text .. 'P')
-- Set the flag to true since pasting was successful
was_pasted = true
end
end
-- Return whether any pasting was successful
return was_pasted
end
--- Evaluate Neovide state and activate settings if necessary
---@return boolean condition true if Neovide is active, false otherwise
function M.eval_neovide()
if vim.g.neovide then
require('config.neovide')
return true
else
return false
end
end
--- Define user commands
---@return nil
function M.define_commands()
-- Define Q as a usercmd
vim.api.nvim_create_user_command('Q', 'qall', { desc = 'Quit all buffers' })
-- Define yank line command
vim.api.nvim_create_user_command('YankLine', function()
M.yank_line()
end, { force = true, desc = 'Yank line without leading whitespace' })
vim.api.nvim_create_user_command(
'YankAndPasteQuotes',
M.YankAndPasteInQuotes,
{}
)
end
--- Set up rootiest module
function M.setup()
-- Early interventions
require('config.early')
-- Setup OS variables
setup_os_vars()
-- Setup neovide
M.eval_neovide()
-- Define user commands
M.define_commands()
-- Setup vimscripts
require('data.vim').setup()
-- Setup types data
require('data.types').setup()
-- Setup indentor
-- require('utils.indentor')
end
return M
-143
View File
@@ -1,143 +0,0 @@
-- Setup gradient line number column
-- Table to hold hex color values for easy reference
local colors = {
statusLineNrCurrent = '#b3befe',
statusLineNrDefault = '#444659',
fallbackColor = '#808080', -- Fallback gray if the group doesn't exist
}
--- Calculate a color gradient between two colors.
-- @param base_color (string) The starting color in hex format (e.g., '#RRGGBB').
-- @param target_color (string) The ending color in hex format (e.g., '#RRGGBB').
-- @param max_steps (number) The total number of steps in the gradient.
-- @param step (number) The current step in the gradient.
-- @return (string) The interpolated color in hex format.
local function calculate_gradient(base_color, target_color, max_steps, step)
-- Parse the base and target colors into RGB components
local br, bg, bb =
tonumber(base_color:sub(2, 3), 16),
tonumber(base_color:sub(4, 5), 16),
tonumber(base_color:sub(6, 7), 16)
local tr, tg, tb =
tonumber(target_color:sub(2, 3), 16),
tonumber(target_color:sub(4, 5), 16),
tonumber(target_color:sub(6, 7), 16)
-- Calculate the blending factor
local factor = step / max_steps
-- Interpolate between the base and target colors based on the blending factor
local r = math.floor(br + (tr - br) * factor)
local g = math.floor(bg + (tg - bg) * factor)
local b = math.floor(bb + (tb - bb) * factor)
return string.format('#%02X%02X%02X', r, g, b) -- Return the new color as a string
end
--- Get the foreground color of a highlight group.
-- @param group (string) The name of the highlight group.
-- @return (string) The foreground color in hex format or a fallback gray color.
local function get_highlight_fg(group)
local hl = vim.api.nvim_get_hl(0, { name = group })
if hl and hl.fg then
return string.format('#%06X', hl.fg) -- Convert the integer color to hex
else
return colors.fallbackColor -- Use fallback gray if the group doesn't exist
end
end
--- Set up gradient highlights for a specified group.
-- @param base_color (string) The starting color for the gradient.
-- @param group_name_prefix (string) The prefix for the highlight group names.
-- @param max_steps (number) The total number of steps for the gradient.
local function setup_gradient_highlights(
base_color,
group_name_prefix,
max_steps
)
local target_color = get_highlight_fg('StatusLineNrDefault') -- Get the default color for interpolation
for step = 1, max_steps do
local color = calculate_gradient(base_color, target_color, max_steps, step) -- Get the gradient color
vim.api.nvim_set_hl(
0,
group_name_prefix .. step,
{ fg = color, bg = 'NONE' } -- Set the highlight with foreground color and no background
)
end
end
-- Define highlight groups for current and default status line numbers
vim.api.nvim_set_hl(
0,
'StatusLineNrCurrent',
{ fg = colors.statusLineNrCurrent, bg = 'NONE', bold = true }
)
vim.api.nvim_set_hl(
0,
'StatusLineNrDefault',
{ fg = colors.statusLineNrDefault, bg = 'NONE' }
)
-- Set up gradient highlights for lines above and below the cursor
setup_gradient_highlights(colors.statusLineNrCurrent, 'StatusLineNrAbove', 10)
setup_gradient_highlights(colors.statusLineNrCurrent, 'StatusLineNrBelow', 10)
-- Custom status column for displaying line number gradients
_G.CustomStatusColumn = function()
local lnum = vim.v.lnum -- Current line number
local cursor_lnum = vim.fn.line('.') -- Current cursor line number
local max_gradient_steps = 10 -- Maximum steps in gradient
-- Use the plugin's original status column
local original_statuscolumn = require('snacks.statuscolumn').get()
--FIXME: Diagnistics indications currently non-functional
--
-- -- Check for diagnostics on the current line
-- local diagnostics = vim.diagnostic.get(0, { lnum = lnum - 1 }) -- Get diagnostics for the current line (subtract 1 for 0-based index)
-- local highlight_group = nil
--
-- -- Loop through diagnostics to determine highlight group based on severity
-- for _, diagnostic in ipairs(diagnostics) do
-- if diagnostic.severity == vim.diagnostic.severity.ERROR then
-- highlight_group = 'DiagnosticSignError'
-- break
-- elseif diagnostic.severity == vim.diagnostic.severity.WARN then
-- highlight_group = 'DiagnosticSignWarn'
-- elseif diagnostic.severity == vim.diagnostic.severity.INFO then
-- highlight_group = 'DiagnosticSignInfo'
-- elseif diagnostic.severity == vim.diagnostic.severity.HINT then
-- highlight_group = 'DiagnosticSignHint'
-- end
-- end
--
-- -- Highlight for lines with diagnostics
-- if highlight_group then
-- return '%#' .. highlight_group .. '#' .. original_statuscolumn .. '%*' -- Use the corresponding highlight for this line
-- end
-- Highlight for the current line
if lnum == cursor_lnum then
return '%#StatusLineNrCurrent#' .. original_statuscolumn .. '%*'
end
-- Highlight for lines above the cursor
if lnum < cursor_lnum and (cursor_lnum - lnum) <= max_gradient_steps then
local step = cursor_lnum - lnum
return '%#StatusLineNrAbove' .. step .. '#' .. original_statuscolumn .. '%*'
end
-- Highlight for lines below the cursor
if lnum > cursor_lnum and (lnum - cursor_lnum) <= max_gradient_steps then
local step = lnum - cursor_lnum
return '%#StatusLineNrBelow' .. step .. '#' .. original_statuscolumn .. '%*'
end
-- Default case for other lines
return '%#StatusLineNrDefault#' .. original_statuscolumn .. '%*'
end
-- Set the custom status column to be used
vim.o.statuscolumn = [[%!v:lua.CustomStatusColumn()]]
+26
View File
@@ -0,0 +1,26 @@
--[[
Constants
--]]
-- Copyright (C) 2026 Rootiest
-- SPDX-License-Identifier: GPL-3.0-or-later
local M = {}
--- Dashboard Header
M.header = [[
N E O V I M E D I T I O N
[ 󰈚 ] [ 󰈭 ] [ 󰊄 ] [ 󰒲 ] [ 󰒓 ] [ 󰩈 ]
]]
return M
-167
View File
@@ -1,167 +0,0 @@
---@module "data.autocmd"
--- This module defines the autocommands for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Autocommands │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
local augroup = vim.api.nvim_create_augroup
local autocmd = vim.api.nvim_create_autocmd
M.cpp_picker = function()
augroup('cpp_picker', { clear = true })
-- C++ Picker
autocmd('FileType', {
group = 'cpp_picker',
pattern = { 'cpp', 'c', 'h', 'hpp' },
callback = function()
require('data.func').add_keymap(require('data.keys').cpp_picker)
end,
})
end
M.minifiles = {
--- Function to dynamically resize the preview window
dynamic_resize = function()
local function update_width_preview()
local multiplier = 0.25
if vim.g.minifiles_width ~= nil then
multiplier = vim.g.minifiles_width
end
if package.loaded['mini.files'] then
-- Obtain the existing config
local config = require('mini.files').config
-- Update the width_preview based on the current window size
if multiplier > 1 then
-- If the multiplier is greater than 1, use as the preview width
config.windows.width_preview = multiplier
else
-- Otherwise, use the current window width multiplied by the multiplier
config.windows.width_preview = math.floor(vim.o.columns * multiplier)
end
-- Apply the updated config
require('mini.files').setup(config)
end
end
-- Flag to determine if mini.files is currently in use
local is_mini_files_active = false
-- Autocommand group to handle dynamic resizing
augroup('MiniFilesDynamicWidth', { clear = true })
-- Handle mini.files open event to set the flag
autocmd('User', {
group = 'MiniFilesDynamicWidth',
pattern = 'MiniFilesExplorerOpen',
callback = function()
is_mini_files_active = true
end,
})
-- Handle mini.files close event to reset the flag and update the preview width
autocmd('User', {
group = 'MiniFilesDynamicWidth',
pattern = 'MiniFilesExplorerClose',
callback = function()
is_mini_files_active = false
update_width_preview()
end,
})
-- Handle window resize event
autocmd('VimResized', {
group = 'MiniFilesDynamicWidth',
callback = function()
if is_mini_files_active then
-- Defer the update until mini.files closes
autocmd('User', {
group = 'MiniFilesDynamicWidth',
pattern = 'MiniFilesExplorerClose',
callback = update_width_preview,
once = true, -- Ensure this runs only once
})
else
-- If mini.files is not active, update immediately
update_width_preview()
end
end,
})
end,
}
-- Create an autogroup for the TermInsertMode autocmds
local TermInsertMode = augroup('TermInsertMode', { clear = true })
-- Start terminal in insert mode
autocmd({ 'TermOpen' }, {
group = TermInsertMode,
pattern = { '*' },
callback = function()
if vim.opt.buftype:get() == 'terminal' then
-- if filetype does not contain 'dashboard'
if not string.find(vim.opt.filetype:get(), 'dashboard') then
-- If window is editable
if vim.opt.modifiable:get() then
vim.cmd(':startinsert')
end
end
end
end,
})
-- When entering a terminal buffer auto switch to insert mode
-- I could use TermEnter event but it does not work when switching between window splits
autocmd({ 'BufEnter' }, {
group = TermInsertMode,
pattern = { '*' },
callback = function()
if vim.opt.buftype:get() == 'terminal' then
-- if filetype does not contain 'dashboard'
if not string.find(vim.opt.filetype:get(), 'dashboard') then
-- If window is editable
if vim.opt.modifiable:get() then
vim.cmd(':startinsert')
end
end
end
end,
})
-- Update OSC7 in fish shell
local function update_osc7()
local cwd = vim.fn.getcwd()
local uri = 'file://' .. vim.fn.hostname() .. cwd
io.stdout:write('\27]7;' .. uri .. '\27\\')
end
-- Save CWD where we can access it
local function save_cwd()
local cwd = vim.fn.getcwd()
local file = io.open(os.getenv('HOME') .. '/.nvim_last_dir', 'w')
if file then
file:write(cwd)
file:close()
end
end
-- Update OSC7 and file on directory change
autocmd('DirChanged', {
callback = function()
save_cwd()
update_osc7()
end,
})
-- Save on exit
autocmd('VimLeavePre', {
callback = save_cwd,
})
-- Send OSC 7 on startup
update_osc7()
-- Save CWD on startup
save_cwd()
return M
-147
View File
@@ -1,147 +0,0 @@
--- @module "data.cmd"
--- This module contains the commands for the plugins.
-- ╭─────────────────────────────────────────────────────────╮
-- │ CMD DATA │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
--- Autosave plugin cmds
M.autosave = {
'ASToggle',
}
--- CodeCompanion plugin cmds
M.codecompanion = {
'CodeCompanion',
'CodeCompanionChat',
'CodeCompanionActions',
'CodeCompanionCmd',
}
--- Codesnap plugin cmds
M.codesnap = {
'CodeSnap',
'CodeSnapSave',
'CodeSnapHighlight',
'CodeSnapASCII',
}
--- DiffView plugin cmds
M.diffview = {
'DiffviewOpen',
'DiffviewClose',
'DiffviewToggleFiles',
'DiffviewFocusFiles',
'DiffviewRefresh',
'DiffviewFileHistory',
}
--- FloatingHelp plugin cmds
M.floating_help = {
'FloatingHelp',
'FloatingHelpClose',
'FloatingHelpToggle',
}
--- Gists plugin cmds
M.gist = {
'GistCreate',
'GistCreateFromFile',
'GistsList',
}
--- Gx plugin cmds
M.gx = {
'Browse',
}
--- ImgClip plugin cmds
M.imgclip = {
'ImgClipEmbed',
'PasteImage',
'ImgClipConfig',
}
--- Kitty-Scrollback plugin cmds
M.kitty_scrollback = {
'KittyScrollbackGenerateKittens',
'KittyScrollbackCheckHealth',
}
--- LazyGit plugin cmds
M.lazygit = {
'LazyGit',
'LazyGitConfig',
'LazyGitCurrentFile',
'LazyGitFilter',
'LazyGitFilterCurrentFile',
}
--- Markdown-preview plguin cmds
M.markdown_preview = {
'MarkdownPreviewToggle',
'MarkdownPreview',
'MarkdownPreviewStop',
}
--- Nekifoch plugin cmds
M.nekifoch = 'Nekifoch'
--- Thanks plugin cmds
M.thanks = {
'ThanksAll',
'ThanksGithubAuth',
'ThanksGithubLogout',
'ThanksClearCache',
}
--- Gitlinker plugin cmds
M.gitlinker = {
'GitLink',
}
--- Qalc plugin cmds
M.qalc = {
'Qalc',
'QalcAttach',
'QalcYank',
}
--- Ripsub plugin cmds
M.ripsub = {
'RipSubstitute',
}
--- Spell Errors plugin cmds
M.spell_errors = {
'Telescope spell_errors',
}
--- Symbols plugin cmds
M.symbols = {
'Symbols',
'SymbolsToggle',
'SymbolsOpen',
'SymbolsClose',
}
--- Suda plugin cmds
M.suda = {
'SudaWrite',
'SudaRead',
}
--- Transparent plugin cmds
M.transparent = {
'TransparentEnable',
'TransparentDisable',
'TransparentToggle',
}
--- Trouble plugin cmds
M.trouble = {
'Trouble',
}
return M
-240
View File
@@ -1,240 +0,0 @@
---@module "data.cond"
--- This module defines the conditionals for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Conditionals │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
local func = require('data.func')
local types = require('data.types')
-- Auto-dark-mode conditional options
M.auto_dark_mode = function()
return func.check_global_var('autodarkmode', true, false)
and not func.is_ssh()
end
--- Auto Save conditional options
M.autosave = function()
return func.check_global_var('autosave', true, false)
end
-- Auto Format conditional options
M.autoformat = function()
return func.check_global_var('autoformat', true, false)
end
--- Bars-N-Lines conditional options
M.barsNlines = function()
if
func.check_global_var('statuscolumn', 'barsNlines', 'native')
or func.check_global_var('tabline', 'barsNlines', 'bufferline')
or func.check_global_var('statusline', 'barsNlines', 'lualine')
then
return true
end
return false
end
--- Avante conditional options
M.avante = function()
return func.check_global_var('useavante', true, false)
end
--- ChatGPT conditional options
M.chatgpt = function()
return func.check_global_var('usechatgpt', true, false)
end
--- GP conditional options
M.gp = function()
return func.check_global_var('usegpai', true, false)
end
--- Codeium conditional options
M.codeium = function()
return func.check_global_var('aitool', 'codeium', 'neocodeium')
end
--- CodeSnap conditional options
M.codesnap = function()
return func.check_global_var('codesnap', true, false)
end
--- Colorful Window-Separators conditional options
M.colorfulwinsep = function()
return func.check_global_var('colorfulwinsep', true, false)
end
--- Auto-CursorLine conditional options
M.cursorline = function()
return func.check_global_var('auto_cursorline', true, true)
end
--- Bufferline conditional options
M.bufferline = function()
if
func.check_global_var('tabline', 'bufferline', 'bufferline')
or func.check_global_var('tabline', 'barsNlines', 'bufferline')
then
return true
end
return false
end
-- Code-Companion conditional options
M.codecompanion = function()
return func.check_global_var('usecodecomp', true, false)
end
--- CoPilot conditional options
M.copilot = function()
return vim.g.aitool == 'copilot'
end
--- FloatingHelp conditional options
M.floating_help = function()
return func.check_global_var('usefloatinghelp', true, false)
end
--- HardTime conditional options
M.hardtime = function()
return func.check_global_var('usehardtime', true, false)
end
--- Heirline conditional options
M.heirline = function()
return func.check_global_var('statusline', 'heirline', 'heirline')
end
--- Image conditional options
M.image = function()
-- Disable image rendering in Neovide
-- or when vim.g.useimage = false
if vim.g.useimage == false then
return false
end
return not vim.g.neovide
end
M.lualine = function()
-- List of excluded buffer names
local excluded_buffers = require('data.types').general.buf
-- List of excluded filetypes
local excluded_filetypes = require('data.types').general.ft
-- Check buffer name
local bufname = vim.api.nvim_buf_get_name(0)
for _, name in ipairs(excluded_buffers) do
if string.find(bufname, name) then
return false
end
end
-- Check filetype
local filetype = vim.bo.filetype
for _, ft in ipairs(excluded_filetypes) do
if filetype == ft then
return false
end
end
-- Default: load for all other buffers
return require('data.func').check_global_var(
'statusline',
'lualine',
'lualine'
)
end
--- LuaRocks conditional options
M.luarocks = function()
return func.check_global_var('useluarocks', true, true)
end
--- Minimap conditional options
M.minimap = function()
types.setup()
local ex_ft = types.minimap.ft
local ex_buf = types.minimap.buf
local ft = vim.bo.filetype
local buf = vim.bo.buftype
local mod = vim.bo.modifiable
return not vim.tbl_contains(ex_ft, ft)
and not vim.tbl_contains(ex_buf, buf)
and mod == true
end
--- Minuet conditional options
M.minuet = function()
return func.check_global_var('aitool', 'minuet', 'neocodeium')
end
--- Music Controls conditional options
M.musiccontrols = function()
return func.check_global_var('usemusic', true, true)
end
--- NekiFoch conditional options
M.nekifoch = function()
return func.is_kitty()
end
--- Codeium conditional options
M.neocodeium = function()
return func.check_global_var('aitool', 'neocodeium', 'neocodeium')
end
M.neotree = function()
return func.check_global_var('useneotree', true, true)
end
--- Tabnine conditional options
M.tabnine = function()
return func.check_global_var('aitool', 'tabnine', 'neocodeium')
end
M.tiny_inline_diagnostic = function()
return func.check_global_var('usetinyinline', true, false)
end
M.todo = function()
if func.check_global_var('usetodo', true, true) then
if not func.is_neovide() then
if vim.bo.readonly == false then
if func.dir_is_git_repo(vim.fn.expand('%:p:h')) then
return true
end
end
end
end
return false
end
--- TMux conditional options
M.tmux = function()
return func.is_tmux()
end
--- Use Smart-splits conditional
M.use_splits = function()
-- return not func.is_ghostty()
return true
end
--- WakaTime conditional options
M.wakatime = function()
return vim.g.usewakatime
end
--- WezTerm conditional options
M.wezterm = function()
return func.is_wezterm()
end
--- Yazi conditional options
M.yazi = function()
return func.check_global_var('useyazi', true, false)
end
return M
-113
View File
@@ -1,113 +0,0 @@
---@module "data.dash"
--- This module contains the data for the dashboard plugins.
-- ╭─────────────────────────────────────────────────────────╮
-- │ DASH DATA │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
-- Define default path to the logo art
local logofile = vim.fn.stdpath('config') .. '/logo/' .. 'neovim.txt'
if vim.g.dash_logo then
logofile = vim.fn.stdpath('config') .. '/logo/' .. vim.g.dash_logo
end
M.logo = logofile
M.fallback_logo = [[
]]
-- Define dashboard button items in a single table
local dashboard_buttons = {
-- stylua: ignore start
{ key = "f", icon = "", desc = " Find File", action = function() Pick() end },
{ key = "n", icon = "", desc = " New File", action = function() vim.cmd("ene | startinsert") end },
{ key = "r", icon = "", desc = " Recent Files", action = function() Pick("oldfiles") end },
{ key = "g", icon = "", desc = " Grep Text", action = function() Pick("grep") end },
{ key = "p", icon = "", desc = " Projects", action = function() Pick("projects") end },
{ key = "t", icon = "󰙅 ", desc = " Pick Tree", action = function() Pick("file_browser", "mini") end },
{ key = "z", icon = "", desc = " LazyGit", action = function() Snacks.lazygit() end },
{ key = "c", icon = "", desc = " Config", action = function() Pick("config_files") end },
{ key = "s", icon = "󰶮 ", desc = " Restore Session", action = function() require("persistence").load() end },
{ key = "S", icon = "", desc = " Remote Session", action = function() require("config.rootiest").load_remote() end },
{ key = "l", icon = "󰒲 ", desc = " Lazy", action = function() vim.cmd("Lazy ") end },
{ key = "q", icon = "", desc = " Quit", action = function() vim.api.nvim_input("<cmd>qa<cr>") end },
} -- stylua: ignore end
--- Alpha plugin configuration
M.alpha = {
--- Function to setup the Alpha dashboard options
---@return table dashboard The alpha dashboard options
opts = function()
-- Load the alpha plugin dashboard-nvim theme
local dashboard = require('alpha.themes.dashboard')
--- Function to read the ASCII art from the logo file
---@param logo_path string The path to the logo file
---@return table art The ASCII art lines
local function read_ascii_art(logo_path)
local lines = {}
for line in io.lines(logo_path) do
table.insert(lines, line)
end
return lines
end
-- Read the ASCII art from the logo file
local ascii_art_lines = read_ascii_art(M.logo)
-- Add the ASCII art to the dashboard header
dashboard.section.header.val = ascii_art_lines
-- Add the dashboard buttons from the shared table
dashboard.section.buttons.val = {}
for _, button in ipairs(dashboard_buttons) do
table.insert(
dashboard.section.buttons.val,
-- Ignore string -> function (param type is valid)
---@diagnostic disable: param-type-mismatch
dashboard.button(button.key, button.icon .. button.desc, button.action)
)
end
for _, button in ipairs(dashboard.section.buttons.val) do
button.opts.hl = 'AlphaButtons'
button.opts.hl_shortcut = 'AlphaShortcut'
end
-- Set up highlight groups for the dashboard
dashboard.section.header.opts.hl = 'Conditional' or 'AlphaHeader'
dashboard.section.footer.opts.hl = 'AlphaFooter'
-- Calculate the dashboard layout padding
local padding = 0
if vim.fn.winheight(0) < 60 then
padding = vim.fn.max({ 2, vim.fn.floor(vim.fn.winheight(0) * 0.1) })
elseif vim.fn.winheight(0) < 40 then
padding = 1
elseif vim.fn.winheight(0) < 30 then
padding = 0
else
padding = vim.fn.max({ 2, vim.fn.floor(vim.fn.winheight(0) * 0.2) })
end
-- Apply the padding to the dashboard layout
dashboard.opts.layout[1].val = padding
-- Return the dashboard options
return dashboard
end,
}
--- Dashboard-nvim plugin configuration
M.dashboard_nvim = {
-- Reusing the same table for button choices in dashboard-nvim
choices = dashboard_buttons,
}
return M
-169
View File
@@ -1,169 +0,0 @@
---@module "data.deps"
--- This module aggregates various dependencies used throughout the configuration.
--- It provides a centralized way to access dependencies.
-- ╭─────────────────────────────────────────────────────────╮
-- │ DEPENDENCIES │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
M.avante = {
'nvim-lua/plenary.nvim',
'MunifTanjim/nui.nvim',
}
M.chatgpt = {
'MunifTanjim/nui.nvim',
'nvim-lua/plenary.nvim',
'folke/trouble.nvim',
'nvim-telescope/telescope.nvim',
}
M.codecompanion = {
'nvim-lua/plenary.nvim',
'nvim-treesitter/nvim-treesitter',
}
--- nvim-cmp dependencies
---@return table The nvim-cmp dependencies
M.cmp = {
{
'L3MON4D3/LuaSnip',
--- Function to build the dependencies
---@return string|nil The command to build the dependencies
build = (function()
if vim.fn.has('win32') == 1 or vim.fn.executable('make') == 0 then
return
end
return 'make install_jsregexp'
end)(),
dependencies = {
{
'rafamadriz/friendly-snippets',
config = function()
require('luasnip.loaders.from_vscode').lazy_load()
end,
},
},
},
{
'petertriho/cmp-git',
opts = {},
--- Function to configure the cmp-git dependency
---@return table|nil The cmp-git config
config = function()
local cmp = require('cmp')
cmp.setup.filetype('gitcommit', {
sources = cmp.config.sources({
{ name = 'git', priority = 50 },
{ name = 'path', priority = 40 },
}, {
{ name = 'buffer', priority = 50 },
}),
})
end,
},
'saadparwaiz1/cmp_luasnip',
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-path',
'hrsh7th/cmp-buffer',
'onsails/lspkind.nvim',
'hrsh7th/cmp-cmdline',
'dmitmel/cmp-cmdline-history',
'teramako/cmp-cmdline-prompt.nvim',
'mtoohey31/cmp-fish',
'vim-dadbod-completion',
{
'chrisgrieser/cmp_yanky',
option = {
onlyCurrentFiletype = false,
},
},
'SergioRibera/cmp-dotenv',
'hrsh7th/cmp-calc',
'davidsierradz/cmp-conventionalcommits',
}
--- Gx plugin dependencies
M.gx = {
'nvim-lua/plenary.nvim',
}
--- Hardtime plugin dependencies
M.hardtime = {
'MunifTanjim/nui.nvim',
'nvim-lua/plenary.nvim',
}
--- LazyDev plugin dependencies
M.lazydev = {
'gonstoll/wezterm-types',
}
--- LazyGit plugin dependencies
M.lazygit = {
'nvim-lua/plenary.nvim',
}
--- Lualine plugin dependencies
M.lualine = {
{ 'bezhermoso/todos-lualine.nvim' },
{ 'folke/todo-comments.nvim' },
}
--- Minuet plugin dependencies
M.minuet = {
{ 'nvim-lua/plenary.nvim' },
}
--- MusicControls plugin dependencies
M.musiccontrols = {
'rcarriga/nvim-notify',
}
--- Table for plugins that need Telescope as a dependency
M.needs_telescope = {
'nvim-telescope/telescope.nvim',
}
--- Table for plugins that need Treesitter as a dependency
M.needs_treesitter = {
'nvim-treesitter/nvim-treesitter',
}
--- Neotest plugin adapters and dependencies
M.neotest = {
adapters = {
'neotest-plenary',
'neotest-python',
'neotest-vim-test',
'neotest-minitest',
'neotest-bash',
},
deps = {
'nvim-neotest/nvim-nio',
'nvim-lua/plenary.nvim',
'zidhuss/neotest-minitest',
'rcasia/neotest-bash',
'antoinemadec/FixCursorHold.nvim',
'nvim-treesitter/nvim-treesitter',
},
}
--- Recorder plugin dependencies
M.recorder = {
'rcarriga/nvim-notify',
}
--- nvim-remote plugin dependencies
M.remotenvim = {
'nvim-lua/plenary.nvim', -- For standard functions
'MunifTanjim/nui.nvim', -- To build the plugin UI
'nvim-telescope/telescope.nvim', -- For picking b/w different remote methods
}
--- Zenbones plugin dependencies
M.zenbones = {
'rktjmp/lush.nvim',
}
return M
-47
View File
@@ -1,47 +0,0 @@
---@module "data.events"
--- This module defines the event tables for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Events │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
--- DEFAULT ---
M.default = 'VeryLazy'
--- Alpha events
M.alpha = { 'VimEnter' }
--- Auto Save events
M.autosave = { 'InsertLeave', 'TextChanged' }
--- Colorful Window Separators events
M.colorfulwinsep = { 'WinLeave' }
--- Dashboard-Nvim events
M.dashboard = { 'UIEnter' }
--- Dead Column
M.deadcolumn = { 'BufEnter' }
--- Heirline events
M.heirline = { 'UIEnter' }
--- Highlight Colors events
M.highlightcolor = { 'BufReadPre' }
--- Mini.Align events
M.minialign = { 'InsertEnter' }
--- Mini.SplitJoin events
M.minisplitjoin = { 'InsertEnter' }
--- Discord Presence events
M.presence = { 'LazyFile' }
--- RipGrep Substitute events
M.ripsub = { 'InsertEnter' }
--- SmoothCursor events
M.smoothcursor = { 'BufEnter' }
return M
-12
View File
@@ -1,12 +0,0 @@
---@module "data.ft"
--- This module defines the filetype tables for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Filetypes │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
M.academic = { 'markdown', 'tex' }
M.helpview = 'help'
return M
-2654
View File
File diff suppressed because it is too large Load Diff
-53
View File
@@ -1,53 +0,0 @@
---@module "data"
--- This module aggregates various data tables used throughout the configuration.
local data = {}
-- Explicitly specify for LSP support
data.keys = require('data.keys')
data.types = require('data.types')
data.func = require('data.func')
data.cmd = require('data.cmd')
data.deps = require('data.deps')
data.dash = require('data.dash')
data.ft = require('data.ft')
data.events = require('data.events')
data.autocmd = require('data.autocmd')
data.cond = require('data.cond')
data.vim = require('data.vim')
-- Generic function to iterate over files in a specified directory and load Lua modules
function data.load_modules_from_dir(directory, module_prefix)
-- Open the specified directory
local files = vim.fn.readdir(directory)
for _, file in ipairs(files) do
-- Skip init.lua
if file ~= 'init.lua' and file:match('.*%.lua$') then
-- Get the module name without the .lua extension
local module_name = file:sub(1, -5)
-- Construct the module path
local module_path = module_prefix .. '.' .. module_name
-- Load the module if not already explicitly set
if not _G[module_name] then
_G[module_name] = require(module_path)
end
end
end
end
-- Example usage
local function read_data_dir()
-- Getting the root path for the current module directory
local dir_path = vim.fn.fnamemodify(debug.getinfo(1, 'S').source:sub(2), ':h')
-- Load modules from the data directory
data.load_modules_from_dir(dir_path, 'data')
end
-- Read the directory and load any additional modules
read_data_dir()
---@alias DataModule table<string, any>
---@type DataModule
return data
-1740
View File
File diff suppressed because it is too large Load Diff
-2325
View File
File diff suppressed because it is too large Load Diff
-14
View File
@@ -1,14 +0,0 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ VimScript │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
M.setup = function()
-- Setup vimscript options
vim.cmd([[
" Vimscript options here
]])
end
return M
+373
View File
@@ -0,0 +1,373 @@
--[[
Keymaps
--]]
---- Copyright (C) 2026 Rootiest
-- SPDX-License-Identifier: GPL-3.0-or-later
-- System Clipboard Integration
-- This makes 'y' and 'p' (and all other yank/paste operations)
-- use the system clipboard by default.
vim.opt.clipboard = "unnamedplus"
----------------------------------------------------------
-- Redirect 'delete' and 'change' operations to the 'd' register
-- This keeps your system clipboard (unnamedplus) clean
local delete_keys = { "d", "D", "c", "C", "x", "X" }
for _, key in ipairs(delete_keys) do
vim.keymap.set({ "n", "v" }, key, '"d' .. key, { noremap = true, silent = true })
end
-- If you ever need to paste what you just deleted:
-- Type "dp (instead of just p)
----------------------------------------------------------
-- Quit and Save All with :Q
-- Replaces safety-checked :xa with a forced write-all-and-quit.
vim.api.nvim_create_user_command("Q", "xa!", { desc = "Write all and quit (forced)" })
----------------------------------------------------------
-- Search and Replace (Grug-far)
vim.keymap.set("n", "<leader>sr", function()
require("grug-far").open({
prefills = {
search = vim.fn.expand("<cword>"),
},
})
end, { desc = "Search and Replace" })
-- Snacks Keymaps
-- Top Pickers & Explorer
vim.keymap.set("n", "<leader><space>", function()
Snacks.picker.smart()
end, { desc = "Smart Find Files" })
vim.keymap.set("n", "<leader>,", function()
Snacks.picker.buffers()
end, { desc = "Buffers" })
vim.keymap.set("n", "<leader>/", function()
Snacks.picker.grep()
end, { desc = "Grep" })
vim.keymap.set("n", "<leader>:", function()
Snacks.picker.command_history()
end, { desc = "Command History" })
vim.keymap.set("n", "<leader>n", function()
Snacks.picker.notifications()
end, { desc = "Notification History" })
vim.keymap.set("n", "<leader>e", function()
Snacks.explorer()
end, { desc = "File Explorer" })
-- Find
vim.keymap.set("n", "<leader>fb", function()
Snacks.picker.buffers()
end, { desc = "Buffers" })
vim.keymap.set("n", "<leader>fc", function()
Snacks.picker.files({ cwd = vim.fn.stdpath("config") })
end, { desc = "Find Config File" })
vim.keymap.set("n", "<leader>ff", function()
Snacks.picker.files()
end, { desc = "Find Files" })
vim.keymap.set("n", "<leader>fg", function()
Snacks.picker.git_files()
end, { desc = "Find Git Files" })
vim.keymap.set("n", "<leader>fp", function()
Snacks.picker.projects()
end, { desc = "Projects" })
vim.keymap.set("n", "<leader>fr", function()
Snacks.picker.recent()
end, { desc = "Recent" })
-- Git
vim.keymap.set("n", "<leader>gb", function()
Snacks.picker.git_branches()
end, { desc = "Git Branches" })
vim.keymap.set("n", "<leader>gl", function()
Snacks.picker.git_log()
end, { desc = "Git Log" })
vim.keymap.set("n", "<leader>gL", function()
Snacks.picker.git_log_line()
end, { desc = "Git Log Line" })
vim.keymap.set("n", "<leader>gs", function()
Snacks.picker.git_status()
end, { desc = "Git Status" })
vim.keymap.set("n", "<leader>gS", function()
Snacks.picker.git_stash()
end, { desc = "Git Stash" })
vim.keymap.set("n", "<leader>gd", function()
Snacks.picker.git_diff()
end, { desc = "Git Diff (Hunks)" })
vim.keymap.set("n", "<leader>gf", function()
Snacks.picker.git_log_file()
end, { desc = "Git Log File" })
-- GH
vim.keymap.set("n", "<leader>gi", function()
Snacks.picker.gh_issue()
end, { desc = "GitHub Issues (open)" })
vim.keymap.set("n", "<leader>gI", function()
Snacks.picker.gh_issue({ state = "all" })
end, { desc = "GitHub Issues (all)" })
vim.keymap.set("n", "<leader>gp", function()
Snacks.picker.gh_pr()
end, { desc = "GitHub Pull Requests (open)" })
vim.keymap.set("n", "<leader>gP", function()
Snacks.picker.gh_pr({ state = "all" })
end, { desc = "GitHub Pull Requests (all)" })
-- Tea (Gitea/Forgejo)
vim.keymap.set("n", "<leader>gt", function()
Snacks.tea.pr()
end, { desc = "Tea Pull Requests (open)" })
vim.keymap.set("n", "<leader>gT", function()
Snacks.tea.pr({ state = "all" })
end, { desc = "Tea Pull Requests (all)" })
vim.keymap.set("n", "<leader>gc", function()
Snacks.tea.pr_create({})
end, { desc = "Tea Create Pull Request" })
-- Grep
vim.keymap.set("n", "<leader>sb", function()
Snacks.picker.lines()
end, { desc = "Buffer Lines" })
vim.keymap.set("n", "<leader>sB", function()
Snacks.picker.grep_buffers()
end, { desc = "Grep Open Buffers" })
vim.keymap.set("n", "<leader>sg", function()
Snacks.picker.grep()
end, { desc = "Grep" })
vim.keymap.set({ "n", "x" }, "<leader>sw", function()
Snacks.picker.grep_word()
end, { desc = "Visual selection or word" })
-- Search
vim.keymap.set("n", '<leader>s"', function()
Snacks.picker.registers()
end, { desc = "Registers" })
vim.keymap.set("n", "<leader>s/", function()
Snacks.picker.search_history()
end, { desc = "Search History" })
vim.keymap.set("n", "<leader>sa", function()
Snacks.picker.autocmds()
end, { desc = "Autocmds" })
vim.keymap.set("n", "<leader>sc", function()
Snacks.picker.command_history()
end, { desc = "Command History" })
vim.keymap.set("n", "<leader>sC", function()
Snacks.picker.commands()
end, { desc = "Commands" })
vim.keymap.set("n", "<leader>sd", function()
Snacks.picker.diagnostics()
end, { desc = "Diagnostics" })
vim.keymap.set("n", "<leader>sD", function()
Snacks.picker.diagnostics_buffer()
end, { desc = "Buffer Diagnostics" })
vim.keymap.set("n", "<leader>sh", function()
Snacks.picker.help()
end, { desc = "Help Pages" })
vim.keymap.set("n", "<leader>sH", function()
Snacks.picker.highlights()
end, { desc = "Highlights" })
vim.keymap.set("n", "<leader>si", function()
Snacks.picker.icons()
end, { desc = "Icons" })
vim.keymap.set("n", "<leader>sj", function()
Snacks.picker.jumps()
end, { desc = "Jumps" })
vim.keymap.set("n", "<leader>sk", function()
Snacks.picker.keymaps()
end, { desc = "Keymaps" })
vim.keymap.set("n", "<leader>sl", function()
Snacks.picker.loclist()
end, { desc = "Location List" })
vim.keymap.set("n", "<leader>sm", function()
Snacks.picker.marks()
end, { desc = "Marks" })
vim.keymap.set("n", "<leader>sM", function()
Snacks.picker.man()
end, { desc = "Man Pages" })
vim.keymap.set("n", "<leader>sp", function()
Snacks.picker.lazy()
end, { desc = "Search for Plugin Spec" })
vim.keymap.set("n", "<leader>sq", function()
Snacks.picker.qflist()
end, { desc = "Quickfix List" })
vim.keymap.set("n", "<leader>sR", function()
Snacks.picker.resume()
end, { desc = "Resume" })
vim.keymap.set("n", "<leader>su", function()
Snacks.picker.undo()
end, { desc = "Undo History" })
vim.keymap.set("n", "<leader>uC", function()
Snacks.picker.colorschemes()
end, { desc = "Colorschemes" })
-- LSP
vim.keymap.set("n", "gd", function()
Snacks.picker.lsp_definitions()
end, { desc = "Goto Definition" })
vim.keymap.set("n", "gD", function()
Snacks.picker.lsp_declarations()
end, { desc = "Goto Declaration" })
vim.keymap.set("n", "gr", function()
Snacks.picker.lsp_references()
end, { nowait = true, desc = "References" })
vim.keymap.set("n", "gI", function()
Snacks.picker.lsp_implementations()
end, { desc = "Goto Implementation" })
vim.keymap.set("n", "gy", function()
Snacks.picker.lsp_type_definitions()
end, { desc = "Goto T[y]pe Definition" })
vim.keymap.set("n", "gai", function()
Snacks.picker.lsp_incoming_calls()
end, { desc = "C[a]lls Incoming" })
vim.keymap.set("n", "gao", function()
Snacks.picker.lsp_outgoing_calls()
end, { desc = "C[a]lls Outgoing" })
vim.keymap.set("n", "<leader>ss", function()
Snacks.picker.lsp_symbols()
end, { desc = "LSP Symbols" })
vim.keymap.set("n", "<leader>sS", function()
Snacks.picker.lsp_workspace_symbols()
end, { desc = "LSP Workspace Symbols" })
-- Standard LSP
vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Hover Documentation" })
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, { desc = "Code Action" })
vim.keymap.set("n", "<leader>cr", function()
return ":" .. require("inc_rename").config.cmd_name .. " " .. vim.fn.expand("<cword>")
end, { expr = true, desc = "Rename Symbol" })
-- Other
vim.keymap.set("n", "<leader>sq", "<cmd>nohlsearch<cr>", { desc = "Clear Search Highlights" })
vim.keymap.set("n", "<leader>z", function()
Snacks.zen()
end, { desc = "Toggle Zen Mode" })
vim.keymap.set("n", "<leader>Z", function()
Snacks.zen.zoom()
end, { desc = "Toggle Zoom" })
vim.keymap.set("n", "<leader>.", function()
Snacks.scratch()
end, { desc = "Toggle Scratch Buffer" })
vim.keymap.set("n", "<leader>S", function()
Snacks.scratch.select()
end, { desc = "Select Scratch Buffer" })
vim.keymap.set("n", "<leader>n", function()
Snacks.notifier.show_history()
end, { desc = "Notification History" })
vim.keymap.set("n", "<leader>bd", function()
Snacks.bufdelete()
end, { desc = "Delete Buffer" })
vim.keymap.set("n", "<leader>cR", function()
Snacks.rename.rename_file()
end, { desc = "Rename File" })
vim.keymap.set({ "n", "v" }, "<leader>gB", function()
Snacks.gitbrowse()
end, { desc = "Git Browse" })
vim.keymap.set("n", "<leader>gg", function()
Snacks.lazygit()
end, { desc = "Lazygit" })
vim.keymap.set("n", "<leader>un", function()
Snacks.notifier.hide()
end, { desc = "Dismiss All Notifications" })
vim.keymap.set({ "n", "t" }, "<c-/>", function()
Snacks.terminal()
end, { desc = "Toggle Terminal" })
vim.keymap.set({ "n", "t" }, "<c-_>", function()
Snacks.terminal()
end, { desc = "which_key_ignore" })
vim.keymap.set({ "n", "t" }, "]]", function()
Snacks.words.jump(vim.v.count1)
end, { desc = "Next Reference" })
vim.keymap.set({ "n", "t" }, "[[", function()
Snacks.words.jump(-vim.v.count1)
end, { desc = "Prev Reference" })
vim.keymap.set("n", "<leader>N", function()
Snacks.win({
file = vim.api.nvim_get_runtime_file("doc/news.txt", false)[1],
width = 0.6,
height = 0.6,
wo = {
spell = false,
wrap = false,
signcolumn = "yes",
statuscolumn = " ",
conceallevel = 3,
},
})
end, { desc = "Neovim News" })
----------------------------------------------------------
-- Sidekick NES: accept next-edit suggestion in normal mode
vim.keymap.set("n", "<Tab>", function()
require("sidekick").nes_jump_or_apply()
end, { desc = "Apply Sidekick NES Suggestion" })
----------------------------------------------------------
-- Leap Keymaps
vim.keymap.set({ "n", "x", "o" }, "<CR>", "<Plug>(leap)")
vim.keymap.set("n", "S", "<Plug>(leap-from-window)")
----------------------------------------------------------
-- Conform Keymaps
vim.keymap.set({ "n", "v" }, "<leader>cf", function()
require("conform").format({ lsp_format = "fallback" })
end, { desc = "Format Buffer" })
----------------------------------------------------------
-- Undotree Keymaps
vim.keymap.set("n", "<leader>uu", "<cmd>UndotreeToggle<cr>", { desc = "Toggle Undotree" })
----------------------------------------------------------
-- Comment Box Keymaps
vim.keymap.set({ "n", "v" }, "<leader>cbb", "<cmd>CBccbox<cr>", { desc = "Centered Box" })
vim.keymap.set({ "n", "v" }, "<leader>cbl", "<cmd>CBcline<cr>", { desc = "Centered Line" })
vim.keymap.set({ "n", "v" }, "<leader>cbd", "<cmd>CBd<cr>", { desc = "Delete Box/Line" })
vim.keymap.set("n", "<leader>cbk", "<cmd>CBcatalog<cr>", { desc = "Box Style Catalog" })
----------------------------------------------------------
-- Persistence Keymaps
vim.keymap.set("n", "<leader>qs", function()
require("persistence").load()
end, { desc = "Restore Session" })
vim.keymap.set("n", "<leader>qS", function()
require("persistence").select()
end, { desc = "Select Session" })
vim.keymap.set("n", "<leader>ql", function()
require("persistence").load({ last = true })
end, { desc = "Restore Last Session" })
vim.keymap.set("n", "<leader>qd", function()
require("persistence").stop()
end, { desc = "Don't Save Current Session" })
----------------------------------------------------------
-- Haunt Keymaps
vim.keymap.set("n", "<leader>ha", function()
require("haunt.api").annotate()
end, { desc = "Annotate" })
vim.keymap.set("n", "<leader>ht", function()
require("haunt.api").toggle_annotation()
end, { desc = "Toggle Annotation" })
vim.keymap.set("n", "<leader>hd", function()
require("haunt.api").delete()
end, { desc = "Delete Bookmark" })
vim.keymap.set("n", "<leader>hn", function()
require("haunt.api").next()
end, { desc = "Next Bookmark" })
vim.keymap.set("n", "<leader>hp", function()
require("haunt.api").prev()
end, { desc = "Previous Bookmark" })
vim.keymap.set("n", "<leader>hl", function()
require("haunt.picker").show()
end, { desc = "Show Bookmark Picker" })
+97
View File
@@ -0,0 +1,97 @@
--[[
Lazyload
--]]
-- Original work Copyright (c) 2021 Fredrik Averpil
-- This file is licensed under the MIT License.
-- See: https://github.com/fredrikaverpil/dotfiles/blob/main/LICENSE
-- Lazyload queues for phased plugin loading.
--
-- on_vim_enter(fn): async fire-and-forget via vim.schedule() (default)
-- on_vim_enter(fn, { sync = true }): synchronous, must complete before next phase
-- on_override(fn): runs after all on_vim_enter callbacks (for .nvim.lua overrides)
local M = {}
local vim_enter_queue = {}
local override_queue = {}
---@param queue { fn: fun(), sync: boolean }[]
local function drain(queue)
for _, entry in ipairs(queue) do
if not entry.sync then
vim.schedule(entry.fn)
end
end
for _, entry in ipairs(queue) do
if entry.sync then
entry.fn()
end
end
end
local function drain_override()
if not override_queue then
return
end
for _, entry in ipairs(override_queue) do
vim.schedule(function()
local ok, err = pcall(entry.fn)
if not ok then
vim.notify((".nvim.lua override error:\n%s"):format(err), vim.log.levels.ERROR)
end
end)
end
override_queue = nil
end
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
drain(vim_enter_queue)
vim_enter_queue = nil
drain_override()
end,
})
--- Run at VimEnter. Async by default. Pass { sync = true } to run synchronously.
---@param fn fun()
---@param opts? { sync?: boolean }
function M.on_vim_enter(fn, opts)
local sync = opts and opts.sync or false
if vim_enter_queue then
table.insert(vim_enter_queue, { fn = fn, sync = sync })
elseif sync then
fn()
else
vim.schedule(fn)
end
end
--- Run after all on_vim_enter callbacks (including async ones) have executed.
--- Intended for project-local overrides from .nvim.lua that need to patch
--- plugin state after setup() has run. Exrc runs at step 7c — before plugin/
--- files — so it cannot override plugin setup directly; this queue bridges
--- that gap by registering a callback that runs after the VimEnter drain.
---@param fn fun()
function M.on_override(fn)
if override_queue then
table.insert(override_queue, { fn = fn })
else
vim.schedule(fn)
end
end
-- Call function only once.
function M.call_once(fn)
local id = tostring(fn)
if fn and not Config.called[id] then
fn()
Config.called[id] = true
end
end
return M
-137
View File
@@ -1,137 +0,0 @@
return {
{ -- Codeium
import = 'lazyvim.plugins.extras.ai.codeium',
cond = require('data.cond').codeium,
event = 'VeryLazy',
lazy = true,
opts = function()
require('codeium.virtual_text').set_statusbar_refresh(function()
require('lualine').refresh()
end)
end,
},
{ -- Copilot
import = 'lazyvim.plugins.extras.ai.copilot',
cond = require('data.cond').copilot,
},
{ -- Copilot Chat
import = 'lazyvim.plugins.extras.ai.copilot-chat',
cond = require('data.cond').copilot,
},
{ -- Tabnine
import = 'lazyvim.plugins.extras.ai.tabnine',
cond = require('data.cond').tabnine,
},
{ -- luasnip
import = 'lazyvim.plugins.extras.coding.luasnip',
},
{ -- Yanky
import = 'lazyvim.plugins.extras.coding.yanky',
},
{ -- Neogen
import = 'lazyvim.plugins.extras.coding.neogen',
},
{ -- DAP Core
import = 'lazyvim.plugins.extras.dap.core',
},
{ -- DAP Neovim Lua Adapter
import = 'lazyvim.plugins.extras.dap.nlua',
},
{ -- NeoTest
import = 'lazyvim.plugins.extras.test.core',
},
{ import = 'lazyvim.plugins.extras.ui.smear-cursor' },
{ -- Dial
import = 'lazyvim.plugins.extras.editor.dial',
},
{ -- Snacks Picker
import = 'lazyvim.plugins.extras.editor.snacks_picker',
},
{ -- IncRename
import = 'lazyvim.plugins.extras.editor.inc-rename',
},
{ -- Treesitter-context
import = 'lazyvim.plugins.extras.ui.treesitter-context',
},
{ -- Navic
import = 'lazyvim.plugins.extras.editor.navic',
},
{ -- Refactoring
import = 'lazyvim.plugins.extras.editor.refactoring',
},
{ -- Octo plugin
import = 'lazyvim.plugins.extras.util.octo',
},
{ -- JSON
import = 'lazyvim.plugins.extras.lang.json',
},
{ -- Markdown
import = 'lazyvim.plugins.extras.lang.markdown',
},
{ -- Toml
import = 'lazyvim.plugins.extras.lang.toml',
},
{ -- Git
import = 'lazyvim.plugins.extras.lang.git',
},
{ -- Python
import = 'lazyvim.plugins.extras.lang.python',
},
{ -- Yaml
import = 'lazyvim.plugins.extras.lang.yaml',
},
{ -- clangd
import = 'lazyvim.plugins.extras.lang.clangd',
},
{ -- cmake
import = 'lazyvim.plugins.extras.lang.cmake',
},
{ -- Docker
import = 'lazyvim.plugins.extras.lang.docker',
},
{ -- Java
import = 'lazyvim.plugins.extras.lang.java',
},
{ -- Sql
import = 'lazyvim.plugins.extras.lang.sql',
},
{ -- Rust
import = 'lazyvim.plugins.extras.lang.rust',
},
-- { -- Mini.Indentscope
-- import = 'lazyvim.plugins.extras.ui.mini-indentscope',
-- },
{ -- mini.files
import = 'lazyvim.plugins.extras.editor.mini-files',
},
{ -- snacks.picker
import = 'lazyvim.plugins.extras.editor.snacks_picker',
},
{ -- snacks.explorer
import = 'lazyvim.plugins.extras.editor.snacks_explorer',
},
{ -- Fzf-Lua
import = 'lazyvim.plugins.extras.editor.fzf',
cond = function()
return require('data.func').check_global_var('use_fzf_lua', true, false)
end,
},
{ -- Chezmoi
import = 'lazyvim.plugins.extras.util.chezmoi',
},
{ -- Dotfiles plugins
import = 'lazyvim.plugins.extras.util.dot',
},
{ -- Blink completion
import = 'lazyvim.plugins.extras.coding.blink',
cond = function()
return vim.g.useblinkcmp
end,
},
{ -- Nvim-cmp
import = 'lazyvim.plugins.extras.coding.nvim-cmp',
cond = function()
return not vim.g.useblinkcmp
end,
},
}
+203
View File
@@ -0,0 +1,203 @@
--[[
Options
--]]
---- Copyright (C) 2026 Rootiest
-- SPDX-License-Identifier: GPL-3.0-or-later
-- ╭─────────────────────────────────────────────────────────╮
-- │ Basic Options │
-- ╰─────────────────────────────────────────────────────────╯
-- Set leader keys before any other configuration
vim.g.mapleader = " "
vim.g.maplocalleader = "\\"
-- Indentation
vim.opt.tabstop = 2 -- Tab width in spaces
vim.opt.shiftwidth = 2 -- Indent width for >> and auto-indent
vim.opt.expandtab = true -- Use spaces instead of tabs
-- Performance and UI defaults
vim.opt.updatetime = 200 -- Faster completion and CursorHold events
vim.opt.autowrite = true -- Enable auto write
vim.opt.number = true -- Show line numbers
vim.opt.relativenumber = true -- Relative line numbers
-- ╭─────────────────────────────────────────────────────────╮
-- │ Sessions and Saving │
-- ╰─────────────────────────────────────────────────────────╯
-- Persistent undo across sessions
vim.opt.undofile = true
-- Autowrite/Autosave
-- This ensures changes are saved on every buffer change or when leaving insert mode.
vim.api.nvim_create_autocmd({ "InsertLeave", "TextChanged" }, {
group = vim.api.nvim_create_augroup("autosave", { clear = true }),
pattern = { "*" },
callback = function()
local buftype = vim.api.nvim_get_option_value("buftype", { buf = 0 })
if buftype == "" and vim.bo.modified then
vim.cmd("silent! update")
end
end,
})
-- Automatically reload files changed outside of Neovim
vim.opt.autoread = true
-- Auto-reload Triggers
-- Reload when focus is gained or when the cursor is idle
vim.api.nvim_create_autocmd({ "FocusGained", "CursorHold" }, {
group = vim.api.nvim_create_augroup("autoread_on_focus", { clear = true }),
pattern = "*",
callback = function()
-- Only if the buffer is not modified, to avoid losing unsaved changes
if vim.bo.modified == false then
vim.cmd("checktime")
end
end,
})
-- Format Function
-- Formats the entire buffer by default,
-- but if a range is provided (e.g., via visual selection),
-- it formats only that range.
vim.api.nvim_create_user_command("Format", function(args)
local range = nil
if args.count ~= -1 then
local end_line = vim.api.nvim_buf_get_lines(0, args.line2 - 1, args.line2, true)[1]
range = {
start = { args.line1, 0 },
["end"] = { args.line2, end_line:len() },
}
end
require("conform").format({ async = true, lsp_format = "fallback", range = range })
end, { range = true })
-- FormatOnSave
-- Formats the buffer before saving.
-- This is a common practice to ensure code is consistently formatted.
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = "*",
callback = function()
-- Call Format function
vim.api.nvim_command("Format")
end,
})
-- Return to last-known cursor position when reopening files
vim.api.nvim_create_autocmd("BufReadPost", {
desc = "Jump to last known cursor position on open",
pattern = "*",
callback = function()
local last_pos = vim.fn.line("'\"")
if last_pos > 1 and last_pos <= vim.fn.line("$") then
vim.cmd('normal! g`\"')
end
end,
})
-- ╭─────────────────────────────────────────────────────────╮
-- │ Root Management │
-- ╰─────────────────────────────────────────────────────────╯
-- Automatically change the working directory to the project root.
-- This ensures that plugins like Snacks.picker and GrugFar work
-- relative to the file or project you are currently editing.
vim.api.nvim_create_autocmd("BufEnter", {
group = vim.api.nvim_create_augroup("buffer_auto_cd", { clear = true }),
callback = function()
local path = vim.api.nvim_buf_get_name(0)
if path == "" then
return
end
-- Skip special buffers, but allow directory buffers (for explorer support)
if vim.bo.buftype ~= "" and vim.bo.filetype ~= "snacks_explorer_tree" then
return
end
-- Get the directory (handle both files and directory paths)
local dir = vim.fn.isdirectory(path) == 1 and path or vim.fn.fnamemodify(path, ":p:h")
-- Find the project root using common markers, fallback to the directory itself
local root = vim.fs.root(dir, { ".git", "lua", "package.json", "go.mod", "Cargo.toml", "Makefile" }) or dir
-- Change directory if it's different and valid
if root and vim.fn.isdirectory(root) == 1 and root ~= vim.fn.getcwd() then
vim.fn.chdir(root)
end
end,
})
-- Grug-far QoL: Close with 'q'
vim.api.nvim_create_autocmd("FileType", {
group = vim.api.nvim_create_augroup("grug_far_q_to_close", { clear = true }),
pattern = "grug-far",
callback = function(args)
vim.keymap.set("n", "q", "<cmd>close<cr>", { buffer = args.buf, silent = true, desc = "Close Grug-far" })
end,
})
-- ╭─────────────────────────────────────────────────────────╮
-- │ Shell Interaction │
-- ╰─────────────────────────────────────────────────────────╯
-- Detect terminal environment
local is_kitty = os.getenv("KITTY_PID") ~= nil
local current_shell = os.getenv("SHELL") or "/bin/sh"
local shell_name = current_shell:match("([^/]+)$") or "sh"
-- Terminal Title Management
local title_group = vim.api.nvim_create_augroup("TerminalTitle", { clear = true })
-- Helper function to update the terminal title
local function set_terminal_title(title)
-- If in Kitty, we use the direct escape sequence as it's reliable
if is_kitty then
io.stdout:write("\27]2;" .. title .. "\7")
-- Fallback: Use Neovim's built-in title management for other terminals
-- (Standard OSC 2 sequences are supported by most, but opt.title is safer)
elseif os.getenv("TERM") ~= "linux" then
vim.opt.title = true
vim.opt.titlestring = title
end
end
-- Terminal title updates on buffer enter and window enter
vim.api.nvim_create_autocmd({ "BufEnter", "BufWinEnter" }, {
group = title_group,
callback = function()
local buftype = vim.bo.buftype
local filetype = vim.bo.filetype
local filename = vim.fn.expand("%:t")
-- 1. Specifically catch Snacks Terminal or standard Terminals
if filetype == "snacks_terminal" or buftype == "terminal" then
set_terminal_title("NVIM: Terminal")
-- 2. Handle normal files (buftype is empty)
elseif buftype == "" and filename ~= "" then
set_terminal_title("NVIM: " .. filename)
-- 3. Handle the empty start screen
elseif filename == "" and buftype == "" then
set_terminal_title("Neovim")
end
end,
})
-- Reset the title back to the shell name when you quit Neovim
vim.api.nvim_create_autocmd("VimLeave", {
group = title_group,
callback = function()
-- On leave, direct stdout is more reliable than setting an option
if is_kitty or os.getenv("TERM") ~= "linux" then
io.stdout:write("\27]2;" .. shell_name .. "\7")
end
end,
})
+612
View File
@@ -0,0 +1,612 @@
--[[
Plugins
--]]
---- Copyright (C) 2026 Rootiest
-- SPDX-License-Identifier: GPL-3.0-or-later
-- Catppuccin.nvim
-- Eagerly load the colorscheme plugin.
vim.pack.add({ { src = "https://github.com/catppuccin/nvim", name = "catppuccin" } })
-- Catppuccin Config
Config.plugins.catppuccin = {
flavour = "mocha",
}
vim.cmd.colorscheme("catppuccin")
-- Snacks.nvim
-- Eagerly load snacks for dashboard and performance features.
vim.pack.add({ { src = "https://github.com/folke/snacks.nvim", name = "snacks" } })
-- Snacks-tea.nvim
-- Gitea/Forgejo extension for Snacks (adds Snacks.tea, the PR picker/buffer
-- UI). Wraps the `tea` CLI, must be on the runtimepath before snacks.setup().
vim.pack.add({ { src = "https://github.com/sbulav/snacks-tea.nvim", name = "snacks-tea" } })
-- Snacks Config
-- Store opts in the registry first.
Config.plugins.snacks = {
bigfile = { enabled = true },
dashboard = {
enabled = true,
sections = {
{ section = "header" },
{ section = "keys", gap = 1, padding = 1 },
},
preset = {
header = require("const").header,
},
},
explorer = { enabled = true },
indent = { enabled = true },
input = { enabled = true },
picker = {
enabled = true,
matcher = {
fuzzy = true,
smartcase = true,
ignorecase = true,
sort_empty = false,
filename_bonus = true,
file_pos = true,
cwd_bonus = true,
frecency = true,
history_bonus = true,
},
win = {
input = {
keys = {
["<a-s>"] = { "flash", mode = { "n", "i" } },
["s"] = { "flash" },
["<a-a>"] = { "sidekick_send", mode = { "n", "i" } },
},
},
},
actions = {
flash = function(picker)
require("flash").jump({
pattern = "^",
label = { after = { 0, 0 } },
search = {
mode = "search",
exclude = {
function(win)
return vim.bo[vim.api.nvim_win_get_buf(win)].filetype ~= "snacks_picker_list"
end,
},
},
action = function(match)
local idx = picker.list:row2idx(match.pos[1])
picker.list:_move(idx, true, true)
end,
})
end,
sidekick_send = function(...)
return require("sidekick.cli.picker.snacks").send(...)
end,
},
},
notifier = { enabled = true },
quickfile = { enabled = true },
scope = { enabled = true },
scratch = { enabled = true },
scroll = { enabled = true },
statuscolumn = { enabled = true },
tea = {
enabled = true,
tea = {
cmd = "tea", -- Path to tea binary
login = nil, -- Specific login to use (nil = auto-detect)
remote = "origin", -- Git remote to use
},
},
terminal = {
enabled = true,
win = {
keys = {
toggle = {
"<c-/>",
function(self)
self:hide()
end,
mode = "t",
desc = "Toggle Terminal",
},
},
},
},
words = { enabled = true },
zen = { enabled = true },
}
-- Setup Snacks with the registered opts.
require("snacks").setup(Config.plugins.snacks)
-- Persistence.nvim
-- Simple session management.
vim.pack.add({ { src = "https://github.com/folke/persistence.nvim", name = "persistence" } })
-- Persistence Config
Config.plugins.persistence = {
dir = vim.fn.stdpath("state") .. "/sessions/",
need = 1,
branch = true,
}
require("persistence").setup(Config.plugins.persistence)
-- Lazy-loaded Plugins
local lazyload = require("lazyload")
lazyload.on_vim_enter(function()
-- Gitsigns.nvim
vim.pack.add({ { src = "https://github.com/lewis6991/gitsigns.nvim", name = "gitsigns" } })
require("gitsigns").setup({
numhl = false,
signcolumn = true,
current_line_blame = true, -- Required for the statusline variable to update
current_line_blame_opts = {
virt_text = false, -- Disable virtual text as we'll use the statusline
},
})
-- Treesitter Context
vim.pack.add({
{ src = "https://github.com/nvim-treesitter/nvim-treesitter-context", name = "nvim-treesitter-context" },
})
require("treesitter-context").setup({
max_lines = 3,
trim_scope = "outer",
})
-- Grug-far.nvim
vim.pack.add({ { src = "https://github.com/MagicDuck/grug-far.nvim", name = "grug-far" } })
require("grug-far").setup()
-- Flash.nvim
vim.pack.add({ { src = "https://github.com/folke/flash.nvim", name = "flash" } })
require("flash").setup({
modes = { char = { keys = {} } },
keys = {},
})
-- Leap.nvim
vim.pack.add({ { src = "https://git.disroot.org/andyg/leap.nvim", name = "leap" } })
vim.api.nvim_set_hl(0, "LeapBackdrop", { link = "Comment" })
-- Focusline.nvim
vim.pack.add({
{ src = "https://github.com/ABDsheikho/focusline.nvim" },
})
require("focusline").setup({
-- focus_target can be a line number (e.g., 15), or a ratio (e.g., 0.25, 1 / 4, "25%").
focus_target = "30%", -- try it with 30%
-- which motion to associate focusline with.
with_motion = {
"zz",
"z,",
"\x04", -- Ctrl+D
"\x15", -- Ctrl+U
},
})
-- Mini.surround
vim.pack.add({ { src = "https://github.com/echasnovski/mini.surround", name = "mini.surround" } })
require("mini.surround").setup()
-- Mini.pairs
vim.pack.add({ { src = "https://github.com/echasnovski/mini.pairs", name = "mini.pairs" } })
require("mini.pairs").setup()
-- Smart backtick handling for Markdown: typing a 3rd backtick after an
-- existing `` `` `` pair expands into a fenced code block instead of
-- pairing into ```` ` ```` (4 backticks).
local function attach_markdown_smart_backtick(buf)
vim.keymap.set("i", "`", function()
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
local line = vim.api.nvim_get_current_line()
local before, after = line:sub(1, col), line:sub(col + 1)
local disabled = vim.g.minipairs_disable == true or vim.b.minipairs_disable == true
if not disabled and before:sub(-2) == "``" and after:sub(1, 1) ~= "`" then
local prefix = before:sub(1, -3)
local indent = prefix:match("^%s*")
vim.api.nvim_set_current_line(prefix .. "```")
vim.api.nvim_buf_set_lines(0, row, row, false, { indent .. "```" .. after })
vim.api.nvim_win_set_cursor(0, { row, #prefix + 3 })
return
end
local keys = MiniPairs.closeopen("``", "^[^\\]")
vim.api.nvim_feedkeys(keys, "in", false)
end, { buffer = buf, desc = "Smart Markdown backtick / code fence" })
-- Deleting the opening fence's last backtick also removes the untouched
-- closing fence line it created, so undoing a fence is a clean backspace.
vim.keymap.set("i", "<BS>", function()
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
local line = vim.api.nvim_get_current_line()
local before, after = line:sub(1, col), line:sub(col + 1)
local disabled = vim.g.minipairs_disable == true or vim.b.minipairs_disable == true
if not disabled and before:sub(-1) == "`" and before:sub(-2, -2) ~= "`" then
local prefix = before:sub(1, -2)
local indent = prefix:match("^%s*")
local next_line = vim.api.nvim_buf_get_lines(0, row, row + 1, false)[1]
if next_line == indent .. "```" then
vim.api.nvim_buf_set_lines(0, row, row + 1, false, {})
vim.api.nvim_set_current_line(prefix .. after)
vim.api.nvim_win_set_cursor(0, { row, #prefix })
return
end
end
local keys = MiniPairs.bs()
vim.api.nvim_feedkeys(keys, "in", false)
end, { buffer = buf, desc = "Smart Markdown fence backspace" })
end
vim.api.nvim_create_autocmd("FileType", {
group = vim.api.nvim_create_augroup("markdown_smart_backtick", { clear = true }),
pattern = "markdown",
desc = "Expand `` ` `` pair into a fenced code block on 3rd backtick",
callback = function(args)
attach_markdown_smart_backtick(args.buf)
end,
})
-- Catch buffers that already had their FileType event fire before this
-- deferred setup ran (e.g. `nvim file.md` opened directly at startup).
for _, buf in ipairs(vim.api.nvim_list_bufs()) do
if vim.bo[buf].filetype == "markdown" then
attach_markdown_smart_backtick(buf)
end
end
-- Gx.nvim
vim.pack.add({ { src = "https://github.com/chrishrb/gx.nvim", name = "gx" } })
---@diagnostic disable-next-line: missing-fields
require("gx").setup({
handlers = {
plugin = true,
github = true,
package_json = true,
search = true,
},
})
-- Comment-box.nvim
vim.pack.add({ { src = "https://github.com/LudoPinelli/comment-box.nvim", name = "comment-box" } })
require("comment-box").setup()
-- Undotree
vim.g.undotree_ShortIndicators = 0
vim.g.undotree_SplitWidth = 32
vim.g.undotree_SetFocusWhenToggle = 1
vim.g.undotree_TreeNodeShape = ""
vim.g.undotree_TreeVertShape = ""
vim.g.undotree_TreeSplitShape = ""
vim.g.undotree_TreeReturnShape = ""
vim.g.undotree_HelpLine = 0
vim.g.undotree_DiffAutoOpen = 0
vim.pack.add({ { src = "https://github.com/mbbill/undotree", name = "undotree" } })
-- Conform.nvim
vim.pack.add({ { src = "https://github.com/stevearc/conform.nvim", name = "conform" } })
Config.plugins.conform = {
formatters_by_ft = {
lua = { "stylua" },
c = { "clang-format" },
cpp = { "clang-format" },
rust = { "rustfmt" },
python = { "ruff_format" },
fish = { "fish_indent" },
sh = { "shfmt" },
bash = { "shfmt" },
},
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 { timeout_ms = 500, lsp_format = "fallback" }
end,
}
require("conform").setup(Config.plugins.conform)
-- Which-key.nvim
vim.pack.add({ { src = "https://github.com/folke/which-key.nvim", name = "which-key" } })
require("which-key").setup()
-- Lazydev.nvim (Neovim Lua type definitions for lua_ls)
vim.pack.add({ { src = "https://github.com/folke/lazydev.nvim", name = "lazydev" } })
require("lazydev").setup({
library = {
{ path = "${3rd}/luv/library", words = { "vim%.uv" } },
{ path = "snacks.nvim", words = { "Snacks" } },
},
})
-- LSP Support
vim.pack.add({ { src = "https://github.com/williamboman/mason.nvim", name = "mason" } })
vim.pack.add({ { src = "https://github.com/williamboman/mason-lspconfig.nvim", name = "mason-lspconfig" } })
vim.pack.add({ { src = "https://github.com/neovim/nvim-lspconfig", name = "nvim-lspconfig" } })
require("mason").setup()
-- Completion (Blink.cmp)
-- We check if the binary exists or if cargo is available to build it.
-- If neither, we skip loading to avoid errors.
local blink_path = vim.fn.stdpath("data") .. "/site/pack/core/opt/blink.cmp"
local has_blink_bin =
-- Check v2 location (most likely where it is now)
vim.fn.filereadable(blink_path .. "/lua/blink/cmp/lib/libblink_cmp_fuzzy.so") == 1
-- Check v1/Cargo location (fallback)
or vim.fn.filereadable(blink_path .. "/target/release/libblink_cmp_fuzzy.so") == 1
-- Check macOS/Windows extensions
or vim.fn.filereadable(blink_path .. "/target/release/libblink_cmp_fuzzy.dylib") == 1
or vim.fn.filereadable(blink_path .. "/target/release/libblink_cmp_fuzzy.dll") == 1
local has_cargo = vim.fn.executable("cargo") == 1
if has_blink_bin or has_cargo then
-- 1. Add blink.lib first as it's a dependency for blink.cmp
vim.pack.add({ { src = "https://github.com/saghen/blink.lib", name = "blink.lib" } })
-- 2. Add blink.cmp and other sources
vim.pack.add({ { src = "https://github.com/saghen/blink.cmp", name = "blink.cmp" } })
vim.pack.add({ { src = "https://github.com/rafamadriz/friendly-snippets", name = "friendly-snippets" } })
vim.pack.add({ { src = "https://github.com/fang2hou/blink-copilot", name = "blink-copilot" } })
-- 3. Blink.cmp setup
local cmp = require('blink.cmp')
cmp.build():wait(60000)
cmp.setup({
keymap = {
preset = "default",
["<Tab>"] = {
"snippet_forward",
function()
return require("sidekick").nes_jump_or_apply()
end,
function()
return vim.lsp.inline_completion.get()
end,
"fallback",
},
},
appearance = {
use_nvim_cmp_as_default = true,
nerd_font_variant = "mono",
kind_icons = { Copilot = "" },
},
sources = {
default = { "lsp", "path", "snippets", "buffer", "copilot" },
providers = {
copilot = {
name = "copilot",
module = "blink-copilot",
kind = "lsp",
server_name = "copilot",
score_offset = 100,
async = true,
opts = {
max_completions = 3,
max_attempts = 4,
},
},
},
},
signature = { enabled = true },
})
else
vim.notify("blink.cmp: binary not found and cargo not installed. Completion disabled.", vim.log.levels.WARN)
end
-- Autocmd to build blink.cmp after plugin installation or update
vim.api.nvim_create_autocmd("User", {
pattern = "PackChanged", -- This triggers after vim.pack.update() finishes
callback = function()
-- Check if blink is actually installed before trying to build
local status, blink = pcall(require, "blink.cmp")
if status then
vim.notify("Blink.cmp: Building native library...", vim.log.levels.INFO)
---@diagnostic disable-next-line: undefined-field
blink.build():wait(60000)
vim.notify("Blink.cmp: Build complete.", vim.log.levels.INFO)
end
end,
})
local lspconfig = require("lspconfig")
local capabilities = (has_blink_bin or has_cargo) and require("blink.cmp").get_lsp_capabilities() or nil
vim.lsp.config("rust_analyzer", {
settings = {
["rust-analyzer"] = {
check = {
command = "clippy",
},
},
},
})
require("mason-lspconfig").setup({
ensure_installed = {
"lua_ls",
"clangd",
"rust_analyzer",
"pyright",
"fish_lsp",
"bashls",
"copilot",
},
handlers = {
-- Default handler
function(server_name)
lspconfig[server_name].setup({ capabilities = capabilities })
end,
-- Specific overrides
["lua_ls"] = function()
lspconfig.lua_ls.setup({
capabilities = capabilities,
settings = {
Lua = {
diagnostics = { globals = { "Config" } },
},
},
})
end,
["rust_analyzer"] = function()
lspconfig.rust_analyzer.setup({
capabilities = capabilities,
settings = {
["rust-analyzer"] = {
check = {
command = "clippy",
},
},
},
})
end,
},
})
-- Enable native inline completion (ghost text in insert mode)
vim.lsp.inline_completion.enable()
-- Mini.ai
vim.pack.add({ { src = "https://github.com/echasnovski/mini.ai", name = "mini.ai" } })
Config.plugins.mini_ai = {
custom_textobjects = {
g = function()
local n_lines = vim.api.nvim_buf_line_count(0)
return {
from = { line = 1, col = 1 },
---@diagnostic disable-next-line: undefined-field
to = { line = n_lines, col = math.max(vim.fn.getline(n_lines):len(), 1) },
}
end,
},
}
require("mini.ai").setup(Config.plugins.mini_ai)
-- Icons
vim.pack.add({ { src = "https://github.com/nvim-tree/nvim-web-devicons", name = "nvim-web-devicons" } })
-- Lualine
vim.pack.add({ { src = "https://github.com/nvim-lualine/lualine.nvim", name = "lualine" } })
require("lualine").setup({
options = {
theme = "auto",
globalstatus = true,
},
sections = {
lualine_b = { "branch", "diff", "diagnostics" },
lualine_c = {
{ "filename" },
{
function()
return vim.b.gitsigns_blame_line or ""
end,
cond = function()
return vim.b.gitsigns_blame_line ~= nil and vim.b.gitsigns_blame_line ~= ""
end,
},
},
},
})
-- Inc-rename.nvim
vim.pack.add({ { src = "https://github.com/smjonas/inc-rename.nvim", name = "inc-rename" } })
require("inc_rename").setup({
-- the name of the command
cmd_name = "IncRename",
-- the highlight group used for highlighting the identifier's new name
hl_group = "Substitute",
-- whether an empty new name should be previewed; if false the command preview will be cancelled instead
preview_empty_name = false,
-- whether to display a `Renamed m instances in n files` message after a rename operation
show_message = true,
-- whether to save the "IncRename" command in the commandline history (set to false to prevent issues with
-- navigating to older entries that may arise due to the behavior of command preview)
save_in_cmdline_history = true,
-- the type of the external input buffer to use (currently supports "dressing" or "snacks")
input_buffer_type = nil,
-- callback to run after renaming, receives the result table (from LSP handler) as an argument
post_hook = nil,
})
-- Qalc
vim.pack.add({ { src = "https://github.com/Apeiros-46B/qalc.nvim", name = "qalc" } })
-- Noice dependencies
vim.pack.add({ { src = "https://github.com/MunifTanjim/nui.nvim", name = "nui" } })
-- Noice.nvim
vim.pack.add({ { src = "https://github.com/folke/noice.nvim", name = "noice" } })
require("noice").setup({
lsp = {
-- override markdown rendering so that **cmp** and other plugins use **Treesitter**
override = {
["vim.lsp.util.convert_input_to_markdown_lines"] = true,
["vim.lsp.util.set_autocmds"] = true,
["vim.ui.codelens.display_inline"] = true,
},
},
-- you can enable a preset for easier configuration
presets = {
bottom_search = true, -- use a classic bottom cmdline for search
command_palette = true, -- position the cmdline and popupmenu together
long_message_to_split = true, -- long messages will be sent to a split
inc_rename = true, -- enables an input dialog for inc-rename.nvim
lsp_doc_border = false, -- add a border to hover docs and signature help
},
routes = {
{
filter = { event = "lsp", kind = "progress", find = "Loading workspace" },
opts = { skip = true },
},
{
filter = { event = "lsp", kind = "progress", find = "^Diagnosing" },
opts = { skip = true },
},
{
filter = { event = "lsp", kind = "progress", find = "semantic tokens" },
opts = { skip = true },
},
},
})
-- Kitty Scrollback
vim.pack.add({ { src = "https://github.com/mikesmithgh/kitty-scrollback.nvim", name = "kitty-scrollback" } })
Config.plugins.kitty_scrollback = {}
require("kitty-scrollback").setup(Config.plugins.kitty_scrollback)
-- Haunt.nvim
vim.pack.add({ { src = "https://github.com/TheNoeTrevino/haunt.nvim", name = "haunt" } })
Config.plugins.haunt = {
picker = "snacks",
}
require("haunt").setup(Config.plugins.haunt)
-- Sidekick.nvim
vim.pack.add({ { src = "https://github.com/folke/sidekick.nvim", name = "sidekick" } })
Config.plugins.sidekick = {
cli = {
prompts = {
haunt_all = function()
return require("haunt.sidekick").get_locations()
end,
haunt_buffer = function()
return require("haunt.sidekick").get_locations({ current_buffer = true })
end,
},
},
}
require("sidekick").setup(Config.plugins.sidekick)
end)
-67
View File
@@ -1,67 +0,0 @@
---@module "plugins.ai"
--- This module defines the AI plugins spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ AI Tools │
-- ╰─────────────────────────────────────────────────────────╯
return {
{ -- Neocodeium
'monkoose/neocodeium',
event = 'VeryLazy',
opts = require('data.types').neocodeium.opts,
keys = require('data.keys').neocodeium,
cond = require('data.cond').neocodeium,
dependencies = { 'hrsh7th/nvim-cmp' },
},
{ -- Minuet-AI
'milanglacier/minuet-ai.nvim',
dependencies = require('data.deps').minuet,
opts = { provider = 'openai' },
cond = require('data.cond').minuet,
},
{ -- ChatGPT
'jackMort/ChatGPT.nvim',
event = 'VeryLazy',
cond = require('data.cond').chatgpt,
keys = require('data.keys').chatgpt.func,
opts = require('data.types').chatgpt,
dependencies = require('data.deps').chatgpt,
},
{ -- GP
'robitx/gp.nvim',
cond = require('data.cond').gp,
lazy = false,
opts = require('data.types').gp,
keys = require('data.keys').gp.func,
},
{ -- Code-Companion
'olimorris/codecompanion.nvim',
dependencies = require('data.deps').codecompanion,
opts = require('data.types').codecompanion.opts,
cond = require('data.cond').codecompanion,
cmd = require('data.cmd').codecompanion,
},
{ -- Codeium
'Exafunction/codeium.vim',
cond = require('data.cond').codeium,
lazy = true,
opts = require('data.types').codeium,
keys = require('data.keys').codeium,
dependencies = require('data.deps').codeium,
},
{ -- Avante
'yetone/avante.nvim',
cond = require('data.cond').avante,
lazy = true,
opts = require('data.types').avante,
build = 'make',
dependencies = require('data.deps').avante,
keys = function()
-- Add keymaps for Avante group
for _, item in ipairs(require('data.keys').group.avante) do
require('data.func').add_keymap(item)
end
end,
cmd = 'Avante',
},
}
-22
View File
@@ -1,22 +0,0 @@
--- @module "plugins.astral"
--- This module defines the astral plugin spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Astral Plugin │
-- ╰─────────────────────────────────────────────────────────╯
return { -- Astral
'rootiest/astral.nvim',
version = '*', -- Pin to GitHub releases
enabled = require('data.func').check_global_var('use_astral', true, true),
opts = {
fallback_themes = {
'catppuccin-macchiato',
'catppuccin-frappe',
'tokyonight',
'kanagawa',
'monochrome',
'default',
},
},
dev = vim.g.rootiest_dev or false, -- Use local codebase
}
-14
View File
@@ -1,14 +0,0 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ Auto-Save │
-- ╰─────────────────────────────────────────────────────────╯
return {
{ -- Auto-save
'okuuva/auto-save.nvim',
cmd = require('data.cmd').autosave,
event = { 'InsertLeave', 'TextChanged' },
opts = require('data.types').autosave,
cond = require('data.cond').autosave,
keys = require('data.keys').autosave,
},
}
-400
View File
@@ -1,400 +0,0 @@
--- @module "plugins.cmp"
--- This module defines the cmp plugin spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Auto Completion │
-- ╰─────────────────────────────────────────────────────────╯
local perf = vim.g.cmp_performance_enabled or false
--- Function to return the cmp provider
---@param performance? boolean Whether to use the experimental cmp performance fork
---@return table provider The cmp provider spec
local function cmp_provider(performance)
if performance then
return {
-- Experiemental cmp performance fork
url = 'https://github.com/iguanacucumber/magazine.nvim',
}
else
return {
-- Classic cmp
url = 'hrsh7th/nvim-cmp',
dev = false,
}
end
end
local cmp_repo = cmp_provider(perf)
if vim.g.useblinkcmp then
if vim.g.cmp_performance_enabled then
vim.g.lazyvim_blink_main = true
end
return { -- Blink.cmp
{ -- Overide the lazy-load event to include CmdlineEnter
'saghen/blink.cmp',
event = { 'InsertEnter', 'CmdlineEnter' },
},
{ -- Load blink.cmp configuration
'saghen/blink.cmp',
dependencies = {
'mikavilpas/blink-ripgrep.nvim',
'archie-judd/blink-cmp-words',
},
opts = {
enabled = function()
return not vim.tbl_contains({ 'minifiles' }, vim.bo.filetype)
and vim.bo.buftype ~= 'prompt'
and vim.b.completion ~= false
end,
completion = {
menu = {
auto_show = function(ctx)
if vim.g.cmp_auto_show ~= false then
return ctx.mode ~= 'cmdline'
or not vim.tbl_contains({ '/', '?' }, vim.fn.getcmdtype())
end
return false
end,
},
list = {
selection = {
preselect = function(ctx)
return ctx.mode ~= 'cmdline'
and not require('blink.cmp').snippet_active({ direction = 1 })
end,
auto_insert = true,
},
},
},
snippets = {
preset = 'luasnip',
},
fuzzy = {
implementation = 'prefer_rust',
use_frecency = true,
sorts = {
'exact',
'score',
'sort_text',
},
},
keymap = {
preset = 'enter',
['<C-y>'] = { 'select_and_accept' },
['<CR>'] = { 'fallback' },
},
cmdline = {
enabled = true,
completion = {
menu = { auto_show = true },
ghost_text = { enabled = true },
},
sources = function()
local type = vim.fn.getcmdtype()
-- Search forward and backward
if type == '/' or type == '?' then
return { 'buffer' }
end
-- Commands
if type == ':' or type == '@' then
return { 'cmdline' }
end
return {}
end,
keymap = {
preset = 'enter',
['<C-y>'] = { 'select_and_accept' },
['<S-Tab>'] = { 'select_prev', 'fallback' },
['<Tab>'] = { 'select_next', 'fallback' },
['<Enter>'] = { 'accept_and_enter', 'fallback' },
},
},
sources = {
providers = {
cmdline = {
min_keyword_length = function(ctx)
-- when typing a command, only show when the keyword is 2 characters or longer
if
ctx.mode == 'cmdline' and string.find(ctx.line, ' ') == nil
then
return 2
end
return 0
end,
},
ripgrep = {
module = 'blink-ripgrep',
name = 'Ripgrep',
opts = {
backend = {
ripgrep = {
search_casing = '--smart-case',
},
},
},
transform_items = function(_, items)
for _, item in ipairs(items) do
-- example: append a description to easily distinguish rg results
item.labelDetails = {
description = '󰡦 ',
}
end
return items
end,
},
-- Use the thesaurus source
thesaurus = {
name = 'blink-cmp-words',
module = 'blink-cmp-words.thesaurus',
-- All available options
opts = {
-- A score offset applied to returned items.
-- By default the highest score is 0 (item 1 has a score of -1, item 2 of -2 etc..).
score_offset = 0,
-- Default pointers define the lexical relations listed under each definition,
-- see Pointer Symbols below.
-- Default is as below ("antonyms", "similar to" and "also see").
pointer_symbols = { '!', '&', '^' },
},
},
-- Use the dictionary source
dictionary = {
name = 'blink-cmp-words',
module = 'blink-cmp-words.dictionary',
-- All available options
opts = {
-- The number of characters required to trigger completion.
-- Set this higher if completion is slow, 3 is default.
dictionary_search_threshold = 3,
-- See above
score_offset = 0,
-- See above
pointer_symbols = { '!', '&', '^' },
},
},
},
default = {
'lsp',
'path',
'lazydev',
'snippets',
'buffer',
'ripgrep',
'thesaurus',
},
-- Setup completion by filetype
per_filetype = {
text = { 'dictionary' },
markdown = { 'thesaurus' },
},
},
},
keys = require('data.keys').blink,
},
{ -- Blink compat
'saghen/blink.compat',
optional = true, -- make optional so it's only enabled if any extras need it
opts = {},
version = not vim.g.lazyvim_blink_main and '*',
},
{ -- Catppuccin integration
'catppuccin',
optional = true,
opts = {
integrations = { blink_cmp = true },
},
},
}
end
-- Else use nvim-cmp
return {
{ -- cmp
url = cmp_repo.url,
build = cmp_repo.build,
branch = cmp_repo.branch,
dev = cmp_repo.dev,
enabled = not vim.g.useblinkcmp,
event = 'VeryLazy',
dependencies = require('data.deps').cmp,
config = function()
local cmp = require('cmp')
local luasnip = require('luasnip')
cmp.event:on('menu_opened', function()
if require('data.cond').neocodeium() == true then
require('neocodeium').clear()
end
end)
cmp.event:on('menu_closed', function()
if require('data.cond').neocodeium() == true then
require('neocodeium.commands').enable()
require('neocodeium').cycle_or_complete()
end
end)
local border_opts = {
border = vim.g.completion_borders or 'rounded',
}
local window_opts = {
completion = cmp.config.window.bordered(border_opts),
documentation = cmp.config.window.bordered(border_opts),
}
luasnip.config.setup({})
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
cmp.setup({
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
completion = { completeopt = 'menu,menuone,noinsert' },
window = vim.g.completion_borders == 'rounded' and window_opts or {},
mapping = cmp.mapping.preset.insert({
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-p>'] = cmp.mapping.select_prev_item(),
['<Up>'] = cmp.mapping.select_prev_item({
behavior = cmp.SelectBehavior.Select,
}),
['<Down>'] = cmp.mapping.select_next_item({
behavior = cmp.SelectBehavior.Select,
}),
['<C-b>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-y>'] = cmp.mapping.confirm({ select = true }),
['<C-Space>'] = cmp.mapping.complete({}),
['<Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
-- If the completion popup is visible, select the next item
cmp.select_next_item()
elseif luasnip.expand_or_locally_jumpable() then
-- If a snippet can be expanded or jump to the next location, do so
luasnip.expand_or_jump()
elseif vim.snippet.active({ direction = 1 }) then
-- If a snippet is active, jump to the next location
vim.schedule(function()
vim.snippet.jump(1)
end)
elseif has_words_before() then
-- If there are words before the cursor, complete them
cmp.complete()
else
-- Otherwise, fallback to the default behavior of the Tab key
fallback()
end
end, { 'i', 's' }),
['<S-Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
elseif vim.snippet.active({ direction = -1 }) then
vim.schedule(function()
vim.snippet.jump(-1)
end)
else
fallback()
end
end, { 'i', 's' }),
}),
sources = {
{ name = 'nvim_lsp', priority = 1000 },
{ name = 'luasnip', priority = 750 },
{ name = 'path', priority = 250 },
{ name = 'buffer', priority = 250 },
{ name = 'cmp_yanky' },
{ name = 'dotenv' },
{ name = 'calc' },
{ name = 'conventionalcommits' },
},
formatting = {
fields = { 'abbr', 'kind', 'menu' },
expandable_indicator = true,
format = function(entry, item)
local custom_menu_icon = {
calc = '󰃬 Calculator',
math = ' Math',
nerd = ' Glyphs',
gitmoji = ' Gitmoji',
emoji = '󰞅 Emoji',
conventionalcommits = ' Commit Message',
path = ' Path',
buffer = '󰓩 Buffer',
dotenv = ' Dotenv',
cmp_yanky = '󰅍 Yanked',
}
local color_item = require('nvim-highlight-colors').format(
entry,
{ kind = item.kind }
)
item = require('lspkind').cmp_format({
require('tailwind-tools.cmp').lspkind_format,
})(entry, item)
if color_item.abbr_hl_group then
item.kind_hl_group = color_item.abbr_hl_group
item.kind = color_item.abbr
end
-- if entry.source.name is in the custom_menu_icon table, match its icon
if custom_menu_icon[entry.source.name] then
item.kind = custom_menu_icon[entry.source.name]
end
return item
end,
},
})
-- `:` cmdline setup.
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({
{ name = 'path' },
}, {
{
name = 'cmdline',
option = {
ignore_cmds = { 'Man', '!' },
},
},
}, { name = 'cmp-cmdline-history' }, {
name = 'cmp-cmdline-prompt',
}),
})
-- Additional setup for cmdline filetype
cmp.setup.filetype('cmdline', {
sources = {
{ name = 'cmdline' }, -- Ensure 'cmdline' source is available
{ name = 'path' },
{ name = 'cmp-cmdline-history' },
{ name = 'cmp-cmdline-prompt' },
},
})
-- Input filetype
cmp.setup.filetype('input', {
sources = {},
})
-- Custom filetype configuration
cmp.setup.filetype('config', {
sources = vim.tbl_filter(function(source)
return source.name ~= 'emoji' and source.name ~= 'gitmoji'
end, cmp.get_config().sources),
})
-- List of filetypes to disable completion
local disabled_filetypes = require('data.types').cmp
for _, filetype in ipairs(disabled_filetypes) do
cmp.setup.filetype(filetype, {
sources = {},
})
end
end,
},
}
-83
View File
@@ -1,83 +0,0 @@
--- @module "plugins.coding"
--- This module defines the coding plugins spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Coding │
-- ╰─────────────────────────────────────────────────────────╯
return {
{ -- Mason-lspconfig
'williamboman/mason-lspconfig.nvim',
opts = require('data.types').mason_lsp_config.opts,
},
{ -- nvim-treesitter
'nvim-treesitter/nvim-treesitter',
opts = require('data.types').treesitter.opts,
},
{ -- Yanky
'gbprod/yanky.nvim',
requires = { 'kkharji/sqlite.lua' },
opts = require('data.types').yanky,
keys = require('data.keys').yanky,
},
{ -- LazyDev
'folke/lazydev.nvim',
opts = require('data.types').lazydev.opts,
dependencies = require('data.deps').lazydev,
},
{ -- Alternate
'ton/vim-alternate',
lazy = true,
ft = require('data.types').alternate,
keys = require('data.keys').alternate,
},
{ -- Tailwind
'luckasRanarison/tailwind-tools.nvim',
lazy = true,
dependencies = require('data.deps').needs_treesitter,
opts = {},
},
{ -- Substitute
'gbprod/substitute.nvim',
lazy = true,
opts = require('data.types').substitute,
keys = require('data.keys').substitute,
},
{ -- Comment
'numToStr/Comment.nvim',
opts = require('data.types').comment,
},
{ -- Matchup
'andymass/vim-matchup',
setup = function()
-- may set any options here
vim.g.matchup_matchparen_offscreen = { method = 'popup' }
end,
},
{ -- EasyAlign
'junegunn/vim-easy-align',
lazy = true,
keys = require('data.keys').easyalign,
},
{ -- TinyInlineDiagnostic
'rachartier/tiny-inline-diagnostic.nvim',
event = 'VeryLazy', -- Or `LspAttach`
priority = 1000, -- needs to be loaded in first
cond = require('data.cond').tiny_inline_diagnostic,
config = require('data.types').tiny_inline_diagnostic.config,
},
{
'neovim/nvim-lspconfig',
init = function() end,
opts = {
servers = {
yamlls = {
settings = {
yaml = {
customTags = vim.g.custom_yaml_tags,
},
},
},
},
},
},
}
-19
View File
@@ -1,19 +0,0 @@
--- @module "plugins.core"
--- This module defines the core plugins spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Core │
-- ╰─────────────────────────────────────────────────────────╯
return {
-- require("config.rocks").plugin_spec,
{ -- Bufferline
'akinsho/bufferline.nvim',
cond = require('data.types').bufferline.enabled,
opts = require('data.types').bufferline.opts,
},
{ -- Which-Key
'folke/which-key.nvim',
lazy = true,
opts = require('data.types').whichkey.opts,
},
}
-56
View File
@@ -1,56 +0,0 @@
--- @module "plugins.dashboard.alpha"
--- This module defines the alpha plugin spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ ALPHA │
-- ╰─────────────────────────────────────────────────────────╯
return { -- Alpha
'goolord/alpha-nvim',
event = 'VimEnter',
enabled = require('data.func').check_global_var(
'dashboard',
'alpha',
'alpha'
),
opts = require('data.dash').alpha.opts,
config = function(_, dashboard)
-- close Lazy and re-open when the dashboard is ready
if vim.o.filetype == 'lazy' then
vim.cmd.close()
vim.api.nvim_create_autocmd('User', {
once = true,
pattern = 'AlphaReady',
callback = function()
require('lazy').show()
end,
})
end
-- Setup the dashboard
require('alpha').setup(dashboard.opts)
-- Open Alpha when Vim is started with no file arguments
vim.api.nvim_create_autocmd('User', {
once = true,
pattern = 'LazyVimStarted',
callback = function()
local stats = require('lazy').stats()
local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
dashboard.section.footer.val = '󰇥 Neovim loaded '
.. stats.loaded
.. '/'
.. stats.count
.. ' plugins in '
.. ms
.. 'ms 󱐌'
pcall(vim.cmd.AlphaRedraw)
-- Handle other plugins that may conflict
-- If auto-cursorline is installed, disable it
if pcall(require, 'auto-cursorline') then
require('auto-cursorline').disable({ buffer = true })
end
end,
})
end,
}
-9
View File
@@ -1,9 +0,0 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ Drop Screensaver │
-- ╰─────────────────────────────────────────────────────────╯
return {
'folke/drop.nvim',
lazy = true,
opts = {},
}
-118
View File
@@ -1,118 +0,0 @@
--- @module "plugins.dashboard.nvim-dashboard"
--- This module defines the dashboard plugin spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Dashboard │
-- ╰─────────────────────────────────────────────────────────╯
return { --
-- Dashboard
'nvimdev/dashboard-nvim',
event = 'UIEnter',
version = false,
opts = function()
---@diagnostic disable-next-line: param-type-mismatch
local logo_path = vim.fs.joinpath(vim.fn.stdpath('config'), 'logo/')
local height, width = vim.fn.winheight(0), vim.fn.winwidth(0)
local logo_file
local logo_dimensions = { width = 0, height = 0 }
if height >= 80 and width >= 80 then
logo_file = 'rootiest.txt'
elseif height >= 48 and width >= 48 then
logo_file = 'xerneas.ans'
elseif width >= 100 then
logo_file = 'pikachu.ans'
elseif width >= 80 then
logo_file = 'tall.txt'
elseif width >= 50 then
logo_file = 'small.txt'
else
logo_file = 'tiny.txt'
end
if logo_file == 'snorlax.ans' then
logo_dimensions = { width = 53, height = 25 }
elseif logo_file == 'porygon-z.ans' then
logo_dimensions = { width = 28, height = 18 }
elseif logo_file == 'pikachu.ans' then
logo_dimensions = { width = 22, height = 11 }
elseif logo_file == 'taco.ans' then
logo_dimensions = { width = 33, height = 15 }
elseif logo_file == 'nvim.ans' then
logo_dimensions = { width = 35, height = 20 }
elseif logo_file == 'marshadow.ans' then
logo_dimensions = { width = 28, height = 17 }
elseif logo_file == 'eiscue.ans' then
logo_dimensions = { width = 22, height = 18 }
elseif logo_file == 'xerneas.ans' then
logo_dimensions = { width = 39, height = 24 }
elseif logo_file == 'rootiest.ans' then
logo_dimensions = { width = 65, height = 27 }
end
local opts = {
theme = 'doom',
hide = {
statusline = false,
tabline = true,
},
-- By default, use ANSI art header
preview = {
command = 'bat -pp | bat -pp',
file_path = logo_path .. logo_file,
file_width = logo_dimensions.width,
file_height = logo_dimensions.height,
},
config = {
center = require('data.dash').dashboard_nvim.choices,
footer = function()
local stats = require('lazy').stats()
local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
return {
-- "⚡ Neovim loaded "
'󱐋 Neovim loaded '
.. stats.loaded
.. '/'
.. stats.count
.. ' plugins in '
.. ms
.. 'ms',
}
end,
},
}
-- if logo_file extension is not .ans or .png then read the content and add it to the header
if logo_file:sub(-4) ~= '.ans' and logo_file:sub(-4) ~= '.png' then
local logo_content = vim.fn.readfile(logo_path .. logo_file)
local LOGO = '\n\n' .. table.concat(logo_content, '\n') .. '\n\n'
opts.config.header = vim.split(LOGO, '\n')
opts.preview = nil
end
for _, button in ipairs(opts.config.center) do
button.desc = button.desc .. string.rep(' ', 43 - #button.desc)
button.key_format = ' %s'
end
-- Open dashboard after closing lazy
if vim.o.filetype == 'lazy' then
vim.api.nvim_create_autocmd('WinClosed', {
pattern = tostring(vim.api.nvim_get_current_win()),
once = true,
callback = function()
vim.schedule(function()
vim.api.nvim_exec_autocmds('UIEnter', { group = 'dashboard' })
end)
end,
})
end
return opts
end,
enabled = require('data.func').check_global_var(
'dashboard',
'nvim-dashboard',
'alpha'
),
}
-114
View File
@@ -1,114 +0,0 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ Snacks Dashboard │
-- ╰─────────────────────────────────────────────────────────╯
local fallback_logo = require('data.dash').fallback_logo
local function get_window_size()
local width = vim.api.nvim_win_get_width(0)
local height = vim.api.nvim_win_get_height(0)
return width, height
end
local function read_file(file_path)
local success, content_or_error = pcall(function()
local file = assert(io.open(file_path, 'r')) -- Open the file in read mode
local content = file:read('*a') -- Read the entire file content
file:close() -- Close the file
return content
end)
if not success then
return fallback_logo
end
return content_or_error
end
-- Common sections reused across conditions
local common_sections = {
{
section = 'keys',
title = 'Shortcuts',
icon = '󰌌 ',
gap = 0,
padding = 1,
indent = 2,
},
{
pane = 2,
padding = 2,
},
{
pane = 2,
icon = '',
title = 'Recent Files',
section = 'recent_files',
indent = 2,
padding = 1,
gap = 0,
},
{
pane = 2,
icon = '',
title = 'Projects',
section = 'projects',
indent = 2,
padding = 2,
},
}
local function create_sections(neovide)
local sections = {
{ section = 'header', indent = neovide and 40 or 60 },
}
-- Add common sections in order
for _, common in ipairs(common_sections) do
table.insert(sections, common)
end
-- Ensure "startup" is always at the end
table.insert(sections, neovide and { section = 'startup' } or {
section = 'startup',
padding = 2,
indent = 60,
})
if vim.g.show_github_contrib and not neovide then
local w, h = get_window_size()
local usrname = vim.g.gitname or 'rootiest'
if w > 130 and h > 30 then
table.insert(sections, {
section = 'terminal',
cmd = 'kusa ' .. usrname .. ' && sleep 0.2',
padding = { 0, 0 },
height = 10,
width = 106,
indent = 8,
})
end
end
return sections
end
return {
{
'folke/snacks.nvim',
opts = {
dashboard = {
enabled = require('data.func').check_global_var(
'dashboard',
'snacks',
'alpha'
),
preset = {
keys = require('data.dash').dashboard_nvim.choices,
header = read_file(require('data.dash').logo),
},
sections = function()
return create_sections(require('data.func').is_neovide())
end,
},
},
},
}
-21
View File
@@ -1,21 +0,0 @@
--- @module "plugins.debug"
--- This module defines the debug plugins spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Debug │
-- ╰─────────────────────────────────────────────────────────╯
return {
{ -- Neotest Plenary
'nvim-neotest/neotest-plenary',
},
{ -- Neotest
'nvim-neotest/neotest',
opts = {
adapters = require('data.deps').neotest.adapters,
},
dependencies = require('data.deps').neotest.deps,
},
{ -- Profiling
'stevearc/profile.nvim',
},
}
-4
View File
@@ -1,4 +0,0 @@
return {
-- disable tokyonight
{ 'folke/tokyonight.nvim', enabled = false },
}
-148
View File
@@ -1,148 +0,0 @@
--- @module "plugins.editor"
--- This module defines the editor plugins spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Editor │
-- ╰─────────────────────────────────────────────────────────╯
return {
{ -- Illuminate
'ehpi/vim-illuminate',
opts = require('data.types').illuminate.opts,
},
{ -- Nvim-notify
'rcarriga/nvim-notify',
opts = {
fps = 144, -- your monitor refresh rate
},
},
{ -- Grug-Far
'MagicDuck/grug-far.nvim',
opts = require('data.types').grug_far.opts,
},
{ -- Trouble
'folke/trouble.nvim',
lazy = true,
event = 'LazyFile',
cmd = require('data.cmd').trouble,
opts = require('data.types').trouble.opts,
},
{ -- Flash
'folke/flash.nvim',
opts = require('data.types').flash,
keys = require('data.keys').flash,
},
{ -- NeoTree
'nvim-neo-tree/neo-tree.nvim',
opts = require('data.types').neotree.opts,
cond = require('data.cond').neotree,
},
{ -- Arrow
'otavioschwanck/arrow.nvim',
lazy = true,
event = 'User LazyFileOpen',
opts = require('data.types').arrow,
},
---@module "neominimap.config.meta"
{ -- NeoMiniMap
'Isrothy/neominimap.nvim',
lazy = false,
-- event = 'User LazyFileOpen',
keys = require('data.keys').minimap.func,
init = require('data.types').minimap.init(),
cond = require('data.types').minimap.cond(),
},
{ -- Persistence
'folke/persistence.nvim',
event = 'BufReadPre',
opts = {},
},
{ -- DeadColumn
'Bekaboo/deadcolumn.nvim',
event = 'BufEnter',
cond = require('data.func').check_global_var('dead_column', true, true),
},
{ -- Precognition
'tris203/precognition.nvim',
lazy = true,
opts = {},
keys = require('data.keys').precog,
},
{ -- Smart Scrolloff
'tonymajestro/smart-scrolloff.nvim',
lazy = true,
event = 'LazyFile',
cond = require('data.func').check_global_var('smart_scrolloff', true, true),
opts = require('data.types').smartscrolloff,
},
{ -- Recorder
'chrisgrieser/nvim-recorder',
lazy = true,
dependencies = require('data.deps').recorder,
keys = require('data.keys').recorder,
},
{ -- Comment Box
'LudoPinelli/comment-box.nvim',
lazy = false,
},
{ -- Todo Comments
'folke/todo-comments.nvim',
opts = require('data.types').todo.opts,
cond = require('data.cond').todo,
enabled = true,
},
{ -- Auto Cursorline
'delphinus/auto-cursorline.nvim',
cond = require('data.func').check_global_var('auto_cursorline', true, true),
opts = require('data.types').autocursorline,
},
{ -- Bars N Lines
'OXY2DEV/bars-N-lines.nvim',
cond = require('data.types').barsNlines.enabled,
lazy = false,
config = require('data.types').barsNlines.config,
},
{ -- UndoTree
'mbbill/undotree',
lazy = false,
config = require('data.types').undotree,
keys = require('data.keys').undotree,
},
{ -- Noice
'folke/noice.nvim',
optional = true,
opts = require('data.types').noice,
},
{ -- Smear Cursor
'sphamba/smear-cursor.nvim',
event = 'VeryLazy',
enabled = function() -- Allow kitty and neovide to use native features
return not require('data.func').is_neovide()
and not require('data.func').is_kitty()
end,
opts = require('data.types').smearcursor,
keys = require('data.keys').smearcursor,
},
{ -- nvim-colorizer
'catgoose/nvim-colorizer.lua',
event = 'BufReadPre',
lazy = true,
opts = {
lazy_load = true,
user_default_options = {
names = true,
RGB = true, -- #RGB hex codes
RGBA = true, -- #RGBA hex codes
RRGGBB = true, -- #RRGGBB hex codes
RRGGBBAA = true, -- #RRGGBBAA hex codes
AARRGGBB = true, -- 0xAARRGGBB hex codes
rgb_fn = true, -- CSS rgb() and rgba() functions
hsl_fn = true, -- CSS hsl() and hsla() functions
css = true,
css_fn = true,
tailwind = true, -- Enable tailwind colors
tailwind_opts = { update_names = true },
sass = { enable = true, parsers = { 'css' } }, -- Enable sass colors
},
},
},
}
-60
View File
@@ -1,60 +0,0 @@
--- @module "plugins.git"
--- This module defines the git plugins spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Git Plugins │
-- ╰─────────────────────────────────────────────────────────╯
return {
{ -- Gist Tools
'Rawnly/gist.nvim',
lazy = true,
cmd = require('data.cmd').gist,
keys = require('data.keys').gist.func,
config = true,
},
{ -- Thanks/github-stars
'jsongerber/thanks.nvim',
lazy = true,
cmd = require('data.cmd').thanks,
opts = require('data.types').thanks.opts,
},
{ -- GitLinker
'linrongbin16/gitlinker.nvim',
lazy = true,
cmd = require('data.cmd').gitlinker,
opts = {},
keys = require('data.keys').gitlinker,
},
{ -- Git Blame
'f-person/git-blame.nvim',
event = 'LazyFile',
cond = require('data.cond').lualine,
opts = require('data.types').gitblame.opts,
},
{ -- Git Graph
'isakbm/gitgraph.nvim',
opts = require('data.types').gitgraph.opts,
keys = require('data.keys').gitgraph,
},
{ -- Diffview
'sindrets/diffview.nvim',
lazy = true,
cmd = require('data.cmd').diffview,
opts = require('data.types').diffview.opts,
},
{ -- Neogit
'NeogitOrg/neogit',
opts = {
graph_style = 'kitty',
},
},
{ -- GitSigns
'lewis6991/gitsigns.nvim',
opts = function()
local myopts = {}
myopts.linehl = vim.g.git_line_hl or false
myopts.word_diff = vim.g.git_word_hl or false
return myopts
end,
},
}
-43
View File
@@ -1,43 +0,0 @@
---@module "plugins"
--- This module defines the plugins for the Neovim configuration.
---
--- If lazy.nvim is installed, this module returns an empty table
--- to defer plugin management to lazy.nvim.
---
--- If lazy.nvim is not installed, the module loads each
--- Lua file in the `plugins` directory.
---
--- Note:
--- A warning will be triggered if lazy.nvim is not installed unless
--- the variable `vim.g.ignore_no_lazy` is set to `true`.
--
-- ╭─────────────────────────────────────────────────────────╮
-- │ PLUGINS DATA │
-- ╰─────────────────────────────────────────────────────────╯
local plugins = {}
-- Check if lazy.nvim is installed
if pcall(require, 'lazy') then
-- If lazy.nvim is installed, return an empty table and do nothing
return plugins
else
-- If lazy.nvim is not installed and vim.g.ignore_no_lazy is not set, display a warning
if not vim.g.ignore_no_lazy then
require('data').func.notify('lazy.nvim is not installed', 'WARNING')
end
-- Try to require plugins manually if we are not using lazy.nvim
local function read_plugins_dir()
-- Getting the root path for the current module directory
local dir_path =
vim.fn.fnamemodify(debug.getinfo(1, 'S').source:sub(2), ':h')
-- Load modules from the data directory
require('data').load_modules_from_dir(dir_path, 'plugins')
end
-- Read the directory and load any additional modules
read_plugins_dir()
end
return plugins
-51
View File
@@ -1,51 +0,0 @@
--- @module "plugins.languages"
--- This module defines the languages plugins spec for the Neovim configuration.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Languages │
-- ╰─────────────────────────────────────────────────────────╯
return {
{ -- Jinja
'armyers/Vim-Jinja2-Syntax',
},
{ -- Render-markdown
'MeanderingProgrammer/render-markdown.nvim',
enabled = false,
opts = {
heading = {
-- Determins if a border is added above and below headings
border = true,
above = '',
-- Used below heading for border
below = '🮂',
},
file_types = { 'markdown', 'Avante' },
},
ft = { 'markdown', 'Avante' },
},
{ -- MarkView
'OXY2DEV/markview.nvim',
ft = { 'markdown', 'Avante' },
opts = function()
local presets = require('markview.presets')
return {
checkboxes = presets.checkboxes.nerd,
markdown = {
headings = presets.headings.simple,
},
}
end,
},
{ -- Markdown Preview
'iamcco/markdown-preview.nvim',
cmd = require('data.cmd').markdown_preview,
ft = { 'markdown' },
build = function()
vim.fn['mkdp#util#install']()
end,
},
{ -- CookLang
'luizribeiro/vim-cooklang',
lazy = false,
},
}

Some files were not shown because too many files have changed in this diff Show More