# HG changeset patch # User Christian Brabandt # Date 1526229905 -7200 # Node ID bea665293ea0f7329062e61072dd1a4b277187cc # Parent 7f6bca9f4b784fa54a84fae7beb5115de32fa063 patch 8.0.1837: one character cmdline abbreviation not triggered after '<,'> commit https://github.com/vim/vim/commit/5e3423d192bfa502c6704f731fa2ec6821f9a2f0 Author: Bram Moolenaar Date: Sun May 13 18:36:27 2018 +0200 patch 8.0.1837: one character cmdline abbreviation not triggered after '<,'> Problem: One character cmdline abbreviation not triggered after '<,'>. Solution: Skip over the special range. (Christian Brabandt, closes https://github.com/vim/vim/issues/2320) diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -3572,10 +3572,25 @@ gotocmdline(int clr) static int ccheck_abbr(int c) { + int spos = 0; + if (p_paste || no_abbr) /* no abbreviations or in paste mode */ return FALSE; - return check_abbr(c, ccline.cmdbuff, ccline.cmdpos, 0); + /* Do not consider '<,'> be part of the mapping, skip leading whitespace. + * Actually accepts any mark. */ + while (VIM_ISWHITE(ccline.cmdbuff[spos]) && spos < ccline.cmdlen) + spos++; + if (ccline.cmdlen - spos > 5 + && ccline.cmdbuff[spos] == '\'' + && ccline.cmdbuff[spos + 2] == ',' + && ccline.cmdbuff[spos + 3] == '\'') + spos += 5; + else + /* check abbreviation from the beginning of the commandline */ + spos = 0; + + return check_abbr(c, ccline.cmdbuff, ccline.cmdpos, spos); } #if defined(FEAT_CMDL_COMPL) || defined(PROTO) diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim --- a/src/testdir/test_mapping.vim +++ b/src/testdir/test_mapping.vim @@ -214,3 +214,19 @@ func Test_abbreviation_CR() delfunc Eatchar bw! endfunc + +func Test_cabbr_visual_mode() + cabbr s su + call feedkeys(":s \\"\", 'itx') + call assert_equal('"su ', getreg(':')) + call feedkeys(":'<,'>s \\"\", 'itx') + let expected = '"'. "'<,'>su " + call assert_equal(expected, getreg(':')) + call feedkeys(": '<,'>s \\"\", 'itx') + let expected = '" '. "'<,'>su " + call assert_equal(expected, getreg(':')) + call feedkeys(":'a,'bs \\"\", 'itx') + let expected = '"'. "'a,'bsu " + call assert_equal(expected, getreg(':')) + cunabbr s +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1837, +/**/ 1836, /**/ 1835,