
問題
我正在使用 oh-my-zsh 和 Antigen 來管理我的 Zsh。
有時我會不小心在 Zsh 中輸入錯誤/失敗的命令,這很煩人zsh-自動建議插件拋出這些命令。
例如,假設我輸入
gut status
而不是git status
。
現在,當我嘗試再次輸入正確的命令時,一旦輸入g
,自動建議插件就會拋出,gut status
因為這是最近歷史上最接近的匹配。但這是一個失敗的命令!
我什麼想要做的就是防止這些失敗的命令「污染」我的歷史記錄所以自動建議插件不會建議它們。
我做了什麼
我已經搜索過這一點,與從歷史記錄中刪除條目最接近的匹配是設置 HIST_IGNORE_SPACE,或者忽略特定命令的方法,或者在輸入命令後手動刪除命令。看這和這。但正如 @Adaephon 52 指出的,這種情況發生了後事情已經完成了。
我正在考慮做什麼
我現在想到的是編寫一個函數,每次在 Zsh 中輸入失敗的命令時都會觸發該函數,以從歷史記錄中刪除最新條目。然而,我對 Zsh 不夠熟悉,不知道這種觸發器是否存在或如何做。
關於已接受的解決方案的註釋
對於那些對此問題感興趣的人來說,可接受的解決方案是有效的,因為失敗的命令不會儲存在歷史文件中。fc -l
或history
證實這一點。
然而,zsh-autosuggestions 插件似乎正在做自己的事情當地的各種快取(或使用其他機制產生建議),因此它仍然會建議失敗的命令,但是僅當會議未結束時。當使用者啟動 shell 的新實例時,當插件可能必須載入快取的歷史記錄時,它不再建議失敗的命令(當然,除非您再次輸入它們)。
所提出的解決方案在技術上是正確的,因為我(錯誤地)以這樣的方式提出了我的問題,即它只需要一個阻止Zsh 儲存失敗命令的答案,並且接受的解決方案可以做到這一點(儘管以有限的方式;請參閱解決方案中的連結細節)。
任何熟悉 shell 腳本(我不熟悉)並且有足夠動力的人都可以檢查zsh-自動建議腳本。
答案1
巴特謝弗提出了以下方法對於同一個問題zsh 用戶郵件清單:
zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }
該函數在命令列寫入歷史記錄之前執行。如果它確實傳回 1,則當前命令列既不會附加到歷史文件,也不會附加到本地歷史堆疊。但是,檢查該命令是否會觸發找不到指令錯誤僅涵蓋簡單的情況。例如,這一行將出現在歷史記錄中:
echo foo; echooo bar
但它對於你的例子來說效果很好
gut status
請注意,錯誤的命令將會出現UP-ARROW
(以便您可以更正它!),但不在歷史堆疊中;檢查與fc -l
.
此基本功能的一個可能的擴展是考慮在命令列中設定環境變量,例如DEBUG=1 ./some_prog
.這裡的函數檢查命令列上的單字是否包含等號,如果包含則檢查下一個單字是否為有效命令:
zshaddhistory() {
local j=1
while ([[ ${${(z)1}[$j]} == *=* ]]) {
((j++))
}
whence ${${(z)1}[$j]} >| /dev/null || return 1
}
答案2
內建fc
指令支援編輯您的歷史記錄。如果您輸入錯誤,例如上一個命令,您可以輸入以下內容:
$ fc -e nano -1
您可以替換nano
為您喜歡的編輯器的命令。您也可以EDITOR
在 zsh 配置中設定變數(參數)。 (請參閱參考 SO 頁面)
您需要儲存該檔案(由 fc 在系統暫存資料夾中建立的檔案)。之後,您將最終編輯行。Enter
將運行它,或者您可以按Ctrl+C
完成編輯。
有關更多詳細信息,請參閱 zsh 文件:Zsh:編輯歷史記錄
如果您想編輯整個歷史記錄
$ fc -W; nano "$HISTFILE"; fc -R
....如果你願意的話可以再更換nano
它只是寫出歷史記錄(包括快取),然後使用編輯器開啟檔案。
請注意桀騁了解三種類型的歷史:
- 內部的:登入後輸入的命令
- 當地的:活動 shell 中可用的一個 - [HISTFILE + Internal]
- “全球的”:這取決於但假設它是 HISTFILE 中設定的文件
請記住,如果您的歷史文件被共享(SHARE_HISTORY
)並且您有多個 zsh shell 由相關使用者打開,那麼您最好fc -W
先在這些 shell 中執行該命令。完成編輯後,運行fc -R
.否則,在這些 shell 中輸入的命令將不會被存儲,也不會識別您對HISTFILE
.
答案3
不知道 omz 如何運行它,但在 bash 和常規 zsh 中,添加空格前綴可以使其遠離 .history,並且從此以後也不再自動完成/建議
IE
<space>ll -ahZ /home/%USER