diff options
| -rw-r--r-- | runtime/autoload/msgpack.vim | 8 | ||||
| -rw-r--r-- | runtime/autoload/shada.vim | 13 | ||||
| -rw-r--r-- | runtime/doc/pi_msgpack.txt | 5 | ||||
| -rw-r--r-- | test/functional/plugin/msgpack_spec.lua | 2 | ||||
| -rw-r--r-- | test/functional/plugin/shada_spec.lua | 37 | 
5 files changed, 51 insertions, 14 deletions
| diff --git a/runtime/autoload/msgpack.vim b/runtime/autoload/msgpack.vim index 2e2697c57f..a10ac32469 100644 --- a/runtime/autoload/msgpack.vim +++ b/runtime/autoload/msgpack.vim @@ -665,11 +665,15 @@ function msgpack#eval(s, special_objs) abort        call add(expr, ']}')        let s = s[1:]      elseif s[0] is# '''' -      let char = matchstr(s, '\m\C^''\zs.\ze''') +      let char = matchstr(s, '\v\C^\''\zs%(\\\d+|.)\ze\''')        if empty(char)          throw 'char-invalid:Invalid integer character literal format: ' . s        endif -      call add(expr, char2nr(char)) +      if char[0] is# '\' +        call add(expr, +char[1:]) +      else +        call add(expr, char2nr(char)) +      endif        let s = s[len(char) + 2:]      else        throw 'unknown:Invalid non-space character: ' . s diff --git a/runtime/autoload/shada.vim b/runtime/autoload/shada.vim index 9be85b6f2e..cf27ee608a 100644 --- a/runtime/autoload/shada.vim +++ b/runtime/autoload/shada.vim @@ -241,8 +241,6 @@ function s:shada_check_type(type, val) abort      if msg isnot# 0        return msg      endif -    if a:val > 0 || a:val < 1 -    endif      return 0    elseif a:type is# 'binarray'      if type isnot# 'array' @@ -359,9 +357,14 @@ function s:shada_string(type, v) abort    if (has_key(s:SHADA_ENUMS, a:type) && type(a:v) == type(0)       \&& has_key(s:SHADA_REV_ENUMS[a:type], a:v))      return s:SHADA_REV_ENUMS[a:type][a:v] -  elseif (a:type is# 'intchar' && type(a:v) == type(0) -         \&& strtrans(nr2char(a:v)) is# nr2char(a:v)) -    return "'" . nr2char(a:v) . "'" +  " Restricting a:v to be <= 127 is not necessary, but intchar constants are +  " normally expected to be either ASCII printable characters or NUL. +  elseif a:type is# 'intchar' && type(a:v) == type(0) && a:v >= 0 && a:v <= 127 +    if a:v > 0 && strtrans(nr2char(a:v)) is# nr2char(a:v) +      return "'" . nr2char(a:v) . "'" +    else +      return "'\\" . a:v . "'" +    endif    else      return msgpack#string(a:v)    endif diff --git a/runtime/doc/pi_msgpack.txt b/runtime/doc/pi_msgpack.txt index 95d6ff7467..d695ac42cb 100644 --- a/runtime/doc/pi_msgpack.txt +++ b/runtime/doc/pi_msgpack.txt @@ -128,6 +128,11 @@ msgpack#eval({string}, {dict})				*msgpack#eval()*  	always evaluated to |msgpack-special-dict| values, as well as   	hexadecimal digits.  When evaluating maps order of keys is preserved. +	Note that in addition to regular integer representations that may be  +	obtained using |msgpack#string()| msgpack#eval() also supports C-style  +	“character” integer constants like `'/'` (equivalent to  +	`char2nr('/')`: `47`). This also allows `'\0'` (number is decimal). +  							*msgpack#equal*  msgpack#equal({msgpack-value}, {msgpack-value})		*msgpack#equal()*  	Returns 1 if given values are equal, 0 otherwise.  When comparing  diff --git a/test/functional/plugin/msgpack_spec.lua b/test/functional/plugin/msgpack_spec.lua index c8da8e8f6c..5ba19708cf 100644 --- a/test/functional/plugin/msgpack_spec.lua +++ b/test/functional/plugin/msgpack_spec.lua @@ -652,6 +652,8 @@ describe('In autoload/msgpack.vim', function()        eval_eq('integer', ('a'):byte(), '\'a\'')        eval_eq('integer', 0xAB, '\'«\'') +      eval_eq('integer', 0, '\'\\0\'') +      eval_eq('integer', 10246567, '\'\\10246567\'')      end)      it('correctly loads constants', function() diff --git a/test/functional/plugin/shada_spec.lua b/test/functional/plugin/shada_spec.lua index b1209a22e9..b543037ae2 100644 --- a/test/functional/plugin/shada_spec.lua +++ b/test/functional/plugin/shada_spec.lua @@ -609,6 +609,18 @@ describe('In autoload/shada.vim', function()          'abc',          -1,        ]}] ]]):gsub('\n', '')) +      -- Regression: NUL separator must be properly supported +      sd2strings_eq({ +        'History entry with timestamp ' .. epoch .. ':', +        '  @ Description_  Value', +        '  - history type  SEARCH', +        '  - contents      ""', +        '  - separator     \'\\0\'', +      }, ([[ [{'type': 4, 'timestamp': 0, 'data': [ +        1, +        '', +        0x0 +      ]}] ]]):gsub('\n', ''))      end)      it('works with register items', function() @@ -837,7 +849,7 @@ describe('In autoload/shada.vim', function()        sd2strings_eq({          'Global mark with timestamp ' .. epoch .. ':',          '  % Key  Description  Value', -        '  + n    name         20', +        '  + n    name         \'\\20\'',          '  + f    file name    "foo"',          '  # Value is negative',          '  + l    line number  -10', @@ -852,7 +864,18 @@ describe('In autoload/shada.vim', function()        sd2strings_eq({          'Global mark with timestamp ' .. epoch .. ':',          '  % Key  Description  Value', -        '  + n    name         20', +        '  + n    name         128', +        '  + f    file name    "foo"', +        '  + l    line number  1', +        '  + c    column       0', +      }, ([[ [{'type': 7, 'timestamp': 0, 'data': { +        'n': 128, +        'f': 'foo', +      }}] ]]):gsub('\n', '')) +      sd2strings_eq({ +        'Global mark with timestamp ' .. epoch .. ':', +        '  % Key  Description  Value', +        '  + n    name         \'\\20\'',          '  + f    file name    "foo"',          '  # Expected integer',          '  + l    line number  "FOO"', @@ -1123,7 +1146,7 @@ describe('In autoload/shada.vim', function()          'Local mark with timestamp ' .. epoch .. ':',          '  % Key  Description  Value',          '  + f    file name    "foo"', -        '  + n    name         20', +        '  + n    name         \'\\20\'',          '  # Value is negative',          '  + l    line number  -10',          '  # Value is negative', @@ -1138,7 +1161,7 @@ describe('In autoload/shada.vim', function()          'Local mark with timestamp ' .. epoch .. ':',          '  % Key  Description  Value',          '  + f    file name    "foo"', -        '  + n    name         20', +        '  + n    name         \'\\20\'',          '  # Expected integer',          '  + l    line number  "FOO"',          '  # Expected integer', @@ -1932,13 +1955,13 @@ describe('In autoload/shada.vim', function()          'Buffer list with timestamp ' .. epoch .. ':',          '  % Key  Description  Value',          '  # Expected binary string', -        '  + f    file name    10', +        '  + f    file name    \'\\10\'',          '  + l    line number  1',          '  + c    column       0',          '',          '  % Key  Description  Value',          '  # Expected binary string', -        '  + f    file name    20', +        '  + f    file name    \'\\20\'',          '  + l    line number  1',          '  + c    column       0',        }) @@ -1948,7 +1971,7 @@ describe('In autoload/shada.vim', function()          'Buffer list with timestamp ' .. epoch .. ':',          '  % Key  Description  Value',          '  # Expected binary string', -        '  + f    file name    10', +        '  + f    file name    \'\\10\'',          '  + l    line number  1',          '  + c    column       0',          '', | 
