romkatv / zsh-defer

Deferred execution of Zsh commands
GNU General Public License v3.0
356 stars 11 forks source link

When defering direnv load, it isn't working (it should call .envrc when we change dir) inside VSCode's integrated terminal #1

Closed rjcoelho closed 4 years ago

rjcoelho commented 4 years ago

Workaround is to add -m to zsh-defer See https://github.com/direnv/direnv

romkatv commented 4 years ago

Could you provide more details? What do you do, what do you expect and what do you observe?

When I add zsh-defer eval "$(direnv hook zsh)" to ~/.zshrc, it works just like the plain eval "$(direnv hook zsh)". The only difference is that the output to stdout/stderr is suppressed during initialization, which is the expected behavior.

rjcoelho commented 4 years ago

Inside VSCode integrated terminal ? Outside it works.

romkatv commented 4 years ago

Inside VSCode integrated terminal ?

Yes.

Could you provide more details? What do you do, what do you expect and what do you observe?

romkatv commented 4 years ago

I've also verified that zsh-defer -m eval "$(direnv hook zsh)" (with -m) does not work. Specifically, if the current directory contains .envrc, this file does not get sourced when zsh starts. If direnv is loaded with zsh-defer eval "$(direnv hook zsh)" (without -m) or eval "$(direnv hook zsh)", this file does get sourced. All of these are expected.

rjcoelho commented 4 years ago

Do you garante order if i do zsh-defer one.sh and zsh-defer two.sh ? Will two.sh be evaluated after one.sh or they occur in parallel ? That may be my issue ... thanks!

romkatv commented 4 years ago

Do you garante order if i do zsh-defer one.sh and zsh-defer two.sh ?

Yes. From the docs:

Deferred commands are put in a queue (FIFO). Whenever zle is idle, the next command is popped from the queue.


Will two.sh be evaluated after one.sh or they occur in parallel ?

Nothing gets evaluated in parallel. All commands are executed in the main zsh thread.

That may be my issue ... thanks!

If you could explain how to reproduce this (what you do, what you observe and what you expect), I can take care of the rest. Guessing what's wrong may take a very long time.

rjcoelho commented 4 years ago

I defer 'eval "$(direnv hook zsh)"' and I have a .envrc that does '. $KERL_DEFAULT_INSTALL_DIR/21.3/activate' But it doesn't activate the erlang version, it also should export some vars but it also doesn't. Its doen't work inside VSCode's terminal. Outside works as expected. The only workaround I have is to call defer with -m.

I have to investigate further. Thanks for the support!

romkatv commented 4 years ago

Could you post your ~/.zshrc?

Could you describe the steps you perform in VSCode? What do you click, what do you type, what do you observe?

rjcoelho commented 4 years ago

~/.zshrc:

#!/bin/sh

# Source global definitions
if [ -f /etc/zshrc ]; then
    . /etc/zshrc
fi

source ~/.zsh-defer/zsh-defer.plugin.zsh

# see https://chr4.org/blog/2014/09/10/conf-dot-d-like-directories-for-zsh-slash-bash-dotfiles/
export SHELL_EXTENSION=zsh
if [ -d $HOME/.zshrc.d ]; then
    for file in $HOME/.zshrc.d/*.$SHELL_EXTENSION; do
        source $file
    done
fi
if [ -d $HOME/.rc.d ]; then
    for file in $HOME/.rc.d/*.sh; do
        zsh-defer -m source $file
    done
fi

~/.rc.d/direnv.sh:

# return if requirements are not found.
if [ ! -x "$(command -v direnv)" ]; then
    return 1
fi
# see https://github.com/direnv/direnv
eval "$(direnv hook $SHELL_EXTENSION)"

~/.rc.d/kerl.sh:

[ -f "${HOME}/.kerlrc" ] && \
    source "${HOME}/.kerlrc"

~/.kerlrc:

export KERL_BASE_DIR=$HOME/.kerl
export KERL_DEFAULT_INSTALL_DIR=$KERL_BASE_DIR/installs

.envrc:

. $KERL_DEFAULT_INSTALL_DIR/21.3/activate

Complete dotfiles in https://github.com/rjcoelho/dotfiles.rcm.

romkatv commented 4 years ago

Your code is sourcing files in lexicographical order. Thus, ~/.rc.d/direnv.sh is sourced before ~/.rc.d/kerl.sh. When ~/.rc.d/direnv.sh is sourced, .envrc tries to source $KERL_DEFAULT_INSTALL_DIR/21.3/activate but KERL_DEFAULT_INSTALL_DIR is not set because ~/.rc.d/kerl.sh hasn't been sourced yet.

rjcoelho commented 4 years ago

Yes I that could be it, but then it shouldn't also work outside vscode. Anyway I need to force an order, probably we prefix files by a number. Let me see

rjcoelho commented 4 years ago

Yes thats it .. a simple rename to _kerl.sh did the trick, Thanks!!

romkatv commented 4 years ago

Thanks for the confirmation.

rjcoelho commented 4 years ago

Btw this lib is the great!! I'm just now trying to defer the remaining sh files (zim/prompt/autosuggestions/...)

romkatv commented 4 years ago

Glad you find it useful.

FWIW, I'm not using it myself because there is a much better alternative (powerlevel10k with instant prompt).

Konfekt commented 4 years ago

@romkatv Are the instant prompt scripts independent of the rest of powerlevel10k? Did you try either deferring zimfw to have an idea why deferring has side effects as observed at https://github.com/zimfw/zimfw/issues/372#issuecomment-581029149 ?

romkatv commented 4 years ago

@romkatv Are the instant prompt scripts independent of the rest of powerlevel10k?

No.

Did you try either deferring zimfw

No.

[...] side effects as observed at zimfw/zimfw#372 (comment) ?

If you believe there is a bug in zsh-defer or need help with using it, please open an issue at zsh-defer.