Skip to content
Permalink
Browse files

patch 8.0.1491: the minimum width of the popup menu is hard coded

Problem:    The minimum width of the popup menu is hard coded.
Solution:   Add the 'pumwidth' option. (Christian Brabandt, James McCoy,
            closes #2314)
  • Loading branch information...
brammool committed Feb 10, 2018
1 parent 2993ac5 commit a8f04aa275984183bab5bb583b128f38c64abb69
Showing with 98 additions and 8 deletions.
  1. +10 −0 runtime/doc/options.txt
  2. +7 −0 src/option.c
  3. +1 −0 src/option.h
  4. +78 −8 src/popupmnu.c
  5. +2 −0 src/version.c
@@ -5953,6 +5953,16 @@ A jump table for the options with a short description can be found at |Q_op|.
{not in Vi}
Determines the maximum number of items to show in the popup menu for
Insert mode completion. When zero as much space as available is used.
|ins-completion-menu|.

*'pumwidth'* *'pw'*
'pumwidth' 'pw' number (default 0)
global
{not available when compiled without the
|+insert_expand| feature}
{not in Vi}
Determines the minium width to use for the popup menu for Insert mode
completion. When zero the default of 15 screen cells is used.
|ins-completion-menu|.

*'pythondll'*
@@ -2237,6 +2237,13 @@ static struct vimoption options[] =
(char_u *)&p_ph, PV_NONE,
#else
(char_u *)NULL, PV_NONE,
#endif
{(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
{"pumwidth", "pw", P_NUM|P_VI_DEF,
#ifdef FEAT_INS_EXPAND
(char_u *)&p_pw, PV_NONE,
#else
(char_u *)NULL, PV_NONE,
#endif
{(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
{"pythonthreedll", NULL, P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
@@ -424,6 +424,7 @@ EXTERN int p_cp; /* 'compatible' */
#ifdef FEAT_INS_EXPAND
EXTERN char_u *p_cot; /* 'completeopt' */
EXTERN long p_ph; /* 'pumheight' */
EXTERN long p_pw; /* 'pumwidth' */
#endif
EXTERN char_u *p_cpo; /* 'cpoptions' */
#ifdef FEAT_CSCOPE
@@ -66,6 +66,15 @@ pum_compute_size(void)
}
}

/*
* Return the minimum width of the popup menu.
*/
static int
pum_get_width(void)
{
return p_pw == 0 ? PUM_DEF_WIDTH : p_pw;
}

/*
* Show the popup menu with items "array[size]".
* "array" must remain valid until pum_undisplay() is called!
@@ -93,7 +102,7 @@ pum_display(

do
{
def_width = PUM_DEF_WIDTH;
def_width = pum_get_width();
above_row = 0;
below_row = cmdline_row;

@@ -216,16 +225,17 @@ pum_display(
if (def_width < max_width)
def_width = max_width;

if (((col < Columns - PUM_DEF_WIDTH || col < Columns - max_width)
if (((col < Columns - pum_get_width() || col < Columns - max_width)
#ifdef FEAT_RIGHTLEFT
&& !curwin->w_p_rl)
|| (curwin->w_p_rl && (col > PUM_DEF_WIDTH || col > max_width)
|| (curwin->w_p_rl && (col > pum_get_width() || col > max_width)
#endif
))
{
/* align pum column with "col" */
pum_col = col;

/* start with the maximum space available */
#ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl)
pum_width = pum_col - pum_scrollbar + 1;
@@ -234,12 +244,71 @@ pum_display(
pum_width = Columns - pum_col - pum_scrollbar;

if (pum_width > max_width + pum_kind_width + pum_extra_width + 1
&& pum_width > PUM_DEF_WIDTH)
&& pum_width > pum_get_width())
{
/* the width is too much, make it narrower */
pum_width = max_width + pum_kind_width + pum_extra_width + 1;
if (pum_width < PUM_DEF_WIDTH)
pum_width = PUM_DEF_WIDTH;
if (pum_width < pum_get_width())
pum_width = pum_get_width();
}
else if (((col > pum_get_width() || col > max_width)
#ifdef FEAT_RIGHTLEFT
&& !curwin->w_p_rl)
|| (curwin->w_p_rl && (col < Columns - pum_get_width()
|| col < Columns - max_width)
#endif
))
{
/* align right pum edge with "col" */
#ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl)
{
pum_col = col + max_width + pum_scrollbar + 1;
if (pum_col >= Columns)
pum_col = Columns - 1;
}
else
#endif
{
pum_col = col - max_width - pum_scrollbar;
if (pum_col < 0)
pum_col = 0;
}

#ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl)
pum_width = W_ENDCOL(curwin) - pum_col - pum_scrollbar + 1;
else
#endif
pum_width = pum_col - pum_scrollbar;

if (pum_width < pum_get_width())
{
pum_width = pum_get_width();
#ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl)
{
if (pum_width > pum_col)
pum_width = pum_col;
}
else
#endif
{
if (pum_width >= Columns - pum_col)
pum_width = Columns - pum_col - 1;
}
}
else if (pum_width > max_width + pum_kind_width
+ pum_extra_width + 1
&& pum_width > pum_get_width())
{
pum_width = max_width + pum_kind_width
+ pum_extra_width + 1;
if (pum_width < pum_get_width())
pum_width = pum_get_width();
}
}

}
else if (Columns < def_width)
{
@@ -254,8 +323,8 @@ pum_display(
}
else
{
if (max_width > PUM_DEF_WIDTH)
max_width = PUM_DEF_WIDTH; /* truncate */
if (max_width > pum_get_width())
max_width = pum_get_width(); /* truncate */
#ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl)
pum_col = max_width - 1;
@@ -1005,4 +1074,5 @@ ui_may_remove_balloon(void)
ui_remove_balloon();
}
# endif

#endif
@@ -771,6 +771,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1491,
/**/
1490,
/**/

0 comments on commit a8f04aa

Please sign in to comment.
You can’t perform that action at this time.