summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArvid Norlander <VorpalBlade@users.noreply.github.com>2022-04-06 17:23:48 +0200
committerTavian Barnes <tavianator@tavianator.com>2022-04-21 19:38:25 -0400
commit7f37e4131c24c08e0575db06ccf7ea986c4cc190 (patch)
treef099d3c719037ad876941a1914e73f82fc7ec02f
parentf2cb2215213c0d831a697b0b440f78d9ad5c2b83 (diff)
downloadbfs-7f37e4131c24c08e0575db06ccf7ea986c4cc190.tar.xz
Add basic zsh completion
Fixes #32.
-rw-r--r--Makefile3
-rw-r--r--completions/bfs.zsh172
2 files changed, 175 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index bfd5e37..459a406 100644
--- a/Makefile
+++ b/Makefile
@@ -283,10 +283,13 @@ install:
$(INSTALL) -m644 bfs.1 $(DESTDIR)$(MANDIR)/man1/bfs.1
$(MKDIR) $(DESTDIR)$(PREFIX)/share/bash-completion/completions
$(INSTALL) -m644 completions/bfs.bash $(DESTDIR)$(PREFIX)/share/bash-completion/completions/bfs
+ $(MKDIR) $(DESTDIR)$(PREFIX)/share/zsh/site-functions
+ $(INSTALL) -m644 completions/bfs.zsh $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_bfs
.PHONY: install
uninstall:
$(RM) $(DESTDIR)$(PREFIX)/share/bash-completion/completions/bfs
+ $(RM) $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_bfs
$(RM) $(DESTDIR)$(MANDIR)/man1/bfs.1
$(RM) $(DESTDIR)$(PREFIX)/bin/bfs
.PHONY: uninstall
diff --git a/completions/bfs.zsh b/completions/bfs.zsh
new file mode 100644
index 0000000..3d7dc3a
--- /dev/null
+++ b/completions/bfs.zsh
@@ -0,0 +1,172 @@
+#compdef bfs
+# Based on standard zsh find completion and bfs bash completion.
+
+local curcontext="$curcontext" state_descr variant default ret=1
+local -a state line args alts disp smatch
+
+args=(
+ # Flags
+ '(-depth)-d[search in post-order (descendents first)]'
+ '-D[print diagnostics]:debug option:(cost exec opt rates search stat time tree all help)'
+ '-E[use extended regular expressions with -regex/-iregex]'
+ '-f[specify file hierarchy to traverse]:path:_directories'
+ '-O+[enable query optimisation]:level:(1 2 3)'
+ '-s[traverse directories in sorted order]'
+ '-X[warn if filename contains characters special to xargs]'
+ "-x[don't span filesystems]"
+ '(-H -L)-P[never follow symlinks]'
+ '(-H -P)-L[follow symlinks]'
+ '(-L -P)-H[only follow symlinks when resolving command-line arguments]'
+ "-S[select search method]:value:(bfs dfs ids eds)"
+ '-f[treat path as path to search]:path:_files -/'
+
+ # Operators
+ '*-and'
+ '*-not'
+ '*-or'
+ '*-a' '*-o'
+
+ # Special forms
+ '*-exclude[exclude paths matching EXPRESSION from search]'
+
+ # Options
+ '(-nocolor)-color[turn on colors]'
+ '(-color)-nocolor[turn off colors]'
+ '*-daystart[measure times relative to start of today]'
+ '(-d)*-depth[search in post-order (descendents first)]'
+ '-files0-from[search NUL separated paths from FILE]:file:_files'
+ '*-follow[follow all symbolic links (same as -L)]'
+ '*-ignore_readdir_race[report an error if bfs detects file tree is modified during search]'
+ '*-noignore_readdir_race[do not report an error if bfs detects file tree is modified during search]'
+ '*-maxdepth[ignore files deeper than N]:maximum search depth'
+ '*-mindepth[ignore files shallower than N]:minimum search depth'
+ "*-mount[don't descend into other mount points]"
+ '*-nohidden[exclude hidden files]'
+ '*-noleaf[ignored, for compatibility with GNU find]'
+ '-regextype[type of regex to use, default posix-basic]:regexp syntax:(help posix-basic posix-extended ed emacs grep sed)'
+ '*-status[display a status bar while searching]'
+ '-unique[skip any files that have already been seen]'
+ '*-warn[turn on warnings about the command line]'
+ '*-nowarn[turn off warnings about the command line]'
+ "*-xdev[don't descend into other mount points]"
+
+ # Tests
+ '*-acl[find files with a non-trivial Access Control List]'
+ '*-amin[find files accessed N minutes ago]:access time (minutes):'
+ '*-anewer[find files accessed more recently than FILE was modified]:file to compare (access time):_files'
+ '*-asince[find files accessed more recently than TIME]:time:'
+ '*-atime[find files accessed N days ago]:access time (days):->times'
+
+ '*-Bmin[find files birthed N minutes ago]:birth time (minutes):'
+ '*-Bnewer[find files birthed more recently than FILE was modified]:file to compare (birth time):_files'
+ '*-Bsince[find files birthed more recently than TIME]:time:'
+ '*-Btime[find files birthed N days ago]:birth time (days):->times'
+
+ '*-cmin[find files changed N minutes ago]:inode change time (minutes):'
+ '*-cnewer[find files changed more recently than FILE was modified]:file to compare (inode change time):_files'
+ '*-csince[find files changed more recently than TIME]:time:'
+ '*-ctime[find files changed N days ago]:inode change time (days):->times'
+
+ '*-mmin[find files modified N minutes ago]:modification time (minutes):'
+ '*-mnewer[find files modified more recently than FILE was modified]:file to compare (modification time):_files'
+ '*-msince[find files modified more recently than TIME]:time:'
+ '*-mtime[find files modified N days ago]:modification time (days):->times'
+
+ '*-capable[find files with POSIX.1e capabilities set]'
+ # -depth without parameters exist above. I don't know how to handle this gracefully
+ '*-empty[find empty files/directories]'
+ '*-executable[find files the current user can execute]'
+ '*-readable[find files the current user can read]'
+ '*-writable[find files the current user can write]'
+ '*-false[always false]'
+ '*-true[always true]'
+ '*-fstype[find files on file systems with the given type]:file system type:_file_systems'
+
+ '*-gid[find files owned by group ID N]:numeric group ID:'
+ '*-group[find files owned by group NAME]:group:_groups'
+ '*-uid[find files owned by user ID N]:numeric user ID'
+ '*-user[find files owned by user NAME]:user:_users'
+ '*-hidden[find hidden files (those beginning with .)]'
+
+ '*-ilname[find symbolic links whose target matches GLOB (case insensitve)]:link pattern to search (case insensitive):'
+ '*-iname[find files whose name matches GLOB (case insensitive)]:name pattern to match (case insensitive):'
+ '*-inum[find files with inode number N]:inode number:'
+ '*-ipath[find files whose entire path matches GLOB (case insenstive)]:path pattern to search (case insensitive):'
+ '*-iregex[find files whose entire path matches REGEX (case insenstive)]:regular expression to search (case insensitive):'
+ '*-iwholename[find files whose entire path matches GLOB (case insensitive)]:full path pattern to search (case insensitive):'
+
+ '*-links[find files with N hard links]:number of links:'
+ '*-lname[find symbolic links whose target matches GLOB]:link pattern to search'
+ '*-name[find files whose name matches GLOB]:name pattern'
+ '*-newer[find files newer than FILE]:file to compare (modification time):_files'
+ '*-newer'{a,B,c,m}{a,B,c,m}'[find files where timestamp 1 is newer than timestamp 2 of reference FILE]:reference file:_files'
+ '*-newer'{a,B,c,m}t'[find files where timestamp is newer than timestamp given as parameter]:timestamp:'
+ '*-nogroup[find files with nonexistent owning group]'
+ '*-nouser[find files with nonexistent owning user]'
+ '*-path[find files whose entire path matches GLOB]:path pattern to search:'
+ '*-wholename[find files whose entire path matches GLOB]:full path pattern to search:'
+
+ '*-perm[find files with a matching mode]: :_file_modes'
+ '*-regex[find files whose entire path matches REGEX]:regular expression to search:'
+ '*-samefile[find hard links to FILE]:file to compare inode:_files'
+ '*-since[files modified since TIME]:time:'
+ '*-size[find files with the given size]:file size (blocks):'
+ '*-sparse[find files that occupy fewer disk blocks than expected]'
+ '*-type[find files of the given type]:file type:((b\:block\ device c\:character\ device d\:directory p\:named\ pipe f\:normal\ file l\:symbolic\ link s\:socket w\:whiteout D\:Door))'
+ '*-used[find files last accessed N days after they were changed]:access after inode change (days)'
+ '*-xattr[find files with extended attributes]'
+ '*-xattrname[find files with extended attribute NAME]:name:'
+ '*-xtype[find files of the given type following links when -type would not, and vice versa]:file type:((b\:block\ device c\:character\ device d\:directory p\:named\ pipe f\:normal\ file l\:symbolic\ link s\:socket w\:whiteout D\:Door))'
+
+ # Actions
+ '*-delete[delete any found files (-implies -depth)]'
+ '*-rm[delete any found files (-implies -depth)]'
+
+ '*-exec[execute a command]:program: _command_names -e:*(\;|+)::program arguments: _normal'
+ '*-execdir[execute a command in the same directory as the found files]:program: _command_names -e:*(\;|+)::program arguments: _normal'
+ '*-ok[prompt the user whether to execute a command]:program: _command_names -e:*(\;|+)::program arguments: _normal'
+ '*-okdir[prompt the user whether to execute a command in the same directory as the found files]:program: _command_names -e:*(\;|+)::program arguments: _normal'
+
+ '-exit[exit with status if found, default 0]'
+ '*-fls[list files like ls -dils, but write to FILE instead of standard output]:output file:_files'
+ '*-fprint[print the path to the found file, but write to FILE instead of standard output]:output file:_files'
+ '*-fprint0[print the path to the found file using null character as separator, but write to FILE instead of standard output]:output file:_files'
+ '*-fprintf[print according to format string, but write to FILE instead of standard output]:output file:_files:output format'
+
+ '*-ls[list files like ls -dils]'
+ '*-print[print the path to the found file]'
+ '*-print0[print the path to the found file using null character as separator]'
+ '*-printf[print according to format string]:output format'
+ '*-printx[like -print but escapes whitespace and quotation marks]'
+ "*-prune[don't descend into this directory]"
+
+ '*-quit[quit immediately]'
+ '(- *)-help[print usage information]'
+ '(-)--help[print usage information]'
+ '(- *)-version[print version information]'
+ '(-)--version[print version information]'
+
+ '(--help --version)*:other:{_alternative "directories:directory:_files -/" "logic:logic:(, ! \( \) )"}'
+)
+
+_arguments -C $args && ret=0
+
+if [[ $state = times ]]; then
+ if ! compset -P '[+-]' || [[ -prefix '[0-9]' ]]; then
+ compstate[list]+=' packed'
+ if zstyle -t ":completion:${curcontext}:senses" verbose; then
+ zstyle -s ":completion:${curcontext}:senses" list-separator sep || sep=--
+ default=" [default exactly]"
+ disp=( "- $sep before" "+ $sep since" )
+ smatch=( - + )
+ else
+ disp=( before exactly since )
+ smatch=( - '' + )
+ fi
+ alts=( "senses:sense${default}:compadd -V times -S '' -d disp -a smatch" )
+ fi
+ alts+=( "times:${state_descr}:_dates -f d" )
+ _alternative $alts && ret=0
+fi
+
+return ret