Wie entferne ich das Vorschaufenster nach der automatischen Vervollständigung in Vim automatisch?

91

Ich benutze omnifunc=pythoncomplete. Beim automatischen Vervollständigen eines Wortes (z.os.<something> ich ), erhalte ich erwartungsgemäß die Liste der berechtigten Klassenmitglieder und Funktionen sowie ein Scratch-Buffer-Vorschaufenster mit Dokumentation über das ausgewählte Mitglied oder die ausgewählte Funktion. Das ist großartig, aber nach Auswahl der gewünschten Funktion bleibt das Vorschaufenster erhalten.

Ich kann es mit loswerden :pc, aber ich möchte, dass es automatisch verschwindet, nachdem ich meine Funktion a la Eclipse ausgewählt habe. Ich habe herumgespielt, completeoptaber ohne Erfolg.

Ben Davini
quelle
8
Gute Frage - Ich habe die Verwendung von Omnicomplete eingestellt, weil dieser dumme Puffer offen blieb.
Wayne Werner

Antworten:

106

Fügen Sie Folgendes in Ihr vimrc ein:

" If you prefer the Omni-Completion tip window to close when a selection is
" made, these lines close it on movement in insert mode or when leaving
" insert mode
autocmd CursorMovedI * if pumvisible() == 0|pclose|endif
autocmd InsertLeave * if pumvisible() == 0|pclose|endif
gotgenes
quelle
2
Dies scheint das Befehlsbearbeitungsfenster für mich zu brechen (q: oder q /). Ich habe einen weiteren Check hinzugefügt: && bufname ("%")! = "[Command Line]" zu beiden Zeilen
Ben
2
@ Ben: Woah , wie sah ich deinen Kommentar nicht vor der Veröffentlichung dieser Frage . Die Antwort , die ich von dort bekam , war sich ändern pclosezu silent! pclose.
idbrii
1
Vielen Dank an Gotgenes und Pydave. Deine Tricks funktionieren perfekt!
Lubulos
73

Obwohl es bereits eine akzeptierte Antwort gibt, habe ich diese direkt aus den Dokumenten gefunden, die für jedes Plugin funktionieren, bei dem dieses Problem auftritt.

autocmd CompleteDone * pclose
Dan Bradbury
quelle
15
CompleteDonewurde in Version 7.4 hinzugefügt. Diese Methode sollte gegenüber CursorMovedI/ InsertLeaveAnsatz bevorzugt werden .
Peter Rincker
7
@PeterRincker Ich bevorzuge, dass das Fenster nach Abschluss nicht geschlossen wird (da ich die Dokumentation sehen möchte, während ich die Argumente eingebe), daher werde ich die InsertLeaveZeile verwenden.
DBedrenko
19

Wenn Sie das Supertab-Plugin installiert haben, gibt es eine Option namens supertab-closepreviewonpopupclose.

Fügen Sie Folgendes in Ihre .vimrc ein:

let g:SuperTabClosePreviewOnPopupClose = 1
Profpatsch
quelle
15
Ich stimme dieser Antwort zu, da dies ein Hinweis darauf ist, dass das YouCompleteMe-Plugin die Option ag: ycm_autoclose_preview_window_after_insertion enthält.
Duleshi
@ Duleshi genau das, wonach ich gesucht habe!
Andy Hayden
@ AndyHayden Ich bin froh, dass ich helfen kann! Dafür habe ich den Kommentar hinterlassen!
Duleshi
danke @duleshi genau das brauchte ich auch!
David Woods
9

Ich weiß nicht, wie ich es automatisch schließen soll, aber Sie können tippen

: pclose

um die Scratch-Vorschau manuell zu schließen.

Alan Dong
quelle
1

Sie können die folgenden Zuordnungen eingeben, damit bestimmte Tasten versuchen, das Vorschaufenster zu schließen.

inoremap <space> <C-O>:wincmd z<CR><space>
inoremap ( <C-O>:wincmd z<CR>(
inoremap ) <C-O>:wincmd z<CR>)
inoremap , <C-O>:wincmd z<CR>,
inoremap <CR> <C-O>:wincmd z<CR><CR>
inoremap <esc> <esc>:wincmd z<CR>

Sie können auch automatische Befehle verwenden, um das Vorschaufenster zu schließen, wenn Sie im Einfügemodus fertig sind:

augroup GoAwayPreviewWindow
autocmd! InsertLeave * wincmd z
augroup end
zu viel php
quelle
1

Ich weiß, dass diese Frage sehr alt ist, aber nachdem ich tagelang nach einer "sauberen" Lösung gesucht habe, habe ich gerade die CompleteDone-Autofunktion gefunden, die diese Aufgabe erfüllt:

au CompleteDone * pclose
resi
quelle
0

Sie können dies eingeben in .vimrc:

set completeopt-=preview
messi
quelle
Möchten Sie bitte mehr erklären?
Wtower
1
Dies beantwortet die Frage nicht wirklich. Dadurch wird verhindert, dass das Vorschaufenster jemals angezeigt wird und nach Abschluss nicht geschlossen wird. Beachten Sie, dass das OP auch gesagt hat, dass es "completeopt" versucht hat.
Nerdwaller