Как отключить emacs здесь завершение документа


11

Когда вы редактируете файл bash-скрипта с помощью emacs и пытаетесь войти <<<, во второй части <emacs вставьте шаблон для документа here, как в следующем примере:

<<EOF

EOF

Это не желаемый вывод, потому что я бы ввел литерал <<<.

На данный момент я прибегаю к вводу < < <, а затем удаляю пробелы, но предпочитаю, чтобы мне было разрешено ввести его напрямую.


2
Не то чтобы я слишком переживал, но было бы неплохо оставить комментарий для понижения.
энзотиб

Ответы:


12

На самом деле нет необходимости в том, чтобы пользовательская my-disable-here-documentфункция Тома связывала клавиши. Эта функция может быть включена и отключена с помощью sh-electric-here-document-mode:

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

(Он также может быть переключен для активного буфера через M-x sh-electric-here-document-mode.)


Кроме того: sh-mode-hookне работал для меня, но sh-set-shell-hookсделал.
Фелипе Лема

6

Привязать <к self-insert-commandв режиме bash, а затем он будет вставлять только символ.

По умолчанию он привязан к sh-maybe-here-documentрежиму bash, и эта функция выполняет автоматическую вставку.

Вот способ отскока ключа:

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

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

Можете ли вы дать больше информации о том, что именно вставить в файл инициализации? Извините, но я начинающий пользователь emacs.
энзотиб

Я добавил простой пример к своему ответу. Он отключает автоматическую вставку в любой вид оболочки, не только в bash, но и, вероятно, именно то, что вам нужно.
Том

Это решение больше не работает (протестировано на emacs 24.3), потому что <оно связано self-insert-commandпо умолчанию.
Т. Веррон

2

Если единственная причина, по которой вы хотите отключить поведение here-doc, заключается в том, что он не позволяет вставлять здесь строку <<<, тогда будет работать привязка C-<к функции, которая содержит (insert "<<<")эту функцию , и по-прежнему разрешать автоматический шаблон here-doc.

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

1
Спасибо, интересное решение, но я все еще предпочитаю ответ @ Tom, потому что считаю неправильное завершение для файла сценария bash.
энзотиб


1

Тип < C-q < <


Это короче, чем мой обходной путь, и, возможно, полезно для других ситуаций, но не совсем то, что я искал. В любом случае, спасибо.
энзотиб

1

Взглянув на: http://web.mit.edu/dosathena/sandbox/emacs-19.28/lisp/sh-script.el, я пришел к такому решению:

;; 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.")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.