On 09/02/2018 14:32, Bram Moolenaar wrote:

Lifepillar wrote:

On 05/02/2018 22:49, Nikolay Aleksandrovich Pavlov wrote:
2018-02-05 23:31 GMT+03:00 Lifepillar <lifepil...@lifepillar.me>:
I would like to automate the testing of my completion plugin,
so I have started to write functions like this (I am using
a test framework like the one in Vim):

fun! Test_buffer_keyword_completion()
    set completeopt=menuone,noselect
    call feedkeys("ajump ju\<C-X>\<C-N>\<C-N>\<ESC>", "x")
    call assert_equal("jump jump", getline(1))

This test passes (using `vim --clean`), but if I feed this
key sequence instead:

    call feedkeys("ajump ju\<C-X>\<C-N>\<C-P>\<ESC>", "x")

the test fails:

    Expected 'jump jump' but got 'jump ju'

Why is that? If I try the key sequences manually, both give the
same result.

To emulate user input you must add `t` to the flags, there are some
differences between handling input from user and input from mappings
and without `t` you are emulating the latter. I could not list all the
differences though.

Adding "t" does not seem to make a difference in this case. This is a
simplified way to reproduce the difference:

    vim --clean
    :set completeopt=menuone,noselect
    :call feedkeys("ajump ju\<C-X>\<C-N>\<C-N>\<ESC>", "tx")
    :call feedkeys("ajump ju\<C-X>\<C-N>\<C-P>\<ESC>", "tx")

As I said, manual typing does not show any difference (the result is
"jump jump" in both cases). Am I missing something?
I am using Vim 8.0.1450.

This happens because Vim checks for typed keys while finding matches.
It then sees the CTRL-P before the first completion is found, causing it
to stick to "ju".

When sourcing a script with Normal mode commands, there is an extra
check that prevents the completion to be aborted.  I think we should do
the same when using feedkeys(), as it's a very similar thing.  And it's
very difficult to do this in another way.

However, this may break completion plugins.  Or make them work better,
hard to predict.  I can make the change for this and await reports...

I have tried patch 1482 and tests like the above now work as expected.
I have tested my plugin (which uses feedkeys()) and I have found no regressions. Great job!

Unfortunately, I still have some problems when I test my plugin's
mappings. I have traced back the issue to the following:

  fun! s:dup_complete()
    " Get the text in front of the cursor
    return getline('.')[0:col('.') - 2]

  fun! Test_dup_completion()
    imap <buffer> <expr> <silent> <plug>(Dup) <sid>dup_complete()
    call feedkeys("ajump\<plug>(Dup)", "tx")
    call assert_equal("jumpjump", getline(1))

It seems that in s:dup_complete() getline('.') is always empty and
col('.') is always 1. Is there anything I can do about it?

(The idea is that my plugin gets the text in front of the cursor to
decide how to proceed with completion.)


You received this message from the "vim_use" 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_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_use+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to