kYu*_*uZz 20 bash bash-completion
我发现Bash shell支持一种与"传统"自动完成不同的自动完成,其中所有可能性都列在下一行.
使用"传统"自动完成功能,如果我键入ch然后Tab按键,我会得到类似的结果:
$ ch
chacl chgrp chmod chown chvt
Run Code Online (Sandbox Code Playgroud)
但是如果我/etc/inputrc将以下行添加到my (将Tab键重新映射到内置menu-complete函数):
Tab: menu-complete
Run Code Online (Sandbox Code Playgroud)
然后shell的行为发生变化:要完成的单词被替换为"inline",其中包含可能完成列表中的单个匹配,如果我再次按Tab键,则该单词将替换为下一个匹配.
我发现这很有用,但我仍然希望保留传统的自动完成功能并将其绑定到组合键Ctrl + Tab.所以我/etc/inputrc根据readline库文档的建议将以下行添加到我的文件中:
Ctrl-Tab: complete
Run Code Online (Sandbox Code Playgroud)
然而,加入这一行似乎只能使双方Tab并Ctrl-Tab调用传统complete功能.
有谁知道我做错了什么?
提前致谢!
Joh*_*rth 33
首先,我不是这个领域的大专家,但我想我可以回答你的问题.首先,当您使用Bash时,Bash是一个shell,它解释从终端/控制台接收的键盘命令.当您通知Bash如何对inputrc文件中的特定键组合作出反应时,您的终端会在inputrc文件甚至输入等式之前精确确定哪个字符被"发送"到Shell.
不幸的是,我的系统上(当然,这是OSX -但我不认为这是相较于Linux的奇怪的行为),都Tab和Ctrl-Tab发送相同的键盘输入对外壳.事实上,Tab都向shell Ctrl-Tab发送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
Run Code Online (Sandbox Code Playgroud)
第二个绑定中的\ e表示转义字符,[Z只是使用showkey显示的字符.您可以通过简单地使用cat,在终端内运行cat并按下Shift-Tab将显示"^ [[Z",其中^ [表示转义字符,其他字符与之前一样)来对OSX产生类似的效果.
我知道这并不能准确地解决您的问题,但我认为您不能将其Ctrl-Tab用作组合键,而无需重新映射Ctrl-Tab到终端中的其他键绑定(如果您使用GUI,则更容易使用终端),这可能是你可以尽可能接近而不费力!
以下应该可以实现您正在寻找的内容(如果我理解正确的话!)
在你的.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
Run Code Online (Sandbox Code Playgroud)
我已经ShiftTab绑定menu-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
Run Code Online (Sandbox Code Playgroud)
编辑: 默认情况下Ctrlq绑定quoted-insert,即告诉外壳从字面上接受下一个键。quoted-insert也是绑定的Ctrlv,因此如果重新绑定不会失去该功能Ctrlq。无论如何,我发现AltESC默认情况下它也可以显示可能的完成情况(据我所知,它等效于TAB);请注意,它可能会被Gnome占用,然后ESC在“设置”中双击或重新绑定“直接切换窗口”?设备 ?键盘?导航。