summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-02-10 15:36:55 +0100
committerBram Moolenaar <Bram@vim.org>2018-02-10 15:36:55 +0100
commita8f04aa275984183bab5bb583b128f38c64abb69 (patch)
tree633a0b65f51e283edf85efbb43cf6ebf58187b21
parent2993ac5fce5450428322ce43aaa5e643e6994443 (diff)
downloadvim-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.txt10
-rw-r--r--src/option.c7
-rw-r--r--src/option.h1
-rw-r--r--src/popupmnu.c86
-rw-r--r--src/version.c2
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,