neovim入门指南(一):基础配置

在编程的世界中,有两个上古神器。一个叫做 “神之编辑器 Emacs”,另一个叫做 “编辑器之神 vim”。这两个编辑器从诞生到现在,圣战从未结束。无论是 vim 还是 emacs 都在不断的进化和发展,渐渐的 vim 的分支上出现了一颗夺目的新星,他就是 neovim。

neovim 从名称来看:新星的vim。按照官方说明: nvim 是一个 vim 的 fork,主要关注了扩展性和易用性。大量的 vim 用户迁移到 nvim,而 vim 的魅力出了经典的快捷键还有丰富的插件系统,这些 nvim 都继承了下来,同时内置了 LSP,增加了 异步 IO 等新特性。

以下是 Neovim 的一些主要特点和优势:

  1. 兼容性:Neovim 是 Vim 的兼容版本,几乎可以无缝地使用现有的 Vim 配置文件和插件。它支持 Vim 的命令和操作方式,因此 Vim 用户可以很容易地切换到 Neovim。
  2. 异步支持:Neovim 引入了异步任务处理的机制,使得编辑器可以在后台执行长时间运行的任务,而不会阻塞用户界面。这使得插件和脚本可以更高效地处理耗时操作,提高了编辑器的响应性。
  3. 现代化的插件系统:Neovim 提供了更灵活、更易于扩展的插件系统。它支持各种编程语言编写的插件,并提供了对外部进程通信的接口,使得插件可以与其他程序进行交互。
  4. 社区活跃:Neovim 拥有一个活跃的社区,不断推动编辑器的发展和改进。社区提供了大量的插件、主题和配置文件,以及对新功能的贡献和支持。

neovim 中配置可以通过 init.vim 或者 init.lua 进行配置,当前大部分的配置都采用了 lua ,本文也将会通过 lua 进行配置 nvim。如果你还不会使用 lua 也不需要担心,lua 可以快速上手。你可以直接通过 :h lua-guide 进行查看 lua 教程。

在类 unix 系统中,该配置文件位于 ~/.config/nvim/ 目录下,而在 windows 系统中,该目录位于 %USERPROFILE%\AppData\Local\nvim\。nvim 启动时会加载该目录下的 init.lua 文件,那么只需要在该文件中进行配置即可。

首先对文件的编码格式设置,统一为 UTF-8 。只需要在 init.lua 中添加相关配置。当然这是 nvim 的默认配置,不进行添加也是可以的。

1
2
vim.g.encoding = "UTF-8"
vim.o.fileencoding = "UTF-8"

这里的 og 是什么意思呢?

vim.o 意味着可以对全局的选项进行设置,而 vim.g 是进行全局设置。

类似的相关方法还有 vim.wo 设置 window-local 选项、vim.bo 设置 buffer-local 选项等。

对 tab 进行设置, tab 默认为 4 个空格。

1
2
3
4
vim.o.tabstop = 4
vim.bo.tabstop = 4
vim.o.softtabstop = 4
vim.o.shiftround = true

还可以将其他的基础配置添加进来,例如显示行号等,具体配置如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
-- 编码方式 utf8
vim.g.encoding = "UTF-8"
vim.o.fileencoding = "utf-8"
-- jkhl 移动时光标周围保留8行
vim.o.scrolloff = 8
vim.o.sidescrolloff = 8
-- 显示行号
vim.wo.number = true
-- 使用相对行号
vim.wo.relativenumber = true
-- 高亮所在行
vim.wo.cursorline = true
-- 显示左侧图标指示列
vim.wo.signcolumn = "yes"
-- 右侧参考线
vim.wo.colorcolumn = "160"
-- 缩进字符
vim.o.tabstop = 4
vim.bo.tabstop = 4
vim.o.softtabstop = 4
vim.o.shiftround = true
-- >> << 时移动长度
vim.o.shiftwidth = 4
vim.bo.shiftwidth = 4
-- 空格替代
tabvim.o.expandtab = true
vim.bo.expandtab = true
-- 新行对齐当前行
vim.o.autoindent = true
vim.bo.autoindent = true
vim.o.smartindent = true
-- 搜索大小写不敏感,除非包含大写
vim.o.ignorecase = true
vim.o.smartcase = true
-- 搜索不要高亮
vim.o.hlsearch = false

