Node.js v21.7.2 ドキュメント
- Node.js v21.7.2
-
► 目次
- Readline
- クラス:
InterfaceConstructor
- イベント:
'close'
- イベント:
'line'
- イベント:
'history'
- イベント:
'pause'
- イベント:
'resume'
- イベント:
'SIGCONT'
- イベント:
'SIGINT'
- イベント:
'SIGTSTP'
rl.close()
rl.pause()
rl.prompt([preserveCursor])
rl.resume()
rl.setPrompt(prompt)
rl.getPrompt()
rl.write(data[, key])
rl[Symbol.asyncIterator]()
rl.line
rl.cursor
rl.getCursorPos()
- イベント:
- Promises API
- Callback API
readline.emitKeypressEvents(stream[, interface])
- 例: Tiny CLI
- 例: ファイルストリームを1行ずつ読み込む
- TTY キーバインディング
- クラス:
- Readline
-
► インデックス
- アサーションテスト
- 非同期コンテキストトラッキング
- Async Hooks
- Buffer
- C++アドオン
- Node-API を用いた C/C++ アドオン
- C++ エンベッダーAPI
- 子プロセス
- Cluster
- コマンドラインオプション
- Console
- Corepack
- Crypto
- デバッガー
- 非推奨のAPI
- Diagnostics Channel
- DNS
- Domain
- Errors
- Events
- ファイルシステム
- グローバル
- HTTP
- HTTP/2
- HTTPS
- Inspector
- 国際化
- モジュール: CommonJS モジュール
- モジュール: ECMAScript モジュール
- モジュール:
node:module
API - モジュール: パッケージ
- Net
- OS
- Path
- Performance Hooks
- Permissions
- Process
- Punycode
- クエリストリング
- Readline
- REPL
- Report
- 単一実行可能アプリケーション
- Stream
- 文字列デコーダー
- テストランナー
- タイマー
- TLS/SSL
- トレースイベント
- TTY
- UDP/データグラム
- URL
- ユーティリティ
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- ワーカー スレッド
- Zlib
- ► その他のバージョン
- ► オプション
Readline#
ソースコード: 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
#
- 拡張: <EventEmitter>
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
インスタンスの prompt
を output
の新しい行に書き込みます。
呼び出されたとき、rl.prompt()
は、input
ストリームが一時停止されている場合は再開します。
InterfaceConstructor
が output
を null
または undefined
に設定して作成された場合、プロンプトは書き込まれません。
rl.resume()
#
rl.resume()
メソッドは、input
ストリームが一時停止されている場合は再開します。
rl.setPrompt(prompt)
#
prompt
<string>
rl.setPrompt()
メソッドは、rl.prompt()
が呼び出されるたびに output
に書き込まれるプロンプトを設定します。
rl.getPrompt()
#
- 戻り値: <string> 現在のプロンプト文字列
rl.getPrompt()
メソッドは、rl.prompt()
で使用される現在のプロンプトを返します。
rl.write(data[, key])
#
rl.write()
メソッドは、data
または key
で識別されるキーシーケンスを output
に書き込みます。key
引数は、output
が TTY テキスト端末である場合にのみサポートされます。キーの組み合わせの一覧については、TTY キーバインディング を参照してください。
key
が指定されている場合、data
は無視されます。
呼び出されたとき、rl.write()
は、input
ストリームが一時停止されている場合は再開します。
InterfaceConstructor
が output
を null
または 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()
メソッドは、readline
の Interface
の input
に、ユーザーによって提供されたかのようにデータを書き込みます。
rl[Symbol.asyncIterator]()
#
- 戻り値: <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) {
// 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()
#
入力プロンプト + 文字列に関連するカーソルの実際の位置を返します。長い入力(折り返し)文字列と複数行のプロンプトが計算に含まれます。
Promises API#
クラス: 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.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
#
new readlinePromises.Readline(stream[, options])
#
stream
<stream.Writable> TTY ストリーム。options
<Object>autoCommit
<boolean>true
の場合、rl.commit()
を呼び出す必要はありません。
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()
#
- 戻り値: <Promise>
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
チェックによって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>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}`);
});
このインスタンスに対して 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));
// 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.Interface
が output
を null
または 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
チェックによって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
インスタンスを作成します。
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}`);
});
このインスタンスに対して 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));
// 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])
#
stream
<stream.Readable>interface
<readline.InterfaceConstructor>
readline.emitKeypressEvents()
メソッドは、指定された Readable ストリームが、受信した入力に対応する 'keypress'
イベントの発行を開始するようにします。
オプションで、interface
は、コピー&ペーストされた入力が検出された場合にオートコンプリートが無効になる readline.Interface
インスタンスを指定します。
stream
が TTY の場合、ローモードになっている必要があります。
これは、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では機能しません |