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.


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


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

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

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


1

Tipo < C-q < <


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.")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.