diff options
author | João Távora <joaotavora@gmail.com> | 2019-01-21 12:59:02 +0000 |
---|---|---|
committer | João Távora <joaotavora@gmail.com> | 2019-01-21 12:59:02 +0000 |
commit | 7c0d312bcbb0fc52b4a58de549d8b249cc8410c7 (patch) | |
tree | 68397251d9071485ad5aff5f11dc22ffb51be7ef | |
parent | 6bac9ea1770c0954adf5f4af660e94b5a0b09003 (diff) | |
download | emacs-scratch/resolve-cc-mode-and-e-p-m.tar.gz |
Properly solve incompatibility between e-p-m, e-l-m and cc-modescratch/resolve-cc-mode-and-e-p-m
* lisp/progmodes/cc-cmds.el (c--disable-fix-of-bug-33794): Remove.
(c--with-post-self-insert-hook-maybe): Remove.
(c-self-insert-command): New function.
(c-electric-pound, c-electric-brace, c-electric-slash)
(c-electric-star, c-electric-lt-gt, c-electric-paren): Use it.
* test/lisp/electric-tests.el (c--disable-fix-of-bug-33794):
Remove.
(electric-layout-int-main-kernel-style)
(electric-layout-int-main-allman-style): Don't set
c--disable-fix-of-bug-33794.
-rw-r--r-- | lisp/progmodes/cc-cmds.el | 107 | ||||
-rw-r--r-- | test/lisp/electric-tests.el | 6 |
2 files changed, 46 insertions, 67 deletions
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el index 6b0d9617667..c54d3894709 100644 --- a/lisp/progmodes/cc-cmds.el +++ b/lisp/progmodes/cc-cmds.el @@ -485,19 +485,13 @@ function to control that." (c-hungry-delete-forward) (c-hungry-delete-backwards))) -(defvar c--disable-fix-of-bug-33794 nil - "If non-nil disable alans controversional fix of 33794. -This fix breaks most features of `electric-pair-mode' by -incompletely reimplementing in in this mode.") - -(defmacro c--with-post-self-insert-hook-maybe (&rest body) - `(let ((post-self-insert-hook - (if c--disable-fix-of-bug-33794 - post-self-insert-hook - ;; Acording to AM: Disable random functionality to get - ;; defined functionality from `self-insert-command' - nil))) - ,@body)) +(defun c-self-insert-command (arg) + ;; If `c-auto-newline' is on we use our own implementation of + ;; `electric-pair-mode' and `electric-layout-mode' doesn't make + ;; sense. + (let ((electric-layout-mode (not c-auto-newline)) + (electric-pair-mode (not c-auto-newline))) + (self-insert-command arg))) (defun c-electric-pound (arg) "Insert a \"#\". @@ -518,8 +512,7 @@ inside a literal or a macro, nothing special happens." (eq (char-before) ?\\)))) (c-in-literal))) ;; do nothing special - (c--with-post-self-insert-hook-maybe - (self-insert-command (prefix-numeric-value arg))) + (c-self-insert-command (prefix-numeric-value arg)) ;; place the pound character at the left edge (let ((pos (- (point-max) (point))) (bolp (bolp))) @@ -871,37 +864,35 @@ settings of `c-cleanup-list' are done." ;; Insert the brace. Note that expand-abbrev might reindent ;; the line here if there's a preceding "else" or something. - (c--with-post-self-insert-hook-maybe - (self-insert-command (prefix-numeric-value arg))) + (c-self-insert-command (prefix-numeric-value arg)) ;; Emulate `electric-pair-mode'. - (unless c--disable-fix-of-bug-33794 - (when (and (boundp 'electric-pair-mode) - electric-pair-mode) - (let ((size (buffer-size)) - (c-in-electric-pair-functionality t) - post-self-insert-hook) - (electric-pair-post-self-insert-function) - (setq got-pair-} (and at-eol - (eq (c-last-command-char) ?{) - (eq (char-after) ?})) - electric-pair-deletion (< (buffer-size) size)))) - - ;; Perform any required CC Mode electric actions. - (cond - ((or literal arg (not c-electric-flag) active-region)) - ((not at-eol) - (c-indent-line)) - (electric-pair-deletion - (c-indent-line) - (c-do-brace-electrics 'ignore nil)) - (t (c-do-brace-electrics nil nil) - (when got-pair-} - (save-excursion - (forward-char) - (c-do-brace-electrics 'assume 'ignore)) - (c-indent-line))))) - + (when (and (boundp 'electric-pair-mode) + electric-pair-mode + c-auto-newline) + (let ((size (buffer-size)) + (c-in-electric-pair-functionality t) + post-self-insert-hook) + (electric-pair-post-self-insert-function) + (setq got-pair-} (and at-eol + (eq (c-last-command-char) ?{) + (eq (char-after) ?})) + electric-pair-deletion (< (buffer-size) size)))) + + ;; Perform any required CC Mode electric actions. + (cond + ((or literal arg (not c-electric-flag) active-region)) + ((not at-eol) + (c-indent-line)) + (electric-pair-deletion + (c-indent-line) + (c-do-brace-electrics 'ignore nil)) + (t (c-do-brace-electrics nil nil) + (when got-pair-} + (save-excursion + (forward-char) + (c-do-brace-electrics 'assume 'ignore)) + (c-indent-line)))) ;; blink the paren @@ -960,8 +951,7 @@ is inhibited." c-electric-flag (eq (c-last-command-char) ?/) (eq (char-before) (if literal ?* ?/)))) - (c--with-post-self-insert-hook-maybe - (self-insert-command (prefix-numeric-value arg))) + (c-self-insert-command (prefix-numeric-value arg)) (if indentp (indent-according-to-mode)))) @@ -974,8 +964,7 @@ supplied, point is inside a literal, or `c-syntactic-indentation' is nil, this indentation is inhibited." (interactive "*P") - (c--with-post-self-insert-hook-maybe - (self-insert-command (prefix-numeric-value arg))) + (c-self-insert-command (prefix-numeric-value arg)) ;; if we are in a literal, or if arg is given do not reindent the ;; current line, unless this star introduces a comment-only line. (if (c-save-buffer-state () @@ -1022,8 +1011,7 @@ settings of `c-cleanup-list'." (setq lim (c-most-enclosing-brace (c-parse-state)) literal (c-in-literal lim))) - (c--with-post-self-insert-hook-maybe - (self-insert-command (prefix-numeric-value arg))) + (c-self-insert-command (prefix-numeric-value arg)) (if (and c-electric-flag (not literal) (not arg)) ;; do all cleanups and newline insertions if c-auto-newline is on. @@ -1092,8 +1080,7 @@ reindented unless `c-syntactic-indentation' is nil. newlines is-scope-op ;; shut this up (c-echo-syntactic-information-p nil)) - (c--with-post-self-insert-hook-maybe - (self-insert-command (prefix-numeric-value arg))) + (c-self-insert-command (prefix-numeric-value arg)) ;; Any electric action? (if (and c-electric-flag (not literal) (not arg)) ;; Unless we're at EOL, only re-indentation happens. @@ -1186,8 +1173,7 @@ numeric argument is supplied, or the point is inside a literal." (let ((c-echo-syntactic-information-p nil) final-pos found-delim case-fold-search) - (c--with-post-self-insert-hook-maybe - (self-insert-command (prefix-numeric-value arg))) + (c-self-insert-command (prefix-numeric-value arg)) (setq final-pos (point)) ;;;; 2010-01-31: There used to be code here to put a syntax-table text @@ -1252,8 +1238,7 @@ newline cleanups are done if appropriate; see the variable `c-cleanup-list'." ;; shut this up (c-echo-syntactic-information-p nil) case-fold-search) - (c--with-post-self-insert-hook-maybe - (self-insert-command (prefix-numeric-value arg))) + (c-self-insert-command (prefix-numeric-value arg)) (if (and (not arg) (not literal)) (let* ( ;; We want to inhibit blinking the paren since this will @@ -1303,11 +1288,11 @@ newline cleanups are done if appropriate; see the variable `c-cleanup-list'." (insert-and-inherit "} catch ("))) ;; Apply `electric-pair-mode' stuff. - (unless c--disable-fix-of-bug-33794 - (when (and (boundp 'electric-pair-mode) - electric-pair-mode) - (let (post-self-insert-hook) - (electric-pair-post-self-insert-function)))) + (when (and c-auto-newline + (boundp 'electric-pair-mode) + electric-pair-mode) + (let (post-self-insert-hook) + (electric-pair-post-self-insert-function))) ;; Check for clean-ups at function calls. These two DON'T need ;; `c-electric-flag' or `c-syntactic-indentation' set. diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el index b55d889f0b5..5a4b20ed04e 100644 --- a/test/lisp/electric-tests.el +++ b/test/lisp/electric-tests.el @@ -47,14 +47,10 @@ (declare (indent defun) (debug t)) `(call-with-saved-electric-modes #'(lambda () ,@body))) -;; Defined in lisp/progmodes/cc-cmds.el -(defvar c--disable-fix-of-bug-33794 t) - (defun electric-pair-test-for (fixture where char expected-string expected-point mode bindings fixture-fn) (with-temp-buffer (funcall mode) - (setq-local c--disable-fix-of-bug-33794 t) (insert fixture) (save-electric-modes (let ((last-command-event char) @@ -825,7 +821,6 @@ baz\"\"" (electric-layout-local-mode 1) (electric-pair-local-mode 1) (electric-indent-local-mode 1) - (setq-local c--disable-fix-of-bug-33794 t) (setq-local electric-layout-rules '((?\{ . (after-stay after)))) (insert "int main () ") @@ -839,7 +834,6 @@ baz\"\"" (electric-layout-local-mode 1) (electric-pair-local-mode 1) (electric-indent-local-mode 1) - (setq-local c--disable-fix-of-bug-33794 t) (setq-local electric-layout-rules '((?\{ . (before after-stay after)))) (insert "int main () ") |