]> granicus.if.org Git - vim/commitdiff
patch 8.1.1455: popup_atcursor() not completely implemented v8.1.1455
authorBram Moolenaar <Bram@vim.org>
Sun, 2 Jun 2019 17:53:44 +0000 (19:53 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 2 Jun 2019 17:53:44 +0000 (19:53 +0200)
Problem:    Popup_atcursor() not completely implemented.
Solution:   Add the default for the "moved" property.

src/normal.c
src/popupwin.c
src/testdir/test_popupwin.vim
src/version.c
src/vim.h

index 1ff92973fdccc73e9dd40da4fbae9f1da55c22d8..834a6436da7b67172b26b4fdee2a7a83a72a37e7 100644 (file)
@@ -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;
index 2d61ab8bf450e454e8f0b21049c838e0fe5130c4..973358c55d07362ef7ba52d5f607015723e2fbff 100644 (file)
@@ -137,13 +137,40 @@ 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);
 }
 
 /*
index 6d3279b4bb7c369a2172771252d13b11d585545d..50165ec62f06e9a266cb8840b8c1d35ed5bb9bc1 100644 (file)
@@ -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')
index f83f7ccc9327a9b664236d4da6af7e2fa583cc05..13961d4dabeda233a584fb7fb26e9c1504af28d5 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1455,
 /**/
     1454,
 /**/
index 72bb109b4dc299e9dbe6709bb035dc67b87f9ce9..3b4582bc915ed59a1217c06efd329a5677d0e410 100644 (file)
--- 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 */