zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-users@zsh.org
Subject: Re: Creating A Clean Environment For Autoloaded Functions
Date: Sun, 30 Dec 2012 11:20:44 -0800	[thread overview]
Message-ID: <121230112044.ZM879@torch.brasslantern.com> (raw)
In-Reply-To: <CA+zrezQX3hAh1dcPvi6-W9pJ+goWrm2vzQ6gSP=EAjyuw2micQ@mail.gmail.com>

On Dec 30,  4:44am, Russell Harmon wrote:
>
> If I want to write a function which can be autoloaded, how can I
> prevent functions defined outside of my function from being accessible
> from within my function? For example, I have a function ls { gls "$@"
> }, and I know of no way to prevent that function from leaking into the
> definition of all the functions I've autoloaded which use ls.

This amounts to asking how to violate a basic tenet of shell function
behavior.  They're supposed to act like commands that are always at the
front of the search path, and the search path doesn't change based on
the order in which every other command was added to it.

The way you avoid this is to write every function that explicitly does
not want this behavior so as to explicitly override it; for examply by
using "command ls" instead of "ls".

However, you could do something like this, assuming zsh/parameter is
loaded:

    ls() {
      if (( $#funcstack > 1 ))
      then command ls "$@"
      else gls "$@"
      fi
    }

This will prevent gls from being run inside any other function, although
it won't bypass the ls wrapper function entirely.

> Additionally, is it possible to zmodload a module which is
> automatically unloaded from the environment after my function
> completes _only if_ that module was not already loaded?

There isn't a property of modules that supports this, but you can do it
yourself explicitly with something like this:

    {
      zmodload -e zsh/mathfunc	# for example
      local unload_mathfunc=$?
      zmodload zsh/mathfunc

      : do what you need to with math functions

    } always {
      (( unload_mathfunc )) && zmodload -u zsh/mathfunc
    }

If the zsh/parameter module is not itself one of the ones you care about
unloading in this way, you can be more generic:

    {
      zmodload zsh/parameter
      local -a existing_modules
      existing_modules=( ${(k)modules[(R)loaded]} ) 

      : do whatever zmodloads you want ...

    } always {
      # Requires zsh 5.0, otherwise you need a loop
      zmodload -u ${(k)modules[(R)loaded]:|existing_modules}
    }

I'm not sure that zmodload is clever enough to notice that inter-module
dependencies have been satisfied by the list provided to -u and thus
unload the modules in the correct order to be sure it succeeds, so a
bit of tweaking to the above may be required for full generality.


  reply	other threads:[~2012-12-30 19:21 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-30  9:44 Russell Harmon
2012-12-30 19:20 ` Bart Schaefer [this message]
2012-12-30 21:02   ` Russell Harmon
2012-12-30 22:12     ` Bart Schaefer
2012-12-31 23:30   ` Han Pingtian
2013-01-02  5:15     ` PATCH and more remarks on parameter expansion docs Bart Schaefer
2013-01-02  8:32       ` Han Pingtian
2013-01-02 16:46         ` Bart Schaefer
2013-01-02 23:28           ` Han Pingtian
2013-01-03 19:42             ` Bart Schaefer
2013-01-03 22:18               ` Han Pingtian

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=121230112044.ZM879@torch.brasslantern.com \
    --to=schaefer@brasslantern.com \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).