Skip to content

iChunyu/nvim

Repository files navigation

某春雨自用的 NeoVim 配置

本仓库是我自用的 NeoVim 配置,使用 Lua 进行配置。

目录

安装前的准备

本配置文件适配最新版 NeoVim,请确保其版本不低于 0.7。

为确保功能正常,请确保 PythonNode.js 已正确安装,然后在命令行补充以下功能:

pip install pynvim
# yay -S npm
sudo npm install -g neovim

为确保 Telescope 等插件功能正常,可通过包管理器选择性安装以下工具:

插件和 LSP 应当在首次启动时自动安装,如果未能正确安装,请确保能够正常访问 GitHub 后重新启动,或手动运行 :Lazy 后按 U 进行同步。插件安装完成后可使用 :checkhealth 检查依赖是否正常。

vimtex 配置使用 zathura 作为默认的 PDF 阅读器,可通过包管理器安装。

对于 ArchLinux,上述工具可以采用以下命令安装:

yay -S fd ripgrep xclip zathura zathura-mupdf
yay -S jre-openjdk          # Neovim 的 LTeX LSP 需要 Java 环境

基本键位映射

本配置文档的 <leader><localleader> 均设置为 空格 ,其他组合键如下,注意区分大小写。

功能
光标移动
j, k 基于屏幕行的上下移动
gj, gk 基于实际行的上下移动
J, K 基于屏幕行向下、向上跳转 5 行
0, $ 普通模式下跳转到屏幕行的行首、行尾(可视模式下为实际行)
保存与退出
<leader>w 保存
<leader>q 退出(未保存时会报错,不会退出)
<leader>Q 忽略改动并退出
<leader>W 保存并退出
搜索
= 跳转到下一个结果并使其居中于屏幕
- 跳转到上一个结果并使其居中于屏幕
<leader><CR> 取消搜索结果高亮
分屏
<leader>sh 向左新开一个分屏
<leader>sj 向下新开一个分屏
<leader>sk 向上新开一个分屏
<leader>sl 向右新开一个分屏
<leader>h 跳转到左侧分屏
<leader>j 跳转到下面分屏
<leader>k 跳转到上面分屏
<leader>l 跳转到右侧分屏
<leader>H 将当前分屏移动到最左侧
<leader>J 将当前分屏移动到最底端
<leader>K 将当前分屏移动到最顶端
<leader>L 将当前分屏移动到最右侧
<c-up> 增大分屏高度
<c-down> 减小分屏高度
<c-right> 增大分屏宽度
<c-left> 减小分屏宽度
*行移动
<a-j> 把当前行下移一行
<a-k> 把当前行上移一行
其他
<leader>o 向下插入空行
<leader>O 向上插入空行
<leader>F 使用 LSP 格式化代码

插件配置

除了 lazy.nvim 插件在 init.lua 文件中自动配置外,其他的插件都在 lua/plugins/ 目录下。

[lazy.nvim] 重新映射了快捷键 <leader>lz 以快速打开插件菜单。

Coding

coding.lua 的插件与编写代码的基本体验相关,主要是对 LSP 和补全系统进行配置。相关的插件和键盘映射有:

  • mason.nvim:主要用于管理 LSP 的安装,可以使用 :Mason 查看已经安装的 LSP 等工具
  • mason-lspconfig.nvim:主要用于配置 LPS 的自动安装
  • nvim-lspconfig:提供了多数 LSP 的默认配置
  • nvim-cmp:根据 LSP 和代码片段提供自动补全功能,进一步有键盘映射:
    • <tab>:如果有多个补全项,向下选择
    • <s-tab>:如果有多个补全项,向上选择
    • <c-j>:如果有帮助文档,向下翻页
    • <c-k>:如果有帮助文档,向上翻页
    • <c-e>:取消补全
  • LuaSnip:自定义代码片段,具体可以查看根目录 LuaSnip/ 路径下的配置

Editor

