Ctrl + Пробел для омни и завершения ключевого слова в vim - PullRequest
27 голосов
/ 04 февраля 2009

Я хочу использовать Ctrl + Пробел для завершения омни (и завершения ключевого слова, если нет завершения омни) в vim Я попробовал то, что нашел где-то в сети:

inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""

однако это не работает. Любой, кто использует Ctrl + Пробел для этого тоже, кто может показать мне правильный путь (который работает) сделать это?

Стоит отметить, что он должен работать в терминальной версии vim NOT gvim.

Ответы [ 3 ]

43 голосов
/ 04 февраля 2009

Попробуйте это:

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>
16 голосов
/ 28 августа 2013

Вышеприведенный способ «своего рода» работает, но он настолько нечитабелен, что почти никто не может сказать, что он на самом деле делает. Решение выше не является хорошим.

Краткий ответ - Используйте это:

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>.

Я использую такой же подход, как первый в 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>, если вы хотите, чтобы первая запись была записана с самого начала).

0 голосов
/ 10 августа 2015

Для 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>
...