堀口です.
いい加減 cygwin のbash/tcsh/ssh なんかで文句言われたりパスフレー
ズ入力でフリーズとか言うのにも飽きてきたので, どうにかならないも
のかと思ったら意外とどうにかなったのでここでとりあえず出しちゃい
ます. どうでしょうか.
# 実はすでに問題は別の簡単な対処で解決とかいうと結構悲しいですが..
1. fakecygpty(仮) とは.
cygwin で仮想端末への接続が重要となるプログラム(基本的にシェルの
類)を Meadow (他では試していないだけですが)の上からまともに使える
ようにしようとするラッパプログラムです.
2. 使うとなにがうれしいのか
a) M-x shell で cygwin のシェルを起動したときに
| Warning: no access to tty (Bad file descriptor).
| Thus no job control in this shell.
といわれるのが静かになる.
b) *shell* のなかから ssh を実行すると
| Pseudo-terminal will not be allocated because stdin is not a terminal.
といわれてまともに動かなかったのがちゃんと動くようになる.
それから, このときに ssh-agent を起動していないと固まってし
まってどうしようもなかったものが, 普通にパスフレーズのプロン
プトが出て入力を行うことができるようになる.
(add-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt)
をやっておくと自動的にミニバッファでの入力に切り替わる.
(なぜこれがデフォルトではなくなったのでしょうか.)
c) tramp が普通に動く
巷で流通している tramp/cygwin-openssh hack (? シェルを明示的
に指定するやつ)ではなぜかわたしの環境で tramp は動かせませんで
した. fakecytpty(仮) では ssh のプログラム名の変更だけで動作
しました. そのうえ, ssh-agent が動いていないときにはパスフレー
ズを聞いてくるようになりました.
d) とりあえず実感したのはこれだけです.
3. なにをやっているか.
考え方はむちゃくちゃ安易です.
Meadow は -mno-cygwin なので cygwin の pty のサポートを受けられ
ません. でもそれほど pty に対してすごいことを要求しているわけで
もないようなので, 動かしたいプログラムに適当にモード(stty)設定し
た cygwin pty を与えて, Meadow からもらったパイプををそれにつな
いでいるというだけのことです.
4. 使い方
fakecygpty.exe のファイル名を "f_<target program>" として, パス
の通っているところに置くだけです. たとえば, tcsh の場合は,
cp fakecygpty.exe f_tcsh.exe
とします. そして, これを本来の tcsh の代わりに起動するように設
定すれば終わりです.
(setq explicit-shell-file-name "f_tcsh")
なお, fakecygpty は自分自身のパスを捨ててしまうので, ターゲット
のプログラムはサーチパスで探せなければなりません.
(同じディレクトリに置く前提ならパスを捨てずに済むのですが..)
5. 設定例.
a) shell
(setq explicit-shell-file-name "f_tcsh")
b) tramp
(setcdr (assq 'tramp-login-program (assoc "ssh" tramp-methods)) '("f_ssh"))
6. make
cygwin の gcc を使ってコンパイルします.
gcc -o fakecygpty.exe fakecygpty.c
--
ほりぐちきょうたろうAttachment:
fakecygpty.c.gz
Description: Binary data