24

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

使用“传统”自动完成功能,如果我键入ch然后按下Tab键,我会得到如下信息:

$ ch
chacl  chgrp  chmod  chown  chvt

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

Tab: menu-complete

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

我发现这很有用,但我仍然想保留传统的自动完成并将其绑定到 key combination Ctrl + Tab/etc/inputrc因此,根据readline库文档的建议,我在文件中添加了以下行:

Ctrl-Tab: complete

但是,添加这一行似乎只能同时Tab调用Ctrl-Tab传统complete函数。

有谁知道我做错了什么?

提前致谢!

4

5 回答 5

35

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

不幸的是,在我的系统上(当然,它是 OSX - 但与 Linux 相比,我认为这不是奇怪的行为),两者都TabCtrl-Tabshell 发送相同的键盘输入。事实上,Tab 和向 shellCtrl-Tab发送Ctrl-I命令,实际上,如果我Ctrl-I在使用终端时输入,它会执行完成,就像我按 Tab 一样。

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

无论如何,我对你的建议是使用Shift-Tab,它似乎确实将它自己的密钥代码发送到外壳。Shift-Tab在我的电脑上显示(使用 showkey)为“<ESC>[Z”,我认为这是非常标准的。因此,具有以下绑定的 inputrc 文件应该允许您使用shift-tab而不是ctrl-tab实现您想要的:

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

第二个绑定中的 \e 代表转义字符,而 [Z 只是使用 showkey 显示的字符。您可以通过简单地使用 cat 在 OSX 上获得类似的效果,从终端中运行 cat 并按下Shift-Tab将显示“^[[Z”,其中 ^[ 表示转义字符,其他字符与以前一样。

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

于 2012-08-20T21:29:27.950 回答
8

我已经ShiftTab绑定到menu-complete-backward,所以如果我跳过正确的完成,它会后退一步,并且我已经映射Ctrlqcomplete,所以如果有几个可能的完成,我会点击Ctrlq列出它们而不必循环它们。

# 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

Edit: Ctrlq默认绑定到quoted-insert,也就是说,它告诉 shell 从字面上获取下一个键。quoted-insert也绑定到Ctrlv,所以如果你重新绑定,你不会失去那个功能Ctrlq。无论如何,我发现AltESC默认情况下,它也适用于显示可能的完成(据我所知,它相当于TAB);请注意,它可能被 Gnome 占用,然后在设置 → 设备 → 键盘 → 导航中双击ESC或重新绑定“直接切换窗口”。

于 2017-11-26T10:09:01.517 回答
5

以下应该实现您正在寻找的东西(如果我理解正确!)

在你的.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
于 2018-08-07T17:27:11.953 回答
0

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

于 2012-08-20T20:44:25.537 回答
0

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

继续我之前的示例 shift 选项卡(以及 alt 和 control 以及任何组合)产生键码 15 但是在十六进制中它产生 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 这是因为 shift alt 和 control 是特殊键(修饰符)这些与键码相乘并填写转储键表内核也仅限于分配的数量,这取决于您选择的键映射并与您的终端颜色共享资源(如果您的 char 将其定义为高于阈值它限制您的终端颜色范围)。如果您在 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) 的主干

于 2020-12-29T04:14:31.420 回答