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.