Sublime Text 3:确认删除文件

14

有没有一种方法可以确认从树(左边)中删除文件或从上下文菜单中删除选项?

这太容易被忽视了,例如将重命名和点击删除文件混淆。然后文件就不存在了。

我搜索了谷歌并发现应该将其移动到回收站文件夹,但是它不适用于Win7或使用网络驱动器。结果文件实际上已经被删除或移动到某个我迄今未能找到的地方。

使用Sublime Text(build 3083)

6个回答

13

重要提示: 请查看iron77的回答。他说如果您修改Default.sublime-package (选项1和3),则这些更改可能会在Sublime Text更新后被覆盖。

选项1: 修改side_bar.py文件

您可以使用Sublime API来显示确认/取消对话框。您需要的代码在名为side_bar.py的文件中。此文件位于zip文件Default.sublime-package内。在Windows中,它通常位于C:\Program Files\Sublime Text 3\Packages\Default.sublime-package中,并可使用诸如WinRar之类的程序进行探索。

在该文件中,找到DeleteFileCommand并添加以下3行代码,以便将其从此更改为:

class DeleteFileCommand(sublime_plugin.WindowCommand):
    def run(self, files):
        # Import send2trash on demand, to avoid initialising ctypes for as long as possible
        import Default.send2trash as send2trash

对于这个问题

class DeleteFileCommand(sublime_plugin.WindowCommand):
    def run(self, files):
        isSure = sublime.ok_cancel_dialog('Are you sure you want to delete the file?')
        if isSure != True:
            return
        # Import send2trash on demand, to avoid initialising ctypes for as long as possible
        import Default.send2trash as send2trash

我们正在展示一个“确定/取消”的对话框,如果用户没有按下“确定”,那么我们就返回,并且文件不会被删除。

注:

  • 您需要在类DeleteFolderCommand中添加相同的代码,以便在删除文件夹时也进行确认。
  • 最好先备份您的Default.sublime-package 文件,以防万一发生问题。编辑:使用不同的文件夹进行备份,否则包可能会被加载两次,导致问题,正如OP在评论中所说。
  • 由于这是python代码,缩进非常重要,请不要用制表符替换任何空格,也不要添加任何额外的空格,否则它将无法工作(您可以在控制台中看到)。

结果:

Sublime-confirm file deletion

选项2:使用现有程序包

用户leesei他的答案中所说,您可以使用SideBarEnhancements程序包来实现您的目标。该程序包在文件上下文菜单中添加了许多其他功能,如下图所示,但它是一个非常好的选择,因为您只需要安装现有程序包。

SideBarEnhancements package

选项3:从上下文菜单中删除选项

编辑Default.sublime-package 内的Side Bar.sublime-menu (参见选项1),然后删除此行(如果您希望还可删除引用删除文件夹的行):

{ "caption": "Delete File", "command": "delete_file", "args": {"files": []} },

1
非常好!谢谢。(关于备份Default.sublime-package:我在Packages中将其命名为Default-Backup.sublime-package,导致ST3的菜单加载了两次。但是使用Default.sublime-package-BACKUP可以正常工作。) - robbash
@robbash 不用谢。哦,我没有想到备份在同一文件夹中的软件包会被加载两次的问题,我已经在答案中更新了它。 - sergioFC
有人知道ST3中Default.sublime-package现在在哪里吗?$HOME/.config/sublime-text-3/Packages有一个Default目录(没有文件),而且是空的。 - alexanderadam
我现在无法测试它,但认为它位于/opt/sublime_text/Packages/。然而,这个答案声称如果Sublime Text被更新,这些更改可能会被覆盖。 - sergioFC

4

虽然sergioFC的答案非常好,但我有点担心修改 Default.sublime-package,因为 Sublime 更新时它可能会被覆盖,所以修复后每次更新都需要手动重新应用。另一方面,SideBarEnhancements 的功能可能太多了,对于只想在删除文件时获得确认的人来说,这些功能可能并不实用。

或者,您可以创建一个简单的确认对话框,它应该更能抵抗 ST 更新,方法是创建一个文件 (插件)。在 Linux 上,它应该在 ~/.config/sublime-text-3/Packages/User/confirm_delete.py 或者如果您使用的是 Windows/Mac 或者路径不起作用,您可以从顶部菜单中选择:Tools -> Developer -> New Plugin,然后将其保存为 confirm_delete.py - 感谢harrrrrrry提出的建议。要添加的代码:

from Default.side_bar import *

class DeleteFileCommand(sublime_plugin.WindowCommand):
    def run(self, files):
        if len(files) == 1:
            message = "Delete File %s?" % files[0]
        else:
            message = "Delete %d Files?" % len(files)

        if sublime.ok_cancel_dialog(message, "Delete") != True:
            return

        # Import send2trash on demand, to avoid initialising ctypes for as long as possible
        import Default.send2trash as send2trash
        for f in files:
            v = self.window.find_open_file(f)
            if v != None and not v.close():
                return

            send2trash.send2trash(f)

    def is_visible(self, files):
        return len(files) > 0

这段代码基本上是从 Default.sublime-packageside_bar.py 中的 DeleteFileCommand 函数复制而来,再加上同一文件中的 DeleteFolderCommand 的确认对话框。因为 Sublime 在原生的删除文件夹操作时已经有了此类对话框。


3
当我在侧边栏中右键单击文件并选择删除时,会弹出确认框。
可能是由于SideBarEnhancements插件造成的。可以试一下这个插件。

你说得对,肯定是由于 SideBarEnhancements 插件引起的。 - sergioFC
谢谢!我觉得有点太多了,所以选择了@sergioFC的第一个解决方案。 - robbash

2

竟然有一款软件在删除前没有确认对话框,我简直不敢相信。虽然很遗憾但这是事实。这样的软件实在太傻了!


0

很遗憾,没有办法激活确认功能。通常情况下,删除的文件会被移动到回收站,但正如您所提到的,这仅适用于本地文件。共享网络驱动器上的文件仍将立即删除。这是Windows的“特性” :(

在本地,回收站是Windows资源管理器的一部分--而在网络上,您不会在服务器上使用资源管理器。本地资源管理器不会将文件复制到用户的工作站,只是为了将其放入回收站。

但是,您可以实现Microsoft的Shadow Copy,然后用户可以撤消删除并比较版本。这将是目前为止在网络驱动器上的唯一方法,直到Sublime开发人员决定制作可选的确认对话框。


0
根据@iron77的回答,在我的情况下,插件路径可能不存在。更简单的方法是:
1)点击Sublime Text顶部菜单工具->开发者->新建插件
2)粘贴片段
from Default.side_bar import *

class DeleteFileCommand(sublime_plugin.WindowCommand):
    def run(self, files):
        if len(files) == 1:
            message = "Delete File %s?" % files[0]
        else:
            message = "Delete %d Files?" % len(files)

        if sublime.ok_cancel_dialog(message, "Delete") != True:
            return

        # Import send2trash on demand, to avoid initialising ctypes for as long as possible
        import Default.send2trash as send2trash
        for f in files:
            v = self.window.find_open_file(f)
            if v != None and not v.close():
                return

            send2trash.send2trash(f)

    def is_visible(self, files):
        return len(files) > 0

3) 另存为 confirm_delete.py


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接