コンテンツにスキップ

readline

Since v8.0.75

readlineモジュールは、JSHアプリケーションで対話的な行入力を処理します。 JSHのネイティブreadline実装をラップする、ReadLineクラスを提供します。

一般的な使用方法は以下のとおりです。

const { ReadLine } = require('readline');

ReadLine

対話型の行リーダーを作成します。

構文
new ReadLine([options])
オプション
オプション既定値説明
historyStringreadlineJSHの設定ディレクトリに保存する履歴ファイルの名前です。
promptFunction組み込みプロンプト各行に表示するプロンプト文字列を返すコールバックです。
submitOnEnterWhenFunction常に確定Enterキーで現在の入力を確定するかどうかを決めるコールバックです。
autoInputString[]主に自動テストで使用する入力シーケンスです。

promptを省略すると、最初の行は> 、2行目以降は. 形式の継続プロンプトを使用します。 historyを省略すると、既定の履歴ファイル名はreadlineになります。 historyオプションはパスではなくファイル名として扱い、実際の履歴ファイルは$HOME/.config/.jsh/に保存します。historyにはファイル名だけを指定し、ディレクトリ区切り文字を含めないでください。

使用例
1
2
3
4
5
const { ReadLine } = require('readline');

const reader = new ReadLine({
    prompt: (lineno) => lineno === 0 ? 'prompt> ' : '....... ',
});

readLine()

1つの論理的な入力値を読み取ります。

  • 単一行の入力では、1つの文字列を返します。
  • 複数行の入力では、各行を\nで連結した文字列を返します。
  • ネイティブリーダーがエラーで終了すると、JSHはErrorオブジェクトを返します。
構文
reader.readLine([options])

readLine()は、コンストラクターと同じ形式のオプションを受け取ります。 呼び出し時のオプションが、コンストラクターのオプションより優先されます。

使用例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const { ReadLine } = require('readline');

const reader = new ReadLine({
    prompt: () => 'input> ',
});
const line = reader.readLine();
if (line instanceof Error) {
    throw line;
}
console.println(line);

addHistory()

readlineの履歴に1行を追加します。

構文
reader.addHistory(line)

同じ内容の行がある場合は、既存の項目を削除してから末尾に再追加します。

使用例
1
2
3
4
5
6
7
8
const { ReadLine } = require('readline');

const reader = new ReadLine();
const line = reader.readLine();
if (line instanceof Error) {
    throw line;
}
reader.addHistory(line);

close()

現在のreadlineセッションを終了します。

構文
reader.close()

readLine()が入力待ちの間にclose()を呼び出すと、待機中の呼び出しはEOFで終了します。

使用例
1
2
3
4
5
6
7
8
const { ReadLine } = require('readline');

const reader = new ReadLine();
const timer = setTimeout(() => {
    reader.close();
}, 200);
const line = reader.readLine();
clearTimeout(timer);

prompt オプション

promptは、各行のプロンプト文字列を生成します。

シグネチャ
prompt(lineno) => string
  • linenoは0から始まります。
  • その行に表示するプロンプト文字列をそのまま返します。
使用例
1
2
3
4
5
const { ReadLine } = require('readline');

const reader = new ReadLine({
    prompt: (lineno) => lineno === 0 ? 'sql> ' : '...> ',
});

submitOnEnterWhen オプション

submitOnEnterWhenは、Enterキーで現在の入力を確定するか、複数行の編集を続けるかを決めます。

シグネチャ
submitOnEnterWhen(lines, idx) => boolean
  • linesは、現在までの行の配列です。
  • idxは、現在の行インデックスです。
  • trueを返すと確定し、falseを返すと編集を続けます。
使用例
1
2
3
4
5
6
7
const { ReadLine } = require('readline');

const reader = new ReadLine({
    submitOnEnterWhen: (lines, idx) => {
        return lines[idx].endsWith(';');
    },
});

autoInput オプション

autoInputは、用意した入力をリーダーに渡します。 主にテストと非対話型スクリプトに使用します。

使用例
1
2
3
4
5
6
7
8
const { ReadLine } = require('readline');

const reader = new ReadLine({
    autoInput: [
        'Hello World',
        ReadLine.CtrlJ,
    ],
});

複数行入力の例

submitOnEnterWhenは、現在の行がアプリケーションの規則を満たすまで編集を続けるためによく使用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const { ReadLine } = require('readline');

const reader = new ReadLine({
    autoInput: ['select *', ReadLine.Enter, 'from dual;', ReadLine.Enter],
    submitOnEnterWhen: (lines, idx) => {
        return lines[idx].endsWith(';');
    },
});
const text = reader.readLine();
console.println(text);

静的なキー定数

ReadLineは、入力のシミュレーションやキー処理に使用できるさまざまなキー定数を提供します。 代表的な定数は以下のとおりです。

  • Controlキー: CtrlACtrlZ, CtrlLeft, CtrlRight, CtrlUp, CtrlDown
  • 移動キー: Up, Down, Left, Right, Home, End, PageUp, PageDown
  • 編集キー: Backspace, Delete, Enter, ShiftTab, Escape
  • Altキー: AltAAltZ, ALTBackspace
  • ファンクションキー: F1F24

名前の全一覧は、ReadLineの静的プロパティを参照してください。

使用例
1
2
3
const { ReadLine } = require('readline');

console.printf('%X\n', ReadLine.CtrlJ);

動作に関する注意

  • JavaScriptレベルでは、コールバックを使わず同期的に読み取ります。readLine()は、確定した値を直接返します。
  • 実際の行編集、カーソル移動、履歴、複数行入力は、ネイティブバックエンドが処理します。
  • readLine()Errorオブジェクトを返す場合があるため、失敗を明示的に処理する場合はline instanceof Errorを確認してください。
  • close()は、タイマーや他のイベントから入力待ちを中断する場合に主に使用します。
最終更新日