คุณจะลบหน้าต่างแสดงตัวอย่างโดยอัตโนมัติหลังจากการเติมข้อความอัตโนมัติใน Vim ได้อย่างไร


92

ฉันกำลังใช้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 ("%")! = "[Command Line]" ให้กับทั้งสองบรรทัด
เบ็น

2
@ เบ็น: ว้าวฉันไม่เห็นความคิดเห็นของคุณก่อนโพสต์คำถามนี้ได้อย่างไร คำตอบที่ผมได้จากมีการเปลี่ยนแปลงไปpclose silent! pclose
idbrii

1
ขอบคุณทั้ง gotgenes และ pydave เทคนิคของคุณทำงานได้อย่างสมบูรณ์แบบ!
Lubulos

75

แม้ว่าจะมีคำตอบที่ยอมรับอยู่แล้ว แต่ฉันพบสิ่งนี้โดยตรงจากเอกสารซึ่งจะใช้ได้กับปลั๊กอินใด ๆ ที่มีปัญหานี้

autocmd CompleteDone * pclose

15
CompleteDoneถูกเพิ่มในเวอร์ชัน 7.4 ควรเลือกวิธีนี้มากกว่าCursorMovedI/ InsertLeaveวิธีการ
Peter Rincker

7
@PeterRincker ฉันไม่ต้องการให้หน้าต่างปิดเมื่อเสร็จสิ้น (เพราะฉันต้องการดูเอกสารในขณะที่ฉันพิมพ์อาร์กิวเมนต์) ดังนั้นฉันจะใช้InsertLeaveบรรทัด
DBedrenko

นี่มันวิเศษมาก :)
Mahdi mehrabi

19

ถ้าคุณมี supertab supertab-closepreviewonpopupcloseปลั๊กอินติดตั้งมีตัวเลือกที่เรียกว่า

ใส่สิ่งต่อไปนี้ใน. vimrc ของคุณ:

let g:SuperTabClosePreviewOnPopupClose = 1

16
ฉันโหวตคำตอบนี้เนื่องจากคำใบ้ว่าปลั๊กอิน YouCompleteMe มีตัวเลือก ag: ycm_autoclose_preview_window_after_insertion
duleshi

@duleshi สิ่งที่ฉันกำลังมองหา!
Andy Hayden

@AndyHayden ดีใจที่ช่วยได้! นั่นคือสิ่งที่ฉันทิ้งความคิดเห็นไว้!
duleshi

ขอบคุณ @duleshi นั่นคือสิ่งที่ฉันต้องการเช่นกัน!
David Woods

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
สิ่งนี้ไม่ได้ตอบคำถามอย่างแท้จริงซึ่งจะป้องกันไม่ให้หน้าต่างแสดงตัวอย่างโผล่ขึ้นมาและไม่ถูกปิดหลังจากเสร็จสิ้น โปรดทราบว่า OP ก็บอกว่าพวกเขาพยายาม "completeopt" เช่นกัน
nerdwaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.