Neovim - 简单入门
前排提示:我采用的配置是基于这个配置进行改进的,如果对 Neovim 和 LaTeX 有基本的使用经验可以直接参考给出的链接。
如果对哪些部分不清楚或者对某个部分的具体实现感兴趣,可以私信或者评论,我会针对内容进行更新。
最终效果展示:
为什么有这篇文章
在写这篇文章之前,我已经使用 Vim (主要是用的 VS Code 的 Neovim 插件)和 \(\LaTeX\) 一段时间了,之前一直都是使用 VS Code 和 \(\LaTeX\) 插件的解决方案,但是最终还是觉得 Neovim 的实现更加优雅,也更符合我的习惯和解决我的一些痛点::
- 经常使用 Windows Terminal
- VS Code 的 Neovim 插件时不时会遇到一些无法解决的 Bug
- 使用 Neovim 插件没办法实现一些自定义的操作和更改配置,这点在我要增加一些功能的时候尤为难受
- 加快启动和编译的速度,特别是针对大文件
保留上个世纪程序员的炫酷
参考了很多解决方案,都没有一个比较完美的符合我痛点的配置,于是只好自己根据现有的解决方案改良了一下,主要的功能有:
- 语法高亮
- \(\LaTeX\) 正向搜索、反向搜索
- 文件检索、模糊查找
- 整合 Lazygit 实现版本管理
- 采用 Lua 编写,更加符合 Neovim 的习惯
- 利用 VimTeX 实现编译、查看 \(\LaTeX\) 文件
- 支持 LSP 自动补全
- 格式化代码
- 支持中英输入法混用(在 Normal 模式英文输入法,在 Insert 模式下中文输入法)
- ……
什么是 Neovim
如果你听过编辑器之神 Vim 和神之编辑器 Emacs 的话,那么就很好理解 Neovim 了,它就是 Vim 的一个社区版,如果你对它的历史感兴趣,可以到 Neovim 的官网 查看。
关于 Vim 和 Neovim 的历史还可以查看:Vim 和 Neovim 的前世今生 · jdhao's digital space
一些可能有用的链接
快速入门
- neovim/neovim: Vim-fork focused on extensibility and usability (github.com) - Neovim 的 GitHub 仓库
- Learn Lua in Y
Minutes (learnxinyminutes.com) - 快速入门 Lua 语言(主要是为了
Neovim 的配置)
- Lua-guide - Neovim docs - Neovim 提供的 Lua 手册
- Home - Neovim - Neovim
的官网(可以用来查看 API 和入门文档
- Help - Neovim docs - 帮助文档
- Usr_toc - Neovim docs - 文档的目录(快速定位需要阅读的部分)
快捷键速查表
- Index - Neovim docs
- Quickref - Neovim docs
- 或者在 Neovim 中输入
:help index
在哪里找插件
- Trending Neovim Plugins in 2024 (dotfyle.com)
- rockerBOO/awesome-neovim: Collections of awesome neovim plugins. (github.com)
- Modules labeled 'neovim' - LuaRocks
- nvimawesome (nvim-awesome.vercel.app)
- neovimcraft
学习 Vim & Neovim
- Vim - CS自学指南 (csdiy.wiki) - 可以在里面找到一些学习的参考资料
- 💻【Linux】Vim 入门笔记 (imageslr.com) - 主要介绍如何使用 Vim 的一些技巧
- yangyangwithgnu/use_vim_as_ide: use vim as IDE (github.com) - 比较完善的文档,略长,但是太长时间没有更新,仅供参考
- wsdjeg/vim-galore-zh_cn: Vim 从入门到精通 (github.com) - 主要介绍 Vim 的一些基础概念
- wsdjeg/Learn-Vim_zh_cn: 聪明地学习Vim (github.com) - 中文学习 Vim 的参考资料
- Learn Vimscript the Hard Way (stevelosh.com) - 英文学习 Vim 的参考资料
- 《Practical Vim 2nd Edition》 | 开发者工具论坛 (learnku.com) - 系统学习 Vim 的参考书
配置 Neovim
- Lua-guide - Neovim docs - 官方关于如何配置的文档
- VIM 中文帮助: 总览及快速参考 (yianwillis.github.io) - 中文帮助,适合对阅读官方英文有困难的同学,主要针对 Vim
第三方博客的介绍:
中文博客
- 你需要知道的使用
lua 配置 neovim 的一切 - 知乎 (zhihu.com) - 主要看关于
o
,wo
,bo
,g
,env
,opt
之间关系的说明 - Neovim: 把 init.vim 迁移到 init.lua - 知乎 (zhihu.com) - 适合之前使用 Vim 要迁移到 Neovim 的同学
- 从零开始配置 Neovim(Nvim) - MartinLwx's Blog - 轻量化配置 Neovim,适合新手同学逐步跟着配置,针对 MacOS
- neovim入门指南(一):基础配置 - ISLAND (youngxhui.top) - 系列文章,比较适合想要逐层递进学习的同学,涵盖了 Neovim 的基本使用、一些插件的介绍、LSP如何配置等内容
- 从零开始的现代化Vim配置指南——前言 - 知乎 (zhihu.com) - 系列文章,似乎很久没有更新了,不是很推荐
- 我用 neovim 代替了 MS Office, IDEA, Visual Studio... - 知乎 (zhihu.com) - 过时的文章,可以不参考
- neovim 配置记录 - 知乎 (zhihu.com) - 比较简略地介绍了一些插件,可以参考一下插件的功能
- 我的现代化 NeoVim 配置介绍/教程 - 知乎 (zhihu.com) - 可以参考其中的插件介绍
- 我的现代化Neovim配置 - 知乎 (zhihu.com) - 介绍不是很详细,更像是个人记录,不推荐参考
- Neovim/Vim基础教程(面向萌新&推荐&感想) - 知乎 (zhihu.com) - 给的大多是链接,质量不高,不推荐
- 用 Nvim 打造超强的个性化 IDE - LazyPool's Blog (lazypool-blog.netlify.app) - 相对比较容易懂,配置文档也比较详细,介绍了一些有用的插件
英文博客
- Supercharged LaTeX using Vim/Neovim, VimTeX, and snippets | ejmastnak - 主要跟数学公式的支持有关
- bryant-video/neovim-tutorial (github.com) - 比较简单的配置,基本上涵盖了必要的内容
为什么是 Neovim 而不是 Vim
- Vim还是Neovim?为什么你应该使用后者? 新维姆 在Vim和/或Neovim之间感到困惑?下面是我说服你今天使用N - 掘金 (juejin.cn) - 对于 Vim 和 Neovim 的比较
- Geoff Greer's site: Why Neovim is Better than Vim - 为什么选择 Neovim 而不是 Vim 的理由
遇到问题请看我
- Helphelp - Neovim docs
- Message - Neovim docs
- 在 Neovim 中输入
:help faq
一些建议
其他链接
- ASCII Art Archive - 美化 Neovim 启动界面
安装 Neovim
由于我使用 Windows 10 的 scoop 软件来管理安装其他软件,所以只需要一行命令就能安装:
1 |
|
如果是其他的安装方法可以参考官方文档。
如果你还不熟悉 Vim 的操作,可以打开 Neovim,然后进入命令模式,输入下面的代码就可以进入一个大概30分钟的交互式教程:
1 |
|
配置 Neovim
无论是开箱即用还是自己配置,最终目的都是为了方便自己,切莫本末倒置。也不必追求一次性就将自己的配置做到最优,可以在使用中发现缺少什么再去补全,这样会使得整个过程更加容易一些,当然如果想要体验一下完全体还是建议先下载几个开箱即用的配置试试看。
开箱即用
如果不想自己配置 Neovim 也有很多开箱即用的配置可以参考:
- nvim-lua/kickstart.nvim: A launch point for your personal nvim configuration (github.com)
- SpaceVim/SpaceVim: A modular Vim/Neovim configuration (github.com)
- NvChad/NvChad: Blazing fast Neovim config providing solid defaults and a beautiful UI, enhancing your neovim experience. (github.com) - 推荐阅读英文原版,中文文档更新比较慢
- LunarVim/LunarVim: 🌙 LunarVim is an IDE layer for Neovim. Completely free and community driven. (github.com)
- LazyVim/LazyVim: Neovim config for the lazy (github.com) - 注意别和插件 lazy.nvim 搞混
打造属于自己的 Neovim
Windows 10 中 Neovim 的配置文件一般在
~/AppData/Local/nvim/init.vim (Windows)
这个路径下,
~
表示当前用户的目录,比如用户名为 Beta
的用户的路径一般为
C:/Users/Abel/AppData/Local/nvim/init.vim
。Neovim
启动时会加载 init.vim
文件,所以只需要在这个文件中进行配置就可以。
我的配置文件会加上大部分的注释,基本上是自解释的,如果还有不懂的部分,比如
o
和 g
分别是什么,可以参考官方给出的文档,下面给出我的配置文件的结构,以下默认当前文件夹是在前面提到的
./nvim
下:
1 |
|
如何生成文件树:利用 Windows 10 的
tree
命令:
1tree /f >tree.txt
会将当前目录下的文件树的结果导出到 tree.txt 文件中,如果没有这个文件则会创建文件并写入结果。
配置文件
init.lua
文件是 Neovim
启动时会加载的配置文件,可以按照文件树结构来安排各种设置,便于分类和查找:
1 |
|
options.lua
文件主要放了 Neovim
原本就支持的一些设置,包括行号、高亮、编码等等,所以会显得比较杂乱:
1 |
|
在 Neovim/Vim 中直接输入 /
就可以查找,比如
/include
就是查找文件中包含 include
的词,同样有大小写敏感,要关闭大小写敏感,可以使用命令
vim.o.ignorecase = true
。
查看查找的历史记录可以输入 /
之后用方向键来查找之前查找的记录。当然这需要在查找之后按下回车进行实际的查找才会进行记录,否则如果只是在命令中查找而不按下回车键是不会进行记录的。
如果记得之前查找历史中的某个开头的字母,比如之前运用过
/search
命令查找了 search
这个单词,然后之后又进行了多次查询,并且在查询之后都按下了回车键,这会把查找历史记录下来,那么想要快速找到之前的某个查找记录,那么就可以先输入
/sea
然后按下方向键就可以在以 sea
开头的查找记录中跳转。
当然 :
的命令模式也有类似以上的功能,但是 :
命令的历史记录和 /
命令的历史记录是分开的。
搜索当前光标指示的单词,当然可以使用 /
命令手动输入当前光标所指示的单词,但是也可以用 *
来直接搜索当前光标所指示的单词在文本中出现的下一个位置,这样不容易在
/
输入中拼写错误,而 #
命令向相反的方向做同样的事情。不过这两个命令会自动进行全字匹配,如果想要部分匹配的话可以用命令
g#
和 g*
。
keymaps.lua
主要存放一些经常用的快捷键(可以自己设置):
1 |
|
lazy.lua
文件是一个管理 Neovim 插件的插件,具体的设置可以参考官方文档:
1 |
|
这里有个坑,安装 lazy.nvim
是要先安装 git
的,而且安装之后在 Neovim 中执行 :checkhealth lazy
时可能会遇到和 luarocks
有关的报错,我的解决方案是通过
Scoop
安装 luarocks
和 lua
:
1 |
|
插件
lazy.nvim:用于插件管理的一个插件,可以进行快速地安装、卸载、更新插件。
- Git 仓库:folke/lazy.nvim: 💤 A modern plugin manager for Neovim (github.com)
- 文档:🚀 Getting Started | lazy.nvim (folke.io)
vimtex:Vimtex 是一个专门为 Vim 和 Neovim 设计的 LaTeX 插件,它提供了包括语法高亮、自动补全、编译支持、预览和错误检查等功能。
进阶版 Neovim
结合 Neovim 和 \(\LaTeX\)
可以参考的链接
- 使用 Neovim 和
vimtex 高效撰写 LaTeX 学术论文 - 知乎 (zhihu.com) - 不是用
lua
编写的,更适合使用 Vim 的同学参考,介绍原理的部分值得一看 - A Quick Guide on Writing LaTeX in Neovim - Jia Jia Math (mathjiajia.github.io)
- Neovim as a LaTex Development Environment (epheme.re)
- How I'm able to take notes in mathematics lectures using LaTeX and Vim | Gilles Castel - 很有名的一篇文章,主要针对使用 Vim 的同学
- LaTeX 入门小记:Vim + Vimtex + LaTeX 初体验 - 知乎 (zhihu.com) - 内容有点过时,总体还是适合的
- 使用Neovim优雅地编写LaTeX - 知乎 (zhihu.com) - 主要介绍了 LuaSnip 的配置
- 在 Windows 中使用
wsl + neovim + latex + ultisnips - 知乎 (zhihu.com) - 配置主要针对
wsl
- Vim+VimTeX:带给你飞一般的LaTeX编辑体验 | Hexo (destinyenvoy.github.io) - 提供了一些有关 VimTeX 的技巧说明可以参考
- Windows+neovim+SumatraPDF+windows terminal+vimtex进行latex写作和反向搜索 - 知乎 (zhihu.com) - 比较详细地介绍了在 Windows 下如何配置
- benbrastmckie/.config: NeoVim configuration optimized for writing in LaTeX (github.com) - 非常好的解决方案,基本上涵盖了需要用到的 Zotero,Git 等拓展功能,推荐
我的解决方案
根据这个配置进行改进
keymaps.lua
的内容:
1 |
|
options.lua
的内容:
1 |
|
autocmds.lua
的内容:
1 |
|
functions.lua
的内容:
1 |
|
bootstrap.lua
的内容:
1 |
|
遇到的一些问题及其解答:
- 快捷键如何映射正斜杠:使用
_
代替/
[1]。
插件介绍
goolord/alpha-nvim: a lua powered greeter like vim-startify / dashboard-nvim (github.com):用于渲染启动 Neovim 的欢迎界面
windwp/nvim-autopairs: autopairs for neovim written in lua (github.com):自动匹配括号
akinsho/bufferline.nvim: A snazzy bufferline for Neovim (github.com):左侧的消息线
ellisonleao/gruvbox.nvim: Lua port of the most famous vim colorscheme (github.com):颜色主题
stevearc/dressing.nvim: Neovim plugin to improve the default vim.ui interfaces (github.com):装饰原本的UI界面
lewis6991/gitsigns.nvim: Git integration for buffers (github.com):显示 Git 的提交信息
lukas-reineke/indent-blankline.nvim: Indent guides for Neovim (github.com):缩进辅助线
kdheepak/lazygit.nvim: Plugin for calling lazygit from within neovim. (github.com):在 Neovim 中调用 Lazygit
tzachar/local-highlight.nvim (github.com):基于本地正则表达式的高亮和当前选中的词匹配的词
L3MON4D3/LuaSnip: Snippet Engine for Neovim written in Lua. (github.com):代码片段管理
nvim-tree/nvim-tree.lua: A file explorer tree for neovim written in lua (github.com):文件管理树
nvim-tree/nvim-web-devicons: lua
fork
of vim-web-devicons for neovim (github.com):美化文件图标Shatur/neovim-session-manager: A simple wrapper around :mksession. (github.com):会话管理工具
kylechui/nvim-surround: Add/change/delete surrounding delimiter pairs with ease. Written with in Lua. (github.com):轻松增加、修改、删除括号对等
nvim-telescope/telescope.nvim: Find, Filter, Preview, Pick. All lua, all the time. (github.com):模糊查找
nvim-treesitter/nvim-treesitter: Nvim Treesitter configurations and abstraction layer (github.com):高亮代码
lervag/vimtex: VimTeX: A modern Vim and neovim filetype plugin for LaTeX files. (github.com):专门为 Vim 和 Neovim 设计的 LaTeX 插件,它提供了包括语法高亮、自动补全、编译支持、预览和错误检查等功能。
gbprod/yanky.nvim: Improved Yank and Put functionalities for Neovim (github.com):智能代码补全和自动插入功能
liubianshi/cmp-lsp-rimels: 让 Neovim 下的中英文混合输入无比丝滑 (github.com):插入模式下的中英文混合输入的解决方案
keaising/im-select.nvim: Switch Input Method automatically depends on Neovim's edit mode (github.com):实现插入模式和正常模式的输入法切换