14

我想要一个可以插入到命令管道中的命令,该命令根据 vim 的语法突出显示功能为其输入添加颜色转义。

例如:

cat somefile.js | vim - <???> | less

结果文本将是 somefile.js 的文本,但根据当前 vim 配置在编辑器中的执行方式进行着色。

我突然想到,这一定是可能的。我同意上面的例子并不是一个理智的人可能称之为完全有用的东西,但这并不意味着这个想法永远不会

4

4 回答 4

5

我认为你的想法有一个基本缺陷:没有人想过允许这样的事情。

显然 vim 能够进行语法高亮。但我敢打赌,如果你能设法让 vim 流式传输文本并对其进行处理,那么你不会喜欢这样的结果。

考虑一下当您通过管道传输文本时会发生什么more(或者less如果您愿意)。当它进入终端时,这些程序会显示一屏并等待您按空格键。但是,如果您将 stdout 重定向到终端以外的其他地方,这些程序会注意到这一点,并简单地将它们的输入复制到它们的输出中。

如果 vim 没有注意到您正在通过管道传输文本,它可能会发送您可能不希望在输出中出现的光标移动命令。如果 vim 确实注意到了,它很可能只是传递文本,而不是对其进行语法着色。只有当 vim 确实做了语法着色但不注入光标移动的东西时,你的想法才会奏效。

你可以试试。这是一个通过 vim 讨论管道内容的答案:

从命令行在 Vim 中执行命令

但是我说为什么不通过一个设计并打算通过它传输文本的程序来传输您的文本呢?Pygments 可以为每种主要的编程语言和标记格式着色。

http://pygments.org/

我看到您的想法的主要优势:您可以自定义 vim 进行语法着色的方式,以您想要的方式获得它,然后还可以使用 vim 来处理您的文本。但是自定义 Pygments 可能并不难,甚至开箱即用也可能令人满意,在这种情况下,它肯定是最简单的方法。而且 Pygments 不仅有 ANSI 序列输出,它还有 HTML 输出、RTF、LaTeX 等。所以如果你让 Pygments 以你想要的方式工作,它应该能够输出你需要的任何输出格式;vim 将只有 ANSI 序列之一。

于 2013-10-30T01:54:12.203 回答
1

我听说有一个名为 Text::VimColor 的 Perl 模块可以满足您的需求。

http://search.cpan.org/dist/Text-VimColor/

但是让我问这个问题:为什么希望它通过更少?为什么不将 vim 用作完美的文件查看器呢? view -将以只读模式从标准输入读取。

于 2013-10-30T02:53:29.630 回答
0

https://gist.github.com/echristopherson/4090959

通过https://superuser.com/a/554531/7198

试了试,/etc/passwd效果出奇的好!

于 2013-10-30T03:44:47.607 回答
0

这可能是你所追求的

cat filename.sh | vim - -c 'syntax on; syn=bash'

这很难看,但你可以给它起别名:

alias vim.sh="vim -c 'syntax on; syn=bash'"

然后像这样使用:

cat filename.sh | vim.sh -
于 2017-02-11T11:11:46.470 回答