我如何在vim中从磁盘上删除当前打开的文件?最好也能关闭缓冲区。
我看到你可以使用NERDTree,但我不使用这个插件。
请查看使用Vim命令删除文件。其中的评论部分应该有你要找的内容:
基本上,Rm会删除当前文件;RM会一次性删除当前文件并退出缓冲区(不保存)。
或者,您可以直接发出一个shell命令来删除当前文件:
:!rm %
!rm %
删除文件时,是否有方法可以避免 Vim 回到缓冲区时出现警告? - fotanus%
)括起来: !rm“%”
。 - David Cain:cd
到另一个目录,就会产生删除另一个目录中同名文件的风险。因此,如果你打算进行映射,我强烈建议使用“%:p”而不是“%”。 - Aaron Thoma用它自己的话来说,eunuch.vim 提供了:
Vim 对需要 UNIX shell 命令的增强。同时删除或重命名缓冲区和底层文件。将
find
或locate
加载到快速修复列表中。等等。
太完美了。它具备我们所需的功能,如果我们使用UNIX系统还有一些额外的工具。
你要查找的命令是:
:Remove!
如果需要频繁使用,请重新映射它,例如::nnoremap <Leader>rm :Remove!<CR>
。
mv
、mkdir
、find
等操作,那么这个插件非常方便。强烈推荐。 - Ehtesh Choudhury我喜欢在vim中能够删除文件,但我也很担心会意外删除重要的工作,因为某种原因,这些工作还没有被版本控制。我发现将@glts和@accolade之前的信息与这个答案结合起来,可以学习如何使用confirm
命令在退出vim之前提示。
将它们组合在一起,我在我的~/.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>
只需按一次回车即可。
expand('%:p')
而不是@%
。虽然我很高兴你采纳了我的提示,但在脚本中,简洁性的好处微乎其微。更重要的是:%:p
将文件名扩展为完整的绝对路径(它可能已经是或者不是)。只使用%
,如果你忘记了你的:cd
,你会有一点点风险删除另一个目录中同名的文件。 - Aaron Thoma另存为新文件
:w 新文件名
删除旧文件
! rm 旧文件名
这可能是一个不受欢迎的观点,但您的文件树浏览器(Netrw/NerdTree)将是删除文件最简单、最安全的方式。即使 OP 没有使用 NerdTree,内置插件 Netrw 也能很好地工作。
在Lua中使用确认提示:
local function confirm_and_delete_buffer()
local confirm = vim.fn.confirm("Delete buffer and file?", "&Yes\n&No", 2)
if confirm == 1 then
os.remove(vim.fn.expand "%")
vim.api.nvim_buf_delete(0, { force = true })
end
end
我将其映射到<leader>df
,但你们可以按照自己的意愿进行操作。
nnoremap rm :call delete(expand('%')) \| bdelete!<CR>
。你可能想在回答中加入这个内容。 - fotanusr
命令!更好的做法是在你的映射前加上<Leader>...
前缀。 - glts:call delete(@%)|q!
是一个缩写命令(如果你不想把它映射成快捷键)。它的作用是删除当前缓冲区的所有内容,并退出 Vim 编辑器。这个缓冲区会一直保留在:ls
列表中,可以通过:b
命令重新打开,但是它将不会保留之前的文件内容,只会保留文件名和缓冲区选项。 - Aaron Thoma:call delete(@%)|bd!
并使用:ls!
与:b
来恢复。 - Bart Louwers%
(在vim术语中为“文件名”的文件路径,可能是相对的,例如仅文件名)而不是%:p
(绝对文件路径),如果您忘记了:cd
到那里,您会有一定的风险删除另一个目录中同名的文件。因此,我强烈建议您使用expand('%:p')
而不是@%
或expand('%')
,如果您无论如何都要映射它。 - Aaron Thoma