A parità di fattori la spiegazione più semplice tende ad essere quella esatta

Yaourt e il bash_completion

Un saluto ai lettori! Per prima cosa ringrazio Furéster che ha scritto il post originale dal qual traggo spunto per questo.

Descrivo ora di cosa si tratta: Come intuibile dal titolo del post spiego un metodo per attivare il bash_completion per il noto programma di archLinux yaourt al quale , a differena dell’ufficiale pacman, manca proprio il completamento automatico dei pacchetti.

Per attivarlo seguite questa semlice procedura:

1) Aprite un terminale e digitate sudo nano /etc//bash_completion.d/yaourt

2) incollate il seguente codice:

# vim: set ft=sh ts=2 sw=2 et:
# file: /etc/bash_completion.d/yaourt

# Bash completion for yaourt
# Original: Igor Scabini
# adapted from bash_completion by Manolis Tzanidakis
#
# Distributed under the terms of the GNU General Public License, v2 or later.
#

## initial functions

rem_selected ()
{
# (Adapted from bash_completion by Ian Macdonald )
# This removes any options from the list of completions that have
# already been specified on the command line.
COMPREPLY=($(echo “${COMP_WORDS[@]}” |
(while read -d ‘ ‘ i; do
[ “${i}” == “” ] && continue
# flatten array with spaces on either side,
# otherwise we cannot grep on word boundaries of
# first and last word
COMPREPLY=” ${COMPREPLY[@]} ”
# remove word from list of completions
COMPREPLY=(${COMPREPLY/ ${i%% *} / })
done
echo ${COMPREPLY[@]})))
return 0
}

_available_repos ()
{
COMPREPLY=( $( compgen -W “$(grep ‘[‘ /etc/pacman.conf | grep -v -e ‘options’ -e ‘^#’ | tr -d ‘[]’ )” — $cur ) )
}

_installed_pkgs ()
{
local installed_pkgs
installed_pkgs=$( ls /var/lib/pacman/local/ )
COMPREPLY=( $( compgen -W “$( for i in $installed_pkgs; do echo ${i%-*-*}; done )” — $cur ) )
}

_available_pkgs ()
{
#find balks easilly on a find /foo/*/* type dir, especially one like
# /var/lib/pacman/*/*
# This little change-up removes the find *and* only uses enabled repos
local available_pkgs
local enabled_repos
enabled_repos=$( grep ‘[‘ /etc/pacman.conf | grep -v -e ‘options’ -e ‘^#’ | tr -d ‘[]’ )
available_pkgs=$( for r in $enabled_repos; do echo /var/lib/pacman/sync/$r/*; done )
COMPREPLY=( $( compgen -W “$( for i in $available_pkgs; do j=${i##*/}; echo ${j%-*-*}; done )” — $cur ) )
}

_installed_groups ()
{
local installed_groups
installed_groups=$( find /var/lib/pacman/local -name desc -exec sed -ne ‘/%GROUPS%/,/^$/{//d; p}’ {} ; | sort -u )
COMPREPLY=( $( compgen -W “$( for i in $installed_groups; do echo ${i%-*-*}; done )” — $cur ) )
}

_available_groups ()
{
#find balks easilly on a find /foo/*/* type dir, especially one like
# /var/lib/pacman/*/*
# This little change-up removes the find *and* only uses enabled repos
local available_groups
local enabled_repos
enabled_repos=$( grep ‘[‘ /etc/pacman.conf | grep -v -e ‘options’ -e ‘^#’ | tr -d ‘[]’ )
available_groups=$( for r in $enabled_repos; do sed ‘/%GROUPS%/,/^$/{//d; p}’ /var/lib/pacman/sync/$r/*/desc | sort -u; done )
COMPREPLY=( $( compgen -W “$( for i in $available_groups; do echo ${i%-*-*}; done )” — $cur ) )
}

## makepkg completion

_makepkg ()
{
local cur prev
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}

case “$prev” in
-p)
_filedir
return 0
;;
–help|–cleancache)
COMPREPLY=”
return 0
;;
esac

if [[ “$cur” == -* ]]; then
COMPREPLY=( $( compgen -W ‘
-A –ignorearch
-b –builddeps
-c –clean
-C –cleancache
-d –nodeps
-e –noextract
-f –force
-g –geninteg
-h –help
-i –install
-L –log
-m –nocolor
-o –nobuild
-p
-r –rmdeps
-s –syncdeps
–asroot
–source
–noconfirm
–noprogressbar’ — $cur ) )
fi

rem_selected
}
complete -o default -F _makepkg makepkg

## yaourt completion

_instring ()
{
str=”${1}”
shift 1
for c in “${@}”; do
if [ $(expr index “${str}” “${c}”) -gt 0 ]; then
return 0
fi
done
return 1
}

_yaourt ()
{
local a arg toparse op mod cur
COMPREPLY=()

# This argument parsing is done so we can check for flag existance later
# right now it’s a tad crappy, but does the job
for (( i=1; i < ${#COMP_WORDS[@]}-1; i++ )); do
a=${COMP_WORDS[i]}
arg=”${a:0:2}”
toparse=”${a:2}”

case “${arg}” in
-@(A|U|R|S|Q|h|V))
op=”${arg/-}”
mod=”${mod}${a:2}”
;;
–)
arg=”${a:2}”
case “${arg}” in
add) op=”A” ;;
remove) op=”R” ;;
upgrade) op=”U” ;;
query) op=”Q” ;;
sync) op=”S” ;;
help) op=”h” ;;
version) op=”V” ;;
verbose) mod=”${mod}v” ;;
root) mod=”${mod}r” ;;
dbpath) mod=”${mod}b” ;;
nodeps) mod=”${mod}d” ;;
force) mod=”${mod}f” ;;
groups) mod=”${mod}g” ;;
info) mod=”${mod}i” ;;
list) mod=”${mod}l” ;;
print-uris) mod=”${mod}p” ;;
search) mod=”${mod}s” ;;
sysupgrade) mod=”${mod}u” ;;
upgrades) mod=”${mod}u” ;;
downloadonly) mod=”${mod}w” ;;
refresh) mod=”${mod}y” ;;
changelog) mod=”${mod}c” ;;
deps) mod=”${mod}d” ;;
explicit) mod=”${mod}e” ;;
unrequired) mod=”${mod}t” ;;
foreign) mod=”${mod}m” ;;
owns) mod=”${mod}o” ;;
file) mod=”${mod}p” ;;
search) mod=”${mod}s” ;;
upgrades) mod=”${mod}u” ;;
cascade) mod=”${mod}c” ;;
dbonly) mod=”${mod}k” ;;
nosave) mod=”${mod}n” ;;
recursive) mod=”${mod}s” ;;
esac ;;
*) toparse=”${a}” ;;
esac

