mirror of
https://github.com/rubickCenter/rubick
synced 2025-06-20 03:03:40 +08:00
ref: suport shift+escape to quit app
This commit is contained in:
commit
e86290344b
22
README.md
22
README.md
@ -13,26 +13,25 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
首先致敬 uTools!我做 Rubick 旨在技术分享,并不以商业化为目的,uTools 非常优秀,欢迎大家去使用 uTools,毕竟是一个团队在维护,可以享受最新的功能和体验。
|
||||||
|
|
||||||
基于 electron 的工具箱,媲美 utools的开源插件,已实现 utools 大部分的 API 能力,所以可以做到无缝适配 utools 开源的插件。
|
|
||||||
之所以做这个工具箱一方面是 utools 本身并未开源,但是公司内部的工具库又无法发布到 utools 插件中,所以为了既要享受 utools 生态又要有定制化需求,我们自己参考 utools 设计,做了 Rubick.
|
基于 electron 的工具箱,媲美 utools的开源插件。之所以做这个工具箱一方面是 utools 本身并未开源,但是公司内部的工具库又无法发布到 utools 插件中,所以为了既要享受 utools 生态又要有定制化需求,我们自己参考 utools 设计,做了 Rubick.
|
||||||
|
|
||||||
Rubick(拉比克) 是 dota 里面的英雄之一,其核心技能是插件化使用其他英雄的技能,用完即走。非常符合本工具的设计理念,所以取名 Rubick。
|
Rubick(拉比克) 是 dota 里面的英雄之一,其核心技能是插件化使用其他英雄的技能,用完即走。非常符合本工具的设计理念,所以取名 Rubick。
|
||||||
|
|
||||||
## 安装包
|
## 安装包
|
||||||
* [Rubick Mac OS V0.0.2-beta.1](https://github.com/clouDr-f2e/rubick/releases/tag/v0.0.2-beta.1)
|
* [Rubick Mac OS V0.0.2-beta.2](https://github.com/clouDr-f2e/rubick/releases/tag/v0.0.2-beta.2)
|
||||||
* [TODO: Rubick Windows V0.0.2-beta.1](https://github.com/clouDr-f2e/rubick/tree/feat-win)
|
* [Rubick Windows V0.0.2-beta.1](https://github.com/clouDr-f2e/rubick/releases/download/v0.0.2-beta.1/rubick2.Setup.0.0.2-beta.1.exe)
|
||||||
|
|
||||||
## 支持能力
|
## 支持能力。
|
||||||
- [x] 支持 uTools 90% API。可直接按照 uTools 文档开发 Rubick 插件
|
|
||||||
- [x] 支持 uTools github 开源插件。
|
|
||||||
- [x] 支持远程下载安装插件,支持插件开发者模式
|
- [x] 支持远程下载安装插件,支持插件开发者模式
|
||||||
- [x] 支持插件分离
|
- [x] 支持插件分离
|
||||||
- [x] 支持系统命令取色、截屏、帮助
|
- [x] 支持系统命令取色、截屏、帮助
|
||||||
- [x] 支持超级面板,长按右击呼出
|
- [x] 支持超级面板,长按右击呼出
|
||||||
- [x] 支持全局快捷键设置
|
- [x] 支持全局快捷键设置
|
||||||
- [x] 支持搜索本地已安装 app 或 偏好设置
|
- [x] 支持搜索本地已安装 app 或 偏好设置
|
||||||
- [ ] 支持 Windows
|
- [x] 支持 Windows(目前是 mac 的 alpha 版本,功能尚不全,正在迁移中)
|
||||||
- [ ] 支持 Linux
|
- [ ] 支持 Linux
|
||||||
|
|
||||||
|
|
||||||
@ -41,10 +40,11 @@ Rubick(拉比克) 是 dota 里面的英雄之一,其核心技能是插件化
|
|||||||
|
|
||||||
|
|
||||||
## 使用问题
|
## 使用问题
|
||||||
依赖于 `robotjs` dev 环境运行请在 `install` 后执行 `npm run rebuild`
|
1. 依赖于 `robotjs` dev 环境运行请在 `install` 后执行 `npm run rebuild`
|
||||||
|
2. windows 版本目前有了一个最基础的可用版。完整版正在开发中,敬请期待
|
||||||
|
|
||||||
## 目前支持能力
|
## 目前支持能力
|
||||||
### 加载utools生态插件
|
### 加载插件
|
||||||
拿 `github` 上开源的 斗图 插件举例,要加载斗图插件,只需要将代码 clone下来后,复制其 `plugin.json` 进入搜索框即可使用
|
拿 `github` 上开源的 斗图 插件举例,要加载斗图插件,只需要将代码 clone下来后,复制其 `plugin.json` 进入搜索框即可使用
|
||||||
|
|
||||||
斗图:https://github.com/vst93/doutu-uToolsPlugin
|
斗图:https://github.com/vst93/doutu-uToolsPlugin
|
||||||
@ -61,7 +61,7 @@ Rubick(拉比克) 是 dota 里面的英雄之一,其核心技能是插件化
|
|||||||
|
|
||||||
<img src=https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0b113ad547974699b9c73c28bc09b9b1~tplv-k3u1fbpfcp-watermark.image width=500 />
|
<img src=https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0b113ad547974699b9c73c28bc09b9b1~tplv-k3u1fbpfcp-watermark.image width=500 />
|
||||||
|
|
||||||
### utools 自带的系统命令
|
### 系统命令
|
||||||
#### 取色
|
#### 取色
|
||||||
基于 `robot.js` 以及 `iohook` 实现。未使用 C++ 扩展。
|
基于 `robot.js` 以及 `iohook` 实现。未使用 C++ 扩展。
|
||||||
|
|
||||||
|
BIN
build/icons/256x256.png
Normal file
BIN
build/icons/256x256.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
BIN
build/icons/icon.icns
Normal file
BIN
build/icons/icon.icns
Normal file
Binary file not shown.
BIN
build/icons/icon.ico
Normal file
BIN
build/icons/icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "rubick2",
|
"name": "rubick2",
|
||||||
"version": "0.0.2-beta.1",
|
"version": "0.0.2-beta.2",
|
||||||
"author": "muwoo <2424880409@qq.com>",
|
"author": "muwoo <2424880409@qq.com>",
|
||||||
"description": "An electron-vue project",
|
"description": "An electron-vue project",
|
||||||
"license": null,
|
"license": null,
|
||||||
@ -52,6 +52,7 @@
|
|||||||
"target": "pkg"
|
"target": "pkg"
|
||||||
},
|
},
|
||||||
"win": {
|
"win": {
|
||||||
|
"icon": "build/icons/icon.ico",
|
||||||
"target":[
|
"target":[
|
||||||
"nsis",
|
"nsis",
|
||||||
"msi"
|
"msi"
|
||||||
@ -70,6 +71,7 @@
|
|||||||
"electron-store": "^8.0.0",
|
"electron-store": "^8.0.0",
|
||||||
"iohook": "^0.9.3",
|
"iohook": "^0.9.3",
|
||||||
"is-chinese": "^1.4.2",
|
"is-chinese": "^1.4.2",
|
||||||
|
"jian-pinyin": "^0.2.3",
|
||||||
"keycode": "^2.2.0",
|
"keycode": "^2.2.0",
|
||||||
"marked": "^2.0.7",
|
"marked": "^2.0.7",
|
||||||
"md5": "^2.3.0",
|
"md5": "^2.3.0",
|
||||||
|
@ -7,10 +7,12 @@ const configPath = path.join(getlocalDataFile(), './rubick-config.json');
|
|||||||
|
|
||||||
let defaultConfig = {
|
let defaultConfig = {
|
||||||
Darwin: {
|
Darwin: {
|
||||||
|
version: 2,
|
||||||
perf: {
|
perf: {
|
||||||
shortCut: {
|
shortCut: {
|
||||||
showAndHidden: 'Option+R',
|
showAndHidden: 'Option+R',
|
||||||
separate: 'Ctrl+D'
|
separate: 'Ctrl+D',
|
||||||
|
quit: 'Shift+Escape'
|
||||||
},
|
},
|
||||||
common: {
|
common: {
|
||||||
start: true,
|
start: true,
|
||||||
@ -30,10 +32,12 @@ let defaultConfig = {
|
|||||||
global: []
|
global: []
|
||||||
},
|
},
|
||||||
Windows_NT: {
|
Windows_NT: {
|
||||||
|
version: 2,
|
||||||
perf: {
|
perf: {
|
||||||
shortCut: {
|
shortCut: {
|
||||||
showAndHidden: 'Option+R',
|
showAndHidden: 'Option+R',
|
||||||
separate: 'Ctrl+D'
|
separate: 'Ctrl+D',
|
||||||
|
quit: 'Shift+Escape'
|
||||||
},
|
},
|
||||||
common: {
|
common: {
|
||||||
start: true,
|
start: true,
|
||||||
@ -62,7 +66,7 @@ global.opConfig = {
|
|||||||
opConfig.config = JSON.parse(fs.readFileSync(configPath) || JSON.stringify(defaultConfig[platform]));
|
opConfig.config = JSON.parse(fs.readFileSync(configPath) || JSON.stringify(defaultConfig[platform]));
|
||||||
}
|
}
|
||||||
// 重置
|
// 重置
|
||||||
if (!opConfig.config.perf || !opConfig.config.superPanel || !opConfig.config.global) {
|
if (!opConfig.version || opConfig.version < defaultConfig[platform].version) {
|
||||||
opConfig.config = defaultConfig[platform];
|
opConfig.config = defaultConfig[platform];
|
||||||
fs.writeFileSync(configPath, JSON.stringify(opConfig.config));
|
fs.writeFileSync(configPath, JSON.stringify(opConfig.config));
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,9 @@ class Listener {
|
|||||||
// 延时一定时间才能从剪切板内读取到内容
|
// 延时一定时间才能从剪切板内读取到内容
|
||||||
const text = clipboard.readText('clipboard') || ''
|
const text = clipboard.readText('clipboard') || ''
|
||||||
const fileUrl = clipboard.read('public.file-url');
|
const fileUrl = clipboard.read('public.file-url');
|
||||||
|
if (this.isWin) {
|
||||||
|
// todo https://github.com/njzydark/Aragorn/blob/afe4a60972b4255dd417480ca6aca2af1fd8e637/packages/aragorn-app-main/src/uploaderManager.ts#L88
|
||||||
|
}
|
||||||
// 如果之前是文案,则回填
|
// 如果之前是文案,则回填
|
||||||
clipboard.writeText(lastText);
|
clipboard.writeText(lastText);
|
||||||
|
|
||||||
@ -63,6 +66,11 @@ class Listener {
|
|||||||
mainWindow.webContents.send('new-window');
|
mainWindow.webContents.send('new-window');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
globalShortcut.register(config.perf.shortCut.quit, () => {
|
||||||
|
mainWindow.webContents.send('init-rubick');
|
||||||
|
mainWindow.show();
|
||||||
|
});
|
||||||
|
|
||||||
// 注册自定义全局快捷键
|
// 注册自定义全局快捷键
|
||||||
config.global.forEach(sc => {
|
config.global.forEach(sc => {
|
||||||
if (!sc.key || !sc.value) return;
|
if (!sc.key || !sc.value) return;
|
||||||
|
@ -22,7 +22,7 @@ const SYSTEM_PLUGINS = [
|
|||||||
{
|
{
|
||||||
code: 'pick',
|
code: 'pick',
|
||||||
explain: 'rubick 帮助文档',
|
explain: 'rubick 帮助文档',
|
||||||
cmds: ['取色', '拾色', 'Pick color']
|
cmds: ['取色', '拾色', 'Pick color', 'qs', 'ss']
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
tag: 'rubick-color'
|
tag: 'rubick-color'
|
||||||
@ -34,7 +34,7 @@ const SYSTEM_PLUGINS = [
|
|||||||
{
|
{
|
||||||
code: 'shortCut',
|
code: 'shortCut',
|
||||||
explain: 'rubick 屏幕截取',
|
explain: 'rubick 屏幕截取',
|
||||||
cmds: ['截屏', 'shortCut']
|
cmds: ['截屏', 'shortCut', 'jp']
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
tag: 'rubick-screen-short-cut'
|
tag: 'rubick-screen-short-cut'
|
||||||
@ -46,7 +46,7 @@ const SYSTEM_PLUGINS = [
|
|||||||
{
|
{
|
||||||
code: 'lock',
|
code: 'lock',
|
||||||
explain: '锁屏',
|
explain: '锁屏',
|
||||||
cmds: ['锁屏', 'lock screen']
|
cmds: ['锁屏', 'lock screen', 'sp']
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
tag: 'rubick-lock'
|
tag: 'rubick-lock'
|
||||||
|
37
src/renderer/assets/common/translate.js
Normal file
37
src/renderer/assets/common/translate.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
let key = '吖哎安肮凹八挀扳邦勹陂奔伻皀边灬憋汃冫癶峬嚓偲参仓撡冊嵾噌叉犲辿伥抄车抻阷吃充抽出膗巛刅吹旾踔呲从凑粗汆镩蹿崔邨搓咑呆丹当刀恴揼灯仾嗲敁刁爹丁丟东吺剢耑叾吨多妸奀鞥仒发帆匚飞分丰覅仏垺夫旮侅干冈皋戈给根更工勾估瓜乖关光归丨呙妎咍兯夯茠诃黒拫亨乊叿齁乎花怀欢巟灰昏吙丌加戋江艽阶巾坕冂丩凥姢噘军咔开刊忼尻匼肎劥空廤扝夸蒯宽匡亏坤扩垃来兰啷捞仂雷塄唎俩嫾簗蹽咧厸伶溜咯龙娄噜驴孪掠抡捋嘸妈埋颟牤猫庅呅椚掹踎宀喵乜民名谬摸哞某母拏腉囡囔孬疒娞嫩莻妮拈娘鸟捏脌宁妞农羺奴女疟奻硸噢妑拍眅乓抛呸喷匉丕片剽氕姘乒钋剖仆七掐千呛悄切亲靑宆丘区峑炔夋亽呥穣荛惹人扔日戎厹嶿堧桵闰挼仨毢三桒掻色杀筛山伤弰奢申升尸収书刷衰闩双谁妁厶忪凁苏狻夊孙唆他囼坍汤仐忑膯剔天旫怗厅囲偷凸湍推吞乇屲歪乛尣危塭翁挝乌夕呷仙乡灱些忄兴凶休戌吅疶坃丫咽央幺倻膶一乚应哟佣优扜囦曰蒀帀災兂牂傮啫贼怎曽吒夈沾张佋蜇贞凧之中州朱抓拽专妆隹宒卓仔孖宗邹租劗厜尊昨'.split('');
|
||||||
|
let pinyin = 'AAiAnAngAoBaBaiBanBangBaoBeiBenBengBiBianBiaoBieBinBingBoBuCaCaiCanCangCaoCeCenCengChaChaiChanChangChaoCheChenChengChiChongChouChuChuaiChuanChuangChuiChunChuoCiCongCouCuCuanChuanCuanCuiCunCuoDaDaiDanDangDaoDeDenDengDiDiaDianDiaoDieDingDiuDongDouDuDuanDuiDunDuoEEnEngErFaFanFangFeiFenFengFiaoFoFouFuGaGaiGanGangGaoGeGeiGenGengGongGouGuGuaGuaiGuanGuangGuiGunGuoHaHaiHanHangHaoHeHeiHenHengHoHongHouHuHuaHuaiHuanHuangHuiHunHuoJiJiaJianJiangJiaoJieJinJingJiongJiuJuJuanJueJunKaKaiKanKangKaoKeKenKengKongKouKuKuaKuaiKuanKuangKuiKunKuoLaLaiLanLangLaoLeLeiLengLiLiaLianLiangLiaoLieLinLingLiuLoLongLouLuLvLuanLveLunLuoMMaMaiManMangMaoMeMeiMenMengMiMianMiaoMieMinMingMiuMoMouMeiMuNaNaiNanNangNaoNeNeiNenNNiNianNiangNiaoNieNinNingNiuNongNouNuNvNveNuanNuoOuPaPaiPanPangPaoPeiPenPengPiPianPiaoPiePinPingPoPouPuQiQiaQianQiangQiaoQieQinQingQiongQiuQuQuanQueQunRaRanRangRaoReRenRengRiRongRouRuRuanRuiRunRuoSaSaiSanSangSaoSeShaShaiShanShangShaoSheShenShengShiShouShuShuaShuaiShuanShuangShuiShuoSiSongSouSuSuanSuiSunSuoTaTaiTanTangTaoTeTengTiTianTiaoTieTingTongTouTuTuanTuiTunTuoWaWaiWanWangWeiWenWengWoWuXiXiaXianXiangXiaoXieXinXingXiongXiuXuXuanXueXunYaYanYangYaoYeYenYiYinYingYoYongYouYuYuanYueYunZaZaiZanZangZaoZeZeiZenZengZhaZhaiZhanZhangZhaoZheZhenZhengZhiZhongZhouZhuZhuaZhuaiZhuanZhuangZhuiZhunZhuoZaiZiZongZouZuZuanZuiZunZuo'.split(/(?=[A-Z])/g);
|
||||||
|
let cache = {};
|
||||||
|
let keyLen = key.length - 1;
|
||||||
|
let creg = /[\u4e00-\u9fa5]/;
|
||||||
|
let translate = word => {
|
||||||
|
if (word.length > 1) {
|
||||||
|
let ret = '';
|
||||||
|
for (let i = 0; i < word.length; i++) {
|
||||||
|
ret += translate(word[i]);
|
||||||
|
if (i < word.length - 1) {
|
||||||
|
ret += ',';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!creg.test(word)) {
|
||||||
|
return word;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cache.hasOwnProperty(word)) {
|
||||||
|
return cache[word];
|
||||||
|
}
|
||||||
|
let begin = 0;
|
||||||
|
let end = keyLen;
|
||||||
|
while (begin <= end) {
|
||||||
|
let middle = Math.floor((begin + end) / 2);
|
||||||
|
if (word.localeCompare(key[middle], 'zh-CN') < 0) {
|
||||||
|
end = middle - 1;
|
||||||
|
} else {
|
||||||
|
begin = middle + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (cache[word] = (pinyin[end] || '').toLowerCase());
|
||||||
|
};
|
||||||
|
export default translate;
|
@ -10,6 +10,8 @@ import { getlocalDataFile } from '../../../main/common/utils';
|
|||||||
import iconvLite from 'iconv-lite';
|
import iconvLite from 'iconv-lite';
|
||||||
import bpList from 'bplist-parser';
|
import bpList from 'bplist-parser';
|
||||||
|
|
||||||
|
import translate from './translate'
|
||||||
|
|
||||||
const store = new Store();
|
const store = new Store();
|
||||||
|
|
||||||
function getWindowHeight(searchList) {
|
function getWindowHeight(searchList) {
|
||||||
@ -233,7 +235,14 @@ APP_FINDER_PATH.forEach((searchPath, index) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (appZhName && isZhRegex.test(appZhName)) {
|
if (appZhName && isZhRegex.test(appZhName)) {
|
||||||
// pinyinArr = [['pin'], ['yin']]
|
const py = translate(appZhName);
|
||||||
|
const pinyinArr = py.split(',');
|
||||||
|
const firstLatter = pinyinArr.map(py => py[0]);
|
||||||
|
// 拼音
|
||||||
|
fileOptions.keyWords.push(pinyinArr.join(''));
|
||||||
|
// 缩写
|
||||||
|
fileOptions.keyWords.push(firstLatter.join(''));
|
||||||
|
// 中文
|
||||||
fileOptions.keyWords.push(appZhName);
|
fileOptions.keyWords.push(appZhName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<div class="settings-detail">
|
<div class="settings-detail">
|
||||||
<div v-if="currentSelect[0] === 0">
|
<div v-if="currentSelect[0] === 0">
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<div class="title">快捷键</div>
|
<div class="title">快捷键(需要使用 option/ctrl/shift/command 键修饰)</div>
|
||||||
<div class="settings-item-li">
|
<div class="settings-item-li">
|
||||||
<div class="label">显示/隐藏快捷键</div>
|
<div class="label">显示/隐藏快捷键</div>
|
||||||
<div class="value" tabIndex=-1 @keydown="(e) => changeShortCut(e, 'showAndHidden')">{{ config.perf.shortCut.showAndHidden }}</div>
|
<div class="value" tabIndex=-1 @keydown="(e) => changeShortCut(e, 'showAndHidden')">{{ config.perf.shortCut.showAndHidden }}</div>
|
||||||
@ -24,6 +24,10 @@
|
|||||||
<div class="label">插件分离快捷键</div>
|
<div class="label">插件分离快捷键</div>
|
||||||
<div class="value" tabIndex=-1 @keydown="(e) => changeShortCut(e, 'separate')">{{ config.perf.shortCut.separate }}</div>
|
<div class="value" tabIndex=-1 @keydown="(e) => changeShortCut(e, 'separate')">{{ config.perf.shortCut.separate }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="settings-item-li">
|
||||||
|
<div class="label">返回主界面</div>
|
||||||
|
<div class="value" tabIndex=-1 @keydown="(e) => changeShortCut(e, 'quit')">{{ config.perf.shortCut.quit }}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<div class="title">通用</div>
|
<div class="title">通用</div>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user