Pourquoi taper '<<<' produit-il à la place '<< EOF \ n <' en mode shell-script?

13

Chaque fois que je modifie un script shell dans emacs et saisis trois chevrons pour rediriger une chaîne brute vers stdin, emacs insère les caractères «EOF» et une nouvelle ligne entre eux, donc

cat <<< 'some string'

devient

cat <<EOF
< 'some string'

Je peux revenir en arrière et supprimer les caractères supplémentaires pour obtenir le tampon dans l'état que je veux, mais c'est un comportement très désagréable, et cela ne semble se produire qu'en mode shell-script, qui est généralement la seule fois que je tape ce modèle. Est-il possible de désactiver ce comportement?

Erik
la source

Réponses:

13

Cela est dû à sh-electric-here-document-mode. Une fois activé, <<insérera un squelette de document ici.

C'est activé par défault. Vous pouvez le désactiver avec un crochet, tel que:

(add-hook 'sh-mode-hook (lambda () (sh-electric-here-document-mode -1)))
glucas
la source
4
Une autre option est bien sûr d'insérer <<<avec C-3 <.
glucas
1
Merci d'avoir montré comment le désactiver. Ce mode documentaire sh-electric-here-document est une fonctionnalité plutôt inutile, IMO.
Dan Moulding du
Aussi: sh-mode-hookn'a pas fonctionné pour moi, mais sh-set-shell-hooka fonctionné.
Felipe Lema
17

glucas est exactement correct, mais pour compléter sa réponse, j'ai ce morceau de code que j'ai utilisé moi-même pour rendre l'insertion de doc un peu plus intelligente.

Ce conseil, couplé à sh-electric-here-document-modeactivé, fait en sorte que si vous tapez deux chevrons, le document automatique ici sera créé, mais ensuite si le caractère suivant que vous tapez est un autre chevron, il reviendra et il vous restera juste <<<.

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

Bien sûr , cela signifie que si vous voulez vraiment commencer un doc ici avec un chevron, vous aurez besoin d'insérer brut , il, C-q<. Cela dépend donc de ce que vous faites de plus, si vous faites plus de chaînes ici que de documents ici, cela peut être bien d'avoir, même si vous ne le faites pas, il est rare que vous souhaitiez commencer un document ici avec un chevron et être gêné.

entrez la description de l'image ici

Jordon Biondo
la source
Ah, c'est sympa!
glucas