Last updated: 2026-04-13 17:14 UTC
| Hello! I wanted to say thank you for all of the amazing feedback I got on the first post, it’s been a blast playing with everyone and iterating on the app! Lots of the feedback I got from the first post was from new players wanting to improve their VIM skills. One of the main reasons I created VIM_GYM was to help new users, so I focused efforts on improving the experience for them. New Feature: Match Review After completing a Multiplayer or Practice match, review your keypresses per task and compare to our algorithmically generated key sequence for completion. Each task has a playground editor where you can test these different ways to solve the task. Note this sequence is not always the most efficient way to solve, it’s intended to show a variety of different ways to approach a task. Hoping this helps people learn and improve their speed + key efficiency! Practice mode Cheatsheet + Hints: For people just getting started with VIM, I’ve added a small menu explaining simple commands to help get started. Also for any given task, you can see our recommended sequence as a toggle-able hint. Leaderboard: Added a simple leaderboard showing the fastest times this week, month and all time. You can play the same tasks of those on the leaderboard. Note: any replayed tasks do not qualify, it must be a fresh set of tasks. I realize there may be some luck involved lol. I'm currently holding the all time high score of 13.3 seconds (username THE_DEV I promise its me). Come get some! Last time reddit feedback was very helpful in finding bugs and improving, if anything breaks or doesn't work how you think it should, definitely leave it in the comments! Github: https://github.com/Swaggermuffin64/VIM_GYM/tree/main Give it a try! https://vimgym.app [link] [comments] |
| Hello! A new plugin in the series of "tiny" ones. This time, it's really tiny: a floating cmdline window centered on the screen, similar to noice.nvim, for Neovim 0.12+, using the new ui2 module. It works with native completion, mini.cmdline, blink.cmp, and nvim-cmp. Here's the link: https://github.com/rachartier/tiny-cmdline.nvim If you find any bugs, have suggestions, or encounter issues, feel free to open an issue on the repo. Thanks for reading ! [link] [comments] |
Whenever I did a config change, I was never that bothered with quitting Neovim and re-opening it. But this new :restart command feels like such a huge step up. Thank you Neovim team!
It's so nice restarting Neovim in-place and see the changes right away.
Sharing my keymap that restarts Neovim in-place while preserving the window layout, buffers, and cursor position:
lua vim.keymap.set('n', '<leader>R', function() local session = vim.fn.stdpath('state') .. '/restart_session.vim' vim.cmd('mksession! ' .. vim.fn.fnameescape(session)) vim.cmd('restart source ' .. vim.fn.fnameescape(session)) end, { desc = 'Restart Neovim' })
| I've been chasing the right theme for a while. Most things are either too saturated, too blue, or they look great in screenshots and feel wrong after an hour of actual work. So I eventually just made one. It's called Ember. Dark warm graphite base, muted earth tones, and a single coral accent. Pretty restrained, most syntax stays close to foreground and the accent only shows up where it matters. I tuned the palette in CIELAB rather than HSL, which sounds pretentious but it genuinely makes a difference in how balanced it feels across different lighting. Three variants: dark, soft dark, and light. Treesitter, LSP, telescope, snacks, blink, neotree, gitsigns, lualine all covered. https://github.com/ember-theme/nvim Fun fact: I originally built this for Emacs because there aren't enough good themes there. Then I ported it to Neovim. Make of that what you will. [link] [comments] |
I moved away from nvim-treesitter a while ago. The reason actually was that after switching from master to main branch some of my parsers stopped working, so I decided to figure out how to set up these myself. And it was actually pretty simple.
First thing you need is tree-sitter-cli, I've installed it with brew install tree-sitter-cli. Then:
tree-sitter-<lang>. As an example, I will take Go language, the parser is heregit clone https://github.com/tree-sitter/tree-sitter-go ~/my/location/tree-sitter-gocd ~/my/location/tree-sitter-gotree-sitter generatetree-sitter build.so or .dylib file. In my case, it's go.dylibmv go.dylib ~/.config/nvim/parser/go.dylib. The name of the parser should be the same as language name (open any file in neovim and type :echo &filetype to get the name):checkhealth vim.treesitter. Neovim should find this new parser you've builtqueries/ dir, but usually it's better to download them from nvim-treesitter repo. There are more queries for folding, injections, etc. The easiest way for me was to:
git clone https://github.com/nvim-treesitter/nvim-treesitter ~/my/location/nvim-treesitter cd !$ cp -r runtime/queries ~/.config/nvim/queries Done!
| Hey vimmers, Time to share yet another exciting feature of nvim-dap-view: inline values for variables. This feature isn't exactly new in the neovim ecosystem, nvim-dap-virtual-text had it for years. Nonetheless, I thought it would be cool to have it bundled with nvim-dap-view (I'm in the "remove plugins" crowd). So I basically took nvim-dap-virtual-text's code, cleaned it up a bunch and added some features: moved to asynchronous treesitter parsing and added custom highlights based on the variable's type. This "custom highlights" feature actually uses a new feature from 0.12: the "dim" terminal attribute (looks really nice with foot, haven't tested other environments). Do note that this isn't a 1:1 reimplementation of nvim-dap-virtual-text, lots of configuration options are missing. If you need anything, please, open a feature request. To reiterate: this specific feature requires 0.12 Happy debugging. [link] [comments] |
| Hello folks, Been a while since I did anything meaningful with this silly project but I just pushed a few updates and figured I'd share. https://github.com/josephburgess/nvumi nvumi pipes numi-cli into a scratch buffer. You can type natural language expressions (e.g. 20 inches in cm, 10% of 340, today + 3 weeks, etc ) and see answers as virtual text as you type. You can also create custom conversion ratios and mathematical functions to add your own calculation logic (examples/recipes on the wiki here) I originally built it about a year ago, inspired by the lua code runner in u/folke's Snacks.scratch buffer. I really wanted to learn a bit more of the internals of neovim and lua plugin development and it felt like a fun way to do that. With the release of 0.12 recently I wanted to make sure this thing still worked and for the most part there was nothing broken, but while I was at it I decided to try and implement one of the goals I'd hoped to figure out last year before getting distracted, which was to get rid of the hard dependency on snacks and draw my own scratch buffer. I'd been putting this off last year assuming it would be a pain but it actually turned out to be surprisingly straightforward to use `nvim_create_buf` and `nvim_open_win` to contain the thing and I wish I'd done it sooner.. It's still a bit of a novelty project that, at most, you'll probably try once/star it and swiftly forget about, but I learned a lot building it and thought I'd share! [link] [comments] |
Hey vimmers,
Sorry if the successive posts feel spammy.
After an overwhelmingly negative response in my last post, I'm here to inform you that nvim-dap-view switched to GPL v3. That's it.
As a reminder of my commitment to transparency, I encourage you guys to take a look at the acknowledgements page.
Thanks.
I just started to look at Nvim 0.12's changes, and it includes a new ui2 module, an experimental replacement for the message and cmdline UIs. I current use Noice and just feel indifferent at the thought of trying it, but what are your thoughts?
Edit: Now includes queries. Open, non-plugin specific query repo at arborist-ts/queries.
I built a pretty no-nonsense Tree-sitter (TS) parser manager I’m calling Arborist. Find it here: arborist-ts/arborist.nvim.
Arborist is a WASM-first, native-second tree-sitter parser manager for Neovim 0.12+. Parsers (plus nvim highlights, folds, indents, injections, and locals) install automatically when you open files. No manual steps, no maintenance.
Install:
vim.pack.add({ "https://github.com/arborist-ts/arborist.nvim", })
Works out of the box with no setup call. I designed it to be as fire and forget as possible.
OPEN REGISTRY AND QUERIES:
I firmly believe the TS registry deserves its own home which can be used by many different projects, which I started here: arborist-ts/registry. Similarly, queries deserve their own non-plugin-specific home, which is here: arborist-ts/queries. These are both independent of arborist-ts/arborist.nvim, and can (and should!) be used by other plugins.
Feedback, bug reports, and contributions all extremely welcome.
Anyone interested in joining the arborist-ts organization to help with maintenance of the plugin, the parser registry, and the queries? Please just ask. This will take a village.
| submitted by /u/TheTwelveYearOld [link] [comments] |
| I'd like to share carvion.nvim, a colorscheme I've been working on this week, inspired by the Vesper theme from VS Code. It's still a work in progress and there are details to refine and plugins that still need support, but I didn't want to wait until everything was perfect to share it. I'd like to keep improving it little by little with feedback from the community. If you decide to try it, any comments or suggestions are more than welcome. Repository: https://github.com/zitrocode/carvion.nvim [link] [comments] |
| Hey there, Now you can access Obsidian Sync service through obsidian.nvim, via For more info, see the wiki page This update is just the core of the support, there are some other directions that I want to explore, like when in conflict mode and there's conflict files, prompt and load the conflicts into quickfix, or running one shot sync on save instead of just one continuous process per workspace. Anyway I've been using this setup for the past week and it feels pretty nice and stable. Huge thanks to the folks who supported me via open collective in response to my previous post, which pays for my sync subscription, and the amazing obsidian team that makes this feature possible. [link] [comments] |
my neovim config used to be 800+ lines. i was collecting plugins like pokemon. had a plugin for everything. half of them overlapping, some of them i configured once and never touched again.
about 6 months ago i nuked everything and started over with just the stuff i actually use. went from 40+ plugins down to 12. the editor loads faster and i actually understand my config now. also stopped spending friday nights debugging why some keymap stopped working after an update which is a bonus.
the plugin that survived every purge for me is telescope. i tried replacing it twice, once with fzf-lua and once with just going back to fzf.vim. kept coming back. the live grep through the entire project while previewing matches is something i use probably 50 times a day. it's muscle memory at this point.
second one is treesitter but that barely counts since it's basically part of neovim now.
what's the one plugin you'd keep if you had to mass-delete everything else? not your whole config, just the one thing you'd rebuild around.
| 80 million lines is crazy! My craptop tanked it somehow and I didn't even notice. Is this what you get from running neovim with [link] [comments] |
Hello folks,
Roughly speaking, neovim users fall into one of two categories: those who consider vim to be "another tool" in their "toolbox", along with, e.g., CLI tools, and those who mostly like to do everything directly from vim. Of course, most users do not fall completely into one extreme (or the other), and there are more complex scenarios (what about a plugin that just wraps a TUI app?). By the sheer amount of people in both "camps", you'd think both are approximately "equivalent" in terms of user experience.
However, there's a scenario where doing everything from vim has a clear benefit: LSP file operations. These are (either) requests (or notifications) the client (neovim) sends after it detects a change in the file system. Most commonly, these are leveraged by "file explorer" plugins, such as oil.nvim. In practical terms, what happens is that when you rename* a file, its imports are automatically updated (thanks to the language server). Nothing stops you from also leveraging this capability with an external file explorer, by hooking up events and communicating with neovim over RPC (for instance), but that does sound much more complex than using a "file explorer" plugin (curious to see if any wrappers, like yazi.nvim, have implemented such plumbing).
Not every file explorer ships this feature natively, though. Some solutions have been built around that, namely, nvim-lsp-file-operations (and a snacks' module). I had been using the former basically since its inception (and then, my own fork for like a year), but I was wondering if the nvim-tree guys wanted to support this feature natively, and, as it turns out, they do! Which lead me to, eventually, make my own implementation. But I never got to submitting the PR. If you're a nvim-tree user who's missing this feature, let me know, and I may take this over the finish line. If anyone else is interested in yoinking my code and submitting the patch themselves, feel free to do so!
*: Create or delete as well, depends on the LS's capabilities
| Little disclaimer. What’s “more intuitive” for me may not be “more intuitive” for you. Also, the title says “Vim” but everything here is applicable in Neovim. With that out of the way, let’s learn something cool! [link] [comments] |
I have seen so many posts saying that oil is a MUST have plugin and have tried to use it on multiple occasions and just haven't seen what's so great. It may just be how I use neovim but does anyone else feel this way?
UPDATE: I moved back to the archived version nvim-treesitter/nvim-treesiter after realizing that my move to this project may or may have not been premature. Will have to wait and see for a few more weeks how things develop.
Had to install plenary.nvim and a few query-only parsers to fix errors in :checkhealth and have been living happily ever after.
vim.pack
-- Treesitter { src = 'https://github.com/nvim-lua/plenary.nvim' }, { src = 'https://github.com/neovim-treesitter/nvim-treesitter' }, { src = 'https://github.com/nvim-treesitter/nvim-treesitter-textobjects' }, { src = 'https://github.com/nvim-treesitter/nvim-treesitter-context' }, my treesitter config
-- Treesitter require('nvim-treesitter').setup({ install_dir = vim.fn.stdpath('data') .. '/site', }) -- jsonc uses the json parser vim.treesitter.language.register('json', { 'jsonc' }) local parsers = { 'bash', 'css', 'diff', 'dtd', 'ecma', 'editorconfig', 'fish', 'git_config', 'git_rebase', 'gitattributes', 'gitcommit', 'gitignore', 'hcl', 'html', 'html_tags', 'javascript', 'jsdoc', 'json', 'jsx', 'latex', 'lua', 'make', 'markdown', 'markdown_inline', 'python', 'query', 'regex', 'scss', 'toml', 'tsx', 'typescript', 'typst', 'vim', 'vimdoc', 'xml', 'yaml', 'yang', } -- Install parsers after startup vim.schedule(function() require('nvim-treesitter').install(parsers) end) -- Textobjects (selection handled by mini.ai, movement by treesitter-textobjects) require('nvim-treesitter-textobjects').setup({ move = { set_jumps = true, }, }) local map = vim.keymap.set -- Movement map({ 'n', 'x', 'o' }, ']f', function() require('nvim-treesitter-textobjects.move').goto_next_start('@function.outer', 'textobjects') end, { desc = 'next function start' }) map({ 'n', 'x', 'o' }, '[f', function() require('nvim-treesitter-textobjects.move').goto_previous_start('@function.outer', 'textobjects') end, { desc = 'previous function start' }) map({ 'n', 'x', 'o' }, ']F', function() require('nvim-treesitter-textobjects.move').goto_next_end('@function.outer', 'textobjects') end, { desc = 'next function end' }) map({ 'n', 'x', 'o' }, '[F', function() require('nvim-treesitter-textobjects.move').goto_previous_end('@function.outer', 'textobjects') end, { desc = 'previous function end' }) map({ 'n', 'x', 'o' }, ']k', function() require('nvim-treesitter-textobjects.move').goto_next_start('@class.outer', 'textobjects') end, { desc = 'next class start' }) map({ 'n', 'x', 'o' }, '[k', function() require('nvim-treesitter-textobjects.move').goto_previous_start('@class.outer', 'textobjects') end, { desc = 'previous class start' }) map({ 'n', 'x', 'o' }, ']K', function() require('nvim-treesitter-textobjects.move').goto_next_end('@class.outer', 'textobjects') end, { desc = 'next class end' }) map({ 'n', 'x', 'o' }, '[K', function() require('nvim-treesitter-textobjects.move').goto_previous_end('@class.outer', 'textobjects') end, { desc = 'previous class end' }) -- Context require('treesitter-context').setup({ line_numbers = true, max_lines = 3, min_window_height = 20, }) map('n', 'gC', function() require('treesitter-context').go_to_context() end, { desc = 'go to context' }) I got into nvim partly because of watching ThePrimagen. Therefor one of the first plugins i've used was harpoon. I never used it a lot, since most of my navigation is done through telescope, but recently I value direct file swaps a little bit more. I've been doing this with the native nvim mark system
The first change I made was setting up some file markers for global marks, e.g. 'mT' for going to my .../todo.md via "'T". That's kinda nice already, but it doesn't drop you were you left the buffer.
There are two interesting marks already set by nvim '" and '.
These go to the last point you exited the buffer (") or to the last edit of the buffer (.). Thats handy.
Since 'T'" is a mouthful and i don't really see the value of swapping to my marks without going to the location I left I set a keymap to do both commands in one
-- in my init.lua -- Instead of jumping to the mark at the file jump to the file and go to the last exit of the buffer local function remap_uppercase_marks() for i = string.byte("A"), string.byte("Z") do local mark = string.char(i) vim.keymap.set("n", "'" .. mark, function() vim.cmd("normal! '" .. mark) vim.cmd([[normal! '"]]) end, { noremap = true, silent = true }) end end remap_uppercase_marks() If you want to go exactly where you set the mark there is still the backtick `T which brings you exactly were you set the mark.
But harpoon has another feature, which is project wide marks instead of global marks.
Most of my projects already have a .nvim.lua in their root. For those of you who dont know, the file is run at nvim startup when running nvim from this directory or a child. Just make sure to run :trust before and let nvim know you are using this kind of setup with
--in init.lua vim.o.exrc = true -- <- Nvim will execute any .nvim.lua, .nvimrc, or .exrc file found in the |current-directory| and all parent directories (ordered upwards), if the files are in the |trust| list. vim.o.secure = true -- <- - *'secure'* : Everything is allowed in 'exrc' files, because they must be explicitly marked as "trusted". Its perfect to set project wide settings. To have project wide marks I add
-- .nvim.lua local function set_file_mark(mark, filepath) local bufnr = vim.fn.bufadd(filepath) vim.fn.setpos("'" .. mark, { bufnr, 1, 1, 0 }) end set_file_mark("M", "main.py") set_file_mark("A", "foo/add.py") To conclude, these roughly 20 lines of lua fulfill my "jump to specific" file needs and patch in the missing functionality of project wide marks and going back to the position of the buffer I left. Harpoon offers other features, too, e.g. ui, and no need of sourcing .nvim e.g. when switching projects from the same nvim instance but these dont have a high prio for me right now.
Using the native mark system also seems kinda right to me, since when you get used to it, it can be used in vanilla vim/nvim in a very similar way.
Using alphabetic keys is also handy for mnemonic shortcuts.
That's it, maybe some of you give it a try.
| I don't not just want them highlight when my cursor is on a parentheses or brace, but also when its inside them. [link] [comments] |
A recent commit on 10th of April updated the readme with an announcement that the plugin is no longer maintained and will be archived soon. Does anybody have more information about this on what happened?
I wonder what this will have for effect, I have a bunch of plugins that depend on this plugin.