242

Ubuntu's Terminal uses case-sensitive auto-completion, as would be expected for Linux.

But I think sometimes it would be more convenient to use a case-insensitive one instead, to save you having to be accurate while starting a name, and would probably be worth the extra false positives. Is it possible to change this behaviour?

mwfearnley
  • 3,317
  • 2
  • 22
  • 28
  • Very good question. As a usability tool, tab-completion should not be as strict as the computer system in general when it comes to naming things. – masterxilo Jan 23 '19 at 08:55

4 Answers4

308

In order to make bash case-insensitive for to current user:

Run the following shell script in a terminal:

# 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

Start a new shell (reopen the terminal).

To Make the changes systemwide:

# 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

For details, see man bash . Yes it is a long page, but bash is a somewhat complex program, and if you want just search that page for "case-insensitive" to go to the relevant section. People usually learn bash one option at a time or one bash script at a time and it takes a long time to master all the nuances. Your interest may vary.

masterxilo
  • 125
  • 7
Panther
  • 102,067
  • Thanks. I appreciate the user-specific/non-admin friendly solution. The echo line seems to have worked, but now I seem to have lost the ability to use Ctrl-Left/Right to move the cursor. Also, would >> be safer than >? – mwfearnley Dec 12 '11 at 06:27
  • In general >> is going to be safer, my mistake, I was assuming you did not have a ~/.inputrc . I also set noclobber =) Bit sure why your arrow keys are not working, I can not replicate that. You can remove ~/.inputrc and start a new shell. – Panther Dec 12 '11 at 06:30
  • Yeah, it works again if I remove it.. According to http://www.linuxfromscratch.org/blfs/view/5.1/postlfs/inputrc.html the new inputrc might be overriding the global one? – mwfearnley Dec 12 '11 at 07:00
  • On my system, I can move the cursor with just the arrow keys. – Panther Dec 12 '11 at 07:14
  • @enzotib thanks, that works.. I'd like to accept the above answer, but it would be good to see this issue addressed in it. – mwfearnley Dec 12 '11 at 18:49
  • @Matthew - I updated the command , does that work ? You now almost certainly need > rather then >> – Panther Dec 12 '11 at 18:59
  • Doesn't \n in echo require -e option? – enzotib Dec 12 '11 at 21:27
  • @enzotib It does not seem to require the -e , but it does require quotes. – Panther Dec 12 '11 at 21:33
  • I still believe (after doing a test, giving the output on a single line with a literal two char sequence '\n) that to output two lines, interpreting the\nas a newline, you need-eoption toecho`. – enzotib Dec 13 '11 at 08:07
  • OK, I added -e . I think it is working without the -e as I am using zsh. – Panther Dec 13 '11 at 22:49
  • Yes, that works for me.. Sorry I'm a bit of a newbie here, but maybe it would be easier just to give two separate lines? That allows a brief explanation for the $include line. It could also feature a check to make sure the file doesn't already exist. – mwfearnley Dec 14 '11 at 16:27
  • Since you can also have vim mode in bash, what reason is there left to learn zsh now? ;) – Morlock Aug 21 '14 at 18:54
  • I've hesitated to use this answer for a long time, though now I try it and see how simple the ~/.inputrc configuration actually is. I would like to see a plain example of the contents of the ~/.inputrc file rather than a shell script to create that file any day. – ThorSummoner Oct 21 '14 at 17:25
  • As long as you understand what and how the script functions, you can manually write the file if you wish. If you do not understand the script , see the comments. The comments and script were part of the explanation. – Panther Oct 22 '14 at 02:56
  • I don't think you need that if statement. >> will append if the file exists, and create and append if it doesn't. – Alexander Oct 23 '15 at 22:01
  • 3
    Holy shit, I copied this into /etc/inputrc and I can't type "i" anymore and when I type "e" it just spams "ssssssssss[..]" into the console.. better use the solution from @emtin4 – Luca Steeb Mar 31 '16 at 23:49
  • 4
    @LucaSteeb I hit that too, but then realized this whole block is not supposed to be put in your .inputrc, but typed once. Only $include /etc/inputrc and set completion-ignore-case on should be in your ~..inputrc file. – Chris Jan 08 '18 at 19:32
  • Those are commands to run not to be copy pasted into files – Panther Jan 08 '18 at 20:13
  • If you do not want to add this to your bashrc but instead only want to set it for the current session, how is this accomplished? – Damien Feb 06 '19 at 04:11
  • "source /etc/inputrc" is wrong, it should be "$include /etc/inputrc"! – masterxilo Jun 16 '19 at 13:51
  • @Arch Linux Tux You broke this answer with your edit to source from $include. .inputrc is not a bash script! – Martin Thornton Jun 17 '19 at 07:51
  • I didn't take the answer as given, but reading man bash and the mini inspirational note is solving my desire for case insensitive tab-completes.C – wbg Nov 14 '19 at 17:35
