VIM快捷键:
ctags 文件名 做索引
光标移动:
四个方向
k
h 0 l
j
ctrl+f, ctrl+b 向下翻页,向上翻页
ctrl+d, ctrl+u 向下半翻页,向上半翻页
$ 移动行尾
0 移动行首
w 移动下一个词
b 移动到上一个词
gg 跳到文档的开始处
G 跳到文档的末尾
% 跳到匹配的括号处("{ }""[]""()")
ctrl+i,tab 跳到下一个jump point
ctrl+o 跳到上一个jump point
23gg, 23G, :23 跳到第23行
ctrl+i, tab 跳到下一个跳点(Jump Point)
ctrl+o 跳到上一个跳点
查找替换:
# 从光标向后查找整个关键词
* 从光标向前查找整个关键词
g# 从光标向后查找关键词
g* 从光标向前查找关键词
fx,tx,Fx,Tx 在当前行查找字符
查找替换例子:
: s/SEARCH/REPLACE
: s/If/Since 将下一个"If"换成"Since"
: %s/If/Since 将全部"If"换成"Since"
: 1,3 s/If/Since/g 只对1,3行有效,如无前缀,只对当前行有效
表达式:
. 代替一个字符
* 表示一个或多个字符的重复
/d.*an 可以匹配 dan, divan, debian
单词边界:
指定单词边界: \< 和 \>
如: /\<d[a-z]*an\> 匹配以d开始,中间包含任意个小写字母,以an结束的单词
/\$[0-9]*\.[0-9][0-9] 匹配查找 $XX...X.XX这要的数字,有且只有两位小数的
常用的编辑命令:
a, i 在光标后插入, 在光标前插入
dd 删除一行
cc,S 删除一行后进入insert模式
dw 删除一个单词
cw 删除一个单词后进入insert模式
x,dl 删除一个字符
s,cl 删除一个字符后进入insert模式
p 粘贴
xp 交换两个字符
ddp 交换两行
y 复制
yy 复制一行
u 撤消
ctrl+r 重做
. 重复上一次修改
ctrl+r 重做
. 重复上一次修改
划分窗格:
:split/vsplit 分隔一个窗口
:new/vnew 创建一个新的窗口
:sf {filename} 在新窗口中打开filename
:close 关闭当前窗口
:only 关闭除当前窗口外所有窗口
:ctrl-w h 到左面的窗口
:ctrl-w j 到下面的窗口
:ctrl-w k 到上面的窗口
:ctrl-w l 到右面的窗口
:ctrl-w t 到顶部的窗口
:ctrl-w b 到底部的窗口
重复操作(宏操作):
q[a-z] 开始记录操作,记录到寄存器[a-z]中
q 停止记录操作
@[a-z] 执行寄存器中的操作
@@ 执行最近寄存器中记录的操作
例子: 一个缓冲区有两行:
sys/types.h
stdio.h
-->要改为:
#include <sys/types.h>
#include <stdio.h>
操作如下:
qa #开始记录
^ #移动行首
i #进入insert模式
#include < #输入内容
$ #移动行尾
i #进入insert模式
> #输入内容
q #停止记录
移动另一行:
@a即可执行相同的操作
Visual Mode操作:
ctrl+v 进入基于块的可视模式
v 进入基于字符的可视模式
V 进入基于行的可视模式
c 删除选定的块
I{string}<ESC> 选定块后按大写的I,输入字符串,再按ESC,
可以在块内每一行插入相同的内容
跳到声明处:
[[ 向前跳到顶格的第一个"{"
[] 向前跳到顶格的第一个"}"
][ 向后跳到顶格的第一个"{"
]] 向后跳到顶格的第一个"}"
[{ 跳到本代码块(由{}界定)的开头
[} 跳到本代码块的结尾
Shell:
:ctrl+z/suspend 在shell下是挂起vim; gui下是最小化窗口
:!{command} 执行shell命令
:shell 开一个新的shell
保存vim状态(挂起?):
:mksession session.vim 保存当前vim状态
:source session.vim 回复vim状态
vim -S session.vim 启动vim时恢复session
高效率移动
在插入模式之外
基本上来说,你应该尽可能少的呆在插入模式里面,因为在插入模式里面VIM
就像一个“哑巴”编辑器一样。很多新手都会一直呆在插入模式里面,因为这样易于
使用。但VIM的强大之处在于他的命令行模式!你会发现,在你越来越了解VIM之后,
你就会花越来越少的时间使用插入模式了。
使用 h,j,k,l
使用VIM高效率编辑的第一步,就是放弃使用箭头键。使用VIM,
你就不用频繁的在箭头键和字母键之间移来移去了,这会节省你很多时间。
当你在命令模式时,你可以用h,j,k,l来分别实现左,下,上,右箭头的功能。
一开始可能需要适应一下,但一旦习惯这种方式,你就会发现这样操作的高效之处了。
在你编辑你的电子邮件或者其他有段落的文本时,你可能会发现使用方向键和你预期的
效果不一样,有时候可能会一次跳过了很多行。这是因为你的段落在VIM看
来是一个大的长长的行。这时你可以在按h,j,k或者l 之前键入一个g,
这样VIM就会按屏幕上面的行如你所愿的移动了。
在当前行里面有效的移动光标
很多编辑器只提供了简单的命令来控制光标的移动(比如左,上,右,下,到行首/尾等)。
VIM则提供了很多强大的命令来满足你控制光标的欲望。
当光标从一点移动到另外一点,在这两点之间的文本(包括这两个点)称作被“跨过”,
这里的命令也被称作是motion。(简单说明一下,后面会用到这个重要的概念)
这里是常用到的一些命令(motion):
fx:移动光标到当前行的下一个x处。很明显,x可以是任意一个字母,
而且你可以使用;来重复你的上一个f命令。
tx:和上面的命令类似,但是是移动到x的左边一个位置。(这真的很有用)
Fx:和fx类似,不过是往回找。
w:光标往前移动一个词。
b: 光标往后移动一个词。
0: 移动光标到当前行首。
^:移动光标到当前行的第一个字母位置。
$: 移动光标到行尾。
):移动光标到下一个句子。
( : 移动光标到上一个句子。
在整个文件里面有效移动光标
VIM有很多命令,可以用来到达文件里面你想到达的地方。
下面是一些在文件里面移动的命令:
<C-F>:向下移动一屏。
<C-B>:向上移动一屏。
G:到文件尾
numG:移动光标到指定的行(num)。(比如10G就是到第10行)
gg:到文件首
H:移动光标到屏幕上面
M:移动光标到屏幕中间
L:移动光标到屏幕下面
*:读取光标处的字符串,并且移动光标到它再次出现的地方。
#:和上面的类似,但是是往反方向寻找。
/text:从当前光标处开始搜索字符串text,并且到达text出现的地方。
必须使用回车来开始这个搜索命令。如果想重复上次的搜索的话,按n。
?text:和上面类似,但是是反方向。
ma:在当前光标的位置标记一个书签,名字为a。书签名只能是小写字母。
你看不见书签的存在,但它确实已经在那里了。
`a:到书签a处。注意这个不是单引号,它一般位于大部分键盘的1的左边。
`.:到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。
高效的输入
使用关键词自动完成
VIM
有一个非常漂亮的关键词自动完成系统。这表示,你可以输入一个长词的一部分,
然后按一下某个键,然后VIM就替你完成了这个长词的输入了。举个例子:你有
一个变量名为 iAmALongAndAwkwardVarName 在你写的代码的某个地方。
也许你不想每回都自己一个一个字母的去输入它。
使用关键词自动完成功能,你只需要输入开始几个字母(比如iAmAL),
然后按<C-N>(按住Ctrl,再按N)或者<C-P>。如果VIM没有给出你想要的词,
基本按,直到你满意为止,VIM会一直循环它找到的匹配的字符串。
聪明的进入插入模式
很多新手进入插入模式都只是用i。这样当然可以进入插入模式,但通常不是那么合适,
因为VIM提供了很多进入插入模式的命令。下面是最常用的一些:
i:在当前字符的左边插入
I:在当前行首插入
a:在当前字符的右边插入
A:在当前行尾插入
o:在当前行下面插入一个新行
O:在当前行上面插入一个新行
c{motion}:删除motion命令跨过的字符,并且进入插入模式。
比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,
这会删除从光标位置到下一个叹号(但不包括),然后进入插入模式。
被删除的字符被存在了剪贴板里面,并且可以再粘贴出来。
d{motion}:和上面差不多,但是不进入插入模式。
有效的移动大段的文本
使用可视选择(visual selections)和合适的选择模式
不想最初的VI,VIM允许你高亮(选择)一些文本,并且进行操作。
这里有三种可视选择模式:
v:按字符选择。经常使用的模式,所以亲自尝试一下它。
V:按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。
<C-V>:按块选择。非常强大,只在很少的编辑器中才有这样的功能。
你可以选择一个矩形块,并且在这个矩形里面的文本会被高亮。
在选择模式的时候使用上面所述的方向键和命令(motion)。
比如,vwww,会高亮光标前面的三个词。Vjj将会高亮当前行以及下面两行。
在可视选择模式下剪切和拷贝
一旦你高亮了选区,你或许想进行一些操作:
d:剪贴选择的内容到剪贴板。
y:拷贝选择的内容到剪贴板。
c:剪贴选择的内容到剪贴板并且进入插入模式。
在非可视选择模式下剪切和拷贝
如果你很清楚的知道你想拷贝或者剪切什么,那你根本就不需要进入可视选择模式。
这样也会节省时间:
d{motion}:剪切motion命令跨过的字符到剪贴板。
比如,dw会剪切一个词而dfS会将从当前光标到下一个S之间的字符剪切至剪贴板。
y{motion}:和上面类似,不过是拷贝。
c{motion}:和d{motion}类似,不过最后进入插入模式。
dd:剪切当前行。
yy:拷贝当前行。
cc:剪切当前行并且进入插入模式。
D:剪切从光标位置到行尾到剪贴板。
Y:拷贝当前行。
C:和D类似,最后进入插入模式。
x:剪切当前字符到剪贴板。
s:和x类似,不过最后进入插入模式。
粘贴
粘贴很简单,按p。
使用多重剪贴板
很多编辑器都只提供了一个剪贴板。VIM有很多。
剪贴板在VIM里面被称为寄存器(Registers)。
你可以列出当前定义的所有寄存器名和它们的内容,命令为":reg"。
最好使用小写字母来作为寄存器的名称,因为大写的有些被VIM占用了。
使用寄存器的命令为双引号“。
比如:我们要拷贝当前行到寄存器k。你应该按 "kyy。
(你也可以使用 V"ky。为什么这样也可以呢?)现在当前行应该已经存在了
寄存器k里面直到你又拷贝了一些东西进入寄存器k。现在你可以使用命令 "kp 来
粘贴寄存器k里面的内容到你想要的位置。
避免重复
令人惊奇的 . 命令
在VI里面,输入 . (小数点符号),将会重复你给入的上一个命令。
比如,你上个命令为 'dw'(删除一个词),VI将会接着再删除一个词。
使用数字
使用数字也是VIM强大的而且很节省时间的重要特性之一。
在很多VIM的命令之前都可以使用一个数字,这个数字将会告诉VIM这个命令需要执行几次。
比如:
3j 将会把光标向下移动三行。
10dd 将会删除十行。
y3" 将会拷贝从当前光标到第三个出现的引号之间的内容到剪贴板。
数字是扩展motion命令作用域非常有效的方法。
记录宏
有时候,你会发现你自己在文章的每段或者每行都重复相同的一系列动作。
VIM允许你记录一个宏来完成你的特殊需要。
qregister:记录宏到寄存器register,这里register是任意的你的寄存器的名字。
比如qa,将会记录并且把宏存在寄存器a里面。
q:结束宏的记录。
@register:使用存在寄存器register的宏。比如@a,将会使用存在寄存器a里面的宏。
必须要记住的是,宏只记录了你的系列按键并且重复执行它们。
它们不是魔法。因为在VIM里面完成目的的方法有很多,
所以有时候你要小心选择命令来记录你的宏。因为它们会在所有你要执行它的地方执行。
用VIM写代码
VIM是一个绝好的编辑器来写代码,因为它有一些特性是专门为程序员而设。
这里是一些常用的:
]p:和p的功能差不多,但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。试一下!
%:匹配花括号,方括号,括号等。在一个括号的上面,然后按%,
鼠标就会出现在匹配的另外一半括号处。
>>:缩进所有选择的代码
<<:和上面类似,但是反缩进
gd:到达光标所在处函数或者变量的定义处。
K:在Man里面查找光标当前所在处的词。
以下的例子中 xxx 表示在命令模式下输入 xxx 并回车
以下的例子中 :xxx 表示在扩展模式下输入 xxx 并回车
小括号中的命令表示相关命令.
在编辑模式或可视模式下输入的命令会另外注明.
1. 查找
/xxx(?xxx) 表示在整篇文件中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
向上查找.其中xxx能是正规表达式,关于正规式就不多说了.
一般来说是区分大小写的, 要想不区分大小写, 那得先输入
:set ignorecase
查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
*(#) 当光标停留在某个单词上时, 输入这条命令表示查找和该单词匹配的
下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方
向查找.
g*(g#) 此命令和上条命令相似, 只不过他不完全匹配光标所在处的单词, 而
是匹配包含该单词的所有字符串.
gd 本命令查找和光标所在单词相匹配的单词, 并将光标停留在文件的非
注释段中第一次出现这个单词的地方.
% 本命令查找和光标所在处相匹配的反括号, 包括 () [] { }
f(F)x 本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符.
找到后:
输入 ; 表示继续往下找
输入 , 表示反方向查找
2. 快速移动光标
在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以能非常方便的进行光标定
位和编辑. 因此能更快一点移动光标是非常有用的.
w(e) 移动光标到下一个单词.
b 移动光标到上一个单词.
0 移动光标到本行最开头.
^ 移动光标到本行最开头的字符处.
$ 移动光标到本行结尾处.
H 移动光标到屏幕的首行.
M 移动光标到屏幕的中间一行.
L 移动光标到屏幕的尾行.
gg 移动光标到文件首行.
G 移动光标到文件尾行.
c-f (即 ctrl 键和 f 键一同按下) 本命令即 page down.
c-b (即 ctrl 键和 b 键一同按下, 后同) 本命令即 page up.
’’ 此命令相当有用, 他移动光标到上一个标记处, 比如用 gd, * 等查
找到某个单词后, 再输入此命令则回到上次停留的位置.
’. 此命令相当好使, 他移动光标到上一次的修改行.
`. 此命令相当强大, 他移动光标到上一次的修改点.
3. 拷贝, 删除和粘贴
在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝和删除是和光标移动命令
结合的, 看几个例子就能够明白了.
yw 表示拷贝从当前光标到光标所在单词结尾的内容.
dw 表示删除从当前光标到光标所在单词结尾的内容.
y0 表示拷贝从当前光标到光标所在行首的内容.
d0 表示删除从当前光标到光标所在行首的内容.
y$ 表示拷贝从当前光标到光标所在行尾的内容.
d$ 表示删除从当前光标到光标所在行尾的内容.
yfa 表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
dfa 表示删除从当前光标到光标后面的第一个a字符之间的内容.
特别地:
yy 表示拷贝光标所在行.
dd 表示删除光标所在行.
D 表示删除从当前光标到光标所在行尾的内容.
关于拷贝, 删除和粘贴的复杂用法和寄存器有关, 能自行查询.
4. 数字和命令
在 vi 中数字和命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位. 如:
5fx 表示查找光标后第 5 个 x 字符.
5w(e) 移动光标到下五个单词.
5yy 表示拷贝光标以下 5 行.
5dd 表示删除光标以下 5 行.
y2fa 表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
:12,24y 表示拷贝第12行到第24行之间的内容.
:12,y 表示拷贝第12行到光标所在行之间的内容.
:,24y 表示拷贝光标所在行到第24行之间的内容. 删除类似.
5. 快速输入字符
在 vi 中, 不需求你输入每一个字符, 能有非常多种方法快速输入一些字符.
使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
TAB 系统就会自动将剩下的字符补齐, 如果有多个匹配则会打印出来. 这就是著名的命令
补齐(其实windows中也有文件名补齐功能). vi 中有许多的字符串补齐命令, 非常方便.
c-p(c-n) 在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
索开头和其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令
会在所有在这个 vim 程式中打开的文件中进行匹配.
c-x-l 在编辑模式中, 此命令快速补齐整行内容, 不过仅在本窗口中出现的
文件中进行匹配.
c-x-f 在编辑模式中, 这个命令表示补齐文件名. 如输入:
/usr/local/tom 后再输入此命令则他会自动匹配出:
/usr/local/tomcat/
abbr 即缩写. 这是个宏操作, 能在编辑模式中用一个缩写代替另一个
字符串. 比如编写java文件的常常输入 System.out.println, 这非常
是麻烦, 所以应该用缩写来减少敲字. 能这么做:
:abbr sprt System.out.println
以后在输入sprt后再输入其他非字母符号, 他就会自动扩展为System.
out.println
6. 替换
替换是 vi 的强项, 因为能用正规表达式来匹配字符串.以下提供几个例子.
:s/aa/bb/g 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
:s/\/bb/g 将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
:%s/aa/bb/g 将文件中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/^/#/ 将从12行到23行的行首加入 # 字符
:%s= *$== 将所有行尾多余的空格删除
:g/^\s*$/d 将所有不包含字符(空格也不包含)的空行删除.
7. 多文件编辑
在一个 vim 程式中打开非常多文件进行编辑是挺方便的.
:sp(:vsp) 文件名 vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.
从 vim6.0 开始, 文件名能是个目录的名称, 这样, vim 会
把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 能看
到帮助信息.
:e 文件名 vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会需求保存.
c-w-w vim 分割了好几个窗口怎么办? 输入此命令能将光标循环定位
到各个窗口之中.
:ls 此命令查看本 vim 程式已打开了多少个文件, 在屏幕的最下方
会显示出如下数据:
1 %a "usevim.html" 行 162
2 # "xxxxxx.html" 行 0
其中:
1 表示打开的文件序号, 这个序号非常有用处.
%a 表示文件代号, % 表示当前编辑的文件,
# 表示上次编辑的文件
"usevim.html" 表示文件名.
行 162 表示光标位置.
:b 序号(代号) 此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
就是用 :ls 命令看到的.
:set diff 此命令用于比较两个文件, 能用
:vsp filename
命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
到效果了.
8. 宏替换
vi 不仅能用 abbr 来替换文字, 也能进行命令的宏定义. 有些命令输起来非常费劲,
因此我把他们定义到 - 上, 这样就非常方便了.这些设置能预先写到 ~/.vimrc
(windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.
:nmap :nohls 取消被搜索字串的高亮
:nmap w 命令模式下转移光标到不同窗口
:imap 输入模式下运行
:nmap :%s= *$== 删除所有行尾多余的空格.
:imap 同上
:java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
会说到怎么实现这一点)
:nmap :comp javac:mak -d . %
此命令用 javac 编译 java 文件, 他会自动将光标定位到出错点. 不过这需要定
义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
setlocal makeprg=javac
setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
:nmap :comp ant:mak
此命令用 ant 编译 java 文件, 他会自动将光标定位到出错点. 一般来说, 安装
vim 后已有了compiler/ant.vim文件, 因此这个命令能直接使用. 不过需要
在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.
:nmap :cl 此命令用于查看所有的编译错误.
:imap
:nmap :cc 此命令用于查看当前的编译错误.
:imap
:nmap :cn 此命令用于跳到下一个出错位置.
:imap
:nmap :cp 此命令用于跳到上一个出错位置.
:imap
:nmap :JavaBrowser
此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
本文件中出现的类, 类的成员变量及成员方法, 就似乎 JCreator 表现的那样.
在这个窗口中输入 ? 会看到帮助. 嘿嘿, 非常好用, 不过需要 ctags 支持.
:imap
9. TAB
TAB 就是制表符, 独立拿出来做一节是因为这个东西确实非常有用.
> 输入此命令则光标所在行向右移动一个 tab.
5>> 输入此命令则光标后 5 行向右移动一个 tab.
:12,24> 此命令将12行到14行的数据都向右移动一个 tab.
:12,24>> 此命令将12行到14行的数据都向右移动两个 tab.
那么怎么定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.
有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 没关系, vim 能
帮助你.以下的设置一般也都先写入设置文件中, 免得老敲.
:set shiftwidth=4 设置自动缩进 4 个空格, 当然要设自动缩进先.
:set sts=4 即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
:set tabstop=4 实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
:set expandtab 在输入 tab 后, vim 用恰当的空格来填充这个 tab.
10. autocmd
这个命令十分的强大, 能用这个命令实现对不同的文件格式应用不同的设置; 能
在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的设置文件
里面. 由于他非常强大, 所以我不能给出非常具体的说明, 只能举几个例子, 周详的请看帮助.
:autocmd! 删除所有之前的自动命令.
autocmd FileType java source ~/.vim/files/java.vim
autocmd FileType java source ~/.vim/files/jcommenter.vim
以上两条命令让我在打开 java 文件时才应用后面提到的两个设置文件.
autocmd BufNewFile *.java 0r ~/.vim/files/skeletons/java.skel
以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.
autocmd BufNewFile *.java normal gnp
以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特别化
处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.
11. 常用脚本
在 vim.sf.net 你能发现非常多脚本(script), 这些脚本常常有让你意想不到的作用.
我常用的有:
jcommenter.vim 自动加入 javadoc 风格的注释.
JBrowser.vim 类资源浏览. C, C++ 等能用 Tlist
更有许多有用的, 比如 checkstyle.vim 能检验你的编程风格, jad.vim 能直接
反编译 .class 文件等等.
12. 常用设置
在~/.vimrc 设置文件中你常常需要一些个性化设置. 比如上面写的一些宏定义, 一些
autocmd 定义等等. 比如:
set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
这样在vim中打开文件时, 按 tab 键补齐文件名时他会忽略上述文件.
set nu 显示行号
set ai 设置自动缩进
map Y y$ 让 Y 和 D 相同, 要不然 Y 的本意和 yy 相同.
13. 其他
更有许多有意思的命令, 记录在这里免得忘记.
. 重复上次编辑命令.
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4) 在行首插入行号
:runtime! syntax/2html.vim 转换 txt 成 html, 会按照你的
一个例子;
a (an) - ad. one; any; each
able - v. having the power to do something
about - ad. almost ("about half"); of or having a relation to ("We talk about the weather.")
above - ad. at a higher place
abuse - n. bad treatment causing harm or injury
accept - v. to agree to receive
accident - n. something that happens by chance or mistake; an unplanned event
accuse - v. to say a person is responsible for an act or crime; to make a statement against someone
across - ad. from side to side; to the other side
act - v. to do something
activist - n. one who seeks change through action
actor - n. someone acting in a play or show
add - v. to put (something) with another to make it larger; to say more
administration - n. the executive part of a government, usually headed by a president or prime minister
admit - v. to accept ("admitted to the United Nations"
但我就想要这样的代码:a (an)
able
about
above
abuse
accept
accident
该怎么做着,麻烦大家了
谢谢
1.交换两个字符位置
xp
2.上下两行调换
ddp
3.把文件内容反转
:g/^/m0/ (未通过)4.上下两行合并
J
5.删除所有行
dG
6.从当前位置删除到行尾
d$
7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
8.
:ab string strings
例如 “:ab usa United States of America” ,
当你在文见里插入 usa 时
United States of America 就蹦出来了
9.
:map keys new_seq
定义你当前 键盘命令
10.
:set [all]
vi or ex 的编辑状态
如 显示每行 :set nu
11.
在命令状态下,nyy表
贴在光标处的
示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘
下面。
12.
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S13.
:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串14.光标控制
k:上移 nk 上移n行
j:下移 nj 下移n行将光标移到第n行,按下 mk
将光标移到第m行,按下 “ay’k
即将第n到m的行存到a寄存器,以此类推,b,c……..寄存器等这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用
想粘贴到某处,直接将
等
光标移到某地,按下 “ap 即可,以此类推,b,c……..寄存器
在当前屏幕中
H 跳到第一行
M 跳到中间一行
L 跳到最后一行15.
表8-2 删除命令
删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现“ t
该字样所出现的
e x t”中所指定字样的位置,一直向前直到下一个位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符“c”的
括
位置,一直向前直到下一个该字符所出现的位置(包该字符)之间的内容
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容.重复上一次修改!
表8-4 替换命令
替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符vi替换使用规则:
:g/s1/s/s2/s3/g
第一个g表示对每一个
s2都用s3替换
包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的
s表示替换,s2是要被替换的字符串
替换字符串
,他可以和s1相同(如果相同的话用//代替),s3是16.
fx
往右移动到 x 字符上
Fx
往左移动到 x 字符上
tx
往右移动到 x 字符前
Tx
往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次
,
逗号,配合 f 和 t 使用,反方向重复一次17. vi 环境选项 Solaris ksh
noautoindent
nomodelines
noshowmode
autoprint
nonumber
noslowopen
noautowrite
nonovice
tabstop=8
nobeautify nooptimi
ze taglength=0
directory=/var/tmp paragrap
s
hs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tagnoedcompatible
prompt
tagstack
noerrorbells
noreadonly
term=vt100
noexrc redraw
noterse
flash
remap
timeout
hardtabs=8
report=5
ttytype=vt100
noignorecase scroll=1
1 warn
nolisp
sections=NHSHH HUuhsh+c
window=23
nolist shell=/b
in/ksh wrapscan
magic
shiftwidth=8
wrapmargin=0
mesg
noshowmatch
nowriteanyFor C-Shell:
setenv EXINIT “set nu”
For Bourne or Korn Shell:
EXINIT=”set nu”; export EXINIT
For Korn Shell Only (alternate m
ethod):
typeset -x EXINIT=”set nu”
在 .profile 里设置 vi 的环境选项 , 以上均测试过18.标记文本
mchar 用字母char标记当前光标的位置
`char 移至char所标记处
’char 移至char标记所在行的开头处
” 移至当前行上一次所在位置(在光标移动之后)――一个双引号
” 移至当
引号
前行上第一次所在位置的行的开头处(在光标移动之后)――两个单
19.
同时vi多个文件时,CTRL-SHIFT-6回
切换。
到上一个文件,在本次vi的文件和上次vi的文件之间但是我发现一个BUG:在用CTRL-SHIF
时,
T-6切换到上一个文件后,用:args查看多文件vi状态屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)也可以使用:
:e#
进行切换20.
sco 下VI 要在文本前同样的字符加用
%s/^/要加的内容/g 要在文本后同样的字符加
%s/$/要加的内容/g21.
如何去掉文本中的 ^M
unix语句实现。
硬回车?不必用binary传回去再ascii传回来的方式,用shell或者
cat filename |tr -d ’15′ >newfile
不同的unix系统还存在一些其他不同的命令,如:doscp
sed 也可以实现这个功能.dos2unix filename filename2
反之
unix2dos filename filename2在vi 中用:$s/^M//g
^是crtl-V crtl-M22.如何在“unix命令行”下将一个文件的某字符串用另一个串换掉
sed ‘s/string1/string2/gp’ file1 > file2
23.将/etc/hosts下所有的地址都ping 2次
1 #/usr/bin/sh
2 #grad /etc/hos
ts and ping each address
3 cat /etc/hosts|grep -v ‘^#
‘ | while read LINE
4 do
5 ADDR=`awk ‘{print $1}’`
6 for MACHINE in $ADDR
7 do
8 ping $MACHINE -n 2
9 done
10 done
Ctrl+f 屏幕向前翻一页(常用) Ctrl+b 屏幕向后翻一页(常用) Ctrl+d 屏幕向前翻半页 Ctrl+u 屏幕向前翻半页 + 光标移动到非空格符的下一列 - 光标移动到非空格符的上一列 n<space> 按下数字后再按空格键,光标会向右移动这一行的n个字符。例如20<space>,则光标会向右移动20个字符 0(HOME) (是数字0)动到这一行的第一个字符处(常用) $(END) 移动到这一行的最后一个字符处(常用) H 光标移动到这个屏幕最上方的那一行 M 光标移动到这个屏幕中央的那一行 L 光标移动到这个屏幕最下方的那一行 G 光标移动到文件的最后一行 nG 移动到这个文件的第n行。例如20G,则会移动到这个文件的第20行(可配合:set nu) n<Enter> 光标向下移动n行(常用) 命令模式 查找与替换 /word 在光标之后查找一个名为word的字符串(常用) ?word 在光标之前查找一个名为word的字符串 :n1,n2s/word1/word2/g在第n1与n2行之间查找word1这个字符串,并将该字符串替换为word2(常用) :1,$s/ word1/word2/g 在第一行与最后一行之间查找word1这个字符串,并将该字符串替换为word2(常用) :1,$s/ word1/word2/gc 在第一行与最后一行之间查找word1这个字符串,并将该字符串替换为word2,且在替换前显示提示符让用户确认(conform)(常用) 一般模式 删除、复制与粘贴 x,X X为向后删除一个字符,X为向前删除一个字符(常用) Nx 向后删除n个字符 Dd 删除光标所在的那一整行(常用) Ndd 删除光标所在列的向下n列,例如,20dd则事删除20列(常用) d1G 删除光标所在行到第一行的所有数据 dG 删除光标所在列到最后一行的所有数据 Yy 复制光标所在行(常用) Nyy 复制光标所在列的向下n列,例如,20yy则是复制20列(常用) y1G 复制光标所在列到第一列的所有数据 yG 复制光标所在列到最后一列的所有数据 p,P p为复制的数据粘贴在光标下一列,P则为粘贴在光标上一列(常用) J 将光标所在列与下一列的数据结合成一列 U 恢复前一个动作(undo) 编辑模式 i,I 插入:在当前光标所在处插入输入的文字,已存在 a,A 添加:由当前光标所在处的下一个字符开始输入,已存在的字符会向后退(常用) o,O 插入新的一行:从光标所在行的下一行行首开始输入字符(常用) r,R 替换:r会替换光标所指的那一个字符;R会一直替换光标所指的文字,直到按下Esc为止(常用) Esc 退出编辑模式,回到一般模式(常用) 命令行模式 :w 将编辑的数据写入硬盘文件中(常用) :w! 若文件属性为只读,强制写入该文件 :q 退出vi(常用),快捷方式为SHIFT+ZZ :q! 若曾修改过文件,又不想保存,使用!为强制退出不保存文件,快捷方式为SHIFT+ZQ :wq 保存后退出,若为:wq!,则为强制保存后退出(常用) :w[filename] 将编辑数据保存为另一个文件(类似另存新文档) :r[filename] 在编辑的数据中,读入另一个文件的数据。即将filename这个文件内容加到光标所在行的后面 :set nu 显示行号,设定之后,会在每一行的前面显示该行的行号 :set nonu 与ser nu相反,为取消行号 :set nohlsearch 可取消高亮,可编辑/etc/vimrc来编辑取消所有高亮 n1,n2 w[filename] 将n1到n2的内容保存为filename这个文件 VIM格式化代码:
格式化全文指令 gg=G
自动缩进当前行指令 ==
格式化当前光标接下来的8行 8=
格式化选定的行 v 选中需要格式化的代码段 =
备注:
gg —— 到达文件最开始
= —— 要求缩进
G —— 直到文件尾
注释代码:(这个原理上就是使用VIM的正则替换)
以C++和Python为例。
注释连续行:
指令格式 :起始行,终止行s/要替换的字符/替换为字符/g
如,
C++源文件中注释掉10~20行,指令为:
:10,20s/^/\/\/g
Python源文件中注释掉10~20行,指令为:
:10,20s/^/#/g
取消连续行注释:
指令格式同上。只是要替换字符与替换为字符要互换:
如,
取消C++源文件中的10~20行的注释,指令为:
:10,20s/^\/\///g
取消Python源文件中的10~20行的注释,指令为:
:10,20s/^#//g