Emacs x tramp でネットワーク上のファイルにアクセス

| コメント(0) | トラックバック(0)

ここ最近 Emacs ネタばかりなんですけど、許してやってください。っで今回は tramp って機能を紹介します。どうしても使ってみたくて色々調べました。むしろ紹介っていうより自分メモだったりしますけどw

tramp はリモートにあるソースをあたかもローカルのように扱える手段 (Emacs 拡張の Elisp) で Emacs が SSH でリモートのファイルコピーをとって来てくれます。しかもローカルの Emacs で保存するとリモートのサーバーのファイルを更新してくれちゃうのです。

だったら ange-ftp でいいじゃんって思うかもしれませんが、リモートでセキュアにするため FTP を許してないとか SSH でパスフレーズだけでログインするように設定してる場合は断然 tramp でしょう。サーバーログインして編集とかでもいいんですけど、ワンアクション増えるのも面倒ですし、使い慣れたローカルマシンからアクセスしたいってのもありますよね。僕の場合サーバーよりローカルマシンの方がスペックが高いんで機体のパフォーマンス的にもローカルからアクセスした方が都合がいいんですよ。

通信方式としては rsh, rcp, ssh, scp, rsync, sshx, scpx, telnet, plink, pscp, fcp, ftp, smb をサポートしているらしい。plink が使えるってことは Meadow でも使えそうです。

インストールについて

出来たら最新版で使える方法を書いておければいいんですけど、どうも僕の環境 (coLinux Debian) だと最新版で動かなかったたので apt-get でとってきた Ver 2.0.54 を使うことにしました。Mac の Carbon Emacs はデフォルトで Var 2.0.55 がインストール済みでした。Terminal の Emacs21 では入ってないと思います。MacPorts にもパッケージがないのでソースからダウンロードしてください。

追記

Carbon Emacs は下のようにすればインストール出来た

./configure ¥
    --prefix=/Applications/Emacs.app/Contents/Resources ¥
    --with-emacs=/Applications/Emacs.app/Contents/MacOS/Emacs ¥
    --with-lispdir=/Applications/Emacs.app/Contents/Resources/lisp/net

設定方法

.emacs に下記の設定を書き足します。coLinux Debian では tramp.el を読み込むだけだとサーバーに入れなくてエラーを返したので分岐で Linux 用の設定を書き足しました。shell のところは自分の環境に合わせてください。

(require 'tramp)
(setq tramp-default-method "ssh")
;(setq tramp-debug-buffer t) ;; Debug Buffer の表示
;;; Linux の時だけ読み込む
(cond
 ((string-match "linux" system-configuration)
  (nconc  (cadr (assq 'tramp-login-args
         (assoc "ssh" tramp-methods))) '("/bin/zsh" "-i"))
  (setcdr       (assq 'tramp-remote-sh
         (assoc "ssh" tramp-methods))  '("/bin/zsh -i"))
  (setq tramp-completion-without-shell-p t)))

tramp の使い方

使い方はいたってシンプルでファイルを開く時のように C-x C-f で指定します。

C-x C-f /ssh:user@example.com:/path/to/file

設定にもよりますがパスワードかパスフレーズを聞かれるので入力すればリモートのファイルにアクセスしにいきます。リモートにアクセスするので十数秒かかりますが、リモートのファイルをバッファとして読み込むのでその後の動作はローカルの Emacs を触るのと変わりなく使えます。

keychain や ssh-agent を使っている場合は入力なしでファイルにアクセスします。Mac の場合は Carbon Emacs を Terminal から起動すれば(もちろん keychain や ssh-agent を使っていて)入力なしでいけます。

またリモート側で root でのログインを許可していない場合でも tramp で su や sudo を指定することによって管理者権限のファイルを編集できます。下みたいな感じで入力。

C-x C-f /multi:ssh:user@example.com:su:root@localhost:/path/to/file
C-x C-f /multi:ssh:user@example.com:sudo:root@localhost:/path/to/file

参考資料とか