Zsh

如何使 oh-my-zsh 歷史行為類似於 Bash?

  • November 20, 2016

我最近切換到 oh-my-zsh,但我無法習慣向上箭頭鍵的工作方式。例如,當我輸入 ssh 並按下時,它只顯示以 ssh 開頭的命令,而我更希望它顯示以前的命令。我怎樣才能讓它表現得像 Bash 那樣,這是我已經習慣的?

請注意,將答案中的行添加到我的 zshrc 末尾沒有幫助,升級後也沒有發生,只是在從 bash 切換到 oh-my-zsh 之後。

具有諷刺意味的是,人們提出的問題的答案是重複的……

bindkey '\e[A' history-beginning-search-backward
bindkey '\e[B' history-beginning-search-forward

……完全是錯誤的答案。它確保您的終端的箭頭編輯鍵控制序列由 ZLE 映射到擴展小元件history-beginning-search-backwardhistory-beginning-search-forward並由 Oh My ZSH 的history-substring-search外掛提供。

這正是你想要的。

您正在嘗試關閉此功能,因為您更喜歡另一種行為;不嘗試修復它,因為它壞了。

你想要的是那些映射到小元件的鍵,就像在 vanilla Z Shell 中一樣,Oh My ZSH 是一些(但不是所有人)喜歡的 Z Shell 的大量擴展和定制。Vanilla Z Shell 的小元件大致具有您喜歡的舊 Bourne Again shell 行為。(與 Bourne Again shell 不同的是,如果您有一個多行編輯緩衝區,它們將在之前的緩衝區內上下移動,在緩衝區的頂部和底部邊緣,在歷史記錄中上下移動。)

這些小元件將是:

bindkey "$terminfo[kcuu1]" 上線或歷史
bindkey "$terminfo[kcud1]" 下線或歷史

請注意如何不將一種特定的終端類型硬連接到腳本中。或者,可以使用"$termcap[ku]"and "$termcap[kd]"。Z Shell 假設您已經載入了適當的模組,它會為兩者維護一個映射。不過,通常世界更喜歡terminfo,如果它現在有的話。為了嚴格防彈,在您與異構系統一起使用或提供給其他人的東西中,您需要一個test -n在那裡 - 正如您會發現 Oh My ZSH 擴展實際上正在做的那樣。

test -n "$terminfo[kcuu1]" && bindkey "$terminfo[kcuu1]" up-line-or-history
test -n "$terminfo[kcud1]" && bindkey "$terminfo[kcud1]" down-line-or-history

(在極端情況下,為了應對一些不太可能的可能性,你需要一些"${terminfo[x]-${termcap[y]}}"變數擴展。Oh My ZSH 擴展不會打擾後者,實際上你也可以在很大程度上擺脫它。實際上,幾乎每個人都有載入了 termcap 和 terminfo 模組,你只需要擔心目前終端類型的記錄是否真的定義了相關的控制序列,這就是它的test -n用途。)

Bourne Again shell 行為的更精確近似是

bindkey "$terminfo[kcuu1]" up-history
bindkey "$terminfo[kcud1]" 下降歷史

這不是 vanilla Z Shell 預設值,在編輯第一個多行命令行後,您可能會決定預設值是您喜歡的。☺

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