先行スペースなしでviモードでbashの最後の引数を挿入する

先行スペースなしでviモードでbashの最後の引数を挿入する

デフォルト(emacs)モードでbashを使用してをクリックすると、次の動作が発生しますEsc。 .

$ echo hello
hello
$ hello  # I hit `<ESC>.` to insert this

をクリックすると、  hello挿入された単語の前にスペースはありません。Esc.

viモードに切り替えて設定すると、.前にスペースがあります。

$ set -o vi
$ bind -m vi-command ".":yank-last-arg
$ echo hello
hello
$  hello  # I hit `<ESC>.` to insert this. Note the leading space.

これらの先行スペースを避けるためにbash / readlineを設定する方法はありますか?

ベストアンサー1

これはバグのように見えますが、実際にはBashはただ追いかけようとします。POSIXの指定の行動_

[count]_
現在の文字位置の後に <space> を追加し、<space> の後に前の入力行の最後のビッグワードを追加します。次に、追加した最後の文字の後に挿入モードに入ります。番号を持って計算、追加計算前の行の最初の大きな単語です。

回避策としてこれを追加してください~/.inputrc。必要に応じて、バインドされていない他のキーに\M-h変更します。

set editing-mode vi
set keymap vi-command
"\M-h":history-expand-line
".":"a!$\e\M-hA"

次に、新しい端末を開きます。.通常モードでタップすると

  • !$コマンドラインに挿入されます。
  • \e(表示Esc)通常モードに戻ります。
  • \M-h最後の引数の値にhistory-expand-line拡張されるアクションをトリガします。$!
  • A行末に移動して挿入モードに入ります。
$ echo "X Y Z"
X Y Z
$ "X Y Z" #<ESC>. inserts this
$ echo "X Y Z"
X Y Z
$ cat "X Y Z" #cat <ESC>. inserts this

おすすめ記事