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


91

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

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


8
гарне запитання - я перестав використовувати omnicomplete, тому що той дурний буфер залишив відкритим.
Wayne Werner

Відповіді:


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

2
Здається, це порушує вікно редагування команд для мене (q: або q /). Я додав ще одну перевірку: && bufname ("%")! = "[Командний рядок]" до обох рядків
Бен,

2
@Ben: Ого, як я не бачив твого коментаря перед тим, як розмістити це запитання . Відповідь, яку я отримав звідти, мала змінитись pcloseна silent! pclose.
idbrii

1
Завдяки як гегенесу, так і підаву. Ваші трюки чудово працюють!
Lubulos

73

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

autocmd CompleteDone * pclose

15
CompleteDoneбуло додано у версію 7.4. Цьому методу слід віддавати перевагу над CursorMovedI/ InsertLeaveпідходом.
Пітер Рінкер

7
@PeterRincker Я вважаю за краще, щоб вікно не закривалось після завершення (тому що я хочу бачити документацію, набираючи аргументи), тому буду використовувати InsertLeaveрядок.
Д.Б.Дедренко

19

Якщо у вас встановлений плагін supertab, існує опція, яка називається supertab-closepreviewonpopupclose.

Помістіть у свій .vimrc наступне:

let g:SuperTabClosePreviewOnPopupClose = 1

16
Я підтримую цю відповідь, оскільки це натяк на те, що плагін YouCompleteMe має опцію ag: ycm_autoclose_preview_window_after_insertion.
duleshi

@duleshi саме те, що я шукав!
Енді Хайден,

@AndyHayden Радий, що можу допомогти! Ось для чого я залишив коментар!
дулеші

дякую @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

1

Я знаю, що це питання дуже давнє, але після декількох днів пошуку "чистого" рішення я щойно знайшов автоматичну функцію CompleteDone, яка виконує цю роботу:

au CompleteDone * pclose

0

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

set completeopt-=preview

Чи можете ви, будь ласка, пояснити більше?
Wtower

1
Насправді це не відповідає на запитання, це утримує вікно попереднього перегляду, щоб воно ніколи не спливало, а не завершувалось. Зверніть увагу, що в ОП заявили, що вони також спробували "завершити роботу".
nerdwaller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.