aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorJoão Távora2019-01-22 15:46:56 +0000
committerJoão Távora2019-01-22 16:42:43 +0000
commitfd943124439b7644392919bca8bc2a77e6316d92 (patch)
tree22fa8a1103239088dbd7dae9cd0c5974e5f72ebc /test
parent6ca4626c9fe33f78df685b4df7aca88abb272118 (diff)
downloademacs-fd943124439b7644392919bca8bc2a77e6316d92.tar.gz
emacs-fd943124439b7644392919bca8bc2a77e6316d92.zip
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')
-rw-r--r--test/lisp/electric-tests.el57
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\"\""
391 :bindings '((electric-pair-skip-whitespace . chomp)) 391 :bindings '((electric-pair-skip-whitespace . chomp))
392 :test-in-comments nil) 392 :test-in-comments nil)
393 393
394(define-electric-pair-test whitespace-chomping-2 394(ert-deftest electric-pair-whitespace-chomping-2-at-point-4-in-c++-mode-in-strings nil
395 " ( \n\t\t\n ) " "--)------" :expected-string " () " :expected-point 4 395 "Check if whitespace chomping works in `c++' unterminated strings."
396 :bindings '((electric-pair-skip-whitespace . chomp)) 396 (electric-pair-test-for
397 :modes '(c++-mode) 397 "\" ( \n \n ) \"" 4 41 "\" () \"" 5 'c++-mode
398 :test-in-comments nil) 398 '((electric-pair-skip-whitespace . chomp))
399 (lambda () (electric-pair-mode 1))))
399;; A test failure introduced by: 400;; A test failure introduced by:
400;; 401;;
401;; bb591f139f: Enhance CC Mode's fontification, etc., of unterminated strings. 402;; bb591f139f: Enhance CC Mode's fontification, etc., of unterminated strings.
@@ -513,6 +514,7 @@ baz\"\""
513 :fixture-fn #'(lambda () 514 :fixture-fn #'(lambda ()
514 (electric-pair-mode 1))) 515 (electric-pair-mode 1)))
515 516
517
516(define-electric-pair-test js-mode-braces-with-layout 518(define-electric-pair-test js-mode-braces-with-layout
517 "" "{" :expected-string "{\n\n}" :expected-point 3 519 "" "{" :expected-string "{\n\n}" :expected-point 3
518 :modes '(js-mode) 520 :modes '(js-mode)
@@ -532,6 +534,16 @@ baz\"\""
532 (electric-indent-mode 1) 534 (electric-indent-mode 1)
533 (electric-layout-mode 1))) 535 (electric-layout-mode 1)))
534 536
537(define-electric-pair-test js-mode-braces-with-layout-and-indent
538 "" "{" :expected-string "{\n \n}" :expected-point 7
539 :modes '(js-mode)
540 :test-in-comments nil
541 :test-in-strings nil
542 :fixture-fn #'(lambda ()
543 (electric-pair-mode 1)
544 (electric-indent-mode 1)
545 (electric-layout-mode 1)))
546
535 547
536;;; Backspacing 548;;; Backspacing
537;;; TODO: better tests 549;;; TODO: better tests
@@ -821,6 +833,35 @@ baz\"\""
821 833
822;;; tests for `electric-layout-mode' 834;;; tests for `electric-layout-mode'
823 835
836(define-derived-mode plainer-c-mode c-mode "pC"
837 "A plainer/saner C-mode with no internal electric machinery."
838 (c-toggle-electric-state -1)
839 (setq-local electric-indent-local-mode-hook nil)
840 (setq-local electric-indent-mode-hook nil)
841 (electric-indent-local-mode 1)
842 (dolist (key '(?\" ?\' ?\{ ?\} ?\( ?\) ?\[ ?\]))
843 (local-set-key (vector key) 'self-insert-command)))
844
845(defun electric-layout-for-c-style-du-jour (inserted)
846 "A function to use in `electric-layout-rules'"
847 (when (memq inserted '(?{ ?}))
848 (save-excursion
849 (backward-char 2) (c-point-syntax) (forward-char) ; silly, but needed
850 (c-brace-newlines (c-point-syntax)))))
851
852(ert-deftest electric-layout-plainer-c-mode-use-c-style ()
853 (ert-with-test-buffer ()
854 (plainer-c-mode)
855 (electric-layout-local-mode 1)
856 (electric-pair-local-mode 1)
857 (electric-indent-local-mode 1)
858 (setq-local electric-layout-rules
859 '(electric-layout-for-c-style-du-jour))
860 (insert "int main () ")
861 (let ((last-command-event ?\{))
862 (call-interactively (key-binding `[,last-command-event])))
863 (should (equal (buffer-string) "int main ()\n{\n \n}\n"))))
864
824(ert-deftest electric-layout-int-main-kernel-style () 865(ert-deftest electric-layout-int-main-kernel-style ()
825 (ert-with-test-buffer () 866 (ert-with-test-buffer ()
826 (plainer-c-mode) 867 (plainer-c-mode)
@@ -828,7 +869,8 @@ baz\"\""
828 (electric-pair-local-mode 1) 869 (electric-pair-local-mode 1)
829 (electric-indent-local-mode 1) 870 (electric-indent-local-mode 1)
830 (setq-local electric-layout-rules 871 (setq-local electric-layout-rules
831 '((?\{ . (after-stay after)))) 872 '((?\{ . (after))
873 (?\} . (before))))
832 (insert "int main () ") 874 (insert "int main () ")
833 (let ((last-command-event ?\{)) 875 (let ((last-command-event ?\{))
834 (call-interactively (key-binding `[,last-command-event]))) 876 (call-interactively (key-binding `[,last-command-event])))
@@ -850,7 +892,8 @@ baz\"\""
850 (electric-pair-local-mode 1) 892 (electric-pair-local-mode 1)
851 (electric-indent-local-mode 1) 893 (electric-indent-local-mode 1)
852 (setq-local electric-layout-rules 894 (setq-local electric-layout-rules
853 '((?\{ . (before after-stay after)))) 895 '((?\{ . (before after))
896 (?\} . (before))))
854 (insert "int main () ") 897 (insert "int main () ")
855 (let ((last-command-event ?\{)) 898 (let ((last-command-event ?\{))
856 (call-interactively (key-binding `[,last-command-event]))) 899 (call-interactively (key-binding `[,last-command-event])))