4

我有一长串不同的大学名称。我正在尝试通过将行与某些唯一关键字进行比较来构建同义词表;也就是说,在文件中,我将确定哈佛是这里的关键字:

Harvard Business School|
Harvard College|
Harvard School of Divinity|

并将它们粘贴到另一个文件中

Harvard Business School|Harvard College|Harvard School of Divinity|

我一直在通过搜索光标下的单词,将带有该单词的行拉到寄存器中,将寄存器粘贴到另一个文件中,然后使用连接命令“J”将这些行连接在一起:

[ clear register 'a' ]    
0"ay0
[ move cursor to 'Harvard" and yank lines with keyword into register a ]
:g/\<<CTRL-R><CTRL-W>\>/y A
[ move to other screen and paste ]
"ap
[ join lines ]
JJJJJ

这工作得很好,但我希望它能够简化。具体来说,我想知道如何从寄存器中删除换行符,这样我就不必在最后一步使用 JJJJ 手动加入行。我想搜索包含光标下单词的所有行,将它们复制到“a”寄存器中,从“a”寄存器中删除换行符,然后粘贴“a”寄存器的内容。

有任何想法吗?

编辑:我知道:

  • 如何全局搜索替换,例如%s/\n//g
  • 如何在缓冲区中搜索和替换 'foo' 从单词到寄存器的内容,例如:%s/foo/a/g
  • 如何在缓冲区中搜索寄存器的内容并替换为 'foo',例如:%s/a/bar/g

我需要知道的:

  • 如何从注册“a”到注册“b”中搜索“foo”并将其替换为“bar”
  • 如何从注册“a”中搜索“foo”并将其替换为“bar”以注册“a”
4

4 回答 4

5

要直接使用寄存器中的文本执行此操作,a您可以使用以下命令:

:let @a=substitute(strtrans(@a),'\^@',' ','g')

然后,当您将寄存器粘贴回时,您应该会得到您想要的结果a

于 2011-06-03T14:34:17.090 回答
2

您不需要从寄存器中删除换行符或按一个以上J:使用以下映射它将是"apgVJ

nnoremap <expr> gV    "`[".getregtype(v:register)[0]."`]"

此映射使您能够在粘贴后选择粘贴的文本。J在选定区域上连接区域中的所有行(除非区域只有一行:这里的J行为就像J没有选择,将当前行与下一行连接)。gVtip 也可以用来做替换:"apgV:s/{pattern}/{replacement}<CR>比使用更方便,"ap:let @a=substitute(@a, '{pattern}', '{replacement}', '{flags}')除非你定义了一些智能映射。

另一个提示是a可以使用qaq正常模式序列清除寄存器:qa开始记录一个新宏并q立即停止它,在a记录宏的寄存器中留下空字符串。

于 2011-06-04T08:41:48.080 回答
1

游戏迟到了,但由于其他人似乎都解决了错误的问题,而且谷歌为我遇到的问题提供了解决方案,我觉得有义务提供我的解决方案。

将模式匹配累积为一行"a

    :g/pattern/ norm "apkJ"addu

或使用未命名的寄存器

    :g/pattern/ norm pkJddu

它不会删除寄存器中的换行符,因为它不必这样做。

如果您删除u规范代码末尾的的。

引用:

   [ join lines ]
   JJJJJ

一个问题,为什么不使用5J, 或可视模式,或:%j(连接文件中的所有行)?

题外话:

    "How do you mark text between "" in code blocks,
    not to be colour coded?"
于 2011-07-10T22:22:24.860 回答
0

如果我可以假设您的文本文件如下所示:

哈佛商学院|
哈佛学院|
哈佛神学院|

我会用

:%s/\n//g

全局搜索并替换所有 \n 新行。有时,您可能需要使用 ^M(按 control+v 和 ENTER)代替 \n。

恐怕您的列表可能比这个更复杂,但是,在这种情况下,我的解决方案将过于“简单”

于 2011-06-03T14:17:49.613 回答