私はgit
それをエイリアスとして指定しましたg
。時には使用g
し、時には使用しません。
git add file1
後でまた走ってまた走ることもできますねg add file2
。
file1を再度追加したい場合は、g add
zshプロンプトに入力して上矢印を数回押すこともできます。私は行かないgit add file1
。だから私は努力し、矢印を上げる必要がありますgit add
。
繰り返しますが、見つかりませgit add
んでしたg add file2
。
この感じは解決可能でなければなりません。 Arrow History検索でエイリアスを検出する方法はありますか?
答え1
これは、リバース検索フェーズで実装するのが複雑になる可能性があります。
alias g=grep
g foo /etc/passwd
alias g=git
g status
逆検索を行うにはエイリアスが変更されたことを知る必要があるため、プロファイル編集やシェルの再起動(履歴検索機能のため)などを通じて目に見えないようにエイリアスが変更された場合には、上記の例と他の情報は提供されません。
代わりに、標準情報をシェル履歴に書き込むことがより適切かもしれませんが(まだ少し複雑になる可能性があるため)、上記のシェル履歴はコマンドの実行時にサポートされるエイリアスに応じてgitまたはgrepに拡張されます。欠点:履歴を直接管理し、エイリアスではなくコマンド名で検索する必要があります。
function zshaddhistory() {
local -a cmd
local i
# split using shell parse, see zshexpn(1)
cmd=(${(z)1})
if (( $#cmd )); then
# alias expand or failing that the command
# NOTE zsh is 1-indexed, not 0-indexed
cmd[1]=${aliases[$cmd[1]]:-$cmd[1]}
for (( i = 2 ; i < $#cmd ; i++ )); do
# look for ; and try to alias expand word following
if [[ $cmd[$((i-1))] == \; ]]; then
cmd[$i]=${aliases[$cmd[$i]]:-$cmd[$i]}
fi
done
# (z) adds a trailing ; remove that
cmd[$#cmd]=()
# write to usual history location
print -sr -- $cmd
fi
# disable the usual history handling
return 1
}
alias g='echo wait for godot'
ロード後:
% exec zsh -l
% ls
...
% uptime
...
% g ; g
wait for godot
wait for godot
% history
1 ls
2 uptime
3 echo wait for godot ; echo wait for godot
4 history
これは、行の先頭または行の後に表示される可能性があるグローバルエイリアスをサポートしません;
。コードに異なる監督がある可能性があります。
より多くのコードを使用すると、元のコードをコメントとして含めることができます(おそらくオプションINTERACTIVE_COMMENTS
セットを含む)。ただし、これを行うには、コメントを削除するために履歴検索の面でより多くのコードを追加する必要があるかもしれません。
...
# (z) adds a trailing ; remove that
cmd[$#cmd]=()
cmd+=(\# ${1%%$'\n'})
...
ある時点で、特定の要件を満たすために、すべての履歴保存および履歴検索コードを再構築する必要がある場合があります。