John
John

Reputation: 2922

How do you disable fish shell's guessing autocompletion feature?

In bash, if you type something like:

ls /etc/abc

and hit <tab>, it will beep, and do nothing, basically letting you know that it couldn't figure out how to complete it. In the case of that specific command, a file starting with /etc/abc didn't exist.

In fish, it will use some sophisticated algorithm to figure out what it thinks you may have meant, and can change what you typed completely, possible changing your ls /etc/abc to ls /etc/fstab, because at some point in the past, you may have typed ls /etc/fstab.

I'm sure it's not that arbitrary, but the fact is, it removed my /etc/abc arg, and replaced it with what it thought I meant. Sometimes, I made one mistake in one character, and instead of going back and fixing my mistake like I would in bash, hitting <tab> replaced the entire thing I wrote, forcing me to rewrite the entire arg.

I can see how some people might like this feature, but for me, it's insanely annoying. Maybe I'm just used to bash.

Is there a way to have fish turns this off, so it never replaces what I wrote? If I wrote /etc/abc, hit <tab>, and it can't figure out a completion that starts with that, leave it alone. Don't replace it with its best guess.

I don't even know what the feature is called. Does it even have a name, or is it just a nameless part of the autocompletion of fish?

Update:

A real example I just ran into.

I have a file in the current directory named lib.py. I type git difftool li and hit <tab>. It replaces what I wrote with git difftool templates/nxt_connect/dish_controls.html, immediately making me want to stab somebody as I have to delete the super long string it helpfully filled in for me, and try again. What's worse is that I assume I typed something in wrong, so I'll try exactly the same thing, and end up with exactly the same result, only to realize fish doesn't have a completion file built-in for git difftool, which is why it doesn't even check my current directory for files.

Upvotes: 1

Views: 1755

Answers (1)

faho
faho

Reputation: 15924

and can change what you typed completely, possible changing your ls /etc/abc to ls /etc/fstab,

Fish won't change /etc/abc to /etc/fstab

What it will do is fuzzy-match your command, so e.g. /etc/ft will match /etc/fstab, but that's only because both "f" and "t" are in "fstab" in that order, and only if it was the only possible match.

This won't happen with /etc/abc, because that doesn't match /etc/fstab.

because at some point in the past, you may have typed ls /etc/fstab.

It does not take history into account in this case. It really only uses history for the autosuggestion - the greyed-out continuation of what you typed, but that only does prefix matching.

Is there a way to have fish turns this off, so it never replaces what I wrote?

Fish provides no option to change this behavior.

The next fish release (version 3.2) will offer an "undo" function (bound to ctrl+z by default) so you can undo any match by pressing that.

is it just a nameless part of the autocompletion of fish?

fuzzy matching.

Upvotes: 4

Related Questions