《Vim实用技巧(第2版)》——1.5 查找并手动替换

1.5 查找并手动替换

Vim提供了一个 :substitute 命令专门用于查找替换任务,不过用上面介绍的技术,也可以手动修改第一处地方,然后再一个个地查找替换其他匹配项。. 命令可以把我们从繁重的工作中解放出来,而即将登场的另一个有用的单键命令,则能够让我们方便地在匹配项间跳转。
在下面这段文本中,每一行都出现了单词“content”。

the_vim_way/1_copy_content.txt

...We're waiting for content before the site can go live...
...If you are content with this, let's go ahead with it...
...We'll launch as soon as we have the content...

假设想用单词“copy”(意义同“copywriting”)来替代“content”。也许你会想,这太简单了,只要用替换命令就行了,像下面这样:

:%s/content/copy/g

但是,且慢!如果我们运行上面这条命令,就会出现“If you are ‘copy’ with this,”这样的句子,这很荒唐!

之所以会有这种问题,是因为“content”一词有两种含义,一个是“copy”的同义词(发音为'kon'tεnt),另一个是“happy”的同义词(发音为kən'tent)。用专业的话说,我们是在处理拼写相同,但含义和发音都不同的词。不过这不是我想说的重点,重点是我们一定要小心每一步操作。

我们不能想当然地用“copy”替换每一个“content”,而是要时刻留神,对每个地方都要问“这里要修改吗?”,然后回答“修改”或者“不改”。substitute 命令也能胜任这项工作,我们将在技巧90中学到该怎么做。不过现在,我们将寻求符合本章主题的另一种解决办法。

偷懒的办法:无需输入就可以进行查找
现在你可能已经猜到了,. 命令是我最喜爱的Vim单键命令,而排在第二位的是 命令,此命令可以查找当前光标下的单词(参见 :h )。

我们可以调出查找提示符,并输入完整的单词来查找“content”。

/content

或者,可以简单地把光标移到这个单词上,然后按 * 键。以下面的操作为例。


刚开始,把光标移到单词“content”上,然后使用 * 命令对它进行查找,你也可以自己试一下。这会产生两个结果:一是光标跳到下一个匹配项上,二是所有出现这个词的地方都被高亮显示出来。如果你并没有看到高亮,试着运行一下 :set hls。要了解更多这方面的内容,请参见技巧81。

执行过一次查找“content”的命令后,现在只需按 n 键就可以跳到下一个匹配项。在本例中,按 *nn 会遍历完所有的匹配项,从而跳回到本次查找的起点。

使修改可重复
当光标位于“content”的开头时,就可以着手修改它。这包括两步操作:首先要删除单词“content”,然后输入替代的单词。cw 命令会删除从光标位置到单词结尾间的字符,并进入插入模式,接下来就可以输入单词“copy”了。Vim会把我们离开插入模式之前的全部按键操作都记录下来,因此整个 cwcopy<Esc> 会被当成一个修改。也就是说,执行 . 命令会删除从光标到当前单词结尾间的字符,并把它修改为“copy”。

合而为一
万事俱备!每次按 n 键时,光标就会跳到下一个“content”单词所在之处,而按 . 键时,它就会把光标下的单词改为“copy”。

如果想替换所有地方,就可以不加思考地一直按 n.n.n. 以完成所有的修改(但是,这种情况下也可以用 :%s/content/copy/g 命令)。然而,由于我们需要留意不符合要求的匹配项,所以在按了 n 之后,要审视一下当前的匹配项,然后决定是否把它改为“copy”。如果需要修改的话,就按 . 命令,反之则不用。无论决定是什么,都可以再次按 n 移到下一个地方,如此循环往复,直到完成全部的修改。

时间: 2024-08-31 06:00:09

《Vim实用技巧(第2版)》——1.5 查找并手动替换的相关文章

《Vim实用技巧(第2版)》——导读

前言 本书是精通Vim的捷径.尽管它不会手把手教你,不过初学者可以先运行随Vim发布的交互式课程--Vim向导[1]来了解必备的知识.本书则在这一基础之上着重介绍核心概念,并为你讲解地道的用法. Vim是高度可配置的,然而定制是一件很个性化的事情,因此我试图避免建议什么应该放进你的vimrc里,什么不应该.相反,本书关注的是Vim编辑器的核心功能.不管你是通过SSH登录远端服务器工作,还是在用本地安装了插件而增添了额外功能的GVim,这些功能都永远在那儿.精通了Vim的核心功能,你就获得了一个可

《Vim实用技巧(第2版)》——1.2 不要自我重复

1.2 不要自我重复 对于在行尾添加内容这样的常见操作,如添加分号,Vim提供了一个专门的命令,可以把两步操作合并为一步. 假设有如下的JavaScript程序片段. the_vim_way/2_foo_bar.js var foo = 1 var bar = 'a' var foobar = foo + bar 我们想在每行的结尾添加一个分号.要实现这一点,先得把光标移到行尾,然后切换到插入模式进行修改.$命令可以完成移动动作,接着就可以执行 a;<Esc> 完成修改了. 要完成全部修改,也

《Vim实用技巧(第2版)》——1.4 执行、重复、回退

1.4 执行.重复.回退 在面对重复性工作时,我们需要让移动动作和修改都能够重复,这样就可以达到最佳编辑模式.Vim对此的支持是:它会记住我们的操作,并使最常用的操作触手可及,所以可以很方便地重复执行它们.本节将介绍 Vim 可以重复执行的每个操作,并学习如何回退这些命令. 我们已经看到 . 命令会重复上次修改.由于很多操作都被当成一次修改,因此 . 命令已经证明了它的神通广大.但有些命令能以其他的方式重复.例如,@: 可以用来重复任意Ex命令(在技巧31中讨论),或者也可以输入 & (参见技巧

《Vim实用技巧(第2版)》——第1章 Vim解决问题的方式 1.1认识 . 命令

1.1 认识 . 命令 . 命令可以让我们重复上次的修改,它是Vim中最为强大的多面手. Vim文档只是简单地提到 . 命令会"重复上次修改"(参见),这听起来没什么特别,但在这个简单的说明里,我们会发现让Vim区分模式的编辑模型如此高效的核心原因.首先我们要问:"究竟什么是修改?" 要理解 . 命令的强大,我们需要意识到这一点:"上次修改"可以指很多东西,一次修改的单位可以是字符.整行,甚至是整个文件. 我们将使用下面这段文本进行说明. the

《Vim实用技巧(第2版)》——第2章 普通模式 2.1停顿时请移开画笔

第一部分 模式 Vim提供一个区分模式的用户界面,就是说在Vim中按键盘上的任意键所产生的结果可能会不一样,而这取决于当前处于哪种模式(mode).知道当前正处于哪种模式,以及如何在各模式间切换,是极其重要的.在本书的这一部分,我们将学习每种模式的工作方式及其用途. 第2章 普通模式 普通模式是Vim的自然放松状态,如果本章看起来出奇的短,那是因为几乎整本书都在讲如何利用普通模式,而本章只涉及其中的一些核心概念以及通用技巧. 其他文本编辑器大部分时间都处于类似Vim插入模式的状态中,因此对Vim

《Vim实用技巧(第2版)》——2.6 双剑合璧,天下无敌

2.6 双剑合璧,天下无敌 Vim的强大很大程度上源自操作符与动作命令相结合.在本节,我们将看到它是如何工作的,并考虑其寓义.操作符 + 动作命令 = 操作d{motion} 命令可以对一个字符(dl).一个完整单词(daw)或一整个段落(dap)进行操作,它作用的范围由动作命令决定.c{motion}.y{motion} 以及其他一些命令也类似,它们被统称为操作符(operator).可以用 :h operator 来查阅完整的列表,表2-1总结了一些比较常见的操作符. g~.gu 和 gU

《Vim实用技巧(第2版)》——2.3 构造可重复的修改

2.3 构造可重复的修改 Vim对重复操作进行了优化,要利用这一点,必须考虑该如何构造修改.在Vim中,要完成一件事,总是有不止一种方式.在评估哪种方式最好时,最显而易见的指标是效率,即哪种手段需要的按键次数最少(又名VimGolf [1]).然而,在平局时该如何选择获胜者呢? 在下例中,假设光标位于行尾处的字符"h"上,而我们想要删除单词"nigh": normal_mode/the_end.txt The end is nigh反向删除因为光标已经位于单词末尾,

《Vim实用技巧(第2版)》——1.6 认识 . 范式

1.6 认识 . 范式 到目前为止,我们介绍了3个简单的编辑任务.尽管每个问题都不一样,不过我们都找到了用 . 命令解决该问题的方法.在本节,我们将比较这些方案,并找出它们共有的模式--一个我称之为" . 范式"的最佳编辑模式. 回顾前面3个 . 命令编辑任务 在技巧2中,我们想在一系列行的结尾添加分号.我们先用 A;<Esc>修改了第一行,做完这步准备后,就可以使用 . 命令对后续行重复此修改.我们使用了 j 命令在行间移动,要完成剩余的修改,只需简单地按足够多次 j.

《Vim实用技巧(第2版)》——2.5 能够重复,就别用次数

2.5 能够重复,就别用次数 在处理某些特定工作时,使用次数可以使按键次数变得最少,不过并不是非得这样不可.我们需要认真考虑次数与重复各自的优缺点.假设在缓冲区里有如下文字. Delete more than one word想把这段文字改为"Delete one word",也就是说,要像这段文字里所讲的那样删除两个单词. 有几种方式可以达到这一目的,d2w 和 2dw 都可以.使用 d2w,先调用删除命令,然后以 2w 作为动作命令,可以把它解读为"删除两个单词"