¿Por qué escribir '<<<' en su lugar produce '<< EOF \ n <' cuando está en modo shell-script?

13

Cada vez que edito un script de shell en emacs y escribo tres galones para redirigir una cadena sin formato a stdin, emacs inserta los caracteres 'EOF' y una nueva línea entre ellos, así que

cat <<< 'some string'

se convierte

cat <<EOF
< 'some string'

Puedo regresar y eliminar los caracteres adicionales para obtener el búfer en el estado que quiero, pero este es un comportamiento muy desagradable, y solo parece suceder en el modo shell-script, que generalmente es la única vez que escribo este patrón. ¿Hay alguna forma de deshabilitar este comportamiento?

Erik
fuente

Respuestas:

13

Esto es causado por sh-electric-here-document-mode. Cuando <<esté habilitado, insertará un esqueleto de documento aquí.

Esto está habilitado por defecto. Puede deshabilitarlo con un gancho, como:

(add-hook 'sh-mode-hook (lambda () (sh-electric-here-document-mode -1)))
glucas
fuente
44
Otra opción, por supuesto, es insertar <<<con C-3 <.
glucas
1
Gracias por mostrar cómo apagarlo. Este modo sh-electric-here-document-mode es una característica bastante inútil, IMO.
Dan Molding el
Además: sh-mode-hookno funcionó para mí, pero lo sh-set-shell-hookhizo.
Felipe Lema
17

glucas es exactamente correcto, pero para complementar su respuesta, tengo este código que he utilizado para hacer que la inserción de documentos sea un poco más inteligente.

Este consejo, junto con sh-electric-here-document-modehabilitado, hace que si escribe dos galones se creará el documento automático aquí, pero luego, si el siguiente carácter que escribe es otro galón, se revertirá y quedará con solo <<<.

(defadvice sh--maybe-here-document (around be-smart-about-it activate)
  "Do normal here doc auto insert, but if you type another chevron, revert and leave just <<<."
  (if (and (= (current-column) 1)
           (looking-back "^<")
           (looking-at "\nEOF")
           (save-excursion
             (forward-line -1)
             (end-of-line 1)
             (looking-back "<<EOF")))
      (progn (delete-region (search-backward "EOF") (search-forward "EOF" nil t 2))
             (insert "<"))
    ad-do-it))

Por supuesto, esto significa que si usted realmente desea iniciar un doc aquí con un galón, que necesitará para insertarlo en bruto, C-q<. Entonces, depende de lo que haga más, si hace más cadenas aquí que documentos aquí, puede ser bueno tenerlo, incluso si no lo hace, es raro que desee comenzar un documento aquí con un galón y ser incomodado

ingrese la descripción de la imagen aquí

Jordon Biondo
fuente
Ah, eso es lindo!
glucas 12/12