commit 380417c1ddbd90b084ed27f321b575de34998a9b
parent abc087f4c65ca547cae58518b42aee82ff4a07f6
Author: zeertzjq <zeertzjq@outlook.com>
Date: Sun, 31 Jul 2022 19:13:45 +0800
Merge pull request #19587 from Shougo/vim-9.0.0114
vim-patch:9.0.{0114,0115,0118}
Diffstat:
11 files changed, 99 insertions(+), 30 deletions(-)
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
@@ -1314,14 +1314,14 @@ A jump table for the options with a short description can be found at |Q_op|.
*'cmdheight'* *'ch'*
'cmdheight' 'ch' number (default 1)
- global
+ global or local to tab page
Number of screen lines to use for the command-line. Helps avoiding
|hit-enter| prompts.
The value of this option is stored with the tab page, so that each tab
page can have a different value.
- When 'cmdheight' is zero, it disables echo area and all outputs need
- |hit-enter| prompt.
+ When 'cmdheight' is zero, there is no command-line unless it is being
+ used. Any messages will cause the |hit-enter| prompt.
*'cmdwinheight'* *'cwh'*
'cmdwinheight' 'cwh' number (default 7)
@@ -4850,7 +4850,7 @@ A jump table for the options with a short description can be found at |Q_op|.
If 'rulerformat' is set, it will determine the contents of the ruler.
Each window has its own ruler. If a window has a status line, the
ruler is shown there. If a window doesn't have a status line and
- 'cmdheight' is 0, the ruler is not shown. Otherwise it is shown in
+ 'cmdheight' is zero, the ruler is not shown. Otherwise it is shown in
the last line of the screen. If the statusline is given by
'statusline' (i.e. not empty), this option takes precedence over
'ruler' and 'rulerformat'.
@@ -5559,7 +5559,7 @@ A jump table for the options with a short description can be found at |Q_op|.
global
Show (partial) command in the last line of the screen. Set this
option off if your terminal is slow.
- The option is disabled if 'cmdheight' is 0.
+ The option has no effect when 'cmdheight' is zero.
In Visual mode the size of the selected area is shown:
- When selecting characters within a line, the number of characters.
If the number of bytes is different it is also displayed: "2-6"
@@ -5606,7 +5606,7 @@ A jump table for the options with a short description can be found at |Q_op|.
global
If in Insert, Replace or Visual mode put a message on the last line.
The |hl-ModeMsg| highlight group determines the highlighting.
- The option is disabled if 'cmdheight' is 0.
+ The option has no effect when 'cmdheight' is zero.
*'showtabline'* *'stal'*
'showtabline' 'stal' number (default 1)
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
@@ -3669,7 +3669,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T
}
}
- bool cmdheight0 = !ui_has_messages();
+ const bool cmdheight0 = !ui_has_messages();
if (cmdheight0) {
// If cmdheight is 0, cmdheight must be set to 1 when we enter command line.
set_option_value("ch", 1L, NULL, 0);
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
@@ -689,12 +689,22 @@ static void finish_incsearch_highlighting(int gotesc, incsearch_state_T *s, bool
/// @param init_ccline clear ccline first
static uint8_t *command_line_enter(int firstc, long count, int indent, bool init_ccline)
{
- bool cmdheight0 = !ui_has_messages();
+ const bool cmdheight0 = !ui_has_messages();
if (cmdheight0) {
- // If cmdheight is 0, cmdheight must be set to 1 when we enter command line.
+ const long save_so = lastwin->w_p_so;
+
+ // If cmdheight is 0, cmdheight must be set to 1 when we enter the
+ // command line. Set "made_cmdheight_nonzero" and reset 'scrolloff' to
+ // avoid scrolling the last window.
+ made_cmdheight_nonzero = true;
+
+ lastwin->w_p_so = 0;
set_option_value("ch", 1L, NULL, 0);
update_screen(VALID); // redraw the screen NOW
+
+ made_cmdheight_nonzero = false;
+ lastwin->w_p_so = save_so;
}
// can be invoked recursively, identify each level
@@ -991,11 +1001,14 @@ theend:
}
if (cmdheight0) {
+ made_cmdheight_nonzero = true;
+
// Restore cmdheight
set_option_value("ch", 0L, NULL, 0);
-
// Redraw is needed for command line completion
redraw_all_later(CLEAR);
+
+ made_cmdheight_nonzero = false;
}
return p;
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
@@ -1084,4 +1084,7 @@ EXTERN char windowsVersion[20] INIT(= { 0 });
EXTERN int exit_need_delay INIT(= 0);
+// Set when 'cmdheight' is changed from zero to one temporarily.
+EXTERN bool made_cmdheight_nonzero INIT(= false);
+
#endif // NVIM_GLOBALS_H
diff --git a/src/nvim/message.c b/src/nvim/message.c
@@ -1390,7 +1390,7 @@ void msg_start(void)
need_fileinfo = false;
}
- bool no_msg_area = !ui_has_messages();
+ const bool no_msg_area = !ui_has_messages();
if (need_clr_eos || (no_msg_area && redrawing_cmdline)) {
// Halfway an ":echo" command and getting an (error) message: clear
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
@@ -893,7 +893,7 @@ int do_record(int c)
{
char_u *p;
static int regname;
- static bool change_cmdheight = false;
+ static bool changed_cmdheight = false;
yankreg_T *old_y_previous;
int retval;
@@ -907,13 +907,15 @@ int do_record(int c)
showmode();
regname = c;
retval = OK;
+
if (!ui_has_messages()) {
- // Enable macro indicator temporary
+ // Enable macro indicator temporarily
set_option_value("ch", 1L, NULL, 0);
update_screen(VALID);
- change_cmdheight = true;
+ changed_cmdheight = true;
}
+
apply_autocmds(EVENT_RECORDINGENTER, NULL, NULL, false, curbuf);
}
} else { // stop recording
@@ -936,15 +938,6 @@ int do_record(int c)
(void)tv_dict_add_str(dict, S_LEN("regname"), buf);
tv_dict_set_keys_readonly(dict);
- if (change_cmdheight) {
- // Restore cmdheight
- set_option_value("ch", 0L, NULL, 0);
-
- redraw_all_later(CLEAR);
-
- change_cmdheight = false;
- }
-
// Get the recorded key hits. K_SPECIAL will be escaped, this
// needs to be removed again to put it in a register. exec_reg then
// adds the escaping back later.
@@ -968,6 +961,12 @@ int do_record(int c)
y_previous = old_y_previous;
}
+
+ if (changed_cmdheight) {
+ // Restore cmdheight
+ set_option_value("ch", 0L, NULL, 0);
+ redraw_all_later(CLEAR);
+ }
}
return retval;
}
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
@@ -6501,7 +6501,7 @@ static void win_redr_ruler(win_T *wp, bool always)
bool is_stl_global = global_stl_height() > 0;
static bool did_show_ext_ruler = false;
- // If 'ruler' off or redrawing disabled, don't do anything
+ // If 'ruler' off, don't do anything
if (!p_ru) {
return;
}
diff --git a/src/nvim/testdir/test_ins_complete.vim b/src/nvim/testdir/test_ins_complete.vim
@@ -346,7 +346,7 @@ func Test_CompleteDone_modify()
\ 'user_data': '',
\ }
let v:completed_item = value
- call assert_equal(v:completed_item, value)
+ call assert_equal(value, v:completed_item)
endfunc
func CompleteTest(findstart, query)
diff --git a/src/nvim/testdir/test_messages.vim b/src/nvim/testdir/test_messages.vim
@@ -316,4 +316,60 @@ func Test_fileinfo_after_echo()
call delete('b.txt')
endfunc
+func Test_cmdheight_zero()
+ set cmdheight=0
+ set showcmd
+ redraw!
+
+ echo 'test echo'
+ call assert_equal(116, screenchar(&lines, 1))
+ redraw!
+
+ echomsg 'test echomsg'
+ call assert_equal(116, screenchar(&lines, 1))
+ redraw!
+
+ call feedkeys(":ls\<CR>", "xt")
+ call assert_equal(':ls', Screenline(&lines - 1))
+ redraw!
+
+ let char = getchar(0)
+ call assert_match(char, 0)
+
+ " Check change/restore cmdheight when macro
+ call feedkeys("qa", "xt")
+ call assert_equal(1, &cmdheight)
+ call feedkeys("q", "xt")
+ call assert_equal(0, &cmdheight)
+
+ call setline(1, 'somestring')
+ call feedkeys("y", "n")
+ %s/somestring/otherstring/gc
+ call assert_equal('otherstring', getline(1))
+
+ call feedkeys("g\<C-g>", "xt")
+ call assert_match(
+ \ 'Col 1 of 11; Line 1 of 1; Word 1 of 1',
+ \ Screenline(&lines))
+
+ " Check split behavior
+ for i in range(1, 10)
+ split
+ endfor
+ only
+ call assert_equal(0, &cmdheight)
+
+ " Check that pressing ":" should not scroll a window
+ " Check for what patch 9.0.0115 fixes
+ botright 10new
+ call setline(1, range(12))
+ 7
+ call feedkeys(":\"\<C-R>=line('w0')\<CR>\<CR>", "xt")
+ call assert_equal('"1', @:)
+ bwipe!
+
+ set cmdheight&
+ set showcmd&
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_window_cmd.vim b/src/nvim/testdir/test_window_cmd.vim
@@ -1390,11 +1390,9 @@ func Test_win_move_statusline()
call assert_equal(h0, winheight(0))
call assert_equal(1, &cmdheight)
endfor
- " Nvim supports cmdheight=0
+ " supports cmdheight=0
set cmdheight=0
call assert_true(win_move_statusline(0, 1))
- "call assert_equal(h0, winheight(0))
- "call assert_equal(1, &cmdheight)
call assert_equal(h0 + 1, winheight(0))
call assert_equal(0, &cmdheight)
set cmdheight&
diff --git a/src/nvim/window.c b/src/nvim/window.c
@@ -5555,7 +5555,6 @@ static void frame_setheight(frame_T *curfrp, int height)
}
if (curfrp->fr_parent == NULL) {
- // topframe: can only change the command line
if (height > ROWS_AVAIL) {
// If height is greater than the available space, try to create space for
// the frame by reducing 'cmdheight' if possible, while making sure
@@ -6307,7 +6306,8 @@ void win_set_inner_size(win_T *wp)
// There is no point in adjusting the scroll position when exiting. Some
// values might be invalid.
- if (!exiting) {
+ // Skip scroll_to_fraction() when 'cmdheight' was set to one from zero.
+ if (!exiting && !made_cmdheight_nonzero) {
scroll_to_fraction(wp, prev_height);
}
redraw_later(wp, NOT_VALID); // SOME_VALID??