Предостережение: Я не пользователь Haskell, поэтому возьмите это с солью.
При нажатии RET после Hello
, Emacs не знает, что вы собираетесь добавить |
(quick search шоу вы можете иметь другие символы). Люди Haskell считают, что надлежащее углубление должно быть выровнено непосредственно ниже H
в Hello
. Если отступ должен автоматически совпадать с |
на линии выше, тогда все случаи, когда вы не типа a |
, приведут к неправильному отступу. Проклятые, если вы это сделаете, проклятые, если вы этого не сделаете ...
Другие режимы программирования (C/C++, Lisp, Tcl, ...) имеют одинаковую проблему - они не могут заранее знать, что вы собираетесь делать чтобы поставить на следующую строку, так что отступы у меня не такие, на что вы надеялись.
Одним из решений является использование ключей "electric", что означает, что они вставляют символы, а также принудительно повторно отступают. Вы можете легко определить | быть электрический со следующим кодом:
(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-|)
я добавил проверку, чтобы убедиться, что |
вставлено предшествует только пробелы, вы можете настроить, что же вы хотите или снимите флажок в целом.
Я предполагаю, что в Haskell могут быть и другие символы, которые стоили бы сделать электрическим.
Случай «case» - правильное поведение. – jrockway
Если вы дважды нажимаете вкладку, она вставляет '|' в правильном отступе. – edon
, если еще нет '' ', это не так. Поэтому я должен ввести что-то в строке, прежде чем нажимать вкладку –