Hi Bram, Ken and list!

2016-5-7(Sat) 6:23:37 UTC+9 Bram Moolenaar:
> Ken Takata wrote:
> 
> > 2016/5/6 Fri 2:14:57 UTC+9 Bram Moolenaar wrote:
> > > Ken Takata wrote:
> > > 
> > > > 2016/5/6 Fri 0:19:06 UTC+9 Bram Moolenaar wrote:
> > > > > Patch 7.4.1818
> > > > > Problem:    Help completion adds @en to all matches except the first 
> > > > > one.
> > > > > Solution:   Remove "break", go over all items.
> > > > > Files:      src/ex_getln.c
> > > > 
> > > > This patch has a problem when help files with multiple languages are 
> > > > installed.
> > > > E.g. When @ja and @en are installed and 'helplang' is set to ja,
> > > > 
> > > >   :h screenrow()<C-D>
> > > >   screenrow() screenrow()
> > > > 
> > > > But this should be:
> > > > 
> > > >   :h screenrow()<C-D>
> > > >   screenrow() screenrow()@en
> > > > 
> > > > Or, when 'helplang' is not ja, this should be:
> > > > 
> > > >   :h screenrow()<C-D>
> > > >   screenrow()@ja screenrow()@en
> > > > 
> > > > @en should not be removed, when there is a same help item for another
> > > > language.
> > > 
> > > I guess the problem is that it depends on the order, the check for a
> > > duplicate help tag in another language can happen after a language was
> > > already removed.
> > 
> > Do you have any ideas to fix this?
> > I don't have it, but the following behavior is totally useless:
> > 
> >   :h screenrow()<C-D>
> >   screenrow() screenrow()
> 
> From the top of my head: First do the part that loops over all matches,
> do the other removing later.

I wrote a patch with a test.
Please check an attached patch.

> 
> > > > BTW, I think that adding @en to all matches is harmless.
> > > 
> > > Although this would be harmless, the @en should not be added when it's
> > > not needed, the matches look different from the actual help tag.
> > 
> > Wasn't setting 'helplang' to en enough?
> 
> It's initialized depending on the environment.  It should not be needed
> for the user to set it.

--
Best regards,
Hirohito Higashi (a.k.a. h_east)

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 26fed59..9554dc7 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -4519,12 +4519,7 @@ cleanup_help_tags(int num_file, char_u **file)
 	len = (int)STRLEN(file[i]) - 3;
 	if (len <= 0)
 	    continue;
-	if (STRCMP(file[i] + len, buf) == 0)
-	{
-	    /* remove the default language */
-	    file[i][len] = NUL;
-	}
-	else if (STRCMP(file[i] + len, "@en") == 0)
+	if (STRCMP(file[i] + len, "@en") == 0)
 	{
 	    /* Sorting on priority means the same item in another language may
 	     * be anywhere.  Search all items for a match up to the "@en". */
@@ -4538,6 +4533,18 @@ cleanup_help_tags(int num_file, char_u **file)
 		file[i][len] = NUL;
 	}
     }
+
+    for (i = 0; i < num_file; ++i)
+    {
+	len = (int)STRLEN(file[i]) - 3;
+	if (len <= 0)
+	    continue;
+	if (STRCMP(file[i] + len, buf) == 0)
+	{
+	    /* remove the default language */
+	    file[i][len] = NUL;
+	}
+    }
 }
 #endif
 
diff --git a/src/testdir/test_help_tagjump.vim b/src/testdir/test_help_tagjump.vim
index f486583..c3249d8 100644
--- a/src/testdir/test_help_tagjump.vim
+++ b/src/testdir/test_help_tagjump.vim
@@ -26,3 +26,118 @@ func Test_help_tagjump()
   call assert_true(getline('.') =~ '\*arglistid()\*')
   helpclose
 endfunc
