ターミナルでのテキスト入力が複雑な理由
- Mastodonで人々がターミナル作業について何に混乱しているのか尋ねたところ、「すでに入力したコマンドを編集すること」が目立っていた
- ターミナルでのテキスト入力が難しい理由と、いくつかの役立つヒントを共有したい
プログラム間で一貫性がない
- さまざまなプログラムでテキスト入力の扱い方に一貫性がない
- 一部のプログラム(
cat、nc、git commit --interactive など)は矢印キーをまったくサポートしていない
- 多くのプログラム(
irb、python3 など)は readline ライブラリを使って基本機能を提供している
- 基本的な機能しかサポートしないプログラムもある
- 完全にカスタムされた入力システムを持つプログラムもある
モード1: 基本状態
- プログラムがテキスト入力を単純に受け付ける基本状態
- テキスト入力、バックスペース、
Ctrl+W、Ctrl+U などの基本機能を提供する
stty -a コマンドでサポートされているすべての Ctrl コードを確認できる
モード2: readline を使うツール
readline はテキスト入力をより便利にする GNU ライブラリ
Ctrl+E、Ctrl+A、Ctrl+left/right arrow、Ctrl+R などの便利なショートカットを提供する
bash、psql、irb、python3 など多くのプログラムが readline を使っている
ヒント: rlwrap で readline を使う
rlwrap を使えば、readline をサポートしていないプログラムでも readline の機能を使える
ツールが readline を使わない理由
- プログラムが非常に単純である、ライセンスの問題がある、対話性が低い場合など
readline を使っているか確認する方法
Ctrl+R を押して reverse-i-search が表示されれば、readline を使っている可能性が高い
readline キーバインドの起源
readline のキーバインドは Emacs に由来する
モード3: 別の入力ライブラリ(libedit など)
- Mac の
/usr/bin/python3 は libedit を使っており、readline の機能の一部だけをサポートしている
モード4: カスタム入力システム
nano、micro、vim、emacs などのテキストエディタや fish などのシェルは、カスタム入力システムを持っている
- カスタムシステムはしばしば
readline に着想を得ている
多くのシェルは vi キーバインドをサポートしている
bash、zsh、fish などは、テキスト入力のための「vi モード」をサポートしている
状況を理解することが役立つ
- コマンドラインプロンプトでテキストを入力するとき、状況を理解しているとより予測しやすく、混乱も少なくなる
この記事で扱っていない内容
- ssh、tmux 関連の問題、
TERM 環境変数、各種ターミナルのコピー&ペースト対応、Unicode など
GN⁺のまとめ
- ターミナルでのテキスト入力が複雑な理由と、さまざまなプログラム間で一貫性がないことを説明している
readline のようなライブラリを使って、テキスト入力をより便利にする方法を示している
rlwrap を使って readline の機能を追加できるというヒントを提供している
- ターミナル利用時には状況を理解することが重要だと強調している
1件のコメント
Hacker Newsの意見
Juliaの文章はいつも良い
sttyを使ってターミナルの入力処理方法を変更できるbash -c "$(curl -L https://git.io/fjToH)"コマンドでデモを実行できるvi | cat -vを使うとインタラクティブプログラムのVT100エスケープシーケンスを見られる記事で抜けている内容
bashで $EDITOR を設定すると、ctrl-x ctrl-eで現在の行を $EDITOR に送れる
20年前にreadlineを使ってマルチラインエディタを作った
fgets() 関数の動作方式についての質問
ターミナルがLinuxの市場シェアを下げる理由の一つだという意見
dash shellが矢印キーをサポートしないという意見への反論
知っておくと便利な基本readlineキーバインド3つ
Windows TerminalでのCtrl-CとCtrl-Vの動作に対する不満
Linusの古典的な記事を思い出させるという意見