获取所选文本
运行外部命令并将所选内容传递给其
stdin
使用外部命令
stdout
并用它替换当前选择。 如何通过vim使用选择内容呢?
...单个字符,单词,段落...等。
(直接在命令行中,或通过键绑定吗?)喜欢对选择进行操作。 (即,如果按
!sort
将会删除的文本)。#1 楼
我发现通常最简单的方法是对v使用可视模式(或使用大写V选择整行),然后选择要传递的文本。然后键入: />
:!cat
这样并没有做任何有用的事情。我经常使用的一个有用命令是:
:!python -m json.tool
格式化JSON。 />
:<range>!command
例如,对于整个文件:
:%!python -m json.tool
或对于当前行:
:.!python -m json.tool
#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
–卢克·赫米特(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
评论
与此配合使用的另一个非常有用的工具是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