Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
45a28383a2
36 changed files with 683 additions and 72 deletions
|
@ -10,6 +10,8 @@ ENV PACKAGES="\
|
|||
git \
|
||||
python \
|
||||
py-pip \
|
||||
grep \
|
||||
sed \
|
||||
"
|
||||
RUN apk --update add $PACKAGES && \
|
||||
rm -rf /var/cache/apk/* /tmp/* /var/tmp/*
|
||||
|
|
|
@ -1,14 +1,22 @@
|
|||
" Author: Magnus Ottenklinger - https://github.com/evnu
|
||||
|
||||
let g:ale_erlang_erlc_executable = get(g:, 'ale_erlang_erlc_executable', 'erlc')
|
||||
let g:ale_erlang_erlc_options = get(g:, 'ale_erlang_erlc_options', '')
|
||||
|
||||
function! ale_linters#erlang#erlc#GetExecutable(buffer) abort
|
||||
return ale#Var(a:buffer, 'erlang_erlc_executable')
|
||||
endfunction
|
||||
|
||||
function! ale_linters#erlang#erlc#GetCommand(buffer) abort
|
||||
let l:output_file = ale#util#Tempname()
|
||||
call ale#command#ManageFile(a:buffer, l:output_file)
|
||||
|
||||
return 'erlc -o ' . ale#Escape(l:output_file)
|
||||
let l:command = ale#Escape(ale_linters#erlang#erlc#GetExecutable(a:buffer))
|
||||
\ . ' -o ' . ale#Escape(l:output_file)
|
||||
\ . ' ' . ale#Var(a:buffer, 'erlang_erlc_options')
|
||||
\ . ' %t'
|
||||
|
||||
return l:command
|
||||
endfunction
|
||||
|
||||
function! ale_linters#erlang#erlc#Handle(buffer, lines) abort
|
||||
|
@ -90,7 +98,7 @@ endfunction
|
|||
|
||||
call ale#linter#Define('erlang', {
|
||||
\ 'name': 'erlc',
|
||||
\ 'executable': 'erlc',
|
||||
\ 'executable': function('ale_linters#erlang#erlc#GetExecutable'),
|
||||
\ 'command': function('ale_linters#erlang#erlc#GetCommand'),
|
||||
\ 'callback': 'ale_linters#erlang#erlc#Handle',
|
||||
\})
|
||||
|
|
33
ale_linters/inko/inko.vim
Normal file
33
ale_linters/inko/inko.vim
Normal file
|
@ -0,0 +1,33 @@
|
|||
" Author: Yorick Peterse <yorick@yorickpeterse.com>
|
||||
" Description: linting of Inko source code using the Inko compiler
|
||||
|
||||
call ale#Set('inko_inko_executable', 'inko')
|
||||
|
||||
function! ale_linters#inko#inko#GetCommand(buffer) abort
|
||||
let l:include = ''
|
||||
|
||||
" Include the tests source directory, but only for test files.
|
||||
if expand('#' . a:buffer . ':p') =~? '\vtests[/\\]test[/\\]'
|
||||
let l:test_dir = ale#path#FindNearestDirectory(a:buffer, 'tests')
|
||||
|
||||
if isdirectory(l:test_dir)
|
||||
let l:include = '--include ' . ale#Escape(l:test_dir)
|
||||
endif
|
||||
endif
|
||||
|
||||
" We use %s instead of %t so the compiler determines the correct module
|
||||
" names for the file being edited. Not doing so may lead to errors in
|
||||
" certain cases.
|
||||
return '%e build --check --format=json'
|
||||
\ . ale#Pad(l:include)
|
||||
\ . ' %s'
|
||||
endfunction
|
||||
|
||||
call ale#linter#Define('inko', {
|
||||
\ 'name': 'inko',
|
||||
\ 'executable': {b -> ale#Var(b, 'inko_inko_executable')},
|
||||
\ 'command': function('ale_linters#inko#inko#GetCommand'),
|
||||
\ 'callback': 'ale#handlers#inko#Handle',
|
||||
\ 'output_stream': 'stderr',
|
||||
\ 'lint_file': 1
|
||||
\})
|
|
@ -25,7 +25,8 @@ function! ale_linters#salt#salt_lint#Handle(buffer, lines) abort
|
|||
endfunction
|
||||
|
||||
call ale#linter#Define('salt', {
|
||||
\ 'name': 'salt-lint',
|
||||
\ 'name': 'salt_lint',
|
||||
\ 'aliases': ['salt-lint'],
|
||||
\ 'executable': {b -> ale#Var(b, 'salt_salt_lint_executable')},
|
||||
\ 'command': function('ale_linters#salt#salt_lint#GetCommand'),
|
||||
\ 'callback': 'ale_linters#salt#salt_lint#Handle'
|
||||
|
|
|
@ -261,7 +261,10 @@ function! ale#codefix#HandleLSPResponse(conn_id, response) abort
|
|||
|
||||
" Send the results to the menu callback, if set.
|
||||
if l:MenuCallback isnot v:null
|
||||
call l:MenuCallback(map(copy(l:result), '[''lsp'', v:val]'))
|
||||
call l:MenuCallback(
|
||||
\ l:data,
|
||||
\ map(copy(l:result), '[''lsp'', v:val]')
|
||||
\)
|
||||
|
||||
return
|
||||
endif
|
||||
|
|
|
@ -9,7 +9,6 @@ let g:ale_echo_delay = get(g:, 'ale_echo_delay', 10)
|
|||
let g:ale_echo_msg_format = get(g:, 'ale_echo_msg_format', '%code: %%s')
|
||||
|
||||
let s:cursor_timer = -1
|
||||
let s:last_pos = [0, 0, 0]
|
||||
|
||||
function! ale#cursor#TruncatedEcho(original_message) abort
|
||||
let l:message = a:original_message
|
||||
|
@ -118,14 +117,18 @@ function! ale#cursor#EchoCursorWarningWithDelay() abort
|
|||
|
||||
let l:pos = getpos('.')[0:2]
|
||||
|
||||
if !exists('w:last_pos')
|
||||
let w:last_pos = [0, 0, 0]
|
||||
endif
|
||||
|
||||
" Check the current buffer, line, and column number against the last
|
||||
" recorded position. If the position has actually changed, *then*
|
||||
" we should echo something. Otherwise we can end up doing processing
|
||||
" the echo message far too frequently.
|
||||
if l:pos != s:last_pos
|
||||
if l:pos != w:last_pos
|
||||
let l:delay = ale#Var(l:buffer, 'echo_delay')
|
||||
|
||||
let s:last_pos = l:pos
|
||||
let w:last_pos = l:pos
|
||||
let s:cursor_timer = timer_start(
|
||||
\ l:delay,
|
||||
\ function('ale#cursor#EchoCursorWarning')
|
||||
|
@ -139,12 +142,17 @@ function! s:ShowCursorDetailForItem(loc, options) abort
|
|||
let s:last_detailed_line = line('.')
|
||||
let l:message = get(a:loc, 'detail', a:loc.text)
|
||||
let l:lines = split(l:message, "\n")
|
||||
|
||||
if g:ale_floating_preview || g:ale_detail_to_floating_preview
|
||||
call ale#floating_preview#Show(l:lines)
|
||||
else
|
||||
call ale#preview#Show(l:lines, {'stay_here': l:stay_here})
|
||||
|
||||
" Clear the echo message if we manually displayed details.
|
||||
if !l:stay_here
|
||||
execute 'echo'
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! ale#cursor#ShowCursorDetail() abort
|
||||
|
|
|
@ -132,7 +132,7 @@ let s:default_registry = {
|
|||
\ },
|
||||
\ 'scalafmt': {
|
||||
\ 'function': 'ale#fixers#scalafmt#Fix',
|
||||
\ 'suggested_filetypes': ['scala'],
|
||||
\ 'suggested_filetypes': ['sbt', 'scala'],
|
||||
\ 'description': 'Fix Scala files using scalafmt',
|
||||
\ },
|
||||
\ 'sorbet': {
|
||||
|
|
91
autoload/ale/floating_preview.vim
Normal file
91
autoload/ale/floating_preview.vim
Normal file
|
@ -0,0 +1,91 @@
|
|||
" Author: Jan-Grimo Sobez <jan-grimo.sobez@phys.chem.ethz.ch>
|
||||
" Author: Kevin Clark <kevin.clark@gmail.com>
|
||||
" Description: Floating preview window for showing whatever information in.
|
||||
|
||||
" Precondition: exists('*nvim_open_win')
|
||||
|
||||
function! ale#floating_preview#Show(lines, ...) abort
|
||||
if !exists('*nvim_open_win')
|
||||
execute 'echom ''Floating windows not supported in this vim instance.'''
|
||||
|
||||
return
|
||||
endif
|
||||
|
||||
" Remove the close autocmd so it doesn't happen mid update
|
||||
augroup ale_floating_preview_window
|
||||
autocmd!
|
||||
augroup END
|
||||
|
||||
let l:options = get(a:000, 0, {})
|
||||
|
||||
" Only create a new window if we need it
|
||||
if !exists('w:preview') || index(nvim_list_wins(), w:preview['id']) is# -1
|
||||
call s:Create(l:options)
|
||||
else
|
||||
call nvim_buf_set_option(w:preview['buffer'], 'modifiable', v:true)
|
||||
endif
|
||||
|
||||
" Execute commands in window context
|
||||
let l:parent_window = nvim_get_current_win()
|
||||
|
||||
call nvim_set_current_win(w:preview['id'])
|
||||
|
||||
for l:command in get(l:options, 'commands', [])
|
||||
call execute(l:command)
|
||||
endfor
|
||||
|
||||
call nvim_set_current_win(l:parent_window)
|
||||
|
||||
" Return to parent context on move
|
||||
augroup ale_floating_preview_window
|
||||
autocmd!
|
||||
|
||||
if g:ale_close_preview_on_insert
|
||||
autocmd CursorMoved,TabLeave,WinLeave,InsertEnter <buffer> ++once call s:Close()
|
||||
else
|
||||
autocmd CursorMoved,TabLeave,WinLeave <buffer> ++once call s:Close()
|
||||
endif
|
||||
augroup END
|
||||
|
||||
let l:width = max(map(copy(a:lines), 'strdisplaywidth(v:val)'))
|
||||
let l:height = min([len(a:lines), 10])
|
||||
call nvim_win_set_width(w:preview['id'], l:width)
|
||||
call nvim_win_set_height(w:preview['id'], l:height)
|
||||
|
||||
call nvim_buf_set_lines(w:preview['buffer'], 0, -1, v:false, a:lines)
|
||||
call nvim_buf_set_option(w:preview['buffer'], 'modified', v:false)
|
||||
call nvim_buf_set_option(w:preview['buffer'], 'modifiable', v:false)
|
||||
endfunction
|
||||
|
||||
function! s:Create(options) abort
|
||||
let l:buffer = nvim_create_buf(v:false, v:false)
|
||||
let l:winid = nvim_open_win(l:buffer, v:false, {
|
||||
\ 'relative': 'cursor',
|
||||
\ 'row': 1,
|
||||
\ 'col': 0,
|
||||
\ 'width': 42,
|
||||
\ 'height': 4,
|
||||
\ 'style': 'minimal'
|
||||
\ })
|
||||
call nvim_buf_set_option(l:buffer, 'buftype', 'acwrite')
|
||||
call nvim_buf_set_option(l:buffer, 'bufhidden', 'delete')
|
||||
call nvim_buf_set_option(l:buffer, 'swapfile', v:false)
|
||||
call nvim_buf_set_option(l:buffer, 'filetype', get(a:options, 'filetype', 'ale-preview'))
|
||||
|
||||
let w:preview = {'id': l:winid, 'buffer': l:buffer}
|
||||
endfunction
|
||||
|
||||
function! s:Close() abort
|
||||
if !exists('w:preview')
|
||||
return
|
||||
endif
|
||||
|
||||
call setbufvar(w:preview['buffer'], '&modified', 0)
|
||||
|
||||
if win_id2win(w:preview['id']) > 0
|
||||
execute win_id2win(w:preview['id']).'wincmd c'
|
||||
endif
|
||||
|
||||
unlet w:preview
|
||||
endfunction
|
||||
|
37
autoload/ale/handlers/inko.vim
Normal file
37
autoload/ale/handlers/inko.vim
Normal file
|
@ -0,0 +1,37 @@
|
|||
" Author: Yorick Peterse <yorick@yorickpeterse.com>
|
||||
" Description: output handlers for the Inko JSON format
|
||||
|
||||
function! ale#handlers#inko#GetType(severity) abort
|
||||
if a:severity is? 'warning'
|
||||
return 'W'
|
||||
endif
|
||||
|
||||
return 'E'
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#inko#Handle(buffer, lines) abort
|
||||
try
|
||||
let l:errors = json_decode(join(a:lines, ''))
|
||||
catch
|
||||
return []
|
||||
endtry
|
||||
|
||||
if empty(l:errors)
|
||||
return []
|
||||
endif
|
||||
|
||||
let l:output = []
|
||||
let l:dir = expand('#' . a:buffer . ':p:h')
|
||||
|
||||
for l:error in l:errors
|
||||
call add(l:output, {
|
||||
\ 'filename': ale#path#GetAbsPath(l:dir, l:error['file']),
|
||||
\ 'lnum': l:error['line'],
|
||||
\ 'col': l:error['column'],
|
||||
\ 'text': l:error['message'],
|
||||
\ 'type': ale#handlers#inko#GetType(l:error['level']),
|
||||
\})
|
||||
endfor
|
||||
|
||||
return l:output
|
||||
endfunction
|
|
@ -46,6 +46,10 @@ function! ale#hover#HandleTSServerResponse(conn_id, response) abort
|
|||
call balloon_show(a:response.body.displayString)
|
||||
elseif get(l:options, 'truncated_echo', 0)
|
||||
call ale#cursor#TruncatedEcho(split(a:response.body.displayString, "\n")[0])
|
||||
elseif g:ale_hover_to_floating_preview || g:ale_floating_preview
|
||||
call ale#floating_preview#Show(split(a:response.body.displayString, "\n"), {
|
||||
\ 'filetype': 'ale-preview.message',
|
||||
\})
|
||||
elseif g:ale_hover_to_preview
|
||||
call ale#preview#Show(split(a:response.body.displayString, "\n"), {
|
||||
\ 'filetype': 'ale-preview.message',
|
||||
|
@ -226,6 +230,11 @@ function! ale#hover#HandleLSPResponse(conn_id, response) abort
|
|||
call balloon_show(join(l:lines, "\n"))
|
||||
elseif get(l:options, 'truncated_echo', 0)
|
||||
call ale#cursor#TruncatedEcho(l:lines[0])
|
||||
elseif g:ale_hover_to_floating_preview || g:ale_floating_preview
|
||||
call ale#floating_preview#Show(l:lines, {
|
||||
\ 'filetype': 'ale-preview.message',
|
||||
\ 'commands': l:commands,
|
||||
\})
|
||||
elseif g:ale_hover_to_preview
|
||||
call ale#preview#Show(l:lines, {
|
||||
\ 'filetype': 'ale-preview.message',
|
||||
|
|
|
@ -43,6 +43,7 @@ let s:default_ale_linters = {
|
|||
\ 'go': ['gofmt', 'golint', 'go vet'],
|
||||
\ 'hack': ['hack'],
|
||||
\ 'help': [],
|
||||
\ 'inko': ['inko'],
|
||||
\ 'perl': ['perlcritic'],
|
||||
\ 'perl6': [],
|
||||
\ 'python': ['flake8', 'mypy', 'pylint', 'pyright'],
|
||||
|
|
|
@ -32,6 +32,8 @@ function! ale#python#FindProjectRootIni(buffer) abort
|
|||
\|| filereadable(l:path . '/.pylintrc')
|
||||
\|| filereadable(l:path . '/Pipfile')
|
||||
\|| filereadable(l:path . '/Pipfile.lock')
|
||||
\|| filereadable(l:path . '/poetry.lock')
|
||||
\|| filereadable(l:path . '/pyproject.toml')
|
||||
return l:path
|
||||
endif
|
||||
endfor
|
||||
|
|
|
@ -486,7 +486,7 @@ function! ale#util#Input(message, value) abort
|
|||
endfunction
|
||||
|
||||
function! ale#util#HasBuflineApi() abort
|
||||
return exists('*deletebufline') && exists('*appendbufline') && exists('*getpos') && exists('*setpos')
|
||||
return exists('*deletebufline') && exists('*setbufline')
|
||||
endfunction
|
||||
|
||||
" Sets buffer contents to lines
|
||||
|
@ -507,11 +507,8 @@ function! ale#util#SetBufferContents(buffer, lines) abort
|
|||
|
||||
" Use a Vim API for setting lines in other buffers, if available.
|
||||
if l:has_bufline_api
|
||||
let l:save_cursor = getpos('.')
|
||||
call deletebufline(a:buffer, 1, '$')
|
||||
call appendbufline(a:buffer, 1, l:new_lines)
|
||||
call deletebufline(a:buffer, 1, 1)
|
||||
call setpos('.', l:save_cursor)
|
||||
call setbufline(a:buffer, 1, l:new_lines)
|
||||
call deletebufline(a:buffer, l:first_line_to_remove, '$')
|
||||
" Fall back on setting lines the old way, for the current buffer.
|
||||
else
|
||||
let l:old_line_length = line('$')
|
||||
|
|
|
@ -46,6 +46,14 @@ g:ale_erlang_elvis_executable *g:ale_erlang_elvis_executable*
|
|||
-------------------------------------------------------------------------------
|
||||
erlc *ale-erlang-erlc*
|
||||
|
||||
g:ale_erlang_erlc_executable *g:ale_erlang_erlc_executable*
|
||||
*b:ale_erlang_erlc_executable*
|
||||
Type: |String|
|
||||
Default: `'erlc'`
|
||||
|
||||
This variable can be changed to specify the erlc executable.
|
||||
|
||||
|
||||
g:ale_erlang_erlc_options *g:ale_erlang_erlc_options*
|
||||
*b:ale_erlang_erlc_options*
|
||||
Type: |String|
|
||||
|
|
22
doc/ale-inko.txt
Normal file
22
doc/ale-inko.txt
Normal file
|
@ -0,0 +1,22 @@
|
|||
===============================================================================
|
||||
ALE Inko Integration *ale-inko-options*
|
||||
*ale-integration-inko*
|
||||
|
||||
===============================================================================
|
||||
Integration Information
|
||||
|
||||
Currently, the only supported linter for Inko is the Inko compiler itself.
|
||||
|
||||
===============================================================================
|
||||
inko *ale-inko-inko*
|
||||
|
||||
g:ale_inko_inko_executable *g:ale_inko_inko_executable*
|
||||
*b:ale_inko_inko_executable*
|
||||
Type: |String|
|
||||
Default: `'inko'`
|
||||
|
||||
This variable can be modified to change the executable path for `inko`.
|
||||
|
||||
|
||||
===============================================================================
|
||||
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
|
|
@ -36,6 +36,8 @@ ALE will look for configuration files with the following filenames. >
|
|||
.pylintrc
|
||||
Pipfile
|
||||
Pipfile.lock
|
||||
poetry.lock
|
||||
pyproject.toml
|
||||
<
|
||||
|
||||
The first directory containing any of the files named above will be used.
|
||||
|
|
|
@ -50,8 +50,8 @@ Notes:
|
|||
* `astyle`
|
||||
* `ccls`
|
||||
* `clang` (`cc`)
|
||||
* `clangd`
|
||||
* `clang-format`
|
||||
* `clangd`
|
||||
* `clangtidy`!!
|
||||
* `cppcheck`
|
||||
* `cpplint`!!
|
||||
|
@ -68,9 +68,9 @@ Notes:
|
|||
* `astyle`
|
||||
* `ccls`
|
||||
* `clang` (`cc`)
|
||||
* `clang-format`
|
||||
* `clangcheck`!!
|
||||
* `clangd`
|
||||
* `clang-format`
|
||||
* `clangtidy`!!
|
||||
* `clazy`!!
|
||||
* `cppcheck`
|
||||
|
@ -141,9 +141,9 @@ Notes:
|
|||
* `erubis`
|
||||
* `ruumba`
|
||||
* Erlang
|
||||
* `SyntaxErl`
|
||||
* `elvis`!!
|
||||
* `erlc`
|
||||
* `SyntaxErl`
|
||||
* Fish
|
||||
* `fish` (-n flag)
|
||||
* Fortran
|
||||
|
@ -161,17 +161,17 @@ Notes:
|
|||
* Go
|
||||
* `bingo`
|
||||
* `go build`!!
|
||||
* `go mod`!!
|
||||
* `go vet`!!
|
||||
* `gofmt`
|
||||
* `goimports`
|
||||
* `golangci-lint`!!
|
||||
* `golangserver`
|
||||
* `golint`
|
||||
* `gometalinter`!!
|
||||
* `go mod`!!
|
||||
* `gopls`
|
||||
* `gosimple`!!
|
||||
* `gotype`!!
|
||||
* `go vet`!!
|
||||
* `revive`!!
|
||||
* `staticcheck`!!
|
||||
* GraphQL
|
||||
|
@ -204,10 +204,10 @@ Notes:
|
|||
* HCL
|
||||
* `terraform-fmt`
|
||||
* HTML
|
||||
* `HTMLHint`
|
||||
* `alex`!!
|
||||
* `fecs`
|
||||
* `html-beautify`
|
||||
* `HTMLHint`
|
||||
* `prettier`
|
||||
* `proselint`
|
||||
* `tidy`
|
||||
|
@ -216,15 +216,17 @@ Notes:
|
|||
* `idris`
|
||||
* Ink
|
||||
* `ink-language-server`
|
||||
* Inko
|
||||
* `inko` !!
|
||||
* ISPC
|
||||
* `ispc`!!
|
||||
* Java
|
||||
* `PMD`
|
||||
* `checkstyle`
|
||||
* `eclipselsp`
|
||||
* `google-java-format`
|
||||
* `javac`
|
||||
* `javalsp`
|
||||
* `PMD`
|
||||
* `uncrustify`
|
||||
* JavaScript
|
||||
* `eslint`
|
||||
|
@ -331,10 +333,10 @@ Notes:
|
|||
* `intelephense`
|
||||
* `langserver`
|
||||
* `phan`
|
||||
* `php -l`
|
||||
* `php-cs-fixer`
|
||||
* `phpcbf`
|
||||
* `phpcs`
|
||||
* `php-cs-fixer`
|
||||
* `php -l`
|
||||
* `phpmd`
|
||||
* `phpstan`
|
||||
* `psalm`!!
|
||||
|
@ -395,6 +397,8 @@ Notes:
|
|||
* `styler`
|
||||
* Racket
|
||||
* `raco`
|
||||
* Re:VIEW
|
||||
* `redpen`
|
||||
* ReasonML
|
||||
* `merlin`
|
||||
* `ols`
|
||||
|
@ -408,8 +412,6 @@ Notes:
|
|||
* `textlint`
|
||||
* `vale`
|
||||
* `write-good`
|
||||
* Re:VIEW
|
||||
* `redpen`
|
||||
* RPM spec
|
||||
* `rpmlint`
|
||||
* Ruby
|
||||
|
@ -456,10 +458,10 @@ Notes:
|
|||
* `solium`
|
||||
* SQL
|
||||
* `pgformatter`
|
||||
* `sql-lint`
|
||||
* `sqlfmt`
|
||||
* `sqlformat`
|
||||
* `sqlint`
|
||||
* `sql-lint`
|
||||
* Stylus
|
||||
* `stylelint`
|
||||
* SugarSS
|
||||
|
|
37
doc/ale.txt
37
doc/ale.txt
|
@ -646,6 +646,9 @@ problem will be displayed in a balloon instead of hover information.
|
|||
Hover information can be displayed in the preview window instead by setting
|
||||
|g:ale_hover_to_preview| to `1`.
|
||||
|
||||
When using Neovim, if |g:ale_hover_to_floating_preview| or |g:ale_floating_preview|
|
||||
is set to 1, the hover information will show in a floating window.
|
||||
|
||||
For Vim 8.1+ terminals, mouse hovering is disabled by default. Enabling
|
||||
|balloonexpr| commands in terminals can cause scrolling issues in terminals,
|
||||
so ALE will not attempt to show balloons unless |g:ale_set_balloons| is set to
|
||||
|
@ -954,6 +957,15 @@ g:ale_default_navigation *g:ale_default_navigation*
|
|||
buffer, such as for |ALEFindReferences|, or |ALEGoToDefinition|.
|
||||
|
||||
|
||||
g:ale_detail_to_floating_preview *g:ale_detail_to_floating_preview*
|
||||
*b:ale_detail_to_floating_preview*
|
||||
Type: |Number|
|
||||
Default: `0`
|
||||
|
||||
When this option is set to `1`, Neovim will use a floating window for
|
||||
ALEDetail output.
|
||||
|
||||
|
||||
g:ale_disable_lsp *g:ale_disable_lsp*
|
||||
*b:ale_disable_lsp*
|
||||
|
||||
|
@ -1177,6 +1189,16 @@ g:ale_fix_on_save_ignore *g:ale_fix_on_save_ignore*
|
|||
let g:ale_fix_on_save_ignore = [g:AddBar]
|
||||
<
|
||||
|
||||
g:ale_floating_preview *g:ale_floating_preview*
|
||||
|
||||
Type: |Number|
|
||||
Default: `0`
|
||||
|
||||
When set to `1`, Neovim will use a floating window for ale's preview window.
|
||||
This is equivalent to setting |g:ale_hover_to_floating_preview| and
|
||||
|g:ale_detail_to_floating_preview| to `1`.
|
||||
|
||||
|
||||
g:ale_history_enabled *g:ale_history_enabled*
|
||||
|
||||
Type: |Number|
|
||||
|
@ -1235,6 +1257,14 @@ g:ale_hover_to_preview *g:ale_hover_to_preview*
|
|||
instead of in balloons or the message line.
|
||||
|
||||
|
||||
g:ale_hover_to_floating_preview *g:ale_hover_to_floating_preview*
|
||||
*b:ale_hover_to_floating_preview*
|
||||
Type: |Number|
|
||||
Default: `0`
|
||||
|
||||
If set to `1`, Neovim will use floating windows for hover messages.
|
||||
|
||||
|
||||
g:ale_keep_list_window_open *g:ale_keep_list_window_open*
|
||||
*b:ale_keep_list_window_open*
|
||||
Type: |Number|
|
||||
|
@ -1531,6 +1561,7 @@ g:ale_linters *g:ale_linters*
|
|||
\ 'go': ['gofmt', 'golint', 'go vet'],
|
||||
\ 'hack': ['hack'],
|
||||
\ 'help': [],
|
||||
\ 'inko': ['inko'],
|
||||
\ 'perl': ['perlcritic'],
|
||||
\ 'perl6': [],
|
||||
\ 'python': ['flake8', 'mypy', 'pylint', 'pyright'],
|
||||
|
@ -2709,6 +2740,8 @@ documented in additional help files.
|
|||
idris.................................|ale-idris-idris|
|
||||
ink.....................................|ale-ink-options|
|
||||
ink-language-server...................|ale-ink-language-server|
|
||||
inko....................................|ale-inko-options|
|
||||
inko..................................|ale-inko-inko|
|
||||
ispc....................................|ale-ispc-options|
|
||||
ispc..................................|ale-ispc-ispc|
|
||||
java....................................|ale-java-options|
|
||||
|
@ -2959,11 +2992,11 @@ documented in additional help files.
|
|||
hdl-checker...........................|ale-vhdl-hdl-checker|
|
||||
vcom..................................|ale-vhdl-vcom|
|
||||
xvhdl.................................|ale-vhdl-xvhdl|
|
||||
vim help................................|ale-vim-help-options|
|
||||
write-good............................|ale-vim-help-write-good|
|
||||
vim.....................................|ale-vim-options|
|
||||
vimls.................................|ale-vim-vimls|
|
||||
vint..................................|ale-vim-vint|
|
||||
vim help................................|ale-vim-help-options|
|
||||
write-good............................|ale-vim-help-write-good|
|
||||
vue.....................................|ale-vue-options|
|
||||
prettier..............................|ale-vue-prettier|
|
||||
vls...................................|ale-vue-vls|
|
||||
|
|
|
@ -138,6 +138,15 @@ let g:ale_set_balloons = get(g:, 'ale_set_balloons', has('balloon_eval') && has(
|
|||
" Use preview window for hover messages.
|
||||
let g:ale_hover_to_preview = get(g:, 'ale_hover_to_preview', 0)
|
||||
|
||||
" Float preview windows in Neovim
|
||||
let g:ale_floating_preview = get(g:, 'ale_floating_preview', 0)
|
||||
|
||||
" Hovers use floating windows in Neovim
|
||||
let g:ale_hover_to_floating_preview = get(g:, 'ale_hover_to_floating_preview', 0)
|
||||
|
||||
" Detail uses floating windows in Neovim
|
||||
let g:ale_detail_to_floating_preview = get(g:, 'ale_detail_to_floating_preview', 0)
|
||||
|
||||
" 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 0 to disable warnings for trailing blank lines
|
||||
|
|
|
@ -10,7 +10,7 @@ set -u
|
|||
#
|
||||
|
||||
image=w0rp/ale
|
||||
current_image_id=f58c7bf8900f
|
||||
current_image_id=1c04720f5d17
|
||||
|
||||
# Used in all test scripts for running the selected Docker image.
|
||||
DOCKER_RUN_IMAGE="$image"
|
||||
|
|
|
@ -59,8 +59,8 @@ formatting.
|
|||
* [astyle](http://astyle.sourceforge.net/)
|
||||
* [ccls](https://github.com/MaskRay/ccls)
|
||||
* [clang](http://clang.llvm.org/)
|
||||
* [clangd](https://clang.llvm.org/extra/clangd.html)
|
||||
* [clang-format](https://clang.llvm.org/docs/ClangFormat.html)
|
||||
* [clangd](https://clang.llvm.org/extra/clangd.html)
|
||||
* [clangtidy](http://clang.llvm.org/extra/clang-tidy/) :floppy_disk:
|
||||
* [cppcheck](http://cppcheck.sourceforge.net)
|
||||
* [cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint)
|
||||
|
@ -77,9 +77,9 @@ formatting.
|
|||
* [astyle](http://astyle.sourceforge.net/)
|
||||
* [ccls](https://github.com/MaskRay/ccls)
|
||||
* [clang](http://clang.llvm.org/)
|
||||
* [clang-format](https://clang.llvm.org/docs/ClangFormat.html)
|
||||
* [clangcheck](http://clang.llvm.org/docs/ClangCheck.html) :floppy_disk:
|
||||
* [clangd](https://clang.llvm.org/extra/clangd.html)
|
||||
* [clang-format](https://clang.llvm.org/docs/ClangFormat.html)
|
||||
* [clangtidy](http://clang.llvm.org/extra/clang-tidy/) :floppy_disk:
|
||||
* [clazy](https://github.com/KDE/clazy) :floppy_disk:
|
||||
* [cppcheck](http://cppcheck.sourceforge.net)
|
||||
|
@ -150,9 +150,9 @@ formatting.
|
|||
* [erubis](https://github.com/kwatch/erubis)
|
||||
* [ruumba](https://github.com/ericqweinstein/ruumba)
|
||||
* Erlang
|
||||
* [SyntaxErl](https://github.com/ten0s/syntaxerl)
|
||||
* [elvis](https://github.com/inaka/elvis) :floppy_disk:
|
||||
* [erlc](http://erlang.org/doc/man/erlc.html)
|
||||
* [SyntaxErl](https://github.com/ten0s/syntaxerl)
|
||||
* Fish
|
||||
* fish [-n flag](https://linux.die.net/man/1/fish)
|
||||
* Fortran
|
||||
|
@ -170,17 +170,17 @@ formatting.
|
|||
* Go
|
||||
* [bingo](https://github.com/saibing/bingo) :warning:
|
||||
* [go build](https://golang.org/cmd/go/) :warning: :floppy_disk:
|
||||
* [go mod](https://golang.org/cmd/go/) :warning: :floppy_disk:
|
||||
* [go vet](https://golang.org/cmd/vet/) :floppy_disk:
|
||||
* [gofmt](https://golang.org/cmd/gofmt/)
|
||||
* [goimports](https://godoc.org/golang.org/x/tools/cmd/goimports) :warning:
|
||||
* [golangci-lint](https://github.com/golangci/golangci-lint) :warning: :floppy_disk:
|
||||
* [golangserver](https://github.com/sourcegraph/go-langserver) :warning:
|
||||
* [golint](https://godoc.org/github.com/golang/lint)
|
||||
* [gometalinter](https://github.com/alecthomas/gometalinter) :warning: :floppy_disk:
|
||||
* [go mod](https://golang.org/cmd/go/) :warning: :floppy_disk:
|
||||
* [gopls](https://github.com/golang/go/wiki/gopls) :warning:
|
||||
* [gosimple](https://github.com/dominikh/go-tools/tree/master/cmd/gosimple) :warning: :floppy_disk:
|
||||
* [gotype](https://godoc.org/golang.org/x/tools/cmd/gotype) :warning: :floppy_disk:
|
||||
* [go vet](https://golang.org/cmd/vet/) :floppy_disk:
|
||||
* [revive](https://github.com/mgechev/revive) :warning: :floppy_disk:
|
||||
* [staticcheck](https://github.com/dominikh/go-tools/tree/master/cmd/staticcheck) :warning: :floppy_disk:
|
||||
* GraphQL
|
||||
|
@ -213,10 +213,10 @@ formatting.
|
|||
* HCL
|
||||
* [terraform-fmt](https://github.com/hashicorp/terraform)
|
||||
* HTML
|
||||
* [HTMLHint](http://htmlhint.com/)
|
||||
* [alex](https://github.com/wooorm/alex) :floppy_disk:
|
||||
* [fecs](http://fecs.baidu.com/)
|
||||
* [html-beautify](https://beautifier.io/)
|
||||
* [HTMLHint](http://htmlhint.com/)
|
||||
* [prettier](https://github.com/prettier/prettier)
|
||||
* [proselint](http://proselint.com/)
|
||||
* [tidy](http://www.html-tidy.org/)
|
||||
|
@ -225,15 +225,17 @@ formatting.
|
|||
* [idris](http://www.idris-lang.org/)
|
||||
* Ink
|
||||
* [ink-language-server](https://github.com/ephread/ink-language-server)
|
||||
* Inko
|
||||
* [inko](https://inko-lang.org/) :floppy_disk:
|
||||
* ISPC
|
||||
* [ispc](https://ispc.github.io/) :floppy_disk:
|
||||
* Java
|
||||
* [PMD](https://pmd.github.io/)
|
||||
* [checkstyle](http://checkstyle.sourceforge.net)
|
||||
* [eclipselsp](https://github.com/eclipse/eclipse.jdt.ls)
|
||||
* [google-java-format](https://github.com/google/google-java-format)
|
||||
* [javac](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
|
||||
* [javalsp](https://github.com/georgewfraser/vscode-javac)
|
||||
* [PMD](https://pmd.github.io/)
|
||||
* [uncrustify](https://github.com/uncrustify/uncrustify)
|
||||
* JavaScript
|
||||
* [eslint](http://eslint.org/)
|
||||
|
@ -340,10 +342,10 @@ formatting.
|
|||
* [intelephense](https://github.com/bmewburn/intelephense-docs)
|
||||
* [langserver](https://github.com/felixfbecker/php-language-server)
|
||||
* [phan](https://github.com/phan/phan) see `:help ale-php-phan` to instructions
|
||||
* [php -l](https://secure.php.net/)
|
||||
* [php-cs-fixer](http://cs.sensiolabs.org/)
|
||||
* [phpcbf](https://github.com/squizlabs/PHP_CodeSniffer)
|
||||
* [phpcs](https://github.com/squizlabs/PHP_CodeSniffer)
|
||||
* [php-cs-fixer](http://cs.sensiolabs.org/)
|
||||
* [php -l](https://secure.php.net/)
|
||||
* [phpmd](https://phpmd.org)
|
||||
* [phpstan](https://github.com/phpstan/phpstan)
|
||||
* [psalm](https://getpsalm.org) :floppy_disk:
|
||||
|
@ -404,6 +406,8 @@ formatting.
|
|||
* [styler](https://github.com/r-lib/styler)
|
||||
* Racket
|
||||
* [raco](https://docs.racket-lang.org/raco/)
|
||||
* Re:VIEW
|
||||
* [redpen](http://redpen.cc/)
|
||||
* ReasonML
|
||||
* [merlin](https://github.com/the-lambda-church/merlin) see `:help ale-reasonml-ols` for configuration instructions
|
||||
* [ols](https://github.com/freebroccolo/ocaml-language-server)
|
||||
|
@ -417,8 +421,6 @@ formatting.
|
|||
* [textlint](https://textlint.github.io/)
|
||||
* [vale](https://github.com/ValeLint/vale)
|
||||
* [write-good](https://github.com/btford/write-good)
|
||||
* Re:VIEW
|
||||
* [redpen](http://redpen.cc/)
|
||||
* RPM spec
|
||||
* [rpmlint](https://github.com/rpm-software-management/rpmlint) :warning: (see `:help ale-integration-spec`)
|
||||
* Ruby
|
||||
|
@ -465,10 +467,10 @@ formatting.
|
|||
* [solium](https://github.com/duaraghav8/Solium)
|
||||
* SQL
|
||||
* [pgformatter](https://github.com/darold/pgFormatter)
|
||||
* [sql-lint](https://github.com/joereynolds/sql-lint)
|
||||
* [sqlfmt](https://github.com/jackc/sqlfmt)
|
||||
* [sqlformat](https://github.com/andialbrecht/sqlparse)
|
||||
* [sqlint](https://github.com/purcell/sqlint)
|
||||
* [sql-lint](https://github.com/joereynolds/sql-lint)
|
||||
* Stylus
|
||||
* [stylelint](https://github.com/stylelint/stylelint)
|
||||
* SugarSS
|
||||
|
|
0
test/command_callback/inko_paths/test.inko
Normal file
0
test/command_callback/inko_paths/test.inko
Normal file
|
@ -0,0 +1,40 @@
|
|||
Before:
|
||||
call ale#assert#SetUpLinterTest('erlang', 'erlc')
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The default command should be correct.):
|
||||
let g:cmd = ale_linters#erlang#erlc#GetCommand(bufnr(''))
|
||||
let g:regex = 'erlc.\+-o.\+%t'
|
||||
let g:matched = match(g:cmd, g:regex)
|
||||
|
||||
" match returns -1 if not found
|
||||
AssertNotEqual
|
||||
\ g:matched,
|
||||
\ -1,
|
||||
\ 'Command error: expected [' . g:cmd . '] to match [' . g:regex . ']'
|
||||
|
||||
Execute(The command should accept configured executable.):
|
||||
let b:ale_erlang_erlc_executable = '/usr/bin/erlc'
|
||||
let g:cmd = ale_linters#erlang#erlc#GetCommand(bufnr(''))
|
||||
let g:regex = '/usr/bin/erlc.\+-o.\+%t'
|
||||
let g:matched = match(g:cmd, g:regex)
|
||||
|
||||
" match returns -1 if not found
|
||||
AssertNotEqual
|
||||
\ g:matched,
|
||||
\ -1,
|
||||
\ 'Command error: expected [' . g:cmd . '] to match [' . g:regex . ']'
|
||||
|
||||
Execute(The command should accept configured options.):
|
||||
let b:ale_erlang_erlc_options = '-I include'
|
||||
let g:cmd = ale_linters#erlang#erlc#GetCommand(bufnr(''))
|
||||
let g:regex = 'erlc.\+-o.\+-I include.\+%t'
|
||||
let g:matched = match(g:cmd, g:regex)
|
||||
|
||||
" match returns -1 if not found
|
||||
AssertNotEqual
|
||||
\ g:matched,
|
||||
\ -1,
|
||||
\ 'Command error: expected [' . g:cmd . '] to match [' . g:regex . ']'
|
|
@ -1,5 +1,6 @@
|
|||
Before:
|
||||
call ale#assert#SetUpLinterTest('javascript', 'fecs')
|
||||
runtime autoload/ale/handlers/fecs.vim
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
|
20
test/command_callback/test_inko_inko_callbacks.vader
Normal file
20
test/command_callback/test_inko_inko_callbacks.vader
Normal file
|
@ -0,0 +1,20 @@
|
|||
Before:
|
||||
call ale#assert#SetUpLinterTest('inko', 'inko')
|
||||
call ale#test#SetFilename('inko_paths/test.inko')
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The default executable path should be correct):
|
||||
AssertLinter 'inko', ale#Escape('inko') . ' build --check --format=json %s'
|
||||
|
||||
Execute(The inko callback should include tests/ for test paths):
|
||||
call ale#engine#Cleanup(bufnr(''))
|
||||
noautocmd e! inko_paths/tests/test/test_foo.inko
|
||||
call ale#engine#InitBufferInfo(bufnr(''))
|
||||
|
||||
AssertLinter 'inko',
|
||||
\ ale#Escape('inko')
|
||||
\ . ' build --check --format=json --include '
|
||||
\ . ale#Escape(ale#path#Simplify(g:dir . '/inko_paths/tests/'))
|
||||
\ . ' %s'
|
54
test/handler/test_inko_handler.vader
Normal file
54
test/handler/test_inko_handler.vader
Normal file
|
@ -0,0 +1,54 @@
|
|||
Before:
|
||||
runtime ale_linters/inko/inko.vim
|
||||
|
||||
After:
|
||||
call ale#linter#Reset()
|
||||
|
||||
Execute(The inko handler should parse errors correctly):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'filename': ale#path#Simplify('/tmp/foo.inko'),
|
||||
\ 'lnum': 4,
|
||||
\ 'col': 5,
|
||||
\ 'text': 'this is an error',
|
||||
\ 'type': 'E',
|
||||
\ }
|
||||
\ ],
|
||||
\ ale#handlers#inko#Handle(bufnr(''), [
|
||||
\ '[',
|
||||
\ ' {',
|
||||
\ ' "file": "/tmp/foo.inko",',
|
||||
\ ' "line": 4,',
|
||||
\ ' "column": 5,',
|
||||
\ ' "message": "this is an error",',
|
||||
\ ' "level": "error"',
|
||||
\ ' }',
|
||||
\ ']'
|
||||
\ ])
|
||||
|
||||
Execute(The inko handler should parse warnings correctly):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'filename': ale#path#Simplify('/tmp/foo.inko'),
|
||||
\ 'lnum': 4,
|
||||
\ 'col': 5,
|
||||
\ 'text': 'this is a warning',
|
||||
\ 'type': 'W',
|
||||
\ }
|
||||
\ ],
|
||||
\ ale#handlers#inko#Handle(bufnr(''), [
|
||||
\ '[',
|
||||
\ ' {',
|
||||
\ ' "file": "/tmp/foo.inko",',
|
||||
\ ' "line": 4,',
|
||||
\ ' "column": 5,',
|
||||
\ ' "message": "this is a warning",',
|
||||
\ ' "level": "warning"',
|
||||
\ ' }',
|
||||
\ ']'
|
||||
\ ])
|
||||
|
||||
Execute(The inko handler should handle empty output):
|
||||
AssertEqual [], ale#handlers#inko#Handle(bufnr(''), [])
|
5
test/script/check-duplicate-tags
Executable file
5
test/script/check-duplicate-tags
Executable file
|
@ -0,0 +1,5 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
grep --exclude=tags -roh '\*.*\*$' doc | sort | uniq -d
|
|
@ -15,14 +15,13 @@ while read -r; do
|
|||
if [[ "$REPLY" =~ ^! ]]; then
|
||||
language="${REPLY/!/}"
|
||||
else
|
||||
# shellcheck disable=SC2001
|
||||
echo "$language - $REPLY"
|
||||
fi
|
||||
done < <(
|
||||
grep '^\*\|^ *\*' doc/ale-supported-languages-and-tools.txt \
|
||||
| sed -e '1,2d' \
|
||||
| sed 's/^\* */!/' \
|
||||
| sed 's/^ *\* *\|!!\|\^\|(.*)\|`//g' \
|
||||
| sed -E 's/^ *\* *|!!|\^|\(.*\)|`//g' \
|
||||
| sed 's/ *$//'
|
||||
) > "$doc_file"
|
||||
|
||||
|
@ -30,13 +29,12 @@ while read -r; do
|
|||
if [[ "$REPLY" =~ ^! ]]; then
|
||||
language="${REPLY/!/}"
|
||||
else
|
||||
# shellcheck disable=SC2001
|
||||
echo "$language - $REPLY"
|
||||
fi
|
||||
done < <(
|
||||
grep '^\*\|^ *\*' supported-tools.md \
|
||||
| sed 's/^\* */!/' \
|
||||
| sed 's/^ *\* *\|:floppy_disk:\|:warning:\|(.*)\|\[\|\].*\|-n flag//g' \
|
||||
| sed -E 's/^ *\* *|:floppy_disk:|:warning:|\(.*\)|\[|\].*|-n flag//g' \
|
||||
| sed 's/ *$//'
|
||||
) > "$readme_file"
|
||||
|
||||
|
|
11
test/script/check-tag-alignment
Executable file
11
test/script/check-tag-alignment
Executable file
|
@ -0,0 +1,11 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
exit_code=0
|
||||
|
||||
# Documentation tags need to be aligned to the right margin, so look for
|
||||
# tags which aren't at the right margin.
|
||||
grep ' \*[^*]\+\*$' doc/ -r \
|
||||
| awk '{ sep = index($0, ":"); if (length(substr($0, sep + 1 )) < 79) { print } }' \
|
||||
| grep . && exit_code=1
|
||||
|
||||
exit $exit_code
|
22
test/script/check-tag-references
Executable file
22
test/script/check-tag-references
Executable file
|
@ -0,0 +1,22 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
exit_code=0
|
||||
tag_regex='[gb]\?:\?\(ale\|ALE\)[a-zA-Z_\-]\+'
|
||||
|
||||
tags="$(mktemp -t tags.XXXXXXXX)"
|
||||
refs="$(mktemp -t refs.XXXXXXXX)"
|
||||
# Grep for tags and references, and complain if we find a reference without
|
||||
# a tag for the reference. Only our tags will be included.
|
||||
grep --exclude=tags -roh "\\*$tag_regex\\*" doc | sed 's/*//g' | sort -u > "$tags"
|
||||
grep --exclude=tags -roh "|$tag_regex|" doc | sed 's/|//g' | sort -u > "$refs"
|
||||
|
||||
exit_code=0
|
||||
|
||||
if ! [[ $(comm -23 $refs $tags | wc -l) -eq 0 ]]; then
|
||||
exit_code=1
|
||||
fi
|
||||
|
||||
rm "$tags"
|
||||
rm "$refs"
|
|
@ -35,7 +35,7 @@ sed -n "$toc_start_line,$toc_end_line"p doc/ale.txt \
|
|||
> "$toc_file"
|
||||
|
||||
# Get all of the doc files in a natural sorted order.
|
||||
doc_files="$(/usr/bin/env ls -1v doc | grep ^ale- | sed 's/^/doc\//' | paste -sd ' ' -)"
|
||||
doc_files="$(/usr/bin/env ls -1v doc | grep '^ale-' | sed 's/^/doc\//' | paste -sd ' ' -)"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
grep -h '\*ale-.*-options\|^[a-z].*\*ale-.*\*$' $doc_files \
|
||||
|
|
|
@ -13,7 +13,7 @@ echo 'Custom warnings/errors follow:'
|
|||
echo
|
||||
|
||||
set -o pipefail
|
||||
docker run -a stdout "${docker_flags[@]}" test/script/custom-linting-rules . || exit_code=$?
|
||||
docker run "${docker_flags[@]}" test/script/custom-linting-rules . || exit_code=$?
|
||||
set +o pipefail
|
||||
echo
|
||||
|
||||
|
@ -23,7 +23,10 @@ echo '========================================'
|
|||
echo 'Duplicate tags follow:'
|
||||
echo
|
||||
|
||||
grep --exclude=tags -roh '\*.*\*$' doc | sort | uniq -d || exit_code=$?
|
||||
set -o pipefail
|
||||
docker run "${docker_flags[@]}" test/script/check-duplicate-tags . || exit_code=$?
|
||||
set +o pipefail
|
||||
echo
|
||||
|
||||
echo '========================================'
|
||||
echo 'Checking for invalid tag references'
|
||||
|
@ -31,14 +34,9 @@ echo '========================================'
|
|||
echo 'Invalid tag references tags follow:'
|
||||
echo
|
||||
|
||||
tag_regex='[gb]\?:\?\(ale\|ALE\)[a-zA-Z_\-]\+'
|
||||
|
||||
# Grep for tags and references, and complain if we find a reference without
|
||||
# a tag for the reference. Only our tags will be included.
|
||||
diff -u \
|
||||
<(grep --exclude=tags -roh "\\*$tag_regex\\*" doc | sort -u | sed 's/*//g') \
|
||||
<(grep --exclude=tags -roh "|$tag_regex|" doc | sort -u | sed 's/|//g') \
|
||||
| grep '^+[^+]' && exit_code=1
|
||||
set -o pipefail
|
||||
docker run "${docker_flags[@]}" test/script/check-tag-references || exit_code=$?
|
||||
set +o pipefail
|
||||
|
||||
echo '========================================'
|
||||
echo 'diff supported-tools.md and doc/ale-supported-languages-and-tools.txt tables'
|
||||
|
@ -46,7 +44,9 @@ echo '========================================'
|
|||
echo 'Differences follow:'
|
||||
echo
|
||||
|
||||
test/script/check-supported-tools-tables || exit_code=$?
|
||||
set -o pipefail
|
||||
docker run "${docker_flags[@]}" test/script/check-supported-tools-tables || exit_code=$?
|
||||
set +o pipefail
|
||||
|
||||
echo '========================================'
|
||||
echo 'Look for badly aligned doc tags'
|
||||
|
@ -54,18 +54,18 @@ echo '========================================'
|
|||
echo 'Badly aligned tags follow:'
|
||||
echo
|
||||
|
||||
# Documentation tags need to be aligned to the right margin, so look for
|
||||
# tags which aren't at the right margin.
|
||||
grep ' \*[^*]\+\*$' doc/ -r \
|
||||
| awk '{ sep = index($0, ":"); if (length(substr($0, sep + 1 )) < 79) { print } }' \
|
||||
| grep . && exit_code=1
|
||||
set -o pipefail
|
||||
docker run "${docker_flags[@]}" test/script/check-tag-alignment || exit_code=$?
|
||||
set +o pipefail
|
||||
|
||||
echo '========================================'
|
||||
echo 'Look for table of contents issues'
|
||||
echo '========================================'
|
||||
echo
|
||||
|
||||
test/script/check-toc || exit_code=$?
|
||||
set -o pipefail
|
||||
docker run "${docker_flags[@]}" test/script/check-toc || exit_code=$?
|
||||
set +o pipefail
|
||||
|
||||
echo '========================================'
|
||||
echo 'Check Python code'
|
||||
|
|
|
@ -53,17 +53,29 @@ check_errors() {
|
|||
regex="$1"
|
||||
message="$2"
|
||||
include_arg=''
|
||||
exclude_arg=''
|
||||
|
||||
if [ $# -gt 2 ]; then
|
||||
include_arg="--include $3"
|
||||
fi
|
||||
|
||||
if [ $# -gt 3 ]; then
|
||||
shift
|
||||
shift
|
||||
shift
|
||||
|
||||
while (( "$#" )); do
|
||||
exclude_arg="$exclude_arg --exclude $1"
|
||||
shift
|
||||
done
|
||||
fi
|
||||
|
||||
for directory in "${directories[@]}"; do
|
||||
# shellcheck disable=SC2086
|
||||
while read -r; do
|
||||
RETURN_CODE=1
|
||||
echo "$REPLY $message"
|
||||
done < <(grep -H -n "$regex" $include_arg "$directory"/**/*.vim \
|
||||
done < <(grep -H -n "$regex" $include_arg $exclude_arg "$directory"/**/*.vim \
|
||||
| grep -v 'no-custom-checks' \
|
||||
| grep -o '^[^:]\+:[0-9]\+' \
|
||||
| sed 's:^\./::')
|
||||
|
@ -92,7 +104,7 @@ if (( FIX_ERRORS )); then
|
|||
done
|
||||
fi
|
||||
|
||||
# The arguments are: regex, explanation, [filename_filter]
|
||||
# The arguments are: regex, explanation, [filename_filter], [list, of, exclusions]
|
||||
check_errors \
|
||||
'^function.*) *$' \
|
||||
'Function without abort keyword (See :help except-compat)'
|
||||
|
@ -114,7 +126,10 @@ check_errors '==?' "Use 'is?' instead of '==?'. 0 ==? 'foobar' is true"
|
|||
check_errors '!=#' "Use 'isnot#' instead of '!=#'. 0 !=# 'foobar' is false"
|
||||
check_errors '!=?' "Use 'isnot?' instead of '!=?'. 0 !=? 'foobar' is false"
|
||||
check_errors '^ *:\?echo' "Stray echo line. Use \`execute echo\` if you want to echo something"
|
||||
check_errors $'name.:.*\'[a-z_]*[^a-z_0-9][a-z_0-9]*\',$' 'Use snake_case names for linters' '*/ale_linters/*'
|
||||
# Exclusions for grandfathered-in exceptions
|
||||
exclusions="clojure/clj_kondo.vim elixir/elixir_ls.vim go/golangci_lint.vim swift/swiftformat.vim"
|
||||
# shellcheck disable=SC2086
|
||||
check_errors $'name.:.*\'[a-z_]*[^a-z_0-9][a-z_0-9]*\',$' 'Use snake_case names for linters' '*/ale_linters/*' $exclusions
|
||||
# Checks for improving type checks.
|
||||
check_errors $'\\(==.\\?\\|is\\) type([\'"]\+)' "Use 'is v:t_string' instead"
|
||||
check_errors '\(==.\?\|is\) type([0-9]\+)' "Use 'is v:t_number' instead"
|
||||
|
|
92
test/test_floating_preview.vader
Normal file
92
test/test_floating_preview.vader
Normal file
|
@ -0,0 +1,92 @@
|
|||
Before:
|
||||
let g:ale_floating_preview = 0
|
||||
let g:ale_hover_to_floating_preview = 0
|
||||
let g:ale_detail_to_floating_preview = 0
|
||||
|
||||
runtime autoload/ale/floating_preview.vim
|
||||
|
||||
let g:floated_lines = []
|
||||
let g:floating_preview_show_called = 0
|
||||
|
||||
" Stub out so we can track the call
|
||||
function! ale#floating_preview#Show(lines, ...) abort
|
||||
let g:floating_preview_show_called = 1
|
||||
let g:floated_lines = a:lines
|
||||
endfunction
|
||||
|
||||
let g:ale_buffer_info = {
|
||||
\ bufnr('%'): {
|
||||
\ 'loclist': [
|
||||
\ {
|
||||
\ 'lnum': 1,
|
||||
\ 'col': 10,
|
||||
\ 'bufnr': bufnr('%'),
|
||||
\ 'vcol': 0,
|
||||
\ 'linter_name': 'notalinter',
|
||||
\ 'nr': -1,
|
||||
\ 'type': 'E',
|
||||
\ 'code': 'semi',
|
||||
\ 'text': "Missing semicolon.\r",
|
||||
\ 'detail': "Every statement should end with a semicolon\nsecond line",
|
||||
\ },
|
||||
\ ],
|
||||
\ }
|
||||
\}
|
||||
|
||||
call ale#linter#Reset()
|
||||
call ale#linter#PreventLoading('javascript')
|
||||
|
||||
After:
|
||||
Restore
|
||||
|
||||
let g:ale_floating_preview = 0
|
||||
let g:ale_hover_to_floating_preview = 0
|
||||
let g:ale_detail_to_floating_preview = 0
|
||||
|
||||
call cursor(1, 1)
|
||||
|
||||
let g:ale_buffer_info = {}
|
||||
|
||||
" Close the preview window if it's open.
|
||||
if &filetype is# 'ale-preview'
|
||||
noautocmd :q!
|
||||
endif
|
||||
|
||||
call ale#linter#Reset()
|
||||
|
||||
|
||||
Given javascript(A file with warnings/errors):
|
||||
var x = 3 + 12345678
|
||||
var x = 5*2 + parseInt("10");
|
||||
// comment
|
||||
|
||||
Execute(Floating preview is used with ALEDetail when g:ale_floating_preview set):
|
||||
let g:ale_floating_preview = 1
|
||||
|
||||
call cursor(1, 10)
|
||||
|
||||
ALEDetail
|
||||
|
||||
let expected = ["Every statement should end with a semicolon", "second line"]
|
||||
|
||||
AssertEqual 1, g:floating_preview_show_called
|
||||
AssertEqual expected, g:floated_lines
|
||||
|
||||
Execute(Floating preview is used with ALEDetail when g:ale_detail_to_floating_preview set):
|
||||
let g:ale_detail_to_floating_preview = 1
|
||||
|
||||
call cursor(1, 10)
|
||||
|
||||
ALEDetail
|
||||
|
||||
let expected = ["Every statement should end with a semicolon", "second line"]
|
||||
|
||||
AssertEqual 1, g:floating_preview_show_called
|
||||
AssertEqual expected, g:floated_lines
|
||||
|
||||
Execute(Floating preview is not used with ALEDetail by default):
|
||||
call cursor(1, 10)
|
||||
|
||||
ALEDetail
|
||||
|
||||
AssertEqual 0, g:floating_preview_show_called
|
|
@ -7,9 +7,25 @@ Before:
|
|||
let g:item_list = []
|
||||
let g:show_message_arg_list = []
|
||||
|
||||
let g:ale_floating_preview = 0
|
||||
let g:ale_hover_to_floating_preview = 0
|
||||
let g:ale_detail_to_floating_preview = 0
|
||||
|
||||
runtime autoload/ale/linter.vim
|
||||
runtime autoload/ale/lsp.vim
|
||||
runtime autoload/ale/lsp_linter.vim
|
||||
runtime autoload/ale/util.vim
|
||||
runtime autoload/ale/floating_preview.vim
|
||||
runtime autoload/ale/hover.vim
|
||||
|
||||
let g:floated_lines = []
|
||||
let g:floating_preview_show_called = 0
|
||||
|
||||
" Stub out so we can track the call
|
||||
function! ale#floating_preview#Show(lines, ...) abort
|
||||
let g:floating_preview_show_called = 1
|
||||
let g:floated_lines = a:lines
|
||||
endfunction
|
||||
|
||||
function! ale#lsp_linter#StartLSP(buffer, linter, callback) abort
|
||||
let g:Callback = a:callback
|
||||
|
@ -50,6 +66,7 @@ Before:
|
|||
\)
|
||||
endfunction
|
||||
|
||||
|
||||
After:
|
||||
call ale#hover#SetMap({})
|
||||
call ale#test#RestoreDirectory()
|
||||
|
@ -65,6 +82,7 @@ After:
|
|||
runtime autoload/ale/lsp_linter.vim
|
||||
runtime autoload/ale/lsp.vim
|
||||
runtime autoload/ale/util.vim
|
||||
runtime autoload/ale/floating_preview.vim
|
||||
|
||||
Given python(Some Python file):
|
||||
foo
|
||||
|
@ -168,6 +186,28 @@ Execute(LSP hover response with lists of strings and marked strings should be ha
|
|||
\], g:show_message_arg_list
|
||||
AssertEqual {}, ale#hover#GetMap()
|
||||
|
||||
Execute(LSP hover with ale_floating_preview should float):
|
||||
let g:ale_floating_preview = 1
|
||||
|
||||
call HandleValidLSPResult({'contents': "the message\ncontinuing"})
|
||||
|
||||
AssertEqual 1, g:floating_preview_show_called
|
||||
AssertEqual ["the message", "continuing"], g:floated_lines
|
||||
|
||||
Execute(LSP hover ale_hover_to_floating_preview should float):
|
||||
let g:ale_hover_to_floating_preview = 1
|
||||
|
||||
call HandleValidLSPResult({'contents': "the message\ncontinuing"})
|
||||
|
||||
AssertEqual 1, g:floating_preview_show_called
|
||||
AssertEqual ["the message", "continuing"], g:floated_lines
|
||||
|
||||
|
||||
Execute(LSP hover by default should not float):
|
||||
call HandleValidLSPResult({'contents': "the message\ncontinuing"})
|
||||
|
||||
AssertEqual 0, g:floating_preview_show_called
|
||||
|
||||
Execute(tsserver responses for documentation requests should be handled):
|
||||
call ale#hover#SetMap({3: {'show_documentation': 1, 'buffer': bufnr('')}})
|
||||
|
||||
|
@ -187,3 +227,46 @@ Execute(tsserver responses for documentation requests should be handled):
|
|||
" The preview window should show the text.
|
||||
AssertEqual ['foo is a very good method'], ale#test#GetPreviewWindowText()
|
||||
silent! pclose
|
||||
|
||||
Execute(hover with show_documentation should be in the preview window, not floating):
|
||||
let g:ale_hover_to_floating_preview = 1
|
||||
let g:ale_floating_preview = 1
|
||||
|
||||
call ale#hover#SetMap({3: {'show_documentation': 1, 'buffer': bufnr('')}})
|
||||
|
||||
call ale#hover#HandleTSServerResponse(
|
||||
\ 1,
|
||||
\ {
|
||||
\ 'command': 'quickinfo',
|
||||
\ 'request_seq': 3,
|
||||
\ 'success': v:true,
|
||||
\ 'body': {
|
||||
\ 'documentation': 'foo is a very good method',
|
||||
\ 'displayString': 'foo bar ',
|
||||
\ },
|
||||
\ }
|
||||
\)
|
||||
|
||||
let expected = ["Every statement should end with a semicolon", "second line"]
|
||||
|
||||
AssertEqual 0, g:floating_preview_show_called
|
||||
|
||||
Execute(TSServer hover without show_documentation and ale_floating_preview should float):
|
||||
let g:ale_floating_preview = 1
|
||||
|
||||
call ale#hover#SetMap({3: {'buffer': bufnr('')}})
|
||||
|
||||
call ale#hover#HandleTSServerResponse(
|
||||
\ 1,
|
||||
\ {
|
||||
\ 'command': 'quickinfo',
|
||||
\ 'request_seq': 3,
|
||||
\ 'success': v:true,
|
||||
\ 'body': {
|
||||
\ 'displayString': "the message\ncontinuing",
|
||||
\ },
|
||||
\ }
|
||||
\)
|
||||
|
||||
AssertEqual 1, g:floating_preview_show_called
|
||||
AssertEqual ["the message", "continuing"], g:floated_lines
|
||||
|
|
Reference in a new issue