diff options
| author | João Távora | 2018-12-21 18:00:08 +0000 |
|---|---|---|
| committer | João Távora | 2019-01-02 12:55:16 +0000 |
| commit | 949295ae1a8a79a181b2bf614b9c69849f2fd667 (patch) | |
| tree | 6c1570504f7f43a2c47f1651dae18323b229cdc7 /test | |
| parent | 0515b223c2158984e135e84be97c01d5b8d0ae75 (diff) | |
| download | emacs-949295ae1a8a79a181b2bf614b9c69849f2fd667.tar.gz emacs-949295ae1a8a79a181b2bf614b9c69849f2fd667.zip | |
Extend electric-layout-mode to handle more complex layouts (bug#33794)
Entries in electric-layout-rules can specify multiple
newline-related actions which are executed in order of appearance.
Also, have it play nice with electric-pair-mode when inserting a
newlines, particularly with electric-pair-open-newline-between-pairs.
Entries in electric-layout-rules can also be functions. Among other
things, the logic behind electric-pair-open-newline-between-pairs
could now be moved to electric-layout-mode, but this commit doesn't do
that yet.
This change was motivated by bug#33794 and is an alternative solution
to the problem reported in that bug.
* lisp/electric.el (electric-layout-rules): Adjust docstring.
(electric-layout-post-self-insert-function): Call
electric-layout-post-self-insert-function-1.
(electric-layout-post-self-insert-function-1): Rename from
electric-layout-post-self-insert-function. Redesign.
(electric-layout-local-mode): New minor mode.
* test/lisp/electric-tests.el (electric-layout-int-main-kernel-style)
(electric-layout-int-main-allman-style)
(electric-modes-in-c-mode-with-self-insert-command)
(electric-pair-mode-newline-between-parens)
(electric-layout-mode-newline-between-parens-without-e-p-m)
(electric-layout-mode-newline-between-parens-without-e-p-m-2): New
tests.
(plainer-c-mode): New helper.
Diffstat (limited to 'test')
| -rw-r--r-- | test/lisp/electric-tests.el | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el index 467abd1f274..5a4b20ed04e 100644 --- a/test/lisp/electric-tests.el +++ b/test/lisp/electric-tests.el | |||
| @@ -812,5 +812,109 @@ baz\"\"" | |||
| 812 | :bindings '((comment-start . "<!--") (comment-use-syntax . t)) | 812 | :bindings '((comment-start . "<!--") (comment-use-syntax . t)) |
| 813 | :test-in-comments nil :test-in-strings nil) | 813 | :test-in-comments nil :test-in-strings nil) |
| 814 | 814 | ||
| 815 | |||
| 816 | ;;; tests for `electric-layout-mode' | ||
| 817 | |||
| 818 | (ert-deftest electric-layout-int-main-kernel-style () | ||
| 819 | (ert-with-test-buffer () | ||
| 820 | (c-mode) | ||
| 821 | (electric-layout-local-mode 1) | ||
| 822 | (electric-pair-local-mode 1) | ||
| 823 | (electric-indent-local-mode 1) | ||
| 824 | (setq-local electric-layout-rules | ||
| 825 | '((?\{ . (after-stay after)))) | ||
| 826 | (insert "int main () ") | ||
| 827 | (let ((last-command-event ?\{)) | ||
| 828 | (call-interactively (key-binding `[,last-command-event]))) | ||
| 829 | (should (equal (buffer-string) "int main () {\n \n}")))) | ||
| 830 | |||
| 831 | (ert-deftest electric-layout-int-main-allman-style () | ||
| 832 | (ert-with-test-buffer () | ||
| 833 | (c-mode) | ||
| 834 | (electric-layout-local-mode 1) | ||
| 835 | (electric-pair-local-mode 1) | ||
| 836 | (electric-indent-local-mode 1) | ||
| 837 | (setq-local electric-layout-rules | ||
| 838 | '((?\{ . (before after-stay after)))) | ||
| 839 | (insert "int main () ") | ||
| 840 | (let ((last-command-event ?\{)) | ||
| 841 | (call-interactively (key-binding `[,last-command-event]))) | ||
| 842 | (should (equal (buffer-string) "int main ()\n{\n \n}")))) | ||
| 843 | |||
| 844 | (define-derived-mode plainer-c-mode c-mode "pC" | ||
| 845 | "A plainer/saner C-mode with no internal electric machinery." | ||
| 846 | (c-toggle-electric-state -1) | ||
| 847 | (setq-local electric-indent-local-mode-hook nil) | ||
| 848 | (setq-local electric-indent-mode-hook nil) | ||
| 849 | (electric-indent-local-mode 1) | ||
| 850 | (dolist (key '(?\" ?\' ?\{ ?\} ?\( ?\) ?\[ ?\])) | ||
| 851 | (local-set-key (vector key) 'self-insert-command))) | ||
| 852 | |||
| 853 | (ert-deftest electric-modes-in-c-mode-with-self-insert-command () | ||
| 854 | (ert-with-test-buffer () | ||
| 855 | (plainer-c-mode) | ||
| 856 | (electric-layout-local-mode 1) | ||
| 857 | (electric-pair-local-mode 1) | ||
| 858 | (electric-indent-local-mode 1) | ||
| 859 | (setq-local electric-layout-rules | ||
| 860 | '((?\{ . (before after-stay after)))) | ||
| 861 | (insert "int main () ") | ||
| 862 | (let ((last-command-event ?\{)) | ||
| 863 | (call-interactively (key-binding `[,last-command-event]))) | ||
| 864 | (should (equal (buffer-string) "int main ()\n{\n \n}")))) | ||
| 865 | |||
| 866 | (ert-deftest electric-pair-mode-newline-between-parens () | ||
| 867 | (ert-with-test-buffer () | ||
| 868 | (plainer-c-mode) | ||
| 869 | (electric-layout-local-mode -1) ;; ensure e-l-m mode is off | ||
| 870 | (electric-pair-local-mode 1) | ||
| 871 | (insert-before-markers "int main () {}") | ||
| 872 | (backward-char 1) | ||
| 873 | (let ((last-command-event ? )) | ||
| 874 | (call-interactively (key-binding `[,last-command-event]))) | ||
| 875 | (should (equal (buffer-string) "int main () {\n \n}")))) | ||
| 876 | |||
| 877 | (ert-deftest electric-layout-mode-newline-between-parens-without-e-p-m () | ||
| 878 | (ert-with-test-buffer () | ||
| 879 | (plainer-c-mode) | ||
| 880 | (electric-layout-local-mode 1) | ||
| 881 | (electric-pair-local-mode -1) ;; ensure e-p-m mode is off | ||
| 882 | (electric-indent-local-mode 1) | ||
| 883 | (setq-local electric-layout-rules | ||
| 884 | '((?\n | ||
| 885 | . | ||
| 886 | (lambda () | ||
| 887 | (when (eq (save-excursion | ||
| 888 | (skip-chars-backward "\t\s") | ||
| 889 | (char-before (1- (point)))) | ||
| 890 | (matching-paren (char-after))) | ||
| 891 | '(after-stay)))))) | ||
| 892 | (insert "int main () {}") | ||
| 893 | (backward-char 1) | ||
| 894 | (let ((last-command-event ? )) | ||
| 895 | (call-interactively (key-binding `[,last-command-event]))) | ||
| 896 | (should (equal (buffer-string) "int main () {\n \n}")))) | ||
| 897 | |||
| 898 | (ert-deftest electric-layout-mode-newline-between-parens-without-e-p-m-2 () | ||
| 899 | (ert-with-test-buffer () | ||
| 900 | (plainer-c-mode) | ||
| 901 | (electric-layout-local-mode 1) | ||
| 902 | (electric-pair-local-mode -1) ;; ensure e-p-m mode is off | ||
| 903 | (electric-indent-local-mode 1) | ||
| 904 | (setq-local electric-layout-rules | ||
| 905 | '((lambda (char) | ||
| 906 | (when (and | ||
| 907 | (eq char ?\n) | ||
| 908 | (eq (save-excursion | ||
| 909 | (skip-chars-backward "\t\s") | ||
| 910 | (char-before (1- (point)))) | ||
| 911 | (matching-paren (char-after)))) | ||
| 912 | '(after-stay))))) | ||
| 913 | (insert "int main () {}") | ||
| 914 | (backward-char 1) | ||
| 915 | (let ((last-command-event ? )) | ||
| 916 | (call-interactively (key-binding `[,last-command-event]))) | ||
| 917 | (should (equal (buffer-string) "int main () {\n \n}")))) | ||
| 918 | |||
| 815 | (provide 'electric-tests) | 919 | (provide 'electric-tests) |
| 816 | ;;; electric-tests.el ends here | 920 | ;;; electric-tests.el ends here |