about summary refs log tree commit diff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Unix/Command/.distfiles4
-rw-r--r--Completion/Unix/Command/_mpc232
2 files changed, 234 insertions, 2 deletions
diff --git a/Completion/Unix/Command/.distfiles b/Completion/Unix/Command/.distfiles
index 87ad2c18e..bb30d0e94 100644
--- a/Completion/Unix/Command/.distfiles
+++ b/Completion/Unix/Command/.distfiles
@@ -17,8 +17,8 @@ _ispell         _java           _joe            _killall
 _last           _less           _links          _loadkeys       _look           
 _lp             _ls             _lsof           _lynx           _lzop           
 _mail           _make           _man            _mencal         _mh             
-_mount          _mt             _mtools         _mtr            _mutt           
-_mysql_utils    _mysqldiff      
+_mount          _mpc            _mt             _mtools         _mtr
+_mutt           _mysql_utils    _mysqldiff      
 _ncftp          _netcat         _nice           _nmap           _nslookup       
 _pack           _patch          _pbm            _perforce       _perl           
 _perldoc        _php            _pine           _postfix        _prcs           
diff --git a/Completion/Unix/Command/_mpc b/Completion/Unix/Command/_mpc
new file mode 100644
index 000000000..320ce4b3a
--- /dev/null
+++ b/Completion/Unix/Command/_mpc
@@ -0,0 +1,232 @@
+#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:"add a song to the current playlist"
+    del:"remove a song from the current playlist"
+    play:"start playing"
+    next:"play the next song in the current playlist"
+    prev:"play the previous song in the current playlist"
+    pause:"pause the currently playing song"
+    stop:"stop the currently playing playlists"
+    seek:"seek to the position specified in percent"
+    clear:"clear the current playlist"
+    shuffle:"shuffle the current playlist"
+    move:"move song in playlist"
+    playlist:"print the current playlist"
+    listall:"list all songs in the music directory"
+    ls:"list the contents of specified directory"
+    lsplaylists:"list currently available playlists"
+    load:"load file as a playlist"
+    save:"save a playlist to file"
+    rm:"remove a playlist"
+    volume:"set volume"
+    repeat:"toggle repeat mode, or specify state"
+    random:"toggle random mode, or specify state"
+    search:"search for a song"
+    crossfade:"set and display crossfade settings"
+    update:"scan music directory for updates"
+    version:"report version of MPD"
+  )
+
+  if (( CURRENT == 1 )); then
+    _describe -t command "mpc commands" mpc_cmds
+  else
+    local curcontext="$curcontext"
+  fi
+
+  local cmd=$words[1]
+
+  local curcontext="${curcontext%:*}:mpc-${cmd}"
+  _call_function ret _mpc_$cmd
+}
+
+_mpc_helper_bool() {
+  local expl states
+  states=(on off yes no 1 0 true false)
+  _wanted states expl boolean compadd $expl -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 2>/dev/null)}")
+  out=("${(@M)out[@]:#${~MATCH}}")
+
+  sn=("${(@)${(@M)out}//(#b)(#s)\#([0-9]#)*/$match[1]}")
+  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
+}
+
+_mpc_add() {
+  _mpc_helper_files
+}
+
+_mpc_del() {
+  _mpc_helper_songnumbers
+}
+
+_mpc_play() {
+  _mpc_helper_songnumbers
+}
+
+_mpc_seek() {
+  _message "floating point percent value"
+}
+
+_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_search() {
+  local list expl
+  list=(album artist title filename)
+
+  if [[ $#words -eq 2 ]]; then
+    _wanted list expl table compadd $expl -a list
+  else
+    _message "pattern"
+  fi
+}
+
+_mpc_update() {
+  _mpc_helper_files
+}
+
+_arguments \
+  '--format:format string' \
+  '*::mpc command:_mpc_command'