Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: dynamic directory name completion
- X-seq: zsh-workers 28026
- From: Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
- To: zsh-workers@xxxxxxx (Zsh hackers list)
- Subject: PATCH: dynamic directory name completion
- Date: Fri, 11 Jun 2010 23:18:45 +0100
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
I've been playing around with dynamic directory names for referring to
recently used directories and in the process realised that rather than
having to overload _dynamic_directory_name in order to complete dynamic
directory names it would be much more natural to call the original
function, zsh_directory_name, with a new code letter. You don't lose
anything at all by this---you can still overload _dynamic_directory_name
if you prefer.
Here's the change with a tested (but rather less useful than the code
I'm aiming at) example.
Index: Completion/Zsh/Context/_dynamic_directory_name
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Zsh/Context/_dynamic_directory_name,v
retrieving revision 1.1
diff -p -u -r1.1 _dynamic_directory_name
--- Completion/Zsh/Context/_dynamic_directory_name 29 Sep 2008 17:40:55 -0000 1.1
+++ Completion/Zsh/Context/_dynamic_directory_name 11 Jun 2010 22:12:36 -0000
@@ -1,7 +1,7 @@
#autoload
-# The core libraries don't check for dynamic directory name expansion;
-# this gets called from _subscript. This is a placeholder for
-# people to overload.
-
-_message 'dynamic directory name: redefine _dynamic_directory_name to use'
+if [[ -n $functions[zsh_directory_name] ]]; then
+ zsh_directory_name c
+else
+ _message 'dynamic directory name: implemented as zsh_directory_name c'
+fi
Index: Doc/Zsh/expn.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/expn.yo,v
retrieving revision 1.115
diff -p -u -r1.115 expn.yo
--- Doc/Zsh/expn.yo 11 Jun 2010 20:08:02 -0000 1.115
+++ Doc/Zsh/expn.yo 11 Jun 2010 22:12:37 -0000
@@ -1451,6 +1451,12 @@ parts of the directory path, as describe
length matched (16 in the example) is longer than that matched by any
static name.
+The completion system calls `tt(zsh_directory_name c)' in order to
+completion dynamic names for directories. The code for this should be
+as for any other completion function as described in
+ifnzman(noderef(Completion System))\
+ifzman(zmanref(zshcompsys)).
+
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
@@ -1461,16 +1467,28 @@ example(zsh_directory_name+LPAR()RPAR()
setopt extendedglob
local -a match mbegin mend
if [[ $1 = d ]]; then
+ # turn the directory into a name
if [[ $2 = (#b)(/home/pws/perforce/)([^/]##)* ]]; then
typeset -ga reply
reply=(p:$match[2] $(( ${#match[1]} + ${#match[2]} )) )
else
return 1
fi
- else
+ elif [[ $1 = n ]]; then
+ # turn the name into a directory
[[ $2 != (#b)p:(?*) ]] && return 1
typeset -ga reply
reply=(/home/pws/perforce/$match[1])
+ elif [[ $1 = c ]]; then
+ # complete names
+ local expl
+ local -a dirs
+ dirs=(/home/pws/perforce/*(/:t))
+ dirs=(p:${^dirs})
+ _wanted dynamic-dirs expl 'dynamic directory' compadd -S\] -a dirs
+ return
+ else
+ return 1
fi
return 0
})
--
Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/
Messages sorted by:
Reverse Date,
Date,
Thread,
Author