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

fot*_*nus 78 vim

如何从磁盘中删除vim中当前打开的文件?还可以关闭缓冲区.

我看到你可以使用NERDTree,但我不使用这个插件.

glt*_*lts 91

使用rm(1)之类的外部工具很好,但Vim也有自己delete()的删除文件的功能.这具有便携的优点.

:call delete(expand('%'))
Run Code Online (Sandbox Code Playgroud)

另一种表达方式是:call delete(@%)使用%(当前文件)寄存器(由@acco提示).

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

:call delete(expand('%')) | bdelete!
Run Code Online (Sandbox Code Playgroud)

您可能希望根据自己的喜好对其进行映射.

  • 这种映射并不理想.我们不想打破[`r`](http://vimdoc.sourceforge.net/htmldoc/change.html#r)命令!使用[`<Leader> ...`](http://vimdoc.sourceforge.net/htmldoc/map.html#mapleader)更好地为映射添加前缀. (12认同)
  • 谢谢!.vimrc中的以下映射似乎有效:`nnoremap rm:call delete(expand('%'))\ | BDELETE!<CR>`.您可能想要添加答案. (7认同)
  • `:call delete(@%)| q!`←短变种(如果你不想映射它).(缓冲区保留在`:ls`中,可以用`:b`这种方式恢复;它保留文件名和缓冲区选项,但不保留文件内容.) (3认同)
  • 我使用`nnoremap <C-Del>将其映射到Ctrl + Del:调用delete(expand('%'))<CR>`但是我不会关闭缓冲区,以防它偶然发生; 那你还有机会保存它. (2认同)
  • @acco,我喜欢你的技巧,但你需要使用`:call delete(@%)| bd!`并使用`:ls!`和`:b`来复活. (2认同)
  • **数据危险警告!**最初调用的只是`%`(文件路径(vim术语为“ * filename *”),可能是相对的,例如仅文件名),而不是`%:p`(绝对文件路径)如果您忘记了在那里的`:cd`,则冒着删除另一目录中同名文件的风险。因此,强烈建议您使用`expand('%:p')`而不是`@%`或`expand('%')`进行映射。 (2认同)

Dav*_*ain 75

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

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

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

:!rm %
Run Code Online (Sandbox Code Playgroud)

  • **数据危险警告!**只有`%`(文件路径(vim术语中的"*filename*")最初调用,可能是相对的,例如只是文件名)而不是`%:p`(绝对文件路径)你如果您忘记了`:cd`ed那么,在另一个目录中删除同名文件的风险很小.因此,无论如何,我强烈建议使用`%:p`而不是'%`. (7认同)
  • @ saeed144,如果是文件名中的空格(或者你不希望在shell级解释的其他字符),你需要用引号括起文件名('%`):`!rm"%"` . (4认同)
  • 用`!rm%`删除,是否有办法在vim返回缓冲区时避免警告? (3认同)

glt*_*lts 25

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

在其自己的话eunuch.vim提供

最需要它的UNIX shell命令的Vim sugar.同时删除或重命名缓冲区和基础文件.将a find或a 加载locate到quickfix列表中.等等.

完善.它有我们需要的东西,如果我们在U​​NIX系统上,还有一些额外的工具.

您正在寻找的命令是

:Remove!
Run Code Online (Sandbox Code Playgroud)

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


joe*_*lom 6

我喜欢能够从 vim 中删除文件,但我也担心不小心删除了重要的工作,这些工作由于某种原因或其他原因尚未受到版本控制。我发现将来自 @glts 和 @accolade 的先前信息与有关如何在退出 vim 之前使用命令进行提示的答案结合起来很有用confirm

把这些放在一起,我在 my 中添加了一个函数~/.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
Run Code Online (Sandbox Code Playgroud)

如果你比我少一个按键的偏执,你可以附加<CR>到第一行

nnoremap <Leader>d. :call DeleteFileAndCloseBuffer()<CR>
Run Code Online (Sandbox Code Playgroud)

并且只需要按回车一次。