从vim中的寄存器中删除换行符?

时间:2011-06-03 14:02:13

标签: regex vim replace vim-registers

我有很多不同的大学名单。我正在尝试通过将线条与某些唯一关键字进行整理来构建同义词表格;也就是说,在文件中,我会在这里确定哈佛是关键字:

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

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

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

我一直在搜索光标下的单词,将该单词的行放入寄存器,将寄存器粘贴到另一个文件中,然后使用join命令“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 //克
  • 如何搜索缓冲区中的'foo'并将其替换为寄存器的内容,例如: :%S /富/ A / G
  • 如何搜索寄存器的内容并用缓冲区中的'foo'替换,例如:%S / A /酒吧/克

我需要知道的事情:

  • 如何搜索并用'bar'替换'foo'从注册'a'注册'b'
  • 如何搜索并用'bar'替换'foo'从注册'a'注册'a'

4 个答案:

答案 0 :(得分:5)

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

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

然后,当您将注册a粘贴回来时,您应该获得所需的结果。

答案 1 :(得分:2)

您无需从注册表中移除换行符或按下多个J:使用以下映射"apgVJ

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

此映射使您可以在粘贴后立即选择粘贴的文本。所选区域上的J加入区域中的所有行(除非区域只有一行:此处J的行为类似于J而没有选择,将当前行与下一行连接起来)。 gV提示也可用于替换:"apgV:s/{pattern}/{replacement}<CR>比使用"ap:let @a=substitute(@a, '{pattern}', '{replacement}', '{flags}')更方便,除非您定义了一些智能映射。

另一个提示是,可以使用a正常模式序列清除寄存器qaqqa开始记录新宏,q立即停止它,在a留下空字符串{1}}注册记录宏的位置。

答案 2 :(得分: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?"

答案 3 :(得分:0)

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

  

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

我会用

:%s/\n//g

全局搜索并替换所有\ n新行。 有时候,你可能需要使用^ M(命中控制+ v和ENTER) 代替\ n。

我担心你的清单会比这更复杂,但是,在这种情况下,我的解决方案太简单了