mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 18:10:56 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			279 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #compdef mpc
 | |
| 
 | |
| local OUT foo MPD_MUSIC_DIR MPC_PLAYLIST_MATCHER MPC_FORMAT_STRING
 | |
| 
 | |
| # set this style to whatever --format string you want to use when
 | |
| # constructing the list of playlist entries
 | |
| zstyle -s ":completion:${curcontext}:*" mpc-format-string MPC_FORMAT_STRING
 | |
| foo=(--format "${(q)MPC_FORMAT_STRING:-%file%}")
 | |
| 
 | |
| # set this style to the music_directory of mpd to get _files based completion
 | |
| # for commands like "add"
 | |
| zstyle -s ":completion:${curcontext}:" mpd-music-directory MPD_MUSIC_DIR
 | |
| 
 | |
| # matcher used for playlist completion
 | |
| zstyle -s ":completion:${curcontext}:" mpd-playlist-matcher \
 | |
|   MPC_PLAYLIST_MATCHER
 | |
| : ${MPC_PLAYLIST_MATCHER:='m:{a-z}={A-Z} l:|=**'}
 | |
| 
 | |
| # this one is used to configure the behaviour of _mpc_helper_songnumbers,
 | |
| # see _pids for the original
 | |
| zstyle -s ":completion:${curcontext}:song-numbers" insert-song-numbers \
 | |
|   OUT || OUT=single
 | |
| 
 | |
| _mpc_command() {
 | |
|   local mpc_cmds
 | |
| 
 | |
|   mpc_cmds=(
 | |
|     add:"append a song to the end of the current playlist"
 | |
|     clear:"clear the current playlist"
 | |
|     crop:"remove all songs except for the currently playing song"
 | |
|     current:"show the currently playing song"
 | |
|     crossfade:"set and display crossfade settings"
 | |
|     del:"remove a song from the current playlist"
 | |
|     disable:"disable a output"
 | |
|     enable:"enable a output"
 | |
|     idle:"wait until an event occurs"
 | |
|     idleloop:"loop waiting for events"
 | |
|     insert:"insert a song after the currently playing song in the playlist"
 | |
|     listall:"list all songs in the music directory"
 | |
|     load:"load file as a playlist"
 | |
|     ls:"list the contents of specified directory"
 | |
|     lsplaylists:"list currently available playlists"
 | |
|     move:"move song in playlist"
 | |
|     next:"play the next song in the current playlist"
 | |
|     outputs:"show the current outputs"
 | |
|     pause:"pause the currently playing song"
 | |
|     play:"start playing"
 | |
|     playlist:"print the current playlist"
 | |
|     prev:"play the previous song in the current playlist"
 | |
|     random:"toggle random mode, or specify state"
 | |
|     repeat:"toggle repeat mode, or specify state"
 | |
|     single:"toggle single mode, or specify state"
 | |
|     consume:"toggle consume mode, or specify state"
 | |
|     rm:"remove a playlist"
 | |
|     save:"save a playlist to file"
 | |
|     search:"search for a song"
 | |
|     find:"search for a song, exact match"
 | |
|     list:"list all tags of given type"
 | |
|     seek:"seek to the position specified in percent"
 | |
|     shuffle:"shuffle the current playlist"
 | |
|     stats:"display statistics about MPD"
 | |
|     stop:"stop the currently playing playlists"
 | |
|     toggle:"toggles Play/Pause, plays if stopped"
 | |
|     update:"scan music directory for updates"
 | |
|     version:"report version of MPD"
 | |
|     volume:"set volume"
 | |
|     status:"display MPD status"
 | |
|   )
 | |
| 
 | |
|   if (( CURRENT == 1 )); then
 | |
|     _describe -t commands "mpc command" mpc_cmds
 | |
|   else
 | |
|     local cmd=$words[1]
 | |
|     local curcontext="${curcontext%:*}:mpc-${cmd}" ret=1
 | |
|     if ! _call_function ret _mpc_$cmd; then
 | |
|       _default && ret=0
 | |
|     fi
 | |
|     return ret
 | |
|   fi
 | |
| }
 | |
