前言
还记得刚实习的时候,那时候经常使用sql,然后需要查找一堆特定的id返回来的数据,
id存在Excel表格的一列里面,我们需要将id复制出来两边加上双引号,然后用逗号分隔放在sql的in()里面.
单纯的我将数据复制到文本编辑器里面,然后一个一个加双引号加逗号,然后再变成一行.
你们能想象在数据多一些的时候,那酸爽的程度...
好在隔壁的大佬解救了我,向我介绍了Sublime Text 和里面的批量编辑功能
image
这一神奇又装逼的效果成功的吸引了我,从此过上了吸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里面显示出来.
创建一个 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的时候很方便的测试.
image
如果你使用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 命令
image
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")
效果
image
相关命令的参数可以先打开Log,然后输入对应命令的键,再根据输出的log就确定需要哪些参数了.
先到这先,希望对你有帮助.
网友评论
下面是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什么时候要大写??
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 第一个字母大小都可以,但是写大写是比较好的,遵循命名规范
已知之前我在sublime 中运行一行stata代码的快捷键是alt+d,我想把他改成f5这一个按键。怎么改呢?我输入ctrl+'打开后,按alt+d运行代码下面显示的命令是 command: stata_execute {"Mode": "do", "selection": "line"}
简单的说, 楼主把宏的功能拆分了
但是因为Sublime的宏, 有些command是不能记录的.
所以楼主这样拆分之后, 是最完整的Command记录器和播放器