使用模式历史记录搜索,但在较旧的zsh版本中优雅地降级为非模式历史记录搜索

时间:2013-09-25 23:41:15

标签: zsh

我将一些我的dotfiles保留在版本控制中,因此我可以在我们工作的所有众多服务器上对环境进行改进。当然,这包括我的.zshrc。

我刚刚发现将ctrl-R绑定到histroy-incremental-pattern-search-backward以通过历史记录进行模式搜索,并且它非常有用,所以我把它放在我的.zshrc中并且在任何地方都兴高采烈地进行了部署。 / p>

问题是我们的一些服务器安装了zsh版本4.2.6,它没有此功能;在这些服务器上,ctrl-R现在只是打印No such widget `history-incremental-pattern-search-backward'的一种特别有效的方式。

所以我需要在.zshrc中提供一些东西,它可以在可用的情况下搜索模式历史记录,并将历史记录单独留在不存在的地方;要么只是有条件地重新绑定密钥,要么将其绑定到任何一种方式。

我可以使用is-at-least来测试zsh版本,如果我能确定支持history-incremental-pattern-search-backward的最早版本,但是如果可能的话我宁愿更直接地测试(类似于背后的逻辑)检测而不是Javascript中的浏览器/版本检测。)

我已经发现zle -l给了我一个已定义的小部件列表,但显然只是用户定义的小部件。我还没有找到任何其他方法来测试是否定义了小部件。

任何建议(或明确的知识,唯一的方法是使用版本号测试)将不胜感激。

1 个答案:

答案 0 :(得分:2)

你非常接近正确的答案,但你忘记了RTFM ;-)描述zle的手册部分说:

-l [ -L | -a ]
      List all existing user-defined widgets.  If the -L option is
      used, list in the form of zle commands to create the widgets.

      When combined with the -a option, all widget names are listed,
      including the builtin ones. In this case the -L option is
      ignored.

果然:

$ zle -al | grep history-incremental-pattern-search-backward 
.history-incremental-pattern-search-backward
history-incremental-pattern-search-backward

所以你要找的测试是:

zle -al | grep -q history-incremental-pattern-search-backward