2010-11-12 2 views
23

Пожалуйста, помогите мне создать правильный отступ в 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?! 
+1

Случай «case» - правильное поведение. – jrockway

+1

Если вы дважды нажимаете вкладку, она вставляет '|' в правильном отступе. – edon

+0

, если еще нет '' ', это не так. Поэтому я должен ввести что-то в строке, прежде чем нажимать вкладку –

ответ

3

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

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

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

9

Это звучит, как вы набираете <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

Предостережение: Я не пользователь 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 могут быть и другие символы, которые стоили бы сделать электрическим.

Смежные вопросы