有哪些编程必备的 Vim 配置?

用 Vim 的话, 有什么推荐的配置呢?
关注者
3,194
被浏览
966,079
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

LunarVim: Code on Neovim

前言

自从 NeoVim 支持 LSP 并转用 Lua 作为首席插件语言代替又丑又慢 VimL 后, 使用体验直接翻倍。 LunarVim 就是基于全新 Neovim Lua 生态打造的配置集合, 旨在将 Neovim 打造成高性能的 IDE.迁移到 LunarVim 后, nvim 启动时间从原来的 829.953ms 降到了 187.835ms.

安装

首先你需要安装 LunarVim , 安装依赖包括:

  1. neovim-0.7 或以上版本
  2. git
  3. python pip
  4. nodejs npm
  5. rust cargo (可选, 你可以手动安装 ripgrep 和 fd-find)
bash <(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/master/utils/installer/install.sh)

如上, 官方的安装脚本会提示你是否需要自动安装依赖, 可能会有如下问题:

  • 记得挂梯子 (✿◡‿◡) 真的会谢
  • 记得设置 npm 的 prefix 以设置可访问的全局安装路径
npm config set perfix ~/.local
  • 你可能需要将 ~/.cargo/bin 加入你的环境变量PATH

然后, 安装本配置:

# backup original config
mv ~/.config/lvim{,.bak}
# install my config
git clone https://github.com/mrbeardad/MyLunarVim ~/.config/lvim
# install all plugins
lvim --headless -c 'autocmd User PackerComplete quitall' -c 'PackerSync'

lvim 是 LunarVim 官方提供的启动脚本, 可以与原来的配置隔离开来.

目录结构

lvim/
    config.lua          配置入口和一些LunarVim内建配置
    lua/user/
        plugin.lua      插件加载,更改插件配置后记得重启并执行 :PackerCompile
        keybinding.lua  快捷键定义
        neovim.lua      neovim原生配置
        alpha.lua       alpha启动页面配置,包含大量字符画
        statusline.lua  lualine状态栏配置
        treesitter.lua  treesitter相关配置
        setup/          在插件加载前的插件配置
        config/         在插件加载后的插件配置

如何定制

搭建一个语言的开发环境, 你需要什么?

Language Server


最初由微软提议的语言服务协议(LSP)现在可谓百花齐放, 它运行在后台解析代码符号并指导客户端编辑器的行为: 代码补全, 语法提示, 代码格式化, 类型提示, 文档提示, 代码导航, 符号搜索, 重构等等功能.

现在 Neovim 已内建支持 LSP, 不再像以前那样, 有许多配置提供都能提供以上功能, 要想获取结果就要针对每个插件都做适配. Neovim 内建 LSP 后提供了同一接口获取有关信息, 极大方便了插件生态发展.

相关插件:

  • nvim-lspconfig :提供基础的 LSP 配置封装 neovim lsp 接口,并为大多数 language server 提供了基本配置;
  • nlsp-settings :以 Json 的形式添加 language server 配置;
  • nvim-lsp-installer :提供命令以方便下载绝大多数 language server;
  • null-ls.nvim :将额外的 Linter 和 Formatter 整合到 lsp 接口
提示: 快捷键 Space L i 或命令 :LvimInfo 可查看当前语言服务信息

LunarVim 默认当你打开文件时自动下载对应 Language Server, 你可能有如下情景:

  • 有些时候自动安装会有问题, 可尝试手动安装 :LspInstall <language server> 查看一下报错信息.(按 Tab 会自动补全 language server)
  • 对于某种语言换用非默认 lanuage server, 以 python 为例

1、在 config.lua 中添加,

lua  vim.list_extend(lvim.lsp.automatic_configuration.skipped_servers, { "pyright" }) -- 关闭默认的pyright

2、 保存并执行 :LvimCacheReset 重置原有 language server 配置缓存

3、在~/.config/lvim/after/ftplugin/python.lua 中添加:(文件不存在则手动创建)

require("lvim.lsp.manager").setup("jedi_language_server")
  • 修改 language server 启动参数等, 执行 :LspSettings <language server> (Tab 补全), 这会以 json 格式编写配置, 示例见 nlsp-settings

Linter

