Patch 8.1.0815
Problem: Dialog for file changed outside of Vim not tested.
Solution: Add a test. Move FileChangedShell test. Add 'L' flag to
feedkeys().
Files: src/testdir/test_autocmd.vim, src/testdir/test_filechanged.vim,
src/testdir/Make_all.mak, src/evalfunc.c, runtime/doc/eval.txt
*** ../vim-8.1.0814/src/testdir/test_autocmd.vim 2019-01-24
19:37:35.912390940 +0100
--- src/testdir/test_autocmd.vim 2019-01-24 20:33:47.524044208 +0100
***************
*** 1386,1477 ****
bwipe!
endfunc
! func Test_FileChangedShell_reload()
! if !has('unix')
! return
! endif
! augroup testreload
! au FileChangedShell Xchanged let g:reason = v:fcs_reason | let
v:fcs_choice = 'reload'
! augroup END
! new Xchanged
! call setline(1, 'reload this')
! write
! " Need to wait until the timestamp would change by at least a second.
! sleep 2
! silent !echo 'extra line' >>Xchanged
! checktime
! call assert_equal('changed', g:reason)
! call assert_equal(2, line('$'))
! call assert_equal('extra line', getline(2))
!
! " Only triggers once
! let g:reason = ''
! checktime
! call assert_equal('', g:reason)
!
! " When deleted buffer is not reloaded
! silent !rm Xchanged
! let g:reason = ''
! checktime
! call assert_equal('deleted', g:reason)
! call assert_equal(2, line('$'))
! call assert_equal('extra line', getline(2))
!
! " When recreated buffer is reloaded
! call setline(1, 'buffer is changed')
! silent !echo 'new line' >>Xchanged
! let g:reason = ''
! checktime
! call assert_equal('conflict', g:reason)
! call assert_equal(1, line('$'))
! call assert_equal('new line', getline(1))
!
! " Only mode changed
! silent !chmod +x Xchanged
! let g:reason = ''
! checktime
! call assert_equal('mode', g:reason)
! call assert_equal(1, line('$'))
! call assert_equal('new line', getline(1))
!
! " Only time changed
! sleep 2
! silent !touch Xchanged
! let g:reason = ''
! checktime
! call assert_equal('time', g:reason)
! call assert_equal(1, line('$'))
! call assert_equal('new line', getline(1))
!
! if has('persistent_undo')
! " With an undo file the reload can be undone and a change before the
! " reload.
! set undofile
! call setline(2, 'before write')
! write
! call setline(2, 'after write')
! sleep 2
! silent !echo 'different line' >>Xchanged
! let g:reason = ''
! checktime
! call assert_equal('conflict', g:reason)
! call assert_equal(3, line('$'))
! call assert_equal('before write', getline(2))
! call assert_equal('different line', getline(3))
! " undo the reload
! undo
! call assert_equal(2, line('$'))
! call assert_equal('after write', getline(2))
! " undo the change before reload
! undo
! call assert_equal(2, line('$'))
! call assert_equal('before write', getline(2))
!
! set noundofile
! endif
!
!
! au! testreload
! bwipe!
! call delete('Xchanged')
! endfunc
--- 1386,1389 ----
bwipe!
endfunc
! " FileChangedShell tested in test_filechanged.vim
*** ../vim-8.1.0814/src/testdir/test_filechanged.vim 2019-01-24
21:53:43.128252985 +0100
--- src/testdir/test_filechanged.vim 2019-01-24 21:49:33.022078243 +0100
***************
*** 0 ****
--- 1,146 ----
+ " Tests for when a file was changed outside of Vim.
+
+ func Test_FileChangedShell_reload()
+ if !has('unix')
+ return
+ endif
+ augroup testreload
+ au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let
v:fcs_choice = 'reload'
+ augroup END
+ new Xchanged_r
+ call setline(1, 'reload this')
+ write
+ " Need to wait until the timestamp would change by at least a second.
+ sleep 2
+ silent !echo 'extra line' >>Xchanged_r
+ checktime
+ call assert_equal('changed', g:reason)
+ call assert_equal(2, line('$'))
+ call assert_equal('extra line', getline(2))
+
+ " Only triggers once
+ let g:reason = ''
+ checktime
+ call assert_equal('', g:reason)
+
+ " When deleted buffer is not reloaded
+ silent !rm Xchanged_r
+ let g:reason = ''
+ checktime
+ call assert_equal('deleted', g:reason)
+ call assert_equal(2, line('$'))
+ call assert_equal('extra line', getline(2))
+
+ " When recreated buffer is reloaded
+ call setline(1, 'buffer is changed')
+ silent !echo 'new line' >>Xchanged_r
+ let g:reason = ''
+ checktime
+ call assert_equal('conflict', g:reason)
+ call assert_equal(1, line('$'))
+ call assert_equal('new line', getline(1))
+
+ " Only mode changed
+ silent !chmod +x Xchanged_r
+ let g:reason = ''
+ checktime
+ call assert_equal('mode', g:reason)
+ call assert_equal(1, line('$'))
+ call assert_equal('new line', getline(1))
+
+ " Only time changed
+ sleep 2
+ silent !touch Xchanged_r
+ let g:reason = ''
+ checktime
+ call assert_equal('time', g:reason)
+ call assert_equal(1, line('$'))
+ call assert_equal('new line', getline(1))
+
+ if has('persistent_undo')
+ " With an undo file the reload can be undone and a change before the
+ " reload.
+ set undofile
+ call setline(2, 'before write')
+ write
+ call setline(2, 'after write')
+ sleep 2
+ silent !echo 'different line' >>Xchanged_r
+ let g:reason = ''
+ checktime
+ call assert_equal('conflict', g:reason)
+ call assert_equal(3, line('$'))
+ call assert_equal('before write', getline(2))
+ call assert_equal('different line', getline(3))
+ " undo the reload
+ undo
+ call assert_equal(2, line('$'))
+ call assert_equal('after write', getline(2))
+ " undo the change before reload
+ undo
+ call assert_equal(2, line('$'))
+ call assert_equal('before write', getline(2))
+
+ set noundofile
+ endif
+
+ au! testreload
+ bwipe!
+ call delete('Xchanged_r')
+ endfunc
+
+ func Test_file_changed_dialog()
+ if !has('unix')
+ return
+ endif
+ au! FileChangedShell
+
+ new Xchanged_d
+ call setline(1, 'reload this')
+ write
+ " Need to wait until the timestamp would change by at least a second.
+ sleep 2
+ silent !echo 'extra line' >>Xchanged_d
+ call feedkeys('L', 'L')
+ checktime
+ call assert_match('W11:', v:warningmsg)
+ call assert_equal(2, line('$'))
+ call assert_equal('reload this', getline(1))
+ call assert_equal('extra line', getline(2))
+
+ " delete buffer, only shows an error, no prompt
+ silent !rm Xchanged_d
+ checktime
+ call assert_match('E211:', v:warningmsg)
+ call assert_equal(2, line('$'))
+ call assert_equal('extra line', getline(2))
+
+ " Recreate buffer and reload
+ call setline(1, 'buffer is changed')
+ silent !echo 'new line' >Xchanged_d
+ call feedkeys('L', 'L')
+ checktime
+ call assert_match('W12:', v:warningmsg)
+ call assert_equal(1, line('$'))
+ call assert_equal('new line', getline(1))
+
+ " Only mode changed, reload
+ silent !chmod +x Xchanged_d
+ call feedkeys('L', 'L')
+ checktime
+ call assert_match('W16:', v:warningmsg)
+ call assert_equal(1, line('$'))
+ call assert_equal('new line', getline(1))
+
+ " Only time changed, no prompt
+ sleep 2
+ silent !touch Xchanged_d
+ let v:warningmsg = ''
+ checktime
+ call assert_equal('', v:warningmsg)
+ call assert_equal(1, line('$'))
+ call assert_equal('new line', getline(1))
+
+ bwipe!
+ call delete('Xchanged_d')
+ endfunc
*** ../vim-8.1.0814/src/testdir/Make_all.mak 2019-01-17 13:04:05.765227482
+0100
--- src/testdir/Make_all.mak 2019-01-24 20:39:55.069040398 +0100
***************
*** 121,126 ****
--- 121,127 ----
test_feedkeys \
test_file_perm \
test_file_size \
+ test_filechanged \
test_fileformat \
test_filetype \
test_filter_cmd \
***************
*** 316,321 ****
--- 317,323 ----
test_exit.res \
test_farsi.res \
test_file_size.res \
+ test_filechanged.res \
test_find_complete.res \
test_fixeol.res \
test_fnameescape.res \
*** ../vim-8.1.0814/src/evalfunc.c 2019-01-24 15:04:44.666887862 +0100
--- src/evalfunc.c 2019-01-24 21:24:30.371463057 +0100
***************
*** 3674,3679 ****
--- 3674,3680 ----
int typed = FALSE;
int execute = FALSE;
int dangerous = FALSE;
+ int lowlevel = FALSE;
char_u *keys_esc;
/* This is not allowed in the sandbox. If the commands would still be
***************
*** 3697,3702 ****
--- 3698,3704 ----
case 'i': insert = TRUE; break;
case 'x': execute = TRUE; break;
case '!': dangerous = TRUE; break;
+ case 'L': lowlevel = TRUE; break;
}
}
}
***************
*** 3708,3714 ****
keys_esc = vim_strsave_escape_csi(keys);
if (keys_esc != NULL)
{
! ins_typebuf(keys_esc, (remap ? REMAP_YES : REMAP_NONE),
insert ? 0 : typebuf.tb_len, !typed, FALSE);
vim_free(keys_esc);
if (vgetc_busy
--- 3710,3725 ----
keys_esc = vim_strsave_escape_csi(keys);
if (keys_esc != NULL)
{
! if (lowlevel)
! {
! #ifdef USE_INPUT_BUF
! add_to_input_buf(keys, (int)STRLEN(keys));
! #else
! emsg(_("E980: lowlevel input not supported"));
! #endif
! }
! else
! ins_typebuf(keys_esc, (remap ? REMAP_YES : REMAP_NONE),
insert ? 0 : typebuf.tb_len, !typed, FALSE);
vim_free(keys_esc);
if (vgetc_busy
*** ../vim-8.1.0814/runtime/doc/eval.txt 2019-01-23 21:14:59.165314597
+0100
--- runtime/doc/eval.txt 2019-01-24 21:26:05.667078878 +0100
***************
*** 4084,4107 ****
feedkeys({string} [, {mode}]) *feedkeys()*
Characters in {string} are queued for processing as if they
come from a mapping or were typed by the user.
By default the string is added to the end of the typeahead
buffer, thus if a mapping is still being executed the
characters come after them. Use the 'i' flag to insert before
other characters, they will be executed next, before any
characters from a mapping.
The function does not wait for processing of keys contained in
{string}.
To include special keys into {string}, use double-quotes
and "\..." notation |expr-quote|. For example,
feedkeys("\<CR>") simulates pressing of the <Enter> key. But
feedkeys('\<CR>') pushes 5 characters.
! If {mode} is absent, keys are remapped.
{mode} is a String, which can contain these character flags:
! 'm' Remap keys. This is default.
'n' Do not remap keys.
't' Handle keys as if typed; otherwise they are handled as
if coming from a mapping. This matters for undo,
opening folds, etc.
'i' Insert the string instead of appending (see above).
'x' Execute commands until typeahead is empty. This is
similar to using ":normal!". You can call feedkeys()
--- 4110,4140 ----
feedkeys({string} [, {mode}]) *feedkeys()*
Characters in {string} are queued for processing as if they
come from a mapping or were typed by the user.
+
By default the string is added to the end of the typeahead
buffer, thus if a mapping is still being executed the
characters come after them. Use the 'i' flag to insert before
other characters, they will be executed next, before any
characters from a mapping.
+
The function does not wait for processing of keys contained in
{string}.
+
To include special keys into {string}, use double-quotes
and "\..." notation |expr-quote|. For example,
feedkeys("\<CR>") simulates pressing of the <Enter> key. But
feedkeys('\<CR>') pushes 5 characters.
!
{mode} is a String, which can contain these character flags:
! 'm' Remap keys. This is default. If {mode} is absent,
! keys are remapped.
'n' Do not remap keys.
't' Handle keys as if typed; otherwise they are handled as
if coming from a mapping. This matters for undo,
opening folds, etc.
+ 'L' Lowlevel input. Only works for Unix or when using the
+ GUI. Keys are used as if they were coming from the
+ terminal. Other flags are not used. *E980*
'i' Insert the string instead of appending (see above).
'x' Execute commands until typeahead is empty. This is
similar to using ":normal!". You can call feedkeys()
*** ../vim-8.1.0814/src/version.c 2019-01-24 20:30:49.333537878 +0100
--- src/version.c 2019-01-24 21:50:25.757695053 +0100
***************
*** 790,792 ****
/**/
! 84,
/**/
--- 790,794 ----
/**/
! 815,
! /**/
! 814,
/**/
--
You were lucky. We lived for three months in a brown paper bag in a
septic tank. We used to have to get up at six o'clock in the morning,
clean the bag, eat a crust of stale bread, go to work down mill for
fourteen hours a day week in-week out. When we got home, our Dad
would thrash us to sleep with his belt!
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.