Readline#

安定性: 2 - 安定

ソースコード: lib/readline.js

node:readline モジュールは、Readable ストリーム (process.stdin など) からデータを一度に 1 行ずつ読み込むためのインターフェースを提供します。

Promise ベースの API を使用するには

import * as readline from 'node:readline/promises';const readline = require('node:readline/promises');

コールバックと同期 API を使用するには

import * as readline from 'node:readline';const readline = require('node:readline');

次の簡単な例は、node:readline モジュールの基本的な使用法を示しています。

import * as readline from 'node:readline/promises';
import { stdin as input, stdout as output } from 'node:process';

const rl = readline.createInterface({ input, output });

const answer = await rl.question('What do you think of Node.js? ');

console.log(`Thank you for your valuable feedback: ${answer}`);

rl.close();const readline = require('node:readline');
const { stdin: input, stdout: output } = require('node:process');

const rl = readline.createInterface({ input, output });

rl.question('What do you think of Node.js? ', (answer) => {
  // TODO: Log the answer in a database
  console.log(`Thank you for your valuable feedback: ${answer}`);

  rl.close();
});

このコードが呼び出されると、Node.js アプリケーションは、インターフェースが input ストリームでデータを受信するのを待機しているため、readline.Interface が閉じられるまで終了しません。

クラス: InterfaceConstructor#

InterfaceConstructor クラスのインスタンスは、readlinePromises.createInterface() または readline.createInterface() メソッドを使用して構築されます。すべてのインスタンスは、単一の input Readable ストリームと単一の output Writable ストリームに関連付けられています。output ストリームは、input ストリームで受信し読み取られたユーザー入力のプロンプトを印刷するために使用されます。

イベント: 'close'#

次のいずれかが発生すると、'close' イベントが発生します。

  • rl.close() メソッドが呼び出され、InterfaceConstructor インスタンスが input ストリームと output ストリームの制御を放棄した場合。
  • input ストリームが 'end' イベントを受信した場合。
  • input ストリームが、送信終了 (EOT) を通知するために Ctrl+D を受信した場合。
  • input ストリームが SIGINT を通知するために Ctrl+C を受信し、InterfaceConstructor インスタンスに 'SIGINT' イベントリスナーが登録されていない場合。

リスナー関数は、引数を渡さずに呼び出されます。

'close' イベントが発生すると、InterfaceConstructor インスタンスは終了します。

イベント: 'line'#

'line' イベントは、input ストリームが行末入力 (\n\r、または \r\n) を受信するたびに発生します。これは通常、ユーザーが Enter または Return を押したときに発生します。

'line' イベントは、ストリームから新しいデータが読み取られ、そのストリームが最終的な行末マーカーなしで終了した場合にも発生します。

リスナー関数は、受信した入力の 1 行を含む文字列で呼び出されます。

rl.on('line', (input) => {
  console.log(`Received: ${input}`);
}); 

イベント: 'history'#

'history' イベントは、履歴配列が変更されるたびに発生します。

リスナー関数は、履歴配列を含む配列で呼び出されます。historySize および removeHistoryDuplicates による、追加された行と削除された行を含むすべての変更が反映されます。

主な目的は、リスナーが履歴を保持できるようにすることです。リスナーが履歴オブジェクトを変更することも可能です。これは、パスワードのように、特定の行が履歴に追加されるのを防ぐのに役立つ可能性があります。

rl.on('history', (history) => {
  console.log(`Received: ${history}`);
}); 

イベント: 'pause'#

次のいずれかが発生すると、'pause' イベントが発生します。

  • input ストリームが一時停止した場合。
  • input ストリームが一時停止しておらず、'SIGCONT' イベントを受信した場合。(イベント 'SIGTSTP' および 'SIGCONT' を参照してください。)

リスナー関数は、引数を渡さずに呼び出されます。

rl.on('pause', () => {
  console.log('Readline paused.');
}); 

イベント: 'resume'#

