LINUX.ORG.RU
ФорумTalks

[bash][audacious]Автодополнение для audtool.

 ,


0

0

От скуки решил разобраться с работой автодополнения в bash. Вот реализация автодополнения для audtool — утилиты для управления Audacious. Дополняются все команды для версии 1.5.1, дополняются номера треков (не для всех команд получилось), поля для команд, выдающих метаданные, дополняются даже пути с пробелами (спасибо костылю _filedir в bash-completion.

_audtool() {
    local cur prev opts pl pq
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="current-song current-song-filename current-song-length
	current-song-length-seconds current-song-length-frames
	current-song-output-length current-song-output-length-seconds
	current-song-output-length-frames current-song-bitrate
	current-song-bitrate-kbps current-song-frequency current-song-frequency-khz
	current-song-channels current-song-tuple-data current-song-info
	playlist-advance playlist-reverse playlist-addurl playlist-insurl
	playlist-addurl-to-new-playlist playlist-delete playlist-length
	playlist-song playlist-song-filename playlist-song-length
	playlist-song-length-seconds playlist-song-length-frames playlist-display
	playlist-position playlist-jump playlist-clear playlist-repeat-status
	playlist-repeat-toggle playlist-shuffle-status playlist-shuffle-toggle
	playlist-tuple-data playqueue-add playqueue-remove playqueue-is-queued
	playqueue-get-queue-position playqueue-get-list-position playqueue-length
	playqueue-display playqueue-clear playback-play playback-pause
	playback-playpause playback-stop playback-playing playback-paused
	playback-stopped playback-status playback-seek playback-seek-relative
	get-volume set-volume equalizer-activate equalizer-get equalizer-set
	equalizer-get-preamp equalizer-set-preamp equalizer-get-band
	equalizer-set-band mainwin-show playlist-show equalizer-show
	filebrowser-show jumptofile-show preferences-show about-show activate
	always-on-top get-skin set-skin version shutdown list-handlers help"
	td="artist album title track_number year date genre comment file_name
	file_ext file_path length formatter custom mtime"
	pl=$(seq -s ' ' $(audtool playlist-length))
	pq=$(seq -s ' ' $(audtool playqueue-length))

    if [[ ${COMP_CWORD} -eq 1 ]]; then    
    	COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
		return 0
	fi
	case ${prev} in
		playlist-addurl|playlist-addurl-to-new-playlist|playlist-insurl|\
		set-skin)
			_filedir
		;;
		playlist-delete|playlist-song|playlist-song-filename|\
		playlist-song-length|playlist-song-length-seconds|\
		playlist-song-length-frames|playqueue-add|playqueue-remove|\
		playqueue-get-queue-position|playlist-jump)
			COMPREPLY=( $(compgen -W "${pl}" -- ${cur}) )
		;;
		playqueue-get-list-position)
			COMPREPLY=( $(compgen -W "${pq}" -- ${cur}) )
		;;
		current-song-tuple-data|playlist-tuple-data)
			COMPREPLY=( $(compgen -W "${td}" -- ${cur}) )
		;;
		*)
			COMPREPLY=()
		;;
	esac
}
complete -o filenames -F _audtool audtool
★★★★★

Последнее исправление: GotF (всего исправлений: 1)
Ответ на: комментарий от Igron

Quote:

На ланчпад/трекер проекта.

1) Лень разбираться, что и куда.

2) Это для уже устаревшей ветки 1.5, ибо 2.х у меня нет, и пока не допилят, не будет.

GotF ★★★★★
() автор топика
Ответ на: комментарий от Igron

Quote:

Будь мужчиной, доделывай дела до конца.

Ну нельзя так аргументировать :-) Отправил поделку на досмотр разработчикам bash-completion.

GotF ★★★★★
() автор топика
Ответ на: комментарий от GotF

> Ну нельзя так аргументировать :-)

Тем не менее это сработало, не так ли? ;-)

Отправил поделку на досмотр разработчикам bash-completion.


