aboutsummaryrefslogtreecommitdiff
path: root/bash/bashrc.d/completion.bash
blob: 5161a0bf5a3cd56d86d28a006f1b3ae5d7ce6ac9 (plain) (blame)
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Simple completions for Bash builtins and POSIX utilities; more specific or
# complex stuff goes in ~/.bash_completion.d, for possible dynamic loading

# If COMP_WORDBREAKS has a value, strip all colons from it; this allows
# completing filenames correctly, since a colon is not a shell metacharacter:
# <http://tiswww.case.edu/php/chet/bash/FAQ> (E13)
if [[ -n $COMP_WORDBREAKS ]] ; then
    COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
fi

# If ~/.hosts exists, use that as the host completion file rather than
# /etc/hosts, so I can populate the list myself
if [[ -f $HOME/.hosts ]] ; then
    HOSTFILE=$HOME/.hosts
fi

# Aliases
complete -A alias \
    'unalias'

# Bash builtins
complete -A builtin \
    'builtin'
complete -A enabled \
    'disable'
complete -A disabled \
    'enable'

# Bash options
complete -A setopt \
    'set'

# Commands
complete -A command \
    'alias' \
    'command' \
    'complete' \
    'compopt' \
    'coproc' \
    'do' \
    'exec' \
    'if' \
    'hash' \
    'then' \
    'time' \
    'type' \
    'until' \
    'while'

# Directories
complete -A directory \
    'cd' \
    'pushd' \
    'mkdir' \
    'rmdir'

# Functions and variables
complete -A function \
    'function'
complete -A function -A variable \
    'declare' \
    'export' \
    'local' \
    'readonly' \
    'typeset' \
    'unset'
complete -A variable \
    'for' \
    'getopts' \
    'let' \
    'read' \
    'select'

# Help topics
complete -A helptopic \
    'help'

# Jobspecs
complete -P '%' -A job \
    'disown' \
    'fg' \
    'jobs' \
    'kill'
complete -P '%' -A stopped \
    'bg'

# Readline bindings
complete -A binding \
    'bind'

# Shell options
complete -A shopt \
    'shopt'

# Signal names
complete -A signal \
    'trap'

# The `mapfile` builtin in Bash >= 4.0
if ((BASH_VERSINFO[0] >= 4)) ; then
    complete -A arrayvar \
        'mapfile' \
        'readarray'
fi

# If we have dynamic completion loading (Bash >= 4.0), use it
if ((BASH_VERSINFO[0] >= 4)) ; then

    # Handler tries to load appropriate completion for commands
    _completion_loader() {

        # Check completed command for validity
        case $1 in
            # Not empty
            '') return 1 ;;
            # Not starting with an underscore
            _*) return 1 ;;
        esac

        # Build expected path for the command completion
        local compspec
        compspec=$HOME/.bash_completion.d/$1.bash

        # Skip directories and nonexistent files
        [[ -e $compspec ]] || return
        ! [[ -d $compspec ]] || return

        # Try to read the file, return 124 if it worked
        if source "$compspec" ; then
            return 124
        fi
    }

    # Set completion loader to use the above function
    complete -D -F _completion_loader -o bashdefault -o default

# If not, load all of the completions up now
else
    for bash in "$HOME"/.bash_completion.d/[^_]*.bash ; do
        [[ -e $bash ]] || continue
        source "$bash"
    done
    unset -v bash
fi