ฉันจะลบไฟล์ปัจจุบันในกลุ่มได้อย่างไร


85

ฉันจะลบไฟล์ที่เปิดอยู่ในปัจจุบันออกจากดิสก์ได้อย่างไร จะเป็นการดีที่จะปิดบัฟเฟอร์ด้วย

ฉันเห็นว่าคุณสามารถใช้ NERDTreeได้ แต่ฉันไม่ได้ใช้ปลั๊กอินนี้

คำตอบ:


102

การใช้เครื่องมือภายนอกเช่นrm (1) นั้นใช้ได้ แต่ Vim ยังมีdelete()ฟังก์ชันของตัวเองสำหรับการลบไฟล์ สิ่งนี้มีข้อดีคือพกพาได้

:call delete(expand('%'))

อีกวิธีหนึ่งในการแสดงสิ่งนี้คือ:call delete(@%)ใช้%(ไฟล์ปัจจุบัน) register (tip by @accolade)

หากต้องการล้างบัฟเฟอร์ปัจจุบันอย่างสมบูรณ์ทั้งการแสดงไฟล์บนดิสก์และบัฟเฟอร์ Vim ให้ผนวก:bdelete:

:call delete(expand('%')) | bdelete!

คุณอาจต้องการแมปสิ่งนี้ตามความต้องการของคุณ


7
ขอบคุณ! แผนที่ต่อไปนี้ใน. vimrc ดูเหมือนจะใช้งานได้: nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. คุณอาจต้องการเพิ่มคำตอบของคุณ
fotanus

13
การทำแผนที่นั้นไม่เหมาะอย่างยิ่ง เราไม่ต้องการฝ่าฝืนrคำสั่ง! <Leader>...ดีกว่าการทำแผนที่คำนำหน้าของคุณด้วย
glts

2
ฉันจับคู่กับ Ctrl + Del โดยใช้nnoremap <C-Del> :call delete(expand('%'))<CR>แต่ฉันไม่ปิดบัฟเฟอร์ในกรณีที่มันเกิดขึ้นโดยบังเอิญ คุณยังมีโอกาสบันทึก
Evgeni Sergeev

3
:call delete(@%)|q!←ตัวแปรสั้น (หากคุณไม่ต้องการแมป) (บัฟเฟอร์ยังคงอยู่:lsและสามารถฟื้นขึ้นมาได้ด้วย:bวิธีนี้โดยจะเก็บชื่อไฟล์และตัวเลือกบัฟเฟอร์ไว้ แต่ไม่ใช่เนื้อหาของไฟล์)
Aaron Thoma

2
@accolade ฉันชอบเคล็ดลับของคุณ แต่คุณจะต้องใช้:call delete(@%)|bd!และใช้:ls!ด้วย:bเพื่อฟื้นฟู
Bart Louwers

88

ลองดูที่ลบไฟล์ที่มีคำสั่งที่เป็นกลุ่ม ความคิดเห็นส่วนควรจะมีสิ่งที่คุณกำลังมองหา:

โดยทั่วไป Rm จะลบไฟล์ปัจจุบัน RM จะลบไฟล์ปัจจุบันและออกจากบัฟเฟอร์ (โดยไม่บันทึก) ในครั้งเดียว

หรือคุณสามารถใช้คำสั่งเชลล์เพื่อลบไฟล์ปัจจุบัน:

:!rm %

1
มันเป็นอะไรที่เรียบง่ายจนแทบไม่อยากจะเชื่อเลยว่าต้องสร้างสคริปต์สำหรับสิ่งนี้ ขอบคุณ.
fotanus

3
การลบด้วย!rm %มีวิธีหลีกเลี่ยงคำเตือนเมื่อกลุ่มกลับไปที่บัฟเฟอร์หรือไม่?
fotanus

1
ด้วยอักขระพิเศษบางตัวในชื่อไฟล์คำสั่งนี้จะใช้ไม่ได้เช่นถ้าชื่อไฟล์ 20130711-contact # 285.vcf ซึ่งมีช่องว่างมันจะขึ้นว่า 'rm: can't remove `` 20130711-contact': ไม่มีไฟล์ดังกล่าวหรือ ไดเรกทอรี '
Saeed

4
@ saeed144 ในกรณีของช่องว่างในชื่อไฟล์ (หรือตัวละครอื่น ๆ ที่คุณไม่ต้องการตีความในระดับเปลือก) คุณจะต้องการที่จะล้อมรอบชื่อไฟล์ ( %) !rm "%"ด้วยคำพูด:
David Cain

