Skip to content

Commit

Permalink
Completion of module names after typing require('
Browse files Browse the repository at this point in the history
The following variants are currently supported:

 * require '...'
 * require "..."
 * require('...')
 * require("...")
  • Loading branch information
xolox committed Jun 14, 2011
1 parent 6d68f3d commit ffaf36b
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 30 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -12,7 +12,7 @@ The [Lua][lua] file type plug-in for [Vim][vim] makes it easier to work with Lua

* The ['completefunc'][cfu] option is set to allow completion of Lua 5.1 keywords, global variables and library members using Control-X Control-U

* The ['omnifunc'][ofu] option is set to allow dynamic completion of all modules installed on the system using Control-X Control-O, however it needs to be explicitly enabled by setting the `lua_complete_omni` option because this functionality may have undesired side effects!
* The ['omnifunc'][ofu] option is set to allow dynamic completion of the variables defined in all modules installed on the system using Control-X Control-O, however it needs to be explicitly enabled by setting the `lua_complete_omni` option because this functionality may have undesired side effects! When you invoke omni completion after typing `require '` or `require('` you get completion of module names

* Several [text-objects][tob] are defined so you can jump between blocks and functions

Expand Down
66 changes: 44 additions & 22 deletions autoload/xolox/lua.vim
Expand Up @@ -263,24 +263,28 @@ function! xolox#lua#completefunc(init, base) " {{{1
endfunction

function! s:get_completion_prefix()
let prefix = strpart(getline('.'), 0, col('.') - 2)
return match(prefix, '\w\+\.\?\w*$')
return match(strpart(getline('.'), 0, col('.') - 2), '\w\+\.\?\w*$')
endfunction

function! xolox#lua#completedynamic() " {{{1
function! xolox#lua#completedynamic(type) " {{{1
if xolox#lua#getopt('lua_complete_dynamic', 1)
if s:getsynid(1) !~? 'string\|comment\|keyword'
if (a:type == "'" || a:type == '"') && xolox#lua#getopt('lua_complete_omni', 0)
if strpart(getline('.'), 0, col('.') - 1) =~ 'require[^''"]*$'
return a:type . "\<C-x>\<C-o>"
endif
elseif a:type == '.' && s:getsynid(1) !~? 'string\|comment\|keyword'
let column = col('.') - 1
" Gotcha: even though '.' is remapped it counts as a column?
if column && getline('.')[column - 1] =~ '\w'
" This results in "Pattern not found" when no completion items
" matched, which is kind of annoying. But I don't know an alternative
" to :silent that can be used inside of <expr> mappings?!
return ".\<C-x>\<C-u>"
" This results in "Pattern not found" when no completion candidates
" are available, which is kind of annoying. But I don't know of an
" alternative to :silent that can be used inside of <expr>
" mappings?!
return a:type . "\<C-x>\<C-u>"
endif
endif
endif
return '.'
return a:type
endfunction

function! xolox#lua#omnifunc(init, base) " {{{1
Expand All @@ -289,30 +293,48 @@ function! xolox#lua#omnifunc(init, base) " {{{1
elseif !xolox#lua#getopt('lua_complete_omni', 0)
throw printf("%s: omni completion needs to be explicitly enabled, see the readme!", s:script)
endif
if !exists('s:omnifunc_candidates')
let s:omnifunc_candidates = xolox#lua#getomnicandidates()
if !exists('s:omnifunc_modules')
let s:omnifunc_modules = xolox#lua#getomnimodules()
endif
if !exists('s:omnifunc_variables')
let s:omnifunc_variables = xolox#lua#getomnivariables(s:omnifunc_modules)
endif
if a:base == ''
return s:omnifunc_candidates
" FIXME When you type "require'" without a space in between
" the getline('.') call below returns an empty string?!
if getline('.') =~ 'require[^''"]*[''"]'
let pattern = xolox#misc#escape#pattern(a:base)
return filter(copy(s:omnifunc_modules), 'v:val =~ pattern')
elseif a:base == ''
return s:omnifunc_variables
else
let pattern = xolox#misc#escape#pattern(a:base)
return filter(copy(s:omnifunc_candidates), 'v:val =~ pattern')
return filter(copy(s:omnifunc_variables), 'v:val =~ pattern')
endif
endfunction

function! xolox#lua#getomnicandidates() " {{{1
function! xolox#lua#getomnimodules() " {{{1
let starttime = xolox#misc#timer#start()
let modules = {}
let modulemap = {}
let luapath = xolox#lua#getsearchpath('$LUA_PATH', 'package.path')
let luacpath = xolox#lua#getsearchpath('$LUA_CPATH', 'package.cpath')
for searchpath in [luapath, luacpath]
call s:expandsearchpath(searchpath, modules)
call s:expandsearchpath(searchpath, modulemap)
endfor
let output = xolox#lua#dofile(s:omnicomplete_script, keys(modules))
let lines = split(output, "\n")
call sort(lines, 1)
call xolox#misc#timer#stop("%s: Collected omni completion candidates in %s", s:script, starttime)
return lines
let modules = keys(modulemap)
call sort(modules)
let msg = "%s: Collected %i module names for omni completion in %s"
call xolox#misc#timer#stop(msg, s:script, len(modules), starttime)
return modules
endfunction

function! xolox#lua#getomnivariables(modules) " {{{1
let starttime = xolox#misc#timer#start()
let output = xolox#lua#dofile(s:omnicomplete_script, a:modules)
let variables = split(output, "\n")
call sort(variables, 1)
let msg = "%s: Collected %i variables for omni completion in %s"
call xolox#misc#timer#stop(msg, s:script, len(variables), starttime)
return variables
endfunction

let s:omnicomplete_script = expand('<sfile>:p:h:h:h') . '/misc/lua-ftplugin/omnicomplete.lua'
Expand Down
10 changes: 6 additions & 4 deletions doc/lua.txt
Expand Up @@ -20,10 +20,12 @@ code in Vim by providing the following features:
- The |'completefunc'| option is set to allow completion of Lua 5.1 keywords,
global variables and library members using Control-X Control-U

- The |'omnifunc'| option is set to allow dynamic completion of all modules
installed on the system using Control-X Control-O, however it needs to be
explicitly enabled by setting the |lua_complete_omni| option because this
functionality may have undesired side effects!
- The |'omnifunc'| option is set to allow dynamic completion of the variables
defined in all modules installed on the system using Control-X Control-O,
however it needs to be explicitly enabled by setting the
|lua_complete_omni| option because this functionality may have undesired
side effects! When you invoke omni completion after typing 'require '' or
'require('' you get completion of module names

- Several |text-objects| are defined so you can jump between blocks and
functions
Expand Down
10 changes: 7 additions & 3 deletions ftplugin/lua.vim
Expand Up @@ -3,7 +3,7 @@
" Author: Peter Odding <peter@peterodding.com>
" Last Change: June 14, 2011
" URL: http://peterodding.com/code/vim/lua-ftplugin
" Version: 0.6.1
" Version: 0.6.2

" Support for automatic update using the GLVS plug-in.
" GetLatestVimScripts: 3625 1 :AutoInstall: lua.zip
Expand Down Expand Up @@ -74,9 +74,13 @@ if exists('loaded_matchit')
call add(s:undo_ftplugin, 'unlet! b:match_ignorecase b:match_words b:match_skip')
endif

" Enable dynamic completion on typing the "." operator? {{{1
imap <buffer> <silent> <expr> . xolox#lua#completedynamic()
" Enable dynamic completion on typing "require('" or "variable."? {{{1
inoremap <buffer> <silent> <expr> . xolox#lua#completedynamic('.')
call add(s:undo_ftplugin, 'iunmap <buffer> .')
inoremap <buffer> <silent> <expr> ' xolox#lua#completedynamic("'")
call add(s:undo_ftplugin, "iunmap <buffer> '")
inoremap <buffer> <silent> <expr> " xolox#lua#completedynamic('"')
call add(s:undo_ftplugin, 'iunmap <buffer> "')

" }}}1

Expand Down

0 comments on commit ffaf36b

Please sign in to comment.