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