版本信息
我使用的是 Macbook pro M2Pro 版本,系统版本为 macOS 14.1。我的 Nvim
版本信息如下
$ nvim --version
NVIM v0.9.5
Build type: Release
LuaJIT 2.1.1703358377
系统 vimrc 文件: "$VIM/sysinit.vim"
$VIM 预设值: "/opt/homebrew/Cellar/neovim/0.9.5/share/nvim"
Run :checkhealth for more info
为什么选择 Neovim
在使用 Vim
一年多之后,我越发觉得 Vim
的配置麻烦,启动加载速度也不尽人意。我也很不喜欢 Vimscript 的写法,这导致我决定使用 Neovim(Nvim)
。我决定重新配置 Nvim
。为什么会想要重新配置而不是迁移配置呢?因为我想顺便趁着这个机会,重新审视我本来 Vim
的配置,以及将本来用到的的插件替换为现在的 SOTA(State-of-the-art)。我自从看完 MIT 的 Missing semester 的课配置了 ~/.vimrc
之后就很长时间都没有再编辑 ~/.vimrc
文件了
我认为在配置 Nvim
的时候弄清楚每一个选项的意思是很有必要的,因此我在这篇博客中会尽量解释清楚每个选项的含义,同时将解释放在注释里面,即我尽量让我自己的配置文件是 self-contained 而且可读性强的
当然,这难免有疏漏。别忘了我们永远可以在
Nvim
里面输入:h <name>
来看到更为详细的解释
该篇博客假定你对
Vim
有基本了解
Nvim 配置基础知识
Lua 语言
在配置 Nvim
的时候,我会 尽可能 使用 Lua 语言编写配置文件,因此你有必要了解一下 Lua 的基本语法和语义。可以快速浏览一下 Learn Lua in Y minutes 了解大概
配置文件路径
Nvim
的配置目录在 ~/.config/nvim
下。在 Linux or macOS 系统上,Nvim 会默认读取 ~/.config/nvim/init.lua
文件,理论上来说可以将所有配置的东西全部放在此文件中,但这样不是一个好的做法,因此需要划分不同的目录分管不同的配置
首先看下按照本篇教程 Nvim
之后,目录结构看起来会是怎么样的 ↓
nvim
├── init.lua
└── lua
├── colorscheme.lua
├── config
│ └── nvim-cmp.lua
├── keymaps.lua
├── lsp.lua
├── options.lua
└── plugins.lua
解释如下:
init.lua
为Nvim
配置的 Entry point,我们主要用来导入其他*.lua
文件colorscheme.lua
配置主题keymaps.lua
配置按键映射lsp.lua
配置 LSPoptions.lua
配置选项plugins.lua
配置插件
config
用于存放各种插件自身的配置,文件名为插件的名字,这样比较好找。这里的nvim-cmp.lua
就是nvim-cmp
插件的配置文件lua
目录。当我们在 Lua 里面调用require
加载模块(文件)的时候,它会自动在lua
文件夹里面进行搜索- 将路径分隔符从
/
替换为.
,然后去掉.lua
后缀就得到了require
的参数格式 - 比如要导入上面的
nvim-cmp.lua
文件,可以用require('config.nvim-cmp')
- 将路径分隔符从
选项配置
主要用到的就是 vim.g
、vim.opt
、vim.cmd
等,我制造了一个快速参照对比的表格
In Vim |
In Nvim |
Note |
---|---|---|
let g:foo = bar |
vim.g.foo = bar |
|
set foo = bar |
vim.opt.foo = bar |
set foo = vim.opt.foo = true |
some_vimscript |
vim.cmd(some_vimscript) |
按键配置
在 Nvim
里面进行按键绑定的语法如下,具体的解释可以看 :h vim.keymap.set
vim.keymap.set(<mode>, <key>, <action>, <opts>)
从零开始配置 Nvim
在阅读了前面一些配置基础之后,现在我们可以从头开始,由简到易一步步配置 Nvim
了
安装 Nvim
我是使用 macOS,用 Brew 命令安装即可
brew install neovim
# or in Manjaro Linux
在安装完成之后,如果 ~/.config/nvim
目录不存在,创建目录并新建 init.lua
文件
$ mkdir ~/.config/nvim
$ mkdir ~/.config/nvim/lua
$ touch ~/.config/nvim/init.lua
配置文件编辑保存之后,重启 Nvim
就能看到效果,后面默认每次小章节配置完成后就重启,或者执行生效命令::source %
选项配置
选项配置功能一览:
- 默认采用系统剪贴板,同时支持鼠标操控
Nvim
- Tab 和空格的换算
- UI 界面
- “智能”搜索
新建 ~/.config/nvim/lua/options.lua
文件并加入如下内容⬇️
-- Hint: use `:h <option>` to figure out the meaning if needed
vim.opt.clipboard = 'unnamedplus' -- use system clipboard
vim.opt.completeopt = { 'menu', 'menuone', 'noselect' }
vim.opt.mouse = 'a' -- allow the mouse to be used in Nvim
-- Tab
vim.opt.tabstop = 4 -- number of visual spaces per TAB
vim.opt.softtabstop = 4 -- number of spacesin tab when editing
vim.opt.shiftwidth = 4 -- insert 4 spaces on a tab
vim.opt.expandtab = true -- tabs are spaces, mainly because of python
-- UI config
vim.opt.number = true -- show absolute number
vim.opt.relativenumber = true -- add numbers to each line on the left side
vim.opt.cursorline = true -- highlight cursor line underneath the cursor horizontally
vim.opt.splitbelow = true -- open new vertical split bottom
vim.opt.splitright = true -- open new horizontal splits right
-- vim.opt.termguicolors = true -- enabl 24-bit RGB color in the TUI
vim.opt.showmode = false -- we are experienced, wo don't need the "-- INSERT --" mode hint
-- Searching
vim.opt.incsearch = true -- search as characters are entered
vim.opt.hlsearch = false -- do not highlight matches
vim.opt.ignorecase = true -- ignore case in searches by default
vim.opt.smartcase = true -- but make it case sensitive if an uppercase is entered
然后打开 init.lua
,用 require
导入刚才写的 options.lua
文件
require('options')
按键配置
按键功能一览:
- 用
<C-h/j/k/l>
快速在多窗口之间移动光标 - 用
Ctrl
+ 方向键进行窗口大小的调整 - 选择模式下可以一直用
Tab
或者Shift-Tab
改变缩进
新建 ~/.config/nvim/lua/keymaps.lua
文件并放入如下内容⬇️
-- define common options
local opts = {
noremap = true, -- non-recursive
silent = true, -- do not show message
}
-----------------
-- Normal mode --
-----------------
-- Hint: see `:h vim.map.set()`
-- Better window navigation
vim.keymap.set('n', '<C-h>', '<C-w>h', opts)
vim.keymap.set('n', '<C-j>', '<C-w>j', opts)
vim.keymap.set('n', '<C-k>', '<C-w>k', opts)
vim.keymap.set('n', '<C-l>', '<C-w>l', opts)
-- Resize with arrows
-- delta: 2 lines
vim.keymap.set('n', '<C-Up>', ':resize -2<CR>', opts)
vim.keymap.set('n', '<C-Down>', ':resize +2<CR>', opts)
vim.keymap.set('n', '<C-Left>', ':vertical resize -2<CR>', opts)
vim.keymap.set('n', '<C-Right>', ':vertical resize +2<CR>', opts)
-----------------
-- Visual mode --
-----------------
-- Hint: start visual mode with the same area as the previous area and the same mode
vim.keymap.set('v', '<', '<gv', opts)
vim.keymap.set('v', '>', '>gv', opts)
然后在 init.lua
文件里面再次加上一行导入这个文件
...
require('keymaps')
...
表示我们省略了其他部分的代码(为了节省博客的篇幅)
安装插件管理器
一个强大的 Nvim
离不开插件的支持。我选用的是当下最为流行,而且完全用 Lua 语言编写的 Packer.nvim。它支持如下许多特性:
- 支持配置第三方插件的依赖
- 支持 Lazy loading
- 支持设置插件安装之后的钩子函数
- …
后续考虑切换到 Lazy.vim 进行插件管理
在 Packer.nvim
配置里面指定第三方插件很简单,用 use ...
即可
新建 ~/.config/nvim/lua/plugins.lua
文件并放入如下内容。下面的模板只完成了 Packer.vim 自身的安装,还没有指定其他第三方插件。这个模板的功能主要是
- 初次启动的时候自动安装
Packer.nvim
- 当我们保存对这个文件(
plugins.lua
)文件的修改的时候,Packer.nvim 会自动帮我们自动更新插件和帮我们做好配置。你可以看到Nvim
右边看到多了一个窗口显示进度
标签:Neovim,--,vim,lua,从零开始,Nvim,nvim,cmp From: https://www.cnblogs.com/RioTian/p/17993485