我是鱼。我使用 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+n
并ctrl+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
。)