8
ข้อมูลอันตรายคำเตือน! ด้วยเพียงแค่%(filepath ("filepath (" filename "ในคำศัพท์ vim) ตามที่เรียกในตอนแรกอาจเป็นญาติเช่นชื่อไฟล์) แทนที่จะเป็น%:p(พา ธ ไฟล์สัมบูรณ์) คุณจะเสี่ยงเล็กน้อยที่จะลบไฟล์ที่มีชื่อเดียวกันในไดเร็กทอรีอื่นแทน ถ้าคุณลืมไป:cdแล้ว ดังนั้นฉันขอแนะนำอย่างยิ่งให้ใช้%:pแทน%ถ้าคุณแมปอยู่ดี
Aaron Thoma

25

บางครั้งปลั๊กอินอาจเป็นทางออกที่น่าสนใจแม้จะเป็นปัญหาง่ายๆก็ตาม ในกรณีนี้เราโชคดีที่มีขันที vimโดย Tim Pope ผู้ยิ่งใหญ่

ในคำพูดของตัวเองeunuch.vimให้

Vim sugar สำหรับคำสั่ง UNIX shell ที่ต้องการมากที่สุด ลบหรือเปลี่ยนชื่อบัฟเฟอร์และไฟล์ต้นแบบพร้อมกัน โหลด a findหรือ a locateลงในรายการ Quickfix และอื่น ๆ

สมบูรณ์แบบ. มีสิ่งที่เราต้องการรวมถึงเครื่องมือเพิ่มเติมหากเราใช้ระบบ UNIX

คำสั่งที่คุณกำลังมองหาคือ

:Remove!

:nnoremap <Leader>rm :Remove!<CR>อีกครั้งแมปมันถ้าคุณต้องการมันมากเช่น


ฉันกำลังหาวิธีทำโดยไม่ใช้ปลั๊กอินดังนั้นฉันจะยอมรับคำตอบอื่นของคุณ ปลั๊กอินดูดี :-)
fotanus

ปลั๊กอินนี้จะสะดวกสวยถ้าคุณจำเป็นต้องเป็นกลุ่มวิธีการmv, mkdir, findฯลฯ ขอแนะนำให้
Ehtesh Choudhury

5

ฉันชอบความสามารถในการลบไฟล์จากภายในกลุ่ม แต่ฉันก็หวาดระแวงเช่นกันว่าจะลบงานสำคัญโดยไม่ได้ตั้งใจซึ่งไม่ว่าจะด้วยเหตุผลใดก็ตามยังไม่อยู่ภายใต้การควบคุมเวอร์ชัน ฉันพบว่าการรวมข้อมูลก่อนหน้านี้จาก @glts และ @accolade เข้ากับคำตอบเกี่ยวกับวิธีใช้confirmคำสั่งเพื่อแจ้งก่อนออกจากกลุ่มนี้มีประโยชน์

เมื่อรวมสิ่งเหล่านี้เข้าด้วยกันฉันได้เพิ่มฟังก์ชันให้กับของฉัน~/.vimrcซึ่งจะแจ้งก่อนที่จะลบไฟล์และปิดบัฟเฟอร์และแมปกับคีย์ผสม:

nnoremap <Leader>d. :call DeleteFileAndCloseBuffer()

fun! DeleteFileAndCloseBuffer()
  let choice = confirm("Delete file and close buffer?", "&Do it!\n&Nonono", 1)
  if choice == 1 | call delete(expand('%:p')) | q! | endif
endfun

หากคุณเป็นคนที่หวาดระแวงการกดแป้นพิมพ์น้อยกว่าฉันคุณสามารถต่อท้าย<CR>บรรทัดแรกได้

nnoremap <Leader>d. :call DeleteFileAndCloseBuffer()<CR>

และต้องกดย้อนกลับเพียงครั้งเดียว


1
ฉันขอแนะนำอย่างยิ่งให้ใช้expand('%:p')แทน@%เมื่อคุณเขียนสคริปต์ (ในขณะที่ฉันรู้สึกยินดีที่คุณรวมคำใบ้ของฉันไว้ด้วย :) ผลประโยชน์ที่กระชับนั้นมีน้อยมากในสคริปต์ ที่สำคัญกว่า %:p:) จะขยายชื่อไฟล์เป็นพา ธ สัมบูรณ์แบบเต็ม (ซึ่งอาจจะเป็นหรือไม่เป็นก็ได้) เพียงแค่%คุณเสี่ยงเล็กน้อยที่จะลบไฟล์ชื่อเดียวกันในไดเรกทอรีอื่นแทนหากคุณลืมไป:cdแล้ว
Aaron Thoma

1
ขอบคุณสำหรับการอธิบายสิ่งนั้น! ฉันอัปเดตคำตอบตามนั้น
joelostblom


0

นี่อาจเป็นความคิดเห็นที่ไม่เป็นที่นิยม แต่ file tree explorer ของคุณ (Netrw / NerdTree) จะเป็นวิธีที่ง่ายและปลอดภัยที่สุดในการลบไฟล์ แม้ว่า OP จะไม่ได้ใช้ NerdTree แต่ปลั๊กอิน Netrw ในตัวก็จะทำงานได้เช่นกัน

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