|
|
VIM小窍门
|
|
来源:
ChinaUnix博客 作者:
ChinaUnix博客 发布时间:2007-01-01
|
|
*12.1* 单词替换
替换命令能够在全文中用一个单词替换另一个单词:
:%s/four/4/g
"%" 范围前缀表示在任何行中执行替换。最后的 "g" 标记表示替换行中的任何匹配点。
假如您有一个象 "thirtyfour" 这样的单词,上面的命令会出错。这种情况下,这
个单词会被替换成 "thirty4"。要解决这个问题,用 "\ :%s/\
显然,这样在处理 "fourteen" 的时候还是会出错。用 "\>" 来解决这个问题:
:%s/\/4/g
假如您在编码,您可能只想替换注释中的 "four",而保留代码中的。由于这很难指定,
能够在替换命令中加一个 "c" 标记,这样,Vim 会在每次替换前提示您:
:%s/\/4/gc
在 多 个 文 件 中 替 换
假设您需要替换多个文档中的单词。您的一个选择是打开每一个文档并手工修改。另外,
假如使用 "记录-回放" 命令会更快。
假设您有一个包括有 C++ 文档的目录,任何的文档都以 ".cpp" 结尾。有一个叫
"GetResp" 的函数,您需要把他改名为 "GetAnswer"。
vim *.cpp 启动 Vim,用当前目录的任何 C++ 文档作为文档参
数。启动后您会停在第一个文档上。
qq 用 q 作为寄存器启动一次记录。
:%s/\/GetAnswer/g
在第一个文档中执行替换。
:wnext 保存文档并移到下一个文档。
q 中止记录。
@q 回放 q 中的记录。这会执行又一次替换和
":wnext"。您现在能够检查一下记录有没有错。
999@q 对剩下的文档执行 q 中的命令
Vim 会在最后一个文档上报错,因为 ":wnext" 无法移到下一个文档上。这时任何的文档
中的操作都完成了。
备注:
在回放记录的时候,任何错误都会中止回放的过程。所以,要注意确保记录中
的命令不会产生错误。
这里有一个陷阱:假如有一个文档不包含 "GetResp",Vim 会报错,而整个过程会中止,
要避免这个问题,能够在替换命令后面加一个标记:
:%s/\/GetAnswer/ge
"e" 标记通知 ":substitute" 命令很难找到不是错误。
*12.2* 把 "Last, First" 改成 "First Last"
您有如下样式的一个名字列表:
Doe, John
Smith, Peter
您想把他改成:
John Doe
Peter Smith
这能够用一个命令完成:
:%s/\([^,]*\), \(.*\)/\2 \1/
我们把这个命令分解成几个部分。首先,很明显他是个替换命令。"%" 是行范围,表示
作用于全文。这样替换命令会作用于全文的每一行。
替换命令的参数格式是 "from/to",正斜杠区分 "from" 模式和 "to" 字符串。所
以,"from" 部分是:
\([^,]*\), \(.*\)
第一对 \( 和 \) 之间的部分匹配 "Last" \( \)
匹配除逗号外的任何东西 [^,]
任意多次 *
匹配逗号 ,
第二对 \( 和 \) 之间的部分匹配 "First" \( \)
匹配任意字符 .
任意多次 *
在 "to" 部分,我们有 "\2" 和 "\1"。这些称为 "反向引用"。他们指向前面模式中的
\( 和 \) 间的部分。"\2" 指向模式中的第二对 \( 和 \) 间的部分,也就是 "First"
名 (译者注:英文中 Last Name 表示姓,即家族名,后面的 First Name 表示名字)。
"\1" 指向第一对 \( \),即 "Last" 名。
您能够在替换部分使用多达 9 个反向引用。"\0" 表示整个匹配部分。更有一些特别
的项能够用在替换命令中。请参阅 |
sub-replace-special
|。
*12.3* 排序
在您的 Makefile 中常常会有文档列表。例如:
OBJS = \
version.o \
pch.o \
getopt.o \
util.o \
getopt1.o \
inp.o \
patch.o \
backup.o
要对这个文档列表排序能够用一个外部过滤命令:
/^OBJS
j
:.,/^$/-1!sort
这会先移到 "OBJS" 开头的行,向下移动一行,然后一行行执行过滤,直到碰到一个空
行。您也能够先选中任何需要排序的行,然后执行 "!sort"。那更容易一些,但假如有很
多行就比较麻烦。
上面操作的结果将是:
OBJS = \
backup.o
getopt.o \
getopt1.o \
inp.o \
patch.o \
pch.o \
util.o \
version.o \
注意,列表中每一行都有一个续行符,但排序后就错掉了!"backup.o" 在列表的最后,
无需续行符,但排序后他被移动了。这时他需要有一个续行符。
最简单的解决方案是用 "A \" 补一个续行符。您也能够在最后一行放一个续行
符,由于后面有一个空行,这样做是不会有问题的。
*12.4* 反转行顺序
|
:global
| 命令能够和 |
:move
| 命令联用,将任何行移动到文档首部。结果是文档被按
行反转了次序。命令是:
:global/^/m 0
缩写:
:g/^/m 0
正则表达式 "^" 匹配行首 (即使该行是个空行)。|
:move
| 命令将匹配的行移动到那个
神秘的第 0 行之后。这样匹配的行就成了文档中的第一行。由于 |
:global
| 命令不会被
改变了的行号搞混,该命令继续匹配文档中剩余的行并将他们一一变为首行。
这对一个行范围同样有效。先移动到第一行上方并做标记 't' (mt)。然后移动到范围的
最后一行并键入:
:'t+1,.g/^/m 't
*12.5* 单词统计
有时您要写一些有最高字数限制的文字。Vim 能够帮您计算字数。
假如您需要统计的是整个文档的字数,能够用这个命令:
g CTRL-G
不要在 "g" 后面输入一个空格,这里只是方便阅读。
他的输出是:
Col 1 of 0; Line 141 of 157; Word 748 of 774; Byte 4489 of 4976
(译者注:中文是:
第 1/0 列; 第 141/157 行; 第 748/774 个词; 第 4489/4976 个字节
)
您能够看到您在第几个单词 (748) 上连同文档中的单词总数 (774)。
假如您要知道的是全文的一部分的字数,您能够移到该文本的开头,输入 "g CTRL-G",
然后移到该段文字的末尾,再输入 "g CTRL-G",最后心算出结果来。这是一种很好的心
算练习,但是不是那么容易。比较方便的办法是使用可视模式,选中您要计算字数的文
本,然后输入 "g CTRL-G",结果将是:
Selected 5 of 293 Lines; 70 of 1884 Words; 359 of 10928 Bytes
(译者注:中文是:
选择了 5/293 行; 70/1884 个词; 359/10928 个字节
)
要知道其他计算字数,行数和其他东西总数的方法,能够参见 |
count-items
|。
*12.6* 查阅 man 信息 *find-manpage*
编辑一个脚本文档或 C 程式的时候,有时您会需要从 man 手册中查询某个命令或函
数的用法 (使用 Unix 的情况下)。让我们先用一个简单的方法:把鼠标移到对应的单词
上然后输入:
K
Vim 会在对应的单词上执行外部命令:man。假如能找到相应的手册,那个手册页就会被
显示出来。他常常用 more 一类的程式显示页面。在手册滚动到文档末并回车,控制就会
回到 Vim 中。
这种方法的缺点是您不能同时查看手册和编辑文档。这里有一种办法能够把手册显示到一
个 Vim 的窗口中。首先,加载 man 文档类型的外挂:
:runtime! ftplugin/man.vim
假如您经常用到这种方法,能够把这个命令加到您的 vimrc 文档中。现在您能够用
":Man" 命令打开一个显示 man 手册的窗口了:
:Man csh
您能够在这个新的窗口中上下滚动,而手册的本文会用语法高亮的形式显示。这样,您可
以找到需要的地方,并用 CTRL-W w 跳转到原来的窗口中继续工作。
要指定手册的章节,能够在手册名称前面指定。例如,要找第三章的 "echo":
:Man 3 echo
要跳转到另一个由 "word(1)" 形式定义的手册,只要在上面敲 CTRL-]。无论怎样,
":Man" 命令总使用同一个窗口。
要显示当前光标下的单词的手册,这样:
\K
(假如您重定义了 ,用那个字符代替上面命令的反斜杠)。
例如,您想知道下面语句中的 "strstr()" 函数的返回值:
if ( strstr(input, "aap") == )
能够把光标移到 "strstr" 并输入 "\K"。手册使用的窗口会显示 strstr() 的信息。
*12.7* 删除多余的空格
有些人认为行末的空格是无用,浪费而难看的。要删除这些每行后面多余的空格,能够执
行如下命令:
:%s/\s\+$//
命令前面指明范围是 "%",所以这会作用于整个文档。"substitute" 命令的匹配模式是
"\s\+$"。这表示行末 ($) 前的一个或多个 (\+) 空格 (\s)。后面我们会介绍怎样写
这样的模式。|
usr_27.txt
|。
替换命令的 "to" 部分是空的:"//"。这样就会删除那些匹配的空白字符。
另一种没有用的空格是 Tab 前面的字符。通常这能够删除而不影响格式。但并不是总这
样!所以,您最好手工删除他。执行如下命令:
/
您什么都看不见,其实这是个空格加一个 TAB 键。相当于 "/"。现在,
您能够用 "x" 删除多余的空格,并确保格式没有改变。接着您能够用 "n" 找到下一个位
置并重复这个操作。
*12.8* 查找单词的使用位置
假如您是个 UNIX 用户,您能够用 Vim 和 grep 命令的组合来完成编辑包括特定单词
的任何文档的工作。这在您编辑一个程式而且想查看和编辑看任何的包括使用某个变量
的文档的时候很有用。
举个例子,假设想编辑任何包括单词 "frame_counter" 的 C 源文档,您能够执行如
下命令:
vim `grep -l frame_counter *.c`
让我们分析一下这个命令。grep 从一组文档中查找特定的单词。由于指定了 -l 参数,
grep 只列出文档而不打印匹配点。被查找的单词是 "frame_counter",其实这能够是任
何正则表达式。(注意:grep 所使用的正则表达式和 Vim 使用的不完全相同)。
整个命令用反引号 (`) 包起来,这告诉 UNIX 的 shell 使用该命令的输出作为命令
行的一部分。于是,grep 命令产生一个文档列表,并作为 Vim 的命令参数。Vim 将编辑
grep 列出来的任何文档。您能够通过 ":next" 和 ":first" 命令一个一个处理这些文
件。
找 到 每 一 行
上面的命令只是找到包括单词的那个文档。您还需要知道单词在该文档中出现的地方。
Vim 有一个内置的命令用于在一组文档中找一个指定的字符串。例如,假如您想在所
有的 C 文档中查找 "error_string",能够使用如下命令:
:grep error_string *.c
这会使 Vim 在任何指定的文档 (*.c) 中查找 "error_string"。Vim 会打开第一个匹配
的文档并将光标定位在第一个匹配行。要到下一个匹配行 (无论在哪个文档),能够执行
"cnext" 命令。要回到上一个匹配行,能够用 ":cprev" 命令。使用 "clist" 能够看到
任何的匹配点。
":grep" 命令会使用一个外部的程式。可能是 grep (在 Unix 上) 或 findstr
(在 Windows 上)。您能够通过 'grepprg' 选项修改这个配置。
本文来自ChinaUnix博客,假如查看原文请点:http://blog.chinaunix.net/u1/49923/showart_393553.html
(阅读次数:)
|
| 上一篇:VIM从崩溃中恢复 下一篇:VIM离开和回来 |
|
[ 收藏]
[ 推荐]
[ 评论(0条)]
[返回顶部] [打印本页]
[关闭窗口] |
|
|
| |
|
|
|