Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将vim缓冲区复制到剪贴板之前,是否有方法将sed转换应用到vim缓冲区?_Vim_Sed - Fatal编程技术网

在将vim缓冲区复制到剪贴板之前,是否有方法将sed转换应用到vim缓冲区?

在将vim缓冲区复制到剪贴板之前,是否有方法将sed转换应用到vim缓冲区?,vim,sed,Vim,Sed,我正在使用以下命令将文档中的所有文本行复制到系统剪贴板: %y+ 通常,尤其是为了将代码复制到StackOverflow;),我将sed转换应用于我的缓冲区,以便更容易使用标记粘贴: %s:^:\t:g 有没有一种方法可以链接命令,而不将其实际应用到我的缓冲区,只应用到复制的文本 我建议使用CLI实用程序将其放在剪贴板上:我以前找到了几个,但这里有一个: 你会这么做的 :%!sed 's:^:\t:g`|xclip 或 后者使用X剪贴板而不是主剪贴板(假设为UNIX) 在window

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

%y+
通常,尤其是为了将代码复制到StackOverflow;),我将sed转换应用于我的缓冲区,以便更容易使用标记粘贴:

%s:^:\t:g

有没有一种方法可以链接命令,而不将其实际应用到我的缓冲区,只应用到复制的文本

我建议使用CLI实用程序将其放在剪贴板上:我以前找到了几个,但这里有一个:

你会这么做的

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

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

在windows上,可能有类似的实用程序

编辑

纯vim解决方案应为:

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

  • 它不是很有效率(但你使用它的目的是发布…所以它不是荷马的古怪之作)
  • 我假设您想要Windows行结尾(这是我从SO复制时得到的结果)

如果
shiftwidth
等于4并且设置了
expandtab
,我将执行以下操作:

:set guioptions+=a
ggVG>gv
7次按键也没那么糟糕。当然,没有ex命令。如果需要ex命令,可以执行以下操作:

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

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

:%s/^/\t/|%y+|u
另一种解决办法是在文件内容中赋予替代权 复制后,
+
立即注册

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

+1对于
:%y+
——我仍然坚持着
gg的坏习惯“+yG
因为。。。我总是忘记,大多数行方式的普通命令都有简洁的ex版本:)。
:%y+
的另一大优势是,它可以通过
@:
立即重复。是的,我对没有选择它作为问题的正确答案感到沮丧。
gg怎么样“*yG
%y+
容易?这是一个反问句吗?我现在觉得很困惑<代码>:%y+显然更快。然而,ex命令在一般情况下使用频率较低,因此可能还需要记住一件事?我确实认为这是一种修辞。我不熟悉vim,作为一名编辑,我很快就爱上了它。只是。。。所以太棒了…@TK Kocheran,之前问过的同一个问题有另一个精选答案:…哦,好的。我不知道从
vim
内部使用外部命令有多容易,因为我对它有点陌生。如果我早知道这一点,那么离胜利只有一个
sed:^:\t:g'| xclip-selection剪贴板
。没有适用于
vim
的本机解决方案?我更喜欢更简单的
:%s/^/\t/|%y+|u
命令,而不是这两种解决方案中的任何一种。(尽管它在撤销列表中添加了一个新条目。)+1足够有趣了。在
behave xterm
下,我没有想到
:se go+=a
会点击Windows剪贴板。然而,确实如此。我肯定我会讨厌它敲我的剪贴板,但我会试试看它是否适合我。它有可能成为习惯破坏者。有意思。需要辅助寄存器吗?为什么不干脆
%y+|let@+=替换(@+,“^\\n\zs”,“t”,“g”)
?(顺便说一句,您错误地恢复了寄存器的内容——假设
x
包含从块视觉模式复制的文本。)@ib:是的,我应该使用
getregtype
getreg
setreg
来完成。你完全正确,我只能用
+
寄存器来完成,但是有一个剪贴板监控应用程序(同上),它会在历史记录中用一个不必要的项目来填充它。@Benoit:Hm,在剪贴板监控应用程序中复制项目可能会很烦人。如果是这种情况,您可以尝试
:redir=>s | sil%p | redir END|let@+=s
或类似于第二个@sehe的解决方案。最后一个可以说是本页所有好方法中最好的选择。这里有一些很棒的维姆福,就这样!我非常喜欢第一个命令,我就是这样做的:)@sehe:谢谢!还有更多的方法可以做到这一点——例如,请参阅我对贝诺特答案的最后一点评论。
:%s/^/\t/|%y+|u
:%y+|let@+=substitute(@+,'^\|\n\zs','\t','g')