Skip to content

Readline

[Stable: 2 - Stable]

Stable: 2 Stability: 2 - Stable

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

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

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

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

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

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

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

js
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()
js
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()
})

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

クラス: InterfaceConstructor

追加されたバージョン: v0.1.104

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

イベント: 'close'

追加バージョン: v0.1.98

'close' イベントは、以下のいずれかが発生した際に発行されます。

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

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

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

イベント: 'line'

追加バージョン: v0.1.98

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

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

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

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

イベント: 'history'

追加バージョン: v15.8.0, v14.18.0

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

リスナー関数は、履歴配列を含む配列を引数として呼び出されます。これは、historySizeremoveHistoryDuplicates によって追加された行と削除された行を含むすべての変更を反映します。

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

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

イベント: 'pause'

追加バージョン: v0.7.5

'pause' イベントは、以下のいずれかが発生した際に発行されます。

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

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

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

イベント: 'resume'

追加日時: v0.7.5

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

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

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

イベント: 'SIGCONT'

追加日時: v0.7.5

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

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

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

js
rl.on('SIGCONT', () => {
  // `prompt` は自動的にストリームを再開します
  rl.prompt()
})

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

イベント: 'SIGINT'

追加日時: v0.3.0

'SIGINT' イベントは、input ストリームが SIGINT として一般的に知られる入力を受け取るたびに発行されます。input ストリームが SIGINT を受信したときに 'SIGINT' イベントリスナーが登録されていない場合、'pause' イベントが発行されます。

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

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

イベント: 'SIGTSTP'

追加日時: v0.7.5

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

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

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

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

js
rl.on('SIGTSTP', () => {
  // これは SIGTSTP を上書きし、プログラムがバックグラウンドに移動するのを防ぎます。
  console.log('Caught SIGTSTP.')
})

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

rl.close()

追加されたバージョン: v0.1.98

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

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

rl.pause()

追加されたバージョン: v0.3.4

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

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

rl.prompt([preserveCursor])

追加されたバージョン: v0.1.98

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

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

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

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

rl.resume()

追加されたバージョン: v0.3.4

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

rl.setPrompt(prompt)

追加されたバージョン: v0.1.98

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

rl.getPrompt()

追加されたバージョン: v15.3.0, v14.17.0

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

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

rl.write(data[, key])

追加されたバージョン: v0.1.98

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

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

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

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

js
rl.write('Delete this!')
// 前に書き込まれた行を削除するためにCtrl+Uをシミュレートします
rl.write(null, { ctrl: true, name: 'u' })

rl.write()メソッドは、データを読み取り専用Interfaceinputに、ユーザーが提供したかのように書き込みます。

rl[Symbol.asyncIterator]()

[履歴]

バージョン変更
v11.14.0, v10.17.0Symbol.asyncIterator サポートは実験的ではなくなりました。
v11.4.0, v10.16.0追加: v11.4.0, v10.16.0

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

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

ループがbreakthrow、またはreturnで終了した場合、rl.close()が呼び出されます。つまり、InterfaceConstructorの反復処理では常に、入力ストリームが完全に消費されます。

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

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

  for await (const line of rl) {
    // readline入力の各行は、ここで`line`として順次利用可能になります。
  }
}

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

rl.line

[履歴]

バージョン変更
v15.8.0, v14.18.0値は常に文字列になり、未定義になることはありません。
v0.1.98追加: v0.1.98

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

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

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

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

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

js
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

追加バージョン: v0.1.98

rl.lineに対するカーソル位置。

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

rl.getCursorPos()

追加バージョン: v13.5.0, v12.16.0

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

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

Promises API

追加バージョン: v17.0.0

[安定版: 1 - 試験段階]

安定版: 1 安定性: 1 - 試験段階

クラス: readlinePromises.Interface

追加バージョン: v17.0.0

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

rl.question(query[, options])

追加日時: v17.0.0

  • query <string> outputに出力される、プロンプトの前に付けられる記述またはクエリ。

  • options <Object>

    • signal <AbortSignal> AbortSignalを使用してquestion()をキャンセルできます。
  • 戻り値: <Promise> queryに対するユーザーの入力で解決される Promise。

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

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

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

rl.close()の後で質問が呼び出されると、拒否された Promise が返されます。

使用例:

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

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

js
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

追加日時: v17.0.0

new readlinePromises.Readline(stream[, options])

追加日時: v17.0.0

rl.clearLine(dir)

追加日時: v17.0.0

  • dir <整数>

    • -1: カーソルから左へ
    • 1: カーソルから右へ
    • 0: 行全体
  • 戻り値: this

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

rl.clearScreenDown()

追加日時: v17.0.0

  • 戻り値: this

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

rl.commit()

追加日時: v17.0.0

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

