diff options
Diffstat (limited to '')
-rw-r--r-- | completions/screen | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/completions/screen b/completions/screen new file mode 100644 index 0000000..651ca2c --- /dev/null +++ b/completions/screen @@ -0,0 +1,123 @@ +# 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 |