diff --git a/runtime/plugin/matchparen.vim b/runtime/plugin/matchparen.vim index 661a34b578..2fa30b12ec 100644 --- a/runtime/plugin/matchparen.vim +++ b/runtime/plugin/matchparen.vim @@ -1,6 +1,6 @@ " Vim plugin for showing matching parens " Maintainer: The Vim Project -" Last Change: 2024 May 18 +" Last Change: 2025 Mar 08 " Former Maintainer: Bram Moolenaar " Exit quickly when: @@ -110,6 +110,17 @@ func s:Highlight_Matching_Pair() if !has("syntax") || !exists("g:syntax_on") let s_skip = "0" else + " do not attempt to match when the syntax item where the cursor is + " indicates there does not exist a matching parenthesis, e.g. for shells + " case statement: "case $var in foobar)" + " + " add the check behind a filetype check, so it only needs to be + " evaluated for certain filetypes + if ['sh']->index(&filetype) >= 0 && + \ synstack(".", col("."))->indexof({_, id -> synIDattr(id, "name") + \ =~? "shSnglCase"}) >= 0 + return + endif " Build an expression that detects whether the current cursor position is " in certain syntax types (string, comment, etc.), for use as " searchpairpos()'s skip argument. diff --git a/src/testdir/dumps/Test_matchparen_sh_case_1.dump b/src/testdir/dumps/Test_matchparen_sh_case_1.dump new file mode 100644 index 0000000000..7e7a2a3f45 --- /dev/null +++ b/src/testdir/dumps/Test_matchparen_sh_case_1.dump @@ -0,0 +1,10 @@ +|#+0#0000e05#ffffff0|!|/|b|i|n|/|s|h| +0#0000000&@65 +|S+0#00e0e07&|U|S|U|W|U|_|P|R|I|N|T|(|)| |(| +0#0000000&@58 +@2|c+0#af5f00255&|a|s|e| +0#0000000&|"+0#af5f00255&|$+0#e000e06&|{|L|E|V|E|L|}|"+0#af5f00255&| +0#0000000&|i+0#af5f00255&|n| +0#0000000&@54 +@4|"+0#af5f00255&|$+0#e000e06&|S|U|S|U|W|U|_|S|H|_|N|O|T|I|C|E|"+0#af5f00255&>)| +0#0000000&@50 +@4|$+0#e000e06&|{|S|U|S|U|W|U|_|S|}| +0#0000000&|&+0#af5f00255&@1| +0#0000000&|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|1+0#e000002&| +0#0000000&@47 +@2|;+0#af5f00255&@1| +0#0000000&@70 +@4|"+0#af5f00255&|$+0#e000e06&|S|U|S|U|W|U|_|S|H|_|D|E|B|U|G|"+0#af5f00255&|)| +0#0000000&@51 +@4|(+0#e000e06&|!+0#af5f00255&| +0#0000000&|$+0#e000e06&|{|S|U|S|U|W|U|_|V|E|R|B|O|S|E|}|)| +0#0000000&|&+0#af5f00255&@1| +0#0000000&|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|1+0#e000002&| +0#0000000&@37 +@2|;+0#af5f00255&@1| +0#0000000&@70 +@57|4|,|2|4| @9|T|o|p| diff --git a/src/testdir/test_plugin_matchparen.vim b/src/testdir/test_plugin_matchparen.vim index 49d35108a9..23491abf49 100644 --- a/src/testdir/test_plugin_matchparen.vim +++ b/src/testdir/test_plugin_matchparen.vim @@ -139,4 +139,36 @@ func Test_matchparen_mbyte() call StopVimInTerminal(buf) endfunc +" Test for ignoring certain parenthesis +func Test_matchparen_ignore_sh_case() + CheckScreendump + + let lines =<< trim END + source $VIMRUNTIME/plugin/matchparen.vim + set ft=sh + call setline(1, [ + \ '#!/bin/sh', + \ 'SUSUWU_PRINT() (', + \ ' case "${LEVEL}" in', + \ ' "$SUSUWU_SH_NOTICE")', + \ ' ${SUSUWU_S} && return 1', + \ ' ;;', + \ ' "$SUSUWU_SH_DEBUG")', + \ ' (! ${SUSUWU_VERBOSE}) && return 1', + \ ' ;;', + \ ' esac', + \ ' # snip', + \ ')' + \ ]) + call cursor(4, 26) + END + + let filename = 'Xmatchparen_sh' + call writefile(lines, filename, 'D') + + let buf = RunVimInTerminal('-S '.filename, #{rows: 10}) + call VerifyScreenDump(buf, 'Test_matchparen_sh_case_1', {}) + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 5536a9b48a..7851f79728 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1187, /**/ 1186, /**/