■ emacs 全般で利用できる設定 (一部、MinGW版 emacs 特有の設定を含む)


【お知らせ】


<2018/07/25 追記>
最近の emacs のバージョンでは、tramp-default-method のデフォルトの設定が "scp" や "pscp" の外部転送メソッドになったようです。

<2018/05/07 追記>
tramp の挙動がおかしい時は、emacs を終了後、~/.emacs.d/tramp というファイルを削除してから emacs を再起動してください。

<2017/04/14 追記>
本日発見がありました。Windows版 emacs を GUI で立ち上げて Tramp によりリモートに接続している状態で、Tramp の接続を行っているウィンドウにファイルをドラック&ドロップすると、接続先にそのファイルの送信され格納されるのですね。知りませんでした。

<2015/06/17 追記>
リモートサーバに接続して shell を起動した際に、日本語のファイル名が文字化けしていたのでその対策を追加しました。
(tramp-remote-process-environment に LC_CTYPE の設定を追加した。)

<2014/12/11 追記>
MinGW版 emacs-24.4、emacs-24.5 では、fakecygpty を経由して tramp の ssh を利用している場合に 2936バイト を超えるファイルをインラインメソッドでセーブできなくなりました。
この対策を「fakecygpty を使うための設定」に追加しました。

<2014/10/23 追記>
emacs-24.4 では scpc method は提供されていないようなので、tramp-method を scp に戻しました。tramp-method の説明は以下を参照してください。

【本題】


  • 【重要】 MinGW版 emacs でこの設定を使う場合は、「fakecygpty を使うための設定」を行ってください。
  • 【重要】tramp の外部転送メソッド(以降で説明)を使うと、ファイル転送用のコネクションを張る毎に認証を求められます。このため、公開鍵方式を使っての認証の自動化が必要となります。

CUI で Linux を利用する場合は、公開鍵の設定を行った後、.bash_profile に以下の設定を行ってください。(VirtualBox で Ubuntu Desktop を使う場合などデスクトップ環境が構築されている場合は、GNOME Keyring がいろいろうまくやってくれるようです。)
keychain -q ~/.ssh/id_rsa
source ~/.keychain/$HOSTNAME-sh

# .bash_profile 内に以下の設定がなければ有効とする
# [ -r ~/.bashrc ] && source ~/.bashrc
keychain がインストールされていない場合は、インストールが必要です。
sudo -E apt install keychain

Cygwin が利用環境の場合は、以下の設定を参考としてください。
(2019/09/13 追記)WSL が利用環境の場合は、ssh-agent-wsl の利用により Windows 側の ssh-agent に WSL から秘密鍵を登録でき、また Windows の ssh-agent を WSL からも利用できるようになります。



一般的に tramp-method には、ssh や plink を設定している方が多いと思います。ただし、ssh や plink のメソッドは、リモートサーバとのファイルの転送(ファイルを開く場合も含む)にインラインメソッドというもののみを使います。(http://www.bookshelf.jp/texi/emacs-man/21-3/jp/tramp_ja_4.html#SEC5
このため、サイズの大きいファイルの転送には時間が掛かります。これを改善する tramp-method が scp や pscp です。(rsync、sftp も同様のメソッドです。)
これらのメソッドは、あるサイズを超えるファイルの転送には外部転送メソッドというものを使います。あるサイズを超えなければ tramp-method の ssh や plink と同様の動きをしますので、機能拡張されたメソッドと考えればよいと思います。
(「あるサイズ」は変数 tramp-copy-size-limit で定義され、初期値(デフォルト値)は10240bytes となっています。)
(tramp-methods の設定は、emacs/lisp/net/tramp-sh.el を見てください。tramp-copy-program が定義されているメソッドが、外部転送メソッド(を使うもの)です。)

以下は、この tramp-method を scp で使うための設定です。同様なことは tramp-method に pscp を使うことでも可能ですので、これまで tramp-method に ssh を使っていたか plink を使っていたかで使い分ければよいと思います。(pscp を使う場合は、tramp-default-method に pscp を設定してください。)

(require 'tramp)
(require 'tramp-sh)

(setq tramp-default-method "scp")

;; リモートサーバで shell を開いた時に日本語が文字化けしないよう、LC_ALL と LC_CTYPE の設定を無効にする
;; http://www.gnu.org/software/emacs/manual/html_node/tramp/Remote-processes.html#Running%20a%20debugger%20on%20a%20remote%20host
(let ((process-environment tramp-remote-process-environment))
  (setenv "LC_ALL" nil)
  (setenv "LC_CTYPE" nil)
  (setq tramp-remote-process-environment process-environment))

MinGW版 の emacs(NTEmacs64、GNU配布版の emacs など)で tramp-default-method に scp を利用する場合は、以下の設定も行ってください。
(setq tramp-encoding-shell "sh")

;; ドライブレターの後の「:」が tramp-method の後の「:」と混同されるのを対策する
(advice-add 'tramp-do-copy-or-rename-file-out-of-band
            :around (lambda (orig-fun &rest args)
                      (let ((default-directory "/"))
                        (dolist (pos '(1 2))
                          (unless (tramp-tramp-file-p (nth pos args))
                            (setf (nth pos args)
                                  (substring (shell-command-to-string
                                              (concat "cygpath -u "
                                                      (shell-quote-argument (nth pos args))))
                                             0 -1)))))
                      (apply orig-fun args)))


<変更履歴>
  • 2012/09/19 mapcar の Warning が出るのを対策した。 (http://www.mew.org/~kazu/doc/elisp/function.html
  • 2012/09/19 sftp にも対応した。
  • 2012/11/27 shell-command-to-string に与える引数のクオートの方法を変更した。
  • 2012/12/27 lambda関数のクォートをとった。
  • 2012/12/28 fakecygpty版プログラムを起動するための設定を「fakecygpty を使うための設定」に集約した。
  • 2012/12/31 拡張子を取る方法に file-name-sans-extension を採用した。
  • 2013/01/08 tramp-adjust-process-args から引数の存在チェックを削除した。
  • 2013/11/09 tramp-method を scp から scpc に変更した。
  • 2014/05/09 フォーマット整形を行った。(内容変更はなし)
  • 2014/05/11 通信時の圧縮オプションを追加した。
  • 2014/10/23 tramp-method を scpc から scp に戻した。
  • 2014/11/03 emacs-24.4 で外部転送メソッドを使った処理の方法が変更となっていたので、その対策をした。
  • 2014/11/11 NTEmacs64 で外部転送メソッドを使った処理を行った際に「File exists, but cannot be read」というエラーが発生するのを対策した。
  • 2015/06/17 リモートサーバに接続して shell を起動した際に、日本語のファイル名が文字化けしていたのでその対策を追加した。
  • 2015/09/09 advice を emacs-24.4 以降の書式に見直した。