
私は Oh-my-zsh 経由で ZSH を使用していますが、便利な機能の 1 つは、コマンドがバックティック内にある場合にシェルがコマンドを展開してくれることです。
たとえば、`pwd`
+は現在のパスにtab置き換えられます。`pwd`
バックティックを使用せずに、いくつかのコマンドに対して同じことを実行する比較的簡単な方法があるかどうか疑問に思っています。それをいくつかのエイリアス (または関数) に適用したいと思います。
明確に言うと、コマンドへの引数の拡張についてではなく、コマンド自体について話しています。
これは本当に素晴らしい機能ですが、まさに私が探していたものではありません。私が何か間違ったことをしていない限り、これはエイリアスをエイリアスが定義されたものに拡張しますが、結果には拡張しません。たとえば、次のようになります。
完全なコマンドではなく、そのコマンドの結果を確認したいと思います。
答え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