静态分析器可以为你的代码提供额外的提醒警告, 例如指出某些代码风格的问题, 以及一些常见的 bug. 大多数语言服务提供的语法警告功能并不强大, 也仅仅是语法级别的错误提示, 所以才需要额外的静态解析器.

LunarVim 默认均未启动 Linter 与 Formatter, 创建以下文件并添加启动代码即可, 示例可见 LunarVim .

~/.config/lvim/after/ftplugin/<lang_type>.lua

你可以执行 :NulllsInfo 查看当前文件类型对应可用的 Linter 和 Formatter

local formatters = require "lvim.lsp.null-ls.formatters"
formatters.setup {
  { command = "black" },
    command = "prettier",
    args = { "--print-width", "100" },
    filetypes = { "typescript", "typescriptreact" },
local linters = require "lvim.lsp.null-ls.linters"
linters.setup {
  { command = "flake8" },
    command = "shellcheck",
    args = { "--severity", "warning" },
    command = "codespell",
    filetypes = { "javascript", "python" },
local code_actions = require "lvim.lsp.null-ls.code_actions"
code_actions.setup {
    command = "proselint"

Formatter

代码格式化工具, 一些 Language Server 并未内置格式化功能, 此时需要借助外部工具. 配置同上 Linter

Syntax

良好的语法高亮可以让我们的代码看起来更舒服, 让我们更容易区分语句,函数,变量等.

nvim-treesitter 为此而生, 它会对代码进行语法解析, 高亮更加精准.

lua/user/treesitter.lua 中设置添加你的语言:

lvim.builtin.treesitter.ensure_installed = { --这是已有的, 修改为你需要的语言
  "bash",
  "vim",
  "lua",
  "c",
  "cpp",
  "cmake",
  "go",
  "python",
  "javascript",
  "typescript",
  "tsx",
  "html",
  "css",
  "markdown",
  "json",
  "yaml",

快捷键

快捷键几乎与 我的 VSCode 配置 相同, 为了在终端中使用 ctrl+shift 开头的按键,以及区分 Tab 和 Ctrl+i , 我重映射了我的终端按键.

我的 Windows Terminal 部分配置

  "actions": [
      "keys": "ctrl+shift+f",
      "command": {
        "action": "sendInput",
        "input": "\u001b[70;6u"
      "keys": "ctrl+shift+h",
      "command": {
        "action": "sendInput",
        "input": "\u001b[72;6u"
      "keys": "ctrl+alt+enter",
      "command": {
        "action": "sendInput",
        "input": "\u001b[13;7u"
      "keys": "ctrl+i",
      "command": {
        "action": "sendInput",
        "input": "\u001bI"
      "keys": "ctrl+shift+j",
      "command": {
        "action": "sendInput",
        "input": "\u001b[74;6u"
      "keys": "ctrl+shift+k",
      "command": {
        "action": "sendInput",
        "input": "\u001b[75;6u"
      "keys": "ctrl+shift+l",
      "command": {
        "action": "sendInput",
        "input": "\u001b[76;6u"
      "keys": "ctrl+shift+s",
      "command": {
        "action": "sendInput",
        "input": "\u001b[83;6u"
      "keys": "ctrl+shift+e",
      "command": {
        "action": "sendInput",
        "input": "\u001b[69;6u"
      "keys": "ctrl+shift+o",
      "command": {
        "action": "sendInput",
        "input": "\u001b[79;6u"
      "keys": "ctrl+shift+t",
      "command": {
        "action": "sendInput",
        "input": "\u001b[84;6u"
      "keys": "ctrl+shift+m",
      "command": {
        "action": "sendInput",
        "input": "\u001b[77;6u"
      "keys": "ctrl+shift+p",
      "command": {
        "action": "sendInput",
        "input": "\u001b[80;6u"
  ],

如果你也使用 tmux,建议添加以下配置:

# ----------------------------=== General ===--------------------------
set -g default-terminal "screen-256color"
if 'infocmp -x tmux-256color > /dev/null 2>&1' 'set -g default-terminal "tmux-256color"'
# true color support
set -ga terminal-overrides ",*256color:RGB"
# undercurl support
set -ga terminal-overrides ',*:Smulx=\E[4::%p1%dm'
# underscore colours support
set -ga terminal-overrides ',*:Setulc=\E[58::2::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m'
# cursor style support
set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[1 q'