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.