有没有办法在将 vim 缓冲区复制到剪贴板之前对其应用 sed 转换?

发布于 2024-12-04 18:57:39 字数 223 浏览 1 评论 0原文

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

%y+

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

%s:^:\t:g

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

I'm using the following command to copy all lines of text in a document to the system clipboard:

%y+

Usually, especially in order to copy code to StackOverflow ;), I apply a sed transformation to my buffer in order to make it easier to paste in with MarkDown:

%s:^:\t:g

Is there a way to chain the commands without actually applying it to my buffer, only to the copied text?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

或十年 2024-12-11 18:57:39

我建议使用 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行尾(无论如何,这就是我在复制来自时得到的结果)

I suggest using a CLI utility to put it on the clipboard: there are several I found previously, but here's one:

So you'd do

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

or

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

the latter uses the X clipboard instead of the primary clipboard (assuming UNIX).

On windows, there are likely similar utilities

Edit

A pure vim solution would be:

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

Notes:

  • it is not very efficient (but you use it SO posts... so it's not Homer's Oddyssee)
  • I assume that you want Windows line-ends (which is what I get when copying from SO anyways)
温馨耳语 2024-12-11 18:57:39

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

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

另一种解决方案是在内容中进行替换
+ 复制后立即注册。

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

If you do not mind adding an entry to the undo list (that means actually
editing contents of the buffer), you can perform substitution, yank the text,
and undo that substitution in one command.

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

Another solution would be to make the substitution right in the contents of
the + register just after copying.

:%y+|let@+=substitute(@+,'^\|\n\zs','\t','g')
雅心素梦 2024-12-11 18:57:39

如果 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>

然后:

:ToSo

将把你想要的任何内容放入剪贴板

If shiftwidth equals 4 and expandtab is set, I would do:

:set guioptions+=a
ggVG>gv

7 keystrokes is not that bad. Of course there is no ex command. If you want ex commands you could do:

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

And then:

:ToSo

will put whatever you want into the clipboard

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文