mirror of
https://github.com/neovim/neovim.git
synced 2024-12-22 12:15:06 -07:00
win_redr_status(): skip if wildmenu is showing
This might be too coarse, but it passes all tests ... A more nuanced approach might be: only skip the windows whose statuslines are overwritten by the wildmenu. Closes #2255 Closes #7108 vim-patch:8.0.0710 N/A because of the changes in this commit.
This commit is contained in:
parent
55c0401dfd
commit
c695443727
@ -86,6 +86,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "nvim/log.h"
|
||||
#include "nvim/vim.h"
|
||||
#include "nvim/ascii.h"
|
||||
#include "nvim/arabic.h"
|
||||
@ -4874,11 +4875,14 @@ void win_redr_status(win_T *wp)
|
||||
int this_ru_col;
|
||||
static int busy = FALSE;
|
||||
|
||||
/* It's possible to get here recursively when 'statusline' (indirectly)
|
||||
* invokes ":redrawstatus". Simply ignore the call then. */
|
||||
if (busy)
|
||||
// May get here recursively when 'statusline' (indirectly)
|
||||
// invokes ":redrawstatus". Simply ignore the call then.
|
||||
if (busy
|
||||
// Also ignore if wildmenu is showing.
|
||||
|| (wild_menu_showing != 0 && !ui_is_external(kUIWildmenu))) {
|
||||
return;
|
||||
busy = TRUE;
|
||||
}
|
||||
busy = true;
|
||||
|
||||
wp->w_redr_status = FALSE;
|
||||
if (wp->w_status_height == 0) {
|
||||
@ -6441,13 +6445,11 @@ void setcursor(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* insert 'line_count' lines at 'row' in window 'wp'
|
||||
* if 'invalid' is TRUE the wp->w_lines[].wl_lnum is invalidated.
|
||||
* if 'mayclear' is TRUE the screen will be cleared if it is faster than
|
||||
* scrolling.
|
||||
* Returns FAIL if the lines are not inserted, OK for success.
|
||||
*/
|
||||
/// Insert 'line_count' lines at 'row' in window 'wp'.
|
||||
/// If 'invalid' is TRUE the wp->w_lines[].wl_lnum is invalidated.
|
||||
/// If 'mayclear' is TRUE the screen will be cleared if it is faster than
|
||||
/// scrolling.
|
||||
/// Returns FAIL if the lines are not inserted, OK for success.
|
||||
int win_ins_lines(win_T *wp, int row, int line_count, int invalid, int mayclear)
|
||||
{
|
||||
int did_delete;
|
||||
@ -6510,13 +6512,11 @@ int win_ins_lines(win_T *wp, int row, int line_count, int invalid, int mayclear)
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* delete "line_count" window lines at "row" in window "wp"
|
||||
* If "invalid" is TRUE curwin->w_lines[] is invalidated.
|
||||
* If "mayclear" is TRUE the screen will be cleared if it is faster than
|
||||
* scrolling
|
||||
* Return OK for success, FAIL if the lines are not deleted.
|
||||
*/
|
||||
/// Delete "line_count" window lines at "row" in window "wp".
|
||||
/// If "invalid" is TRUE curwin->w_lines[] is invalidated.
|
||||
/// If "mayclear" is TRUE the screen will be cleared if it is faster than
|
||||
/// scrolling
|
||||
/// Return OK for success, FAIL if the lines are not deleted.
|
||||
int win_del_lines(win_T *wp, int row, int line_count, int invalid, int mayclear)
|
||||
{
|
||||
int retval;
|
||||
|
@ -77,6 +77,229 @@ static char *features[] = {
|
||||
|
||||
// clang-format off
|
||||
static const int included_patches[] = {
|
||||
// 875,
|
||||
// 874,
|
||||
// 873,
|
||||
// 872,
|
||||
// 871,
|
||||
// 870,
|
||||
// 869,
|
||||
// 868,
|
||||
// 867,
|
||||
// 866,
|
||||
// 865,
|
||||
// 864,
|
||||
// 863,
|
||||
// 862,
|
||||
// 861,
|
||||
// 860,
|
||||
// 859,
|
||||
// 858,
|
||||
// 857,
|
||||
// 856,
|
||||
// 855,
|
||||
// 854,
|
||||
// 853,
|
||||
// 852,
|
||||
// 851,
|
||||
// 850,
|
||||
// 849,
|
||||
// 848,
|
||||
// 847,
|
||||
// 846,
|
||||
// 845,
|
||||
// 844,
|
||||
// 843,
|
||||
// 842,
|
||||
// 841,
|
||||
// 840,
|
||||
// 839,
|
||||
// 838,
|
||||
// 837,
|
||||
// 836,
|
||||
// 835,
|
||||
// 834,
|
||||
// 833,
|
||||
// 832,
|
||||
// 831,
|
||||
// 830,
|
||||
// 829,
|
||||
// 828,
|
||||
// 827,
|
||||
// 826,
|
||||
// 825,
|
||||
// 824,
|
||||
// 823,
|
||||
// 822,
|
||||
// 821,
|
||||
// 820,
|
||||
// 819,
|
||||
// 818,
|
||||
// 817,
|
||||
// 816,
|
||||
// 815,
|
||||
// 814,
|
||||
// 813,
|
||||
// 812,
|
||||
// 811,
|
||||
// 810,
|
||||
// 809,
|
||||
// 808,
|
||||
// 807,
|
||||
// 806,
|
||||
// 805,
|
||||
// 804,
|
||||
// 803,
|
||||
// 802,
|
||||
// 801,
|
||||
// 800,
|
||||
// 799,
|
||||
// 798,
|
||||
// 797,
|
||||
// 796,
|
||||
// 795,
|
||||
// 794,
|
||||
// 793,
|
||||
// 792,
|
||||
// 791,
|
||||
// 790,
|
||||
// 789,
|
||||
// 788,
|
||||
// 787,
|
||||
// 786,
|
||||
// 785,
|
||||
// 784,
|
||||
// 783,
|
||||
// 782,
|
||||
// 781,
|
||||
// 780,
|
||||
// 779,
|
||||
// 778,
|
||||
// 777,
|
||||
// 776,
|
||||
// 775,
|
||||
// 774,
|
||||
// 773,
|
||||
// 772,
|
||||
// 771,
|
||||
// 770,
|
||||
// 769,
|
||||
// 768,
|
||||
// 767,
|
||||
// 766,
|
||||
// 765,
|
||||
// 764,
|
||||
// 763,
|
||||
// 762,
|
||||
// 761,
|
||||
// 760,
|
||||
// 759,
|
||||
// 758,
|
||||
// 757,
|
||||
// 756,
|
||||
// 755,
|
||||
// 754,
|
||||
// 753,
|
||||
// 752,
|
||||
// 751,
|
||||
// 750,
|
||||
// 749,
|
||||
// 748,
|
||||
// 747,
|
||||
// 746,
|
||||
// 745,
|
||||
// 744,
|
||||
// 743,
|
||||
// 742,
|
||||
// 741,
|
||||
// 740,
|
||||
// 739,
|
||||
// 738,
|
||||
// 737,
|
||||
// 736,
|
||||
// 735,
|
||||
// 734,
|
||||
// 733,
|
||||
// 732,
|
||||
// 731,
|
||||
// 730,
|
||||
// 729,
|
||||
// 728,
|
||||
// 727,
|
||||
// 726,
|
||||
// 725,
|
||||
// 724,
|
||||
// 723,
|
||||
// 722,
|
||||
// 721,
|
||||
// 720,
|
||||
// 719,
|
||||
// 718,
|
||||
// 717,
|
||||
// 716,
|
||||
// 715,
|
||||
// 714,
|
||||
// 713,
|
||||
// 712,
|
||||
// 711,
|
||||
710,
|
||||
// 709,
|
||||
// 708,
|
||||
// 707,
|
||||
// 706,
|
||||
// 705,
|
||||
// 704,
|
||||
// 703,
|
||||
// 702,
|
||||
// 701,
|
||||
// 700,
|
||||
// 699,
|
||||
// 698,
|
||||
// 697,
|
||||
// 696,
|
||||
// 695,
|
||||
// 694,
|
||||
// 693,
|
||||
// 692,
|
||||
// 691,
|
||||
// 690,
|
||||
// 689,
|
||||
// 688,
|
||||
// 687,
|
||||
// 686,
|
||||
// 685,
|
||||
// 684,
|
||||
// 683,
|
||||
// 682,
|
||||
// 681,
|
||||
// 680,
|
||||
// 679,
|
||||
// 678,
|
||||
// 677,
|
||||
// 676,
|
||||
// 675,
|
||||
// 674,
|
||||
// 673,
|
||||
// 672,
|
||||
// 671,
|
||||
// 670,
|
||||
// 669,
|
||||
// 668,
|
||||
// 667,
|
||||
// 666,
|
||||
// 665,
|
||||
// 664,
|
||||
// 663,
|
||||
// 662,
|
||||
// 661,
|
||||
// 660,
|
||||
// 659,
|
||||
// 658,
|
||||
// 657,
|
||||
// 656,
|
||||
// 655,
|
||||
// 654,
|
||||
// 653,
|
||||
652,
|
||||
// 651,
|
||||
// 650,
|
||||
|
@ -1,57 +1,133 @@
|
||||
local helpers = require('test.functional.helpers')(after_each)
|
||||
local Screen = require('test.functional.ui.screen')
|
||||
local clear, feed, command = helpers.clear, helpers.feed, helpers.command
|
||||
local iswin, set_shell_powershell = helpers.iswin, helpers.set_shell_powershell
|
||||
local nvim_dir = helpers.nvim_dir
|
||||
local funcs = helpers.funcs
|
||||
local eq = helpers.eq
|
||||
local eval = helpers.eval
|
||||
local retry = helpers.retry
|
||||
|
||||
if helpers.pending_win32(pending) then return end
|
||||
|
||||
describe("'wildmode'", function()
|
||||
describe("'wildmenu'", function()
|
||||
local screen
|
||||
|
||||
before_each(function()
|
||||
clear()
|
||||
screen = Screen.new(25, 5)
|
||||
screen:attach()
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
screen:detach()
|
||||
end)
|
||||
|
||||
describe("'wildmenu'", function()
|
||||
it(':sign <tab> shows wildmenu completions', function()
|
||||
command('set wildmode=full')
|
||||
command('set wildmenu')
|
||||
feed(':sign <tab>')
|
||||
screen:expect([[
|
||||
|
|
||||
~ |
|
||||
~ |
|
||||
define jump list > |
|
||||
:sign define^ |
|
||||
]])
|
||||
it(':sign <tab> shows wildmenu completions', function()
|
||||
command('set wildmode=full')
|
||||
command('set wildmenu')
|
||||
feed(':sign <tab>')
|
||||
screen:expect([[
|
||||
|
|
||||
~ |
|
||||
~ |
|
||||
define jump list > |
|
||||
:sign define^ |
|
||||
]])
|
||||
end)
|
||||
|
||||
it('does not crash after cycling back to original text', function()
|
||||
command('set wildmode=full')
|
||||
feed(':j<Tab><Tab><Tab>')
|
||||
screen:expect([[
|
||||
|
|
||||
~ |
|
||||
~ |
|
||||
join jumps |
|
||||
:j^ |
|
||||
]])
|
||||
-- This would cause nvim to crash before #6650
|
||||
feed('<BS><Tab>')
|
||||
screen:expect([[
|
||||
|
|
||||
~ |
|
||||
~ |
|
||||
! # & < = > @ > |
|
||||
:!^ |
|
||||
]])
|
||||
end)
|
||||
|
||||
it('is preserved during :terminal activity', function()
|
||||
-- Because this test verifies a _lack_ of activity after screen:sleep(), we
|
||||
-- must wait the full timeout. So make it reasonable.
|
||||
screen.timeout = 1000
|
||||
|
||||
command('set wildmenu wildmode=full')
|
||||
command('set scrollback=4')
|
||||
if iswin() then
|
||||
if helpers.pending_win32(pending) then return end
|
||||
-- feed([[:terminal 1,2,3,4,5 | foreach-object -process {echo $_; sleep 0.1}]])
|
||||
else
|
||||
feed([[:terminal for i in $(seq 1 5000); do printf 'foo\nfoo\nfoo\n'; sleep 0.1; done<cr>]])
|
||||
end
|
||||
screen:sleep(50) -- Allow some output.
|
||||
feed([[<C-\><C-N>gg]])
|
||||
feed([[:sign <Tab>]]) -- Invoke wildmenu.
|
||||
screen:sleep(50) -- Allow some output.
|
||||
screen:expect([[
|
||||
foo |
|
||||
foo |
|
||||
foo |
|
||||
define jump list > |
|
||||
:sign define^ |
|
||||
]])
|
||||
end)
|
||||
|
||||
it('ignores :redrawstatus called from a timer #7108', function()
|
||||
-- Because this test verifies a _lack_ of activity after screen:sleep(), we
|
||||
-- must wait the full timeout. So make it reasonable.
|
||||
screen.timeout = 1000
|
||||
|
||||
command('set wildmenu wildmode=full')
|
||||
command([[call timer_start(10, {->execute('redrawstatus')}, {'repeat':-1})]])
|
||||
feed([[<C-\><C-N>]])
|
||||
feed([[:sign <Tab>]]) -- Invoke wildmenu.
|
||||
screen:sleep(30) -- Allow some timer activity.
|
||||
screen:expect([[
|
||||
|
|
||||
~ |
|
||||
~ |
|
||||
define jump list > |
|
||||
:sign define^ |
|
||||
]])
|
||||
end)
|
||||
|
||||
it('with laststatus=0, :vsplit, :term #2255', function()
|
||||
-- Because this test verifies a _lack_ of activity after screen:sleep(), we
|
||||
-- must wait the full timeout. So make it reasonable.
|
||||
screen.timeout = 1000
|
||||
|
||||
if iswin() then
|
||||
set_shell_powershell()
|
||||
else
|
||||
command('set shell=sh')
|
||||
end
|
||||
|
||||
command('set laststatus=0')
|
||||
command('vsplit')
|
||||
command('term')
|
||||
|
||||
-- Check for a shell prompt to verify that the terminal loaded.
|
||||
retry(nil, nil, function()
|
||||
if iswin() then
|
||||
eq('PS', eval("matchstr(join(getline(1, '$')), 'PS')"))
|
||||
else
|
||||
eq('$', eval([[matchstr(getline(1), '\$')]]))
|
||||
end
|
||||
end)
|
||||
|
||||
it('does not crash after cycling back to original text', function()
|
||||
command('set wildmode=full')
|
||||
feed(':j<Tab><Tab><Tab>')
|
||||
screen:expect([[
|
||||
|
|
||||
~ |
|
||||
~ |
|
||||
join jumps |
|
||||
:j^ |
|
||||
]])
|
||||
-- This would cause nvim to crash before #6650
|
||||
feed('<BS><Tab>')
|
||||
screen:expect([[
|
||||
|
|
||||
~ |
|
||||
~ |
|
||||
! # & < = > @ > |
|
||||
:!^ |
|
||||
]])
|
||||
end)
|
||||
feed([[<C-\><C-N>]])
|
||||
feed([[:<Tab>]]) -- Invoke wildmenu.
|
||||
screen:sleep(10) -- Flush
|
||||
-- Check only the last 2 lines, because the shell output is
|
||||
-- system-dependent.
|
||||
screen:expect('! # & < = > @ > \n:!^', nil, nil, nil, true)
|
||||
end)
|
||||
end)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user