Add complete() noinsert/noselect support #2792

This commit is contained in:
Shougo Matsushita 2015-06-05 22:41:22 +09:00 committed by Scott Prager
parent 6270d431aa
commit be66c0b357
2 changed files with 37 additions and 11 deletions

View File

@ -2250,7 +2250,14 @@ void set_completion(colnr_T startcol, list_T *list)
compl_cont_status = 0; compl_cont_status = 0;
compl_curr_match = compl_first_match; compl_curr_match = compl_first_match;
ins_complete(Ctrl_N); if (compl_no_insert) {
ins_complete(K_DOWN);
} else {
ins_complete(Ctrl_N);
if (compl_no_select) {
ins_complete(Ctrl_P);
}
}
ui_flush(); ui_flush();
} }
@ -2980,16 +2987,17 @@ static int ins_compl_prep(int c)
compl_get_longest = (strstr((char *)p_cot, "longest") != NULL); compl_get_longest = (strstr((char *)p_cot, "longest") != NULL);
compl_used_match = TRUE; compl_used_match = TRUE;
if (strstr((char *)p_cot, "noselect") != NULL) { }
compl_no_insert = FALSE;
compl_no_select = TRUE; if (strstr((char *)p_cot, "noselect") != NULL) {
} else if (strstr((char *)p_cot, "noinsert") != NULL) { compl_no_insert = FALSE;
compl_no_insert = TRUE; compl_no_select = TRUE;
compl_no_select = FALSE; } else if (strstr((char *)p_cot, "noinsert") != NULL) {
} else { compl_no_insert = TRUE;
compl_no_insert = FALSE; compl_no_select = FALSE;
compl_no_select = FALSE; } else {
} compl_no_insert = FALSE;
compl_no_select = FALSE;
} }
if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET) { if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET) {

View File

@ -1,3 +1,4 @@
local helpers = require('test.functional.helpers') local helpers = require('test.functional.helpers')
local clear, feed, execute = helpers.clear, helpers.feed, helpers.execute local clear, feed, execute = helpers.clear, helpers.feed, helpers.execute
local eval, eq, neq = helpers.eval, helpers.eq, helpers.neq local eval, eq, neq = helpers.eval, helpers.eq, helpers.neq
@ -54,25 +55,42 @@ describe('completion', function()
end) end)
end) end)
describe('completeopt', function() describe('completeopt', function()
before_each(function()
source([[
function! TestComplete() abort
call complete(1, ['foo'])
return ''
endfunction
]])
end)
it('inserts the first candidate if default', function() it('inserts the first candidate if default', function()
execute('set completeopt+=menuone') execute('set completeopt+=menuone')
feed('ifoo<ESC>o<C-x><C-n>bar<ESC>') feed('ifoo<ESC>o<C-x><C-n>bar<ESC>')
eq('foobar', eval('getline(2)')) eq('foobar', eval('getline(2)'))
feed('o<C-r>=TestComplete()<CR><ESC>')
eq('foo', eval('getline(3)'))
end) end)
it('selects the first candidate if noinsert', function() it('selects the first candidate if noinsert', function()
execute('set completeopt+=menuone,noinsert') execute('set completeopt+=menuone,noinsert')
feed('ifoo<ESC>o<C-x><C-n><C-y><ESC>') feed('ifoo<ESC>o<C-x><C-n><C-y><ESC>')
eq('foo', eval('getline(2)')) eq('foo', eval('getline(2)'))
feed('o<C-r>=TestComplete()<CR><C-y><ESC>')
eq('foo', eval('getline(3)'))
end) end)
it('does not insert the first candidate if noselect', function() it('does not insert the first candidate if noselect', function()
execute('set completeopt+=menuone,noselect') execute('set completeopt+=menuone,noselect')
feed('ifoo<ESC>o<C-x><C-n>bar<ESC>') feed('ifoo<ESC>o<C-x><C-n>bar<ESC>')
eq('bar', eval('getline(2)')) eq('bar', eval('getline(2)'))
feed('o<C-r>=TestComplete()<CR>bar<ESC>')
eq('bar', eval('getline(3)'))
end) end)
it('does not select/insert the first candidate if noselect and noinsert', function() it('does not select/insert the first candidate if noselect and noinsert', function()
execute('set completeopt+=menuone,noselect,noinsert') execute('set completeopt+=menuone,noselect,noinsert')
feed('ifoo<ESC>o<C-x><C-n><ESC>') feed('ifoo<ESC>o<C-x><C-n><ESC>')
eq('', eval('getline(2)')) eq('', eval('getline(2)'))
feed('o<C-r>=TestComplete()<CR><ESC>')
eq('', eval('getline(3)'))
end) end)
end) end)
end) end)