sublime 做一个变量翻译插件
指标
中文写一个变量名, 鼠标移上去调用命令能将中文单词翻译成变量名,要求能抉择是大驼峰小驼峰还是下划线
开始
Tools > Developer > New Plugin...
import sublimeimport sublime_pluginclass ExampleCommand(sublime_plugin.TextCommand): def run(self, edit): self.view.insert(edit, 0, "Hello, World!")
首先思路就是先能取到鼠标所在的单词.
因为 sublime 是反对多光标的, view.sel()
会返回数组
for region in self.view.sel(): print(region)
ctrl+~
关上控制台, 输出view.run_command('example')
看打印后果。
tip:
sublime插件最终的命令名是取类名的每个单词,而后用下划线拼接,最初去掉`command`字符而来.如果类名批改为 `TestCommand`, 那么应该输出`view.run_command('test')`如果类名批改为 `TestDevCommand`, 那么应该输出`view.run_command('test_dev')`
拿到鼠标所在的地位, 能够通过view.word(regin)
拿到整个单词的地位
当初代码如下:
for region in self.view.sel(): passselection = self.view.word(region)print(selection)
调用 API
sublime 中只能应用内置的模块,所以应用urllib
, API 如下:
urllib.request.urlopen(url, data)
留神: 如果是get
申请第二个参数不必填,填了就代表是post
申请, 对于get
咱们本人去拼接url
对于第三方翻译平台,我应用的是百度,因为在vscode
中我也做了一个一摸一样的插件,所以 API 就拿来用了。
申请第三方翻译平台代码:
import hashlibimport jsonfrom urllib import request,parsedef translateBaidu(self, q, fromq, to): appid = '20200921000570318' secret = 'GLMeRH02ZIQHOCIPlJhW' salt = random.random() sign = appid + q + str(salt) + secret url = 'https://fanyi-api.baidu.com/api/trans/vip/translate' data = { "q": q, "appid": appid, "from": fromq, "to": to, "salt": str(salt), "sign": hashlib.md5(sign.encode('utf-8')).hexdigest() } encodeddata = parse.urlencode(data) print(encodeddata) req = request.Request(url + '?' + encodeddata) r = request.urlopen(req) print(r)
字符串整合
拿到翻译后差不多是这样的:
Aa bb cc
咱们须要依据空格分隔单词,而后拼接成大小驼峰等样子。
def big_hump(self, s): arr = enumerate(s.split()) arr = map(lambda x: x[1][0].upper() + x[1][1:], arr) res = ''.join(list(arr)) return res# aaBbCcdef small_hump(self, s): def s1(x): if x[0] == 0: return x[1][0].lower() + x[1][1:] else: return x[1][0].upper() + x[1][1:] arr = enumerate(s.split()) arr = map(s1, arr) res = ''.join(list(arr)) return resdef underscore_hump(self, s): arr = enumerate(s.split()) arr = map(lambda x: x[1].lower(), arr) res = '_'.join(list(arr)) return res
这里能够看到咱们英语水平有待进步,这也正是做这款插件的起因。
提供抉择
做出大小驼峰和下划线三种款式后,须要提供给用户抉择,这里调用这个 API 出个弹窗
view.show_popup_menu(list, done_func, index)
最初
因为 sublime 不像 vscode 身家硬, 插件上传轻易写, sublime package control 插件想要给他人用还得审核,
以下是全副代码, 保留到%appdata%\Sublime Text\Packages\User
上面就好
%appdata%\Sublime Text\Packages\User
间接复制到资源管理器关上就行,
import sublimeimport sublime_pluginimport refrom urllib import request,parseimport randomimport hashlibimport jsonclass TranslateCommand(sublime_plugin.TextCommand): word_list = [] region = None # 定义异样解决 def handlingExceptions(code): codes = { "52001": "申请超时,查看网络后重试" , "52002": "零碎谬误, 查看百度翻译官网布告", "52003": "请查看appid或者服务是否开明", "54000": "必填参数为空", "54001": " 签名谬误", "54003": "拜访频率受限", "54004": "账户余额有余 ", "54005": "长query申请频繁, 请升高长query的发送频率,3s后再试 ", "58000": "客户端IP非法", "58001": "语言不反对", "58002": "服务以后已敞开, 请返回治理控制台开启服务", "90107": "认证未通过或未失效", } def on_done(self, index): if index != -1: self.view.replace(self.editor, self.region, self.word_list[index]) def big_hump(self, s): arr = enumerate(s.split()) arr = map(lambda x: x[1][0].upper() + x[1][1:], arr) res = ''.join(list(arr)) return res # aaBbCc def small_hump(self, s): def s1(x): if x[0] == 0: return x[1][0].lower() + x[1][1:] else: return x[1][0].upper() + x[1][1:] arr = enumerate(s.split()) arr = map(s1, arr) res = ''.join(list(arr)) return res def underscore_hump(self, s): arr = enumerate(s.split()) arr = map(lambda x: x[1].lower(), arr) res = '_'.join(list(arr)) return res # 调用翻译API def translateBaidu(self, q, fromq, to): appid = '20200921000570318' secret = 'GLMeRH02ZIQHOCIPlJhW' salt = random.random() sign = appid + q + str(salt) + secret url = 'https://fanyi-api.baidu.com/api/trans/vip/translate' data = { "q": q, "appid": appid, "from": fromq, "to": to, "salt": str(salt), "sign": hashlib.md5(sign.encode('utf-8')).hexdigest() } encodeddata = parse.urlencode(data) req = request.Request(url + '?' + encodeddata) r = request.urlopen(req) try: data = json.loads(r.read().decode(r.info().get_param('charset') or 'utf-8')) data = data['trans_result'][0]['dst'] word_list = data.split() arr = [] if len(word_list) > 0: arr.append(self.small_hump(data)) arr.append(self.big_hump(data)) arr.append(self.underscore_hump(data)) else: arr.append(data) return arr except(IndexError, IndentationError): print('json解析异样') def run(self, editor): self.editor = editor word_index = -1; for region in self.view.sel(): word_index = region if word_index != -1: selection = self.view.word(word_index) self.region = selection word = self.view.substr(selection) res = re.search('[\u4e00-\u9fa5]', word) if res: data = self.translateBaidu(word, 'zh', 'en') self.word_list = data self.view.show_popup_menu(data, self.on_done, 0) pass
如果sublime报错, 那应该python文件缩进出毛病了, ctrl+P
调用一下命令
Indentation: Convert to Tabs
再到Preferences->Key Bindings
, 绑定快捷键
{ "keys": ["alt+n"], "command": "translate"}