Jak wyłączyć tutaj uzupełnianie dokumentów emacs

11

Podczas edycji pliku skryptu bash za pomocą emacsa i próby wprowadzenia <<<, przy drugim <emacsie wstaw szablon dla dokumentu tutaj, jak w poniższym przykładzie:

<<EOF

EOF

To nie jest pożądany wynik, ponieważ wprowadziłbym literał <<<.

W tej chwili uciekam się do wchodzenia < < <, a następnie do usuwania spacji, ale wolę, aby móc bezpośrednio do nich wchodzić.

enzotib
źródło
2
Nie to, że zbytnio mnie to obchodzi, ale miło byłoby zostawić komentarz do recenzji.
enzotib

Odpowiedzi:

12

W rzeczywistości nie ma potrzeby niestandardowej my-disable-here-documentfunkcji Toma ponownego przypisywania klawiszy. Tę funkcję można włączyć i wyłączyć za pomocą sh-electric-here-document-mode:

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

(Można go również przełączyć na aktywny bufor za pomocą M-x sh-electric-here-document-mode.)

Danlei
źródło
Ponadto: sh-mode-hooknie działało dla mnie, ale działało sh-set-shell-hook.
Felipe Lema,
6

Powiązanie <do self-insert-commandw trybie bash, a następnie wstawi tylko znak.

Domyślnie jest to związane z sh-maybe-here-documenttrybem bash i ta funkcja wykonuje automatyczne wstawianie.

Oto sposób na odzyskanie klucza:

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

(defun my-disable-here-document ()
  (local-set-key "<" 'self-insert-command))
Tomek
źródło
Czy możesz podać więcej informacji na temat tego, co dokładnie wstawić do pliku init? Przykro mi, ale jestem użytkownikiem emacsa dla początkujących.
enzotib,
Do mojej odpowiedzi dodałem prosty przykład. Wyłącza automatyczne wstawianie do każdego rodzaju powłoki, nie tylko bash, ale prawdopodobnie tego właśnie chcesz.
Tom
To rozwiązanie już nie działa (testowane na emacs 24.3), ponieważ <jest self-insert-commanddomyślnie powiązane .
T. Verron
2

Jeśli jedynym powodem, dla którego chcesz wyłączyć zachowanie tutaj-dokumentu, jest to, że uniemożliwia on wstawienie tutaj-ciągu <<<, to powiązanie C-<z funkcją, która zawiera (insert "<<<"), zadziała i nadal zezwala na automatyczny szablon tutaj-dokumentu

(defun my-here-string() 
  "Insert <<< (eg. for a bash here-string)" 
  (interactive)
  (insert "<<<"))
(global-set-key (kbd  "C-<") 'my-here-string)
Peter.O
źródło
1
Dziękuję, ciekawe rozwiązanie, ale nadal wolę odpowiedź @ Toma, ponieważ uważam, że to uzupełnienie jest złe dla pliku skryptu bash.
enzotib
2

Wchodzę <<<jak M-3<w trybie powłoki.

choroba
źródło
1

Rodzaj < C-q < <

Miś
źródło
Jest krótszy niż moje obejście i być może przydaje się również w innych sytuacjach, ale nie do końca to, czego szukałem. Mimo wszystko dziekuję.
enzotib
1

Po obejrzeniu: http://web.mit.edu/dosathena/sandbox/emacs-19.28/lisp/sh-script.el wpadłem na to rozwiązanie:

;; 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.")
vee
źródło