Vim超详细实用技巧和配置及进阶使用

2 阅读14分钟
总结了一下Vim的一些实用技巧,包括各种快捷键,buffer,window,tab,寄存器,宏,插件等等

1.基础模式

  • 普通模式(Normal) :默认模式,用于导航和执行命令(按 Esc 返回)
  • 插入模式(Insert) :编辑文本(i/a/o进入)
  • 可视模式(Visual) :选择文本(v 进入)
  • 命令行模式(Command) :执行命令(: 进入)

2.可视化模式

  • v - 可视化模式

  • V - 行可视化模式

  • ctrl+v - 块可视化模式

    • x/d - 剪切
    • yy - 复制
    • u - 将选中文本转换为小写
    • U - 将选中文本转换为大写
    • ~ - 将选中文本切换大小写
    • 在块可视化模式下按下I 执行编辑操作,在按下Esc即可多行操作。例如:多行注释

3.快捷键

3.1快速跳转

行号跳转

  • gg - 跳转光标至文件开头
  • G - 跳转光标至文件结尾
  • 8gg/8G- 跳转光标至到第8行
  • :set relativenumber - 开启相对行号,可以查看到当前行与其他行的距离
  • vim +100 filename - 打开文件并跳转到第100行

窗口内跳转

  • H - 跳转光标至当前窗口的Headline
  • M - 跳转光标至当前窗口的Middleline
  • L - 跳转光标至当前窗口的Lastline

搜索跳转

  • /text - 向下搜索 "text"
  • ?text 向上搜索 "text"
  • * - 向下搜索光标处所在的单词
  • # - 向上搜索光标处所在的单词
  • n/N - 下一个匹配项 /上一个匹配项

跳转历史

  • :jumps - 查看光标跳转历史记录
  • ctrl+o - 将光标跳转到上一次的位置
  • ctrl+i - 将光标跳转到下一次的位置
  • :changes - 查看文件编辑历史
  • g; - 跳转到较老的修改位置
  • g, - 跳转到较新的修改位置(常用于打开文件定位最后一次的修改位置)

