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"}