安装插件管理器
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
到github仓库地址 查看使用方式
vim操作技巧
. 重复命令
. 命令重复上次的修改
什么是修改:除了普通模式中执行的修改命令之外,每次进入插入模式时,也会形成一次修改。从进入插入模式的那一刻起,直到返回普通模式为止,为一次修改。
将以下内容进行缩放
Line one
Line two
Line three
Line four
Line one
Line two
Line three
Line four
指令:
光标起始:第二行开头
>G
j
.
j.
用 . 的最佳实践:一键移动 一键操作
将
var foo = "method("+argument1+","+argument2+")";
替换成
var foo = "method(" + argument1 + "," + argument2 + ")";
在插入模式下,vim会将连贯的操作当成一次修改,但如果是有进行光标移动,记录的只是光标移动后的操作,要在 + 前后各加空格,必须移动光标。换一种思路,可以将+删除,再重新输入,就能有连贯的操作
f+
s + <esc>
;
.
;.
;.
逐个替换
...We're waiting for content before the site can go live...
...If you are content with this, let's go ahead with it...
...We'll launch as soon as we have the content...
逐个替换content为copy
光标定位在content
cwcopy<esc>
n
.
. 范式:用一次按键移动,另一次按键执行
普通模式
普通模式命令的强大,很大程度上源于它可以把操作符与动作命令结合在一起
控制撤销命令的粒度:从进入插入模式开始,直到返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改。只要控制<esc>键的使用,就可控制粒度
The end is nigh
删除末尾的单词nigh
daw
删除整个单词(aw是文本对象)
<c-a> 和 <c-x> 分别对数字执行加和减操作。如果带一个次数前缀,用于加减任意整数
.blog { background-position: 0px 0px }
修改
.news { background-position: -180px 0px }
cW.news<esc>
180<c-x> # 光标不在操作的数字上,会正向跳到所找到的第一个数字上
操作符+动作命令=操作
d{motion}命令可以对一个字符(dl), 一个完整单词(daw), 或一整个段落(dap)进行操作,它作用的范围由动作命令决定。c{motion}, y{motion} 也类似。统称为操作符(operator), 用 :h operator可查阅完整的列表
操作符与动作命令的结合形成了一种语法。规则为:一个操作由一个操作符,后面跟一个动作命令组成
操作符命令
|c |修改|
|d |删除|
|y |复制到寄存器|
|g~ |反转为大小写|
|gu |转换为小写|
|gU |转换为大写|
|> |增加缩进|
|< |减少缩进|
|= |自动缩进|
|! |使用外部程序过滤{motion}所跨越的行|
插入模式
<c-h> 删除前一个字符
<c-w> 删除前一个单词
<c-u> 删至行首
插入模式只专注于做一件事:输入文字
普通模式是我们大部分时间所使用的模式
<c-o> 进入插入-普通模式
不离开插入模式,粘贴寄存器中的文本
Practical Vim, by Drew Neil
Read Drew Neil's
修改为:
Practical Vim, by Drew Neil
Read Drew Neil's Practical Vim.
yt,
jA
<c-r>0
.<esc>
在插入模式 用<c-r>{register}可以方便地粘贴文本
gv 重复上一次选区
将标签内容改为大写
<a href="#">one</a>
<a href="#">two</a>
<a href="#">three</a>
<a href="#">ONE</a>
<a href="#">TWO</a>
<a href="#">THREE</a>
gUit
j.
j.
修改列文本
li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }
li.one a{ background-image: url('/components/sprite.png'); }
li.two a{ background-image: url('/components/sprite.png'); }
li.three a{ background-image: url('/components/sprite.png'); }
光标在第一行的images开头
<c-v>jje
c
components
<esc>
在每行末尾添加;
var foo = 1
var bar = 'a'
var foobar = foo + bar
var foo = 1;
var bar = 'a';
var foobar = foo + bar;
光标在第一行的末尾
<c-v>jj$
A;
<esc>
I 光标移至行首并进入插入模式
A 光标移至行尾并进入插入模式
<!DOCTYPE html>
<html>
<head><title>Practical Vim</title></head>
<body><h1>Practical Vim</h1></body>
</html>
高亮选区后,进行命令模式,会将选区标识为'<,'>
:/<html>/,/</html>/p
操作html标签之间的内容
还可以用偏移对地址进行修正
如:不想包括<html>及</html>所在的行,可以为之加上偏移
:/<html>/+1,/</html>/-1p
Ex命令的地址及范围的符号:
1 文件的第一行
$ 文件的最后一行
0 虚拟行,位于文件第一行上方
. 光标所在行
'm 包含位置标记m的行
% 整个文件(:1,$的简写形式)
使用:t和:m命令复制和移动行
:copy的简写形式为:t
Shopping list
Hardware Store
Buy new hammer
Beauty Parlor
Buy nail polish remover
Buy nails
Shopping list
Hardware Store
Buy new hammer
Buy nails
Beauty Parlor
Buy nail polish remover
Buy nails
:211t 208 将211行复制到208行
:6t. 把第6行复制到当前行下方
:t6 把当前行复制到第6行下方
:t. 复制当前行,相当于yyp(yyp会使用寄存器,而:t.则不会)
:t$ 把当前行复制到文本结尾
:6t0 把第6行复制到文件开头
合并命令行指令:
可将 :write 与 :!ruby % 合并为 :write | !ruby %
运行shell命令
给命令加一个叹号前缀,就可以调用外部程序
:!ls
在vim的命令行中,%代表当前文件名
把缓冲区内容作为标准输入或输出
:read !{cmd}将命令的标准输出重定向到缓冲区
:write !{cmd}将缓冲区内容作为指定{cmd}的标准输入
缓冲区操作
:ls 缓冲区列表
:bnext
:bprev
:bfirst
:blast
:bdelete n1 n2 n3
:N,M bdelete
通过缓冲区编号删除相应的缓冲区
窗口操作
:close 关闭活动窗口
:only 关闭除活动窗口外的其他所有窗口
更好更快地移动
基于单词的移动
w 正向移动到下一单词的开头
b 反向移动到当前单词/上一单词的开头
e 正向移动到当前单词/下一单词的结尾
ge 反向移动到上一单词的结尾
每个面向单词的动作命令,都有一个面向字串的命令与其对应,如 w 与 W, e 与 E
区分屏幕行与实际行
j k ^ $ 实际行
gj gk g^ g$ 屏幕行
f{char} 除了定位之外,还可以直接与动作命令结合在一起。如:dfa 从当前位置删除到下一个a的位置
f{char} 正向移动到下一个{char}所在之处
F{char} 反向移动到上一个{char}所在之处
t{char} 正向移动到下一个{char}所在之处的前一个字符上
T{char} 反向移动到上一个{char}所在这处的后一个字符上
; 重复上次的字符查找命令
, 反转方向查找上次的字符查找命令
通常,在行内快速移动光标时,倾向于用f{char}和F{char}; 当与d{motion}或c{motion}一起使用时,更倾向于使用t{char}及T{char}
查找命令可以与动作命令结合
This phrase gets to the point.
d/ge<CR> 从当前位置删除到ge处
用精确的文本对象选择选区
文本对象就是基于结构定义的文本区域
var tpl = [
'<a href="{url}">{title}</a>'
]
光标定位到url中
vi}
a"
i>
it
at
a]
在可视模式下观察这些文本对象选区的变化
vim的文本对象由两个字符组成,第一个字符永远是i或是a
i 选择分隔符内部的文本
a 选择包括分隔符在内的整个文本
vim的文本对象分为两类:
一类是操作分隔符的文本对象,如 i) i" it
另一类是操作文本块,如单词,句子和段落
iw aw 当前单词
iW aW 当前字串
is as 当前句子
ip ap 当前段落
设置位置标记
m{a-zA-Z}会用选定的字母标记当前光标所在位置
小写位置标记只在每个缓冲区局部可见
大写位置标记则全局可见
~{mark}跳转到标记位置
% 在匹配括号间跳转
surround插件的使用
New York 加上双引号
"New York"
可视模式选中内容后(vee),执行 S"
将 "New York" 修改为 [New York]
光标进入文本中,执行 cs"]
在文件间跳转
任何改变当前窗口中活动文件的命令,都可以被称为跳转命令,vim会把执行跳转命令之前和之后的光标位置,记录到跳转列表中
面向句子的动作及面向段落的动作都算跳转,但面向字符及面向单词的动作则不算。
大范围的动作命令可能会被当作跳转,但小范围的动作命令只能算移动
'. 总是指向上次修改的位置
gi 回到上次退出插入模式的地方并进入插入模式(只在本缓冲区内)
xp 调换光标之后的两个字符
vim的删除、复制与粘贴命令都会用到众多寄存器中的某一个,通过给命令加"{register}前缀的方式指定要用的寄存器。若不指明,vim将默认使用无名寄存器
"ayiw
"bdd
0 复制专用寄存器,即仅当使用y{motion}命令时才会被赋值
yiw
jww
diw
"0p
尽管diw仍会覆盖无名寄存器,但不会波及复制专用寄存器
:reg 查看所有寄存器内容
黑洞寄存器:用下划线引用 "_d{motion}将删除文本且不保存任何副本
只读寄存器
"% 当前文件名
"# 轮换文件名
". 上次插入的文本
": 上次执行的Ex命令
"/ 上次查找的模式