2013-10-30 32 views
10

我想要一个命令,我可以插入命令管道,根据vim的语法突出显示功能将颜色转义添加到其输入。如何在管道中使用vim对文本着色?

例如:

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

所得到的文本将是somefile.js的,但着色根据当前的vim配置将如何做到这一点在编辑器中。

发生在我身上的是,这个必须是可能的。我同意,在那里的例子不是什么一个理智的人可能完全叫有用的,但这并不意味着从来没有是。

+1

有一个pygmentize就是其中之一。我从来没有见过vim做到这一点。 – carlosdc

+0

Hrm .. [This thread](http://stackoverflow.com/questions/3219479/vim-write-buffer-content-to-stdout)虽然评价很低,但似乎建议尝试使用vim作为过滤器(基本上是我在这里寻找的),从一开始就是一个坏主意。真的吗?这个想法只是一个不起眼的东西吗? –

+2

+1用于开箱即用的思考。 – steveha

回答

4

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

显然vim能够做语法高亮显示。但是我敢打赌你会得到一个冰激凌,如果你可以设法让vim来处理文本并处理它,你就不会喜欢这个结果。

考虑当通过more(或者如果您喜欢less)管道文本时会发生什么情况。当它到达终端时,这些程序会显示一个屏幕并等待您点击空格键。但是,如果您将stdout重定向到终端以外的其他位置,这些程序会注意到这一点,并简单地将其输入复制到其输出不变。

如果vim没有注意到你是通过管道传输文本,它很可能会发送光标移动命令,而这些命令在输出中可能不需要。如果vim注意到,它可能只是传递文本,而不是语法颜色。只有vim确实做了语法着色,但不注入光标移动的东西,你的想法才能工作。

你可以试试。以下是通过vim的讨论管道的东西答案:

Execute a command within Vim from the command line

但我说为什么不能管通过设计和预期具有文本通过它的管道程序文本? Pygments可以对每种主要的编程语言和标记格式进行着色。

http://pygments.org/

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

+1

你是对的 - vim并没有被设计成一个过滤器,所以使用的东西是。你也是对的,这里的主要动机是按照我设置* vim *的方式对文本进行着色。但这不是一个关键的需求 - 我只是*想*。 :)我会检查Pygments。感谢您的建议。并感谢一个很好的解释,为什么我没有采取我的方法太远。干杯。 –

+0

好的,pygmentize是非常酷的。我希望它有更好的词法分析器自动检测,但我可以使用一个项目.. –

1

有一个名为Text :: VimColor的Perl模块,我听说它会做你想要的。

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

但让我想问:为什么要这要经过少?为什么不使用vim作为一个完美的文件查看器? view -将以只读模式从标准输入读取。

+0

这个想法并不是它特别通过'less'去,但是我可以有一些应用语法突出显示到文本的方式,我可以在命令行上进一步处理它。比如说,如果我想做'cat file.js | grep函数| ',如果显示我突出显示,则更容易阅读。 –

1

vim安装已经包括了VIM寻呼机/ colorizer脚本,它可以在这里找到:

https://githucat /usr/share/vim/vim73/macros/{less.sh,less.vim} 

就个人而言,我使用 https://github.com/rkitover/vimpager

具有vimcatvimpager,这做你认为他们会做的事。

0

这可能是你以后

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

这是丑陋的,但你可以别名此:

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

然后,使用这样的:

cat filename.sh | vim.sh -