diff options
author | João Távora <joaotavora@gmail.com> | 2019-01-22 15:46:56 +0000 |
---|---|---|
committer | João Távora <joaotavora@gmail.com> | 2019-01-22 16:42:43 +0000 |
commit | fd943124439b7644392919bca8bc2a77e6316d92 (patch) | |
tree | 22fa8a1103239088dbd7dae9cd0c5974e5f72ebc /test/lisp/electric-tests.el | |
parent | 6ca4626c9fe33f78df685b4df7aca88abb272118 (diff) | |
download | emacs-fd943124439b7644392919bca8bc2a77e6316d92.tar.gz |
electric-layout-mode kicks in before electric-pair-mode
This aims to solve problems with indentation. Previously in, say, a
js-mode buffer with electric-layout-rules set to
(?\{ before after)
(?\} before)
would produce an intended:
function ()
{
<indented point>
}
The initial state
function () {
Would go immediately to the following by e-p-m
function () {}
Only then would e-l-m be applied to } first, and then again to {.
This makes lines indent in the wrong order, which can be a problem in
some modes.
The way we fix this is by reversing the order of e-p-m and e-l-m in
the post-self-insert-hook (and also fixing a number of details that
this uncovered). In the end this changes the sequence from
function () {
By way of e-l-m becomes:
function () <newline>
{
<newline>
The e-p-m inserts the pair
function () <newline>
{
<newline>}
And then e-l-m kicks in for the pair again, yielding the desired result
function () <newline>
{
<indented point>
}
* lisp/elec-pair.el (electric-pair--insert): Bind
electric-layout-no-duplicate-newlines.
(electric-pair-inhibit-if-helps-balance)
(electric-pair-skip-if-helps-balance): Use insert-before-markers,
playing nice with save-excurion.
(electric-pair-post-self-insert-function): Go to correct position
before checking electric-pair-inhibit-predicate and
electric-pair-skip-self predicate.
(electric-pair-post-self-insert-function): Increase priority to
50.
* lisp/electric.el (electric-indent-post-self-insert-function):
Delete trailing space in reindented line only if line was
really reindented. Rewrite comment.
(electric-layout-allow-duplicate-newlines): New variable.
(electric-layout-post-self-insert-function-1): Rewrite comments.
Honours electric-layout-allow-duplicate-newlines. Don't reindent
previous line because racecar.
* test/lisp/electric-tests.el: New test.
(plainer-c-mode): Move up.
(electric-modes-int-main-allman-style)
(electric-layout-int-main-kernel-style): Simplify
electric-layout-rules.
(electric-layout-for-c-style-du-jour): New helper.
(electric-layout-plainer-c-mode-use-c-style): New test.
Diffstat (limited to 'test/lisp/electric-tests.el')
-rw-r--r-- | test/lisp/electric-tests.el | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el index 0b076e4be01..4f1e5729be1 100644 --- a/test/lisp/electric-tests.el +++ b/test/lisp/electric-tests.el @@ -391,11 +391,12 @@ baz\"\"" :bindings '((electric-pair-skip-whitespace . chomp)) :test-in-comments nil) -(define-electric-pair-test whitespace-chomping-2 - " ( \n\t\t\n ) " "--)------" :expected-string " () " :expected-point 4 - :bindings '((electric-pair-skip-whitespace . chomp)) - :modes '(c++-mode) - :test-in-comments nil) +(ert-deftest electric-pair-whitespace-chomping-2-at-point-4-in-c++-mode-in-strings nil + "Check if whitespace chomping works in `c++' unterminated strings." + (electric-pair-test-for + "\" ( \n \n ) \"" 4 41 "\" () \"" 5 'c++-mode + '((electric-pair-skip-whitespace . chomp)) + (lambda () (electric-pair-mode 1)))) ;; A test failure introduced by: ;; ;; bb591f139f: Enhance CC Mode's fontification, etc., of unterminated strings. @@ -513,6 +514,7 @@ baz\"\"" :fixture-fn #'(lambda () (electric-pair-mode 1))) + (define-electric-pair-test js-mode-braces-with-layout "" "{" :expected-string "{\n\n}" :expected-point 3 :modes '(js-mode) @@ -532,6 +534,16 @@ baz\"\"" (electric-indent-mode 1) (electric-layout-mode 1))) +(define-electric-pair-test js-mode-braces-with-layout-and-indent + "" "{" :expected-string "{\n \n}" :expected-point 7 + :modes '(js-mode) + :test-in-comments nil + :test-in-strings nil + :fixture-fn #'(lambda () + (electric-pair-mode 1) + (electric-indent-mode 1) + (electric-layout-mode 1))) + ;;; Backspacing ;;; TODO: better tests @@ -821,6 +833,35 @@ baz\"\"" ;;; tests for `electric-layout-mode' +(define-derived-mode plainer-c-mode c-mode "pC" + "A plainer/saner C-mode with no internal electric machinery." + (c-toggle-electric-state -1) + (setq-local electric-indent-local-mode-hook nil) + (setq-local electric-indent-mode-hook nil) + (electric-indent-local-mode 1) + (dolist (key '(?\" ?\' ?\{ ?\} ?\( ?\) ?\[ ?\])) + (local-set-key (vector key) 'self-insert-command))) + +(defun electric-layout-for-c-style-du-jour (inserted) + "A function to use in `electric-layout-rules'" + (when (memq inserted '(?{ ?})) + (save-excursion + (backward-char 2) (c-point-syntax) (forward-char) ; silly, but needed + (c-brace-newlines (c-point-syntax))))) + +(ert-deftest electric-layout-plainer-c-mode-use-c-style () + (ert-with-test-buffer () + (plainer-c-mode) + (electric-layout-local-mode 1) + (electric-pair-local-mode 1) + (electric-indent-local-mode 1) + (setq-local electric-layout-rules + '(electric-layout-for-c-style-du-jour)) + (insert "int main () ") + (let ((last-command-event ?\{)) + (call-interactively (key-binding `[,last-command-event]))) + (should (equal (buffer-string) "int main ()\n{\n \n}\n")))) + (ert-deftest electric-layout-int-main-kernel-style () (ert-with-test-buffer () (plainer-c-mode) @@ -828,7 +869,8 @@ baz\"\"" (electric-pair-local-mode 1) (electric-indent-local-mode 1) (setq-local electric-layout-rules - '((?\{ . (after-stay after)))) + '((?\{ . (after)) + (?\} . (before)))) (insert "int main () ") (let ((last-command-event ?\{)) (call-interactively (key-binding `[,last-command-event]))) @@ -850,7 +892,8 @@ baz\"\"" (electric-pair-local-mode 1) (electric-indent-local-mode 1) (setq-local electric-layout-rules - '((?\{ . (before after-stay after)))) + '((?\{ . (before after)) + (?\} . (before)))) (insert "int main () ") (let ((last-command-event ?\{)) (call-interactively (key-binding `[,last-command-event]))) |