mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	vim-patch:8.0.1482: using feedkeys() does not work to test completion
Problem:    Using feedkeys() does not work to test Insert mode completion.
            (Lifepillar)
Solution:   Do not check for typed keys when executing :normal or feedkeys().
            Fix thesaurus completion not working when 'complete' is empty.
02ae9b4a93
			
			
This commit is contained in:
		@@ -514,7 +514,7 @@ static int insert_check(VimState *state)
 | 
			
		||||
  // If typed something may trigger CursorHoldI again.
 | 
			
		||||
  if (s->c != K_EVENT
 | 
			
		||||
      // but not in CTRL-X mode, a script can't restore the state
 | 
			
		||||
      && ctrl_x_mode == 0) {
 | 
			
		||||
      && ctrl_x_mode == CTRL_X_NORMAL) {
 | 
			
		||||
    did_cursorhold = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -523,7 +523,10 @@ static int insert_check(VimState *state)
 | 
			
		||||
    s->inserted_space = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (can_cindent && cindent_on() && ctrl_x_mode == 0 && !compl_started) {
 | 
			
		||||
  if (can_cindent
 | 
			
		||||
      && cindent_on()
 | 
			
		||||
      && ctrl_x_mode == CTRL_X_NORMAL
 | 
			
		||||
      && !compl_started) {
 | 
			
		||||
    insert_do_cindent(s);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -1209,7 +1212,8 @@ check_pum:
 | 
			
		||||
    // if 'complete' is empty then plain ^P is no longer special,
 | 
			
		||||
    // but it is under other ^X modes
 | 
			
		||||
    if (*curbuf->b_p_cpt == NUL
 | 
			
		||||
        && ctrl_x_mode != 0
 | 
			
		||||
        && (ctrl_x_mode == CTRL_X_NORMAL
 | 
			
		||||
            || ctrl_x_mode == CTRL_X_WHOLE_LINE)
 | 
			
		||||
        && !(compl_cont_status & CONT_LOCAL)) {
 | 
			
		||||
      goto normalchar;
 | 
			
		||||
    }
 | 
			
		||||
@@ -4535,12 +4539,12 @@ void ins_compl_check_keys(int frequency, int in_compl_func)
 | 
			
		||||
{
 | 
			
		||||
  static int count = 0;
 | 
			
		||||
 | 
			
		||||
  int c;
 | 
			
		||||
 | 
			
		||||
  /* Don't check when reading keys from a script.  That would break the test
 | 
			
		||||
   * scripts */
 | 
			
		||||
  if (using_script())
 | 
			
		||||
  // Don't check when reading keys from a script, :normal or feedkeys().
 | 
			
		||||
  // That would break the test scripts.  But do check for keys when called
 | 
			
		||||
  // from complete_check().
 | 
			
		||||
  if (!in_compl_func && (using_script() || ex_normal_busy)) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Only do this at regular intervals */
 | 
			
		||||
  if (++count < frequency)
 | 
			
		||||
@@ -4549,7 +4553,7 @@ void ins_compl_check_keys(int frequency, int in_compl_func)
 | 
			
		||||
 | 
			
		||||
  /* Check for a typed key.  Do use mappings, otherwise vim_is_ctrl_x_key()
 | 
			
		||||
   * can't do its work correctly. */
 | 
			
		||||
  c = vpeekc_any();
 | 
			
		||||
  int c = vpeekc_any();
 | 
			
		||||
  if (c != NUL) {
 | 
			
		||||
    if (vim_is_ctrl_x_key(c) && c != Ctrl_X && c != Ctrl_R) {
 | 
			
		||||
      c = safe_vgetc();         /* Eat the character */
 | 
			
		||||
 
 | 
			
		||||
@@ -643,11 +643,11 @@ func! Test_edit_CTRL_L()
 | 
			
		||||
  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<esc>", 'tnix')
 | 
			
		||||
  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
 | 
			
		||||
  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<esc>", 'tnix')
 | 
			
		||||
  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
 | 
			
		||||
  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
 | 
			
		||||
  call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
 | 
			
		||||
  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
 | 
			
		||||
  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
 | 
			
		||||
  call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
 | 
			
		||||
  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
 | 
			
		||||
  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
 | 
			
		||||
  call feedkeys("cct\<c-x>\<c-l>\<c-p>\<esc>", 'tnix')
 | 
			
		||||
  call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
 | 
			
		||||
  call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<esc>", 'tnix')
 | 
			
		||||
@@ -1408,7 +1408,6 @@ func Test_edit_complete_very_long_name()
 | 
			
		||||
  let save_columns = &columns
 | 
			
		||||
  " Need at least about 1100 columns to reproduce the problem.
 | 
			
		||||
  set columns=2000
 | 
			
		||||
  call assert_equal(2000, &columns)
 | 
			
		||||
  set noswapfile
 | 
			
		||||
 | 
			
		||||
  let longfilename = longdirname . '/' . repeat('a', 255)
 | 
			
		||||
 
 | 
			
		||||
@@ -249,3 +249,14 @@ func Test_omni_dash()
 | 
			
		||||
  delfunc Omni
 | 
			
		||||
  set omnifunc=
 | 
			
		||||
endfunc
 | 
			
		||||
 | 
			
		||||
" Check that when using feedkeys() typeahead does not interrupt searching for
 | 
			
		||||
" completions.
 | 
			
		||||
func Test_compl_feedkeys()
 | 
			
		||||
  new
 | 
			
		||||
  set completeopt=menuone,noselect
 | 
			
		||||
  call feedkeys("ajump ju\<C-X>\<C-N>\<C-P>\<ESC>", "tx")
 | 
			
		||||
  call assert_equal("jump jump", getline(1))
 | 
			
		||||
  bwipe!
 | 
			
		||||
  set completeopt&
 | 
			
		||||
endfunc
 | 
			
		||||
 
 | 
			
		||||
@@ -641,7 +641,7 @@ func Test_popup_and_preview_autocommand()
 | 
			
		||||
  norm! gt
 | 
			
		||||
  call assert_equal(0, &previewwindow)
 | 
			
		||||
  norm! gT
 | 
			
		||||
  call assert_equal(12, tabpagenr('$'))
 | 
			
		||||
  call assert_equal(10, tabpagenr('$'))
 | 
			
		||||
  tabonly
 | 
			
		||||
  pclose
 | 
			
		||||
  augroup MyBufAdd
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user