aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-09-02 19:05:33 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-09-02 19:54:06 -0400
commitc0cb7585cc6b9d408811b95bb5462789f5ca0207 (patch)
treeac7fbe4b657d960bd6babdfd8403930bf4a5170c
parent02f126a2758e834a7e9dfbae0ede48bf8b90512f (diff)
downloadrneovim-c0cb7585cc6b9d408811b95bb5462789f5ca0207.tar.gz
rneovim-c0cb7585cc6b9d408811b95bb5462789f5ca0207.tar.bz2
rneovim-c0cb7585cc6b9d408811b95bb5462789f5ca0207.zip
vim-patch:8.1.0046: loading a session file fails if 'winheight' is big
Problem: Loading a session file fails if 'winheight' is a big number. Solution: Set 'minwinheight' to zero at first. Don't give an error when setting 'minwinheight' while 'winheight' is a big number. Fix using vertical splits. Fix setting 'minwinwidth'. (closes vim/vim#2970) https://github.com/vim/vim/commit/1c3c10492a291270fa89b3c8df11828792f927d3
-rw-r--r--src/nvim/option.c7
-rw-r--r--src/nvim/testdir/test_mksession.vim11
-rw-r--r--src/nvim/window.c41
3 files changed, 45 insertions, 14 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 6eeeca5068..ed9128dbbf 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -4330,19 +4330,26 @@ static char *set_num_option(int opt_idx, char_u *varp, long value,
// Number options that need some action when changed
if (pp == &p_wh) {
+ // 'winheight'
if (!ONE_WINDOW && curwin->w_height < p_wh) {
win_setheight((int)p_wh);
}
} else if (pp == &p_hh) {
+ // 'helpheight'
if (!ONE_WINDOW && curbuf->b_help && curwin->w_height < p_hh) {
win_setheight((int)p_hh);
}
} else if (pp == &p_wmh) {
+ // 'winminheight'
win_setminheight();
} else if (pp == &p_wiw) {
+ // 'winwidth'
if (!ONE_WINDOW && curwin->w_width < p_wiw) {
win_setwidth((int)p_wiw);
}
+ } else if (pp == &p_wmw) {
+ // 'winminwidth'
+ win_setminwidth();
} else if (pp == &p_ls) {
last_status(false); // (re)set last window status line.
} else if (pp == &p_stal) {
diff --git a/src/nvim/testdir/test_mksession.vim b/src/nvim/testdir/test_mksession.vim
index 0e56ed2ff3..b7169444d1 100644
--- a/src/nvim/testdir/test_mksession.vim
+++ b/src/nvim/testdir/test_mksession.vim
@@ -106,13 +106,22 @@ endfunc
func Test_mksession_winheight()
new
- set winheight=10 winminheight=2
+ set winheight=10
+ set winminheight=2
mksession! Xtest_mks.out
source Xtest_mks.out
call delete('Xtest_mks.out')
endfunc
+func Test_mksession_large_winheight()
+ set winheight=999
+ mksession! Xtest_mks_winheight.out
+ set winheight&
+ source Xtest_mks_winheight.out
+ call delete('Xtest_mks_winheight.out')
+endfunc
+
" Verify that arglist is stored correctly to the session file.
func Test_mksession_arglist()
argdel *
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 0e8cfcedf5..6861e19ca7 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -5229,27 +5229,42 @@ static void frame_setwidth(frame_T *curfrp, int width)
}
}
-/*
- * Check 'winminheight' for a valid value.
- */
+// Check 'winminheight' for a valid value and reduce it if needed.
void win_setminheight(void)
{
- int room;
- int first = TRUE;
+ bool first = true;
- /* loop until there is a 'winminheight' that is possible */
+ // loop until there is a 'winminheight' that is possible
while (p_wmh > 0) {
- /* TODO: handle vertical splits */
- room = -p_wh;
- FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
- room += wp->w_height - p_wmh;
+ const int room = Rows - p_ch;
+ const int needed = frame_minheight(topframe, NULL);
+ if (room >= needed) {
+ break;
+ }
+ p_wmh--;
+ if (first) {
+ EMSG(_(e_noroom));
+ first = false;
}
- if (room >= 0)
+ }
+}
+
+// Check 'winminwidth' for a valid value and reduce it if needed.
+void win_setminwidth(void)
+{
+ bool first = true;
+
+ // loop until there is a 'winminheight' that is possible
+ while (p_wmw > 0) {
+ const int room = Columns;
+ const int needed = frame_minwidth(topframe, NULL);
+ if (room >= needed) {
break;
- --p_wmh;
+ }
+ p_wmw--;
if (first) {
EMSG(_(e_noroom));
- first = FALSE;
+ first = false;
}
}
}