Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remnant characters when tab completing with ZSH

Tags:

zsh

oh-my-zsh

I'm using oh-my-zsh in Arch linux with the robbyrussell theme loaded. When I try to tab complete I end up with remnant characters appended to the prompt. If I delete the auto-completed characters, the remnant characters do not delete.

For example, if I type in:

~ /etc

then tab, it turns to

~ /e/etc/

with a list of options below. Even if I delete /etc/, the /e remains and I'm stuck with:

~ /e

I can't delete the /e. I have to execute a command to get rid of the remnant character.

Any idea what is going on here?

like image 802
Concordus Applications Avatar asked Oct 10 '13 20:10

Concordus Applications


3 Answers

It seems I had issues with locale configuration and non UTF8 configuration

In my case the fix was:

export LC_ALL="en_US.UTF-8"

and keep it permanent adding the line to .zshrc:

echo "export LC_ALL=en_US.UTF-8" >> .zshrc

More info in Ubuntu doc https://help.ubuntu.com/community/Locale

like image 103
corbacho Avatar answered Nov 06 '22 05:11

corbacho


As suggested by simont it is likely that the prompt you are using is using unprintable characters (like color escape codes) but does not indicate that those characters are unprintable. So when the prompt is redrawn the terminal believes that the prompt is wider than it actually is.

You indicate that a character sequence in the zsh prompt has zero width using the %{ and %} delimiters. For example my prompt is:

%{%(?.%F{green}.%F{red})%}➜%{%f%}

The (?...) is a ternary which sets the color of the prompt and it has been marked up to indicate that it is zero width. In the same way the %f resets the color and that has also been marked up.

You can test changes to your prompt by updating the PS1 variable, so you can try out different arrangements and see what works for you.

You can mark any characters in this way, so be careful about making your prompt too short!

like image 30
Matthew Franglen Avatar answered Nov 06 '22 05:11

Matthew Franglen


I had the same problem, so on my quest for a solution I have encountered this article: https://wiki.archlinux.org/index.php/Locale

And, as it was suggested, to enable some locale system-wide, you just need uncomment the desired locale on /etc/locale.gen, for example, in my case:

en_US.UTF-8 UTF-8

After saving the changes on the file, execute (as root) on command line:

locale-gen

Reboot, and it works! (at least for me)

like image 8
Paulo Oliveira Avatar answered Nov 06 '22 07:11

Paulo Oliveira