Patch 8.1.1428
Problem:    Popup_atcursor() not implemented yet.
Solution:   Implement it. (Yasuhiro Matsumoto, closes #4456)
Files:      runtime/doc/popup.txt, src/evalfunc.c, src/popupwin.c,
            src/proto/popupwin.pro, src/testdir/test_popupwin.vim


*** ../vim-8.1.1427/runtime/doc/popup.txt       2019-05-30 14:29:42.597507636 
+0200
--- runtime/doc/popup.txt       2019-05-30 19:22:30.828010454 +0200
***************
*** 85,95 ****
  
  IMPLEMENTATION:
  - Code is in popupwin.c
! - when creating the window set options to Vim default? (verify with 'number')
  - Implement filter.
    Check that popup_close() works in the filter.
- - Implement the "pos" option.
  - Handle screen resize in screenalloc().
  - Make redrawing more efficient and avoid flicker.
      Store popup info in a mask, use the mask in screen_line()
      Fix redrawing problem with completion.
--- 85,95 ----
  
  IMPLEMENTATION:
  - Code is in popupwin.c
! - Implement the "pos" option.
  - Implement filter.
    Check that popup_close() works in the filter.
  - Handle screen resize in screenalloc().
+ - show [Popup] instead of [Scratch] in ":ls!"
  - Make redrawing more efficient and avoid flicker.
      Store popup info in a mask, use the mask in screen_line()
      Fix redrawing problem with completion.
***************
*** 97,103 ****
      Fix redrawing the statusline on top of a popup
  - Figure out the size and position better.
      if wrapping splits a double-wide character
!     if wrapping has an indent
  - Can the buffer be re-used, to avoid using up lots of buffer numbers?
  - Implement all the unimplemented options and features.
  
--- 97,103 ----
      Fix redrawing the statusline on top of a popup
  - Figure out the size and position better.
      if wrapping splits a double-wide character
!     if wrapping inserts indent
  - Can the buffer be re-used, to avoid using up lots of buffer numbers?
  - Implement all the unimplemented options and features.
  
***************
*** 160,169 ****
  
  
  popup_atcursor({text}, {options})                      *popup_atcursor()*
-               {not implemented yet}
                Show the {text} above the cursor, and close it when the cursor
                moves.  This works like: >
                        call popup_create({text}, {
                                \ 'line': 'cursor-1',
                                \ 'col': 'cursor',
                                \ 'moved': 'WORD',
--- 160,169 ----
  
  
  popup_atcursor({text}, {options})                      *popup_atcursor()*
                Show the {text} above the cursor, and close it when the cursor
                moves.  This works like: >
                        call popup_create({text}, {
+                               \ 'pos': 'botleft',
                                \ 'line': 'cursor-1',
                                \ 'col': 'cursor',
                                \ 'moved': 'WORD',
***************
*** 270,279 ****
  - 'bufhidden' is "hide"
  - 'buflisted' is off
  - 'undolevels' is -1: no undo at all
! TODO: more
  
! It is possible to change these options, but anything might break then, so
! better leave them alone.
  
  The window does have a cursor position, but the cursor is not displayed.
  
--- 270,280 ----
  - 'bufhidden' is "hide"
  - 'buflisted' is off
  - 'undolevels' is -1: no undo at all
! - all other buffer-local and window_local options are set to their Vim default
!   value.
  
! It is possible to change the specifically mentioned options, but anything
! might break then, so better leave them alone.
  
  The window does have a cursor position, but the cursor is not displayed.
  
***************
*** 306,317 ****
                        "cursor", "cursor+1" or "cursor-1" to use the line of
                        the cursor and add or subtract a number of lines;
                        default is "cursor-1".
-                       {only number is implemented}
        col             screen column where to position the popup; can use
                        "cursor" to use the column of the cursor, "cursor+99"
                        and "cursor-99" to add or subtract a number of
                        columns; default is "cursor"
-                       {only number is implemented}
        pos             "topleft", "topright", "botleft" or "botright":
                        defines what corner of the popup "line" and "col" are
                        used for.  When not set "topleft" is used.
--- 307,316 ----
***************
*** 342,350 ****
                        {not implemented yet}
        highlight       highlight group name to use for the text, stored in
                        the 'wincolor' option
        border          list with numbers, defining the border thickness
!                       above/right/below/left of the popup; an empty list
!                       uses a border of 1 all around
                        {not implemented yet}
        borderhighlight highlight group name to use for the border
                        {not implemented yet}
--- 341,357 ----
                        {not implemented yet}
        highlight       highlight group name to use for the text, stored in
                        the 'wincolor' option
+       padding         list with numbers, defining the padding
+                       above/right/below/left of the popup (similar to CSS);
+                       an empty list uses a padding of 1 all around; the
+                       padding goes around the text, inside any border;
+                       padding uses the 'wincolor' highlight; Example: [1, 2,
+                       1, 3] has 1 line of padding above, 2 columns on the
+                       right, 1 line below and 3 columns on the left
+                       {not implemented yet}
        border          list with numbers, defining the border thickness
!                       above/right/below/left of the popup (similar to CSS);
!                       an empty list uses a border of 1 all around
                        {not implemented yet}
        borderhighlight highlight group name to use for the border
                        {not implemented yet}
*** ../vim-8.1.1427/src/evalfunc.c      2019-05-30 17:29:34.767666654 +0200
--- src/evalfunc.c      2019-05-30 19:05:00.148910615 +0200
***************
*** 809,814 ****
--- 809,815 ----
      {"perleval",      1, 1, f_perleval},
  #endif
  #ifdef FEAT_TEXT_PROP
+     {"popup_atcursor",        2, 2, f_popup_atcursor},
      {"popup_close",   1, 1, f_popup_close},
      {"popup_create",  2, 2, f_popup_create},
      {"popup_getoptions", 1, 1, f_popup_getoptions},
*** ../vim-8.1.1427/src/popupwin.c      2019-05-30 19:03:19.653294536 +0200
--- src/popupwin.c      2019-05-30 19:20:36.144585240 +0200
***************
*** 16,26 ****
  #ifdef FEAT_TEXT_PROP
  
  /*
   * Go through the options in "dict" and apply them to buffer "buf" displayed 
in
   * popup window "wp".
   */
      static void
! apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict)
  {
      int           nr;
      char_u  *str;
--- 16,70 ----
  #ifdef FEAT_TEXT_PROP
  
  /*
+  * Get option value for"key", which is "line" or "col".
+  * Handles "cursor+N" and "cursor-N".
+  */
+     static int
+ popup_options_pos(dict_T *dict, char_u *key)
+ {
+     dictitem_T        *di;
+     char_u    *val;
+     char_u    *s;
+     char_u    *endp;
+     int               n = 0;
+ 
+     di = dict_find(dict, key, -1);
+     if (di == NULL)
+       return 0;
+ 
+     val = tv_get_string(&di->di_tv);
+     if (STRNCMP(val, "cursor", 6) != 0)
+       return dict_get_number(dict, key);
+ 
+     setcursor_mayforce(TRUE);
+     s = val + 6;
+     if (*s != NUL)
+     {
+       n = strtol((char *)s, (char **)&endp, 10);
+       if (endp != NULL && *skipwhite(endp) != NUL)
+       {
+           semsg(_(e_invexpr2), val);
+           return 0;
+       }
+     }
+ 
+     if (STRCMP(key, "line") == 0)
+       n = screen_screenrow() + 1 + n;
+     else // "col"
+       n = screen_screencol() + 1 + n;
+ 
+     if (n < 1)
+       n = 1;
+     return n;
+ }
+ 
+ /*
   * 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)
  {
      int           nr;
      char_u  *str;
***************
*** 30,37 ****
      wp->w_maxwidth = dict_get_number(dict, (char_u *)"maxwidth");
      wp->w_maxheight = dict_get_number(dict, (char_u *)"maxheight");
  
!     wp->w_wantline = dict_get_number(dict, (char_u *)"line");
!     wp->w_wantcol = dict_get_number(dict, (char_u *)"col");
  
      wp->w_zindex = dict_get_number(dict, (char_u *)"zindex");
  
--- 74,92 ----
      wp->w_maxwidth = dict_get_number(dict, (char_u *)"maxwidth");
      wp->w_maxheight = dict_get_number(dict, (char_u *)"maxheight");
  
!     if (atcursor)
!     {
!       setcursor_mayforce(TRUE);
!       wp->w_wantline = screen_screenrow();
!       wp->w_wantcol = screen_screencol() + 1;
!     }
! 
!     nr = popup_options_pos(dict, (char_u *)"line");
!     if (nr > 0)
!       wp->w_wantline = nr;
!     nr = popup_options_pos(dict, (char_u *)"col");
!     if (nr > 0)
!       wp->w_wantcol = nr;
  
      wp->w_zindex = dict_get_number(dict, (char_u *)"zindex");
  
***************
*** 215,223 ****
  
  /*
   * popup_create({text}, {options})
   */
!     void
! f_popup_create(typval_T *argvars, typval_T *rettv)
  {
      win_T   *wp;
      buf_T   *buf;
--- 270,280 ----
  
  /*
   * 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)
  {
      win_T   *wp;
      buf_T   *buf;
***************
*** 309,315 ****
      curbuf = curwin->w_buffer;
  
      // Deal with options.
!     apply_options(wp, buf, argvars[1].vval.v_dict);
  
      // set default values
      if (wp->w_zindex == 0)
--- 366,372 ----
      curbuf = curwin->w_buffer;
  
      // Deal with options.
!     apply_options(wp, buf, argvars[1].vval.v_dict, atcursor);
  
      // set default values
      if (wp->w_zindex == 0)
***************
*** 323,328 ****
--- 380,403 ----
  }
  
  /*
+  * popup_create({text}, {options})
+  */
+     void
+ f_popup_create(typval_T *argvars, typval_T *rettv)
+ {
+     popup_create(argvars, rettv, FALSE);
+ }
+ 
+ /*
+  * popup_atcursor({text}, {options})
+  */
+     void
+ f_popup_atcursor(typval_T *argvars, typval_T *rettv)
+ {
+     popup_create(argvars, rettv, TRUE);
+ }
+ 
+ /*
   * Find the popup window with window-ID "id".
   * If the popup window does not exist NULL is returned.
   * If the window is not a popup window, and error message is given.
*** ../vim-8.1.1427/src/proto/popupwin.pro      2019-05-30 14:29:42.597507636 
+0200
--- src/proto/popupwin.pro      2019-05-30 19:05:00.148910615 +0200
***************
*** 1,15 ****
  /* popupwin.c */
- void popup_adjust_position(win_T *wp);
- void f_popup_create(typval_T *argvars, typval_T *rettv);
  int popup_any_visible(void);
  void f_popup_close(typval_T *argvars, typval_T *rettv);
  void f_popup_hide(typval_T *argvars, typval_T *rettv);
  void f_popup_show(typval_T *argvars, typval_T *rettv);
  void popup_close(int id);
  void popup_close_tabpage(tabpage_T *tp, int id);
- void close_all_popups(void);
- void ex_popupclear(exarg_T *eap);
- void f_popup_move(typval_T *argvars, typval_T *rettv);
- void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
- void f_popup_getposition(typval_T *argvars, typval_T *rettv);
  /* vim: set ft=c : */
--- 1,16 ----
  /* popupwin.c */
  int popup_any_visible(void);
+ void close_all_popups(void);
+ void ex_popupclear(exarg_T *eap);
+ void f_popup_atcursor(typval_T *argvars, typval_T *rettv);
  void f_popup_close(typval_T *argvars, typval_T *rettv);
+ void f_popup_create(typval_T *argvars, typval_T *rettv);
+ void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
+ void f_popup_getposition(typval_T *argvars, typval_T *rettv);
  void f_popup_hide(typval_T *argvars, typval_T *rettv);
+ void f_popup_move(typval_T *argvars, typval_T *rettv);
  void f_popup_show(typval_T *argvars, typval_T *rettv);
+ void popup_adjust_position(win_T *wp);
  void popup_close(int id);
  void popup_close_tabpage(tabpage_T *tp, int id);
  /* vim: set ft=c : */
*** ../vim-8.1.1427/src/testdir/test_popupwin.vim       2019-05-30 
18:40:20.120405138 +0200
--- src/testdir/test_popupwin.vim       2019-05-30 19:21:59.304168903 +0200
***************
*** 335,337 ****
--- 335,386 ----
    call popup_close(winid)
    bwipe
  endfunc
+ 
+ func Test_popup_atcursor()
+   topleft vnew
+   call setline(1, [
+   \  'xxxxxxxxxxxxxxxxx',
+   \  'xxxxxxxxxxxxxxxxx',
+   \  'xxxxxxxxxxxxxxxxx',
+   \])
+ 
+   call cursor(2, 2)
+   redraw
+   let winid = popup_atcursor('vim', {})
+   redraw
+   let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
+   call assert_equal('xvimxxxxxxxxxxxxx', line)
+   call popup_close(winid)
+ 
+   call cursor(3, 4)
+   redraw
+   let winid = popup_atcursor('vim', {})
+   redraw
+   let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
+   call assert_equal('xxxvimxxxxxxxxxxx', line)
+   call popup_close(winid)
+ 
+   call cursor(1, 1)
+   redraw
+   let winid = popup_create('vim', {
+   \ 'line': 'cursor+2',
+   \ 'col': 'cursor+1',
+   \})
+   redraw
+   let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
+   call assert_equal('xvimxxxxxxxxxxxxx', line)
+   call popup_close(winid)
+ 
+   call cursor(3, 3)
+   redraw
+   let winid = popup_create('vim', {
+   \ 'line': 'cursor-2',
+   \ 'col': 'cursor-1',
+   \})
+   redraw
+   let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
+   call assert_equal('xvimxxxxxxxxxxxxx', line)
+   call popup_close(winid)
+ 
+   bwipe!
+ endfunc
*** ../vim-8.1.1427/src/version.c       2019-05-30 19:03:19.653294536 +0200
--- src/version.c       2019-05-30 19:23:28.679718885 +0200
***************
*** 769,770 ****
--- 769,772 ----
  {   /* Add new patch number below this line */
+ /**/
+     1428,
  /**/

-- 
"I simultaneously try to keep my head in the clouds and my feet on the
ground.  Sometimes it's a stretch, though."              -- Larry Wall

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201905301725.x4UHPNho020335%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui