diff options
-rw-r--r-- | ale_linters/go/golint.vim | 15 | ||||
-rw-r--r-- | autoload/ale/cursor.vim | 14 | ||||
-rw-r--r-- | autoload/ale/debugging.vim | 5 | ||||
-rw-r--r-- | autoload/ale/engine.vim | 6 | ||||
-rw-r--r-- | autoload/ale/events.vim | 10 | ||||
-rw-r--r-- | autoload/ale/fixers/ocamlformat.vim | 6 | ||||
-rw-r--r-- | autoload/ale/linter.vim | 2 | ||||
-rw-r--r-- | autoload/ale/util.vim | 11 | ||||
-rw-r--r-- | autoload/ale/virtualtext.vim | 104 | ||||
-rw-r--r-- | doc/ale-go.txt | 19 | ||||
-rw-r--r-- | doc/ale.txt | 42 | ||||
-rw-r--r-- | plugin/ale.vim | 3 | ||||
-rw-r--r-- | test/command_callback/elixir_paths/mix_project/lib/app.ex (renamed from test/command_callback/elixir_paths/mix_project/lib/foo.ex) | 0 | ||||
-rw-r--r-- | test/command_callback/mix_paths/wrapped_project/mix.exs | 1 | ||||
-rw-r--r-- | test/command_callback/test_elixir_mix_command_callbacks.vader | 4 | ||||
-rw-r--r-- | test/command_callback/test_golint_command_callbacks.vader | 18 | ||||
-rw-r--r-- | test/fix/test_ale_fix.vader | 33 | ||||
-rw-r--r-- | test/fixers/test_ocamlformat_fixer_callback.vader | 10 | ||||
-rw-r--r-- | test/test_ale_info.vader | 5 |
19 files changed, 276 insertions, 32 deletions
diff --git a/ale_linters/go/golint.vim b/ale_linters/go/golint.vim index d580fda2..4bf14fcc 100644 --- a/ale_linters/go/golint.vim +++ b/ale_linters/go/golint.vim @@ -1,10 +1,21 @@ " Author: neersighted <bjorn@neersighted.com> " Description: golint for Go files +call ale#Set('go_golint_executable', 'golint') +call ale#Set('go_golint_options', '') + +function! ale_linters#go#golint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'go_golint_options') + + return '%e' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %t' +endfunction + call ale#linter#Define('go', { \ 'name': 'golint', \ 'output_stream': 'both', -\ 'executable': 'golint', -\ 'command': 'golint %t', +\ 'executable_callback': ale#VarFunc('go_golint_executable'), +\ 'command_callback': 'ale_linters#go#golint#GetCommand', \ 'callback': 'ale#handlers#unix#HandleAsWarning', \}) diff --git a/autoload/ale/cursor.vim b/autoload/ale/cursor.vim index 32ce8c84..6672c349 100644 --- a/autoload/ale/cursor.vim +++ b/autoload/ale/cursor.vim @@ -52,16 +52,6 @@ function! ale#cursor#TruncatedEcho(original_message) abort endtry endfunction -function! s:FindItemAtCursor(buffer) abort - let l:info = get(g:ale_buffer_info, a:buffer, {}) - let l:loclist = get(l:info, 'loclist', []) - let l:pos = getcurpos() - let l:index = ale#util#BinarySearch(l:loclist, a:buffer, l:pos[1], l:pos[2]) - let l:loc = l:index >= 0 ? l:loclist[l:index] : {} - - return [l:info, l:loc] -endfunction - function! s:StopCursorTimer() abort if s:cursor_timer != -1 call timer_stop(s:cursor_timer) @@ -85,7 +75,7 @@ function! ale#cursor#EchoCursorWarning(...) abort return endif - let [l:info, l:loc] = s:FindItemAtCursor(l:buffer) + let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer) if g:ale_echo_cursor if !empty(l:loc) @@ -169,7 +159,7 @@ function! ale#cursor#ShowCursorDetail() abort call s:StopCursorTimer() - let [l:info, l:loc] = s:FindItemAtCursor(l:buffer) + let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer) if !empty(l:loc) call s:ShowCursorDetailForItem(l:loc, {'stay_here': 0}) diff --git a/autoload/ale/debugging.vim b/autoload/ale/debugging.vim index 34c13770..6c2bfbee 100644 --- a/autoload/ale/debugging.vim +++ b/autoload/ale/debugging.vim @@ -22,14 +22,14 @@ let s:global_variable_list = [ \ 'ale_lint_delay', \ 'ale_lint_on_enter', \ 'ale_lint_on_filetype_changed', +\ 'ale_lint_on_insert_leave', \ 'ale_lint_on_save', \ 'ale_lint_on_text_changed', -\ 'ale_lint_on_insert_leave', \ 'ale_linter_aliases', \ 'ale_linters', \ 'ale_linters_explicit', -\ 'ale_list_window_size', \ 'ale_list_vertical', +\ 'ale_list_window_size', \ 'ale_loclist_msg_format', \ 'ale_max_buffer_history_size', \ 'ale_max_signs', @@ -52,6 +52,7 @@ let s:global_variable_list = [ \ 'ale_statusline_format', \ 'ale_type_map', \ 'ale_use_global_executables', +\ 'ale_virtualtext_cursor', \ 'ale_warn_about_trailing_blank_lines', \ 'ale_warn_about_trailing_whitespace', \] diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim index e85e4d66..b44be73c 100644 --- a/autoload/ale/engine.vim +++ b/autoload/ale/engine.vim @@ -304,6 +304,12 @@ function! ale#engine#SetResults(buffer, loclist) abort call ale#cursor#EchoCursorWarning() endif + if g:ale_virtualtext_cursor + " Try and show the warning now. + " This will only do something meaningful if we're in normal mode. + call ale#virtualtext#ShowCursorWarning() + endif + " Reset the save event marker, used for opening windows, etc. call setbufvar(a:buffer, 'ale_save_event_fired', 0) " Set a marker showing how many times a buffer has been checked. diff --git a/autoload/ale/events.vim b/autoload/ale/events.vim index e48ad488..c3dbd378 100644 --- a/autoload/ale/events.vim +++ b/autoload/ale/events.vim @@ -29,7 +29,7 @@ function! ale#events#SaveEvent(buffer) abort call setbufvar(a:buffer, 'ale_save_event_fired', 1) endif - if ale#Var(a:buffer, 'fix_on_save') + if ale#Var(a:buffer, 'fix_on_save') && !ale#events#QuitRecently(a:buffer) let l:will_fix = ale#fix#Fix(a:buffer, 'save_file') let l:should_lint = l:should_lint && !l:will_fix endif @@ -139,6 +139,14 @@ function! ale#events#Init() abort autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#cursor#EchoCursorWarning() | endif endif + if g:ale_virtualtext_cursor + autocmd CursorMoved,CursorHold * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarningWithDelay() | endif + " Look for a warning to echo as soon as we leave Insert mode. + " The script's position variable used when moving the cursor will + " not be changed here. + autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarning() | endif + endif + if g:ale_close_preview_on_insert autocmd InsertEnter * if exists('*ale#preview#CloseIfTypeMatches') | call ale#preview#CloseIfTypeMatches('ale-preview') | endif endif diff --git a/autoload/ale/fixers/ocamlformat.vim b/autoload/ale/fixers/ocamlformat.vim index fac142aa..9b7c3e12 100644 --- a/autoload/ale/fixers/ocamlformat.vim +++ b/autoload/ale/fixers/ocamlformat.vim @@ -5,14 +5,14 @@ call ale#Set('ocaml_ocamlformat_executable', 'ocamlformat') call ale#Set('ocaml_ocamlformat_options', '') function! ale#fixers#ocamlformat#Fix(buffer) abort + let l:filename = expand('#' . a:buffer . ':p') let l:executable = ale#Var(a:buffer, 'ocaml_ocamlformat_executable') let l:options = ale#Var(a:buffer, 'ocaml_ocamlformat_options') return { \ 'command': ale#Escape(l:executable) \ . (empty(l:options) ? '' : ' ' . l:options) - \ . ' --inplace' - \ . ' %t', - \ 'read_temporary_file': 1, + \ . ' --name=' . ale#Escape(l:filename) + \ . ' -' \} endfunction diff --git a/autoload/ale/linter.vim b/autoload/ale/linter.vim index 114765e6..0a249282 100644 --- a/autoload/ale/linter.vim +++ b/autoload/ale/linter.vim @@ -16,6 +16,7 @@ let s:default_ale_linter_aliases = { \ 'systemverilog': 'verilog', \ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'], \ 'vimwiki': 'markdown', +\ 'vue': ['vue', 'javascript'], \ 'zsh': 'sh', \} @@ -40,6 +41,7 @@ let s:default_ale_linters = { \ 'rust': ['cargo'], \ 'spec': [], \ 'text': [], +\ 'vue': ['eslint', 'vls'], \ 'zsh': ['shell'], \} diff --git a/autoload/ale/util.vim b/autoload/ale/util.vim index e0491653..bb478957 100644 --- a/autoload/ale/util.vim +++ b/autoload/ale/util.vim @@ -452,3 +452,14 @@ function! ale#util#Col(str, chr) abort return strlen(join(split(a:str, '\zs')[0:a:chr - 2], '')) + 1 endfunction + +function! ale#util#FindItemAtCursor(buffer) abort + let l:info = get(g:ale_buffer_info, a:buffer, {}) + let l:loclist = get(l:info, 'loclist', []) + let l:pos = getcurpos() + let l:index = ale#util#BinarySearch(l:loclist, a:buffer, l:pos[1], l:pos[2]) + let l:loc = l:index >= 0 ? l:loclist[l:index] : {} + + return [l:info, l:loc] +endfunction + diff --git a/autoload/ale/virtualtext.vim b/autoload/ale/virtualtext.vim new file mode 100644 index 00000000..85a12de6 --- /dev/null +++ b/autoload/ale/virtualtext.vim @@ -0,0 +1,104 @@ +scriptencoding utf-8 +" Author: w0rp <devw0rp@gmail.com> +" Author: Luan Santos <cfcluan@gmail.com> +" Description: Shows lint message for the current line as virtualtext, if any + +" Controls the milliseconds delay before showing a message. +let g:ale_virtualtext_delay = get(g:, 'ale_virtualtext_delay', 10) +let s:cursor_timer = -1 +let s:last_pos = [0, 0, 0] + +function! ale#virtualtext#Clear() abort + if !has('nvim-0.3.2') + return + endif + + let l:buffer = bufnr('') + + call nvim_buf_clear_highlight(l:buffer, 1000, 0, -1) +endfunction + +function! ale#virtualtext#ShowMessage(message, hl_group) abort + if !has('nvim-0.3.2') + return + endif + + let l:cursor_position = getcurpos() + let l:line = line('.') + let l:buffer = bufnr('') + let l:prefix = get(g:, 'ale_virtualtext_prefix', '> ') + + call nvim_buf_set_virtual_text(l:buffer, 1000, l:line-1, [[l:prefix.a:message, a:hl_group]], {}) +endfunction + +function! s:StopCursorTimer() abort + if s:cursor_timer != -1 + call timer_stop(s:cursor_timer) + let s:cursor_timer = -1 + endif +endfunction + +function! ale#virtualtext#ShowCursorWarning(...) abort + if !g:ale_virtualtext_cursor + return + endif + + let l:buffer = bufnr('') + + if mode(1) isnot# 'n' + return + endif + + if ale#ShouldDoNothing(l:buffer) + return + endif + + let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer) + + call ale#virtualtext#Clear() + + if !empty(l:loc) + let l:msg = get(l:loc, 'detail', l:loc.text) + let l:hl_group = 'ALEInfo' + let l:type = get(l:loc, 'type', 'E') + + if l:type is# 'E' + let l:hl_group = 'ALEError' + elseif l:type is# 'W' + let l:hl_group = 'ALEWarning' + endif + + call ale#virtualtext#ShowMessage(l:msg, l:hl_group) + endif +endfunction + +function! ale#virtualtext#ShowCursorWarningWithDelay() abort + let l:buffer = bufnr('') + + if !g:ale_virtualtext_cursor + return + endif + + if mode(1) isnot# 'n' + return + endif + + call s:StopCursorTimer() + + let l:pos = getcurpos()[0:2] + + " Check the current buffer, line, and column number against the last + " recorded position. If the position has actually changed, *then* + " we should show something. Otherwise we can end up doing processing + " the show message far too frequently. + if l:pos != s:last_pos + let l:delay = ale#Var(l:buffer, 'virtualtext_delay') + + let s:last_pos = l:pos + let s:cursor_timer = timer_start( + \ l:delay, + \ function('ale#virtualtext#ShowCursorWarning') + \) + endif +endfunction + diff --git a/doc/ale-go.txt b/doc/ale-go.txt index 17d9cb10..43289bd5 100644 --- a/doc/ale-go.txt +++ b/doc/ale-go.txt @@ -54,6 +54,25 @@ g:ale_go_gofmt_options *g:ale_go_gofmt_options* =============================================================================== +golint *ale-go-golint* + +g:ale_go_golint_executable *g:ale_go_golint_executable* + *b:ale_go_golint_executable* + Type: |String| + Default: `'golint'` + + This variable can be set to change the golint executable path. + + +g:ale_go_golint_options *g:ale_go_golint_options* + *b:ale_go_golint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the golint linter. + + +=============================================================================== govet *ale-go-govet* g:ale_go_govet_options *g:ale_go_govet_options* diff --git a/doc/ale.txt b/doc/ale.txt index a0b5bf7c..85f6b6f8 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -108,6 +108,7 @@ CONTENTS *ale-contents* go....................................|ale-go-options| gobuild.............................|ale-go-gobuild| gofmt...............................|ale-go-gofmt| + golint..............................|ale-go-golint| govet...............................|ale-go-govet| gometalinter........................|ale-go-gometalinter| staticcheck.........................|ale-go-staticcheck| @@ -558,6 +559,7 @@ their relevant options. * By setting error highlights. - |g:ale_set_highlights| * By creating signs in the sign column. - |g:ale_set_signs| * By echoing messages based on your cursor. - |g:ale_echo_cursor| +* By inline text based on your cursor. - |g:ale_virtualtext_cursor| * By displaying the preview based on your cursor. - |g:ale_cursor_detail| * By showing balloons for your mouse cursor - |g:ale_set_balloons| @@ -1187,6 +1189,9 @@ b:ale_fix_on_save *b:ale_fix_on_save* after files are fixed, only when the buffer is open, or re-opened. Changes to the file will be saved to the file on disk. + Files will not be fixed on `:wq`, so you should check your code before + closing a buffer. + Fixing files can be disabled or enabled for individual buffers by setting `b:ale_fix_on_save` to `0` or `1`. @@ -1365,6 +1370,7 @@ g:ale_linter_aliases *g:ale_linter_aliases* \ 'systemverilog': 'verilog', \ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'], \ 'vimwiki': 'markdown', + \ 'vue': ['vue', 'javascript'], \ 'zsh': 'sh', \} < @@ -1422,6 +1428,7 @@ g:ale_linters *g:ale_linters* \ 'rust': ['cargo'], \ 'spec': [], \ 'text': [], + \ 'vue': ['eslint', 'vls'], \ 'zsh': ['shell'], \} < @@ -1869,6 +1876,41 @@ g:ale_use_global_executables *g:ale_use_global_executables* options. +g:ale_virtualtext_cursor *g:ale_virtualtext_cursor* + + Type: |Number| + Default: `0` + + When this option is set to `1`, a message will be shown when a cursor is + near a warning or error. ALE will attempt to find the warning or error at a + column nearest to the cursor when the cursor is resting on a line which + contains a warning or error. This option can be set to `0` to disable this + behavior. + + Messages are only displayed after a short delay. See |g:ale_virtualtext_delay|. + + Messages can be prefixed prefixed with a string. See |g:ale_virtualtext_prefix|. + + +g:ale_virtualtext_delay *g:ale_virtualtext_delay* + *b:ale_virtualtext_delay* + Type: |Number| + Default: `10` + + Given any integer, this option controls the number of milliseconds before + ALE will show a message for a problem near the cursor. + + The value can be increased to decrease the amount of processing ALE will do + for files displaying a large number of problems. + + +g:ale_virtualtext_prefix *g:ale_virtualtext_prefix* + + Type: |String| + Default: `'> '` + + Prefix to be used with |g:ale_virtualtext_cursor|. + g:ale_virtualenv_dir_names *g:ale_virtualenv_dir_names* b:ale_virtualenv_dir_names *b:ale_virtualenv_dir_names* diff --git a/plugin/ale.vim b/plugin/ale.vim index 7ef19775..7231d1bd 100644 --- a/plugin/ale.vim +++ b/plugin/ale.vim @@ -112,6 +112,9 @@ let g:ale_echo_cursor = get(g:, 'ale_echo_cursor', 1) " This flag can be set to 1 to automatically show errors in the preview window. let g:ale_cursor_detail = get(g:, 'ale_cursor_detail', 0) +" This flag can be set to 1 to enable virtual text when the cursor moves. +let g:ale_virtualtext_cursor = get(g:, 'ale_virtualtext_cursor', 0) + " This flag can be set to 1 to automatically close the preview window upon " entering Insert Mode. let g:ale_close_preview_on_insert = get(g:, 'ale_close_preview_on_insert', 0) diff --git a/test/command_callback/elixir_paths/mix_project/lib/foo.ex b/test/command_callback/elixir_paths/mix_project/lib/app.ex index e69de29b..e69de29b 100644 --- a/test/command_callback/elixir_paths/mix_project/lib/foo.ex +++ b/test/command_callback/elixir_paths/mix_project/lib/app.ex diff --git a/test/command_callback/mix_paths/wrapped_project/mix.exs b/test/command_callback/mix_paths/wrapped_project/mix.exs deleted file mode 100644 index d2d855e6..00000000 --- a/test/command_callback/mix_paths/wrapped_project/mix.exs +++ /dev/null @@ -1 +0,0 @@ -use Mix.Config diff --git a/test/command_callback/test_elixir_mix_command_callbacks.vader b/test/command_callback/test_elixir_mix_command_callbacks.vader index ec7b9911..b0d0af98 100644 --- a/test/command_callback/test_elixir_mix_command_callbacks.vader +++ b/test/command_callback/test_elixir_mix_command_callbacks.vader @@ -11,10 +11,10 @@ After: call ale#assert#TearDownLinterTest() Execute(The default mix command should be correct): - call ale#test#SetFilename('mix_paths/wrapped_project/lib/app.ex') + call ale#test#SetFilename('elixir_paths/mix_project/lib/app.ex') AssertLinter 'mix', - \ ale#path#CdString(ale#path#Simplify(g:dir . '/mix_paths/wrapped_project')) + \ ale#path#CdString(ale#path#Simplify(g:dir . '/elixir_paths/mix_project')) \ . g:env_prefix \ . 'mix compile %s' diff --git a/test/command_callback/test_golint_command_callbacks.vader b/test/command_callback/test_golint_command_callbacks.vader new file mode 100644 index 00000000..7c300309 --- /dev/null +++ b/test/command_callback/test_golint_command_callbacks.vader @@ -0,0 +1,18 @@ +Before: + call ale#assert#SetUpLinterTest('go', 'golint') + +After: + call ale#assert#TearDownLinterTest() + +Execute(The default golint command should be correct): + AssertLinter 'golint', ale#Escape('golint') . ' %t' + +Execute(The golint executable should be configurable): + let b:ale_go_golint_executable = 'foobar' + + AssertLinter 'foobar', ale#Escape('foobar') . ' %t' + +Execute(The golint options should be configurable): + let b:ale_go_golint_options = '--foo' + + AssertLinter 'golint', ale#Escape('golint') . ' --foo %t' diff --git a/test/fix/test_ale_fix.vader b/test/fix/test_ale_fix.vader index 539972a4..90407681 100644 --- a/test/fix/test_ale_fix.vader +++ b/test/fix/test_ale_fix.vader @@ -180,6 +180,7 @@ After: unlet! g:ale_emulate_job_failure unlet! b:ale_fixers unlet! b:ale_fix_on_save + unlet! b:ale_quitting delfunction AddCarets delfunction AddDollars delfunction DoNothing @@ -431,7 +432,7 @@ Given testft (A file with three lines): b c -Execute(ALEFix should save files on the save event): +Execute(ALEFix should fix files on the save event): let g:ale_fix_on_save = 1 let g:ale_lint_on_save = 1 let g:ale_enabled = 1 @@ -471,6 +472,36 @@ Expect(The buffer should be modified): $b $c +Execute(ALEFix should not fix files on :wq): + let g:ale_fix_on_save = 1 + let g:ale_lint_on_save = 1 + let g:ale_enabled = 1 + + noautocmd silent file fix_test_file + call writefile(getline(1, '$'), 'fix_test_file') + + let g:ale_fixers.testft = ['AddDollars'] + + " We have to set the buftype to empty so the file will be written. + setlocal buftype= + + call ale#events#QuitEvent(bufnr('')) + + call SetUpLinters() + call ale#events#SaveEvent(bufnr('')) + + " We should save the file. + AssertEqual ['a', 'b', 'c'], readfile('fix_test_file') + Assert &modified, 'The was not marked as ''modified''' + + " We should not run the linter. + AssertEqual [], ale#test#GetLoclistWithoutModule() + +Expect(The buffer should not be modified): + a + b + c + Given testft (A file with three lines): a b diff --git a/test/fixers/test_ocamlformat_fixer_callback.vader b/test/fixers/test_ocamlformat_fixer_callback.vader index d2aee066..f0c36ed7 100644 --- a/test/fixers/test_ocamlformat_fixer_callback.vader +++ b/test/fixers/test_ocamlformat_fixer_callback.vader @@ -18,10 +18,9 @@ Execute(The ocamlformat callback should return the correct default values): AssertEqual \ { - \ 'read_temporary_file': 1, \ 'command': ale#Escape('xxxinvalid') - \ . ' --inplace' - \ . ' %t', + \ . ' --name=' . ale#Escape(bufname(bufnr(''))) + \ . ' -', \ }, \ ale#fixers#ocamlformat#Fix(bufnr('')) @@ -31,10 +30,9 @@ Execute(The ocamlformat callback should include custom ocamlformat options): AssertEqual \ { - \ 'read_temporary_file': 1, \ 'command': ale#Escape('xxxinvalid') \ . ' ' . g:ale_ocaml_ocamlformat_options - \ . ' --inplace' - \ . ' %t', + \ . ' --name=' . ale#Escape(bufname(bufnr(''))) + \ . ' -', \ }, \ ale#fixers#ocamlformat#Fix(bufnr('')) diff --git a/test/test_ale_info.vader b/test/test_ale_info.vader index 39a2a85a..325c2aa8 100644 --- a/test/test_ale_info.vader +++ b/test/test_ale_info.vader @@ -88,14 +88,14 @@ Before: \ 'let g:ale_lint_delay = 200', \ 'let g:ale_lint_on_enter = 1', \ 'let g:ale_lint_on_filetype_changed = 1', + \ 'let g:ale_lint_on_insert_leave = 0', \ 'let g:ale_lint_on_save = 1', \ 'let g:ale_lint_on_text_changed = ''always''', - \ 'let g:ale_lint_on_insert_leave = 0', \ 'let g:ale_linter_aliases = {}', \ 'let g:ale_linters = {}', \ 'let g:ale_linters_explicit = 0', - \ 'let g:ale_list_window_size = 10', \ 'let g:ale_list_vertical = 0', + \ 'let g:ale_list_window_size = 10', \ 'let g:ale_loclist_msg_format = ''%code: %%s''', \ 'let g:ale_max_buffer_history_size = 20', \ 'let g:ale_max_signs = -1', @@ -118,6 +118,7 @@ Before: \ 'let g:ale_statusline_format = [''%d error(s)'', ''%d warning(s)'', ''OK'']', \ 'let g:ale_type_map = {}', \ 'let g:ale_use_global_executables = v:null', + \ 'let g:ale_virtualtext_cursor = 0', \ 'let g:ale_warn_about_trailing_blank_lines = 1', \ 'let g:ale_warn_about_trailing_whitespace = 1', \] |