dense-analysis / dense-analysis/ale
Vim nowrap and virtual text can break window rendering
- Dominant language
- Vim Script
- Stars
- 14k
- Forks
- 1.5k
- Avg merge
- 17h 49m
- Merged PRs (30d)
- 1
Description
## 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:
- The sign column is 2 characters wide, line numbers are off, the buffer line itself is 78 wide and the Vim window is 80 wide.
- The sign column is 2 characters wide, line number column is 4 wide, the buffer line itself is 78 wide and the Vim window is 84 wide.
- The sign column is 2 characters wide, line numbers are off, the buffer line itself is 85 wide, the Vim window is 80 wide and the window is scrolled 7 characters to the left (`7zl`)
### :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
Contributor guide
Assessment
This issue has not been assessed yet.