Предостережение: Я не пользователь Haskell, поэтому возьмите это с крошкой соли.
Когда вы нажимаете RET после Hello
,Emacs не знает, что вы собираетесь добавить |
( быстрый поиск показывает, что у вас могут быть другие символы).Ребята из Haskell сочли правильные отступы выстроенными прямо под H
в Hello
.Если бы отступ автоматически совпадал с |
в строке выше, то все случаи, когда вы не вводите |
, приведут к неправильному отступу.Будь ты проклят, если ты это сделаешь, будь ты проклят, если ты не будешь ...
Другие режимы программирования (C / C ++, Lisp, Tcl, ...) имеют ту же проблему - они не могут знать заранее, что ты 'мы собираемся поставить следующую строку, чтобы отступы не соответствовали вашим ожиданиям.
Одним из решений является использование "электрических" клавиш, то естьвставьте символы, а также принудительно сделайте отступ.Вы можете легко определить | как электрический с помощью следующего кода:
(defun haskell-electric-| ()
"it's electric! (insert | and indent as long as the | follows whitespace)"
(interactive)
(insert "|")
(if (string-match-p "^\\s-*|" (buffer-substring (line-beginning-position)
(point)))
(haskell-indentation-indent-line)))
(define-key haskell-mode-map "|" 'haskell-electric-|)
Я добавил проверку, чтобы убедиться, что вставленному |
предшествует только пробел, вы можете настроитькак бы вы ни хотели или убрали проверку.
Полагаю, в Хаскеле могут быть и другие символы, которые стоит сделать электрическими.