Readline
[Stable: 2 - Stable]
Stable: 2 Stability: 2 - Stable
ソースコード: lib/readline.js
node:readline
モジュールは、Readable ストリーム(process.stdin
など)から一度に一行ずつデータを読み取るためのインターフェースを提供します。
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()
})
このコードが呼び出されると、インターフェースはinput
ストリームで受信されたデータが来るまで待機するため、readline.Interface
が閉じられるまで Node.js アプリケーションは終了しません。
クラス: InterfaceConstructor
追加されたバージョン: v0.1.104
- 継承元: <EventEmitter>
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'
イベントが発行されます。
リスナー関数は、受信した単一行の入力を含む文字列を引数として呼び出されます。
rl.on('line', input => {
console.log(`Received: ${input}`)
})
イベント: 'history'
追加バージョン: v15.8.0, v14.18.0
'history'
イベントは、履歴配列が変更されるたびに発行されます。
リスナー関数は、履歴配列を含む配列を引数として呼び出されます。これは、historySize
と removeHistoryDuplicates
によって追加された行と削除された行を含むすべての変更を反映します。
主な目的は、リスナーが履歴を保持できるようにすることです。リスナーが履歴オブジェクトを変更することも可能です。これは、パスワードなど、特定の行を履歴に追加しないようにするために役立つ場合があります。
rl.on('history', history => {
console.log(`Received: ${history}`)
})
イベント: 'pause'
追加バージョン: v0.7.5
'pause'
イベントは、以下のいずれかが発生した際に発行されます。
input
ストリームが一時停止した場合。input
ストリームが一時停止しておらず、'SIGCONT'
イベントを受信した場合。(イベント'SIGTSTP'
および'SIGCONT'
を参照してください。)
リスナー関数は、引数を渡さずに呼び出されます。
rl.on('pause', () => {
console.log('Readline paused.')
})
イベント: 'resume'
追加日時: v0.7.5
'resume'
イベントは、input
ストリームが再開されるたびに発行されます。
リスナー関数は、引数を渡さずに呼び出されます。
rl.on('resume', () => {
console.log('Readline resumed.')
})
イベント: 'SIGCONT'
追加日時: v0.7.5
'SIGCONT'
イベントは、+(つまりSIGTSTP
)を使用してバックグラウンドに移動した Node.js プロセスが、fg(1p)
を使用してフォアグラウンドに戻されたときに発行されます。
SIGTSTP
要求の前にinput
ストリームが一時停止されていた場合、このイベントは発行されません。
リスナー関数は、引数を渡さずに呼び出されます。
rl.on('SIGCONT', () => {
// `prompt` は自動的にストリームを再開します
rl.prompt()
})
'SIGCONT'
イベントは、Windows ではサポートされていません。
イベント: 'SIGINT'
追加日時: v0.3.0
'SIGINT'
イベントは、input
ストリームが SIGINT
として一般的に知られる入力を受け取るたびに発行されます。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'
追加日時: v0.7.5
'SIGTSTP'
イベントは、input
ストリームが SIGTSTP
として一般的に知られる + 入力を受け取るたびに発行されます。input
ストリームが SIGTSTP
を受信したときに 'SIGTSTP'
イベントリスナーが登録されていない場合、Node.js プロセスはバックグラウンドに送られます。
プログラムがfg(1p)
を使用して再開されると、'pause'
イベントと 'SIGCONT'
イベントが発行されます。これらを使用して input
ストリームを再開できます。
プロセスがバックグラウンドに送られる前に input
が一時停止されていた場合、'pause'
イベントと 'SIGCONT'
イベントは発行されません。
リスナー関数は、引数を渡さずに呼び出されます。
rl.on('SIGTSTP', () => {
// これは SIGTSTP を上書きし、プログラムがバックグラウンドに移動するのを防ぎます。
console.log('Caught SIGTSTP.')
})
'SIGTSTP'
イベントは、Windows ではサポートされていません。
rl.close()
追加されたバージョン: v0.1.98
rl.close()
メソッドはInterfaceConstructor
インスタンスを閉じ、input
とoutput
ストリームに対する制御を解放します。呼び出されると、'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
インスタンスで設定されたprompt
をoutput
の新しい行に書き込みます。
呼び出されると、rl.prompt()
は、input
ストリームが一時停止されている場合、それを再開します。
InterfaceConstructor
がoutput
をnull
またはundefined
に設定して作成された場合、プロンプトは書き込まれません。
rl.resume()
追加されたバージョン: v0.3.4
rl.resume()
メソッドは、input
ストリームが一時停止されている場合、それを再開します。
rl.setPrompt(prompt)
追加されたバージョン: v0.1.98
prompt
<string>
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
引数は、output
がTTYテキストターミナルの場合のみサポートされます。キーの組み合わせのリストについては、TTY キーバインディングを参照してください。
key
が指定されている場合、data
は無視されます。
呼び出されると、rl.write()
は、input
ストリームが一時停止されている場合、それを再開します。
InterfaceConstructor
がoutput
をnull
またはundefined
に設定して作成された場合、data
とkey
は書き込まれません。
rl.write('Delete this!')
// 前に書き込まれた行を削除するためにCtrl+Uをシミュレートします
rl.write(null, { ctrl: true, name: 'u' })
rl.write()
メソッドは、データを読み取り専用Interface
のinput
に、ユーザーが提供したかのように書き込みます。
rl[Symbol.asyncIterator]()
[履歴]
バージョン | 変更 |
---|---|
v11.14.0, v10.17.0 | Symbol.asyncIterator サポートは実験的ではなくなりました。 |
v11.4.0, v10.16.0 | 追加: v11.4.0, v10.16.0 |
- 戻り値: <AsyncIterator>
入力ストリーム内の各行を文字列として反復処理するAsyncIterator
オブジェクトを作成します。このメソッドにより、for await...of
ループを使用してInterfaceConstructor
オブジェクトの非同期反復処理が可能になります。
入力ストリームのエラーは転送されません。
ループがbreak
、throw
、またはreturn
で終了した場合、rl.close()
が呼び出されます。つまり、InterfaceConstructor
の反復処理では常に、入力ストリームが完全に消費されます。
パフォーマンスは従来の'line'
イベント API と同等ではありません。パフォーマンスが重要なアプリケーションでは'line'
を使用してください。
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 つは次のとおりです。
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
入力プロンプトと文字列に対するカーソルの実際の位置を返します。長い入力(折り返し)文字列や複数行のプロンプトも計算に含まれます。
Promises API
追加バージョン: v17.0.0
クラス: 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()
メソッドは、query
をoutput
に書き込むことで表示し、input
でユーザー入力が提供されるのを待ち、提供された入力を最初の引数として渡してcallback
関数を呼び出します。
呼び出されると、rl.question()
は一時停止されていた場合、input
ストリームを再開します。
readlinePromises.Interface
がoutput
をnull
または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
追加日時: v17.0.0
new readlinePromises.Readline(stream[, options])
追加日時: v17.0.0
stream
<stream.Writable> TTYストリーム。options
<Object>autoCommit
<boolean>true
の場合、rl.commit()
を呼び出す必要はありません。
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
- 戻り値: <Promise>
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>input
とoutput
ストリームを TTY として扱い、ANSI/VT100 エスケープコードを書き込む場合true
。デフォルト: インスタンス化時にoutput
ストリームでisTTY
をチェックします。history
<string[]> 履歴行の初期リスト。このオプションは、ユーザーまたは内部output
チェックによってterminal
がtrue
に設定されている場合にのみ意味を持ちます。それ以外の場合は、履歴キャッシュメカニズムはまったく初期化されません。デフォルト:[]
。historySize
<number> 保持される履歴行の最大数。履歴を無効にするには、この値を0
に設定します。このオプションは、ユーザーまたは内部output
チェックによってterminal
がtrue
に設定されている場合にのみ意味を持ちます。それ以外の場合は、履歴キャッシュメカニズムはまったく初期化されません。デフォルト: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.createInterface()
メソッドは、新しいreadlinePromises.Interface
インスタンスを作成します。
import { createInterface } from 'node:readline/promises'
import { stdin, stdout } from 'node:process'
const rl = createInterface({
input: stdin,
output: stdout,
})
const { createInterface } = require('node:readline/promises')
const rl = createInterface({
input: process.stdin,
output: process.stdout,
})
readlinePromises.Interface
インスタンスが作成されると、最も一般的なケースは'line'
イベントをリッスンすることです。
rl.on('line', line => {
console.log(`Received: ${line}`)
})
このインスタンスのterminal
がtrue
の場合、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))
// 見つからない場合はすべての補完を表示する
return [hits.length ? hits : completions, line]
}
completer
関数は、<Promise>を返すことも、非同期にすることもできます。
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
ストリームを再開します。
output
がnull
またはundefined
に設定されてreadline.Interface
が作成された場合、query
は書き込まれません。
rl.question()
に渡されたcallback
関数は、Error
オブジェクトまたはnull
を最初の引数として受け入れるという通常のパターンに従いません。callback
は、提供された回答を唯一の引数として呼び出されます。
rl.close()
の後にrl.question()
を呼び出すと、エラーがスローされます。
使用例:
rl.question('あなたの好きな食べ物は? ', answer => {
console.log(`お、あなたの好きな食べ物は${answer}ですね`)
})
AbortController
を使用して質問をキャンセルする。
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.0 | callback 引数に無効なコールバックを渡すと、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.0 | callback 引数に無効なコールバックを渡すと、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.0 | signal オプションがサポートされました。 |
v15.8.0, v14.18.0 | history オプションがサポートされました。 |
v13.9.0 | tabSize オプションがサポートされました。 |
v8.3.0, v6.11.4 | crlfDelay オプションの最大制限を削除しました。 |
v6.6.0 | crlfDelay オプションがサポートされました。 |
v6.3.0 | prompt オプションがサポートされました。 |
v6.0.0 | historySize オプションに 0 を設定できるようになりました。 |
v0.1.98 | 追加: v0.1.98 |
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
チェックによってterminal
がtrue
に設定されている場合のみ意味を持ちます。それ以外の場合は、履歴キャッシュメカニズムはまったく初期化されません。デフォルト:[]
。historySize
<number> 保持される履歴行の最大数。履歴を無効にするには、この値を0
に設定します。このオプションは、ユーザーまたは内部output
チェックによってterminal
がtrue
に設定されている場合のみ意味を持ちます。それ以外の場合は、履歴キャッシュメカニズムはまったく初期化されません。デフォルト:30
。removeHistoryDuplicates
<boolean>true
の場合、履歴リストに追加された新しい入力行が古い行と重複すると、古い行がリストから削除されます。デフォルト:false
。prompt
<string> 使用するプロンプト文字列。デフォルト:'\> '
。crlfDelay
<number>\r
と\n
の間の遅延がcrlfDelay
ミリ秒を超えると、\r
と\n
の両方が別々の行末入力として扱われます。crlfDelay
は100
以上になるように強制変換されます。Infinity
に設定することもできます。その場合、\r
の後に\n
が続くのは常に単一の改行とみなされます(\r\n
行区切り文字を持つファイルの読み取りには妥当な場合があります)。デフォルト:100
。escapeCodeTimeout
<number>readline
が文字を待つ時間(ミリ秒単位で、読み取られた入力を使用して完全なキーシーケンスを形成できるあいまいなキーシーケンスを読み取るとき、また、より長いキーシーケンスを完成させるために追加の入力を必要とする可能性がある場合)。デフォルト:500
。tabSize
<integer> タブに相当するスペースの数(最小 1)。デフォルト:8
。signal
<AbortSignal> AbortSignal を使用してインターフェースを閉じることができます。シグナルの中断は、インターフェースで内部的にclose
を呼び出します。
戻り値: <readline.Interface>
readline.createInterface()
メソッドは、新しい readline.Interface
インスタンスを作成します。
import { createInterface } from 'node:readline'
import { stdin, stdout } from 'node:process'
const rl = createInterface({
input: stdin,
output: stdout,
})
const { createInterface } = require('node:readline')
const rl = createInterface({
input: process.stdin,
output: process.stdout,
})
readline.Interface
インスタンスが作成されると、最も一般的なケースは 'line'
イベントをリッスンすることです。
rl.on('line', line => {
console.log(`Received: ${line}`)
})
このインスタンスの terminal
が true
の場合、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))
// 見つからない場合はすべての候補を表示
return [hits.length ? hits : completions, line]
}
completer
関数は、2 つの引数を受け入れる場合、非同期で呼び出すことができます。
function completer(linePartial, callback) {
callback(null, [['123'], linePartial])
}
readline.cursorTo(stream, x[, y][, callback])
[履歴]
バージョン | 変更内容 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、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.0 | callback 引数に無効なコールバックを渡すと、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
stream
<stream.Readable>interface
<readline.InterfaceConstructor>
readline.emitKeypressEvents()
メソッドは、指定されたReadableストリームに対し、受信した入力に対応する'keypress'
イベントの発行を開始させます。
オプションとして、interface
には、コピー&ペーストされた入力が検出された際にオートコンプリートが無効化されるreadline.Interface
インスタンスを指定します。
stream
がTTYである場合、raw モードでなければなりません。
これは、input
がターミナルである場合、任意の readline インスタンスによってそのinput
に対して自動的に呼び出されます。readline
インスタンスを閉じても、input
が'keypress'
イベントを発行することは停止しません。
readline.emitKeypressEvents(process.stdin)
if (process.stdin.isTTY) process.stdin.setRawMode(true)
例:小さな CLI
以下の例は、readline.Interface
クラスを使用して小さなコマンドラインインターフェースを実装する方法を示しています。
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)
})
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
ループを利用することです。
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()
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'
イベントを使用することもできます。
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}`)
})
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
フローと速度の両方が重要な場合は、混合アプローチを適用できます。
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)
}
})()
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 + C | SIGINT を送信または 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 + B | 1 文字戻る | |
Ctrl + F | 1 文字進む | |
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 では動作しません |