Raum Strg + für omni und Keyword-Abschluss in vim
-
21-08-2019 - |
Frage
ich verwenden möchte Strg + Space für omni-Abschluss (und Keyword-Abschluss, wenn es keine omni-Abschluss) in vim. Ich habe schon versucht, diese, die ich irgendwo im Internet gefunden:
inoremap <expr> <c-space> pumvisible() ? "\<C-n>" : "\<C-x>\<C-o>\<C-n>\<C-p>\<C-r>=pumvisible() ? \"\\<Down>\" : \"\\<CR>\""
jedoch ist es nicht funktioniert. Jeder, der sich mit Strg + Space für zu dieser, der mir den richtigen Weg zeigen kann (was funktioniert), es zu tun?
Bemerkenswert ist, dass es in der Terminal-Version von vim arbeiten muß NICHT gvim.
Lösung
Versuchen Sie folgendes:
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>
Andere Tipps
Das oben gezeigte Art und Weise ist „Art“ zu arbeiten, aber es ist so unleserlich, dass fast niemand konnte sagen, was es tatsächlich der Fall ist. Die Lösung oben ist nicht gut.
Kurzantwort - Hiermit können Sie:
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()
Diese Antwort achtet auch, dass es zwei mögliche Werte (je nach Endgerät / gvim usage) für Strg + Leertaste: <C-Space>
und <Nul>
.
Ich verwende einen ähnlichen Ansatz wie die ersten in jedi-vim , aber anpassbar.
Lange Antwort - Was die oben tut:
Die ganze Entkommen der obigen Antwort ist so verwirrend, dass ich die oben genannte Antwort in ein lesbares Format aufgeteilt haben:
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()
Dies zeigt deutlich, was es tut. Es gibt einige seltsame Dinge in Auto_complete_opened
passiert. Es ist nicht nur Vollendung tun, es tut zwei weitere Dinge nach zu vervollständigen versuchen:
- Wenn die omnicompletion zu verwenden versuchen, es irgendwie nicht ein
<C-n><C-p><C-n>
, die nur abgekürzt werden IMHO könnte<C-n>
. - Bei Abschluss ist nicht erfolgreich, eine Backspace verwendet und hat einen Abschluss wieder, nicht
<C-o><C-x>
aber<C-n>
, die gerade nicht viel Sinn macht.
Ich sage nicht, dass dies nicht das, was einige Benutzer wünschen können, aber es ist wahrscheinlich nicht das, was die meisten Benutzer wollen! Meine kurze Antwort nimmt, dass in der Kredit- und gibt Ihnen eine einfache Möglichkeit, es zu bearbeiten. Sie können nun nur leicht Dinge ändern, wenn Sie wollen (zum Beispiel <Down>
<C-n>
, wenn Sie der erste Eintrag wollen von Anfang an geschrieben werden auf).
Für iterm2 und vim diese Linien funktioniert für mich, ich habe von 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>