+
+let s:langs = ['en', 'ab', 'ja']
+
+func s:doc_config_setup()
+  let s:helpfile_save = &helpfile
+  let &helpfile="Xdir1/doc-en/doc/testdoc.txt"
+  let s:rtp_save = &rtp
+  let &rtp="Xdir1/doc-en"
+  if has('multi_lang')
+    let s:helplang_save=&helplang
+  endif
+
+  call delete('Xdir1', 'rf')
+
+  for lang in s:langs
+    if lang ==# 'en'
+      let tagfname = 'tags'
+      let docfname = 'testdoc.txt'
+    else
+      let tagfname = 'tags-' . lang
+      let docfname = 'testdoc.' . lang . 'x'
+    endif
+    let docdir = "Xdir1/doc-" . lang . "/doc"
+    call mkdir(docdir, "p")
+    call writefile(["\t*test-char*", "\t*test-col*"], docdir . '/' . docfname)
+    call writefile(["test-char\t" . docfname . "\t/*test-char*",
+          \         "test-col\t" . docfname . "\t/*test-col*"],
+          \         docdir . '/' . tagfname)
+  endfor
+endfunc
+
+func s:doc_config_teardown()
+  call delete('Xdir1', 'rf')
+
+  let &helpfile = s:helpfile_save
+  let &rtp = s:rtp_save
+  if has('multi_lang')
+    let &helplang = s:helplang_save
+  endif
+endfunc
+
+func s:get_cmd_compl_list(cmd)
+  let list = []
+  let str = ''
+  for cnt in range(1, 999)
+    call feedkeys(a:cmd . repeat("\<Tab>", cnt) . "'\<C-B>let str='\<CR>", 'tx')
+    if str ==# a:cmd[1:]
+      break
+    endif
+    call add(list, str)
+  endfor
+  return list
+endfunc
+
+func Test_help_complete()
+  try
+    let list = []
+    call s:doc_config_setup()
+
+    " 'helplang=' and help file lang is 'en'
+    if has('multi_lang')
+      set helplang=
+    endif
+    let list = s:get_cmd_compl_list(":h test")
+    call assert_equal(['h test-col', 'h test-char'], list)
+
+    if has('multi_lang')
+      " 'helplang=ab' and help file lang is 'en'
+      set helplang=ab
+      let list = s:get_cmd_compl_list(":h test")
+      call assert_equal(['h test-col', 'h test-char'], list)
+
+      " 'helplang=' and help file lang is 'en' and 'ab'
+      set rtp+=Xdir1/doc-ab
+      set helplang=
+      let list = s:get_cmd_compl_list(":h test")
+      call assert_equal(['h test-col@en', 'h test-col@ab',
+            \             'h test-char@en', 'h test-char@ab'], list)
+
+      " 'helplang=ab' and help file lang is 'en' and 'ab'
+      set helplang=ab
+      let list = s:get_cmd_compl_list(":h test")
+      call assert_equal(['h test-col', 'h test-col@en',
+            \             'h test-char', 'h test-char@en'], list)
+
+      " 'helplang=' and help file lang is 'en', 'ab' and 'ja'
+      set rtp+=Xdir1/doc-ja
+      set helplang=
+      let list = s:get_cmd_compl_list(":h test")
+      call assert_equal(['h test-col@en', 'h test-col@ab',
+            \             'h test-col@ja', 'h test-char@en',
+            \             'h test-char@ab', 'h test-char@ja'], list)
+
+      " 'helplang=ab' and help file lang is 'en', 'ab' and 'ja'
+      set helplang=ab
+      let list = s:get_cmd_compl_list(":h test")
+      call assert_equal(['h test-col', 'h test-col@en',
+            \             'h test-col@ja', 'h test-char',
+            \             'h test-char@en', 'h test-char@ja'], list)
+
+      " 'helplang=ab,ja' and help file lang is 'en', 'ab' and 'ja'
+      set helplang=ab,ja
+      let list = s:get_cmd_compl_list(":h test")
+      call assert_equal(['h test-col', 'h test-col@ja',
+            \             'h test-col@en', 'h test-char',
+            \             'h test-char@ja', 'h test-char@en'], list)
+    endif
+  catch
+    call assert_exception('X')
+  finally
+    call s:doc_config_teardown()
+  endtry
+endfunc
+
+" vim: et sw=2:

Raspunde prin e-mail lui