Completion for beet

This commit is contained in:
Joe Bloggs 2014-07-12 19:28:42 +01:00
parent 0fd95762db
commit 63c3392bbb
1 changed files with 119 additions and 0 deletions

119
src/_beet Normal file
View File

@ -0,0 +1,119 @@
#compdef beet
# completion for beets music library manager and MusicBrainz tagger: http://beets.radbox.org/
local matchany queryelem modifyelem newfields
local matchquery matchmodify
local -a reply files dirs query modify fields
fields=(acoustid_fingerprint acoustid_id added album album_id albumartist albumartist_credit albumartist_sort albumdisambig albumstatus albumtype artist artist_credit artist_sort artpath asin bitdepth bitrate bpm catalognum channels comments comp composer country day disc disctitle disctotal encoder format genre grouping id initial_key label language length lyrics mb_albumartistid mb_albumid mb_artistid mb_releasegroupid mb_trackid media month mtime original_day original_month original_year path rg_album_gain rg_album_peak rg_track_gain rg_track_peak samplerate script title track tracktotal year)
# matches any word
matchany=/$'[^\0]##\0'/
# Put the fields into a format for use in the _values function
newfields=$(echo "'${^fields[@]}::'")
matchquery=/"(${(j/|/)fields[@]})"$':[^\0]##\0'/
matchmodify=/"(${(j/|/)fields[@]})"$'(=[^\0]##|!)\0'/
# complete a query term
queryelem="_values -S : 'query field (add an extra : to match by regexp)' '::' $newfields"
# complete a modify term
modifyelem="_values -S = 'modify field (replace = with ! to remove field)' $newfields"
# complete lists of queries and modifications (at least one query/modify string is needed in each case)
query=( \( "$matchquery" ":query:query string:$queryelem" \) \( "$matchquery" ":query:query string:$queryelem" \) \# )
modify=( \( "$matchmodify" ":modify:modify string:$modifyelem" \) \( "$matchmodify" ":modify:modify string:$modifyelem" \) \# )
# complete files and directories
files=("$matchany" ':type:type:_files')
dirs=("$matchany" ':type:type:_dirs')
# Individual options used by subcommands, and global options (must be single quoted).
local helpopt formatopt albumopt dontmoveopt writeopt nowriteopt pretendopt pathopt destopt copyopt nocopyopt
local inferopt noinferopt resumeopt noresumeopt nopromptopt logopt individualopt confirmopt retagopt skipopt noskipopt
local flatopt groupopt editopt defaultopt noconfirmopt exactopt removeopt configopt debugopt
helpopt='-h:show this help message and exit'
formatopt='-f:print with custom format:$matchany'
albumopt='-a:match albums instead of tracks'
dontmoveopt='-M:dont move files in library'
writeopt='-w:write new metadata to files tags (default)'
nowriteopt='-W:dont write metadata (opposite of -w)'
pretendopt='-p:show all changes but do nothing'
pathopt='-p:print paths for matched items or albums'
destopt='-d:destination music directory:$dirs'
copyopt='-c:copy tracks into library directory (default)'
nocopyopt='-C:dont copy tracks (opposite of -c)'
inferopt='-a:infer tags for imported files (default)'
noinferopt='-A:dont infer tags for imported files (opposite of -a)'
resumeopt='-p:resume importing if interrupted'
noresumeopt='-P:do not try to resume importing'
nopromptopt='-q:never prompt for input, skip albums instead'
logopt='-l:file to log untaggable albums for later review:$files'
individualopt='-s:import individual tracks instead of full albums'
confirmopt='-t:always confirm all actions'
retagopt='-L:retag items matching a query:${query[@]}'
skipopt='-i:skip already-imported directories'
noskipopt='-I:do not skip already-imported directories'
flatopt='--flat:import an entire tree as a single album'
groupopt='-g:group tracks in a folder into seperate albums'
editopt='-e:edit user configuration with $EDITOR'
defaultopt='-d:include the default configuration'
copynomoveopt='-c:copy instead of moving'
noconfirmopt='-y:skip confirmation'
exactopt='-e:get exact file sizes'
removeopt='-d:also remove files from disk'
configopt='-c:path to configuration file:$files'
debugopt='-v:print debugging information'
libopt='-l:library database file to use:$files'
# Option lists for different subcommands
local -a moveopts configopts writeopts modifyopts statsopts removeopts updateopts importopts listopts globalopts
_regex_words options "move options" "$helpopt" "$albumopt" "$destopt" "$copynomoveopt"
moveopts=( "${reply[@]}" \# "${query[@]}")
_regex_words options "config options" "$helpopt" "$pathopt" "$editopt" "$defaultopt"
configopts=("${reply[@]}")
_regex_words options "write options" "$helpopt" "$pretendopt"
writeopts=( "${reply[@]}" \# "${query[@]}")
_regex_words options "modify options" "$helpopt" "$dontmoveopt" "$writeopt" "$nowriteopt" "$albumopt" "$noconfirmopt" "$formatopt"
modifyopts=( "${reply[@]}" \# "${query[@]}" "${modify[@]}" )
_regex_words options "stats options" "$helpopt" "$exactopt"
statsopts=( "${reply[@]}" \# "${query[@]}" )
_regex_words options "remove options" "$helpopt" "$albumopt" "$removeopt"
removeopts=( "${reply[@]}" \# "${query[@]}" )
_regex_words options "update options" "$helpopt" "$albumopt" "$dontmoveopt" "$pretendopt" "$formatopt"
updateopts=( "${reply[@]}" \# "${query[@]}" )
_regex_words options "import options" "$helpopt" "$writeopt" "$nowriteopt" "$copyopt" "$nocopyopt" "$inferopt" \
"$noinferopt" "$resumeopt" "$noresumeopt" "$nopromptopt" "$logopt" "$individualopt" "$confirmopt" "$retagopt" \
"$skipopt" "$noskipopt" "$flatopt" "$groupopt"
importopts=( "${reply[@]}" \# "${files[@]}" \# )
_regex_words options "list options" "$helpopt" "$pathopt" "$albumopt" "$formatopt"
listopts=( "$reply[@]" \# "${query[@]}" )
_regex_words options "global options" "$configopt" "$debugopt" "$libopt" "$helpopt" "$destopt"
globalopts=( "${reply[@]}" )
# Subcommands (must be single quoted).
local fieldscmd importcmd listcmd updatecmd removecmd statscmd versioncmd
local modifycmd movecmd writecmd configcmd migratecmd helpcmd
fieldscmd='fields:show fields available for queries and format strings'
importcmd='import:import new music:$importopts'
listcmd='list:query the library:${listopts[@]}'
updatecmd='update:update all tracks in the library that match a query:${updateopts[@]}'
removecmd='remove:remove matching items from the library:${removeopts[@]}'
statscmd='stats:show statistics about the library or a query:${statsopts[@]}'
versioncmd='version:output version information'
modifycmd='modify:change metadata fields:${modifyopts[@]}'
movecmd='move:move or copy items:${moveopts[@]}'
writecmd='write:write tag information to files:${writeopts[@]}'
configcmd='config:show or edit the user configuration:${configopts[@]}'
migratecmd='migrate:convert legacy config'
helpcmd='help:give detailed help on a specific sub-command:${beet_help_args[@]}'
# Help completion
local -a beet_help_args subcmds
beet_help_args=(/$'(fields|import|list|update|remove|stats|version|modify|move|write|config|migrate)\0'/ ':cmd:command:((fields\:show\ fields\ available\ for\ queries\ and\ format\ strings import\:import\ new\ music list\:query\ the\ library update\:update\ all\ tracks\ in\ the\ library\ that\ match\ a\ query remove\:remove\ matching\ items\ from\ the\ library stats\:show\ statistics\ about\ the\ library\ or\ a\ query version\:output\ version\ information modify\:change\ metadata\ fields move\:move\ or\ copy\ items write\:write\ tag\ information\ to\ files config\:show\ or\ edit\ the\ user\ configuration migrate\:convert\ legacy\ config))')
# Subcommands
_regex_words subcmds "subcommands" "$fieldscmd" "$importcmd" "$listcmd" "$updatecmd" "$removecmd" "$statscmd" \
"$versioncmd" "$modifycmd" "$movecmd" "$writecmd" "$configcmd" "$migratecmd" "$helpcmd"
subcmds=("$reply[@]")
# Create main completion function
_regex_arguments _beet_cmds "$matchany" \( "${globalopts[@]}" \# \) "${subcmds[@]}"
# Set tag-order - complete options separately from arguments
zstyle ":completion:${curcontext}:" tag-order '! options'
# Execute the completion function
_beet_cmds "$@"
# Local Variables:
# mode:shell-script
# End: