zsh-completion: Add support for remote servers.

This patch adds support for completion of remote PulseAudio server
arguments it also suppresses error messages when unable to connect to
PulseAudio (only for the completion function).
This commit is contained in:
poljar (Damir Jelić) 2013-03-17 22:06:39 +01:00 committed by Tanu Kaskinen
parent f5f77a90cf
commit 993e756e13

View file

@ -2,7 +2,7 @@
_devices() { _devices() {
local -a _device_list local -a _device_list
local cmd _device _device_description local cmd _device _device_description _remote_cmd
if [[ $service == pactl || $service == pacmd ]]; then if [[ $service == pactl || $service == pacmd ]]; then
case $words[$((CURRENT - 1))] in case $words[$((CURRENT - 1))] in
@ -38,8 +38,15 @@ _devices() {
cmd=('sources') cmd=('sources')
fi fi
for (( i = 0; i < ${#words[@]}; i++ )) do
if [[ ${words[$i]} == -s ]]; then
_remote_cmd="-s ${words[$i+1]}"
break;
fi
done
for target in $cmd; do for target in $cmd; do
for device_info in ${(ps:\n\n:)"$(_call_program card_tag "pactl list $target")"}; do for device_info in ${(ps:\n\n:)"$(_call_program device_tag "pactl $_remote_cmd list $target 2> /dev/null")"}; do
for line in ${(f)device_info}; do for line in ${(f)device_info}; do
if [[ $target == (sink-inputs|source-outputs) ]]; then if [[ $target == (sink-inputs|source-outputs) ]]; then
if [[ $line == (Sink*Input|Source*Output)* ]]; then if [[ $line == (Sink*Input|Source*Output)* ]]; then
@ -74,11 +81,18 @@ _devices() {
_profiles() { _profiles() {
local -a _profile_list local -a _profile_list
local _current_card _raw_profiles _profile_name _profile_description local _current_card _raw_profiles _profile_name _profile_description _remote_cmd
_current_card=$words[$((CURRENT - 1))] _current_card=$words[$((CURRENT - 1))]
for card in ${(ps:\n\n:)"$(_call_program card_tag "pactl list cards")"}; do for (( i = 0; i < ${#words[@]}; i++ )) do
if [[ ${words[$i]} == -s ]]; then
_remote_cmd="-s ${words[$i+1]}"
break;
fi
done
for card in ${(ps:\n\n:)"$(_call_program profiles_tag "pactl $_remote_cmd list cards 2> /dev/null")"}; do
if [[ $card == *$_current_card* ]]; then if [[ $card == *$_current_card* ]]; then
_raw_profiles=${card##*Profiles:} _raw_profiles=${card##*Profiles:}
_raw_profiles=${_raw_profiles%%Active Profile:*} _raw_profiles=${_raw_profiles%%Active Profile:*}
@ -99,7 +113,7 @@ _profiles() {
_ports() { _ports() {
local -a _port_list local -a _port_list
local _raw_ports _port_name _port_description _current_device local _raw_ports _port_name _port_description _current_device _remote_cmd
case $words[$((CURRENT - 2))] in case $words[$((CURRENT - 2))] in
set-sink-port) cmd="sinks";; set-sink-port) cmd="sinks";;
@ -109,7 +123,14 @@ _ports() {
_current_device=$words[$((CURRENT - 1))] _current_device=$words[$((CURRENT - 1))]
for device in ${(ps:\n\n:)"$(_call_program card_tag "pactl list $cmd")"}; do for (( i = 0; i < ${#words[@]}; i++ )) do
if [[ ${words[$i]} == -s ]]; then
_remote_cmd="-s ${words[$i+1]}"
break;
fi
done
for device in ${(ps:\n\n:)"$(_call_program port_tag "pactl $_remote_cmd list $cmd 2> /dev/null")"}; do
if [[ $device == *Ports:* && $device == *$_current_device* ]]; then if [[ $device == *Ports:* && $device == *$_current_device* ]]; then
_raw_ports=${device##*Ports:} _raw_ports=${device##*Ports:}
_raw_ports=${_raw_ports%%Active Port:*} _raw_ports=${_raw_ports%%Active Port:*}
@ -130,8 +151,16 @@ _ports() {
_cards(){ _cards(){
local -a _card_list local -a _card_list
local _card _cad_name local _card _cad_name _remote_cmd
for card_info in ${(ps:\n\n:)"$(_call_program card_tag "pactl list cards")"}; do
for (( i = 0; i < ${#words[@]}; i++ )) do
if [[ ${words[$i]} == -s ]]; then
_remote_cmd="-s ${words[$i+1]}"
break;
fi
done
for card_info in ${(ps:\n\n:)"$(_call_program card_tag "pactl $_remote_cmd list cards 2> /dev/null")"}; do
for line in ${(f)card_info}; do for line in ${(f)card_info}; do
if [[ $line == *Name:* ]]; then if [[ $line == *Name:* ]]; then
_card=${line#*: } _card=${line#*: }
@ -148,15 +177,23 @@ _cards(){
_all_modules(){ _all_modules(){
local -a _all_modules_list local -a _all_modules_list
for module in ${(f)"$(_call_program modules_tag "pulseaudio --dump-modules")"}; do for module in ${(f)"$(_call_program modules_tag "pulseaudio --dump-modules 2> /dev/null")"}; do
_all_modules_list+=${module%% *} _all_modules_list+=${module%% *}
done done
_describe 'module list' _all_modules_list _describe 'module list' _all_modules_list
} }
_loaded_modules(){ _loaded_modules(){
local -a _loaded_modules_list local -a _loaded_modules_list _remote_cmd
for module in ${(f)"$(_call_program modules_tag "pactl list modules short")"}; do
for (( i = 0; i < ${#words[@]}; i++ )) do
if [[ ${words[$i]} == -s ]]; then
_remote_cmd="-s ${words[$i+1]}"
break;
fi
done
for module in ${(f)"$(_call_program modules_tag "pactl $_remote_cmd list modules short 2> /dev/null")"}; do
_loaded_modules_list+=(${${(ps:\t:)module}[1]}:${${(ps:\t:)module}[2]}) _loaded_modules_list+=(${${(ps:\t:)module}[1]}:${${(ps:\t:)module}[2]})
done done
_describe 'module list' _loaded_modules_list _describe 'module list' _loaded_modules_list
@ -164,7 +201,7 @@ _loaded_modules(){
_resample_methods() { _resample_methods() {
local -a _resample_method_list local -a _resample_method_list
for method in ${(f)"$(_call_program modules_tag "pulseaudio --dump-resample-methods")"}; do for method in ${(f)"$(_call_program modules_tag "pulseaudio --dump-resample-methods 2> /dev/null")"}; do
_resample_method_list+=$method _resample_method_list+=$method
done done
_describe 'resample method list' _resample_method_list _describe 'resample method list' _resample_method_list
@ -172,8 +209,16 @@ _resample_methods() {
_clients() { _clients() {
local -a _client_list local -a _client_list
local _client _client_description local _client _client_description _remote_cmd
for client_info in ${(ps:\n\n:)"$(_call_program card_tag "pactl list clients")"}; do
for (( i = 0; i < ${#words[@]}; i++ )) do
if [[ ${words[$i]} == -s ]]; then
_remote_cmd="-s ${words[$i+1]}"
break;
fi
done
for client_info in ${(ps:\n\n:)"$(_call_program clients_tag "pactl $_remote_cmd list clients 2> /dev/null")"}; do
for line in ${(f)client_info}; do for line in ${(f)client_info}; do
if [[ $line == Client[[:space:]]#* ]]; then if [[ $line == Client[[:space:]]#* ]]; then
_client=${line#*\#} _client=${line#*\#}
@ -188,7 +233,7 @@ _clients() {
_pacat_file_formats() { _pacat_file_formats() {
local -a _file_format_list local -a _file_format_list
for format in ${(f)"$(_call_program modules_tag "pacat --list-file-formats")"}; do for format in ${(f)"$(_call_program fformats_tag "pacat --list-file-formats")"}; do
_file_format_list+=(${${(ps:\t:)format}[1]}:${${(ps:\t:)format}[2]}) _file_format_list+=(${${(ps:\t:)format}[1]}:${${(ps:\t:)format}[2]})
done done
_describe 'file format list' _file_format_list _describe 'file format list' _file_format_list