Windows環境にてEMACS TRAMP がやたらと重くなる場合の解決法について説明します。
以前に、Emacs Tramp について下記の記事を公開しました。 Emacs Tramp でリモート上のファイルを直接編集する方法|Windowsにも対応 このWindows環境で使っていて、リモートのファイル編集中にやたらに重くなることが頻発したので、その原因と解決方法を調べました。もし同じ問題で悩んでいる方、参考にしてみてください。 解決法の他に、参考情報としてオートセーブについての簡単な説明と、Tramp の lisp コードのリーディングを載せています。ご参考までに。
動作が重くなるときに起きていること
Windows環境で Tramp モードを使っていて、ときどきやたらに動作が重くなることがありました。
*Message バッファを確認してみると下記のエラーが出ていました。
| |
……オートセーブでこけていました。
ファイル名に:があるのがダメです。GNU/Linuxでは:があっても大丈夫ですが、Windowsはファイル名に:を使えません。
解決法
さまざまな解決法がありそうですが、ここでは簡単にできる2つの方法を示します。
オートセーブを無効化してしまう
えいやっとオートセーブを無効にしてしまうことで回避可能です。
emacs初期化ファイル(.emacs, .emacs.d/init.el)に下記の1行を追加するだけです。これでオートセーブが無効化されます。
「オートセーブなんか使ったことねえぜ!」という方はこれが一番お手軽かなと思います。
| |
Tramp モード時のみ有効なオートセーブファイルの作成場所を明示的に指定する
もう少しスマートな方法が tramp-auto-save-directory変数を設定する方法です。
変数名の通り、Trampモード時のみオートセーブファイルの場所を指定するものです。
これを指定すると、trampがいい感じにオートセーブファイルの名前を変更してくれるようになります。これで問題が解決されます。
| |
【参考】そもそもオートセーブとは?
Emacs にはオートセーブという機能があります。
編集中のファイルを自動で保存する機能です。このオートセーブファイルは編集中のファイルと同じディレクトリに作られます。
例えば/home/user_name/hoge.txt を編集しているときは /home/user_name/#hoge.txt#というファイル名で自動で作成されます。
(デフォルトでは、ファイル内容を変更して「30秒経過」もしくは「300回タイプ」すれば作成されます)
ファイルを編集後にセーブすれば、勝手にオートセーブファイルは削除されます。 このオートセーブファイルですが、編集中のファイルと同じ場所に作成されると散らばってうっとしいので、下記のように特定のディレクトリにまとめるような設定をよくします。
| |
temporary-file-directory はシステムのテンポラリディレクトリです。Windows7 ですと c:/Users/username/AppData/Local/Temp/
です(隠しフォルダ設定されているかもしれません)。
【参考】頑張ってどこで問題が起こっているのかlispをみてみる
問題は、オートセーブファイル名に:があることです。よくみると、/は!に変更してくれています。
きっとどこかにファイル名を変更する処理があるはずです。そこに:を``に変更する処理を追加すればいけそうです。
| |
ということで、Tramp の Lisp コードを眺めてみます。 Emacs をC:/Programs/emacs/ にインストールした場合は下記の場所にあります。
C:/Programs/emacs/share/emacs/25.1/lisp/net/tramp.el.gz
.gzで固められていますので、msys2などで解凍しましょう。
| |
すると tramp.el が取得できます。
その中をガンバって読んでいくと、下記のコードが見つかります。
auto savingがどうのこうのとコメントがありますね。
if (null tramp-auto-save-directory)だとbuffer-file-nameをそのママ使い、null でない場合は\_ / : | [ ]の文字をを置換するようです。
| |
ここまでくれは、 tramp-auto-save-directoryでググってみれば、何かしら情報を得られるはずです。
例えば5.18 Auto-save and Backup configurationがヒットします。 そこに
set the variable tramp-auto-save-directory to direct all auto saves to that location.
と記載がありました。わざわざtramp.elを変更する必要はなさそうですね。
まとめ
この記事では、 Windows で Tramp を使うときにオートセーブで動作が重くなるときの解決法を書きました。
特に難しい設定は必要なく、init.el に1つ設定を追加すればいいだけです。
ついでに、オートセーブの簡単な説明とtrampのlispコードも見てみました。
Windows で Emacs Tramp を使っているときに動作が重くなるという方、ご参考ください!
Note
@shima_tetsuo さんに教えていただきました!ありがとうございます! https://twitter.com/shima_tetsuo/status/811806650432487424