summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/elm/make.vim1
-rw-r--r--autoload/ale/cursor.vim49
-rw-r--r--autoload/ale/engine.vim4
-rw-r--r--doc/ale.txt8
-rw-r--r--plugin/ale.vim4
-rw-r--r--test/test_cursor_warnings.vader25
6 files changed, 73 insertions, 18 deletions
diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim
index 23297838..3a4febc9 100644
--- a/ale_linters/elm/make.vim
+++ b/ale_linters/elm/make.vim
@@ -25,6 +25,7 @@ function! ale_linters#elm#make#Handle(buffer, lines) abort
\ 'col': l:error.region.start.column,
\ 'type': (l:error.type ==? 'error') ? 'E' : 'W',
\ 'text': l:error.overview,
+ \ 'detail': l:error.overview . "\n\n" . l:error.details
\})
endif
endfor
diff --git a/autoload/ale/cursor.vim b/autoload/ale/cursor.vim
index 9aaa8e91..7a9cfc80 100644
--- a/autoload/ale/cursor.vim
+++ b/autoload/ale/cursor.vim
@@ -38,34 +38,32 @@ function! ale#cursor#TruncatedEcho(message) abort
endtry
endfunction
+function! s:FindItemAtCursor() abort
+ let l:info = get(g:ale_buffer_info, bufnr('%'), {'loclist': []})
+ let l:pos = getcurpos()
+ let l:index = ale#util#BinarySearch(l:info.loclist, l:pos[1], l:pos[2])
+ let l:loc = l:index >= 0 ? l:info.loclist[l:index] : {}
+
+ return [l:info, l:loc]
+endfunction
+
function! ale#cursor#EchoCursorWarning(...) abort
" Only echo the warnings in normal mode, otherwise we will get problems.
if mode() !=# 'n'
return
endif
- let l:buffer = bufnr('%')
-
- if !has_key(g:ale_buffer_info, l:buffer)
- return
- endif
-
- let l:pos = getcurpos()
- let l:loclist = g:ale_buffer_info[l:buffer].loclist
- let l:index = ale#util#BinarySearch(l:loclist, l:pos[1], l:pos[2])
+ let [l:info, l:loc] = s:FindItemAtCursor()
- if l:index >= 0
- let l:loc = l:loclist[l:index]
+ if !empty(l:loc)
let l:msg = s:GetMessage(l:loc.linter_name, l:loc.type, l:loc.text)
call ale#cursor#TruncatedEcho(l:msg)
- let g:ale_buffer_info[l:buffer].echoed = 1
- else
+ let l:info.echoed = 1
+ elseif get(l:info, 'echoed')
" We'll only clear the echoed message when moving off errors once,
" so we don't continually clear the echo line.
- if get(g:ale_buffer_info[l:buffer], 'echoed')
- echo
- let g:ale_buffer_info[l:buffer].echoed = 0
- endif
+ echo
+ let l:info.echoed = 1
endif
endfunction
@@ -93,3 +91,20 @@ function! ale#cursor#EchoCursorWarningWithDelay() abort
let s:cursor_timer = timer_start(10, function('ale#cursor#EchoCursorWarning'))
endif
endfunction
+
+function! ale#cursor#ShowCursorDetail(...) abort
+ " Only echo the warnings in normal mode, otherwise we will get problems.
+ if mode() !=# 'n'
+ return
+ endif
+
+ let [l:info, l:loc] = s:FindItemAtCursor()
+
+ if !empty(l:loc)
+ if has_key(l:loc, 'detail')
+ echo l:loc.detail
+ else
+ echo l:loc.text
+ endif
+ endif
+endfunction
diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim
index ffef76a9..0707aa40 100644
--- a/autoload/ale/engine.vim
+++ b/autoload/ale/engine.vim
@@ -338,6 +338,10 @@ function! ale#engine#FixLocList(buffer, linter, loclist) abort
\ 'linter_name': a:linter.name,
\}
+ if has_key(l:old_item, 'detail')
+ let l:item.detail = l:old_item.detail
+ endif
+
if l:item.lnum == 0
" When errors appear at line 0, put them at line 1 instead.
let l:item.lnum = 1
diff --git a/doc/ale.txt b/doc/ale.txt
index 72daa97f..af26b9c9 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -1173,6 +1173,14 @@ ALEToggle *ALEToggle*
quickfix items, signs, current jobs, etc. Calling this option will change
the |g:ale_enabled| variable.
+
+ALEDetail *ALEDetail*
+
+ Show the full linter message for the current line. This will only have an
+ effect on lines that contain a linter message.
+
+ A plug mapping `<Plug>(ale_detail)` is defined for this command.
+
===============================================================================
7. API *ale-api*
diff --git a/plugin/ale.vim b/plugin/ale.vim
index 90505f29..e69aba18 100644
--- a/plugin/ale.vim
+++ b/plugin/ale.vim
@@ -212,6 +212,9 @@ command! ALEPreviousWrap :call ale#loclist_jumping#Jump('before', 1)
command! ALENext :call ale#loclist_jumping#Jump('after', 0)
command! ALENextWrap :call ale#loclist_jumping#Jump('after', 1)
+" A command for showing error details.
+command! ALEDetail :call ale#cursor#ShowCursorDetail()
+
" A command for turning ALE on or off.
command! ALEToggle :call s:ALEToggle()
" A command for linting manually.
@@ -229,6 +232,7 @@ nnoremap <silent> <Plug>(ale_next) :ALENext<Return>
nnoremap <silent> <Plug>(ale_next_wrap) :ALENextWrap<Return>
nnoremap <silent> <Plug>(ale_toggle) :ALEToggle<Return>
nnoremap <silent> <Plug>(ale_lint) :ALELint<Return>
+nnoremap <silent> <Plug>(ale_detail) :ALEDetail<Return>
" Housekeeping
diff --git a/test/test_cursor_warnings.vader b/test/test_cursor_warnings.vader
index ab7937bd..75d6c975 100644
--- a/test/test_cursor_warnings.vader
+++ b/test/test_cursor_warnings.vader
@@ -10,7 +10,8 @@ Before:
\ 'nr': -1,
\ 'type': 'E',
\ 'col': 10,
- \ 'text': 'Missing semicolon. (semi)'
+ \ 'text': 'Missing semicolon. (semi)',
+ \ 'detail': 'Every statement should end with a semicolon'
\ },
\ {
\ 'lnum': 2,
@@ -123,3 +124,25 @@ Then(Check the cursor output):
let g:lines = split(g:output, "\n")
AssertEqual 'Infix operators must be spaced. (space-infix-ops)', g:lines[-1]
+
+Execute(Evaluate the cursor detail function at line 1):
+ :1
+ call ale#cursor#ShowCursorDetail()
+
+Then(Check the cursor output):
+ redir => g:output
+ :mess
+ redir END
+
+ AssertEqual "Every statement should end with a semicolon", g:lines[-1]
+
+Execute(Evaluate the cursor detail function at line 2):
+ :2
+ call ale#cursor#ShowCursorDetail()
+
+Then(Check the cursor output):
+ redir => g:output
+ :mess
+ redir END
+
+ AssertEqual "Infix operators must be spaced. (space-infix-ops)", g:lines[-1]