diff --git a/bash-completion b/bash-completion index 1b9cb3fa..aa9bc726 100644 --- a/bash-completion +++ b/bash-completion @@ -90,8 +90,8 @@ _yay() { _pacman_pkg Qq;; S) { _arch_incomp 'g groups' && _pacman_pkg Sg; } || - { _arch_incomp 'l list' && _arch_compgen "$(yay --complete | \sort -u)"; } || - _arch_compgen "$(yay --complete )";; + { _arch_incomp 'l list' && _arch_compgen "$(yay -Pc | \sort -u)"; } || + _arch_compgen "$(yay -Pc )";; U) _pacman_file;; esac diff --git a/cmd.go b/cmd.go index 7a44da84..0e13ac3f 100644 --- a/cmd.go +++ b/cmd.go @@ -5,13 +5,11 @@ import ( "encoding/json" "errors" "fmt" - "io" "os" "os/exec" "path/filepath" "strconv" "strings" - "time" ) var cmdArgs = makeArguments() @@ -291,6 +289,8 @@ func handleCmd() (changedConfig bool, err error) { passToPacman(cmdArgs) case "G", "getpkgbuild": err = handleGetpkgbuild() + case "P", "print": + err = handlePrint() case "Y", "--yay": err = handleYay() default: @@ -314,9 +314,6 @@ func handleConfig(option string) (changedConfig bool) { config.CleanAfter = true case "noafterclean": config.CleanAfter = false - // case "printconfig": - // fmt.Printf("%#v", config) - // os.Exit(0) // case "gendb": // err = createDevelDB() // if err != nil { @@ -339,14 +336,6 @@ func handleConfig(option string) (changedConfig bool) { config.SortMode = TopDown case "--bottomup": config.SortMode = BottomUp - // case "complete": - // config.Shell = "sh" - // complete() - // os.Exit(0) - // case "fcomplete": - // config.Shell = fishShell - // complete() - // os.Exit(0) // case "help": // usage() // os.Exit(0) @@ -367,12 +356,32 @@ func handleVersion() { fmt.Printf("yay v%s\n", version) } +func handlePrint() (err error) { + switch { + case cmdArgs.existsArg("d", "defaultconfig"): + fmt.Printf("%#v", config) + case cmdArgs.existsArg("n", "numberupgrades"): + case cmdArgs.existsArg("u", "upgrades"): + case cmdArgs.existsArg("c", "complete"): + switch { + case cmdArgs.existsArg("f", "fish"): + complete("fish") + default: + complete("sh") + } + case cmdArgs.existsArg("s", "stats"): + err = localStatistics() + default: + return nil + } + + return nil +} + func handleYay() (err error) { //_, options, targets := cmdArgs.formatArgs() if cmdArgs.existsArg("h", "help") { usage() - } else if cmdArgs.existsArg("printconfig") { - fmt.Printf("%#v", config) } else if cmdArgs.existsArg("gendb") { err = createDevelDB() if err != nil { @@ -382,14 +391,6 @@ func handleYay() (err error) { if err != nil { return } - } else if cmdArgs.existsArg("complete") { - config.Shell = "sh" - complete() - } else if cmdArgs.existsArg("fcomplete") { - config.Shell = "fish" - complete() - } else if cmdArgs.existsArg("stats") { - err = localStatistics() } else if cmdArgs.existsArg("cleandeps") { err = cleanDependencies() } else if len(cmdArgs.targets) > 0 { @@ -634,36 +635,6 @@ func numberMenu(pkgS []string, flags []string) (err error) { return err } -// Complete provides completion info for shells -func complete() error { - path := completionFile + config.Shell + ".cache" - info, err := os.Stat(path) - if os.IsNotExist(err) || time.Since(info.ModTime()).Hours() > 48 { - os.MkdirAll(filepath.Dir(completionFile), 0755) - out, errf := os.Create(path) - if errf != nil { - return errf - } - - if createAURList(out) != nil { - defer os.Remove(path) - } - erra := createRepoList(out) - - out.Close() - return erra - } - - in, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644) - if err != nil { - return err - } - defer in.Close() - - _, err = io.Copy(os.Stdout, in) - return err -} - // passToPacman outsorces execution to pacman binary without modifications. func passToPacman(args *arguments) error { var cmd *exec.Cmd diff --git a/completions.go b/completions.go index 730fd04b..3d18a447 100644 --- a/completions.go +++ b/completions.go @@ -3,16 +3,17 @@ package main import ( "bufio" "fmt" + "io" "net/http" "os" + "path/filepath" + "time" alpm "github.com/jguer/go-alpm" ) -const fishShell = "fish" - //CreateAURList creates a new completion file -func createAURList(out *os.File) (err error) { +func createAURList(out *os.File, shell string) (err error) { resp, err := http.Get("https://aur.archlinux.org/packages.gz") if err != nil { return err @@ -25,7 +26,7 @@ func createAURList(out *os.File) (err error) { for scanner.Scan() { fmt.Print(scanner.Text()) out.WriteString(scanner.Text()) - if config.Shell == fishShell { + if shell == "fish" { fmt.Print("\tAUR\n") out.WriteString("\tAUR\n") } else { @@ -38,7 +39,7 @@ func createAURList(out *os.File) (err error) { } //CreatePackageList appends Repo packages to completion cache -func createRepoList(out *os.File) (err error) { +func createRepoList(out *os.File, shell string) (err error) { dbList, err := alpmHandle.SyncDbs() if err != nil { return @@ -48,7 +49,7 @@ func createRepoList(out *os.File) (err error) { _ = db.PkgCache().ForEach(func(pkg alpm.Package) error { fmt.Print(pkg.Name()) out.WriteString(pkg.Name()) - if config.Shell == fishShell { + if shell == "fish" { fmt.Print("\t" + pkg.DB().Name() + "\n") out.WriteString("\t" + pkg.DB().Name() + "\n") } else { @@ -61,3 +62,40 @@ func createRepoList(out *os.File) (err error) { }) return nil } + +// Complete provides completion info for shells +func complete(shell string) error { + var path string + + if shell == "fish" { + path = completionFile + "fish" + ".cache" + } else { + path = completionFile + "sh" + ".cache" + } + info, err := os.Stat(path) + + if os.IsNotExist(err) || time.Since(info.ModTime()).Hours() > 48 { + os.MkdirAll(filepath.Dir(completionFile), 0755) + out, errf := os.Create(path) + if errf != nil { + return errf + } + + if createAURList(out, shell) != nil { + defer os.Remove(path) + } + erra := createRepoList(out, shell) + + out.Close() + return erra + } + + in, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return err + } + defer in.Close() + + _, err = io.Copy(os.Stdout, in) + return err +} diff --git a/config.go b/config.go index 524a9aa5..57d60996 100644 --- a/config.go +++ b/config.go @@ -28,7 +28,6 @@ type Configuration struct { BuildDir string `json:"buildDir"` Editor string `json:"editor"` MakepkgBin string `json:"makepkgbin"` - Shell string `json:"-"` PacmanBin string `json:"pacmanbin"` PacmanConf string `json:"pacmanconf"` TarBin string `json:"tarbin"` diff --git a/parser.go b/parser.go index 67e88d7b..b245f0e3 100644 --- a/parser.go +++ b/parser.go @@ -145,6 +145,8 @@ func (parser *arguments) needRoot() bool { //yay specific case "Y", "yay": return false + case "P", "print": + return false case "G", "getpkgbuild": return false default: @@ -328,6 +330,8 @@ func isOp(op string) bool { //yay specific case "Y", "yay": return true + case "P", "print": + return true case "G", "getpkgbuild": return true default: diff --git a/yay.fish b/yay.fish index b05fdc77..9db242c5 100644 --- a/yay.fish +++ b/yay.fish @@ -5,18 +5,20 @@ set -l progname yay set -l listinstalled "(pacman -Q | string replace ' ' \t)" # This might be an issue if another package manager is also installed (e.g. for containers) -set -l listall "(yay --fcomplete)" +set -l listall "(yay -Pcf)" set -l listrepos "(__fish_print_pacman_repos)" set -l listgroups "(pacman -Sg)\t'Package Group'" set -l listpacman "(__fish_print_packages)" set -l noopt 'not __fish_contains_opt -s S -s D -s Q -s R -s U -s T -s F database query sync remove upgrade deptest files' set -l database '__fish_contains_opt -s D database' set -l getpkgbuild '__fish_contains_opt -s G getpkgbuild' +set -l print '__fish_contains_opt -s P print' set -l query '__fish_contains_opt -s Q query' set -l remove '__fish_contains_opt -s R remove' set -l sync '__fish_contains_opt -s S sync' set -l upgrade '__fish_contains_opt -s U upgrade' set -l files '__fish_contains_opt -s F files' +set -l yayspecific '__fish_contains_opt -s Y yay' complete -c pacman -e complete -c pacman -f @@ -28,6 +30,7 @@ complete -c $progname -n $noopt -a "-Q" -d "Query the package database" complete -c $progname -s D -f -l database -n $noopt -d 'Modify the package database' complete -c $progname -s Q -f -l query -n $noopt -d 'Query the package database' complete -c $progname -s G -f -l getpkgbuild -n $noopt -d 'Get PKGBUILD from ABS or AUR' +complete -c $progname -s P -f -l print -n $noopt -d 'Print information' complete -c $progname -s R -f -l remove -n $noopt -d 'Remove packages from the system' complete -c $progname -s S -f -l sync -n $noopt -d 'Synchronize packages' complete -c $progname -s T -f -l deptest -n $noopt -d 'Check if dependencies are installed' diff --git a/zsh-completion b/zsh-completion index 2ea1538f..5c9fbd8d 100644 --- a/zsh-completion +++ b/zsh-completion @@ -5,509 +5,509 @@ setopt extendedglob # options for passing to _arguments: main pacman commands _pacman_opts_commands=( - {-D,--database}'[Modify database]' - {-F,--files}'[Query the files database]' - {-G,--getpkgbuild}'[Get PKGBUILD from ABS or AUR]' - {-Q,--query}'[Query the package database]' - {-R,--remove}'[Remove a package from the system]' - {-S,--sync}'[Synchronize packages]' - {-T,--deptest}'[Check if dependencies are installed]' - {-U,--upgrade}'[Upgrade a package]' - {-V,--version}'[Display version and exit]' - '(-h --help)'{-h,--help}'[Display usage]' + {-D,--database}'[Modify database]' + {-F,--files}'[Query the files database]' + {-G,--getpkgbuild}'[Get PKGBUILD from ABS or AUR]' + {-Q,--query}'[Query the package database]' + {-R,--remove}'[Remove a package from the system]' + {-S,--sync}'[Synchronize packages]' + {-T,--deptest}'[Check if dependencies are installed]' + {-U,--upgrade}'[Upgrade a package]' + {-V,--version}'[Display version and exit]' + '(-h --help)'{-h,--help}'[Display usage]' ) # options for passing to _arguments: options common to all commands _pacman_opts_common=( - '--arch[Set an alternate architecture]' - {-b,--dbpath}'[Alternate database location]:database_location:_files -/' - '--color[colorize the output]:color options:(always never auto)' - {-h,--help}'[Display syntax for the given operation]' - {-r,--root}'[Set alternate installation root]:installation root:_files -/' - {-v,--verbose}'[Be more verbose]' - '--cachedir[Alternate package cache location]:cache_location:_files -/' - '--config[An alternate configuration file]:config file:_files' - '--confirm[Always ask for confirmation]' - '--debug[Display debug messages]' - '--gpgdir[Set an alternate directory for GnuPG (instead of /etc/pacman.d/gnupg)]: :_files -/' - '--hookdir[Set an alternate hook location]: :_files -/' - '--logfile[An alternate log file]:config file:_files' - '--noconfirm[Do not ask for confirmation]' - '--noprogressbar[Do not show a progress bar when downloading files]' - '--noscriptlet[Do not execute the install scriptlet if one exists]' - '--bottomup[Show AUR packages first]' - '--topdown[Show repository packages first]' + '--arch[Set an alternate architecture]' + {-b,--dbpath}'[Alternate database location]:database_location:_files -/' + '--color[colorize the output]:color options:(always never auto)' + {-h,--help}'[Display syntax for the given operation]' + {-r,--root}'[Set alternate installation root]:installation root:_files -/' + {-v,--verbose}'[Be more verbose]' + '--cachedir[Alternate package cache location]:cache_location:_files -/' + '--config[An alternate configuration file]:config file:_files' + '--confirm[Always ask for confirmation]' + '--debug[Display debug messages]' + '--gpgdir[Set an alternate directory for GnuPG (instead of /etc/pacman.d/gnupg)]: :_files -/' + '--hookdir[Set an alternate hook location]: :_files -/' + '--logfile[An alternate log file]:config file:_files' + '--noconfirm[Do not ask for confirmation]' + '--noprogressbar[Do not show a progress bar when downloading files]' + '--noscriptlet[Do not execute the install scriptlet if one exists]' + '--bottomup[Show AUR packages first]' + '--topdown[Show repository packages first]' ) # options for passing to _arguments: options for --upgrade commands _pacman_opts_pkgfile=( - '*-d[Skip dependency checks]' - '*--nodeps[Skip dependency checks]' - '*--assume-installed[Add virtual package to satisfy dependencies]' - '--dbonly[Only remove database entry, do not remove files]' - '--force[Overwrite conflicting files]' - '--needed[Do not reinstall up to date packages]' - '--asdeps[mark packages as non-explicitly installed]' - '--asexplicit[mark packages as explicitly installed]' - {-p,--print}'[Only print the targets instead of performing the operation]' - '*--ignore[Ignore a package upgrade]:package: _pacman_completions_all_packages' - '*--ignoregroup[Ignore a group upgrade]:package group:_pacman_completions_all_groups' - '--print-format[Specify how the targets should be printed]' - '*:package file:_files -g "*.pkg.tar*~*.sig(.,@)"' + '*-d[Skip dependency checks]' + '*--nodeps[Skip dependency checks]' + '*--assume-installed[Add virtual package to satisfy dependencies]' + '--dbonly[Only remove database entry, do not remove files]' + '--force[Overwrite conflicting files]' + '--needed[Do not reinstall up to date packages]' + '--asdeps[mark packages as non-explicitly installed]' + '--asexplicit[mark packages as explicitly installed]' + {-p,--print}'[Only print the targets instead of performing the operation]' + '*--ignore[Ignore a package upgrade]:package: _pacman_completions_all_packages' + '*--ignoregroup[Ignore a group upgrade]:package group:_pacman_completions_all_groups' + '--print-format[Specify how the targets should be printed]' + '*:package file:_files -g "*.pkg.tar*~*.sig(.,@)"' ) # options for passing to _arguments: subactions for --query command _pacman_opts_query_actions=( - '(-Q --query)'{-Q,--query} - {-g,--groups}'[View all members of a package group]:*:package groups:->query_group' - {-o,--owns}'[Query the package that owns a file]:file:_files' - {-p,--file}'[Package file to query]:*:package file:->query_file' - {-s,--search}'[Search package names and descriptions]:*:search text:->query_search' + '(-Q --query)'{-Q,--query} + {-g,--groups}'[View all members of a package group]:*:package groups:->query_group' + {-o,--owns}'[Query the package that owns a file]:file:_files' + {-p,--file}'[Package file to query]:*:package file:->query_file' + {-s,--search}'[Search package names and descriptions]:*:search text:->query_search' ) # options for passing to _arguments: options for --query and subcommands _pacman_opts_query_modifiers=( - {-c,--changelog}'[List package changelog]' - {-d,--deps}'[List packages installed as dependencies]' - {-e,--explicit}'[List packages explicitly installed]' - {\*-i,\*--info}'[View package information]' - {\*-k,\*--check}'[Check package files]' - {-l,--list}'[List package contents]' - {-m,--foreign}'[List installed packages not found in sync db(s)]' - {-n,--native}'[List installed packages found in sync db(s)]' - {-q,--quiet}'[Show less information for query and search]' - {-t,--unrequired}'[List packages not required by any package]' - {-u,--upgrades}'[List packages that can be upgraded]' + {-c,--changelog}'[List package changelog]' + {-d,--deps}'[List packages installed as dependencies]' + {-e,--explicit}'[List packages explicitly installed]' + {\*-i,\*--info}'[View package information]' + {\*-k,\*--check}'[Check package files]' + {-l,--list}'[List package contents]' + {-m,--foreign}'[List installed packages not found in sync db(s)]' + {-n,--native}'[List installed packages found in sync db(s)]' + {-q,--quiet}'[Show less information for query and search]' + {-t,--unrequired}'[List packages not required by any package]' + {-u,--upgrades}'[List packages that can be upgraded]' ) # options for passing to _arguments: options for --remove command _pacman_opts_remove=( - {-c,--cascade}'[Remove all dependent packages]' - {-d,--nodeps}'[Skip dependency checks]' - '*--assume-installed[Add virtual package to satisfy dependencies]' - {-n,--nosave}'[Remove protected configuration files]' - {-p,--print}'[Only print the targets instead of performing the operation]' - {\*-s,\*--recursive}'[Remove dependencies not required by other packages]' - {-u,--unneeded}'[Remove unneeded packages]' - '--dbonly[Only remove database entry, do not remove files]' - '--print-format[Specify how the targets should be printed]' - '*:installed package:_pacman_completions_installed_packages' + {-c,--cascade}'[Remove all dependent packages]' + {-d,--nodeps}'[Skip dependency checks]' + '*--assume-installed[Add virtual package to satisfy dependencies]' + {-n,--nosave}'[Remove protected configuration files]' + {-p,--print}'[Only print the targets instead of performing the operation]' + {\*-s,\*--recursive}'[Remove dependencies not required by other packages]' + {-u,--unneeded}'[Remove unneeded packages]' + '--dbonly[Only remove database entry, do not remove files]' + '--print-format[Specify how the targets should be printed]' + '*:installed package:_pacman_completions_installed_packages' ) _pacman_opts_database=( - '--asdeps[mark packages as non-explicitly installed]' - '--asexplicit[mark packages as explicitly installed]' - '*:installed package:_pacman_completions_installed_packages' + '--asdeps[mark packages as non-explicitly installed]' + '--asexplicit[mark packages as explicitly installed]' + '*:installed package:_pacman_completions_installed_packages' ) _pacman_opts_files=( - {-l,--list}'[List the files owned by the queried package]:package:_pacman_completions_all_packages' - {-o,--owns}'[Query the package that owns]:files:_files' - {-s,--search}'[Search package file names for matching strings]:files:_files' - {-x,--regex}'[Enable searching using regluar expressions]:regex:' - {-y,--refresh}'[Download fresh files databases from the server]' - '--machinereadable[Produce machine-readable output]' - {-q,--quiet}'[Show less information for query and search]' + {-l,--list}'[List the files owned by the queried package]:package:_pacman_completions_all_packages' + {-o,--owns}'[Query the package that owns]:files:_files' + {-s,--search}'[Search package file names for matching strings]:files:_files' + {-x,--regex}'[Enable searching using regluar expressions]:regex:' + {-y,--refresh}'[Download fresh files databases from the server]' + '--machinereadable[Produce machine-readable output]' + {-q,--quiet}'[Show less information for query and search]' ) # options for passing to _arguments: options for --sync command _pacman_opts_sync_actions=( - '(-S --sync)'{-S,--sync} - {\*-c,\*--clean}'[Remove old packages from cache]:\*:clean:->sync_clean' - {-g,--groups}'[View all members of a package group]:*:package groups:->sync_group' - {-s,--search}'[Search package names and descriptions]:*:search text:->sync_search' - '--dbonly[Only remove database entry, do not remove files]' - '--needed[Do not reinstall up to date packages]' - '--recursive[Reinstall all dependencies of target packages]' + '(-S --sync)'{-S,--sync} + {\*-c,\*--clean}'[Remove old packages from cache]:\*:clean:->sync_clean' + {-g,--groups}'[View all members of a package group]:*:package groups:->sync_group' + {-s,--search}'[Search package names and descriptions]:*:search text:->sync_search' + '--dbonly[Only remove database entry, do not remove files]' + '--needed[Do not reinstall up to date packages]' + '--recursive[Reinstall all dependencies of target packages]' ) # options for passing to _arguments: options for --sync command _pacman_opts_sync_modifiers=( - {\*-d,\*--nodeps}'[Skip dependency checks]' - '*--assume-installed[Add virtual package to satisfy dependencies]' - {\*-i,\*--info}'[View package information]' - {-l,--list}'[List all packages in a repository]' - {-p,--print}'[Print download URIs for each package to be installed]' - {-q,--quiet}'[Show less information for query and search]' - {\*-u,\*--sysupgrade}'[Upgrade all out-of-date packages]' - {-w,--downloadonly}'[Download packages only]' - {\*-y,\*--refresh}'[Download fresh package databases]' - '*--ignore[Ignore a package upgrade]:package: _pacman_completions_all_packages' - '*--ignoregroup[Ignore a group upgrade]:package group:_pacman_completions_all_groups' - '--asdeps[Install packages as non-explicitly installed]' - '--asexplicit[Install packages as explicitly installed]' - '--force[Overwrite conflicting files]' - '--print-format[Specify how the targets should be printed]' + {\*-d,\*--nodeps}'[Skip dependency checks]' + '*--assume-installed[Add virtual package to satisfy dependencies]' + {\*-i,\*--info}'[View package information]' + {-l,--list}'[List all packages in a repository]' + {-p,--print}'[Print download URIs for each package to be installed]' + {-q,--quiet}'[Show less information for query and search]' + {\*-u,\*--sysupgrade}'[Upgrade all out-of-date packages]' + {-w,--downloadonly}'[Download packages only]' + {\*-y,\*--refresh}'[Download fresh package databases]' + '*--ignore[Ignore a package upgrade]:package: _pacman_completions_all_packages' + '*--ignoregroup[Ignore a group upgrade]:package group:_pacman_completions_all_groups' + '--asdeps[Install packages as non-explicitly installed]' + '--asexplicit[Install packages as explicitly installed]' + '--force[Overwrite conflicting files]' + '--print-format[Specify how the targets should be printed]' ) # handles --help subcommand _pacman_action_help() { - _arguments -s : \ - "$_pacman_opts_commands[@]" + _arguments -s : \ + "$_pacman_opts_commands[@]" } # handles cases where no subcommand has yet been given _pacman_action_none() { - _arguments -s : \ - "$_pacman_opts_commands[@]" + _arguments -s : \ + "$_pacman_opts_commands[@]" } # handles --query subcommand _pacman_action_query() { - local context state line - typeset -A opt_args + local context state line + typeset -A opt_args - case $state in - query_file) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_query_modifiers[@]" \ - '*:package file:_files -g "*.pkg.tar*~*.sig(.,@)"' - ;; - query_group) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_query_modifiers[@]" \ - '*:groups:_pacman_completions_installed_groups' - ;; - query_owner) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_query_modifiers[@]" \ - '*:file:_files' - ;; - query_search) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_query_modifiers[@]" \ - '*:search text: ' - ;; - *) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_query_actions[@]" \ - "$_pacman_opts_query_modifiers[@]" \ - '*:package:_pacman_completions_installed_packages' - ;; - esac + case $state in + query_file) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_query_modifiers[@]" \ + '*:package file:_files -g "*.pkg.tar*~*.sig(.,@)"' + ;; + query_group) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_query_modifiers[@]" \ + '*:groups:_pacman_completions_installed_groups' + ;; + query_owner) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_query_modifiers[@]" \ + '*:file:_files' + ;; + query_search) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_query_modifiers[@]" \ + '*:search text: ' + ;; + *) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_query_actions[@]" \ + "$_pacman_opts_query_modifiers[@]" \ + '*:package:_pacman_completions_installed_packages' + ;; + esac } # handles --remove subcommand _pacman_action_remove() { - _arguments -s : \ - '(--remove -R)'{-R,--remove} \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_remove[@]" + _arguments -s : \ + '(--remove -R)'{-R,--remove} \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_remove[@]" } # handles --database subcommand _pacman_action_database() { - _arguments -s : \ - '(--database -D)'{-D,--database} \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_database[@]" + _arguments -s : \ + '(--database -D)'{-D,--database} \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_database[@]" } # handles --files subcommand _pacman_action_files() { - _arguments -s : \ - '(--files -F)'{-F,--files} \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_files[@]" + _arguments -s : \ + '(--files -F)'{-F,--files} \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_files[@]" } _pacman_action_deptest () { - _arguments -s : \ - '(--deptest)-T' \ - "$_pacman_opts_common[@]" \ - ":packages:_pacman_all_packages" + _arguments -s : \ + '(--deptest)-T' \ + "$_pacman_opts_common[@]" \ + ":packages:_pacman_all_packages" } # handles --sync subcommand _pacman_action_sync() { - local context state line - typeset -A opt_args - if (( $+words[(r)--clean] )); then - state=sync_clean - elif (( $+words[(r)--groups] )); then - state=sync_group - elif (( $+words[(r)--search] )); then - state=sync_search - fi + local context state line + typeset -A opt_args + if (( $+words[(r)--clean] )); then + state=sync_clean + elif (( $+words[(r)--groups] )); then + state=sync_group + elif (( $+words[(r)--search] )); then + state=sync_search + fi - case $state in - sync_clean) - _arguments -s : \ - {\*-c,\*--clean}'[Remove old packages from cache]' \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_sync_modifiers[@]" - ;; - sync_group) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_sync_modifiers[@]" \ - '(-g --group)'{-g,--groups} \ - '*:package group:_pacman_completions_all_groups' - ;; - sync_search) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_sync_modifiers[@]" \ - '*:search text: ' - ;; - *) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_sync_actions[@]" \ - "$_pacman_opts_sync_modifiers[@]" \ - '*:package:_pacman_completions_all_packages' - ;; - esac + case $state in + sync_clean) + _arguments -s : \ + {\*-c,\*--clean}'[Remove old packages from cache]' \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_sync_modifiers[@]" + ;; + sync_group) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_sync_modifiers[@]" \ + '(-g --group)'{-g,--groups} \ + '*:package group:_pacman_completions_all_groups' + ;; + sync_search) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_sync_modifiers[@]" \ + '*:search text: ' + ;; + *) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_sync_actions[@]" \ + "$_pacman_opts_sync_modifiers[@]" \ + '*:package:_pacman_completions_all_packages' + ;; + esac } # handles --upgrade subcommand _pacman_action_upgrade() { - _arguments -s : \ - '(-U --upgrade)'{-U,--upgrade} \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_pkgfile[@]" + _arguments -s : \ + '(-U --upgrade)'{-U,--upgrade} \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_pkgfile[@]" } # handles --version subcommand _pacman_action_version() { - # no further arguments - return 0 + # no further arguments + return 0 } # provides completions for package groups _pacman_completions_all_groups() { - local -a cmd groups - _pacman_get_command - groups=( $(_call_program groups $cmd[@] -Sg) ) - typeset -U groups + local -a cmd groups + _pacman_get_command + groups=( $(_call_program groups $cmd[@] -Sg) ) + typeset -U groups - if [[ ${words[CURRENT-1]} == '--ignoregroup' ]]; then - _sequence compadd -S ',' "$@" -a groups - else - compadd "$@" -a groups - fi + if [[ ${words[CURRENT-1]} == '--ignoregroup' ]]; then + _sequence compadd -S ',' "$@" -a groups + else + compadd "$@" -a groups + fi } # provides completions for packages available from repositories # these can be specified as either 'package' or 'repository/package' _pacman_completions_all_packages() { - local -a seq sep cmd packages repositories packages_long + local -a seq sep cmd packages repositories packages_long - if [[ ${words[CURRENT-1]} == '--ignore' ]]; then - seq='_sequence' - sep=(-S ',') - else - seq= - sep=() - fi + if [[ ${words[CURRENT-1]} == '--ignore' ]]; then + seq='_sequence' + sep=(-S ',') + else + seq= + sep=() + fi - if compset -P1 '*/*'; then - packages=( $(_call_program packages yay --complete ${words[CURRENT]%/*}) ) - typeset -U packages - ${seq} _wanted repo_packages expl "repository/package" compadd ${sep[@]} ${(@)packages} - else - packages=( $(_call_program packages yay --complete ) ) - typeset -U packages - ${seq} _wanted packages expl "packages" compadd ${sep[@]} - "${(@)packages}" + if compset -P1 '*/*'; then + packages=( $(_call_program packages yay -Pc ${words[CURRENT]%/*}) ) + typeset -U packages + ${seq} _wanted repo_packages expl "repository/package" compadd ${sep[@]} ${(@)packages} + else + packages=( $(_call_program packages yay -Pc ) ) + typeset -U packages + ${seq} _wanted packages expl "packages" compadd ${sep[@]} - "${(@)packages}" - repositories=(${(o)${${${(M)${(f)"$(/dev/null") - integer i - for (( i = 2; i < CURRENT - 1; i++ )); do - if [[ ${words[i]} = "--config" || ${words[i]} = "--root" ]]; then - cmd+=( ${words[i,i+1]} ) - fi - done + # this is mostly nicked from _perforce + cmd=( "pacman" "2>/dev/null") + integer i + for (( i = 2; i < CURRENT - 1; i++ )); do + if [[ ${words[i]} = "--config" || ${words[i]} = "--root" ]]; then + cmd+=( ${words[i,i+1]} ) + fi + done } # main dispatcher _pacman_zsh_comp() { - local -a args cmds; - local tmp - args=( ${${${(M)words:#-*}#-}:#-*} ) - for tmp in $words; do - cmds+=("${${_pacman_opts_commands[(r)*$tmp\[*]%%\[*}#*\)}") - done - case $args in #$words[2] in - h*) - if (( ${(c)#args} <= 1 && ${(w)#cmds} <= 1 )); then - _pacman_action_help - else - _message "no more arguments" - fi - ;; - *h*) - _message "no more arguments" - ;; - D*) - _pacman_action_database - ;; - F*) - _pacman_action_files - ;; - Q*g*) # ipkg groups - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_query_modifiers[@]" \ - '*:groups:_pacman_completions_installed_groups' - ;; - Q*o*) # file - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_query_modifiers[@]" \ - '*:package file:_files' - ;; - Q*p*) # file *.pkg.tar* - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_query_modifiers[@]" \ - '*:package file:_files -g "*.pkg.tar*~*.sig(.,@)"' - ;; - T*) - _pacman_action_deptest - ;; - Q*) - _pacman_action_query - ;; - R*) - _pacman_action_remove - ;; - S*c*) # no completion - _arguments -s : \ - '(-c --clean)'{\*-c,\*--clean}'[Remove all files from the cache]' \ - "$_pacman_opts_common[@]" - ;; - S*l*) # repos - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_sync_modifiers[@]" \ - '*:package repo:_pacman_completions_repositories' \ - ;; - S*g*) # pkg groups - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_sync_modifiers[@]" \ - '*:package group:_pacman_completions_all_groups' - ;; - S*s*) - _arguments -s : \ - "$_pacman_opts_common[@]" \ - "$_pacman_opts_sync_modifiers[@]" \ - '*:search text: ' - ;; - S*) - _pacman_action_sync - ;; - T*) - _arguments -s : \ - '-T' \ - "$_pacman_opts_common[@]" \ - ":packages:_pacman_all_packages" - ;; - U*) - _pacman_action_upgrade - ;; - V*) - _pacman_action_version - ;; - *) + local -a args cmds; + local tmp + args=( ${${${(M)words:#-*}#-}:#-*} ) + for tmp in $words; do + cmds+=("${${_pacman_opts_commands[(r)*$tmp\[*]%%\[*}#*\)}") + done + case $args in #$words[2] in + h*) + if (( ${(c)#args} <= 1 && ${(w)#cmds} <= 1 )); then + _pacman_action_help + else + _message "no more arguments" + fi + ;; + *h*) + _message "no more arguments" + ;; + D*) + _pacman_action_database + ;; + F*) + _pacman_action_files + ;; + Q*g*) # ipkg groups + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_query_modifiers[@]" \ + '*:groups:_pacman_completions_installed_groups' + ;; + Q*o*) # file + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_query_modifiers[@]" \ + '*:package file:_files' + ;; + Q*p*) # file *.pkg.tar* + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_query_modifiers[@]" \ + '*:package file:_files -g "*.pkg.tar*~*.sig(.,@)"' + ;; + T*) + _pacman_action_deptest + ;; + Q*) + _pacman_action_query + ;; + R*) + _pacman_action_remove + ;; + S*c*) # no completion + _arguments -s : \ + '(-c --clean)'{\*-c,\*--clean}'[Remove all files from the cache]' \ + "$_pacman_opts_common[@]" + ;; + S*l*) # repos + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_sync_modifiers[@]" \ + '*:package repo:_pacman_completions_repositories' \ + ;; + S*g*) # pkg groups + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_sync_modifiers[@]" \ + '*:package group:_pacman_completions_all_groups' + ;; + S*s*) + _arguments -s : \ + "$_pacman_opts_common[@]" \ + "$_pacman_opts_sync_modifiers[@]" \ + '*:search text: ' + ;; + S*) + _pacman_action_sync + ;; + T*) + _arguments -s : \ + '-T' \ + "$_pacman_opts_common[@]" \ + ":packages:_pacman_all_packages" + ;; + U*) + _pacman_action_upgrade + ;; + V*) + _pacman_action_version + ;; + *) - case ${(M)words:#--*} in - *--help*) - if (( ${(w)#cmds} == 1 )); then - _pacman_action_help - else - return 0; - fi - ;; - *--sync*) - _pacman_action_sync - ;; - *--query*) - _pacman_action_query - ;; - *--remove*) - _pacman_action_remove - ;; - *--deptest*) - _pacman_action_deptest - ;; - *--database*) - _pacman_action_database - ;; - *--files*) - _pacman_action_files - ;; - *--version*) - _pacman_action_version - ;; - *--upgrade*) - _pacman_action_upgrade - ;; - *) - _pacman_action_none - ;; - esac - ;; - esac + case ${(M)words:#--*} in + *--help*) + if (( ${(w)#cmds} == 1 )); then + _pacman_action_help + else + return 0; + fi + ;; + *--sync*) + _pacman_action_sync + ;; + *--query*) + _pacman_action_query + ;; + *--remove*) + _pacman_action_remove + ;; + *--deptest*) + _pacman_action_deptest + ;; + *--database*) + _pacman_action_database + ;; + *--files*) + _pacman_action_files + ;; + *--version*) + _pacman_action_version + ;; + *--upgrade*) + _pacman_action_upgrade + ;; + *) + _pacman_action_none + ;; + esac + ;; + esac } _pacman_comp() { - case "$service" in - yay) - _pacman_zsh_comp "$@" - ;; - *) - _message "Error" - ;; - esac + case "$service" in + yay) + _pacman_zsh_comp "$@" + ;; + *) + _message "Error" + ;; + esac } _pacman_comp "$@"