微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Sublime 插件文本输入 插件命令面板入口键绑定

如何解决Sublime 插件文本输入 插件命令面板入口键绑定

我一直在观看有关收集文本的 OdatNurd youtube 插件开发教程。

我想通过映射键执行命令面板命令

json 命令文件

[
  {
    "caption": "A sample command","command": "example","args": {
        // "message": "Sample",// "position": 0
    },},]

我的命令的键映射

{ "keys": ["ctrl+3"],"args": {"message": "1"}}

我遇到的问题是我的 sublime-command json 文件中有 2 个参数,我不想传递其中一个值,但是通过键映射执行抱怨命令需要 2 个参数,我已经通过1.

解决方法

我不知道您正在观看哪些视频,因为您没有包含任何链接,但可以尝试的一种选择是对您不想发送的选项使用 null 值(因为某些原因?)。例如:

{ "keys": ["ctrl+3"],"command": "example","args": {"message": "1","position": null}}

在 Python 中,这转化为

example(message="1",position=None)

我不知道你的类 ExampleCommand 的结构,所以我不知道它是否会在 null/None 上窒息,但值得一试。

,

由于您没有提供您正在使用的命令的示例实现,所以有点不清楚您可能会出现什么问题。但是,根据您描述的症状,我可以想出可能出现问题的情景。

为了清楚起见(现在以及对于尚未观看相关视频的任何人),以下是您引用的第一个视频中出现的插件示例,以及相关的命令面板条目和它的键绑定:

插件

import sublime
import sublime_plugin


class MessageInputHandler(sublime_plugin.TextInputHandler):
    def next_input(self,args):
        if 'position' not in args:
            return PositionInputHandler()


class PositionInputHandler(sublime_plugin.ListInputHandler):
    def list_items(self):
        return [
            ('Top of file',0),('Botto of file',-1)
        ]


class ExampleCommand(sublime_plugin.TextCommand):
    def run(self,edit,message,position):
        if position < 0:
            position = self.view.size()

        self.view.insert(edit,position,message)

    def input(self,args):
        if 'message' not in args:
            return MessageInputHandler()
        elif 'position' not in args:
            return PositionInputHandler()

命令面板入口

    { "caption": "An example command","command": "example" },

键绑定

    { "keys": ["ctrl+3"],"args": {
        "message": "1"
    }},

如此处所定义,该命令有两个参数,message 是要插入的一些文本,position 是要插入的位置。

由于 run 方法声明命令接受两个参数,在正常情况下执行命令而不提供两个参数将导致 Python 错误,因为命令的参数传递给 run(),如果没有所有参数,则对该方法的调用是不正确的。

input() 方法与命令面板中的命令结合使用会改变这种行为; Sublime 将在内部捕获错误,注意该命令实现了 input(),然后调用它以查看它是否应该通过命令面板提示用户提供任何缺少的参数。

这里的重要部分是只有当命令在命令面板中时才会发生这种情况,并且提示的参数完全在命令本身的控制之下,因为 Sublime 不能对缺失的参数应该代表什么。

使用上面的插件示例,通过命令面板条目执行命令会首先询问您要插入的文本,然后是列表输入处理程序中的位置。

使用键绑定也会调用命令,但现在您得到的提示会直接跳转到 ListInputHandler 询问您在哪里进行插入,跳过文本提示。

为什么?因为 input() 的实现会检查提供的参数,如果没有给出参数,只会提示您输入 message;由于键绑定提供了该参数,它跳到检查 position 参数,发现它丢失,并提示您输入。

根据您的原始问题:

我遇到的问题是我的 sublime-command json 文件中有 2 个参数,我不想传递其中一个值,但是通过键映射执行抱怨命令需要 2 个参数,我已经通过1.

首先要注意的是,关于命令面板中的条目,此处提供的参数仅在通过命令面板实际执行命令时使用。当通过键绑定执行时,不使用命令面板配置(除了条目必须存在)。

因此,根据您的原始问题,所有其他条件都相同,只要 input() 方法存在并且知道请求正确的参数,键绑定就应该按预期工作。

例如,如果未定义 input(),则 Sublime 无法提示您,并且您会收到错误消息:

Traceback (most recent call last):
  File "/home/tmartin/local/sublime_text_4101/Lib/python38/sublime_plugin.py",line 1512,in run_
    return self.run(edit,**args)
TypeError: run() missing 1 required positional argument: 'position'

或者,如果定义了 input() 方法但不知道它应该查找丢失的参数并提示您输入,那也会导致问题:

    def input(self,args):
        if 'message' not in args:
            return MessageInputHandler()

在这种情况下,该方法被调用,但由于它不查看 position 是否是丢失的参数,它从底部返回 None,Sublime 不会提示您,你会得到和上面一样的错误。

在上面的评论中你也提到了这一点:

我认为我没有很好地解释这个问题。我已经设置了一个我使用 Sublime 标准 shift/command/p 执行的命令它使用 textinputhandler 和一个 listinputhandler。它和相关的 python 插件使用 shit/cmd/p 可以正常工作,但是如果我设置自己的键盘映射,我必须提供两个参数(文本和列表条目)。当键映射提供了一个值时,我找不到触发 listinputhandler 的方法,即使该值是 None

同样,如果没有看到代码,很难准确地说出可能发生的事情。但是,这适用于该命令面板条目(不提供参数)但不适用于键绑定这一事实表明您的 input() 方法存在问题。

特别是,input() 仅被调用一次,并且预期为特定参数返回 InputHandler 的实例。 input() 返回的输入处理程序用于提示输入特定参数,当用户完成时,调用输入处理程序上的 next_input() 以询问它“我们从哪里开始?”

如上面的示例插件和视频中所定义,MessageInputHandler 对此的回应是“如果 position 参数也缺失,请在下一个请求”。

因此,如果这适用于命令面板而不是键绑定,则最可能的原因是 input 方法错误;从缺少两个项目的命令面板导致 input() 要求 message,然后 message 要求 position,而从提供 message 的键绑定,input() 必须返回 None,阻止它请求 position 并导致您的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。