Emacs Haskell отступ - PullRequest
       5

Emacs Haskell отступ

23 голосов
/ 13 ноября 2010

Пожалуйста, помогите мне настроить правильные отступы в режиме hasmall Emacs

Когда я пытаюсь набрать что-то вроде ADT или записи, я получаю неправильный столбец после нажатия <ENTER>,и нажатие <TAB> не будет переключаться вправо, пока я не введу | или ';'!

data MyADT = Oh
           | Hi
           | Hello
             | <- the cursor is here again!

Попытка решитьЯ установил

(define-key global-map (kbd "RET") 'reindent-then-newline-and-indent)

в своем файле .emacs, но при нажатии клавиши <enter> текущая строка также не будет отступать!

Другое странное поведение: отступ в регистре

oneChar c =  case lookup c simpleEscapes of
  | <- what? here?!

Ответы [ 3 ]

9 голосов
/ 26 ноября 2010

Звучит так, как будто вы набираете <Enter>, затем "|" и затем <Tab>.Если я это сделаю, я получу те же результаты.Но если я наберу <Enter>, а затем <Tab>, а затем <Tab> снова, он автоматически вставит "|" и выстроит его правильно, например так:

data MyADT = Oh
           | Hi
           |<Cursor>

Когда я проверю свой haskell-режим с использованием M-x eval-expression haskell-version <Enter> Я получаю "v2_4".

Режим Emacs haskell-mode не полностью анализирует исходный код, поэтому, я думаю, «автоматические» функции приблизительны.Ввод <Tab> несколько раз на новой строке циклически повторяет несколько возможных отступов, а также иногда вставляет текст, такой как "|" для алгебраических типов данных.

4 голосов
/ 02 декабря 2010

Предостережение: Я не пользователь 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-|)

Я добавил проверку, чтобы убедиться, что вставленному | предшествует только пробел, вы можете настроитькак бы вы ни хотели или убрали проверку.

Полагаю, в Хаскеле могут быть и другие символы, которые стоит сделать электрическими.

3 голосов
/ 13 ноября 2010

Я прокомментировал строку

;;(add-hook 'haskell-mode-hook 'turn-on-haskell-indent)

И теперь у меня хорошее поведение «табуляции»: по крайней мере, оно позволяет мне выбирать столбец и не привязывает меня к тому, которое ему нравится. Но никакой автоматический отступ совсем меня не раздражает, поэтому я надеюсь, что это временное решение

...