changeset 13234:6e972d830e13 v8.0.1491

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 <Bram@vim.org> 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)
author Christian Brabandt <cb@256bit.org>
date Sat, 10 Feb 2018 15:45:06 +0100
parents eaa9d3821fb0
children 6f7bfbf0f237
files runtime/doc/options.txt src/option.c src/option.h src/popupmnu.c src/version.c
diffstat 5 files changed, 98 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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,
--- 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
--- 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
--- 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,