Как вы автоматически удаляете окно предварительного просмотра после автозаполнения в Vim?

92

Я использую omnifunc=pythoncomplete. При автозаполнении слова (например, os.<something>) я получаю список подходящих членов класса и функций, как и ожидалось, а также окно предварительного просмотра временного буфера с документацией о выбранном члене или функции. Это здорово, но после выбора нужной мне функции окно предварительного просмотра остается.

Я могу избавиться от него с помощью :pc, но я бы хотел, чтобы он просто автоматически исчезал после того, как я выбрал свою функцию, а-ля Eclipse. Я играл, completeoptно безрезультатно.

Бен Давини
источник
8
хороший вопрос - я перестал использовать omnicomplete, потому что он оставил этот тупой буфер открытым.
Уэйн Вернер,

Ответы:

106

Поместите в свой vimrc следующее:

" 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
источник
2
Мне кажется, это нарушает работу окна редактирования команд (q: или q /). Я добавил еще одну проверку: && bufname ("%")! = "[Command Line]" в обе строки
Бен,
2
@Ben: Ого, как я не увидел ваш комментарий перед тем, как опубликовать этот вопрос . Ответ, который я получил оттуда, заключался в том, чтобы поменять pcloseна silent! pclose.
idbrii
1
Спасибо и gotgenes, и pydave. Ваши уловки работают отлично!
Lubulos
75

Несмотря на то, что уже есть принятый ответ, я нашел его прямо из документации, который будет работать для любого плагина, в котором возникает эта проблема.

autocmd CompleteDone * pclose
Дэн Брэдбери
источник
15
CompleteDoneбыл добавлен в версии 7.4. Этот метод следует предпочесть CursorMovedI/ InsertLeaveподходу.
Питер Ринкер 05
7
@PeterRincker Я предпочитаю, чтобы окно не закрывалось по завершении (потому что я хочу видеть документацию по мере ввода аргументов), поэтому я буду использовать InsertLeaveстроку.
Д.Бедренко 07
это потрясающе :)
Махди мехраби
19

Если у вас установлен плагин supertab, есть опция под названием supertab-closepreviewonpopupclose.

Поместите в свой .vimrc следующее:

let g:SuperTabClosePreviewOnPopupClose = 1
Профпатч
источник
16
Я поддерживаю этот ответ, потому что это намек на то, что у плагина YouCompleteMe есть опция ag: ycm_autoclose_preview_window_after_insertion.
duleshi
@duleshi именно то, что я искал!
Энди Хайден
@AndyHayden Рад, что могу помочь! Вот для чего я оставил комментарий!
duleshi
спасибо @duleshi, это именно то, что мне было нужно!
Дэвид Вудс
9

Я не знаю, как закрыть его автоматически, но вы можете ввести

: pclose

чтобы закрыть предварительный просмотр скретча вручную.

Алан Донг
источник
1

Вы можете добавить следующие сопоставления, чтобы определенные клавиши пытались закрыть окно предварительного просмотра.

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>

Вы также можете использовать автокоманды, чтобы закрыть окно предварительного просмотра, когда вы закончите в режиме вставки:

augroup GoAwayPreviewWindow
autocmd! InsertLeave * wincmd z
augroup end
слишком много php
источник
1

Я знаю, что этот вопрос очень старый, но после нескольких дней поиска «чистого» решения я только что нашел автофункцию CompleteDone, которая выполняет эту работу:

au CompleteDone * pclose
Resi
источник
0

Вы можете ввести это в .vimrc:

set completeopt-=preview
Месси
источник
Не могли бы вы объяснить больше?
Wtower
1
Это на самом деле не отвечает на вопрос, это предотвращает появление окна предварительного просмотра и его закрытие после завершения. Обратите внимание, что OP сказал, что они также пробовали "completeopt".
ботаник,