diff options
| author | João Távora | 2019-01-22 15:46:56 +0000 |
|---|---|---|
| committer | João Távora | 2019-01-22 16:42:43 +0000 |
| commit | fd943124439b7644392919bca8bc2a77e6316d92 (patch) | |
| tree | 22fa8a1103239088dbd7dae9cd0c5974e5f72ebc /test | |
| parent | 6ca4626c9fe33f78df685b4df7aca88abb272118 (diff) | |
| download | emacs-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.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\"\"" | |||
| 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]))) |