无法在Zsh中将后退TAB设置为Shift-TAB

39

问题: 如何在Zsh中使用TAB键向后导航,类似于Firefox中的操作?

Shift-TAB

Shift-TAB应该做什么的示例

我在终端中运行以下代码:

ls <TAB>

我明白了

A B C D E F G H I J K H L M N...

当我按下TAB键时,我在Zsh中看到以下内容:alt text http://dl.getdropbox.com/u/175564/smallEx.png

我通过TAB键导航到文件夹J。然后,我注意到我按了一次太多的tab键。

如何为Zsh创建类似Firefox Shift-TAB的向后TAB


老问题...今天可以实现更便携的绑定键 - vinipsmaker
3个回答

90

试试这个:

bindkey '^[[Z' reverse-menu-complete
如果这不起作用,尝试像这样运行执行zsh(其中包括setopt MENU_COMPLETE):
zsh -Y

然后再尝试一次!


你在哪里找到键盘命令'^[[Z',这对我来说不太直观。 - martisj
@martisj: "^[[Z"(读作:转义、左方括号、大写字母Z)是大多数终端在按下Shift-Tab时写入shell标准输入的序列。只需将上述内容复制并粘贴到zsh或某个启动rc文件中,Shift-Tab就应该可以正常工作。如果不行,请尝试使用不同的终端,也许是您的终端存在问题。 - ypsu
谢谢@ypsu,你有这些序列的参考资料吗? - martisj
1
@martisj:这是一个每个终端的设置。查看我的终端的“infocmp”命令输出,它看起来像是“cbt”或“kcbt”功能。根据“man terminfo”的说法,这意味着“back_tab”。您可以通过这两个来源找到其余序列及其解释。如果您只是想知道给定键生成什么,只需运行“stty raw; cat”,然后按下您感兴趣的键即可。 - ypsu

2

这很尴尬。一个好的(而不是干净的,与您的建议相反)方法是使.zshrc支持多个查询(terminfo、zkbd、手动)后端,并使您的zsh在SSH、xterm、Linux控制台、Linux原始控制台和其他系统下工作...但这个建议需要修补操作系统的许多组件,这将导致其他系统下zsh配置无法正常运行...所以很尴尬。 - vinipsmaker
这仅仅是一个历史原因,而且在通常不部署遗留系统的zsh中,这个旧默认值应该被更改。正如实际解决方案所证明的那样,人们的终端确实可以使用shift+tab。 - Krisztián Szegi

1

我不确定“backward-tab”具体指什么,但是zsh确实有一个撤销(zle widget)的功能,可以撤消上次按下的任何键,包括Tab。只需将其绑定到某个键即可使用:

$> bindkey "<Ctrl-V><Shift-Tab>" undo 

这意味着您按下这些键组合,而不是输入字母。

我想这就是您要求的,但如果没有更多的例子,我不能确定。


我在我的问题中添加了一张图片,它展示了我想要实现的内容。例如,我可以使用backTAB命令来执行cd命令。 - Léo Léopold Hertz 준영
@sykora: 不是这样的。它忽略了TAB自动补全,并撤销了命令cd中的"d"。 - Léo Léopold Hertz 준영
@sykora:我得到了以下代码:bindkey ^[[Z undo。我把它放到终端上,但是它给出了 zsh: bad pattern: ^[[Z 的错误提示。 - Léo Léopold Hertz 준영
啊,忘记加引号了。现在再试一次。 - sykora
@sykora:当您尝试创建这些键绑定时,您是否总是使用Ctrl-V?它看起来像是xev,可以显示您输入的内容,但它是Shell中的内置功能。 - Léo Léopold Hertz 준영
使用bindkey命令。Ctrl-V绑定到引用插入。这意味着在Ctrl-V之后键入的任何内容都将按原样插入,不会产生任何影响。这样,您可以字面上地插入控制序列。 - sykora

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