Подтвердить что ты не робот

Выделение Emacs Haskell

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

Когда я пытаюсь набрать что-то вроде 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?!
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

data MyADT = Oh
           | Hi
           |<Cursor>

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

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

Ответ 3

Предостережение: Я не пользователь Haskell, поэтому возьмите это с солью.

Когда вы нажимаете RET после Hello, Emacs не знает, что вы добавите | (быстрый поиск показывает, что вы можете иметь другие символы). Люди Haskell считают, что правильный отступ должен быть выровнен непосредственно под H в Hello. Если отступ должен автоматически совпадать с | в строке выше, тогда все случаи, когда вы не набираете |, приведут к неправильному отступу. Проклятый, если вы это сделаете, проклятый, если вы не...

Другие режимы программирования (C/С++, Lisp, Tcl,...) имеют одинаковую проблему - они не могут заранее знать, что вы собираетесь нанести на следующую строку, так что отступы не будут на что вы надеялись.

Одним из решений является использование "электрических" ключей, что означает, что они вставляют символы, а также принудительно повторно отступают. Вы можете легко определить | как электрический с помощью следующего кода:

(defun haskell-electric-| ()
  "it 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 могут быть и другие символы, которые стоили бы сделать электричество.