'resume' イベントは、input ストリームが再開されるたびに発生します。

リスナー関数は、引数を渡さずに呼び出されます。

rl.on('resume', () => {
  console.log('Readline resumed.');
}); 

イベント: 'SIGCONT'#

'SIGCONT' イベントは、Ctrl+Z (つまり、SIGTSTP) を使用して以前にバックグラウンドに移動された Node.js プロセスが、fg(1p) を使用してフォアグラウンドに戻されたときに発生します。

input ストリームが SIGTSTP リクエストに一時停止されていた場合、このイベントは発生しません。

リスナー関数は、引数を渡さずに呼び出されます。

rl.on('SIGCONT', () => {
  // `prompt` will automatically resume the stream
  rl.prompt();
}); 

'SIGCONT' イベントは、Windows ではサポートされていません

イベント: 'SIGINT'#

'SIGINT' イベントは、input ストリームが、一般に SIGINT と呼ばれる Ctrl+C 入力を受信するたびに発生します。input ストリームが SIGINT を受信したときに登録された 'SIGINT' イベントリスナーがない場合、'pause' イベントが発生します。

リスナー関数は、引数を渡さずに呼び出されます。

rl.on('SIGINT', () => {
  rl.question('Are you sure you want to exit? ', (answer) => {
    if (answer.match(/^y(es)?$/i)) rl.pause();
  });
}); 

イベント: 'SIGTSTP'#

'SIGTSTP' イベントは、input ストリームが、一般に SIGTSTP と呼ばれる Ctrl+Z 入力を受信したときに発生します。input ストリームが SIGTSTP を受信したときに登録された 'SIGTSTP' イベントリスナーがない場合、Node.js プロセスはバックグラウンドに送信されます。

fg(1p) を使用してプログラムが再開されると、'pause' イベントと 'SIGCONT' イベントが発生します。これらを使用して、input ストリームを再開できます。

プロセスがバックグラウンドに送信される前に input が一時停止されていた場合、'pause' イベントと 'SIGCONT' イベントは発生しません。

リスナー関数は、引数を渡さずに呼び出されます。

rl.on('SIGTSTP', () => {
  // This will override SIGTSTP and prevent the program from going to the
  // background.
  console.log('Caught SIGTSTP.');
}); 

'SIGTSTP' イベントは、Windows ではサポートされていません

rl.close()#

rl.close() メソッドは、InterfaceConstructor インスタンスを閉じ、input ストリームと output ストリームの制御を放棄します。呼び出されると、'close' イベントが発生します。

rl.close() を呼び出しても、InterfaceConstructor インスタンスによって他のイベント ('line' を含む) が発生するのがすぐに停止するわけではありません。

rl.pause()#

rl.pause() メソッドは、必要に応じて後で再開できるように、input ストリームを一時停止します。

rl.pause() を呼び出しても、InterfaceConstructor インスタンスから発行される他のイベント('line' を含む)が直ちに一時停止されるわけではありません。

rl.prompt([preserveCursor])#

  • preserveCursor <boolean> true の場合、カーソル位置が 0 にリセットされるのを防ぎます。

rl.prompt() メソッドは、ユーザーが新しい入力を提供できる場所を提供するために、構成された InterfaceConstructor インスタンスの promptoutput の新しい行に書き込みます。

呼び出されたとき、rl.prompt() は、input ストリームが一時停止されている場合は再開します。

InterfaceConstructoroutputnull または undefined に設定して作成された場合、プロンプトは書き込まれません。

rl.resume()#

rl.resume() メソッドは、input ストリームが一時停止されている場合は再開します。

rl.setPrompt(prompt)#

rl.setPrompt() メソッドは、rl.prompt() が呼び出されるたびに output に書き込まれるプロンプトを設定します。

rl.getPrompt()#

  • 戻り値: <string> 現在のプロンプト文字列

rl.getPrompt() メソッドは、rl.prompt() で使用される現在のプロンプトを返します。

