1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-28 17:10:59 +01:00

25744: dynamic named directories and further doshfunc() simplification

This commit is contained in:
Peter Stephenson 2008-09-26 09:11:27 +00:00
parent 84584ea58b
commit b2d08a2155
13 changed files with 204 additions and 24 deletions

View file

@ -1308,8 +1308,73 @@ The tt(PUSHD_MINUS)
option exchanges the effects of `tt(~PLUS())' and `tt(~-)' where they are
followed by a number.
cindex(directories, named)
cindex(named directories)
subsect(Dynamic named directories)
cindex(directories, named, dynamic)
cindex(named directories, dynamicic)
cindex(dynamic named directories)
The feature described here is only available if the shell function
tt(zsh_directory_name) exists.
A `tt(~)' followed by a string var(namstr) in unquoted square brackets is
treated specially as a dynamic directory name. Note that the first
unquoted closing square bracket always terminates var(namstr). The shell
function is passed two arguments: the string tt(n) (for name) and
var(namstr). It should either set the array tt(reply) to a single element
which is the directory corresponding to the name and return status zero
(executing an assignment as the last statement is usually sufficient), or
it should return status non-zero. In the former case the element of reply
is used as the directory; in the latter case the substitution is deemed to
have failed and tt(NOMATCH) handling is applied if the option is set.
The function tt(zsh_directory_name) is also used to see if a directory can
be turned into a name, for example when printing the directory stack or
when expanding tt(%~) in prompts. In this case the function is passed two
arguments: the string tt(d) (for directory) and the candidate for dynamic
naming. The function should either return non-zero status, if the
directory cannot be named by the function, or it should set the array reply
to consist of two elements: the first is the dynamic name for the directory
(as would appear within `tt(~[)var(...)tt(])'), and the second is the
prefix length of the directory to be replaced. For example, if the trial
directory is tt(/home/myname/src/zsh) and the dynamic name for
tt(/home/myname/src) (which has 16 characters) is tt(s), then the function
sets
example(reply=(s 16))
The directory name so returned is compared with possible static names for
parts of the directory path, as described below; it is used if the prefix
length matched (16 in the example) is longer than that matched by any
static name.
As a working example, here is a function that expands any dynamic names
beginning with the string tt(p:) to directories below
tt(/home/pws/perforce). In this simple case a static name for the
directory would be just as effective.
example(zsh_directory_name() {
emulate -L zsh
setopt extendedglob
local -a match mbegin mend
if [[ $1 = d ]]; then
if [[ $2 = (#b)(/home/pws/perforce/)([^/]##)* ]]; then
typeset -ga reply
reply=(p:$match[2] $(( ${#match[1]} + ${#match[2]} )) )
else
return 1
fi
else
[[ $2 != (#b)p:(?*) ]] && return 1
typeset -ga reply
reply=(/home/pws/perforce/$match[1])
fi
return 0
})
subsect(Static named directories)
cindex(directories, named, static)
cindex(named directories, static)
cindex(static named directories)
A `tt(~)' followed by anything not already covered is looked up as a
named directory, and replaced by the value of that named directory if found.
Named directories are typically home directories for users on the system.
@ -1329,6 +1394,8 @@ with ties broken in favour of using a named directory,
except when the directory is tt(/) itself. The parameters tt($PWD) and
tt($OLDPWD) are never abbreviated in this fashion.
subsect(`=' expansion)
If a word begins with an unquoted `tt(=)'
and the tt(EQUALS) option is set,
the remainder of the word is taken as the
@ -1336,6 +1403,8 @@ name of a command. If a command
exists by that name, the word is replaced
by the full pathname of the command.
subsect(Notes)
Filename expansion is performed on the right hand side of a parameter
assignment, including those appearing after commands of the
tt(typeset) family. In this case, the right hand side will be treated
@ -1349,6 +1418,7 @@ If the option tt(MAGIC_EQUAL_SUBST) is set, any unquoted shell
argument in the form `var(identifier)tt(=)var(expression)' becomes eligible
for file expansion as described in the previous paragraph. Quoting the
first `tt(=)' also inhibits this.
texinode(Filename Generation)()(Filename Expansion)(Expansion)
sect(Filename Generation)
cindex(filename generation)