如何在管道中使用vim对文本着色?

如何在管道中使用vim对文本着色?,vim,command-line,Vim,Command Line,我希望有一个命令可以插入到命令管道中,根据vim的语法突出显示功能向其输入添加颜色转义 例如: cat somefile.js | vim - <???> | less cat somefile.js | vim-| less 结果文本将是somefile.js的文本,但根据当前vim配置在编辑器中的方式进行着色 我突然想到,这必须是可能的。我同意上面的例子并不是一个理智的人所说的完全有用的,但这并不意味着这个想法永远不会有用。我认为你的想法有一个基本缺陷:没有人想过允许这样的事

我希望有一个命令可以插入到命令管道中,根据vim的语法突出显示功能向其输入添加颜色转义

例如:

cat somefile.js | vim - <???> | less
cat somefile.js | vim-| less
结果文本将是somefile.js的文本,但根据当前vim配置在编辑器中的方式进行着色


我突然想到,这必须是可能的。我同意上面的例子并不是一个理智的人所说的完全有用的,但这并不意味着这个想法永远不会有用。

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

显然,vim能够进行语法高亮显示。但我敢打赌,如果你能设法让vim对文本进行流式处理,你肯定不会喜欢结果

考虑当您通过
more
(或者
less
(如果您愿意)传递文本时会发生什么情况。当它进入终端时,这些程序将显示一屏,并等待您点击空格键。但是,如果您将stdout重定向到终端以外的其他位置,这些程序会注意到这一点,并简单地将其输入复制到其输出,而不做任何更改

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

你可以试试。下面是一个通过vim讨论管道问题的答案:

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


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

有一个名为Text::VimColor的Perl模块,我听说它可以完成您所需要的功能

但让我问一个问题:为什么你希望它经历的更少?为什么不使用vim作为一个非常好的文件查看器呢<代码>视图-将以只读模式从标准输入读取。

通过


/etc/passwd
上试用,效果出奇地好

这可能就是你想要的

cat filename.sh | vim - -c 'syntax on; syn=bash'
这很难看,但您可以将其别名为:

alias vim.sh="vim -c 'syntax on; syn=bash'"
然后像这样使用:

cat filename.sh | vim.sh -

有各种各样的软件可以做到这一点,pygmentize就是其中之一。我从来没见过维姆这么做,虽然评级较低,但似乎建议尝试使用vim作为过滤器(基本上就是我在这里寻找的),从一开始就是一个坏主意。这是真的吗?这个想法仅仅是一个非初学者吗?+1用于开箱思考。你是对的——vim不是作为过滤器设计的,所以使用它。你也说得对,这里的主要动机是以我设置vim的方式为文本着色。但这并不是一个关键的需求——我只是想:我来查一下Pyments。谢谢你的推荐。谢谢你给我一个很好的解释,为什么我的方法没有走远。干杯,好吧,pygmentize很酷。我希望它有更好的lexer自动检测功能,但是我可以使用一个项目。我的想法不是让它专门通过
less
,而是让我可以用某种方式将语法高亮显示应用于文本,这样我就可以在命令行上进一步处理它。比如说,如果我想做
cat file.js | grep function |
,它会帮助我突出显示,以便于阅读。对我不起作用,它只是像往常一样打开
vim
。FWIW,我不知道你的代码中哪一部分应该使vim退出。
-
使其从stdin读取,并启用
-c语法;syn=bash
似乎只是启用语法高亮显示。