[手把手系列] Sublime Text 插件开发小实战

Reference:: Sublime Text API Reference

概览

本文档为有意向开发Sublime Text插件的开发者提供了基础指导。从环境设置到插件的创建、编码、测试,直至最终的分发,确保开发者能够顺利入门插件开发。

插件编写准备工作

1. 环境设置

确保你安装了 Sublime Text。Sublime Text 内置了 Python 解释器,通常是 Python 3.3 或更新版本。

2. 创建插件文件

  1. Sublime Text 的插件文件通常放在特定的 Packages 目录中。你可以通过 Sublime Text 菜单 Preferences -> Browse Packages... 找到这个目录。
  2. Packages 目录中创建一个新的子目录,例如名为 MyPlugin
  3. 在这个目录下创建一个 Python 文件,例如 easy_draft.py。这个文件将包含你的插件代码。

3. 编写插件代码

在你的 Python 文件中,你可以使用 Sublime Text 的 API 创建插件

4. 插件加载

保存文件之后, Sublime Text 将自动加载插件.

5. 运行并测试插件

为了运行并测试插件, 可以通过 Sublime Text 的控制台执行命令。打开控制台(View -> Show Console)或者通过快捷键 Ctrl + ` 直接呼出控制台,然后输入:

python 复制代码
view.run_command('example')

这里的 'example' 是你的命令类名 ExampleCommand 的小写形式,根据 Sublime Text 的约定,类名中的 "Command" 会被省略。

6. 分发插件

  1. 直接压缩打包MyPlugin 文件夹并且分享
  2. Package Control :如果你希望你的插件能够通过 Sublime Text 的 Package Control 被更广泛地安装,你可以提交你的插件到 Package Control。这需要遵循一定的指南和标准。具体步骤可以在 Package Control 提交指南 中找到。

插件示例 Easy Draft

粽子作为一个后端程序员, 经常需要临时处理一些字符, 比如以下场景:

  1. 格式化 JSON 字符串
  2. 将一些数字简单的相加
  3. 根据一些订单号查询数据

这个时候粽子就会很自然的打开 Sublime Text 进行编辑, 不为别的, 只是 Sublime 的列编辑功能使用起来非常舒服. 但是 Sublime Text 不会默认关闭 Tab, 久而久之就会累计非常多的未保存Tab页面, 非常烦人;

因此粽子打算编写一个名为 Easy Draft 的插件, 可以每十分钟自动关闭未被编辑的 Tab 页面, 同时也可以实现一些简单的字符编辑功能.

功能 1: 格式化 JSON 字符串

easy_draft.py文件中编写以下代码

python 复制代码
	  import sublime
	  import sublime_plugin
	  import json
	  # 自动格式化 JSON 字符串
	  class FormatJsonCommand(sublime_plugin.TextCommand):
	      def run(self, edit):
	          # 获取当前视图中的所有文本
	          all_text_region = sublime.Region(0, self.view.size())
	          text = self.view.substr(all_text_region)
	          try:
	              # 尝试解析 JSON
	              parsed_json = json.loads(text)
	              # 美化 JSON 字符串
	              formatted_json = json.dumps(parsed_json, indent=4)
	              # 用美化后的 JSON 替换旧的文本
	              self.view.replace(edit, all_text_region, formatted_json)
	              sublime.status_message("JSON formatted successfully!")
	          except Exception as e:
	              sublime.status_message("Error formatting JSON: " + str(e))
  • 测试代码

    1. 保存文件后, 使用 Ctrl + ` 呼出命令行控制台 键入以下代码后回车
    python 复制代码
    view.run_command("format_json")
  1. 将插件命令绑定到 Command Palette(命令面板)

    命令面板可以通过 Command Shift P 呼出, 或者在菜单(Tools -> Command Palette)下呼出, 可以更方便的执行命令 Format JSON.

  • 创建或编辑 .sublime-commands 文件

    1. 在 Sublime Text 的 Packages 目录下相应的插件文件夹中,创建或编辑一个 .sublime-commands 文件。 这个文件用于定义应该在命令面板中显示的命令列表。如果你的插件文件夹名为 MyPlugin,则可以在 MyPlugin 文件夹中创建一个名为 Default.sublime-commands 的文件。

    2. 配置命令, 在Default.sublime-commands中输入以下内容

      json 复制代码
      [
        {
            // 这是在命令面板中显示的文本
            "caption": "Format Json", 
            // 这是命令的名称,应与 Python 类名的小写匹配(并去除 Command 后缀) 
            "command": "format_json" 
        }
      ]
    3. 运行命令

    保存文件 Default.sublime-commands后, 应当在命令面板中看到Format Json命令.

