patch 8.1.0870: Vim doesn't use the new ConPTY support in Windows 10
Problem: Vim doesn't use the new ConPTY support in Windows 10.
Solution: Use ConPTY support, if available. (Nobuhiro Takasaki, closes #3794)
diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/gen_opt_test.vim
index c0e89cf..8c75d37 100644
--- a/src/testdir/gen_opt_test.vim
+++ b/src/testdir/gen_opt_test.vim
@@ -131,6 +131,7 @@
\ 'term': [[], []],
\ 'termguicolors': [[], []],
\ 'termencoding': [has('gui_gtk') ? [] : ['', 'utf-8'], ['xxx']],
+ \ 'termmode': [['', 'winpty', 'conpty'], ['xxx']],
\ 'termwinsize': [['', '24x80', '0x80', '32x0', '0x0'], ['xxx', '80', '8ax9', '24x80b']],
\ 'toolbar': [['', 'icons', 'text'], ['xxx']],
\ 'toolbariconsize': [['', 'tiny', 'huge'], ['xxx']],
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 9e8a02c..71df515 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -1397,7 +1397,13 @@
let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile'], {'term_rows': 3})
call assert_equal('running', term_getstatus(buf))
" Wait for the ruler (in the status line) to be shown.
- call WaitForAssert({-> assert_match('\<All$', term_getline(buf, 3))})
+ " In ConPTY, there is additional character which is drawn up to the width of
+ " the screen.
+ if has('conpty')
+ call WaitForAssert({-> assert_match('\<All.*$', term_getline(buf, 3))})
+ else
+ call WaitForAssert({-> assert_match('\<All$', term_getline(buf, 3))})
+ endif
" It's only adding autocmd, so that no event occurs.
call term_sendkeys(buf, ":au! TextChanged <buffer> call writefile(['No'], 'Xchanged.txt')\<cr>")
call term_sendkeys(buf, "\<C-\\>\<C-N>:qa!\<cr>")
diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim
index 3038422..456cd1e 100644
--- a/src/testdir/test_mksession.vim
+++ b/src/testdir/test_mksession.vim
@@ -295,7 +295,7 @@
call assert_report('unexpected shell line: ' . line)
endif
endfor
- call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+\s*$', term_cmd)
+ call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+\s*.*$', term_cmd)
call Stop_shell_in_terminal(bufnr('%'))
call delete('Xtest_mks.out')
@@ -375,7 +375,7 @@
let term_cmd = line
endif
endfor
- call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+ other', term_cmd)
+ call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+.*other', term_cmd)
call Stop_shell_in_terminal(bufnr('%'))
call delete('Xtest_mks.out')
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 698da04..8eb43a0 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -39,8 +39,11 @@
call assert_match('^/dev/', job_info(g:job).tty_out)
call assert_match('^/dev/', term_gettty(''))
else
- call assert_match('^\\\\.\\pipe\\', job_info(g:job).tty_out)
- call assert_match('^\\\\.\\pipe\\', term_gettty(''))
+ " ConPTY works on anonymous pipe.
+ if !has('conpty')
+ call assert_match('^\\\\.\\pipe\\', job_info(g:job).tty_out)
+ call assert_match('^\\\\.\\pipe\\', term_gettty(''))
+ endif
endif
call assert_equal('t', mode())
call assert_equal('yes', b:done)
@@ -129,7 +132,12 @@
func Get_cat_123_cmd()
if has('win32')
- return 'cmd /c "cls && color 2 && echo 123"'
+ if !has('conpty')
+ return 'cmd /c "cls && color 2 && echo 123"'
+ else
+ " When clearing twice, extra sequence is not output.
+ return 'cmd /c "cls && cls && color 2 && echo 123"'
+ endif
else
call writefile(["\<Esc>[32m123"], 'Xtext')
return "cat Xtext"
@@ -143,8 +151,8 @@
call WaitForAssert({-> assert_equal("dead", job_status(g:job))})
call WaitForAssert({-> assert_equal(0, g:buf)})
- unlet g:buf
unlet g:job
+ unlet g:buf
call delete('Xtext')
endfunc
@@ -563,6 +571,9 @@
" The shell or something else has a problem dealing with more than 1000
" characters at the same time.
let len = 1000
+ " NPFS is used in Windows, nonblocking mode does not work properly.
+ elseif has('win32')
+ let len = 1
else
let len = 5000
endif
@@ -693,8 +704,11 @@
let cmd = Get_cat_123_cmd()
let buf = term_start(cmd, {'out_io': 'file', 'out_name': 'Xfile'})
call term_wait(buf)
- call WaitForAssert({-> assert_notequal(0, len(readfile("Xfile")))})
- call assert_match('123', readfile('Xfile')[0])
+ " ConPTY may precede escape sequence. There are things that are not so.
+ if !has('conpty')
+ call WaitForAssert({-> assert_notequal(0, len(readfile("Xfile")))})
+ call assert_match('123', readfile('Xfile')[0])
+ endif
let g:job = term_getjob(buf)
call WaitForAssert({-> assert_equal("dead", job_status(g:job))})
call delete('Xfile')
@@ -1661,6 +1675,10 @@
endfunc
func Test_terminal_does_not_truncate_last_newlines()
+ " This test does not pass through ConPTY.
+ if has('conpty')
+ return
+ endif
let contents = [
\ [ 'One', '', 'X' ],
\ [ 'Two', '', '' ],