# bash completion for screen -*- shell-script -*- proc _screen_sessions { local sessions=( $( command screen -ls | sed -ne \ 's|^\t\{1,\}\([0-9]\{1,\}\.[^\t]\{1,\}\).*'"$1"'.*$|\1|p' ) ) if [[ $cur == +([0-9])?(.*) ]] { # Complete sessions including pid prefixes setglobal COMPREPLY = ''( $( compgen -W '${sessions[@]}' -- "$cur" ) ) } else { # Create unique completions, dropping pids where possible local -A res local i tmp for i in [$(sessions[@])] { compat array-assign res '${i/#+([0-9])./}' "" $i"" } for i in [$(!res[@])] { [[ ${res[$i]} == \ *\ * ]] && setglobal tmp = "" $(res[$i])"" || setglobal tmp = "" $i"" } setglobal COMPREPLY = ''( $( compgen -W '$tmp' -- "$cur" ) ) } } && proc _screen { local cur prev words cword _init_completion || return if sh-expr 'cword > 2' { match $(words[cword-2]) { with -[dD] _screen_sessions return 0 } } local i for (( i=1; i <= cword; i++ )); do case ${words[i]} in -r|-R|-d|-D|-x|-s|-c|-T|-e|-h|-p|-S|-t) (( i++ )) continue ;; -*) continue ;; esac _command_offset $i return done match $prev { with -[rR] # list detached _screen_sessions 'Detached' return 0 with -[dD] # list attached _screen_sessions 'Attached' return 0 with -x # list both _screen_sessions return 0 with -s _shells return 0 with -c _filedir return 0 with -T _terms return 0 with -e|-h|-p|-S|-t return 0 } if [[ "$cur" == -* ]] { setglobal COMPREPLY = ''( $( compgen -W '-a -A -c -d -D -e -f -fn -fa -h -i -ln -list -L -m -O -p -q -r -R -s -S -t -T -U -v -wipe -x -X --help --version' -- "$cur" ) ) } } && complete -F _screen screen # ex: ts=4 sw=4 et filetype=sh