让“完整”和“菜单完成”一起工作

时间:2012-08-20 20:22:29

标签: bash bash-completion

我发现Bash shell支持一种与“传统”自动完成不同的自动完成,其中所有可能性都列在下一行。

使用“传统”自动填充功能,如果我输入ch然后按下Tab键,我会得到类似的内容:

$ ch
chacl  chgrp  chmod  chown  chvt

但是,如果我将以下行添加到/etc/inputrc(将Tab键重新映射到内置menu-complete函数):

Tab: menu-complete

然后shell的行为发生变化:要完成的单词被“内联”替换为可能完成列表中的单个匹配,如果我再次按Tab键,则单词将被替换为下一个匹配。

我发现这很有用,但我仍然希望保留传统的自动完成功能并将其绑定到组合键Ctrl + Tab。所以我根据/etc/inputrc库文档建议的内容,将以下行添加到我的readline文件中:

Ctrl-Tab: complete

但是,添加此行似乎只会使TabCtrl-Tab调用传统的complete函数。

有谁知道我做错了什么?

提前致谢!

5 个答案:

答案 0 :(得分:31)

首先,我不是这个领域的大专家,但我想我可以回答你的问题。首先,当您使用Bash时,Bash是一个shell,它解释从终端/控制台接收的键盘命令。当您通知Bash如何对inputrc文件中的特定键组合作出反应时,终端会在inputrc文件甚至输入等式之前精确确定哪个字符被“发送”到Shell。

不幸的是,在我的系统上(被授予,它是OSX - 但我认为这与Linux相比并不奇怪), Tab Ctrl-Tab 将相同的键盘输入发送到shell。事实上,Tab和 Ctrl-Tab 都会向shell发送 Ctrl-I 命令,实际上,如果我在使用时输入 Ctrl-I 终端,它就像我点击Tab一样完成。

该软件(默认情况下安装在大多数Linux系统上),showkey将告诉您按下特定键盘输入时shell接收的键。

无论如何,我的建议是使用 Shift-Tab ,它确实会将自己的密钥代码发送给shell。我的计算机上的 Shift-Tab 显示(使用showkey)为'< ESC> [Z',我认为这是非常标准的。因此,带有以下绑定的inputrc文件应该允许您使用 shift-tab 而不是 ctrl-tab 来实现您的目标:

Tab: menu-complete
"\e[Z": complete

第二个绑定中的\ e表示转义字符,[Z只是使用showkey显示的字符。你可以通过简单地使用cat,在终端内运行cat并按 Shift-Tab 来显示“^ [[Z”,其中^ [代表转义字符和其他人物也和以前一样。

我知道这并不能准确地解决您的问题,但我认为您无法使用 Ctrl-Tab 作为组合键,而无需重新映射 Ctrl-选项卡到您终端中的另一个键绑定(如果您使用的是GUI终端,这可能会更容易),这可能会尽可能接近您的努力!

答案 1 :(得分:4)

我将 Shift Tab 绑定到menu-complete-backward,因此如果我跳过正确的完成,它会返回一步,并且我已经映射< kbd> Ctrl q complete,所以如果有几个可能的完成,我点击 Ctrl q 列出它们无需绕过它们。

# Make Tab cycle between possible completions
# Cycle forward: Tab
# Cycle backward: Shift-Tab

TAB: menu-complete
"\e[Z": menu-complete-backward

# Make C-q display the list of possible completions

Control-q: complete

# Display the list of matches when no further completion is possible

set show-all-if-unmodified on

编辑: Ctrl q 默认绑定到quoted-insert,也就是说,它告诉shell接下一个关键字。 quoted-insert也绑定到 Ctrl v ,因此如果重新绑定 Ctrl ,则不会丢失该功能q 。无论如何,我发现默认情况下 Alt ESC 也能用于显示可能的完成情况(据我所知,它等同于 TAB );请注意它可能被Gnome占用,然后双击 ESC 或重新绑定&#34;直接切换窗口&#34;在设置→设备→键盘→导航。

答案 2 :(得分:1)

以下内容应该可以满足您的要求(如果我理解正确的话!)

在您的.inputrc

# display all possible matches for an ambiguous pattern at first tab
set show-all-if-ambiguous on

# next tab(s) will cycle through matches
TAB: menu-complete
# shift tab cycles backward
"\e[Z": menu-complete-backward

答案 3 :(得分:0)

我不确定Ctrl-Tab是真正的角色;例如,我的终端忽略了这个组合。我认为使用Ctrl-Tab的唯一方法是使用终端模拟器将其映射到一些未使用的转义序列,然后将该序列绑定到complete

答案 4 :(得分:0)

从哪里开始,如果你能或不能做到这一点取决于你的键盘和你的驱动程序,没有一个包罗万象的答案。每次按键按下和释放都会生成一个有序的键对(键按下和释放)(扫描码),然后这些代码由内核转换为键码,例如在我的笔记本电脑键盘上 0x3a 0xba 被转换为键码 15(向下和向上)然后这些是转换为诸如返回字母 ca 之类的操作/您可以使用 keycode/hex/binary/octal 符号将操作分配给 keysyms,哪些代码匹配哪些字母由相当标准化的内核转换表确定,但是转换为的第一部分信号大多数键盘的键码都不同。

继续前面的例子给我 shift tab(以及 alt 和 control 以及任何组合)产生键码 15 但是在十六进制中它产生 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 这是因为特殊的 shift alt键(修饰符)这些与键码相乘并填写转储键表内核仅限于分配的数量,这取决于您选择的键映射并与终端颜色共享资源(如果您的字符集在上面定义它限制了您的终端颜色范围的阈值)。如果您使用的是 xserver 并且拥有全新的系统,那么这一切都会消失。大多数这些东西都可以由用户和安装的程序更改、修改和操作。我对这一切的观点是要强调,tab 键的映射并没有包罗万象,并且它会将键盘驱动程序更改为 kbd 驱动程序(现在,如果您找到一个恰好适合您的解决方案,那就太好了:))但是有机会如果您更改键盘并且可能无法在 xserver 和 tui 之间进行转换,它是否不可移植并且可能无法工作。我推荐的是学习在旅途中修改 kbd 的步骤。

将为您提供同一行上按键的十进制八进制十六进制表示法

--full-table -1 >> keytable 

将为您提供一个完整的 keycode->keysym 配对列表,其格式可以让您更好地了解您的布局,然后您可以使用 loadkey 更改键值或在 . inputrc 或您的主 rc 文件。您还可以创建自定义 key.map 文件。 进一步的转义序列翻译由“$TERM”变量决定,每个虚拟终端模拟器可以不同

infocmp "$TERM"

会给你一个终端转义序列列表

资源:

https://man7.org/linux/man-pages/man4/console_codes.4.html

https://www.gnu.org/software/screen/manual/html_node/Input-Translation.html

http://kbd-project.org/docs/scancodes/scancodes.html

https://www.vt100.net/

总结一下。 您的键盘驱动程序 您的 kemap 选择 您的虚拟终端模拟器 和你的内核 形成重映射困难键的主干 (tab/s-tab/a-tab)