about summary refs log tree commit diff
path: root/Completion/Unix/Command/_lua
blob: 7254d3819efb4be3ee0d321dd71ad5423880c821 (plain) (blame)
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
#compdef lua -P lua[0-9.-]##

# Complete lua library names. We go out of our way here to support sub-modules
# (of the format foo.bar.baz), even though the way `lua -l` handles those isn't
# very nice, because it might be useful for informational purposes
(( $+functions[_lua_libraries] )) ||
_lua_libraries() {
  local p pre
  local -a tmp tmp2

  # Get Lua's library search path
  tmp=( ${(s<;>)${(@f)"$(
    _call_program library-path $words[1] -e '"print(package.path)"'
  )"}} )
  # Support C modules, which aren't explicitly included in the above
  tmp+=( ${(@)${(@M)tmp:#*'?.lua'}/%.lua/.so} )

  for p in ${(@u)tmp}; do
    # Don't recurse infinitely into the current directory; we'll just trust
    # that all other paths are sensible
    if [[ $p == './?'* ]]; then
      tmp=( ${~${${(b)p}/'\?'/'*'}}(#qN) )
    else
      tmp=( ${~${${(b)p}/'\?'/'**/*'}}(#qN) )
    fi
    tmp2+=( ${(@)tmp##${p%%'?'*}} )
  done

  tmp=( ${(@)tmp2%%(/init.lua|.lua|.so)} )
  tmp=( ${(@u)${(@)tmp//\//.}} )

  _wanted -x libraries expl 'Lua library' compadd -a "$@" - tmp
}

_lua() {
  local ret=1
  local -a context expl line state state_descr
  local -A opt_args

  # Stacking not supported, no arguments are exclusive except `-`
  _arguments -S -A '-*' : \
    '*-e+[execute specified command string]:command string' \
    '-E[ignore environment variables]' \
    '-i[enter interactive mode]' \
    '*-l+[specify library or module to require]: :_lua_libraries' \
    '-v[display version information]' \
    '(1 -)-[stop argument parsing and execute script on stdin]' \
    '1:Lua script:_files' \
    '*:: :->arg' \
  && ret=0

  [[ $state == arg ]] &&
  if [[ $line[1] == - ]]; then
    _description files expl 'script argument'
    _files "${(@)expl}" && ret=0
  else
    _normal && ret=0
  fi

  return ret
}

_lua "$@"