]> code.delx.au - gnu-emacs/blobdiff - lisp/progmodes/cc-cmds.el
Amend a cache so that typing into C++ raw strings has no undue delay.
[gnu-emacs] / lisp / progmodes / cc-cmds.el
index 68075f356ab8a6c17de8433c5254b21152362ecc..f0ad2942457623612071749b30732033596c0857 100644 (file)
@@ -1,6 +1,6 @@
 ;;; cc-cmds.el --- user level commands for CC Mode
 
-;; Copyright (C) 1985, 1987, 1992-2015 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1987, 1992-2016 Free Software Foundation, Inc.
 
 ;; Authors:    2003- Alan Mackenzie
 ;;             1998- Martin Stjernholm
@@ -428,7 +428,7 @@ the function `delete-forward-p' is defined and returns non-nil, it
 deletes forward.  Otherwise it deletes backward.
 
 Note: This is the way in XEmacs to choose the correct action for the
-\[delete] key, whichever key that means.  Other flavors don't use this
+[delete] key, whichever key that means.  Other flavors don't use this
 function to control that."
   (interactive "*P")
   (if (and (fboundp 'delete-forward-p)
@@ -445,7 +445,7 @@ forward using `c-hungry-delete-forward'.  Otherwise it deletes
 backward using `c-hungry-backspace'.
 
 Note: This is the way in XEmacs to choose the correct action for the
-\[delete] key, whichever key that means.  Other flavors don't use this
+[delete] key, whichever key that means.  Other flavors don't use this
 function to control that."
   (interactive)
   (if (and (fboundp 'delete-forward-p)
@@ -1121,35 +1121,15 @@ numeric argument is supplied, or the point is inside a literal."
                           (looking-at "<<"))
                         (>= (match-end 0) final-pos)))
 
-             ;; It's a >.  Either a C++ >> operator. ......
-             (or (and (c-major-mode-is 'c++-mode)
+             ;; It's a >.  Either a template/generic terminator ...
+             (or (c-get-char-property (1- final-pos) 'syntax-table)
+                 ;; or a C++ >> operator.
+                 (and (c-major-mode-is 'c++-mode)
                       (progn
                         (goto-char (1- final-pos))
                         (c-beginning-of-current-token)
                         (looking-at ">>"))
-                      (>= (match-end 0) final-pos))
-                 ;; ...., or search back for a < which isn't already marked as an
-                 ;; opening template delimiter.
-                 (save-restriction
-                   (widen)
-                   ;; Narrow to avoid `c-forward-<>-arglist' below searching past
-                   ;; our position.
-                   (narrow-to-region (point-min) final-pos)
-                   (goto-char final-pos)
-                   (while
-                       (and
-                        (progn
-                          (c-syntactic-skip-backward "^<;}" nil t)
-                          (eq (char-before) ?<))
-                        (progn
-                          (backward-char)
-                          (looking-at "\\s\("))))
-                   (and (eq (char-after) ?<)
-                        (not (looking-at "\\s\("))
-                        (progn (c-backward-syntactic-ws)
-                               (c-simple-skip-symbol-backward))
-                        (or (looking-at c-opt-<>-sexp-key)
-                            (not (looking-at c-keywords-regexp)))))))))
+                      (>= (match-end 0) final-pos))))))
 
     (goto-char final-pos)
     (when found-delim
@@ -1157,11 +1137,9 @@ numeric argument is supplied, or the point is inside a literal."
       (when (and (eq (char-before) ?>)
                 (not executing-kbd-macro)
                 blink-paren-function)
-       ;; Currently (2014-10-19), the syntax-table text properties on < and >
-       ;; are only applied in code called during Emacs redisplay.  We thus
-       ;; explicitly cause a redisplay so that these properties have been
-       ;; applied when `blink-paren-function' gets called.
-       (sit-for 0)
+       ;; From now (2016-01-01), the syntax-table text properties on < and >
+       ;; are applied in an after-change function, not during redisplay.  Hence
+       ;; we no longer need to call (sit-for 0) for blink paren to work.
        (funcall blink-paren-function)))))
 
 (defun c-electric-paren (arg)
@@ -1317,6 +1295,9 @@ keyword on the line, the keyword is not inserted inside a literal, and
   (autoload 'c-subword-mode "cc-subword"
     "Mode enabling subword movement and editing keys." t)))
 
+(declare-function c-forward-subword "ext:cc-subword" (&optional arg))
+(declare-function c-backward-subword "ext:cc-subword" (&optional arg))
+
 ;; "nomenclature" functions + c-scope-operator.
 (defun c-forward-into-nomenclature (&optional arg)
   "Compatibility alias for `c-forward-subword'."
@@ -1377,13 +1358,13 @@ No indentation or other \"electric\" behavior is performed."
                ;; be the return type of a function, or the like.  Exclude
                ;; this case.
                (c-syntactic-re-search-forward
-                (concat "[;=\(\[{]\\|\\("
+                (concat "[;=([{]\\|\\("
                         c-opt-block-decls-with-vars-key
                         "\\)")
                 eo-block t t t)
                (match-beginning 1)     ; Is there a "struct" etc., somewhere?
                (not (eq (char-before) ?_))
-               (c-syntactic-re-search-forward "[;=\(\[{]" eo-block t t t)
+               (c-syntactic-re-search-forward "[;=([{]" eo-block t t t)
                (eq (char-before) ?\{)
                bod)))))
 
