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
index 87b7bbc..b260d7e 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -5955,6 +5955,16 @@
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 4898e69..5e215d5 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2239,6 +2239,13 @@
(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 21be3a3..5ced8fe 100644
--- a/src/option.h
+++ b/src/option.h
@@ -424,6 +424,7 @@
#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 447f789..f53649f 100644
--- a/src/popupmnu.c
+++ b/src/popupmnu.c
@@ -67,6 +67,15 @@
}
/*
+ * 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 @@
do
{
- def_width = PUM_DEF_WIDTH;
+ def_width = pum_get_width();
above_row = 0;
below_row = cmdline_row;
@@ -216,16 +225,17 @@
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_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 @@
}
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_remove_balloon();
}
# endif
+
#endif
diff --git a/src/version.c b/src/version.c
index 0a54751..1bd0295 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1491,
+/**/
1490,
/**/
1489,