X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/821b6002127fba1e5b57d39e63eabd0ae189f6af..2aa6b47e3e216410195cf7ec3abb5902f38082fa:/lisp/progmodes/cc-cmds.el?ds=sidebyside diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el index 68075f356a..59f2729c43 100644 --- a/lisp/progmodes/cc-cmds.el +++ b/lisp/progmodes/cc-cmds.el @@ -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 @@ -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) @@ -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,7 +1787,7 @@ 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 @@ -2850,19 +2831,28 @@ sentence motion in or near comments and multiline strings." ;; 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." (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