rl.write(data[, key])#

rl.write() メソッドは、data または key で識別されるキーシーケンスを output に書き込みます。key 引数は、outputTTY テキスト端末である場合にのみサポートされます。キーの組み合わせの一覧については、TTY キーバインディング を参照してください。

key が指定されている場合、data は無視されます。

呼び出されたとき、rl.write() は、input ストリームが一時停止されている場合は再開します。

InterfaceConstructoroutputnull または undefined に設定して作成された場合、data および key は書き込まれません。

rl.write('Delete this!');
// Simulate Ctrl+U to delete the line written previously
rl.write(null, { ctrl: true, name: 'u' }); 

rl.write() メソッドは、readlineInterfaceinput に、ユーザーによって提供されたかのようにデータを書き込みます。

rl[Symbol.asyncIterator]()#

入力ストリーム内の各行を文字列として反復処理する AsyncIterator オブジェクトを作成します。このメソッドにより、for await...of ループを通じて InterfaceConstructor オブジェクトの非同期反復が可能になります。

入力ストリームのエラーは転送されません。

ループが breakthrow、または return で終了した場合、rl.close() が呼び出されます。言い換えれば、InterfaceConstructor を反復処理すると、必ず入力ストリームが完全に消費されます。

パフォーマンスは、従来の 'line' イベント API と同等ではありません。パフォーマンスが重要なアプリケーションでは、代わりに 'line' を使用してください。

async function processLineByLine() {
  const rl = readline.createInterface({
    // ...
  });

  for await (const line of rl) {
    // Each line in the readline input will be successively available here as
    // `line`.
  }
} 

readline.createInterface() は、呼び出されるとすぐに入力ストリームの消費を開始します。インターフェースの作成と非同期反復の間で非同期操作を行うと、行が欠落する可能性があります。

rl.line#

node によって処理されている現在の入力データ。

これは、TTY ストリームから入力を収集する場合に、line イベントが発行される前に、これまでに処理された現在の値を取得するために使用できます。line イベントが発行されると、このプロパティは空の文字列になります。

インスタンスの実行中に値を変更すると、rl.cursor も制御されていない場合、意図しない結果が生じる可能性があることに注意してください。

入力に TTY ストリームを使用していない場合は、'line' イベントを使用してください。

考えられるユースケースの 1 つは次のとおりです。

const values = ['lorem ipsum', 'dolor sit amet'];
const rl = readline.createInterface(process.stdin);
const showResults = debounce(() => {
  console.log(
    '\n',
    values.filter((val) => val.startsWith(rl.line)).join(' '),
  );
}, 300);
process.stdin.on('keypress', (c, k) => {
  showResults();
}); 

rl.cursor#

rl.line を基準としたカーソル位置。

これにより、TTY ストリームから入力を読み取る際に、現在のカーソルが入力文字列のどこに位置するかを追跡します。カーソルの位置は、入力が処理されるときに変更される入力文字列の部分と、端末のキャレットがレンダリングされる列を決定します。

rl.getCursorPos()#

  • 戻り値: <Object>
    • rows <number> カーソルが現在位置するプロンプトの行
    • cols <number> カーソルが現在位置する画面列

入力プロンプト + 文字列に関連するカーソルの実際の位置を返します。長い入力(折り返し)文字列と複数行のプロンプトが計算に含まれます。

Promises API#

安定性: 1 - 実験的

クラス: readlinePromises.Interface#

readlinePromises.Interface クラスのインスタンスは、readlinePromises.createInterface() メソッドを使用して構築されます。すべてのインスタンスは、単一の input Readable ストリームと単一の output Writable ストリームに関連付けられています。output ストリームは、input ストリームに到着し、そこから読み取られたユーザー入力のプロンプトを印刷するために使用されます。

