Use a new window for the ALEFixSuggest command, and document it better

This commit is contained in:
w0rp 2017-06-28 16:20:01 +01:00
parent f883d4d4fd
commit 8846a8860f
5 changed files with 96 additions and 30 deletions

View file

@ -116,44 +116,56 @@ endfunction
" Suggest functions to use from the registry. " Suggest functions to use from the registry.
function! ale#fix#registry#Suggest(filetype) abort function! ale#fix#registry#Suggest(filetype) abort
let l:type_list = split(a:filetype, '\.') let l:type_list = split(a:filetype, '\.')
let l:first_for_filetype = 1 let l:filetype_fixer_list = []
let l:first_generic = 1
for l:key in sort(keys(s:entries)) for l:key in sort(keys(s:entries))
let l:suggested_filetypes = s:entries[l:key].suggested_filetypes let l:suggested_filetypes = s:entries[l:key].suggested_filetypes
if s:ShouldSuggestForType(l:suggested_filetypes, l:type_list) if s:ShouldSuggestForType(l:suggested_filetypes, l:type_list)
if l:first_for_filetype call add(
let l:first_for_filetype = 0 \ l:filetype_fixer_list,
echom 'Try the following fixers appropriate for the filetype:' \ printf('%s - %s', string(l:key), s:entries[l:key].description),
echom '' \)
endif
echom printf('%s - %s', string(l:key), s:entries[l:key].description)
endif endif
endfor endfor
let l:generic_fixer_list = []
for l:key in sort(keys(s:entries)) for l:key in sort(keys(s:entries))
if empty(s:entries[l:key].suggested_filetypes) if empty(s:entries[l:key].suggested_filetypes)
if l:first_generic call add(
if !l:first_for_filetype \ l:generic_fixer_list,
echom '' \ printf('%s - %s', string(l:key), s:entries[l:key].description),
endif \)
let l:first_generic = 0
echom 'Try the following generic fixers:'
echom ''
endif
echom printf('%s - %s', string(l:key), s:entries[l:key].description)
endif endif
endfor endfor
if l:first_for_filetype && l:first_generic let l:filetype_fixer_header = !empty(l:filetype_fixer_list)
echom 'There is nothing in the registry to suggest.' \ ? ['Try the following fixers appropriate for the filetype:', '']
\ : []
let l:generic_fixer_header = !empty(l:generic_fixer_list)
\ ? ['Try the following generic fixers:', '']
\ : []
let l:has_both_lists = !empty(l:filetype_fixer_list) && !empty(l:generic_fixer_list)
let l:lines =
\ l:filetype_fixer_header
\ + l:filetype_fixer_list
\ + (l:has_both_lists ? [''] : [])
\ + l:generic_fixer_header
\ + l:generic_fixer_list
if empty(l:lines)
let l:lines = ['There is nothing in the registry to suggest.']
else else
echom '' let l:lines += ['', 'See :help ale-fix-configuration']
echom 'See :help ale-fix-configuration'
endif endif
let l:lines += ['', 'Press q to close this window']
new +set\ filetype=ale-fix-suggest
call setline(1, l:lines)
setlocal nomodified
setlocal nomodifiable
endfunction endfunction

View file

@ -131,7 +131,9 @@ ALE supports the following key features for linting:
7. Setting syntax highlights for errors. 7. Setting syntax highlights for errors.
ALE can fix problems with files with the |ALEFix| command, using the same job ALE can fix problems with files with the |ALEFix| command, using the same job
control functionality used for checking for problems. control functionality used for checking for problems. Try using the
|ALEFixSuggest| command for browsing tools that can be used to fix problems
for the current buffer.
=============================================================================== ===============================================================================
2. Supported Languages & Tools *ale-support* 2. Supported Languages & Tools *ale-support*
@ -915,6 +917,9 @@ run, the variable |g:ale_fixers| will be read for getting a |List| of commands
for filetypes, split on `.`, and the functions named in |g:ale_fixers| will be for filetypes, split on `.`, and the functions named in |g:ale_fixers| will be
executed for fixing the errors. executed for fixing the errors.
The |ALEFixSuggest| command can be used to suggest tools that be used to
fix problems for the current buffer.
The values for `g:ale_fixers` can be a list of |String|, |Funcref|, or The values for `g:ale_fixers` can be a list of |String|, |Funcref|, or
|lambda| values. String values must either name a function, or a short name |lambda| values. String values must either name a function, or a short name
for a function set in the ALE fixer registry. for a function set in the ALE fixer registry.
@ -1019,6 +1024,13 @@ ALEFix *ALEFix*
A plug mapping `<Plug>(ale_fix)` is defined for this command. A plug mapping `<Plug>(ale_fix)` is defined for this command.
ALEFixSuggest *ALEFixSuggest*
Suggest tools that can be used to fix problems in the current buffer.
See |ale-fix| for more information.
ALELint *ALELint* ALELint *ALELint*
Run ALE once for the current buffer. This command can be used to run ALE Run ALE once for the current buffer. This command can be used to run ALE

