vi命令第五弹

组合命令

“dw” 命令删除一个单词。你可能认出来了, “w” 是词移动命令。实际上, “d” 命
令后面可以跟任何 “动作” (motion)命令,它会删除从当前位置到光标移动到的目标
位置的的全部内容。
例如 “4w” 命令能够向后移动四个单词。所以 “d4w” 命令删除4 个单词。
如果你用 “e” 命令作为动作,这时 Vim 认为你是想删掉整个单词(包括最后一个字符)
“$” 命令移动到行尾。所以, “d$” 命令从当前的位置一直删除到本行行尾。这是一个 “包含的” 命令,所以,这行的最后一个字符也会被删除
另一个操作符命令是 “c”,表示修改,change。它的作用方式与 “d” 操作符相似,只是完成后会切换到插入模式。
例如, “cw” 修改一个词,更精确的说,它删除一个词,并切换到插入模式。
这里 “c2wbe<Esc>” 包括如下操作:
c       修改操作符
2w      移动两个单词的距离(与操作符合起来,它删除两个单词并进入插入模式)
be      插入 be 这个单词
<Esc>   切换回普通模式
“d$” 删除到行尾; “c$” 则修改到行尾。这就象先用 “d$” 删除一行再用 “a” 启动插入模式并加入新的文字。
快 捷 键
有些 “操作符-动作” 命令由于经常被使用,所以被设置为单字符命令:
x  表示  dl  (删除当前光标下的字符)
X  表示  dh  (删除光标左边的字符)
D  表示  d$  (删除到行尾)
C  表示  c$  (修改到行尾)
s  表示  cl  (修改一个字符)
S  表示  cc  (修改一整行)
重复一个修改
“.” 是 Vim 中一个非常简单而有用的命令。它重复最后一次的修改操作。例如,假设你在
编辑一个 HTML 文件,你想删除所有的 <B> 标记。你把光标移到第一个 “<” 上,然后用
“df>” 命令删除 <B>。然后你就可以移到 </B> 的 < 上面用 “.” 命令删除它。 “.” 命令
执行最后一次的修改命令(在本例中,就是 “df>”)。要删除下一个 <B> 标记,移动到下
一个 < 的位置,再执行 “.” 命令即可。
To <B>generate</B> a table of <B>contents
f<   找第一个 <            —>
df>  删除到>          –>
f<   找下一个 <                 ———>
重复 df>                      —>
f<   找下一个 <                             ————->
重复 df>                                      –>
“.” 命令重复任何除 “u” (undo),CTRL-R (redo) 和冒号命令外的修改。
关 于 粘 贴 的 更 多 知 识
“P” 命令象 “p” 一样也是插入字符,但插入点在光标前面。当你用 “dd” 删除一行,
“P” 会把它插入到光标所在行的前一行。而当你用 “dw” 删除一个单词,”P” 会把它
插入到光标前面。
你可以执行这个命令多次,每次会插入相同的文本。
“p” 和 “P” 命令接受个数前缀,被插入的文本就会被插入指定的次数。所以 “dd” 后
加一个 “3p” 会把删除行的三个拷贝插入到文本中。
交 换 两 个 字 符
经常发生这样的情况,当你输入字符的时候,你的手指比你的脑子转得快 (或者相反?)。
这样的结果是你经常把 “the” 敲成 “teh” 。Vim 让你可以很容易得修正这种错误。只要把
光标移到 “teh” 的 “e” 上,然后执行 “xp” 即可。这个工作过程是: “x” 删除一个字符,
保存到寄存器。 “p” 把这个被保存的字符插入到光标的后面,也就是 “h” 的后面了。
teh     th     the
x       p
由于 “y” 是一个操作符,所以 “yw” 命令就是拷贝一个单词了。当然了,个数前缀也是
有效的。要拷贝两个单词,就可以用 “y2w”。例如:
let sqr = LongVariable *
                 ————–>
                       y2w
