在ZSH(vi模式)中搜索当前行

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就能找到那里,但是我发现搜索并移动到匹配项比计算要跳过的单词数量更容易。如果这还不清楚,请告诉我需要澄清什么。
5个回答

4

我希望我理解得没错。您想要在zsh命令行中,在输入命令时加快光标移动的速度。

例如:

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

您想移动到第一个e

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

在这个例子中,您可以使用5Fe向后移动到第五个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 normal mode)和'?'时,你将得到一个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 '/' 或 '?' 可搜索整个历史记录。'?' 自上而下搜索,'/' 则从光标当前位置开始沿着您的历史记录向“顶部”进行搜索。另一种思考方式是将您的历史记录想象成一个大文件,而当前行位于该文件的底部。如果这有助于您理解,您可能会觉得'?' 比 '/' 更相关。

2

谢谢。这就是我一直在寻找的答案。 - Huy Ngo

0
在你的 shell 的命令模式下输入 v,你将进入真正的 ViM 编辑器。保存并退出后,它会自动执行。

这不是默认行为,但如果满足以下条件,则可用:
  1. 您使用 oh-my-zsh
  2. 您使用 vi-mode
  3. 您已将 $EDITOR 设置为 vim
- csabahenk

0

我曾经遇到过同样的问题。虽然没有直接解决它,但我找到了一个合适的解决方法:为edit-command-line函数添加绑定,这将使我跳转到$EDITOR并在缓冲区中显示当前行。在那里,很容易导航到给定的模式。

请参阅/usr/share/zsh/functions/Zle/edit-command-line以了解如何绑定该函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接