⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usr_10.cnx

📁 Vim 中文文档
💻 CNX
📖 第 1 页 / 共 2 页
字号:
*usr_10.txt*	Vim version 6.3 最近更新:2004年6月		    Vim用户手册 - by Bram Moolenaar		(译者:Nek_in http://vimcdoc.sf.net)			      做大修改第四章我们已经介绍过作小修改的方法了。本章开始介绍如何重复多次修改和如何改动大量的文字。这将包括使用可视模式处理一些文本块,还有使用一个外部程序去完成非常复杂的功能。|10.1|	记录与回放命令|10.2|	替换|10.3|	命令范围|10.4|	global 命令|10.5|	可视块模式|10.6|	读、写部分文件内容|10.7|	编排文本|10.8|	改变大小写|10.9|	使用外部程序     下一章:|usr_11.txt|  从崩溃中恢复     前一章:|usr_09.txt|  使用 GUI 版本       目录:|usr_toc.txt|=============================================================================*10.1*	记录与回放命令"." 命令重复前一个修改操作。但如果你需要作一些更复杂的操作它就不行了。这时,记录命令就变得很有效。这需要三个步骤:1. "q{register}" 命令启动一次击键记录,结果保存到 {register} 指定的寄存器中。   寄存器名可以用 a 到 z 中任一个字母表示。2. 输入你的命令3. 键入 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 "<Esc>	在行首输入 #include "	$			移到行末	a"<Esc>			在行末加上双引号 (")	j			移到下一行	q			结束记录现在,你已经完成一次复杂的修改了。你可以通过重复三次 "@a" 完成余下的修改。"@a" 命令可以通过个数前缀修饰,来把该操作重复指定的次数。在本例中,你可以输入:>	3@a移 动 并 执 行你可能有多个地方需要修改。只要把光标移动到相应的位置并输入 "@a" 命令即可。如果你已经执行过一次,你可以用 "@@" 完成这个操作,这更容易输入一些。例如,你上次使用 "@b" 命令引用了寄存器 b,下一个 "@@" 命令将使用寄存器 b。    如果你对回放命令和 "." 命令作一个比较,你会发现几个区别。首先,"." 只能重复一次改动。而在上例中,"@a" 可以重复多次改动,还能够执行移动操作。第二,"." 只能记住最后一次变更操作。而寄存器执行命令允许你记录任何操作并使用象 "@a"这样的命令回放这些被记录的操作。最后,你可以使用 26 个寄存器,因此,你可以记录多达 26 个命令序列。使 用 寄 存 器用来记录操作的寄存器与你用来拷贝文本的寄存器是相同的。这允许你混合记录操作和其它命令来操作这些寄存器。    假设你在寄存器 n 中记录了一些命令。当你通过 "@n" 执行这些命令时,你发现这些命令有些问题。这时你可以重新录一次,但这样你可能还会犯其它错误。其实,你可以使用如下窍门:	G			移到行尾	o<Esc>			建立一个空行	"np			拷贝 n 寄存器中的文本,你的命令将被拷到整个				文件的结尾	{edits}			象修改普通文本一样修改这些命令	0			回到行首	"ny$			把正确的命令拷贝回 n 寄存器	dd			删除临时行现在你可以通过 "@n" 命令执行正确的命令序列了。(如果你记录的命令包括换行符,请调整上面例子中最后两行的操作来包括所有的行。)。扩 展 一 个 寄 存 器到此为止,我们一直使用小写的寄存器名。要扩展命令到一个寄存器中,可以使用一个大写的寄存器命令。    假设你已经记录了一个修改一个单词的命令到寄存器 c 中。它可以正常工作。但现在你需要加一个搜索命令以便找到下一个单词来修改。这可以通过如下命令来完成:>	qC/word<Enter>q"qC" 命令用于对 c 寄存器启动一次扩展记录。由此可见,记录到一个大写寄存器表示扩展命令到对应的小写寄存器。这种方法在宏记录,拷贝和删除命令中都有效。例如,你需要把选择一些行到一个寄存器中,可以先这样拷贝第一行:>	"aY然后移到下一个要拷贝的地方,执行:>	"AY如此类推。这样在寄存器 a 中就会包括所有你要拷贝的所有行。==============================================================================*10.2*	替换						*find-replace*":substitute" 命令使你可以在连续的行中执行字符串替换。下面是这个命令的一般形式:>	:[range]substitute/from/to/[flags]这个命令把 [range] 指定范围中的字符串 "from" 修改为字符串 "to"。例如,你可以把连续几行中的 "Professor" 改为 "Teacher",方法是:>	:%substitute/Professor/Teacher/<	Note:	很少人会把整个 ":substitute" 命令完整敲下来。通常,使用命令的缩写形	式 ":s" 就行了。下文我们将使用这个缩写形式。命令前面的 "%" 表示命令作用于全部行。如果不指定行范围,":s" 命令只作用在当前行上。|10.3| 将对 "行范围" 作深入的介绍。默认情况下,":substitute" 命令只对某一行中的第一个匹配点起作用。例如,前面例子中会把行:	Professor Smith criticized Professor Johnson today. ~修改成:	Teacher Smith criticized Professor Johnson today. ~要对行中所有匹配点起作用,你需要加一个 g(global,全局)标记。下面命令:>	:%s/Professor/Teacher/g对上面例子中的句子的作用效果如下:	Teacher Smith criticized Teacher Johnson today. ~":s" 命令还支持其它一些标志位,包括 "p"(print,打印),用于在命令执行的时候打印出所有被修改的行。还有 "c"(confirm,确认)标记会在每次替换前向你询问是否需要替换。执行如下命令:>	:%s/Professor/Teacher/cVim 找到第一个匹配点的时候会向你提示如下:>	replace with Teacher (y/n/a/q/l/^E/^Y)?(中文翻译如下:>	替换为 Teacher ?(y/n/a/q/l/^E/^Y)?<这种时候,你可以输入如下回答中的一个:	y		Yes;执行替换	n		No;跳过	a		All;对剩下的匹配点全部执行替换,不需要再确认	q		Quit;不再执行任何替换	l		Last;替换完当前匹配点后退出	CTRL-E		向上滚动一行	CTRL-Y		向下滚动一行":s" 命令中的 "from" 部分实际上是一个 "匹配模式"(还记得吗?这是我们前面给pattern 起的名字——译者),这与查找命令一样。例如, 要替换行首的 "the" 可以这样写:>	:s/^the/these/如果你要在 "from" 或者 "to" 中使用正斜杠,你需要在前面加上一个反斜杠。更简单的方法是用加号代替正斜杠。例如:>	:s+one/two+one or two+=============================================================================*10.3*	命令范围":substitute" 命令和很多其它的 ":" 命令一样,可以作用于选中的一些行。这称为一个 "范围"。    最简单的范围表达形式是 "{number},{number}"。例如:>	:1,5s/this/that/g这会在 1 到 5 行上执行替换命令。(包括第5行)。"范围" 总是放在一个命令的前面。如果只用一个数值,表示某个指定的行:>	:54s/President/Fool/有些命令在不指定范围的时候作用于整个文件。要让它只作用于当前行可以用当前行范围标识 "."。":write" 命令就是这样:不指定范围的时候,它写入整个文件,如果要仅写入当前行,可以这样:>	:.write otherfile文件的第一行行号总是 1,最后一行又是多少呢?"$" 字符用于解决这个问题。例如,要修改当前行到文末的全部内容,可以这样:>	:.,$s/yes/no/我们前面使用的 "%" 就是 "1,$" 的缩写形式,表示从文首到文末。在 范 围 中 使 用 模 式假设你正在编辑一本书中的一章,并且想把所有的 "grey" 修改成 "gray"。但你只想修改这一章,不想影响其它的章节。另外,你知道每章的开头的标志是行首的单词为"Chapter"。下面的命令会对你有帮助:>	:?^Chapter?,/^Chapter/s=grey=gray=g你可以看到这里使用了两个查找命令。第一个是 "?^Chapter?",用于查找前一个行首的 "Chapter",就是说 "?pattern?" 用于向前查找。同样,"/^Chapter/" 用于向后查找下一章。    为了避免斜杠使用的混淆,在这种情况下,"=" 字符用于代替斜杠。使用斜杠或使用其它字符也是可以的。加 减 号上面的方案其实还是有问题的:如果下一章的标题行中包括 "grey",这个 "grey" 也会被替换掉。如果你正好想这样就最好,可是正好你不想呢?这个时候你需要指定一个偏移。    要查找一个模式,并且使用它的前一行,需要这样:>	/Chapter/-1你可以用任意数值代替命令中的1。要定位匹配点下的第二行,要这样:>	/Chapter/+2偏移还可以用于其它范围指定符。看一下下面这个例子:>	:.+3,$-5这指定当前行下面第三行到文末倒数第五行的范围。使 用 标 记除了指定行号,(这需要记住并把它敲出来),你还可以使用标记。    在前面的例子中,你可以用标记指出第三章的位置。例如,用 "mt" 标记开头,再用 "mb" 标记结尾。然后你就可以用标记表示一个范围(包括标记的那一行):>	:'t,'b可 视 模 式 和 范 围你可以在可视模式中选中一些行。如果你现在输入 ":" 启动冒号命令模式,你会看到:>	:'<,'>现在,你可以输入剩下的命令,这个命令的作用范围就是可视模式中指定的范围。	Note:	如果使用可视模式选中行的一部分,或者用 CTRL-V 选中一个文本块,然后	执行冒号命令,命令仍作用于行范围,而不是选中的范围。这可能会在以后	的版本中修正。'< 和'> 实际上是标记,分别标识可视模式的开始和结尾。这个标记一直有效,直到选中了其它的范围为止。你还可以用标记跳转命令 "'<" 跳转到选中文本的开始处。你还可以把这个标记和其它标记混合,例如:>	:'>,$这表示从选中部分的结尾到文末。指 定 行 数如果你知道要修改多少行,你可以先输入一个数值再输入冒号。例如,如果你输入"5:",你会得到:>	:.,.+4现在你可以继续你的命令,这个命令将作用于当前行及其后 4 行。=============================================================================*10.4*	global 命令":global"命令是Vim中一个更强大的命令(之一)。它允许你找到一个匹配点并且在那里执行一个命令。它的一般形式是:>	:[range]global/{pattern}/{command}这有点象 ":substitute" 命令。只是它不替换文本,而是执行 {command} 指定的命令。	Note:	global 中执行的命令只能是冒号命令。普通模式命令不能在这里使用。	如果需要,可以使用 |:normal| 命令。假设你要把 "foobar" 修改为 "barfoo",但只需要修改 C++ 风格的注释中的内容。这种注释以 "//" 开头。所以可以使用如下命令:>	:g+//+s/foobar/barfoo/g这个命令用 ":g" 开头,这是 ":global" 的缩写形式,就像 ":s" 是 ":substitute"的缩写形式一样。然后是一个匹配模式,由于模式中包括正斜杠,我们用加号作分隔符,后面是一个把 "foobar" 替换成 "barfoo" 的替换命令。    全局命令的默认范围是整个文件,所以这个例子中没有指定范围。这一点与":substitute" 是不同的——后者只作用于一行。    这个命令并非完美。因为 "//" 可能出现在一行的中间,但替换命令会把前后的匹配点都替换了。像 ":substitute" 一样,这里也可以使用各种各样的匹配模式。当你从后面的章节中学会更多的关于模式的知识,它们都可以用在这里。=============================================================================*10.5*	可视块模式CTRL-V 命令可以选中一个矩形文本块。有几个命令是专门用来处理这个文本块的。在可视块模式中,"$" 命令有些特别。当最后一个移动命令是 "$" 时,整个可视块将被扩展到每一行的行尾。这种状态在你使用垂直移动命令的时候一直被保持,直到你使用水平移动命令为止。就是说,用 "j" 命令会保持这种状态,而 "h" 会退出。插 入 文 本"I{string}<Esc>" 命令把 {string} 查到可视块的每一行的左边。你用 CTRL-V 进入块可视模式,然后移动光标定义一个块。接着输入 I 进入插入模式,并随后输入文本。这时,你输入的内容只出现在第一行。    然后你输入 <Esc> 结束输入,刚才输入的字符串将神奇地出现在每一行的可视区的左边。例如:	include one ~	include two ~	include three ~	include four ~把光标移到第一行 "one" 的 "o"上,输入 CTRL-V。然后用 "3j" 向下移动到 "four"。现在你选中了四行的一个方块。接着输入:>	Imain.<Esc>结果将是:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -