长文件路径在 Vim 快速修复窗口中被分解为多行,例如不允许跳转到 qf 中显示的错误位置。
文件(以及周围的行(在快速修复窗口中显示为(示例是neomake pdflatex的输出(
|| Enter file name:
|| /long/path/to/file/.../loca
tionOfTexFiles/myTexFile.tex|144 error| Emergency stop.
|| read
为了能够通过 lnext/cnext 跟踪文件行,我应该有
/long/path/to/file/.../locationOfTexFiles/myTexFile.tex|144 error| Emergency stop.
对于快速修复文件,我有以下相关的(在我看来(设置,这些设置设置为:
setlocal nolinebreak
setlocal nowrap
setlocal textwidth=9999
所以我想知道如何在快速修复窗口中的一行中显示文件路径?
在:make
上,Vim 调用'makeprg'
,捕获输出,然后根据'errorformat'
进行解析。后者确实支持多行错误消息 (cp.:help errorformat-multi-line
(,但这主要用于编译器指定的我所谓的有意换行符。您遭受的是由于换行(由于路径过长(而导致的意外换行。
现在,我不知道"neomake pdflatex",但看起来该工具创建了换行符,而不应该,因为 Vim 正在捕获输出,并且没有接收终端(或用户(。朝这个方向调查(或在项目的跟踪器上打开问题(可能会有所帮助。
前面提到的 Vim 选项('linebreak'
、'wrap'
等(与它无关。它们适用于普通缓冲液;这样的快速修复缓冲区是不可修改的。
解决方法
一种可能的解决方法可能是首先:cd
到"更接近"已处理文件(甚至:set autochdir
(的目录;这可能会避免输出中的长路径。
或者,您可以通过在编译器后添加sed
阶段来"解开"输出:
let &makeprg .= "| sed -e 's/.../...'"
如果我没记错的话,问题出在pdflatex方面。||
标记是一个很好的指示:每个输出行都有一个 - 如果文件名和/或行号被识别,它们将被送入条形之间。
所以。这意味着您需要一种方法来修复路径名。最好在 vim 之外进行。我并不是说这是微不足道的。我只是说,如果你有一个能够修复pdflatex输出的程序,那么你离解决方案只有一个管道(加上错误代码的正确转发......
如果你更喜欢在 vim 脚本中实现它,这是可能的。但你会遇到副作用。在我的 BuildToolsWrapper 插件中,我可以在 vim 端对编译输出进行后处理,但结果远非完美。我正在处理getqflist()
结果,并解析每一行。当我找到要修复文件名的行时,不仅仅是修复文件名,还要为其分配有效的缓冲区编号。请参阅此函数,我可以在其中用另一个文件名替换文件名。魔术发生在使用lh#buffer#get_nr()
的地方。您仍然需要实现一个能够合并拆分文件名的 vim 脚本。
IOW:我的理解是vim不参与。它可以用来解决这个问题,但IMO这不是更容易采取的途径。