| # |
| # Bash completion for grub |
| # |
| # Copyright (C) 2010 Free Software Foundation, Inc. |
| # |
| # GRUB is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation, either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # GRUB is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with GRUB. If not, see <http://www.gnu.org/licenses/>. |
| # bash completion for grub |
| |
| __grub_dir() { |
| local i c=1 boot_dir |
| |
| for (( c=1; c <= ${#COMP_WORDS[@]}; c++ )); do |
| i="${COMP_WORDS[c]}" |
| case "$i" in |
| --boot-directory) |
| c=$((++c)) |
| i="${COMP_WORDS[c]}" |
| boot_dir="${i##*=}"; |
| break |
| ;; |
| esac |
| done |
| boot_dir=${boot_dir-/@bootdirname@} |
| echo "${boot_dir%/}/@grubdirname@" |
| } |
| |
| |
| # This function generates completion reply with compgen |
| # - arg: accepts 1, 2, 3, or 4 arguments |
| # $1 wordlist separate by space, tab or newline |
| # $2 (optional) prefix to add |
| # $3 (optional) current word to complete |
| # $4 (optional) suffix to add |
| __grubcomp () { |
| local cur="${COMP_WORDS[COMP_CWORD]}" |
| if [ $# -gt 2 ]; then |
| cur="$3" |
| fi |
| case "$cur" in |
| --*=) |
| COMPREPLY=() |
| ;; |
| *) |
| local IFS=' '$'\t'$'\n' |
| COMPREPLY=($(compgen -P "${2-}" -W "${1-}" -S "${4-}" -- "$cur")) |
| ;; |
| esac |
| } |
| |
| # Function that return long options from the help of the command |
| # - arg: $1 (optional) command to get the long options from |
| __grub_get_options_from_help () { |
| local prog |
| |
| if [ $# -ge 1 ]; then |
| prog="$1" |
| else |
| prog="${COMP_WORDS[0]}" |
| fi |
| |
| local i IFS=" "$'\t'$'\n' |
| for i in $(LC_ALL=C $prog --help) |
| do |
| case $i in |
| --*) echo "${i%=*}";; |
| esac |
| done |
| } |
| |
| # Function that return long options from the usage of the command |
| # - arg: $1 (optional) command to get the long options from |
| __grub_get_options_from_usage () { |
| local prog |
| |
| if [ $# -ge 1 ]; then |
| prog="$1" |
| else |
| prog="${COMP_WORDS[0]}" |
| fi |
| |
| local i IFS=" "$'\t'$'\n' |
| for i in $(LC_ALL=C $prog --usage) |
| do |
| case $i in |
| \[--*\]) i=${i#[} # Remove leading [ |
| echo ${i%%?(=*)]} # Remove optional value and trailing ] |
| ;; |
| esac |
| done |
| } |
| |
| __grub_get_last_option () { |
| local i |
| for (( i=$COMP_CWORD-1; i > 0; i-- )); do |
| if [[ "${COMP_WORDS[i]}" == -* ]]; then |
| echo "${COMP_WORDS[i]}" |
| break; |
| fi |
| done |
| } |
| |
| __grub_list_menuentries () { |
| local cur="${COMP_WORDS[COMP_CWORD]}" |
| local config_file=$(__grub_dir)/grub.cfg |
| |
| if [ -f "$config_file" ];then |
| local IFS=$'\n' |
| COMPREPLY=( $(compgen \ |
| -W "$( awk -F "[\"']" '/menuentry/ { print $2 }' $config_file )" \ |
| -- "$cur" )) #'# Help emacs syntax highlighting |
| fi |
| } |
| |
| __grub_list_modules () { |
| local grub_dir=$(__grub_dir) |
| local IFS=$'\n' |
| COMPREPLY=( $( compgen -f -X '!*/*.mod' -- "${grub_dir}/$cur" | { |
| while read -r tmp; do |
| [ -n $tmp ] && { |
| tmp=${tmp##*/} |
| printf '%s\n' ${tmp%.mod} |
| } |
| done |
| } |
| )) |
| } |
| |
| # |
| # grub-set-default & grub-reboot |
| # |
| _grub_set_entry () { |
| local cur prev split=false |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| prev=${COMP_WORDS[COMP_CWORD-1]} |
| |
| _split_longopt && split=true |
| |
| case "$prev" in |
| --boot-directory) |
| _filedir -d |
| return |
| ;; |
| esac |
| |
| $split && return 0 |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| # Default complete with a menuentry |
| __grub_list_menuentries |
| fi |
| } |
| |
| __grub_set_default_program="@grub_set_default@" |
| have ${__grub_set_default_program} && \ |
| complete -F _grub_set_entry -o filenames ${__grub_set_default_program} |
| unset __grub_set_default_program |
| |
| __grub_reboot_program="@grub_reboot@" |
| have ${__grub_reboot_program} && \ |
| complete -F _grub_set_entry -o filenames ${__grub_reboot_program} |
| unset __grub_reboot_program |
| |
| |
| # |
| # grub-editenv |
| # |
| _grub_editenv () { |
| local cur prev |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| prev=${COMP_WORDS[COMP_CWORD-1]} |
| |
| case "$prev" in |
| create|list|set|unset) |
| COMPREPLY=( "" ) |
| return |
| ;; |
| esac |
| |
| __grubcomp "$(__grub_get_options_from_help) |
| create list set unset" |
| } |
| |
| __grub_editenv_program="@grub_editenv@" |
| have ${__grub_editenv_program} && \ |
| complete -F _grub_editenv -o filenames ${__grub_editenv_program} |
| unset __grub_editenv_program |
| |
| |
| # |
| # grub-mkconfig |
| # |
| _grub_mkconfig () { |
| local cur prev |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| _filedir |
| fi |
| } |
| __grub_mkconfig_program="@grub_mkconfig@" |
| have ${__grub_mkconfig_program} && \ |
| complete -F _grub_mkconfig -o filenames ${__grub_mkconfig_program} |
| unset __grub_mkconfig_program |
| |
| |
| # |
| # grub-setup |
| # |
| _grub_setup () { |
| local cur prev split=false |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| prev=${COMP_WORDS[COMP_CWORD-1]} |
| |
| _split_longopt && split=true |
| |
| case "$prev" in |
| -d|--directory) |
| _filedir -d |
| return |
| ;; |
| esac |
| |
| $split && return 0 |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| # Default complete with a filename |
| _filedir |
| fi |
| } |
| |
| __grub_bios_setup_program="@grub_bios_setup@" |
| have ${__grub_bios_setup_program} && \ |
| complete -F _grub_setup -o filenames ${__grub_bios_setup_program} |
| unset __grub_bios_setup_program |
| |
| __grub_sparc64_setup_program="@grub_sparc64_setup@" |
| have ${__grub_sparc64_setup_program} && \ |
| complete -F _grub_setup -o filenames ${__grub_sparc64_setup_program} |
| unset __grub_sparc64_setup_program |
| |
| |
| # |
| # grub-install |
| # |
| _grub_install () { |
| local cur prev last split=false |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| prev=${COMP_WORDS[COMP_CWORD-1]} |
| last=$(__grub_get_last_option) |
| |
| _split_longopt && split=true |
| |
| case "$prev" in |
| --boot-directory) |
| _filedir -d |
| return |
| ;; |
| --disk-module) |
| __grubcomp "biosdisk ata" |
| return |
| ;; |
| esac |
| |
| $split && return 0 |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| case "$last" in |
| --modules) |
| __grub_list_modules |
| return |
| ;; |
| esac |
| |
| # Default complete with a filename |
| _filedir |
| fi |
| } |
| __grub_install_program="@grub_install@" |
| have ${__grub_install_program} && \ |
| complete -F _grub_install -o filenames ${__grub_install_program} |
| unset __grub_install_program |
| |
| |
| # |
| # grub-mkfont |
| # |
| _grub_mkfont () { |
| local cur |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| # Default complete with a filename |
| _filedir |
| fi |
| } |
| __grub_mkfont_program="@grub_mkfont@" |
| have ${__grub_mkfont_program} && \ |
| complete -F _grub_mkfont -o filenames ${__grub_mkfont_program} |
| unset __grub_mkfont_program |
| |
| |
| # |
| # grub-mkrescue |
| # |
| _grub_mkrescue () { |
| local cur prev last |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| prev=${COMP_WORDS[COMP_CWORD-1]} |
| last=$(__grub_get_last_option) |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| case "$last" in |
| --modules) |
| __grub_list_modules |
| return |
| ;; |
| esac |
| |
| # Default complete with a filename |
| _filedir |
| fi |
| } |
| __grub_mkrescue_program="@grub_mkrescue@" |
| have ${__grub_mkrescue_program} && \ |
| complete -F _grub_mkrescue -o filenames ${__grub_mkrescue_program} |
| unset __grub_mkrescue_program |
| |
| |
| # |
| # grub-mkimage |
| # |
| _grub_mkimage () { |
| local cur prev split=false |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| prev=${COMP_WORDS[COMP_CWORD-1]} |
| |
| _split_longopt && split=true |
| |
| case "$prev" in |
| -d|--directory|-p|--prefix) |
| _filedir -d |
| return |
| ;; |
| -O|--format) |
| # Get available format from help |
| local prog=${COMP_WORDS[0]} |
| __grubcomp "$(LC_ALL=C $prog --help | \ |
| awk -F ":" '/available formats/ { print $2 }' | \ |
| sed 's/, / /g')" |
| return |
| ;; |
| esac |
| |
| $split && return 0 |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| # Default complete with a filename |
| _filedir |
| fi |
| } |
| __grub_mkimage_program="@grub_mkimage@" |
| have ${__grub_mkimage_program} && \ |
| complete -F _grub_mkimage -o filenames ${__grub_mkimage_program} |
| unset __grub_mkimage_program |
| |
| |
| # |
| # grub-mkpasswd-pbkdf2 |
| # |
| _grub_mkpasswd_pbkdf2 () { |
| local cur |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| # Default complete with a filename |
| _filedir |
| fi |
| } |
| __grub_mkpasswd_pbkdf2_program="@grub_mkpasswd_pbkdf2@" |
| have ${__grub_mkpasswd_pbkdf2_program} && \ |
| complete -F _grub_mkpasswd_pbkdf2 -o filenames ${__grub_mkpasswd_pbkdf2_program} |
| unset __grub_mkpasswd_pbkdf2_program |
| |
| |
| # |
| # grub-probe |
| # |
| _grub_probe () { |
| local cur prev split=false |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| prev=${COMP_WORDS[COMP_CWORD-1]} |
| |
| _split_longopt && split=true |
| |
| case "$prev" in |
| -t|--target) |
| # Get target type from help |
| local prog=${COMP_WORDS[0]} |
| __grubcomp "$(LC_ALL=C $prog --help | \ |
| awk -F "[()]" '/--target=/ { print $2 }' | \ |
| sed 's/|/ /g')" |
| return |
| ;; |
| esac |
| |
| $split && return 0 |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| # Default complete with a filename |
| _filedir |
| fi |
| } |
| __grub_probe_program="@grub_probe@" |
| have ${__grub_probe_program} && \ |
| complete -F _grub_probe -o filenames ${__grub_probe_program} |
| unset __grub_probe_program |
| |
| |
| # |
| # grub-script-check |
| # |
| _grub_script_check () { |
| local cur |
| |
| COMPREPLY=() |
| cur=`_get_cword` |
| |
| if [[ "$cur" == -* ]]; then |
| __grubcomp "$(__grub_get_options_from_help)" |
| else |
| # Default complete with a filename |
| _filedir |
| fi |
| } |
| __grub_script_check_program="@grub_script_check@" |
| have ${__grub_script_check_program} && \ |
| complete -F _grub_script_check -o filenames ${__grub_script_check_program} |
| |
| |
| # Local variables: |
| # mode: shell-script |
| # sh-basic-offset: 4 |
| # sh-indent-comment: t |
| # indent-tabs-mode: nil |
| # End: |
| # ex: ts=4 sw=4 et filetype=sh |