rl.cursorTo(x[, y])

追加日時: v17.0.0

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

rl.moveCursor(dx, dy)

追加日時: v17.0.0

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

rl.rollback()

追加日: v17.0.0

  • 戻り値: this

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

readlinePromises.createInterface(options)

追加日: v17.0.0

  • options <Object>

    • input <stream.Readable> リッスンするReadableストリーム。このオプションは必須です。
    • output <stream.Writable> readline データ書き込むWritableストリーム。
    • completer <Function> Tab 自動補完に使用されるオプションの関数。
    • terminal <boolean> inputoutputストリームを 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の両方が別々の改行入力として扱われます。crlfDelayは、100以上の数値に変換されます。Infinityに設定することもできます。その場合、\rの後に\nが続くと、常に 1 つの改行と見なされます(\r\n改行区切り文字を持つファイルを読むのに適している場合があります)。デフォルト: 100
    • escapeCodeTimeout <number> readlinePromisesが文字を待つ時間(ミリ秒単位で、これまでに入力された読み取りを使用して完全なキーシーケンスを形成でき、より長いキーシーケンスを完成させるために追加の入力を受け入れることができるあいまいなキーシーケンスを読み取るとき)。デフォルト: 500
    • tabSize <integer> タブに等しいスペースの数(最小 1)。デフォルト: 8
  • 戻り値: <readlinePromises.Interface>

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

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

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

js
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]

js
function completer(line) {
  const completions = '.help .error .exit .quit .q'.split(' ')
  const hits = completions.filter(c => c.startsWith(line))
  // 見つからない場合はすべての補完を表示する
  return [hits.length ? hits : completions, line]
}

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

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

コールバック API

追加されたバージョン: v0.1.104

クラス: readline.Interface

[履歴]

バージョン変更
v17.0.0クラスreadline.Interfaceは теперь наследует от Interface
v0.1.104追加されたバージョン: v0.1.104

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

rl.question(query[, options], callback)

追加されたバージョン: v0.3.3

  • query <string> プロンプトの前に付けられる、outputに書き込むステートメントまたはクエリ。

  • options <Object>

    • signal <AbortSignal> AbortControllerを使用してquestion()をキャンセルすることをオプションで許可します。
  • callback <Function> queryに応答してユーザー入力で呼び出されるコールバック関数。

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

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

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

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

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

使用例:

js
rl.question('あなたの好きな食べ物は? ', answer => {
  console.log(`お、あなたの好きな食べ物は${answer}ですね`)
})

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

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

rl.question('あなたの好きな食べ物は? ', { signal }, answer => {
  console.log(`お、あなたの好きな食べ物は${answer}ですね`)
})

signal.addEventListener(
  'abort',
  () => {
    console.log('食べ物の質問がタイムアウトしました')
  },
  { once: true }
)

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

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

[履歴]

バージョン変更
v18.0.0callback引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACKではなくERR_INVALID_ARG_TYPEがスローされるようになりました。
v12.7.0ストリームのwrite()コールバックと戻り値が公開されました。
v0.7.7追加: v0.7.7
  • stream <stream.Writable>

  • dir <number>

    • -1: カーソルから左へ
    • 1: カーソルから右へ
    • 0: 1 行全体
  • callback <Function> 操作が完了すると呼び出されます。

  • 戻り値: <boolean> streamが、追加のデータの書き込みを続ける前に'drain'イベントの発生を待機することを希望する場合false、それ以外の場合はtrue

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

readline.clearScreenDown(stream[, callback])

[履歴]

バージョン変更
v18.0.0callback引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACKではなくERR_INVALID_ARG_TYPEがスローされるようになりました。
v12.7.0ストリームのwrite()コールバックと戻り値が公開されました。
v0.7.7追加: v0.7.7
  • stream <stream.Writable>
  • callback <Function> 操作が完了すると呼び出されます。
  • 戻り値: <boolean> streamが、追加のデータの書き込みを続ける前に'drain'イベントの発生を待機することを希望する場合false、それ以外の場合はtrue

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

readline.createInterface(options)

[履歴]

バージョン変更
v15.14.0, v14.18.0signal オプションがサポートされました。
v15.8.0, v14.18.0history オプションがサポートされました。
v13.9.0tabSize オプションがサポートされました。
v8.3.0, v6.11.4crlfDelay オプションの最大制限を削除しました。
v6.6.0crlfDelay オプションがサポートされました。
v6.3.0prompt オプションがサポートされました。
v6.0.0historySize オプションに 0 を設定できるようになりました。
v0.1.98追加: v0.1.98
  • options <Object>

    • input <stream.Readable> リッスンする Readable ストリーム。このオプションは必須です。
    • output <stream.Writable> readline データを書き込む Writable ストリーム。
    • completer <Function> Tab オートコンプリートに使用されるオプション関数。
    • terminal <boolean> inputoutput ストリームを 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 インスタンスを作成します。

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

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

