【发布时间】:2017-02-21 22:31:18
【问题描述】:
我想创建一个 Sublime Text 3 宏来从光标中选择 111 行并删除它们。我试着记录下来,但它所做的只是向后删除一个字符,我仍然对此感到困惑。然后我研究了手动编写宏和相关命令here,但我仍然无法从该页面确定我想要的是否可能,如果是的话,如何。非常感谢您对此的帮助。
【问题讨论】:
标签: macros automation sublimetext3
我想创建一个 Sublime Text 3 宏来从光标中选择 111 行并删除它们。我试着记录下来,但它所做的只是向后删除一个字符,我仍然对此感到困惑。然后我研究了手动编写宏和相关命令here,但我仍然无法从该页面确定我想要的是否可能,如果是的话,如何。非常感谢您对此的帮助。
【问题讨论】:
标签: macros automation sublimetext3
不幸的是,没有内部的 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"
}
]
在这里,我只是通过手动编码创建了宏。如果您想通过实际的宏录制来做到这一点,您需要以另一种方式进行。
例如,您可以只记录下一行的宏并删除,然后手动添加额外的值,或者您可以先将键绑定绑定到重复的命令,然后再进行宏记录。
【讨论】:
run_command("move") 替换为另一个命令可以重复其他命令,还是专门设计用于move?
run_command 中输入的任何命令,是的。尽管在这种情况下您可能还想重命名该类,以便命令名称更有意义。
从那以后,我设法找到了一种录制宏的方法。出于某种原因,录制器没有通过鼠标注册文本选择,所以我在录制宏时必须通过键盘快捷键选择文本。这样做的原因是它创建了我描述的宏,尽管它也会导致我猜测的脚本远不如由知情人士编写的脚本那么优雅。
这是我最终得到的脚本的简化版本:
[
{
"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 个。希望有人会出现并提供更好的解决方案,但在那之前,这可以完成工作。
【讨论】: