[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:6582] Make friends with cygwin pty by fakecygpty.



堀口です.

 いい加減 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