有没有办法在将vd缓冲区复制到剪贴板之前将其应用于vim缓冲区?

时间:2011-09-13 07:09:36

标签: vim sed

我正在使用以下命令将文档中的所有文本行复制到系统剪贴板:

%y+

通常,特别是为了将代码复制到StackOverflow;),我将sed转换应用于我的缓冲区,以便更容易使用MarkDown进行粘贴:

%s:^:\t:g

有没有办法链接命令而不实际将它应用到我的缓冲区,只有复制的文本?

3 个答案:

答案 0 :(得分:6)

我建议使用CLI实用程序将它放在剪贴板上:我之前发现了几个,但这里有一个:

所以你要做

:%!sed 's:^:\t:g`|xclip

:%!sed 's:^:\t:g`|xclip -selection c

后者使用X剪贴板而不是主剪贴板(假设为UNIX)。

在Windows上,可能存在类似的实用程序

修改

纯粹的vim解决方案是:

:let @+=substitute(join(getbufline("%", 1, "$"), "\r\n"), "^\\|\n", "\&\t", "g")

注意:

  • 它不是很有效率(但你使用它的帖子......所以它不是荷马的Oddyssee)
  • 我假设您想要Windows端到端(无论如何从 SO复制时,我获取

答案 1 :(得分:3)

如果您不介意在撤消列表中添加条目(这实际上意味着 编辑缓冲区的内容),你可以执行替换,拉动文本, 并在一个命令中撤消该替换。

:%s/^/\t/|%y+|u

另一个解决方案是在内容中使替换正确 复制后的+寄存器。

:%y+|let@+=substitute(@+,'^\|\n\zs','\t','g')

答案 2 :(得分:2)

如果shiftwidth等于4且设置了expandtab,我会这样做:

:set guioptions+=a
ggVG>gv

7次击键并不是那么糟糕。当然没有前命令。如果你想要ex命令,你可以这样做:

function! ToSo()
    %y +
    let @+ = "    " . substitute(@+, '\n', "\n    ", 'g')
endfunction
command! -nargs=0 ToSo :call ToSo()<Enter>

然后:

:ToSo

会将您想要的任何内容放入剪贴板