readlineでviキーバインディングを使用して行の先頭に移動する方法は?

readlineでviキーバインディングを使用して行の先頭に移動する方法は?

複数行コマンドには次の違いがあります。

  • 行を開始
  • コマンドの開始

vim キーバインディングの使用set -o vi FOR READLINE(例:bash、psqlなど)、コマンドの先頭の代わりに行の先頭に移動する方法。

VIMにはそのような問題はありません。これはreadlineアプリケーションのviキーバインディングにあります。

これをコピーしてください...すべて(以下の数行の引用)

複数行コマンドには次の違いがあります。

  • 行を開始
  • コマンドの開始

vimキーバインディングを使用すると、コマンドの先頭ではなく行の先頭set -o viにどのように移動できますか?

今、次のガイドラインに従ってください。

  1. タイプecho "
  2. 上記の内容を貼り付けてください。
  3. "コマンドを完了するには、を入力してキーを押しますEnter

次に、上矢印を押してコマンドバッファに入れます。

  1. 今行の始まりと終わりにどのように移動しますか?コマンドではありません
  2. 複数行コマンドから1行上に移動する方法、他のコマンドを実行しないでください

答え1

これがうまくいくかどうかはわかりません。正確にあなたが望むものは何ですか?しかし、これはおそらくあなたが得ることができる最も近いものでしょう。

escv

$EDITOR現在のコマンドは、選択したエディタ(Debianに設定されているエディタなど/etc/alternatives)で開きます。おそらくこれをviまたはvimに設定し、などを使用して行間jkナビ0ゲートできます$

ボーナスとして、

shopt -s lithist

セミコロンで区切られたコマンドを連結する代わりに、レコードの行形式が維持されます。

Evan Carrollが指摘したように、これはbashでのみ機能しますが、readlineを使用する他の多くのプログラムにも外部エディタがあります。psqlたとえば\e

答え2

bashは要求された操作をまったく実行しません。これはkshをかなり似ている模倣です。。ここで要求した機能は次のとおりです。機能ですが、vimが提供する拡張機能です。

答え3

  • 行を開始
  • コマンドの開始

readline/bash では、これら 2 つ (複数行のコマンド) の違いを簡単に表示できます。実行できません。そして区別が不可能なので、各キーにバインドすることはできません。

以下はすべて仮定します。set -o vi

bashプロンプトで次のように入力するとしますReturn。 (またそれを押して出力を生成します。)

[~]$ echo "yay
> yep
> yup"
yay
yep
yup

Esc次に、を押してk次の情報({.}カーソル位置)を取得します。

[~]$ {e}cho "yay
yep
yup"

次の点に注意してください。

  1. PS2>マイコンピュータでは)直接入力したときのように印刷されません。
  2. コマンド内の行ではなく、前のコマンドを押し続けるかkスクロールする場合。j

それでは、実際に編集をしているとしましょう。数行以内しかし、一つ改行文字を含む単一行(はい、そこには大きな違いがあります。コマンド履歴は、改行で区切られたテキストではなくリンクリストとしてメモリに保存されます。)

インタプリタが解析するときに限り、1行が複数のコマンドになることを証明する方法を見てみましょう。これはreadlineセクションのコマンドですman bash

comment-begin (``#'')
              The  string that is inserted when the readline insert-comment command is executed.  This command is bound to
              M-# in emacs mode and to # in vi command mode.

デフォルトでは、その行に達したら#コメントアウトしてインタプリタに渡す必要があります(なぜインタプリタに渡されるのかはわかりませんが、履歴に表示されるようです)。とにかく、私たちは#readlineコマンドをクリックすると実行されることを知っています。つまり、編集コマンドではありません(実際にはViでは「次の検索」でなければなりません)。

まず、次へを押してカーソルを最後に移動します$

[~]$ echo "yay
yep
yup{"}

クリックする#と状況が発生します。シェルセッションは次のとおりです。

[~]$ #echo "yay
yep
yup"
bash: yep: command not found
> { }

奇妙に見えますが、そうですか?しかし、それがまさに私たちが要求したものです。 readlineがコメントしました。ワイヤーそしてそれをパーサーに渡します。 echo "yay注釈が付けられ、シェルが実行を試み、優れた参照があるため、yepこれがわかります。終了するには入力してください。PS2yup""Return

だから私たちは次のように結論を下すことができます。readline は複数行コマンドの行を区別しません。上記で入力しました。 readline が区別されない場合、その上の Vi モードも区別されません。

複数行を個別に編集する必要がある場合は、@BartonChittendenの回答(+1)に従って、エディタを入力してください。エディタは、行間を移動できるように、行を複数のエンティティに分割します。

答え4

この順序はShift ^私に合うようです。

関連情報