7f0ce89d2b
* First pass at optimizing ale to autoload First off, the structure/function names should be revised a bit, but I will wait for @w0rp's input before unifying the naming style. Second off, the docs probably need some more work, I just did some simple find-and-replace work. With that said, this pull brings major performance gains for ale. On my slowest system, fully loading ale and all its code takes around 150ms. I have moved all of ale's autoload-able code to autoload/, and in addition, implemented lazy-loading of linters. This brings load time on that same system down to 5ms. The only downside of lazy loading is that `g:ale_linters` cannot be changed at runtime; however, it also speeds up performance at runtime by simplfying the logic greatly. Please let me know what you think! Closes #59 * Address Travis/Vint errors For some reason, ale isn't running vint for me... * Incorporate feedback, make fixes Lazy-loading logic is much improved. * Add header comments; remove incorrect workaround * Remove unneeded plugin guards * Fix lazy-loading linter logic Set the wrong variable.... * Fix capitialization
48 lines
1.3 KiB
VimL
48 lines
1.3 KiB
VimL
" Author: w0rp <devw0rp@gmail.com>
|
|
" Description: Primary code path for the plugin
|
|
" Manages execution of linters when requested by autocommands
|
|
|
|
let s:lint_timer = -1
|
|
|
|
function! ale#Queue(delay) abort
|
|
if s:lint_timer != -1
|
|
call timer_stop(s:lint_timer)
|
|
let s:lint_timer = -1
|
|
endif
|
|
|
|
let linters = ale#linter#Get(&filetype)
|
|
if len(linters) == 0
|
|
" There are no linters to lint with, so stop here.
|
|
return
|
|
endif
|
|
|
|
if a:delay > 0
|
|
let s:lint_timer = timer_start(a:delay, function('ale#Lint'))
|
|
else
|
|
call ale#Lint()
|
|
endif
|
|
endfunction
|
|
|
|
function! ale#Lint(...) abort
|
|
let buffer = bufnr('%')
|
|
let linters = ale#linter#Get(&filetype)
|
|
|
|
" Set a variable telling us to clear the loclist later.
|
|
let g:ale_buffer_should_reset_map[buffer] = 1
|
|
|
|
for linter in linters
|
|
" Check if a given linter has a program which can be executed.
|
|
if has_key(linter, 'executable_callback')
|
|
let l:executable = ale#util#GetFunction(linter.executable_callback)(buffer)
|
|
else
|
|
let l:executable = linter.executable
|
|
endif
|
|
|
|
if !executable(l:executable)
|
|
" The linter's program cannot be executed, so skip it.
|
|
continue
|
|
endif
|
|
|
|
call ale#engine#Invoke(buffer, linter)
|
|
endfor
|
|
endfunction
|