1GNU Readline によるコマンドライン入力インタフェースを提供するモジュール 2です。GNU Readline の互換ライブラリのひとつである Edit Line(libedit) も 3サポートしています。 4 5GNU Readline:: http://www.gnu.org/directory/readline.html 6libedit:: http://www.thrysoee.dk/editline/ 7 8Readline.readline を使用してユーザからの入力を取得できます。このとき、 9GNU Readline のように入力の補完やEmacs のようなキー操作などができます。 10 11 require "readline" 12 while buf = Readline.readline("> ", true) 13 p buf 14 end 15 16ユーザが入力した内容を履歴(以下、ヒストリ)として記録することができます。 17定数 Readline::HISTORY を使用してヒストリにアクセスできます。 18 19 require "readline" 20 while buf = Readline.readline("> ", true) 21 p Readline::HISTORY.to_a 22 print("-> ", buf, "\n") 23 end 24 25使用するライブラリにより、いくつかのメソッドで例外 NotImplementedError 26が発生します。 27 28== Readline モジュール 29 30=== モジュール関数 31 32readline([prompt, [add_hist]]) -> String | nil 33 34 prompt を出力し、ユーザからのキー入力を待ちます。 35 エンターキーの押下などでユーザが文字列を入力し終えると、 36 入力した文字列を返します。 37 このとき、add_hist が true であれば、入力した文字列をヒストリに追加します。 38 39 何も入力していない状態で EOF(UNIX では ^D) を入力するなどで、 40 ユーザからの入力がない場合は nil を返します。 41 42 次の条件を全て満たす場合、例外 IOError が発生します。 43 1. 標準入力が tty でない。 44 2. 標準入力をクローズしている。(isatty(2) の errno が EBADF である。) 45 46 本メソッドはスレッドに対応しています。 47 入力待ち状態のときはスレッドコンテキストの切替えが発生します。 48 49 入力時には行内編集が可能で、vi モードと Emacs モードが用意されています。 50 デフォルトは Emacs モードです。 51 52 本メソッドには注意事項があります。 53 入力待ちの状態で ^C すると ruby インタプリタが終了し、端末状態を復帰しません。 54 これを回避するための例を3つ挙げます。 55 56 * ^CによるInterrupt例外を補足して、端末状態を復帰します: 57 58 require "readline" 59 60 stty_save = `stty -g`.chomp 61 begin 62 while buf = Readline.readline 63 p buf 64 end 65 rescue Interrupt 66 system("stty", stty_save) 67 exit 68 end 69 end 70 end 71 72 * INTシグナルを補足して、端末状態を復帰します: 73 74 require "readline" 75 76 stty_save = `stty -g`.chomp 77 trap("INT") { system "stty", stty_save; exit } 78 79 while buf = Readline.readline 80 p buf 81 end 82 83 * 単に ^C を無視する方法もあります: 84 85 require "readline" 86 87 trap("INT", "SIG_IGN") 88 89 while buf = Readline.readline 90 p buf 91 end 92 93 入力履歴 Readline::HISTORY を使用して、空行や直前の入力と同じ内容は入力 94 履歴に残さないということもできます。 95 96 require "readline" 97 98 while buf = Readline.readline("> ", true) 99 # p Readline::HISTORY.to_a 100 Readline::HISTORY.pop if /^\s*$/ =~ buf 101 102 begin 103 if Readline::HISTORY[Readline::HISTORY.length-2] == buf 104 Readline::HISTORY.pop 105 end 106 rescue IndexError 107 end 108 109 # p Readline::HISTORY.to_a 110 print "-> ", buf, "\n" 111 end 112 113=== クラスメソッド 114 115Readline.input = input 116 117 Readline.readline メソッドで使用する入力用の File オブジェクト input 118 を指定します。 119 120Readline.output = output 121 122 Readline.readline メソッドで使用する出力用の File オブジェクト 123 output を指定します。 124 125Readline.completion_proc = proc 126 127 ユーザからの入力を補完する時の候補を取得する Proc オブジェクト proc を 128 指定します。proc は、次のものを想定しています。 129 1. call メソッドを持ちます。 130 call メソッドを持たない場合、例外 ArgumentError が発生します。 131 2. 引数にユーザからの入力文字列(注1)を取ります。 132 3. 候補の文字列の配列を返します。 133 134 注1:「/var/lib /v」の後で補完を行うと、 135 デフォルトでは proc の引数に「/v」が渡されます。 136 このように、ユーザが入力した文字列を 137 Readline.completer_word_break_characters に含まれる文字で区切ったも 138 のを単語とすると、カーソルがある単語の最初の文字から現在のカーソル位 139 置までの文字列が proc の引数に渡されます。 140 141Readline.completion_proc -> proc 142 143 ユーザからの入力を補完する時の候補を取得する Proc オブジェクト proc 144 を取得します。 145 146Readline.completion_case_fold = bool 147 148 ユーザの入力を補完する際、大文字と小文字を区別する/しないを指定します。 149 bool が真ならば区別しません。bool が偽ならば区別します。 150 151Readline.completion_case_fold -> bool 152 153 ユーザの入力を補完する際、大文字と小文字を区別する/しないを取得します。 154 bool が真ならば区別しません。bool が偽ならば区別します。 155 156 なお、Readline.completion_case_fold= メソッドで指定したオブジェクトを 157 そのまま取得するので、次のような動作をします。 158 159 require "readline" 160 161 Readline.completion_case_fold = "This is a String." 162 p Readline.completion_case_fold # => "This is a String." 163 164Readline.line_buffer -> string 165 166 入力中の行全体を返します。complete_proc の中で使用することを想定し 167 ています。Readline.line_buffer の長さは GNU Readline の rl_end 変数の 168 値と一致します。 169 170Readline.point -> int 171 172 現在のカーソルの位置を返します。 173 Readline モジュールは補完対象の単語の開始位置の情報を提供していません。 174 しかしながら、 completion_proc の中で入力した単語 text と 175 Readline.point を使用することで開始位置を導くことができます。 176 177 開始位置 = 入力した単語の長さ - Readline.point 178 179Readline.vi_editing_mode -> nil 180 181 編集モードを vi モードにします。 182 vi モードの詳細は、GNU Readline のマニュアルを参照してください。 183 184 サポートしていない環境では、例外 NotImplementedError が発生します。 185 186Readline.vi_editing_mode? -> bool 187 188 編集モードが vi モードの場合、true を返します。そうでなければ false 189 を返します。 190 191 サポートしていない環境では、例外 NotImplementedError が発生します。 192 193Readline.emacs_editing_mode -> nil 194 195 編集モードを Emacs モードにします。 196 デフォルトは Emacs モードです。 197 Emacs モードの詳細は、GNU Readline のマニュアルを参照してください。 198 199 サポートしていない環境では、例外 NotImplementedError が発生します。 200 201Readline.emacs_editing_mode? -> bool 202 203 編集モードが Emacs モードの場合、true を返します。そうでなければ false 204 を返します。 205 206 サポートしていない環境では、例外 NotImplementedError が発生します。 207 208Readline.completion_append_character = char 209 210 ユーザの入力の補完が完了した場合に、最後に付加する文字 char を指定し 211 ます。半角スペース「" "」などの単語を区切る文字を指定すれば、連続して 212 入力する際に便利です。 213 214 使用例: 215 216 require "readline" 217 218 Readline.readline("> ", true) 219 Readline.completion_append_character = " " 220 221 実行例: 222 223 > 224 ここで "/var/li" を入力します。 225 226 > /var/li 227 ここで TAB キーを入力します。 228 229 > /var/lib 230 "b" が補完され、最後に " " が追加されるので、"/usr" を連続して入力できます。 231 232 > /var/lib /usr 233 234 なお、1文字しか指定することはできません。 235 例えば、"string"を指定した場合は最初の文字である"s"だけを使用します。 236 237 require "readline" 238 239 Readline.completion_append_character = "string" 240 p Readline.completion_append_character # => "s" 241 242 サポートしていない環境では、例外 NotImplementedError が発生します。 243 244Readline.completion_append_character -> char 245 246 ユーザの入力の補完が完了した場合に、最後に付加する文字を取得します。 247 デフォルトは空白 (" ") です。 248 249 サポートしていない環境では、例外 NotImplementedError が発生します。 250 251Readline.basic_word_break_characters = string 252 253 ユーザの入力の補完を行う際、単語の区切りを示す複数の文字で構成される 254 文字列 string を指定します。 255 256 GNU Readline のデフォルトの値は、Bash の補完処理で使用している文字列 257 " \t\n\"\\'`@$><=;|&{(" (スペースを含む) になっています。 258 259 サポートしていない環境では、例外 NotImplementedError が発生します。 260 261Readline.basic_word_break_characters -> string 262 263 ユーザの入力の補完を行う際、単語の区切りを示す複数の文字で構成される 264 文字列を取得します。 265 266 サポートしていない環境では、例外 NotImplementedError が発生します。 267 268Readline.completer_word_break_characters = string 269 270 ユーザの入力の補完を行う際、単語の区切りを示す複数の文字で構成される 271 文字列 string を指定します。 272 Readline.basic_word_break_characters= との違いは、 273 GNU Readline の rl_complete_internal 関数で使用されることです。 274 275 GNU Readline のデフォルトの値は、 276 Readline.basic_word_break_characters と同じです。 277 278 サポートしていない環境では、例外 NotImplementedError が発生します。 279 280Readline.completer_word_break_characters -> string 281 282 ユーザの入力の補完を行う際、単語の区切りを示す複数の文字で構成された 283 文字列を取得します。 284 285 サポートしていない環境では、例外 NotImplementedError が発生します。 286 287Readline.basic_quote_characters = string 288 289 スペースなどの単語の区切りをクオートするための複数の文字で構成される 290 文字列 string を指定します。 291 292 サポートしていない環境では、例外 NotImplementedError が発生します。 293 294Readline.basic_quote_characters -> string 295 296 スペースなどの単語の区切りをクオートするための複数の文字で構成される 297 文字列を取得します。 298 299 サポートしていない環境では、例外 NotImplementedError が発生します。 300 301Readline.completer_quote_characters = string 302 303 ユーザの入力の補完を行う際、スペースなどの単語の区切りを 304 クオートするための複数の文字で構成される文字列 string を指定します。 305 指定した文字の間では、Readline.completer_word_break_characters= 306 で指定した文字列に含まれる文字も、普通の文字列として扱われます。 307 308 サポートしていない環境では、例外 NotImplementedError が発生します。 309 310Readline.completer_quote_characters -> string 311 312 ユーザの入力の補完を行う際、スペースなどの単語の区切りを 313 クオートするための複数の文字で構成される文字列を取得します。 314 315 サポートしていない環境では、例外 NotImplementedError が発生します。 316 317Readline.filename_quote_characters = string 318 319 ユーザの入力時にファイル名の補完を行う際、スペースなどの単語の区切りを 320 クオートするための複数の文字で構成される文字列 string を指定します。 321 322 GNU Readline のデフォルト値は nil です。 323 324 サポートしていない環境では、例外 NotImplementedError が発生します。 325 326Readline.filename_quote_characters -> string 327 328 ユーザの入力時にファイル名の補完を行う際、スペースなどの単語の区切りを 329 クオートするための複数の文字で構成される文字列を取得します。 330 331 サポートしていない環境では、例外 NotImplementedError が発生します。 332 333=== クラス定数 334 335HISTORY 336 337 定数 HISTORY を使用してヒストリにアクセスできます。 338 Enumerable モジュールを extend しており、 339 配列のように振る舞うことができます。 340 例えば、HISTORY[4] により 5 番目に入力した内容を取り出すことができます。 341 342 require "readline" 343 344 Readline::HISTORY.push("a", "b", "c", "d", "e") 345 p Readline::HISTORY[4] # => "e" 346 347 実装しているメソッドを次に挙げます。 348 * HISTORY.to_s -> "HISTORY" 349 * HISTORY[index] -> string 350 * HISTORY[index] = string 351 * HISTORY.push(string[, string, ...]) -> self 352 * HISTORY << string -> self 353 * HISTORY.pop -> string 354 * HISTORY.shift -> string 355 * HISTORY.each -> Enumerator 356 * HISTORY.each { |i| } -> [string] 357 * HISTORY.length -> Integer 358 * HISTORY.empty? -> true or false 359 * HISTORY.delete_at(index) -> string 360 * HISTORY.clear -> self 361 362 サポートしていない環境では、次のメソッドで例外 NotImplementedError が 363 発生します。 364 * HISTORY[index] = string 365 * HISTORY.pop -> string 366 * HISTORY.shift -> string 367 * HISTORY.delete_at(index) -> string 368 * HISTORY.clear -> self 369 370FILENAME_COMPLETION_PROC 371 372 ファイル名の補完を行う call メソッドを持つオブジェクトです。 373 374 Readline.completion_proc= により、ユーザの入力時にファイル名の補完を 375 行うように設定するために使用することを想定してます。 376 377USERNAME_COMPLETION_PROC 378 379 ユーザ名の補完を行う call メソッドを持つオブジェクトです。 380 381 Readline.completion_proc= により、ユーザの入力時にユーザ名の補完を行 382 うように設定するために使用することを想定してます。 383 384VERSION 385 386 使用している GNU Readline または libedit のバージョンです。 387