@@ -1614,12 +1595,12 @@ defun."
       (push-mark))
 
   (c-save-buffer-state
-      (beginning-of-defun-function end-of-defun-function
+      (beginning-of-defun-function
+       end-of-defun-function
        (start (point))
-       (paren-state (copy-tree (c-parse-state))) ; This must not share list
-                                       ; structure with other users of c-state-cache.
+       (paren-state (c-parse-state))
        (orig-point-min (point-min)) (orig-point-max (point-max))
-       lim                         ; Position of { which has been widened to.
+       lim                 ; Position of { which has been widened to.
        where pos case-fold-search)
 
     (save-restriction
@@ -1629,8 +1610,8 @@ defun."
 
       ;; Move back out of any macro/comment/string we happen to be in.
       (c-beginning-of-macro)
-      (setq pos (c-literal-limits))
-      (if pos (goto-char (car pos)))
+      (setq pos (c-literal-start))
+      (if pos (goto-char pos))
 
       (setq where (c-where-wrt-brace-construct))
 
@@ -1738,10 +1719,10 @@ the open-parenthesis that starts a defun; see `beginning-of-defun'."
       (push-mark))
 
   (c-save-buffer-state
-      (beginning-of-defun-function end-of-defun-function
+      (beginning-of-defun-function
+       end-of-defun-function
        (start (point))
-       (paren-state (copy-tree (c-parse-state))) ; This must not share list
-                                 ; structure with other users of c-state-cache.
+       (paren-state (c-parse-state))
        (orig-point-min (point-min)) (orig-point-max (point-max))
        lim
        where pos case-fold-search)
@@ -1753,8 +1734,8 @@ the open-parenthesis that starts a defun; see `beginning-of-defun'."
 
       ;; Move back out of any macro/comment/string we happen to be in.
       (c-beginning-of-macro)
-      (setq pos (c-literal-limits))
-      (if pos (goto-char (car pos)))
+      (setq pos (c-literal-start))
+      (if pos (goto-char pos))
 
       (setq where (c-where-wrt-brace-construct))
 
@@ -1778,7 +1759,7 @@ the open-parenthesis that starts a defun; see `beginning-of-defun'."
 
       ;; Do we need to move forward from the brace to the semicolon?
       (when (eq arg 0)
-       (if (c-in-function-trailer-p) ; after "}" of struct/enum, etc.
+       (if (c-in-function-trailer-p)   ; after "}" of struct/enum, etc.
            (c-syntactic-re-search-forward ";"))
 
        (setq pos (point))
@@ -1806,14 +1787,14 @@ with a brace block."
   (c-save-buffer-state
       (beginning-of-defun-function end-of-defun-function
        where pos name-end case-fold-search)
+
     (save-restriction
       (widen)
       (save-excursion
        ;; Move back out of any macro/comment/string we happen to be in.
        (c-beginning-of-macro)
-       (setq pos (c-literal-limits))
-       (if pos (goto-char (car pos)))
+       (setq pos (c-literal-start))
+       (if pos (goto-char pos))
 
        (setq where (c-where-wrt-brace-construct))
 
@@ -1899,103 +1880,103 @@ with a brace block."
        (or (save-restriction
              (c-narrow-to-most-enclosing-decl-block nil)
 
-    ;; Note: Some code duplication in `c-beginning-of-defun' and
-    ;; `c-end-of-defun'.
-    (catch 'exit
-      (let ((start (point))
-           (paren-state (c-parse-state))
-           lim pos end-pos)
-       (unless (c-safe
-                 (goto-char (c-least-enclosing-brace paren-state))
+             ;; Note: Some code duplication in `c-beginning-of-defun' and
+             ;; `c-end-of-defun'.
+             (catch 'exit
+               (let ((start (point))
+                     (paren-state (c-parse-state))
+                     lim pos end-pos)
+                 (unless (c-safe
+                           (goto-char (c-least-enclosing-brace paren-state))
                            ;; If we moved to the outermost enclosing paren
                            ;; then we can use c-safe-position to set the
                            ;; limit. Can't do that otherwise since the
                            ;; earlier paren pair on paren-state might very
                            ;; well be part of the declaration we should go
                            ;; to.
-                 (setq lim (c-safe-position (point) paren-state))
-                 t)
-         ;; At top level.  Make sure we aren't inside a literal.
-         (setq pos (c-literal-limits
-                    (c-safe-position (point) paren-state)))
-         (if pos (goto-char (car pos))))
-
-       (when (c-beginning-of-macro)
-         (throw 'exit
-                (cons (point)
-                      (save-excursion
-                        (c-end-of-macro)
-                        (forward-line 1)
-                        (point)))))
+                           (setq lim (c-safe-position (point) paren-state))
+                           t)
+                   ;; At top level.  Make sure we aren't inside a literal.
+                   (setq pos (c-literal-start
+                              (c-safe-position (point) paren-state)))
+                   (if pos (goto-char pos)))
+
+                 (when (c-beginning-of-macro)
+                   (throw 'exit
+                          (cons (point)
+                                (save-excursion
+                                  (c-end-of-macro)
+                                  (forward-line 1)
+                                  (point)))))
 
-       (setq pos (point))
-       (when (or (eq (car (c-beginning-of-decl-1 lim)) 'previous)
-                 (= pos (point)))
-         ;; We moved back over the previous defun.  Skip to the next
-         ;; one.  Not using c-forward-syntactic-ws here since we
-         ;; should not skip a macro.  We can also be directly after
-         ;; the block in a `c-opt-block-decls-with-vars-key'
-         ;; declaration, but then we won't move significantly far
-         ;; here.
-         (goto-char pos)
-         (c-forward-comments)
-
-         (when (and near (c-beginning-of-macro))
-           (throw 'exit
-                  (cons (point)
-                        (save-excursion
-                          (c-end-of-macro)
-                          (forward-line 1)
-                          (point))))))
-
-       (if (eobp) (throw 'exit nil))
-
-       ;; Check if `c-beginning-of-decl-1' put us after the block in a
-       ;; declaration that doesn't end there.  We're searching back and
-       ;; forth over the block here, which can be expensive.
-       (setq pos (point))
-       (if (and c-opt-block-decls-with-vars-key
-                (progn
-                  (c-backward-syntactic-ws)
-                  (eq (char-before) ?}))
-                (eq (car (c-beginning-of-decl-1))
-                    'previous)
-                (save-excursion
-                  (c-end-of-decl-1)
-                  (and (> (point) pos)
-                       (setq end-pos (point)))))
-           nil
-         (goto-char pos))
-
-       (if (and (not near) (> (point) start))
-           nil
-
-         ;; Try to be line oriented; position the limits at the
-         ;; closest preceding boi, and after the next newline, that
-         ;; isn't inside a comment, but if we hit a neighboring
-         ;; declaration then we instead use the exact declaration
-         ;; limit in that direction.
-         (cons (progn
                  (setq pos (point))
-                 (while (and (/= (point) (c-point 'boi))
-                             (c-backward-single-comment)))
-                 (if (/= (point) (c-point 'boi))
-                     pos
-                   (point)))
-               (progn
-                 (if end-pos
-                     (goto-char end-pos)
-                   (c-end-of-decl-1))
+                 (when (or (eq (car (c-beginning-of-decl-1 lim)) 'previous)
+                           (= pos (point)))
+                   ;; We moved back over the previous defun.  Skip to the next
+                   ;; one.  Not using c-forward-syntactic-ws here since we
+                   ;; should not skip a macro.  We can also be directly after
+                   ;; the block in a `c-opt-block-decls-with-vars-key'
+                   ;; declaration, but then we won't move significantly far
+                   ;; here.
+                   (goto-char pos)
+                   (c-forward-comments)
+
+                   (when (and near (c-beginning-of-macro))
+                     (throw 'exit
+                            (cons (point)
+                                  (save-excursion
+                                    (c-end-of-macro)
+                                    (forward-line 1)
+                                    (point))))))
+
+                 (if (eobp) (throw 'exit nil))
+
+                 ;; Check if `c-beginning-of-decl-1' put us after the block in a
+                 ;; declaration that doesn't end there.  We're searching back and
+                 ;; forth over the block here, which can be expensive.
                  (setq pos (point))
-                 (while (and (not (bolp))
-                             (not (looking-at "\\s *$"))
-                             (c-forward-single-comment)))
-                 (cond ((bolp)
-                        (point))
-                       ((looking-at "\\s *$")
-                        (forward-line 1)
-                        (point))
-                       (t
+                 (if (and c-opt-block-decls-with-vars-key
+                          (progn
+                            (c-backward-syntactic-ws)
+                            (eq (char-before) ?}))
+                          (eq (car (c-beginning-of-decl-1))
+                              'previous)
+                          (save-excursion
+                            (c-end-of-decl-1)
+                            (and (> (point) pos)
+                                 (setq end-pos (point)))))
+                     nil
+                   (goto-char pos))
+
+                 (if (and (not near) (> (point) start))
+                     nil
+
+                   ;; Try to be line oriented; position the limits at the
+                   ;; closest preceding boi, and after the next newline, that
+                   ;; isn't inside a comment, but if we hit a neighboring
+                   ;; declaration then we instead use the exact declaration
+                   ;; limit in that direction.
+                   (cons (progn
+                           (setq pos (point))
+                           (while (and (/= (point) (c-point 'boi))
+                                       (c-backward-single-comment)))
+                           (if (/= (point) (c-point 'boi))
+                               pos
+                             (point)))
+                         (progn
+                           (if end-pos
+                               (goto-char end-pos)
+                             (c-end-of-decl-1))
+                           (setq pos (point))
+                           (while (and (not (bolp))
+                                       (not (looking-at "\\s *$"))
+                                       (c-forward-single-comment)))
+                           (cond ((bolp)
+                                  (point))
+                                 ((looking-at "\\s *$")
+                                  (forward-line 1)
+                                  (point))
+                                 (t
                                   pos))))))))
            (and (not near)
                 (goto-char (point-min))
@@ -2850,19 +2831,28 @@ sentence motion in or near comments and multiline strings."
 \f
 ;; set up electric character functions to work with pending-del,
 ;; (a.k.a. delsel) mode.  All symbols get the t value except
-;; the functions which delete, which gets 'supersede.
+;; the functions which delete, which gets 'supersede, and (from Emacs
+;; 25) `c-electric-brace' and `c-electric-paren' get special handling
+;; so as to work gracefully with `electric-pair-mode'.
 (mapc
  (function
   (lambda (sym)
     (put sym 'delete-selection t)      ; for delsel (Emacs)
     (put sym 'pending-delete t)))      ; for pending-del (XEmacs)
  '(c-electric-pound
-   c-electric-brace
    c-electric-slash
    c-electric-star
    c-electric-semi&comma
    c-electric-lt-gt
-   c-electric-colon
+   c-electric-colon))
+(mapc
+ (function
+  (lambda (sym)
+    (put sym 'delete-selection (if (fboundp 'delete-selection-uses-region-p)
+                                  'delete-selection-uses-region-p
+                                t))
+    (put sym 'pending-delete t)))
+ '(c-electric-brace
    c-electric-paren))
 (put 'c-electric-delete    'delete-selection 'supersede) ; delsel
 (put 'c-electric-delete    'pending-delete   'supersede) ; pending-del
@@ -3409,7 +3399,7 @@ Otherwise reindent just the current line."
       (if (< c-progress-interval (- now lastsecs))
          (progn
            (message "Indenting region... (%d%% complete)"
-                    (/ (* 100 (- (point) start)) (- end start)))
+                    (floor (* 100.0 (- (point) start)) (- end start)))
            (aset c-progress-info 2 now)))
       )))
 
@@ -4443,7 +4433,7 @@ is in situations like the following:
 
 char description[] = \"\\
 A very long description of something that you want to fill to make
-nicely formatted output.\"\;
+nicely formatted output.\";
 
 If point is in any other situation, i.e. in normal code, do nothing.
 
@@ -4757,8 +4747,8 @@ normally bound to C-o.  See `c-context-line-break' for the details."
 \f
 (cc-provide 'cc-cmds)
 
-;;; Local Variables:
-;;; indent-tabs-mode: t
-;;; tab-width: 8
-;;; End:
+;; Local Variables:
+;; indent-tabs-mode: t
+;; tab-width: 8
+;; End:
 ;;; cc-cmds.el ends here