From: Bram Moolenaar Date: Mon, 16 Jan 2017 19:53:34 +0000 (+0100) Subject: patch 8.0.0195: fail to jump to static tag in current file X-Git-Tag: v8.0.0195 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a9d23c20879d0dcb289a4db54b3c7df060f87c3c;p=vim 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) --- diff --git a/src/tag.c b/src/tag.c index 94b5e2b68..a80a362df 100644 --- 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: <0x01><0x01> * other tag: <0x01><0x01> * without Emacs tags: <0x01> + * Here 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--; diff --git a/src/testdir/test_tagjump.vim b/src/testdir/test_tagjump.vim index 11ec144f6..221514db2 100644 --- 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", "", diff --git a/src/version.c b/src/version.c index cfb4e5969..28c677696 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 195, /**/ 194, /**/