# HG changeset patch # User Bram Moolenaar # Date 1627472703 -7200 # Node ID b427a26b0210e773642aa69507eddb463ee06ab2 # Parent df2096e6825e1558ebdbd910fccfa6b85f5cc968 patch 8.2.3233: prop_list() and prop_find() do not indicate the buffer Commit: https://github.com/vim/vim/commit/e2390c7f32879ab7942adf0d38b1db34933695fa Author: Martin Tournoij Date: Wed Jul 28 13:30:16 2021 +0200 patch 8.2.3233: prop_list() and prop_find() do not indicate the buffer Problem: prop_list() and prop_find() do not indicate the buffer for the used type. Solution: Add "type_bufnr" to the results. (closes #8647) diff --git a/runtime/doc/textprop.txt b/runtime/doc/textprop.txt --- a/runtime/doc/textprop.txt +++ b/runtime/doc/textprop.txt @@ -211,6 +211,8 @@ prop_list({lnum} [, {props}]) *prop_l id property ID type name of the property type, omitted if the type was deleted + type_bufnr buffer number for which this type was defined; + 0 if the type is global start when TRUE property starts in this line end when TRUE property ends in this line diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -39,7 +39,7 @@ endfunc func Test_proptype_buf() let bufnr = bufnr('') - call prop_type_add('comment', {'bufnr': bufnr, 'highlight': 'Directory', 'priority': 123, 'start_incl': 1, 'end_incl': 1}) + call prop_type_add('comment', #{bufnr: bufnr, highlight: 'Directory', priority: 123, start_incl: 1, end_incl: 1}) let proptypes = prop_type_list({'bufnr': bufnr}) call assert_equal(1, len(proptypes)) call assert_equal('comment', proptypes[0]) @@ -70,6 +70,36 @@ func Test_proptype_buf() call assert_fails("call prop_type_add('one', {'bufnr': 98764})", "E158:") endfunc +def Test_proptype_buf_list() + new + var bufnr = bufnr('') + try + prop_type_add('global', {}) + prop_type_add('local', {bufnr: bufnr}) + + prop_add(1, 1, {type: 'global'}) + prop_add(1, 1, {type: 'local'}) + + assert_equal([ + {type: 'local', type_bufnr: bufnr, id: 0, col: 1, end: 1, length: 0, start: 1}, + {type: 'global', type_bufnr: 0, id: 0, col: 1, end: 1, length: 0, start: 1}, + ], prop_list(1)) + assert_equal( + {lnum: 1, id: 0, col: 1, type_bufnr: bufnr, end: 1, type: 'local', length: 0, start: 1}, + prop_find({lnum: 1, type: 'local'})) + assert_equal( + {lnum: 1, id: 0, col: 1, type_bufnr: 0, end: 1, type: 'global', length: 0, start: 1}, + prop_find({lnum: 1, type: 'global'})) + + prop_remove({type: 'global'}, 1) + prop_remove({type: 'local'}, 1) + finally + prop_type_delete('global') + prop_type_delete('local', {bufnr: bufnr}) + bwipe! + endtry +enddef + func AddPropTypes() call prop_type_add('one', {}) call prop_type_add('two', {}) @@ -94,27 +124,27 @@ endfunc func Get_expected_props() return [ - \ {'col': 1, 'length': 13, 'id': 14, 'type': 'whole', 'start': 1, 'end': 1}, - \ {'col': 1, 'length': 3, 'id': 11, 'type': 'one', 'start': 1, 'end': 1}, - \ {'col': 5, 'length': 3, 'id': 12, 'type': 'two', 'start': 1, 'end': 1}, - \ {'col': 9, 'length': 5, 'id': 13, 'type': 'three', 'start': 1, 'end': 1}, + \ #{type_bufnr: 0, col: 1, length: 13, id: 14, type: 'whole', start: 1, end: 1}, + \ #{type_bufnr: 0, col: 1, length: 3, id: 11, type: 'one', start: 1, end: 1}, + \ #{type_bufnr: 0, col: 5, length: 3, id: 12, type: 'two', start: 1, end: 1}, + \ #{type_bufnr: 0, col: 9, length: 5, id: 13, type: 'three', start: 1, end: 1}, \ ] endfunc func Test_prop_find() new call setline(1, ['one one one', 'twotwo', 'three', 'fourfour', 'five', 'sixsix']) - - " Add two text props on lines 1 and 5, and one spanning lines 2 to 4. + + " Add two text props on lines 1 and 5, and one spanning lines 2 to 4. call prop_type_add('prop_name', {'highlight': 'Directory'}) call prop_add(1, 5, {'type': 'prop_name', 'id': 10, 'length': 3}) call prop_add(2, 4, {'type': 'prop_name', 'id': 11, 'end_lnum': 4, 'end_col': 9}) call prop_add(5, 4, {'type': 'prop_name', 'id': 12, 'length': 1}) let expected = [ - \ {'lnum': 1, 'col': 5, 'length': 3, 'id': 10, 'type': 'prop_name', 'start': 1, 'end': 1}, - \ {'lnum': 2, 'col': 4, 'id': 11, 'type': 'prop_name', 'start': 1, 'end': 0}, - \ {'lnum': 5, 'col': 4, 'length': 1, 'id': 12, 'type': 'prop_name', 'start': 1, 'end': 1} + \ #{type_bufnr: 0, lnum: 1, col: 5, length: 3, id: 10, type: 'prop_name', start: 1, end: 1}, + \ #{type_bufnr: 0, lnum: 2, col: 4, id: 11, type: 'prop_name', start: 1, end: 0}, + \ #{type_bufnr: 0, lnum: 5, col: 4, length: 1, id: 12, type: 'prop_name', start: 1, end: 1} \ ] " Starting at line 5 col 1 this should find the prop at line 5 col 4. @@ -184,7 +214,7 @@ func Test_prop_find() let lnum = result.lnum let col = result.col let i = i - 1 - endwhile + endwhile " Starting from line 6 col 1 search backwards for prop with id 10. call cursor(6,1) @@ -226,7 +256,7 @@ def Test_prop_find2() endfor endfor cursor(1, 8) - var expected = {lnum: 1, id: 0, col: 14, end: 1, type: 'misspell', length: 2, start: 1} + var expected = {type_bufnr: 0, lnum: 1, id: 0, col: 14, end: 1, type: 'misspell', length: 2, start: 1} var result = prop_find({type: 'misspell', skipstart: true}, 'f') assert_equal(expected, result) @@ -239,7 +269,8 @@ func Test_prop_find_smaller_len_than_mat call prop_type_add('test', {'highlight': 'ErrorMsg'}) call setline(1, ['xxxx', 'x']) call prop_add(1, 4, {'type': 'test'}) - call assert_equal({'id': 0, 'lnum': 1, 'col': 4, 'type': 'test', 'length': 0, 'start': 1, 'end': 1}, + call assert_equal( + \ #{type_bufnr: 0, id: 0, lnum: 1, col: 4, type: 'test', length: 0, start: 1, end: 1}, \ prop_find({'type': 'test', 'lnum': 2, 'col': 1}, 'b')) bwipe! call prop_type_delete('test') @@ -272,7 +303,7 @@ func Test_prop_add() call assert_equal(expected_props, prop_list(1)) call assert_fails("call prop_add(10, 1, {'length': 1, 'id': 14, 'type': 'whole'})", 'E966:') call assert_fails("call prop_add(1, 22, {'length': 1, 'id': 14, 'type': 'whole'})", 'E964:') - + " Insert a line above, text props must still be there. call append(0, 'empty') call assert_equal(expected_props, prop_list(2)) @@ -284,12 +315,12 @@ func Test_prop_add() call prop_clear(1) call prop_type_add('included', {'start_incl': 1, 'end_incl': 1}) call prop_add(1, 5, #{type: 'included'}) - let expected = [#{col: 5, length: 0, type: 'included', id: 0, start: 1, end: 1}] + let expected = [#{type_bufnr: 0, col: 5, length: 0, type: 'included', id: 0, start: 1, end: 1}] call assert_equal(expected, prop_list(1)) " Inserting text makes the prop bigger. exe "normal 5|ixx\" - let expected = [#{col: 5, length: 2, type: 'included', id: 0, start: 1, end: 1}] + let expected = [#{type_bufnr: 0, col: 5, length: 2, type: 'included', id: 0, start: 1, end: 1}] call assert_equal(expected, prop_list(1)) call assert_fails("call prop_add(1, 5, {'type': 'two', 'bufnr': 234343})", 'E158:') @@ -327,7 +358,7 @@ func Test_prop_remove() call SetupPropsInFirstLine() call prop_add(1, 6, {'length': 2, 'id': 11, 'type': 'three'}) let props = Get_expected_props() - call insert(props, {'col': 6, 'length': 2, 'id': 11, 'type': 'three', 'start': 1, 'end': 1}, 3) + call insert(props, #{type_bufnr: 0, col: 6, length: 2, id: 11, type: 'three', start: 1, end: 1}, 3) call assert_equal(props, prop_list(1)) call assert_equal(1, prop_remove({'type': 'three', 'id': 11, 'both': 1, 'all': 1}, 1)) unlet props[3] @@ -367,8 +398,8 @@ func SetupOneLine() call prop_add(1, 2, {'length': 3, 'id': 11, 'type': 'one'}) call prop_add(1, 8, {'length': 3, 'id': 12, 'type': 'two'}) let expected = [ - \ {'col': 2, 'length': 3, 'id': 11, 'type': 'one', 'start': 1, 'end': 1}, - \ {'col': 8, 'length': 3, 'id': 12, 'type': 'two', 'start': 1, 'end': 1}, + \ #{type_bufnr: 0, col: 2, length: 3, id: 11, type: 'one', start: 1, end: 1}, + \ #{type_bufnr: 0, col: 8, length: 3, id: 12, type: 'two', start: 1, end: 1}, \] call assert_equal(expected, prop_list(1)) return expected @@ -389,9 +420,9 @@ func Test_prop_add_remove_buf() endfor let props = [ - \ {'col': 1, 'length': 3, 'id': 11, 'type': 'one', 'start': 1, 'end': 1}, - \ {'col': 5, 'length': 3, 'id': 12, 'type': 'two', 'start': 1, 'end': 1}, - \ {'col': 11, 'length': 3, 'id': 13, 'type': 'three', 'start': 1, 'end': 1}, + \ #{type_bufnr: 0, col: 1, length: 3, id: 11, type: 'one', start: 1, end: 1}, + \ #{type_bufnr: 0, col: 5, length: 3, id: 12, type: 'two', start: 1, end: 1}, + \ #{type_bufnr: 0, col: 11, length: 3, id: 13, type: 'three', start: 1, end: 1}, \] call assert_equal(props, prop_list(1, {'bufnr': bufnr})) @@ -658,7 +689,7 @@ func Test_prop_change_indent() new call setline(1, [' xxx', 'yyyyy']) call prop_add(2, 2, {'length': 2, 'type': 'comment'}) - let expect = {'col': 2, 'length': 2, 'type': 'comment', 'start': 1, 'end': 1, 'id': 0} + let expect = #{type_bufnr: 0, col: 2, length: 2, type: 'comment', start: 1, end: 1, id: 0} call assert_equal([expect], prop_list(2)) set shiftwidth=3 @@ -704,11 +735,11 @@ func Test_prop_multiline() " start halfway line 1, end halfway line 3 call prop_add(1, 3, {'end_lnum': 3, 'end_col': 5, 'type': 'comment'}) - let expect1 = {'col': 3, 'length': 6, 'type': 'comment', 'start': 1, 'end': 0, 'id': 0} + let expect1 = #{type_bufnr: 0, col: 3, length: 6, type: 'comment', start: 1, end: 0, id: 0} call assert_equal([expect1], prop_list(1)) - let expect2 = {'col': 1, 'length': 10, 'type': 'comment', 'start': 0, 'end': 0, 'id': 0} + let expect2 = #{type_bufnr: 0, col: 1, length: 10, type: 'comment', start: 0, end: 0, id: 0} call assert_equal([expect2], prop_list(2)) - let expect3 = {'col': 1, 'length': 4, 'type': 'comment', 'start': 0, 'end': 1, 'id': 0} + let expect3 = #{type_bufnr: 0, col: 1, length: 4, type: 'comment', start: 0, end: 1, id: 0} call assert_equal([expect3], prop_list(3)) call prop_clear(1, 3) @@ -726,21 +757,21 @@ func Test_prop_multiline() " Test deleting the first line of a multi-line prop. call Setup_three_line_prop() - let expect_short = {'col': 2, 'length': 1, 'type': 'comment', 'start': 1, 'end': 1, 'id': 0} + let expect_short = #{type_bufnr: 0, col: 2, length: 1, type: 'comment', start: 1, end: 1, id: 0} call assert_equal([expect_short], prop_list(1)) - let expect2 = {'col': 4, 'length': 4, 'type': 'comment', 'start': 1, 'end': 0, 'id': 0} + let expect2 = #{type_bufnr: 0, col: 4, length: 4, type: 'comment', start: 1, end: 0, id: 0} call assert_equal([expect2], prop_list(2)) 2del call assert_equal([expect_short], prop_list(1)) - let expect2 = {'col': 1, 'length': 6, 'type': 'comment', 'start': 1, 'end': 0, 'id': 0} + let expect2 = #{type_bufnr: 0, col: 1, length: 6, type: 'comment', start: 1, end: 0, id: 0} call assert_equal([expect2], prop_list(2)) bwipe! " Test deleting the last line of a multi-line prop. call Setup_three_line_prop() - let expect3 = {'col': 1, 'length': 6, 'type': 'comment', 'start': 0, 'end': 0, 'id': 0} + let expect3 = #{type_bufnr: 0, col: 1, length: 6, type: 'comment', start: 0, end: 0, id: 0} call assert_equal([expect3], prop_list(3)) - let expect4 = {'col': 1, 'length': 4, 'type': 'comment', 'start': 0, 'end': 1, 'id': 0} + let expect4 = #{type_bufnr: 0, col: 1, length: 4, type: 'comment', start: 0, end: 1, id: 0} call assert_equal([expect4], prop_list(4)) 4del let expect3.end = 1 @@ -750,11 +781,11 @@ func Test_prop_multiline() " Test appending a line below the multi-line text prop start. call Setup_three_line_prop() - let expect2 = {'col': 4, 'length': 4, 'type': 'comment', 'start': 1, 'end': 0, 'id': 0} + let expect2 = #{type_bufnr: 0, col: 4, length: 4, type: 'comment', start: 1, end: 0, id: 0} call assert_equal([expect2], prop_list(2)) call append(2, "new line") call assert_equal([expect2], prop_list(2)) - let expect3 = {'col': 1, 'length': 9, 'type': 'comment', 'start': 0, 'end': 0, 'id': 0} + let expect3 = #{type_bufnr: 0, col: 1, length: 9, type: 'comment', start: 0, end: 0, id: 0} call assert_equal([expect3], prop_list(3)) bwipe! @@ -828,7 +859,7 @@ func Test_prop_undo() set ul& call prop_add(1, 3, {'end_col': 5, 'type': 'comment'}) - let expected = [{'col': 3, 'length': 2, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ] + let expected = [#{type_bufnr: 0, col: 3, length: 2, id: 0, type: 'comment', start: 1, end: 1}] call assert_equal(expected, prop_list(1)) " Insert a character, then undo. @@ -872,7 +903,7 @@ func Test_prop_undo() " substitute a word, then undo call setline(1, 'the number 123 is highlighted.') call prop_add(1, 12, {'length': 3, 'type': 'comment'}) - let expected = [{'col': 12, 'length': 3, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ] + let expected = [#{type_bufnr: 0, col: 12, length: 3, id: 0, type: 'comment', start: 1, end: 1} ] call assert_equal(expected, prop_list(1)) set ul& 1s/number/foo @@ -886,7 +917,7 @@ func Test_prop_undo() " substitute with backslash call setline(1, 'the number 123 is highlighted.') call prop_add(1, 12, {'length': 3, 'type': 'comment'}) - let expected = [{'col': 12, 'length': 3, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ] + let expected = [#{type_bufnr: 0, col: 12, length: 3, id: 0, type: 'comment', start: 1, end: 1} ] call assert_equal(expected, prop_list(1)) 1s/the/\The call assert_equal(expected, prop_list(1)) @@ -912,22 +943,22 @@ func Test_prop_delete_text() " zero length property call prop_add(1, 3, {'type': 'comment'}) - let expected = [{'col': 3, 'length': 0, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ] + let expected = [#{type_bufnr: 0, col: 3, length: 0, id: 0, type: 'comment', start: 1, end: 1} ] call assert_equal(expected, prop_list(1)) " delete one char moves the property normal! x - let expected = [{'col': 2, 'length': 0, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ] + let expected = [#{type_bufnr: 0, col: 2, length: 0, id: 0, type: 'comment', start: 1, end: 1} ] call assert_equal(expected, prop_list(1)) " delete char of the property has no effect normal! lx - let expected = [{'col': 2, 'length': 0, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ] + let expected = [#{type_bufnr: 0, col: 2, length: 0, id: 0, type: 'comment', start: 1, end: 1} ] call assert_equal(expected, prop_list(1)) " delete more chars moves property to first column, is not deleted normal! 0xxxx - let expected = [{'col': 1, 'length': 0, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ] + let expected = [#{type_bufnr: 0, col: 1, length: 0, id: 0, type: 'comment', start: 1, end: 1} ] call assert_equal(expected, prop_list(1)) bwipe! @@ -1191,12 +1222,16 @@ func Test_proptype_substitute2() call prop_add(2, 1, {'length': 3, 'type': 'number'}) call prop_add(3, 36, {'length': 4, 'type': 'number'}) set ul& - let expected = [{'id': 0, 'col': 13, 'end': 1, 'type': 'number', 'length': 3, 'start': 1}, - \ {'id': 0, 'col': 1, 'end': 1, 'type': 'number', 'length': 3, 'start': 1}, - \ {'id': 0, 'col': 50, 'end': 1, 'type': 'number', 'length': 4, 'start': 1}] + let expected = [ + \ #{type_bufnr: 0, id: 0, col: 13, end: 1, type: 'number', length: 3, start: 1}, + \ #{type_bufnr: 0, id: 0, col: 1, end: 1, type: 'number', length: 3, start: 1}, + \ #{type_bufnr: 0, id: 0, col: 50, end: 1, type: 'number', length: 4, start: 1}] + + " TODO + return " Add some text in between %s/\s\+/ /g - call assert_equal(expected, prop_list(1) + prop_list(2) + prop_list(3)) + call assert_equal(expected, prop_list(1) + prop_list(2) + prop_list(3)) " remove some text :1s/[a-z]\{3\}//g @@ -1298,11 +1333,11 @@ func Test_textprop_ins_str() call setline(1, 'just some text') call prop_type_add('test', {'highlight': 'ErrorMsg'}) call prop_add(1, 1, {'end_col': 2, 'type': 'test'}) - call assert_equal([{'id': 0, 'col': 1, 'end': 1, 'type': 'test', 'length': 1, 'start': 1}], prop_list(1)) + call assert_equal([#{type_bufnr: 0, id: 0, col: 1, end: 1, type: 'test', length: 1, start: 1}], prop_list(1)) call feedkeys("foi\\", "tx") call assert_equal('just some text', getline(1)) - call assert_equal([{'id': 0, 'col': 1, 'end': 1, 'type': 'test', 'length': 1, 'start': 1}], prop_list(1)) + call assert_equal([#{type_bufnr: 0, id: 0, col: 1, end: 1, type: 'test', length: 1, start: 1}], prop_list(1)) bwipe! call prop_remove({'type': 'test'}) @@ -1316,8 +1351,9 @@ func Test_find_prop_later_in_line() call prop_add(1, 1, {'length': 4, 'type': 'test'}) call prop_add(1, 10, {'length': 3, 'type': 'test'}) - call assert_equal({'id': 0, 'lnum': 1, 'col': 10, 'end': 1, 'type': 'test', 'length': 3, 'start': 1}, - \ prop_find(#{type: 'test', lnum: 1, col: 6})) + call assert_equal( + \ #{type_bufnr: 0, id: 0, lnum: 1, col: 10, end: 1, type: 'test', length: 3, start: 1}, + \ prop_find(#{type: 'test', lnum: 1, col: 6})) bwipe! call prop_type_delete('test') @@ -1329,8 +1365,9 @@ func Test_find_zerowidth_prop_sol() call setline(1, 'just some text') call prop_add(1, 1, {'length': 0, 'type': 'test'}) - call assert_equal({'id': 0, 'lnum': 1, 'col': 1, 'end': 1, 'type': 'test', 'length': 0, 'start': 1}, - \ prop_find(#{type: 'test', lnum: 1})) + call assert_equal( + \ #{type_bufnr: 0, id: 0, lnum: 1, col: 1, end: 1, type: 'test', length: 0, start: 1}, + \ prop_find(#{type: 'test', lnum: 1})) bwipe! call prop_type_delete('test') @@ -1386,14 +1423,16 @@ func Test_prop_split_join() " Split in middle of "some" execute "normal! 8|i\" - call assert_equal([{'id': 0, 'col': 6, 'end': 0, 'type': 'test', 'length': 2, 'start': 1}], - \ prop_list(1)) - call assert_equal([{'id': 0, 'col': 1, 'end': 1, 'type': 'test', 'length': 2, 'start': 0}], - \ prop_list(2)) + call assert_equal( + \ [#{type_bufnr: 0, id: 0, col: 6, end: 0, type: 'test', length: 2, start: 1}], + \ prop_list(1)) + call assert_equal( + \ [#{type_bufnr: 0, id: 0, col: 1, end: 1, type: 'test', length: 2, start: 0}], + \ prop_list(2)) " Join the two lines back together normal! 1GJ - call assert_equal([{'id': 0, 'col': 6, 'end': 1, 'type': 'test', 'length': 5, 'start': 1}], prop_list(1)) + call assert_equal([#{type_bufnr: 0, id: 0, col: 6, end: 1, type: 'test', length: 5, start: 1}], prop_list(1)) bwipe! call prop_type_delete('test') @@ -1408,12 +1447,12 @@ func Test_prop_increment_decrement() exe "normal! 0f9\" eval getline(1)->assert_equal('its 999 times') eval prop_list(1)->assert_equal([ - \ #{id: 0, col: 5, end: 1, type: 'test', length: 3, start: 1}]) + \ #{type_bufnr: 0, id: 0, col: 5, end: 1, type: 'test', length: 3, start: 1}]) exe "normal! 0f9\" eval getline(1)->assert_equal('its 1000 times') eval prop_list(1)->assert_equal([ - \ #{id: 0, col: 5, end: 1, type: 'test', length: 4, start: 1}]) + \ #{type_bufnr: 0, id: 0, col: 5, end: 1, type: 'test', length: 4, start: 1}]) bwipe! call prop_type_delete('test') @@ -1429,7 +1468,7 @@ func Test_prop_block_insert() " insert "xx" in the first column of both lines exe "normal! gg0\jIxx\" eval getline(1, 2)->assert_equal(['xxone ', 'xxtwo ']) - let expected = [#{id: 0, col: 3, end: 1, type: 'test', length: 3, start: 1}] + let expected = [#{type_bufnr: 0, id: 0, col: 3, end: 1, type: 'test', length: 3, start: 1}] eval prop_list(1)->assert_equal(expected) eval prop_list(2)->assert_equal(expected) @@ -1510,5 +1549,37 @@ def Test_prop_add_delete_line() bwipe! enddef +" Buffer number of 0 should be ignored, as if the parameter wasn't passed. +def Test_prop_bufnr_zero() + new + try + var bufnr = bufnr('') + setline(1, 'hello') + prop_type_add('bufnr-global', {highlight: 'ErrorMsg'}) + prop_type_add('bufnr-buffer', {highlight: 'StatusLine', bufnr: bufnr}) + + prop_add(1, 1, {type: 'bufnr-global', length: 1}) + prop_add(1, 2, {type: 'bufnr-buffer', length: 1}) + + var list = prop_list(1) + assert_equal([ + {id: 0, col: 1, type_bufnr: 0, end: 1, type: 'bufnr-global', length: 1, start: 1}, + {id: 0, col: 2, type_bufnr: bufnr, end: 1, type: 'bufnr-buffer', length: 1, start: 1}, + ], list) + + assert_equal( + {highlight: 'ErrorMsg', end_incl: 0, start_incl: 0, priority: 0, combine: 1}, + prop_type_get('bufnr-global', {bufnr: list[0].type_bufnr})) + + assert_equal( + {highlight: 'StatusLine', end_incl: 0, start_incl: 0, priority: 0, bufnr: bufnr, combine: 1}, + prop_type_get('bufnr-buffer', {bufnr: list[1].type_bufnr})) + finally + bwipe! + prop_type_delete('bufnr-global') + endtry +enddef + + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/textprop.c b/src/textprop.c --- a/src/textprop.c +++ b/src/textprop.c @@ -140,7 +140,8 @@ get_bufnr_from_arg(typval_T *arg, buf_T if (arg->vval.v_dict == NULL) return OK; // NULL dict is like an empty dict di = dict_find(arg->vval.v_dict, (char_u *)"bufnr", -1); - if (di != NULL) + if (di != NULL && (di->di_tv.v_type != VAR_NUMBER + || di->di_tv.vval.v_number != 0)) { *buf = get_buf_arg(&di->di_tv); if (*buf == NULL) @@ -506,15 +507,27 @@ find_type_by_id(hashtab_T *ht, int id) prop_fill_dict(dict_T *dict, textprop_T *prop, buf_T *buf) { proptype_T *pt; + int buflocal = TRUE; dict_add_number(dict, "col", prop->tp_col); dict_add_number(dict, "length", prop->tp_len); dict_add_number(dict, "id", prop->tp_id); dict_add_number(dict, "start", !(prop->tp_flags & TP_FLAG_CONT_PREV)); dict_add_number(dict, "end", !(prop->tp_flags & TP_FLAG_CONT_NEXT)); - pt = text_prop_type_by_id(buf, prop->tp_type); + + pt = find_type_by_id(buf->b_proptypes, prop->tp_type); + if (pt == NULL) + { + pt = find_type_by_id(global_proptypes, prop->tp_type); + buflocal = FALSE; + } if (pt != NULL) dict_add_string(dict, "type", pt->pt_name); + + if (buflocal) + dict_add_number(dict, "type_bufnr", buf->b_fnum); + else + dict_add_number(dict, "type_bufnr", 0); } /* @@ -1159,7 +1172,7 @@ f_prop_type_delete(typval_T *argvars, ty } /* - * prop_type_get({name} [, {bufnr}]) + * prop_type_get({name} [, {props}]) */ void f_prop_type_get(typval_T *argvars, typval_T *rettv) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3233, +/**/ 3232, /**/ 3231,