总结了一下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- 跳转光标至当前窗口的HeadlineM- 跳转光标至当前窗口的MiddlelineL- 跳转光标至当前窗口的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,只保留当前 Tabgt或:tabnext切换到下一个 TabgT或: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只查看特定寄存器
无名寄存器("")
- 默认寄存器,如果不指定寄存器,大多数操作都使用它
dd、yy、p等命令默认操作的就是这个寄存器
数字寄存器("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 配置文件位置的区别:
~/.vimrcvs/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》