let sqr = LongVariable *                                p
let sqr = LongVariable * LongVariable
注意: “yw” 命令包括单词后面的空白字符。如果你不想要这个字符,改用 “ye” 命令。
“yy” 命令拷贝一整行,就像 “dd” 删除一整行一样。出乎意料地是, “D” 删除到行尾而
“Y” 却是拷贝一整行。要注意这个区别! “y$” 拷贝到行尾。
使用剪贴板
“Cut” 菜单项会在把文字拷进剪贴板前删除它。 “Copy”,”Cut” 和 “Paste” 命令在弹出
菜单中也有(当然了,前提是有弹出式菜单)。如果你的 Vim 有工具条,在工具条上
也能找到这些命令。
如果你用的不是 GUI,或者你根本不喜欢用菜单,你只能用其它办法了。你还是可以用普通
的 “y”( yank)和 “p” (put)命令,但在前面必须加上 “*(一个双引号加一个星号)。
例如,要拷贝一行到剪贴板中:
“*yy
要粘贴回来:
“*p
这仅在支持剪贴板的 Vim 版本中才能工作。
文本对象
如果你在一个单词的中间而又想删掉这个单词,在你用 “dw” 前,你必须先移到这个单词的
开始处。这里还有一个更简单的方法: “daw”。
this is some example text.
daw
this is some text.
“daw” 的 “d” 是删除操作符。 “aw” 是一个文本对象。提示: “aw” 表示 “A Word”
(一个单词),这样, “daw” 就是 “Delete A Word” (删除一个单词)。确切地说,
该单词后的空格字符也被删除掉了。
用 “cis” 可以改变一个句子。看下面的句子:
Hello there.  This is an example.  Just some text.
移动到第二行的开始处。现在使用 “cis”:
Hello there. Just some text.
现在你输入新的句子 “Another line.”:
Hello there.  Another line.  Just some text.
“cis” 包括 “c”( change,修改)操作符和 “is” 文本对象。这表示 “Inner
Sentence” (译者注:实在很难用中文表示这个意思了,各位还是记英文名吧)。还有
一个文本对象是 “as”,区别是 “as” 包括句子后面的空白字符而 “is” 不包括。如果
你要删除一个句子,而且你还想同时删除句子后面空白字符,就用 “das”;如果你想保
留空白字符而替换一个句子 ,则使用”cis” 。
*04.9*  替换模式
“R” 命令启动替换模式。在这个模式下,你输入的每个字符都会覆盖当前光标上的字符。
这会一直持续下去,直到你输入 <Esc>。
在下面的例子中,你在 “text” 的第一个 “t” 上启动替换模式:
This is text.
Rinteresting.<Esc>
This is interesting.
你可能会注意到,这是用十二个字符替换一行中的五个字符。如果超出行的范围, “R” 命
令自动进行行扩展,而不是替换到下一行。
你可以通过 <Insert> 在插入模式和替换模式间切换。
但当你使用 <BS>(退格键)进行修正时,你会发现原来被替换的字符又回来了。这就好像
一个 “撤消” 命令一样。
. %
%用来匹配块,
如果你的光标在类似 ([{}])
或者 #ifdef #else #endif上
%将把光标跳转到相应的匹配符号上去,
%还可以用来指定命令范围,
如果你想把一个
{
 ..
 …
}的块全部删除。
可以先把光标移到 { 再敲d%
类似的,
如果你想把一个块全部往里缩进一个 tab
可以把光标移到 { 敲>%
2. =
=是用来缩进的假设你已经在 .vimrc里
设置了你的缩进格式 ,
你就可以用 =来缩进你的代码了
=%就是缩进一个块。
3.正则表达式
正则表达式大家都清楚,
我主要讲个一般人不太用,
但很有用的表达 ,
例如你想把所有的 “…”形式的串替换成’…’的形式
但引号里的内容不变
你就可以用
%s/”\(.*\)”/’\1’/ 来做
上面这个正则表达式 “\(.*\)”里 \ 用来表示 ()是元字符
第一个在括号里的被匹配的串就可以被 \1来代表, 以后依次是 \2 \3。
顺便说一句,我到现在还不
知道怎么限制 vim里正则表达匹配的贪婪算法
·编译选项
:cn 命令会把你带到下一个出错地点,而不考虑它在什么文件里。
:cc 命令会向你显示当前错误的编译器输出信息;
:cl 会生成一个列有项目所有错误的列表,以供浏览这些错误
未经允许不得转载:Cooders'S Blog » vi命令第五弹