diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-01-16 20:53:34 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-01-16 20:53:34 +0100 |
commit | a9d23c20879d0dcb289a4db54b3c7df060f87c3c (patch) | |
tree | 789ed779f83e0fc11e8f3ab8fc1835b6dfda752a | |
parent | e32bbded641a5da0263ecf82f9ccc95a8e0a089e (diff) | |
download | vim-git-a9d23c20879d0dcb289a4db54b3c7df060f87c3c.tar.gz |
patch 8.0.0195: fail to jump to static tag in current filev8.0.0195
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)
-rw-r--r-- | src/tag.c | 23 | ||||
-rw-r--r-- | src/testdir/test_tagjump.vim | 18 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 33 insertions, 10 deletions
@@ -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--; 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 @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 195, +/**/ 194, /**/ 193, |