Mengapa mengetik '<<<' alih-alih menghasilkan '<< EOF \ n <' saat dalam mode skrip shell?

13

Setiap kali saya mengedit skrip shell di emacs dan mengetikkan tiga chevron untuk mengarahkan ulang string mentah ke stdin, emacs menyisipkan karakter 'EOF' dan baris baru di antara mereka, jadi

cat <<< 'some string'

menjadi

cat <<EOF
< 'some string'

Saya dapat kembali dan menghapus karakter tambahan untuk mendapatkan buffer dalam keadaan yang saya inginkan, tetapi ini adalah perilaku yang sangat menjengkelkan, dan sepertinya hanya terjadi dalam mode skrip shell, yang biasanya merupakan satu-satunya saat saya mengetikkan pola ini. Apakah ada cara untuk menonaktifkan perilaku ini?

Erik
sumber

Jawaban:

13

Ini disebabkan oleh sh-electric-here-document-mode. Saat diaktifkan, <<akan menyisipkan kerangka dokumen di sini.

Ini diaktifkan secara default. Anda dapat menonaktifkannya dengan sebuah kail, seperti:

(add-hook 'sh-mode-hook (lambda () (sh-electric-here-document-mode -1)))
glukas
sumber
4
Pilihan lain tentu saja adalah untuk menyisipkan <<<dengan C-3 <.
glukas
1
Terima kasih telah menunjukkan cara mematikannya. Mode sh-electric-here-document-mode ini adalah fitur yang agak tidak berguna, IMO.
Dan Moulding
Juga: sh-mode-hooktidak bekerja untuk saya, tetapi sh-set-shell-hookberhasil.
Felipe Lema
17

Glucas benar-benar tepat, tetapi untuk melengkapi jawabannya, saya memiliki kode ini yang saya gunakan sendiri untuk membuat penyisipan dokumen di sini sedikit lebih pintar.

Saran ini, ditambah dengan sh-electric-here-document-modediaktifkan, membuatnya agar jika Anda mengetikkan dua chevron, otomatis di sini doc akan dibuat, tetapi kemudian jika karakter berikutnya yang Anda ketik adalah chevron yang lain, ia akan kembali dan Anda akan dibiarkan hanya dengan <<<.

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

Tentu saja ini berarti bahwa jika Anda benar-benar ingin memulai dokumen di sini dengan chevron, Anda harus memasukkannya C-q<,. Jadi itu tergantung pada apa yang Anda lakukan lebih banyak, jika Anda melakukan lebih banyak string di sini daripada di sini docs, ini bisa menyenangkan untuk dimiliki, bahkan jika Anda tidak melakukannya, jarang Anda ingin memulai doc di sini dengan chevron dan merasa tidak nyaman.

masukkan deskripsi gambar di sini

Jordon Biondo
sumber
Ah, bagus sekali!
glukas