Zsh
可以讓 zsh 向上箭頭歷史搜尋檢測別名嗎?
我
git
別名為g
. 有時我使用g
,有時我不使用。我可能會跑
git add file1
,然後再跑g add file2
。當我想再次添加 file1 時,我可能會輸入
g add
zsh 提示符,然後按幾次向上箭頭。我不會去git add file1
。所以我必須嘗試git add
然後向上箭頭。同樣,
git add
永遠找不到g add file2
.這感覺應該是可以解決的。有沒有辦法彌補箭頭歷史搜尋檢測別名?
這在反向搜尋階段實現起來會很複雜
alias g=grep g foo /etc/passwd alias g=git g status
由於反向搜尋需要知道別名已更改,因此如果別名通過配置文件編輯和 shell 重新啟動不可見(對歷史搜尋功能)更改,則與上述範例不同的資訊將不可用。
相反,將規範資訊記錄到 shell 歷史記錄中可能更合適(但仍然有些複雜),因此上述的 shell 歷史記錄將改為擴展為 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'}) ...
在某些時候可能需要您重寫所有歷史保存和歷史搜尋程式碼以滿足您的特定需求。