Warum erzeugt die Eingabe von "<<<" stattdessen "<< EOF \ n <", wenn Sie sich im Shell-Skript-Modus befinden?

13

Immer wenn ich ein Shell-Skript in Emacs bearbeite und drei Chevrons eingebe, um eine rohe Zeichenfolge in stdin umzuleiten, fügt Emacs die Zeichen 'EOF' und eine neue Zeile dazwischen ein

cat <<< 'some string'

wird

cat <<EOF
< 'some string'

Ich kann zurückgehen und die zusätzlichen Zeichen löschen, um den Puffer in dem von mir gewünschten Zustand zu erhalten, aber dies ist ein sehr unangenehmes Verhalten, und es scheint nur im Shell-Skript-Modus zu geschehen, was normalerweise das einzige Mal ist, dass ich dieses Muster tippe. Gibt es eine Möglichkeit, dieses Verhalten zu deaktivieren?

Erik
quelle

Antworten:

13

Dies wird verursacht durch sh-electric-here-document-mode. Wenn diese Option aktiviert ist, <<wird hier ein Dokumentskelett eingefügt.

Dies ist standardmäßig aktiviert. Sie können es mit einem Haken deaktivieren, wie zum Beispiel:

(add-hook 'sh-mode-hook (lambda () (sh-electric-here-document-mode -1)))
Glucas
quelle
4
Eine andere Möglichkeit ist natürlich das Einfügen <<<mit C-3 <.
Glucas
1
Vielen Dank, dass Sie gezeigt haben, wie Sie es deaktivieren können. Dieser sh-electric-here-document-Modus ist ein ziemlich nutzloses Feature, IMO.
Dan Moulding
Auch: sh-mode-hookhat bei mir nicht funktioniert, hat aber sh-set-shell-hookfunktioniert.
Felipe Lema
17

Glucas ist genau richtig, aber als Ergänzung zu seiner Antwort habe ich dieses Stück Code, das ich selbst verwendet habe, um das Einfügen eines Dokuments ein wenig schlauer zu machen.

Dieser Hinweis in Verbindung mit " sh-electric-here-document-modeenabled" bewirkt, dass beim Eingeben von zwei Pfeilen das automatische Dokument "here doc" erstellt wird. Wenn Sie jedoch als nächstes ein anderes Zeichen eingeben, wird es zurückgesetzt und Sie haben nur noch "<<<".

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

Dies bedeutet natürlich, dass Sie, wenn Sie ein Here-Dokument mit einem Chevron starten möchten, es roh einfügen müssen C-q<. Es hängt also davon ab, wovon Sie mehr machen. Wenn Sie hier mehr Zeichenfolgen als hier Dokumente machen, kann dies eine gute Sache sein, auch wenn dies nicht der Fall ist belästigt werden.

Bildbeschreibung hier eingeben

Jordon Biondo
quelle
Ah, das ist schön!
Glucas