【问题标题】:How can I delete the current file in vim?如何删除vim中的当前文件?
【发布时间】:2013-05-21 20:12:28
【问题描述】:

如何从磁盘中删除 vim 中当前打开的文件?最好也关闭缓冲区。

我看到你can use NERDTree for that,但我不使用这个插件。

【问题讨论】:

    标签: vim


    【解决方案1】:

    使用诸如 rm(1) 之类的外部工具没问题,但 Vim 也有自己的 delete() 删除文件的函数。这具有便携性的优点。

    :call delete(expand('%'))
    

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

    要彻底清除当前缓冲区,包括磁盘上的文件表示和 Vim 缓冲区,请追加 :bdelete

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

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

    【讨论】:

    • 谢谢! .vimrc 中的以下映射似乎有效:nnoremap rm :call delete(expand('%')) \| bdelete!<CR>。您可能想添加您的答案。
    • 这种映射并不理想。我们不想破坏r 命令!最好在映射前加上 <Leader>...
    • 我使用nnoremap <C-Del> :call delete(expand('%'))<CR>将其映射到Ctrl+Del,但我不会关闭缓冲区以防意外发生;那么你还有机会保存它。
    • :call delete(@%)|q! ← 短变体(如果您不想映射它)。 (缓冲区保留在:ls 中,可以通过这种方式使用:b 恢复;它保留文件名和缓冲区选项,但不保留文件内容。)
    • @accolade,我喜欢你的把戏,但你需要使用 :call delete(@%)|bd! 并使用 :ls!:b 来恢复。
    【解决方案2】:

    看看Delete files with a Vim commandComments 部分应该包含您要查找的内容:

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

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

    :!rm %
    

    【讨论】:

    • 它是如此简单,以至于我几乎不敢相信我需要为此创建一个脚本。谢谢。
    • !rm %删除,有没有办法避免vim回到缓冲区时出现警告?
    • 如果文件名中有一些特殊字符,该命令将不起作用,例如如果文件名是 20130711-contacts #285.vcf,其中有空格,它会说 'rm: cannot remove `20130711 -contacts': 没有这样的文件或目录'
    • @saeed144,如果文件名中有空格(或您不想在 shell 级别解释的其他字符),您需要用引号将文件名 (%) 括起来:!rm "%".
    • 数据危险警告! 仅使用 %(文件路径(vim 术语中的“文件名”)最初调用,可能是相对的,例如只是文件名)而不是%:p(绝对文件路径),如果您忘记了:cded 那里,您可能会在另一个目录中删除同名文件。因此,如果您仍然映射它,我强烈建议使用%:p 而不是%
    【解决方案3】:

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

    用自己的话eunuch.vim提供

    最需要它的 UNIX shell 命令的 Vim 糖。同时删除或重命名缓冲区和基础文件。将findlocate 加载到快速修复列表中。以此类推。

    完美。如果我们在 UNIX 系统上,它有我们需要的东西,加上一些额外的工具。

    你要找的命令是

    :Remove!
    

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

    【讨论】:

    • 我正在寻找一种不用插件的方法,所以我会接受你的其他答案。该插件看起来不错:-)
    • 如果你需要mvmkdirfind等vim方式,这个插件非常方便。强烈推荐。
    【解决方案4】:

    我喜欢能够从 vim 中删除文件,但我也很担心意外删除由于某种原因尚未受版本控制的重要工作。我发现将来自@glts 和@accolade 的先前信息与this answer 结合起来,了解如何在退出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
    

    如果你比我更偏执,你可以在第一行追加&lt;CR&gt;

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

    而且只需按回车键一次。

    【讨论】:

    • 我强烈建议在编写脚本时使用expand('%:p') 而不是@%。 (虽然我很高兴你采纳了我的提示 :) 简洁的好处在脚本中是微不足道的。更重要的是:)%:p 会将文件名扩展为完整的绝对路径(它可能已经是也可能不是)。仅使用%,如果您忘记了:cded 那里,您可能会删除另一个目录中的同名文件。
    • 感谢您指出这一点!我相应地更新了我的答案。
    【解决方案5】:

    您可以分两步完成:

    1. 另存为新文件

      :w 新文件名

    2. 删除旧文件

      ! rm 旧文件名

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-28
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 2023-02-01
        • 2015-08-31
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多