如何在 vi 模式下检查 fish 中的命令历史记录?

如何在 vi 模式下检查 fish 中的命令历史记录?

我是。我使用 vi 命令行绑定。我从各种地方了解到(例如这里以及问题评论这里,例如),历史搜索和调用可能缺少某些绑定和功能,而像我这样的人可能已经习惯了在 bash 或其他 shell 中使用这些绑定和功能。

既然如此,我想了解如何在 fish 中以 vi 模式进行最佳搜索。从该项目主要贡献者的以下帖子来看: https://github.com/fish-shell/fish-shell/issues/2271#issuecomment-127585955

这些绑定应该做一些事情:

bind u history-search-backward
bind \cr history-search-forward
bind '[' history-token-search-backward
bind ']' history-token-search-forward
bind -M insert \cp history-search-backward
bind -M insert \cn history-search-forward

有人能向我解释一下这些在 vi 模式下是如何工作的吗?u例如,如何使用 向后搜索一个术语?如何[向后搜索一个标记?

我很难理解这些文档。例如: https://fishshell.com/docs/current/interactive.html#command-mode

[ and ] search the command history for the previous/next token 
containing the token under the cursor before the search was 
started. See the history section for more information on history
searching.

好的。因此,在插入模式下,我输入要搜索的子字符串。然后在命令模式下,我尝试[],但它们似乎什么也没做。有人能帮我理解我遗漏了什么吗?

答案1

我不确定如何在 vi 命令模式下使用那些记录的历史命令。

然而,在回答我的问题时,我偶然发现了这个非常有用的评论,它使通过 fish 搜索历史记录非常方便陣陣https://github.com/fish-shell/fish-shell/issues/2271#issuecomment-352210807

将配置粘贴到这里:

fish_vi_key_bindings

# Enable command history search via fzf.                                    
function reverse_history_search                                    
  history | fzf --no-sort | read -l command                                    
  if test $command                                    
    commandline -rb $command                                    
  end                                    
end                                    
                                    
function fish_user_key_bindings                                    
  bind -M default / reverse_history_search                                    
end                                    

一些说明:

  • 这利用了陣陣,因此您需要在您的系统上安装它(例如,brew install fzf对于 MacOS 通过 brew 安装)。
  • 使用上述配置,按 Esc 进入命令模式,然后/通过 fzf 工具搜索历史记录。
  • 只需从历史记录中开始输入您感兴趣的子字符串即可。
  • ctrl+nctrl+p在选项中上下导航。
  • 一旦您获得了想要的选项,只需按回车键,您就会返回到带有该选择的提示。

如果您正在使用 fish 并且想要一种强大的方法来搜索历史记录,那么我强烈建议您尝试一下。我看到网上很多人的评论说他们非常喜欢 fish,但是他们觉得不得不放弃它,因为它本身的搜索历史记录和调用以前的命令的能力很弱。我自己也差点放弃了它。我认为这个解决方案可能会让很多人坚持使用 fish,从其他方面来说,它是一种出色的 shell。

答案2

这些含义如下:

bind u history-search-backward

这意味着按“u”会向后搜索历史记录,以当前命令行作为搜索字符串。由于没有给出-M/--mode参数,因此此绑定涉及默认模式,即 vi 的正常模式。

注意:这种特定的绑定已经过时,自一年前发布的 fish 3.3.0 以来,正常模式下的“u”必然会被撤消。

bind \cr history-search-forward

按 ctrl+r 将使用当前搜索字符串向前搜索历史记录。再次进入默认模式。

bind '[' history-token-search-backward
bind ']' history-token-search-forward

按“["/"]”可实现相同效果,但当前令牌作为搜索字符串。因此,如果您将echo foo光标放在“foo”上,它将在历史记录中查找与“foo”匹配的任何标记并将其插入,结果为例如echo "foobar"如果您之前已经运行过set var "foobar"

bind -M insert \cp history-search-backward
bind -M insert \cn history-search-forward

按 ctrl+p/ctrl+n 可向前/向后搜索完整命令行插入模式。

答案3

这是我第一次使用 fish,因为我习惯使用 vi,所以我立即将其设置为 vi,结果遇到了这个问题。所以我把这个留在这里,供任何遇到此问题的人参考:

基本搜索不需要进行特殊配置,只是文档中没有明确说明如何实现:

要使用鱼搜索,请进入“命令模式”(又名“正常模式”,在光标中显示“[N]”),然后使用“/”开始搜索 - 只需开始输入 - 您可以使用箭头键选择选项。

在“插入模式”(“[I]”)下,您也可以通过简单地输入字符串来进行框外搜索,然后使用向上/向下箭头浏览与该字符串匹配的历史记录。

这两个东西开箱即用(fish 3.7.1) - 除了启动 vi 模式外,无需更改任何设置。(您可以通过添加到fish_vi_key_bindings来保留 vi 模式.config/fish/config.fish。)

相关内容