从 Vim 到 NeoVim:感知不强

从 Vim 到 NeoVim:感知不强

RocketDev

Vim原来的功能固然很强大,但是总有人说,现在是时候把Vim换成新时代的NeoVim了。 话虽如此,但是要想把NeoVim配得和我现在用的Vim一样丝滑,就需要花大量的时间调配置。 所以我迟迟没有更换的意愿,直到看见了 Neovidedbgbgtf 问我Vim可以丝滑滚动吗? 我拿出Neovide:不但有丝滑滚动,还有光标拖尾呢!

得益于NeoVim前后端分离,实现一个美观的编辑器前端并不是难事,甚至可以将NeoVim 集成到浏览器中。NeoVim还支持LSP等特性,有现代编辑器的各种特性。于是我决定配一下。

新编辑器需要新配置。为了适配NeoVim对lua的原生支持,我决定把所有配置迁移到lua。 一上来NeoVim的插件管理系统就比Vim复杂,我用了Lazy.nvim来管理插件, 首先需要学一下spec怎么写。然后是准备插件, 我的基础目标是先启用我Vim中的所有插件,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
call plug#begin('~/.vim/plugged')
Plug 'jiangmiao/auto-pairs' " nvim-autopair.lua
Plug 'itchyny/lightline.vim' " lualine.nvim.lua
Plug 'tpope/vim-commentary' " nvim builtin
Plug 'tpope/vim-unimpaired' " nvim builtin
Plug 'tpope/vim-repeat' " nvim builtin
Plug 'tpope/vim-surround' " nvim-surround.lua
Plug 'preservim/nerdtree', {'on': 'NERDTreeToggle'} " nvim-tree.lua
Plug 'neoclide/coc.nvim', {'branch': 'release'} " nvim-cmp.lua
Plug 'godlygeek/tabular' " mini.align.lua
Plug 'preservim/vim-markdown' " render-markdown.nvim.lua
Plug 'iamcco/markdown-preview.nvim', { 'do': 'cd app && yarn install' }
Plug 'kana/vim-textobj-user' " nvim-various-textobjs.lua
Plug 'kana/vim-textobj-entire' " nvim-various-textobjs.lua
Plug 'kana/vim-textobj-indent' " nvim-various-textobjs.lua
Plug 'pocke/vim-textobj-markdown' " nvim-various-textobjs.lua
Plug 'cposture/vim-textobj-argument' " nvim-treesitter-textobjects.lua
Plug 'lilydjwg/fcitx.vim' " fcitx.nvim.lua
Plug 'easymotion/vim-easymotion' " hop.nvim.lua
call plug#end()

除了这些vim中写过的插件,我还尝试加入dap支持,但是无论是nvim-dap-ui 还是nvim-dap-view,都会出现一些奇奇怪怪的错误,最后只好作罢。 个人觉得效果比较好的插件是render-markdown.nvim,在NeoVim里显示效果还是不错的。 在把全部的插件配完以后,我意识到,实际上和我原来的vim配置差距并不大...

在NeoVim中使用root权限保存文件

在NeoVim中是无法直接使用:w !sudo tee % > /dev/null的,因为会显示需要一个终端, 即使加上-S也无法通过标准输入来输入密码。这时有一些work around可以选, 比如我就选了pkexec。写了以下lua代码并添加到init.lua中:

init.lua
1
2
3
4
5
-- Define :S command to save the file using pkexec and force reload
vim.api.nvim_create_user_command('S', function()
vim.cmd('silent! w !pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY tee % >/dev/null') -- Save file using pkexec
vim.cmd('edit!') -- Force reload the file
end, {})

当执行:S时会唤起KDE的要求权限窗口。不能使用:WW,因为没有:W命令,所以neovim在输入:W时, 会自动运行:WW,造成不必要的权限申请,将其改为:S就不会有这个问题。

Anyway,我已经把我的配置放到GitHub 上了,如果想借鉴的可以到这个地址看看。接下来是配置好的NeoVim演示:

demo

250422更新

nvim-cmp有奇怪的bug,即使光标前没有任何字符,按下<CR>/<Tab>/ , 都会有补全,但是这种情况下我根本不需要补全啊!没办法,只能切换到 blink.cmp,这个框架没有凭空补全的问题。除此之外,基于treesitter 的函数参数文本对象也有问题,当使用clangd补全时,遇到函数里有const char * 这样的表述时,参数文本对象就乱掉了,我只好换回vim的参数文本对象插件。 不知道注册了哪些快捷键?neovim还提供了打印所有映射的键位的功能:

1
:lua vim.print(vim.api.nvim_get_keymap("a"))

这时候在绑定键位时写desc的优势就体现出来了:每个键在做什么一目了然。 查看所有变更

参考

  1. Plugin Spec | lazy.nvim
  2. My neovim setup
  3. 配置一下Neovim&Neovide_哔哩哔哩_bilibili
  • 标题: 从 Vim 到 NeoVim:感知不强
  • 作者: RocketDev
  • 创建于 : 2025-04-06 19:45:00
  • 更新于 : 2025-04-22 01:40:00
  • 链接: https://rocketma.dev/2025/04/06/neovimSetup/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
从 Vim 到 NeoVim:感知不强