Saturday, June 9, 2007

vim稍高级一些的使用技巧

本文随时更新,vim的基本操作在gvim7的tutor中说的很清楚了,这个tutor也写的很不错。

J: 把两行连起来
CTRL-R: redo
"o" 命令在光标下方建立一个新的空行,并把 Vim 切换到插入模式
"O" 命令(大写)在光标上方打开一个新行
w: 移动光标向前跳动一个词,移动到词首
b: 与w相反
"e" 命令可以移到下一个单词的词末,而 "ge" 则移动到前一个单词的末尾
"$" 命令把光标移动到当前行行尾
"^" 命令把光标移动到当前行的第一个非空字符
"0"(零) 命令则移到一行的第一个字符

f/F:单字符查找命令,最有用的移动命令之一,"fx" 命令向前查找本行中的字符 x。"F" 命令则用于向左查找。
"tx" 命令与 "fx" 相似,但它只把光标移动到目标字符的前一个字符上。提示:"t" 表示 "To"。这个命令的反向版本是 "Tx"。
这四个命令可以通过 ";" 命令重复,"," 命令则用于反向重复。无论用哪个命令,光标永远都不会移出当前行,哪怕是这两行是连续的一个句子。

G: 移动到指定的行,"33G" 把你送到 33 行
"50%" 移动到文件的中间,而 "90%" 移到差不多结尾的位置。

H,M,L:分别代表移到当前视野的Home, Middle, Last处

:set number 这会在每行的前面加上一个行号

有些 "操作符-动作" 命令由于经常被使用,所以被设置为单字符命令:
x 表示 dl (删除当前光标下的字符)
X 表示 dh (删除光标左边的字符)
D 表示 d$ (删除到行尾)
C 表示 c$ (修改到行尾)
s 表示 cl (修改一个字符)
S 表示 cc (修改一整行)

使用 "V" 命令来启动可视模式。左右移动不会有任何效果。而通过上下移动,你可以一次选择多行。如果你要处理一个矩形块内的文本,可以使用 CTRL-V 启动可视模式。

"daw" 的 "d" 是删除操作符。"aw" 是一个文本对象。提示:"aw" 表示 "A Word"一个单词),这样,"daw" 就是 "Delete A Word"(删除一个单词)。确切地说,该单词后的空格字符也被删除掉了。

"cis" 包括 "c"(change,修改)操作符和 "is" 文本对象。这表示 "Inner Sentence"(译者注:实在很难用中文表示这个意思了,各位还是记英文名吧)。还有一个文本对象是 "as",区别是 "as" 包括句子后面的空白字符而 "is" 不包括。如果你要删除一个句子,而且你还想同时删除句子后面空白字符,就用 "das";如果你想保留空白字符而替换一个句子,则使用"cis"。

还有很多方法可以删除文本。这是一些经常用到的:
x 删除光标下的字符("dl"的缩写)
X 删除光标前的字符("dh"的缩写)
D 从当前位置删除到行尾("d$"的缩写)
dw 从当前位置删除到下一个单词开头
db 从当前位置删除到前一个单词的开头
diw 删除光标上的单词(不包括空白字符)
daw 删除光标上的单词(包括空白字符)
dG 删除到文末
dgg 删除到文首

如果你用 "c" 代替 "d",这会变成修改命令;而改用 "y",则变成拷贝命令,等等等等。

还有一些常用的命令,放在哪一章都不合适,列在这里:
~ 修改光标下字符的大小写,并移动到下一个字符。这不是一个操作符
(除非设置了 'tildeop'),所以你不能连接一个动作命令。这个命
令在可视模式下也有效,它会改变被选中的所有文本的大小写。
I 移到当前行的第一个非空字符并启动插入模式
A 移动到行尾并启动插入模式

彩色的文字难以辨认
Vim 自动猜测你使用的背景色。如果是黑的(或者其它深色的色彩),它会
用浅色作为前景色。如果是白的(或者其它浅色),它会使用深色作为前景
色。如果 Vim 猜错了,文字就很难认了。要解决这个问题,设置一下
'background' 选项。对于深色:

:set background=dark

而对于浅色:

:set background=light

这两个命令必须在 ":syntax enable" 命令前调用,否则不起作用。如果要在
这之后设置背景,可以再调用一下 ":syntax reset"。

:colorscheme evening

保留原始文件

