diff options
| -rw-r--r-- | src/nvim/edit.c | 31 | ||||
| -rw-r--r-- | src/nvim/testdir/test_edit.vim | 40 | 
2 files changed, 61 insertions, 10 deletions
| diff --git a/src/nvim/edit.c b/src/nvim/edit.c index c20758cb0b..1f18fc36fd 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -4132,7 +4132,6 @@ ins_compl_next (  )  {    int num_matches = -1; -  int i;    int todo = count;    compl_T *found_compl = NULL;    int found_end = FALSE; @@ -4294,15 +4293,27 @@ ins_compl_next (     * Truncate the file name to avoid a wait for return.     */    if (compl_shown_match->cp_fname != NULL) { -    STRCPY(IObuff, "match in file "); -    i = (vim_strsize(compl_shown_match->cp_fname) + 16) - sc_col; -    if (i <= 0) -      i = 0; -    else -      STRCAT(IObuff, "<"); -    STRCAT(IObuff, compl_shown_match->cp_fname + i); -    msg(IObuff); -    redraw_cmdline = FALSE;         /* don't overwrite! */ +    char *lead = _("match in file"); +    int space = sc_col - vim_strsize((char_u *)lead) - 2; +    char_u  *s; +    char_u  *e; + +    if (space > 0) { +      // We need the tail that fits.  With double-byte encoding going +      // back from the end is very slow, thus go from the start and keep +      // the text that fits in "space" between "s" and "e". +      for (s = e = compl_shown_match->cp_fname; *e != NUL; MB_PTR_ADV(e)) { +        space -= ptr2cells(e); +        while (space < 0) { +          space += ptr2cells(s); +          MB_PTR_ADV(s); +        } +      } +      vim_snprintf((char *)IObuff, IOSIZE, "%s %s%s", lead, +                   s > compl_shown_match->cp_fname ? "<" : "", s); +      msg(IObuff); +      redraw_cmdline = false;     // don't overwrite! +    }    }    return num_matches; diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index 8f815478c2..d2474c06fe 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -1323,3 +1323,43 @@ func Test_edit_quit()    only  endfunc +func Test_edit_complete_very_long_name() +  if !has('unix') +    " Long directory names only work on Unix. +    return +  endif + +  let dirname = getcwd() . "/Xdir" +  let longdirname = dirname . repeat('/' . repeat('d', 255), 4) +  try +    call mkdir(longdirname, 'p') +  catch /E739:/ +    " Long directory name probably not supported. +    call delete(dirname, 'rf') +    return +  endtry + +  " Try to get the Vim window position before setting 'columns'. +  let winposx = getwinposx() +  let winposy = getwinposy() +  let save_columns = &columns +  " Need at least about 1100 columns to reproduce the problem. +  set columns=2000 +  call assert_equal(2000, &columns) +  set noswapfile + +  let longfilename = longdirname . '/' . repeat('a', 255) +  call writefile(['Totum', 'Table'], longfilename) +  new +  exe "next Xfile " . longfilename +  exe "normal iT\<C-N>" + +  bwipe! +  exe 'bwipe! ' . longfilename +  call delete(dirname, 'rf') +  let &columns = save_columns +  if winposx >= 0 && winposy >= 0 +    exe 'winpos ' . winposx . ' ' . winposy +  endif +  set swapfile& +endfunc | 