vim.o.incsearch = true
-- 命令模式行高
vim.o.cmdheight = 1
-- 自动加载外部修改
vim.o.autoread = true
vim.bo.autoread = true
-- 禁止折行
vim.wo.wrap = false
-- 光标在行首尾时<Left><Right>可以跳到下一行
vim.o.whichwrap = "<,>,[,]"
-- 允许隐藏被修改过的buffer
vim.o.hidden = true
-- 鼠标支持
vim.o.mouse = "a"
-- 禁止创建备份文件
vim.o.backup = false
vim.o.writebackup = false
vim.o.swapfile = false
-- smaller updatetime
vim.o.updatetime = 300

vim.o.timeoutlen = 500

vim.o.splitbelow = true
vim.o.splitright = true
-- 自动补全不自动选中
vim.g.completeopt = "menu,menuone,noselect,noinsert"
-- 样式
vim.o.background = "dark"
vim.o.termguicolors = true
vim.opt.termguicolors = true
-- 不可见字符的显示,这里只把空格显示为一个点
vim.o.list = false
vim.o.listchars = "space:·,tab:>-"

vim.o.wildmenu = true

vim.o.shortmess = vim.o.shortmess .. "c"
-- 补全显示10行
vim.o.pumheight = 10
vim.o.clipboard = "unnamedplus"

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image.png

vim/neovim 经过多年的发展仍旧活跃,其中插件系统功不可没。丰富的插件可以使得 neovie 分分钟化身为 IDE 。

在社区的发展过程中,vim 的插件系统也不断的壮大,目前 vim 的插件基本可以涵盖编辑的方方面面。针对 neovim,可以通过 awesome-neovim 这个项目查询相关插件。

无论是 vim 还是 neovim,本身并没有插件管理器,并不像 vscode 或者其他编辑器一样,可以方便的对查件进行添加,删除或者更新等操作。当然你也无需要担心,各路大神已经开发出了多个插件管理工具。目前,对于 neovim 来说,比较有名的插件管理工具有 packer.nvimlazy.nvim (注意:不要和 LazyVim 混淆)。

本文采用将会采用 lazy.nvim 作为插件管理工具进行插件管理。如果你使用了 packer.nvim 作为插件管理,并不影响阅读,可以跳过插件管理器章节。

lazy.nvim 作为现在比较流行的插件管理工具,安装其实很简单。在 init.lua 中添加相关代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git",
    "clone",
    "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable", -- latest stable release
    lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

require("lazy").setup()

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image_1.png

保存退出后,再次进入 nvim。 nvim 会检查是否存在 lazy, 如果不存在会从 github 上 clone 下来。

通过 :Lazy 命令,如果看到下面的图像,那么就证明 lazy.nvim 安装成功了。

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image_2.png

有了 lazy,之后就可以快速的安装、更新和卸载插件。

为了验证 lazy 功能是否正常,那么先安装个主题插件看看。主题插件我选择 catppuccin.nvim

通过 catppuccin 文档可以查到如何安装,将插件添加到 lazy 配置中。

1
2
3
require("lazy").setup(
    { "catppuccin/nvim", name = "catppuccin", priority = 1000 }
)

退出 neovim,再次进入,就会看到 lazy 在下载相关插件。

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image_3.png

安装完成后,发现我们的主题已经被应用,但是等到退出 neovim 再次进入的时候,发现主题颜色又恢复了默认配色,这里我们只需要在配置文件末尾添加一句,用于设置相关的配色。

1
vim.cmd.colorscheme("catppuccin")

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image_4.png

其中 catppuccin 还有很多配置,这里不多赘述,可以到相关仓库中查看配置内容。

有了插件管理器,那么就可以添加不同的插件了。

经过上面简单的了解,目前所有的配置都写在 init.lua 中,当添加更多的插件的时候, lua 中的代码也会不断的增加,那么当需要进行修改的时候,查询相关配置也成了一大问题,而通过 lua 的特性,我们可以将不同的配置文件进行拆分,做到高内聚低耦合。

对于 lua 来说,可以通过 require 函数来将不同的 lua 脚本进行导入。

