Cara menonaktifkan emacs di sini penyelesaian dokumen


11

Saat mengedit file skrip bash dengan emacs, dan mencoba masuk <<<, pada <emacs kedua masukkan templat untuk dokumen di sini, seperti dalam contoh berikut:

<<EOF

EOF

Ini bukan output yang diinginkan, karena saya akan memasukkan literal <<<.

Untuk saat ini saya memilih untuk masuk < < <, dan kemudian menghapus spasi, tetapi saya lebih suka diizinkan untuk masuk secara langsung.


2
Bukannya aku terlalu peduli, tapi alangkah baiknya meninggalkan komentar untuk downvote.
— enzotib

Jawaban:


12

Sebenarnya tidak perlu untuk my-disable-here-documentfungsi kustom Tom rebinding tombol. Fitur ini dapat diaktifkan dan dinonaktifkan dengan sh-electric-here-document-mode:

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

(Ini juga dapat diaktifkan untuk buffer aktif via M-x sh-electric-here-document-mode.)


Juga: sh-mode-hooktidak bekerja untuk saya, tetapi sh-set-shell-hookberhasil.
— Felipe Lema

6

Bind <ke self-insert-commanddalam mode bash dan kemudian hanya akan memasukkan karakter.

Secara default itu terikat sh-maybe-here-documentketika dalam mode bash dan fungsi itu melakukan penyisipan otomatis.

Ini cara untuk mengembalikan kunci:

(add-hook 'sh-set-shell-hook 'my-disable-here-document)

(defun my-disable-here-document ()
  (local-set-key "<" 'self-insert-command))

Bisakah Anda memberikan beberapa informasi lebih lanjut tentang apa yang harus dimasukkan secara tepat ke file init? Maaf, tapi saya pengguna pemula emacs.
— enzotib

Saya menambahkan contoh sederhana untuk jawaban saya. Ini menonaktifkan penyisipan otomatis dalam setiap jenis shell, bukan hanya bash, tetapi mungkin itulah yang Anda inginkan.
— Tom

Solusi ini tidak berfungsi lagi (diuji pada emacs 24.3), karena <terikat self-insert-commandsecara default.
— T. Verron

2

Jika satu-satunya alasan Anda ingin menonaktifkan perilaku di sini-doc adalah bahwa hal itu mencegah Anda memasukkan string di sini- <<<, kemudian mengikat C-<ke fungsi yang berisi (insert "<<<")akan berfungsi, dan masih memungkinkan templat otomatis di sini-doc

(defun my-here-string() 
  "Insert <<< (eg. for a bash here-string)" 
  (interactive)
  (insert "<<<"))
(global-set-key (kbd  "C-<") 'my-here-string)

1
Terima kasih, solusi yang menarik, tetapi saya masih lebih suka jawaban @ Tom, karena saya menganggap bahwa penyelesaian salah untuk file skrip bash.
— enzotib


1

Tipe < C-q < <


Ini lebih pendek daripada solusi saya, dan mungkin berguna untuk situasi lain juga, tetapi tidak persis apa yang saya cari. Terima kasih.
— enzotib

1

Setelah melihat: http://web.mit.edu/dosathena/sandbox/emacs-19.28/lisp/sh-script.el Saya menemukan solusi ini:

;; disable the automatic EOF generation in Shell Mode
(defvar sh-use-prefix nil
  "If non-nil when loading, `$' and `<' will be  C-c $  and  C-c < .")
(defvar sh-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (if sh-use-prefix "\C-c<" "<")
      (local-set-key "<" 'self-insert-command))
   map)
  "Keymap used in Shell-Script mode.")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.