1

Ruby でシェルを作成しようとしています。タブ補完を実装するために、WinAPI 関数getchを使用してユーザーから一度に 1 文字ずつ読み取り、タブをチェックしています。

これに関する問題は、バックスペースキーです。

  1. カーソルをプロンプトよりも後ろに移動します(たとえば、 prompthello>を使用すると、ユーザーはカーソルを にバックスペースできますh。最後のスペースで停止したいと思います。
  2. ユーザーのテキストがコンソールの次の行にオーバーフローすると、バックスペースは前の行に戻りません。

(これらの動作は両方とも設計によるものです。)

これらの問題に対する私の想像上の解決策は、カーソルの動きを制御することです。カーソルがどこにあるかを知り、移動できるようにする必要があります。

Linux では ANSI エスケープ シーケンスを使用しますが、これらは Windows コンソールではサポートされていません。

私はWinAPIを調べて、これを可能にする関数を見つけようとしましたが、見つけることができGetConsoleCursorInfoたのは、カーソルのサイズと可視性のみを返す関数だけでした.

プリミティブ関数以外に Win32API クラスを使用するのは絶望的であるため、例をいただければ幸いです。

ありがとう。

4

3 に答える 3

2

おそらく readline を使用したほうがよいでしょう。これは、Ruby ワンクリック インストーラーに含まれています。基本的なセットアップは次のとおりです。

require 'readline'

while line = Readline.readline('hello> ', true)
  #do something with line
  break if line == 'quit'
end

バックスペース、単語を削除するための Alt+バックスペース、履歴、タブ補完などの標準の readline 機能がすでに用意されています。ニーズに合わせてカスタマイズする方法に関する適切なドキュメントがここにあります。


編集:

readline がインストールされていない場合は、readline とその他の外部ライブラリをここから入手できます。readline-4.3-2-mswin32パッケージが必要です。readline.dll ファイル (ディレクトリにあるbin) をディレクトリにコピーしますruby\bin。それはそれを行う必要があります。

Ruby のホームページには記載されていませんが、ここから入手できる readline 5 も使用できるようです。具体的には、バイナリ配布が必要です。readline5.dll (binディレクトリ内) をディレクトリにコピーしruby\bin、名前を に変更しreadline.dllます。

require 'readline'また、補足として、 irb を使用しているときに false が返されても心配しないでください。

于 2009-09-29T15:48:54.690 に答える
1

うーん、bash(1) は DOS ボックスの中でも前の行に戻ることができるので、適度に移植可能なコードでバックアップすることは確かに可能です。termcapまたはを使用していると思いncursesますが、termcap データベースには、DOS ボックスで機能する一連の制御コードがあります。

Ruby では、termcap バインディングはないと思います。そのため、デバイスに依存する一連の制御コードをプログラムに組み込むのではなく、ncurses を使用します。(とにかく、termcap よりも ncurses が必要です。)

ncurses に切り替えると、行のバックアップやプロンプトの上書きを防ぐなど、必要なすべてのことを行う API 要素が見つかると思います。(そして確かに、どのライブラリが使用されていても、最初に出力しなかったものをバックアップするべきではありません。)

実際、私はペストの答えが好きです。readlineうまくいかない場合、または何らかの理由でカーソルのアドレス指定が必要な場合は、ncurses を使用してください。

于 2009-09-29T15:44:42.440 に答える
1

Windows に適した readline の実装については、このruby​​ ベースの readline を試してください。

于 2009-09-29T17:19:57.647 に答える