dense-analysis / ale

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

Vim nowrap and virtual text can break window rendering #4538

Open chazmcgarvey opened 1 year ago

chazmcgarvey commented 1 year ago

Information

VIM version

VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Jun 03 2023 16:11:47) macOS version - arm64

Operating System: macOS 13.3.1

What went wrong

When the nowrap setting is enabled and the last character of a line is in the right-most column of the window (e.g. the line exactly spans the width of the window and the window is not scrolled horizontally), virtual text on that line will cause the line and all remaining lines in the window to disappear.

Reproducing the bug

Use the minimal configuration:

set nocompatible
set nowrap
silent! call plug#begin('~/.vim/plugged')
Plug 'dense-analysis/ale'
call plug#end()
  1. Edit a buffer in Vim such that there is a line that spans the exact width of the Vim window (including the margin for signs and line numbers).
  2. Cause virtual text to be added to the line that spans the width of the Vim window.
  3. Observe rendering in the window glitch out.

Examples of problem lines:

:ALEInfo

Expand Current Filetype: python Available Linters: ['bandit', 'cspell', 'flake8', 'flakehell', 'jedils', 'mypy', 'prospector', 'pycln', 'pycodestyle', 'pydocstyle', 'pyflakes', 'pylama', 'pylint', 'pylsp', 'pyre', 'pyright', 'refurb', 'ruff', 'unimport', 'vulture'] Enabled Linters: ['flake8', 'mypy', 'pylint', 'pyright', 'ruff'] Ignored Linters: [] Suggested Fixers: 'add_blank_lines_for_python_control_statements' - Add blank lines before control statements. 'autoflake' - Fix flake issues with autoflake. 'autoimport' - Fix import issues with autoimport. 'autopep8' - Fix PEP8 issues with autopep8. 'black' - Fix PEP8 issues with black. 'isort' - Sort Python imports with isort. 'pycln' - remove unused python import statements 'pyflyby' - Tidy Python imports with pyflyby. 'remove_trailing_lines' - Remove all blank lines at the end of a file. 'reorder-python-imports' - Sort Python imports with reorder-python-imports. 'ruff' - A python linter/fixer for Python written in Rust 'trim_whitespace' - Remove all trailing whitespace characters at the end of every line. 'yapf' - Fix Python files with yapf. Linter Variables: let g:ale_python_auto_pipenv = 0 let g:ale_python_auto_poetry = 0 let g:ale_python_auto_virtualenv = 0 let g:ale_python_black_options = '--line-length=110' let g:ale_python_flake8_auto_pipenv = 0 let g:ale_python_flake8_auto_poetry = 0 let g:ale_python_flake8_change_directory = 'project' let g:ale_python_flake8_executable = 'flake8' let g:ale_python_flake8_options = '' let g:ale_python_flake8_use_global = 0 let g:ale_python_mypy_auto_pipenv = 0 let g:ale_python_mypy_auto_poetry = 0 let g:ale_python_mypy_executable = 'mypy' let g:ale_python_mypy_ignore_invalid_syntax = 0 let g:ale_python_mypy_options = '' let g:ale_python_mypy_show_notes = 1 let g:ale_python_mypy_use_global = 0 let g:ale_python_pylint_auto_pipenv = 0 let g:ale_python_pylint_auto_poetry = 0 let g:ale_python_pylint_change_directory = 1 let g:ale_python_pylint_executable = 'pylint' let g:ale_python_pylint_options = '' let g:ale_python_pylint_use_global = 0 let g:ale_python_pylint_use_msg_id = 0 let g:ale_python_pyright_auto_pipenv = 0 let g:ale_python_pyright_auto_poetry = 0 let g:ale_python_pyright_config = {} let g:ale_python_pyright_executable = 'pyright-langserver' let g:ale_python_pyright_use_global = 0 let g:ale_python_ruff_auto_pipenv = 0 let g:ale_python_ruff_auto_poetry = 0 let g:ale_python_ruff_change_directory = 1 let g:ale_python_ruff_executable = 'ruff' let g:ale_python_ruff_options = '' let g:ale_python_ruff_use_global = 0 Global Variables: let g:ale_cache_executable_check_failures = v:null let g:ale_change_sign_column_color = 0 let g:ale_command_wrapper = '' 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 = {'python': ['black', 'isort']} 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 = {} 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 = 20 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_neovim_diagnostics_api = 0 let g:ale_use_global_executables = v:null let g:ale_virtualtext_cursor = 'current' let g:ale_warn_about_trailing_blank_lines = 1 let g:ale_warn_about_trailing_whitespace = 1 Command History: (finished - exit code 0) ['/opt/homebrew/bin/bash', '-c', '''pylint'' --version'] <<>> pylint 2.17.2 astroid 2.15.5 Python 3.11.4 (main, Jun 9 2023, 16:52:53) [Clang 14.0.3 (clang-1403.0.22.14.1)] <<>> (executable check - failure) flake8 (executable check - failure) mypy (executable check - success) pylint (finished - exit code 30) ['/opt/homebrew/bin/bash', '-c', 'cd ''/Users/user/project'' && ''pylint'' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n --from-stdin ''/Users/user/project/main.py'' < ''/var/folders/3l/b_1614xx6nn88t2c1f2422fc0000gq/T/v9jI21q/1/main.py'''] <<>> ************* Module main main.py:482:0: C0301 (line-too-long) Line too long (117/110) main.py:45:0: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:97:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:111:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:120:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:132:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:241:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:254:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:265:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:265:0: R0914 (too-many-locals) Too many local variables (25/15) main.py:380:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:392:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:265:0: R0912 (too-many-branches) Too many branches (14/12) main.py:265:0: R0915 (too-many-statements) Too many statements (54/50) main.py:339:16: W0612 (unused-variable) Unused variable 'date_from' main.py:339:27: W0612 (unused-variable) Unused variable 'date_thru' main.py:342:16: W0612 (unused-variable) Unused variable 'now' main.py:403:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:403:0: R0914 (too-many-locals) Too many local variables (23/15) main.py:436:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:461:17: E1123 (unexpected-keyword-arg) Unexpected keyword argument 'profile_id' in classmethod call main.py:481:4: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:502:4: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:403:0: R0911 (too-many-return-statements) Too many return statements (8/6) main.py:508:0: R0914 (too-many-locals) Too many local variables (23/15) main.py:569:4: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:9:0: W0611 (unused-import) Unused import re main.py:10:0: W0611 (unused-import) Unused import sys main.py:11:0: W0611 (unused-import) Unused wraps imported from functools ------------------------------------------------------------------ Your code has been rated at 8.89/10 (previous run: 8.89/10, +0.00) <<>> (executable check - failure) pyright-langserver (executable check - failure) ruff (executable check - failure) flake8 (executable check - failure) mypy (started) ['/opt/homebrew/bin/bash', '-c', 'cd ''/Users/user/project'' && ''pylint'' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n --from-stdin ''/Users/user/project/main.py'' < ''/var/folders/3l/b_1614xx6nn88t2c1f2422fc0000gq/T/v9jI21q/2/main.py'''] (executable check - failure) pyright-langserver (executable check - failure) ruff (executable check - failure) flake8 (executable check - failure) mypy (finished - exit code 30) ['/opt/homebrew/bin/bash', '-c', 'cd ''/Users/user/project'' && ''pylint'' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n --from-stdin ''/Users/user/project/main.py'' < ''/var/folders/3l/b_1614xx6nn88t2c1f2422fc0000gq/T/v9jI21q/3/main.py'''] <<>> ************* Module main main.py:482:0: C0301 (line-too-long) Line too long (121/110) main.py:45:0: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:97:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:111:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:120:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:132:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:241:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:254:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:265:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:265:0: R0914 (too-many-locals) Too many local variables (25/15) main.py:380:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:392:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:265:0: R0912 (too-many-branches) Too many branches (14/12) main.py:265:0: R0915 (too-many-statements) Too many statements (54/50) main.py:339:16: W0612 (unused-variable) Unused variable 'date_from' main.py:339:27: W0612 (unused-variable) Unused variable 'date_thru' main.py:342:16: W0612 (unused-variable) Unused variable 'now' main.py:403:0: C0116 (missing-function-docstring) Missing function or method docstring main.py:403:0: R0914 (too-many-locals) Too many local variables (23/15) main.py:436:8: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:461:17: E1123 (unexpected-keyword-arg) Unexpected keyword argument 'profile_id' in classmethod call main.py:481:4: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:502:4: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:403:0: R0911 (too-many-return-statements) Too many return statements (8/6) main.py:508:0: R0914 (too-many-locals) Too many local variables (23/15) main.py:569:4: W1203 (logging-fstring-interpolation) Use lazy % formatting in logging functions main.py:9:0: W0611 (unused-import) Unused import re main.py:10:0: W0611 (unused-import) Unused import sys main.py:11:0: W0611 (unused-import) Unused wraps imported from functools ------------------------------------------------------------------ Your code has been rated at 8.89/10 (previous run: 8.89/10, +0.00) <<>> (executable check - failure) pyright-langserver (executable check - failure) ruff
topherbuckley commented 5 days ago

Wow, I did not catch the importance of the window edge being of interest, but yes, I can reproduce this and was searching for a similar issue. I'm going to go ahead and add some tags that I was searching for but didn't help find this. The "glitch" for me always rendered a bunch of {at signs, at symbols, "@"} as per below:

@
@
@
@
@

Hoping those words help others find this.