关于从vim命令模式使用shell管道的困惑

问题描述 投票:0回答:1

我有一个函数(写在下面;来源:TeX SX),该函数在shell中使用管道,我想在vim命令模式下使用管道。它可以从shell正常运行,但是如果在vim命令模式下输入,则会返回E34:No previous command错误。完全功劳归给TeX SX上jirislav中的this post

:| | pdflatex-错误停止src.tex | grep'^!。*'-A200 --color = always

我非常想从vim命令行中获得此shell功能,如果有人可以帮助的话。

我在vim命令模式下尝试了以下方法:

:! :| pdflatex-错误停止src.tex | grep'^!。*'-A200 --color = always

返回E34错误。没有管道会隐藏所有编译。但是,它也不会输出错误。删除2个管道中的1个也会为我返回E34错误。

我尝试了进一步的故障排除,但没有成功,下面是一些结果。对:的帮助!说

管道'|'在{cmd}中传递给shell时,您不能使用它来附加vim命令。参见:bar

和:bar说(我认为这是逃避的事情)]

'|'可用于分隔命令,因此您可以在一行中给出多个命令。如果要使用“ |”在参数中,在其前面加上“ \”。

我尝试做:bar建议的事情,即

:! :\ | pdflatex-错误停止src.tex \ | grep'^!。*'-A200 --color = always

结果是它隐藏了所有内容,包括我想看到的编译错误。因此,我得出的结论是,我不知道如何在vim命令模式下正确使用shell管道。

如果您不是LaTeX用户,则该函数仅需执行以下操作。 pdflatex将vim中发生的事情编译为pdf文件。正在演戏:! vim命令模式下的pdflatex%输出整个处理文本的列表并中断工作流程;函数中的grep会删除编译错误(如果存在)。然后,该函数应隐藏pdflatex的所有输出,除非发生编译错误,在这种情况下,它仅输出错误并以红色输出。

[如果有人愿意解释E34错误以及为什么它不起作用,也将不胜感激。

编辑1:现在,此[已解决感谢filbranden。下面附有几张图片,其中包含一个最小的示例,以后任何人都可以使用。

[vim file before inputoutput

编辑2:如果要将其保留在.vimrc文件中,则需要在grep之前转出管道,否则

vimrc文件默认认为管道是分隔符。

shell vim pdflatex
1个回答
1
投票
((Vim专业提示:每当您从Vim中收到错误时,请在错误代码上询问:!以获取有关此错误的更多上下文。)

:help的部分包含此段落:

:!中的任何!

先前的外部命令替换。但是,如果'!'前面没有反斜杠,则不会删除该反斜杠。

did在您的命令中有一个{cmd},作为!正则表达式grep的一部分,因此正在触发“历史记录”行为,试图替换为先前执行的命令。但是由于此时没有命令执行,该命令失败并显示错误。

您可以通过用反斜杠转义^!.*来解决它,Vim在将命令传递给shell之前将其删除:

:! pdflatex-错误停止src.tex | grep'^ \!。*'-A200 --color =始终

但是请注意,有更好的方法来解决此问题!让我涵盖其中一些。

使用systemlist()在Vim中运行外部命令的一种好方法是使用!函数,该函数在shell上运行该命令,捕获其输出,将其拆分为多行,然后返回带有结果输出行的List。]

所以您可以开始于:

systemlist()

然后使用Vimscript命令检查以systemlist()开头的行以向用户报告。

注意,与let latex_output = systemlist('pdflatex -halt-on-error src.tex') 不同,!的输出永远不会显示给用户(这意味着您不会切换回查看终端,可能是空白终端,执行之后就不会有一个“命中输入提示。)太好了!

但是,如果有错误,您需要将该信息提供给用户。一个很好的方法是使用:!

您可以使用systemlist()功能设置快速修复窗口的内容。

((为了获得最佳结果,您应该适当地设置quickfix window,稍后再说。)

使用vim-dispatch

如果您不喜欢运行带有外部命令的外部命令(通过setqflist()setqflist()),请执行以下操作

block Vim,直到命令执行完成,然后考虑安装'errorformat'插件-in。

它可以在后台或在单独的终端中为您执行命令,因此不会阻止您进行编辑。它还与:!命令和quickfix窗口集成。

vim-latex中的编译器配置

最后,systemlist()插件(也称为乳胶套件)具有可帮助您运行vim-dispatch和报告错误的配置。

[它包含Vim :make配置,它将vim-latex作为pdflatex程序。它还会:compiler识别:compiler字符串并识别错误的行号,因此您可以直接从快速修复列表中跳转到它们。

注意,vim-latex还具有许多其他功能来帮助您在Vim中编写LaTeX文档(除了通过编译器支持来管理输出的生成。您可能还需要检查这些其他功能。

(由于该插件具有很多功能,所以我建议您阅读整个文档以开始使用它。)

还请注意,此插件与vim-dispatch兼容(因为vim-latex提供了编译器接口,而vim-dispatch占用了它,所以如果您俩都喜欢的话,可以一起使用!

© www.soinside.com 2019 - 2024. All rights reserved.