refactor: reorganize config and simplify README
Some checks are pending
Check Lua Formatting in MyRepo / Stylua Check (push) Waiting to run

This commit is contained in:
Jeremie Fraeys 2026-02-08 14:48:48 -05:00
parent 02e26b00b7
commit 4742e3a251
No known key found for this signature in database
10 changed files with 477 additions and 278 deletions

2
.gitignore vendored
View file

@ -2,6 +2,6 @@ tags
test.sh test.sh
.luarc.json .luarc.json
nvim nvim
lazy-lock.json
.DS_Store .DS_Store
.idea/

173
README.md
View file

@ -1,159 +1,36 @@
# kickstart.nvim # nvim
https://github.com/kdheepak/kickstart.nvim/assets/1813121/f3ff9a2b-c31f-44df-a4fa-8a0d7b17cf7b My personal Neovim configuration — built for ML/AI and backend development.
### Introduction Forked from [kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim) and evolved into something more opinionated.
A starting point for Neovim that is: ```bash
git clone https://git.jfraeys.com/jfraeysd/nvim.git ~/.config/nvim
* Small
* Single-file (with examples of moving to multi-file)
* Documented
* Modular
This repo is meant to be used by **YOU** to begin your Neovim journey; remove the things you don't use and add what you miss.
Kickstart.nvim targets *only* the latest ['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest ['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim. If you are experiencing issues, please make sure you have the latest versions.
Distribution Alternatives:
- [LazyVim](https://www.lazyvim.org/): A delightful distribution maintained by @folke (the author of lazy.nvim, the package manager used here)
### Installation
> **NOTE**
> [Backup](#FAQ) your previous configuration (if any exists)
Requirements:
* Make sure to review the readmes of the plugins if you are experiencing errors. In particular:
* [ripgrep](https://github.com/BurntSushi/ripgrep#installation) is required for multiple [telescope](https://github.com/nvim-telescope/telescope.nvim#suggested-dependencies) pickers.
* See [Windows Installation](#Windows-Installation) if you have trouble with `telescope-fzf-native`
Neovim's configurations are located under the following paths, depending on your OS:
| OS | PATH |
| :- | :--- |
| Linux | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` |
| MacOS | `$XDG_CONFIG_HOME/nvim`, '~/.config/nvim` |
| Windows | `%userprofile%\AppData\Local\nvim\` |
Clone kickstart.nvim:
```sh
# on Linux and Mac
git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim
# on Windows
git clone https://github.com/nvim-lua/kickstart.nvim.git %userprofile%\AppData\Local\nvim\
``` ```
### Post Installation ## What's Inside
Run the following command and then **you are ready to go**! **Core editing:** LSP via Mason, completion with nvim-cmp, Treesitter for syntax, autopairs, snippets
```sh **Navigation:** Telescope for fuzzy finding, Harpoon for quick file jumps
**Git:** Fugitive for operations, Gitsigns for inline blame/diff
**Debug:** nvim-dap with Python/Go support
**Aesthetics:** Custom theme setup with file tree and status line
## Languages
Python, Go, Rust, Lua, SQL, Bash — with LSP, linting, and formatting pre-configured.
## Updates
```bash
git -C ~/.config/nvim pull
nvim --headless "+Lazy! sync" +qa nvim --headless "+Lazy! sync" +qa
``` ```
### Recommended Steps ---
[Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo (so that you have your own copy that you can modify) and then installing you can install to your machine using the methods above.
> **NOTE**
> Your fork's url will be something like this: `https://github.com/<your_github_username>/kickstart.nvim.git`
### Configuration And Extension
* Inside of your copy, feel free to modify any file you like! It's your copy!
* Feel free to change any of the default options in `init.lua` to better suit your needs.
* For adding plugins, there are 3 primary options:
* Add new configuration in `lua/custom/plugins/*` files, which will be auto sourced using `lazy.nvim` (uncomment the line importing the `custom/plugins` directory in the `init.lua` file to enable this)
* Modify `init.lua` with additional plugins.
* Include the `lua/kickstart/plugins/*` files in your configuration.
You can also merge updates/changes from the repo back into your fork, to keep up-to-date with any changes for the default configuration.
#### Example: Adding an autopairs plugin
In the file: `lua/custom/plugins/autopairs.lua`, add:
```lua
-- File: lua/custom/plugins/autopairs.lua
return {
"windwp/nvim-autopairs",
-- Optional dependency
dependencies = { 'hrsh7th/nvim-cmp' },
config = function()
require("nvim-autopairs").setup {}
-- If you want to automatically add `(` after selecting a function or method
local cmp_autopairs = require('nvim-autopairs.completion.cmp')
local cmp = require('cmp')
cmp.event:on(
'confirm_done',
cmp_autopairs.on_confirm_done()
)
end,
}
```
This will automatically install [windwp/nvim-autopairs](https://github.com/windwp/nvim-autopairs) and enable it on startup. For more information, see documentation for [lazy.nvim](https://github.com/folke/lazy.nvim).
#### Example: Adding a file tree plugin
In the file: `lua/custom/plugins/filetree.lua`, add:
```lua
-- Unless you are still migrating, remove the deprecated commands from v1.x
vim.cmd([[ let g:neo_tree_remove_legacy_commands = 1 ]])
return {
"nvim-neo-tree/neo-tree.nvim",
version = "*",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
"MunifTanjim/nui.nvim",
},
config = function ()
require('neo-tree').setup {}
end,
}
```
This will install the tree plugin and add the command `:Neotree` for you. You can explore the documentation at [neo-tree.nvim](https://github.com/nvim-neo-tree/neo-tree.nvim) for more information.
### Contribution
Pull-requests are welcome. The goal of this repo is not to create a Neovim configuration framework, but to offer a starting template that shows, by example, available features in Neovim. Some things that will not be included:
* Custom language server configuration (null-ls templates)
* Theming beyond a default colorscheme necessary for LSP highlight groups
Each PR, especially those which increase the line count, should have a description as to why the PR is necessary.
### FAQ
* What should I do if I already have a pre-existing neovim configuration?
* You should back it up, then delete all files associated with it.
* This includes your existing init.lua and the neovim files in `~/.local` which can be deleted with `rm -rf ~/.local/share/nvim/`
* You may also want to look at the [migration guide for lazy.nvim](https://github.com/folke/lazy.nvim#-migration-guide)
* What if I want to "uninstall" this configuration:
* See [lazy.nvim uninstall](https://github.com/folke/lazy.nvim#-uninstalling) information
* Are there any cool videos about this plugin?
* Current iteration of kickstart (coming soon)
* Here is one about the previous iteration of kickstart: [video introduction to Kickstart.nvim](https://youtu.be/stqUbv-5u2s). Note the install via init.lua no longer works as specified. Please follow the install instructions in this file instead as they're up to date.
### Windows Installation
Installation may require installing build tools, and updating the run command for `telescope-fzf-native`
See `telescope-fzf-native` documentation for [more details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation)
This requires:
- Install CMake, and the Microsoft C++ Build Tools on Windows
```lua
{'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' }
```
Requires Neovim 0.10+, Git, and ripgrep.

79
lazy-lock.json Normal file
View file

@ -0,0 +1,79 @@
{
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
"CopilotChat.nvim": { "branch": "main", "commit": "69199d46b56f67a226789da256264c6291c4e63d" },
"LuaSnip": { "branch": "master", "commit": "5a1e39223db9a0498024a77b8441169d260c8c25" },
"atac.nvim": { "branch": "main", "commit": "31a23a02fb2bc8c85b0b572d05aa6cb09debb8e4" },
"auto-dark-mode.nvim": { "branch": "master", "commit": "e300259ec777a40b4b9e3c8e6ade203e78d15881" },
"cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
"cmp-cmdline": { "branch": "main", "commit": "d126061b624e0af6c3a556428712dd4d4194ec6d" },
"cmp-git": { "branch": "main", "commit": "b24309c386c9666c549a1abaedd4956541676d06" },
"cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
"cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
"conform.nvim": { "branch": "master", "commit": "c2526f1cde528a66e086ab1668e996d162c75f4f" },
"copilot.lua": { "branch": "master", "commit": "3faffefbd6ddeb52578535ec6b730e0b72d7fd1a" },
"diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
"fidget.nvim": { "branch": "main", "commit": "7fa433a83118a70fe24c1ce88d5f0bd3453c0970" },
"friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
"git-worktree.nvim": { "branch": "master", "commit": "f247308e68dab9f1133759b05d944569ad054546" },
"gitsigns.nvim": { "branch": "main", "commit": "1ce96a464fdbc24208e24c117e2021794259005d" },
"harpoon": { "branch": "harpoon2", "commit": "87b1a3506211538f460786c23f98ec63ad9af4e5" },
"indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" },
"jupytext.vim": { "branch": "master", "commit": "f15aff4515eb6a09afa0d7f41eb23be53c1e2e14" },
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
"lsp_signature.nvim": { "branch": "master", "commit": "0efb088dce050d38a3608ee69f80f2a62cf9849c" },
"lspkind-nvim": { "branch": "master", "commit": "c7274c48137396526b59d86232eabcdc7fed8a32" },
"lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" },
"marks.nvim": { "branch": "master", "commit": "f353e8c08c50f39e99a9ed474172df7eddd89b72" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "ae609525ddf01c153c39305730b1791800ffe4fe" },
"mason-nvim-dap.nvim": { "branch": "main", "commit": "9a10e096703966335bd5c46c8c875d5b0690dade" },
"mason-tool-installer.nvim": { "branch": "main", "commit": "443f1ef8b5e6bf47045cb2217b6f748a223cf7dc" },
"mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" },
"monokai.nvim": { "branch": "master", "commit": "b8bd44d5796503173627d7a1fc51f77ec3a08a63" },
"neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" },
"neogen": { "branch": "main", "commit": "23e7e9f883d01289ebd90e98025acc860ea26366" },
"neotest": { "branch": "master", "commit": "deadfb1af5ce458742671ad3a013acb9a6b41178" },
"neotest-gtest": { "branch": "main", "commit": "b66f1d33cbf3b37b9803e6bc7ef47ac60eba86b1" },
"neotest-python": { "branch": "master", "commit": "b0d3a861bd85689d8ed73f0590c47963a7eb1bf9" },
"nvim-autopairs": { "branch": "master", "commit": "59bce2eef357189c3305e25bc6dd2d138c1683f5" },
"nvim-cmp": { "branch": "main", "commit": "da88697d7f45d16852c6b2769dc52387d1ddc45f" },
"nvim-coverage": { "branch": "main", "commit": "a939e425e363319d952a6c35fb3f38b34041ded2" },
"nvim-dap": { "branch": "master", "commit": "e47878dcf1ccc30136b30d19ab19fe76946d61cd" },
"nvim-dap-go": { "branch": "main", "commit": "b4421153ead5d726603b02743ea40cf26a51ed5f" },
"nvim-dap-python": { "branch": "master", "commit": "1808458eba2b18f178f990e01376941a42c7f93b" },
"nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" },
"nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" },
"nvim-lint": { "branch": "master", "commit": "bcd1a44edbea8cd473af7e7582d3f7ffc60d8e81" },
"nvim-lspconfig": { "branch": "master", "commit": "66fd02ad1c7ea31616d3ca678fa04e6d0b360824" },
"nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" },
"nvim-notify": { "branch": "master", "commit": "8701bece920b38ea289b457f902e2ad184131a5d" },
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
"nvim-treesitter-context": { "branch": "master", "commit": "64dd4cf3f6fd0ab17622c5ce15c91fc539c3f24a" },
"nvim-treesitter-textobjects": { "branch": "main", "commit": "a0e182ae21fda68c59d1f36c9ed45600aef50311" },
"nvim-web-devicons": { "branch": "master", "commit": "746ffbb17975ebd6c40142362eee1b0249969c5c" },
"oil.nvim": { "branch": "master", "commit": "f55b25e493a7df76371cfadd0ded5004cb9cd48a" },
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
"refactoring.nvim": { "branch": "master", "commit": "6784b54587e6d8a6b9ea199318512170ffb9e418" },
"render-markdown.nvim": { "branch": "main", "commit": "48b4175dbca8439d30c1f52231cbe5a712c8f9d9" },
"schemastore.nvim": { "branch": "main", "commit": "ff73799fc8df725d51eada87a113581ba4d3717b" },
"solarized.nvim": { "branch": "master", "commit": "fe02ed49cc017cc93657bd6306a2624394611c69" },
"telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" },
"telescope-undo.nvim": { "branch": "main", "commit": "928d0c2dc9606e01e2cc547196f48d2eaecf58e5" },
"telescope.nvim": { "branch": "master", "commit": "3333a52ff548ba0a68af6d8da1e54f9cd96e9179" },
"todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
"toggleterm.nvim": { "branch": "main", "commit": "9a88eae817ef395952e08650b3283726786fb5fb" },
"trouble.nvim": { "branch": "main", "commit": "748ca2789044607f19786b1d837044544c55e80a" },
"undotree": { "branch": "master", "commit": "fc28931fbfba66ab75d9af23fe46ffbbb9de6e8c" },
"venv-selector.nvim": { "branch": "main", "commit": "26a6da0348dc2d0a3787e095bd4e68d976304bb2" },
"vim-dadbod": { "branch": "master", "commit": "6d1d41da4873a445c5605f2005ad2c68c99d8770" },
"vim-dadbod-completion": { "branch": "master", "commit": "a8dac0b3cf6132c80dc9b18bef36d4cf7a9e1fe6" },
"vim-dadbod-ui": { "branch": "master", "commit": "48c4f271da13d380592f4907e2d1d5558044e4e5" },
"vim-fugitive": { "branch": "master", "commit": "61b51c09b7c9ce04e821f6cf76ea4f6f903e3cf4" },
"vim-rhubarb": { "branch": "master", "commit": "5496d7c94581c4c9ad7430357449bb57fc59f501" },
"vim-slime": { "branch": "main", "commit": "2792879461d3f562a3a353f83ed0dc5dc3f5bb82" },
"vim-surround": { "branch": "master", "commit": "3d188ed2113431cf8dac77be61b842acb64433d9" },
"vimtex": { "branch": "master", "commit": "f707368022cdb851716be0d2970b90599c84a6a6" },
"wezterm.nvim": { "branch": "main", "commit": "032c33b621b96cc7228955b4352b48141c482098" },
"which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" },
"zen-mode.nvim": { "branch": "main", "commit": "8564ce6d29ec7554eb9df578efa882d33b3c23a7" }
}

