zsh-workers
 help / color / mirror / code / Atom feed
* Autoloading of compctl from dbm database file.
@ 1996-11-30 13:31 Fung-Chai Lim
  1996-11-30 16:40 ` Zefram
  0 siblings, 1 reply; 13+ messages in thread
From: Fung-Chai Lim @ 1996-11-30 13:31 UTC (permalink / raw)
  To: Z Shell workers mailing list

Hi,

I have modified zsh (version 3.0.1) so that it is able to autoload aliases
and compctl's as well as functions.  When an autoload object is referenced,
its definition is fetched from a database before continuing as per normal.

I rarely use most of the aliases and compctl's that I have in my startup files.
But I would like them defined when I do use them.  So by moving these rarely
used stuff from the startup files to a database and autoloading them would
make zsh leaner and start up faster.

A side advantage benefits shell scripts.  By having the 2 lines
	ZDBFILE=database
	zdb -auf
at the top of the shell script, the rest of the script can make use of any
alias and function kept in the database; no need to source the user's startup
files.

No warranty.  In fact, there are bugs that sometimes cause the shell to crash.
See the section entitled "Caveats" in the file `README.zdb' in the top
directory.  However, I hope you like it.

I've attached the patch after my .signature.  It is uuencoded.  To extract,
save this email in a file and run
	uudecode < email-file

HOW TO APPLY THE PATCH
======================

o You need to install gdbm first.  Obtain
	ftp://prep.ai.mit.edu/pub/gnu/gdbm-1.7.3.tar.gz
  or from some other mirror site.  Compile and install it.

o cd to the top directory of the zsh-3.0.1 source code and run
	patch -p1 < zsh-3.0.1-db.diff

o You need to run autoconf and autoheader.  I do not wish to send the diff
  of the configure script.  I use version 2.10.

o Run "configure" and "make" in the top directory.

o cd to Database and do a "make" and a "make install"

o You may optionally wish to rebuild the tags and TAGS files in Src

Regards,
fclim -- fclim@acm.org

==============================================================================

begin 644 zsh-3.0.1-db.diffs.gz
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
'I@_'"&@!`*+V
`
end


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-11-30 13:31 Autoloading of compctl from dbm database file Fung-Chai Lim
@ 1996-11-30 16:40 ` Zefram
  1996-11-30 23:16   ` Bart Schaefer
  1996-12-01 13:22   ` Fung-Chai Lim
  0 siblings, 2 replies; 13+ messages in thread
From: Zefram @ 1996-11-30 16:40 UTC (permalink / raw)
  To: Fung-Chai Lim; +Cc: zsh-workers

Some general comments.

First, those compctls not currently in the distribution are worth
adding.  The example alias file, however, is a very bad idea, and
should not be included.

We already have a function autoloading facility.  Aliases are cheap to
store, usually short, and people don't have so many of them.  I think
it is therefore not worth adding the database autoloading for them.
However, a dbm database may be a good solution to the problem of
autoloading compctls.

The idea of creating a single global database is flawed.  These
databases *must* be individual.  (However, the capability to use
several database files at once, in a path structure, to allow sharing
of compctls would be good.  Automatic installation of a standard
database of compctls would then be justifiable.) All we really need is
the extra builtin to allow saving and autoloading of compctls, and it
is then easy enough to edit the database by hand from a normal shell.

