From d51092a85f8bbc49d6907467f7c5f628931f5eac Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 21 Jul 2019 15:01:24 +0200 Subject: [PATCH] add better completions for homebrew --- completion/docker-compose.sh | 430 ---------- completion/docker.sh | 1562 ---------------------------------- home/.bash_aliases | 8 + home/.bash_completion | 12 +- home/.bash_env | 9 +- home/.bashrc | 2 +- packages.sh | 23 + 7 files changed, 49 insertions(+), 1997 deletions(-) delete mode 100644 completion/docker-compose.sh delete mode 100644 completion/docker.sh diff --git a/completion/docker-compose.sh b/completion/docker-compose.sh deleted file mode 100644 index fe46a33..0000000 --- a/completion/docker-compose.sh +++ /dev/null @@ -1,430 +0,0 @@ -#!bash -# -# bash completion for docker-compose -# -# This work is based on the completion for the docker command. -# -# This script provides completion of: -# - commands and their options -# - service names -# - filepaths -# -# To enable the completions either: -# - place this file in /etc/bash_completion.d -# or -# - copy this file to e.g. ~/.docker-compose-completion.sh and add the line -# below to your .bashrc after bash completion features are loaded -# . ~/.docker-compose-completion.sh - - -# For compatibility reasons, Compose and therefore its completion supports several -# stack compositon files as listed here, in descending priority. -# Support for these filenames might be dropped in some future version. -__docker_compose_compose_file() { - local file - for file in docker-compose.y{,a}ml fig.y{,a}ml ; do - [ -e $file ] && { - echo $file - return - } - done - echo docker-compose.yml -} - -# Extracts all service names from the compose file. -___docker_compose_all_services_in_compose_file() { - awk -F: '/^[a-zA-Z0-9]/{print $1}' "${compose_file:-$(__docker_compose_compose_file)}" 2>/dev/null -} - -# All services, even those without an existing container -__docker_compose_services_all() { - COMPREPLY=( $(compgen -W "$(___docker_compose_all_services_in_compose_file)" -- "$cur") ) -} - -# All services that have an entry with the given key in their compose_file section -___docker_compose_services_with_key() { - # flatten sections to one line, then filter lines containing the key and return section name. - awk '/^[a-zA-Z0-9]/{printf "\n"};{printf $0;next;}' "${compose_file:-$(__docker_compose_compose_file)}" | awk -F: -v key=": +$1:" '$0 ~ key {print $1}' -} - -# All services that are defined by a Dockerfile reference -__docker_compose_services_from_build() { - COMPREPLY=( $(compgen -W "$(___docker_compose_services_with_key build)" -- "$cur") ) -} - -# All services that are defined by an image -__docker_compose_services_from_image() { - COMPREPLY=( $(compgen -W "$(___docker_compose_services_with_key image)" -- "$cur") ) -} - -# The services for which containers have been created, optionally filtered -# by a boolean expression passed in as argument. -__docker_compose_services_with() { - local containers names - containers="$(docker-compose 2>/dev/null ${compose_file:+-f $compose_file} ${compose_project:+-p $compose_project} ps -q)" - names=( $(docker 2>/dev/null inspect --format "{{if ${1:-true}}} {{ .Name }} {{end}}" $containers) ) - names=( ${names[@]%_*} ) # strip trailing numbers - names=( ${names[@]#*_} ) # strip project name - COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") ) -} - -# The services for which at least one paused container exists -__docker_compose_services_paused() { - __docker_compose_services_with '.State.Paused' -} - -# The services for which at least one running container exists -__docker_compose_services_running() { - __docker_compose_services_with '.State.Running' -} - -# The services for which at least one stopped container exists -__docker_compose_services_stopped() { - __docker_compose_services_with 'not .State.Running' -} - - -_docker_compose_build() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --no-cache" -- "$cur" ) ) - ;; - *) - __docker_compose_services_from_build - ;; - esac -} - - -_docker_compose_docker_compose() { - case "$prev" in - --file|-f) - _filedir "y?(a)ml" - return - ;; - --project-name|-p) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help -h --verbose --version -v --file -f --project-name -p" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) ) - ;; - esac -} - - -_docker_compose_help() { - COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) ) -} - - -_docker_compose_kill() { - case "$prev" in - -s) - COMPREPLY=( $( compgen -W "SIGHUP SIGINT SIGKILL SIGUSR1 SIGUSR2" -- "$(echo $cur | tr '[:lower:]' '[:upper:]')" ) ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help -s" -- "$cur" ) ) - ;; - *) - __docker_compose_services_running - ;; - esac -} - - -_docker_compose_logs() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --no-color" -- "$cur" ) ) - ;; - *) - __docker_compose_services_all - ;; - esac -} - - -_docker_compose_migrate_to_labels() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - esac -} - - -_docker_compose_pause() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_compose_services_running - ;; - esac -} - - -_docker_compose_port() { - case "$prev" in - --protocol) - COMPREPLY=( $( compgen -W "tcp udp" -- "$cur" ) ) - return; - ;; - --index) - return; - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --index --protocol" -- "$cur" ) ) - ;; - *) - __docker_compose_services_all - ;; - esac -} - - -_docker_compose_ps() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help -q" -- "$cur" ) ) - ;; - *) - __docker_compose_services_all - ;; - esac -} - - -_docker_compose_pull() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_compose_services_from_image - ;; - esac -} - - -_docker_compose_restart() { - case "$prev" in - --timeout|-t) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --timeout -t" -- "$cur" ) ) - ;; - *) - __docker_compose_services_running - ;; - esac -} - - -_docker_compose_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help -v" -- "$cur" ) ) - ;; - *) - __docker_compose_services_stopped - ;; - esac -} - - -_docker_compose_run() { - case "$prev" in - -e) - COMPREPLY=( $( compgen -e -- "$cur" ) ) - compopt -o nospace - return - ;; - --entrypoint|--user|-u) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "-d --entrypoint -e --help --no-deps --rm --service-ports --publish -p -T --user -u" -- "$cur" ) ) - ;; - *) - __docker_compose_services_all - ;; - esac -} - - -_docker_compose_scale() { - case "$prev" in - =) - COMPREPLY=("$cur") - return - ;; - --timeout|-t) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --timeout -t" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $(compgen -S "=" -W "$(___docker_compose_all_services_in_compose_file)" -- "$cur") ) - compopt -o nospace - ;; - esac -} - - -_docker_compose_start() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_compose_services_stopped - ;; - esac -} - - -_docker_compose_stop() { - case "$prev" in - --timeout|-t) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --timeout -t" -- "$cur" ) ) - ;; - *) - __docker_compose_services_running - ;; - esac -} - - -_docker_compose_unpause() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_compose_services_paused - ;; - esac -} - - -_docker_compose_up() { - case "$prev" in - --timeout|-t) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "-d --help --no-build --no-color --no-deps --no-recreate --force-recreate --timeout -t" -- "$cur" ) ) - ;; - *) - __docker_compose_services_all - ;; - esac -} - - -_docker_compose_version() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--short" -- "$cur" ) ) - ;; - esac -} - - -_docker_compose() { - local previous_extglob_setting=$(shopt -p extglob) - shopt -s extglob - - local commands=( - build - help - kill - logs - migrate-to-labels - pause - port - ps - pull - restart - rm - run - scale - start - stop - unpause - up - version - ) - - COMPREPLY=() - local cur prev words cword - _get_comp_words_by_ref -n : cur prev words cword - - # search subcommand and invoke its handler. - # special treatment of some top-level options - local command='docker_compose' - local counter=1 - local compose_file compose_project - while [ $counter -lt $cword ]; do - case "${words[$counter]}" in - --file|-f) - (( counter++ )) - compose_file="${words[$counter]}" - ;; - --project-name|p) - (( counter++ )) - compose_project="${words[$counter]}" - ;; - -*) - ;; - *) - command="${words[$counter]}" - break - ;; - esac - (( counter++ )) - done - - local completions_func=_docker_compose_${command//-/_} - declare -F $completions_func >/dev/null && $completions_func - - eval "$previous_extglob_setting" - return 0 -} - -complete -F _docker_compose docker-compose diff --git a/completion/docker.sh b/completion/docker.sh deleted file mode 100644 index 63d3fc5..0000000 --- a/completion/docker.sh +++ /dev/null @@ -1,1562 +0,0 @@ -#!/bin/bash -# -# bash completion file for core docker commands -# -# This script provides completion of: -# - commands and their options -# - container ids and names -# - image repos and tags -# - filepaths -# -# To enable the completions either: -# - place this file in /etc/bash_completion.d -# or -# - copy this file to e.g. ~/.docker-completion.sh and add the line -# below to your .bashrc after bash completion features are loaded -# . ~/.docker-completion.sh -# -# Configuration: -# -# You can tailor completion for the "events", "history", "inspect", "run", -# "rmi" and "save" commands by settings the following environment -# variables: -# -# DOCKER_COMPLETION_SHOW_IMAGE_IDS -# "none" - Show names only (default) -# "non-intermediate" - Show names and ids, but omit intermediate image IDs -# "all" - Show names and ids, including intermediate image IDs -# -# DOCKER_COMPLETION_SHOW_TAGS -# "yes" - include tags in completion options (default) -# "no" - don't include tags in completion options - -# -# Note: -# Currently, the completions will not work if the docker daemon is not -# bound to the default communication port/socket -# If the docker daemon is using a unix socket for communication your user -# must have access to the socket for the completions to function correctly -# -# Note for developers: -# Please arrange options sorted alphabetically by long name with the short -# options immediately following their corresponding long form. -# This order should be applied to lists, alternatives and code blocks. - -__docker_q() { - docker ${host:+-H "$host"} ${config:+--config "$config"} 2>/dev/null "$@" -} - -__docker_containers_all() { - local IFS=$'\n' - local containers=( $(__docker_q ps -aq --no-trunc) ) - if [ "$1" ]; then - containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") ) - fi - local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") ) - names=( "${names[@]#/}" ) # trim off the leading "/" from the container names - unset IFS - COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") ) -} - -__docker_containers_running() { - __docker_containers_all '.State.Running' -} - -__docker_containers_stopped() { - __docker_containers_all 'not .State.Running' -} - -__docker_containers_pauseable() { - __docker_containers_all 'and .State.Running (not .State.Paused)' -} - -__docker_containers_unpauseable() { - __docker_containers_all '.State.Paused' -} - -__docker_container_names() { - local containers=( $(__docker_q ps -aq --no-trunc) ) - local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") ) - names=( "${names[@]#/}" ) # trim off the leading "/" from the container names - COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") ) -} - -__docker_container_ids() { - local containers=( $(__docker_q ps -aq) ) - COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") ) -} - -__docker_images() { - local images_args="" - - case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in - all) - images_args="--no-trunc -a" - ;; - non-intermediate) - images_args="--no-trunc" - ;; - esac - - local repo_print_command - if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then - repo_print_command='print $1; print $1":"$2' - else - repo_print_command='print $1' - fi - - local awk_script - case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in - all|non-intermediate) - awk_script='NR>1 { print $3; if ($1 != "") { '"$repo_print_command"' } }' - ;; - none|*) - awk_script='NR>1 && $1 != "" { '"$repo_print_command"' }' - ;; - esac - - local images=$(__docker_q images $images_args | awk "$awk_script") - COMPREPLY=( $(compgen -W "$images" -- "$cur") ) - __ltrim_colon_completions "$cur" -} - -__docker_image_repos() { - local repos="$(__docker_q images | awk 'NR>1 && $1 != "" { print $1 }')" - COMPREPLY=( $(compgen -W "$repos" -- "$cur") ) -} - -__docker_image_repos_and_tags() { - local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "" { print $1; print $1":"$2 }')" - COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") ) - __ltrim_colon_completions "$cur" -} - -__docker_containers_and_images() { - __docker_containers_all - local containers=( "${COMPREPLY[@]}" ) - __docker_images - COMPREPLY+=( "${containers[@]}" ) -} - -# Finds the position of the first word that is neither option nor an option's argument. -# If there are options that require arguments, you should pass a glob describing those -# options, e.g. "--option1|-o|--option2" -# Use this function to restrict completions to exact positions after the argument list. -__docker_pos_first_nonflag() { - local argument_flags=$1 - - local counter=$((command_pos + 1)) - while [ $counter -le $cword ]; do - if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then - (( counter++ )) - # eat "=" in case of --option=arg syntax - [ "${words[$counter]}" = "=" ] && (( counter++ )) - else - case "${words[$counter]}" in - -*) - ;; - *) - break - ;; - esac - fi - - # Bash splits words at "=", retaining "=" as a word, examples: - # "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words - while [ "${words[$counter + 1]}" = "=" ] ; do - counter=$(( counter + 2)) - done - - (( counter++ )) - done - - echo $counter -} - -# Returns the value of the first option matching option_glob. -# Valid values for option_glob are option names like '--log-level' and -# globs like '--log-level|-l' -# Only positions between the command and the current word are considered. -__docker_value_of_option() { - local option_glob=$1 - - local counter=$((command_pos + 1)) - while [ $counter -lt $cword ]; do - case ${words[$counter]} in - @($option_glob) ) - echo ${words[$counter + 1]} - break - ;; - esac - (( counter++ )) - done -} - -# Transforms a multiline list of strings into a single line string -# with the words separated by "|". -# This is used to prepare arguments to __docker_pos_first_nonflag(). -__docker_to_alternatives() { - local parts=( $1 ) - local IFS='|' - echo "${parts[*]}" -} - -# Transforms a multiline list of options into an extglob pattern -# suitable for use in case statements. -__docker_to_extglob() { - local extglob=$( __docker_to_alternatives "$1" ) - echo "@($extglob)" -} - -__docker_resolve_hostname() { - command -v host >/dev/null 2>&1 || return - COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') ) -} - -__docker_capabilities() { - # The list of capabilities is defined in types.go, ALL was added manually. - COMPREPLY=( $( compgen -W " - ALL - AUDIT_CONTROL - AUDIT_WRITE - AUDIT_READ - BLOCK_SUSPEND - CHOWN - DAC_OVERRIDE - DAC_READ_SEARCH - FOWNER - FSETID - IPC_LOCK - IPC_OWNER - KILL - LEASE - LINUX_IMMUTABLE - MAC_ADMIN - MAC_OVERRIDE - MKNOD - NET_ADMIN - NET_BIND_SERVICE - NET_BROADCAST - NET_RAW - SETFCAP - SETGID - SETPCAP - SETUID - SYS_ADMIN - SYS_BOOT - SYS_CHROOT - SYSLOG - SYS_MODULE - SYS_NICE - SYS_PACCT - SYS_PTRACE - SYS_RAWIO - SYS_RESOURCE - SYS_TIME - SYS_TTY_CONFIG - WAKE_ALARM - " -- "$cur" ) ) -} - -__docker_log_drivers() { - COMPREPLY=( $( compgen -W " - fluentd - gelf - journald - json-file - none - syslog - " -- "$cur" ) ) -} - -__docker_log_driver_options() { - # see docs/reference/logging/index.md - local fluentd_options="fluentd-address fluentd-tag" - local gelf_options="gelf-address gelf-tag" - local json_file_options="max-file max-size" - local syslog_options="syslog-address syslog-facility syslog-tag" - - case $(__docker_value_of_option --log-driver) in - '') - COMPREPLY=( $( compgen -W "$fluentd_options $gelf_options $json_file_options $syslog_options" -S = -- "$cur" ) ) - ;; - fluentd) - COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) ) - ;; - gelf) - COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) ) - ;; - json-file) - COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) ) - ;; - syslog) - COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) ) - ;; - *) - return - ;; - esac - - compopt -o nospace -} - -__docker_complete_log_driver_options() { - # "=" gets parsed to a word and assigned to either $cur or $prev depending on whether - # it is the last character or not. So we search for "xxx=" in the the last two words. - case "${words[$cword-2]}$prev=" in - *gelf-address=*) - COMPREPLY=( $( compgen -W "udp" -S "://" -- "${cur#=}" ) ) - compopt -o nospace - return - ;; - *syslog-address=*) - COMPREPLY=( $( compgen -W "tcp udp unix" -S "://" -- "${cur#=}" ) ) - compopt -o nospace - return - ;; - *syslog-facility=*) - COMPREPLY=( $( compgen -W " - auth - authpriv - cron - daemon - ftp - kern - local0 - local1 - local2 - local3 - local4 - local5 - local6 - local7 - lpr - mail - news - syslog - user - uucp - " -- "${cur#=}" ) ) - return - ;; - esac - return 1 -} - -__docker_log_levels() { - COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) ) -} - -# a selection of the available signals that is most likely of interest in the -# context of docker containers. -__docker_signals() { - local signals=( - SIGCONT - SIGHUP - SIGINT - SIGKILL - SIGQUIT - SIGSTOP - SIGTERM - SIGUSR1 - SIGUSR2 - ) - COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) ) -} - -# global options that may appear after the docker command -_docker_docker() { - local boolean_options=" - $global_boolean_options - --help - --version -v - " - - case "$prev" in - --config) - _filedir -d - return - ;; - --log-level|-l) - __docker_log_levels - return - ;; - $(__docker_to_extglob "$global_options_with_args") ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) ) - ;; - *) - local counter=$( __docker_pos_first_nonflag $(__docker_to_extglob "$global_options_with_args") ) - if [ $cword -eq $counter ]; then - COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) ) - fi - ;; - esac -} - -_docker_attach() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --no-stdin --sig-proxy" -- "$cur" ) ) - ;; - *) - local counter="$(__docker_pos_first_nonflag)" - if [ $cword -eq $counter ]; then - __docker_containers_running - fi - ;; - esac -} - -_docker_build() { - case "$prev" in - --cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--memory|-m|--memory-swap) - return - ;; - --file|-f) - _filedir - return - ;; - --tag|-t) - __docker_image_repos_and_tags - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--cgroup-parent --cpuset-cpus --cpuset-mems --cpu-shares -c --cpu-period --cpu-quota --file -f --force-rm --help --memory -m --memory-swap --no-cache --pull --quiet -q --rm --tag -t --ulimit" -- "$cur" ) ) - ;; - *) - local counter="$(__docker_pos_first_nonflag '--cgroup-parent|--cpuset-cpus|--cpuset-mems|--cpu-shares|-c|--cpu-period|--cpu-quota|--file|-f|--memory|-m|--memory-swap|--tag|-t')" - if [ $cword -eq $counter ]; then - _filedir -d - fi - ;; - esac -} - -_docker_commit() { - case "$prev" in - --author|-a|--change|-c|--message|-m) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause -p" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m') - - if [ $cword -eq $counter ]; then - __docker_containers_all - return - fi - (( counter++ )) - - if [ $cword -eq $counter ]; then - __docker_image_repos_and_tags - return - fi - ;; - esac -} - -_docker_cp() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - case "$cur" in - *:) - return - ;; - *) - __docker_containers_all - COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) ) - compopt -o nospace - return - ;; - esac - fi - (( counter++ )) - - if [ $cword -eq $counter ]; then - _filedir -d - return - fi - ;; - esac -} - -_docker_create() { - _docker_run -} - -_docker_daemon() { - local boolean_options=" - $global_boolean_options - --help - --icc=false - --ip-forward=false - --ip-masq=false - --iptables=false - --ipv6 - --selinux-enabled - --userland-proxy=false - " - local options_with_args=" - $global_options_with_args - --api-cors-header - --bip - --bridge -b - --default-gateway - --default-gateway-v6 - --default-ulimit - --dns - --dns-search - --exec-driver -e - --exec-opt - --exec-root - --fixed-cidr - --fixed-cidr-v6 - --graph -g - --group -G - --insecure-registry - --ip - --label - --log-driver - --log-opt - --mtu - --pidfile -p - --registry-mirror - --storage-driver -s - --storage-opt - " - - case "$prev" in - --exec-root|--graph|-g) - _filedir -d - return - ;; - --log-driver) - __docker_log_drivers - return - ;; - --pidfile|-p|--tlscacert|--tlscert|--tlskey) - _filedir - return - ;; - --storage-driver|-s) - COMPREPLY=( $( compgen -W "aufs btrfs devicemapper overlay vfs zfs" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) ) - return - ;; - --storage-opt) - local devicemapper_options=" - dm.basesize - dm.blkdiscard - dm.blocksize - dm.fs - dm.loopdatasize - dm.loopmetadatasize - dm.mkfsarg - dm.mountopt - dm.override_udev_sync_check - dm.thinpooldev - " - local zfs_options="zfs.fsname" - - case $(__docker_value_of_option '--storage-driver|-s') in - '') - COMPREPLY=( $( compgen -W "$devicemapper_options $zfs_options" -S = -- "$cur" ) ) - ;; - devicemapper) - COMPREPLY=( $( compgen -W "$devicemapper_options" -S = -- "$cur" ) ) - ;; - zfs) - COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) ) - ;; - *) - return - ;; - esac - compopt -o nospace - return - ;; - --log-level|-l) - __docker_log_levels - return - ;; - --log-opt) - __docker_log_driver_options - return - ;; - $(__docker_to_extglob "$options_with_args") ) - return - ;; - esac - - __docker_complete_log_driver_options && return - - # completions for --storage-opt - case "${words[$cword-2]}$prev=" in - *dm.blkdiscard=*) - COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) ) - return - ;; - *dm.fs=*) - COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur#=}" ) ) - return - ;; - *dm.override_udev_sync_check=*) - COMPREPLY=( $( compgen -W "false true" -- "${cur#=}" ) ) - return - ;; - *dm.thinpooldev=*) - _filedir - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) ) - ;; - esac -} - -_docker_diff() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_containers_all - fi - ;; - esac -} - -_docker_events() { - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) ) - compopt -o nospace - return - ;; - --since|--until) - return - ;; - esac - - case "${words[$cword-2]}$prev=" in - *container=*) - cur="${cur#=}" - __docker_containers_all - return - ;; - *event=*) - COMPREPLY=( $( compgen -W " - attach - commit - copy - create - delete - destroy - die - exec_create - exec_start - export - import - kill - oom - pause - pull - push - rename - resize - restart - start - stop - tag - top - unpause - untag - " -- "${cur#=}" ) ) - return - ;; - *image=*) - cur="${cur#=}" - __docker_images - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --help --since --until" -- "$cur" ) ) - ;; - esac -} - -_docker_exec() { - case "$prev" in - --user|-u) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--detach -d --help --interactive -i --privileged -t --tty -u --user" -- "$cur" ) ) - ;; - *) - __docker_containers_running - ;; - esac -} - -_docker_export() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_containers_all - fi - ;; - esac -} - -_docker_help() { - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) ) - fi -} - -_docker_history() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --no-trunc --quiet -q" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_images - fi - ;; - esac -} - -_docker_images() { - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) ) - if [ "$COMPREPLY" = "label=" ]; then - compopt -o nospace - fi - return - ;; - esac - - case "${words[$cword-2]}$prev=" in - *dangling=*) - COMPREPLY=( $( compgen -W "true false" -- "${cur#=}" ) ) - return - ;; - *label=*) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --help --no-trunc --quiet -q" -- "$cur" ) ) - ;; - =) - return - ;; - *) - __docker_image_repos - ;; - esac -} - -_docker_import() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - return - fi - (( counter++ )) - - if [ $cword -eq $counter ]; then - __docker_image_repos_and_tags - return - fi - ;; - esac -} - -_docker_info() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - esac -} - -_docker_inspect() { - case "$prev" in - --format|-f) - return - ;; - --type) - COMPREPLY=( $( compgen -W "image container" -- "$cur" ) ) - return - ;; - - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --type --help" -- "$cur" ) ) - ;; - *) - case $(__docker_value_of_option --type) in - '') - __docker_containers_and_images - ;; - container) - __docker_containers_all - ;; - image) - __docker_images - ;; - esac - esac -} - -_docker_kill() { - case "$prev" in - --signal|-s) - __docker_signals - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) ) - ;; - *) - __docker_containers_running - ;; - esac -} - -_docker_load() { - case "$prev" in - --input|-i) - _filedir - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --input -i" -- "$cur" ) ) - ;; - esac -} - -_docker_login() { - case "$prev" in - --email|-e|--password|-p|--username|-u) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--email -e --help --password -p --username -u" -- "$cur" ) ) - ;; - esac -} - -_docker_logout() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - esac -} - -_docker_logs() { - case "$prev" in - --since|--tail) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--follow -f --help --since --tail --timestamps -t" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--tail') - if [ $cword -eq $counter ]; then - __docker_containers_all - fi - ;; - esac -} - -_docker_pause() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_containers_pauseable - fi - ;; - esac -} - -_docker_port() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_containers_all - fi - ;; - esac -} - -_docker_ps() { - case "$prev" in - --before|--since) - __docker_containers_all - ;; - --filter|-f) - COMPREPLY=( $( compgen -S = -W "ancestor exited id label name status" -- "$cur" ) ) - compopt -o nospace - return - ;; - --format|-n) - return - ;; - esac - - case "${words[$cword-2]}$prev=" in - *ancestor=*) - cur="${cur#=}" - __docker_images - return - ;; - *id=*) - cur="${cur#=}" - __docker_container_ids - return - ;; - *name=*) - cur="${cur#=}" - __docker_container_names - return - ;; - *status=*) - COMPREPLY=( $( compgen -W "exited paused restarting running" -- "${cur#=}" ) ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all -a --before --filter -f --format --help --latest -l -n --no-trunc --quiet -q --size -s --since" -- "$cur" ) ) - ;; - esac -} - -_docker_pull() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all-tags -a --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - for arg in "${COMP_WORDS[@]}"; do - case "$arg" in - --all-tags|-a) - __docker_image_repos - return - ;; - esac - done - __docker_image_repos_and_tags - fi - ;; - esac -} - -_docker_push() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_image_repos_and_tags - fi - ;; - esac -} - -_docker_rename() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_containers_all - fi - ;; - esac -} - -_docker_restart() { - case "$prev" in - --time|-t) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) ) - ;; - *) - __docker_containers_all - ;; - esac -} - -_docker_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) ) - ;; - *) - for arg in "${COMP_WORDS[@]}"; do - case "$arg" in - --force|-f) - __docker_containers_all - return - ;; - esac - done - __docker_containers_stopped - ;; - esac -} - -_docker_rmi() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) ) - ;; - *) - __docker_images - ;; - esac -} - -_docker_run() { - local options_with_args=" - --add-host - --attach -a - --blkio-weight - --cap-add - --cap-drop - --cgroup-parent - --cidfile - --cpu-period - --cpu-quota - --cpuset-cpus - --cpuset-mems - --cpu-shares -c - --device - --dns - --dns-search - --entrypoint - --env -e - --env-file - --expose - --group-add - --hostname -h - --ipc - --kernel-memory - --label-file - --label -l - --link - --log-driver - --log-opt - --lxc-conf - --mac-address - --memory -m - --memory-swap - --memory-swappiness - --name - --net - --pid - --publish -p - --restart - --security-opt - --ulimit - --user -u - --uts - --volumes-from - --volume -v - --workdir -w - " - - local all_options="$options_with_args - --disable-content-trust=false - --help - --interactive -i - --oom-kill-disable - --privileged - --publish-all -P - --read-only - --tty -t - " - - [ "$command" = "run" ] && all_options="$all_options - --detach -d - --rm - --sig-proxy=false - " - - local options_with_args_glob=$(__docker_to_extglob "$options_with_args") - - case "$prev" in - --add-host) - case "$cur" in - *:) - __docker_resolve_hostname - return - ;; - esac - ;; - --attach|-a) - COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) ) - return - ;; - --cap-add|--cap-drop) - __docker_capabilities - return - ;; - --cidfile|--env-file|--label-file) - _filedir - return - ;; - --device|--volume|-v) - case "$cur" in - *:*) - # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine) - ;; - '') - COMPREPLY=( $( compgen -W '/' -- "$cur" ) ) - compopt -o nospace - ;; - /*) - _filedir - compopt -o nospace - ;; - esac - return - ;; - --env|-e) - COMPREPLY=( $( compgen -e -- "$cur" ) ) - compopt -o nospace - return - ;; - --ipc) - case "$cur" in - *:*) - cur="${cur#*:}" - __docker_containers_running - ;; - *) - COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) ) - if [ "$COMPREPLY" = "container:" ]; then - compopt -o nospace - fi - ;; - esac - return - ;; - --link) - case "$cur" in - *:*) - ;; - *) - __docker_containers_running - COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) ) - compopt -o nospace - ;; - esac - return - ;; - --log-driver) - __docker_log_drivers - return - ;; - --log-opt) - __docker_log_driver_options - return - ;; - --net) - case "$cur" in - container:*) - local cur=${cur#*:} - __docker_containers_all - ;; - *) - COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") ) - if [ "${COMPREPLY[*]}" = "container:" ] ; then - compopt -o nospace - fi - ;; - esac - return - ;; - --restart) - case "$cur" in - on-failure:*) - ;; - *) - COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") ) - ;; - esac - return - ;; - --security-opt) - case "$cur" in - label:*:*) - ;; - label:*) - local cur=${cur##*:} - COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") ) - if [ "${COMPREPLY[*]}" != "disable" ] ; then - compopt -o nospace - fi - ;; - *) - COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") ) - compopt -o nospace - ;; - esac - return - ;; - --volumes-from) - __docker_containers_all - return - ;; - $options_with_args_glob ) - return - ;; - esac - - __docker_complete_log_driver_options && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) ) - ;; - *) - local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) ) - if [ $cword -eq $counter ]; then - __docker_images - fi - ;; - esac -} - -_docker_save() { - case "$prev" in - --output|-o) - _filedir - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) ) - ;; - *) - __docker_images - ;; - esac -} - -_docker_search() { - case "$prev" in - --stars|-s) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--automated --help --no-trunc --stars -s" -- "$cur" ) ) - ;; - esac -} - -_docker_start() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--attach -a --help --interactive -i" -- "$cur" ) ) - ;; - *) - __docker_containers_stopped - ;; - esac -} - -_docker_stats() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--no-stream --help" -- "$cur" ) ) - ;; - *) - __docker_containers_running - ;; - esac -} - -_docker_stop() { - case "$prev" in - --time|-t) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) ) - ;; - *) - __docker_containers_running - ;; - esac -} - -_docker_tag() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - - if [ $cword -eq $counter ]; then - __docker_image_repos_and_tags - return - fi - (( counter++ )) - - if [ $cword -eq $counter ]; then - __docker_image_repos_and_tags - return - fi - ;; - esac -} - -_docker_unpause() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_containers_unpauseable - fi - ;; - esac -} - -_docker_top() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_containers_running - fi - ;; - esac -} - -_docker_version() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - esac -} - -_docker_wait() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_containers_all - ;; - esac -} - -_docker() { - local previous_extglob_setting=$(shopt -p extglob) - shopt -s extglob - - local commands=( - attach - build - commit - cp - create - daemon - diff - events - exec - export - history - images - import - info - inspect - kill - load - login - logout - logs - pause - port - ps - pull - push - rename - restart - rm - rmi - run - save - search - start - stats - stop - tag - top - unpause - version - wait - ) - - # These options are valid as global options for all client commands - # and valid as command options for `docker daemon` - local global_boolean_options=" - --debug -D - --tls - --tlsverify - " - local global_options_with_args=" - --config - --host -H - --log-level -l - --tlscacert - --tlscert - --tlskey - " - - local host config - - COMPREPLY=() - local cur prev words cword - _get_comp_words_by_ref -n : cur prev words cword - - local command='docker' command_pos=0 - local counter=1 - while [ $counter -lt $cword ]; do - case "${words[$counter]}" in - # save host so that completion can use custom daemon - --host|-H) - (( counter++ )) - host="${words[$counter]}" - ;; - # save config so that completion can use custom configuration directories - --config) - (( counter++ )) - config="${words[$counter]}" - ;; - $(__docker_to_extglob "$global_options_with_args") ) - (( counter++ )) - ;; - -*) - ;; - =) - (( counter++ )) - ;; - *) - command="${words[$counter]}" - command_pos=$counter - break - ;; - esac - (( counter++ )) - done - - local completions_func=_docker_${command} - declare -F $completions_func >/dev/null && $completions_func - - eval "$previous_extglob_setting" - return 0 -} - -complete -F _docker docker diff --git a/home/.bash_aliases b/home/.bash_aliases index 3c26525..475506a 100644 --- a/home/.bash_aliases +++ b/home/.bash_aliases @@ -21,6 +21,14 @@ alias a=ansible alias c=code-insiders alias e=$EDITOR +# Completion for aliases +# See: https://github.com/cykerway/complete-alias +complete -F _complete_alias g +complete -F _complete_alias k +complete -F _complete_alias a +complete -F _complete_alias c +complete -F _complete_alias e + # Some shortcuts for me function moby() { [ -f ~/.bash_env ] && source ~/.bash_env diff --git a/home/.bash_completion b/home/.bash_completion index b8ea7e8..2178a59 100644 --- a/home/.bash_completion +++ b/home/.bash_completion @@ -30,7 +30,8 @@ if type ykman > /dev/null 2>&1; then _ykman_completionetup; fi -if command -v brew; then +# Homebrew completions +if command -v brew > /dev/null; then HOMEBREW_PREFIX=$(brew --prefix) if type brew &>/dev/null; then for COMPLETION in "$HOMEBREW_PREFIX"/etc/bash_completion.d/*; do @@ -41,3 +42,12 @@ if command -v brew; then fi fi fi + +# Docker completions +for COMPLETION in /Applications/Docker.app/Contents/Resources/etc/*.bash-completion; do + [ -f ${COMPLETION} ] && source ${COMPLETION} +done + +# Add completion to aliases +# See: https://github.com/cykerway/complete-alias +source ~/.homesick/repos/complete-alias/bash_completion.sh diff --git a/home/.bash_env b/home/.bash_env index f1f9c6b..40006b0 100644 --- a/home/.bash_env +++ b/home/.bash_env @@ -21,15 +21,18 @@ if [[ "${OSTYPE}" == "darwin"* ]]; then export PATH=/usr/local/MacGPG2/bin/:${PATH} fi - # Macports man-pages - if [ -d /opt/local/share/man ]; then - export MANPATH=/opt/local/share/man:${MANPATH} + # Homebrew man-pages + if [ -d /usr/local/share/man ]; then + export MANPATH=/usr/local/share/man:${MANPATH} + export MANPATH=$(brew --prefix coreutils)/opt/coreutils/libexec/gnuman:${MANPATH} fi # Linux man-pages if [ -d /opt/man-pages ]; then export MANPATH=/opt/man-pages:${MANPATH} fi + + PATH=$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH fi if [ -r ~/.gpg-agent-info ]; then diff --git a/home/.bashrc b/home/.bashrc index 8de590b..e3041f2 100644 --- a/home/.bashrc +++ b/home/.bashrc @@ -27,10 +27,10 @@ if [ -x /usr/bin/lesspipe ]; then eval "$(lesspipe)"; fi source ~/.homesick/repos/homeshick/homeshick.sh source ~/.homesick/repos/homeshick/completions/homeshick-completion.bash -source ~/.bash_aliases source ~/.bash_env source ~/.bash_prompt source ~/.bash_completion +source ~/.bash_aliases # enable color support of ls and also add handy aliases if hash dircolors 2>/dev/null; then diff --git a/packages.sh b/packages.sh index 1d4d287..da04b3c 100755 --- a/packages.sh +++ b/packages.sh @@ -70,6 +70,29 @@ brew install \ ripgrep \ wget \ wireshark \ + binutils \ + diffutils \ + findutils --with-default-names \ + gawk \ + gnu-indent --with-default-names \ + gnu-sed --with-default-names \ + gnu-tar --with-default-names \ + gnu-which --with-default-names \ + gnutls \ + grep --with-default-names \ + gzip \ + screen \ + watch \ + wdiff --with-gettext \ + tmux \ + bash \ + gdb \ + gpatch \ + m4 \ + make \ + nano \ + less \ + rsync brew cask install \ meld