mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #19284 from zeertzjq/vim-8.2.0274
vim-patch:8.2.{0274,0325}
This commit is contained in:
commit
798acbca1b
@ -7899,9 +7899,11 @@ void do_exedit(exarg_T *eap, win_T *old_curwin)
|
||||
need_wait_return = false;
|
||||
msg_scroll = 0;
|
||||
redraw_all_later(NOT_VALID);
|
||||
pending_exmode_active = true;
|
||||
|
||||
normal_enter(false, true);
|
||||
|
||||
pending_exmode_active = false;
|
||||
RedrawingDisabled = rd;
|
||||
no_wait_return = nwr;
|
||||
msg_scroll = ms;
|
||||
|
@ -2475,6 +2475,11 @@ static int vgetorpeek(bool advance)
|
||||
}
|
||||
tc = c;
|
||||
|
||||
// return 0 in normal_check()
|
||||
if (pending_exmode_active) {
|
||||
exmode_active = true;
|
||||
}
|
||||
|
||||
// no chars to block abbreviations for
|
||||
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
|
||||
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.
|
||||
|
||||
// 'inccommand' command preview state
|
||||
|
@ -15,6 +15,7 @@ set laststatus=1
|
||||
set listchars=eol:$
|
||||
set joinspaces
|
||||
set nohidden nosmarttab noautoindent noautoread complete-=i noruler noshowcmd
|
||||
set nohlsearch noincsearch
|
||||
set nrformats+=octal
|
||||
set shortmess-=F
|
||||
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.
|
||||
call feedkeys(":e test\<C-D>\r", "tx")
|
||||
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
|
||||
|
||||
func Test_complete_wildmenu()
|
||||
@ -71,6 +76,11 @@ func Test_complete_wildmenu()
|
||||
cunmap <C-K>
|
||||
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
|
||||
cd Xdir1/Xdir2
|
||||
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
|
||||
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!
|
||||
endfunc
|
||||
|
||||
@ -1226,6 +1248,112 @@ func Test_cmdline_expand_home()
|
||||
call delete('Xdir', 'rf')
|
||||
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
|
||||
func Test_cmdwin_blocked_commands()
|
||||
call assert_fails('call feedkeys("q:\<C-T>\<CR>", "xt")', 'E11:')
|
||||
|
@ -64,6 +64,23 @@ func Test_ex_mode()
|
||||
let &encoding = encoding_save
|
||||
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()
|
||||
" Not allowed to enter ex mode when text is locked
|
||||
au InsertCharPre <buffer> normal! gQ<CR>
|
||||
|
@ -1218,6 +1218,16 @@ func Test_input_func()
|
||||
call assert_fails("call input('F:', '', [])", 'E730:')
|
||||
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()
|
||||
func Test_inputlist()
|
||||
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 - 7 - 1))
|
||||
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
|
||||
|
||||
function Test_History()
|
||||
@ -115,14 +123,14 @@ endfunc
|
||||
func Test_history_size()
|
||||
let save_histsz = &history
|
||||
call histdel(':')
|
||||
set history=5
|
||||
set history=10
|
||||
for i in range(1, 5)
|
||||
call histadd(':', 'cmd' .. i)
|
||||
endfor
|
||||
call assert_equal(5, histnr(':'))
|
||||
call assert_equal('cmd5', histget(':', -1))
|
||||
|
||||
set history=10
|
||||
set history=15
|
||||
for i in range(6, 10)
|
||||
call histadd(':', 'cmd' .. i)
|
||||
endfor
|
||||
@ -137,6 +145,15 @@ func Test_history_size()
|
||||
call assert_equal('cmd7', histget(':', 7))
|
||||
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
|
||||
endfunc
|
||||
|
||||
@ -158,4 +175,12 @@ func Test_history_search()
|
||||
delfunc SavePat
|
||||
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
|
||||
|
@ -752,6 +752,29 @@ func Test_shellquote()
|
||||
call assert_match(': "#echo Hello#"', v)
|
||||
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
|
||||
func Test_opt_boolean()
|
||||
set number&
|
||||
|
Loading…
Reference in New Issue
Block a user