Subject: compilation-error-regexp-alist just assumes columns not characters

From: [email-masked]
Date: Sat, 10 Dec 2011 04:18:12 +0800

Gentlemen, why does *compilation* say

  basex -b y=3 TaiwanAMFMSW.xq
  Stopped at line 57, column 29 in /home/jidanni/millerliu/xquery/TaiwanAMFMSW.xq:
  [XPST0003] Expecting "return", found "r".

But the cursor upon next-error ends up at

        case "TaiwanAMFMSW_by_band" retrun let $K:= "AM/FM/SW" return ()
                            ^      ^
                            A, not B       if those blanks at front were a TAB.

Well that is because on
   (describe-variable (quote compilation-error-regexp-alist))
there is nary a mention of what to do when the compiler making the
message is counting characters (TAB=1) and emacs is thinking it is
counting columns (TAB=8, etc.).

All we see is
  COLUMN can also be of the form (COLUMN . END-COLUMN) meaning a range of
  columns starting on LINE and ending on END-LINE, if that matched.

There is no way to communicate to emacs that this certain compiler does
not know how many columns a TAB equals in emacs, and is just reporting a
character count from the last newline.

So one is forced to untabify ones source files!

So it seems that compilation-error-regexp-alist needs an extra parameter
to tell if we are just counting characters or actually counting columns.

P.S., guess what happens when there are wide characters involved,

        case "補補補TaiwanAMFMSW_by_band" retrun let $K:= "AM/FM/SW" return ()

you guessed it!

How can I tell emacs in
   (add-to-list 'compilation-error-regexp-alist-alist
   '(basex "^Stopped at line \\([0-9]+\\), column \\([0-9]+\\) in \\(.*?\\):$" 3 1 2))
     (add-to-list 'compilation-error-regexp-alist 'basex)
that "column" means "char"?