Sublime Text 插件打开文件符号

Sublime Text Plugin Open file symbol

我试图执行命令以在文本符号行打开文件。 我尝试使用 show_overlay 命令来实现这一点,但如果您尝试在搜索中使用“#”,它将无法正确打开。

例子。创建一个包含文件的项目,

app/code/community/MagicToolbox/MagicZoomPlus/Model/Observer.php:

class MagicToolbox_MagicZoomPlus_Model_Observer {
    public function fixLayoutUpdates($observer) {
    }
}

如果您尝试使用如下命令创建插件:

class MyPluginCommand(sublime_plugin.TextCommand):
    def run(self, view):
            sublime_api.window_run_command(
                self.view.window().id(),
                'show_overlay',
                {
                    'overlay': 'goto',
                    'show_files': True,
                    'text': 'MagicToolbox/MagicZoomPlus/Model/Observer#fixLayoutUpdates'
                }
            )

它不会直接显示文件。但是如果您从搜索输入中删除所有文本,然后再次粘贴它 MagicToolbox/MagicZoomPlus/Model/Observer#fixLayoutUpdates 它将显示该文件并突出显示该功能。

也许还有另一种方法可以达到同样的目的。

经过一些调查,当您向 show_overlay 提供文本时,它似乎只是直接应用于文本字段的内容,并用作初始显示的简单过滤器,无需任何额外处理如果您手动输入文本,就会发生这种情况。因此,当您插入包含特殊转到功能(例如您在此处使用的 #)的文本时,它会严格用作正在显示的文件的过滤器,但不会发生额外的操作。

如您所述,打开叠加层然后输入文本作为两个操作具有预期的效果。因此,为了通过插件执行此操作,您需要通过两个操作来执行此操作:

import sublime
import sublime_plugin


class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.window().run_command("show_overlay", {
            "overlay": "goto",
            "show_files": True
        })
        self.view.window().run_command("insert", {
            "characters": "Observer#fixLayoutUpdates"
        })

这里我们先打开叠加层,然后使用insert命令插入文字。这里的重要关键是要求 window 到 运行 insert 命令。尽管 insert 是一个 TextCommand,但要求 window 执行它会告诉 window 将命令转发给任何 view 恰好有输入焦点的地方window,也就是叠加层中的输入区域

如果您执行此操作的命令没有自行修改文件的选择或内容,您可以通过将其设为 WindowCommand 并使用 [=21] 来缩短它=] 而不是 self.view.window().