如何使 oh-my-zsh 歷史行為類似於 Bash?
我最近切換到 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-backward
,history-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 預設值,在編輯第一個多行命令行後,您可能會決定預設值是您喜歡的。☺