Tự viết plugin cho Sublime Text

Giới thiệu

Chắc không cần phải giới thiệu nhiều, Sublime Text (ST) là một một trình editor vô cùng mạnh mẽ, nó là mở đầu cho ra đời của một số editor hiện đại khác như Atom, VS Code... Ngoài các tính năng phong phú, hữu ích, ST còn có một bộ sưu tập rất nhiều các plugin.


Tôi hay sử dụng ST để code web, chủ yếu là PHP. Trong quá trình sử dụng ST, tôi có để ý khi di chuột vào tên các phương thức nó sẽ hiện 1 popup danh sách các file có implement phương đó (nếu có). Vì thế, tôi có nảy ra ý tưởng là khi hover vào các hàm PHP nó sẽ hiện ra document của hàm đó và với sự trợ giúp của google, tôi đã tạo được 1 plugin đơn giản cho việc đó => ST-PHP-Hover-Doc. Nó trông như thế này =))

Bài viết này tôi note lại quá trình tìm hiểu của mình để viết plugin đó, áp dụng cho Sublime Text 3. Hy vọng có thể giúp ích cho các bạn.

Plugin development

ST được viết bằng Python và các plugin của nó cũng thế. Do đó, để viết plugin cho ST bạn cần phải biết Python, tuy nhiên cũng chỉ cần biết đến sự tồn tại của nó, biết lập trình và google là có thể viết được rồi 😄

Để tạo 1 plugin cho ST, rất đơn giản, bạn chỉ cần tạo ra 1 file python và lưu nó trong thư mục Packages của ST (bạn có thể định vị thư mục này thông qua menu Preferences -> Browse Packages).

Các file python trong thư mục Packages được quét tự động bởi ST và được tự động reload nếu có thay đổi, do đó việc phát triển và test plugin là rất linh hoạt. Ngoài ra, trong quá trình phát triển plugin, tất cả các lỗi và output của các lệnh print đều được hiển thị ở console của ST (để xem console, bạn có thể dùng tổ hợp Ctrl+~ hoặc qua menu View -> Show Console). Bạn cũng có thể test trực tiếp các câu lệnh python trong console này.

Để tạo plugin mà bạn có thể truy cập nó thông qua các phím tắt, hay thông qua menu,... bạn chỉ cần tạo 1 class kế thừa sublime_plugin.TextCommand và override phương thức run().

Để tạo các plugin lắng nghe các sự kiện như file load, save... bạn tạo 1 class kế thừa sublime_plugin.EventListener và code các phương thức onLoad(), onPostSave(),...

Các ví dụ

** VD plugin đơn giản, dạng TextCommand, chức năng là in ra câu Goodbye, World:

import sublime
import sublime_plugin

class PrintDumpCommand(sublime_plugin.TextCommand):
    def run(self, args):
        print('Goodbye, World')

Sau khi lưu vào thư mục Packages, bạn có thể test plugin này bằng cách mở console của ST và chạy dòng lệnh view.run_command('print_dump'). Hoặc bạn có thể gán nó cho 1 tổ hợp phím tắt, vd: Ctrl+i, mở menu Preferences -> Key Bindings và lưu lại cài đặt:

[
	{ "keys": ["ctrl+i"], "command": "print_dump" },
]

Khi nhấn Ctrl+i, nó sẽ hiển thị dòng Goodbye, World trong console của ST. Có thể cải tiến thêm cho plugin này bằng cách, tự động hiện console khi chạy plugin:

def run(self, args):
    self.view.window().run_command("show_panel", {"panel": "console"})
    print('Goodbye, World')

 

** VD về plugin dạng events listener

import sublime
import sublime_plugin

class EventDump(sublime_plugin.EventListener):
    def on_new(self, view):
        print("new file")

    def on_load(self, view):
        print(view.file_name(), "just got loaded")

    def on_modified(self, view):
        print(view.file_name(), "modified")

    def on_post_save(self, view):
        print(view.file_name(), "just got saved")

    def on_close(self, view):
        print(view.file_name(), "is no more")

Khi lưu lại file python này vào thư mục Packages, ngay lập tức trên console sẽ hiện các thông tin như:

/home/mmm/.config/sublime-text-3/Packages/EventsDump.py just got saved
reloading plugin EventsDump

Thực hiện các thao tác sửa, lưu,... các event cũng được ghi lại:

/home/mmm/.config/sublime-text-3/Packages/EventsDump.py modified
/home/mmm/.config/sublime-text-3/Packages/EventsDump.py modified
/home/mmm/.config/sublime-text-3/Packages/EventsDump.py is no more

Kết luận

Trên đây, tôi đã giới thiệu về cách tạo plugin cho Sublime Text 3 và 2 ví dụ đơn giản về plugin của ST, để tìm hiểu thêm, các bạn có thể tham khảo tài liệu API hoặc forum chính thức của ST:

Trên thực tế các plugin thường được đóng gói dưới dạng các Package, bạn có thể tìm hiểu cách đóng gói package tại: