前言

最近几天参考 LunarVim/Neovim-from-scratch 把我的 NeoVim 配置从 VimScript 转换为纯 Lua 了。

启动图

我原来用 NeoVim 只是写点 demo 和小脚本,凑合配置了个好看的主题和代码补全就已经能满足我的使用要求了。但是最近我在学习麻省理工的操作系统课程 MIT6.S081,这个课程的 Labs 需要查看和修改 xv6 操作系统的代码,这是一个比较庞大的项目,我的 NeoVim 配置就有点不够看了,于是最近几天我就重写了一套配置,目前已经达到了理想中的效果。

GitHub: wsmbsbbz/lua-nvim-config

功能介绍

配置结构如下

.
├── README.md
├── init.lua               # 导入 ./lua/user 目录下的 lua 模块
├── lua
│   └── user
│       ├── alpha.lua                       # 更改默认启动界面
│       ├── autopairs.lua                          # 闭合括号
│       ├── bufferline.lua       # 美化打开的 Buffers 和 Tabs
│       ├── cmp.lua                                # 自动补全
│       ├── colorscheme.lua                        # 主题配色
│       ├── gitsigns.lua                          # Git 增强
│       ├── indentline.lua                  # 高亮显示缩进层级
│       ├── keymaps.lua                            # 按键映射
│       ├── lsp              # Language Server Protocol 相关
│       │   ├── handlers.lua                   # lsp 相关配置
│       │   ├── init.lua               # 管理 lsp 的 lua 模块
│       │   ├── lsp-installer.lua            # lsp 安装管理器
│       │   └── settings                  # 不同语言的细化配置
│       │       ├── jsonls.lua                       # JSON
│       │       ├── pyright.lua                    # Python
│       │       └── sumneko_lua.lua                   # Lua
│       ├── lualine.lua                     # 美化下方的状态栏
│       ├── marks.lua                          # 增强标记功能
│       ├── nvim-tree.lua                        # 文件管理器
│       ├── plugins.lua                            # 插件管理
│       ├── settings.lua                  # NeoVim 的基础配置
│       ├── telescope.lua            # 提供了非常强大的搜索功能
│       ├── toggleterm.lua        # 增强 NeoVim 的内置终端功能
│       ├── treesitter.lua                     # 增强代码高亮
│       └── whichkey.lua             # 整合 <Leader> 按键映射
└── plugin     # 插件管理器 Packer 自动生成的,能加快插件加载速度
    └── packer_compiled.lua

5 directories, 26 files

本篇文章的第一张图就是用 alpha.lua 更改了默认的启动界面

外观:bufferline, lualine, material

lualine.lua, bufferline.lua, indent-blankline, colorscheme.lua 提供外观美化

代码高亮和自动补全

treesitterlsp 的加持下,代码高亮、语法补全、代码审查丝毫不输 VSCode,下图为 VSCode

VSCode 代码高亮和自动补全

which-key

which-key 把按键映射整合到一起,按下 <Leader> 键就会弹出一个浮窗,可以选择后续要执行的操作

toggle-term

比如,我按下 <Leader> t 打开浮动终端(由 toggle-term 提供),可以很方便地在编辑文件时执行命令,不需要在终端中打开额外的标签页

horizontal terminal

也可以把终端放置在下方或者左右两侧

gitsigns-1

gitsigns 查看 diff

gitsigns-2

gitsigns 配合 telescope 查看 commits

nvim-tree 和 代码审查

nvim-tree 进行文件管理,以及前面没演示的代码审查

查看函数调用

同样可以直接跳转到函数定义、函数调用

telescope

以及这个无所不能的 telescope ,文件跳转、文件内容查询、Gitmarks、代码结构……几乎能搜索一切你想要的东西,下图是 xv6 系统 vm.c 的代码结构:

vm.c

还有很多功能就不一一介绍了,NeoVim 能够实现的功能远不止如此,我也才使用了半年多的 Vim/NeoVim ,还有不要强大的功能比如 VimScipt 没有学习。至少目前来讲,我已经可以使用 NeoVim 已经替代 VSCode 进行日常的学习和开发了。

FAQ

  1. VSCode 等现代化编辑器已经如此强大,为什么要用 Vim/NeoVim

    1. 在涉及到命令行的场景下,Vim/NeoVim 使用起来非常方便。
    2. Vim/NeoVim 可以进行非常深度且强大的个性化定制,可以按照自己的习惯打造成专属于自己的编辑器。
    3. 全平台支持,同一套配置可以无缝迁移到服务器上。
    4. 使用 Vim/NeoVim 写代码比大多数图形界面的代码编辑器更加高效,还提供了 等现代化代码编辑器不提供的功能。
  2. Windows 系统上可以顺利使用 Vim/NeoVim 吗?

    可以,但是要稍微麻烦一点。推荐安装一个 WSL(Windows Subsystem for Linux),配合 Windows Terminal 使用,能获得一个非常良好的体验,顺便学习一下命令行界面(Command-line interface)的使用。

  3. 相关学习资料?

    学习 Vim/NeoVim 的使用:iggredible/Learn-Vim

    VimScript 配置迁移到 Lua 的教程:nanotee/nvim-lua-guide