Ctrl+Space для omni и завершения ключевых слов в vim

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

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

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

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


person Marlun    schedule 04.02.2009    source источник


Ответы (3)


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

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>
person sykora    schedule 04.02.2009
comment
Это именно то, что я искал. Спасибо. - person lucapette; 11.01.2011
comment
Я попробовал это в OS X Leopard, и когда я пытаюсь нажать ctrl-space, он печатает два пробела и не работает :( - person Robert Martin; 29.08.2011

Вышеприведенный способ "отчасти" работает, но он настолько нечитаем, что почти никто не может сказать, что он на самом деле делает. Приведенное выше решение не подходит.

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

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

person Dave Halter    schedule 28.08.2013
comment
спасибо за объяснение этих ляпнуть код. это дает мне больше понимания и больше доверия к коду, который я запускаю. но чтобы быть уверенным, что я ничего не упустил: - разве C-x/C-o уже не помещал вас на первое автоматически завершенное слово? что может свести на нет необходимость <down> и <C-n>/<C-p>/<C-n> - исходный вопрос спрашивает, как автоматически переключаться между omni-завершением и завершением слов в случае, когда omni не находит совпадений, объясняющих <bs>/<C-n> (что я не понимаю, почему он добавляет <bs>, когда он мог просто сделать другой <C-x> вместо удаления слова ) - person asem bused; 20.04.2019

Для 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>
person carlitux    schedule 09.08.2015