《vim实用技巧》相关命令笔记

时间:2021-01-01 06:28:19

说明:相关命令前面如没有冒号,则表示该命令是在普通模式下执行的,否则是在命令行模式下执行(通过在普通模式下输入冒号)

移动操作:
j 向下
k 向上
l 向右
h 向左    (如果在一行中连按两次以上向左向右键,就是在浪费时间,可以用面向单词的动作命令或是用字符查找动作命令来更快的进行移动)
$ 移动到行末
0 移动到行首
^ 移动到行首
(以上移动操作命令在前面加个g,则是在屏幕行间进行移动,如gj就是向下移动一个屏幕行)

w 移动到下个单词开头
W 移动到下个字串开头(单词包括标点符号)
b 移动到上个单词开头
B 移动到上个字串开头(单词包括标点符号)
e 移动到下个单词末尾
E 移动到下个字串开头(单词包括标点符号)

nzz 跳转到n行,并将该行显示在屏幕正中
gg 跳到文本第一行
G 跳到文本最后一行

<ctrl+u> 屏幕向上跳转半屏
<ctrl+d> 屏幕向下跳转半屏


======================================================


复制删除
1、字符操作
x 删除所在光标字符
s 删除字符后进入插入模式
dl 删除所在光标字符

2、单词操作
dw 删除当前光标到下个单词开头  (word)
dW 删除当前光标到下个单词开头包括标点在内
de 删除当前光标到当前单词末尾  (end)
dE 删除当前光标到当前单词末尾包括标点在内
db 删除当前光标到前一个单词    (before)
dB 删除当前光标到前一个单词包括标点在内
daw 删除这个光标所在的单词包括标点在内  (delete a word)
diw 删除这个光标所在的单词  (delete a word)

(这里的i想成“inside”,把a想成"around"。可以使用到<>,(),{}等地方)

3、行操作
dd 删除行 (操作符命令连续调用两次作用于当前行)
D 删除当前光标位置到行尾
d0 删除当前光标位置到行首
C   删除当前光标位置到行尾,并进入插入模式
S   删除行首到行尾的字符,并进入插入模式       

df{char} 删除到查找的那个字符位置
dt{char} 删除到查找的那个字符之前
注:学会把d{motion}操作符与查找动作结合在一起使用

J 将当前行与下一行连接在一起

4、段落操作
dap 删除当前段落

5、文件操作
dgg 删除当前行上面的所有内容
dG 删除当前行下面的所有内容

上述命令相应的将d换成c,除完成相同操作外,还会进入插入模式,如
cw 删除当前光标到一个单词开头并进入插入模式
上述命令相应的将d换成y,则是进行相应的复制操作,如
yw 复制当前光标到下一个单词开头

6、黏贴操作
p 在当前光标的后面进行黏贴

x、s、d、c、y命令都会覆盖无名寄存器中的内容,无论哪一种情况,都可以通过加”{register}前缀来指定另外一个寄存器("a-"z),("A-"Z)大写的寄存器可以进行拼接
y命令还会复制到寄存器0中

<c-r>{register}     在插入模式下,将寄存器的文本拆入到光标之前

外部程序与vim之前进行复制黏贴,可使用"+寄存器(前提是vim已经集成了系统剪贴板)
如果没有的话,则在命令行模式下,执行:set paste(不这样操作的话,直接进行黏贴,则黏贴的文本,每行都会增加缩进)  ; 在结束黏贴后,在命令行执行:set paste!退出该模式


======================================================


模式切换(默认在普通模式)
1、插入模式
i 进入插入模式
a 在该字符后面插入
o 在该行下面插入
O 在该行上面插入
A 移动到行末并进入插入模式
I 移动到行首进入插入

2、替换模式
r 进入到替换模式,允许替换一个字符,之后回到普通模式
R 进入到替换模式
gr gR 进入到虚拟替换模式,按屏幕显示的宽度来替换字符,如一个制表符当8个空格处理
如想画一条横线分隔,可以快速复制黏贴一行副本,然后再用Vr-进行替换

