Emacs / vim 快速复制粘贴

Emacs / vim quick copy paste

我正在尝试过渡到 emacs(使用邪恶的 mode/vim 键绑定),但我感觉 efficient/productive 比只使用鼠标更难。这是我发现自己真的很慢的情况的示例:

for i in range(self.allData.shape[0]):
    self.correctSequence = self.displayNumbers(i, self.allData)
    self.userSequence = self.numberEntry()

    self.allData.set_value(i, 'userSequence', ''.join(self.userSequence))

    if len(self.correctSequence) != len(self.userSequence):
        self.allData.set_value(i, 'correct', 0)
    else:
        if list(reversed(self.correctSequence)) == self.userSequence:
            self.allData.set_value(i, 'correct', 1)
        else:
            self.allData.set_value(i, 'correct', 0)

我经常不得不将 self.allData 的前 4 个实例更改为其他内容(例如 self.testData),而保留最后 2 个不变。

通常情况下,这对鼠标来说不会太糟糕。例如,我可以用 testData 替换第一个 allData,复制它,用鼠标移动到接下来的 3 个出现处,然后每次按 CTRL-V。或者更好的是,只需在 sublime/atom 中使用多个光标并一次性替换所有 4 个

我在带有 vim 键绑定的 emacs 中使用 spacemacs。因此,在 emacs 中,我发现自己必须执行以下操作:

  1. SPC-SPC a(跳转到以 a 开头的单词)
  2. cw testData

对我要替换的每个单词重复这 2 个步骤一次

这看起来真的很低效,我想知道:我只是使用了一种低效的方法吗?有没有更快的方法来做我想做的事?

似乎即使我设法非常快地完成这些步骤(4 次),仍然需要输入更多的内容,而且我看不出这比仅仅伸手去拿更快老鼠。是的,有人可能会说我不断地伸手去拿鼠标是在浪费时间,但在我看来,我是在通过伸手去拿鼠标来节省打字时间,因为我只需按几次 CTRL-V 就可以达到我想要的效果想。在这种情况下,vim 速度增益到底在哪里?

如果你只是想replace, you can use query-replace,一个字一个字的替换。

您也可以使用replace-string,但请记住将替换限制在缓冲区的一部分,激活该部分周围的区域。

无论如何,这些命令可能会阻止您通过眼睛找到单词、通过鼠标移动光标以及将手移回键盘。他们也可以避免可能的忽视。至少我不想在打字时把手离开键盘。 :)

我不确定 "vim-like" Spacemacs 怎么样,但是你 可以 在 Vim:

中这样做
/all<CR>
cgntest<Esc>
.
.
.

或:

/all<CR>
cetestData<Esc>
n.
n.
n.

或:

:,$s/allD/testD/gc<CR>

也许这些方法之一也适用于 Spacemacs?

除了通常的(通常是最好的)答案query-replace(见@songyuanyao的回答),你还可以使用二级selection 的优势是 select 在不同的地方主动粘贴相同的东西。与 region 不同,次要 selection 与光标位置无关(又名 point),因此它始终可用,无论光标所在的位置。

与查询替换不同的是,您可以按需粘贴它,而不必对每个匹配项进行回答。如果您使用 delete-selection mode 那么只需 select 一些文本来替换并粘贴辅助 selection 来替换它。

您可以使用鼠标设置和粘贴辅助 selection - 请参阅 Secondary Selection on the Emacs Wiki, and see the Emacs manual, node Secondary Selection

如果您使用库 second-sel.el,那么您也可以使用键盘上的辅助 selection,并充分利用它。