Comment désactiver emacs ici l'achèvement du document

11

Lors de la modification d'un fichier de script bash avec emacs et de la tentative de saisie <<<, au deuxième <emacs, insérez un modèle pour un document ici, comme dans l'exemple suivant:

<<EOF

EOF

Ce n'est pas la sortie souhaitée, car j'entrerais un littéral <<<.

Pour le moment, j'ai recours à l'entrée < < <, puis à la suppression d'espaces, mais je préfère être autorisé à y entrer directement.

enzotib
la source
2
Pas que je m'en soucie trop, mais ce serait bien de laisser un commentaire pour un downvote.
enzotib

Réponses:

12

Il n'y a en fait pas besoin de la my-disable-here-documentfonction personnalisée de Tom pour relier les touches. Cette fonctionnalité peut être activée et désactivée avec sh-electric-here-document-mode:

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

(Il peut également être basculé pour le tampon actif via M-x sh-electric-here-document-mode.)

danlei
la source
Aussi: sh-mode-hookn'a pas fonctionné pour moi, mais sh-set-shell-hooka fonctionné.
Felipe Lema
6

Liez <à self-insert-commanden mode bash, puis il n'insérera que le caractère.

Par défaut, il est lié sh-maybe-here-documenten mode bash et cette fonction effectue l'insertion automatique.

Voici un moyen de rebondir la clé:

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

(defun my-disable-here-document ()
  (local-set-key "<" 'self-insert-command))
À M
la source
Pouvez-vous donner plus d'informations sur ce qu'il faut insérer exactement dans le fichier init? Désolé, mais je suis un utilisateur débutant d'emacs.
enzotib
J'ai ajouté un exemple simple à ma réponse. Il désactive l'insertion automatique dans tous les types de shell, pas seulement bash, mais c'est probablement ce que vous voulez de toute façon.
Tom
Cette solution ne fonctionne plus (testée sur emacs 24.3), car elle <est liée self-insert-commandpar défaut.
T. Verron
2

Si la seule raison pour laquelle vous souhaitez désactiver le comportement ici-doc est qu'il vous empêche d'insérer une chaîne ici <<<, alors la liaison C-<à une fonction qui contient (insert "<<<")fonctionnera et autorisera toujours le modèle auto ici-doc

(defun my-here-string() 
  "Insert <<< (eg. for a bash here-string)" 
  (interactive)
  (insert "<<<"))
(global-set-key (kbd  "C-<") 'my-here-string)
Peter.O
la source
1
Merci, solution intéressante, mais je préfère toujours la réponse de @ Tom, car je considère que la complétion est incorrecte pour un fichier de script bash.
enzotib
2

J'entre <<<comme M-3<en mode shell.

choroba
la source
1

Type < C-q < <

Teddy
la source
Il est plus court que ma solution de contournement et peut-être utile pour d'autres situations aussi, mais pas exactement ce que je cherchais. Merci quand même.
enzotib
1

Après avoir jeté un œil à: http://web.mit.edu/dosathena/sandbox/emacs-19.28/lisp/sh-script.el, j'ai trouvé cette solution:

;; 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
la source