editor.lua 内的插件用于给编辑器增加一些通用的功能,包括:

  • fcitx.nvim:用于自动切换中英文输入法,这在使用 NeoVim 编写中文文档的时候非常有用
  • renamer.nvim:基于 LSP 增强变量重命名功能,并提供了一个简单的 UI 小窗口
    • <F2>:重命名当前光标下的变量
  • Comment.nvim:智能注释,可以根据编程语言自动确定注释符
    • <c-_>:开关行注释
    • <a-a>:开关块注释
  • nvim-autopairs:自动补全定界符
  • tabular:根据指定的符号将选定区域进行对齐
    • <leader>a:触发对齐功能,输入对齐位置的符号并回车后会自动对齐
  • nvim-surround:自动处理周围的定界符,采用的是该插件默认的键位映射
    • ys<motion><char>:在 <motion> 指定范围周围添加与 <char> 匹配的定界符,例如 ysiw( 会在 iw 指定的当前字符周围添加由 ( 指定的小括号对
    • ds<char>:删除光标周围由 <char> 指定的定界符,例如 ds( 会删除光变所在位置周围最内侧的小括号对
    • dst:删除光标周围的 HTML 标签
    • cs<char1><char2>:将周围由 <char1> 指定的定界符改为 <char2> 对应的定界符,例如 cs(< 会把光标周围最内侧的小括号对替换为尖括号对
    • 说明:上述命令中,如果 <char> 指定的是左定界符,命令处理后会确保内容与定界符之间保留一个空格;如果 <char> 指定的是右定界符,则会确保没有空格
  • gitsigns.nvim:添加 Git 功能,添加了自定义键位
    • <leader>gd:查看当前位置的改动
    • <leader>gj:跳转到下一个改动位置
    • <leader>gk:跳转到上一个改动位置
    • <leader>ga:将光标当前位置的改动提交到暂存区
    • <leader>gA:将当前缓冲区的改动全部提交到暂存区
    • <leader>gu:撤销 “提交到暂存区” 的动作
    • <leader>gb:开关每行最后改动的提示
    • <leader>gB:查看上次提交的信息
  • flash.nvim:强化的光标移动,采用了插件的推荐配置
    • s:触发跳转,此时窗口会变暗,输入待跳转位置的字符,然后输入对应位置紧接的第二个字符(根据情况,周围的字符可能会临时改变),就可以跳转过去
    • S:窗口变暗,给出提示字符,触发范围选择
    • f:触发向后搜索,输入字符后会高亮显示所有匹配字符,然后重复按 f 可以向下跳转,按 F 可以向上跳转
    • F:与 f 相似,只是触发向前搜索,连续按 f 可以向前连续跳转,按 F 可以向后跳转 tT:与 fF 相似,只是向后或向前跳转到指定字符的前一个或后一个字符的位置
  • undotree:采用类似 Git 的方式记录文件的临时改动
    • <leader>u:打开侧边栏,显示编辑历史,可以选择、预览、回退到某个版本

Writing

writing.lua 对 Markdown 和 LaTeX 编写进行了加强,主要插件有:

  • vimtex:极大提升使用 NeoVim 编辑 LaTeX 文档的体验,采用默认键位映射,常用的有:
    • <localleader>li:查看当前文档信息
    • <localleader>lt:打开目录
    • <localleader>ll:编译文档
    • <localleader>lv:打开编译后的文档
    • <localleader>lc:清理编译产生的临时文件
    • <localleader>lC:清理所有非必要文件
    • dse:删除周围环境
    • dsc:删除周围命令
    • ds$:删除行内数学
    • dsd:删除周围定界符
    • cse:更改周围环境
    • csc:更改当前命令
    • cs$:更改行内数学
    • csd:更改周围定界符
    • tsc:切换带星号的命令
    • tse:切换带星号的环境
    • tsd:切换周围定界符
    • <F7>:为选择的文本添加命令
    • <F8>:为周围定界符添加 \left\right
  • vim-markdown:主要用到里面对 Markdown 文件数学环境的检查,以正确触发数学公式相关的代码片段
  • [vim-markdown-toc](https://github.com/mzlogin/vim-markdown-toc):自动生成各种风格的目录,并且在编辑过程中保持更新
    • :GenTocGFM:生成 GitHub Markdown 风格的目录
    • :GenToc<type>:其他 <type> 风格包括 RedcarpetGitLabMarked
  • markdown-preview.nvim:在浏览器预览 Markdown 文件
    • <leader>mp:开关 Markdown 预览功能

UI

ui.lua 主要用于美化界面,多数插件没有绑定快捷键,但还是做一些简单的描述:

  • nui.nvim:与 UI 相关的基础组件,其他插件的依赖项
  • nvim-notify:美化的通知栏,其他插件的依赖项
  • nvim-web-devicons:图标支持,其他插件的依赖项
  • plenary.nvim:一些基本函数,其他插件的依赖项
  • noice.nvim:主要的 UI 美化插件
  • tokyonight.nvim:配色方案
  • lualine.nvim:底部状态栏
  • indent-blankline.nvim:缩进参考线
  • nvim-colorizer.lua:直接在颜色或颜色代码底色显示对应的颜色
  • marks.nvim:增强 NeoVim 的打标签功能,这里只记录常用键位
    • m<char>:用 <char> 标记当前行,可用于快速跳转
    • dm<char>:删除标签 <char>
    • dm-:删除当前行的标签
    • dm<space>:删除当前缓冲区的所有标签
    • m]:跳转到下一个标签位置
    • m[:跳转到上一个标签位置
  • todo-comments.nvim:高亮注释中的 TODO、HACK、BUG 等关键字
  • nvim-scrollbar:右侧的滑动条,支持鼠标拖动浏览文件
  • bufferline.nvim:编辑器顶部的标签管理,自定义了一些键位:
    • tt:触发跳转功能,选择标签中红色字符对因的按键即可跳转到对因缓冲区
    • th:跳转到左侧的缓冲区
    • tl:跳转到右侧的缓冲区
    • tq:触发关闭功能,选择标签中红色字符对因的按键即可关闭对应的缓冲区
    • td:退出当前的缓冲区
  • nvim-treesitter:目前主要用到它的高亮功能,也是部分插件的依赖

Explorer

explorer.lua 主要提供了文件交互相关的功能:

  • nvim-tree.lua:侧边栏文件目录
    • <leader>e:打开或关闭文件浏览侧边栏
  • telescope.nvim:快速文件预览和查找,简单地映射了几个快捷键
    • <leader>ff:根据文件名查找文件
    • <leader>fg:根据内容查找文件
    • <leader>fb:查找打开的缓冲区
    • <leader>fh:查找帮助文档

参考资料

David Chen (哔哩哔哩:TheCW)在哔哩哔哩上对 [Neo]Vim 的详细介绍和展示,这是促使我入坑的主要因素;配置初期也参考了他分享的配置文档。相关链接如下:

Elijan Mastnak 分享了详细的关于使用 NeoVim 编辑 LaTeX 的系列文章,极大改善了 LaTeX 文档编写体检。相关链接如下:

Dave Lageawesome-neovim 收集了很多优秀的插件,并经常更新,有新需求不妨先在这个仓库看看。