# HG changeset patch # User Bram Moolenaar # Date 1559498406 -7200 # Node ID df06694b761b39eb79889fe169b414733200f6f5 # Parent eaf7f6fefdb60f538d40484b4c2154078f65a681 patch 8.1.1455: popup_atcursor() not completely implemented commit https://github.com/vim/vim/commit/1762731f2039d78fc8ddd785c3d3b52e5968c0f1 Author: Bram Moolenaar Date: Sun Jun 2 19:53:44 2019 +0200 patch 8.1.1455: popup_atcursor() not completely implemented Problem: Popup_atcursor() not completely implemented. Solution: Add the default for the "moved" property. diff --git a/src/normal.c b/src/normal.c --- 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 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -138,12 +138,39 @@ get_padding_border(dict_T *dict, int *ar } /* + * 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 UNUS 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 UNUS 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 UNUS 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 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 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 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 --- 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\" - let winid = popup_atcursor('text', {'moved': 'WORD'}) + let winid = popup_atcursor('text', {}) redraw call assert_equal(1, popup_getpos(winid).visible) call feedkeys("eli\", 'xt') diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -879,10 +879,11 @@ extern int (*dyn_libintl_wputenv)(const #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 */