diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e7eb3ae..c23f6e2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,7 @@ include(04-targets) include(05-summary) add_subdirectory(doc) +add_subdirectory(doc/bash) add_subdirectory(doc/zsh) add_subdirectory(include) add_subdirectory(lib) diff --git a/doc/bash/CMakeLists.txt b/doc/bash/CMakeLists.txt new file mode 100644 index 00000000..3260f72e --- /dev/null +++ b/doc/bash/CMakeLists.txt @@ -0,0 +1,6 @@ +# +# Bash completion template +# +install(FILES polybar + DESTINATION share/bash-completion/completions + COMPONENT tools) diff --git a/doc/bash/polybar b/doc/bash/polybar new file mode 100644 index 00000000..0df9a440 --- /dev/null +++ b/doc/bash/polybar @@ -0,0 +1,93 @@ +_polybar_config_file() { + local config_path=${XDG_CONFIG_HOME:-$HOME/.config}/polybar/config + + for ((i = 0; i < COMP_CWORD; i++)); do + case ${COMP_WORDS[i]} in + --config) + config_path=${COMP_WORDS[i + 2]} + break + ;; + -c) + config_path=${COMP_WORDS[i + 1]} + break + ;; + esac + done + + # Use eval + cd for to get bash's parameter/tilde expansion etc + (eval cd $(dirname "$config_path"); echo $PWD/$(basename "$config_path")) +} + +_polybar_bars() { + local config_file=$(_polybar_config_file) + + if [ -r "$config_file" ]; then + grep -Po '\[bar/\K(.*)(?=\])' "$config_file" + fi +} + +_polybar() { + local options='-h --help + -v --version + -l --log= + -q --quiet + -c --config= + -r --reload + -d --dump= + -m --list-monitors + -w --print-wmname + -s --stdout + -p --png=' + + local log_levels='error + warning + info + trace' + + COMPREPLY=() + + local cur=${COMP_WORDS[COMP_CWORD]} + case "$cur" in + -*) + COMPREPLY=( $(compgen -W "$options" -- "$cur") ) + ;; + *) + local prev=${COMP_WORDS[COMP_CWORD - 1]} + if [ "$prev" = "=" ]; then + prev=${COMP_WORDS[COMP_CWORD - 2]} + fi + + case "$prev" in + -l|--log) + COMPREPLY=( $(compgen -W "$log_levels" -- "$cur") ) + return 0 + ;; + -c|--config) + COMPREPLY=( $(compgen -f "$cur") ) + return 0 + ;; + -p|--png) + COMPREPLY=( $(compgen -f -X "!*.png" "$cur") ) + return 0 + ;; + # TODO: read properties of the selected bar from config + -d|--dump) + return 0 + ;; + *) + COMPREPLY=( $(compgen -W "$options $(_polybar_bars)" -- "$cur") ) + ;; + esac + esac + + for ((i = 0; i < ${#COMPREPLY[@]}; i++)); do + case ${COMPREPLY[i]} in + --*=) ;; + -*) COMPREPLY[i]+=" " + esac + done + + return 0 +} + +complete -o filenames -o noquote -o nospace -F _polybar polybar