Zsh

可以讓 zsh 向上箭頭歷史搜尋檢測別名嗎?

  • June 20, 2018

git別名為g. 有時我使用g,有時我不使用。

我可能會跑git add file1,然後再跑g add file2

當我想再次添加 file1 時,我可能會輸入g addzsh 提示符,然後按幾次向上箭頭。我不會去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'})
   ...

在某些時候可能需要您重寫所有歷史保存和歷史搜尋程式碼以滿足您的特定需求。

引用自:https://unix.stackexchange.com/questions/450636