nvim 的配置
本文会先介绍一下 nvim 的配置文件的结构, 然后讲我自己的配置, 纯新手向.
我的配置思路是, 导入 vim 中已经有的基础配置, 并延续使用某些插件. 而nvim有更多更加强大的插件(主要是语言支持之类的), 我们另外折腾.
本配置已同步发布于 github仓库
nvim 是怎么配置的
Linux 下, nvim 的配置文件目录在 ~/.config/nvim, 如果没有这个目录就新建一个.
注:该目录是我们默认的根目录, 下面所有的目录都是在这个根目录下说的.
比如我们说
lua/plugins.lua, 其实指的是~/.config/nvim/lua/plugins.lua
该目录下有一个 init.lua, 这是所有配置的入口, 通过这个文件来导入其它的配置文件. 到最后 nvim 启动的时候, 就只调用这一个 init.lua 文件
根据资料, 似乎还有别的目录的配置文件, 但这些基本上是nvim自带的, 我们不去动它
因此理论上我们可以把所有配置都挤在 init.lua 里面, 但这样太臃肿了. 现在流行的做法是结构化的管理. 因此我们把各种功能的配置文件按照某种结构排好, 并在 init.lua 里面依次调用它们
导入vim已有配置
在 lua 里面可以用 vim.cmd('...') 来执行一个 vim 中的命令, 相当于 vim 中写 :xxx. 而vim 中, 可以用 source 命令来加载某个配置文件
因此, 比如, 我们现在有一个 .vimrc, 我们可以直接用 vim.cmd('source .vimrc') 来加载这个 vimrc 配置文件.
然后我们就可以直接用大部分的 vim 原来的配置使得我们可以快速的使用 nvim
nvim 自己的配置
插件管理: packer.nvim
根据 “Quickstart” 一栏, 安装的步骤为:
git clone --depth 1 https://github.com/wbthomason/packer.nvim ~/.local/share/nvim/site/pack/packer/start/packer.nvim- 在
init.lua里面写一行vim.cmd [[packadd packer.nvim]]
就安装好了 packer.nvim
接下来, 用这段代码安装插件:
1 | return require('packer').startup(function(use) |
写很多个 use ... 来安装多个插件, 里面也可以用一个花括号写一些插件的配置. 我们把这段代码放在 lua/plugins.lua 目录下. 可以在这里看到我装了什么插件.
我们需要把 packer.nvim 自己先给装上去, 写 use 'wbthomason/packer.nvim'
每次更新 plugins.lua 后, 运行 :PackerSync 来更新插件, 包括删除和安装.
注意:直接把整个配置文件拷贝过来是不可行的, 会报很多错. 操作顺序大概是: 先把 packer 安装好, 然后把 plugins.lua 复制进来,
:PackerSync, 然后再导入别的配置文件.
我的插件
见 lua/plugins.lua
1 | -- use 一些颜色主题 |
主题配置
设置主题: use '主题的github地址', 然后在 vimrc 中写 colors 主题
这个 github 地址一般是 作者名字/主题名字 的形式
推荐: doki theme natsuki dark: use 'doki-theme/doki-theme-vim' 然后 colors natsuki_dark
推荐: catppuccin mocha: use 'catppuccin/nvim' 然后 colors catppuccin-mocha
目前用的是 catppuccin-mocha
插件配置
我的插件的配置为 lua/plgconf.lua 里面, 这些配置多数也是抄的网上的.
主要配置内容:
- bufferline: 调整界面大小, 以及绑定界面移动的快捷键
- markdownpre: markdown 预览相关的内容
- vim-tex: tex 相关的内容
- nvim-tree: 调整界面
- ultisnips: 绑定快捷键 (注: 具体的snippets不在这里写)
语言支持:lsp
lsp: Language Server Protocol, 就是语言支持相关的内容. 包括 C++, Python 等代码的自动补全和纠错.
我现在用的是 coc.nvim.
- 安装:
use {'neoclide/coc.nvim', branch = 'release'}. - 安装后用 coc.nvim 安装 lsp:
:CocInstall coc-clangd coc-pyright coc-lua coc-markdownlint ..这些具体的语言服务器的插件, 可以在 这里 看到 - 可以在根目录下
coc-settings.json中进一步配置coc.nvim - 我在
lua/keybind.lua中配置了相关快捷键, 详见文件
除此之外, 还用了 ultisnips 进行补全, Comment 进行注释
关于自动补全
首先是快捷键. shift+tab 手动展开, ctrl+j 跳转下一个 placeholder, ctrl+k 则跳回上一个.
placeholder 就是我们 snippet 中的 $1 $2 这种东西, 中文大概叫 “占位符”, 在 coc 里面也有相同的东西
这里有 ultisnips 的键位和 coc 的键位, 我都绑定为了 ctrl+j 和 ctrl+k
然后是具体有哪些 snippets. ultisnips 的 snippets 存储在根目录下的 snip/ 子目录中, 可以根据文件类型分类, 比如 cpp.snippets 就只对 cpp 文件生效, tex.snippets 就只对 tex 文件生效, 等等
我配置的主要是 latex 中的, 见 snip/tex.snippets.
关于 coc 的一个坑: 头文件自动补全
coc-clangd 会自动 include 你用的函数的头文件, 就比如你写 cin 了之后就会被检测到并且 #include<iostream>
这看起来很不错, 可是在 ICS PA 这种项目中, 会导致头文件出错这种很可怕的问题, 因此我们要手动关掉
在 coc-settings.json 中, 设置:
1 | { |
即可关闭
关于 clangd 在多文件项目中的使用
在做一些大项目的时候 (例如高程计组的PA) 往往会遇到很多的文件, 需要用 make 去组织编译的时候, clangd 似乎会不太好用.
不过没有关系, 可以 bear -- make 生成 compile_commands.json, 然后 clangd 会读取这个东西然后就会认得各种东西了.
有时候, 当你没这么做或者没及时更新它的时候, 可能会出现 clangd 报错过多从而崩溃的问题. 平常而言它其实挺好用的.
关于注释
不知道 coc.nvim 有没有自带的注释功能, 至少我没找到简单好用的
我用的是 Comment.nvim 的插件, 然后需要改一下键位, 改成 ctrl-/ 注释
这里有一个很神奇的地方! 就是vim里面按下 ctrl-/ 的时候, 系统实际检测到的键位似乎是 ctrl-_, 所以要把 trigger 写成这个东西. 但我不知道原因, 还在调查中
Markdown和Tex的预览
稍微摸索了一下, 找到这两个好用的.
首先我安装了一下 texlive. 这个部分省略.
然后 use 'lervag/vimtex' 即可预览 tex 了, 具体用法详见这个插件的 github 仓库, 而且还可以实时加载: 每当 :w 的时候就会更新一次
markdown 的预览: 用 markdown-preview 插件
1 | use({ |
更高效的 latex
快捷键、编译运行方式的修改
我们把绑定快捷键的配置统一放在 lua/keybind.lua, 包括以前的 vim 的配置里面的一些快捷键也放这.
以及, 说一件事, 在 nvim 里面, 使用 :! 系统命令 依然可以执行, 但如果要这样调用编译好的可执行文件, 似乎很难输入数据. 所以, 我搜到了一个新的方法. 就是我们先开一个分屏, 在分屏里面开终端, 然后跑程序. 代码如下
1 | function Create_term_buf(_type, size) |
然后, 比如, C++ 的配置就是调用 NewBufRunCmd("g++ ... -o ... && ./...") 就可以了
同时, 这个开终端也是非常好用的功能. 我绑定了快捷键 F1 表示开一个空的终端, 然后手动输入命令来运行. 这个东西在跑 python 的时候可以 F1 然后 python -i .., 非常好用
关于 kitty 中的键位问题
kitty 对按键事件的处理和传统的终端是不一样的, 它有自己的一套协议
因此在 kitty 里面有些配置会出现问题, 比如之前提到在传统终端中识别 ctrl+/ 这个键位, 要写成 ctrl+_, 这是终端特色, 但是在 kitty 里面就应该直接写 ctrl+/, 因为它会 原样 的识别出按键组合
此外还有各种杂七杂八的问题, 最终的写法请参考目前版本的 github 仓库, 这个写法是适配 kitty 的