用于PL/SQL的Vim errorformat/efm

用于PL/SQL的Vim errorformat/efm,vim,plsql,errorformat,Vim,Plsql,Errorformat,我正在尝试使用vim获得标准的vim:clist,:cope功能 具体来说,我正在尝试(但失败)从编译器输出捕获文件名 我可以编译PL/SQL代码(好吧,当没有错误=),我可以让errorformat获取错误消息、行号和列号,但是我不能让它获取文件名(vim需要它才能跳转到文件) 这是我能想到的最好的错误格式: :set efm=%+P[%f],%E%l/%c%m,%C%m,%Z 这是编译器的输出。它只有第一行的文件名(我尝试用+P[%f]来选择) 输出: [code/voyager

我正在尝试使用vim获得标准的vim:clist,:cope功能

具体来说,我正在尝试(但失败)从编译器输出捕获文件名

我可以编译PL/SQL代码(好吧,当没有错误=),我可以让errorformat获取错误消息、行号和列号,但是我不能让它获取文件名(vim需要它才能跳转到文件)

这是我能想到的最好的错误格式:

  :set efm=%+P[%f],%E%l/%c%m,%C%m,%Z   
这是编译器的输出。它只有第一行的文件名(我尝试用+P[%f]来选择)

输出:

[code/voyager/db/db_source/pck_policy_2.pks]

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 8 14:51:24 2009    
Copyright (c) 1982, 2005, Oracle.  All rights reserved.    
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>
Warning: Package created with compilation errors.    
SQL> Errors for PACKAGE PCK_POLICY_2:

LINE/COL ERROR
-------- --------------------------------------------------------------
21/7     PLS-00103: Encountered the symbol "EXP_PBIT_ID" when expecting
         one of the following:
         := . ) , @ % default character
         The symbol "," was substituted for "EXP_PBIT_ID" to continue.

185/1    PLS-00103: Encountered the symbol "END" when expecting one of the
         following:
         constant exception <an identifier>
         <a double-quoted delimited-identifier> table long double ref
         char time timestamp interval date binary national character
         nchar

LINE/COL ERROR
-------- -------------------------------------------------------------

SQL> Disconnected from Oracle Database 11g Enterprise Edition 
[code/voyager/db/db_source/pck_policy_2.pks]
SQL*Plus:10.2.0.1.0版-2009年9月8日星期二14:51:24生产
版权所有(c)1982年,2005年,甲骨文。保留所有权利。
连接到:
Oracle数据库11g企业版11.1.0.6.0版-生产
使用分区、OLAP、数据挖掘和实际应用程序测试选项
SQL>
警告:创建的包存在编译错误。
程序包PCK_策略_2的SQL>错误:
行/列错误
-------- --------------------------------------------------------------
21/7 PLS-00103:预期时遇到符号“EXP\u PBIT\u ID”
以下其中一项:
:=),@%默认字符
符号“”已替换为“EXP_PBIT_ID”以继续。
185/1 PLS-00103:在期望一个
以下:
恒定异常
表长双参考
字符时间戳间隔日期二进制国家字符
固定长度
行/列错误
-------- -------------------------------------------------------------
SQL>已断开与Oracle数据库11g Enterprise Edition的连接
:clist after显示已捕获错误,但不显示文件名: :clist

19:21第7列错误:PLS-00103:在预期以下情况之一时遇到符号“EXP_PBIT_ID::=),@%默认字符符号“”已替换为“EXP\u PBIT\u ID”以继续。
21:185第1列错误:PLS-00103:在预期以下情况之一时遇到符号“END”:常量异常表长双参考字符时间戳间隔日期二进制国家字符nchar
有人知道我怎样才能让它读取文件名吗

谢谢
Dave Smylie

对efm或vim或您正在尝试进行的解析一无所知,我想说您可能更幸运地执行查询以获取错误信息。查看视图
user\u errors
以收集错误信息。使用此方法以您想要的方式获取数据应该更容易。

您使用的语法在我看来还行。所以我所能提供的只是想法

  • 即使没有显示文件名,您仍然可以跳转到quickfix窗口中的正确行吗
  • 编译器是否在文件名之前生成任何输出?在%+P之前尝试了%E
  • 即使它不是您正在寻找的错误格式,您是否尝试过该插件

  • 最后,我编写了一个shellpipe脚本来过滤输出并删除所有不相关的输出,并将其余部分转换为更合理的格式。现在我的错误格式是:“filename”行##:错误消息。例如“/home/dgs/code/voyager/db/db\u source/pck\u policy\u 2.pkb”第38行:PLS-0103-遇到了符号EXC\u policy\u NOT\u FOUND和我正在使用的错误格式:set errorformat=\%f\”\line%l:\m仍然无法通过正确捕获结果-它不会跳转到任何地方。。。(看了一下oracle.vim插件-虽然afaict没有挂接到quickfix系统中)如果您已经过滤了这个,我会简化它,不使用引号,除非您已经处理了空格。此外,我认为如果你把%f放在末尾,efm可能会更宽容。“%f”转换必须检测字符串的结尾。它后面应该跟一个不能在字符串中的字符。如果%f在末尾,那么到该行末尾的所有内容都包括在内。另外,现在我想知道您使用的是什么版本的vim。gvim?不确定是否相关。。。
    19:21 col 7 error: PLS-00103: Encountered the symbol "EXP_PBIT_ID" when expecting one of the following: := . ) , @ % default character The symbol "," was substituted for "EXP_PBIT_ID" to continue.
    21:185 col 1 error: PLS-00103: Encountered the symbol "END" when expecting one of the following: constant exception <an identifier> <a double-quoted delimited-identifier> table long double ref char time timestamp interval date binary national character nchar