【问题标题】:Search current line in ZSH (vi mode)在 ZSH 中搜索当前行(vi 模式)
【发布时间】:2013-04-05 15:17:09
【问题描述】:

如何在 zsh 的当前行内搜索/导航?例如,如果光标在行尾..

// [] indicates cursor position
user@hostname: vim /etx/apache2/sites-enabled/defaul[t]

在 vi 普通模式下,我想使用向后搜索 (?),输入 etx 并让光标像这样移动:

// [] indicates cursor position
user@hostname: vim /[e]tx/apache2/sites-enabled/default

但是,/? 映射到历史搜索,而不是内联搜索。 我知道我可以输入9b 并到达那里,但我发现搜索和移动到匹配项比计算要跳转的单词数更容易。

不确定这是否清楚,如果我需要澄清一些事情,请告诉我。

【问题讨论】:

    标签: vim zsh


    【解决方案1】:

    我希望我对你的理解是正确的。您想在 zsh 命令行中,在键入命令时更快地移动光标。

    例如

    user@hostname: vim /etx/apache2/sites-enabled/defaul[t]
    

    你想移动到第一个e

    我不使用 vi 绑定,但 fF 是你的朋友。

    在该示例中,您可以 5Fe 向后移动到第 5 个 e 。如果你不想数,你可以Fe,然后按;,直到它移动到正确的位置。

    查看vim帮助了解详情:

    :h f
    :h F
    

    对于这个例子,更快的方法是0fe。将光标移至开头,然后移至e

    如果我误解了你的问题,请发表评论,我会删除答案。

    【讨论】:

      【解决方案2】:

      也许 ~/.inputrc 文件将这些键映射到奇怪的东西?或者您没有完全了解搜索历史的工作原理。

      让我们重新开始: 使用 bindkey 重新映射这些键:

      bindkey -M vicmd "?" history-incremental-search-backward
      bindkey -M vicmd "/" history-incremental-search-forward
      

      现在,当您按“esc”(用于 vi 普通模式)和“?”时你会得到一个 bck-i-search 命令:

      %user@hostname: vim /etx/apache2/sites-enabled/defaul[t]
      bck-i-search:
      

      此时,您输入要搜索的内容,例如'etx'。并且,光标移动到该行中的那个位置。注意:如果在当前行中没有找到该模式,它会继续搜索您的历史记录。此行为被视为一项功能!

      您可能会注意到您不能重复搜索(例如在 vim 中按“N”)。在这种情况下,添加一些 isearch 绑定:

      bindkey -M isearch '^N' history-incremental-search-backward
      bindkey -M isearch '^R' history-incremental-search-forward
      

      现在,按 control-N 重复搜索,而按 control-S 反转重复搜索的方向(注意:此键绑定的默认顺序是从向前到向后颠倒,因为人们更经常从历史回溯)。

      简而言之:将当前行视为历史记录的“顶部”。使用 vicmd '/' 或 '?'搜索整个历史。这 '?'自上而下搜索,而“/”从光标当前位于历史记录中的任何位置向“顶部”搜索。另一种思考方式是将您的历史记录想象成一个大文件,而您所在的当前行位于该文件的底部。如果这有助于你理解它,你可能会感觉到'?比'/'更贴切。

      【讨论】:

        【解决方案3】:

        此脚本将此功能添加到 zsh: https://github.com/soheilpro/zsh-vi-search

        【讨论】:

          【解决方案4】:

          当您在 shell 的命令模式下输入 v 时,您将被带到真正的 ViM 编辑器本身。保存退出后会自动执行。

          【讨论】:

          • 这不是默认行为,但可用,例如如果以下条件适用: 1. 你使用 oh-my-zsh 2. 你使用 vi-mode 3. 你已将 $EDITOR 设置为 vim
          【解决方案5】:

          我遇到了同样的问题。我没有设法解决它,但找到了一个合适的解决方法:为 edit-command-line 函数添加了一个绑定,这会将我带到 $EDITOR 与缓冲区中的当前行。在那里很容易导航到给定的模式。

          查看/usr/share/zsh/functions/Zle/edit-command-line了解如何绑定函数。

          【讨论】:

            猜你喜欢
            • 2011-04-07
            • 1970-01-01
            • 2021-04-12
            • 2014-03-21
            • 2016-11-03
            • 2011-03-08
            • 2020-01-30
            • 1970-01-01
            • 2015-12-17
            相关资源
            最近更新 更多