技术背景
我最近发现自己在打ctf的时候,总是要开很多软件。有一些功能仅仅对文本进行一些处理而已,似乎没必要开个软件或者运行一个代码文件,因为这样太繁琐了。
我想,最好有一个文本编辑器能够直接做到这一点,也最好能够让我以一种简单的方式编写自己需要的插件。于是我看中了以python语言作为插件的SublimeText文本编辑器。
真怀念啊,上一次用这个软件还是在大一,老师推荐了一些ctfer常用工具的时候。后来渐渐用vscode了,真是兜兜转转又回来了

案例讲解
不废话了,以url编码插件为例,讲讲怎么编写SublimeText插件
现在的需求是对一个字符串进行url编码,但是是全部编码,包括汉字和字母。
常规的url编码工具只会讲一些字符编码,不会全部编码。
// 原始字符串
hello, world!你好
// 全部编码, 我们要的效果
%68%65%6C%6C%6F%2C%20%77%6F%72%6C%64%21%E4%BD%A0%E5%A5%BD
// 常规工具能够实现的效果
hello%2C%20world%21%E4%BD%A0%E5%A5%BD
首先创建插件文件,点击工具->插件开发->新建插件

然后会看到实例代码如下:
import sublime
import sublime_plugin
class ExampleCommand(sublime_plugin.TextCommand):
def run(self, edit):
self.view.insert(edit, 0, "Hello, World!")
我们首先修改这个class名字,这个名字在后面要用到
把它改成首字母大写的驼峰命名,Command保留,Example部分修改
class UrlEncodeAllCommand(sublime_plugin.TextCommand):
这里命名好之后,将其去掉Command,按照大小写拆开,转小写并用_拼接字母,就是这个插件的名字了
比如我将其命名为UrlEncodeAllCommand,则插件名为url_encode_all,这是Sublime的规则
然后我们编写代码,使用以下两行就可以对这个软件的相关内容进行更改了
import sublime
import sublime_plugin
在网上有相关手册,这里给出链接:插件扩展API参考 – Sublime 官方文档
我们把核心代码编写好:
import sublime
import sublime_plugin
class UrlEncodeAllCommand(sublime_plugin.TextCommand):
def run(self, edit):
for region in self.view.sel():
if not region.empty():
text = self.view.substr(region)
# url编码
new_text = urlencode(text)
self.view.replace(edit, region, new_text)
def urlencode(str):
result = []
for char in str:
code = ord(char)
if 0 <= code <= 255:
result.append(f"%{code:02X}")
else:
# 对于中文字符,使用UTF-8编码
bytes_list = char.encode('utf-8')
for byte in bytes_list:
result.append(f"%{byte:02X}")
return ''.join(result)
代码的含义是对于每一块选中的区域,使用urlencode函数转化之后,替换掉原来的内容
请注意,Sublime4的插件仅支持python3.3或python3.8两个版本,请勿超出这个范围
如果你需要导入第三方包,却发现用不了,请往后看,我会介绍导包的方式
编写好之后,保存到Sublime的插件目录下,在Windows上,默认为:
C:\Users\[你的计算机用户名]\AppData\Roaming\Sublime Text\Packages\
我们在这个目录下新建一个文件夹,叫做Code,保存上述文件到Code文件夹,文件名为url_encode_all.py
我希望能够通过右键菜单的方式使用该插件。新建一个文件,内容为:
[
{
"caption": "编码",
"id": "code",
"children":
[
{
"caption": "url编码(全字符)",
"command": "url_encode_all"
}
]
}
]
- caption为菜单项的名字
- children为子菜单项
- command为要执行的命令,需要与之前的类名对应
- id为标识符,请随意
如果想要增加菜单项,则在第一个[]里面添加,{...}
如果想要增加子菜单项,则在children的[]里面添加,{...}
三级菜单项以此类推
将该配置文件命名为Context.sublime-menu
也放到Code文件夹下
我想要设置该插件的版本为python3.8,则新建一个文件,内容为3.8,文件名为.python-version,还是保存到Code文件夹下
如果使用python3.3,则不需要新建该文件,建了也可以
将这些文件保存好后,理应可以使用插件了,如果不行可重启Sublime
或者点击视图->显示/隐藏控制台来看看控制台,里面会有插件加载的信息和报错信息
每当你更新并保存url_encode_all.py文件时,也可以在控制台中看到Sublime自动重新加载了一遍插件
之后就可以选中文本,通过右键菜单使用插件了

结果:

至此,一个url全字符编码的插件就写完了
导入第三方包
插件用的是SublimeText自带的python解释器,这两个版本的解释器可能不含你想要的第三方包,需要人工添加
先下载第三方包的源码或者安装包
我以pyperclip包为例,先下载对应python3.8的安装压缩包,通常你可以在官网或者别的什么地方下载到:

可以看到,源码在./src/pyperclip中
我们将pyperclip文件夹复制到Sublime的插件的python解释器的位置,默认为:
[安装目录]\Sublime Text\Lib\python38
[安装目录]\Sublime Text\Lib\python33

然后就可以正常导包使用了
希望对你有所帮助
