shopt -s histreedit
Zsh 中的Bash 等价物是什么?
仅供参考Bash 参考手册:
histreedit
如果设置并且正在使用 Readline,则用户将有机会重新编辑失败的历史记录替换。
答案1
AFAIK,zsh 没有内置的等效项。您可以通过执行类似 (in ) 的操作来进行近似~/.zshrc
:
accept-line() {
pre_HISTCMD=$HISTCMD pre_BUFFER=$BUFFER pre_CURSOR=$CURSOR
zle .$WIDGET
}
zle-line-init() {
if (( $? == 1 && HISTCMD == pre_HISTCMD )) && [[ -z $BUFFER ]]; then
BUFFER=$pre_BUFFER CURSOR=$pre_CURSOR
fi
}
zle -N zle-line-init
zle -N accept-line
处理失败的历史扩展设置$?
为1
且不添加历史条目的事实(除非扩展被添加到历史行中;您可能会发现该技巧在许多极端情况下不起作用) 。
现在,IMO,虽然历史扩展(由 csh 在 70 年代末引入)在 80 年代占有一席之地,当时终端速度很慢,行编辑非常基本,但我更喜欢使用历史提取小部件,例如基于历史的完成,以及类似的东西Ctrl+ r、Alt+p和其他从历史记录中提取数据的小部件。
自 90 年代末以来,我一直在交互式 zsh shell 中系统地禁用历史扩展。我的主要问题之一是它不是所见即所得。只有按下 后Enter,扩展才完成,并且命令同时运行,并且扩展前的代码不会保存到历史记录中。
- 可能会扩展失败,需要重做一次
- 它可能会扩展到错误的事件,而不是您想要的事件,或者如果使用单词指示符,则可能会出现错误的单词或单词类型,或者修饰符无法按预期工作,并且您最终会运行错误的命令。
histreedit
对 1 有帮助,但对 2 没有帮助,histverify
(从 1991 年的 zsh 2.1 开始,自 2.0 (1996) 起也受 bash 支持)对 2 有帮助,但对 1 没有帮助。
IMO,更好的方法是使用小部件,默认情况下在模式下expand-history
绑定到Alt+!和Alt+ ,以所见即所得的方式显式执行扩展,以查看您得到的内容(失败时会发出蜂鸣声),以及您可以使用+撤消哪些内容,或小部件,默认情况下不绑定,但旨在绑定到,它会插入一个空格并执行历史扩展。Spaceemacs
Ctrl_magic-space
Space