Cómo deshabilitar emacs aquí la finalización del documento

11

Al editar un archivo de script bash con emacs, e intentar ingresar <<<, en el segundo <emacs inserte una plantilla para un documento aquí, como en el siguiente ejemplo:

<<EOF

EOF

Esta no es la salida deseada, porque ingresaría un literal <<<.

Por el momento, recurro a ingresar < < <y luego a eliminar espacios, pero prefiero que me permitan ingresar directamente.

enzotib
fuente
2
No es que me importe demasiado, pero sería bueno dejar un comentario para un voto negativo.
enzotib

Respuestas:

12

En realidad no hay necesidad de que la my-disable-here-documentfunción personalizada de Tom vuelva a enlazar las teclas. Esta característica se puede habilitar y deshabilitar con sh-electric-here-document-mode:

(add-hook 'sh-mode-hook
          (lambda ()
            (sh-electric-here-document-mode -1)))

(También se puede alternar para el búfer activo a través de M-x sh-electric-here-document-mode).

danlei
fuente
Además: sh-mode-hookno funcionó para mí, pero lo sh-set-shell-hookhizo.
Felipe Lema
6

Se unen <a self-insert-commanden el modo de fiesta y luego se insertará sólo el carácter.

De forma predeterminada, está vinculado sh-maybe-here-documentcuando está en modo bash y esa función realiza la inserción automática.

Aquí hay una manera de recuperar la clave:

(add-hook 'sh-set-shell-hook 'my-disable-here-document)

(defun my-disable-here-document ()
  (local-set-key "<" 'self-insert-command))
Tom
fuente
¿Puede dar más información sobre qué insertar exactamente en el archivo init? Lo siento, pero soy un usuario principiante de emacs.
enzotib
Agregué un ejemplo simple a mi respuesta. Inhabilita la inserción automática en todo tipo de shell, no solo bash, sino que probablemente sea lo que quieras de todos modos.
Tom
Esta solución ya no funciona (probada en emacs 24.3), porque <está vinculada self-insert-commandde forma predeterminada.
T. Verron
2

Si la única razón por la que desea deshabilitar el comportamiento here-doc es que le impide insertar una cadena here <<<, entonces el enlace C-<a una función que contenga (insert "<<<")funcionará y aún permitirá la plantilla automática here-doc

(defun my-here-string() 
  "Insert <<< (eg. for a bash here-string)" 
  (interactive)
  (insert "<<<"))
(global-set-key (kbd  "C-<") 'my-here-string)
Peter.O
fuente
1
Gracias, solución interesante, pero todavía prefiero la respuesta de @ Tom, porque considero que la finalización es incorrecta para un archivo de script bash.
enzotib
2

Entro <<<como M-3<en el modo shell.

choroba
fuente
1

Tipo < C-q < <

Osito de peluche
fuente
Es más corto que mi solución y quizás sea útil para otras situaciones también, pero no es exactamente lo que estaba buscando. Gracias de todos modos.
enzotib
1

Después de echar un vistazo a: http://web.mit.edu/dosathena/sandbox/emacs-19.28/lisp/sh-script.el se me ocurrió esta solución:

;; disable the automatic EOF generation in Shell Mode
(defvar sh-use-prefix nil
  "If non-nil when loading, `$' and `<' will be  C-c $  and  C-c < .")
(defvar sh-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (if sh-use-prefix "\C-c<" "<")
      (local-set-key "<" 'self-insert-command))
   map)
  "Keymap used in Shell-Script mode.")
vee
fuente