困ってること
Mac OS XのEmacsでTRAMP (ange-ftp) を使っているとたまにEntering Extended Passive Mode
などと言われて操作がブロックされることがある (接続先のサーバによるようです)。
Extended Passive Modeを切ってやる、具体的にはftpプロセスに対してepsv4 off
を送りつけてやるとこれが解決する。が、ange-ftpにそのような機能はない。
解決策らしきものを見つけたのだがどうもhookを実行してくれていない。何故なのか深く追いかけていないので謎。ange-ftpのコードを読む限りでは呼んでるっぽいんですがね…。しょうがないのでadviceを使ってやることにした。
解決
~/.emacs.d/init.el
;;;
;;; TRAMP関連の設定
;;;
(setq ange-ftp-try-passive-mode t) ; 必ずpassive modeに
(when (equal system-type 'darwin) ; Macのftpはextended passivemodeで酷いことになるのでそれをoffにする
(defadvice ange-ftp-passive-mode (before ange-ftp-epsv4-off)
(ange-ftp-raw-send-cmd proc "epsv4 off"))
(ad-activate 'ange-ftp-passive-mode))
見ればわかるが、passive modeにするための関数 (ange-ftp-passive-mode
) に引っかけている。なのでange-ftp-try-passive-mode
やange-ftp-passive-host-alist
などを使ってpasive modeでやりとりするように設定しなければなりません。
バージョン
これはGnu Emacs 24.2.1とMac OS X 10.7.5 (Lion) での話です。でも多分他のバージョンでも起こると思います。
参考文献
-
idx
add-hook
を使った解決策。でもうちのでは動かない。why? - Entering Extended Passive Modeで詰まった場合
-
pkgsrc 関連のネットワークの設定 最後の方にextended passive modde及びftpの初期化ファイル~/.netrcについての記述がある。ただしange-ftpは
macdef init
行以下を無視するので設定したとしても解決しない。