Zsh 中的 histreedit 在哪里?

Zsh 中的 histreedit 在哪里?

shopt -s histreeditZsh 中的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+ rAlt+p和其他从历史记录中提取数据的小部件。

自 90 年代末以来,我一直在交互式 zsh shell 中系统地禁用历史扩展。我的主要问题之一是它不是所见即所得。只有按下 后Enter,扩展才完成,并且命令同时运行,并且扩展前的代码不会保存到历史记录中。

  1. 可能会扩展失败,需要重做一次
  2. 它可能会扩展到错误的事件,而不是您想要的事件,或者如果使用单词指示符,则可能会出现错误的单词或单词类型,或者修饰符无法按预期工作,并且您最终会运行错误的命令。

histreedit对 1 有帮助,但对 2 没有帮助,histverify(从 1991 年的 zsh 2.1 开始,自 2.0 (1996) 起也受 bash 支持)对 2 有帮助,但对 1 没有帮助。

IMO,更好的方法是使用小部件,默认情况下在模式下expand-history绑定到Alt+!Alt+ ,以所见即所得的方式显式执行扩展,以查看您得到的内容(失败时会发出蜂鸣声),以及您可以使用+撤消哪些内容,或小部件,默认情况下不绑定,但旨在绑定到,它会插入一个空格并执行历史扩展。SpaceemacsCtrl_magic-spaceSpace

相关内容