diff options
-rw-r--r-- | src/nvim/edit.c | 31 | ||||
-rw-r--r-- | src/nvim/normal.c | 8 | ||||
-rw-r--r-- | src/nvim/testdir/test_edit.vim | 40 | ||||
-rw-r--r-- | src/nvim/testdir/test_gf.vim | 27 |
4 files changed, 90 insertions, 16 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/normal.c b/src/nvim/normal.c index a7c4c255b7..6d3ffab030 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -5234,9 +5234,9 @@ static void nv_gotofile(cmdarg_T *cap) (void)autowrite(curbuf, false); } setpcmark(); - (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST, - buf_hide(curbuf) ? ECMD_HIDE : 0, curwin); - if (cap->nchar == 'F' && lnum >= 0) { + if (do_ecmd(0, ptr, NULL, NULL, ECMD_LAST, + buf_hide(curbuf) ? ECMD_HIDE : 0, curwin) == OK + && cap->nchar == 'F' && lnum >= 0) { curwin->w_cursor.lnum = lnum; check_cursor_lnum(); beginline(BL_SOL | BL_FIX); @@ -7151,7 +7151,7 @@ static void set_op_var(int optype) assert(opchar0 >= 0 && opchar0 <= UCHAR_MAX); opchars[0] = (char) opchar0; - int opchar1 = get_extra_op_char(optype); + int opchar1 = get_extra_op_char(optype); assert(opchar1 >= 0 && opchar1 <= UCHAR_MAX); opchars[1] = (char) opchar1; 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 diff --git a/src/nvim/testdir/test_gf.vim b/src/nvim/testdir/test_gf.vim index c4aa6f9218..ef1bf1075b 100644 --- a/src/nvim/testdir/test_gf.vim +++ b/src/nvim/testdir/test_gf.vim @@ -1,7 +1,7 @@ " This is a test if a URL is recognized by "gf", with the cursor before and " after the "://". Also test ":\\". -function! Test_gf_url() +func Test_gf_url() enew! call append(0, [ \ "first test for URL://machine.name/tmp/vimtest2a and other text", @@ -30,4 +30,27 @@ function! Test_gf_url() set isf&vim enew! -endfunction +endfunc + +func Test_gF() + new + call setline(1, ['111', '222', '333', '444']) + w! Xfile + close + new + set isfname-=: + call setline(1, ['one', 'Xfile:3', 'three']) + 2 + call assert_fails('normal gF', 'E37:') + call assert_equal(2, getcurpos()[1]) + w! Xfile2 + normal gF + call assert_equal('Xfile', bufname('%')) + call assert_equal(3, getcurpos()[1]) + + set isfname& + call delete('Xfile') + call delete('Xfile2') + bwipe Xfile + bwipe Xfile2 +endfunc |