diff --git a/runtime/lua/man.lua b/runtime/lua/man.lua index 1da8ed85fc..ba6b9d09c9 100644 --- a/runtime/lua/man.lua +++ b/runtime/lua/man.lua @@ -107,7 +107,9 @@ local function highlight_line(line, linenr) -- followed by '[', then a series of parameter and intermediate bytes in -- the range 0x20 - 0x3f, then 'm'. (See ECMA-48, sections 5.4 & 8.3.117) local sgr = prev_char:match("^%[([\032-\063]*)m$") - if sgr then + -- Ignore escape sequences with : characters, as specified by ITU's T.416 + -- Open Document Architecture and interchange format. + if sgr and not string.find(sgr, ":") then local match while sgr and #sgr > 0 do -- Match against SGR parameters, which may be separated by ';' diff --git a/test/functional/plugin/man_spec.lua b/test/functional/plugin/man_spec.lua index e5da7932a5..b25bd7e85a 100644 --- a/test/functional/plugin/man_spec.lua +++ b/test/functional/plugin/man_spec.lua @@ -1,23 +1,19 @@ local helpers = require('test.functional.helpers')(after_each) local plugin_helpers = require('test.functional.plugin.helpers') - local Screen = require('test.functional.ui.screen') - local command, eval, rawfeed = helpers.command, helpers.eval, helpers.rawfeed - -before_each(function() - plugin_helpers.reset() - helpers.clear() - command('syntax on') - command('set filetype=man') -end) +local clear = helpers.clear describe(':Man', function() describe('man.lua: highlight_line()', function() local screen before_each(function() - command('syntax off') -- Ignore syntax groups + plugin_helpers.reset() + clear() + command('syntax on') + command('set filetype=man') + command('syntax off') -- Ignore syntax groups screen = Screen.new(52, 5) screen:set_default_attr_ids({ b = { bold = true }, @@ -131,5 +127,22 @@ describe(':Man', function() | ]]) end) + + it('handles : characters in input', function() + rawfeed([[ + i[40m 0 [41m 1 [42m 2 [43m 3 + [44m 4 [45m 5 [46m 6 [47m 7 [100m 8 [101m 9 + [102m 10 [103m 11 [104m 12 [105m 13 [106m 14 [107m 15 + [48:5:16m 16 ]]) + eval('man#init_pager()') + + screen:expect([[ + ^ 0 1 2 3 | + 4 5 6 7 8 9 | + 10 11 12 13 14 15 | + 16 | + | + ]]) + end) end) end)