我发现在其他编辑器中有用的是以下功能:


获取所选文本
运行外部命令并将所选内容传递给其stdin

使用外部命令stdout并用它替换当前选择。
如何通过vim使用选择内容呢?
...单个字符,单词,段落...等。

(直接在命令行中,或通过键绑定吗?)喜欢对选择进行操作。 (即,如果按!sort将会删除的文本)。

#1 楼

我发现通常最简单的方法是对v使用可视模式(或使用大写V选择整行),然后选择要传递的文本。

然后键入: />
:!cat


这样并没有做任何有用的事情。我经常使用的一个有用命令是:

:!python -m json.tool


格式化JSON。 />
:<range>!command


例如,对于整个文件:

:%!python -m json.tool


或对于当前行:

:.!python -m json.tool


评论


与此配合使用的另一个非常有用的工具是sort命令。

–科迪民意测验
2015年2月4日在16:24

@CodyPoll Vim的:sort有什么问题?

–马丁·图尔诺伊(Martin Tournoij)
2015年2月4日在16:25



@Carpetsmoker外部sort命令具有更多选项,并且(取决于语言环境等)产生不同的顺序。

–德罗伯特
2015年2月4日在16:34

这对于选择一行中的单个单词不起作用。 (请参阅问题提及单词级别选择)

–ideasman42
2015年2月5日在4:40



@ ideasman42对……我想我最初以“行或词”而不是“行和词”来阅读这个问题……在任何情况下,用单词来完成都是不明显的,UNIX程序可以在行上工作,而Vim也不例外。我做了一些试验,并找到了解决方案,但是效果不是很好。也许我的方法是错误的,所以我只待几天,然后再回头。

–马丁·图尔诺伊(Martin Tournoij)
15年2月13日在0:25

#2 楼

我写了一个名为express.vim的插件,可以帮助解决这个问题。该插件定义了一个运算符g=,该运算符使您可以通过运动(或视觉选择)评估VimScript表达式。它会提示您输入一个表达式,您可以在其中将v:val用作运动所覆盖的文本的占位符(或再次选择“视觉选择”)。在这种情况下,有用的表达式将使用system()函数,它运行外部命令。

system('tr a-z A-Z', v:val)


(这里我以tr作为简单的外部命令示例。)

使用方法这个问题的express.vim是在可视模式下选择文本,然后键入g=,后跟该表达式,然后按一下Enter:它不容易使用。 (实际上,我自己很少使用此插件!)我正在考虑添加一种快捷方式来调用外部命令,例如以!开始表达式。如果最终不能这样做,我将在此处发布更新。

EDIT

我修改了express.vim,将以!开头的表达式视为外部命令。因此,坚持使用tr示例,上述操作变得简单得多。视觉选择后,键入以下内容:

g=system('tr a-z A-Z', v:val)<CR>


解释:
输入g=作为表达式
!tr a-z A-Z



#3 楼

您正在Vim中寻找过滤器命令。请参阅:help filter。以下是相关文档:

!{motion}{filter}   Filter {motion} text lines through the external
                    program {filter}.
!!{filter}          Filter [count] lines through the external program
                    {filter}.
{Visual}!{filter}   Filter the highlighted lines through the external
                    program {filter} (for {Visual} see |Visual-mode|).
                    {not in Vi}

:{range}![!]{filter} [!][arg]               *:range!*
                    Filter {range} lines through the external program
                   {filter}.  ...[See documentation for details]


因此,键入5!!sort将从光标开始对接下来的5行进行排序。

评论


是否可以过滤单个单词? (不是线路级别)

–ideasman42
16年5月13日在8:25

是。第三个选项(可视模式)适用于突出显示的任何内容(单词,分行,多行,矩形块等)。

– Sameer
16年6月27日在18:19

第三个选项还可以过滤整行。如果您选择一个单词并对其进行过滤,例如通过tr [:lower:] [:upper]进行过滤,则vim不仅会大写该单词,还会大写整行。

–maria s
17年1月26日在13:30



#4 楼

请注意,可以使用以下方法完成此操作:


可视地选择所需的内容

s^R=system('tr a-z A-Z', @")[:-2]^M(其中^R为CTRL + R,而^ M为ENTER)

还可以与选择和替换的东西一起使用,例如ci"^R=...

评论


在多行文本选择上运行此命令时(按v键并移动光标之后),我得到错误E16:无效范围\ nE16:无效范围\ nE476:无效命令(在Linux上,因此存在tr和其他基本命令)。

–ideasman42
17年1月26日在19:04



您是否按了进入插入模式的s或:s命令?

–卢克·赫米特(Luc Hermitte)
17年1月26日在21:26

不必怀疑,但也不确定您的意思,也许示例可以说明如何将其绑定到键?

–ideasman42
17年1月26日在21:46



您是从视觉模式直接点击s还是首先点击:?我编写的键序列没有涉及:映射为:vnoremap µ s = system('tr a-z A-Z',@“)[:-2]

–卢克·赫米特(Luc Hermitte)
17年1月27日在9:42

#5 楼

有一个名为vis.vim的vim插件可以使用此功能。我在以下堆栈溢出帖子中找到了它:https://stackoverflow.com/questions/40072761/vim-send-visual-block-to-external-command#answer-40083050

评论


欢迎来到Vi和Vim!好的答案不仅仅包括链接和模糊的描述。他们应该自己站着。如果愿意,您可以编辑以改善答案:)

– D. Ben Knoble♦
20年7月12日在19:03