1. 引言
此前,我们介绍了 vim 的插件管理器 vim-plug 以及 neovim 的安装和配置:
在上面这篇文章中,我们是通过使用 vim-script 的语法来进行 neovim 的配置的。而如今,neovim 已经支持通过 lua 这种简单易学且易用的通用编程语言来进行它的配置了,这听起来就是一个非常激动人心的事情,终于再也不用去学习 vim-script 这种专为 vim 配置打造的语言了。[[vimrc]]
我也是在这个周末花了一个白天的时间,把原来的配置迁移到了新的 lua 配置上,由于 lua 这种编程语言本身语法就很简单,加上我的配置本来也不多,所以迁移过程还是非常顺畅的。本文我就来介绍一下如何从零开始用 lua 配置 neovim。
如何安装 neovim 在上述 vim 插件管理推荐的文章中已经有介绍,这里就不赘述。至于 neovim 的用法,可以执行下面命令进一步详细了解:
nvim +Tutor
建议安装最新的版本,很多插件都不支持旧版本的 nvim,我安装的是 v0.9.1 版本。
关于 nvim 的配置,github 上有很多人分享了他们的配置,也有一些非常高 star 的脚手架项目,可以直接将你的 neovim 变成一个 IDE,但我不喜欢直接使用这些项目,因为它们的很多键位设置并不符合我的习惯,包括很多插件我也并不需要,所以我认为从零开始一点点配置一个自己用起来得心应手的工具是非常重要的一件事,那么,接下来,开始配置。
2. 创建 neovim 配置
想要通过 lua 配置 neovim,我们首先需要创建配置文件所在的目录及文件:
mkdir -p ~/.config/nvim touch ~/.config/nvim/init.lua
然后,我们就可以直接编辑 ~/.config/nvim/init.lua 来进行配置,更方便的,是在 nvim 中直接通过下面的命令来打开默认配置文件:
:edit $MYVIMRC
3. 基础设置
首先,我们需要对 vim 做一些最基础的配置,设置方法与此前用 vim-script 方式的配置基本上是一样的:
vim.opt.option_name = value
那么,vim 都支持哪些 option_name 呢?可以通过 :help option-list 来进行查询。
vim.opt.option_name 可以简写为 vim.o.option_name,另外,配置还可以进一步细化来标明作用域:
我创建了 ~/.config/nvim/lua/options.lua 来存储我的这些配置,并且在 init.lua 中引用该配置:
require("options")
3.1 encoding
默认的字符编码,作为程序员,首要的当然是配置这一项为 utf-8 咯:
vim.opt.encoding = “utf-8”
vim.opt.fileencoding = ‘utf-8’
3.2 几个关于显示的配置3.2.1 显示行号
— Make line numbers default
vim.opt.number = true
3.2.2 去除当前模式的显示
因为我通过插件实现了状态栏在不同的模式下显示不同的颜色和文字,所以我不再需要在状态栏下方显示 –INSERT– 这样的提示信息,所以我配置了:
vim.opt.showmode = false
3.2.3 显示图标指示列
所谓的“图标指示列”,就是在行号左边多出来的一列,很多插件,比如 git 插件、代码语法检查的插件会用到这一列,例如当你的代码出现语法错误时,会在对应行的这一列上显示一个叉,但如果你没有开启默认显示图标指示列,就会在需要显示的时候,页面文本整体右移一列,当你修复问题后页面文本再左移一列,这会让整个页面出现比较大的晃动,观感不好,所以我选择默认就显示这一列:
— Keep signcolumn on by default
vim.wo.signcolumn = ‘yes’
3.2.4 显示列参考线
如果你希望你的每行代码都不要超过一定的列数,可以设置一个参考线,很多开源项目都严格遵循了这一要求:
vim.wo.colorcolumn = "80"
3.2.5 让 terminal 使用和 app 一样的颜色配置
这需要 terminal 软件支持,如果不支持,可能会有显示样式上的问题,所以看个人需要和习惯来配置:
vim.opt.termguicolors = true
3.2.6 不可见字符
是否显示不可见字符,以及如何显示不可见字符,下面的配置将空格显示为了一个点:
— Display invisibale character
vim.o.list = truevim.o.listchars = “space:·”
3.3 支持鼠标
— Enable mouse mode
vim.opt.mouse = ‘a’
3.4 使用系统剪切板
是否要在 vim 中支持鼠标,以及是否使用系统剪切板,是一个比较私人化的配置,喜欢这两个特性的人如鱼得水,不喜欢的人要抓狂到把电脑砸掉,所以看个人习惯配置吧。
— Sync clipboard between OS and Neovim.
— Remove this option if you want your OS clipboard to remain independent.
— See `:help ‘clipboard’`
vim.opt.clipboard = ‘unnamedplus’
3.5 关于折行
一行显示不下的时候,你是希望 nvim 能够自动折行呢?还是有一个横向滚动条供你来拖动显示呢?我喜欢前者。
那么,接下来的问题是,假如这一行是存在缩进的,那么,你喜欢折行后的虚拟行是有缩进的还是没有缩进的呢?我同样喜欢前者,所以这是我的配置:
— Enable break indent
vim.opt.wrap = true
vim.opt.breakindent = true
3.6 关于 tab
一个 tab 占用几个字符,不同的人有不同的审美。tab 是否要自动换成空格?这对于 python 程序员来说显然是至关重要的,那么,你需要进行下面这些配置,至于每个配置代表什么含义,我在此前也已经介绍过,可以参看:
— The amount of space on screen a Tab character can occupy
vim.opt.tabstop = 4
— Amount of characters Neovim will use to indent a line
vim.opt.shiftwidth = 4
— Controls whether or not Neovim should transform a Tab character to spaces.
vim.opt.expandtab = true
3.7 关于分屏
在 vim 中执行 :split 可以开启纵向分屏,执行 :vsplit 可以开启横向分屏,这是我极为常用的一个功能,但是,默认的新窗口会出现在当前窗口的上面(纵向)或左边(横向),这不太符合我的预期,所以我进行了下面两个配置:
— open new vertical split bottom
vim.opt.splitbelow = true
— open new horizontal splits right
vim.opt.splitright = true
3.8 关于搜索
文件内搜索我通常希望 vim 能够忽略大小写,将所有结果都展示出来,同时,如果我专门输入了大写字母,我又不希望 vim 忽略大小写,所以我进行了这样的配置:
— Case-insensitive searching UNLESS C or capital in search
vim.opt.ignorecase = true
vim.opt.smartcase = true
— Set highlight on search
vim.opt.hlsearch = true
第三个配置,表示是否要将查询到的所有结果都高亮显示,默认是 true,有些人不喜欢显示那么多查询结果,所以要将它设置为 false,这要看每个人的习惯了。
3.9 关于交换文件
vim 的一个重要功能就是交换文件,它保存了你尚未保存的文件内容,以防出现意外情况,默认情况下,每当你录入 200 个字符或 4 秒内没有任何录入的情况下才会写入交换文件,这有点过长了,因此我们可以进行如下配置,将 4 秒缩短到 250 毫秒:
— Decrease update time
vim.opt.updatetime = 250
3.10 关于快捷键
很多快捷键是需要我们先后按两个甚至更多个按键来实现的,所以我们最好配置一个老板键,这样我们需要配置这样的快捷键时,可以用 配置来代替这个老板键,方便我们随时集中更改它,默认的老板键是 ,我更喜欢空格:
— Set as the leader key
— See `:help mapleader`
— NOTE: Must happen before plugins are required (otherwise wrong leader will be used)
vim.g.mapleader = ‘ ‘
vim.g.maplocalleader = ‘ ‘
有时我们按下组合键中的第一个键,可能并不是真的想要去触发组合键,所以可以为这样的组合键配置一个超时时间:
vim.opt.timeout = true
vim.opt.timeoutlen = 300
3.11 关于代码补全的弹窗
代码补全对于程序员来说是至关重要的,那么,代码补全的弹窗弹不弹、怎么弹,就需要按照个人习惯进行配置了:
— Set completeopt to have a better completion experience
vim.opt.completeopt = ‘menuone,noselect’
具体的选项有:
4. 按键映射配置
对于 nvim 的使用来说,按键映射的配置太重要了,同时这又是一个十分取决于个人使用习惯的配置。
和上述基础配置一样,我将按键配置放在了 ~/.config/nvim/lua/keymaps.lua 中,并且在 init.lua 中引用:
require("keymaps")
4.1 配置方法
vim 提供了 lua 函数来进行按键映射的配置:
vim.keymap.set({mode}, {lhs}, {rhs}, {opts}
lhs 参数指定了我们想要的按键映射。
rhs 参数指定了我们希望这个按键映射对应的行为,你可以设定为一组已有的默认按键,也可以创建一个 lua 函数进行更复杂的设置。
opt 参数是一个 lua table,可以包含以下 key:
接下来,你就可以去设置你自己的配置了。
4.2 插件配置
插件管理我切换到了相较于 vim-plug 更加易用的 lazy,它的好处是可以有单独的弹窗来管理你的所有插件的安装、清理、更新等等,非常方便。
它的配置方法也很简单,可以参看:
这里列几个我安装了的插件吧:
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777