Почему ввод «<<<» вместо этого приводит к «<< EOF \ n <» в режиме сценария оболочки?

13

Всякий раз, когда я редактирую скрипт оболочки в emacs и набираю три шеврона, чтобы перенаправить необработанную строку в stdin, emacs вставляет символы 'EOF' и новую строку между ними, поэтому

cat <<< 'some string'

становится

cat <<EOF
< 'some string'

Я могу вернуться и удалить дополнительные символы, чтобы получить буфер в нужном мне состоянии, но это очень неприятное поведение, и, похоже, это происходит только в режиме сценария оболочки, который обычно является единственным разом, когда я набираю этот шаблон. Есть ли способ отключить это поведение?

Erik
источник

Ответы:

13

Это вызвано sh-electric-here-document-mode. Когда включено, <<вставит сюда скелет документа.

Это включено по умолчанию. Вы можете отключить его с помощью хука, например:

(add-hook 'sh-mode-hook (lambda () (sh-electric-here-document-mode -1)))
glucas
источник
4
Другой вариант, конечно, это вставить <<<с C-3 <.
glucas
1
Спасибо, что показали, как его отключить. Этот sh-electric-here-document-mode - довольно бесполезная функция, IMO.
Дэн Молдинг
Кроме того: sh-mode-hookне работал для меня, но sh-set-shell-hookсделал.
Фелипе Лема
17

Глюкас в точности верен, но в дополнение к его ответу у меня есть этот фрагмент кода, который я использовал сам, чтобы сделать здесь вставку документа немного умнее.

Этот совет в сочетании с sh-electric-here-document-modeвключенным делает так, что если вы наберете два шеврона, будет создан автоматический документ, но если следующий набранный вами символ - другой шеврон, он вернется, и у вас останется только <<<.

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

Конечно , это означает , что если вы на самом деле хотите , чтобы начать здесь документ с шевроном, вам нужно сырье вставить его, C-q<. Так что это зависит от того, что вы делаете больше, если вы делаете больше здесь строк, чем здесь документов, это может быть приятно иметь, даже если вы этого не сделаете, редко вы захотите начать здесь документ с шевроном и быть неудобным.

введите описание изображения здесь

Джордон Биондо
источник
Ах, это мило!
glucas