Sublime Text Plugin打开文件符号

时间:2019-07-11 10:37:31

标签: sublime-text-plugin

我试图执行命令以在文本符号的行处打开文件。 我尝试使用 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,它将显示文件并突出显示该功能。

也许还有另一种方法可以实现相同的目的。

1 个答案:

答案 0 :(得分:1)

经过一番调查,当您向show_overlay提供文本时,它看起来像是直接应用于文本字段的内容,并用作初始显示的简单过滤器,没有任何额外的处理如果您手动输入文本。因此,当您插入包含特殊goto功能(例如您在此处使用的#)的文本时,它将严格用作显示文件的过滤器,但不会执行任何其他操作。

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

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命令。尽管insertTextCommand,但要求window执行它会告诉窗口将命令转发到该窗口中具有输入焦点的任何view,叠加层中的输入区域。

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