Package: neovim-runtime
Version: 0.4.3-2
Severity: normal
When editing lisp, C, or python files (didn't test any other yet),
`Highlight_Matching_Pair` throws an error when adding a parenthesis in
a comment.
Eg. start an empty python file and enter
# (
to get the error.
Please excuse the german strings.
-- EINFÜGEN --
Ausführung von CursorMovedI Autokommandos für "*"
Autokommando call s:Highlight_Matching_Pair()
Zeile 0: call s:Highlight_Matching_Pair()
rufe function <SNR>67_Highlight_Matching_Pair auf()
Zeile 1: " Remove any previous match.
Zeile 2: if exists('w:paren_hl_on') && w:paren_hl_on
Zeile 3: silent! call matchdelete(3)
Zeile 4: let w:paren_hl_on = 0
Zeile 5: endif
Zeile 6:
Zeile 7: " Avoid that we remove the popup menu.
Zeile 8: " Return when there are no colors (looks like the cursor jumps).
Zeile 9: if pumvisible() || (&t_Co < 8 && !has("gui_running"))
Zeile 10: return
Zeile 11: endif
Zeile 12:
Zeile 13: " Get the character under the cursor and check if it's in
'matchpairs'.
Zeile 14: let c_lnum = line('.')
Zeile 15: let c_col = col('.')
Zeile 16: let before = 0
Zeile 17:
Zeile 18: let text = getline(c_lnum)
Zeile 19: let matches = matchlist(text, '\(.\)\=\%'.c_col.'c\(.\=\)')
Zeile 20: if empty(matches)
Zeile 21: let [c_before, c] = ['', '']
Zeile 22: else
Zeile 23: let [c_before, c] = matches[1:2]
Zeile 24: endif
Zeile 25: let plist = split(&matchpairs, '.\zs[:,]')
Zeile 26: let i = index(plist, c)
Zeile 27: if i < 0
Zeile 28: " not found, in Insert mode try character before the cursor
Zeile 29: if c_col > 1 && (mode() == 'i' || mode() == 'R')
Zeile 30: let before = strlen(c_before)
Zeile 31: let c = c_before
Zeile 32: let i = index(plist, c)
Zeile 33: endif
Zeile 34: if i < 0
Zeile 35: " not found, nothing to do
Zeile 36: return
Zeile 37: endif
Zeile 38: endif
Zeile 39:
Zeile 40: " Figure out the arguments for searchpairpos().
Zeile 41: if i % 2 == 0
Zeile 42: let s_flags = 'nW'
Zeile 43: let c2 = plist[i + 1]
Zeile 44: else
Zeile 45: let s_flags = 'nbW'
Zeile 46: let c2 = c
Zeile 47: let c = plist[i - 1]
Zeile 48: endif
Zeile 49: if c == '['
Zeile 50: let c = '\['
Zeile 51: let c2 = '\]'
Zeile 52: endif
Zeile 53:
Zeile 54: " Find the match. When it was just before the cursor move it there
for a
Zeile 55: " moment.
Zeile 56: if before > 0
Zeile 57: let has_getcurpos = exists("*getcurpos")
Zeile 58: if has_getcurpos
Zeile 59: " getcurpos() is more efficient but doesn't exist before
7.4.313.
Zeile 60: let save_cursor = getcurpos()
Zeile 61: else
Zeile 62: let save_cursor = winsaveview()
Zeile 63: endif
Zeile 64: call cursor(c_lnum, c_col - before)
Zeile 65: endif
Zeile 66:
Zeile 67: " Build an expression that detects whether the current cursor
position is in
Zeile 68: " certain syntax types (string, comment, etc.), for use as
searchpairpos()'s
Zeile 69: " skip argument.
Zeile 70: " We match "escape" for special items, such as lispEscapeSpecial.
Zeile 71: let s_skip = '!empty(filter(map(synstack(line("."), col(".")),
''synIDattr(v:val, "name")''), ' . '''v:val =~?
"string\\|character\\|singlequote\\|escape\\|comment"''))'
Zeile 73: " If executing the expression determines that the cursor is
currently in
Zeile 74: " one of the syntax types, then we want searchpairpos() to find the
pair
Zeile 75: " within those syntax types (i.e., not skip). Otherwise, the
cursor is
Zeile 76: " outside of the syntax types and s_skip should keep its value so
we skip any
Zeile 77: " matching pair inside the syntax types.
Zeile 78: execute 'if' s_skip '| let s_skip = 0 | endif'
Zeile 78: if !empty(filter(map(synstack(line("."), col(".")), 'synIDattr(v:val,
"name")'), 'v:val =~? "string\\|character\\|singlequote\\|escape\\|comment"'))
| let s_skip = 0 | endif
Zeile 78: let s_skip = 0 | endif
Zeile 78: endif
Zeile 79:
Zeile 80: " Limit the search to lines visible in the window.
Zeile 81: let stoplinebottom = line('w$')
Zeile 82: let stoplinetop = line('w0')
Zeile 83: if i % 2 == 0
Zeile 84: let stopline = stoplinebottom
Zeile 85: else
Zeile 86: let stopline = stoplinetop
Zeile 87: endif
Zeile 88:
Zeile 89: " Limit the search time to 300 msec to avoid a hang on very long
lines.
Zeile 90: " This fails when a timeout is not supported.
Zeile 91: if mode() == 'i' || mode() == 'R'
Zeile 92: let timeout = exists("b:matchparen_insert_timeout") ?
b:matchparen_insert_timeout : g:matchparen_insert_timeout
Zeile 93: else
Zeile 94: let timeout = exists("b:matchparen_timeout") ?
b:matchparen_timeout : g:matchparen_timeout
Zeile 95: endif
Zeile 96: try
Zeile 97: let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip,
stopline, timeout)
Ausnahme geworfen: Vim(let):E475: Ungültiges Argument: 0
-- System Information:
Debian Release: 10.0
APT prefers testing
APT policy: (990, 'testing'), (500, 'unstable-debug'), (500,
'testing-debug'), (500, 'unstable'), (500, 'stable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Kernel: Linux 5.2.0-3-amd64 (SMP w/8 CPU cores)
Kernel taint flags: TAINT_WARN
Locale: LANG=de_AT.UTF-8, LC_CTYPE=de_AT.UTF-8 (charmap=UTF-8),
LANGUAGE=de_AT:de (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
-- no debconf information
--