From c228c70ee3914f982355350176f3186f4ff5d9a7 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sun, 27 Sep 2026 21:37:04 +0900 Subject: [PATCH] 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. --- autoload/fzf/vim.vim | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index 1339c94..3560106 100755 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -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]]]