2011/01/08

windows(cygwin) + emacs + tramp + ssh(plink)

気軽に導入を試みたらハマったのでメモ。

何ができるのか

emacs で普段通り C-x C-f で下記のように
/ssh:valvallow@example.com#22:~/.emacs
とか
/plink:valvallow@example.com#22:~/cap/dev/js/hello.js
というように入力すると、ssh で入って編集するようなサーバのファイルを手元の emacs からローカルファイルを扱うかのように編集できたりします。
  • ファイルの編集
  • ディレクトリを開く
  • ローカルファイルをサーバへコピーする
など、たいていのことはできそうです。
めちゃくちゃ便利ですねコレ。。

これまで TeraTerm を使っていましたが、今後出番が減りそうです。

インストール

現時点(2011/01/08)で最新の tramp-2.2.0.tar.gz を cygwin の bash で make するとコケるみたいです。
複数のバージョンを試してみましたが、tramp-2.1.19.tar.gz(tramp-2.1.9.tar.gz ではない)でうまくいきました。
の download から落として展開したディレクトリで
$ LANG=C ./configure --prefix=/cygdrive/c/emacs/tramp --with-emacs=/cygdrive/c/emacs/bin/emacs --with-lispdir=/cygdrive/c/emacs/site-lisp/tramp
$ LANG=C make
$ make install
で完了。
prefix とか lispdir はお好みで。

plink は putty から windows 用の最新のバイナリを落としてインストールすれば OK です。

Emacs

私の場合。
(prefer-coding-system 'utf-8-unix)
(modify-coding-system-alist 'process "plink" 'utf-8-unix)

(setenv "PATH"
        (apply #'concat
               `(,@(intersperse ";" (expand-file-names
                                     "~/../Program Files/PuTTY"
                                     "~/../Program Files/PuTTY"
                                     "~/../Program Files/PuTTY"
                                     "~/../Program Files/PuTTY"
                                     "~/../cygwin/usr/local/bin"
                                     "~/../cygwin/usr/bin"
                                     "~/../cygwin/bin"))
                 ,(getenv "PATH"))))

(require 'tramp)
(setq tramp-debug-buffer t)
(setq tramp-completion-without-shell-p t)
(setq tramp-shell-prompt-pattern "^[ $]+")

(defvar tramp-ssh-ppk (expand-file-name "~/.ssh/private-key.ppk"))
(defvar tramp-serversman `("serversman"
                           (tramp-login-program "plink")
                           (tramp-login-args (("%h")
                                              ("-l" "%u")
                                              ("-P" "%p")
                                              ("-ssh")
                                              ("-i" ,tramp-ssh-ppk)))
                           (tramp-remote-sh "/bin/sh")
                           (tramp-copy-program nil)
                           (tramp-copy-args nil)
                           (tramp-copy-keep-date nil)
                           (tramp-password-end-of-line "xy")
                           (tramp-default-port 22)))

(add-to-list 'tramp-methods tramp-serversman)

家ではもっぱら serversman に接続するのですが、会社でも使いたいので tramp-methods にそれぞれの設定を追加しました。上記の設定は serversman のものだけです。

よって使い方もこのようになります。
C-x C-f
/serversman:valvallow@example.com#22:~/cap/dev/js/hello.js
ポートの指定の仕方がわからず四苦ハックしました。。
usernamme@example.com#22 の「#」以降に指定すれば OK です。
デフォルトの設定で 22 にしてあるようなので、特に指定がなければ username@example.com だけでも可。

補足1

ppk ファイルは秘密鍵を plink と同じディレクトリにある puttygen に通せば生成できます。

補足2

expand-file-names, intersperse は私的に定義しているものなので、上記の設定をそのままコピペしても動きません。
一応貼っておきます。。
(defun expand-file-names (&rest rpaths)
  (mapcar #'(lambda (rpath)
             (expand-file-name rpath))
          rpaths))

(defun pair-fold1 (proc seed ls)
  (loop
     for e on ls by #'cdr
     for acc = (funcall proc ls seed)
     then (funcall proc e acc)
     finally (return acc)))

(defun single? (ls)
  (and (not (null ls))
       (null (cdr ls))))

(defun intersperse (item ls)
  (pair-fold1 #'(lambda (pr acc)
                  (if (single? pr)
                      (cons (car pr) acc)
                      (cons item (cons (car pr) acc))))
              '() (reverse ls)))

蛇足

plink 自体はこんな感じで使えました。
plink -ssh -P port -i private-key.ppk username@example.com

参考

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

0 件のコメント:

コメントを投稿