diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-02-10 15:36:55 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-02-10 15:36:55 +0100 |
commit | a8f04aa275984183bab5bb583b128f38c64abb69 (patch) | |
tree | 633a0b65f51e283edf85efbb43cf6ebf58187b21 | |
parent | 2993ac5fce5450428322ce43aaa5e643e6994443 (diff) | |
download | vim-a8f04aa275984183bab5bb583b128f38c64abb69.zip |
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)
-rw-r--r-- | runtime/doc/options.txt | 10 | ||||
-rw-r--r-- | src/option.c | 7 | ||||
-rw-r--r-- | src/option.h | 1 | ||||
-rw-r--r-- | src/popupmnu.c | 86 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 98 insertions, 8 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 87b7bbc50..b260d7e11 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -5955,6 +5955,16 @@ A jump table for the options with a short description can be found at |Q_op|. 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 index 4898e694c..5e215d52d 100644 --- 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 index 21be3a39f..5ced8fecd 100644 --- 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 index 447f789e5..f53649f12 100644 --- 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 index 0a5475189..1bd029555 100644 --- 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, |