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!

原文地址:https://www.cnblogs.com/hangj/p/14087212.html