Làm cách nào để xóa tệp hiện tại trong vim?


Câu trả lời:


102

Sử dụng một công cụ bên ngoài như rm (1) cũng được, nhưng Vim cũng có delete()chức năng riêng để xóa tệp. Điều này có lợi thế là di động.

:call delete(expand('%'))

Một cách khác để diễn đạt điều này là :call delete(@%)sử dụng thanh ghi %(tệp hiện tại) (mẹo của @accolade).

Để xóa hoàn toàn bộ đệm hiện tại, cả biểu diễn tệp trên đĩa và bộ đệm Vim, hãy nối thêm :bdelete:

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

Có thể bạn sẽ muốn lập bản đồ này theo sở thích của mình.


7
Cảm ơn! Bản đồ sau đây trong vimrc dường như làm việc: nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. Bạn có thể muốn thêm câu trả lời của mình.
fotanus

13
Ánh xạ đó không lý tưởng. Chúng tôi không muốn phá vỡ rlệnh! Tiền tố tốt hơn lập bản đồ của bạn với <Leader>....
glts

2
Tôi đã ánh xạ nó với Ctrl + Del bằng cách sử dụng nnoremap <C-Del> :call delete(expand('%'))<CR>nhưng tôi không đóng bộ đệm trong trường hợp nó xảy ra tình cờ; thì bạn vẫn có cơ hội để cứu nó.
Evgeni Sergeev

3
:call delete(@%)|q!← Biến thể ngắn (nếu bạn không muốn lập bản đồ). (Các bộ đệm vẫn còn trong :lsvà có thể được hồi sinh với :bcách này, nó vẫn giữ tên tập tin và các tùy chọn đệm, nhưng không phải là nội dung file.)
Aaron Thoma

2
@accolade, tôi thích thủ thuật của bạn, nhưng bạn sẽ cần sử dụng :call delete(@%)|bd!và sử dụng :ls!với :bđể hồi sinh.
Bart Louwers

87

Hãy xem Xóa tệp bằng lệnh Vim . Phần Nhận xét sẽ có những gì bạn đang tìm kiếm:

Về cơ bản, Rm sẽ xóa tệp hiện tại; RM sẽ xóa tệp hiện tại và thoát khỏi bộ đệm (không lưu) trong một lần.

Ngoài ra, bạn có thể chỉ cần đưa ra một lệnh shell để xóa tệp hiện tại:

:!rm %

1
Nó là một cái gì đó đơn giản đến mức tôi gần như không thể tin rằng tôi cần phải tạo một kịch bản cho việc này. Cảm ơn.
fotanus

3
xóa với !rm %, có cách nào để tránh cảnh báo khi vim quay trở lại bộ đệm không?
fotanus

1
Với một số ký tự đặc biệt trong tên tệp, lệnh này sẽ không hoạt động, chẳng hạn như nếu tên tệp là 20130711-danh bạ # 285.vcf, có khoảng trắng, nó sẽ nói 'rm: không thể loại bỏ `20130711-danh bạ': Không có tệp như vậy hoặc thư mục '
Saeed

4
@ saeed144, trong trường hợp của không gian trong một tên file (hoặc các ký tự khác mà bạn không muốn giải thích ở cấp vỏ), bạn sẽ muốn bao quanh tên file ( %) với dấu ngoặc kép: !rm "%".
David Cain

8
CẢNH BÁO NGUY HIỂM DỮ LIỆU! Chỉ với %(đường dẫn tệp (" tên tệp " trong thuật ngữ vim) như được gọi ban đầu, có khả năng tương đối, ví dụ như chỉ tên tệp) thay vì %:p(đường dẫn tệp tuyệt đối), bạn sẽ gặp phải rủi ro nhỏ khi xóa tệp cùng tên trong thư mục khác, nếu bạn đã quên bạn đã chỉnh sửa :cdở đó. Vì vậy, tôi thực sự khuyên bạn nên sử dụng %:pthay vì %nếu bạn vẫn lập bản đồ.
Aaron Thoma

25

Đôi khi một plugin có thể là một giải pháp hấp dẫn ngay cả đối với một vấn đề đơn giản. Trong trường hợp này, chúng tôi thật may mắn vì có eunuch.vim bởi Tim Pope toàn năng.

Nói cách riêng eunuch.vim cung cấp

Vim sugar cho các lệnh shell UNIX cần nó nhất. Xóa hoặc đổi tên bộ đệm và tệp bên dưới cùng một lúc. Tải a findhoặc a locatevào danh sách Quickfix. Và như thế.

Hoàn hảo. Nó có những gì chúng ta cần, cộng với một số công cụ bổ sung nếu chúng ta đang sử dụng hệ thống UNIX.

Lệnh bạn đang tìm là

:Remove!

Một lần nữa, sửa lại nó nếu bạn cần nó nhiều, ví dụ :nnoremap <Leader>rm :Remove!<CR>.


Tôi đang tìm cách để làm mà không cần plugin, vì vậy tôi sẽ chấp nhận câu trả lời khác của bạn. Plugin có vẻ tốt :-)
fotanus

Plugin này là khá tiện lợi nếu bạn cần những cách vim của mv, mkdir, findvv khuyên.
Ehtesh Choudhury

4

Tôi thích có thể xóa các tệp từ bên trong vim, nhưng tôi cũng hoang tưởng về việc vô tình xóa công việc quan trọng, vì lý do này hay lý do khác, chưa được kiểm soát phiên bản. Tôi thấy hữu ích khi kết hợp thông tin trước đó từ @g mule và @accolade với câu trả lời này về cách sử dụng confirmlệnh nhắc trước khi thoát khỏi vim.

Kết hợp những thứ này lại với nhau, tôi đã thêm một hàm vào của mình ~/.vimrc, hàm này sẽ nhắc trước khi xóa tệp và đóng bộ đệm, đồng thời ánh xạ nó thành một tổ hợp phím:

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

Nếu bạn là người ít nhấn phím hơn tôi, bạn có thể thêm <CR>vào dòng đầu tiên

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

và chỉ phải nhấn quay lại một lần.


1
Tôi thực sự khuyên bạn nên sử dụng expand('%:p')thay vì @%khi bạn viết kịch bản. (Mặc dù tôi rất tự hào vì bạn đã kết hợp gợi ý của tôi :) lợi ích ngắn gọn là không đáng kể trong một kịch bản. Quan trọng hơn:) %:psẽ mở rộng tên tệp thành một đường dẫn tuyệt đối đầy đủ (có thể có hoặc chưa có). %Thay vào đó, bạn chỉ có một chút rủi ro là xóa một tệp cùng tên trong một thư mục khác, nếu bạn quên bạn đã chỉnh sửa :cdở đó.
Aaron Thoma

1
Cảm ơn vì đã giải quyết điều đó! Tôi đã cập nhật câu trả lời của mình cho phù hợp.
joelostblom

0

Bạn có thể làm điều đó với hai bước:

  1. lưu dưới dạng tệp mới

    : w newfilename

  2. xóa tệp cũ

    ! rm oldfilename


0

Đây có thể là một ý kiến ​​không phổ biến nhưng trình khám phá cây tệp của bạn (Netrw / NerdTree) sẽ là cách đơn giản và an toàn nhất để xóa tệp. Ngay cả khi OP không sử dụng NerdTree, thì plugin tích hợp Netrw cũng sẽ hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.