summarylogtreecommitdiffstats
path: root/zshcomp.patch
blob: eaaad5c807c1b0bcb81b05b1eec556f038d55cb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
--- a/init/zsh-functions/_module
+++ a/init/zsh-functions/_module
@@ -4,17 +4,35 @@
 # Zsh command-line completion for module
 # Copyright (C) 2017 Xavier Delaruelle <xavier.delaruelle@cea.fr>
 #
+# patched version:
+#  - directory-wise completion
+#
 
-_module_avail() {
-   module avail -t 2>&1 | sed '
-      /^-\+/d; /^\s*$/d;
-      /->.*$/d;
-      /:$/d;
-      /:ERROR:/d;
-      s#^\(.*\)/\(.\+\)(.*default.*)#\1\n\1\/\2#;
-      s#(.*)$##g;
-      s#\s*$##g;
-      s#/*$##g;'
+function _module_completion () {
+   emulate -L zsh
+   local _module_path_prefix
+   local -a _module_search_path _module_type_d _module_type_f
+   _module_path_prefix=$(echo ${(q)words[$CURRENT]} | sed -ne 's#\(.*/\).*#\1#p')
+   _module_search_paths=(${^${(@s/:/)MODULEPATH}}/$_module_path_prefix)
+
+   _module_type_d=()
+   _module_type_f=()
+   eval $(find $_module_search_paths -mindepth 1 -maxdepth 1 -not -name '.modulerc' -not -name '.version' -printf "_module_type_%Y+=${(q)_module_path_prefix}%P\n" 2> /dev/null)
+
+   case "$@" in
+      dir)
+         compadd ${_module_type_d}
+         ;;
+      notloaded)
+         local -a _modules_loaded=(${=LOADEDMODULES//:/})
+         compadd -q -S / ${_module_type_d}
+         compadd ${_module_type_f:|_modules_loaded}
+         ;;
+      *)
+         compadd -q -S / ${_module_type_d}
+         compadd ${_module_type_f}
+         ;;
+   esac
 }
 
 _module_savelist() {
@@ -24,16 +42,13 @@ _module_savelist() {
       /:ERROR:/d;'
 }
 
-_module_not_yet_loaded() {
-   _module_avail | sort | sed -E "\%^(${LOADEDMODULES//:/|})$%d"
-}
+_module_all_mods() {
+    _module_completion
+ }
 
 
 _module_avail_mods() {
-   local -a avail_mods;
-   avail_mods=(${$(_module_avail)})
-
-   _describe -t avail-mods 'available modulefiles' avail_mods && ret=0
+    _module_completion dir
 }
 
 _module_saved_colls() {
@@ -44,10 +59,8 @@ _module_saved_colls() {
 }
 
 _module_notloaded_mods() {
-   local -a not_yet_loaded_mods;
-   not_yet_loaded_mods=(${$(_module_not_yet_loaded)})
+   _module_completion notloaded
 
-   _describe -t avail-mods 'available modulefiles' not_yet_loaded_mods && ret=0
 }
 
 _module_loaded_mods() {
@@ -177,7 +190,7 @@ _module() {
                   '*:modulepath:_files -/' && ret=0
                ;;
             (display|help|show|test|whatis|is-loaded|is-avail|info-loaded)
-               _alternative 'avail-mods:modulefiles:{_module_avail_mods}' \
+               _alternative 'avail-mods:modulefiles:{_module_all_mods}' \
                   && ret=0
                ;;
             (append-path|prepend-path)