# HG changeset patch # User Christian Brabandt # Date 1518273906 -3600 # Node ID 6e972d830e130b7b5c56b548c8c669a3c123714b # Parent eaa9d3821fb05d17e5176d094e89c60326e979dd patch 8.0.1491: the minimum width of the popup menu is hard coded commit https://github.com/vim/vim/commit/a8f04aa275984183bab5bb583b128f38c64abb69 Author: Bram Moolenaar Date: Sat Feb 10 15:36:55 2018 +0100 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) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -5955,6 +5955,16 @@ A jump table for the options with a shor 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'* 'pythondll' string (default depends on the build) global diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -2239,6 +2239,13 @@ static struct vimoption options[] = (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, #if defined(DYNAMIC_PYTHON3) (char_u *)&p_py3dll, PV_NONE, diff --git a/src/option.h b/src/option.h --- a/src/option.h +++ b/src/option.h @@ -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 diff --git a/src/popupmnu.c b/src/popupmnu.c --- a/src/popupmnu.c +++ b/src/popupmnu.c @@ -67,6 +67,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! * When possible the leftmost character is aligned with screen column "col". @@ -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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -772,6 +772,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1491, +/**/ 1490, /**/ 1489,