dense-analysis / ale

Check syntax in Vim/Neovim asynchronously and fix files, with Language Server Protocol (LSP) support
BSD 2-Clause "Simplified" License
13.38k stars 1.42k forks source link

Sign and highlights are not set with 'other source' feature #3690

Open rhysd opened 3 years ago

rhysd commented 3 years ago

Information

VIM version

VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Apr  1 2021 21:01:15)
macOS version - x86_64

Operating System: macOS 10.15

What went wrong

I'm making a bridge plugin between vim-lsp and ALE. I noticed that sign is not set when calling ale#other_source#ShowResults. Sign is not put even if signcolumn=yes is set (default value is auto).

スクリーンショット 2021-04-12 18 20 00

Reproducing the bug

Assuming that ALE is installed in ~/.vim/bundle directory.

  1. `echo "a\nb\n" > test.txt
  2. vim -u test_vimrc test.txt
  3. Check sign is put at line 1
" test_vimrc

set nocompatible
filetype plugin indent on
set rtp+=~/.vim/bundle/ale
let g:ale_set_signs = 1
let g:ale_linters = {}
let g:ale_linters['text'] = ['my-test-linter']
augroup SomeGroupName
    autocmd!
    autocmd User ALEWantResults call Hook(g:ale_want_results_buffer)
augroup END

function! Hook(buffer) abort
    call ale#other_source#StartChecking(a:buffer, 'my-test-linter')
    let item = {
        \   'bufnr': a:buffer,
        \   'lnum': 1,
        \   'col': 1,
        \   'vcol': 0,
        \   'text': 'this is dummy error message for buffer ' . a:buffer,
        \   'type': 'E',
        \ }
    call ale#other_source#ShowResults(a:buffer, 'my-test-linter', [item])
endfunction

:ALEInfo


 Current Filetype: text
Available Linters: ['alex', 'languagetool', 'proselint', 'redpen', 'textlint', 'vale', 'writegood']
   Linter Aliases:
'writegood' -> ['write-good']
  Enabled Linters: []
  Ignored Linters: []
 Suggested Fixers: 
  'remove_trailing_lines' - Remove all blank lines at the end of a file.
  'textlint' - Fix text files with textlint --fix
  'trim_whitespace' - Remove all trailing whitespace characters at the end of every line.
 Linter Variables:

 Global Variables:

let g:ale_cache_executable_check_failures = v:null
let g:ale_change_sign_column_color = 0
let g:ale_command_wrapper = v:null
let g:ale_completion_delay = v:null
let g:ale_completion_enabled = 0
let g:ale_completion_max_suggestions = v:null
let g:ale_disable_lsp = 0
let g:ale_echo_cursor = 1
let g:ale_echo_msg_error_str = 'Error'
let g:ale_echo_msg_format = '%code: %%s'
let g:ale_echo_msg_info_str = 'Info'
let g:ale_echo_msg_warning_str = 'Warning'
let g:ale_enabled = 1
let g:ale_fix_on_save = 0
let g:ale_fixers = {}
let g:ale_history_enabled = 1
let g:ale_history_log_output = 1
let g:ale_keep_list_window_open = 0
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 = 1
let g:ale_lint_on_save = 1
let g:ale_lint_on_text_changed = 'normal'
let g:ale_linter_aliases = {}
let g:ale_linters = {'text': ['my-test-linter']}
let g:ale_linters_explicit = 0
let g:ale_linters_ignore = {}
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 = v:null
let g:ale_max_signs = -1
let g:ale_maximum_file_size = v:null
let g:ale_open_list = 0
let g:ale_pattern_options = v:null
let g:ale_pattern_options_enabled = v:null
let g:ale_root = {}
let g:ale_set_balloons = 0
let g:ale_set_highlights = 1
let g:ale_set_loclist = 1
let g:ale_set_quickfix = 0
let g:ale_set_signs = 1
let g:ale_sign_column_always = 0
let g:ale_sign_error = '>>'
let g:ale_sign_info = '--'
let g:ale_sign_offset = 1000000
let g:ale_sign_style_error = '>>'
let g:ale_sign_style_warning = '--'
let g:ale_sign_warning = '--'
let g:ale_sign_highlight_linenrs = 0
let g:ale_statusline_format = v:null
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
  Command History:
rhysd commented 3 years ago

@w0rp This issue is related to https://github.com/prabirshrestha/vim-lsp/issues/882

rhysd commented 3 years ago

After some investigation, I found that this issue no longer occurred when modifying the code as follows:

set nocompatible
filetype plugin indent on
set rtp+=~/.vim/bundle/ale
let g:ale_set_signs = 1
let g:ale_linters = {}
let g:ale_linters['text'] = ['my-test-linter']
augroup SomeGroupName
    autocmd!
    autocmd User ALEWantResults call Hook(g:ale_want_results_buffer)
augroup END

function! ShowResults(buffer) abort
    let item = {
        \   'bufnr': a:buffer,
        \   'lnum': 1,
        \   'col': 1,
        \   'vcol': 0,
        \   'text': 'this is dummy error message for buffer ' . a:buffer,
        \   'type': 'E',
        \ }
    call ale#other_source#ShowResults(a:buffer, 'my-test-linter', [item])
endfunction

function! Hook(buffer) abort
    call ale#other_source#StartChecking(a:buffer, 'my-test-linter')
    call timer_start(0, {-> ShowResults(a:buffer)})
endfunction
スクリーンショット 2021-04-12 18 29 02

Seems that calling ale#other_source#ShowResults and ale#other_source#StartChecking synchronously causes this issue.

w0rp commented 3 years ago

It's probably some weird bug I need to look into. I'm not sure exactly what, but it's probably something I can fix by playing around with it until it works. If calling the functions from an asynchronous callback works, you can just call them from 0 millisecond timers like you did above for now.

rhysd commented 3 years ago

Yes, I added the workaround so this is not blocking issue for me though running code through timer is slower than running it synchronously. So if fixing this issue is hard or time consuming, please feel free to close this as wontfix. In the case, updating document to describe the function is only available in an async callback would be helpful.