如何删除vim中的当前文件?


Answers:


102

使用rm(1)之类的外部工具可以,但是Vim也具有delete()删除文件的功能。这具有便携式的优点。

:call delete(expand('%'))

表达的另一种方法是:call delete(@%),它使用%(当前文件)寄存器(@accolade的提示)。

要完全清除当前缓冲区,请将磁盘上的文件表示形式和Vim缓冲区都追加:bdelete

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

您可能需要根据自己的喜好进行映射。


7
谢谢!在.vimrc里下面的图似乎工作:nnoremap rm :call delete(expand('%')) \| bdelete!<CR>。您可能需要添加答案。
fotanus

13
这种映射并不理想。我们不想破坏r命令!最好使用前缀<Leader>...
2013年

2
我使用将其映射到Ctrl + Del,nnoremap <C-Del> :call delete(expand('%'))<CR>但是我不会关闭缓冲区,以防意外发生。那么您仍然有机会保存它。
Evgeni Sergeev

3
:call delete(@%)|q!←简短变体(如果您不想映射它)。(缓冲区保留在其中:ls,可以通过:b这种方式恢复;它保留文件名和缓冲区选项,但不保留文件内容。)
Aaron Thoma 2015年

2
@accolade,我喜欢您的把戏,但您需要使用:call delete(@%)|bd!和使用:ls!with:b才能恢复。
Bart Louwers,2016年

87

看一看用Vim命令删除文件。在评论部分应该有你要找的内容:

基本上,Rm会删除当前文件。RM将一次性删除当前文件并退出缓冲区(不保存)。

另外,您可以发出一个shell命令来删除当前文件:

:!rm %

1
它是如此简单,以至于我几乎不敢相信我需要为此创建一个脚本。谢谢。
fotanus

3
用删除!rm %,有什么办法可以避免在vim返回缓冲区时发出警告?
fotanus

1
文件名中包含一些特殊字符,此命令将不起作用,例如文件名为20130711-contacts#285.vcf,该文件具有空格时,会显示“ rm:无法删除” 20130711-contacts”:无此类文件或目录”
赛义德(Saeed)2014年

4
@ saeed144,如果文件名中有空格(或您不想在shell级别上解释的其他字符),则需要在文件名(%)周围加上引号:!rm "%"
大卫·凯恩

8
数据危险警告!最初使用%文件路径(在vim术语中为“ filename ”),可能是相对的,例如只是文件名)而不是%:p(绝对文件路径),则冒着删除另一目录中同名文件的风险,如果您忘记了:cd那里的教育。因此,强烈建议您使用%:p而不是%如果您将其映射。
亚伦·托马

25

有时,即使对于一个简单的问题,插件也可能是有吸引力的解决方案。在这种情况下,我们很幸运,因为全能的Tim Pope拥有eunuch.vim

用自己的话说,eunuch.vim提供了

最需要UNIX外壳程序命令的Vim sugar。同时删除或重命名缓冲区和基础文件。将afind或a加载locate到快速修复列表中。等等。

完善。它具有我们需要的东西,如果我们在U​​NIX系统上,则还有一些其他工具。

您正在寻找的命令是

:Remove!

再次,如果您需要它,请重新映射它,例如:nnoremap <Leader>rm :Remove!<CR>


我一直在寻找一种无需插件的方法,因此我会接受您的其他答案。插件看起来不错:-)
fotanus

如果你需要的VIM方式这个插件是非常方便的mvmkdirfind等强烈推荐。
Ehtesh Choudhury

4

我喜欢能够从vim中删除文件,但是对于意外删除由于某种原因尚未受版本控制的重要工作,我也抱有幻想。我发现将@glts和@accolade中的先前信息与有关如何在退出vim之前使用命令进行提示的答案结合起来很有用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编那里。
亚伦·托马

1
感谢您提出来!我相应地更新了我的答案。
joelostblom

0

您可以通过两个步骤完成此操作:

  1. 另存为新文件

    :w newfilename

  2. 删除旧文件

    !rm oldfilename


0

这可能是一个不受欢迎的观点,但是您的文件树浏览器(Netrw / NerdTree)将成为删除文件的最简单,最安全的方法。即使OP没有使用NerdTree,内置插件Netrw也可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.