Другой разговор. Жму виртуальную руку.

Igron ★★★★★
()

Fixed.

Пофиксил недостатки: при добавлении файлов работает фильтр, для скина можно выбрать только каталог, номера треков добавляются везде, если ничего не забыл.

_audtool() {
    local cur prev opts pl pq
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="current-song current-song-filename current-song-length
	current-song-length-seconds current-song-length-frames
	current-song-output-length current-song-output-length-seconds
	current-song-output-length-frames current-song-bitrate
	current-song-bitrate-kbps current-song-frequency current-song-frequency-khz
	current-song-channels current-song-tuple-data current-song-info
	playlist-advance playlist-reverse playlist-addurl playlist-insurl
	playlist-addurl-to-new-playlist playlist-delete playlist-length
	playlist-song playlist-song-filename playlist-song-length
	playlist-song-length-seconds playlist-song-length-frames playlist-display
	playlist-position playlist-jump playlist-clear playlist-repeat-status
	playlist-repeat-toggle playlist-shuffle-status playlist-shuffle-toggle
	playlist-tuple-data playqueue-add playqueue-remove playqueue-is-queued
	playqueue-get-queue-position playqueue-get-list-position playqueue-length
	playqueue-display playqueue-clear playback-play playback-pause
	playback-playpause playback-stop playback-playing playback-paused
	playback-stopped playback-status playback-seek playback-seek-relative
	get-volume set-volume equalizer-activate equalizer-get equalizer-set
	equalizer-get-preamp equalizer-set-preamp equalizer-get-band
	equalizer-set-band mainwin-show playlist-show equalizer-show
	filebrowser-show jumptofile-show preferences-show about-show activate
	always-on-top get-skin set-skin version shutdown list-handlers help"
	td="artist album title track_number year date genre comment file_name
	file_ext file_path length formatter custom mtime"
	pl=$(seq -s ' ' $(audtool playlist-length))
	pq=$(seq -s ' ' $(audtool playqueue-length))

    if [[ ${COMP_CWORD} -eq 1 ]]; then    
    	COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
		return 0
	fi
	case ${prev} in
		playlist-addurl|playlist-addurl-to-new-playlist)
			_filedir '@(mp3|MP3|mpg|MPG|ogg|OGG|w?(a)v|W?(A)V|mid|MID|flac|FLAC|mka|MKA)'
		;;
		playlist-delete|playlist-song|playlist-song-filename|\
		playlist-song-length|playlist-song-length-seconds|\
		playlist-song-length-frames|playqueue-add|playqueue-remove|\
		playqueue-get-queue-position|playlist-jump)
			COMPREPLY=( $(compgen -W "${pl}" -- ${cur}) )
		;;
		playqueue-get-list-position)
			COMPREPLY=( $(compgen -W "${pq}" -- ${cur}) )
		;;
		current-song-tuple-data|playlist-tuple-data)
			COMPREPLY=( $(compgen -W "${td}" -- ${cur}) )
		;;
		playlist-insurl)
			_filedir '@(mp3|MP3|mpg|MPG|ogg|OGG|w?(a)v|W?(A)V|mid|MID|flac|FLAC|mka|MKA)'
		;;
		*mp3|*MP3|*flac|*FLAC|*ogg|*OGG|*wv|*WV|*wav|*WAV|*mid|*MID|*mka|*MKA)
			COMPREPLY=( $(compgen -W "${pl}" -- ${cur}) )
		;;
		artist|album|title|track_number|year|date|genre|comment|file_name|\
		file_ext|file_path|length|formatter|custom|mtime)
			COMPREPLY=( $(compgen -W "${pl}" -- ${cur}) )
		;;
		set-skin)
			_filedir -d
		;;
	esac
}
complete -o filenames -F _audtool audtool

# vim: set ft=sh:

З.Ы.: фильтр для файлов сильно ограничен, ибо взят от mplayer'а, а у меня кроме flac, wav и mp3 ничего нет.

GotF ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.