命令
|
等效命令
|
命令效果
|
正常模式
|
||
>G
|
之后的每行右移
|
|
C
|
c$
|
删除光标到结尾的数据,并插入
|
s
|
cl
|
删除当前字符,并插入。相当于xi
|
S
|
^C
|
删除当前行,并插入。
|
I
|
^i
|
从行头部插入
|
f{char}
|
让Vim查找下一处指定字符出现的位置
|
|
;
|
重复上一次查找
|
|
,
|
;按了太多之后,跳回去,
|
|
*
|
查找当前光标下的单词。
*nn 会匹配所有的匹配项,从而跳回到本次查找的起点。
|
|
".范式"
|
用一次按键移动,另一键执行,这就是理想的编辑模式,称为".范式“。
|
|
daw
|
delete a word删除一个单词
|
|
W
|
跳到下一个{0-9a-zA-Z}字符上
|
|
dap
|
删除整段
|
|
gUap |
把整段文字转为大写
|
|
|
数字自增和自减 | |
t{char}
|
正向移动到下一个{char}所在之处的前一个字符上
|
|
插入模式
|
||
在插入模式中更正错误。
这些命令不是插入模式独有,在Vim的 命令模式以及bash shell中也可以使用它们
|
||
zz
|
重绘屏幕,将当前行显示在窗口正中 | |
|
将寄存器中的文本粘贴到光标所在的位置, 命令模式下可以使用
|
|
|
计算数字表达式,例如3*5
|
|
可视模式
Vim有3种可视模式,分别用于操作字符文本,行文本和块文本。可视模式下,i和a被视为文本对象,因此按i和a不能起到增加的作用。
|
||
o
|
重新调整选取的边界
|
|
命令模式
Ex命令操作范围更大,并且能够在一次执行中修改多行。
|
||
:copy
简写形式为:t
|
1、把一行或者多行从文档的一部分复制到另一部分。
格式为
:[range]copy {address}
2、yyp会使用寄存器,而:t.不会,当不想覆盖默认寄存器中的内容时,使用:t.来复制行。
|
|
:move
简写形式为:m
|
把一行或者多行移动到文档的其他地方,相当于剪切。
格式为
:[range]move {address}
|
|
@:
|
重复上一次的Ex命令。
|
|
:normal
|
在指定范围上执行普通模式命令
➾:%normal A;
➾:%normal i//
|
|
|
命令模式下,Ex命令的补全
|
|
|
插入光标下的单词
插入光标下的字串
|
|
|
显示上一次/下一次输入的Ex命令
|
|
vim和外部命令
|
||
文件
|
||
:bnext
:bprev
:bfirst
:bnext
|
遍历缓冲区
|
|
:edit
|
打开文件,但是需要完整的路径
|
|
:find
|
打开文件,但是无需输入该文件的完整路径。想要使用此功能,我们首先需要配置‘Path’选项。
使用find的原因是因为,如果工程中包含多层嵌套的目录,使用edit的话,每次需要输入完整的路径
|
|
更快地移动以及跳转
|
||
技巧47
|
区分屏幕行和实际行
gj,gk,g0,g^,g$
|
|
技巧48基于单词移动
|
w,b,e,ge,W,B,E,GE
其中w,b使用的最多
|
|
技巧49对字符进行查找
|
f{char} 和 t{char}
F{char} 和 T{char}
|
|
技巧50通过查找进行移动
|
d/ge |
|
技巧51用精确的文本对象选择选区,分隔符文本对象
|
分隔符文本对象:
a), i)
a}, i}
a], i]
a>, i>
a', i'
a", i"
a`, i`
at, it
操作:
d{motion},c{motion},y{motion}
|
|
技巧52删除周边修改内部,操作文本对象
|
范围文本对象
d{motion}和a配合
c{motion}和i配合
|
|
技巧53设置位置标记,以便快速跳回
|
手动位置标记:
m{a-zA-Z}会用选定的字母标记当前光标所在的位置。小写位置只在每个缓冲区单独可见,而大写位置标记则全局可见。
`{mark}命令跳到位置标记所在行,并把光标置于该行第一个非空白符上
mm和`m
自动位置标记:
|
|
技巧54在匹配括号间跳转
|
%命令允许我们在一组开、闭括号间跳转。
如何将字符串"%w{London Berlin New\ York} "改为 ["London", "Berlin", "New York"],即将大括号改为中括号。
:h matchit-install
surround.vim插件
|
|
在文件间跳转
|
||
技巧55遍历跳转列表
|
:jumps 列出跳转列表
以下命令会改变跳转表的内容,同时改变
|
|
技巧56遍历改变列表
每当对文档做出修改之后,Vim都会记录当前光标所在的位置。遍历改变列表的方法很简单,并且这大概是跳到你要去的地方的最快的方式。
|
g,和g;
g;会跳转到上次完成编程时光标所在的行和列上,其结果与按u
gi:此命令会用`^标记恢复光标位置,并切换到插入模式。
|
|
技巧57跳转到光标下的文件
Vim会把文档中的文件名当成一个超链接。在进行了正确的配置之后,我们就可以用gf命令跳转到光标下的文件了。
|
gf命令
1、gf命令搜索文件时,会尝试使用这些扩展名,suffixesadd。
:set suffixesadd+=.rb
2、gf命令搜索文件时,Vim会检查'path'目录列表中的每个目录。
|
|
技巧58用全局位置标记在文件间快速跳转
全局位置标记是一种书签,让我们可以在文件间跳转。全局标记在我们分析完代码,并想快速跳回一个文件时特别有用。
|
m{letter}命令允许我们在当前光标位置创建一个位置标记。小写字母会创建局部于缓冲区的标记,而大写字母则创建全局标记。
一般来说,要养成在使用与quickfix列表有关的命令之前,如:grep,:vimgrep以及:make,设置全局标记的习惯。
|
|
寄存器
:h quote
|
||
技巧59用无名寄存器实现删除、复制与粘贴操作
|
使用x,dd,yyp
|
|
技巧60深入理解Vim寄存器
Vim不使用单一的剪切板进行剪切、复制和粘贴操作,而是为这些操作提供了多组寄存器。当使用删除,复制和粘贴命令时,我们可以明确指定它们中的某一个进行操作。
|
1、引用一个寄存器:通过给命令加"{register}"前缀的方式指定要用的寄存器。下划线"_"是黑洞寄存器。
2、无名寄存器(""):x、s、d{motion}、c{motion}、y{motion}命令缺省使用无名寄存器。
3、复制专用寄存器("0):y{motion}命令要复制的文本不仅会被拷贝到无名寄存器中,而且也被拷贝到复制专用寄存器中。
4、有名寄存器("a-"z):
5、黑洞寄存器("_)
6、系统剪贴板("+)与选择专用寄存器("*)
如果在外部程序中用剪切或者复制命令获取了文本,就可以用"+和
7、表达式寄存器("=):可以输入一段Vim脚本,并按
8、其他寄存器:
|
|
技巧61用寄存器中的内容替换高亮选取的文本
Vim的粘贴命令在可视模式下使用时,会体现出不同寻常的特性。
|
"p"会直接替换高亮的文本,同时覆盖无名寄存器。
利用此特性可以实现操作:交换两个词。
|
|
技巧62把寄存器的内容粘贴出来
普通模式下的粘贴命令,根据要插入文本的性质不同,执行结果也不同。确定要粘贴的文本区域是面向行的还是面向字符的,将有助于我们指定不同的策略。
|
1、面向行的复制或者删除操作(dd,yy,dap),将创建面向行的寄存器;面向字符的复制或者删除操作(x,diw,das),将创建面向字符的寄存器。
2、作者认为
|
|
技巧63与系统剪贴板进行交互
除了Vim内部的粘贴命令,有时我们也会用到系统粘贴命令。但是当Vim在终端内部运行时,使用该命令经常会产生意外的结果。为了避免这些问题,可在执行系统粘贴命令之前激活'paste'选项。
|
跳过本节,我认为用不到
|
|
宏
|
||
技巧64宏的读取和执行
宏允许我们把一段修改序列录制下来,用于之后的回放。本文将对其细节进行深入剖析。
|
1、把命令序列录制成宏:q键既是“录制”按钮,也是“停止”按钮。
查看寄存器内容
:reg a
2、通过执行宏来回放命令序列:@{register}命令执行指定寄存器的内容,也可以用@@来重复最近调用过的宏。
|
|
技巧65规范光标位置、直达目标以及中止宏
在执行宏的过程中,有时会产生意外的结果,但如果我们能遵从一些最佳的应用方式,就能取得更好的一致性。
|
黄金法则:录制一个宏时,确保每条命令都可被重复执行
1、规范光标位置,用可重复动作命令直达目标:不要一味按h,j,k,l键
2、当动作命令失败,宏将终止执行
|
|
技巧66加次数回放宏
对于重复次数不多的工作,点范式是一种高效的策略,但它不能指定执行次数。为了克服限制,我们可以录制一个廉价的、一次性的宏,然后再加次数进行回放。
|
"qq;,q"
|
|
技巧67在连续的文本行上进行修改
|
1、串行的方式执行宏
5@a
2、并行的方式执行宏
:normal @a
|
|
技巧68给宏追加命令
|
对于寄存器a,使用"qA"追加命令
|
|
技巧69在一组文件中执行宏
|
1、并行方式
//首先放弃针对第一个缓冲区所做的所有修改
:edit!
//对所有缓冲区执行该宏
:argdo normal @a
2、串行执行
在宏之后增加;next命令,这样每次宏就会跳到下一个缓冲区
3、保存所有文件的改动
:wall
:wnext
|
|
技巧70用迭代求值的方式给列表编号
如果宏在每次执行时,都能插入一个可变的数值,这将会很有用处。在本节中,我们将学习一种技术,它会在录制宏的时候使某个数字递增,这样一来,可以在连续的文本上插入数字1到5.
|
qa
定义变量,let i = 1
操作
变量自增,let i += 1
q
:'<,'>normal @a
|
|
技巧71编辑宏的内容
学习如何像编辑普通文本一样编辑宏
:h function-list
|
1、将宏粘贴到文档
:put a
2、编辑宏
3、将宏从文档复制回寄存器
"add(:d a)
|
|
按模式匹配以及按原义匹配
substitute,允许我们查找某个模式的所有匹配,并用其他内容体会匹配结果。
global,它让我们可以在匹配指定模式的所有行上执行任意的Ex命令。
|
||
技巧72调整查找模式的大小写敏感性
|
1、全局设置大小写敏感性有副作用,导致自动补全功能也忽略大小写
:set ignorecase
2、使用元字符\c和\C
|
|
技巧73按正则表达式查找时,使用\v模式开关
与Perl相比,Vim正则表达式的语法风格更接近POSIX,对于已经熟悉Perl正则表达式的程序员来说,这是一个令人失望的消息,但是,通过使用very magic模式开关,就可以让Vim采用我们更为熟悉的正则表达式语法了。
|
1、\v将会激活very magic模式,即假定除_、大小写字母以及数字0到9之外的所有字符都具有特殊含义。
2、\x字符类代替[0-9A-Fa-f]
3、字符#没有特殊含义,可按原义匹配
4、文本:
body { color: #3c3c3c; }
a { color: #0000EE; }
strong { color: #000;}
5、匹配pattern
/\v#(\x{6}|\x{3})
|
|
技巧74按原义查找文本时,使用\V原义开关
在正则表达式中使用的特殊字符,在按模式查找时用起来很顺手,但如果我们想按原义查找文本时,它们就变成了阻碍。使用very nomagic原义开关,可以消除附加在"."、"*"以及"?"等大多数字符上的特殊含义。
|
1、文本查找“a.k.a”
The N key searches backward... ...the \v pattern switch (a.k.a. very magic search)...
2、匹配pattern
/\Va.k.a
/a\.k\.a
|
|
技巧75使用圆括号捕获子匹配
当我们指定一个模式时,可以捕获其子匹配,并在其他地方引用它们。此功能合substitute命令组合起来尤为好用,但它也可用于定义某一类模式,这类模式的特点是重复包含某个单词。
|
1、专门用于匹配重复单词的正则表达式
/\v<(\w+)\_s+\1>
任何圆括号的内部匹配文本都会被自动保存到一个临时仓库。我们可以用\1引用这段被捕获的文本。\0永远会引用整个匹配。
<和>两符号将用于匹配单词的边界。
元字符\_s会匹配空白符或者换行符:"\s" matches white space, "\_s" matches white space or a line break. Similarly, "\a" matches an alphabetic character, and "\_a" matches an alphabetic character or a line break.
|
|
技巧76界定单词的边界
在我们定义模式时,如果能指定单词从哪里开始到哪里结束的话,将会非常有用。Vim的单词定界符可以帮助我们做到这一点。
|
零宽度元字符,它们本身不匹配任何字符,仅表示单词与围绕此单词的空白字符(或标点符号)之间的边界。
<和>元字符,\W\ze\w模拟元字符<,\w\ze\W模拟元字符>。
|
|
技巧77界定匹配的边界
有时我们想指定一个范围较广的模式,但只对匹配结果的一部分感兴趣。Vim中的元字符\zs和\ze可以帮助我们处理这种情况。
|
使用元字符\zs和\ze对匹配进行裁剪。\zs标志一个匹配的起始,\ze标志一个匹配的结束。
|
|
技巧78转义问题字符
\V原义开关使得按原义文本查找变得更容易,因为符号"."、"+"以及"*"号的特殊含义被屏蔽掉了。但还有一些字符,其特殊含义无法被屏蔽。本节作为高级技巧,将研究如何处理这些字符。
|
1、正向查找时要转义"/"字符
2、反向查找时要转义"?"字符
3、每次都要转义符号"\"字符
4、用编程的方式转义字符
escape({string}, {chars})
步骤:
输入/或者?调出查找提示符
依次输入原义开关\V和
输入=escape(@u, getcmdtype().'\')
|
|
查找
|
||
技巧79结识查找命令
本章将涵盖查找命令的基础知识,包括怎样指定查找方向,如何重复(反向重复)上一次查找,以及怎样使用查找历史。
|
已经知道了
|
|
技巧80高亮查找匹配
Vim可以高亮查找匹配,但该功能在缺省模式下并没有被激活。我们将学到如何激活它,以及如何在已经高亮的情况下将其禁用(与激活同样重要)。
|
:set hlsearch
:nohlsearch
|
|
技巧81在执行查找前预览第一处匹配
激活了增量查找功能以后,将使得Vim的查找命令如虎添翼。该选项可在以下几个方面来改善工作流程。
|
:set incsearch
使用incsearch之后,按 |
|
技巧82统计当前模式的匹配个数
|
:%s///gn
|
|
技巧83将光标偏移到查找匹配的结尾
我们可用查找偏移把光标定位于距离某个匹配的起始或结尾一定步长的位置。在本节中,我们将通过一个例子,研究如何将光标定位于匹配的结尾,这样一来,我们就可以用点范式完成一系列的修改操作了。
|
/lang/e
//e |
|
技巧84对完整的查找匹配进行操作
Vim查找命令允许我们高亮所有匹配并在它们之间快速跳转,但是在完整的匹配上进行操作也很有必要。接下来,让我们看看如何构造一条可以适用于所有匹配的动作命令,尽管这些匹配有可能长短不一。
|
1、查找 /\vX(ht)?ml\C
2、 将查找到的单词转为大写gU//e
3、跳转到下一个单词的头部//
4、重复动作 "."
|
|
技巧85利用查找历史,迭代完成复杂的模式
撰写正则表达式是一件很难的事,因为我们不可能一次就写对。因此接下来要做的,就是总结一套顺溜的工作流程,允许我们通过迭代的方式逐步完成模式的设计工作。本节的巧妙之处在于如何从查找历史中回溯并编辑之前的记录。
|
对整个 查找部分的总结。
|
|
技巧86查找当前高亮选区中的文本
在普通模式下,"*"命令让我们可以查找光标下的单词。通过一小段Vim脚本,我们可以重新定义可视模式下的*命令,使其可以查找当前选中的文本,而不是光标下的单词。
|
这是作者做的一个小脚本,来实现了他自己的功能。
|
|
替换
|
||
技巧87结识substitute命令
:substitute命令很复杂,除了要提供查找的模式以及替换的字符串之外,还要指定执行的范围。此外,作为可选项,我们还可以通过标志位来调整该命令的行为。
|
1、语法格式:
:[range]s[ubstitute]/{pattern}/{string}/[flags]
2、利用标志位调整substitute命令的行为:
g:全局范围内执行
c:确认或者拒绝每一处修改
n:抑制正常的替换行为,只是报告本次匹配的个数
e:屏蔽错误提示,如 “E486:找不到模式”
&:仅仅用于指示Vim重用上一次substitue命令所用过的标志位
3、替换域中的特殊字符
:h sub-replace-special
|
|
技巧88在文件范围内查找并替换每一处匹配
在缺省情况下,substitute命令仅仅作用于当前行,而且只会修改第一处匹配。因此,为了在整个文件范围内修改每一处匹配,我们必须指定范围,并使用标志位g。
|
1、g仅表示当前一整行范围
2、 文件范围内替换
:%s/going/rolling/g
|
|
技巧89手动控制每一次替换操作
|
使用确认标记"c"
|
|
技巧90重用上一次查找模式
将substitute命令的查找域留空,意味着Vim将重用上一次的查找模式。
|
查找域留空,会在命令历史留下一项不完整的记录。通过寄存器填充查找域内容即可。
➾:%s/ |
|
技巧91用寄存器的内容替换
实际上,我们不必手动输入完整的替换字符串。如果某段文本已在当前文档中出现,我们可以先把他复制到寄存器,再通过传值或者引用的方式将寄存器的内容应用到替换域。
|
1、将替换域留空,substitute命令会用空字符串替换每一处匹配,即所有匹配都被删除了。
2、传值
通过输入
3、引用,例如寄存器0中有多行文本,要求在替换域中使用这段文本。
➾:%s//\=@0/g
\=指示Vim将执行一段脚本表达式。
@0会返回复制专用寄存器中的内容。
4、引用衍生
➾:let @/='Pragmatic Vim'
➾:let @a='Practical Vim'
➾:%s//\=@a/g
以后只需要修改@/和@a的内容,就可以实现不同的替换。
|
|
技巧92重复上一次substitute命令
有时候我们可能要修正substitute的命令范围,原因多种多样,有可能是由于在第一次尝试运行substitute命令时犯了错误,也可能是我们想在另一个缓冲区运行相同的命令。我们可以利用一些快捷方式更容易地重复substitute命令。
|
1、在整个文件范围内重复面向行的替换操作
➾:s/target/replacement/g
➾ g&
2、修正substitute命令的执行范围
:&&命令重新执行替换操作。
g&是:%&&的快捷方式。
:&&
:%&&
:'<,'>&&
|
|
技巧93使用子匹配重排CSV文件的字段
在本节中,我们将会看到如何从查找模式中捕获子匹配,并在替换域中引用它们。
|
1、交换这些字段的顺序
2、替换命令
➾ /\v^([^,]*),([^,]*),([^,]*)$
➾ :%s//\3,\2,\1
3、结果
|
|
技巧94在替换过程中执行算数运算
替换域中的内容不一定是简单的字符串。我们可以执行一段Vim脚本表达式,然后用其结果充当替换字符串使用。具体到本节而言,仅凭一条substitute命令,我们就可以提升文档中每一级HTML标题标签的层级。
|
将上述黑体中的数字逐个减一。
1、写查找模式。
/\v\<\/?h\zs\d
2、写substitute命令,用Vim脚本将刚捕获的命令减一。
➾:%s//\=submatch(0)-1/g
|
|
技巧95交换两个或者更多单词
通过使用表达式寄存器以及Vim脚本中的字典数据结构(dictionary),我们可以设计一条特殊的substitute命令,用它来对两个单词进行互换。
|
➾ /\v(
➾:%s//\={"dog":"man","man":"dog"}[submatch(1)]/g
Abolish.vim插件
|
|
技巧96在多个文件中进行查找和替换
substitute通常只针对当前文件进行操作,而如果想在整个工程范围内实现相同的替换操作,该怎么办呢?尽管此类场景很常见,但是Vim确实没有提供这样的专用命令,用于工程范围内的查找和替换,通过对Vim中一些简单命令的组合,我们可以间接实现这个功能。
|
这个比较麻烦。等用到的时候再说吧。
利用argsdo功能。
|
|
global命令 | ||
技巧97结识global命令
:global命令允许我们在某个指定模式的所有匹配行上允许Ex命令。
|
1、语法
:[range] global[!] /{pattern}/ [cmd]
2、缺省情况下,global命令的作用范围是整个文件(%)。
3、{pattern}域与查找历史相关联。
4、[cmd]是可以除global命令外的任何Ex命令。如果我们不指定任何cmd,Vim缺省使用:print。
5、可以使用:!global和:vglobal反转:global命令的行为。
|
|
技巧98删除所有包含模式的文本行
将:global命令和:delete命令一起组合使用,可以快速地裁剪文本内容。对于那些匹配地文本行,我们既可以选择保留,也可以将其丢弃。
|
1、删除所有匹配行
:g/re/d
2、只保留匹配行
:v/re/d
re表示regular expression
|
|
技巧99将TODO项收集至寄存器
通过把:global和:yank这两条命令结合在一起,我们可以把所有匹配{pattern}的文本行,搜集到某个寄存器中。
|
➾:g/TODO/yank A
➾:reg a
|
|
技巧100将css文件中的所有规则的属性按字母排序
|
||
工具
通过ctags建立索引,并用其浏览源代码
|
||
技巧101结识ctags
为了能够使用Vim的标签跳转功能,首先,必须安装ctags程序,然后掌握其执行方法,最后,再深入了解由它产生的索引内容。
|
1、安装 Exuberant Ctags
➾ $ sudo apt-get install exuberant-ctags
➾ $ ctags --help
2、用ctags创建代码库的索引
➾ $ ctags *.rb
3、详解标签文件
|
|
技巧102配置Vim使用ctags
如果我们想着Vim中使用基于ctags的跳转命令,首先要确保标签命令是最新的,其次要让Vim知道到哪里去找标签文件。
|
1、告诉Vim标签文件在哪
'tags'选项指定了Vim应该到哪里去找标签文件。
2、生成标签文件
➾ :!ctags -R
--exclude=.git
-- languages =.git
3、每次保存文件时,自动执行ctags
Vim的自动命令(autocommand)功能允许我们在某个事件发生时调用一条命令,这些事件包括缓冲区的创建、打开或者保存等。
➾ :autocmd BufWritePost * call system("ctags -R")
实际使用中
1、生成ctags
$ ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --exclude=unsupport include/ src/ test/crb_sync/
2、设置ctags路径
:set tags+=~/commonLib_consistent_hash/commonLib/tags
3、之后按照carl的vim配置,就可以直接自动补全了
|
|
技巧103使用Vim的标签跳转命令,浏览关键字的定义
Vim与ctags的集成,使得代码中的关键字变成了某种形式的超链接。这使得我们可以快速地跳转到关键字地定义处。接下来我们将会看到如何使用普通模式下地 |
1、跳转到关键字的定义处
按下
2、当关键字存在多处匹配时,可指定跳转的位置
g
:tselect、 :tnext、 :tprev、:tfirst、:tlast
3、使用Ex命令
:tag /{pattern}
|
|
编译代码,并通过Quickfix列表浏览错误信息
|
||
技巧104不离开Vim也能编译代码
我们可以在Vim中调用外部编译器,从而省去了离开编辑器的麻烦。而如果编译器有任何错误输出的话,Vim还为我们提供了快速跳转到出错位置的办法。
|
1、切换到makefile所在目录,执行
:make
2、执行完成之后,Vim会跳转到quickfix列表的第一项记录。
3、:cnext命令可以跳转到quickfix列表的下一处出错处。
|
|
技巧105浏览Quickfix列表
quickfix列表会保存一组针对单个或者多个文件内容位置信息。每一项记录可以是在执行:make 时由编译器产生的出错信息,也可以是在执行:grep时找到的查找匹配。不论列表是如何生成的,我们都能够浏览这些记录。在本节中,我们将仔细研究浏览quickfix列表的几种方式。
:h quickfix
|
||
技巧106回溯以前的quickfix列表
当我们更新quickfix列表的时候,Vim并不会回溯之前的内容,而是将使用过的quickfix列表结果保存起来,方便我们回溯。
|
:colder命令回溯quickfix列表之前的某个版本。
:cnewer是回到比较新的列表。
|
|
通过grep,vimgrep以及其他工具对整个工程进行查找
|
||
技巧108不必离开Vim也能调用grep
Vim的:grep命令给外部的grep命令程序提供了一层封装。凭借此命令,我们可以在不离开Vim的情况下通过grep实现在多个文件中查找某个模式,然后就可以用quickfix列表浏览这些查找结果了。
|
1、在Vim内部调用grep
➾:grep -i Waldo *
|
|
技巧109定制grep程序
Vim的:grep命令是外部grep程序的包装器。通过配置'greprg'和'grepformat'这两个选项,我们可以对Vim查找的行为进行定制。首先我们将检查两个选项的缺省配置,然后将会看到如何修改这些配置,从而将查找任务外包给其他程序。
|
1、Unix系统中的缺省设置
|
|
技巧110使用Vim内部的Grep
:vimgrep命令允许我们使用Vim自带的正则表达式引擎,实现跨文件的查找功能。
|
1、语法
:vim[grep][!] /{pattern}/[g][j] {file} ...
|
|
自动补全
|
||
技巧111结识Vim的关键字自动补全
当关键字自动补全被激活后,Vim会试图猜测我们正在输入的单词,从而为我们省去了手动输入完整单词的麻烦。
|
当此功能被调用时,Vim首先会根据当前编辑会话内所有缓冲区的内容建立一份补全列表。
1、触发自动补全:
|
|
技巧112与自动补全的弹出式菜单进行交互
为了能够从自动补全命令中获得最大收益,我们需要掌握其弹出式菜单的操作方法。简而言之,要么通过精简选项让我们可以做出快速选择,要么在没有理想单词的情况下,允许我们关闭列表。
:h popupmenu-completion
|
常用:
|
|
技巧113掌握关键字的来龙去脉
普通关键字自动补全会把来自多个来源的内容编入其补全列表。我们可以对生成补全列表的来源加以限定。
|
1、缓冲区列表
:ls! 查看缓冲区列表
2、包含文件
:set include? 查看文件
3、标签文件
ctags扫描产生的列表
4、合而为一
:set complete+=k 定制
|
|
技巧114使用字典中的单词进行补全
Vim字典自动补全,会根据某个单词列表,创建自己的补全建议列表。通过对Vim进行配置,我们可以让字典自动补全功能与内置的拼写检查功能使用同一份单词列表。
|
||
:set hls
|
设置高亮
|
:set nrformats
|
这会让Vim把所有数字都当成十进制,不管它们是不是以10开头。再使用 |
➾:set shiftwidth=4 softtabstop=4 expandtab
|
让命令"<"和">"正常工作。
|
cnoremap %% getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'
|
在Vim命令行提示符之后输入%%,它就会自动展开为活动缓冲区所在目录的路径。就像你输入%:h |
wildmode
|
调整该配置可以自定义补全行为
|
:h ex-cmd-index
|
完整的Ex命令列表
|
:h cmd-win
|
|
:h window
|
窗口的帮助信息
|