vim是一个可以高度定制化的编辑器,但是大部分人在编码过程中更多的是使用各种IDE,比如Jetbrains、VsCode等等,主要是由于vim的功能过于简单,如果想要把它配置成炫酷漂亮、功能齐全的IDE,需要付出很多的精力和时间。今天就介绍一款工具NvChad,可以让你快速将vim打造成功能齐全的IDE。

本文章前半部分主要为视频《使用一行命令将NeoVim打造成功能齐全的IDE》的笔记,不想查看前半部分,可以直接看这个视频,如果想深入自定义部分,可以查看最后自定义的相关内容。

环境配置

安装NeoVim

不是要说vim吗?为什么要安装NeoVim?NeoVim是vim的一个分支,它在0.5.x版本引入Lua编程语言作为编辑器一等语言,相比传统的vimscript脚本,Lua作为通用编程语言,代码更清晰、运行速度快、语法也很简单。现在很多vim插件也都有基于Lua原生NeoVim版本,所以它脱离了传统vim的约束,更加现代化。

NeoVim官方网站: https://neovim.io/

这里NvChad推荐安装0.8.3或者以上版本。具体安装方式不同系统有所差异,可以自行查阅NeoVim官方文档。

如果你使用Windows系统,建议使用WSL,我更习惯使用Arch Linux WSL,微软官方商店就可以下载到,它能保证所有下载的软件基本都是最新的。我这里使用的安装命令就是:

sudo pacman -S neovim

安装后可能你还想所有文件都是用vim命令打开,而不是使用繁琐的nvim打开,此时你就需要使用alias设置别名。如果需要一直生效还需要把它写入shell的启动脚本里面。如果是zsh就写入到~/.zshrc,如果不知道用的什么shell可以使用echo $SHELL命令查看。

# 单次别名,只在当前会话有效
alias vim=nvim

# 将别名写入shell启动脚本里面,可以一直有效
# 我这里使用了oh-my-zsh,所以是写到~/.zshrc
# 具体看情况,你的也可能是写入到~/.bashrc里面
echo 'alias vim=nvim' >> ~/.zshrc

安装Nerd Font

由于常规字体不包含图标数据,我们在使用vim作为编辑器,比如在文件树中,不同语言要显示不同图标,如果字体不支持就会显示为方块。所以这里建议安装Nerd Font,因为它在字体中包含了很多图标。

官方网站:https://www.nerdfonts.com/

如果是windows系统,建议安装哪些名字为XXX Windows Compatible.ttf的字体文件。

然后很重要的一步,就是把你的Terminal字体修改为刚才安装的带有NF结尾的字体,保存。

设置terminal字体

安装ripgrep

这一步是可选的,如果需要使用Telescope插件来进行文件的grep检索,建议安装。

sudo pacman -S ripgrep

安装NvChad

NvChad已经帮我们集成了很多需要使用的功能,所以直接安装即可。

在安装之前需要先备份你之前的nvim配置,并清除nvim缓存:

# 备份旧的配置
mv ~/.config/nvim ~/.config/nvim.backup
# 清理nvim缓存
rm -rf ~/.local/share/nvim

然后安装NvChad。

git clone https://github.com/NvChad/NvChad ~/.config/nvim --depth 1 && nvim

此时你可以看到一个提示,是否安装样例个性化配置,先输入N,不安装。

确认窗口

然后可以看到一个安装默认插件的界面,等待它安装完毕即可。

确认窗口

安装完成后,可以看到安装完毕后的Notes界面,这就代表安装完毕了。

安装完成Notes界面

功能预览

主题切换

主题切换

  • <Space>th:打开主题切换器,th是theme的前两个字母
  • Ctrl + n: 下一个,n代表next
  • Ctrl + p: 上一个,p代表previous
  • 也可以直接输入主题名字进行选择切换

语法高亮

NvChad的语法高亮通过nvim-treesitter插件实现。

nvim-treesitter: https://github.com/nvim-treesitter/nvim-treesitter

treesitter官网:https://tree-sitter.github.io/tree-sitter/

语法高亮

命令概览:

  • :TSInstall XXX: 安装对应语言语法高亮,比如:TSInstall go或者:TSInstall rust
  • :TSInstallInfo: 这个命令可以看到TreeSitter支持哪些语言语法高亮,哪些安装了,哪些没安装

文件树

NvChad的文件树功能是通过nvim-tree插件实现的。

nvim-tree: https://github.com/nvim-tree/nvim-tree.lua

文件树

命令概览:

  • Ctrl + n: 打开文件树
  • j/k: 上下移动
  • o/回车: 打开文件/文件夹
  • m: 标记文件(mark)/取消标记,方便在大型项目中快速找到
  • a: 新建文件
  • c: 复制文件
  • p: 粘贴文件
  • r: 重命名
  • d: 删除文件

文件跳转

在开发过程中,我们更多的不是通过文件树来查找文件,而是通过快速搜索打开文件。

文件跳转

命令概览:

  • <Space>ff: 查找文件
  • <Space>fb: 查找缓冲区中已经打开的文件

备忘清单

NvChad提供了一个备忘清单的功能,可以帮助我们快速查找参考键盘命令。

备忘清单

命令概览:

  • <Space>ch: 打开备忘清单,ch代表cheat的前两个字母
  • j/k: 上翻或者下翻
  • ESC: 关闭备忘清单
  • <Space>等待1秒:下方就会给出部分命令的提示,还会写明作用,继续输入相应的命令,就会提示下一个字母会是什么功能。

命令提示

窗口跳转

窗口跳转

