From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18986 invoked by alias); 20 Aug 2011 07:02:01 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 16273 Received: (qmail 11063 invoked from network); 20 Aug 2011 07:01:49 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received-SPF: none (ns1.primenet.com.au: domain at closedmail.com does not designate permitted sender hosts) From: Bart Schaefer Message-id: <110820000131.ZM23095@torch.brasslantern.com> Date: Sat, 20 Aug 2011 00:01:31 -0700 In-reply-to: <20110820004710.GA4085@andrew.cmu.edu> Comments: In reply to gi1242+zsh@gmail.com "Re: "Once-a-day" long delay before startup" (Aug 19, 8:47pm) References: <20110814145749.GA6341@andrew.cmu.edu> <4E4D8D50.5040800@gmail.com> <20110819020336.GA21062@andrew.cmu.edu> <110818210558.ZM20788@torch.brasslantern.com> <20110820004710.GA4085@andrew.cmu.edu> X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: zsh-users@zsh.org Subject: Re: "Once-a-day" long delay before startup MIME-version: 1.0 Content-type: text/plain; charset=us-ascii On Aug 19, 8:47pm, gi1242+zsh@gmail.com wrote: } Subject: Re: "Once-a-day" long delay before startup } } On Thu, Aug 18, 2011 at 09:05:58PM -0700, Bart Schaefer wrote: } } > Refer to my earlier reply -- do as soon as possible during startup: } > } > unsetopt hashcmds hashdirs hashlistall } } Indeed. Even with } } unsetopt hashcmds hashdirs } } zsh starts quickly. Yes, as I mentioned, hashlistall really only applies later, but there is no point in leaving it set if the other two are unset. } I'm not sure how this problem can be solved (if at all). Why is the above not a solution? I suppose you mean a solution that doesn't require you to change your zshenv configuration. One possibility is that we could declare the hashcmds and hashdirs options to be obsolete, and no longer have them on by default. (I doubt they're necessary for non-interactive shells in any event.) Meanwhile ... Here's a crude pass at a function set for caching the hash table. It writes the current value of $PATH as the first line of the file and reads back that line to determine whether the file matches the path in the current shell. The store function fills the cache and writes the file all in the background. Improvements are possible. emulate -R zsh -c '# cachehash_valid() { local _typeset cachepath [[ -n $cachefile && -O $cachefile && -r $cachefile && ! -w $cachefile ]] && IFS="=" read _typeset cachepath < $cachefile && [[ $cachepath == $PATH ]] } cachehash_store() { local cachefile=${ZDOTDIR:-$HOME}/.zcachehash { hash -f && umask 0277 && { typeset -p PATH print "hash -r" hash -L } >| $cachefile-$$ && command mv -f $cachefile-$$ $cachefile } &! } cachehash_load() { local cachefile=${ZDOTDIR:-$HOME}/.zcachehash cachehash_valid && source $cachefile } #' Also, I just invented that idiom of '# ... #' for wrapping the argument of "emulate zsh -c ..." but it seems like a good way to make obvious the presence of the quotes. -- Barton E. Schaefer