bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#15089: awk-mode indentation of line after /= statement with comment


From: Alan Mackenzie
Subject: bug#15089: awk-mode indentation of line after /= statement with comment
Date: Sat, 17 Aug 2013 16:00:24 +0000
User-agent: Mutt/1.5.21 (2010-09-15)

Hi, Glenn.

On Tue, Aug 13, 2013 at 03:08:18PM -0400, Glenn Morris wrote:
> Package: emacs,cc-mode
> Version: 24.3
> Severity: minor

> emacs -Q foo.awk

> Enter buffer contents:

> #!/usr/bin/gawk -f
> BEGIN {
>    x = 4
>    x /= 2    # comment
>         y = 3
>    print x, y
> }

> Use TAB to indent each line. The "y =" line is indented too much.
> No such problem with +=, -=, etc; only with /=. And only if a comment
> after if (actually, only if whitespace after "/= 2", it seems).

The following patch should fix the bug.  A simple recompilation of
cc-{awk,engine}.el is OK.  Would you try it out, please.  Thanks!



=== modified file 'lisp/progmodes/cc-awk.el'
*** lisp/progmodes/cc-awk.el    2013-02-02 06:04:06 +0000
--- lisp/progmodes/cc-awk.el    2013-08-17 15:49:19 +0000
***************
*** 169,177 ****
    (concat "\\=_?\"" c-awk-string-innards-re))
  ;;   Matches an AWK string at point up to, but not including, any terminator.
  ;; A gawk 3.1+ string may look like _"localizable string".
! (defconst c-awk-one-line-possibly-open-string-re
!   (concat "\"\\(" c-awk-string-ch-re "\\|" c-awk-non-eol-esc-pair-re "\\)*"
!         "\\(\"\\|\\\\?$\\|\\'\\)"))
  
  ;; REGEXPS FOR AWK REGEXPS.
  (defconst c-awk-regexp-normal-re "[^[/\\\n\r]")
--- 169,177 ----
    (concat "\\=_?\"" c-awk-string-innards-re))
  ;;   Matches an AWK string at point up to, but not including, any terminator.
  ;; A gawk 3.1+ string may look like _"localizable string".
! (defconst c-awk-possibly-open-string-re
!   (concat "\"\\(" c-awk-string-ch-re "\\|" c-awk-esc-pair-re "\\)*"
!         "\\(\"\\|$\\|\\'\\)"))
  
  ;; REGEXPS FOR AWK REGEXPS.
  (defconst c-awk-regexp-normal-re "[^[/\\\n\r]")
***************
*** 192,216 ****
          "\\|" "[^]\n\r]" "\\)*" "\\(]\\|$\\)"))
  ;;   Matches a regexp char list, up to (but not including) EOL if the ] is
  ;;   missing.
- (defconst c-awk-regexp-one-line-possibly-open-char-list-re
-   (concat "\\[\\]?\\(" c-awk-non-eol-esc-pair-re "\\|" "[^]\n\r]" "\\)*"
-         "\\(]\\|\\\\?$\\|\\'\\)"))
- ;;   Matches the head (or all) of a regexp char class, up to (but not
- ;;   including) the first EOL.
  (defconst c-awk-regexp-innards-re
    (concat "\\(" c-awk-esc-pair-re "\\|" c-awk-regexp-char-list-re
!           "\\|" c-awk-regexp-normal-re "\\)*"))
  ;;   Matches the inside of an AWK regexp (i.e. without the enclosing /s)
  (defconst c-awk-regexp-without-end-re
    (concat "/" c-awk-regexp-innards-re))
  ;; Matches an AWK regexp up to, but not including, any terminating /.
- (defconst c-awk-one-line-possibly-open-regexp-re
-   (concat "/\\(" c-awk-non-eol-esc-pair-re
-         "\\|" c-awk-regexp-one-line-possibly-open-char-list-re
-         "\\|" c-awk-regexp-normal-re "\\)*"
-         "\\(/\\|\\\\?$\\|\\'\\)"))
- ;; Matches as much of the head of an AWK regexp which fits on one line,
- ;; possibly all of it.
  
  ;; REGEXPS used for scanning an AWK buffer in order to decide IF A '/' IS A
  ;; REGEXP OPENER OR A DIVISION SIGN.  By "state" in the following is meant
--- 192,204 ----
          "\\|" "[^]\n\r]" "\\)*" "\\(]\\|$\\)"))
  ;;   Matches a regexp char list, up to (but not including) EOL if the ] is
  ;;   missing.
  (defconst c-awk-regexp-innards-re
    (concat "\\(" c-awk-esc-pair-re "\\|" c-awk-regexp-char-list-re
!         "\\|" c-awk-regexp-normal-re "\\)*"))
  ;;   Matches the inside of an AWK regexp (i.e. without the enclosing /s)
  (defconst c-awk-regexp-without-end-re
    (concat "/" c-awk-regexp-innards-re))
  ;; Matches an AWK regexp up to, but not including, any terminating /.
  
  ;; REGEXPS used for scanning an AWK buffer in order to decide IF A '/' IS A
  ;; REGEXP OPENER OR A DIVISION SIGN.  By "state" in the following is meant
