Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 获得;“完成”;及;菜单完成“;合作_Bash_Bash Completion - Fatal编程技术网

Bash 获得;“完成”;及;菜单完成“;合作

Bash 获得;“完成”;及;菜单完成“;合作,bash,bash-completion,Bash,Bash Completion,我发现bashshell支持一种不同于“传统”自动补全的自动补全,所有的可能性都列在下面的一行 使用“传统”自动补全功能,如果我键入ch,然后按选项卡键,我会得到如下结果: $ ch chacl chgrp chmod chown chvt 但如果我将以下行添加到我的/etc/inputrc(它将Tab键重新映射到内置的菜单complete功能): 然后shell的行为发生了变化:要完成的单词被替换为可能完成的列表中的单个匹配项“inline”,如果我再次按Tab键,该单词将被替换为下

我发现bashshell支持一种不同于“传统”自动补全的自动补全,所有的可能性都列在下面的一行

使用“传统”自动补全功能,如果我键入
ch
,然后按
选项卡
键,我会得到如下结果:

$ ch
chacl  chgrp  chmod  chown  chvt
但如果我将以下行添加到我的
/etc/inputrc
(它将Tab键重新映射到内置的
菜单complete
功能):

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

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

Ctrl-Tab: complete
但是,添加这一行似乎只会使
Tab
Ctrl-Tab
调用传统的
函数

有人知道我做错了什么吗


提前谢谢

我不确定Ctrl-Tab是不是真的字符;例如,我的终端忽略了组合。我认为使用Ctrl-Tab的唯一方法是使用终端模拟器将其映射到其他未使用的转义序列,然后将该序列绑定到
complete
首先,我不是这方面的专家,但我想我可以回答你的问题。首先,在使用Bash时,Bash是一个shell,它解释从终端/控制台接收的键盘命令。当您通知Bash如何对inputrc文件中的特定组合键做出反应时,您的终端会在inputrc文件进入公式之前准确地确定哪个字符被“发送”到Shell

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

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

无论如何,我给你的建议是使用Shift-Tab,它似乎会将自己的键代码发送到shell。我的计算机上的Shift Tab(使用showkey)显示为“[Z”,我认为这在所有方面都是相当标准的。因此,具有以下绑定的inputrc文件应允许您使用Shift Tab而不是ctrl Tab来实现所需的功能:

Tab: menu-complete
"\e[Z": complete
第二个绑定中的\e表示转义字符,[Z]只是使用showkey显示的字符。您可以在OSX上获得类似的效果,只需使用cat,在终端内运行cat并按Shift Tab键即可显示“^[[Z”,其中^[表示转义字符,其他字符与之前相同

我知道这并不能准确地解决您的问题,但我认为您无法使用Ctrl-Tab作为组合键,而无需将Ctrl-Tab重新映射到终端内的另一个键绑定(如果您使用的是GUI终端,可能会更容易),这很可能是你不费吹灰之力就能得到的最接近的结果!

我将ShiftTab绑定到
菜单complete backward
,因此如果我跳过了正确的完成,它将返回一步,并且我已将Ctrlq映射到
complete
,因此如果有几个可能的完成,我将点击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或在设置中重新绑定“直接切换窗口”→ 装置→ 键盘→ 导航。

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

在您的
.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

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

继续前面的示例,对于me,shift tab(以及alt和control以及任何组合)生成键码15,但在十六进制中它生成0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a,这是因为shift alt和control是特殊键(修饰符)这些值与keycodes相乘并填充dumpkeys表内核也被限制为分配的数量这取决于您对keymap的选择,并与您的终端颜色共享资源(如果您的字符将其定义值设置为高于阈值,则会限制您的终端颜色范围)。如果您的服务器是xserver,并且有一个全新的系统,那么这一切都会消失。这些东西大部分都可以更改、修改和操作
# 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
--full-table -1 >> keytable 
infocmp "$TERM"