.vimrc配置

Vim 进阶(.vimrc配置 & Leader 键映射)

目标:把 Vim 从“能用”升级到“高频提效”。重点掌握 .vimrc 持久化配置、非递归映射(noremap)、以及 Leader 键。

1. 为什么要做 Vim 配置?

1.1 临时设置的痛点

例如在 Vim 里输入:set number

  • 仅对当前会话/窗口生效
  • 重启 Vim 后会失效
  • 每次打开都要重复输入,效率低

1.2 .vimrc:把设置永久化

.vimrc是 Vim 的个人配置文件:

  • Vim 启动时自动加载
  • 写一次,长期生效
  • 是开发者提升编辑效率的基础设施

2. Linux 上如何编辑 .vimrc

配置文件路径:~/.vimrc
编辑命令:

vim ~/.vimrc

3. 推荐的基础通用配置

=== 编码体验基础:行号 + 视觉辅助 === set number set relativenumber === 主题(可替换为其它内置主题)=== colorscheme hybrid === 缩进:对齐 4 空格 === set tabstop=4 set shiftwidth=4 set expandtab " Tab 输入自动转为空格

4. 按键映射核心:用 noremap,避免递归坑

4.1 映射是什么?

映射 = 把某个按键/组合按键,绑定到一段命令执行上。常见用于把“复杂/重复操作”变成“快捷键”。

在 Vim 中,可以通过 map 系列命令设置按键映射

  • :map - x (按"-" == 删除字符)
  • :map<space>vim (按下空格==选中整个单词)
  • :map dd (ctrl+d == 删除一行)

4.2 Vim 的模式决定了映射生效范围

  • Normal(普通模式):浏览、删除、保存、移动(最常用)
  • Insert(插入模式):写代码
  • Visual(可视模式):选中后批量操作

对应非递归映射(推荐):

  • nnoremap:Normal 模式
  • inoremap:Insert 模式
  • vnoremap:Visual 模式

4.3 为什么要优先用 noremap?

  • map是递归映射,可能二次解析导致连锁触发/冲突
  • noremap是非递归映射,不会再解析映射结果
  • 更稳定、兼容插件快捷键

工程建议:所有自定义映射默认优先用*noremap

5. Leader 键(工程师必学):自定义快捷键前缀

5.1 Leader 是什么?

`` 是 Vim 自定义快捷键的“前缀键”:

  • 默认通常是\(不太好按)
  • 推荐改成更顺手的键:空格 Space

使用逻辑:

  • 先按 Leader(如空格),松开
  • 再按第二个键(如 w)
  • 触发你配置的自定义命令(如保存)

例如:<Leader>w常见约定为“保存”。

5.2 为什么要用 Leader?

  • Vim 原生按键很多已被占用
  • 你想自定义大量操作:保存、分屏、运行、宏、文件搜索、系统剪贴板等
  • Leader 让快捷键体系统一、整洁、冲突更少
  • 插件也常基于 Leader 提供快捷键

6. Leader 基础配置(写进 .vimrc)

6.1 推荐:Leader 改成空格

把这行写在所有<Leader>映射之前:

let mapleader = " " w = Space + w

6.2 备选:逗号 / 分号

let mapleader = "," " 或 let mapleader = ";"

6.3 查看配置了哪些 Leader 映射

在 Vim 命令行输入:

:nmap

用于检查 Normal 模式下<Leader>相关映射是否正确。

7. 工程高频实用示例

把下面直接复制到 .vimrc(确保 leader 设置在前面):

" === 保存 / 退出(Leader 模式)=== nnoremap <Leader>w :w<CR> nnoremap <Leader>q :q<CR> " === 宏快捷键(Leader 模式)=== nnoremap <Leader>2 @@

作业:inster模式下如何实现删除整行

8.ctags / tags:让 Vim 跳转到符号定义(Ctrl-])

目标:把“在代码里找函数/宏/结构体定义”从手工搜索升级为一键跳转。Vim 的核心依赖是ctags生成的tags文件,以及在.vimrc里对'tags'的配置。

