diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-06-02 19:53:44 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-06-02 19:53:44 +0200 |
commit | 1762731f2039d78fc8ddd785c3d3b52e5968c0f1 (patch) | |
tree | 53ecc305a1703909d91fa5adab3ab7623308d16e | |
parent | 6116b6abb1a14b6b7aa9776c390f1a5a6bf1b209 (diff) | |
download | vim-git-1762731f2039d78fc8ddd785c3d3b52e5968c0f1.tar.gz |
patch 8.1.1455: popup_atcursor() not completely implementedv8.1.1455
Problem: Popup_atcursor() not completely implemented.
Solution: Add the default for the "moved" property.
-rw-r--r-- | src/normal.c | 15 | ||||
-rw-r--r-- | src/popupwin.c | 89 | ||||
-rw-r--r-- | src/testdir/test_popupwin.vim | 3 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 9 |
5 files changed, 73 insertions, 45 deletions
diff --git a/src/normal.c b/src/normal.c index 1ff92973f..834a6436d 100644 --- a/src/normal.c +++ b/src/normal.c @@ -3461,13 +3461,14 @@ find_ident_at_pos( if (ptr[col] == NUL || (i == 0 && (has_mbyte ? this_class != 2 : !vim_iswordc(ptr[col])))) { - /* - * didn't find an identifier or string - */ - if (find_type & FIND_STRING) - emsg(_("E348: No string under cursor")); - else - emsg(_(e_noident)); + // didn't find an identifier or string + if ((find_type & FIND_NOERROR) == 0) + { + if (find_type & FIND_STRING) + emsg(_("E348: No string under cursor")); + else + emsg(_(e_noident)); + } return 0; } ptr += col; diff --git a/src/popupwin.c b/src/popupwin.c index 2d61ab8bf..973358c55 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -138,12 +138,39 @@ get_padding_border(dict_T *dict, int *array, char *name, int max_val) } /* + * Used when popup options contain "moved": set default moved values. + */ + static void +set_moved_values(win_T *wp) +{ + wp->w_popup_curwin = curwin; + wp->w_popup_lnum = curwin->w_cursor.lnum; + wp->w_popup_mincol = curwin->w_cursor.col; + wp->w_popup_maxcol = curwin->w_cursor.col; +} + +/* + * Used when popup options contain "moved" with "word" or "WORD". + */ + static void +set_moved_columns(win_T *wp, int flags) +{ + char_u *ptr; + int len = find_ident_under_cursor(&ptr, flags | FIND_NOERROR); + + if (len > 0) + { + wp->w_popup_mincol = (int)(ptr - ml_get_curline()); + wp->w_popup_maxcol = wp->w_popup_mincol + len - 1; + } +} + +/* * Go through the options in "dict" and apply them to buffer "buf" displayed in * popup window "wp". - * When called from f_popup_atcursor() "atcursor" is TRUE. */ static void -apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict, int atcursor) +apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict) { int nr; char_u *str; @@ -155,19 +182,6 @@ apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict, int atcursor) wp->w_maxwidth = dict_get_number(dict, (char_u *)"maxwidth"); wp->w_maxheight = dict_get_number(dict, (char_u *)"maxheight"); - if (atcursor) - { - wp->w_popup_pos = POPPOS_BOTLEFT; - setcursor_mayforce(TRUE); - wp->w_wantline = screen_screenrow(); - if (wp->w_wantline == 0) // cursor in first line - { - wp->w_wantline = 2; - wp->w_popup_pos = POPPOS_TOPLEFT; - } - wp->w_wantcol = screen_screencol() + 1; - } - get_pos_options(wp, dict); wp->w_zindex = dict_get_number(dict, (char_u *)"zindex"); @@ -289,10 +303,7 @@ apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict, int atcursor) di = dict_find(dict, (char_u *)"moved", -1); if (di != NULL) { - wp->w_popup_curwin = curwin; - wp->w_popup_lnum = curwin->w_cursor.lnum; - wp->w_popup_mincol = curwin->w_cursor.col; - wp->w_popup_maxcol = curwin->w_cursor.col; + set_moved_values(wp); if (di->di_tv.v_type == VAR_STRING && di->di_tv.vval.v_string != NULL) { char_u *s = di->di_tv.vval.v_string; @@ -305,16 +316,7 @@ apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict, int atcursor) else if (STRCMP(s, "any") != 0) semsg(_(e_invarg2), s); if (flags != 0) - { - char_u *ptr; - int len = find_ident_under_cursor(&ptr, flags); - - if (len > 0) - { - wp->w_popup_mincol = (int)(ptr - ml_get_curline()); - wp->w_popup_maxcol = wp->w_popup_mincol + len - 1; - } - } + set_moved_columns(wp, flags); } else if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL @@ -554,13 +556,19 @@ popup_adjust_position(win_T *wp) wp->w_popup_last_changedtick = CHANGEDTICK(wp->w_buffer); } +typedef enum +{ + TYPE_NORMAL, + TYPE_ATCURSOR +} create_type_T; + /* * popup_create({text}, {options}) * popup_atcursor({text}, {options}) * When called from f_popup_atcursor() "atcursor" is TRUE. */ static void -popup_create(typval_T *argvars, typval_T *rettv, int atcursor) +popup_create(typval_T *argvars, typval_T *rettv, create_type_T type) { win_T *wp; buf_T *buf; @@ -652,8 +660,23 @@ popup_create(typval_T *argvars, typval_T *rettv, int atcursor) ml_delete(buf->b_ml.ml_line_count, FALSE); curbuf = curwin->w_buffer; + if (type == TYPE_ATCURSOR) + { + wp->w_popup_pos = POPPOS_BOTLEFT; + setcursor_mayforce(TRUE); + wp->w_wantline = screen_screenrow(); + if (wp->w_wantline == 0) // cursor in first line + { + wp->w_wantline = 2; + wp->w_popup_pos = POPPOS_TOPLEFT; + } + wp->w_wantcol = screen_screencol() + 1; + set_moved_values(wp); + set_moved_columns(wp, FIND_STRING); + } + // Deal with options. - apply_options(wp, buf, argvars[1].vval.v_dict, atcursor); + apply_options(wp, buf, argvars[1].vval.v_dict); // set default values if (wp->w_zindex == 0) @@ -672,7 +695,7 @@ popup_create(typval_T *argvars, typval_T *rettv, int atcursor) void f_popup_create(typval_T *argvars, typval_T *rettv) { - popup_create(argvars, rettv, FALSE); + popup_create(argvars, rettv, TYPE_NORMAL); } /* @@ -681,7 +704,7 @@ f_popup_create(typval_T *argvars, typval_T *rettv) void f_popup_atcursor(typval_T *argvars, typval_T *rettv) { - popup_create(argvars, rettv, TRUE); + popup_create(argvars, rettv, TYPE_ATCURSOR); } /* diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 6d3279b4b..50165ec62 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -1009,8 +1009,9 @@ func Test_popup_moved() call assert_equal({}, popup_getpos(winid)) popupclear + " WORD is the default exe "normal gg0/WORD\<CR>" - let winid = popup_atcursor('text', {'moved': 'WORD'}) + let winid = popup_atcursor('text', {}) redraw call assert_equal(1, popup_getpos(winid).visible) call feedkeys("eli\<Esc>", 'xt') diff --git a/src/version.c b/src/version.c index f83f7ccc9..13961d4da 100644 --- a/src/version.c +++ b/src/version.c @@ -768,6 +768,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1455, +/**/ 1454, /**/ 1453, @@ -879,10 +879,11 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring); #define SEARCH_PEEK 0x800 /* peek for typed char, cancel search */ #define SEARCH_COL 0x1000 /* start at specified column instead of zero */ -/* Values for find_ident_under_cursor() */ -#define FIND_IDENT 1 /* find identifier (word) */ -#define FIND_STRING 2 /* find any string (WORD) */ -#define FIND_EVAL 4 /* include "->", "[]" and "." */ +// Values for find_ident_under_cursor() +#define FIND_IDENT 1 // find identifier (word) +#define FIND_STRING 2 // find any string (WORD) +#define FIND_EVAL 4 // include "->", "[]" and "." +#define FIND_NOERROR 8 // no error when no word found /* Values for file_name_in_line() */ #define FNAME_MESS 1 /* give error message */ |