vim-patch:9.1.1396: 'grepformat' is a global option (#34060)

Problem:  The 'grepformat' option is global option, but it would be
          useful to have it buffer-local, similar to 'errorformat' and
          other quickfix related options (Dani Dickstein)
Solution: Add the necessary code to support global-local 'grepformat',
          allowing different buffers to parse different grep output
          formats (glepnir)

fixes: vim/vim#17316
closes: vim/vim#17315

7b9eb6389d

Co-authored-by: glepnir <glephunter@gmail.com>
This commit is contained in:
zeertzjq
2025-05-17 08:20:20 +08:00
committed by GitHub
parent ec5f054dc9
commit 99384fcd9c
10 changed files with 33 additions and 3 deletions

View File

@@ -167,6 +167,7 @@ OPTIONS
|ins-completion| modes. |ins-completion| modes.
• 'completeopt' flag "nearset" sorts completion results by distance to cursor. • 'completeopt' flag "nearset" sorts completion results by distance to cursor.
• 'diffopt' `inline:` configures diff highlighting for changes within a line. • 'diffopt' `inline:` configures diff highlighting for changes within a line.
• 'grepformat' is now a |global-local| option.
• 'pummaxwidth' sets maximum width for the completion popup menu. • 'pummaxwidth' sets maximum width for the completion popup menu.
• 'winborder' "bold" style. • 'winborder' "bold" style.
• |g:clipboard| accepts a string name to force any builtin clipboard tool. • |g:clipboard| accepts a string name to force any builtin clipboard tool.

View File

@@ -3034,7 +3034,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'grepformat'* *'gfm'* *'grepformat'* *'gfm'*
'grepformat' 'gfm' string (default "%f:%l:%m,%f:%l%m,%f %l%m") 'grepformat' 'gfm' string (default "%f:%l:%m,%f:%l%m,%f %l%m")
global global or local to buffer |global-local|
Format to recognize for the ":grep" command output. Format to recognize for the ":grep" command output.
This is a scanf-like string that uses the same format as the This is a scanf-like string that uses the same format as the
'errorformat' option: see |errorformat|. 'errorformat' option: see |errorformat|.

View File

@@ -2822,6 +2822,8 @@ vim.go.gd = vim.go.gdefault
--- @type string --- @type string
vim.o.grepformat = "%f:%l:%m,%f:%l%m,%f %l%m" vim.o.grepformat = "%f:%l:%m,%f:%l%m,%f %l%m"
vim.o.gfm = vim.o.grepformat vim.o.gfm = vim.o.grepformat
vim.bo.grepformat = vim.o.grepformat
vim.bo.gfm = vim.bo.grepformat
vim.go.grepformat = vim.o.grepformat vim.go.grepformat = vim.o.grepformat
vim.go.gfm = vim.go.grepformat vim.go.gfm = vim.go.grepformat

View File

@@ -2098,6 +2098,7 @@ void free_buf_options(buf_T *buf, bool free_p_ff)
callback_free(&buf->b_ofu_cb); callback_free(&buf->b_ofu_cb);
clear_string_option(&buf->b_p_tsrfu); clear_string_option(&buf->b_p_tsrfu);
callback_free(&buf->b_tsrfu_cb); callback_free(&buf->b_tsrfu_cb);
clear_string_option(&buf->b_p_gefm);
clear_string_option(&buf->b_p_gp); clear_string_option(&buf->b_p_gp);
clear_string_option(&buf->b_p_mp); clear_string_option(&buf->b_p_mp);
clear_string_option(&buf->b_p_efm); clear_string_option(&buf->b_p_efm);

View File

@@ -606,6 +606,7 @@ struct file_buffer {
char *b_p_keymap; ///< 'keymap' char *b_p_keymap; ///< 'keymap'
// local values for options which are normally global // local values for options which are normally global
char *b_p_gefm; ///< 'grepformat' local value
char *b_p_gp; ///< 'grepprg' local value char *b_p_gp; ///< 'grepprg' local value
char *b_p_mp; ///< 'makeprg' local value char *b_p_mp; ///< 'makeprg' local value
char *b_p_efm; ///< 'errorformat' local value char *b_p_efm; ///< 'errorformat' local value

View File

@@ -4436,6 +4436,8 @@ void *get_varp_scope_from(vimoption_T *p, int opt_flags, buf_T *buf, win_T *win)
return &(buf->b_p_ffu); return &(buf->b_p_ffu);
case kOptErrorformat: case kOptErrorformat:
return &(buf->b_p_efm); return &(buf->b_p_efm);
case kOptGrepformat:
return &(buf->b_p_gefm);
case kOptGrepprg: case kOptGrepprg:
return &(buf->b_p_gp); return &(buf->b_p_gp);
case kOptMakeprg: case kOptMakeprg:
@@ -4563,6 +4565,8 @@ void *get_varp_from(vimoption_T *p, buf_T *buf, win_T *win)
return *buf->b_p_ffu != NUL ? &(buf->b_p_ffu) : p->var; return *buf->b_p_ffu != NUL ? &(buf->b_p_ffu) : p->var;
case kOptErrorformat: case kOptErrorformat:
return *buf->b_p_efm != NUL ? &(buf->b_p_efm) : p->var; return *buf->b_p_efm != NUL ? &(buf->b_p_efm) : p->var;
case kOptGrepformat:
return *buf->b_p_gefm != NUL ? &(buf->b_p_gefm) : p->var;
case kOptGrepprg: case kOptGrepprg:
return *buf->b_p_gp != NUL ? &(buf->b_p_gp) : p->var; return *buf->b_p_gp != NUL ? &(buf->b_p_gp) : p->var;
case kOptMakeprg: case kOptMakeprg:
@@ -5224,6 +5228,7 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_p_ul = NO_LOCAL_UNDOLEVEL; buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
buf->b_p_bkc = empty_string_option; buf->b_p_bkc = empty_string_option;
buf->b_bkc_flags = 0; buf->b_bkc_flags = 0;
buf->b_p_gefm = empty_string_option;
buf->b_p_gp = empty_string_option; buf->b_p_gp = empty_string_option;
buf->b_p_mp = empty_string_option; buf->b_p_mp = empty_string_option;
buf->b_p_efm = empty_string_option; buf->b_p_efm = empty_string_option;

View File

@@ -3694,7 +3694,7 @@ local options = {
]=], ]=],
full_name = 'grepformat', full_name = 'grepformat',
list = 'onecomma', list = 'onecomma',
scope = { 'global' }, scope = { 'global', 'buf' },
short_desc = N_("format of 'grepprg' output"), short_desc = N_("format of 'grepprg' output"),
type = 'string', type = 'string',
varname = 'p_gefm', varname = 'p_gefm',

