【问题标题】:How to pipe visually selected text to a UNIX command and append output to current buffer in Vim如何将可视选择的文本通过管道传输到 UNIX 命令并将输出附加到 Vim 中的当前缓冲区
【发布时间】:2008-10-23 15:45:30
【问题描述】:

使用 Vim,我试图将在可视模式中选择的文本通过管道传输到 UNIX 命令,并将输出附加到当前文件的末尾。例如,假设我们有一个 SQL 命令,例如:

SELECT * FROM mytable;

我想做如下的事情:

<ESC>
V                 " select text
:'<,'>!mysql -uuser -ppass mydb

但我不想让输出覆盖当前选定的文本,而是希望将输出附加到文件末尾。你可能会看到这是怎么回事。我正在使用 Vim 作为一个简单的 SQL 编辑器。这样,我就不必离开 Vim 来编辑、调整、测试 SQL 代码。

【问题讨论】:

  • 谢谢!这按预期工作。这是我使用的实际命令:com -range C ,yank | $ |放| .,$ !/usr/local/mysql/bin/mysql -uuser mydb 我有一个“select * from table;”文本文件中的行,我只是 :C 并将输出转储到文件末尾。

标签: sql vim editor vi


【解决方案1】:

如何将选定的文本复制到文件末尾,选择复制并运行命令?如果您不想一遍又一遍地重复相同的命令,可以使用q 记录序列或添加新命令。我试过后者如下:

:com -range C <line1>,<line2>yank | $ | put | .,$ !rev

您可以使用它选择一些行,然后输入:C。这将首先拉出所选内容,然后转到文件末尾,粘贴拉出的文本并在新文本上运行命令(在本例中为rev)。

【讨论】:

    【解决方案2】:

    如果你更喜欢程序化的方法,你可以有

    :call append(line("$"), system("command", GetSelectedText()))
    

    其中GetSelectedText 是可重用函数:

    func! GetSelectedText()
      normal gv"xy
      let result = getreg("x")
      normal gv
      return result
    endfunc
    

    【讨论】:

      【解决方案3】:

      试试

      :r | YourCommand
      

      例如:

      :r ! echo foo
      

      foo 添加到您的缓冲区。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 2018-08-18
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多