| 
 | |
| _mpc_helper_bool() {
 | |
|   local expl states
 | |
|   states=(on off yes no 1 0 true false)
 | |
|   _wanted states expl boolean compadd -a states
 | |
| }
 | |
| 
 | |
| (( $+functions[_mpc_helper_songnumbers] )) ||
 | |
| _mpc_helper_songnumbers() {
 | |
|   local out sn list expl MATCH desc all NM ret=1
 | |
| 
 | |
|   _tags song-numbers || return 1
 | |
| 
 | |
|   if [[ "$PREFIX" = [0-9]# ]]; then
 | |
|     all=()
 | |
|     MATCH="*${(Q)PREFIX}[0-9]#*"
 | |
|   else
 | |
|     all=(-U)
 | |
|     MATCH="(#i)*${(Q)PREFIX}*"
 | |
|     NM="$compstate[nmatches]"
 | |
|   fi
 | |
| 
 | |
|   out=("${(@f)$(_call_program song-numbers mpc $foo playlist)}")
 | |
|   out=("${(@M)out[@]:#${~MATCH}}")
 | |
| 
 | |
|   sn=("${(@)${(@M)out}//(#b)(#s)(\#|[ >]#)([0-9]#)*/$match[2]}")
 | |
|   list=("${(@Mr:COLUMNS-1:)out}")
 | |
| 
 | |
|   _wanted -V 'song numbers' expl 'song number' \
 | |
|       compadd "$@" -ld list "$all[@]" -a sn && ret=0
 | |
| 
 | |
|   if [[ -n "$all" ]]; then
 | |
|     case "$OUT" in
 | |
|       menu)
 | |
|         compstate[insert]=menu
 | |
|         ;;
 | |
|       single)
 | |
|         [[ $compstate[nmatches] -ne NM+1 ]] &&
 | |
|         compstate[insert]=
 | |
|         ;;
 | |
|       *)
 | |
