Ruby でコンソール カーソルの位置を取得/設定する方法 (Windows)
-
18-09-2019 - |
質問
Rubyでシェルを作成しようとしています。タブ補完を実装するには、WinAPI関数を使用しています。 getch
ユーザーから一度に 1 文字ずつ読み取り、タブをチェックします。
これの問題点は、 バックスペース 鍵:
- カーソルをプロンプトよりも後方に移動します (例: プロンプト付き)
hello>
, 、ユーザーはカーソルをバックスペースで移動できます。h
. 。最後のスペースで止めてほしいです。 - ユーザーのテキストがコンソールの次の行にオーバーフローした場合、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
する名前を変更します。
require 'readline'
がfalseを返した場合、それを事前にロードするように表示されますので、また、サイドノートとして、心配することはありません。
他のヒント
bashは(1)でもDOSボックス内の前の行にバックアップすることができますよううーん、それは、バックアップする確かに可能だし、合理的に移植可能なコードを持ちます。私はそれがtermcap
またはncurses
を使用している想像し、それはtermcapのデータベースにDOSボックスのために働く制御コードのセットがあります。
あなたはncursesベースを使用するので、Rubyでは、私は、任意のtermcapのバインディングがあるとは思わない、というよりも、あなたのプログラムにデバイス依存制御コードのセットを配線します。 (あなたはとにかくのtermcap以上のncursesをしたいと思う。)
あなたはncursesベースに切り替えると私はあなたが行をバックアップし、プロンプトを上書きしないなど、あなたが必要なすべてを、行うためにAPI要素を見つけると確信しています。 (そして確かにあなたは関係なく使用されているものを図書館で始まるしないように出力されませんでした何の上にバックアップするべきではありません。)
実は、I種類のペストのの答えのような。 readline
がうまくいかない場合や、何らかの理由でのアドレス指定のカーソルが必要な場合はncursesを使用してください。
は、Windows優しいreadlineの実装では、
のこのルビーベースのreadlineを試してみてください