【问题标题】:Open file at specific line number using “open_file” command使用“open_file”命令打开特定行号的文件
【发布时间】:2019-06-15 15:10:48
【问题描述】:

我的问题类似于 SublimeHQ 论坛中的thread

我在Default.sublime-commands 文件中添加了一些条目来打开文件,例如

{ "caption": "File Open: File Name", 
  "command": "open_file",
  "args": {"file": "/path/to/file.ext"} },

它们工作正常,但我希望其中一个在特定行号处打开,但找不到正确的符号。

这不会打开第 123 行的文件,而是打开文件路径:/path/to/file.ext:123

{ "caption": "File Open: File Name", 
  "command": "open_file",
  "args": {"file": "/path/to/file.ext:123"} },

他们建议:

尝试将“flags” : 1 添加到参数列表中。 API open_file 需要有标志ENCODED_POSITION 从文件名中提取行/列,可能是一样的。

{ "caption": "File Open: File Name", 
  "command": "open_file",
  "args": {"file": "/path/to/file.ext:123", "flags":1} },

但这也失败了。

sublime.py

def open_file(self, fname, flags=0, group=-1):

api_reference

open_file(file_name, <flags>)

但在args 键中,我们使用file 而不是file_namefname

在哪里写的?

如何在不创建新插件的情况下做到这一点?

【问题讨论】:

  • 使用您在问题中引用的my plugin 有什么问题?如果您需要有关如何安装它的帮助,请在该广告中发帖,我会给出说明。顺便说一句,在指定 args 时,不必指定 col,它可以省略(row 也是如此,但这会弄巧成拙。
  • @mattst 只需要知道如何在没有插件的情况下进行操作,以及在哪里声明了命令。如果没有办法,那么插件就可以了
  • 没有办法用原生的 Sublime Text 命令来做到这一点。在the thread 中,您可以看到我尝试过的所有组合,但都没有奏效。如果有其他方法可以做到这一点,有人会在线程中这样回答。我认为您需要使用my plugin 来解决问题。
  • @mattst 我会使用你的插件。如果没有其他方法可以做到这一点,也应该在线程中回复。这就是我在这里发帖的原因。有没有办法使用 api 找到命令的可用参数?
  • 不,没有办法使用 API 找到可用的参数。正如 OdatNurd 所说,Sublime Text NATIVE open_file 命令和 API open_file 命令虽然名称相同,但并不是一回事。很可能本机 open_file 命令只需要 1 个 arg,即文件路径。 Sublime Text 的一大优点是当您需要额外或不同的功能时,您通常可以编写一个插件来提供它;在这种情况下,插件只花了我几分钟的时间来编写,并且只有 4 行代码。

标签: sublimetext3 sublime-text-plugin


【解决方案1】:

open_file 命令确实不处理末尾带有编码位置的文件名。该特定命令是在核心中实现的,而不是在插件中实现的,这意味着无法自省它的参数,并且如果您尝试使用不正确的参数调用它,它也不会产生任何类型的错误。因此,无法确定是否有某种方式可以使用编码的位置信息来调用它,而不是手动尝试参数和值来查看它们的作用或要求开发人员提供此类信息(或添加它,如果它是不存在)。

API 参考适用于实际插件;它不会以任何直接方式与可能碰巧以相同名称存在的任何命令相关联。您在实际 API 定义中看到的参数通常与文档中的不同。

其中一个原因是 API 方法通常是类方法,这意味着当您声明它们时它们会采用隐含的 self 参数,而调用它们时不需要。此外,由于清晰度、历史原因等原因,参数的文档名称通常与实际名称不同。一个例子是上面file_namefname之间的区别;除非您使用关键字参数调用该方法,否则这种差异并不重要。

有时 API 方法的参数也未记录在案,这可能出于多种原因。上面的 group 参数就是一个例子,它决定了文件在哪个文件组中打开; API 允许,但除非您查看适当的文件,否则您不知道可以使用它。

这是一种冗长的说法,据我所知,没有办法避免为此使用插件。您链接的论坛帖子中的一个就是一个例子;一个比较简单的例子是:

import sublime
import sublime_plugin


class OpenFileEncodedCommand(sublime_plugin.WindowCommand):
    def run(self, file):
        self.window.open_file(file, sublime.ENCODED_POSITION)

这实现了一个open_file_encoded 命令,允许您将:row:row:col 添加到您提供的文件名中。这与上面链接的插件略有不同,因为它需要明确的rowcol 参数来指定位置。

在实践中,两者之间的关系完全取决于您要如何指定位置信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2012-06-20
    • 2018-05-28
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    相关资源
    最近更新 更多