diff options
author | Shougo Matsushita <Shougo.Matsu@gmail.com> | 2022-07-31 17:06:32 +0900 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-07-31 17:15:36 +0800 |
commit | 81a1d26c3eee816abaa3d0e611a8b1a0e473d3a1 (patch) | |
tree | b4b14f57c36376c382bf9116f85aa84633749024 | |
parent | abc087f4c65ca547cae58518b42aee82ff4a07f6 (diff) | |
download | rneovim-81a1d26c3eee816abaa3d0e611a8b1a0e473d3a1.tar.gz rneovim-81a1d26c3eee816abaa3d0e611a8b1a0e473d3a1.tar.bz2 rneovim-81a1d26c3eee816abaa3d0e611a8b1a0e473d3a1.zip |
vim-patch:9.0.0114: the command line takes up space even when not used
Problem: The command line takes up space even when not used.
Solution: Allow for 'cmdheight' to be set to zero. (Shougo Matsushita,
closes vim/vim#10675, closes vim/vim#940)
https://github.com/vim/vim/commit/f39cfb72629f3e7fefaf578a3faa2619cd0654f8
Omit win_redr_ruler() change: winbar may still need redraw.
Omit win_update() changes: Nvim doesn't use `Rows` there.
Omit redraw_asap(): removed.
-rw-r--r-- | runtime/doc/options.txt | 12 | ||||
-rw-r--r-- | src/nvim/ex_cmds.c | 2 | ||||
-rw-r--r-- | src/nvim/ex_getln.c | 3 | ||||
-rw-r--r-- | src/nvim/message.c | 2 | ||||
-rw-r--r-- | src/nvim/ops.c | 21 | ||||
-rw-r--r-- | src/nvim/screen.c | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test_messages.vim | 47 | ||||
-rw-r--r-- | src/nvim/testdir/test_window_cmd.vim | 4 | ||||
-rw-r--r-- | src/nvim/window.c | 1 |
9 files changed, 68 insertions, 26 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index f29828921d..04ba9539c5 100644 --- 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 index 7edf4c5bcb..ab6e3ac2d5 100644 --- 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 index 815eeb8de5..be7e7377ed 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -689,7 +689,7 @@ 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. @@ -993,7 +993,6 @@ theend: if (cmdheight0) { // Restore cmdheight set_option_value("ch", 0L, NULL, 0); - // Redraw is needed for command line completion redraw_all_later(CLEAR); } diff --git a/src/nvim/message.c b/src/nvim/message.c index 66c6cca561..621a9212df 100644 --- 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 index 75ba8dbede..b428bf8dd6 100644 --- 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 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 index a28c7c63b1..5e20b35c5e 100644 --- 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_messages.vim b/src/nvim/testdir/test_messages.vim index 2f9c562771..e6172f6c73 100644 --- a/src/nvim/testdir/test_messages.vim +++ b/src/nvim/testdir/test_messages.vim @@ -316,4 +316,51 @@ 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(&cmdheight, 1) + call feedkeys("q", "xt") + call assert_equal(&cmdheight, 0) + + call setline(1, 'somestring') + call feedkeys("y", "n") + %s/somestring/otherstring/gc + call assert_equal(getline(1), 'otherstring') + + 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(&cmdheight, 0) + + 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 index 3bfff0a577..d96fc2d789 100644 --- 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 index 0bd84c0269..1fe2a366a5 100644 --- 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 |