***************
*** 262,276 ****
  
  ;; REGEXPS USED FOR FINDING THE POSITION OF A "virtual semicolon"
  (defconst c-awk-_-harmless-nonws-char-re "[^#/\"\\\\\n\r \t]")
! ;; NEW VERSION!  (which will be restricted to the current line)
! (defconst c-awk-one-line-non-syn-ws*-re
!   (concat "\\([ \t]*"
!               "\\(" c-awk-_-harmless-nonws-char-re "\\|"
!                   c-awk-non-eol-esc-pair-re "\\|"
!                   c-awk-one-line-possibly-open-string-re "\\|"
!                   c-awk-one-line-possibly-open-regexp-re
!             "\\)"
!           "\\)*"))
  
  
  ;; ACM, 2002/5/29:
--- 250,273 ----
  
  ;; REGEXPS USED FOR FINDING THE POSITION OF A "virtual semicolon"
  (defconst c-awk-_-harmless-nonws-char-re "[^#/\"\\\\\n\r \t]")
! (defconst c-awk-non-/-syn-ws*-re
!   (concat
!    "\\(" c-awk-escaped-nls*-with-space*
!          "\\(" c-awk-_-harmless-nonws-char-re "\\|"
!                c-awk-non-eol-esc-pair-re "\\|"
!              c-awk-possibly-open-string-re
!          "\\)"
!    "\\)*"))
! (defconst c-awk-space*-/-re (concat c-awk-escaped-nls*-with-space* "/"))
! ;; Matches optional whitespace followed by "/".
! (defconst c-awk-space*-regexp-/-re
!   (concat c-awk-escaped-nls*-with-space* "\\s\""))
! ;; Matches optional whitespace followed by a "/" with string syntax (a matched
! ;; regexp delimiter).
! (defconst c-awk-space*-unclosed-regexp-/-re
!   (concat c-awk-escaped-nls*-with-space* "\\s\|"))
! ;; Matches optional whitespace followed by a "/" with string fence syntax (an
! ;; unmatched regexp delimiter).
  
  
  ;; ACM, 2002/5/29:
***************
*** 549,558 ****
  (defun c-awk-at-vsemi-p (&optional pos)
    ;; Is there a virtual semicolon at POS (or POINT)?
    (save-excursion
!     (let (nl-prop
!         (pos-or-point (progn (if pos (goto-char pos)) (point))))
!       (forward-line 0)
!       (search-forward-regexp c-awk-one-line-non-syn-ws*-re)
        (and (eq (point) pos-or-point)
           (progn
             (while (and (eq (setq nl-prop (c-awk-get-NL-prop-cur-line)) ?\\)
--- 546,581 ----
  (defun c-awk-at-vsemi-p (&optional pos)
    ;; Is there a virtual semicolon at POS (or POINT)?
    (save-excursion
!     (let* (nl-prop
!          (pos-or-point (progn (if pos (goto-char pos)) (point)))
!          (bol (c-point 'bol)) (eol (c-point 'eol)))
!       (c-awk-beginning-of-logical-line)
!       ;; Next `while' goes round one logical line (ending in, e.g. "\\") per
!       ;; iteration.  Such a line is rare, and can only be an open string
!       ;; ending in an escaped \.
!       (while
!         (progn
!           ;; Next `while' goes over a division sign or /regexp/ per iteration.
!           (while
!               (and
!                (< (point) eol)
!                (progn
!                  (search-forward-regexp c-awk-non-/-syn-ws*-re eol)
!                  (looking-at c-awk-space*-/-re)))
!             (cond
!              ((looking-at c-awk-space*-regexp-/-re) ; /regexp/
!               (forward-sexp))
!              ((looking-at c-awk-space*-unclosed-regexp-/-re) ; Unclosed 
/regexp
!               (condition-case nil
!                   (progn
!                     (forward-sexp)
!                     (backward-char))  ; Move to end of (logical) line.
!                 (error (end-of-line)))) ; Happens at EOB.
!              (t                       ; division sign
!               (c-forward-syntactic-ws)
!               (forward-char))))
!           (< (point) bol))
!       (forward-line))
        (and (eq (point) pos-or-point)
           (progn
             (while (and (eq (setq nl-prop (c-awk-get-NL-prop-cur-line)) ?\\)

=== modified file 'lisp/progmodes/cc-engine.el'
*** lisp/progmodes/cc-engine.el 2013-07-27 12:07:43 +0000
--- lisp/progmodes/cc-engine.el 2013-08-17 15:46:12 +0000
***************
*** 1271,1276 ****
--- 1271,1279 ----
              (throw 'done (point)))))
          ;; In trailing space after an as yet undetected virtual semicolon?
          (c-backward-syntactic-ws from)
+         (when (and (bolp) (not (bobp))) ; Can happen in AWK Mode with an
+                                         ; unterminated string/regexp.
+           (backward-char))
          (if (and (< (point) to)
                   (c-at-vsemi-p))
              (point)



-- 
Alan Mackenzie (Nuremberg, Germany).





reply via email to

[Prev in Thread] Current Thread [Next in Thread]