Perché digitare '<<<' invece produce '<< EOF \ n <' in modalità shell-script?


13

Ogni volta che sto modificando uno script di shell in emacs e digito tre chevron per reindirizzare una stringa grezza su stdin, emacs inserisce i caratteri 'EOF' e una nuova riga tra loro, quindi

cat <<< 'some string'

diventa

cat <<EOF
< 'some string'

Posso tornare indietro ed eliminare i caratteri extra per ottenere il buffer nello stato desiderato, ma questo è un comportamento molto odioso, e sembra accadere solo in modalità shell-script, che di solito è l'unica volta in cui scrivo questo modello. C'è un modo per disabilitare questo comportamento?

Risposte:


13

Questo è causato da sh-electric-here-document-mode. Se abilitato, <<inserirà uno scheletro del documento qui.

Questo è abilitato di default. Puoi disabilitarlo con un hook, come ad esempio:

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

4
Un'altra opzione, naturalmente, è quello di inserire <<<con C-3 <.
Glucas

1
Grazie per aver mostrato come disattivarlo. Questa modalità sh-electric-here-document-è una funzione piuttosto inutile, IMO.
Dan Molding

Inoltre: sh-mode-hooknon ha funzionato per me, ma sh-set-shell-hookha funzionato.
Felipe Lema

17

glucas è esattamente corretto, ma per integrare la sua risposta ho questo pezzo di codice che ho usato per rendere l'inserimento di documenti un po 'più intelligente.

Questo consiglio, combinato con sh-electric-here-document-modeabilitato, fa sì che se si digitano due chevron verrà creato automaticamente qui il documento, ma se il carattere successivo che si digita è un altro chevron, tornerà e rimarrà solo con <<<.

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

Naturalmente questo significa che se si vuole realmente avviare un qui doc con un gallone, che dovrete grezzo inserto esso, C-q<. Quindi dipende da cosa fai di più, se fai più stringhe qui che qui documenti, questo può essere bello avere, anche se non lo fai, è raro che tu voglia iniziare un documento qui con un chevron e essere scomodo.

inserisci qui la descrizione dell'immagine


Ah, è carino!
glucas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.