arglen=$(( ${#toparse}-1 ))
for c in $(seq 0 “${arglen}”); do
arg=${toparse:$c:1}
[ “${arg}” != “-” ] && mod=”${mod}${arg}”
done
done

cur=${COMP_WORDS[COMP_CWORD]}

if [ $COMP_CWORD -eq 1 ] && [[ “$cur” == -* ]]; then
COMPREPLY=( $( compgen -W ‘
-A –add
-h –help
-Q –query
-R –remove
-S –sync
-U –upgrade
-V –version
‘ — $cur ) )
rem_selected
return 0
fi

if [[ “$cur” == -* ]]; then
case “${op}” in
A|U)
COMPREPLY=( $( compgen -W ‘
–asdeps
-d –nodeps
-f –force
-h –help
–config
–logfile
–noconfirm
–noprogressbar
–noscriptlet
-v –verbose
-r –root
-b –dbpath
–cachedir
‘ — $cur ) )
return 0
;;
R)
COMPREPLY=( $( compgen -W ‘
-c –cascade
-d –nodeps
-h –help
-k –dbonly
-n –nosave
-s –recursive
–config
–logfile
–noconfirm
–noprogressbar
–noscriptlet
-v –verbose
-r –root
-b –dbpath
–cachedir
‘ — $cur ) )
return 0
;;
S)
COMPREPLY=( $( compgen -W ‘
–asdeps
-c –clean
-d –nodeps
-e –dependsonly
-f –force
-g –groups
-h –help
-i –info
-l –list
-p –print-uris
-s –search
-u –sysupgrade
-w –downloadonly
-y –refresh
–needed
–ignore
–ignoregroup
–config
–logfile
–noconfirm
–noprogressbar
–noscriptlet
-v –verbose
-r –root
-b –dbpath
–cachedir
‘ — $cur ) )
return 0
;;
Q)
COMPREPLY=( $( compgen -W ‘
-c –changelog
-d –deps
-e –explicit
-g –groups
-h –help
-i –info
-l –list
-m –foreign
-o –owns
-p –file
-s –search
-t –unrequired
-u –upgrades
–config
–logfile
–noconfirm
–noprogressbar
–noscriptlet
-v –verbose
-r –root
-b –dbpath
–cachedir
‘ — $cur ) )
return 0
;;
esac
rem_selected
else
case “${op}” in
A|U)
COMPREPLY=( $( compgen -d — “$cur” )
$( compgen -f -X ‘!*.pkg.tar.gz’ — “$cur” ) )
return 0
;;
h|V)
COMPREPLY=”
return 0
;;
Q)
if _instring $mod g; then
_installed_groups
elif _instring $mod o; then
COMPREPLY=( $( compgen -d — “$cur” )
$( compgen -f — “$cur” ) )
elif _instring $mod p; then
COMPREPLY=( $( compgen -d — “$cur” )
$( compgen -f -X ‘!*.pkg.tar.gz’ — “$cur” ) )
elif _instring $mod u; then
COMPREPLY=”
return 0
else
_installed_pkgs
fi
return 0
;;
R)
_installed_pkgs
return 0
;;
S)
if _instring $mod l; then
_available_repos
else
_available_pkgs
fi
return 0
;;
esac
fi

rem_selected
}
complete -o filenames -F _yaourt yaourt

3) Salvate e per attivare il completamento lanciate source /etc/profile

Questo è tutto. Ciao alla prossima

Annunci

Commenti su: "Yaourt e il bash_completion" (5)

  1. Grazie per la fiducia e l’eco!
    non è che metteresti un link al post originale?, volevo farti notare che con drupal sparisce tutta l’indentazione (non che serva ma rende più leggibile) e, soprattutto, le parentesi angolari che invece sono essenziali per lo script!
    grazie!

  2. maintux ha detto:

    Si effettivamente da programmatore sono concorde sulla questione dell’indentazione …. per quanto riguarda le parentesi angolari io ho copiato il tuo codice e incollato nel file e mi funziona.

    Ciao

  3. si, nel mio sono mantenute, è nella copia che hai fatto qui sul sito che non le vedevo .. ma devono essere solo quelle dei contatti mail degli autori se non ho letto male!

  4. maintux ha detto:

    Ok allora a scanso di equivoci per chi dovesse riscontrare errori rimando al sito di furester che ha il codice corretto
    ciao

  5. This post is very hoting, and this blog is high ranked in
    the top blogs report
    . You can
    earn some money with a good blog
    like this.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: