Sublime Text 3:确认删除文件

Sublime Text 3: confirm to delete file

有没有办法确认从树中删除文件(左侧)或从上下文菜单中删除该选项?

太容易错过了 rename 而是点击 delete file。然后文件就没了

我用谷歌搜索,发现它应该移至垃圾文件夹,但不适用于 Win7 或使用网络驱动器。结果,文件实际上被删除或移动到我到目前为止未能找到的地方。

使用 Sublime Text(内部版本 3083)

很遗憾,无法激活确认。通常被删除的文件被移动到垃圾文件夹,但正如您提到的,这仅适用于本地文件。共享网络驱动器上的文件仍会立即删除。这是 Windows 'feature' :(

Locally the Recycle Bin is part of Windows Explorer -- and on the network you are NOT dealing with explorer on the server. Explorer locally isn't going to copy the file to the user's workstation just to put it into the recycle bin.

您可以实施 Microsoft Shadow Copy 但是,用户可以取消删除和比较版本。这将是迄今为止网络驱动器的唯一方法,直到 sublime 开发人员决定制作一个可选的确认对话框。

当我通过右键单击边栏中的文件选择删除时,我得到了确认信息。
也许是 SideBarEnhancements。值得一试。

重要:看一下。它说,如果您修改 Default.sublime-package(选项 1 和 3),如果更新了 sublime text,此更改可能会被覆盖。

选项 1:修改 side_bar.py 文件

您可以使用 sublime API 显示 ok/cancel 对话框。您要查找的代码位于名为 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

我们正在显示一个 ok/cancel 对话框,如果用户不按 确定,那么我们 return 并且文件不会被删除。

备注:

  • 您必须在 class DeleteFolderCommand 中添加相同的代码,以便在删除文件夹时也进行确认。
  • 最好先备份您的 Default.sublime-package 文件,以防出现问题。编辑:使用不同的文件夹进行备份,否则包可能会被加载两次,从而导致问题,正如 OP 在他的评论中所说的那样。
  • 因为这是 python 代码缩进非常重要,不要 替换制表符的任何 space 或添加任何额外的 space 否则它不会 工作(你可以在控制台看到它)。

结果:

选项 2:使用现有包

作为user leesei said in you can use SideBarEnhancements package实现您的目标。该软件包向文件上下文菜单添加了许多其他功能,如下图所示,但这是一个非常好的选择,因为您只需要安装一个现有的软件包。

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

编辑 Side Bar.sublime-menu inside Default.sublime-package(见选项 1)并删除它行(如果您还想删除引用删除文件夹的行):

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

而另一方面,sergioFC's answers work great, I'm bit worried of modifying Default.sublime-package, as it might someday get overwritten when Sublime is updated, so the fix would need to be manually re-applied after each such update. 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.pyDeleteFileCommand 函数的副本,结合来自同一文件的 DeleteFolderCommand 的确认对话框,因为 Sublime 有这样的文件夹删除的本机对话框。

WTF 一个删除前没有确认对话框的软件。我简直不敢相信。悲伤但真实。愚蠢的软件!

根据@iron77 的回答,插件的路径不存在(在我的例子中)。更简单的方法是:

1) 点击 Sublime Text 顶栏菜单 Tools -> Developer -> New Plugin.

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.