8.1 ctags 是什么?在 Vim 里解决什么问题?

  • ctags:为项目生成索引文件(默认叫tags
  • Vim:读取tags后可以实现跳转
    • Ctrl-]:跳到当前光标下符号的定义
    • Ctrl-t:返回跳转前的位置

8.2 安装与确认 ctags

先确认系统里是否安装了 ctags:

ctags--version

8.3 在项目里生成 tags(推荐做法)

进入项目根目录生成 tags:

ctags-R.

可选:指定输出文件名(输出到./tags):

ctags-f./tags-R.

8.4 Vim 需要知道:tags 文件从哪里找(‘tags’ 选项)

.vimrc里设置'tags',让 Vim 能从当前目录开始向上查找 tags。推荐写法:

set tags=./tags;$HOME

含义直观理解:从当前目录开始找./tags,找不到就往上层继续找,直到$HOME

更兼容的写法(两个候选 + 向上查找):

set tags=./tags,tags;

8.5 用法:如何在 Vim 里跳转

  • 光标放在一个符号上(函数名/宏/结构体/变量等)
  • Ctrl-]跳到定义
  • Ctrl-t返回

也可以直接跳到指定 tag:

:tag {tagname}

9 vimrc推荐配置

" ========================= " Leader 设置:空格 " ========================= let mapleader=" " let maplocalleader=" " " ========================= " 基础显示:行号/光标位置 " ========================= set number " 显示绝对行号 set relativenumber " 显示相对行号 set cursorline " 高亮当前行 set laststatus=2 " 状态栏始终显示(2=始终显示) set ruler " 显示光标位置(行列)信息 " ========================= " 编辑体验:缩进/制表符,统一缩进为 4 个空格 " ========================= set tabstop=4 " 一个 Tab 显示为 4 列 set shiftwidth=4 " 自动缩进宽度为 4 set softtabstop=4 " insert 模式下编辑 Tab/退格的体验为 4 set expandtab " 用空格代替 Tab " ========================= " 搜索行为 " ========================= set hlsearch " 搜索匹配高亮 set ignorecase " 默认忽略大小写 set smartcase " 含大写字母时区分大小写 " ========================= " 换行与输入补全 " ========================= set wrap " 自动换行显示 set wildmenu " 命令行补全更友好 set showcmd " 在命令行显示按键/命令进度 set completeopt=menuone,noinsert,noselect " 补全选项 " ========================= " 编码与终端颜色 " ========================= set encoding=utf-8 " 使用 UTF-8 编码 set fileencoding=utf-8 set termguicolors " 终端真彩色(配合主题) " ========================= " 文件类型插件/缩进 " ========================= filetype plugin indent on " 启用文件类型识别、插件和缩进规则 " ========================= " Leader 快捷键(示例) " ========================= " 保存:<leader>w nnoremap <leader>w :w<CR> inoremap <leader>w <Esc>:w<CR>a " 清除搜索高亮:<leader>h nnoremap <leader>h :nohlsearch<CR> " 重新加载 vimrc:<leader>r nnoremap <leader>r :source $MYVIMRC<CR> " 退出:<leader>q nnoremap <leader>q :q<CR> " 回到上一级目录(工作目录):bb nnoremap bb :cd ../<CR> " 标签跳转(需要 ctags/tags):<leader>t 进入 <leader>p 返回 nnoremap <leader>t :tag <C-R><C-W><CR> nnoremap <leader>p :pop<CR> " 编译当前文件(g++):<leader>c nnoremap <leader>c :!g++ -std=c++17 -O2 -Wall % -o %:r<CR> " 运行可执行文件(./文件名):<leader>x nnoremap <leader>x :!./%:r<CR> " 分屏移动(示例) nnoremap <leader>j <C-w>j nnoremap <leader>k <C-w>k nnoremap <leader>l <C-w>l nnoremap <leader>i <C-w>h