SQLのようなクエリのプロンプトを提供するためにread -e
を使用するユーティリティをbashで作成しました。これらが長い場合があるので、viを開いて現在の行を編集し、終了時にその行をvimの内容に置き換えたいと思います。 read
で行を読みます。何かのようなもの:
query> select .... from .... very long... <ctrl-e>
今viで
select .... from .... very long...
編集する
select ...
from ....
very long ...
出口vi
query> select ...
from ....
very long ... <enter>
クエリが実行されます。
更新: 'read -e'の前に 'set -o vi'を使用するのが私の方法のようですが、現在<esc>v
をクリックすると、開いているバッファーに行の内容が含まれていません。クエリ、私の履歴(以前に入力したものではありません)。
まず、シェルコマンドラインエディターとしてviを使用する必要があります。
set -o vi
これで、コマンドをコマンドラインに入力/コピーできます。挿入モードを終了して通常モードに入るには、Esc
またはShift
+ Tab
を使用します。これで、vi
を押してv
を開くことができます。
vi
では、必要なすべての変更を行い、バッファーを保存してvi
を終了すると、コマンドが実行されます。
Bashでは、次のコマンドを使用して、現在のコマンドラインのエディターを呼び出すことができます。 Ctrl+x、 Ctrl+e。
私が手にしなければならないシステムでは、これはman readline
自体のドキュメントにはありませんが、「readline」セクションのman bash
にあるため、bash固有かどうかはわかりません機能、または他のreadlineベースのプログラムがサポートするかどうか。
これがbashのドキュメントです:
edit-and-execute-command
(C-xC-e
)現在のコマンドラインでエディターを起動し、結果をシェルコマンドとして実行します。 Bashは、
$VISUAL
、$EDITOR
、およびemacs
をこの順序でエディターとして起動しようとします。
プロンプトがシェルプロンプト(たとえば、read
への呼び出し)である限り、他のすべての回答は有効で便利です
そうでない場合(この点について完全に明確ではありません)、たとえばSQLインタープリターxxxsql
を使用している場合、_rlwrap --multi-line -a xxxsql
_を使用してから、特別な(構成可能な)キーを使用して、選択したエディター(例:export RLWRAP_EDITOR="vim '+call cursor(%L,%C)"
で指定)を呼び出すことができます。入力-_call_cursor
_は、vim
)を呼び出すときにカーソル位置を保持するのに役立ちます
追加の特典として、複数行のコマンド(履歴リストに追加される前に1行のコマンドに「圧縮」されますが、再利用されると再び展開されます)についても、完全なコマンド履歴があります。
編集:詳細は rlwraps Github page にあります。 GNU readlineライブラリ を使用するすべてのコマンドと同様に、その動作のほとんどは 指定されています ユーザー__$INPUTRC
_にrlwrap
が独自のオプションを追加し、特に、外部エディターを呼び出すための上記の特別なキーを制御します(CTRL+^ デフォルトでは)