Vim笔记
大约 8 分钟
原文地址:http://hscarb.github.io/other/20191229-vim-note.html
Vim笔记
Vim模式
Normal普通模式
移动、操作
uundo
Insert插入模式
进入
iinsertaappendoopen a line belowIinsert before lineAappend after lineOappend a line abovegi快速跳转到最后一次编辑的地方并进入插入模式
退出
esc退出到Normal模式ctrl+c回退到Normal模式ctrl+[回退到Normal模式
插入模式快捷键
ctrl+h删除上一字符ctrl+w删除上一单词ctrl+u删除当前行
Command命令模式
Normal下输入:后执行命令
:vs(vertical split):sp(split):% s/foo/bar/g全局替换:set number/set nu显示行号:set nonu隐藏行号:syntax on语法高亮:set hls搜索高亮 highlight search:set incsearch增量搜索 边搜索边高亮:help {cmd}查看帮助:e重新加载该文件
Read
:r! echo %插入文件名:r! echo %:p插入文件名全路径:help read:help filename-modifiers
Visual可视模式
vNormal模式下进入V选择行ctrl+v块状选择
可视模式下快捷键
ddelete 删除yyank 复制ppaste 粘贴
快速移动
在Normal模式下
- word 以非空白符分割的单词
- WORD 以空白符分割的单词
移动
hjkl←↓↑→w/W下一个word/WORD开头e/E下一个word/WORD尾b/Bbackword 回到上一个word/WORD开头
行间搜索移动
f{char}find 移动到char字符F{char}rfind 从行尾开始搜索移动到charttill 移动到char的前一个字符Trtill 从行尾移动到char前一个字符;/,继续搜索该行下一个/上一个
水平移动
0移动到行首^移动到第一个非空白字符$移动到行尾g_移动到行尾非空白字符
垂直移动
()在句子间移动{}在段落间移动
页面移动
gg/G移动到文件开头/结尾ctrl+o快速返回H/M/L跳转到屏幕开头Head中间Middle结尾Lowerctrl+uupword 向上翻页ctrl+f向下翻页zz把屏幕置为中间
快速增删改查
快速删除
快速删除字符/单词
x删除一个字符d{}delete 配合文本对象删除一个单词dwdelete (around) worddaw=dwdelete around word (include space)diwdelete word (exclude space)
删除行
dddelete linedt{}delete till{}d$delete to end of the slined0delete to start of the line
重复
{num}{cmd}repeatcmdnumtimes{num}x删除num个字符{num}dd删除num行
快速修改
r{}replace 替换一个字符为{}ssubstitute 删除当前字符并进入插入模式c{obj}change 删除文本对象并进入插入模式ct{}change to {} 删除到``并进入插入模式R连续替换字符S删除整行并进入插入模式C删除整行并进入插入操作{num}r{char}替换num个字符为char{num}s删除num个字符并入插入模式
快速查询
/前向搜索?反向搜索n/N跳转到上一个/下一个匹配*/#搜索光标所在的当前单词,前向/后向匹配
正则搜索替换
:[range]s[ubstitute]/{pattern}/{string}/[flags]查找并且替换文本,支持正则表达式range表示范围,10,20表示10-20行,%表示全部pattern要替换的模式(正则表达式)string替换后文本flags替换标志gglobal 全局范围执行cconfirm 替换前需要确认nnumber报告匹配的次数而不替换,可用来查询匹配次数
多文件操作
vim {filename1} {filename2} -O在多个窗口打开多个文件
三种多文件操作概念
- Buffer: 打开的一个文件的内存缓冲区
- Window: Buffer可视化的分割区域
- Tab:可以组织为窗口的一个工作区
Buffer缓冲区
:ls列举当前缓冲区:b n跳转到第n个缓冲区:bpre:bnext:bfirst:blast:b buffer_name加上tab补全来跳转:e {文件名}修改文件
Window窗口
是可视化的分割区域
- 一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区
ctrl + w, s:sp水平分割ctrl + w, v:vs垂直分割- 每个窗口可以继续被无限分割
窗口切换
ctrl + w, w窗口间循环切换ctrl + w, h切换到左边的窗口ctrl + w, j切换到下边的窗口ctrl + w, k切换到上边的窗口ctrl + w, l切换到右边的窗口
移动窗口
ctrl + w, H左移窗口ctrl + w, J下移窗口ctrl + w, K上移窗口ctrl + w, L右移窗口
重排窗口
:h window-resize查看文档ctrl + w, =使所有窗口等宽、等高ctrl + w, _最大化活动窗口的高度ctrl + w, |最大化活动窗口的宽度[N], ctrl + w, _把活动窗口的高度设为[N]行[N], ctrl + w, |把活动窗口的宽度设为[N]列
Tab标签页 将窗口分组
Tab是可以容纳一系列窗口的容器
:h tabpage查看文档- Vim的Tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
- 如一个Tab管理所有Python文件,一个Tab管理所有HTML文件
Tab操作
:tabnew {filename}新建标签页,打开{filename}:tabe[dit] {filename}在新标签页中打开{filename}ctrl + w, T把当前窗口移到一个新标签页:tabc[lose]关闭当前标签页及其中的所有窗口:tabo[nly]只保留活动标签页,关闭所有其他标签页
Tab切换
| Command模式命令 | 普通模式命令 | 用途 |
|---|---|---|
:tabn[ext] {N} | {N}gt | 切换到编号为{N}的标签页 |
:tabn[ext] | gt | 切换到下一标签页 |
:tabp[revious] | gT | 切换到上一标签页 |
Vim的Text Object
文本对象操作方式
[number]<command>[text object]number次数command命令 d(elete), c(hange), y(ank), v(isual)text object操作的文本对象w单词,s句子,p段落iwinner word,表示这个单词,不包含单词外的字符awaround word,这个单词及环绕这个单词的字符(包含空格)
操作成对括号中的内容
i(i)1 * ([2 + 3])a(a)1 * [(2 + 3)]i<i>The <[tag]>......
{}[]""``
ci"删除双引号里面的内容并进入插入模式
Vim复制粘贴与寄存器
Normal模式赋值粘贴
y(ank)复制p(ut)粘贴d(elete)剪切v(isual)选中要复制的地方yiw复制一个单词yy复制一行
Insert模式复制粘贴
- 和其他编辑器差不多
- 在vimrc设置
autoindent,粘贴代码会缩进错乱 - 需要用
:set paste:set nopaste解决
Vim寄存器
- Vim复制粘贴操作的是寄存器而不是系统剪贴板
- 默认复制和剪切的内容放到了“无名寄存器”
- Vim使用多组寄存器进行剪切、复制与粘贴
"{register}指定寄存器{register}为有名寄存器a-z""无名寄存器"ayiw复制一个单词到寄存器a中"bdd剪切当前行到寄存器b中:reg {register}查看寄存器内容
常见寄存器
"0复制专用寄存器,使用y复制文本同时会被拷贝到复制寄存器0"+系统剪贴板,在复制前加上"+可以将内容复制到系统剪贴板"%当前文件名".上次插入文本:set clipboard=unnamedset clipboard+=unnamed直接复制粘贴系统剪贴板内容
Vim宏(Macro)
- 一系列命令的集合
- 可以使用宏录制一系列操作,然后用于回放
- 可以方便的应用在多行文本上
录制和回放宏
q{register}在普通模式下录制到register寄存器q结束录制@{register}回放某寄存器中的宏
将宏应用到多行,在Command模式下执行Normal模式命令
- 在
visual模式下选择多行 :'<,'>输冒号进入Command模式:'<,'>normal @a为多行执行normal命令
Vim补全
| 命令 | 补全类型 | 常用 |
|---|---|---|
ctrl + n | 普通关键字 | √ |
ctrl + w, ctrl + n | 当前缓冲区关键字 | |
ctrl + x, ctrl + i | 包含文件关键字 | |
ctrl + x, ctrl + ] | 标签文件关键字 | |
ctrl + x, ctrl + k | 字典查找 | |
ctrl + x, ctrl + l | 整行补全 | |
ctrl + x, ctrl + f | 文件名补全 | √ |
ctrl + x, ctrl + o | 全能(Omni)补全 | √ |
更换配色
:colorscheme显示当前主题颜色,默认default:colorscheme <ctrl + d>显示所有配色:colorscheme {配色名}修改配色
插件
安装插件管理器
- 推荐插件:https://github.com/junegunn/vim-plug
- 安装:
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |` ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force - 使用:
:edit $MYVIMRC
call plug#begin() " List your plugins here Plug 'tpope/vim-sensible' call plug#end()- Reload the file
:source %or restart Vim, then you can,:PlugInstallto install the plugins:PlugUpdateto install or update the plugins:PlugDiffto review the changes from the last update:PlugCleanto remove plugins no longer in the list
插件网站
快速跳转插件
if exists('g:vscode')
Plug 'asvetliakov/vim-easymotion', { 'as': 'vsc-easymotion' }
else
Plug 'vim-easymotion/vim-easymotion'
endif
" ...
" easy motion 添加递归映射(后面那个也是一个映射,所以要递归映射)
" 含义为:按下 ss,就开始搜索 2 个字符的 EasyMotion 跳转
nmap ss <Plug>(easymotion-s2)ggjjjjjjjjjjk
" easy motion
let g:EasyMotion_smartcase = 1 " 启用智能大小写匹配
nmap <Leader>j <Plug>(easymotion-jumptoanywhere) " 按下;j跳转到任意位置
nmap <Leader>f <Plug>(easymotion-s2) " 按下;f触发双字符搜索
欢迎关注公众号【消息中间件】(middleware-mq),更新消息中间件的源码解析和最新动态!

