ปิดไฟล์โดยไม่เลิกสมัคร VIM หรือไม่


258

ฉันใช้คำสั่ง:eและ:wเพื่อแก้ไขและเขียนไฟล์ ฉันไม่แน่ใจว่ามีคำสั่ง "ปิด" เพื่อปิดไฟล์ปัจจุบันโดยไม่ทิ้ง Vim หรือไม่?

ฉันรู้ว่า:qสามารถใช้คำสั่งเพื่อปิดไฟล์ได้ แต่ถ้าเป็นไฟล์สุดท้าย Vim ก็จะปิดเช่นกัน จริง ๆ แล้วใน Mac OS MacVim จะปิด มีเพียงหน้าต่าง Vim เท่านั้นที่ปิดและฉันสามารถใช้Control- Nเพื่อเปิดหน้าต่าง Vim เปล่าอีกครั้ง ฉันต้องการให้ Vim เปิดอยู่ด้วยหน้าจอว่างเปล่า

คำตอบ:


343

เป็นการลบบัฟเฟอร์ (ซึ่งแปลว่าจะปิดไฟล์)

:bd 

6
ของคุณดีกว่าของฉันสำหรับสิ่งที่ OP ถามถึงแม้ว่าฉันมักจะชอบ: enew เพราะฉันชอบมีบัฟเฟอร์ในรายการบัฟเฟอร์ :)
Rytmis

2
เมื่อผมทำเช่นนี้แสดงให้เห็นว่าเป็นกลุ่มบัฟเฟอร์แรก แต่ฉันยังคงสามารถเข้าถึงบัฟเฟอร์
มาร์ตินแอนเดอ

18
@ Martin เพื่อลบบัฟเฟอร์โดยสมบูรณ์ให้ใช้: bw
sebnow

43

ดังที่ได้กล่าวมาแล้วคุณกำลังมองหา:bdแต่สิ่งนี้ไม่ได้ลบบัฟเฟอร์อย่างสมบูรณ์ แต่ก็ยังสามารถเข้าถึงได้:

:e foo
:e bar
:buffers
  1 #h   "foo"                          line 1
  2 %a   "bar"                          line 1
Press ENTER or type command to continue
:bd 2
:buffers
  1 %a   "foo"                          line 1
Press ENTER or type command to continue
:b 2
2   bar

คุณอาจต้องการ:bwที่จะลบมันอย่างสมบูรณ์

:bw 2
:b 2 
E86: Buffer 2 does not exist

ไม่รู้เกี่ยวกับ:bwตัวฉันเลยซักพักซักพัก


3
เพียงจำไว้ว่าความช่วยเหลือของ VIM จะกล่าวถึงสิ่งนี้:bw- "อย่าใช้สิ่งนี้เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่"
mato

22

หากคุณมีหลายหน้าต่างแยกในหน้าต่าง Vim ของคุณจากนั้น:bdปิดหน้าต่างแยกของไฟล์ปัจจุบันดังนั้นฉันชอบที่จะใช้สิ่งที่สูงกว่าเล็กน้อย:

map fc <Esc>:call CleanClose(1)

map fq <Esc>:call CleanClose(0)


function! CleanClose(tosave)
if (a:tosave == 1)
    w!
endif
let todelbufNr = bufnr("%")
let newbufNr = bufnr("#")
if ((newbufNr != -1) && (newbufNr != todelbufNr) && buflisted(newbufNr))
    exe "b".newbufNr
else
    bnext
endif

if (bufnr("%") == todelbufNr)
    new
endif
exe "bd".todelbufNr
endfunction

12
ตอนนี้ข้อมูลโค้ดนี้ทำอะไร
dolzenko

1
คุณอาจต้องการ <CR> หลังจากการเรียกเพื่อเรียกใช้งานคำสั่งจริง
dma

2
@dolzenko it จับคู่ 'fc' และ 'fq' ในโหมดปกติเพื่อเลือกบันทึกบัฟเฟอร์ปัจจุบันจากนั้นสลับไปที่บัฟเฟอร์ใหม่ก่อนที่จะลบต้นฉบับ วิธีนี้จะช่วยป้องกันการแยกที่คุณตั้งไว้
dma

ดูเหมือนความคิดที่ดี เมื่อฉันลองใช้ฉันจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้: "ไม่สามารถกำหนดฟังก์ชัน CleanClose ใหม่: มีการใช้งาน"
jononomo

2
อย่าทำการแมป "f" อีกครั้ง . . "f" มีประโยชน์มากจริง ๆ ด้วยการจับคู่นี้คุณจะไม่สามารถ "ค้นหา" ส่งต่อสำหรับ "c" หรือ "q."
tandrewnichols

17
: [N] bd [elete] [!] *: bd * *: bdel * *: bdelete * * E516 *
: bd [elete] [!] [N]
                ยกเลิกการโหลดบัฟเฟอร์ [N] (ค่าเริ่มต้น: บัฟเฟอร์ปัจจุบัน) และลบออก
                รายการบัฟเฟอร์ หากบัฟเฟอร์เปลี่ยนไปสิ่งนี้จะล้มเหลว
                เว้นแต่เมื่อมีการระบุ [!] ซึ่งการเปลี่ยนแปลงในกรณีนี้จะหายไป
                ไฟล์ยังคงไม่ได้รับผลกระทบ หน้าต่างใด ๆ สำหรับบัฟเฟอร์นี้คือ
                ปิด. ถ้า buffer [N] เป็นบัฟเฟอร์ปัจจุบันบัฟเฟอร์อีกอัน
                จะปรากฏขึ้นแทน นี่คือรายการล่าสุดใน
                รายการข้ามที่ชี้ไปที่บัฟเฟอร์ที่โหลด
                ที่จริงแล้วบัฟเฟอร์ไม่ได้ถูกลบออกอย่างสมบูรณ์ แต่จะถูกลบออกไป
                จากรายการบัฟเฟอร์ | unlisted-buffer | และค่าตัวเลือก
                ตัวแปรและการแม็พ / ตัวย่อสำหรับบัฟเฟอร์คือ
                เคลียร์

9

หากคุณบันทึกไฟล์สุดท้ายแล้ว:enewเป็นเพื่อนของคุณ ( :enew!ถ้าคุณไม่ต้องการบันทึกไฟล์สุดท้าย) โปรดทราบว่าไฟล์ต้นฉบับจะยังคงอยู่ในรายการบัฟเฟอร์ของคุณ (ไฟล์ที่เข้าถึงได้ทาง:ls)


6

หากคุณปรับเปลี่ยน:bd!ไฟล์และต้องการที่จะปิดได้โดยไม่ต้องลาออกจากกลุ่มและโดยไม่บันทึกคุณควรจะพิมพ์


3

:bdสามารถแมป ฉันแผนที่ไปยังF4, Shift- F4ถ้าต้องการให้มีผลบังคับใช้อย่างใกล้ชิดเนื่องจากมีการเปลี่ยนแปลงบางอย่างที่ฉันต้องการไม่ได้


2

bufkill.vimปลั๊กอินเพิ่มBDฯลฯ เพื่อลบบัฟเฟอร์โดยไม่ต้องปิดแยกใด ๆ (เป็นbd) จะอยู่คนเดียว


1

แทรกสิ่งต่อไปนี้ในไฟล์. vimrc ของคุณและด้วยการกดF4มันจะเป็นการปิดไฟล์ปัจจุบัน

:map <F4> :bd<CR>


-1

ฉันมีปัญหาเดียวกันดังนั้นฉันจึงสร้างปลั๊กอิน ปลั๊กอินนี้จะแทนที่: q และคำสั่งอื่น ๆ จากนั้นป้องกันไม่ให้หน้าต่างปิด

หากคุณยังคงมีปัญหาโปรดลองใช้ปลั๊กอินต่อไปนี้ https://github.com/taka-vagyok/prevent-win-closed.vim

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.