|         [[ ${#:-$PREFIX} -gt ${#compstate[unambiguous]} ]] &&
 | |
|         compstate[insert]=menu
 | |
|         ;;
 | |
|     esac
 | |
|   fi
 | |
| 
 | |
|   return ret
 | |
| }
 | |
| 
 | |
| (( $+functions[_mpc_helper_playlists] )) ||
 | |
| _mpc_helper_playlists() {
 | |
|   local list expl
 | |
|   list=($(mpc lsplaylists))
 | |
|   _wanted list expl playlist compadd -M $MPC_PLAYLIST_MATCHER $expl -a list
 | |
| }
 | |
| 
 | |
| (( $+functions[_mpc_helper_files] )) ||
 | |
| _mpc_helper_files() {
 | |
|   if [[ -n $MPD_MUSIC_DIR ]]; then
 | |
|     _files -W $MPD_MUSIC_DIR
 | |
|     return
 | |
|   fi
 | |
| 
 | |
|   local -U list expl
 | |
|   if [[ $words[CURRENT] != */* ]]; then
 | |
|     list=( ${${(f)"$(mpc listall)"}%%/*})
 | |
|     _wanted files expl file compadd -qS/ -a list
 | |
|   else
 | |
|     list=(${(f)"$(mpc tab $words[CURRENT])"})
 | |
|     _wanted files expl file _multi_parts / list
 | |
|   fi
 | |
| }
 | |
| 
 | |
| (( $+functions[_mpc_helper_directories] )) ||
 | |
| _mpc_helper_directories() {
 | |
|   if [[ -n $MPD_MUSIC_DIR ]]; then
 | |
|     _files -/ -W $MPD_MUSIC_DIR
 | |
|     return
 | |
|   fi
 | |
| 
 | |
|   local -U list expl
 | |
|   if [[ $words[CURRENT] != */* ]]; then
 | |
|     list=( ${${(M)${(f)"$(mpc listall)"}:#*/*}%%/*})
 | |
|     _wanted directories expl directory compadd -qS/ -a list
 | |
|   else
 | |
|     list=(${(f)"$(mpc lstab $words[CURRENT])"})
 | |
|     _wanted directories expl directory _multi_parts / list
 | |
|   fi
 | |
| }
 | |
| 
 | |
| (( $+functions[_mpc_helper_outputs] )) ||
 | |
| _mpc_helper_outputs() {
 | |
|   local vals outline
 | |
|   vals=(${${${${(M)${(f)"$(mpc outputs 2> /dev/null)"}:#Output * \(*\) is (en|dis)abled}##Output }%%\) is (en|dis)abled}/ \(/:})
 | |
|   _describe -t outputs output vals
 | |
| }
 | |
| 
 | |
| _mpc_add() {
 | |
|   _mpc_helper_files
 | |
| }
 | |
| 
 | |
| _mpc_del() {
 | |
|   _mpc_helper_songnumbers
 | |
| }
 | |
| 
 | |
| _mpc_play() {
 | |
|   _mpc_helper_songnumbers
 | |
| }
 | |
| 
 | |
| _mpc_seek() {
 | |
|   _message "floating point percent value"
 | |
| }
 | |
| 
 | |
| _mpc_enable() {
 | |
|   _mpc_helper_outputs
 | |
| }
 | |
| 
 | |
| _mpc_disable() {
 | |
|   _mpc_helper_outputs
 | |
| }
 | |
| 
 | |
| _mpc_move() {
 | |
|   if (( $#words <= 3 )); then
 | |
|     _mpc_helper_songnumbers
 | |
|   else
 | |
|     _message "nothing"
 | |
|   fi
 | |
| }
 | |
| 
 | |
| _mpc_listall() {
 | |
|   _mpc_helper_files
 | |
| }
 | |
| 
 | |
| _mpc_ls() {
 | |
|   _mpc_helper_directories
 | |
| }
 | |
| 
 | |
| _mpc_load() {
 | |
|   _mpc_helper_playlists
 | |
| }
 | |
| 
 | |
| _mpc_save() {
 | |
|   _mpc_helper_playlists
 | |
| }
 | |
| 
 | |
| _mpc_rm() {
 | |
|   _mpc_helper_playlists
 | |
| }
 | |
| 
 | |
| _mpc_volume() {
 | |
|   local expl
 | |
|   compset -P '[-+]'
 | |
|   _wanted list expl volume compadd $expl - {0..100}
 | |
| }
 | |
| 
 | |
| _mpc_repeat() {
 | |
|   _mpc_helper_bool
 | |
| }
 | |
| 
 | |
| _mpc_random() {
 | |
|   _mpc_helper_bool
 | |
| }
 | |
| 
 | |
| _mpc_single() {
 | |
|   _mpc_helper_bool
 | |
| }
 | |
| 
 | |
| _mpc_consume() {
 | |
|   _mpc_helper_bool
 | |
| }
 | |
| 
 | |
| _mpc_search() {
 | |
|   local list expl
 | |
|   list=(album artist title track name genre date composer performer comment disc filename any)
 | |
| 
 | |
|   if ! (( $#words % 2 )); then
 | |
|     _wanted list expl table compadd $expl -a list
 | |
|   else
 | |
|     _message "pattern"
 | |
|   fi
 | |
| }
 | |
| 
 | |
| _mpc_find() {
 | |
|   _mpc_search "$@"
 | |
| }
 | |
| 
 | |
| _mpc_list() {
 | |
|   _mpc_search "$@"
 | |
| }
 | |
| 
 | |
| _mpc_update() {
 | |
|   _mpc_helper_files
 | |
| }
 | |
| 
 | |
| _arguments \
 | |
|   '--format[specify the format of song display]:format string' \
 | |
|   '--no-status[prevent printing song status on completion]' \
 | |
|   '*::mpc command:_mpc_command'
 |