diff --git a/.__abstract__ b/.__abstract__
deleted file mode 100644
index e69de29..0000000
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index d7ad043..0000000
--- a/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-plugin/
diff --git a/.stylua.toml b/.stylua.toml
deleted file mode 100644
index b1aeb38..0000000
--- a/.stylua.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-column_width = 120
-line_endings = "Unix"
-indent_type = "Tabs"
-indent_width = 4
-quote_style = "AutoPreferDouble"
-call_parentheses = "Always"
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 03338db..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2021 Ali Shahid
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/README.md b/README.md
index 1952b90..4640904 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1 @@
-
-
-
-
-
"]
+description = "Abstract the neovim"
+categories = ["editor", "ide"]
+keywords = ["neovim", "ide", "editor"]
+documentation = "https://github.com/Abstract-IDE/Abstract"
+repository = "https://github.com/Abstract-IDE/Abstract"
+homepage = "https://github.com/Abstract-IDE/Abstract"
+
+
+[workspace.dependencies]
+# === Libraries === #
+wl_utils = { package = "abstract-utils", path = "./src/libs/utils" }
+# === Plugins === #
+wp_indent = { package = "abstract-indent", path = "./src/plugins/indent" }
+wp_abspm = { package = "abspm", path = "./src/plugins/abspm" }
+wp_autogood = { package = "abstract-autogood", path = "./src/plugins/autogood" }
+
+# === 3rd Parties === #
+anyhow = { version = "1.0.100" }
+chrono = { version = "0.4.42", features = ["serde"] }
+dirs = { version = "6.0.0" }
+futures = { version = "0.3.31" }
+git2 = { version = "0.20.3", default-features = false, features = ["ssh", "https"] }
+hex = { version = "0.4.3" }
+memmap2 = { version = "0.9.10" }
+mlua = { version = "0.11.5", default-features = false, features = ["luajit52", "async", "send", "anyhow", "serde", "macros"] }
+nvim-oxi = { version = "0.6.0", features = ["neovim-nightly", "mlua", "test"] }
+once_cell = { version = "1.21.3" }
+parking_lot = { version = "0.12.5" }
+rayon = { version = "1.11.0", default-features = false }
+serde = { version = "1.0.228", features = ["derive"] }
+serde_json = { version = "1.0.145" }
+sha2 = { version = "0.10.9" }
+shellexpand = { version = "3.1.1" }
+strum = { version = "0.27.2", features = ["derive"] }
+strum_macros = { version = "0.27.2" }
+tempfile = { version = "3.24.0" }
+thiserror = { version = "2.0.17" }
+tokio = { version = "1.48.0", features = ["sync", "macros", "rt-multi-thread", "fs", "time", "process"] }
+tokio-test = { version = "0.4.4" }
+toml = { version = "0.9.10" }
+tracing = { version = "0.1.44" }
+tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
+
+[profile.release]
+lto = true
+codegen-units = 1
+strip = true
+panic = "abort"
diff --git a/code/clippy.toml b/code/clippy.toml
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/code/clippy.toml
@@ -0,0 +1 @@
+
diff --git a/code/lua/init.lua b/code/lua/init.lua
new file mode 100644
index 0000000..a0fa9f4
--- /dev/null
+++ b/code/lua/init.lua
@@ -0,0 +1,22 @@
+return function(data, repo)
+ vim.g.ABSTRACT_DATA = data
+ vim.g.ABSTRACT_ROOT = repo
+
+ local code = repo .. "/code"
+ local profile = "debug"
+ local lib_ext = vim.fn.has("mac") == 1 and "dylib" or "so"
+ local lib_path = code .. "/target/" .. profile .. "/libabstract." .. lib_ext
+
+ if vim.fn.filereadable(lib_path) == 0 then
+ vim.notify("[Abstract] Building (" .. profile .. ")...", vim.log.levels.INFO)
+ local cmd = profile == "release" and "cargo build --release" or "cargo build"
+ local result = vim.fn.system("cd " .. code .. " && " .. cmd .. " 2>&1")
+ if vim.v.shell_error ~= 0 then
+ vim.notify("[Abstract] Build failed:\n" .. result, vim.log.levels.ERROR)
+ return
+ end
+ end
+
+ package.cpath = package.cpath .. ";" .. code .. "/target/" .. profile .. "/?." .. lib_ext
+ require("libabstract")
+end
diff --git a/code/rust-toolchain.toml b/code/rust-toolchain.toml
new file mode 100644
index 0000000..78cef87
--- /dev/null
+++ b/code/rust-toolchain.toml
@@ -0,0 +1,3 @@
+[toolchain]
+version = "1.91.1"
+channel = "stable"
diff --git a/code/rustfmt.toml b/code/rustfmt.toml
new file mode 100644
index 0000000..c16888c
--- /dev/null
+++ b/code/rustfmt.toml
@@ -0,0 +1,30 @@
+# https://github.com/rust-lang/rustfmt/blob/master/Configurations.md
+
+# Basic
+edition = "2024"
+max_width = 120
+use_small_heuristics = "Max"
+
+# Imports
+group_imports = "StdExternalCrate"
+imports_granularity = "Crate"
+reorder_imports = true
+
+# Consistency
+newline_style = "Unix"
+
+# Misc
+chain_width = 100
+spaces_around_ranges = false
+binop_separator = "Back"
+reorder_impl_items = false
+match_arm_leading_pipes = "Preserve"
+match_arm_blocks = false
+match_block_trailing_comma = true
+trailing_comma = "Vertical"
+trailing_semicolon = false
+use_field_init_shorthand = true
+
+# Format comments
+comment_width = 140
+wrap_comments = true
diff --git a/code/src/libs/utils/Cargo.toml b/code/src/libs/utils/Cargo.toml
new file mode 100644
index 0000000..2c14662
--- /dev/null
+++ b/code/src/libs/utils/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "abstract-utils"
+version = { workspace = true }
+edition = { workspace = true }
+
+[dependencies]
+strum = { workspace = true }
+strum_macros = { workspace = true }
diff --git a/code/src/libs/utils/src/lib.rs b/code/src/libs/utils/src/lib.rs
new file mode 100644
index 0000000..afc4d1d
--- /dev/null
+++ b/code/src/libs/utils/src/lib.rs
@@ -0,0 +1 @@
+pub mod neovim;
diff --git a/code/src/libs/utils/src/neovim/mod.rs b/code/src/libs/utils/src/neovim/mod.rs
new file mode 100644
index 0000000..cd40856
--- /dev/null
+++ b/code/src/libs/utils/src/neovim/mod.rs
@@ -0,0 +1 @@
+pub mod types;
diff --git a/code/src/libs/utils/src/neovim/types/events.rs b/code/src/libs/utils/src/neovim/types/events.rs
new file mode 100644
index 0000000..b3f91b0
--- /dev/null
+++ b/code/src/libs/utils/src/neovim/types/events.rs
@@ -0,0 +1,394 @@
+use strum_macros::{
+ AsRefStr,
+ Display,
+ EnumString, //
+};
+
+/// Neovim autocommand events.
+///
+/// These correspond to `:help autocmd-events`.
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, AsRefStr, EnumString, Display)]
+#[strum(ascii_case_insensitive)]
+pub enum Events {
+ /// After a buffer is added to the buffer list.
+ /// Happens before `BufEnter`.
+ BufAdd,
+
+ /// Before a buffer is deleted from the buffer list.
+ BufDelete,
+
+ /// After entering a buffer (existing or new).
+ BufEnter,
+
+ /// After changing the name of the current buffer.
+ BufFilePost,
+
+ /// Before changing the name of the current buffer.
+ BufFilePre,
+
+ /// Before a buffer becomes hidden (no windows display it).
+ BufHidden,
+
+ /// Before leaving the current buffer.
+ BufLeave,
+
+ /// After the `'modified'` flag of a buffer changes.
+ BufModifiedSet,
+
+ /// After creating a new buffer.
+ BufNew,
+
+ /// When starting to edit a file that does not exist.
+ BufNewFile,
+
+ /// After reading a file into a new buffer.
+ BufReadPost,
+
+ /// Before reading a file into a new buffer.
+ BufReadPre,
+
+ /// Before reading a file into a buffer; handler should read it.
+ BufReadCmd,
+
+ /// Before unloading a buffer and freeing its text.
+ BufUnload,
+
+ /// After a buffer is displayed in a window.
+ BufWinEnter,
+
+ /// Before a buffer is removed from a window.
+ BufWinLeave,
+
+ /// Before completely deleting a buffer.
+ BufWipeout,
+
+ /// Before writing the whole buffer to a file.
+ BufWritePre,
+
+ /// After writing the whole buffer to a file.
+ BufWritePost,
+
+ /// Before writing the buffer; handler should write it.
+ BufWriteCmd,
+
+ /// State of an RPC channel changed.
+ ChanInfo,
+
+ /// Just after a channel is opened.
+ ChanOpen,
+
+ /// When an undefined user command is invoked.
+ CmdUndefined,
+
+ /// After the command-line text changes.
+ CmdlineChanged,
+
+ /// After entering the command-line.
+ CmdlineEnter,
+
+ /// Before leaving the command-line.
+ CmdlineLeave,
+
+ /// After entering the command-line window.
+ CmdwinEnter,
+
+ /// Before leaving the command-line window.
+ CmdwinLeave,
+
+ /// After loading a colorscheme.
+ ColorScheme,
+
+ /// Before loading a colorscheme.
+ ColorSchemePre,
+
+ /// After the insert-mode completion menu changes.
+ CompleteChanged,
+
+ /// After insert-mode completion finishes (before cleanup).
+ CompleteDonePre,
+
+ /// After insert-mode completion finishes.
+ CompleteDone,
+
+ /// Triggered when the cursor is idle in Normal mode.
+ CursorHold,
+
+ /// Triggered when the cursor is idle in Insert mode.
+ CursorHoldI,
+
+ /// After the cursor moves in Normal or Visual mode.
+ CursorMoved,
+
+ /// After the cursor moves in Insert mode.
+ CursorMovedI,
+
+ /// After the cursor moves in the command-line.
+ CursorMovedC,
+
+ /// After diffs have been updated.
+ DiffUpdated,
+
+ /// After the working directory changes.
+ DirChanged,
+
+ /// Before the working directory changes.
+ DirChangedPre,
+
+ /// When Vim is about to exit due to a quit command.
+ ExitPre,
+
+ /// Before appending to a file; handler should append.
+ FileAppendCmd,
+
+ /// After appending to a file.
+ FileAppendPost,
+
+ /// Before appending to a file.
+ FileAppendPre,
+
+ /// Before modifying a read-only file.
+ FileChangedRO,
+
+ /// When Vim detects a file changed outside of Vim.
+ FileChangedShell,
+
+ /// After handling an external file change.
+ FileChangedShellPost,
+
+ /// Before reading a file via `:read`; handler should read.
+ FileReadCmd,
+
+ /// After reading a file via `:read`.
+ FileReadPost,
+
+ /// Before reading a file via `:read`.
+ FileReadPre,
+
+ /// When the `filetype` option is set.
+ FileType,
+
+ /// Before writing part of a buffer; handler should write.
+ FileWriteCmd,
+
+ /// After writing part of a buffer.
+ FileWritePost,
+
+ /// Before writing part of a buffer.
+ FileWritePre,
+
+ /// After reading from a filter command.
+ FilterReadPost,
+
+ /// Before reading from a filter command.
+ FilterReadPre,
+
+ /// After writing to a filter command.
+ FilterWritePost,
+
+ /// Before writing to a filter command.
+ FilterWritePre,
+
+ /// When Neovim gains focus.
+ FocusGained,
+
+ /// When Neovim loses focus.
+ FocusLost,
+
+ /// When an undefined user function is called.
+ FuncUndefined,
+
+ /// After a UI attaches to Neovim.
+ UIEnter,
+
+ /// After a UI detaches from Neovim.
+ UILeave,
+
+ /// When toggling Insert/Replace mode via ``.
+ InsertChange,
+
+ /// Before inserting a character in Insert mode.
+ InsertCharPre,
+
+ /// Just before entering Insert or Replace mode.
+ InsertEnter,
+
+ /// Just before leaving Insert mode.
+ InsertLeavePre,
+
+ /// Just after leaving Insert mode.
+ InsertLeave,
+
+ /// When an LSP client attaches to a buffer.
+ LspAttach,
+
+ /// When an LSP client detaches from a buffer.
+ LspDetach,
+
+ /// When an LSP notification is received.
+ LspNotify,
+
+ /// When LSP progress updates are reported.
+ LspProgress,
+
+ /// When an LSP request is sent.
+ LspRequest,
+
+ /// When semantic tokens are updated by LSP.
+ LspTokenUpdate,
+
+ /// Before showing the popup menu (right-click).
+ MenuPopup,
+
+ /// After the editor mode changes.
+ ModeChanged,
+
+ /// After an option is set.
+ OptionSet,
+
+ /// Before running a quickfix command.
+ QuickFixCmdPre,
+
+ /// After running a quickfix command.
+ QuickFixCmdPost,
+
+ /// Before quitting a window or Vim.
+ QuitPre,
+
+ /// When a reply from a remote Vim server is received.
+ RemoteReply,
+
+ /// When a search wraps around the file.
+ SearchWrapped,
+
+ /// When macro recording starts.
+ RecordingEnter,
+
+ /// When macro recording stops.
+ RecordingLeave,
+
+ /// When Neovim reaches a safe idle state.
+ SafeState,
+
+ /// After loading a session file.
+ SessionLoadPost,
+
+ /// After writing a session file.
+ SessionWritePost,
+
+ /// After executing a shell command.
+ ShellCmdPost,
+
+ /// After executing a shell filter command.
+ ShellFilterPost,
+
+ /// Before sourcing a script file.
+ SourcePre,
+
+ /// After sourcing a script file.
+ SourcePost,
+
+ /// When sourcing a script file; handler must source it.
+ SourceCmd,
+
+ /// When a spell file is missing.
+ SpellFileMissing,
+
+ /// After reading stdin during startup.
+ StdinReadPost,
+
+ /// Before reading stdin during startup.
+ StdinReadPre,
+
+ /// When an existing swap file is detected.
+ SwapExists,
+
+ /// When the `syntax` option is set.
+ Syntax,
+
+ /// After entering a tab page.
+ TabEnter,
+
+ /// Before leaving a tab page.
+ TabLeave,
+
+ /// When creating a new tab page.
+ TabNew,
+
+ /// After entering a newly created tab page.
+ TabNewEntered,
+
+ /// After closing a tab page.
+ TabClosed,
+
+ /// When a terminal job starts.
+ TermOpen,
+
+ /// After entering Terminal mode.
+ TermEnter,
+
+ /// After leaving Terminal mode.
+ TermLeave,
+
+ /// When a terminal job exits.
+ TermClose,
+
+ /// When a terminal child emits an OSC/DCS/APC sequence.
+ TermRequest,
+
+ /// When the host terminal responds to an OSC/DCS query.
+ TermResponse,
+
+ /// After text changes in Normal mode.
+ TextChanged,
+
+ /// After text changes in Insert mode.
+ TextChangedI,
+
+ /// After text changes in Insert mode with popup menu visible.
+ TextChangedP,
+
+ /// After text changes in Terminal mode.
+ TextChangedT,
+
+ /// After a yank or delete operation.
+ TextYankPost,
+
+ /// User-defined custom event (triggered via `:doautocmd`).
+ User,
+
+ /// Fired after Vim finishes startup.
+ VimEnter,
+
+ /// Before Vim exits.
+ VimLeave,
+
+ /// Before Vim exits, prior to writing shada.
+ VimLeavePre,
+
+ /// After Vim window is resized.
+ VimResized,
+
+ /// After Vim resumes from suspend.
+ VimResume,
+
+ /// Before Vim suspends.
+ VimSuspend,
+
+ /// When a window is closed.
+ WinClosed,
+
+ /// After entering a window.
+ WinEnter,
+
+ /// Before leaving a window.
+ WinLeave,
+
+ /// When a new window is created.
+ WinNew,
+
+ /// After a window scrolls or changes size.
+ WinScrolled,
+
+ /// After a window is resized.
+ WinResized,
+}
diff --git a/code/src/libs/utils/src/neovim/types/mod.rs b/code/src/libs/utils/src/neovim/types/mod.rs
new file mode 100644
index 0000000..a9970c2
--- /dev/null
+++ b/code/src/libs/utils/src/neovim/types/mod.rs
@@ -0,0 +1 @@
+pub mod events;
diff --git a/code/src/neovim/editor/Cargo.toml b/code/src/neovim/editor/Cargo.toml
new file mode 100644
index 0000000..ed7e0a0
--- /dev/null
+++ b/code/src/neovim/editor/Cargo.toml
@@ -0,0 +1,36 @@
+[package]
+name = "abstract"
+description = "Abstract the neovim"
+version = { workspace = true }
+edition = { workspace = true }
+authors = { workspace = true }
+license = { workspace = true }
+rust-version = { workspace = true }
+
+
+[lib]
+crate-type = ["cdylib"]
+
+
+[dependencies]
+# local libraries
+wl_utils = { workspace = true }
+wp_abspm = { workspace = true }
+wp_autogood = { workspace = true }
+wp_indent = { workspace = true }
+
+# 3rd parties libraries
+anyhow = { workspace = true }
+git2 = { workspace = true }
+nvim-oxi = { workspace = true }
+once_cell = { workspace = true }
+thiserror = { workspace = true }
+tokio = { workspace = true }
+tracing = { workspace = true }
+tracing-subscriber = { workspace = true }
+strum = { workspace = true }
+# mlua = { workspace = true }
+
+
+[build-dependencies]
+nvim-oxi = { workspace = true }
diff --git a/code/src/neovim/editor/build.rs b/code/src/neovim/editor/build.rs
new file mode 100644
index 0000000..b671b32
--- /dev/null
+++ b/code/src/neovim/editor/build.rs
@@ -0,0 +1,8 @@
+use nvim_oxi::tests::BuildError;
+
+fn main() -> Result<(), BuildError> {
+ // TODO
+ //
+
+ Ok(())
+}
diff --git a/code/src/neovim/editor/plugin-lock.json b/code/src/neovim/editor/plugin-lock.json
new file mode 100644
index 0000000..a8c1031
--- /dev/null
+++ b/code/src/neovim/editor/plugin-lock.json
@@ -0,0 +1,76 @@
+{
+ "Abstract-cs": { "branch": "rewrite-2", "commit": "871bc7e5b830fcfda8ff2c8013a1b7a76102c09d" },
+ "Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
+ "FixCursorHold.nvim": { "branch": "master", "commit": "1900f89dc17c603eec29960f57c00bd9ae696495" },
+ "LuaSnip": { "branch": "master", "commit": "5a1e39223db9a0498024a77b8441169d260c8c25" },
+ "abstract-cursor": { "branch": "main", "commit": "9dca0e33a8881768e842655488fcbfb2c6351fd6" },
+ "abstract-line": { "branch": "main", "commit": "ee8826f948c9ba6a4bf3c046160c19461f41089c" },
+ "abstract-plugs.nvim": { "branch": "main", "commit": "b55595fed0ca179fc72bc0bcc204730e48a17a23" },
+ "awesome-flutter-snippets": { "branch": "master", "commit": "48d4b8ba44dc0133c2299d9d810eceb5efa441a7" },
+ "blink.cmp": { "branch": "main", "commit": "4b18c32adef2898f95cdef6192cbd5796c1a332d" },
+ "code_runner.nvim": { "branch": "main", "commit": "3be33a8d4ce36e453fc09258c9093f9ecf452964" },
+ "colorful-menu.nvim": { "branch": "master", "commit": "b51a659459df8d078201aefc995db8175ed55e84" },
+ "csvview.nvim": { "branch": "main", "commit": "7022e18a0fbae9aecf99a3ba02b2a541edc2b8a1" },
+ "dart-vim-plugin": { "branch": "master", "commit": "db2ef169d6ae08e2bdb7ca44aac3ebb3367c9802" },
+ "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
+ "dropbar.nvim": { "branch": "master", "commit": "ce202248134e3949aac375fd66c28e5207785b10" },
+ "fff.nvim": { "branch": "main", "commit": "ac8df4c9e4926d23f196f30be052518454dfe251" },
+ "fidget.nvim": { "branch": "main", "commit": "7fa433a83118a70fe24c1ce88d5f0bd3453c0970" },
+ "flutter-tools.nvim": { "branch": "main", "commit": "677cc07c16e8b89999108d2ebeefcfc5f539b73c" },
+ "friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
+ "gitgraph.nvim": { "branch": "main", "commit": "c16daa7d7dd597caf9085644c009cfa80b75db8e" },
+ "gitsigns.nvim": { "branch": "main", "commit": "7c4faa3540d0781a28588cafbd4dd187a28ac6e3" },
+ "goto-preview": { "branch": "main", "commit": "d2d6923c9b9e0e43f0b9b566f261a8b1ae016540" },
+ "grapple.nvim": { "branch": "main", "commit": "b41ddfc1c39f87f3d1799b99c2f0f1daa524c5f7" },
+ "helpview.nvim": { "branch": "main", "commit": "518789535a0cb146224a428edf93a70f98b795db" },
+ "hop.nvim": { "branch": "master", "commit": "08ddca799089ab96a6d1763db0b8adc5320bf050" },
+ "hovercraft.nvim": { "branch": "main", "commit": "20323b149877e22d18594b9288ce0336a35b98e8" },
+ "kulala.nvim": { "branch": "main", "commit": "6656c9d332735ca6a27725e0fb45a1715c4372d9" },
+ "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
+ "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" },
+ "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" },
+ "markview.nvim": { "branch": "main", "commit": "239feb70ed1cfc26e2c91b32590fd63f7b015599" },
+ "mason-lspconfig.nvim": { "branch": "main", "commit": "a324581a3c83fdacdb9804b79de1cbe00ce18550" },
+ "mason-null-ls.nvim": { "branch": "main", "commit": "8e7806acaa87fae64f0bfde25bb4b87c18bd19b4" },
+ "mason-nvim-dap.nvim": { "branch": "main", "commit": "9a10e096703966335bd5c46c8c875d5b0690dade" },
+ "mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" },
+ "mini.icons": { "branch": "main", "commit": "5b9076dae1bfbe47ba4a14bc8b967cde0ab5d77e" },
+ "neo-tree.nvim": { "branch": "v3.x", "commit": "9d6826582a3e8c84787bd7355df22a2812a1ad59" },
+ "neotest": { "branch": "master", "commit": "deadfb1af5ce458742671ad3a013acb9a6b41178" },
+ "neovim-session-manager": { "branch": "master", "commit": "89d253a6c68af60b49570044591d5b8701866601" },
+ "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" },
+ "none-ls.nvim": { "branch": "main", "commit": "f61f46ded0ca9edce7a09b674f8e162d10921426" },
+ "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
+ "nvim-autopairs": { "branch": "master", "commit": "59bce2eef357189c3305e25bc6dd2d138c1683f5" },
+ "nvim-bqf": { "branch": "main", "commit": "f65fba733268ffcf9c5b8ac381287eca7c223422" },
+ "nvim-colorizer.lua": { "branch": "master", "commit": "ef211089af881bea206c7aa3f2693a81feee7e90" },
+ "nvim-dap": { "branch": "master", "commit": "a9d8cb68ee7184111dc66156c4a2ebabfbe01bc5" },
+ "nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" },
+ "nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" },
+ "nvim-java": { "branch": "main", "commit": "602a5f7fa92f9c1d425a2159133ff9de86842f0a" },
+ "nvim-lspconfig": { "branch": "master", "commit": "2163c54bb6cfec53e3e555665ada945b8c8331b9" },
+ "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" },
+ "nvim-surround": { "branch": "main", "commit": "61319d4bd1c5e336e197defa15bd104c51f0fb29" },
+ "nvim-treesitter": { "branch": "main", "commit": "5cb05e1b0fa3c469958a2b26f36b3fe930af221c" },
+ "nvim-ts-autotag": { "branch": "main", "commit": "8e1c0a389f20bf7f5b0dd0e00306c1247bda2595" },
+ "nvim-ts-context-commentstring": { "branch": "main", "commit": "1b212c2eee76d787bbea6aa5e92a2b534e7b4f8f" },
+ "nvim-web-devicons": { "branch": "master", "commit": "737cf6c657898d0c697311d79d361288a1343d50" },
+ "oil.nvim": { "branch": "master", "commit": "0fcc83805ad11cf714a949c98c605ed717e0b83e" },
+ "penvim": { "branch": "main", "commit": "028c19f81eba9eaf4fe4876c60e3491b3389322f" },
+ "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
+ "renamer.nvim": { "branch": "master", "commit": "1614d466df53899f11dd5395eaac3c09a275c384" },
+ "rustaceanvim": { "branch": "master", "commit": "88575b98bb9937fb9983ddec5e532b67e75ce677" },
+ "schemastore.nvim": { "branch": "main", "commit": "e75f2362624698864957a694d80ca0c116bd24d3" },
+ "snacks.nvim": { "branch": "main", "commit": "9912042fc8bca2209105526ac7534e9a0c2071b2" },
+ "spring-boot.nvim": { "branch": "main", "commit": "218c0c26c14d99feca778e4d13f5ec3e8b1b60f0" },
+ "tabby.nvim": { "branch": "main", "commit": "3c130e1fcb598ce39a9c292847e32d7c3987cf11" },
+ "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" },
+ "tiny-code-action.nvim": { "branch": "main", "commit": "8e72efa075ba3154bbc4c7d1db532b03b4e68373" },
+ "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
+ "typescript-tools.nvim": { "branch": "master", "commit": "c2f5910074103705661e9651aa841e0d7eea9932" },
+ "typst-preview.nvim": { "branch": "master", "commit": "e123a7ab64e52d836e00dea9251e85b201f38966" },
+ "vim-dadbod": { "branch": "master", "commit": "6d1d41da4873a445c5605f2005ad2c68c99d8770" },
+ "vim-dadbod-completion": { "branch": "master", "commit": "a8dac0b3cf6132c80dc9b18bef36d4cf7a9e1fe6" },
+ "vim-dadbod-ui": { "branch": "master", "commit": "07e92e22114cc5b1ba4938d99897d85b58e20475" },
+ "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }
+}
diff --git a/code/src/neovim/editor/src/core/configs.rs b/code/src/neovim/editor/src/core/configs.rs
new file mode 100644
index 0000000..2fa978d
--- /dev/null
+++ b/code/src/neovim/editor/src/core/configs.rs
@@ -0,0 +1,155 @@
+use std::path::PathBuf;
+
+use nvim_oxi::{
+ self,
+ api, //
+};
+
+use crate::utils::api::{
+ append_opt,
+ listchars, //
+ set_opt,
+};
+
+/// Plugin independent Configs
+///
+/// This struct handles all Neovim configuration that is independent of any plugin.
+pub struct Config {}
+
+impl Config {
+ pub fn init() -> nvim_oxi::Result<()> {
+ // ----------------------------
+ // Leader keys
+ // ----------------------------
+ // To see the current mapping for ||, type :echo mapleader.
+ // If it reports an undefined variable, it means the leader key is set to the default of '\'.
+ api::set_var("mapleader", " ")?;
+ api::set_var("maplocalleader", "|")?;
+
+ // ----------------------------
+ // UI options
+ // ----------------------------
+ set_opt("termguicolors", true)?; // Enable GUI colors for the terminal to get truecolor
+ set_opt("list", true)?; // show whitespace
+ set_opt(
+ "listchars",
+ listchars(&[
+ ("nbsp", "⦸"), // CIRCLED REVERSE SOLIDUS (U+29B8)
+ ("extends", "»"), // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (U+00BB)
+ ("precedes", "«"), // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (U+00AB)
+ ("tab", "➔ "), // WHITE RIGHT-POINTING TRIANGLE + BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+ ("trail", "•"), // BULLET (U+2022)
+ ("space", " "), // space
+ ]),
+ )?;
+ set_opt(
+ "fillchars",
+ listchars(&[
+ ("diff", "∙"), // BULLET OPERATOR (U+2219)
+ ("eob", " "), // NO-BREAK SPACE to suppress ~ at EndOfBuffer
+ ("fold", "·"), // MIDDLE DOT (U+00B7)
+ ("vert", "│"), // window border when window splits vertically
+ ]),
+ )?;
+
+ // ----------------------------
+ // Backup related options
+ // ----------------------------
+
+ // Resolve stdpath("data") like Lua's `vim.fn.stdpath("data")`
+ let backup_dir = {
+ let path: String = api::eval("stdpath('data')")?;
+ PathBuf::from(path).join(".cache")
+ };
+
+ set_opt("backup", true)?; // make backups before writing
+ set_opt("undofile", false)?; // persistent undos
+ set_opt("writebackup", true)?; // Make backup before overwriting current buffer
+ set_opt("backupcopy", "yes")?; // Overwrite the original backup file
+ set_opt("directory", backup_dir.join("swap").to_string_lossy().as_ref())?; // swap files directory
+ set_opt("backupdir", backup_dir.join("backedUP").to_string_lossy().as_ref())?; // backup files
+ set_opt("undodir", backup_dir.join("undos").to_string_lossy().as_ref())?; // undo files
+ set_opt("viewdir", backup_dir.join("view").to_string_lossy().as_ref())?; // :mkview storage
+ set_opt("shada", format!("'100,<50,f50,n{}", backup_dir.join("shada/shada").to_string_lossy()))?;
+
+ // ----------------------------
+ // Clipboard
+ // ----------------------------
+ append_opt("clipboard", "unnamedplus")?; // copy & paste
+
+ // ----------------------------
+ // Wrapping / matching
+ // ----------------------------
+ set_opt("wrap", false)?; // don't automatically wrap on load
+ set_opt("showmatch", true)?; // show matching part of pairs [] {} ()
+
+ // ----------------------------
+ // Cursor / search
+ // ----------------------------
+ set_opt("cursorline", true)?; // highlight current line
+ set_opt("number", true)?; // show line numbers
+ set_opt("relativenumber", true)?; // show relative line number
+ set_opt("incsearch", true)?; // incremental search
+ set_opt("hlsearch", true)?; // highlighted search results
+ set_opt("ignorecase", true)?; // ignore case while searching
+ set_opt("smartcase", true)?; // smartcase
+
+ // ----------------------------
+ // Scrolling
+ // ----------------------------
+ set_opt("scrolloff", 1)?; // keep cursor 1 line away from screen border
+ set_opt("sidescrolloff", 2)?; // keep 2 columns visible left/right of cursor
+
+ // ----------------------------
+ // Editing behavior
+ // ----------------------------
+ set_opt("backspace", "indent,start,eol")?; // backspace behaves normally
+ set_opt("mouse", "a")?; // enable mouse interaction
+ set_opt("mousescroll", "ver:3,hor:2")?; // scroll speed
+ set_opt("updatetime", 500)?; // CursorHold interval
+
+ // ----------------------------
+ // Tabs / indentation
+ // ----------------------------
+ set_opt("softtabstop", 4)?; // soft tab stops
+ set_opt("shiftwidth", 4)?; // shift width
+ set_opt("tabstop", 4)?; // tab width
+ set_opt("smarttab", true)?; // / in leading whitespace
+ set_opt("autoindent", true)?; // maintain indent of current line
+ // set_opt("expandtab", false)?; // don't expand tabs into spaces
+ set_opt("shiftround", true)?; // round indent on shift
+
+ // ----------------------------
+ // Splits / layout
+ // ----------------------------
+ set_opt("splitbelow", true)?; // horizontal splits below current window
+ set_opt("splitright", true)?; // vertical splits to right
+ set_opt("laststatus", 3)?; // always show status line (3 = global status)
+ // set_opt("colorcolumn", "79")?; // vertical word limit line
+ set_opt("cmdheight", 1)?; // command height
+
+ // ----------------------------
+ // Buffers / commands
+ // ----------------------------
+ set_opt("hidden", true)?; // hide buffers with unsaved changes
+ set_opt("inccommand", "split")?; // live preview of :s results
+ set_opt("shell", "zsh")?; // shell for :! or system()
+ // set_opt("lazyredraw", true)?; // faster scrolling
+
+ // ----------------------------
+ // Wildignore / completion
+ // ----------------------------
+ append_opt("wildignore", "*.o")?;
+ append_opt("wildignore", "*.rej")?;
+ append_opt("wildignore", "*.so")?;
+ set_opt("completeopt", "menuone,noselect,noinsert")?; // completion options
+
+ // ----------------------------
+ // Misc
+ // ----------------------------
+ set_opt("showmode", false)?; // disable insert/replace/visual mode messages
+ // set_opt("cmdheight", 0)?; // command height
+
+ Ok(())
+ }
+}
diff --git a/code/src/neovim/editor/src/core/keymaps.lua b/code/src/neovim/editor/src/core/keymaps.lua
new file mode 100644
index 0000000..3ce4bf7
--- /dev/null
+++ b/code/src/neovim/editor/src/core/keymaps.lua
@@ -0,0 +1,336 @@
+-- ── Keymaps ──
+-- All keymap definitions for Abstract.
+-- Injected into plugin configs via lua_section!
+
+_G.ABSTRACT_PLUGIN_GROUP = {
+ lsp = "LSP",
+ workspace = "Workspace",
+ preview = "Preview",
+ debug = "Debug",
+ terminal = "Terminal",
+ files = "Files",
+ logs = "Logs",
+ git = "Version Control - Git",
+ find = "Find",
+ manager = "Manager",
+ session = "Session",
+ http = "HTTP",
+ run_code = "Run Code",
+ close = "Close",
+ ui = "UI",
+ trouble = "Trouble",
+ lazygit = "Lazygit",
+ git_repos = "Git - Repos",
+ more_git = "More git",
+ go = "Go",
+}
+
+local M = {}
+
+M.builtin = --@builtin
+{
+ { "\\", ":bnext", desc = "Goto next buffer" },
+ { "|", ":bprevious", desc = "Goto previous buffer" },
+ -- Window
+ { "", ":close ", desc = "Close current window" },
+ { "", ":only ", desc = "Close all window except current one" },
+ -- TAB
+ { "", ":tabclose", desc = "Close current tab" },
+ { "", ":tabonly", desc = "Close all other tab" },
+ { "", ":tabn", desc = "Goto next tab" },
+ { "", ":tabp", desc = "Goto previous tab" },
+ { "", ":-tabmove", desc = "Move tab to next position" },
+ { "", ":+tabmove", desc = "Move tab to previous position" },
+ -- LOGS
+ { "Lm", ":messages", desc = "Messages history" },
+}
+--@end
+
+M.which_key = --@which_key
+{
+ { "?", function() require('which-key').show({ global = false }) end, desc = "Buffer Local Keymaps /which-key" },
+}
+--@end
+
+M.lsp_config = --@lsp_config
+{
+ { "l", group = _G.ABSTRACT_PLUGIN_GROUP.lsp },
+ { "lf", function() vim.lsp.buf.format({ timeout_ms = 3000 }) end, desc = "Format document" },
+ { "la", function() require('tiny-code-action').code_action({}) end, desc = "Code action" },
+ { "lA", function() vim.lsp.buf.range_code_action() end, desc = "Range code action" },
+ { "ld", function() vim.lsp.buf.definition() end, desc = "Jumps to definition" },
+ { "lD", function() vim.lsp.buf.declaration() end, desc = "Jumps to declaration" },
+ { "le", function() vim.diagnostic.open_float() end, desc = "Show diagnostics" },
+ { "li", function() vim.lsp.buf.implementation() end, desc = "Lists all symbol implementations" },
+ { "ls", function() vim.lsp.buf.signature_help() end, desc = "Show symbol signature information" },
+ { "lT", function() vim.lsp.buf.type_definition() end, desc = "Jumps to type definition" },
+ { "lh", function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end, desc = "Inlay hints /toggle" },
+ { "ln", function() vim.diagnostic.jump({ count = 1, float = true }) end, desc = "Move to next diagnostic" },
+ { "lb", function() vim.diagnostic.jump({ count = -1, float = true }) end, desc = "Move to previous diagnostic" },
+ { "lr", function() require('snacks').picker.lsp_references() end, nowait = true, desc = "References" },
+ { "lR", function() require('renamer').rename({}) end, desc = "Rename symbol" },
+ {
+ { "lw", group = _G.ABSTRACT_PLUGIN_GROUP.workspace },
+ { "lwa", function() vim.lsp.buf.add_workspace_folder() end, desc = "Add workspace folder" },
+ { "lwr", function() vim.lsp.buf.remove_workspace_folder() end, desc = "Remove workspace folders" },
+ { "lwl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, desc = "List workspace folders" },
+ },
+ { "Ll", function() vim.cmd('tabnew ' .. vim.lsp.get_log_path()) end, desc = "LSP logs" },
+}
+--@end
+
+M.hovercraft = --@hovercraft
+{
+ {
+ "K",
+ function()
+ local hovercraft = require("hovercraft")
+ if hovercraft.is_visible() then hovercraft.enter_popup() else hovercraft.hover() end
+ end,
+ desc = "Hover"
+ },
+}
+--@end
+
+M.trouble = --@trouble
+{
+ { "lt", group = _G.ABSTRACT_PLUGIN_GROUP.trouble },
+ { "ltt", "Trouble diagnostics toggle", desc = "Diagnostics /project" },
+ { "ltL", "Trouble loclist toggle", desc = "Location List" },
+ { "ltT", "Trouble diagnostics toggle filter.buf=0", desc = "Diagnostics /buffer" },
+ { "ltl", "Trouble lsp toggle focus=false win.position=right", desc = "LSP Definitions/references/..." },
+ { "ltq", "Trouble qflist toggle", desc = "Quickfix List" },
+ { "lts", "Trouble symbols toggle focus=false", desc = "Symbols" },
+}
+--@end
+
+M.neo_tree = --@neo_tree
+{
+ { ";f", ":Neotree toggle", desc = "File Explorer(toggle)" },
+}
+--@end
+
+M.hop = --@hop
+{
+ { "f", "lua require'hop'.hint_words()", desc = "Jump anywhere" },
+}
+--@end
+
+M.goto_preview = --@goto_preview
+{
+ { "lp", group = _G.ABSTRACT_PLUGIN_GROUP.preview },
+ { "lpd", function() require('goto-preview').goto_preview_definition({}) end, desc = "Definition preview" },
+ { "lpt", function() require('goto-preview').goto_preview_type_definition({}) end, desc = "Type definition preview" },
+ { "lpi", function() require('goto-preview').goto_preview_implementation({}) end, desc = "Implementation preview" },
+ { "lpD", function() require('goto-preview').goto_preview_declaration({}) end, desc = "Declaration preview" },
+ { "lpr", function() require('goto-preview').goto_preview_references() end, desc = "References preview" },
+ { "lpQ", function() require('goto-preview').close_all_win() end, desc = "Close all window preview" },
+}
+--@end
+
+M.oil = --@oil
+{
+ { "-", group = _G.ABSTRACT_PLUGIN_GROUP.files },
+ { "-", "Oil", desc = "Open parent directory" },
+}
+--@end
+
+M.git_graph = --@git_graph
+{
+ { "v", group = _G.ABSTRACT_PLUGIN_GROUP.git },
+ { "vg", function() require("gitgraph").draw({}, { all = true, max_count = 5000 }) end, desc = "Git graph" },
+}
+--@end
+
+M.code_runner = --@code_runner
+{
+ { "o", group = _G.ABSTRACT_PLUGIN_GROUP.run_code },
+ { "oo", ":RunCode", desc = "Runs based on file type (Run Code)" },
+ { "of", ":RunFile", desc = "Execute command from its key in current directory (Run Code)" },
+ { "ot", ":RunFile tab", desc = "Run the current file (optionally you can select an opening mode)." },
+ { "op", ":RunProject", desc = "Run the current project(If you are in a project otherwise you will not do anything)." },
+ { "oq", ":RunClose", desc = "Close runner (Run Code)" },
+ { "oj", ":CRFiletype", desc = "Open json with supported files (Run Code)" },
+ { "oJ", ":CRProjects", desc = "Open json with list of projects (Run Code)" },
+}
+--@end
+
+M.kulala = --@kulala
+{
+ { "r", group = _G.ABSTRACT_PLUGIN_GROUP.http },
+ { "rr", "lua require('kulala').run()", desc = "Make HTTP request" },
+ { "rh", "lua require('kulala').jump_prev()", desc = "Jump to the previous request" },
+ { "rl", "lua require('kulala').jump_next()", desc = "Jump to the next request" },
+ { "re", "lua require('kulala').set_selected_env()", desc = "Select environment" },
+ { "rt", "lua require('kulala').toggle_view()", desc = "Response view /toggle" },
+}
+--@end
+
+M.snacks = --@snacks
+{
+ { "L", group = _G.ABSTRACT_PLUGIN_GROUP.logs },
+ { "Ln", "lua Snacks.notifier.show_history()", desc = "Notification history /snacks" },
+}
+--@end
+
+M.snacks_bufdelete = --@snacks_bufdelete
+{
+ { "", group = _G.ABSTRACT_PLUGIN_GROUP.close },
+ { "", "lua Snacks.bufdelete()", desc = "Delete current buffer" },
+ { "", "lua Snacks.bufdelete.other()", desc = "Delete all buffers except the current one" },
+}
+--@end
+
+M.snacks_lazygit = --@snacks_lazygit
+{
+ { "vL", group = _G.ABSTRACT_PLUGIN_GROUP.lazygit },
+ { "vl", "lua Snacks.lazygit()", desc = "open lazygit" },
+ { "vLl", "lua Snacks.lazygit.log()", desc = "log view" },
+ { "vLf", "lua Snacks.lazygit.log_file()", desc = "log of the current file" },
+}
+--@end
+
+M.snacks_gh = --@snacks_gh
+{
+ { "vg", group = _G.ABSTRACT_PLUGIN_GROUP.git_repos },
+ { "vgp", "lua Snacks.picker.gh_pr()", desc = "Browse open pull requests" },
+ { "vgP", "lua Snacks.picker.gh_pr({state='all'})", desc = "Browse open pull requests (All)" },
+ { "vgi", "lua Snacks.picker.gh_issue()", desc = "Browse open issues" },
+ { "vgI", "lua Snacks.picker.gh_issue({ state = 'all' })", desc = "Browse open issues (All)" },
+}
+--@end
+
+M.snacks_gitbrowse = --@snacks_gitbrowse
+{
+ { "vm", group = _G.ABSTRACT_PLUGIN_GROUP.more_git },
+ { "vmb", "lua Snacks.gitbrowse()", desc = "Git Browse" },
+}
+--@end
+
+M.snacks_picker = --@snacks_picker
+{
+ {
+ { "", "lua Snacks.picker.buffers()", desc = "Buffers" },
+ { "", "lua Snacks.picker.files()", desc = "Find Files /project" },
+ { "", "lua Snacks.picker.files({ cwd = vim.fn.expand('%:p:h') })", desc = "Find Files /current", mode = { "n", "x" } },
+ },
+ {
+ { "", group = _G.ABSTRACT_PLUGIN_GROUP.find },
+ { "g", "lua Snacks.picker.grep()", desc = "Find word /project" },
+ { "w", "lua Snacks.picker.grep_word()", desc = "Find under Visual selection or word" },
+ { "l", "lua Snacks.picker.lines()", desc = "Search Buffer Lines" },
+ { "c", "lua Snacks.picker.commands()", desc = "Commands" },
+ { "m", "lua Snacks.picker.keymaps()", desc = "Mappings" },
+ { "h", "lua Snacks.picker.help()", desc = "Help" },
+ { "p", "lua Snacks.picker.pick()", desc = "Snacks builtin cmds" },
+ },
+ {
+ { "m", group = _G.ABSTRACT_PLUGIN_GROUP.manager },
+ { "mp", "lua Snacks.picker.projects()", desc = "Projects" },
+ },
+}
+--@end
+
+M.fff = --@fff
+{
+ { "", group = _G.ABSTRACT_PLUGIN_GROUP.find },
+ { "", function() require('fff').find_files() end, desc = "Find Files /project" },
+ { "", function() require('fff').find_files_in_dir(vim.fn.expand('%:p:h')) end, desc = "Find Files /current", mode = { "n", "x" } },
+ { "", "lua Snacks.picker.buffers()", desc = "Buffers" },
+ { "", "lua Snacks.picker.grep()", desc = "Find word /project" },
+ { "", "lua Snacks.picker.grep_word()", desc = "Find under Visual selection or word" },
+ -- { "", function() require('fff').live_grep() end, desc = "Find word /project" },
+}
+--@end
+
+M.markview = --@markview
+{}
+--@end
+
+M.abstract_window = --@abstract_window
+{
+ mode = { "i", "n", "t" },
+ { "", function() require("abs").window().toggle.maximize() end, desc = "Window maximizer /toggle" },
+}
+--@end
+
+M.abstract_terminal = --@abstract_terminal
+{
+ mode = { "i", "n", "t" },
+ { "", group = _G.ABSTRACT_PLUGIN_GROUP.terminal },
+ { "", function() require("abs").terminal().toggle() end, desc = "Terminal /toggle" },
+ {
+ mode = { "t" },
+ { "n", function() require("abs").terminal().new() end, desc = "Open new terminal" },
+ { "", function() require("abs").terminal().prev() end, desc = "Goto previous terminal" },
+ { "", function() require("abs").terminal().next() end, desc = "Goto next terminal" },
+ },
+}
+--@end
+
+M.dap = --@dap
+{
+ { "d", group = _G.ABSTRACT_PLUGIN_GROUP.debug },
+ { "db", function() require('dap').toggle_breakpoint() end, desc = "Breakpoint /toggle" },
+ { "dc", function() require('dap').continue() end, desc = "Continue debug" },
+ { "di", function() require('dap').step_into() end, desc = "Step into" },
+ { "dl", function() require('dap').run_last() end, desc = "Run last" },
+ { "do", function() require('dap').step_out() end, desc = "Step out" },
+ { "dr", function() require('dap').repl.open() end, desc = "Open REPL" },
+ { "ds", function() require('dap').step_over() end, desc = "Step over" },
+ {
+ { "du", group = _G.ABSTRACT_PLUGIN_GROUP.ui },
+ { "dup", function() require('dap.ui.widgets').preview() end, desc = "Preview widget" },
+ {
+ "duf",
+ function()
+ local widgets = require('dap.ui.widgets')
+ widgets.centered_float(widgets.frames)
+ end,
+ desc = "Frames widget"
+ },
+ {
+ "duc",
+ function()
+ local widgets = require('dap.ui.widgets')
+ widgets.centered_float(widgets.scopes)
+ end,
+ desc = "Scopes widget"
+ },
+ },
+}
+--@end
+
+M.grapple = --@grapple
+{
+ { "g", group = _G.ABSTRACT_PLUGIN_GROUP.go },
+ { "gt", " Grapple open_tags", desc = "Show tags" },
+ { "gl", " Grapple open_loaded", desc = "Show loaded" },
+ { "gs", " Grapple open_scopes", desc = "Show scopes" },
+ { "ga", " Grapple toggle", desc = "Tag /toggle" },
+ { "gk", " Grapple toggle_tags", desc = "Tags /toggle" },
+ { "gK", " Grapple toggle_scopes", desc = "Scopes /toggle" },
+ { "gn", " Grapple cycle forward", desc = "Goto next tag" },
+ { "gp", " Grapple cycle backward", desc = "Goto previous tag" },
+ { "", " Grapple select index=1", desc = "Grapple select 1" },
+ { "", "