rl.question(query[, options])#
  • query <string> プロンプトの先頭に追加され、output に書き込まれるステートメントまたはクエリ。
  • options <Object>
    • signal <AbortSignal> オプションで、AbortSignal を使用して question() をキャンセルできます。
  • 戻り値: <Promise> query に対するユーザーの入力で満たされる Promise。

rl.question() メソッドは、output に書き込むことで query を表示し、input でユーザー入力が提供されるのを待ってから、提供された入力を最初の引数として渡して callback 関数を呼び出します。

呼び出されたとき、rl.question() は、input ストリームが一時停止されている場合は再開します。

readlinePromises.Interfaceoutputnull または undefined に設定して作成された場合、query は書き込まれません。

rl.close() の後に質問が呼び出された場合、拒否された Promise を返します。

使用例

const answer = await rl.question('What is your favorite food? ');
console.log(`Oh, so your favorite food is ${answer}`); 

AbortSignal を使用して質問をキャンセルします。

const signal = AbortSignal.timeout(10_000);

signal.addEventListener('abort', () => {
  console.log('The food question timed out');
}, { once: true });

const answer = await rl.question('What is your favorite food? ', { signal });
console.log(`Oh, so your favorite food is ${answer}`); 

クラス: readlinePromises.Readline#

new readlinePromises.Readline(stream[, options])#
rl.clearLine(dir)#
  • dir <integer>
    • -1: カーソルから左
    • 1: カーソルから右
    • 0: 行全体
  • 戻り値: this

rl.clearLine() メソッドは、関連付けられた stream の現在の行を指定された dir で識別される方向にクリアするアクションを保留中のアクションの内部リストに追加します。コンストラクターに autoCommit: true が渡されていない限り、このメソッドの効果を確認するには rl.commit() を呼び出します。

rl.clearScreenDown()#
  • 戻り値: this

rl.clearScreenDown() メソッドは、関連付けられたストリームをカーソルの現在位置から下方向にクリアするアクションを、保留中のアクションの内部リストに追加します。コンストラクターに autoCommit: true が渡されていない限り、このメソッドの効果を確認するには rl.commit() を呼び出します。

rl.commit()#

rl.commit() メソッドは、保留中のすべてのアクションを関連付けられた stream に送信し、保留中のアクションの内部リストをクリアします。

rl.cursorTo(x[, y])#

rl.cursorTo() メソッドは、関連付けられた stream 内の指定された位置にカーソルを移動するアクションを保留中のアクションの内部リストに追加します。コンストラクターに autoCommit: true が渡されていない限り、このメソッドの効果を確認するには rl.commit() を呼び出します。

rl.moveCursor(dx, dy)#

rl.moveCursor() メソッドは、関連付けられた stream 内の現在のカーソル位置から相対的にカーソルを移動させるアクションを、保留中のアクションの内部リストに追加します。コンストラクターに autoCommit: true が渡されていない限り、このメソッドの効果を確認するには rl.commit() を呼び出してください。

rl.rollback()#
  • 戻り値: this

rl.rollback メソッドは、保留中のアクションの内部リストを、関連付けられた stream に送信せずにクリアします。