场景 2: 每隔十分钟自动关闭 Tab 页

easy_draft.py中继续添加代码

python 复制代码
import time
import sublime
import sublime_plugin
# 运行标志
running = False

# 自动清理过期没处理的 view
class AutoCloseOldViewsListener(sublime_plugin.EventListener):
    # 用于存储最后编辑时间的字典
    last_edited_times = {}

    def on_new(self, view):
        # 新建视图时添加时间戳
        self.last_edited_times[view.id()] = time.time()
    def on_load(self, view):
        # 新建视图时添加时间戳
        self.last_edited_times[view.id()] = time.time()
    def on_modified(self, view):
        # 每次视图被修改时更新时间戳
        self.last_edited_times[view.id()] = time.time()

    def on_activated(self, view):
        # 当视图被激活时,也更新时间戳
        self.last_edited_times[view.id()] = time.time()

    def on_post_save(self, view):
        # 当视图保存后更新时间戳
        self.last_edited_times[view.id()] = time.time()

    def on_close(self, view):
        # 当视图关闭时从字典中移除
        if view.id() in self.last_edited_times:
            del self.last_edited_times[view.id()] 

    def check_old_views(self):
        current_time = time.time()
        views_to_close = []
        active_view = sublime.active_window().active_view()  # 获取当前激活的视图
        for view_id, last_edited in self.last_edited_times.items():
            # 检查上次编辑时间是否超过 10 分钟 600 秒
            if current_time last_edited > 600:
                view = sublime.View(view_id)
                              # 关闭非当前代码
                if view and view.is_valid() and view.id() != active_view.id():  # 排除当前激活的视图
                    if view.is_dirty():
                        view.set_scratch(True)
                    views_to_close.append(view)
                    print("View:{} is going to be closed".format(view_id))

        # 关闭旧视图
        for view in views_to_close:
            should_close_view = sublime.ok_cancel_dialog("Do you want to close the file {}?".format(view.name()), "Yes, close it")
            if view and should_close_view:
                del self.last_edited_times[view.id()]
                view.close()
        background_task(self)

def background_task(listener):
    if not running:
        return 
    # 每隔 600 秒执行一次 check_old_views() 方法
    sublime.set_timeout_async(listener.check_old_views, 600000)

def start_background_task():
    global running
    running = True
    listener = AutoCloseOldViewsListener()
    for window in sublime.windows():
        for view in window.views():
            listener.last_edited_times[view.id()] = time.time()
    # 启动定时器
    background_task(listener)

def stop_background_task():
    global running
    running = False

# 插件加载 
def plugin_loaded():
    print("Plugin loaded, starting tasks.")
    start_background_task()

# 插件卸载
def plugin_unloaded():
    print("Plugin unloaded, stopping tasks.")
    stop_background_task()

保存文件之后, 每隔十分钟, 应当Sublime Text 中应当弹出以下对话框

点击Yes, close it后, Tab将会自动关闭注意: 当前获得焦点的Tab页不会被要求关闭.

最后一点小总结

  1. Sublime Text 插件编写步骤整体来说比较便捷, 确保认真阅读并且实践官方API文档;
  2. 在编写插件的过程中可以通过命令行控制台输出运行信息, 方便调试;
  3. 如果你有更好的编写Sublime Text 插件的想法, 可以放在评论区哦
相关推荐
梧桐树04293 小时前
python常用内建模块:collections
python
Dream_Snowar3 小时前
速通Python 第三节
开发语言·python
蓝天星空4 小时前
Python调用open ai接口
人工智能·python
jasmine s4 小时前
Pandas
开发语言·python
郭wes代码4 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
leaf_leaves_leaf5 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零15 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
404NooFound5 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
天天要nx5 小时前
D102【python 接口自动化学习】- pytest进阶之fixture用法
python·pytest
minstbe5 小时前
AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
人工智能·python·支持向量机