summaryrefslogtreecommitdiff
path: root/autoload/ale.vim
diff options
context:
space:
mode:
authorBjorn Neergaard <bjorn@neersighted.com>2016-10-10 13:51:29 -0500
committerw0rp <w0rp@users.noreply.github.com>2016-10-10 19:51:29 +0100
commit7f0ce89d2b574fd5bdd0c050eaad92deeb63086d (patch)
treec508480ff3ccbf36ef7283610fdcaefe476ae6e1 /autoload/ale.vim
parent0680f875fe9ef07daceb3e9a90224bee613730df (diff)
downloadale-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.vim48
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