シェルスクリプトモードで「<<<」と入力すると「<< EOF \ n <」が生成されるのはなぜですか?


13

emacsでシェルスクリプトを編集し、3つのシェブロンを入力して生の文字列を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 <です。
グルーカス14

1
無効にする方法を示してくれてありがとう。このsh-electric-here-document-modeは、IMOというかなり役に立たない機能です。
ダンモールディング

またsh-mode-hook、私にとってはうまくいきませんでしたが、sh-set-shell-hookうまくいきました。
フェリペLEMA

17

glucasは正確に正しいのですが、彼の答えを補足するために、ここにdocの挿入を少し賢くするために自分で使ったこのコードがあります。

このアドバイスは、sh-electric-here-document-mode有効化と相まって、2つのシェブロンを入力すると自動hereドキュメントが作成されるようにしますが、次に入力する文字が別のシェブロンである場合、それは元に戻り、<<<だけが残されます。

(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<。したがって、ここでのドキュメントよりも多くの文字列をここで行う場合は、これを行うことにより異なります。ご不便をおかけします。

ここに画像の説明を入力してください


ああ、いいね!
グルーカス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.