Ctrl + Пробел для пропуска и завершения ключевого слова в vim
-
21-08-2019 - |
Вопрос
Я хочу использовать Ctrl+Космос для omni-завершения (и завершения ключевого слова, если omni-завершения нет) в vim.Я пробовал это, которое нашел где-то в Интернете:
inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""
однако это не работает.Любой, кто использует Ctrl+Космос и для этого тоже, кто может показать мне правильный способ (который работает) сделать это?
Стоит отметить, что он должен работать в терминальной версии vim, а НЕ gvim.
Решение
Попробуй это:
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 <C-@> <C-Space>
Другие советы
Описанный выше способ "вроде" работает, но он настолько нечитабелен, что почти никто не может сказать, что он на самом деле делает. Приведенное выше решение не является хорошим.
Короткий ответ - Используйте это:
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 + Пробел: <C-Space>
и <Nul>
.
Я использую тот же подход, что и первый в джедай-вим, но более настраиваемый.
Длинный ответ - Что делает вышеприведенное:
Весь экранирование приведенного выше ответа настолько сбивает с толку, что я разделил приведенный выше ответ на читаемый формат:
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>
, если вы хотите, чтобы первая запись была записана с самого начала).
Для 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>