readlinePromises.createInterface(options)#

  • options <Object>
    • input <stream.Readable> リッスンする Readable ストリーム。このオプションは必須です。
    • output <stream.Writable> readline データを書き込む Writable ストリーム。
    • completer <Function> Tab キーによる自動補完に使用されるオプションの関数。
    • terminal <boolean> input および output ストリームを TTY のように扱い、ANSI/VT100 エスケープコードを書き込む場合は trueデフォルト: インスタンス化時に output ストリームの isTTY を確認します。
    • history <string[]> 履歴行の初期リスト。このオプションは、ユーザーまたは内部の output チェックによって terminaltrue に設定されている場合にのみ意味を持ちます。そうでない場合、履歴キャッシュメカニズムはまったく初期化されません。デフォルト: []
    • historySize <number> 保持される履歴行の最大数。履歴を無効にするには、この値を 0 に設定します。このオプションは、ユーザーまたは内部の output チェックによって terminaltrue に設定されている場合にのみ意味を持ちます。そうでない場合、履歴キャッシュメカニズムはまったく初期化されません。デフォルト: 30
    • removeHistoryDuplicates <boolean> true の場合、履歴リストに追加された新しい入力行が古いものと重複する場合、リストから古い行を削除します。デフォルト: false
    • prompt <string> 使用するプロンプト文字列。デフォルト: '> '
    • crlfDelay <number> \r\n の間の遅延が crlfDelay ミリ秒を超える場合、\r\n の両方が別々の行末入力として扱われます。crlfDelay100 以上の数値に強制変換されます。Infinity に設定することもできます。その場合、\r の後に \n が続くものは常に単一の改行と見なされます (\r\n 行デリミターでファイルを読み取る場合に適切かもしれません)。デフォルト: 100
    • escapeCodeTimeout <number> readlinePromises が文字を待機する時間 (現時点で読み取られた入力を使用して完全なキーシーケンスを形成でき、追加の入力を受け取ってより長いキーシーケンスを完了できるあいまいなキーシーケンスをミリ秒単位で読み取る場合)。デフォルト: 500
    • tabSize <integer> タブが等しいスペースの数 (最小 1)。デフォルト: 8
  • 戻り値: <readlinePromises.Interface>

readlinePromises.createInterface() メソッドは、新しい readlinePromises.Interface インスタンスを作成します。

const readlinePromises = require('node:readline/promises');
const rl = readlinePromises.createInterface({
  input: process.stdin,
  output: process.stdout,
}); 

readlinePromises.Interface インスタンスが作成されたら、最も一般的なのは 'line' イベントをリッスンすることです。

rl.on('line', (line) => {
  console.log(`Received: ${line}`);
}); 

このインスタンスに対して terminaltrue の場合、output ストリームは output.columns プロパティを定義し、列が変更された場合 (または変更されたとき) に output'resize' イベントを発生させる場合に最適な互換性を得られます (process.stdout は TTY の場合にこれを自動的に行います)。

completer 関数の使用法#

completer 関数は、ユーザーが入力した現在の行を引数として受け取り、2 つのエントリを持つ Array を返します。

  • 補完に一致するエントリを含む Array
  • マッチングに使用されたサブストリング。

たとえば: [[substr1, substr2, ...], originalsubstring]

function completer(line) {
  const completions = '.help .error .exit .quit .q'.split(' ');
  const hits = completions.filter((c) => c.startsWith(line));
  // Show all completions if none found
  return [hits.length ? hits : completions, line];
} 

completer 関数は <Promise> を返すこともでき、非同期にすることもできます。

async function completer(linePartial) {
  await someAsyncWork();
  return [['123'], linePartial];
} 

コールバック API#

クラス: readline.Interface#

readline.Interface クラスのインスタンスは、readline.createInterface() メソッドを使用して構築されます。すべてのインスタンスは、単一の input Readable ストリームと単一の output Writable ストリームに関連付けられています。output ストリームは、input ストリームに到着し、そこから読み取られるユーザー入力のプロンプトを印刷するために使用されます。

rl.question(query[, options], callback)#
  • query <string> プロンプトの先頭に追加され、output に書き込まれるステートメントまたはクエリ。
  • options <Object>
    • signal <AbortSignal> オプションで、AbortController を使用して question() をキャンセルできるようにします。
  • callback <Function> query への応答としてユーザーの入力で呼び出されるコールバック関数。

rl.question() メソッドは、output に書き込むことで query を表示し、input でユーザー入力が提供されるのを待ってから、提供された入力を最初の引数として渡して callback 関数を呼び出します。

呼び出されたとき、rl.question() は、input ストリームが一時停止されている場合は再開します。

readline.Interfaceoutputnull または undefined に設定して作成された場合、query は書き込まれません。

