diff options
author | Bjorn Neergaard <bjorn@neersighted.com> | 2016-10-10 13:51:29 -0500 |
---|---|---|
committer | w0rp <w0rp@users.noreply.github.com> | 2016-10-10 19:51:29 +0100 |
commit | 7f0ce89d2b574fd5bdd0c050eaad92deeb63086d (patch) | |
tree | c508480ff3ccbf36ef7283610fdcaefe476ae6e1 /autoload/ale.vim | |
parent | 0680f875fe9ef07daceb3e9a90224bee613730df (diff) | |
download | ale-7f0ce89d2b574fd5bdd0c050eaad92deeb63086d.zip |
First pass at optimizing ale to autoload (#80)
* 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
Diffstat (limited to 'autoload/ale.vim')
-rw-r--r-- | autoload/ale.vim | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/autoload/ale.vim b/autoload/ale.vim new file mode 100644 index 00000000..b25bcc99 --- /dev/null +++ b/autoload/ale.vim @@ -0,0 +1,48 @@ +" 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 |