Answers:
我发现通常最简单的方法是使用可视模式v(或大写V选择整行),然后选择要传递的文本。
然后输入:
:!cat
这样,它没有任何用处。我经常使用的有用命令是:
:!python -m json.tool
格式化JSON。
您也可以键入(不使用可视模式):
:<range>!command
例如,对于整个文件:
:%!python -m json.tool
或对于当前行:
:.!python -m json.tool
:sort
怎么了?
我写了一个名为express.vim的插件,可以帮助解决这个问题。该插件定义了一个运算符g=
,使您可以评估运动(或视觉选择)上的VimScript表达式。它提示您输入一个表达式,您可以在其中v:val
用作运动所覆盖的文本(或再次是“视觉选择”)的占位符。
在这种情况下,有用的表达式将使用system()
运行外部命令的函数。
system('tr a-z A-Z', v:val)
(在这里,我用作tr
一个简单的示例外部命令。)
针对这个问题使用express.vim的方式是在可视模式下选择文本,然后键入g=
该表达式,然后点击Enter
:
g=system('tr a-z A-Z', v:val)<CR>
我承认,它不容易使用。(实际上,我自己很少使用此插件!)我正在考虑添加一种快捷方式来调用外部命令,例如使用开头表达式!
。如果最终这样做,我会在这里发布更新。
编辑
我修改了express.vim,以将表达式开头!
视为外部命令。因此,坚持使用tr
示例,以上内容变得简单得多。视觉选择后,键入以下内容:
g=!tr a-z A-Z<CR>
说明:
g=
!tr a-z A-Z
作为表达式Enter
您正在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行进行排序。
tr [:lower:] [:upper]
,则vim不仅会修饰该单词,还会修饰整个行。
请注意,可以使用以下方法完成此操作:
s^R=system('tr a-z A-Z', @")[:-2]^M
(使用^R
CTRL + R,并使用^ M进入)它也可以与任何选择+替换的东西一起使用ci"^R=...
。
v
并移动光标之后),我得到了错误E16: Invalid range\nE16: Invalid range\nE476: Invalid command
(在Linux上tr
以及存在其他基本命令)。
s
进入插入模式还是:s
命令?
s
从视觉模式击中,还是:
先击中?:
我编写的键序列没有涉及。映射为:vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
。
sort
命令。