View file

@ -1,67 +1,91 @@
-- Auto-format on save
vim.cmd([[
augroup FormatOnSave
autocmd!
autocmd BufWritePre * lua vim.lsp.buf.format({ async = false })
augroup END
]])
-- Augroup for Highlight on yank
vim.cmd([[
augroup YankHighlight
autocmd!
autocmd TextYankPost * lua vim.hl.on_yank()
augroup END
]])
-- Remove trailing whitespace
vim.cmd([[
augroup RemoveTrailingWhitespace
autocmd!
autocmd BufWritePre * %s/\s\+$//e
augroup END
]])
-- Append newline at EOF, excluding YAML files
vim.cmd([[
augroup append_newline_at_eof
autocmd!
autocmd BufWritePre * silent! if !empty(getline('$')) && getline('$') !~# '\n$' && &filetype != 'yaml' | call append(line('$'), '') | endif
augroup END
]])
local function augroup(name) local function augroup(name)
return vim.api.nvim_create_augroup('lazyvim_' .. name, { clear = true }) return vim.api.nvim_create_augroup('nvim_' .. name, { clear = true })
end end
-- Auto-format on save
vim.api.nvim_create_autocmd('BufWritePre', {
group = augroup('format_on_save'),
pattern = '*',
callback = function()
vim.lsp.buf.format({ async = false })
end,
desc = 'Auto-format on save with LSP',
})
-- Highlight on yank
vim.api.nvim_create_autocmd('TextYankPost', {
group = augroup('highlight_yank'),
callback = function()
vim.hl.on_yank()
end,
desc = 'Highlight yanked text',
})
-- Remove trailing whitespace
vim.api.nvim_create_autocmd('BufWritePre', {
group = augroup('remove_trailing_whitespace'),
pattern = '*',
command = [[%s/\s\+$//e]],
desc = 'Remove trailing whitespace on save',
})
-- Append newline at EOF (excluding YAML)
vim.api.nvim_create_autocmd('BufWritePre', {
group = augroup('append_newline_eof'),
pattern = '*',
callback = function()
local last_line = vim.fn.getline('$')
local ft = vim.bo.filetype
if last_line ~= '' and not last_line:match('\n$') and ft ~= 'yaml' then
vim.fn.append(vim.fn.line('$'), '')
end
end,
desc = 'Append newline at EOF (except YAML)',
})
-- Auto-update plugins on startup
vim.api.nvim_create_autocmd('VimEnter', { vim.api.nvim_create_autocmd('VimEnter', {
group = augroup('autoupdate'), group = augroup('autoupdate'),
callback = function() callback = function()
if require('lazy.status').has_updates() then local ok, lazy_status = pcall(require, 'lazy.status')
if ok and lazy_status.has_updates() then
require('lazy').update({ show = false }) require('lazy').update({ show = false })
end end
end, end,
desc = 'Auto-update plugins on startup',
}) })
-- Sync plugins after lazy check
vim.api.nvim_create_autocmd('User', { vim.api.nvim_create_autocmd('User', {
pattern = 'LazyCheck', pattern = 'LazyCheck',
-- pattern = "LazyVimStarted", group = augroup('lazy_sync'),
desc = 'Update lazy.nvim plugins',
callback = function() callback = function()
vim.schedule(function() vim.schedule(function()
require('lazy').sync({ wait = false, show = false }) require('lazy').sync({ wait = false, show = false })
end) end)
end, end,
desc = 'Sync plugins after LazyCheck',
}) })
-- Terminal buffer settings
vim.api.nvim_create_autocmd('TermOpen', { vim.api.nvim_create_autocmd('TermOpen', {
group = augroup('terminal_settings'),
pattern = '*', pattern = '*',
group = vim.api.nvim_create_augroup('custom-term-open', { clear = true }),
desc = 'Automatically start insert mode in terminal buffers',
callback = function() callback = function()
vim.cmd('startinsert') vim.cmd('startinsert')
vim.cmd('setlocal nonumber norelativenumber') vim.wo.number = false
vim.wo.relativenumber = false
vim.cmd('normal! G') vim.cmd('normal! G')
vim.cmd('tnoremap <esc><esc> <c-\\><c-n>')
end, end,
desc = 'Terminal buffer auto-insert and no line numbers',
})
-- Terminal mode escape mapping (applied per buffer)
vim.api.nvim_create_autocmd('TermOpen', {
group = augroup('terminal_escape'),
pattern = '*',
callback = function()
vim.keymap.set('t', '<esc><esc>', '<c-\\><c-n>', { buffer = true, desc = 'Exit terminal mode' })
end,
desc = 'Terminal escape mapping',
}) })

View file

@ -39,35 +39,18 @@ vim.keymap.set('n', '[q', '<cmd>lprev<CR>zz', { desc = 'Location List Prev' })
vim.keymap.set('n', '<leader>bn', '<cmd>bnext<CR>zz', { desc = 'Quick Nav Buf Next' }) vim.keymap.set('n', '<leader>bn', '<cmd>bnext<CR>zz', { desc = 'Quick Nav Buf Next' })
vim.keymap.set('n', '<leader>bp', '<cmd>bprev<CR>zz', { desc = 'Quick Nav Buf Prev' }) vim.keymap.set('n', '<leader>bp', '<cmd>bprev<CR>zz', { desc = 'Quick Nav Buf Prev' })
vim.keymap.set('n', '<leader>bd', '<cmd>bdelete<CR>', { desc = 'Quick Nav Buf Delete' }) vim.keymap.set('n', '<leader>bd', '<cmd>bdelete<CR>', { desc = 'Quick Nav Buf Delete' })
vim.keymap.set('n', '<leader>bs', '<cmd>split<CR>', { desc = 'Openn Buf Horizontal Split' }) vim.keymap.set('n', '<leader>bs', '<cmd>split<CR>', { desc = 'Open Buf Horizontal Split' })
vim.keymap.set('n', '<leader>bv', '<cmd>vsp<CR>', { desc = 'Open Buf Vertical Split' }) vim.keymap.set('n', '<leader>bv', '<cmd>vsp<CR>', { desc = 'Open Buf Vertical Split' })
-- vim.keymap.set('n', '<leader>bt', function()
-- vim.cmd.vnew()
-- vim.cmd.term()
-- vim.cmd.wincmd('J')
-- vim.api.nvim_win_set_height(0, 15)
-- end, { desc = 'Open Buf in Terminal' })
-- -- open terminal for R and Python
-- vim.keymap.set('n', '<leader>bR', '<cmd>terminal R<CR>', { desc = 'Open R Terminal' })
-- vim.keymap.set('n', '<leader>bP', '<cmd>terminal python<CR>', { desc = 'Open Python Terminal' })
-- Editing Keymaps -- Editing Keymaps
vim.keymap.set('x', '<leader>p', [["_dP"]], { desc = 'Paste without register' }) vim.keymap.set('x', '<leader>p', [["_dP"]], { desc = 'Paste without register' })
vim.keymap.set({ 'n', 'v' }, '<leader>D', [["_d"]], { desc = 'Delete without register' }) vim.keymap.set({ 'n', 'v' }, '<leader>D', [["_d"]], { desc = 'Delete without register' })
vim.keymap.set({ 'n', 'v' }, '<leader>y', '"+y', { desc = 'Copy to + register' }) vim.keymap.set({ 'n', 'v' }, '<leader>y', '"+y', { desc = 'Copy to + register' })
vim.keymap.set('n', '<leader>Y', '"+Y') vim.keymap.set('n', '<leader>Y', '"+Y')
-- replace current word in current scope
vim.keymap.set(
'n',
'<leader>rw',
':%s/\\<<C-r><C-w>\\>/<C-r><C-w>/gI<Left><Left><Left>',
{ desc = '[R]eplace Current [W]ord in Current Scope' }
)
-- replace current word in file scope -- replace current word in file scope
vim.keymap.set( vim.keymap.set(
'n', 'n',
'<leader>rW', '<leader>rw',
':%s/\\<<C-r><C-w>\\>/<C-r><C-w>/gI<Left><Left><Left>', ':%s/\\<<C-r><C-w>\\>/<C-r><C-w>/gI<Left><Left><Left>',
{ desc = '[R]eplace Current [W]ord in File Scope' } { desc = '[R]eplace Current [W]ord in File Scope' }
) )
@ -130,33 +113,3 @@ vim.keymap.set('n', '<leader>fp', function()
cwd = vim.fs.joinpath(vim.fn.stdpath('data'), 'lazy'), cwd = vim.fs.joinpath(vim.fn.stdpath('data'), 'lazy'),
}) })
end, { desc = '[F]ind [P]lugin Files' }) end, { desc = '[F]ind [P]lugin Files' })
-- local runner = require("quarto.runner")
-- vim.keymap.set('n', '<leader>qrc', runner.run_cell, { desc = '[R]un [C]ell', silent = true })
-- vim.keymap.set('n', '<leader>qra', runner.run_above, { desc = '[R]un cell and [A]bove', silent = true })
-- vim.keymap.set('n', "<leader>qrA", runner.run_all, { desc = "run all cells", silent = true })
-- vim.keymap.set('n', "<leader>qrl", runner.run_line, { desc = "run line", silent = true })
-- vim.keymap.set('v', '<leader>qr', runner.run_range, { desc = "run visual range", silent = true })
-- vim.keymap.set('n', '<leader>qRA', function()
-- runner.run_all(true)
-- end, { desc = "run all cells of all languages", silent = true })
-- Refactoring Keymaps
-- vim.keymap.set({ "x" }, "<leader>re", [[<Esc><Cmd>lua require('refactoring').refactor('Extract Function')<CR>]],
-- { noremap = true, silent = true, expr = false, desc = "Extract Function" })
-- vim.keymap.set(
-- { "x" },
-- "<leader>rf", [[<Esc><Cmd>lua require('refactoring').refactor('Extract Function To File')<CR>]],
-- { noremap = true, silent = true, expr = false, desc = "Extract Function To File" }
--)
-- vim.keymap.set({ "x" }, "<leader>rv", [[<Esc><Cmd>lua require('refactoring').refactor('Extract Variable')<CR>]],
-- { noremap = true, silent = true, expr = false, desc = "Extract Variable" })
-- vim.keymap.set({ "n" }, "<leader>rI", [[<Cmd>lua require('refactoring').refactor('Inline Variable')<CR>]],
-- { noremap = true, silent = true, expr = false, desc = "Inline Variable" })
-- vim.keymap.set({ "n", "x" }, "<leader>ri", [[<Esc><Cmd>lua require('refactoring').refactor('Inline Variable')<CR>]],
-- { noremap = true, silent = true, expr = false, desc = "Inline Variable" })
--
-- vim.keymap.set({ "n" }, "<leader>rb", [[<Esc><Cmd>lua require('refactoring').refactor('Extract Block')<CR>]],
-- { noremap = true, silent = true, expr = false, desc = "Extract Block" })
-- vim.keymap.set({ "n" }, "<leader>rbf", [[<Esc><Cmd>lua require('refactoring').refactor('Extract Block To File')<CR>]],
-- { noremap = true, silent = true, expr = false, desc = "Extract Block To File" })

