拡張可能なコマンドを作成する

拡張可能なコマンドを作成する

私は Oh-my-zsh 経由で ZSH を使用していますが、便利な機能の 1 つは、コマンドがバックティック内にある場合にシェルがコマンドを展開してくれることです。

たとえば、`pwd`+は現在のパスにtab置き換えられます。`pwd`

https://infinit.io/_/DjmxTCK.gif

バックティックを使用せずに、いくつかのコマンドに対して同じことを実行する比較的簡単な方法があるかどうか疑問に思っています。それをいくつかのエイリアス (または関数) に適用したいと思います。

明確に言うと、コマンドへの引数の拡張についてではなく、コマンド自体について話しています。


これは本当に素晴らしい機能ですが、まさに私が探していたものではありません。私が何か間違ったことをしていない限り、これはエイリアスをエイリアスが定義されたものに拡張しますが、結果には拡張しません。たとえば、次のようになります。

ここに画像の説明を入力してください

完全なコマンドではなく、そのコマンドの結果を確認したいと思います。

答え1

これにはカスタムzleウィジェットを使用し、キーバインディングで呼び出すことができます。たとえば、Alt+ ( 、Tabと同じ)EscTab

expand-to-output () {
    BUFFER='$('$BUFFER')'
    CURSOR=0
    zle redisplay
    zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output

ここで、任意のコマンドに続けてAlt+を入力するとTab、コマンド全体がその出力に置き換えられます。もしコマンドは正常に実行されました。コマンドが正常に実行されなかった場合、入力されたコマンド ラインは で囲まれるだけで$(...)、展開されません。エラー メッセージがあった場合、編集バッファの上に出力されます。これは、複数行のプロンプトでは確実に機能しない可能性があります。

説明:

  • expand-to-output () {...}(新しい)expand-to-output関数を定義します。
  • BUFFER現在のコマンドラインが含まれています
  • BUFFER='$('$BUFFER')'コマンドラインの$(前後に置きます。は と同等ですが、ネストできます。)$(...)`...`
  • CURSORコマンドライン上のカーソルの位置です
  • CURSOR=0は、(編集された)コマンドラインの先頭、つまり にカーソルを置きます。カーソルをそこに移動しないと、 がプロセス全体の置換ではなく内の単語を展開しようとする$可能性があります。zsh$(...)
  • zle redisplay編集バッファを再表示します。これにより、展開されたコマンドが何かを印刷した場合に表示エラーが発生するのを防ぎます。標準エラー出力(注:複数行のプロンプトでは問題が発生する可能性があります)
  • zle expand-wordウィジェットを呼び出しますexpand-word。これは通常、タブ補完の一部として頻繁に呼び出されます。
  • zle -N expand-to-output関数を同じ名前のウィジェットとして登録します。
  • bindkey "^[^I" expand-to-outputウィジェットを+expand-to-outputにバインドします。AltTab

関連情報