Ray-D-Song's Blog

分享我的 Vim 键位,以及在多个编辑器中配置键位的方法

2025-1-20 6min

键位列表

秉持少即是多的原则,我只会配置最需要的那些快捷键。

输入模式

功能快捷键缩写原意
退出编辑jj

命令模式

功能快捷键缩写原意
保存+格式化sasave
保存+关闭当前文件wqwrite quit
快速修复qfquick fix
前往定义gdgo to definition
查找引用grgo to reference
全局搜索gsglobal search
当前文件搜索cscurrent search
关闭当前文件x
向上移动 10 行<space>k
向下移动 10 行<space>j
向左移动 10 个字符<space>h
向右移动 10 个字符<space>l

其他

功能快捷键缩写原意
向上快速移动<space><space>k
向下<space><space>j
向左<space><space>h
向右<space><space>l

分屏操作

功能快捷键缩写原意
水平分屏<space>sxsplit x
垂直分屏<space>sysplit y
关闭分屏<space>scsplit close

在多个窗口间切换

功能快捷键缩写原意
切换到左边窗口<space>shscreen h
切换到右边窗口<space>sl
切换到上边窗口<space>sk
切换到下边窗口<space>sj

VSCode 和 NeoVim 配置

VSCode 有 VSCode-NeoVim 插件,可以在 VSCode 中使用 NeoVim 作为后端。
因此 VSCode 可以直接使用 NeoVim 的配置。

NeoVim 使用~/.config/nvim/init.vim作为配置文件。

需要注意的是,关闭文件、lsp 修复提示等,在两个编辑器中执行不同的操作,我们可以使用 Lua 的条件语句来做判断。

if vim.g.vscode
then
  -- vscode 的配置
else
  -- neovim 的配置
end

完整的配置文件如下:

-- 命令模式键位配置
if vim.g.vscode then
  -- VSCode 特定配置
  vim.keymap.set('n', 'sa', '<Cmd>call VSCodeCall("workbench.action.files.save")<CR><Cmd>call VSCodeCall("editor.action.formatDocument")<CR>')          -- 保存文件并格式化
  vim.keymap.set('n', 'wq', '<Cmd>call VSCodeCall("workbench.action.files.save")<CR><Cmd>call VSCodeCall("workbench.action.closeActiveEditor")<CR>')  -- 保存并关闭文件
  vim.keymap.set('n', 'qf', '<Cmd>call VSCodeCall("editor.action.quickFix")<CR>')              -- 显示快速修复建议
  vim.keymap.set('n', 'gd', '<Cmd>call VSCodeCall("editor.action.revealDefinition")<CR>')      -- 跳转到定义
  vim.keymap.set('n', 'gr', '<Cmd>call VSCodeCall("editor.action.goToReferences")<CR>')        -- 查看引用
  vim.keymap.set('n', 'gs', '<Cmd>call VSCodeCall("workbench.action.findInFiles")<CR>')        -- 全局搜索
  vim.keymap.set('n', 'cs', '<Cmd>call VSCodeCall("actions.find")<CR>')                        -- 当前文件内搜索
  vim.keymap.set('n', 'x', '<Cmd>call VSCodeCall("workbench.action.closeActiveEditor")<CR>')   -- 关闭当前文件件

  -- 分屏操作键位
  vim.keymap.set('n', '<space>sx', '<Cmd>call VSCodeCall("workbench.action.splitEditorDown")<CR>')    -- 水平分屏
  vim.keymap.set('n', '<space>sy', '<Cmd>call VSCodeCall("workbench.action.splitEditorRight")<CR>')   -- 垂直分屏
  vim.keymap.set('n', '<space>sc', '<Cmd>call VSCodeCall("workbench.action.closeActiveEditor")<CR>')  -- 关闭当前分屏

  -- 窗口切换键位
  vim.keymap.set('n', '<space>sh', '<Cmd>call VSCodeCall("workbench.action.focusLeftGroup")<CR>')     -- 切换到左边窗口
  vim.keymap.set('n', '<space>sl', '<Cmd>call VSCodeCall("workbench.action.focusRightGroup")<CR>')    -- 切换到右边窗口
  vim.keymap.set('n', '<space>sk', '<Cmd>call VSCodeCall("workbench.action.focusAboveGroup")<CR>')    -- 切换到上边窗口
  vim.keymap.set('n', '<space>sj', '<Cmd>call VSCodeCall("workbench.action.focusBelowGroup")<CR>')    -- 切换到下边窗口
else
  -- NeoVim 原生配置

  -- 输入模式键位配置
  vim.keymap.set('i', 'jj', '<Esc>')  -- 使用 jj 快速退出输入模式
  vim.keymap.set('n', 'sa', ':w<CR>')        -- 保存文件
  vim.keymap.set('n', 'wq', ':wq<CR>')       -- 保存并关闭文件
  vim.keymap.set('n', 'qf', ':lua vim.lsp.buf.code_action()<CR>')      -- 显示 LSP 快速修复建议
  vim.keymap.set('n', 'gd', ':lua vim.lsp.buf.definition()<CR>')       -- 跳转到定义
  vim.keymap.set('n', 'gr', ':lua vim.lsp.buf.references()<CR>')       -- 查看引用
  vim.keymap.set('n', 'gs', ':lua require("telescope.builtin").live_grep()<CR>')              -- 使用 telescope 进行全局搜索
  vim.keymap.set('n', 'cs', ':lua require("telescope.builtin").current_buffer_fuzzy_find()<CR>') -- 使用 telescope 在当前文件中搜索
  vim.keymap.set('n', 'x', ':q<CR>')         -- 关闭当前文件

  -- 分屏操作键位
  vim.keymap.set('n', '<space>sx', ':split<CR>')   -- 水平分屏
  vim.keymap.set('n', '<space>sy', ':vsplit<CR>')  -- 垂直分屏
  vim.keymap.set('n', '<space>sc', ':close<CR>')   -- 关闭当前分屏
  
  -- 窗口切换键位
  vim.keymap.set('n', '<space>sh', '<C-w>h')  -- 切换到左边窗口
  vim.keymap.set('n', '<space>sl', '<C-w>l')  -- 切换到右边窗口
  vim.keymap.set('n', '<space>sk', '<C-w>k')  -- 切换到上边窗口
  vim.keymap.set('n', '<space>sj', '<C-w>j')  -- 切换到下边窗口
end

-- 移动相关键位配置
vim.keymap.set('n', '<space>k', '10k')  -- 向上移动 10 行
vim.keymap.set('n', '<space>j', '10j')  -- 向下移动 10 行
vim.keymap.set('n', '<space>h', '10h')  -- 向左移动 10 个字符
vim.keymap.set('n', '<space>l', '10l')  -- 向右移动 10 个字符

-- 快速移动键位(使用 Hop)
vim.keymap.set('n', '<space><space>k', ':HopLineStartBC<CR>')  -- 向上移动
vim.keymap.set('n', '<space><space>j', ':HopLineStartAC<CR>')  -- 向下移动
vim.keymap.set('n', '<space><space>h', ':HopWordBC<CR>')  -- 向左移动
vim.keymap.set('n', '<space><space>l', ':HopWordAC<CR>')  -- 向右移动

注意,使用 jj 或 jk 映射退出编辑模式,需要在 VSCode 配置文件中添加如下配置:

{
  "vscode-neovim.compositeKeys": {
    "jj": {
      "command": "vscode-neovim.escape",
    },
  },
}

NeoVim 相关配置涉及到 Lua 语言、Hop、LSP 插件等内容,因为这篇文章主要讲快捷键,所以不作展开。