Allow an unterminated pattern after earlier address parts

A field holding a tab arrives cut short, so :BTags with 'ctags
--excmd=combine' sees '2;/^int tabbed(void) {' and stopped jumping. The last
part runs to the end of the line, taking any '|' or ';' with it, so it still
cannot chain a command.
This commit is contained in:
Junegunn Choi
2026-09-27 21:37:04 +09:00
parent a5717367fc
commit c228c70ee3
+6 -4
View File
@@ -543,9 +543,10 @@ endfunction
" Address of a tag, given the rest of the line after the file name. Only the
" forms a tags file is meant to hold, a line number and a search pattern,
" chained with ';' for '--excmd=combine' and cut at the ';"' terminator as
" Vim's find_extra() does. A pattern left unterminated runs to the end of the
" line, taking any '|' or ';' with it, so it cannot chain a command. Returns
" an empty string for anything else, which is then not run.
" Vim's find_extra() does. The last pattern can be left unterminated, as a
" field holding a tab arrives cut short; it then runs to the end of the line,
" taking any '|' or ';' with it, so it cannot chain a command. Returns an
" empty string for anything else, which is then not run.
let s:tag_address_part = '\%(\d\+\|/\%(\\.\|[^/\\]\)*/\|?\%(\\.\|[^?\\]\)*?\)'
let s:tag_address_open = '\%(/\%(\\.\|[^/\\]\)*\|?\%(\\.\|[^?\\]\)*\)'
function! s:tag_address(rest)
@@ -553,7 +554,8 @@ function! s:tag_address(rest)
let rest = s:strip(a:rest)
let address = matchstr(rest,
\ '^'.s:tag_address_part.'\%(;'.s:tag_address_part.'\)*\ze\%(;"\|$\)')
return empty(address) ? matchstr(rest, '^'.s:tag_address_open.'$') : address
return empty(address) ? matchstr(rest,
\ '^\%('.s:tag_address_part.';\)*'.s:tag_address_open.'$') : address
endfunction
" [key, [filename, [stay_on_edit: 0]]]