sublime text 3 中文排序外掛
阿新 • • 發佈:2020-12-04
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!