【问题标题】:Sublime Text 3 macro to delete x lines from caretSublime Text 3 宏从插入符号中删除 x 行
【发布时间】:2017-02-21 22:31:18
【问题描述】:

我想创建一个 Sublime Text 3 宏来从光标中选择 111 行并删除它们。我试着记录下来,但它所做的只是向后删除一个字符,我仍然对此感到困惑。然后我研究了手动编写宏和相关命令here,但我仍然无法从该页面确定我想要的是否可能,如果是的话,如何。非常感谢您对此的帮助。

【问题讨论】:

    标签: macros automation sublimetext3


    【解决方案1】:

    不幸的是,没有内部的 Sublime Text 命令可以一次执行多个移动。但是,可以通过插件代码定义自己的移动命令,这样您就可以解决这个问题。

    要走这条路,从菜单中选择Tools > Developer > New Plugin... 并将默认代码替换为以下代码,然后将文件保存为python文件(例如move_repeat.py)。通过使用菜单项来执行此操作,Sublime 将确保您的插件存储在您的 User 包中。

    import sublime
    import sublime_plugin
    
    class MoveRepeatCommand(sublime_plugin.TextCommand):
        def run(self, edit, repeat=1, **kwargs):
            for num in range(repeat):
                self.view.run_command("move", kwargs)
    

    这实现了一个名为 move_repeat 的新命令,它替代了 move 命令,提供了一个额外的参数 repeat,用于指定执行您提供的移动的次数。

    作为替代品,这可用于任何光标移动(行、单词等)。

    使用这个,你的宏变成如下:

    [
        {
            "command": "move_repeat",
            "args":
            {
                "by": "lines",
                "extend": true,
                "forward": true,
                "repeat": 111
            }
        },
        {
            "command": "left_delete"
        }
    ]
    

    在这里,我只是通过手动编码创建了宏。如果您想通过实际的宏录制来做到这一点,您需要以另一种方式进行。

    例如,您可以只记录下一行的宏并删除,然后手动添加额外的值,或者您可以先将键绑定绑定到重复的命令,然后再进行宏记录。

    【讨论】:

    • 非常感谢!我什至没有想到 ST3 不允许重复命令,奇怪的是它没有提供这样做的方法,但这是一个绝妙的解决方案。我只是在正确的时间回到这个问题,因为我发现另一个需要重复宏命令。一个问题 - 将run_command("move") 替换为另一个命令可以重复其他命令,还是专门设计用于move
    • 它的编写方式将重复您在run_command 中输入的任何命令,是的。尽管在这种情况下您可能还想重命名该类,以便命令名称更有意义。
    • 太棒了,正是我想听到的。还有一件事——如果你重复一个任意大的数字并且它到达文档的末尾,这个函数会如何?我目前正在寻找在文档结束时立即停止运行的内容,以确保不会删除任何其他行,但不知道在那种情况下会如何表现。跨度>
    • 如果您尝试向下移动,例如100 次,但只剩下 9 行,然后它会额外运行 91 次,但他们不会做任何事情,所以最坏的情况是你只是在浪费时间。如果您希望整个宏停止并且不执行任何操作,则涉及更多。我认为您不能以这种方式终止宏。在这种情况下,您最好编写一个自定义命令来代替执行所有操作,以便它可以一路检查以查看是否仍然可以继续运行。
    • 很公平。感谢你的帮助。 :)
    【解决方案2】:

    凌乱的方式

    从那以后,我设法找到了一种录制宏的方法。出于某种原因,录制器没有通过鼠标注册文本选择,所以我在录制宏时必须通过键盘快捷键选择文本。这样做的原因是它创建了我描述的宏,尽管它也会导致我猜测的脚本远不如由知情人士编写的脚本那么优雅。

    这是我最终得到的脚本的简化版本:

    [
        {
        "args":
        {
            "by": "lines",
            "extend": true,
            "forward": true
        },
        "command": "move"
    },
    {
        "args":
        {
            "by": "lines",
            "extend": true,
            "forward": true
        },
        "command": "move"
    },
    {
        "args":
        {
            "by": "lines",
            "extend": true,
            "forward": true
        },
        "command": "move"
    },
    {
        "args":
        {
            "by": "lines",
            "extend": true,
            "forward": true
        },
        "command": "move"
    },
    {
        "args":
        {
            "by": "lines",
            "extend": true,
            "forward": true
        },
        "command": "move"
    },
    {
        "args": null,
        "command": "left_delete"
    }
    ]
    

    它很粗糙。它通过使用move 命令一次选择一行来工作。这意味着需要为您要选择删除的每一行重复此命令块。就我而言,我需要其中的 111 个。希望有人会出现并提供更好的解决方案,但在那之前,这可以完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 2020-06-25
      • 2018-12-29
      • 2016-02-08
      • 1970-01-01
      • 2015-09-01
      • 2015-02-04
      相关资源
      最近更新 更多