Dlaczego wpisanie „<<<” zamiast tego powoduje wyświetlenie „<< EOF \ n <” w trybie skryptu powłoki?

13

Ilekroć edytuję skrypt powłoki w emacsie i wpisuję trzy szewrony, aby przekierować nieprzetworzony ciąg na standardowe wejście, emacs wstawia znaki „EOF” i nową linię między nimi, więc

cat <<< 'some string'

staje się

cat <<EOF
< 'some string'

Mogę cofnąć się i usunąć dodatkowe znaki, aby uzyskać bufor w żądanym stanie, ale jest to bardzo wstrętne zachowanie i wydaje się, że dzieje się to tylko w trybie skryptu powłoki, który zwykle jest jedynym czasem, kiedy wpisuję ten wzorzec. Czy istnieje sposób na wyłączenie tego zachowania?

Erik
źródło

Odpowiedzi:

13

Jest to spowodowane przez sh-electric-here-document-mode. Po włączeniu <<wstawi szkielet dokumentu tutaj.

Jest to domyślnie włączone. Możesz go wyłączyć za pomocą haka, takiego jak:

(add-hook 'sh-mode-hook (lambda () (sh-electric-here-document-mode -1)))
glucas
źródło
4
Inną opcją jest oczywiście wstawianie za <<<pomocą C-3 <.
glucas
1
Dziękujemy za pokazanie, jak to wyłączyć. Ten tryb sh-electric-here-document jest raczej bezużyteczną funkcją, IMO.
Dan Molding
Ponadto: sh-mode-hooknie działało dla mnie, ale działało sh-set-shell-hook.
Felipe Lema,
17

glucas ma dokładnie rację, ale aby uzupełnić swoją odpowiedź, mam ten fragment kodu, którego użyłem, aby sprawić, by wstawianie dokumentów było trochę mądrzejsze.

Ta rada w połączeniu z sh-electric-here-document-modewłączoną sprawi, że jeśli wpiszesz dwa szewrony, utworzony zostanie tutaj automatyczny dokument, ale jeśli następny znak, który wpiszesz, będzie innym szewronem, zostanie on cofnięty i pozostanie tylko <<<.

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

Oczywiście oznacza to, że jeśli rzeczywiście chcą rozpocząć tutaj doc z Chevron, musisz się surowy wkładka nim C-q<. To zależy od tego, co robisz więcej, jeśli wykonasz więcej tutaj łańcuchów niż tutaj dokumentów, to może być miło mieć, nawet jeśli nie, rzadko zdarza się, że chcesz zacząć tutaj dokument z szewronem i być niewygodnym.

wprowadź opis zdjęcia tutaj

Jordon Biondo
źródło
Ach, to miło!
glucas,