美文网首页Sublime Text
Sublime Text进阶(一) 定义自己的Command

Sublime Text进阶(一) 定义自己的Command

作者: yongaliang | 来源:发表于2017-09-19 17:08 被阅读89次

    前言

    还记得刚实习的时候,那时候经常使用sql,然后需要查找一堆特定的id返回来的数据,
    id存在Excel表格的一列里面,我们需要将id复制出来两边加上双引号,然后用逗号分隔放在sql的in()里面.
    单纯的我将数据复制到文本编辑器里面,然后一个一个加双引号加逗号,然后再变成一行.
    你们能想象在数据多一些的时候,那酸爽的程度...

    好在隔壁的大佬解救了我,向我介绍了Sublime Text 和里面的批量编辑功能


    imageimage

    这一神奇又装逼的效果成功的吸引了我,从此过上了吸Sublime Text 的生活...


    对上图操作分析我们可以发现做了下面步骤

     ctrl + a   = 全选
     ctrl + shift + l = 选中行批量编辑
     ctrl + home = 跳到行首
     插入字符串 = "
     ctrl + end = 跳到行尾
     插入字符串 = ",
     delte = 右删除
     ctrl + end = 跳到行尾
     backspace = 左删除
    

    上面的操作大大缩短了我前面提到的场景花费的时间,在不短的一段时间里,经常敲这一段代码,甚至闭着眼也能打出上面一套连招.但是对于喜欢懒到极致的想法:我可不可以更快,甚至只按一个键就实现上面的操作呢?


    设置过自定义快捷键的小伙伴们,就会知道每一个keys对应的其实是一个Sublime封装好的command,如:

    { "keys": ["ctrl+a"], "command": "select_all" },
    { "keys": ["ctrl+shift+l"], "command": "split_selection_into_lines" },
    
    

    可以看到我们的 "ctrl+a" 其实对应的就是 "select_all" 命令, "ctrl+shift+l" 对应的就是 "split_selection_into_lines" ,我们可以从字面意思判断该快捷键的功能,同时想知道某个功能的快捷键对应的是什么的时候,可以在keys binding里面搜索关键词找到对应的keys.

    既然一个"keys"对应的是一个命令,那么可不可以一个"keys"对应多个命令呢?这就是本篇文章要讲的核心内容.


    正文

    sublime.log_commands(True)

    在sublime里面输入 ctrl + ` 打开console面板,输入 sublime.log_commands(True) 开启log模式. 之后的每一次操作,都会在console里面显示出来.

    imageimage

    创建一个 command

    import sublime
    import sublime_plugin
    class XxxCommand(sublime_plugin.WindowCommand):
        def run(self, reverse=False):
            window = self.window
            window.run_command("select_all")
            window.run_command("split_selection_into_lines")
    

    用上面的模板创建一个xxx.py(文件名可以随意,建议对应class name)存到/User目录下面,当保存的时候,Sublime会自动重新加载User下面修改/新增的py文件.
    此处可以不需要安装python环境,因为Sublime有自带Python,只需要保存,Sublime Text就会重新加载.
    根据这个特性可以用print()来输出一些log,在初学python的时候很方便的测试.


    imageimage

    如果你使用ctrl+b去编译的话,可能会报下列错误,因为sublime_plugin包并不在python的libs里面,需要自行导入sublime的包到libs下.

    ModuleNotFoundError: No module named 'sublime_api'
    

    sublime会根据class名生成对应的command,注意class name 要使用驼峰式结构,且一定为Command结尾

    XxxCommand = xxx
    AaaBbbCommand = aaa_bbb
    AaaBbbCccCommand = aaa_bbb_ccc
    

    新建一个keys Mapping

    当我们保存上面的文件xxx.py 到/User目录下面后,使用ctrl+`可以看到sublime 已经重新加载了xxx.py文件,那么此时在sublime 里面其实已经有了xxx命令了,我们在到Key Bindings里面添加我们的Keys Mapping

    { "keys": ["f5"], "command": "xxx" },
    

    此时我们使用f5,即相当于执行了xxx命令,然后就会执行XxxCommand里面的run方法,而依次执行 select_all, split_selection_into_lines 命令


    imageimage

    window.run_commad()

    Runs the named WindowCommand with the (optional) given args. This method is able to run any sort of command, dispatching the command via input focus.

    run_command(string, <args>)
    

    参考官方文档API 可以看到run_command有两个参数,
    第一个参数是命令的名字,第二个参数是命令的入参,如果有一些命令有入参的话,可以填参数,下面是使用的例子

    import sublime
    import sublime_plugin
    class xxxCommand(sublime_plugin.WindowCommand):
        def run(self, reverse=False):
            window = self.window
            window.run_command("select_all")
            window.run_command("split_selection_into_lines")
            window.run_command("move_to",{"extend":False,"to":"bol"})
            window.run_command("insert", {"characters": "\""})
            window.run_command("move_to",{"extend":False,"to":"bol"})
            window.run_command("move_to",{"extend":False,"to":"eol"})
            window.run_command("insert", {"characters": "\","})
            window.run_command("right_delete")
            window.run_command("move_to",{"extend":False,"to":"eol"})
            window.run_command("left_delete")
    

    效果


    imageimage

    相关命令的参数可以先打开Log,然后输入对应命令的键,再根据输出的log就确定需要哪些参数了.


    先到这先,希望对你有帮助.

    相关文章

      网友评论

      • 445f4a21656e:我是刚接触sublime 不久,而且我也是变成小白,问问题可能太low,还希望不吝赐教,谢谢
      • 445f4a21656e:我按您文中的样式建了一个xxx.py的文件,放到了sublime text3安装文件夹下的Data/Packages/User文件夹里
        下面是xxx.py文件的内容
        import sublime
        import sublime_plugin


        class xxxCommand(sublime_plugin.WindowCommand):
        def run(self, reverse=False):
        window = self.window
        window.run_command("stata_execute {"Mode": "do", "selection": "line"}"

        然后我在sublime text软件快捷键设置里添加了一行快捷键
        { "keys": ["f5"], "command": "xxx"},

        可是我选中一行stata代码按f5,用ctrl+'打开显示的命令是 command:xxx
        并没有代替之前的执行代码的快捷键alt+d,请问我是哪里错了嘛?
        还有一个疑问,您文中的xxx有时是Xxx有时是xxx,请问第一个x什么时候要大写??
        445f4a21656e:@yongaliang 受教了,万分感谢!
        yongaliang:应该是 window.run_command("stata_execute",{"Mode":"do","selection":"line"})
        run_command 的用法是 run_command(string, <args>) ,第一个参数是命令的名字,第二个是命令的参数(可选) ,你可以参考看一下 APIhttp://www.sublimetext.com/docs/3/api_reference.html

        我的理解是你只是想改一个快捷键,所以你可以在key bindings 里面添加这个
        { "keys": ["f5"], "command": "stata_execute" ,"args": {"Mode":"do","selection":"line"} },
        设置自定义快捷键,

        xxxCommand 第一个字母大小都可以,但是写大写是比较好的,遵循命名规范
      • 445f4a21656e:您好,可以请教一个问题吗??我是用的sublime text3当做stata的代码编辑器。在sublime 中写好的stata某一行代码想发送到stata软件运行的快捷键想设置成f5,怎么设置呢??
        已知之前我在sublime 中运行一行stata代码的快捷键是alt+d,我想把他改成f5这一个按键。怎么改呢?我输入ctrl+'打开后,按alt+d运行代码下面显示的命令是 command: stata_execute {"Mode": "do", "selection": "line"}
      • Floyda:666~
        简单的说, 楼主把宏的功能拆分了
        但是因为Sublime的宏, 有些command是不能记录的.
        所以楼主这样拆分之后, 是最完整的Command记录器和播放器
        yongaliang:谢谢~:flushed:

      本文标题:Sublime Text进阶(一) 定义自己的Command

      本文链接:https://www.haomeiwen.com/subject/rhcgsxtx.html