标记与跳转

  • m[a-zA-Z] - 标记设置:实现光标无论在哪里都可以快速跳转到标记行,ma 给光标所在位置设置一个a标记
  • 'a - 跳转光标至标记a的行首
  • `a - 跳转光标至标记 a 的精确位置
  • :marks - 查看标记

3.2行内移动

基本移动

  • 0/home - 移动光标至行首
  • $/end - 移动光标至行尾
  • ^ - 移动光标至行首第一个非空字符,会跳过空格和制表符
  • g_ - 移动光标至行尾最后一个非空字符,会跳过空格和制表符

精确定位

  • fa - 移动光标至本行出现a的位置(向右移动)
  • Fa - 移动光标至本行出现a的位置(向左移动)
  • ta - 移动光标至本行出现a的位置的前一个位置(向右移动)
  • Ta - 移动光标至本行出现a的位置的后一个位置(向左移动)
  • ; - 按照原始方向向前进行搜索(配合fa Fa ta Ta ,这样可以不用每次都按)
  • , - 按照原始方向向后进行搜索(配合fa Fa ta Ta ,这样可以不用每次都按)
  • % - 移动光标至行内的括号()[]{}

单词移动

  • w - 移动光标至下个单词开头
  • W - 移动光标至下个单词开头(以空格为识别符来区分单词,跨度更大,在处理包含特殊字符和标点的文本时特别有用,可以避免光标停在不必要的位置)
  • e - 移动光标至下个单词结尾
  • E - 移动光标至下个单词结尾(以空格为识别符来区分单词,跨度更大,在处理包含特殊字符和标点的文本时特别有用,可以避免光标停在不必要的位置)
  • b - 移动光标至上个单词开头
  • B - 移动光标至上个单词开头(以空格为识别符来区分单词,跨度更大,在处理包含特殊字符和标点的文本时特别有用,可以避免光标停在不必要的位置)
  • ge - 移动光标至上个单词结尾
  • gE - 移动光标至上个单词结尾(以空格为识别符来区分单词,跨度更大,在处理包含特殊字符和标点的文本时特别有用,可以避免光标停在不必要的位置)

折行移动

  • set wrap - 设置自动折行
  • gj/gk - 在处理折行时,光标在折行向下/向上移动
  • g0/g$ - 在处理折行时,光标移动至折行行首/行尾

3.3高效编辑

动作命令

  • c - change (修改) / cut (剪切)
  • d - delete (删除)
  • y - yank (复制)
  • p - paste(粘贴)
  • v - visual (可视化选择)

文本对象

  • w - word (单词)
  • s - sentence (句子)
  • p - paragraph (段落)
  • ( or ) - 圆括号内的内容
  • { or } - 花括号内的内容
  • [ or ] - 方括号内的内容

重复与撤销

  • . - 重复上次的修改操作
  • u - 撤销上次修改操作
  • Ctrl+R - 重做(撤销的反向操作)

快速插入

  • i - insert 从光标前开始插入字符
  • I - 从行首开始插入字符
  • a - 从光标后开始插入字符
  • A - 从行尾开始插入字符
  • o - 在当前行之下另起一行, 开始插入字符
  • O - 在当前行之上另起一行, 开始插入字符

文本对象操作

  • ciw - 修改/剪切光标处所在单词
  • ciW - 修改/剪切光标处所在单词(以空格为识别符区分单词)
  • cw - 修改/剪切光标处至单词末尾的内容
  • cW - 修改/剪切光标处到单词末尾的内容(以空格为识别符来区分单词)
  • diw - 删除(剪切)光标处所在单词
  • diW - 删除(剪切)光标处所在单词(以空格为识别符区分单词)
  • dw - 删除(剪切)光标处到单词末尾的内容
  • dW - 删除(剪切)光标处到单词末尾的内容(以空格为识别符来区分单词)
  • dd - 剪切光标所在行
  • 3dd - 剪切3行
  • D - 剪切光标所在位置至行尾的内容
  • dG - 剪切当前行到文件末行的内容
  • yiw - 复制光标处的单词
  • yiW - 复制光标处的单词(以空格为识别符来区分单词)
  • viw - 可视化选择光标处的单词
  • viW - 可视化选择光标处的单词(以空格为识别符区分单词)
  • vip - 可视化选择一整个段落
  • vi(, vi[, vi{ - 可视化选中括号中的内容进行处理

复制与粘贴

  • yy - 复制光标所在行
  • yw - 复制光标处至单词末尾的内容
  • yW - 复制光标处至单词末尾的内容(以空格为识别符来区分单词)
  • p - 在光标后粘贴
  • P - 在光标前粘贴
  • 3p/P - 粘贴3次
  • :set paste - 设置后粘贴格式不会乱

行操作与格式调整

  • J - 将两行连成一行,在整理文本格式时十分实用
  • << - 将当前行向左缩进
  • >> - 将当前行向右缩进

字符替换与大小写转换

  • r - 替换单个字符
  • R - 替换多个字符,直到按下Esc
  • ~ - 切换光标下字符的大小写
  • guu / gUU - 将当前行转换为小写/大写
  • gu0 / gu$ - 将当前字符到行首/行尾的字符替换为小写
  • gU0 / gU$ - 将当前字符到行首/行尾的字符替换为大写
  • guw / gUw - 将当前字符到单词结尾替换为小/大写
  • guW / gUW - 将当前字符到单词结尾替换为小/大写(以空格为标识符来区分单词)

全局替换

  • :%s/old/new/g - 将文件中全部的 old 替换为 new(分隔符 / 也可用 # 等其他字符)
  • :5,10s/old/new/g - 指定5~10行范围内进行替换

4.Window Buffer Tab

概念比喻和关系

  • Buffer(缓冲区) :像是你桌上散落的所有打开的文件。有些文件你正在看,有些则合上了放在一边,但它们都在你的手边。
  • Window(窗口) :是你桌面上开辟的一个"视口",透过它你可以看到某一个 Buffer 的内容。一个窗口一次只能显示一个 Buffer,但同一个 Buffer 可以在多个窗口中同时显示。
  • Tab(标签页) :像是你桌面上不同的"工作区"或"虚拟桌面"。每个 Tab 可以包含一组特定布局的 Windows,用于集中处理某一类任务。
  • Tabs 包含 Windows,Windows 显示 Buffers。

Window 操作

定义

  • Window 是查看和编辑 Buffer 的视口视图区域

Window 的作用与特性

  • 多任务编辑

    • 同时查看和编辑多个文件
    • 并排比较代码的不同部分
    • 参考一个文件的同时编辑另一个文件
  • 灵活的布局管理

    • 水平分割
    • 垂直分割
    • 任意组合的分割方式
    • 每个窗口可以独立滚动、移动光标
  • 同一 Buffer 的多视图

    • 同一个 Buffer 可以在多个窗口中同时打开
    • 每个窗口可以显示该 Buffer 的不同位置
    • 在一个窗口中的编辑会实时反映在所有显示该 Buffer 的窗口中

基本操作

  • :split /:sp - 水平分割窗口
  • :vsplit /:vsp - 垂直分割窗口
  • Ctrl+w+方向键 - 切换窗口
  • Ctrl+w+c(close) / 直接:wq - 关闭窗口
  • Ctrl+w+= - 使所有窗口等宽、等高

Buffer管理

作用与概念

  • Buffer是Vim中用于存储正在编辑的文件内容的内存区域。每当你打开一个文件,Vim就会创建一个新的buffer来存放这个文件的内容。

  • 定义:Buffer 是内存中的一块空间,用于存放你从磁盘上"打开"的文件内容。Buffer是Vim中用于存储正在编辑的文件内容的内存区域。

    每当你打开一个文件,Vim就会创建一个新的buffer来存放这个文件的内容。

    你可以同时打开多个buffer,但它们在窗口(window)中可能不可见。Buffer是Vim中多文件编辑的基础。简单来说buffer就是内存缓冲区中加载的文件内容。

  • 核心:你编辑的是 Buffer,而不是直接编辑文件。只有执行写入(:w)时,Buffer 的内容才会被同步到磁盘文件。

  • 独立性:一个文件被打开,就对应一个 Buffer。即使你在窗口中看不到它了(比如用另一个 Buffer 覆盖了窗口),只要 Vim 进程没结束,这个 Buffer 依然存在。

  • 隐藏 Buffer:一个被修改过但未显示的 Buffer 称为"隐藏的 Buffer"。Vim 默认不允许你直接切换走,但可以通过设置 hidden 选项来允许。

基本操作

  • :e filename - 打开另一个文件(缓冲区)
  • :ls - 列出所有缓冲区
  • :b {number} - 切换到指定编号的缓冲区
  • :bnext:bn / :bprevious:bp - 切换到下一个/上一个缓冲区
  • :bfirst:bf / :blast:bl - 切换到第一个/最后一个缓冲区
  • :bd - 删除当前缓冲区
  • bdelete {number} - 删除指定缓冲区
  • :%bd - 删除所有buffer

Tab 页管理

作用与概念

  • 定义:Tab 是一个容器,它可以容纳一组排列好的 Windows(窗口)。它为你提供了不同的"工作布局"。

  • 用途

    • 项目隔离:一个 Tab 放前端代码,另一个 Tab 放后端代码。
    • 工作流隔离:一个 Tab 用于编辑源码,另一个 Tab 用于查看日志文件。
    • 布局管理:为同一个项目保存不同的窗口布局(比如一个全屏写代码,一个分屏调试)。
  • 关键:Tabs 是视图层的组织方式,与底层的 Buffers 是解耦的。任何一个 Tab 里的任何一个窗口,都可以显示任何一个已打开的 Buffer

基本操作

  • :tabnew / :tabe - 创建新标签页
  • :tabe [file] 在新 Tab 中打开指定文件
  • :tabonly:tabo 关闭所有其他 Tab,只保留当前 Tab
  • gt:tabnext 切换到下一个 Tab
  • gT:tabprevious 切换到上一个 Tab
  • :tabclose - 关闭当前标签页
  • :{N}gt 切换到第 N 个 Tab,例如 3gt 切换到第3个 Tab
  • `:tabm {N} 将当前 Tab 移动到第 N 个位置之后(从0开始计数)。不指定 N 则移动到最后。