View file

View file

@ -1,18 +1,17 @@
-- Function to get the current visual selection ---Get the current visual selection
---@return string The selected text or empty string if no selection
local function get_visual_selection() local function get_visual_selection()
vim.cmd('noau normal! "vy"') vim.cmd('noau normal! "vy"')
local text = vim.fn.getreg('v') local text = vim.fn.getreg('v')
-- optional: clear register v
-- vim.fn.setreg('v', '')
text = text:gsub('\n$', '') -- remove trailing newline text = text:gsub('\n$', '') -- remove trailing newline
return text return text
end end
-- Function to get the current search query ---Get the search query (visual selection or word under cursor)
---@return string The query to search for
local function get_search_query() local function get_search_query()
local word_under_cursor = vim.fn.expand('<cword>') local word_under_cursor = vim.fn.expand('<cword>')
local visual_selection = get_visual_selection() -- call local function directly local visual_selection = get_visual_selection()
return visual_selection ~= '' and visual_selection or word_under_cursor return visual_selection ~= '' and visual_selection or word_under_cursor
end end

View file

@ -1,4 +0,0 @@
return {
'numToStr/Comment.nvim',
opts = {},
}

View file

@ -14,36 +14,6 @@ return {
{ 'j-hui/fidget.nvim', opts = {}, event = 'LspAttach' }, { 'j-hui/fidget.nvim', opts = {}, event = 'LspAttach' },
{ 'ray-x/lsp_signature.nvim', event = 'LspAttach' }, { 'ray-x/lsp_signature.nvim', event = 'LspAttach' },
-- Treesitter
{
'nvim-treesitter/nvim-treesitter',
build = ':TSUpdate',
event = 'BufReadPost',
opts = {
highlight = { enable = true },
indent = { enable = true },
ensure_installed = {
'bash',
'c',
'cpp',
'go',
'html',
'julia',
'lua',
'markdown',
'python',
'rust',
'sql',
'vim',
'vimdoc',
'yaml',
'zig',
},
},
config = true,
},
{ 'nvim-treesitter/nvim-treesitter-textobjects', event = 'BufReadPost' },
-- Python venv selector -- Python venv selector
{ {
'linux-cultist/venv-selector.nvim', 'linux-cultist/venv-selector.nvim',

View file

@ -0,0 +1,301 @@
local M = {}
---Check if path exists
---@param p string|nil
---@return boolean
local function path_exists(p)
return p and p ~= '' and vim.uv.fs_stat(p) ~= nil
end
---Get Mason binary path
---@param name string
---@return string
local function mason_bin(name)
local p = vim.fs.joinpath(vim.fn.stdpath('data'), 'mason', 'bin', name)
if path_exists(p) then
return p
end
return name
endx
---Find Julia binary
---@return string
local function julia_bin()
local home = vim.env.HOME or ''
local candidates = {
vim.fn.exepath('julia'),
vim.fs.joinpath(home, '.juliaup', 'bin', 'julia'),
'/opt/homebrew/bin/julia',
'/usr/local/bin/julia',
}
for _, p in ipairs(candidates) do
if path_exists(p) then
return p
end
end
return 'julia'
end
local julia_cmd = julia_bin()
local julia_ls_project = vim.fn.expand('~/.julia/environments/nvim-lsp')
-- Servers that should provide formatting
M.format_enabled_servers = {
bashls = true,
clangd = true,
gopls = true,
html = true,
htmx = true,
jsonls = true,
lua_ls = true,
marksman = true,
pyright = true,
ruff = true,
rust_analyzer = true,
taplo = true,
texlab = true,
yamlls = true,
zls = true,
}
-- Server-specific configurations
M.servers = {
bashls = {
filetypes = { 'sh', 'bash', 'zsh' },
},
html = {
filetypes = { 'html', 'htmldjango' },
init_options = {
configurationSection = { 'html', 'css', 'javascript' },
embeddedLanguages = {
css = true,
javascript = true,
},
},
},
htmx = {
cmd = { 'htmx-lsp' },
filetypes = { 'html', 'htmx' },
},
gopls = {
settings = {
gopls = {
gofumpt = true,
staticcheck = true,
completeUnimported = true,
usePlaceholders = true,
analyses = { unusedparams = true },
},
},
},
clangd = {
cmd = {
'clangd',
'--background-index',
'--clang-tidy',
'--header-insertion=iwyu',
'--completion-style=detailed',
'--header-insertion-decorators',
'--query-driver=/usr/bin/clang,/usr/bin/clang++',
'--enable-config',
},
settings = {
formatting = true,
inlayHints = {
designators = true,
enabled = true,
parameterNames = true,
deducedTypes = true,
},
},
filetypes = { 'c', 'cpp', 'objc', 'objcpp', 'h', 'hpp', 'hxx' },
},
marksman = {
filetypes = { 'markdown' },
settings = {
marksman = {
extensions = { 'mdx' },
},
},
},
jsonls = {
cmd = { 'vscode-json-language-server', '--stdio' },
settings = {
json = {
validate = { enable = true },
},
},
},
julials = {
filetypes = { 'julia' },
cmd = {
julia_cmd,
'--project=' .. julia_ls_project,
'--startup-file=no',
'--history-file=no',
'-e',
[[
using Logging
using LanguageServer
using SymbolServer
global_logger(ConsoleLogger(stderr, Logging.Warn))
function project_path()
try
return LanguageServer.find_project_path(pwd())
catch
return pwd()
end
end
depot_path = get(ENV, "JULIA_DEPOT_PATH", "")
server = LanguageServer.LanguageServerInstance(
stdin,
stdout,
something(project_path(), pwd()),
depot_path,
)
server.runlinter = true
run(server)
]],
},
settings = {
julia = {
lint = {
run = true,
},
},
},
},
pyright = {
settings = {
python = {
analysis = {
autoSearchPaths = true,
diagnosticMode = 'workspace',
useLibraryCodeForTypes = true,
typeCheckingMode = 'none',
reportGeneralTypeIssues = false,
},
},
},
},
ruff = {
filetypes = { 'python' },
on_init = function()
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('lsp_attach_disable_ruff_hover', { clear = true }),
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
if client and client.name == 'ruff' then
client.server_capabilities.hoverProvider = false
end
end,
desc = 'LSP: Disable hover capability from Ruff',
})
end,
},
rust_analyzer = {
settings = {
['rust-analyzer'] = {
imports = { granularity = { group = 'module' }, prefix = 'self' },
cargo = { buildScripts = { enable = true } },
procMacro = { enable = true },
checkOnSave = { command = 'clippy' },
},
},
},
taplo = {
filetypes = { 'toml' },
},
yamlls = {
settings = {
yaml = {
schemaStore = { enable = true },
validate = true,
},
},
},
texlab = {
filetypes = { 'tex', 'plaintex', 'bib', 'cls', 'sty' },
settings = {
texlab = {
build = {
onSave = false,
},
diagnostics = {
ignoredPatterns = {
'^Overfull \\hbox',
'^Underfull \\hbox',
'^Package.*Warning',
},
},
auxDirectory = 'output',
},
},
},
lua_ls = {
cmd = { mason_bin('lua-language-server') },
settings = {
Lua = {
workspace = { checkThirdParty = false },
telemetry = { enable = false },
diagnostics = { globals = { 'vim' } },
},
},
},
sqls = {
filetypes = { 'sql', 'mysql', 'plsql', 'postgresql' },
settings = {
sql = {
connections = {
{
driver = 'sqlite3',
dataSourceName = 'file::memory:?cache=shared',
},
},
},
},
on_init = function(client)
local root_dir = client.config.root_dir or vim.fn.getcwd()
local db_files = vim.fn.globpath(root_dir, '*.db', false, true)
vim.list_extend(db_files, vim.fn.globpath(root_dir, '*.sqlite', false, true))
if #db_files > 0 then
local connections = {}
for _, path in ipairs(db_files) do
table.insert(connections, {
driver = 'sqlite3',
dataSourceName = vim.fn.fnamemodify(path, ':p'),
})
end
client.config.settings.sql.connections = connections
client.notify('workspace/didChangeConfiguration', { settings = client.config.settings })
end
end,
},
zls = {
filetypes = { 'zig' },
},
}
return M