命令概览:

  • Ctrl + h: 移动到左边窗口
  • Ctrl + l: 移动到右边窗口
  • Ctrl + j: 移动到下方窗口
  • Ctrl + k: 移动到上方窗口
  • :vsp: 垂直分屏
  • :sp: 水平分屏
  • <Space>n: 绝对行号显示/关闭
  • <Space>rn: 相对行号显示/关闭

标签页

标签页

命令概览:

  • <Tab>: 向右翻动标签页
  • Shift + <Tab>: 向左翻动标签页
  • <Space>x: 关闭当前标签页

Terminal

Terminal

命令概览:

  • Alt + h: 打开/关闭水平命令窗口
  • Alt + v: 打开/关闭垂直命令窗口

自定义

如果需要自定义,NvChad的自定义主要是在~/.config/nvim/lua/custom目录下面。

NvChad也提供了一个样例配置仓库https://github.com/NvChad/example_config,如果想省事,可以直接把这个仓库clone到custom目录下。

  • chadrc.lua: 用于存放NvChad的配置信息
  • init.lua: 主要用于存放nvim的配置信息
  • mappings.lua: 主要用于存放一些快捷键的映射信息
  • plugins.lua: 主要用于存放安装的插件

先看custom/init.lua,这里可以放置一些nvim的基础配置,比如:

-- 设置右侧参考线,单行最长120个字符
vim.opt.colorcolumn = "120"
-- 设置相对行号
vim.wo.number = true
vim.wo.relativenumber = true

再来看custom/chadrc.lua:

local M = {}
-- 我们之前设置的主题存储在这里
M.ui = {theme = 'catppuccin'}
-- 如果需要覆盖插件配置可以添加这一行,并添加plugins.lua文件
M.plugins = 'custom.plugins'
-- 引入快捷键的配置
M.mappings = require "custom.mappings"
return M

最后是custom/plugins.lua,这里主要就是引入一些插件,并返回插件列表:

local plugins = {
  
}
return plugins

定义语法高亮

比如我们前面提到的treesitter可以用作代码的语法高亮,但是默认只开启了lua,我们就可以在custom/plugins.lua里面添加我们需要的语言:

local plugins = {
  -- 安装平时使用语言的treesitter
  {
    "nvim-treesitter/nvim-treesitter",
    opts = {
      ensure_installed = {
        -- default
        "vim", "lua",

        -- 前端开发
        "html", "css", "javascript", "typescript",
        "tsx", "json",

        -- go语言
        "go", "gomod", "gosum",
        
        -- rust语言
        "rust", "toml",

        -- 其他
        "dockerfile", "git_config", "gitignore",
        "markdown", "yaml",
      },
    },
  }
}

return plugins

自定义定义LSP配置

首先我们可以使用Mason来管理我们的LSP相关文件,在custom/plugins.lua内添加我们需要安装的语言的LSP:

  -- ...前面的先省略了
  {
    "williamboman/mason.nvim",
    opts = {
      ensure_installed = {
        "lua-language-server",
        "html-lsp",
        "prettier",
        "stylua"
      },
    },
  }

我们还需要覆盖默认的lsp配置,我们先添加自定义的lsp配置,创建custom/configs/lspconfig.lua

local on_attach = require("plugins.configs.lspconfig").on_attach
local capabilities = require("plugins.configs.lspconfig").capabilities

local lspconfig = require "lspconfig"
local servers = { "html", "cssls", "clangd"}

for _, lsp in ipairs(servers) do
  lspconfig[lsp].setup {
    on_attach = on_attach,
    capabilities = capabilities,
  }
end

-- 对于不想使用通用配置的语言lsp,我们还可以自定义
-- 
-- lspconfig.html.setup {
--   on_attach = on_attach,
--   capabilities = capabilities,
-- }
--
-- lspconfig.cssls.setup {
--   on_attach = on_attach,
--   capabilities = capabilities,
-- }

修改custom/plugins.lua,添加以下代码

  {
    "neovim/nvim-lspconfig",
    config = function()
        require "plugins.configs.lspconfig"
        require "custom.configs.lspconfig"
    end,
  },

代码格式化

代码格式化建议安装null-ls来管理,修改custom/plugins.lua

{
  "neovim/nvim-lspconfig",

   dependencies = {
     "jose-elias-alvarez/null-ls.nvim",
     config = function()
       require "custom.configs.null-ls"
     end,
   },
 
   config = function()
      require "plugins.configs.lspconfig"
      require "custom.configs.lspconfig"
   end,
}

这里让null-lslspconfig之后加载,因为lspconfig是懒加载的。

创建custom/configs/null-ls.lua:

local null_ls = require "null-ls"

local formatting = null_ls.builtins.formatting
local lint = null_ls.builtins.diagnostics

local sources = {
   formatting.prettier,
   formatting.stylua,

   lint.shellcheck,
}

null_ls.setup {
   debug = true,
   sources = sources,
}

格式化的快捷键为<Space>fm

快捷键

NVim中快捷键的表示为:

  • <C> -> Ctrl
  • <leader> -> Space
  • <A> -> Alt
  • S -> Shift

默认情况下,快捷键映射是定义在core.mappings(core/mappings.lua)

你也可以使用NvCheatsheet或者Telescope keymaps来列出所有快捷键。

为了定义快捷键,我们可以修改custom/mappings.lua文件:

local M = {}

-- 禁用部分快捷键
M.disabled = {
  n = {
    ["<leader>h"] = "",
    ["<C-a>"] = ""
  }
}

-- 定义你自己的快捷键
M.abc = {
  n = {
     ["<C-n>"] = {"<cmd> Telescope <CR>", "Telescope"}
     ["<C-s>"] = {":Telescope Files <CR>", "Telescope Files"} 
  }

  i = {
     ["jk"] = { "<ESC>", "escape insert mode" , opts = { nowait = true }},
    -- ...
  }
}