summaryrefslogtreecommitdiff
path: root/completions/screen
blob: 17642863d46cffc52a1086c140ead3fe0f716686 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# bash completion for screen                               -*- shell-script -*-

_screen_sessions()
{
    local sessions=( $(command screen -ls | command sed -ne \
        's|^\t\{1,\}\([0-9]\{1,\}\.[^\t]\{1,\}\).*'"$1"'.*$|\1|p') )
    if [[ $cur == +([0-9])?(.*) ]]; then
        # Complete sessions including pid prefixes
        COMPREPLY=( $(compgen -W '${sessions[@]}' -- "$cur") )
    else
        # Create unique completions, dropping pids where possible
        local -A res
        local i tmp
        for i in "${sessions[@]}"; do
            res[${i/#+([0-9])./}]+=" $i"
        done
        for i in "${!res[@]}"; do
            [[ ${res[$i]} == \ *\ * ]] && tmp+=" ${res[$i]}" || tmp+=" $i"
        done
        COMPREPLY=( $(compgen -W '$tmp' -- "$cur") )
    fi
} &&
_screen()
{
    local cur prev words cword
    _init_completion || return

    if ((cword == 1)); then
        if [[ $cur == /dev* ]]; then
            COMPREPLY=( $(compgen -W "$(shopt -s nullglob; printf '%s\n' \
                /dev/serial/by-id/* /dev/ttyUSB* /dev/ttyACM* 2>/dev/null)" \
                -- "$cur") )
            return
        fi
        if [[ $cur == //* ]]; then
            COMPREPLY=( $(compgen -W '//telnet' -- "$cur") )
            return
        fi
    fi

    case ${words[1]} in
        /dev*)
            if ((cword == 2)); then
                COMPREPLY=( $(compgen -W '110 300 600 1200 2400 4800 9600 \
                14400 19200 38400 57600 115200 128000 256000' -- "$cur") )
                # TODO more, comma separated options
            fi
            return
            ;;
        //telnet)
            ((cword == 2)) && _known_hosts_real -- "$cur"
            return
            ;;
    esac

    if ((cword > 2)); then
        case ${words[cword-2]} in
            -*[dD])
                _screen_sessions
                return
                ;;
        esac
    fi

    local i
    for (( i=1; i <= cword; i++ )); do
        case ${words[i]} in
            -*[rRdDxscTehpSt])
                (( i++ ))
                continue
                ;;
            -*)
                continue
                ;;
        esac

        _command_offset $i
        return
    done

    case $prev in
        -*[rR])
            # list detached
            _screen_sessions 'Detached'
            return
            ;;
        -*[dD])
            # list attached
            _screen_sessions 'Attached'
            return
            ;;
        -*x)
            # list both
            _screen_sessions
            return
            ;;
        -*s)
            _shells
            return
            ;;
        -*c)
            _filedir
            return
            ;;
        -T)
            _terms
            return
            ;;
        -*[ehpSt])
            return
            ;;
    esac

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $(compgen -W '$(_parse_help "$1")' -- "$cur") )
    fi
} &&
complete -F _screen screen

# ex: filetype=sh