View file

@ -0,0 +1,2 @@
" Close the ALEFixSuggest window with the q key.
noremap <buffer> q :q!<CR>

View file

@ -0,0 +1,13 @@
if exists('b:current_syntax')
finish
endif
syn match aleFixerComment /^.*$/
syn match aleFixerName /^'[^']*'/
syn match aleFixerHelp /^See :help ale-fix-configuration/
hi def link aleFixerComment Comment
hi def link aleFixerName String
hi def link aleFixerHelp Statement
let b:current_syntax = 'ale-fix-suggest'

View file

@ -1,15 +1,27 @@
Before: Before:
call ale#fix#registry#Clear() call ale#fix#registry#Clear()
function GetSuggestions() let g:buffer = bufnr('')
redir => l:output
silent ALEFixSuggest
redir END
return split(l:output, "\n") function GetSuggestions()
silent ALEFixSuggest
if bufnr('') != g:buffer
let l:lines = getline(1, '$')
else
let l:lines = []
endif
return l:lines
endfunction endfunction
After: After:
if bufnr('') != g:buffer
:q!
endif
unlet! g:buffer
call ale#fix#registry#ResetToDefaults() call ale#fix#registry#ResetToDefaults()
delfunction GetSuggestions delfunction GetSuggestions
@ -17,9 +29,18 @@ Execute(ALEFixSuggest should return something sensible with no suggestions):
AssertEqual AssertEqual
\ [ \ [
\ 'There is nothing in the registry to suggest.', \ 'There is nothing in the registry to suggest.',
\ '',
\ 'Press q to close this window',
\ ], \ ],
\ GetSuggestions() \ GetSuggestions()
Execute(ALEFixSuggest should set the appropriate settings):
silent ALEFixSuggest
AssertEqual 'ale-fix-suggest', &filetype
Assert !&modified, 'The buffer was marked as modified'
Assert !&modifiable, 'The buffer was modifiable'
Execute(ALEFixSuggest output should be correct for only generic handlers): Execute(ALEFixSuggest output should be correct for only generic handlers):
call ale#fix#registry#Add('zed', 'XYZ', [], 'Zedify things.') call ale#fix#registry#Add('zed', 'XYZ', [], 'Zedify things.')
call ale#fix#registry#Add('alpha', 'XYZ', [], 'Alpha things.') call ale#fix#registry#Add('alpha', 'XYZ', [], 'Alpha things.')
@ -32,6 +53,8 @@ Execute(ALEFixSuggest output should be correct for only generic handlers):
\ '''zed'' - Zedify things.', \ '''zed'' - Zedify things.',
\ '', \ '',
\ 'See :help ale-fix-configuration', \ 'See :help ale-fix-configuration',
\ '',
\ 'Press q to close this window',
\ ], \ ],
\ GetSuggestions() \ GetSuggestions()
@ -49,6 +72,8 @@ Execute(ALEFixSuggest output should be correct for only filetype handlers):
\ '''zed'' - Zedify things.', \ '''zed'' - Zedify things.',
\ '', \ '',
\ 'See :help ale-fix-configuration', \ 'See :help ale-fix-configuration',
\ '',
\ 'Press q to close this window',
\ ], \ ],
\ GetSuggestions() \ GetSuggestions()
@ -71,5 +96,7 @@ Execute(ALEFixSuggest should suggest filetype and generic handlers):
\ '''generic'' - Generic things.', \ '''generic'' - Generic things.',
\ '', \ '',
\ 'See :help ale-fix-configuration', \ 'See :help ale-fix-configuration',
\ '',
\ 'Press q to close this window',
\ ], \ ],
\ GetSuggestions() \ GetSuggestions()