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 /plugin/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 'plugin/ale.vim')
-rw-r--r-- | plugin/ale.vim | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/plugin/ale.vim b/plugin/ale.vim new file mode 100644 index 00000000..3982ee69 --- /dev/null +++ b/plugin/ale.vim @@ -0,0 +1,114 @@ +" Author: w0rp <devw0rp@gmail.com> +" Description: Main entry point for the plugin: sets up prefs and autocommands +" Preferences can be set in vimrc files and so on to configure ale + +if exists('g:loaded_ale') + finish +endif +let g:loaded_ale = 1 + +" A flag for detecting if the required features are set. +if has('nvim') + let g:ale_has_required_features = has('timers') +else + let g:ale_has_required_features = has('timers') && has('job') && has('channel') +endif + +if !g:ale_has_required_features + echoerr 'ALE requires NeoVim >= 0.1.5 or Vim 8 with +timers +job +channel' + echoerr 'Please update your editor appropriately.' + finish +endif + +" This list configures which linters are enabled for which languages. +let g:ale_linters = get(g:, 'ale_linters', {}) + +" This flag can be set to 0 to disable linting when text is changed. +let g:ale_lint_on_text_changed = get(g:, 'ale_lint_on_text_changed', 1) + +" This flag can be set with a number of milliseconds for delaying the +" execution of a linter when text is changed. The timeout will be set and +" cleared each time text is changed, so repeated edits won't trigger the +" jobs for linting until enough time has passed after editing is done. +let g:ale_lint_delay = get(g:, 'ale_lint_delay', 200) + +" This flag can be set to 0 to disable linting when the buffer is entered. +let g:ale_lint_on_enter = get(g:, 'ale_lint_on_enter', 1) + +" This flag can be set to 1 to enable linting when a buffer is written. +let g:ale_lint_on_save = get(g:, 'ale_lint_on_save', 0) + +" This flag can be set to 0 to disable setting the loclist. +let g:ale_set_loclist = get(g:, 'ale_set_loclist', 1) + +" This flag can be set to 0 to disable setting signs. +" This is enabled by default only if the 'signs' feature exists. +let g:ale_set_signs = get(g:, 'ale_set_signs', has('signs')) + +" This flag can be set to 0 to disable echoing when the cursor moves. +let g:ale_echo_cursor = get(g:, 'ale_echo_cursor', 1) + +" This flag can be set to 0 to disable warnings for trailing whitespace +let g:ale_warn_about_trailing_whitespace = +\ get(g:, 'ale_warn_about_trailing_whitespace', 1) + +" This flag can be set to 1 to keep sign gutter always open +let g:ale_sign_column_always = get(g:, 'ale_sign_column_always', 0) + +" String format for statusline +" Its a list where: +" * The 1st element is for errors +" * The 2nd element is for warnings +" * The 3rd element is when there are no errors +let g:ale_statusline_format = get(g:, 'ale_statusline_format', +\ ['%d error(s)', '%d warning(s)', 'OK'] +\) + +" String format for the echoed message +" A %s is mandatory +" It can contain 2 handlers: %linter%, %severity% +let g:ale_echo_msg_format = get(g:, 'ale_echo_msg_format', '%s') + +" Strings used for severity in the echoed message +let g:ale_echo_msg_error_str = get(g:, 'ale_echo_msg_error_str', 'Error') +let g:ale_echo_msg_warning_str = get(g:, 'ale_echo_msg_warning_str', 'Warning') + +if g:ale_lint_on_text_changed + augroup ALERunOnTextChangedGroup + autocmd! + autocmd TextChanged,TextChangedI * call ale#Queue(g:ale_lint_delay) + augroup END +endif + +if g:ale_lint_on_enter + augroup ALERunOnEnterGroup + autocmd! + autocmd BufEnter,BufRead * call ale#Queue(100) + augroup END +endif + +if g:ale_lint_on_save + augroup ALERunOnSaveGroup + autocmd! + autocmd BufWrite * call ale#Queue(0) + augroup END +endif + +" Clean up buffers automatically when they are unloaded. +augroup ALEBufferCleanup + autocmd! + autocmd BufUnload * call ale#cleanup#Buffer('<abuf>') +augroup END + +" Globals which each part of the plugin should use. +let g:ale_buffer_loclist_map = {} +let g:ale_buffer_should_reset_map = {} +let g:ale_buffer_sign_dummy_map = {} + +" Backwards compatibility +function! ALELint(delay) + call ale#Queue(a:delay) +endfunction +function! ALEGetStatusLine() + call ale#statusline#Status() +endfunction |