您的位置:首页 > 其它

vim 高级使用技巧

2009-10-30 10:45 447 查看

vim 的模式和命令

通常模式(n) 在其它任何一个模式下,用ESC或者 ctrl+c 键可以退到通常模式

插入模式(i) 在这个模式下,vim像一个常见的编辑器.在通常模式下,用i或者a可以进行本模式,当然,还有一些其它命令也可以.

可视模式(v) 在这个模式下,可以使用hjkl进行选择.然后进行copy,paste或者其它操作. 在通常模式下,用v命令进行可视模式.

块操作模式(V) 这是块操作模式. 在通常模式下,用ctrl+v进入本模式.

修改模式(R) 这是改写的模式.很多软件法用insert键来完成这个切换.在vim中,从通常模式用R即可进入改写模式.

扩展命令模式(ex) 这是命令执行模式 在通常模式下用:切换到此模式.


键盘映射

映射可以使你把一系列 Vim 命令绑定为一个单独的键。假设你要用一个大括号将一个特定的单词括起来。例如,把 "amount" 变成 "{amount}"。用 ":map" 命令,就可以让 /p来完成这个工作。命令如下:

:map /p i(ea)

分解一下这个命令:
/p "/"和"p"。这是命令的触发器。当这两个键依次被按下时,相应的命令即被
执行。

i{ 插入 { 字符。 键用于退出插入模式。

e 移动到词尾。

a} 插入 } 到单词尾。

执行 ":map" 命令后,要在单词两端加上 {},只需要移到单词的第一个字符上并按 F5。

在这个例子中,触发器是单独一个键;它还可以是任何字符串。但若你使用一个已经存在的 Vim 命令,该命令将不再有效。最好避免出现这种情况。

一个可用于映射的键是反斜杠。因为你很可能想定义多个映射,那就加上另一个字符。你可以映射 "/p" 为在单词两端加圆括号,而映射 "/c" 为加花括号,例如:

:map /p i(ea)

:map /c i{ea}

你需要在敲入 / 后,立即敲入 p,以便 Vim 知道它们组成一个命令。

:map 命令 (无参数) 列出当前已定义的映射。


记录与回放命令

"." 命令重复前一个修改操作。但如果你需要作一些更复杂的操作它就不行了。这时,记录命令就变得很有效。这需要三个步骤:

"q{register}" 命令启动一次击键记录,结果保存到 {register} 指定的寄存器中。 寄存器名可以用 a 到 z 中任一个字母表示。

输入你的命令。

键入 q (后面不用跟任何字符) 命令结束记录。

现在,你可以用 "@{register}" 命令执行这个宏。

现在看看你可以怎么用这些命令。假设你有如下文件名列表:

stdio.h

fcntl.h

unistd.h

stdlib.h

而你想把它变成这样:

#include "stdio.h"

#include "fcntl.h"

#include "unistd.h"

#include "stdlib.h"

先移动到第一行,接着执行如下命令:

qa 启动记录,并使用寄存器 a

^ 移到行首

i#include " 在行首输入 #include "

$ 移到行末

a" 在行末加上双引号 (")

j 移到下一行

q 结束记录

现在,你已经完成一次复杂的修改了。你可以通过重复三次 "@a" 完成余下的修改。

"@a" 命令可以通过计数前缀修饰,使操作重复指定的次数。在本例中,你可以输入:

3@a

备注1:关于寄存器名的大小写区别
小写的寄存器名表示寄存器本身,而这个名字如果被大写则表示对寄存器进行追加


标记

跳来跳去 当你用 "G" 命令跳到另一个地方,Vim 会记住你从什么地方跳过去的。这个位置成为一个标记,要回到原来的地方,使用如下命令:

``

` 用单引号 ' 也可以。
如果再次执行这个命令你会跳回去原来的地方,这是因为 ` 记住了自己跳转前的位置。

一般,每次你执行一个会将光标移动到本行之外的命令,该移动即被称为一个 "跳转" 。这包括查找命令 "/" 和 "n" (无论跳转到多远的地方)。但不包括 "fx" 和 "tx" 这些行
内查找命令或者 "w" 和 "e" 等词移动命令。

另外 "j" 和 "k" 不会被当做是一次 "跳转",即使你在前面加上计数前缀使之移动到很远的地方也不例外。

`` 命令可以在两个位置上跳来跳去。而 CTRL-O 命令则跳到一个 "较老" 的地方 (提示: O 表示 older)。CTRL-I 则跳到一个 "较新" 的地方 (提示:I 在键盘上紧靠着O)。考虑如下命令序列:

33G

/^The

CTRL-O

你首先跳到第 33 行,然后查找以 "The" 开头的一行,然后用 CTRL-O 你会跳回到 33行。再执行 CTRL-O 你会跳到最初的地方。现在你使用 CTRL-I,就又跳到 33 行。而再用一次 CTRL-I 你又会到达找到 "The" 的地方。

| example text ^ |

33G | example text | CTRL-O | CTRL-I

| example text | |

V line 33 text ^ V

| example text | |

/^The | example text | CTRL-O | CTRL-I

V There you are | V

example text

备注:
CTRL-I 的功能与 一样。

":jumps" 命令能输出一个你可以跳往的位置的列表。最后一个你使用的标记会用 ">" 符号标记出来。

有名字的标记

Vim 允许你在文本中放置自定义的标记。命令 "ma" 用 a 标记当前的光标位置。你可以在文本中使用 26 个标记 (a 到 z)。这些标记是不可见的,只是一个由 Vim 记住的位置。

要跳到一个你定义的标记,可以使用命令 `{mark},这里 {mark} 是指定义标记的那个字母。所以,移到标记 a 的命令是:

`a

命令 'mark (单引号加上一个标记) 会移到标记所在行的行首。这与 `mark 命令是不同的,后者同时移到标记标记的列上。

标记在需要处理一个文件的两个相关地方的时候非常有用。假设你在处理文件末的时候需要查看文件首的一些内容。

先移动到文件首,设置一个标记 s (start,开始):

ms

然后移动到你需要处理的地方,再设置一个标记 e (end,结束):

me

现在你可以随意移动,当你需要看开头的地方,可以使用这个命令移到那里:

's

然后使用 '' 跳回来。或者用 'e 跳到你正在处理的文件尾部的地方。

这里使用 s 和 e 作标记名没有特别的含义,只是为了好记而已。

你可以用如下命令取得所有的标记的列表:

:marks

你会注意到有一些特殊的标记,包括:

' 跳转前的光标位置

" 最后编辑的光标位置

[ 最后修改的开始位置

] 最后修改的结束位置

5. 后悔药
假设我们有一个文本,内容为“pass”,对它的更改如下面这个树状图所示:

pass

|

改变 1

|

pass port

/ /
改变 2 改变 3

| |

pass prot passport

|

改变 4

|

passsport

我们如何得到passport?一个比较好用的命令是:undolist,这样可以让我们看到我们所作过的所有更改,并列出更改距离现在的时间。我们可以
通过类似:earlier 1s的命令来进行undo操作,相对的,也有:later命令,可用的参数为s/m/h。

如果实在不记得自己进行过什么操作,而又想进行undo的话,可以通过g-和g+来在时间上进行后退和前进,这与u和Ctrl+R在操作上进行后退前进是不同的。

参考文献:

http://vimcdoc.sf.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: