From c77cf0e518e18b2e6f1f259c0f92e717d28c8998 Mon Sep 17 00:00:00 2001 From: w0rp Date: Fri, 26 May 2017 15:59:43 +0100 Subject: [PATCH] #371 Allow buffer variables to be set based on patterns --- autoload/ale/pattern_options.vim | 18 ++++++++++++++++ doc/ale.txt | 35 ++++++++++++++++++++++++++++++++ plugin/ale.vim | 19 +++++++++++++++++ test/test_pattern_options.vader | 28 +++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 autoload/ale/pattern_options.vim create mode 100644 test/test_pattern_options.vader diff --git a/autoload/ale/pattern_options.vim b/autoload/ale/pattern_options.vim new file mode 100644 index 0000000..77d0b59 --- /dev/null +++ b/autoload/ale/pattern_options.vim @@ -0,0 +1,18 @@ +" Author: w0rp +" Description: Set options in files based on regex patterns. + +function! ale#pattern_options#SetOptions() abort + let l:filename = expand('%:p') + let l:options = {} + + for l:pattern in keys(g:ale_pattern_options) + if match(l:filename, l:pattern) >= 0 + let l:options = g:ale_pattern_options[l:pattern] + break + endif + endfor + + for l:key in keys(l:options) + let b:[l:key] = l:options[l:key] + endfor +endfunction diff --git a/doc/ale.txt b/doc/ale.txt index ad488ef..bc632e2 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -517,6 +517,41 @@ g:ale_open_list *g:ale_open_list* to `1`, in which case the window will be kept open until closed manually. +g:ale_pattern_options *g:ale_pattern_options* + + Type: |Dictionary| + Default: `{}` + + This option maps regular expression patterns to |Dictionary| values for + buffer variables. This option can be set to automatically configure + different settings for different files. For example: > + + let g:ale_pattern_options = { + \ '\.foo\.js$': { + \ 'ale_linters: {'javascript': ['eslint']}, + \ }, + \} +< + The above example will match any filename ending in `.foo.js`, and use + only `eslint` for checking those files by setting `b:ale_linters`. + + Filenames are matched with |match()|, and patterns depend on the |magic| + setting, unless prefixed with the special escape sequences like `'\v'`, etc. + + The patterns can match any part of a filename. The absolute path of the + filename will be used for matching, taken from `expand('%:p')`. + + +g:ale_pattern_options_enabled *g:ale_pattern_options_enabled* + + Type: |Number| + Default: `!empty(g:ale_pattern_options)` + + This option can be used for turning the behaviour of setting + |g:ale_pattern_options| on or off. By default, setting a single key + for |g:ale_pattern_options| will turn this option on. + + g:ale_set_highlights *g:ale_set_highlights* Type: |Number| diff --git a/plugin/ale.vim b/plugin/ale.vim index 8c674a3..14e880d 100644 --- a/plugin/ale.vim +++ b/plugin/ale.vim @@ -161,10 +161,23 @@ let g:ale_history_enabled = get(g:, 'ale_history_enabled', 1) " A flag for storing the full output of commands in the history. let g:ale_history_log_output = get(g:, 'ale_history_log_output', 0) +" A dictionary mapping regular expression patterns to arbitrary buffer +" variables to be set. Useful for configuration ALE based on filename +" patterns. +call ale#Set('pattern_options', {}) +call ale#Set('pattern_options_enabled', !empty(g:ale_pattern_options)) + function! ALEInitAuGroups() abort " This value used to be a Boolean as a Number, and is now a String. let l:text_changed = '' . g:ale_lint_on_text_changed + augroup ALEPatternOptionsGroup + autocmd! + if g:ale_enabled && g:ale_pattern_options_enabled + autocmd BufEnter,BufRead * call ale#pattern_options#SetOptions() + endif + augroup END + augroup ALERunOnTextChangedGroup autocmd! if g:ale_enabled @@ -226,6 +239,7 @@ function! ALEInitAuGroups() abort augroup END if !g:ale_enabled + augroup! ALEPatternOptionsGroup augroup! ALERunOnTextChangedGroup augroup! ALERunOnEnterGroup augroup! ALERunOnSaveGroup @@ -238,6 +252,11 @@ function! s:ALEToggle() abort let g:ale_enabled = !get(g:, 'ale_enabled') if g:ale_enabled + " Set pattern options again, if enabled. + if g:ale_pattern_options_enabled + call ale#pattern_options#SetOptions() + endif + " Lint immediately, including running linters against the file. call ale#Queue(0, 'lint_file') else diff --git a/test/test_pattern_options.vader b/test/test_pattern_options.vader new file mode 100644 index 0000000..ba07441 --- /dev/null +++ b/test/test_pattern_options.vader @@ -0,0 +1,28 @@ +Before: + Save g:ale_pattern_options, g:ale_pattern_options_enabled + +After: + Restore + + unlet! b:ale_enabled + unlet! b:some_option + +Execute(Buffer variables should be set when filename patterns match): + let g:ale_pattern_options = {'baz.*\.js': { + \ 'ale_enabled': 1, + \ 'some_option': 347, + \}} + + silent! file foobar.js + + call ale#pattern_options#SetOptions() + + Assert !exists('b:ale_enabled') + Assert !exists('b:some_option') + + silent! file bazboz.js + + call ale#pattern_options#SetOptions() + + AssertEqual 1, b:ale_enabled + AssertEqual 347, b:some_option