mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 19:38:20 +00:00
Merge pull request #19284 from zeertzjq/vim-8.2.0274
vim-patch:8.2.{0274,0325}
This commit is contained in:
@@ -7899,9 +7899,11 @@ void do_exedit(exarg_T *eap, win_T *old_curwin)
|
|||||||
need_wait_return = false;
|
need_wait_return = false;
|
||||||
msg_scroll = 0;
|
msg_scroll = 0;
|
||||||
redraw_all_later(NOT_VALID);
|
redraw_all_later(NOT_VALID);
|
||||||
|
pending_exmode_active = true;
|
||||||
|
|
||||||
normal_enter(false, true);
|
normal_enter(false, true);
|
||||||
|
|
||||||
|
pending_exmode_active = false;
|
||||||
RedrawingDisabled = rd;
|
RedrawingDisabled = rd;
|
||||||
no_wait_return = nwr;
|
no_wait_return = nwr;
|
||||||
msg_scroll = ms;
|
msg_scroll = ms;
|
||||||
|
@@ -2475,6 +2475,11 @@ static int vgetorpeek(bool advance)
|
|||||||
}
|
}
|
||||||
tc = c;
|
tc = c;
|
||||||
|
|
||||||
|
// return 0 in normal_check()
|
||||||
|
if (pending_exmode_active) {
|
||||||
|
exmode_active = true;
|
||||||
|
}
|
||||||
|
|
||||||
// no chars to block abbreviations for
|
// no chars to block abbreviations for
|
||||||
typebuf.tb_no_abbr_cnt = 0;
|
typebuf.tb_no_abbr_cnt = 0;
|
||||||
|
|
||||||
|
@@ -636,6 +636,10 @@ EXTERN int motion_force INIT(=0); // motion force for pending operator
|
|||||||
|
|
||||||
// Ex Mode (Q) state
|
// Ex Mode (Q) state
|
||||||
EXTERN bool exmode_active INIT(= false); // true if Ex mode is active
|
EXTERN bool exmode_active INIT(= false); // true if Ex mode is active
|
||||||
|
|
||||||
|
/// Flag set when normal_check() should return 0 when entering Ex mode.
|
||||||
|
EXTERN bool pending_exmode_active INIT(= false);
|
||||||
|
|
||||||
EXTERN bool ex_no_reprint INIT(=false); // No need to print after z or p.
|
EXTERN bool ex_no_reprint INIT(=false); // No need to print after z or p.
|
||||||
|
|
||||||
// 'inccommand' command preview state
|
// 'inccommand' command preview state
|
||||||
|
@@ -15,6 +15,7 @@ set laststatus=1
|
|||||||
set listchars=eol:$
|
set listchars=eol:$
|
||||||
set joinspaces
|
set joinspaces
|
||||||
set nohidden nosmarttab noautoindent noautoread complete-=i noruler noshowcmd
|
set nohidden nosmarttab noautoindent noautoread complete-=i noruler noshowcmd
|
||||||
|
set nohlsearch noincsearch
|
||||||
set nrformats+=octal
|
set nrformats+=octal
|
||||||
set shortmess-=F
|
set shortmess-=F
|
||||||
set sidescroll=0
|
set sidescroll=0
|
||||||
|
@@ -18,6 +18,11 @@ func Test_complete_list()
|
|||||||
" We can't see the output, but at least we check the code runs properly.
|
" We can't see the output, but at least we check the code runs properly.
|
||||||
call feedkeys(":e test\<C-D>\r", "tx")
|
call feedkeys(":e test\<C-D>\r", "tx")
|
||||||
call assert_equal('test', expand('%:t'))
|
call assert_equal('test', expand('%:t'))
|
||||||
|
|
||||||
|
" If a command doesn't support completion, then CTRL-D should be literally
|
||||||
|
" used.
|
||||||
|
call feedkeys(":chistory \<C-D>\<C-B>\"\<CR>", 'xt')
|
||||||
|
call assert_equal("\"chistory \<C-D>", @:)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_complete_wildmenu()
|
func Test_complete_wildmenu()
|
||||||
@@ -71,6 +76,11 @@ func Test_complete_wildmenu()
|
|||||||
cunmap <C-K>
|
cunmap <C-K>
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Test for canceling the wild menu by adding a character
|
||||||
|
redrawstatus
|
||||||
|
call feedkeys(":e Xdir1/\<Tab>x\<C-B>\"\<CR>", 'xt')
|
||||||
|
call assert_equal('"e Xdir1/Xdir2/x', @:)
|
||||||
|
|
||||||
" Completion using a relative path
|
" Completion using a relative path
|
||||||
cd Xdir1/Xdir2
|
cd Xdir1/Xdir2
|
||||||
call feedkeys(":e ../\<Tab>\<Right>\<Down>\<C-A>\<C-B>\"\<CR>", 'tx')
|
call feedkeys(":e ../\<Tab>\<Right>\<Down>\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||||
@@ -591,6 +601,18 @@ func Test_cmdline_paste()
|
|||||||
" Use an invalid expression for <C-\>e
|
" Use an invalid expression for <C-\>e
|
||||||
call assert_beeps('call feedkeys(":\<C-\>einvalid\<CR>", "tx")')
|
call assert_beeps('call feedkeys(":\<C-\>einvalid\<CR>", "tx")')
|
||||||
|
|
||||||
|
" Try to paste an invalid register using <C-R>
|
||||||
|
call feedkeys(":\"one\<C-R>\<C-X>two\<CR>", 'xt')
|
||||||
|
call assert_equal('"onetwo', @:)
|
||||||
|
|
||||||
|
let @a = "xy\<C-H>z"
|
||||||
|
call feedkeys(":\"\<C-R>a\<CR>", 'xt')
|
||||||
|
call assert_equal('"xz', @:)
|
||||||
|
call feedkeys(":\"\<C-R>\<C-O>a\<CR>", 'xt')
|
||||||
|
call assert_equal("\"xy\<C-H>z", @:)
|
||||||
|
|
||||||
|
call assert_beeps('call feedkeys(":\<C-R>=\<C-R>=\<Esc>", "xt")')
|
||||||
|
|
||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -1226,6 +1248,112 @@ func Test_cmdline_expand_home()
|
|||||||
call delete('Xdir', 'rf')
|
call delete('Xdir', 'rf')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for using CTRL-\ CTRL-G in the command line to go back to normal mode
|
||||||
|
" or insert mode (when 'insertmode' is set)
|
||||||
|
func Test_cmdline_ctrl_g()
|
||||||
|
new
|
||||||
|
call setline(1, 'abc')
|
||||||
|
call cursor(1, 3)
|
||||||
|
" If command line is entered from insert mode, using C-\ C-G should back to
|
||||||
|
" insert mode
|
||||||
|
call feedkeys("i\<C-O>:\<C-\>\<C-G>xy", 'xt')
|
||||||
|
call assert_equal('abxyc', getline(1))
|
||||||
|
call assert_equal(4, col('.'))
|
||||||
|
|
||||||
|
" If command line is entered in 'insertmode', using C-\ C-G should back to
|
||||||
|
" 'insertmode'
|
||||||
|
" call feedkeys(":set im\<cr>\<C-L>:\<C-\>\<C-G>12\<C-L>:set noim\<cr>", 'xt')
|
||||||
|
" call assert_equal('ab12xyc', getline(1))
|
||||||
|
close!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Return the 'len' characters in screen starting from (row,col)
|
||||||
|
func s:ScreenLine(row, col, len)
|
||||||
|
let s = ''
|
||||||
|
for i in range(a:len)
|
||||||
|
let s .= nr2char(screenchar(a:row, a:col + i))
|
||||||
|
endfor
|
||||||
|
return s
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for 'wildmode'
|
||||||
|
func Test_wildmode()
|
||||||
|
func T(a, c, p)
|
||||||
|
return "oneA\noneB\noneC"
|
||||||
|
endfunc
|
||||||
|
command -nargs=1 -complete=custom,T MyCmd
|
||||||
|
|
||||||
|
func SaveScreenLine()
|
||||||
|
let g:Sline = s:ScreenLine(&lines - 1, 1, 20)
|
||||||
|
return ''
|
||||||
|
endfunc
|
||||||
|
cnoremap <expr> <F2> SaveScreenLine()
|
||||||
|
|
||||||
|
set nowildmenu
|
||||||
|
set wildmode=full,list
|
||||||
|
let g:Sline = ''
|
||||||
|
call feedkeys(":MyCmd \t\t\<F2>\<C-B>\"\<CR>", 'xt')
|
||||||
|
call assert_equal('oneA oneB oneC ', g:Sline)
|
||||||
|
call assert_equal('"MyCmd oneA', @:)
|
||||||
|
|
||||||
|
set wildmode=longest,full
|
||||||
|
call feedkeys(":MyCmd o\t\<C-B>\"\<CR>", 'xt')
|
||||||
|
call assert_equal('"MyCmd one', @:)
|
||||||
|
call feedkeys(":MyCmd o\t\t\t\t\<C-B>\"\<CR>", 'xt')
|
||||||
|
call assert_equal('"MyCmd oneC', @:)
|
||||||
|
|
||||||
|
set wildmode=longest
|
||||||
|
call feedkeys(":MyCmd one\t\t\<C-B>\"\<CR>", 'xt')
|
||||||
|
call assert_equal('"MyCmd one', @:)
|
||||||
|
|
||||||
|
set wildmode=list:longest
|
||||||
|
let g:Sline = ''
|
||||||
|
call feedkeys(":MyCmd \t\<F2>\<C-B>\"\<CR>", 'xt')
|
||||||
|
call assert_equal('oneA oneB oneC ', g:Sline)
|
||||||
|
call assert_equal('"MyCmd one', @:)
|
||||||
|
|
||||||
|
set wildmode=""
|
||||||
|
call feedkeys(":MyCmd \t\t\<C-B>\"\<CR>", 'xt')
|
||||||
|
call assert_equal('"MyCmd oneA', @:)
|
||||||
|
|
||||||
|
delcommand MyCmd
|
||||||
|
delfunc T
|
||||||
|
delfunc SaveScreenLine
|
||||||
|
cunmap <F2>
|
||||||
|
set wildmode&
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for interrupting the command-line completion
|
||||||
|
func Test_interrupt_compl()
|
||||||
|
func F(lead, cmdl, p)
|
||||||
|
if a:lead =~ 'tw'
|
||||||
|
call interrupt()
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
return "one\ntwo\nthree"
|
||||||
|
endfunc
|
||||||
|
command -nargs=1 -complete=custom,F Tcmd
|
||||||
|
|
||||||
|
set nowildmenu
|
||||||
|
set wildmode=full
|
||||||
|
let interrupted = 0
|
||||||
|
try
|
||||||
|
call feedkeys(":Tcmd tw\<Tab>\<C-B>\"\<CR>", 'xt')
|
||||||
|
catch /^Vim:Interrupt$/
|
||||||
|
let interrupted = 1
|
||||||
|
endtry
|
||||||
|
call assert_equal(1, interrupted)
|
||||||
|
|
||||||
|
delcommand Tcmd
|
||||||
|
delfunc F
|
||||||
|
set wildmode&
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_cmdline_edit()
|
||||||
|
call feedkeys(":\"buffer\<Right>\<Home>\<Left>\<CR>", 'xt')
|
||||||
|
call assert_equal("\"buffer", @:)
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for normal mode commands not supported in the cmd window
|
" Test for normal mode commands not supported in the cmd window
|
||||||
func Test_cmdwin_blocked_commands()
|
func Test_cmdwin_blocked_commands()
|
||||||
call assert_fails('call feedkeys("q:\<C-T>\<CR>", "xt")', 'E11:')
|
call assert_fails('call feedkeys("q:\<C-T>\<CR>", "xt")', 'E11:')
|
||||||
|
@@ -64,6 +64,23 @@ func Test_ex_mode()
|
|||||||
let &encoding = encoding_save
|
let &encoding = encoding_save
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for :g/pat/visual to run vi commands in Ex mode
|
||||||
|
" This used to hang Vim before 8.2.0274.
|
||||||
|
func Test_Ex_global()
|
||||||
|
new
|
||||||
|
call setline(1, ['', 'foo', 'bar', 'foo', 'bar', 'foo'])
|
||||||
|
call feedkeys("Q\<bs>g/bar/visual\<CR>$rxQ$ryQvisual\<CR>j", "xt")
|
||||||
|
call assert_equal('bax', getline(3))
|
||||||
|
call assert_equal('bay', getline(5))
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" In Ex-mode, a backslash escapes a newline
|
||||||
|
func Test_Ex_escape_enter()
|
||||||
|
call feedkeys("gQlet l = \"a\\\<kEnter>b\"\<cr>vi\<cr>", 'xt')
|
||||||
|
call assert_equal("a\rb", l)
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_ex_mode_errors()
|
func Test_ex_mode_errors()
|
||||||
" Not allowed to enter ex mode when text is locked
|
" Not allowed to enter ex mode when text is locked
|
||||||
au InsertCharPre <buffer> normal! gQ<CR>
|
au InsertCharPre <buffer> normal! gQ<CR>
|
||||||
|
@@ -1218,6 +1218,16 @@ func Test_input_func()
|
|||||||
call assert_fails("call input('F:', '', [])", 'E730:')
|
call assert_fails("call input('F:', '', [])", 'E730:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for the inputdialog() function
|
||||||
|
func Test_inputdialog()
|
||||||
|
CheckNotGui
|
||||||
|
|
||||||
|
call feedkeys(":let v=inputdialog('Q:', 'xx', 'yy')\<CR>\<CR>", 'xt')
|
||||||
|
call assert_equal('xx', v)
|
||||||
|
call feedkeys(":let v=inputdialog('Q:', 'xx', 'yy')\<CR>\<Esc>", 'xt')
|
||||||
|
call assert_equal('yy', v)
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for inputlist()
|
" Test for inputlist()
|
||||||
func Test_inputlist()
|
func Test_inputlist()
|
||||||
call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>1\<cr>", 'tx')
|
call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>1\<cr>", 'tx')
|
||||||
|
@@ -70,6 +70,14 @@ function History_Tests(hist)
|
|||||||
call assert_equal('', histget(a:hist, i))
|
call assert_equal('', histget(a:hist, i))
|
||||||
call assert_equal('', histget(a:hist, i - 7 - 1))
|
call assert_equal('', histget(a:hist, i - 7 - 1))
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
|
" Test for freeing an entry at the beginning of the history list
|
||||||
|
for i in range(1, 4)
|
||||||
|
call histadd(a:hist, 'text_' . i)
|
||||||
|
endfor
|
||||||
|
call histdel(a:hist, 1)
|
||||||
|
call assert_equal('', histget(a:hist, 1))
|
||||||
|
call assert_equal('text_4', histget(a:hist, 4))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function Test_History()
|
function Test_History()
|
||||||
@@ -115,14 +123,14 @@ endfunc
|
|||||||
func Test_history_size()
|
func Test_history_size()
|
||||||
let save_histsz = &history
|
let save_histsz = &history
|
||||||
call histdel(':')
|
call histdel(':')
|
||||||
set history=5
|
set history=10
|
||||||
for i in range(1, 5)
|
for i in range(1, 5)
|
||||||
call histadd(':', 'cmd' .. i)
|
call histadd(':', 'cmd' .. i)
|
||||||
endfor
|
endfor
|
||||||
call assert_equal(5, histnr(':'))
|
call assert_equal(5, histnr(':'))
|
||||||
call assert_equal('cmd5', histget(':', -1))
|
call assert_equal('cmd5', histget(':', -1))
|
||||||
|
|
||||||
set history=10
|
set history=15
|
||||||
for i in range(6, 10)
|
for i in range(6, 10)
|
||||||
call histadd(':', 'cmd' .. i)
|
call histadd(':', 'cmd' .. i)
|
||||||
endfor
|
endfor
|
||||||
@@ -137,6 +145,15 @@ func Test_history_size()
|
|||||||
call assert_equal('cmd7', histget(':', 7))
|
call assert_equal('cmd7', histget(':', 7))
|
||||||
call assert_equal('abc', histget(':', -1))
|
call assert_equal('abc', histget(':', -1))
|
||||||
|
|
||||||
|
" This test works only when the language is English
|
||||||
|
if v:lang == "C" || v:lang =~ '^[Ee]n'
|
||||||
|
set history=0
|
||||||
|
redir => v
|
||||||
|
call feedkeys(":history\<CR>", 'xt')
|
||||||
|
redir END
|
||||||
|
call assert_equal(["'history' option is zero"], split(v, "\n"))
|
||||||
|
endif
|
||||||
|
|
||||||
let &history=save_histsz
|
let &history=save_histsz
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -158,4 +175,12 @@ func Test_history_search()
|
|||||||
delfunc SavePat
|
delfunc SavePat
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for making sure the key value is not stored in history
|
||||||
|
func Test_history_crypt_key()
|
||||||
|
CheckFeature cryptv
|
||||||
|
call feedkeys(":set bs=2 key=abc ts=8\<CR>", 'xt')
|
||||||
|
call assert_equal('set bs=2 key= ts=8', histget(':'))
|
||||||
|
set key& bs& ts&
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -752,6 +752,29 @@ func Test_shellquote()
|
|||||||
call assert_match(': "#echo Hello#"', v)
|
call assert_match(': "#echo Hello#"', v)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for the 'rightleftcmd' option
|
||||||
|
func Test_rightleftcmd()
|
||||||
|
CheckFeature rightleft
|
||||||
|
set rightleft
|
||||||
|
set rightleftcmd
|
||||||
|
|
||||||
|
let g:l = []
|
||||||
|
func AddPos()
|
||||||
|
call add(g:l, screencol())
|
||||||
|
return ''
|
||||||
|
endfunc
|
||||||
|
cmap <expr> <F2> AddPos()
|
||||||
|
|
||||||
|
call feedkeys("/\<F2>abc\<Left>\<F2>\<Right>\<Right>\<F2>" ..
|
||||||
|
\ "\<Left>\<F2>\<Esc>", 'xt')
|
||||||
|
call assert_equal([&co - 1, &co - 4, &co - 2, &co - 3], g:l)
|
||||||
|
|
||||||
|
cunmap <F2>
|
||||||
|
unlet g:l
|
||||||
|
set rightleftcmd&
|
||||||
|
set rightleft&
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Test for setting option values using v:false and v:true
|
" Test for setting option values using v:false and v:true
|
||||||
func Test_opt_boolean()
|
func Test_opt_boolean()
|
||||||
set number&
|
set number&
|
||||||
|
Reference in New Issue
Block a user