在SublimeText中编写插件

技术背景

我最近发现自己在打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

然后就可以正常导包使用了


希望对你有所帮助

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