win-sshfsしたファイルをEmacsで編集するといちいち「really edit the buffer?」と聞かれるので自動で返信させる

win-sshfsでsshfsしたときタイムスタンプがずれてるのか,保存の度に上書きしていいか聞かれてしまいます.
global-auto-revert-modeなども意味を成しませんでした.
これをelispで黙らせました.

エラーメッセージ例
hoge.txt has changed since visited or saved.  Save anyway? (y or n) y
hoge.txt changed on disk; really edit the buffer? (y, n, r or C-h) y

できること

Windowsでもリモートのファイルを手元のEmacsで操作できる

結論

init.el(一部)
;; y-or-n-pにy,yes-or-no-pにyes,read-char-choiceにyと答える関数(参考1からコピペ)
(defun auto-yes (old-fun &rest args)
    (cl-letf (((symbol-function 'y-or-n-p) (lambda (prompt) t))
              ((symbol-function 'yes-or-no-p) (lambda (prompt) t))
              ((symbol-function 'read-char-choice) (lambda (prompt chars) '(?y ?n ?r ?? ?\C-h) ?y)))
      (apply old-fun args)))

;; バッファを保存し,一文字書き込み,それを消す関数
;; (ファイルのタイムスタンプがバッファよりも未来になっているため書き込み時に本当に書き込むか聞かれる)
(defun hoge ()
    "Save the buffer even if it is not modified."
    (interactive)
    (save-buffer)
    (insert-char #x4220)
    (delete-backward-char 1))

;; hoge関数に自動yes機能を付与
(advice-add #'hoge :around #'auto-yes)

;; C-x C-sを上書き
(global-set-key (kbd "C-x C-s") 'hoge)

マウントしたファイルかどうかで動作を変更

ただ,これだとマウントしていないファイルにもhoge関数を適用してしまいます.
そこでLドライブにマウントした場合にファイルパスがl:で始まることから,次のようにマウントしたファイルを編集しているときのみhoge関数を使用するようにしています.

C-xC-sの上書き
(global-set-key (kbd "C-x C-s") 
  (lambda()
    (interactive)
    (if (string-match-p "^c:" (spacemacs/show-and-copy-buffer-filename))
         (save-buffer)
         (hoge))))

参考

①自動yes応答機能などコードの大部分はここからコピペしてきました
https://emacs.stackexchange.com/questions/14669/sort-of-autoreply-for-specific-messages-in-minibuffer

②同様のコード
https://stackoverflow.com/questions/6591043/how-to-answer-yes-or-no-automatically-in-emacs

③'file changed on disk' 発生時に内部で呼ばれている関数を見れました
https://stackoverflow.com/questions/2284703/emacs-how-to-disable-file-changed-on-disk-checking

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.