5.寄存器

定义

  • Vim 的寄存器(Register)是用于存储文本的容器,类似于其他编辑器中的剪贴板,但功能要强大得多。但 Vim 提供了多个寄存器,每个寄存器都有不同的用途,可以同时存储多个文本片段,并且可以通过名称来访问

寄存器类型

基操

  • :reg - 查看寄存器内容
  • :reg a b c 只查看特定寄存器

无名寄存器(""

  • 默认寄存器,如果不指定寄存器,大多数操作都使用它
  • ddyyp 等命令默认操作的就是这个寄存器

数字寄存器("0 ~ "9

  • "0最近复制的内容
  • "1 ~"9最近删除的内容,按时间顺序排列
  •  yy           " 复制当前行到 "0 寄存器
     dd           " 删除当前行到 "1 寄存器
     "1p          " 粘贴上一次删除的内容
     "2p          " 粘贴上上次删除的内容
     重要:yy 不会影响 "1-9,只有删除操作才会
    

有名寄存器("a - "z

  • 用户自定义寄存器,用于手动存储重要文本片段
  • 小写字母会覆盖寄存器内容
  • 大写字母会追加到寄存器内容
  •  "ayy         " 复制当前行到寄存器 a
     "bdaw        " 删除当前单词到寄存器 b  
     "Ayy         " 追加当前行到寄存器 a(不覆盖原有内容)
    

只读寄存器

  • ". - 最近插入文本
  • "% - 当前文件名
  • ": - 最近执行文件
  • "# - 最近执行文件
  •  ".p          " 粘贴最近插入的文本
     "%p          " 粘贴当前文件名
     ":p          " 粘贴最近执行的命令
    

搜索寄存器("/

  • 存储最近的搜索模式
  •  "/p           " 粘贴搜索的 pattern
    

系统剪贴板寄存器("+"*

  • "+:系统剪贴板(Ctrl+C/Ctrl+V)
  • "*:选择剪贴板(鼠标选择的内容)
 "+yy         " 复制到系统剪贴板
 "+p          " 从系统剪贴板粘贴
 "*p          " 粘贴鼠标选择的内容

注意:需要 Vim 编译时支持 +clipboard,可用 vim --version | grep clipboard 检查

跨会话寄存器持久化

 " 在 .vimrc 中设置,让寄存器内容在 Vim 重启后仍然保留
 set viminfo=%,'50,"100,:100,n~/.vim/viminfo
 " %: 保存缓冲区列表
 " '50: 保存 50 个标记
 " "100: 保存 100 行给每个寄存器
 " :100: 保存 100 行命令历史
 " n~/.vim/viminfo: 保存位置

定义

  • 宏是将一系列 Vim 操作录制下来,然后可以重复执行的自动化功能。

    • 本质:宏实际上是把按键序列记录到寄存器中,然后通过执行寄存器内容来重现这些操作
    • 优势:可以自动化复杂的编辑任务,避免重复劳动
    • 存储:每个宏都存储在一个指定的寄存器中(通常是 a-z)

基本操作

  • q{register} - 录制宏。qa 开始录制操作到寄存器"a 中。录制期间的所有正常模式命令都会被记录,再次按下q停止录制
  • @@ - 重复上一次执行的宏
  • @{register} - 执行宏 @a
  • [N]@{register} - 执行宏N次 3@a
  • :reg - 查看寄存器内容
  • :reg a b c 只查看特定寄存器

案例

  • 批量添加行尾分号(或者批量注释)

     qa          " 开始录制到寄存器 a
     A;<Esc>     " 移动到行尾,插入分号,返回正常模式
     j           " 移动到下一行
     q           " 停止录制
    

6.vimrc配置

  • vimrc(vim run config) ,可以将在vim中的设置写入vimrc中,实现打开vim就可以使用这些配置,不需要每次重复设置。

  • Vim 配置文件位置的区别:~/.vimrc vs /etc/vim/vimrc

    • ~/vimrc 仅当前用户使用
    • /etc/vim/vimrc 所有用户使用
  • 加载优先级

    • 先加载系统配置 /etc/vim/vimrc
    • 后加载用户配置 ~/.vimrc(覆盖系统设置)
    • 用户配置优先级更高(冲突时以 ~/.vimrc配置为准)
  • vim -u NONE filename - 打开一个没有任何配置的vim

 "显示行号
 set nu 
 ​
 "取消显示行号
 "set nonu
 ​
 "打开语法高亮
 syntax on 
 ​
 "启动光标行高亮
 set cursorline 
 ​
 "光标在'(' '[' '{' 上时,高亮显示对应的另一半括号
 set showmatch
 ​
 "高亮显示搜索结果
 set hlsearch 
 ​
 "在输入搜索时实时显示高亮搜索结果
 set incsearch
 ​
 "搜索时忽略大小写
 set ignorecase
 ​
 "搜索模式包含大小写字母时大小写敏感
 set smartcase
 ​
 "显示光标所在行列信息
 set ruler 
 ​
 "始终显示控制状态栏
 set laststatus=2 
 ​
 "在状态行中显示(部分)命令
 set showcmd 
 ​
 "自动缩进,另起一行时复制当前行的缩进
 set autoindent
 ​
 "自动缩进为4个空格
 set shiftwidth=4
 ​
 "一个tab显示为4个空格
 set tabstop=4
 ​
 "替换输入的tab为空格
 set expandtab
 ​
 "设置自动折行
 set wrap
 ​
 "启用鼠标,通过鼠标控制光标位置,
 set mouse=a
 ​
 "将系统粘贴板和vim默认寄存器绑定,实现系统复制文本 >> vim 直接p粘贴;vim yy复制 >> 系统直接粘贴文本
 "检查终端剪贴板支持  vim --version | grep clipboard,应显示 +clipboard 或 +xterm_clipboard
 "Linux终端不支持,需要安装软件xclip/xsel
 "sudo apt-get install xclip  #Debian/Ubuntu
 "sudo yum install xclip     # CentOS/RHEL
 "set clipboard=unnamed
 "set clipboard=unnamedplus "推荐
 ​
 ​
 "配置自动补全' " ( [ {
 inoremap ' ''<LEFT>
 inoremap " ""<LEFT>
 inoremap ( ()<LEFT>
 inoremap [ []<LEFT>
 inoremap { {}<LEFT>
 ​
 "在输入模式下使用ctrl+jkl移动光标
 "不建议将ctrl+h映射为左,在某些版本中会导致backspace失败
 inoremap <C-J> <DOWN>
 inoremap <C-K> <UP>
 inoremap <C-L> <RIGHT>

7.插件管理

插件安装

 curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

vim-plug配置

~/.vimrc中添加

 " 指定插件目录
 call plug#begin('~/.vim/plugged')
 ​
 Plug 'junegunn/fzf'                       "模糊查找工具
 Plug 'junegunn/vim-easy-align'            "文本对齐,让代码或文本按特定字符(如 =, :, # 等)对齐
 Plug 'tpope/vim-commentary'               "快速注释(gcc注释当前行;可视化模式下选中多行,gc注释)
 Plug 'tpope/vim-surround'                 "快速添加/修改/删除 包围文本的符号(引号、括号、标签等)
 Plug 'ghifarit53/tokyonight-vim'          "配色方案"
 "Plug 'morhetz/gruvbox'                   "配色方案
 Plug 'itchyny/lightline.vim'              "状态栏增强
 Plug 'lifepillar/vim-mucomplete'          "代码补全,按tab可补全
 Plug 'vim-scripts/SearchComplete'         "搜索补全
 Plug 'michaeljsmith/vim-indent-object'    "缩进文本对象,vii选中当前行缩进级别的代码块
 Plug 'andymass/matchup.vim'               "增强 % 跳转功能,不仅匹配括号,还能匹配 if/endif、begin/end 等关键词
 Plug 'psliwka/vim-smoothie'               "为滚动操作添加平滑的动画过渡
 Plug 'romainl/vim-cool'                   "只能搜索高亮,搜索时自动高亮匹配项,停止搜索后自动关闭高亮
 ​
 " 初始化插件系统
 call plug#end()

vim-plug 常用命令

 :PlugInstall     " 安装配置中声明的插件
 :PlugUpdate      " 更新所有插件
 :PlugClean       " 删除未声明的插件
 :PlugUpgrade     " 更新 vim-plug 自身
 :PlugStatus      " 查看插件状态

8.深入学习

  • 内置教程:终端输入 vimtutor
  • 快捷键图:vim.rtorr.com/
  • 书籍: 《Learning the vi and Vim Editors》