web-dev-qa-db-ja.com

!*のBash履歴キーボードショートカット

Bashには、最後のコマンドの一部を繰り返す便利な演算子がいくつかあります。

  • !^は、前のコマンドの最初の引数に展開されます。たとえば、

    $ echo one "two three"
    one two three
    $ echo !^
    echo one
    one
    
  • !$は、前のコマンドの最後の引数に展開されます。たとえば、

    $ echo one "two three"
    one two three
    $ echo !$
    echo "two three"
    two three
    
  • !*は、前のコマンドのすべての引数に展開されます。たとえば、

    $ echo one "two three"
    one two three
    $ echo !*
    echo one "two three"
    one two three
    

(私の知る限り、これらは!!:^!!:$および!!:*それぞれ、ここで!!は前のコマンドに展開されるイベント指定子であり、^$および*はワード指定子です。 Bash Reference Manual またはman bash。)

これらはしばしば非常に便利です。ただし、キーボードショートカットを使用するとさらにクールになります。

  • 打ったとき Alt+. または Alt+_、前のコマンドの最後の引数が現在のコマンドに挿入されます。!$ その時点で。

  • ヒットすることも可能です Alt+Ctrl+y 前のコマンドの最初の引数を挿入する場合、!^ その時点で。

GNU Readline Library またはinfo readline。)

実際にコマンドを実行する前に挿入しているものを確認できるため、Bashの履歴演算子よりもキーボードショートカットを好む傾向があります。ただし、前のコマンドのすべての単語を挿入できるショートカット、つまり!*の仕事。少なくとも見つけられませんでした。

そのようなショートカットはありますか?そうでない場合、readlineライブラリを設定して追加することができますか?

8
Malte Skoruppa

次のコマンドの出力を見ると:

bind -l

またはより良い:

bind -l | grep arg

たとえば、最後の引数のyank-last-argなど、すべての引数のreadline関数が存在しないことがわかります。これは、前のコマンド(前の履歴エントリの最後のワード)に最後の引数を挿入できます。そのため、そのような関数が存在しない場合、希望することを達成するためのショートカットはおそらく存在しません。

あなたのリクエストに近づいた方をクレートしてみましょう...

まず、次のコマンドの出力を見てください。

bind -p | grep yank-nth-arg

出力は次のとおりです。

"\e\C-y": yank-nth-arg

そして、次のように翻訳できます:yank-nth-arg(前のコマンドに最初の引数を挿入します-引数nで、前のコマンドのn番目の引数を挿入します) Alt+Ctrl+y

同様に、bind -pコマンドの出力からの任意の行を解釈できます。

ここで、次のシナリオに注意してください。

  • 次のバインディングを設定した場合:

    bind '"\ea": "\e2\e."'
    

    Alt+A にマッピングされます Alt+2Alt+. 前のコマンドの2番目の引数を挿入するためにマップされます。だから、押した後 Alt+A、前のコマンドのsecond引数が現在のコマンドに挿入されます。

  • 設定した場合:

    bind '"\ea": "\e1\e. \e2\e."'
    

    を押した後 Alt+A、前のコマンドの最初の2つの引数が現在のコマンドに挿入されます。前のコマンドの引数の数が最大2である場合、もちろん前のコマンドのallが現在のコマンドに挿入されます。

  • 設定した場合:

    bind '"\ea": "\e1\e. \e2\e. \e3\e."'
    

    を押した後 Alt+A、前のコマンドの最初の3つの引数が現在のコマンドに挿入されます。前のコマンドからの引数の数が最大3(あなたの場合のように)である場合、もちろん前のコマンドのallが現在のコマンド。

  • 等々。

最初の10個の引数には、次を使用できます。

bind '"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."'

そして、あまりにも多くの引数を持つコマンドをあまり頻繁に使用しない限り、これで十分だと思います。

永続的にするには、~/.inputrcファイルに次の行を追加します。

"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."

この例では、私が選んだ Alt+A 前のコマンドのすべての引数(引数の数が10以下の場合)を挿入しますが、前のコマンドで\ea文字列を置き換えることにより、他の任意の組み合わせを選択できます。

リソース:

5
Radu Rădeanu