72

Open a terminal and type the below command:

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

Enter password. Restart terminal.

If in some case you want to remove case insensitive, just edit /etc/inputrc file by removing the set completion-ignore-case line.

That's all.

regan
  • 754
emtin4
  • 1,100
  • 6
  • 11
33

I know this question is very old but unless I am missing something I think I have a super simple solution if you are using bash.

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

Or just add the line using your favorite text editor. Restart your bash session and enjoy.

init3
  • 339
  • 4
    Well, you're missing something: ~/.inputrc is read by readline, which is what bash uses to provide this completion. Readline is also used by other programs, so, for generally setting this, ~/.inputrc as suggested the accepted answer would be better. – muru Jan 31 '16 at 02:50
  • Thanks for your suggestion, it teaches me a little more, but I have to say that it doesn't seem any simpler than the one I accepted, which just uses an additional line to ensure the new file doesn't nullify the old. – mwfearnley Feb 01 '16 at 20:52
  • perfect. well the only thing to remember is bind 'set completion-ignore-case on' should go in new line of .bashrc – Vishrant Aug 18 '18 at 23:20
  • thanks! using bind will be more easier to execute in a public system instead of modify any other files (~/.inputrc). – Marslo Nov 17 '20 at 13:59
  • +1. This is the only one that works on git bash in Windows (where bind is necessary) – JBSnorro Sep 04 '22 at 09:09
  • By far the easiest answer. Works perfectly in .bashrc and .bash_profile – Piero Hernandez Aug 17 '23 at 17:48
10

You can do this by setting a configuration variable for GNU readline, which is what handles the input in an interactive shell.

The variable needed is completion-ignore-case, and can be set directly in your bash session with:

bind "set completion-ignore-case on"

It can be enabled for all future bash sessions by putting set completion-ignore-case on into the users's ~/.inputrc file, or the system /etc/inputrc, to enable it for all users. This is the initialisation file for readline.

Note that ~/.inputrc probably doesn't exist, and if you create it, your local version will override the system version at /etc/inputrc. The system version has lots of useful key mappings configured, such as Ctrl-Left/Right, and you have to link in the system version so you don't lose them.

The way to do this is to put the line $include /etc/inputrc at the top of ~/.inputrc, e.g.:

$include /etc/inputrc

set completion-ignore-case on

Once configured, you can apply the change, either by restarting bash, or reload inputrc, e.g. with Ctrlx,Ctrlr.)

More information about readline and inputrc can be found in man bash and man 3 readline.

mwfearnley
  • 3,317
  • 2
  • 22
  • 28
  • When I run man bind in bash, I see the description for bind(2) to be "bind a name to a socket". Is that the same bind as you are using? Is there another bind? – Peter Bergman May 26 '23 at 17:16
  • 1
    @PeterBergman type bind shows it's a bash builtin, so it doesn't get its own manpage - though sometimes there may be one for a non-builtin with similar functionality. There's some info with help bind, or you can search man bash for bind. – mwfearnley May 27 '23 at 06:26