rl.question() に渡される callback 関数は、最初の引数として Error オブジェクトまたは null を受け入れるという一般的なパターンに従いません。callback は、提供された回答を唯一の引数として呼び出されます。

rl.close() の後に rl.question() を呼び出すと、エラーがスローされます。

使用例

rl.question('What is your favorite food? ', (answer) => {
  console.log(`Oh, so your favorite food is ${answer}`);
}); 

AbortController を使用して質問をキャンセルする。

const ac = new AbortController();
const signal = ac.signal;

rl.question('What is your favorite food? ', { signal }, (answer) => {
  console.log(`Oh, so your favorite food is ${answer}`);
});

signal.addEventListener('abort', () => {
  console.log('The food question timed out');
}, { once: true });

setTimeout(() => ac.abort(), 10000); 

readline.clearLine(stream, dir[, callback])#

  • stream <stream.Writable>
  • dir <number>
    • -1: カーソルから左
    • 1: カーソルから右
    • 0: 行全体
  • callback <Function> 操作が完了すると呼び出されます。
  • 戻り値: <boolean> stream が追加データを書き込む前に 'drain' イベントが発生するのを待機することを呼び出し元のコードに望む場合は false。それ以外の場合は true

readline.clearLine() メソッドは、dir で指定された方向に、指定された TTY ストリームの現在の行をクリアします。

readline.clearScreenDown(stream[, callback])#

  • stream <stream.Writable>
  • callback <Function> 操作が完了すると呼び出されます。
  • 戻り値: <boolean> stream が追加データを書き込む前に 'drain' イベントが発生するのを待機することを呼び出し元のコードに望む場合は false。それ以外の場合は true

readline.clearScreenDown() メソッドは、カーソルの現在の位置から下にある指定された TTY ストリームをクリアします。

readline.createInterface(options)#

  • options <Object>
    • input <stream.Readable> リッスンする Readable ストリーム。このオプションは必須です。
    • output <stream.Writable> readline データを書き込む Writable ストリーム。
    • completer <Function> Tab キーによる自動補完に使用されるオプションの関数。
    • terminal <boolean> input および output ストリームを TTY のように扱い、ANSI/VT100 エスケープコードを書き込む場合は trueデフォルト: インスタンス化時に output ストリームの isTTY を確認します。
    • history <string[]> 履歴行の初期リスト。このオプションは、ユーザーまたは内部の output チェックによって terminaltrue に設定されている場合にのみ意味を持ちます。そうでない場合、履歴キャッシュメカニズムはまったく初期化されません。デフォルト: []
    • historySize <number> 保持される履歴行の最大数。履歴を無効にするには、この値を 0 に設定します。このオプションは、ユーザーまたは内部の output チェックによって terminaltrue に設定されている場合にのみ意味を持ちます。そうでない場合、履歴キャッシュメカニズムはまったく初期化されません。デフォルト: 30
    • removeHistoryDuplicates <boolean> true の場合、履歴リストに追加された新しい入力行が古いものと重複する場合、リストから古い行を削除します。デフォルト: false
    • prompt <string> 使用するプロンプト文字列。デフォルト: '> '
    • crlfDelay <number> \r\n の間の遅延が crlfDelay ミリ秒を超える場合、\r\n の両方が別々の行末入力として扱われます。crlfDelay100 以上の数値に強制変換されます。Infinity に設定することもできます。その場合、\r の後に \n が続くものは常に単一の改行と見なされます (\r\n 行デリミターでファイルを読み取る場合に適切かもしれません)。デフォルト: 100
    • escapeCodeTimeout <number> readline が文字を待機する時間 (現時点で読み取られた入力を使用して完全なキーシーケンスを形成でき、追加の入力を受け取ってより長いキーシーケンスを完了できるあいまいなキーシーケンスをミリ秒単位で読み取る場合)。デフォルト: 500
    • tabSize <integer> タブが等しいスペースの数 (最小 1)。デフォルト: 8
    • signal <AbortSignal> AbortSignal を使用してインターフェイスを閉じることができます。シグナルをアボートすると、インターフェイスで内部的に close が呼び出されます。
  • 戻り値: <readline.Interface>

