我可以在Bash中使Tab自动补全不区分大小写吗?


144

正如我想的那样,Ubuntu的Terminal使用区分大小写的自动完成功能。

但我认为,改用不区分大小写的名称通常会更方便,以免您在起名字时必须保持准确,并且可能值得多加误报。可以改变这种行为吗?


很好的问题。作为一种可用性工具,在完成事物命名时,制表符完成不应该像一般的计算机系统那样严格。
masterxilo

Answers:


169

为了使bash当前用户不区分大小写:

在终端中运行以下shell脚本:

# If ~/.inputrc doesn't exist yet: First include the original /etc/inputrc
# so it won't get overriden
if [ ! -a ~/.inputrc ]; then echo '$include /etc/inputrc' > ~/.inputrc; fi

# Add shell-option to ~/.inputrc to enable case-insensitive tab completion
echo 'set completion-ignore-case On' >> ~/.inputrc

启动一个新的外壳程序(重新打开终端)。

在系统范围内进行更改:

# add option to /etc/inputrc to enable case-insensitive tab completion for all users
echo 'set completion-ignore-case On' >> /etc/inputrc
# you may have to use this instead if you are not a superuser:
echo 'set completion-ignore-case On' | sudo tee -a /etc/inputrc

有关详细信息,请参见man bash。是的,它是一个很长的页面,但是bash是一个有点复杂的程序,如果您只想在该页面上搜索“不区分大小写”,请转到相关部分。人们通常一次学习bash一个选项,或者一次学习一个bash脚本,要掌握所有细微差别需要花费很长时间。您的兴趣可能会有所不同。


谢谢。我感谢特定于用户/非管理员友好的解决方案。回声线似乎已经起作用,但是现在我似乎已经失去了使用Ctrl-Left / Right移动光标的功能。另外,会>>>
mwfearnley 2011年

总的来说>>会更安全,我的错误是,我假设您没有〜/ .inputrc。我还设置了noclobber =)请确定为什么您的箭头键不起作用,我无法复制它。您可以删除〜/ .inputrc并启动一个新的shell。
Panther

是的,如果我将其删除,它将再次起作用。.根据linuxfromscratch.org/blfs/view/5.1/postlfs/inputrc.html,新的inputrc可能会覆盖全局的输入法吗?
mwfearnley 2011年

2
天哪,我将其复制到/ etc / inputrc中,再也无法输入“ i”,而当我输入“ e”时,它只是向控制台发送垃圾邮件“ sssssssssss [..]”。更好地使用@ emtin4的解决方案
卡·斯蒂布

2
@LucaSteeb我也打过这个,但是后来意识到整个块不应该放在您的.inputrc中,而是键入一次。只有$include /etc/inputrc并且set completion-ignore-case on应该在您的〜..inputrc文件中。
克里斯(Chris)

49

打开一个终端并输入以下命令:

echo set completion-ignore-case on | sudo tee -a /etc/inputrc

输入密码。重新启动终端。

如果在某些情况下要删除不区分大小写的字母,则只需删除该set completion-ignore-case行即可编辑/ etc / inputrc文件。

就这样。


好的,我为您澄清了。学习bash需要花一些时间,但要继续探索,阅读和询问。linuxcommand.org是一个受欢迎的开始;)
Panther

3
如果有一个以上的用户,这将全部更改它,这可能是或可能不是所需的行为
Walter Tross15年

2
到目前为止,这里最直接,最简单的答案是
workabyte

简单明了的答案
Developerium

11

我知道这个问题很老,但是除非您缺少某些东西,否则如果您使用bash,我想我有一个非常简单的解决方案。

echo "bind 'set completion-ignore-case on'" >> ~/.bashrc

或者只是使用您喜欢的文本编辑器添加该行。重新开始您的bash会话并享受。


2
好吧,您缺少了一些东西:~/.inputrc由readline读取,这是bash用于提供此完成的内容。Readline也被其他程序使用,因此,通常~/.inputrc建议进行此设置,如建议那样,接受的答案会更好。
muru

感谢您的建议,它教给了我更多的知识,但是我不得不说,这似乎并不比我接受的简单,它只是使用了另一行来确保新文件不会使旧文件无效。
mwfearnley '02

完善。好,唯一要记住的是bind 'set completion-ignore-case on'应该换新的行.bashrc
-Vishrant

3

您可以通过为GNU readline设置配置变量来完成此操作,该变量负责处理交互式shell中的输入。

所需的变量是completion-ignore-case,可以直接在bash会话中使用以下命令进行设置:

bind "set completion-ignore-case on"

通过将其放入用户的~/.inputrc文件或系统中/etc/inputrc,可以为以后的所有bash会话启用它,以为所有用户启用它。这是readline的初始化文件。

但是请注意,如果创建~/.inputrc,它将覆盖系统副本。(对我来说,这使我失去了一些关键的映射,例如Ctrl-Left/ Right。您可以通过仔细阅读/etc/inputrc文件来查看哪些映射。)
解决此问题的方法是将代码行$include /etc/inputrc放在的顶部~/.inputrc,例如:

$include /etc/inputrc

set completion-ignore-case on

要应用更改,请重新启动bash或重新加载inputrc,例如使用Ctrl+xCtrl+r

有关readline和inputrc的更多信息,请参见man bashman 3 readline

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.