You limit the code to gdbm, because it does locking.  I suggest that if
we use code like this, that we handle standard dbm as well, either
doing locking ourselves (with more autoconfed code) or ignoring the
issue (after all, the databases won't be changing *that* often).

-zefram


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-11-30 16:40 ` Zefram
@ 1996-11-30 23:16   ` Bart Schaefer
  1996-12-01 12:55     ` Fung-Chai Lim
  1996-12-01 14:02     ` Zefram
  1996-12-01 13:22   ` Fung-Chai Lim
  1 sibling, 2 replies; 13+ messages in thread
From: Bart Schaefer @ 1996-11-30 23:16 UTC (permalink / raw)
  To: Zefram, Fung-Chai Lim, zsh-workers

Seems to me that this idea has "module" written on it, in large flashing
purple neon letters.

On Nov 30,  4:40pm, Zefram wrote:
> Subject: Re: Autoloading of compctl from dbm database file.
> 
> We already have a function autoloading facility.  Aliases are cheap to
> store, usually short, and people don't have so many of them.  I think
> it is therefore not worth adding the database autoloading for them.
> However, a dbm database may be a good solution to the problem of
> autoloading compctls.

Compctls aren't very expensive to store either, are they?  The slow
part of loading compctls and functions is parsing.  If we're going
to introduce a database, we might as well also introduce a binary
storage format and put pre-"compiled" functions, compctls, etc. in
there.  Using a database just to store text that zsh then has to parse
and execute anyway doesn't seem very helpful.

Further -- I admit I haven't tried the patch -- doesn't attempting to
autoload compctls, even from a database, slow down default completion
a lot?


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-11-30 23:16   ` Bart Schaefer
@ 1996-12-01 12:55     ` Fung-Chai Lim
  1996-12-01 14:02     ` Zefram
  1 sibling, 0 replies; 13+ messages in thread
From: Fung-Chai Lim @ 1996-12-01 12:55 UTC (permalink / raw)
  To: Z Shell workers mailing list

In <961130151728.ZM16366828@srf-75.nbn.com>
on Sat, 30 Nov 1996 15:16:26 -0800 (PST)
Bart Schaefer <schaefer@nbn.com> writes:

> Seems to me that this idea has "module" written on it, in large flashing
> purple neon letters.

> Compctls aren't very expensive to store either, are they?  The slow
> part of loading compctls and functions is parsing.  If we're going
> to introduce a database, we might as well also introduce a binary
> storage format and put pre-"compiled" functions, compctls, etc. in
> there.  Using a database just to store text that zsh then has to parse
> and execute anyway doesn't seem very helpful.

Then you have to worry about the "binary" database being shared by
systems of different architectures; distributed file systems are
quite ubiquitous.  The database must be portable over networks.

Yeah, with binary databases, I do see purple lights.

> Further -- I admit I haven't tried the patch -- doesn't attempting to
> autoload compctls, even from a database, slow down default completion
> a lot?

I do not notice any degradation, even with "big" compctl like the
one for `find'.  Remember, only one compctl is parsed at a time
with autoloading, unlike in startup files.

Regards,
fclim.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-11-30 16:40 ` Zefram
  1996-11-30 23:16   ` Bart Schaefer
@ 1996-12-01 13:22   ` Fung-Chai Lim
  1996-12-01 14:17     ` Zefram
  1 sibling, 1 reply; 13+ messages in thread
From: Fung-Chai Lim @ 1996-12-01 13:22 UTC (permalink / raw)
  To: Z Shell workers mailing list

In <8922.199611301640@stone.dcs.warwick.ac.uk>
on Sat, 30 Nov 1996 16:40:31 +0000 (GMT)
Zefram <zefram@dcs.warwick.ac.uk> writes:

> We already have a function autoloading facility.  Aliases are cheap to
> store, usually short, and people don't have so many of them.  I think
> it is therefore not worth adding the database autoloading for them.
> However, a dbm database may be a good solution to the problem of
> autoloading compctls.

First of all, remember my patch is only a SAMPLE IMPLEMENTATION, meant
as a sort of request for comments.

I started with just the idea of autoloading compctl.  Later on, I added
the others (not much extra work) because of the -K compctl flag.  If that
compctl is autoloaded, then its associated function should also be.

I did not extend my code to store arrays to cater for the -k compctl flag.
I shipped the patch out as it is because I wanted to know what you guys
think about autoloading from a dbm file.  Autoloading arrays and others
would be easy to code.  Anyway, global aliases can be used for arrays.

Having aliases and functions in the database can be useful.  Remember my
example, putting
	ZDBFILE=database
	zdb -auf
at the top of any shell script is enough to access aliases and functions.

> The idea of creating a single global database is flawed.  These
> databases *must* be individual.  (However, the capability to use
> several database files at once, in a path structure, to allow sharing
> of compctls would be good.  Automatic installation of a standard
> database of compctls would then be justifiable.) All we really need is
> the extra builtin to allow saving and autoloading of compctls, and it
> is then easy enough to edit the database by hand from a normal shell.

The compctl command is a complicated beast; I don't understand most of
the doc on it.  The idea behind the global database is for a compctl guru
to maintain it for the benefits of other users.

Although the user is allowed to, I don't think it is good idea for each
user to have several dbm files as it would be harder for him to maintain.
Instead, one file with multiple namespaces.  Initially, I was thinking of
subdividing each namespace to support the varieties of platforms, etc.
Consider the psg() function.  And suppose the database is to be shared
by both SysV and BSD systems.  Using only one function definition would
mean a fatter and hence slower function.  I was thinking of copying the
way the folks at X11 had incorporated locale information into their
XAPPLRESDIR, et al, for the syntax of the path to specify the search
order of the subdivisions within a namespace.  I gave up the idea of
subdivisions because it was too difficult to contemplate.

(One trick to write the psg() function is to put a redefinition inside
its definition; the redefinition is slimmer, restricted to the platform.
See my Database/cd.func)

> You limit the code to gdbm, because it does locking.  I suggest that if
> we use code like this, that we handle standard dbm as well, either
> doing locking ourselves (with more autoconfed code) or ignoring the
> issue (after all, the databases won't be changing *that* often).

I don't understand what you mean by `as well'.  Are you saying that the
shell understands various dbm packages?  Or use whatever dbm package
that comes with the system?  The latter may not be a good idea because
the database may be shared over a distributed file system by systems of
different architectures.  The database must be portable over networks.

I think one of the public domain dbm packages should be selected and
either the source code is distributed together with zsh or a pointer
is given on where the user can get hold of it.

Having said that, I think that if the 4BSD's DB package is selected
(I vote for it), then a stripped down version is bundled in, similar
to what Keith Bostic have done in nvi.  After all, not all 3 mechanisms
offered by the package are needed.

Finally, I don't know enough of the innards of a dbm file to comment
on not locking.  I agree that saving to the databases is a rare event.
However, reading them can be frequent, especially when they are shared.
I wonder if the *shell* will be corrupted when fetching data from a dbm
file at a time when the file changes size.

Regards,
fclim.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-11-30 23:16   ` Bart Schaefer
  1996-12-01 12:55     ` Fung-Chai Lim
@ 1996-12-01 14:02     ` Zefram
  1996-12-01 17:41       ` Bart Schaefer
  1 sibling, 1 reply; 13+ messages in thread
From: Zefram @ 1996-12-01 14:02 UTC (permalink / raw)
  To: schaefer; +Cc: zefram, fclim, zsh-workers

>Seems to me that this idea has "module" written on it, in large flashing
>purple neon letters.

That it does.  But autoloading will require some changes to the base
code anyway.

>Compctls aren't very expensive to store either, are they?  The slow
>part of loading compctls and functions is parsing.  If we're going
>to introduce a database, we might as well also introduce a binary
>storage format and put pre-"compiled" functions, compctls, etc. in
>there.  Using a database just to store text that zsh then has to parse
>and execute anyway doesn't seem very helpful.

True.  Interpretation of byte-compiled compctls could be done entirely
in a module.  And if we're going to abandon autoloading, there's no
real point in using a database.  How about an interface like

% compctl -L exec
compctl -l '' exec
% bcompctl -L exec
bcompctl '35!^Az^@^@^@' exec
% bcompctl '35!^Az^@^@^@' command
% compctl -L command
compctl -l '' command

That is, bcompctl does the same job as compctl, but using a byte-
compiled form instead of the normal options.  "bcompctl -L > file"
could be used to save byte-compiled compctls in a form that can be
sourced quickly later.  The challenge is to come up with a binary form
of compctls that is architecture- and version-independent, and can be
turned into the internal form rapidly without risking a crash.

This is getting pretty far from the original idea of a database.

-zefram


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-12-01 13:22   ` Fung-Chai Lim
@ 1996-12-01 14:17     ` Zefram
  1996-12-01 15:38       ` Fung-Chai Lim
  0 siblings, 1 reply; 13+ messages in thread
From: Zefram @ 1996-12-01 14:17 UTC (permalink / raw)
  To: Fung-Chai Lim; +Cc: zsh-workers

>Having aliases and functions in the database can be useful.  Remember my
>example, putting
>	ZDBFILE=database
>	zdb -auf
>at the top of any shell script is enough to access aliases and functions.

. ~/.zshenv

has much the same effect.

>The compctl command is a complicated beast; I don't understand most of
>the doc on it.  The idea behind the global database is for a compctl guru
>to maintain it for the benefits of other users.

That's already possible.  At this site, I maintain a file of compctl
commands which is sourced by many people's .zshrc.  The only
differences between this file and a database would be the efficiency of
interpretation and ease of editing.

>I wonder if the *shell* will be corrupted when fetching data from a dbm
>file at a time when the file changes size.

Whether we use a database or not, the shell *must* cope with any binary
rubbish thrown at it.  (Modules, due to them containing machine code,
are a necessary exception.)

-zefram


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-12-01 14:17     ` Zefram
@ 1996-12-01 15:38       ` Fung-Chai Lim
  0 siblings, 0 replies; 13+ messages in thread
From: Fung-Chai Lim @ 1996-12-01 15:38 UTC (permalink / raw)
  To: Z Shell workers mailing list

In <10492.199612011417@stone.dcs.warwick.ac.uk>
on Sun, 1 Dec 1996 14:17:52 +0000 (GMT)
Zefram <zefram@dcs.warwick.ac.uk> writes:

> >Having aliases and functions in the database can be useful.  Remember my
> >example, putting
> >	ZDBFILE=database
> >	zdb -auf
> >at the top of any shell script is enough to access aliases and functions.
> 
> . ~/.zshenv
> 
> has much the same effect.

Sourcing the startup files does a lot of parsing.  With autoloading,
the parsing is delayed until needed.  Or, with binary databases,
loading the pre-built parse-tree is delayed until needed.

Regards,
fclim.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-12-01 14:02     ` Zefram
@ 1996-12-01 17:41       ` Bart Schaefer
  1996-12-01 18:08         ` what should compctl's look like? Richard Coleman
                           ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Bart Schaefer @ 1996-12-01 17:41 UTC (permalink / raw)
  To: Fung-Chai Lim, Zefram, schaefer, Z Shell workers mailing list

On Dec 1,  8:55pm, Fung-Chai Lim wrote:
> Subject: Re: Autoloading of compctl from dbm database file.
> In <961130151728.ZM16366828@srf-75.nbn.com>
> on Sat, 30 Nov 1996 15:16:26 -0800 (PST)
> Bart Schaefer <schaefer@nbn.com> writes:
> 
> > Compctls aren't very expensive to store either, are they?  The slow
> > part of loading compctls and functions is parsing.  If we're going
> > to introduce a database, we might as well also introduce a binary
> > storage format and put pre-"compiled" functions, compctls, etc. in
> > there.  Using a database just to store text that zsh then has to
parse
> > and execute anyway doesn't seem very helpful.
> 
> Then you have to worry about the "binary" database being shared by
> systems of different architectures; distributed file systems are
> quite ubiquitous.  The database must be portable over networks.

Yes, but that's not a very difficult problem.

> > Further -- I admit I haven't tried the patch -- doesn't attempting
to
> > autoload compctls, even from a database, slow down default
completion
> > a lot?
> 
> I do not notice any degradation, even with "big" compctl like the
> one for `find'.  Remember, only one compctl is parsed at a time
> with autoloading, unlike in startup files.

I'm not worried about how long it takes to load any given compctl.  I'm
worried about how long it takes, every time a command that DOES NOT HAVE
A SPECIAL COMPCTL is used, to discover that there isn't an entry for it.
Completion for a command that doesn't use the autoload database should
not be forced to wait for it.  That's one nice thing about autoloaded
functions -- you have to tell zsh in advance that the function will be
autoloaded, so there's no execute-time overhead for external commands.

Compctls are seldom large/complex enough to make it worthwhile to first
tell zsh about them and then load them later; I'm sure this is why you
chose to use a database for them.  However, I'm not convinced that the
"faster, leaner" startup is worth trading off against searching the
database every time I press tab.

Given a binary database, you could put an index in the first record so
zsh could quickly discover what commands needed to be looked up later;
but with a text format that'd be little better than parsing .zshenv.

On Dec 1,  2:02pm, Zefram wrote:
> Subject: Re: Autoloading of compctl from dbm database file.
> 
> How about an interface like
> 
> % compctl -L exec
> compctl -l '' exec
> % bcompctl -L exec
> bcompctl '35!^Az^@^@^@' exec
> % bcompctl '35!^Az^@^@^@' command
> % compctl -L command
> compctl -l '' command
> 
> That is, bcompctl does the same job as compctl, but using a byte-
> compiled form instead of the normal options.  "bcompctl -L > file"
> could be used to save byte-compiled compctls in a form that can be
> sourced quickly later.

I don't think that goes far enough.  If you still have to parse and
tokenize a command line for every compctl, the binary format hasn't
won you very much.

I'd expect bcompctl to take a file name to read and bcompctl -L a
file name to write, after the manner of fc -R/-W.

Further, {b}compctl -L would have to get a lot smarter, and merge
together into one output item the whole class of commands that use the
same compctl.  E.g. stop doing this:

% compctl -l '' exec noglob nocorrect
% compctl -L
compctl -l '' exec
compctl -l '' nocorrect
compctl -l '' noglob

> The challenge is to come up with a binary form
> of compctls that is architecture- and version-independent, and can be
> turned into the internal form rapidly without risking a crash.

Version-independent will be the tough part; we'd better be darn sure
we're storing compctls internally in the form we'll always want to store
them, before we start saving them off as binary.

A text format has some of the same problems -- I for one would love to
see compctl move away from all these cryptic command-line switches and
instead become a more structured construct with keywords etc.

> This is getting pretty far from the original idea of a database.

Well, a database of some sort (if only a simple one) would be a good
input/output format for bcompctl.  Further, one could treat loading of
compctls the way zsh currently treats filling in the command hash tables
(and even make it subject to the HASH options) -- that is, don't load
the database immediately, and then load only as much as necessary each
time a completion is requested.


^ permalink raw reply	[flat|nested] 13+ messages in thread

* what should compctl's look like?
  1996-12-01 17:41       ` Bart Schaefer
@ 1996-12-01 18:08         ` Richard Coleman
  1996-12-01 18:54           ` Zefram
  1996-12-01 18:38         ` Autoloading of compctl from dbm database file Zefram
  1996-12-02 13:23         ` Fung-Chai Lim
  2 siblings, 1 reply; 13+ messages in thread
From: Richard Coleman @ 1996-12-01 18:08 UTC (permalink / raw)
  To: zsh-workers

Bart spoke thusly:
> A text format has some of the same problems -- I for one would love to
> see compctl move away from all these cryptic command-line switches and
> instead become a more structured construct with keywords etc.

I agree with this.  Essentially compctl is a 'language within a language'.
It would be nice to see this 'language' developed to be something less
cryptic.  What what should it look like?

Maybe someone could do some experiments with flex/lex and
yacc/bison to see what might work.

rc


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-12-01 17:41       ` Bart Schaefer
  1996-12-01 18:08         ` what should compctl's look like? Richard Coleman
@ 1996-12-01 18:38         ` Zefram
  1996-12-02 13:23         ` Fung-Chai Lim
  2 siblings, 0 replies; 13+ messages in thread
From: Zefram @ 1996-12-01 18:38 UTC (permalink / raw)
  To: schaefer; +Cc: fclim, zefram, zsh-workers

>> That is, bcompctl does the same job as compctl, but using a byte-
>> compiled form instead of the normal options.  "bcompctl -L > file"
>> could be used to save byte-compiled compctls in a form that can be
>> sourced quickly later.
>
>I don't think that goes far enough.  If you still have to parse and
>tokenize a command line for every compctl, the binary format hasn't
>won you very much.

The tokenisation is quite quick, though, isn't it?  The commands that
are output by the -L options are all simple commands, with only the
simplest forms of quoting.  And this has the advantage that the
bcompctl commands could be merged with other commands, or made
conditional if necessary.  I think that bypassing compctl's complex
command line parsing is worthwhile.  (I'll do some profiling to check
this.)

>Further, {b}compctl -L would have to get a lot smarter, and merge
>together into one output item the whole class of commands that use the
>same compctl.

Yes.  I'd like compctl to do this in any case.

>Version-independent will be the tough part; we'd better be darn sure
>we're storing compctls internally in the form we'll always want to store
>them, before we start saving them off as binary.

We could have a version number embedded in the binary, so that we can
make incompatible changes and gracefully reject old forms.  We would
usually want to avoid such changes, but that code doesn't change a
great deal anyway.  I think efficiency is likely to be the main
problem.

>A text format has some of the same problems -- I for one would love to
>see compctl move away from all these cryptic command-line switches and
>instead become a more structured construct with keywords etc.

Yes, this has been suggested several times.  I have vague plans of how
this would work.  I can see it blurring the distinction between
extended completions and normal completions somewhat.

-zefram


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: what should compctl's look like?
  1996-12-01 18:08         ` what should compctl's look like? Richard Coleman
@ 1996-12-01 18:54           ` Zefram
  0 siblings, 0 replies; 13+ messages in thread
From: Zefram @ 1996-12-01 18:54 UTC (permalink / raw)
  To: Richard Coleman; +Cc: zsh-workers

>I agree with this.  Essentially compctl is a 'language within a language'.
>It would be nice to see this 'language' developed to be something less
>cryptic.  What what should it look like?

Aha, Richard once again hits the nail right on the head.  That is
exactly the question that I have been considering with respect to
compctls.

>Maybe someone could do some experiments with flex/lex and
>yacc/bison to see what might work.

I think we should avoid having a completely separate language.  We
already have an expressive general-purpose language -- the shell
command language itself.  I envisage an interface along these lines:

zcompctl '
  : some commands
  # (much like trap really)
  if [[ $WORD[2] == *z* ]]; then
    zcompctl -R *.(tgz|taz|tar.(gz|z|Z))
  else
    zcompctl -R *.tar
  fi
' tar

That is, the commands given in that first argument are executed as zsh
commands, and can register possible completions with an option to the
zcompctl command.  (Can anyone think of a better name for the
command?)  Access to the command line can be through an interface
intended for ZLE extension (another project I have some plans for).

The only problem with using the shell language is that, due to $IFS and
so on, it would be difficult to optimise the simplest cases, as we must
do for efficiency.  And interpreting shell commands for even moderately
complex compctls, currently done with the -x option to compctl, would
be inefficient.  Does anyone have any better ideas?

-zefram


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Autoloading of compctl from dbm database file.
  1996-12-01 17:41       ` Bart Schaefer
  1996-12-01 18:08         ` what should compctl's look like? Richard Coleman
  1996-12-01 18:38         ` Autoloading of compctl from dbm database file Zefram
@ 1996-12-02 13:23         ` Fung-Chai Lim
  2 siblings, 0 replies; 13+ messages in thread
From: Fung-Chai Lim @ 1996-12-02 13:23 UTC (permalink / raw)
  To: Z Shell workers mailing list

In <961201094226.ZM20801243@srf-58.nbn.com>
on Sun, 1 Dec 1996 09:41:24 -0800 (PST)
Bart Schaefer <schaefer@nbn.com> writes:

bart> Further -- I admit I haven't tried the patch -- doesn't attempting to
bart> autoload compctls, even from a database, slow down default completion
bart> a lot?

fclim> I do not notice any degradation, even with "big" compctl like the
fclim> one for `find'.  Remember, only one compctl is parsed at a time
fclim> with autoloading, unlike in startup files.

bart> I'm not worried about how long it takes to load any given compctl.  I'm
bart> worried about how long it takes, every time a command that DOES NOT HAVE
bart> A SPECIAL COMPCTL is used, to discover that there isn't an entry for it.
bart> Completion for a command that doesn't use the autoload database should
bart> not be forced to wait for it.  That's one nice thing about autoloaded
bart> functions -- you have to tell zsh in advance that the function will be
bart> autoloaded, so there's no execute-time overhead for external commands.

`zdb -u' is equivalent to `autoload'.  I use the hitherto unused `flags'
member of the compctlp structure.  All autoloaded compctl have this flag
set to PM_UNDEFINED.  The zle checks the flag to see if it needs to
consult the database.  The flag is turned off once the compctl is fetched
from the database.

Any command that does not have a compctl is not in compctltab and so there
will be no check; the zle will immediately use the default for that command.

The extra cycles go into parsing the compctl.  So, if a binary database
is used, the extra reduce to only a database fetch.

> Compctls are seldom large/complex enough to make it worthwhile to first
> tell zsh about them and then load them later; I'm sure this is why you
> chose to use a database for them.  However, I'm not convinced that the
> "faster, leaner" startup is worth trading off against searching the
> database every time I press tab.
>
> Given a binary database, you could put an index in the first record so
> zsh could quickly discover what commands needed to be looked up later;
> but with a text format that'd be little better than parsing .zshenv.

The full syntax for `zdb -u' is `zdb -u [NAME...]'.  The user decides
which compctl to autoload.  Each autoloaded compctl is a compctlp
structure with a NULL cc (compctl struct) member.  That is the amount of
memory used until the zle references it, at which time, the cc member
is created.

> Further, {b}compctl -L would have to get a lot smarter, and merge
> together into one output item the whole class of commands that use the
> same compctl.  E.g. stop doing this:
> 
> % compctl -l '' exec noglob nocorrect
> % compctl -L
> compctl -l '' exec
> compctl -l '' nocorrect
> compctl -l '' noglob

My zdb builtin spends a lot of time on getting this list of commands.
I suggest an additional member to the compctlp structure:
    LinkList cmds;
which treads through all compctlp in the compctltab that have the same
cc member.  Like the cc member, there is only one copy of the cmds
member.

While we are on the subject of the group of commands that shares the
same compctl, let me share my experience writing zdb.  Suppose the
user does the following
    % compctl ... cmd1 cmd2 cmd3
    % compctl ... cmd4 cmd5 cmd6
    % <save to a database>
    % compctl ... cmd1 cmd4 cmd7
    % <save to the same database>
If we use `bcompctl -L ... > database' as the mechanism to save to the
database, we will have 3 records in the database.  But which one to
fetch for cmd1?  For cmd2?  Saving to the database is not trivial.
The database must be treated as persistent storage for the compctltab.

> Well, a database of some sort (if only a simple one) would be a good
> input/output format for bcompctl.  Further, one could treat loading of
> compctls the way zsh currently treats filling in the command hash tables
> (and even make it subject to the HASH options) -- that is, don't load
> the database immediately, and then load only as much as necessary each
> time a completion is requested.

I suggest letting the user decide which compctl to autoload.

Regards,
fclim.


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~1996-12-02 14:07 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1996-11-30 13:31 Autoloading of compctl from dbm database file Fung-Chai Lim
1996-11-30 16:40 ` Zefram
1996-11-30 23:16   ` Bart Schaefer
1996-12-01 12:55     ` Fung-Chai Lim
1996-12-01 14:02     ` Zefram
1996-12-01 17:41       ` Bart Schaefer
1996-12-01 18:08         ` what should compctl's look like? Richard Coleman
1996-12-01 18:54           ` Zefram
1996-12-01 18:38         ` Autoloading of compctl from dbm database file Zefram
1996-12-02 13:23         ` Fung-Chai Lim
1996-12-01 13:22   ` Fung-Chai Lim
1996-12-01 14:17     ` Zefram
1996-12-01 15:38       ` Fung-Chai Lim

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).