aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorJoão Távora2018-12-21 18:00:08 +0000
committerJoão Távora2019-01-02 12:55:16 +0000
commit949295ae1a8a79a181b2bf614b9c69849f2fd667 (patch)
tree6c1570504f7f43a2c47f1651dae18323b229cdc7 /test
parent0515b223c2158984e135e84be97c01d5b8d0ae75 (diff)
downloademacs-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.el104
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