すべての読み取り専用バッファに対して実行されるフックはありますか


7

show-trailing-whitespace編集可能なファイルを有効にしshow-trailing-whitespace、読み取り専用ファイルを無効にしたい。私はもう試した

(defun my/read-only-whitespace ()
  (setq-local show-trailing-whitespace (not buffer-read-only)))

(setq-default show-trailing-whitespace t)
(add-hook 'read-only-mode-hook #'my/read-only-whitespace)

しかし、これは私がread-only-mode手動で有効にした場合にのみ機能するようです。自動的に読み取り専用になるバッファー(読み取り専用ファイルなど)を開くと、フックが実行されません。

すべての読み取り専用バッファに対して実行されるフックはありますか?

回答:


6

これを任意のバッファーで機能させたい場合は、ファイル訪問バッファーだけfind-file-hookでなく、適切ではありません。(「すべてのバッファ」と言いましたが、編集可能/編集不可の「ファイル」についても話しました。)

すべてのバッファで機能させたい場合は、これが1つの解決策です。

(defun my-show-trailing-ws ()
  "Show trailing whitespace in the current buffer, unless it is read-only."
  (setq-local show-trailing-whitespace (not buffer-read-only)))

(add-hook 'post-command-hook 'my-show-trailing-ws)

必要に応じて、マイナーモードコマンドでそれをラップできます。

もう1つの可能性はアイドルタイマーを使用するpost-command-hookことですが、探しているものには問題ないようです。

私の知る限り、の変更に対応するフックはありませんbuffer-read-only。ただし、Emacs 26以降を使用している場合は、関数add-variable-watcherを使用して、変数buffer-read-onlyが変更されるたびに末尾の空白を表示するかどうかを切り替えることができます。

(add-variable-watcher 'buffer-read-only 'foo) ; Add watcher `foo'

(defun foo (symbol newval operation where) ; 100% untested...
   "Show trailing whitespace in the current buffer, unless it is read-only."
   (when (and (eq symbol 'buffer-read-only)
              (memq operation '(set let))
              (eq where (current-buffer)))
     (setq-local show-trailing-whitespace (not newval))))

すべてのコマンドの後にこの関数を実行するのは少しやり過ぎのようです。彼らの簡単な方法はありませんか?
モヤモ2018年

@Moyamo試してみて、emacsの動作が遅くなるかどうかを判断してください。私の賭けでは、このコードが原因でCPUの使用が遅くなったり、増加したりすることに気付かないでしょう。心配な場合my-show-trailing-wsは、コンパイルされていることを確認してください。
Harald Hanche-Olsen 2018

Emacs 26の変数ウォッチャーソリューションはうまく機能します。
GDP2

1

find-file-hookバッファの読み取り専用ステータスを使用して確認できます。

(defun my/read-only-whitespace ()
  (when buffer-read-only
    (setq-local show-trailing-whitespace (not buffer-read-only))))
(add-hook 'find-file-hook 'my/read-only-whitespace)

@Drewが言ったように、これはorg-agendaバッファーのような特別なバッファーでは機能しません。
モヤモ2018年

1
彼はそれについて正しい。しかし、あなたがその一般性を望んでいたかどうかは私には明らかではありませんでした。(たぶん、あなたにもはっきりしていなかったかもしれません…)
Harald Hanche-Olsen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.