js
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]

js
function completer(line) {
  const completions = '.help .error .exit .quit .q'.split(' ')
  const hits = completions.filter(c => c.startsWith(line))
  // 見つからない場合はすべての候補を表示
  return [hits.length ? hits : completions, line]
}

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

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

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

[履歴]

バージョン変更内容
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。
v12.7.0ストリームの write() コールバックと戻り値が公開されました。
v0.7.7追加: v0.7.7
  • stream <stream.Writable>
  • x <number>
  • y <number>
  • callback <Function> 操作が完了すると呼び出されます。
  • 戻り値: <boolean> stream が追加データの書き込みを続行する前に 'drain' イベントの発生を待機することを希望する場合 false。それ以外の場合は true

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

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

[履歴]

バージョン変更内容
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。
v12.7.0ストリームの write() コールバックと戻り値が公開されました。
v0.7.7追加: v0.7.7
  • stream <stream.Writable>
  • dx <number>
  • dy <number>
  • callback <Function> 操作が完了すると呼び出されます。
  • 戻り値: <boolean> stream が追加データの書き込みを続行する前に 'drain' イベントの発生を待機することを希望する場合 false。それ以外の場合は true

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

readline.emitKeypressEvents(stream[, interface])

追加: v0.7.7

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

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

streamTTYである場合、raw モードでなければなりません。

これは、inputがターミナルである場合、任意の readline インスタンスによってそのinputに対して自動的に呼び出されます。readlineインスタンスを閉じても、input'keypress'イベントを発行することは停止しません。

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

例:小さな CLI

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

js
import { createInterface } from 'node:readline'
import { exit, stdin, stdout } from 'node:process'
const rl = createInterface({
  input: stdin,
  output: 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!')
  exit(0)
})
js
const { createInterface } = require('node:readline')
const rl = 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)
})

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

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

js
import { createReadStream } from 'node:fs'
import { createInterface } from 'node:readline'

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

  const rl = 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()
js
const { createReadStream } = require('node:fs')
const { createInterface } = require('node:readline')

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

  const rl = 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' イベントを使用することもできます。

js
import { createReadStream } from 'node:fs'
import { createInterface } from 'node:readline'

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

rl.on('line', line => {
  console.log(`Line from file: ${line}`)
})
js
const { createReadStream } = require('node:fs')
const { createInterface } = require('node:readline')

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

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

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

js
import { once } from 'node:events'
import { createReadStream } from 'node:fs'
import { createInterface } from '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)
  }
})()
js
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 + Delete左側の行を削除Linux、Mac、Windows では動作しません
Ctrl + Delete右側の行を削除Mac では動作しません
Ctrl + CSIGINTを送信または readline インスタンスを閉じます
Ctrl + D左を削除
Ctrl + D右を削除、または現在の行が空/EOF の場合は readline インスタンスを閉じますWindows では動作しません
Ctrl + U現在位置から行頭まで削除
Ctrl + K現在位置から行末まで削除
Ctrl + Y以前削除したテキストをやり直す(呼び出し)Ctrl + U または Ctrl + K で削除したテキストでのみ動作します
Alt + Y前回削除したテキスト間を巡回最後のキーストロークが Ctrl + U または Ctrl + K の場合のみ使用できます
Ctrl + A行頭に移動
Ctrl + E行末に移動
Ctrl + B1 文字戻る
Ctrl + F1 文字進む
Ctrl + L画面クリア
Ctrl + N次の履歴項目
Ctrl + P前の履歴項目
Ctrl + _前の変更を元に戻すキーコード0x1Fを出力するキーストロークであれば、このアクションを実行します。多くのターミナル(例:xterm)では、これは Ctrl + _にバインドされています。
Ctrl + Shift + Z前の変更をやり直す多くのターミナルには、デフォルトのやり直しキーストロークがありません。やり直しを実行するためにキーコード0x1Eを選択します。xtermでは、デフォルトで Ctrl + Shift + Z にバインドされています。
Ctrl + Z実行中のプロセスをバックグラウンドに移動します。fgと Enter キーを押して戻ります。Windows では動作しません
Alt + B または Alt + ←単語境界まで後ろに削除Alt + ← は Linux、Mac、Windows では動作しません
Alt + D単語境界まで前に削除Mac では動作しません
Alt + B または Alt + ←単語左Alt + ← は Mac では動作しません
Alt + F または Alt + →単語右Alt + → は Mac では動作しません
Alt + D または Alt + Delete単語右を削除Alt + Delete は Windows では動作しません
Alt + Delete単語左を削除Mac では動作しません