Sublime Text 插件开发笔记 @ Wings            分类 技术
发布于 星期三, 四月 28 日, 2021 年
更新于 星期二, 七月 20 日, 2021 年

一直想写几个小插件满足一下自己的需求, 终于动笔啦!

sublime 插件工作原理

运行 sublime 后, 会运行 python. sublime 中进行的一系列操作均是由python的函数完成的. 当然这里的函数是 sublime 自己实现的.

所以我们写的插件, 本质上是对调用命令的"自动化".

插件目录

放在 Packages 下的任意位置即可. 当然可以创建文件夹使得我们的插件更容易被找到.

在 sublime 中按 Ctrl + ~ 呼出 python 交互窗口, 可以看到加载插件的信息.

新建插件

Tools $\to$ Developer $\to$ New Plugin...

然后他会新建一个文件如下:

import sublime
import sublime_plugin


class ExampleCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		self.view.insert(edit, 0, "Hello, World!")

保存至插件目录即可.

API笔记

官网, 请

创建一条文本命令

建一个类, 类名为 YourCommandNameCommand, 继承 sublime_plugin.TextCommand, 如:

class ExampleCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		self.view.insert(edit, 0, "Hello, World!")

根据sublime的命令规则, 这条命令可以被 view.run_command('example') 调用.

可以发现, 就是类名Command之前的前缀. 把驼峰换成小写字母下划线分割的形式就是命令.

创建监听

监听分为事件监听(EventListener)和更精确一点的视图事件监听(ViewEventListener).

视图事件监听直接对应了当前视图(View), 有 self.view 成员变量, 在一些情况下比较方便, 比如监听事件以后需要调用文本命令.

建一个类, 继承 sublime_plugin.EventListener 或者 sublime_plugin.ViewEventListener, 重写监听函数, 如:

class SaveListener(sublime_plugin.ViewEventListener):
	def on_pre_save(self):
		self.view.run_command("replace_punctuations")

查找

  1. View.find(pattern, start_point, <flags>) -> Region

start_point 位置开始查找正则 pattern, 返回区域(Region).

  1. View.find_all(pattern, <flags>, <format>, <extractions>) -> [Region]

查找所有正则 pattern, 返回区域列表

参数目前没用到, 先不记录.

替换

View.replace(edit, region, string)

editsublime.Edit类, 在 sublime_plugin.TextCommandrun() 传入, 直接调用就行.

把区域 region 中的内容替换成 string.

我的小插件

保存时替换中文标点成英文

import sublime
import sublime_plugin

class SaveListener(sublime_plugin.ViewEventListener):
	def on_pre_save(self):
		self.view.run_command("replace_punctuations")

class ReplacePunctuationsCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		self.replace(edit, '. ', '. ')		# 前面其实是中文
		self.replace(edit, ': ', ': ')		# 句号, 冒号, 逗号, 顿号
		self.replace(edit, ', ', ', ')		# 保存文件后他被替换掉了
		self.replace(edit, ', ', ', ')		# 哈哈哈
	def replace(self, edit, src, dst):
		regions = self.view.find_all(src)
		for region in reversed(regions):
			self.view.replace(edit, region, dst)
		if len(regions):
			print(len(regions), src, 'replaced!')

写hugo博客保存时更新lastmod时间

import sublime
import sublime_plugin
import datetime

class SaveListener(sublime_plugin.ViewEventListener):
	def on_pre_save(self):
		self.view.run_command("auto_fill_lastmod")

class AutoFillLastmodCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		filename = self.view.file_name()
		if filename[-3:] == '.md':
			print('The view is markdown')
			region = self.view.find('lastmod: .{19}', 0)
			if not region.empty():
				print('\"lastmod\" has been found')
				region = sublime.Region(region.a + 9, region.b)
				self.view.replace(edit, region, getCurrentTime())
				print('Updated lastmod time')

def getCurrentTime():
	time = datetime.datetime.now()
	time_str = time.strftime("%Y-%m-%dT%H:%M:%S")
	return time_str
留下昵称和邮箱, 可在第一时间获悉回复通知哦~

2021 FLAG

  • 找个妹子
  • 进计科
  • XCPC拿块金牌
  • 补全算法知识, 整全板子
  • 学会Web开发相关知识
  • 在服务器上搭建电子书库
  • 写个游戏并上线
  • 能弹一首曲子
  • 写首完整的曲子
  • 练习悠悠球

个人简介

我叫 Wings, 来自江西上饶, 目前人在西安, 是西电的一名学生.

常以 WingsWingsZengWingsWings的ID在各大小网站上游走, 一般来说, Wings不是我 😔, WingsZeng 一定是我 😊.

热爱算法, 喜欢钻研各种计算机技术.

业余爱好广泛, 只要不是文化课基本上都感兴趣😏.

开发/项目经历

  1. Android游戏 小墨滴的复仇 (弃坑)
  2. Android游戏 Circle Run (弃坑)
  3. Windows游戏 Snague (可能弃坑了吧)
  4. Python后端 Fathy' (可能弃坑了吧)

to be continued

教育经历

时间 学历 学校
2008-2014 小学 上饶市第十二小学
2014-2017 初中 上饶市第四中学
2017-2020 高中 上饶市第一中学
2020-2024 本科 西安电子科技大学
to be continued

比赛/竞赛经历

太久远太小的记不到了…

  1. 2017 国学竞赛初赛江西 没有分数或排名 二乙
  2. 2018 NOIP提高 258 省二
  3. 2019 CSP-S江西专场 145 省二
  4. 2019 数学竞赛初赛 70 没排名 (复赛打铁qaq)
  5. 2020 Gitee|Python贪吃蛇魔改大赛 可能是第四? 二等奖
  6. 2020 西电ACM训练基地熊猫杯 第四 银牌
  7. 2020 西安三校微软学生俱乐部Hackathon 和二等奖最后一名差0.5分 三等奖
  8. 2020 西电星火杯 三等奖
  9. 2020 西电ACM新生赛 第九 金牌
  10. 2020 ICPC 亚洲区域赛 济南站 132名 铜牌
  11. 2020-2021 第二届全国大学生算法设计与编程挑战赛(冬季赛) 924名 铜牌 (别骂了别骂了)
  12. 2020 ICPC 亚洲区域赛 昆明站 打星
  13. 2020 ICPC Asia-East Continent Final 签完到溜 打铁
  14. 西电"智能星"第一届自动驾驶小车比赛 第五 优胜奖|极速奖 本来可以冠军的别骂了别骂了
  15. 2021团体程序设计天体赛(CCCC) 个人二等奖
  16. 2021 西电 miniL CTF 优胜奖
  17. 2021 西电ACM校赛 第9名 金牌
  18. 2021 西电数模校赛 二等奖
  19. 2021 第15届IEEE 第48名
  20. 2021 CCPC 桂林站 打星

to be continued

爱好

技术

  • 算法
  • 独立游戏开发

游戏

  • Minecraft
  • Black Survival
  • I Wanna
  • Celeste
  • Life is Strange
  • Need for speed

运动

  • 篮球
  • 桌球
  • 乒乓球
  • 羽毛球
  • 慢跑

音乐

  • 吉他
  • 词曲
  • 流行

玩具

  • 魔方
    • 三阶速拧
    • 三阶盲拧
    • 高阶
  • yoyo球

追星

  • VAE
  • Benedict Cumberbatch