vim命令(一)
一、移动命令
H、J、K、L 左下上右移动
0跳转到行首,同Home
$跳转到行尾,同End
b/w和B/W 以单词为单位向前和向后跳转。小写的跟编程语言里的标识符的规则相似,认为一个单词是由字母、数字、下划线组成的(不严格的说法),而大写的命令则认为非空格字符都是单词。
f 和 t 他们的作用是找到下一个输入的字符。如果前面加数字n的话就是查找第n个。f会包含这个字符,而t不会。需要反方向搜索的话,需要使用F和T。
(和)移到上一句和下一句。
{和}移到上一段和下一段.
<C-Home>和<C-End>跳转到文件的开头和结尾。
gg和G跳转到开头和结尾。
二、文本修改
d加动作来进行删除(dd删除整行);D则相当于d$,删除到行尾。
c加动作来进行修改(cc修改整行);C则相当于c$,删除到行尾然后进入插入模式。
s相当于cl,删除一个字符然后进入插入模式;S相当于cc,替换整行的内容。
i在当前字符面前进入插入模式;I则相当于^i,把光标移到行首非空白字符上然后进入插入模式。
a在当前字符后面进入插入模式;A相当于$a,把光标移到行尾然后进入插入模式。
o在当前行下方插入一个新行,然后在这行进入插入模式;O在当前行上方插入一个新行,然后在这行进行插入模式。
r替换光标下的字符;R则进入替换模式,每次按键(直到<Esc>)替换一个字符。
u撤销最近的一个修改动作;U撤销当前行上的所有修改。
三、文本对象的选择
有几个动作只能在c、d、v、y这样的命令之后用。这些选择动作的皆不能附加建是a和i。而a可以理解为英文单词a,表示选定后续动作要求的完整内容,而i可理解为英文单词inner,代表后续动作要求的内容的“内部”。
举例说明
if(message == "sesame open")
我们进一步假设光标停在“sesame”的“a”上,那么(和一般的行文惯例不同,下面在命令外面也加上了引号,避免可能的歧义):
‘dw’(理解为 delete word)会删除“ame␣”,结果是“if (message == "sesopen")”
‘diw’(理解为 delete inside word)会删除“sesame”,结果是“if (message == " open")”
‘daw’(理解为 delete a word)会删除“sesame␣”,结果是“if (message == "open")”
‘diW’会删除“"sesame”,结果是“if (message == open")”
‘daW’会删除“"sesame␣”,结果是“if (message == open")”
‘di"’会删除“sesame open”,结果是“if (message == "")”
‘da"’会删除“"sesame open"”,结果是“if (message ==)”
‘di(’或‘di)’会删除“message == "sesame open"”,结果是“if ()”
‘da(’或‘da)’会删除“(message == "sesame open")”,结果是“if␣”
上面演示了 a、i 和 w、双引号、圆括号搭配使用,这些对于任何语言的代码编辑都是非常有用的。实际上,可以搭配的还有更多:
搭配 s(sentence)对句子进行操作——适合西文文本编辑
搭配 p(paragraph) 对段落进行操作——适合西文文本编辑,及带空行的代码编辑
搭配 t(tag)对 HTML/XML 标签进行操作——适合 HTML、XML 等语言的代码编辑
搭配 ` 和 ' 对这两种引号里的内容进行操作——适合使用这些引号的代码,如 shell 和 Python
搭配方括号(“[”和“]”)对方括号里的内容进行操作——适合各种语言(大部分都会用到方括号吧)
搭配花括号(“{”和“}”)对花括号里的内容进行操作——适合类 C 的语言
搭配角括号(“<”和“>”)对角括号里的内容进行操作——适合 C++ 的模板代码
四、更快的移动
可以使用<PageUp>和<PageDown>翻页,Vim传统的用法是<C-B>和<C-D>.
<C-U>和<C-D>进行翻半页。
数字加G可以跳转到指定行。数字加|跳转到指定列。
<C-E>和<C-Y>滚动屏幕
zt、zz、zb移动屏幕
H,M,L移动屏幕
五、重复使用命令
;重复最近的字符查找(f、t等)操作
,重复最近的字符查找操作,反方向
n 重复最近的字符串查找操作(/ 和 ?)
N 重复最近的字符串查找操作(/ 和 ?),反方向
. 重复执行最近的修改操作