1. 程式人生 > 實用技巧 >sublime text 3 中文排序外掛

sublime text 3 中文排序外掛

ST3 的排序不支援中文按拼音排序,所以需要搞一個外掛來支援這一特性

pypinyin 這個庫可以把中文轉成拼音,可惜不支援 python3.3,而 ST3 內建的 python 就是 3.3

我係統中的 python 是 3.8,是可以用 pypinyin 這個庫的

那麼問題可以轉化為「python3.3 如何呼叫 python3.8 的排序函式」,Interesting!

於是

class RPC(object):
    cmd = """
import json, sys
from pypinyin import lazy_pinyin

arg = json.loads(sys.argv[1])
func, args, kwargs = arg["func_name"], arg["func_args"], arg["func_kwargs"]

def chinese_sort(lst):
    lst.sort(key=lambda x: "".join(lazy_pinyin(x)), reverse=False) # 從小到大
    print(json.dumps(lst))

eval(f"{func}(*args, **kwargs)") # hangj.cnblogs.com
"""
    def __getattr__(self, func_name):
        def _func(*args, **kwargs):
            d = {'func_name': func_name, 'func_args': args, 'func_kwargs': kwargs, 'author': 'hangj.cnblogs.com'}
            arg = json.dumps(d)
            res = os.popen('''python3.8 -c '{}' '{}' '''.format(cmd, arg)).read()
            return json.loads(res)

        setattr(self, func_name, _func)
        return _func

# author: hangj.cnblogs.com
class SortChineseCommand(sublime_plugin.TextCommand):
    def sort(self, edit):
        lines = []
        for selection in self.view.sel():
            if not selection: continue
            lines.append(self.view.substr(selection))

        if len(lines) < 2: return

        rpc = RPC()
        lines = rpc.chinese_sort(lines)

        i = 0
        for selection in self.view.sel():
            self.view.erase(edit, selection)
            self.view.insert(edit, selection.begin(), lines[i])
            i = i + 1

    def run(self, edit, sortbylines=True):
        if sortbylines:
            self.view.run_command('select_every_single_line')

        self.sort(edit)

快捷鍵設定

[
    { "keys": ["alt+f5"], "command": "sort_chinese", "args":{"sortbylines":true}},
    { "keys": ["alt+shift+f5"], "command": "sort_chinese", "args":{"sortbylines":false}},
]

按行排序,或按你選中的文字塊來排序

have fun!