emacs haskell indentation

Emacs Haskell sangría



indentation (3)

Comenté la línea

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

Y ahora tengo un buen comportamiento de "pestaña": al menos, me permite elegir una columna y no me ata a la que le gusta. Pero ninguna sangría automática me molesta un poco, así que espero que sea una solución temporal.

Por favor, ayúdame a configurar la sangría adecuada en el modo haskell de Emacs

Cuando intento escribir algo como ADT o un registro, aparece la columna incorrecta después de presionar <ENTER> , y al presionar <TAB> no se cambiará a la derecha hasta que ingrese una | o '';''!

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

Tratando de resolver el problema que planteo.

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

en mi archivo .emacs , ¡pero no .emacs la línea actual al presionar <enter> también!

Otro comportamiento extraño: sangría de caso.

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


Parece que escribe <Enter> y luego " | " y luego <Tab> . Si hago eso, obtengo los mismos resultados. Pero si escribo <Enter> y luego <Tab> y luego <Tab> otra vez, automáticamente se inserta el " | " y se alinea correctamente, así:

data MyADT = Oh | Hi |<Cursor>

Cuando verifico mi versión en modo Mx eval-expression haskell-version <Enter> usando Mx eval-expression haskell-version <Enter> obtengo "v2_4".

Emacs haskell-mode no analiza completamente el código fuente, por lo que las características "automáticas" son aproximadas, creo. Escribir <Tab> varias veces en una nueva línea recorre varias posibles sangrías, y también a veces inserta texto como " | " para los tipos de datos algebraicos.


Advertencia: no soy un usuario de Haskell, así que tómalo con un grano de sal.

Cuando presionas RET después del Hello , Emacs no sabe que vas a agregar un | (La búsqueda rápida muestra que puedes tener otros símbolos). La gente de Haskell ha considerado que la hendidura adecuada se alinea directamente debajo de la H en Hello . Si la sangría fuera a alinearse automáticamente con el | en la línea de arriba, entonces todos los casos en los que no escribe | dará lugar a una sangría incorrecta. Maldito si lo haces, maldito si no lo haces ...

Otros modos de programación (C / C ++, Lisp, Tcl, ...) tienen el mismo problema: no pueden saber de antemano lo que se va a colocar en la siguiente línea, por lo que la sangría no puede ser lo que esperaba. para.

Una solución es usar "electric" teclas "electric" , es decir, que insertan caracteres y también forzan la re-sangría. Usted podría definir fácilmente | Ser eléctrico con el siguiente código:

(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-|)

Agregué un cheque para asegurar que el | insertado está precedido solo por espacios en blanco, puede personalizarlo como desee o eliminar el cheque por completo.

Supongo que también podría haber otros símbolos en Haskell que valdría la pena hacer eléctricos.