现在同 init.lua 目录下建立 lua 文件夹,在其中新建两个 lua 文件,分别是 basic.lua 和 plugins.lua。

1
2
3
4
5
.
├── init.lua
└── lua
     ├── basic.lua
     └── plugins.lua

结构如上目录树所示,之后可以将配置内容分被复制到相关的文件中,将基础配置放在 basic.lua 中,将 lazy 相关的配置复制到 plugins.lua 中。

最后将 init.lua 中引入相关的配置文件即可。

1
2
require("basic")
require("plugins")

其中,对于颜色主题的配置我们可以新建一个 theme.lua 文件,将主题配色相关的配置存放,最后不要忘记在 init.lua 中添加该文件。

最后的目录结构如下:

1
2
3
4
5
6
7
.
├── init.lua
├── lazy-lock.json
└── lua
    ├── basic.lua
    ├── plugins.lua
    └── theme.lua

为了让 vim 更加的顺手,方便我们的使用,针对一些操作需要绑定我们的快捷键,这样让你的操作效率如虎添翼。按照上面的配置规则,新建文件为 .lua,并在 init.lua 中添加。

vim 的一个重要点就是可以通过快捷键快速高效的完成任务,指哪里打哪里,而在配置快捷键中,其实有怎么几个键需要我们熟知,分被为 CtrlAltShift 键。这里并不是让大家知道这些按键在哪里,而是说配置中,这些键位很常用,并且在配置中这些键位常常简写。

键位简写
CtrlC-
shiftS-
AltA-

这三个键位在配置中会非常常见。当然,并不是只有这三个键位可以找到相关的缩写,可以通过 :h key-notations 看到所有的键位说明。

另外,对于 mac 来说是没有 Alt 键的,这样就需要我们修改 Option 键位,这部分可以看 附录/修改 Alt 键位。

leader 键对于 vim 来说是一个非常重要的键,它可以说是在 vim 中使用频率最高的键之一。 leader 顾名思义,处于领导位置,一般作为组合快捷键的先驱,使用其他按键的时候先按下 leader。对于 leader,vim 并没有规定谁是 leader,只要你想,哪个键也可以为 leader。一般会将 空格 等按键设置为 leader 键。

上面这些都是我们配置前的基础知识。下面开始设置相关快捷键。

在 lua 文件夹下新建文件, keybindings.lua,并且在 init.lua 中添加, require("keybindings")

首先便是上面说过的 leader 键。这里我采用空格作为 leader 键。

1
2
3
-- keybindings.lua
vim.g.mapleader = " "
vim.g.maplocalleader = " "

关于 mapleadermaplocalleader 的区别可以看 https://luciaca.cn/posts/vimscript-learning-on-leaders 相关文档。

在 neovim 中,需要通过 vim.keymap.set() 函数进设置。这个函数需要传入四个参数,分别是 mode , lhs , rhs , opts

参数名说明
mode模式的简写,常见的有 n(normal), i(insert), v(view) 等
lhs可以理解为对应的按键
rhs对应的功能
opts相关的设置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
vim.g.mapleader = " "
vim.g.maplocalleader = " "
local opt = { noremap = true, silent = true }

-- visual模式下缩进代码
vim.keymap.set("v", "<", "<gv", opt)
vim.keymap.set("v", ">", ">gv", opt)

-- 左右Tab切换
map("n", "<C-h>", ":BufferLineCyclePrev<CR>", opt)
map("n", "<C-l>", ":BufferLineCycleNext<CR>", opt)

-- 省略其他基础配置

这样就可以自定义添加相关按键。

我的相关配置,提供给大家参考 youngxhui/nvim

在 setting 中, Profiles-Keys 中, 将 Left Option Key 设置为 Esc+ 。

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/Untitled.png

编辑 alacritty 的配置文件中window.option_as_alt

1
2
3
4
5
6
7
window:
  # Make `Option` key behave as `Alt` (macOS only):
  #   - OnlyLeft
  #   - OnlyRight
  #   - Both
  #   - None (default)
  option_as_alt: Both

为何 Emacs 和 Vim 被称为两大神器

BurntSushi/ripgrep

相关内容