summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-06-02 19:53:44 +0200
committerBram Moolenaar <Bram@vim.org>2019-06-02 19:53:44 +0200
commit1762731f2039d78fc8ddd785c3d3b52e5968c0f1 (patch)
tree53ecc305a1703909d91fa5adab3ab7623308d16e
parent6116b6abb1a14b6b7aa9776c390f1a5a6bf1b209 (diff)
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.c15
-rw-r--r--src/popupwin.c89
-rw-r--r--src/testdir/test_popupwin.vim3
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h9
5 files changed, 73 insertions, 45 deletions
diff --git a/src/normal.c b/src/normal.c
index 1ff92973fd..834a6436da 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 2d61ab8bf4..973358c55d 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 6d3279b4bb..50165ec62f 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 f83f7ccc93..13961d4dab 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,
diff --git a/src/vim.h b/src/vim.h
index 72bb109b4d..3b4582bc91 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -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 */