web-dev-qa-db-ja.com

ユーティリティのプロンプトラインを編集するためにviをどのように使用できますか?

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をクリックすると、開いているバッファーに行の内容が含まれていません。クエリ、私の履歴(以前に入力したものではありません)。

8
IttayD

まず、シェルコマンドラインエディターとしてviを使用する必要があります。

set -o vi

これで、コマンドをコマンドラインに入力/コピーできます。挿入モードを終了して通常モードに入るには、EscまたはShift + Tabを使用します。これで、viを押してvを開くことができます。

viでは、必要なすべての変更を行い、バッファーを保存してviを終了すると、コマンドが実行されます。

14
pfnuesel

Bashでは、次のコマンドを使用して、現在のコマンドラインのエディターを呼び出すことができます。 Ctrl+x、 Ctrl+e

私が手にしなければならないシステムでは、これはman readline自体のドキュメントにはありませんが、「readline」セクションのman bashにあるため、bash固有かどうかはわかりません機能、または他のreadlineベースのプログラムがサポートするかどうか。

これがbashのドキュメントです:

edit-and-execute-commandC-xC-e

現在のコマンドラインでエディターを起動し、結果をシェルコマンドとして実行します。 Bashは、$VISUAL$EDITOR、およびemacsをこの順序でエディターとして起動しようとします。

9
IMSoP

プロンプトがシェルプロンプト(たとえば、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+^ デフォルトでは)

5
Hans Lub