質問

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

これの問題点は、 バックスペース 鍵:

  1. カーソルをプロンプトよりも後方に移動します (例: プロンプト付き) hello>, 、ユーザーはカーソルをバックスペースで移動できます。 h. 。最後のスペースで止めてほしいです。
  2. ユーザーのテキストがコンソールの次の行にオーバーフローした場合、Backspace キーを押しても前の行には戻りません。

(これらの動作はどちらも仕様によるものであることはわかっています。)

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

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

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

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

ありがとう。

役に立ちましたか?

解決

あなたは、おそらくのreadlineを使って方がいいでしょう。これは、Rubyのワンクリックインストーラに含まれています。基本的な設定は次のとおりです。

require 'readline'

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

すでにあなたがそのようなバックスペースキー、Altキー+単語、履歴を削除するにはバックスペース、およびタブ補完などの標準的なreadlineの機能を持っています。あなたのニーズに合わせてカスタマイズする方法についての良いドキュメントがありますここを。

<時間>

編集:

あなたはreadlineのがインストールされていない場合、あなたはそれを得ることができ、他の外部ライブラリ<のhref =「http://www.garbagecollect.jp/ruby/mswin32/en/documents/install.html」のrel =」 "nofollowをnoreferrer>ここを。あなたはのreadline-4.3-2-MSWIN32 パッケージ。あなたのbinディレクトリに(ruby\binディレクトリにある)readline.dllファイルをコピーします。それはそれを行う必要があります。

これはRubyのホームページに文書化されていませんが、あなたはまた、readlineの5を使用することができるかのように、それが見え、利用可能ここを。具体的には、バイナリの配布を必要としています。あなたのbinディレクトリに(ruby\binディレクトリ内)readline5.dllをコピーし、readline.dllする名前を変更します。

IRBを使用しているときrequire 'readline'がfalseを返した場合、それを事前にロードするように表示されますので、

また、サイドノートとして、心配することはありません。

他のヒント

bashは(1)でもDOSボックス内の前の行にバックアップすることができますよううーん、それは、バックアップする確かに可能だし、合理的に移植可能なコードを持ちます。私はそれがtermcapまたはncursesを使用している想像し、それはtermcapのデータベースにDOSボックスのために働く制御コードのセットがあります。

あなたはncursesベースを使用するので、Rubyでは、私は、任意のtermcapのバインディングがあるとは思わない、というよりも、あなたのプログラムにデバイス依存制御コードのセットを配線します。 (あなたはとにかくのtermcap以上のncursesをしたいと思う。)

あなたはncursesベースに切り替えると

私はあなたが行をバックアップし、プロンプトを上書きしないなど、あなたが必要なすべてを、行うためにAPI要素を見つけると確信しています。 (そして確かにあなたは関係なく使用されているものを図書館で始まるしないように出力されませんでした何の上にバックアップするべきではありません。)

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

は、Windows優しいreadlineの実装では、

のこのルビーベースのreadlineを試してみてください
scroll top