aboutsummaryrefslogtreecommitdiff
path: root/completion
diff options
context:
space:
mode:
authorkitsunyan2018-05-05 03:51:07 +0000
committerkitsunyan2018-05-05 03:51:07 +0000
commitdbe10af0544069641f48cee263717eff68dee07e (patch)
tree45c2f6d7b9394235df634aa423978b780c750d54 /completion
parent5902c51fe5b81ec6e8651eb2d29255ec6b9659fa (diff)
Add zsh completion
Diffstat (limited to 'completion')
-rwxr-xr-xcompletion/make.sh61
-rw-r--r--completion/zsh.patch50
2 files changed, 100 insertions, 11 deletions
diff --git a/completion/make.sh b/completion/make.sh
index 51b0730..323dad6 100755
--- a/completion/make.sh
+++ b/completion/make.sh
@@ -1,21 +1,60 @@
#!/bin/bash
pacman_bash_completion='/usr/share/bash-completion/completions/pacman'
+pacman_zsh_completion='/usr/share/zsh/site-functions/_pacman'
+
+function error() {
+ local code="$?"
+ rm "$1"
+ exit "$code"
+}
+
+function apply-patch() {
+ patch -sNp1 -r - --no-backup-if-mismatch -i "$1"
+}
function delete-shell-fn() {
perl -0777 -pe 's/\n'"$1"'\(\) *\{\n([^}].*\n)*\}\n*/\n\n/g;s/\n{3,}/\n\n/g'
}
-cat "$pacman_bash_completion" |
-delete-shell-fn '_pacman_keyids' |
-delete-shell-fn '_pacman_key' |
-delete-shell-fn '_makepkg' |
-sed 's/^_pacman() {$/_pakku() {/' \
-> 'bash' || {
- rm 'bash'
- exit 1
+function delete-shell-array() {
+ perl -0777 -pe 's/\n'"$1"'=\(\n([^)].*\n)*\)\n?//g'
+}
+
+[ "$1" = 'bash' ] && {
+ cat "$pacman_bash_completion" |
+ delete-shell-fn '_pacman_keyids' |
+ delete-shell-fn '_pacman_key' |
+ delete-shell-fn '_makepkg' |
+ sed 's/^_pacman() {$/_pakku() {/' \
+ > 'bash' ||
+ error 'bash'
+
+ apply-patch 'bash.patch' ||
+ error 'bash'
+
+ exit 0
}
-patch -sNp1 -r - --no-backup-if-mismatch -i 'bash.patch' || {
- rm 'bash'
- exit 1
+
+[ "$1" = 'zsh' ] && {
+ cat "$pacman_zsh_completion" |
+ delete-shell-array '_key_shortopts' |
+ delete-shell-array '_key_longopts' |
+ delete-shell-array '_pacman_key_options' |
+ delete-shell-fn '_pacman_key' |
+ delete-shell-fn '_keys' |
+ delete-shell-array '_makepkg_shortopts' |
+ delete-shell-array '_makepkg_longopts' |
+ delete-shell-fn '_makepkg_action_none' |
+ delete-shell-fn '_makepkg' |
+ sed 's/_pacman/_pakku/g' \
+ > 'zsh' ||
+ error 'zsh'
+
+ apply-patch 'zsh.patch' ||
+ error 'zsh'
+
+ exit 0
}
+
+exit 1
diff --git a/completion/zsh.patch b/completion/zsh.patch
new file mode 100644
index 0000000..c3eb8c9
--- /dev/null
+++ b/completion/zsh.patch
@@ -0,0 +1,50 @@
+--- a/zsh
++++ b/zsh
+@@ -1,1 +1,1 @@
+-#compdef pacman pacman.static=pacman pacman-key makepkg
++#compdef pakku
+@@ -139,2 +139,6 @@
+ '--print-format[Specify how the targets should be printed]'
++ {-n,--build}'[Build targets from source]'
++ '--keyserver[Keyserver to receive keys from]'
++ '--noaur[Disable all AUR operations]'
++ {-z,--source}'[Retrieve PKGBUILD source]'
+ )
+@@ -310,1 +314,6 @@
+- packages=( $(_call_program packages $cmd[@] -Sql ${words[CURRENT]%/*}) )
++ if [[ ${words[CURRENT]%/*} == 'aur' ]]; then
++ packages=( $(_call_program packages $cmd[@] -Ss ${words[CURRENT]#*/} |
++ grep -Po '(?<=^aur/)[^ ]+') )
++ else
++ packages=( $(_call_program packages $cmd[@] -Sql ${words[CURRENT]%/*}) )
++ fi
+@@ -314,1 +323,1 @@
+- packages=( $(_call_program packages $cmd[@] -Sql) )
++ packages=( $(_call_program packages $cmd[@] -Ssq ${words[CURRENT]}) )
+@@ -318,1 +327,1 @@
+- repositories=(${(o)${${${(M)${(f)"$(</etc/pacman.conf)"}:#\[*}/\[/}/\]/}:#options})
++ repositories=(${(o)${${${(M)${(f)"$(</etc/pacman.conf)"}:#\[*}/\[/}/\]/}:#options} aur)
+@@ -361,1 +370,1 @@
+- cmd=( "pacman" "2>/dev/null")
++ cmd=("pakku" "2>/dev/null")
+@@ -371,1 +380,1 @@
+-_pakku_zsh_comp() {
++_pakku_comp() {
+@@ -501,17 +510,0 @@
+-
+-_pakku_comp() {
+- case "$service" in
+- makepkg)
+- _makepkg "$@"
+- ;;
+- pacman-key)
+- _pakku_key "$@"
+- ;;
+- pacman)
+- _pakku_zsh_comp "$@"
+- ;;
+- *)
+- _message "Error"
+- ;;
+- esac
+-}