在shell脚本模式下,为什么键入'<<<'却会产生'<< EOF \ n <'?


13

每当我在emacs中编辑shell脚本并键入三个V形符号以将原始字符串重定向到stdin时,emacs都会在它们之间插入字符'EOF'和换行符,因此

cat <<< 'some string'

变成

cat <<EOF
< 'some string'

我可以返回并删除多余的字符,以使缓冲区处于所需的状态,但这是非常令人讨厌的行为,它似乎仅在shell脚本模式下发生,这通常是我唯一键入此模式的时间。有办法禁用此行为吗?

Answers:


13

这是由引起的sh-electric-here-document-mode。启用后,<<将在此处插入文档框架。

默认情况下启用。您可以使用钩子禁用它,例如:

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

4
当然,另一种选择是插入<<<C-3 <
glucas 2014年

1
感谢您展示如何关闭它。此sh-electric-here-document-mode是IMO一项毫无用处的功能。
Dan Moulding

另外:sh-mode-hook对我没用,但是对我sh-set-shell-hook有用。
费利佩·勒马

17

glucas是完全正确的,但是为了补充他的答案,我使用了这段代码,使自己的文档插入更加智能。

该建议与sh-electric-here-document-mode启用功能结合使用,因此,如果您键入两个V形,则会创建自动的此处doc,但是如果您键入的下一个字符是另一个V形,则会还原该字符,并且只剩下<<<。

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

当然,这意味着,如果您实际上想使用V形图形开始此处文档,则需要将其原始插入C-q<。因此,这取决于您要做什么,如果您在此处执行的字符串多于在此处文档,那么这样做可能会很不错,即使您不这样做,也很少有人希望使用人字形文字在此处创建文档,不便。

在此处输入图片说明


啊,太好了!
glucas 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.