Ctrl + пробел для omni и завершения ключевого слова в vim
Я хочу использовать Ctrl + Space для omni-завершения (и завершения ключевого слова, если в vim нет омни-завершения). Я пробовал это, что я нашел где-то в Интернете:
inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""
однако он не работает. Любой, кто использует Ctrl + Space для этого, кто может показать мне правильный способ (который работает), чтобы сделать это?
Стоит отметить, что он должен работать в терминальной версии vim NOT gvim.
Ответы
Ответ 1
Попробуйте следующее:
inoremap <expr> <C-Space> pumvisible() \|\| &omnifunc == '' ?
\ "\<lt>C-n>" :
\ "\<lt>C-x>\<lt>C-o><c-r>=pumvisible() ?" .
\ "\"\\<lt>c-n>\\<lt>c-p>\\<lt>c-n>\" :" .
\ "\" \\<lt>bs>\\<lt>C-n>\"\<CR>"
imap <[email protected]> <C-Space>
Ответ 2
Вышеупомянутый способ "своего рода" работает, но он настолько нечитабелен, что почти никто не может сказать, что он на самом деле делает. Решение выше не подходит.
Короткий ответ - используйте это:
function! Auto_complete_string()
if pumvisible()
return "\<C-n>"
else
return "\<C-x>\<C-o>\<C-r>=Auto_complete_opened()\<CR>"
end
endfunction
function! Auto_complete_opened()
if pumvisible()
return "\<Down>"
end
return ""
endfunction
inoremap <expr> <Nul> Auto_complete_string()
inoremap <expr> <C-Space> Auto_complete_string()
В этом ответе также соблюдается два возможных значения (в зависимости от использования терминала /gvim ) для Ctrl + Space: <C-Space>
и <Nul>
.
Я использую аналогичный подход, как первый в jedi-vim, но более настраиваемый.
Длинный ответ - что вышло выше:
Полное устранение вышеупомянутого ответа настолько запутанно, что я разделил приведенный выше ответ на читаемый формат:
function! Auto_complete_string()
if pumvisible()
return "\<C-n>"
else
return "\<C-x>\<C-o>\<C-r>=Auto_complete_opened()\<CR>"
end
endfunction
function! Auto_complete_opened()
if pumvisible()
return "\<c-n>\<c-p>\<c-n>"
else
return "\<bs>\<C-n>"
end
endfunction
inoremap <expr> <Nul> Auto_complete_string()
Это ясно показывает, что он делает. Там что-то странное происходит в Auto_complete_opened
. Это не просто выполнение, но и выполнение двух дополнительных действий:
- При попытке использовать omnicompletion это как-то делает
<C-n><C-p><C-n>
, который может ИМХО просто сокращаться до <C-n>
.
- Если завершение неудачно, оно использует обратное пространство и выполняет завершение снова, а не
<C-o><C-x>
, но <C-n>
, что просто не имеет большого смысла.
Я не говорю, что это не то, что может понадобиться пользователю, но, вероятно, это не то, что хотят большинство пользователей! Мой короткий ответ берет это в кредит и дает вам простой способ его редактирования. Теперь вы можете просто изменить вещи, если хотите (например, <Down>
до <C-n>
, если вы хотите, чтобы первая запись была записана с самого начала).
Ответ 3
Для iterm2 и vim эти линии работают для меня, я получил от jedi-vim
" Next three lines are to enable C-Space to autocomplete, omnicomplete
inoremap <C-Space> <C-x><C-o>
imap <buffer> <Nul> <C-Space>
smap <buffer> <Nul> <C-Space>