sorin-ionescu / prezto

The configuration framework for Zsh
MIT License
14.02k stars 4.49k forks source link

Completion module doesn't work (but is loaded) #1591

Open luitzifa opened 6 years ago

luitzifa commented 6 years ago

Description

Completions from completion-module are not working in new shell. I was able to verify that they are loaded by putting just a simple echo into the init.sh of the module.

Expected behavior

When i type vagrant and push tab:

~ ❯ vavagrant
 -- gem subcommand --
--version      -- Prints the Vagrant version information
box            -- Box commands
connect        -- Connects to a shared, remote Vagrant environment
destroy        -- Destroys the vagrant environment
docker-logs    -- Shows Docker logs
docker-run     -- Run one-off commands against a Docker container
global-status  -- Reports the status of all active Vagrant environments on the system
halt           -- Halts the currently running vagrant environment
[...]

Actual behavior

When i type vagrant and push tab:

.zprezto ❯ vagrant
 -- file --
CONTRIBUTING.md  LICENSE          README.md        init.zsh         modules/         runcoms/

Steps to Reproduce

Add a new user and freshly install zprezto...

~ ❯ echo $USER
dakr
~ ❯ sudo -i -u testuser
~ ❯ echo $USER
testuser
~ ❯ grep -B8 "'completion'" .zpreztorc
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
~ ❯ grep -H vagrant .zcompdump*
~ ❯ source .zprezto/modules/completion/init.zsh
~ ❯ grep vagrant .zcompdump*
~ ❯ rm -rf .zcompdump*
~ ❯ source .zprezto/modules/completion/init.zsh
~ ❯ grep vagrant .zcompdump*
'vagrant' '_vagrant'
            _trash-restore _udisksctl _ufw _vagrant _virsh \
            _ufw _vagrant _virsh _virtualbox _vnstat \
~ ❯ exit
Good morning! And in case I don't see ya, good afternoon, good evening and goodnight.
  --Truman Burbank
~ ❯ echo $USER
dakr
~ ❯ sudo -i -u testuser
~ ❯ echo $USER
testuser
~ ❯ grep vagrant .zcompdump*
~ ❯ echo 'echo "is loaded"' >> .zprezto/modules/completion/init.zsh
~ ❯ exit
So long and thanks for all the fish.
  -- Douglas Adams
~ ❯ sudo -i -u testuser
is loaded
~ ❯ 

Versions

luitzifa commented 6 years ago

Update: I found the source of my Problems:

# If you don't want compinit called here, place the line
# skip_global_compinit=1
# in your $ZDOTDIR/.zshenv or $ZDOTDIR/.zprofile
if [[ -z "$skip_global_compinit" ]]; then
  autoload -U compinit
  compinit
fi

So all i had to do is: echo 'export skip_global_compinit=1' >> ~./.zprofile

belak commented 6 years ago

Oof this is a bit weird. I'm not sure the best way to solve this since I'd rather not add that export to the prezto runcoms...

luitzifa commented 6 years ago

Ups totally forgot where this condition is from. It's from /etc/zsh/zshrc in Ubuntu 18.04.

So yes, it's pretty distri specific. So maybe just close and hope everyone will find it by themself?

belak commented 6 years ago

I'll leave this open for now - it may be worth adding anyway, especially if it's in Ubuntu since it's so commonly used.

dylancromer commented 6 years ago

Does this affect git completions? I am having an issue with git add completing with

-- not a git repository --

even inside git repositories. Doing the above does not fix the issue, but this issue seems close enough to my problem that I wanted to check.

scinart commented 5 years ago

I bump into a similar problem. in Opensuse 15.0 /etc/zshrc (from package zsh) there is

autoload -U compinit
compinit

in modules/completion/init.zsh there is

if (( $#_comp_files )); then
  compinit -i -C
else
  compinit -i
fi

compinit -i -C doesn't seem to load new _function in $fpath, I had to compinit again.

I hope this helps.

marcolabreu commented 5 years ago

Could tab completion no working be caused by users permissions and compaudit?

I ran into a a similar problem with a fresh install. I eventually discover that replacing the .zcompdump created after install with the old one, would make tab completion work again. But now I receive a zsh compinit: insecure directories, run compaudit for list error when starting the Terminal.

Running compaudit show the culprit is my non default /usr/local/Cellar/zsh/ and /usr/local/share/zsh/ permissions. Basically the whole usr/local tree belongs to the group staff and has 2775 permissions set.

To silence the warnings I ran: sudo find /usr/local/Cellar/zsh/ -type d -exec chmod 2755 {} \; sudo find /usr/local/share/zsh/ -type d -exec chmod 2755 {} \;

Everything works fine now and erasing and reinstalling prezto won't cause any issues.

It seems that the whole problem was caused by the non-default permissions, but the big problem was the lack of clues about what was wrong. Instead of causing an error or raising a warning, tab completions was silently failing. Maybe a permissions checking would be in order?

stealthybox commented 5 years ago

In Ubuntu 18.10, I "fixed" this by doing:

# disable default behavior in /etc/zsh/zshrc
echo 'export skip_global_compinit=1' >> ~/.zprofile

echo autoload -U compinit >> ~/.zshrc
echo compinit >> ~/.zshrc

My command-specific tab-completions work now.

burgesQ commented 5 years ago

Im mint 19 I used @stealthybox fix but I added -C to the compinit instruction to avoid long start time

stealthybox commented 5 years ago

@burgesQ using compinit -C definitely starts faster, but it breaks command completion for me. I'm not educated as to why.

burgesQ commented 5 years ago

but it breaks command completion for me

In the end I've struggled the same error once I rebooted my pc (& so maybe my zsh session ?). The first fix I found was to manually run a compinit at boot. Then the compinit -C in my zshrc was then loading the new cache file for each new shell.

After some digging I found some interesting stuff here, and after cleaning the old caches files the completion (& my startup time) worked back like a charm.

So in then end I had to :

fix completion not working

https://gist.github.com/ctechols/ca1035271ad134841284

autoload -Uz compinit if [[ -n ${ZDOTDIR}/.zcompdump(#qN.mh+24) ]]; then compinit; else compinit -C; fi;

luitzifa commented 5 years ago

@burgesQ acutally this is already done by the completion module: https://github.com/sorin-ionescu/prezto/blob/master/modules/completion/init.zsh#L35-L41

abraithwaite commented 5 years ago

Quick question:

Is it required to delete the ~/.zcompdump in order to get new completions to work after updating the completion submodule?

Hoping there's a better story here if so. I spent a while trying to figure out why it wasn't working and I'm assuming that the check means that it won't load new completions until 20h have passed.

I'm not sure if this is what was happening, but maybe we can add a note to the completion readme if so?

aspin commented 2 years ago

I came across this the other day while setting up a new computer –– found that all completions I was adding to my FPATH weren't being found. I kept deleting ~/.zcompdump, but I think that gets copied from ~/.cache/prezto/zcompdump and I had go delete that too.