emacsで別のホストにある違うユーザーが所有するファイルを編集する

 お仕事で作業をしていると、踏み台サーバの裏側のマシンにあるスクリプトをいじってデータの統計をとって結果を見る、というようなことをやらないといけないことがよくある。
 ややこしい作業であれば小さなデータを手元に用意してそこでスクリプトを作って、うまく動いてからscpでサーバ側にコピー、ということをやるのだが、ちょっとした作業であればリモートのファイルを直接編集してしまいたくなることも多い。
 しかし、リモートマシンにはemacsが入っていなかったり、入っていても.emacsの設定がいろいろ足りなかったり(iswitchb-modeとgoto-lineがないと辛くて死にそう)するので、手元にあるemacsを使ってリモートにあるファイルを直接編集する方法が望まれていた。
 簡単なケースであればsshfsを使えばいいのだが、リモートマシンにログインした後、さらにsudoで別のユーザーにならないといけない、というような場合にはsshfsでは対応できない。例えば、www-dataの権限でファイルをちょっと書き換える、とか。
 これまでは、サーバー側でnanoを使ってスクリプトを書くとかいじらしいことをしていたのだが、いい加減そういった人生の無駄使いもよろしくないだろうということで、Emacsのtramp podeを使ってみることにした。
 tramp modeというのがなんなのかは私もよくわかっていないのだが、リモートのファイルを手元のemacsで開いたり、別のユーザー(rootとか)としてファイルを開くことができる便利な仕組みのようだ。新しめのEmacsだとデフォルトで入っているので、インストール作業などは特に必要ない。
 今回のケースでは、踏み台に関してはsshの方で解決し、1段でログイン出来る状態にしてあるものとする。(正直、tramp modeのプロクシの設定がよくわからないので、あまり複雑なことはしたくない)
 このようなケースでは、あらかじめ.emacsの方に設定が必要であり、tramp-default-proxies-alistというリストをいじらなければならない。以下にその例を示す。

(require 'tramp)
(add-to-list 'tramp-default-proxies-alist
             '("example.jp" "hoge" "/sshx:%h:"))

 tramp-default-proxies-alistに渡すリストは、ホスト名、ユーザー名、プロクシの3つ組である。ホスト名かユーザー名のいずれか(両方?)がマッチしたプロクシが使われる。"/sshx:%h:"というのは、sshxという手段(sshのちょっと特殊な場合)で%h(この場合だとexample.jp)にログインしろという事を意味している。
 このように書いておいて、C-x C-fでファイルを開くときに/sudo:hoge@example.jp:/path/to/fileと打つと、sudo用のパスワードを聞かれるので、それを入力すると、example.jpでhogeユーザーとしてファイルを開くことができる。私の理解が正しければ、"hoge"というのは別に設定する必要はなく、.emacsでは'("example.jp" nil "/sshx:%h:"))となっていれば良さそうに思えるのだが、実際にはそれではダメなようだ。どうもまだ理解が足りないらしい。
 add-to-listは複数書いた場合、下の方に書いた条件から試していって、最初にマッチしたものを使う、という仕様のようだ。設定する順番を間違えると、思っていたのと違う挙動をして混乱するかもしれないので、注意する必要がある。
 tramp modeは正直ちょっと分かりにくくて、人にはあまりおすすめしづらいのだが、リモートのファイルを手元のemacsで編集できるのはとても便利である。一度使うとやめられない。