View File

@@ -154,6 +154,7 @@ void check_buf_options(buf_T *buf)
check_string_option(&buf->b_p_cfu); check_string_option(&buf->b_p_cfu);
check_string_option(&buf->b_p_ofu); check_string_option(&buf->b_p_ofu);
check_string_option(&buf->b_p_keymap); check_string_option(&buf->b_p_keymap);
check_string_option(&buf->b_p_gefm);
check_string_option(&buf->b_p_gp); check_string_option(&buf->b_p_gp);
check_string_option(&buf->b_p_mp); check_string_option(&buf->b_p_mp);
check_string_option(&buf->b_p_efm); check_string_option(&buf->b_p_efm);

View File

@@ -4595,7 +4595,7 @@ void ex_make(exarg_T *eap)
incr_quickfix_busy(); incr_quickfix_busy();
char *errorformat = (eap->cmdidx != CMD_make && eap->cmdidx != CMD_lmake) char *errorformat = (eap->cmdidx != CMD_make && eap->cmdidx != CMD_lmake)
? p_gefm ? *curbuf->b_p_gefm != NUL ? curbuf->b_p_gefm : p_gefm
: p_efm; : p_efm;
bool newlist = eap->cmdidx != CMD_grepadd && eap->cmdidx != CMD_lgrepadd; bool newlist = eap->cmdidx != CMD_grepadd && eap->cmdidx != CMD_lgrepadd;

View File

@@ -2220,6 +2220,25 @@ func Test_grep()
call s:test_xgrep('l') call s:test_xgrep('l')
endfunc endfunc
func Test_local_grepformat()
let save_grepformat = &grepformat
set grepformat=%f:%l:%m
" The following line are used for the local grep test. Don't remove.
" UNIQUEPREFIX:2:3: Local grepformat test
new
setlocal grepformat=UNIQUEPREFIX:%c:%n:%m
call assert_equal('UNIQUEPREFIX:%c:%n:%m', &l:grepformat)
call assert_equal('%f:%l:%m', &g:grepformat)
set grepprg=internal
silent grep "^[[:space:]]*\" UNIQUEPREFIX:" test_quickfix.vim
call assert_equal(1, len(getqflist()))
set grepprg&vim
bwipe!
let &grepformat = save_grepformat
endfunc
func Test_two_windows() func Test_two_windows()
" Use one 'errorformat' for two windows. Add an expression to each of them, " Use one 'errorformat' for two windows. Add an expression to each of them,
" make sure they each keep their own state. " make sure they each keep their own state.