summaryrefslogtreecommitdiffstats
path: root/completions/screen
blob: ab4b7dd0fcb0c7050145281a52b483b21466c4e7 (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 -*-

_comp_cmd_screen__sessions()
{
    local -a sessions
    _comp_split sessions "$(command screen -ls | command sed -ne \
        's|^\t\{1,\}\([0-9]\{1,\}\.[^\t]\{1,\}\).*'"$1"'.*$|\1|p')" || return
    if [[ $cur == +([0-9])?(.*) ]]; then
        # Complete sessions including pid prefixes
        _comp_compgen -- -W '"${sessions[@]}"'
    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
        _comp_compgen -- -W '$tmp'
    fi
} &&
    _comp_cmd_screen()
    {
        local cur prev words cword comp_args
        _comp_initialize -- "$@" || return

        if ((cword == 1)); then
            if [[ $cur == /dev* ]]; then
                _comp_expand_glob COMPREPLY '/dev/serial/*/* /dev/ttyUSB* /dev/ttyACM*' &&
                    _comp_compgen -- -W '"${COMPREPLY[@]}"'
                return
            fi
            if [[ $cur == //* ]]; then
                _comp_compgen -- -W '//telnet'
                return
            fi
        fi

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

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

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

            _comp_command_offset $i
            return
        done

        case $prev in
            -*[rR])
                # list detached
                _comp_cmd_screen__sessions 'Detached'
                return
                ;;
            -*[dD])
                # list attached
                _comp_cmd_screen__sessions 'Attached'
                return
                ;;
            -*x)
                # list both
                _comp_cmd_screen__sessions
                return
                ;;
            -*s)
                _comp_compgen_shells
                return
                ;;
            -*c)
                _comp_compgen_filedir
                return
                ;;
            -T)
                _comp_compgen_terms
                return
                ;;
            -*[ehpSt])
                return
                ;;
        esac

        if [[ $cur == -* ]]; then
            _comp_compgen_help
        fi
    } &&
        complete -F _comp_cmd_screen screen

# ex: filetype=sh