总结下列章节中常用的vim命令
<Esc> 按退出键
<CR> 按回车键,也写作<Enter>
<Ctrl> 按控制键
<Tab> 按制表键
<S-Tab> 同时按<Shift>和<Tab>
<Up> 按上光标键
<Down> 按下光标键
目的 操作 重复 回退
做出一个修改 {edit} . u
在行内查找下一指定字符 f{char} ; ,
在行内查找上一指定字符 F{char} ; ,
在文档中查找下一处匹配项 /pattern<CR> n N
在文档中查找上一处匹配项 ?pattern<CR> n N
执行替换 :s/target/replacement & u
执行一系列修改 qx{changes}q @x u
. 重复
u 撤销
0 行头
^ 行头(非空白字符)
I 行头并进入插入模式
$ 行尾(依然处于普通模式)
A 行尾并进入插入模式
a 在光标后进入插入模式
i 在光标前进入插入模式
x 删除光标下字符(普通)
s 删除光标下字符(插入)
* 高亮光标下内容 (整个文档)
gg 整个文档顶部
G 整个文档底部
zz 重绘屏幕,把当前行显示在正中
{num}G 跳转到num行
w 正向移动到下一单词的开头
W 正向移动到下一单词的开头(跳过单词间的符号)
b 反向移动到当前单词/上一单词的开头
B 反向移动到当前单词/上一单词的开头(跳过单词间的符号)
e 正向移动到当前单词/下一单词的结尾
ge 反向移动到上一单词的结尾
{count}<C-a> 对该行从光标位置下开始的第一个数字数字加count
{count}<C-x> 对该行从光标位置下开始的第一个数字数字减count
操作 = 操作符 + 动作命令
操作符
c 修改
d 删除
y 复制到寄存器
g~ 反转大小写
gu 转换为小写
gU 转换为大写
> 增加缩进
< 减小缩进
= 自动缩进
! 使用外部程序过滤{motion}所跨越的行
操作
dd 删除当前行
>> 缩进当前行
gUU 大写当前行
dl 删除一个字符
daw 删除一个单词
dap 删除一个段落
<C-h> 删除前一个字符(同退格键)
<C-w> 删除前一个单词
<C-u> 删至行首
<C-[> 切换到普通模式
<C-“o> 切换到插入-普通模式
<Esc> 切换到普通模式
<C-v>{123} 以十进制字符编码插入字符
<C-v>u{1234} 以十六进制字符编码插入字符
<C-v>{nondigit} 按原义插入非数字字符
<C-k>{char1}{char2} 插入以二合字母{char1}{char2}表示的字符
ga 会显示出光标所在位置的字符的编码
r 只替换当前光标下的字符
R 进入替换模式
可视模式下选中的文本,可以用
c
,d
,y
等等操作命令对选中的文本进行操作
v 字符文本可视模式
V 行文本可视模式
<C-v> 块文本可视模式
<C-g> 从可视模式切换到选择模式(选择模式输入任何字符,替换掉选择的内容)
gv 选择上次的高亮选区
o 切换选区的活动端
h,j,k,l 这些方向键也可以调整选择的范围
f{char}/b 移动命令可以调整选择的范围
it 选中标签内的文本对象
: 进入命令行模式
/ 进入查找模式
:[range]delete [x] 删除指定范围内的行[到寄存器x中]
:[range]yank [x] 复制指定范围的行[到寄存器x中]
:[line]put [x] 在指定行后粘贴寄存器x中的内容
:[range]copy {address} 在指定范围内的行拷贝到{address}所指定的行之下
:[range]t{address} 在指定范围内的行拷贝到{address}所指定的行之下
:[range]move {address} 在指定范围内的行移动到{address}所指定的行之下
[range]m{address} 在指定范围内的行移动到{address}所指定的行之下
:[range]join 连接指定范围内的行
:[range]normal {commands} 对指定范围的每一行执行普通模式下的命令{commands}
:[range]substitute/{pattern} 把指定范围的出现{pattern}的地方替换成{string}
/{string}/[flags]
:[range]global/{pattern}/[cmd] 对指定范围内匹配{pattern}的所有行,在其上执行Ex命令{cmd}
@: 普通模式下执行,重复上次的Ex命令
<C-d> 让Vim显示可用的补全列表
<Up>/<Down> 向上/下对历史Ex命令进行回溯
q: 从普通模式下进入命令行窗口
q/ 打开查找命令历史的命令行窗口
<Ctrl-f> 从命令行模式切换到命令窗口
range的定义
1 文件的第一行
$ 文件的最后一行
0 虚拟行,位于文件第一行上方
. 光标所在行
% 整个文件(:1,$的简写形式)
'm 包含位置标记m的行
'< 高亮选区的起始行
'> 高亮选区的结束行
1,5 表示range第1行到第5行
vim {pattern} 载入所有匹配{pattern}的文件
:ls 列举出所有被载入内存中的缓冲区的列表
:bnext 切换到下一个缓冲区
:bprev 切换到上一个缓冲区
:bfirst 切换到第一个缓冲区
:blast 切换到最后一个缓冲区
:buffer N 切换到第N个缓冲区
:bdelete N1 N2 N3 删除N1,N2,N3...等等缓冲区
:N,M bdelete 删除N到M之间的缓冲区(N,M也包括)
:w[rite] 把缓冲区内容写入磁盘
:wa[ll]! 把所有改变的缓冲区写入磁盘
:e[dit]! 把磁盘文件内容读入缓冲区(即回滚所做的修改)
:qa[ll]! 关闭所有窗口,摒弃所有修改而无需警告
<C-w>s 水平切分当前窗口,新窗口仍然显示当前缓冲区
<C-w>v 垂直切分当前窗口,新窗口仍然显示当前缓冲区
:sp[lit] {file} 水平切分当前窗口,并在新窗口载入{file}
:vsp[lit] {file} 垂直切分当前窗口,并在新窗口载入{file}
<C-w>w 在窗体间循环切换
<C-w>h 切换到左边的窗体
<C-w>j 切换到下边的窗体
<C-w>k 切换到上边的窗体
<C-w>l 切换到右边的窗体
:clo[se] 关闭活动窗口
:on[ly] 只保留活动窗口,关闭其他窗口
<C-w>c 关闭活动窗口
<C-w>o 只保留活动窗口,关闭其他窗口
<C-w>= 使所有窗口等宽、等高
<C-w>_ 最大化活动窗口的高度
<C-w>| 最大化活动窗口的宽度
[N]<C-w>_ 把活动窗口的高度设置为[N]行
[N]<C-w>| 把活动窗口的宽度设置为[N]行
:tabe[dit] {filename} 在新标签页中打开{filename}
<C-w>T 把当前窗口移到一个新标签页
:tabc[lose] 关闭当前标签额及其中的所有窗口
:tabo[nly] 只保留活动标签页,关闭所有其他标签页
:tabn[ext] {N} 切换到编号为{N}的标签页
:tabn[ext] 切换到下一个标签页
:tabp[revious] 切换到上一个标签页
{N}gt 切换到编号为{N}的标签页
gt 切换到下一个标签页
gT 切换到上一个标签页
:tabmove[N] 重排标签页,N为0移动当前标签页到开头。缺省时,到结尾
:edit path 打开指定路径下的文件
:edit %<Tab> % 代表活动缓冲区的完整文件路径
:edit %:h<Tab> :h 会去除文件名,但保留路径中的其他部分
:!mkdir -p path -p参数使mkdir创建任何不存在的中间目录
:write 写入磁盘
:w !sudo tee % > /dev/null 超级用户权限保存文件
j 向下移动一个实际行
gj 向下移动一个屏幕行
k 向上移动一个实际行
gk 向上移动一个屏幕行
0 移动到实际行的行首
g0 移动到屏幕行的行首
^ 移动到实际行的第一个非空白字符
g^ 移动到屏幕行的第一个非空白字符
$ 移动到实际行的行尾
g$ 移动到屏幕行的行尾
选择区域范围-> 作为动作 (操作 = 操作符 + 动作)
a)或ab 一对圆括号(选中圆括号及内部内容)
i)或ib 圆括号内部
a}或aB 一对花括号(选中花括号及内部内容)
i}或iB 花括号内部
a] 一对方括号
i] 方括号内部
a> 一对尖括号
i> 尖括号内部
a' 一对单引号
i' 单引号内部
a" 一对双引号
i" 双引号内部
a` 一对反引号
i` 反引号内部
at 一对XML标签 <xml>tags</xml>
it XML标签内部 tags
iw 当前单词
aw 当前单词及一个空格
iW 当前字串
aW 当前字串及一个空格
is 当前句子
as 当前句子及一个空格
ip 当前段落
ap 当前段落及一个空行
m{a-zA-Z} 会用选定的字母标记当前光标所在位置。小写位置标记只在每个缓冲区里局部可见,而大写位置标记则全局可见
`{mark} 跳到位置标记所在行
‘{mark} 把光标移动到设置此位置标记时光标所在的位置
vim的自动位置标记
`` 上次跳转动作之前的位置(当前文件中)
`. 上次修改的地方
`^ 上次插入的地方
`[ 上次修改或复制的起始位置
`] 上次修改或复制的结束位置
`< 上次高亮选区的起始位置
`> 上次高亮选区的结束位置
% 命令允许我们在一组开闭括号`(),{},[]`之间跳转
surrond.vim 插件
S" 给被选中的文字加双引号
S) 给被选中的文字加括号
S} 给被选中的文字加大括号
[count]G 跳转到指定的行号
% 跳转到匹配的括号所在之处
( 跳转到本句或上一句的开头
) 跳转到下一句的开头
{ 跳转到本段或上一段的开头
} 跳转到下一段的开头
H/M/L 跳转到屏幕正上方/正中间/最下方
gf 跳转到光标下的文件名所在文件
<C-]> 跳转到光标下的关键字的定义之处
‘{mark}/`{mark} 跳转到一个位置标记
"{register}操作 "{register}指定要用的寄
存器,若不指明,vim将缺省使用无名寄存器。
"{register} 作为前缀指定要使用的寄存器,但同时会覆盖无名寄存器
"" 代表无名寄存器
"a到"z 总共26个有名寄存器
"_d{motion} 这种方式删除的内容会进入到黑洞寄存器中,有去无回
x s d{motion} c{motion} y{motion} 会覆盖无名寄存器内容
y{motion} 不仅会把内容复制到无名寄存器中,也复制到名为"0的复制专用寄存器中
//了解
"% 当前文件名寄存器
"# 轮换文件名寄存器
". 上次插入的文本寄存器
": 上次执行的Ex文本寄存器
"/ 上次查找的模式寄存器
p 寄存器中的内容是字符时,把寄存的内容粘贴到光标之后
P(大写) 寄存器中的内容是字符时,把寄存的内容粘贴到光标之前
p 寄存器中的内容是一行时,把寄存的内容粘贴到行之后
P(大写) 寄存器中的内容是一行时,把寄存的内容粘贴到行之前
:set paste 启用系统剪切
command + v 启用系统剪切,通过这个命令将系统剪切板的内容粘贴到vim中
:set paste! 使用完后,关闭系统剪切
宏允许我们把一段修改用程序保存下来
录制宏
q{register} 开始录制时,指定一个用于保存宏的寄存器。
{changes} 一系列的修改
q 录制完成,停止录制(这两者之间的所有命令都被宏捕获记录)
执行宏
qa{changes}q 将一系列的命令录制到寄存器a中
@a 回放寄存器a中的宏(录制的某条命令执行失败时,将中断执行)
@@ 回放上一次的宏
编辑宏
:put a 把寄存器a中的宏的内容输出到光标所在位置的下一行,然后就可以像普通文本一样进行编辑
"ay$ 面向字符的复制,把编辑好的行除结尾的回车符之外的内容复制到寄存器a中
:set ignorecase 全局设置Vim的查找模式将不区分大小写。但会影响vim的自动补全行为(大写字母将会被补全成小写字母)
/{pattern}\c 单次查找,让查找模式忽略大小写(忽略全局的ignorecase)
/{pattern}\C 单次查找,让查找模式区分大小写(忽略全局的ignorecase)
/-v{pattern} 激活very magic搜索模式,即假定除`_`,大小写字符以及0到9之外的字符都具有特殊含义.
/-V{pattern} 即可启用very nomagic原义开关,忽略字符的特殊含义。查找`.`, `?`,`*`等等具有特殊含义的字符时,打开原义开关-V。
/ 是正向查找提示符
? 是反向查找提示符
n 重复上一次查找,与上次查找方向相同
N 重复上一次查找,与上次查找方向相反
/{pattern}<CR> Vim会从当前光标位置向文档下方扫描,然后到达底部后,再从顶部扫描到光标位置
wrapscan 关闭`wrapscan`后,Vim只会从当前光标位置扫描到文档底部结束。
:set hlsearch 高亮查找到的内容
:set nohlsearch 关闭高亮功能
:set incsearch 时时更新预览内容,把第一个匹配处高亮起来
<C-r><C-w> incsearch开启时,没有输入完整的查找内容时,可用这个命令进行补全
:%s/{pattern}//gn 统计字符串{pattern}的匹配个数,n抑制正常的替换工作
/{pattern}/e<CR> 查找字符串,并将光标偏移到字符串结尾
:[range]s[ubstitute]/{pattern}/{string}/[flags] 替换命令语法
g 该标志位,使得subsititute命令在全局范围内执行
c 该标志位,让我们有机会可以确认或拒绝每一处修改
n 该标志位,会抑制正常的替换行为
e 该标志位,会屏蔽报错提示,例如找不到模式时,错误信息E486:找不到模式
s/{pattern}/{string} 替换当前行的第一处的匹配
s/{pattern}/{string}/g 替换当前行的所有的匹配
%s/{pattern}/{string}/g 替换所有行的所有的匹配
标志位c的选项
y 替换此处匹配
n 忽略此处匹配
q 提出替换过程
l "last" -- 替换此处后退出
a "all" -- 替换此处与之后所有的匹配
<C-e> 向上滚动屏幕
<C-y> 向下滚动屏幕
<C-r>{register} 命令行下,可以将寄存器的内容插入到命令行
%s//<C-r>0/g 将寄存器0中的内容放到替换域
:global
命令允许我们在某个指定模式的所有匹配行上运行Ex命令。
:[range] global[!] /{pattern}/[cmd] global语法命令,执行分为两个过程,第一轮 对`[range]`范围内的行进行标记,第二轮对每个标记的行执行`[cmd]`
[range] range缺省情况下,:global的作用范围是整个文件(%)
[cmd] 可以是除了:global命令之外的任何Ex命令。缺省时使用`:print`
:global!或者:vglobal 反转:global的行为。即为在没有匹配到模式的行执行[cmd]命令
:g/{pattern}/d 在所有匹配`{pattern}`的行执行`d`命令,从而删除所有匹配的行
:v/{pattern}/d 在所有不匹配`{pattern}`的行执行`d`命令,从而删除所有不匹配的行
ctags是一个外部程序,它通过扫描代码库,生成关键字。
$ctags {pattern} 为匹配到的文件建立建立一个名为tags的纯文本文件,内容是生成的关键字索引
<C-]> 光标将会从当前所在的关键字跳转到它的定义处。
g<C-]> 如果有多处匹配,`g<C-]>`会把所有匹配项列举出来供我们选择
<C-t> 光标将会回到跳转前光标所在的位置
:tag {keyword} 相当于 <C-]>
:tjump {keyword} 相当于 g<C-]>的功能
vim调用外部编译器,从而省去了离开编辑器的麻烦
不必离开Vim也能调用grep
在插入模式下,vim的自动补全会被自动触发
vim会根据当前的会话内缓冲区的所有内容创建一份补全列表
触发Vim自动补全的方法总结
<C-n> 普通关键字
<C-x><C-n> 当前缓冲区关键字
<C-x><C-i> 包含文件关键字
<C-x><C-]> 标签文件关键字
<C-x><C-k> 字典查找
<C-x><C-l> 整行补全
<C-x><C-f> 文件名补全
<C-x><C-o> 全能(Omni)补全
当拼写检查器被启用后,Vim会对所有未在拼写文件中出现过的单词进行标记。
:set spell 进行拼写检查,拼写错误的单词会被标记出来
]s 跳到下一处拼写错误
[s 跳到上一处拼写错误
z= 为当前单词提供更正建议
zg 把当前单词添加到拼写文件中
zw 把当前单词从拼写文件中删除
zug 撤销针对当前单词的zg,zw命令
多行注释
1. <C-v> j/k 可视块选中要注释的行
2. I # I移动光标到行首并进入插入模式,添加#注释符
3. <Esc> 退出插入模式,并自动将所有的行添加上注释
取消多行注释
1. <C-v> j/k 可视块模式选中要去除的注释符(#)
2. d 删除所有的注释符#