about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Completion/Unix/Command/_locate111
-rw-r--r--Completion/Unix/Command/_perforce4
-rw-r--r--Completion/Unix/Command/_todo.sh8
4 files changed, 128 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 3fc1aed9f..15ba60489 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-09-27  Peter Stephenson  <pws@csr.com>
+
+	* unposted: Completion/Unix/Command/_todo.sh: replace buggy
+	search message by completion of projects and contexts.
+
+	* 22778: Completion/Unix/Command/_locate: completion for
+	various versions of the locate command.
+
 2006-09-23  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
 	* 22765: Src/subst.c, Src/utils.c, Src/ztype.h,
diff --git a/Completion/Unix/Command/_locate b/Completion/Unix/Command/_locate
new file mode 100644
index 000000000..2b487b401
--- /dev/null
+++ b/Completion/Unix/Command/_locate
@@ -0,0 +1,111 @@
+#compdef locate mlocate slocate
+
+# Decide if we are using mlocate or slocate.
+local ltype basename=${words[0]:t} input
+# If we can't, use this guess.
+local best_guess=mlocate
+
+case $basename in
+  ([ms]locate)
+  ltype=$basename
+  ;;
+
+  (locate)
+  input="$(_call_program locate $words[0] -V)"
+  case $input in
+    (*mlocate*)
+    ltype=mlocate
+    ;;
+
+    (*(#i)secure locate*)
+    ltype=slocate
+    ;;
+
+    (*(#i)gnu locate*)
+    ltype=gnu
+    ;;
+
+    # guess
+    (*)
+    ltype=$best_guess
+    ;;
+  esac
+  ;;
+
+  (*)
+  # too dangerous to run: guess
+  ltype=$best_guess
+esac
+
+case $ltype in
+  (mlocate)
+  # actually, -d can take a colon-separate list
+  # -r/--regexp mean no normal arguments, so shouldn't complete
+  # -m and --mmap are ignored, so don't bother
+  # -s and --stdio likewise
+  _arguments -s : \
+    {-b,--basename}'[Match only the basename of files in the database]' \
+    {-c,--count}'[Output the number of matching entries]' \
+    {-d,--database=}'[Use alternative database]:database:_files' \
+    {-e,--existing}'[Restrict display to existing files]' \
+    {-L,--follow}'[Follow symbolic links to find existing files (default)]' \
+    {-h,--help}'[Show help]' \
+    {-i,--ignore-case}'[Ignore case distinctions in patterns]' \
+    {-l,-n,--limit=}'[Limit search results]:file limit: ' \
+    {-P,-H,--nofollow}'[Don'\''t follow symbolic links]' \
+    {-0,--null}'[Output separated by NUL characters]' \
+    {-S,--statistics}'[Show database statistics]' \
+    {-q,--quiet}'[Don'\''t report errors]' \
+    {-r,--regexp=}'[Search for given basic regexp]:basic regexp: ' \
+    --regex'[Patterns are extended regexps]' \
+    {-V,--version}'[Show version]' \
+    {-w,--wholename}'[Match entire file path (default)]' \
+    '*:pattern: '
+  ;;
+
+  (slocate)
+  # -d can take path
+  # -e can take a comma-separated list of directories.
+  # -f should complete list of file system types like mount
+  _arguments -s : \
+    -u'[Create slocate database starting at path /]' \
+    -U'[Create slocate database starting at given path]:directory:_files -/' \
+    -c'[Parse GNU locate updatedb with -u, -U]' \
+    -e'[Exclude directories with -u, -U]:directories:_files -/' \
+    -f'[Exclude file system types from db with -u, -U]:file system:_file_systems' \
+    -l'[Security level]:level:(0 1)' \
+    -q'[Quiet mode]' \
+    -n'[Limit search results]:file limit: ' \
+    -i'[Case insensitive search]' \
+    {-r,--regexp=}'[Use basic regular expression]:regexp: ' \
+    {-o,--output=}'[Specify database to create]:database:_files' \
+    {-d,--database=}'[Specify database to search]:database:_files' \
+    {-h,--help}'[Display help]' \
+    {-v,--verbose}'[Display files when creating database]' \
+    {-V,--version}'[Display version]' \
+    '*:pattern: '
+  ;;
+
+  (gnu)
+  _arguments -s : \
+    {-d,--database=}'[Use alternative database]:database:_files' \
+    {-e,--existing}'[Restrict display to existing files]' \
+    {-E,--non-existing}'[Allow display of nonexistent files (default)]' \
+    {-i,--ignore-case}'[Ignore case distinctions in patterns]' \
+    {-w,--wholename}'[Match entire file path (default)]' \
+    {-b,--basename}'[Match only the basename of files in the database]' \
+    {-l,-n,--limit=}'[Limit search results]:file limit: ' \
+    {-S,--statistics}'[Show database statistics]' \
+    {-0,--null}'[Output separated by NUL characters]' \
+    {-c,--count}'[Output the number of matching entries]' \
+    {-P,-H,--nofollow}'[Don'\''t follow symbolic links]' \
+    {-L,--follow}'[Follow symbolic links to find existing files (default)]' \
+    {-A,-all}'[Match all arguments instead of at least one]' \
+    {-p,--print}'[Include search results with statistics or count]' \
+    {-r,--regex=}'[Patterns are regular expressions]:basic regexp: ' \
+    --regextype='[Select type of regular expression]' \
+    {-V,--version}'[Show version]' \
+    --help'[Show help]' \
+    '*:pattern: '
+  ;;
+esac
diff --git a/Completion/Unix/Command/_perforce b/Completion/Unix/Command/_perforce
index 8917b679f..7e2a27456 100644
--- a/Completion/Unix/Command/_perforce
+++ b/Completion/Unix/Command/_perforce
@@ -811,7 +811,7 @@ _perforce_retrieve_files() {
     # This may be faster, but won't use matcher specs etc.
     pfx=${(Q)PREFIX}
     compset -P '*/'
-    files=(${${${(f)"$(_perforce_call_p4 $1 $1 \"\$pfx\*\$\{\(Q\)SUFFIX\}\" 2>/dev/null)"}%\#*}##*/})
+    files=(${${${(f)"$(_perforce_call_p4 $1 $1 \"\$pfx\*\$\{\(Q\)SUFFIX\}\" 2>/dev/null)"}%%\#*}##*/})
   else
     # We need to limit the list to a directory.
     if [[ $PREFIX = */* ]]; then
@@ -820,7 +820,7 @@ _perforce_retrieve_files() {
       pfx="*"
     fi
     compset -P '*/'
-    files=(${${${(f)"$(_perforce_call_p4 $1 $1 \$pfx 2>/dev/null)"}%\#*}##*/})
+    files=(${${${(f)"$(_perforce_call_p4 $1 $1 \$pfx 2>/dev/null)"}%%\#*}##*/})
   fi
   [[ $#files -eq 1 && $files[1] = '' ]] && files=()
   shift
diff --git a/Completion/Unix/Command/_todo.sh b/Completion/Unix/Command/_todo.sh
index 583aa008c..5d60b9684 100644
--- a/Completion/Unix/Command/_todo.sh
+++ b/Completion/Unix/Command/_todo.sh
@@ -57,7 +57,13 @@ case $state in
     ;;
 
     (list|listall)
-    _message search term...
+    # This completes stuff beginning with p: (projects) or @ (contexts);
+    # these are todo.sh conventions.
+    # We should do it for any argument after list or listall, but
+    # _arguments doesn't make that easy.  We need it to tell us
+    # the position of the first non-option argument.
+    _wanted search expl 'context or project' \
+      compadd ${${=${${(M)${(f)"$(todo.sh list)"}##<-> *}##<-> }}:#^(p:*|@*)}
     ;;
 
     (listpri)