如果你在编辑源程序,你可能想在修改之前保留一个备份。但备份文件会在你存盘的时
候被覆盖。这样它只能保留前一个版本,而不是最早的文件。
要让 Vim 保存一个原始的文件,可以设置 'patchmode' 选项。这个选项定义需要
改动文件的第一个备份文件的扩展名。通常可以这样设:
:set patchmode=.orig
这样,当你第一次编辑 data.txt,作了修改并执行存盘,Vim 会保留一个名为
"data.txt.orig" 的原始文件。
如果你接着修改这个文件,Vim 会发现这个原始文件已经存在,并不再覆盖它。进
一步的备份就存在 "data.txt~"(或者你设置的 'backupext' 指定的文件)中。
如果你让 'patchmode' 设为空(这是默认的情况),则原始文件不会被保留。

文件间拷贝文本

本节解释如何在文件间拷贝文本。我们从一个简单的例子开始。编辑一个你要拷贝文本的
文件,把光标移到要拷贝的文本的开始处,用 "v" 命令启动可视模式,然后把光标移到
要拷贝文本的结尾处,输入 "y" 拷贝文本。
例如,要拷贝上面这段文字,你可以执行:
:edit thisfile
/本节解释
vjjj$y
现在编辑你要粘贴文本的文件。把光标移到你要插入文本的地方。用 "p" 命令把文本粘贴
到那里:
:edit otherfile
/There
p
当然,你可以用任何命令拷贝文本。例如,用 "V" 命令选中整行的内容。或者用
CTRL-V 选择一个矩形区域。或者使用 "Y" 拷贝一个单行,"yaw" 拷贝一个单词等。
"p" 命令把文本粘贴到光标之后,"P" 命令则粘贴到光标之前。注意, Vim
会记住你拷贝的是一整行还是一个矩形,并用相同的方式把文本贴出来。

关闭窗口

以下命令用于关闭窗口:
:close
实际上,任何退出编辑的命令都可以关闭窗口,象 ":quit" 和 "ZZ" 等。但 "close"可以避免你在剩下一个窗口的时候不小心退出 Vim 了。


关 闭 所 有 其 它 窗 口
如果你已经打开了一整套窗口,但现在只想编辑其中一个,如下命令可以完成这个功能:
:only
这个命令关闭除当前窗口外的所有窗口。如果要关闭的窗口中有一个没有存盘,Vim 会
显示一个错误信息,并且那个窗口不会被关闭。

对所有窗口执行命令
你打开了几个窗口,现在你想退出 Vim,你可以分别关闭每一个窗口。更快的方法是:
:qall
这表示 "quit all"(全部退出)。如果任何一个窗口没有存盘,Vim 都不会退出。同时光标会自动跳到那个窗口,你可以用 ":write" 命令保存该文件或者 ":quit!" 放弃修改。

如果你知道有窗口被改了,而你想全部保存,则执行如下命令:
:wall
这表示 "write all"(全部保存)。但实际上,它只会保存修改过的文件。Vim 知道保
存一个没有修改过的文件是没有意义的。
另外,还有 ":qall" 和 "wall" 的组合命令:
:wqall
这会保存所有修改过的文件并退出 Vim 。
最后,下面的命令由于退出 Vim 并放弃所有修改:
:qall!
注意,这个命令是不能撤消的。


用 vimdiff 显示区别
有一种特殊的启动 Vim 的方法可以用来显示两个文件的区别。让我们打开一个 "main.c"
并插入一些字符。在设置了 'backup' 选项的情况下保存这个文件,以便产生 "main.c~"
备份文件。
在命令行中输入如下命令:(不是在Vim中)
vimdiff main.c~ main.c
Vim 会用垂直分割的方式打开两个文件。你只能看到你修改过的地方和上下几行的地方。

我 在 哪?

要知道当前文件在文件列表中的位置,可以注意一下文件的标题。那里应该显示类似
"(2 of 3)" 的字样。这表示你正在编辑三个文件中的第二个。
如果你要查看整个文件列表,使用如下命令:
:args
这是 "arguments"(参数)的缩写。其输出应该象下面这样:
one.c [two.c] three.c
这里列出所有你启动 Vim 时指定的文件。你正在编辑的那一个,例如,"two.c",被中括号括起来了。


移 动 到 另 一 个 参 数
要回到前一个文件:
:previous
这个命令与 ":next" 相似,只不过它是向相反的方向移动。同样地,这个命令有一个
快捷版本用于 "保存再移动":
:wprevious
要移动到列表中的最后一个文件:
:last
而要移动到列表中的第一个文件:
:first

不过,可没有 ":wlast" 或者 "wfirst" 这样的命令了。
你可以在":next"和":previous"前面加次数前缀。例如要向后跳两个文件:
:2next
选项 'fileformats' 包含各种各样的格式,Vim 会在编辑一个新文件之初尝试该
选项定义得各种格式。例如,下面这个命令告诉 Vim 先尝试用 UNIX 格式,其次, 尝试
MS-DOS 格式:
:set fileformats=unix,dos

No comments:

Post a Comment