6

如何在 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并到达那里,但我发现搜索和移动到匹配项比计算要跳转的单词数更容易。

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

4

5 回答 5

3

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

例如

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

你想移动到第一个e

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

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

查看vim帮助以获取详细信息:

:h f
:h F

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

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

于 2013-04-05T17:08:17.133 回答
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 '/' 或 '?' 搜索整个历史。这 '?' 自上而下搜索,而“/”从光标当前位于历史记录中的任何位置向“顶部”搜索。另一种思考方式是将您的历史记录想象成一个大文件,您所在的当前行位于该文件的底部。如果这有助于你理解它,你可能会感觉到'?比'/'更相关。

于 2016-04-29T21:17:46.467 回答
1

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

于 2016-04-29T05:12:30.667 回答
0

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

于 2015-12-25T14:27:41.083 回答
0

我遇到过同样的问题。我没有设法解决它,但找到了一个合适的解决方法:为编辑命令行功能添加了一个绑定,这让我$EDITOR使用缓冲区中的当前行。在那里很容易导航到给定的模式。

有关如何绑定函数的信息,请参见/usr/share/zsh/functions/Zle/edit-command-line 。

于 2019-09-30T21:07:52.073 回答