Чому введення "<<<" замість цього створює "<< EOF \ n <" в режимі скрипту оболонки?


13

Щоразу, коли я редагую скрипт оболонки в emacs і набираю три шеврони, щоб перенаправити необроблений рядок на stdin, emacs вставляє символи "EOF" та новий рядок між ними,

cat <<< 'some string'

стає

cat <<EOF
< 'some string'

Я можу повернутися назад і видалити зайві символи, щоб отримати буфер у бажаному стані, але це дуже неприємна поведінка, і, здається, це відбувається лише в режимі скрипта оболонки, що зазвичай є єдиним випадком, коли я набираю цей шаблон. Чи можна відключити таку поведінку?

Відповіді:


13

Це викликано sh-electric-here-document-mode. Якщо це ввімкнено, <<вставити сюди скелет документа.

Це ввімкнено за замовчуванням. Ви можете відключити його за допомогою гачка, наприклад:

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

4
Ще один варіант, звичайно, - вставити <<<с C-3 <.
глюкас

1
Дякуємо, що показали, як її вимкнути. Цей режим sh-electric-тут-документа - досить марна функція, IMO.
Dan Molding

Також: sh-mode-hookне працював для мене, але sh-set-shell-hookробив.
Феліпе Лема

17

glucas абсолютно правильний, але для доповнення його відповіді у мене є цей фрагмент коду, який я використовував, щоб зробити вставку doc трохи розумнішою.

Ця порада в поєднанні з 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<. Отже, це залежить від того, чим ви робите більше, якщо ви робите тут більше рядків, ніж тут, документів, це може бути приємно мати, навіть якщо ви цього не зробите, рідко ви захочете створити тут документа з шевроном і бути незручним.

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


Ах, це приємно!
глюкас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.