Vim复制和粘贴

5

我之前的问题可能有点模糊,我会重新表述一下:

我有一个这样的文件:

copythis abc
replacethis1 xyz
qwerty replacethis2
hasfshd replacethis3 fslfs
And so on...

注意: replacethis1,replacethis2,replacethis3等可以是任何单词

如何使用最少的vim命令将“replacethis1”,“replacethis2”,“replacethis3”等单词替换为“copythis”单词?

我可以通过以下步骤之一来完成:

  1. 使用“dw”删除“replacethis1”,“replacethis2”,“replacethis3”等单词
  2. 使用“yw”复制“copythis”
  3. 将光标移动到“replacethis1”所在的位置,然后执行“p”;将光标移动到“replacethis2”所在的位置,然后执行“p”,以此类推……

在VIM中有更好的方法吗(使用更少的vim命令)?

9个回答

6

既然您修改了问题,我会这样做:

移动到第一个“replacethis1”,键入cw(更改单词),然后手动输入“copythis”。

移动到下一个“replacethis”,按下.(重复上次操作)

移动到下一个“replacethis”,按下.,

以此类推。

如果“copythis”是一个短小的单词,我认为这是最好的解决方案。


根据您替换单词的方式,使用ciw(或caw)可能比cw更好。要使cw起作用,您需要在replacethis的开头。 - user55400

4

需要包含数字,每行可能有多个实例:

:%s/replacethis\d/copythis/g

3

鉴于“replacethis [1-3]”可能是任意不相关的单词,全局最快/最简单的方法是:

:%s/replacethis1\|replacethis2\|replacethis3/copythis/g

(请注意,您需要使用 \| 将管道符号视为“或”。否则,vim将寻找字面上的 | 字符。)

2

我也曾经苦苦挣扎,但现在我找到了最简单的方法:

使用最简洁的命令将copythis复制到寄存器r中:

/copythis
"rye

然后进入替换并将其替换为r的内容:

/replacethis
cw<CTRL-R>r<ESC>

然后你只需要对剩下的使用n.n.n.n.n.n.n.,如果它们非常不同,只需转到每个开头并按.

关键是一步替换和粘贴,这样您就可以稍后使用.


1
:%s/copythis/replacethis/g

要替换所有的copythis为replacethis。或者您可以指定一系列行号,例如:

:8,10 s/copythis/replacethis/g

注意,结尾的 /g 会告诉它替换所有出现的情况。如果你不加它,它只会做第一个。

请看我重新表达的问题 - Sachin Khot
你把这两个术语搞反了。 - Paul Beckingham

1
  1. 创建这个映射:

    :map z cwcopythis^[

    ( ^[ 是转义字符,在 vim 中可以使用 Ctrl+V Ctrl+[ 输入 )

  2. 移动到你想要替换的每个单词,然后按 z 键


它会起作用的,这与我的建议相同,但它创建了一个自定义绑定而不是使用内置的点命令。如果您不是一次替换所有单词,那么使用这个可能更好。 - Dan Olson
我最初使用了dw,但一旦我点击发布就意识到错误了,所以我进行了编辑 :) - Adnan

0

你试过字符串替换吗?

%s/replacethis/copythis

有许多其他参数可以进行微调替换。深入研究Vim帮助以获取更多详细信息。这里还有一些例子here

0

您可以将正常模式下的键位 m 重新映射为删除光标下单词并粘贴缓冲区的操作::nnoremap m "_diwP。 然后,您只需复制所需单词,将光标移动到要替换的单词上并输入m

编辑:将映射到m是一个坏主意,因为它用于标记位置。但是您仍然可以使用例如;


0
如果您需要多次执行基本相同的操作 - 将一行的第一个单词与下一行的第二个单词交换,我建议您可以录制一个宏,并在需要时调用它。

请查看我重新表述的问题。 - Sachin Khot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接