diff --git a/elisp/shm-customizations.el b/elisp/shm-customizations.el index bd4198f..791429b 100644 --- a/elisp/shm-customizations.el +++ b/elisp/shm-customizations.el @@ -171,6 +171,31 @@ when option is nil. :group 'shm :type 'list) +(defcustom shm-indent-if-offset 3 + "Amount of indentation for 'true' and 'false' branches of the if expression. + +E.g. if this is equal to `0' then 'if' snippet will be expanded as + +if +then +else + +If this is equal to `2' then 'if' snippet will be expanded as + +if + then + else + +If this is equal to `4' then 'if' snippet will be expanded as + +if + then + else + +etc." + :group 'shm + :type 'integer) + ;; Provide diff --git a/elisp/shm-slot.el b/elisp/shm-slot.el index 16a9489..899da52 100644 --- a/elisp/shm-slot.el +++ b/elisp/shm-slot.el @@ -151,21 +151,26 @@ case {undefined} of "Insert template if {undefined} - then {undefined} - else {undefined} +then {undefined} +else {undefined} or if {undefined} then {undefined} else {undefined} if inside parentheses." - (let ((start (save-excursion (forward-char -1) - (search-backward-regexp "[^a-zA-Z0-9_]") - (forward-char 1) - (point))) - (template (if (bound-and-true-p structured-haskell-repl-mode) - "if undefined then undefined else undefined" - "if undefined\n then undefined\n else undefined"))) + (let* ((start (save-excursion (forward-char -1) + (search-backward-regexp "[^a-zA-Z0-9_]") + (forward-char 1) + (point))) + (offset (make-string + (if (bound-and-true-p structured-haskell-repl-mode) + 3 + (make-string shm-indent-if-offset ?\s)) + ?\s)) + (template (format "if undefined\n%sthen undefined\n%selse undefined" + offset + offset))) (shm-adjust-dependents (point) (- start (point))) (delete-region start (point)) (shm-adjust-dependents (point) (length (car (last (split-string template "\n"))))) diff --git a/elisp/shm-tests.el b/elisp/shm-tests.el index 1142afb..78e52df 100644 --- a/elisp/shm-tests.el +++ b/elisp/shm-tests.el @@ -64,7 +64,7 @@ foo = do (defvar shm-tests (list -(list :name "inserting after '" + (list :name "inserting after '" :start-buffer-content "x = [foo' ,()] " @@ -616,7 +616,37 @@ fn x = y + y " :kbd [?\M-x ?s ?h ?m ?/ ?g ?o ?t ?o ?- ?w ?h ?e ?r ?e return ?y] :customizations - '((shm-indent-point-after-adding-where-clause t))))) + '((shm-indent-point-after-adding-where-clause . t))) + (list :name "if-then-else template width indent 0" + :start-buffer-content "fn :: a -> b +fn x = if +" + :start-cursor 23 + :finish-cursor 24 + :current-node-overlay 'nil + :end-buffer-content "fn :: a -> b +fn x = if undefined + then undefined + else undefined +" + :kbd " " + :customizations + '((shm-indent-if-offset . 0))) + (list :name "if-then-else template with indent 3" + :start-buffer-content "fn :: a -> b +fn x = if +" + :start-cursor 23 + :finish-cursor 24 + :current-node-overlay 'nil + :end-buffer-content "fn :: a -> b +fn x = if undefined + then undefined + else undefined +" + :kbd " " + :customizations + '((shm-indent-if-offset . 3))))) (provide 'shm-tests)