zshコマンドラインですべてのエイリアスを確認してください。

zshコマンドラインですべてのエイリアスを確認してください。

ネストされたエイリアスがあり、コマンドを実行する前にすべてのエイリアスを確認したいと思います。どうすればいいですか?

どのキーにもバインドされていない機能がある場合は、M-x foobar私も大丈夫です。外部コマンド(、、、など)も使用できますtype。スレッド内のすべてを試しました。commandwhich「which」を使わないのはなぜですか?それでは何を使うべきですか?しかし、何も動作しません。

答え1

Ctrl-Alt-Eはbash単にエイリアスを拡張するものではありません。また、変数、コマンド置換(!)、プロセス置換(!)、算術拡張、および引用符の削除(ファイル名の生成(ワイルドカード)、またはチルダ拡張を実行しない)も拡張します。

エイリアスを拡張することは必ずしも可能ではありません。したがって、用途がありますが、その結果、コマンドラインの意味が変わり、副作用があり、潜在的に危険である可能性があることを認識することが重要です。

たとえば、

$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done

ここをクリックすると、M-C-E次の内容が表示されます。

$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done

rm -rf *これはまったく異なるコマンドラインを提供します(上記のコマンドラインを代わりに使用するとどうなるか想像してください)、エイリアスを拡張しませんpwdfoo

を使用すると、zsh関数内で拡張されたエイリアスのGillesの説明に基づいて、次のことができます。

expand-aliases() {
  unset 'functions[_expand-aliases]'
  functions[_expand-aliases]=$BUFFER
  (($+functions[_expand-aliases])) &&
    BUFFER=${functions[_expand-aliases]#$'\t'} &&
    CURSOR=$#BUFFER
}

zle -N expand-aliases
bindkey '\e^E' expand-aliases

エイリアスは、現在のコマンドラインが構文的に有効な場合にのみ拡張されます(したがって、構文チェッカーとしても機能します)。

MCEとは異なり、エイリアスもbash完全に解決します。たとえば、次のような場合があります。

$ alias ll='ls -l'; alias ls='ls --color'
$ ll

次に展開されます。

$ ls --color -l

また、構文を正規化します。たとえば、次のようになります。

$ for i (*) cmd $i; foo

に変更:

$ for i in *
        do
                cmd $i
        done
        foo

答え2

コマンドラインを関数定義に入れてから関数を印刷すると、エイリアスが拡張されます。標準化された空白も取得できます。

% alias foo='bar -1'
% alias bar='qux -2'
% f () foo -3
% which f
f () {
        qux -2 -1 -3
}

これらすべてをインタラクティブコマンドに入れるには、zleウィジェットを作成できます。関数項目にコードを入力して関数を直接定義できます。functionsもう一度読むと正規化された効果が得られます。

normalize-command-line () {
  functions[__normalize_command_line_tmp]=$BUFFER
  BUFFER=${${functions[__normalize_command_line_tmp]#$'\t'}//$'\n\t'/$'\n'}
  ((CURSOR == 0 || CURSOR = #BUFFER)
  unset 'functions[__normalize_command_line_tmp]'
}
zle -N normalize-command-line
bindkey … normalize-command-line

同じ正規化効果を得る。preexecフック。エイリアスは、関数が自動的にロードされたときにも拡張されます(autoload -Uしばしばエイリアス拡張を避けるために使用されます)。

これ_expand_aliasカーソルの下にある単語がエイリアスの場合、補完機能はその単語を展開します。それを使うaliases大量に。再帰的ではありません。より一般的な目的を実装するエイリアス拡張子を使用できますが、aliasesエイリアス拡張位置を決定することはシェル構文と密接に関連しているため、これはやや困難です。

答え3

ネストされた素晴らしいエイリアスが多く、zshが実際にそのエイリアスで何をしているのか、そしてオプションがコマンドに渡される順序がわからない場合は、いつでも-xオプションを使用してzshを起動できます。実行すると、コマンドと引数が印刷されます。

ただし、このオプションはデバッグ目的で作成されたため、zsh -x呼び出し後に役に立たないコンテンツ(デフォルトでは.zshrcのすべての関数/ウィジェット/プラグイン)がたくさん印刷され、コマンド実行中にも非常に迷惑になる可能性があります。 、特に定義preexecしてprecmd接続した場合にはさらにそうです。

私もそれが印刷されることに言及する必要がありますただ最後に実行されたコマンドと個々のコマンドは別々に印刷されるので、

alias a='echo a'
alias b='echo b'
alias c='echo c'
alias d='echo d'
a && b || c; d

あなたは見るでしょう

+zsh:1> echo a
a
+zsh:1> echo b
b
+zsh:1> echo d
d

関連情報