readline.createInterface() メソッドは、新しい readline.Interface インスタンスを作成します。

const readline = require('node:readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
}); 

readline.Interface インスタンスが作成されたら、最も一般的なのは 'line' イベントをリッスンすることです。

rl.on('line', (line) => {
  console.log(`Received: ${line}`);
}); 

このインスタンスに対して terminaltrue の場合、output ストリームは output.columns プロパティを定義し、列が変更された場合 (または変更されたとき) に output'resize' イベントを発生させる場合に最適な互換性を得られます (process.stdout は TTY の場合にこれを自動的に行います)。

stdin を入力として使用して readline.Interface を作成する場合、プログラムは EOF 文字を受け取るまで終了しません。ユーザー入力を待たずに終了するには、process.stdin.unref() を呼び出します。

completer 関数の使用法#

completer 関数は、ユーザーが入力した現在の行を引数として受け取り、2 つのエントリを持つ Array を返します。

  • 補完に一致するエントリを含む Array
  • マッチングに使用されたサブストリング。

たとえば: [[substr1, substr2, ...], originalsubstring]

function completer(line) {
  const completions = '.help .error .exit .quit .q'.split(' ');
  const hits = completions.filter((c) => c.startsWith(line));
  // Show all completions if none found
  return [hits.length ? hits : completions, line];
} 

completer 関数は、2 つの引数を受け入れる場合、非同期的に呼び出すことができます。

function completer(linePartial, callback) {
  callback(null, [['123'], linePartial]);
} 

readline.cursorTo(stream, x[, y][, callback])#

  • stream <stream.Writable>
  • x <number>
  • y <number>
  • callback <Function> 操作が完了すると呼び出されます。
  • 戻り値: <boolean> stream が追加データを書き込む前に 'drain' イベントが発生するのを待機することを呼び出し元のコードに望む場合は false。それ以外の場合は true

readline.cursorTo() メソッドは、指定された TTY stream 内の指定された位置にカーソルを移動します。

readline.moveCursor(stream, dx, dy[, callback])#

  • stream <stream.Writable>
  • dx <number>
  • dy <number>
  • callback <Function> 操作が完了すると呼び出されます。
  • 戻り値: <boolean> stream が追加データを書き込む前に 'drain' イベントが発生するのを待機することを呼び出し元のコードに望む場合は false。それ以外の場合は true

readline.moveCursor() メソッドは、指定された TTY stream 内の現在の位置から相対的にカーソルを移動します。

readline.emitKeypressEvents(stream[, interface])#

readline.emitKeypressEvents() メソッドは、指定された Readable ストリームが、受信した入力に対応する 'keypress' イベントの発行を開始するようにします。

オプションで、interface は、コピー&ペーストされた入力が検出された場合にオートコンプリートが無効になる readline.Interface インスタンスを指定します。

streamTTY の場合、ローモードになっている必要があります。

これは、input が端末である場合、すべての readline インスタンスによってその input で自動的に呼び出されます。readline インスタンスを閉じても、input'keypress' イベントを発行するのを止めることはありません。

readline.emitKeypressEvents(process.stdin);
if (process.stdin.isTTY)
  process.stdin.setRawMode(true); 

例: 小さな CLI#

以下の例は、小さなコマンドラインインターフェースを実装するための readline.Interface クラスの使用法を示しています

const readline = require('node:readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'OHAI> ',
});

rl.prompt();

rl.on('line', (line) => {
  switch (line.trim()) {
    case 'hello':
      console.log('world!');
      break;
    default:
      console.log(`Say what? I might have heard '${line.trim()}'`);
      break;
  }
  rl.prompt();
}).on('close', () => {
  console.log('Have a great day!');
  process.exit(0);
}); 

例: ファイルストリームを一行ずつ読み込む#

