From 2750c605c1ee320a8675fb40a224a60d27f8de6f Mon Sep 17 00:00:00 2001 From: w0rp Date: Fri, 3 Mar 2017 20:14:03 +0000 Subject: [PATCH] Fix cursor issues, and clean up the cursor tests --- autoload/ale/cursor.vim | 61 +++++++++++------ test/test_cursor_warnings.vader | 117 ++++++++++++-------------------- 2 files changed, 81 insertions(+), 97 deletions(-) diff --git a/autoload/ale/cursor.vim b/autoload/ale/cursor.vim index 7a9cfc80..cd9593ce 100644 --- a/autoload/ale/cursor.vim +++ b/autoload/ale/cursor.vim @@ -18,6 +18,26 @@ function! s:GetMessage(linter, type, text) abort return printf(l:msg, l:text) endfunction +function! s:EchoWithShortMess(setting, message) abort + " We need to remember the setting for shormess and reset it again. + let l:shortmess_options = getbufvar('%', '&shortmess') + + try + " Turn shormess on or off. + if a:setting ==# 'on' + setlocal shortmess+=T + elseif a:setting ==# 'off' + setlocal shortmess-=T + else + throw 'Invalid setting: ' . string(a:setting) + endif + + exec "norm! :echomsg a:message\n" + finally + call setbufvar('%', '&shortmess', l:shortmess_options) + endtry +endfunction + function! ale#cursor#TruncatedEcho(message) abort let l:message = a:message " Change tabs to spaces. @@ -25,17 +45,7 @@ function! ale#cursor#TruncatedEcho(message) abort " Remove any newlines in the message. let l:message = substitute(l:message, "\n", '', 'g') - " We need to turn T for truncated messages on for shortmess, - " and then then we need to reset the option back to what it was. - let l:shortmess_options = getbufvar('%', '&shortmess') - - try - " Echo the message truncated to fit without creating a prompt. - setlocal shortmess+=T - exec "norm! :echomsg message\n" - finally - call setbufvar('%', '&shortmess', l:shortmess_options) - endtry + call s:EchoWithShortMess('on', l:message) endfunction function! s:FindItemAtCursor() abort @@ -47,6 +57,13 @@ function! s:FindItemAtCursor() abort return [l:info, l:loc] 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#cursor#EchoCursorWarning(...) abort " Only echo the warnings in normal mode, otherwise we will get problems. if mode() !=# 'n' @@ -63,7 +80,7 @@ function! ale#cursor#EchoCursorWarning(...) abort " We'll only clear the echoed message when moving off errors once, " so we don't continually clear the echo line. echo - let l:info.echoed = 1 + let l:info.echoed = 0 endif endfunction @@ -75,10 +92,7 @@ function! ale#cursor#EchoCursorWarningWithDelay() abort return endif - if s:cursor_timer != -1 - call timer_stop(s:cursor_timer) - let s:cursor_timer = -1 - endif + call s:StopCursorTimer() let l:pos = getcurpos()[0:2] @@ -92,19 +106,22 @@ function! ale#cursor#EchoCursorWarningWithDelay() abort endif endfunction -function! ale#cursor#ShowCursorDetail(...) abort +function! ale#cursor#ShowCursorDetail() abort " Only echo the warnings in normal mode, otherwise we will get problems. if mode() !=# 'n' return endif + call s:StopCursorTimer() + 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 + let l:message = get(l:loc, 'detail', l:loc.text) + + call s:EchoWithShortMess('off', l:message) + + " Set the echo marker, so we can clear it by moving the cursor. + let l:info.echoed = 1 endif endfunction diff --git a/test/test_cursor_warnings.vader b/test/test_cursor_warnings.vader index cddeda99..5e37036a 100644 --- a/test/test_cursor_warnings.vader +++ b/test/test_cursor_warnings.vader @@ -4,33 +4,33 @@ Before: \ 'loclist': [ \ { \ 'lnum': 1, + \ 'col': 10, \ 'bufnr': bufnr('%'), \ 'vcol': 0, \ 'linter_name': 'eslint', \ 'nr': -1, \ 'type': 'E', - \ 'col': 10, \ 'text': 'Missing semicolon. (semi)', \ 'detail': 'Every statement should end with a semicolon' \ }, \ { \ 'lnum': 2, + \ 'col': 10, \ 'bufnr': bufnr('%'), \ 'vcol': 0, \ 'linter_name': 'eslint', \ 'nr': -1, \ 'type': 'W', - \ 'col': 10, \ 'text': 'Infix operators must be spaced. (space-infix-ops)' \ }, \ { \ 'lnum': 2, + \ 'col': 15, \ 'bufnr': bufnr('%'), \ 'vcol': 0, \ 'linter_name': 'eslint', \ 'nr': -1, \ 'type': 'E', - \ 'col': 15, \ 'text': 'Missing radix parameter (radix)' \ } \ ], @@ -42,107 +42,74 @@ Before: let g:ale_set_signs = 0 let g:ale_set_highlights = 0 + function GetLastMessage() + redir => l:output + silent mess + redir END + + let l:lines = split(l:output, "\n") + + return empty(l:lines) ? '' : l:lines[-1] + endfunction + After: + call cursor(1, 1) + let g:ale_set_loclist = 1 let g:ale_set_signs = 1 let g:ale_set_highlights = 1 - unlet! g:output - unlet! g:lines let g:ale_buffer_info = {} + delfunction GetLastMessage + + mess clear + Given javascript(A Javscript file with warnings/errors): var x = 3 var x = 5*2 + parseInt("10"); -Execute(Evaluate the cursor function at line 1): - :1 +Execute(Messages should be shown for the correct lines): + call cursor(1, 1) call ale#cursor#EchoCursorWarning() -Then(Check the cursor output): - redir => g:output - silent mess - redir END + AssertEqual 'Missing semicolon. (semi)', GetLastMessage() - let g:lines = split(g:output, "\n") - - AssertEqual 'Missing semicolon. (semi)', g:lines[-1] - -Execute(Evaluate the cursor function at line 2): - :2 +Execute(Messages should be shown for earlier columns): + call cursor(2, 1) call ale#cursor#EchoCursorWarning() -Then(Check the cursor output): - redir => g:output - silent mess - redir END + AssertEqual 'Infix operators must be spaced. (space-infix-ops)', GetLastMessage() - let g:lines = split(g:output, "\n") - - AssertEqual 'Infix operators must be spaced. (space-infix-ops)', g:lines[-1] - -Execute(Evaluate the cursor function later in line 2): - :2 - normal 16l +Execute(Messages should be shown for later columns): + call cursor(2, 16) call ale#cursor#EchoCursorWarning() -Then(Check the cursor output): - redir => g:output - silent mess - redir END + AssertEqual 'Missing radix parameter (radix)', GetLastMessage() - let g:lines = split(g:output, "\n") - - AssertEqual 'Missing radix parameter (radix)', g:lines[-1] - -Execute(Set results for a lint cycle, with the cursor on line 1): - :1 +Execute(The message at the cursor should be shown when linting ends): + call cursor(1, 1) call ale#engine#SetResults( \ bufnr('%'), \ g:ale_buffer_info[bufnr('%')].loclist, \) -Then(Check the cursor output): - redir => g:output - silent mess - redir END + AssertEqual 'Missing semicolon. (semi)', GetLastMessage() - let g:lines = split(g:output, "\n") - - AssertEqual 'Missing semicolon. (semi)', g:lines[-1] - -Execute(Simulate leaving insert mode on line 2): - :2 - normal 16h +Execute(The message at the cursor should be shown on InsertLeave): + call cursor(2, 9) doautocmd InsertLeave -Then(Check the cursor output): - redir => g:output - silent mess - redir END + AssertEqual 'Infix operators must be spaced. (space-infix-ops)', GetLastMessage() - let g:lines = split(g:output, "\n") +Execute(ALEDetail should print 'detail' attributes): + call cursor(1, 1) + ALEDetail - AssertEqual 'Infix operators must be spaced. (space-infix-ops)', g:lines[-1] + AssertEqual "Every statement should end with a semicolon", GetLastMessage() -Execute(Evaluate the cursor detail function at line 1): - :1 - call ale#cursor#ShowCursorDetail() +Execute(ALEDetail should print regular 'text' attributes): + call cursor(2, 10) + ALEDetail -Then(Check the cursor output): - redir => g:output - silent 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 - silent mess - redir END - - AssertEqual "Infix operators must be spaced. (space-infix-ops)", g:lines[-1] + AssertEqual "Infix operators must be spaced. (space-infix-ops)", GetLastMessage()