Ctrl + Пробел для пропуска и завершения ключевого слова в vim

StackOverflow https://stackoverflow.com/questions/510503

  •  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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top