3、普通模式
<Esc> 切换到普通模式
<c+[> 切换到普通模式
<c+o> 切换到插入-普通模式:能执行一次普通模式命令,随即返回插入模式,如<c+o>zz

4、可视模式
v   激活面向字符的可视模式  (该命令可跟上述w、e、b、aw、ap等,也可以直接通过hjkl来控制选择,结束选择后,可用y、d、c、>、r等进行复制、删除、修改、缩进、替换操作), 如果已在可视模式了,按v则退出可视模式
V   激活面向行的可视模式
gv  重选上次高亮选区
o   当进行选择后,发现开头位置不对,可通过该命令跳到开头,然后再重新进行选择操作

<ctrl+v>    激活面向列的可视模式 
列模式方便多行在同位置插入、删除、缩进、替换等操作, 如I、A命令在所选列的首尾插入,按ESC返回后,选中的多列都会进行相应的修改
如要在长短不一的高亮块后面添加文本,在选中多列后,用$键将多列扩大到每行末尾,然后用A命令进行插入即可


======================================================


查找替换
1、行字符查找操作
f{char}     在该行找到这个字符,并跳转到该行处; F{char} 反向
t{char} 在改行查找这个字符,并跳到该字符前面; T{char} 反向  (该命令也可用于辅助删除命令d)
; 重复上次的命令查找
, 跳回到上次查找的地方

2、当前文本下查找
/pattern<CR> 从当前位置跳转到下一处匹配位置;?/pattern<CR>反向
* 正向查找当前光标所在的单词
#   反向查找当前光标所在的单词
n 跳至下一处匹配,保持查找方向与偏移不变
N 跳至上一处匹配,保持查找方向与偏移不变

小写字母\c会让查找模式忽略大小写
大写字母\C会强制区分大小写

如果你想按正则表达式查找,就用模式开关\v,而如果想按原义查找文本,就用模式开关\V

用<与>符号表示单词定界符
用字符\zs标志着一个匹配的起始,用字符\ze界定一个匹配的结束

使查找高亮:set hls; 禁止显示则是:set nohls

3、替换操作
s/target/replacement
:[range]s[ubstitute]/{pattern}/{string}/[flags]
pattern为被替换的文本,string为替换文本
flags标记如下
g:在全局范围内执行,即可修改一行内的所有匹配,而不是第一处匹配
c:在进行替换前进行确认
n:不进行替换,只计算匹配的个数

& 重复上次操作
u 回退上次操作

如把查找域留空,将使用上次的查找模式

4、多个文件中查找和替换
vimgrep的语法如下:
:vim[grep][!] /{pattern}/[g][j]{file}...
选项g为每处匹配创建一条记录
选项j只更新quickfix列表,而不跳到第一处匹配

例子:
:/target
:vimgrep /<C-r>// **./*         (这里一定要用<C-r>/来黏贴查找域)
:Qargs | argdo %s//replacement/g | update
(Qargs部分见vimrc部分)


======================================================


窗口操作
:sp/sp {file}  水平分割窗口,并在新窗口中载入{file}
:vsp {file} 垂直切分当前窗口,并在新窗口中载入{file}

在窗口间切换
:<c+w>w  在窗口间循环切换
:<c+w>h/j/k/l   切换到上/下/左/右窗口

关闭窗口
:clo[se]    关闭活动窗口
:on[ly]     只保留活动窗口

调整窗口大小
//最好就让终端支持鼠标操作,此次比较方便

:bn 遍历缓冲区正向移动
:bp 遍历缓冲区反向移动


======================================================


标签页操作
:tabnew     创建新标签页
:tabc[lose] 关闭当前标签页及其中的所有窗口
:tabo[only] 只保留活动标签页

{n}gt       切换到编号为{n}的标签页
gt          切换到下一标签页
gT          切换到上一标签页


======================================================


补全
<c+n>   使用来自补全列表的下一个匹配项
<c+p>   使用来自补全列表的前一个匹配项
<c+x>+<c+l> 整行补全

得到所要的匹配项后,继续输入字符即可。


======================================================


命令行操作
命令                         用途
:[range]delete/d [x]          删除指定范围内的行[到寄存器x中]
:[range]yank/y [x]            复制
:[line]put [x]               在指定行后黏贴寄存器的内容
:[range]cope/t {address}      把范围内的行拷贝到指定行执行
:[range]move/m {address}  移动       
:[range]join                 连接
:[range]normal {commands} 
:[range]global/{pattern}/[cmd] 

rang:   {start},{end}   // 默认起始行是当前光标所在行
符号        地址
1           文件的第一行;
$           文件的最后一行
0           虚拟行,位于文件第一行上方
.           光标所在行
'm          包含位置标记m的行
'<          高亮选区的起始行
'>          高亮选区的结束行
%           整个文件

copy的简写是 t
如为当前行创建一个副本,使用:t.相比较yyp是其不会使用到寄存器

normal 与.命令或宏结合时,可以花费很少的努力完成大量的重复性工作
如在所有行的后面加入;字符
1、先A; 然后 :[range]normal .
2、:[range]normal A;
如注释多行
:[range]normal i//

global命令
:[range] g/{pattern}/[cmd]
range默认是当前文本
默认cmd命令时print打印

:g//d   (将所查找的匹配行删除)
:g/re/y a   (将匹配的行保存到寄存器a)

:v/re/d (只保留匹配行,re表示表达式)

@:执行上一条命令行命令
在运行过一次@:后,就可以用@@命令来重复它

在命令行可使用tab键进行补全

总结:普通模式的命令适合在本地进行操作,而命令模式下的命令适合远距离操作。


============================================


多文件工程
通过文件名打开一个文件
首先配置path选项
:set path+=./**    " **通配符会匹配当前目录下的所有子目录
设置好路径后使用如下命令
:find filename


============================================


跳转操作
设置位置标记
m{a-zA-Z}命令会用选定的字母标记当前光标所在位置,小写位置标记只在每个缓冲区里局部可见,
而大写位置标记则全局(多个文件间)可见;之后可通过`{a-zA-Z}跳回到所作的标记处
(一般来说,要养成在使用quickfix列表有关的命令前,如:grep、:vimgrep、及:make,设置全局标记的习惯;另外,在执行与缓冲区列表或参数列表有关的命令前,也要设置全局标记。)

``  跳转到当前文件中上次跳转之前的位置
`.  跳转到上次修改的地方
`^  跳转到上次退出插入模式时的位置

%   在一组开、闭括号间跳转
(/) 跳转到上一句/下一句开头
{/} 跳转到上一段/下一段开头
H/M/L   跳转到屏幕上方/正中间/最下方

g;      反向跳转到上次文档被更改的地方
g,      正向跳转到上次文档被更改的地方 
gi      跳转到上次退出插入模式的位置并进入插入模式

gf      跳转到光标下的文件  ;   suffixesadd选项可用于所要打开文件的扩展项

以下命令结合ctags插件
<C-]>   跳转到光标下关键字的定义处
g<c-]>  如果有多处匹配,显示各标签供用户选择跳转
:tag <keyword> 与 :tjump <keyword> 与上面两个功能等同
<c+o>   回到跳转列表的上一条记录
<c+i>   前进到跳转列表的上一条记录

quickfix
:copen/cw  打开quickfix窗口
:cclose 关闭quickfix窗口
:cn     跳转到下一项  (设置下快捷键更好)
:cp     跳转到上一项
:cfirst 跳转到第一个
:clast  跳转到最后一个
:cc N   跳转到第n项


============================================


退出保存操作
:w  把缓冲区内容写入磁盘
:e! 把磁盘文件内容读入缓冲区(即回滚所做修过)
:qa!    关闭所有窗口,放弃所有修改
:wa!    把所有修改保存到磁盘
:saveas <path/file> 将文件另保存
:mksession <path/project.vim>   保存工程当前的回话状态,下车在shell下可通过命令"vim -S path/project.vim"打开工程


======================================================


其它
缩进操作
> 增大缩进   如 >G 将该行后的所有行增加缩进
< 减小缩进
= 自动缩进

大小写
g~ 反转大小写
gu 转换为小写 如gUaw:把当前单词转换成大写
gU 转换为大写

对数字进行操作
num<ctrl+a> 在数字上加num或当前不是数字会自动跳到后面的数字并进行操作
num<ctrl+x> 在数字上减num
<ctrl+r>={算术表达式}<CR> 在插入模式中计算表达式的结果


======================================================

. 重复上次操作 (如果要在几个地方做同样的修改,构思能被.命令重复执行的命令)
u 进行撤销
<ctrl+r>继续执行上次撤销的命令

1、控制ESC键的使用,就可使撤销命令作用与单词、句子和段落
比如另起一行最快的方式是按<CR>,也可以更换用<ESC>o
2、能够重复就别用次数  (执行、重复、回退)
3、将大小写键重新映射成ctrl键

ga 查看字符编码



======================================================


推荐链接:
http://coolshell.cn/articles/5426.html