readline の一般的なユースケースは、入力ファイルを一度に 1 行ずつ消費することです。これを行う最も簡単な方法は、fs.ReadStream API と for await...of ループを利用することです

const fs = require('node:fs');
const readline = require('node:readline');

async function processLineByLine() {
  const fileStream = fs.createReadStream('input.txt');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity,
  });
  // Note: we use the crlfDelay option to recognize all instances of CR LF
  // ('\r\n') in input.txt as a single line break.

  for await (const line of rl) {
    // Each line in input.txt will be successively available here as `line`.
    console.log(`Line from file: ${line}`);
  }
}

processLineByLine(); 

または、'line' イベントを使用することもできます。

const fs = require('node:fs');
const readline = require('node:readline');

const rl = readline.createInterface({
  input: fs.createReadStream('sample.txt'),
  crlfDelay: Infinity,
});

rl.on('line', (line) => {
  console.log(`Line from file: ${line}`);
}); 

現在、for await...of ループは少し遅くなる可能性があります。async / await フローと速度の両方が重要な場合は、混合アプローチを適用できます

const { once } = require('node:events');
const { createReadStream } = require('node:fs');
const { createInterface } = require('node:readline');

(async function processLineByLine() {
  try {
    const rl = createInterface({
      input: createReadStream('big-file.txt'),
      crlfDelay: Infinity,
    });

    rl.on('line', (line) => {
      // Process the line.
    });

    await once(rl, 'close');

    console.log('File processed.');
  } catch (err) {
    console.error(err);
  }
})(); 

TTY キーバインド#

キーバインド 説明 注記
Ctrl+Shift+Backspace 行の左側を削除 Linux、Mac、Windowsでは機能しません
Ctrl+Shift+Delete 行の右側を削除 Macでは機能しません
Ctrl+C SIGINT を発行するか、readline インスタンスを閉じます
Ctrl+H 左を削除
Ctrl+D 右を削除するか、現在の行が空/EOFの場合は readline インスタンスを閉じます Windowsでは機能しません
Ctrl+U 現在の位置から行の先頭まで削除
Ctrl+K 現在の位置から行末まで削除
Ctrl+Y 以前に削除したテキストをヤンク(リコール)します Ctrl+U または Ctrl+K で削除されたテキストでのみ機能します
Meta+Y 以前に削除したテキストを順番に切り替えます 最後のキーストロークが Ctrl+Y または Meta+Y の場合にのみ使用できます
Ctrl+A 行の先頭に移動
Ctrl+E 行末に移動
Ctrl+B 1文字戻る
Ctrl+F 1文字進む
Ctrl+L 画面をクリア
Ctrl+N 次の履歴項目
Ctrl+P 前の履歴項目
Ctrl+- 前の変更を元に戻す キーコード 0x1F を発行するすべてのキーストロークがこのアクションを実行します。多くのターミナル(たとえば xterm)では、これは Ctrl+- にバインドされています。
Ctrl+6 前の変更をやり直す 多くのターミナルにはデフォルトのやり直しキーストロークがありません。キーコード 0x1E を選択してやり直しを実行します。xterm では、デフォルトで Ctrl+6 にバインドされています。
Ctrl+Z 実行中のプロセスをバックグラウンドに移動します。fg と入力して Enter を押して戻ります。 Windowsでは機能しません
Ctrl+W または Ctrl +Backspace 単語の境界まで後方に削除 Ctrl+Backspace は Linux、Mac、Windows では機能しません
Ctrl+Delete 単語の境界まで前方に削除 Macでは機能しません
Ctrl+左矢印 または Meta+B 左単語 Ctrl+左矢印 は Mac では機能しません
Ctrl+右矢印 または Meta+F 右単語 Ctrl+右矢印 は Mac では機能しません
Meta+D または Meta +Delete 右の単語を削除 Meta+Delete は Windows では機能しません
Meta+Backspace 左の単語を削除 Macでは機能しません