vim 快捷键
vim 快速移动
单词之间移动
word: 指的是以非空白符分割的单词;WORD: 指的是以空白符分割的单词
- w/W: 移动到下一个word/WORD开头
- e/E: 移动到下一个word/WORD结束
- b/B: 回到上一个word/WORD开头
水平移动
- I: 移动到行首第一个字符并且进入插入模式
- A: 移动到行尾并且进入插入模式
- 0: 移动到行首第一个字符
- ^: 移动到行首第一个非空字符
- $: 移动到行尾
- g_: 移动到行尾非空白字符第一个非空字符
页面移动
- gg: 移动文件的开头
- G: 移动文集的结尾
- control+o: 快速返回到上一个位置
- H/M/L: 移动屏幕的开头(Head),移动到屏幕的中间(Middle)和结尾(End)
- control+u/control+f: 屏幕上下翻页(upword/forward)
- zz: 把屏幕至为中间
行间搜索移动
- f{char}: 正向查找下一个char,使用逗号继续查找上一个,使用分号查找下一个
- F{char}: 反向查找下一个char,使用逗号继续查找上一个,使用分号查找下一个
- t{char}: 正向查找下一个char的前一个字符,使用逗号继续查找上一个,使用分号查找下一个
- T{char}: 反向查找下一个char的前一个字符,使用逗号继续查找上一个,使用分号查找下一个
vim 快速删除
insert模式删除单词或字符
- control+u: 删除上一行
- ccontrol+h: 删除上一个字符
- control+w: 删除上一个单词
normal模式删除
- x: 删除一个字符,可搭配数子实现重复操作
- d+文本对象: 比如 daw(d around word),快速删除一个单词,可搭配数子实现重复操作
- dd: 删除上一行
- dt": 意思是d to ",删除至"位置
- d0: 删除到行首
- d$: 删除到行尾
vim 快速修改
r:(replace),c:(change),s:(substitute)
- normal模式使用r可以替换一个字符。s替换并且进入插入模式
- R: normal模式替换字符
- S: 删除一行并且进入插入模式
- c: 匹配文本对象并且进行修改
- cw: 删除一个单词并且进入插入模式
- C: 删除至行尾并且进入插入模式
vim 快速查询
使用 :set incsearch 设置增量搜索,边输入搜索边高亮
- /或者?进行前向或者反向搜索
- 使用n/N跳转到下一个或者上一个匹配
- 使用*或者#进行当前单词的前向和后向匹配
vim 快速搜索替换
格式:
:[range] s/{pattern}/{string}/[flags]
- range: 表示范围 比如: 10,20 表示10-20行,% 表示全部
- pattern: 表示替换的模式,可以是正则模式
- string: 表示替换后的文本
- flags: g(global)表示全局范围类执行;c(confirm)表示确认;n(number)表示报告匹配到的次数而不替换
vim 多文件操作
Buffer
什么是Buffer Buffer是只打开的一个文件的内存缓冲区
- :ls ls会列举出当前缓冲区,然后使用:b n跳转到第几个缓冲区
- :bpre :bnext :bfirst :blast
- :e 文件名称 编辑新的文件
窗口
什么是窗口
窗口是Buffer可视化的分割区域
- 一个缓冲区可以分割多个窗口,每个窗口也可以打开不同缓冲区
- :sp 水平分割
- :vs 垂直分割
- control+w: 窗口切换
Tab(标签页)
什么是Tab
Tab是可以容纳一系列窗口的容器(:h tabpage) 命令模式常用命令
- tabe {filename}: 在新标签页打开文件
- tabc: 关闭当前标签页及其中的所有窗口
- tabo: 值保留活动标签页,关闭其它标签页
- tabnew {filename}: 新建标签页打开文件
正常模式常用命令
- {N}gt: 切换到变化N的标签页
- gt: 切换到下一个标签页
- gT: 切换到上一个标签页
vim 文本对象
什么是文本对象 比如一个字符,一个单词,一个句子,一个段落
文本对象操作方式
格式:
[number][command][text object]
- number: 表示次数
- command: 表示命令,d(delete:删除),c(change:替换),y(yank:复制)
- string: 表示替换后的文本
- text object: 是要操作的文本对象;比如w(单词);s(句子);p(段落)
案列:
- iw: 表示inner word,如果输入viw,首先进入选择模式,然后iw将选中当前单词
- aw: 表示around word,他不但会选中当前单词,还会包含当前单词之后的空格
- ci): 修改()内的内容
- vis: 选择一个句子
- vip: 选择一个段落
vim 复制粘贴
normal模式
- y(yank)和p(put),实现复制粘贴
- d(delete)和p(put),实现剪切粘贴
insert模式
- cmd+c cmd+v进行复制粘贴,但是在代码缩进有问题,可以通过设置 :set autoindent或者 :set paste 和 :set nopaste
vim 寄存器
无名寄存器
vim里操作的是寄存器,不是系统剪贴板,默认我们使用d删除或者y复制的内容都是放到了“无名寄存器”。 比如交换字符小技巧:可以使用x将一个字符放到无名寄存器,然后p将无名寄存器里的内容进行粘贴,可以达到交换字符位置的一个目的。
深入寄存器(register)
- 通过"{register}前缀可以指定寄存器,不指定默认无名寄存器
- "ayy: 表示复制当前行到a寄存器,然后"ap,可以把寄存器a的内容粘贴到指定位置
- "bdd: 表示删除当前行到b寄存器,然后"bp,可以把寄存器b的内容粘贴到指定位置
- "+: 表示复制到系统剪贴板,需要查看vim是否支持,通过:echo has('clipboard')查看,输出1表明支持;然后去到其它文本就可以cmd+v粘贴vim里的内容
- "+p: 表示将系统剪贴板内容粘贴到vim里,用于在其它编辑器里想粘贴文本到vim里
- 可以使用:set clipboard=unnamed让直接复制粘贴系统剪贴板内容
最常用还是在normal模式下,直接"+p 把系统剪贴板的内容进行粘贴,格式也不会乱;也可以:set clipboard=unnamed让直接复制粘贴系统剪贴板内容
vim 宏
- normal模式下使用q来录制,同时也是使用q来结束录制
- 使用q{register}选择要保存的寄存器,录制的命令保存在寄存器,然后q结束录制
- 使用@{register}进行宏回放
例子:需要在如下文本,每行URL前后都加上一个双引号;
normal模式执行行:
qa0f:i"$"q
- qa: 开始录制宏a
- 0f:i": 首先回到一行的行首,然后查找第一个:开头的字符,i进入insert模式,输入双引号",然后回到normal模式
- $i"q: 去到行尾,i进入插入模式,输入双引号",q结束宏录制,这样就结束了针对一行的操作
接下来回放宏,并且应用到接下来的每行,需要使用vim的特性,在命令行下执行normal模式的命令,执行:
- :VG: V进入行选择模式,G选择剩下的行
- :normal @a: 执行normal模式命令,回放宏a
vim 常用补全
单词补全
- control+n/control+p: 搜索当前文本出现过的词语,进行补全,当出现多个选择可以使用control+n或者control+p进行下一个或者上一选择
路径补全
- control+x + control+f: 进行路劲补全
全能补全
需要开启filetype检测文件类型
- :filetype no : 开启检测文件类型
- control+o : 进行全能补全
vim配置
持久化配置文件
新建 ~/vimrc文件,配置常用配置,避免每次打开vim重新设置
" 常用设置
" 设置行号
set number
colorscheme hybrid
" 按F2进入粘贴模式
set pastetoggle=
" 高亮搜索
set hlsearch
" 设置折叠方式
set foldmethod=indent
” 一些方便的映射
let mapleader= ' ,'
let g:mapleader=','
" 使用jj进入normal模式
inoremap jj `^
"使用leader+w 直接保存
inoremap w :w
noremap w :w
" 切换buffer
nnoremap [b :bprevious
nnoremap [n :bnext
" use ctrl+h/j/k/L switch window
noremap h
noremap j
noremap k
noremap l
"Sudo to write
cnoremap w!! w !sudo tee % >/dev/null
" json格式化
com! FormatJSON %!python3 -m json.tool
常用命令
:syntax on : 高亮显示
:set nu : 设置行号 :set autoindent : 设置自动缩进 ::r! echo %:p : 插入当前文件的全路径
时来天地皆同力,运去英雄不自由