Mercurial > vim
changeset 10611:6bff81438f27 v8.0.0195
patch 8.0.0195: fail to jump to static tag in current file
commit https://github.com/vim/vim/commit/a9d23c20879d0dcb289a4db54b3c7df060f87c3c
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Jan 16 20:53:34 2017 +0100
patch 8.0.0195: fail to jump to static tag in current file
Problem: Jumping to a tag that is a static item in the current file fails.
(Kazunobu Kuriyama)
Solution: Make sure the first byte of the tag key is not NUL. (Suggested by
James McCoy, closes #1387)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 16 Jan 2017 21:00:04 +0100 |
parents | 02610b4928a2 |
children | 2b6c101eb50e |
files | src/tag.c src/testdir/test_tagjump.vim src/version.c |
diffstat | 3 files changed, 33 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/tag.c +++ b/src/tag.c @@ -44,10 +44,6 @@ typedef struct tag_pointers #define MT_GL_CUR 1 /* global match in current file */ #define MT_GL_OTH 2 /* global match in other file */ #define MT_ST_OTH 3 /* static match in other file */ -#define MT_IC_ST_CUR 4 /* icase static match in current file */ -#define MT_IC_GL_CUR 5 /* icase global match in current file */ -#define MT_IC_GL_OTH 6 /* icase global match in other file */ -#define MT_IC_ST_OTH 7 /* icase static match in other file */ #define MT_IC_OFF 4 /* add for icase match */ #define MT_RE_OFF 8 /* add for regexp match */ #define MT_MASK 7 /* mask for printing priority */ @@ -2317,7 +2313,7 @@ parse_line: if (tagp.command + 2 < temp_end) { len = (int)(temp_end - tagp.command - 2); - mfp = (char_u *)alloc((int)sizeof(char_u) + len + 1); + mfp = (char_u *)alloc(len + 2); if (mfp != NULL) vim_strncpy(mfp, tagp.command + 2, len); } @@ -2351,6 +2347,7 @@ parse_line: * Emacs tag: <mtt><tag_fname><0x01><ebuf><0x01><lbuf><NUL> * other tag: <mtt><tag_fname><0x01><0x01><lbuf><NUL> * without Emacs tags: <mtt><tag_fname><0x01><lbuf><NUL> + * Here <mtt> is the "mtt" value plus 1 to avoid NUL. */ len = (int)tag_fname_len + (int)STRLEN(lbuf) + 3; #ifdef FEAT_EMACS_TAGS @@ -2366,7 +2363,7 @@ parse_line: if (mfp != NULL) { p = mfp; - p[0] = mtt; + p[0] = mtt + 1; STRCPY(p + 1, tag_fname); #ifdef BACKSLASH_IN_FILENAME /* Ignore differences in slashes, avoid adding @@ -2548,10 +2545,16 @@ findtag_end: vim_free(mfp); else { - /* now change the TAG_SEP back to NUL */ - for (p = mfp; *p != NUL; ++p) - if (*p == TAG_SEP) - *p = NUL; + if (!name_only) + { + /* Change mtt back to zero-based. */ + *mfp = *mfp - 1; + + /* change the TAG_SEP back to NUL */ + for (p = mfp + 1; *p != NUL; ++p) + if (*p == TAG_SEP) + *p = NUL; + } matches[match_count++] = (char_u *)mfp; } todo--;
--- a/src/testdir/test_tagjump.vim +++ b/src/testdir/test_tagjump.vim @@ -23,6 +23,24 @@ func Test_cancel_ptjump() quit endfunc +func Test_static_tagjump() + set tags=Xtags + call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//", + \ "one\tXfile1\t/^one/;\"\tf\tfile:\tsignature:(void)", + \ "word\tXfile2\tcmd2"], + \ 'Xtags') + new Xfile1 + call setline(1, ['empty', 'one()', 'empty']) + write + tag one + call assert_equal(2, line('.')) + + set tags& + call delete('Xtags') + call delete('Xfile1') + bwipe! +endfunc + " Tests for [ CTRL-I and CTRL-W CTRL-I commands function Test_keyword_jump() call writefile(["#include Xinclude", "",