-
{{ shortCut[0] }}{{ shortCut[1] }}{{ shortCut[2] }}
+
+ {{ placeholder }}
+
+
@@ -31,7 +36,6 @@ let languageCompletions = importAll(
let monacoCompletionProviders = {};
let cmdCtrlKey = utools.isMacOs() ? "⌘" : "Ctrl";
-let optAltKey = utools.isMacOs() ? "⌥" : "Alt";
export default {
data() {
@@ -42,10 +46,14 @@ export default {
shortCuts: [
["保存", cmdCtrlKey, "S"],
["运行", cmdCtrlKey, "B"],
- ["换行", optAltKey, "Z"],
],
};
},
+ computed: {
+ showPlaceholder() {
+ return !this.value && !!this.placeholder;
+ },
+ },
mounted() {
this.initEditor();
// 手动监听窗口大小变化,解决Monaco自动调整大小时导致ResizeObserver loop limit exceeded错误
@@ -53,7 +61,7 @@ export default {
this.$emit("loaded");
},
props: {
- placeholder: Boolean,
+ placeholder: String,
},
methods: {
initEditor() {
@@ -256,14 +264,7 @@ export default {
});
},
bindKeys() {
- let that = this;
- // ctrl + b 运行
- this.rawEditor().addCommand(
- monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyB,
- () => {
- that.$emit("keyStroke", "run");
- }
- );
+ const that = this;
// alt + z 换行
this.rawEditor().addCommand(
monaco.KeyMod.Alt | monaco.KeyCode.KeyZ,
@@ -272,24 +273,6 @@ export default {
that.rawEditor().updateOptions({ wordWrap: that.wordWrap });
}
);
- // ctrl + s 保存
- this.rawEditor().addCommand(
- monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS,
- () => {
- that.$emit("keyStroke", "save");
- }
- );
- // ctrl + e 快速 console.log
- this.rawEditor().addCommand(
- monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyE,
- () => {
- that.$emit("keyStroke", "log", that.getSelectionOrLineContent());
- }
- );
- // F11 全屏
- this.rawEditor().addCommand(monaco.KeyCode.F11, () => {
- this.$emit("keyStroke", "fullscreen");
- });
},
getSelectionOrLineContent() {
let selection = this.rawEditor().getSelection();
@@ -318,11 +301,7 @@ export default {
diff --git a/src/js/commandManager.js b/src/js/commandManager.js
index 2689ba6..002abdd 100644
--- a/src/js/commandManager.js
+++ b/src/js/commandManager.js
@@ -59,7 +59,7 @@ export const getValidCommand = (command) => {
// 生成唯一code
if (!command.features.code) {
- command.features.code = getFeatureCode(cmds);
+ command.features.code = getFeatureCode(command.features.cmds);
}
return window.lodashM.cloneDeep(command);
diff --git a/src/js/options/programs.js b/src/js/options/programs.js
index 82904de..e8c053d 100644
--- a/src/js/options/programs.js
+++ b/src/js/options/programs.js
@@ -5,7 +5,6 @@
const programs = {
quickcommand: {
name: "quickcommand",
- highlight: "javascript",
bin: "",
argv: "",
ext: "",
@@ -40,7 +39,6 @@ const programs = {
},
cmd: {
name: "cmd",
- highlight: "bat",
bin: "",
argv: "",
ext: "bat",
diff --git a/src/js/options/specialVars.js b/src/js/options/specialVars.js
index 5c57675..7360824 100644
--- a/src/js/options/specialVars.js
+++ b/src/js/options/specialVars.js
@@ -3,153 +3,155 @@
*/
let handlingJsonVar = (jsonVar, name, payload) => {
- try {
- return window.evalCodeInSandbox(jsonVar.slice(2, -2), {
- [name]: payload
- })
- } catch (e) {
- return utools.showNotification(e)
- }
-}
+ try {
+ return window.evalCodeInSandbox(jsonVar.slice(2, -2), {
+ [name]: payload,
+ });
+ } catch (e) {
+ return utools.showNotification(e);
+ }
+};
-let handlingJsExpression = js => {
- try {
- return window.evalCodeInSandbox(js.slice(5, -2), {
- utools: window.getuToolsLite(),
- })
- } catch (e) {
- return utools.showNotification(e)
- }
-}
+let handlingJsExpression = (js) => {
+ try {
+ return window.evalCodeInSandbox(js.slice(5, -2), {
+ utools: window.getuToolsLite(),
+ });
+ } catch (e) {
+ return utools.showNotification(e);
+ }
+};
const specialVars = {
- isWin: {
- name: "isWin",
- label: "{{isWin}}",
- desc: "是否为 windows 系统,返回 0 或 1",
- disabledType: [],
- match: /{{isWin}}/mg,
- repl: () => utools.isWindows() ? 1 : 0
+ isWin: {
+ name: "isWin",
+ label: "{{isWin}}",
+ desc: "是否为 windows 系统,返回 0 或 1",
+ match: /{{isWin}}/gm,
+ repl: () => (utools.isWindows() ? 1 : 0),
+ },
+ LocalId: {
+ name: "LocalId",
+ label: "{{LocalId}}",
+ desc: "本机唯一ID",
+ match: /{{LocalId}}/gm,
+ repl: () => utools.getNativeId(),
+ },
+ BrowserUrl: {
+ name: "BrowserUrl",
+ label: "{{BrowserUrl}}",
+ desc: "浏览器当前链接",
+ match: /{{BrowserUrl}}/gm,
+ repl: () => utools.getCurrentBrowserUrl(),
+ },
+ ClipText: {
+ name: "ClipText",
+ label: "{{ClipText}}",
+ desc: "剪贴板内容",
+ match: /{{ClipText}}/gm,
+ repl: () => window.clipboardReadText(),
+ },
+ subinput: {
+ name: "subinput",
+ label: "{{subinput:请输入}}",
+ desc: "子输入框的文本,冒号后为占位符",
+ match: /{{subinput(:.+?){0,1}}}/gm,
+ },
+ input: {
+ name: "input",
+ label: "{{input}}",
+ desc: "主输入框的文本",
+ match: /{{input}}/gm,
+ onlyCmdTypes: ["regex", "over"],
+ repl: (text, enterData) => enterData.payload,
+ },
+ pwd: {
+ name: "pwd",
+ label: "{{pwd}}",
+ desc: "文件管理器当前目录",
+ match: /{{pwd}}/gm,
+ repl: () => window.getCurrentFolderPathFix(),
+ },
+ WindowInfo: {
+ name: "WindowInfo",
+ label: "{{WindowInfo}}",
+ desc: "当前窗口信息,JSON格式,可以指定键值,如{{WindowInfo.id}}",
+ type: "json",
+ match: /{{WindowInfo(.*?)}}/gm,
+ onlyCmdTypes: ["window"],
+ repl: (jsonVar, enterData) =>
+ handlingJsonVar(jsonVar, "WindowInfo", enterData.payload),
+ },
+ MatchImage: {
+ name: "MatchImage",
+ label: "{{MatchImage}}",
+ desc: "匹配到图片的 DataUrl",
+ match: /{{MatchImage}}/gm,
+ onlyCmdTypes: ["img"],
+ repl: (text, enterData) => enterData.payload,
+ },
+ SelectFile: {
+ name: "SelectFile",
+ label: "{{SelectFile}}",
+ desc: "文件管理器选中的文件,不支持Linux",
+ match: /{{SelectFile}}/gm,
+ repl: (text, enterData) => window.getSelectFile(enterData.payload.id),
+ },
+ MatchedFiles: {
+ name: "MatchedFiles",
+ label: "{{MatchedFiles}}",
+ desc: "匹配的文件,JSON格式,可以指定键值,如{{MatchedFiles[0].path}}",
+ type: "json",
+ match: /{{MatchedFiles(.*?)}}/gm,
+ onlyCmdTypes: ["files"],
+ repl: (jsonVar, enterData) =>
+ handlingJsonVar(jsonVar, "MatchedFiles", enterData.payload),
+ },
+ type: {
+ name: "type",
+ label: "{{type}}",
+ desc: "onPluginEnter的type,匹配的类型",
+ match: /{{type}}/gm,
+ repl: (text, enterData) => enterData.type,
+ },
+ payload: {
+ name: "payload",
+ label: "{{payload}}",
+ desc: "onPluginEnter的payload,当为JSON时可以指定键值,如{{payload.id}}",
+ type: "json",
+ match: /{{payload(.*?)}}/gm,
+ repl: (jsonVar, enterData) =>
+ handlingJsonVar(jsonVar, "payload", enterData.payload),
+ },
+ js: {
+ name: "js",
+ label: "{{js:}}",
+ desc: "获取js表达式的值,如{{js:utools.isMacOs()}}",
+ tooltip: "注意,必须为表达式而非语句,类似Vue的文本插值",
+ type: "command",
+ match: /{{js:(.*?)}}/gm,
+ repl: (js) => handlingJsExpression(js),
+ },
+ python: {
+ name: "python",
+ label: "{{py:}}",
+ desc: "模拟python -c,并获取返回值,如{{py:print(1)}}",
+ tooltip: "只支持单行语句",
+ type: "command",
+ match: /{{py:(.*?)}}/gm,
+ repl: (py) => window.runPythonCommand(py.slice(5, -2)),
+ },
+ userData: {
+ name: "userData",
+ label: "{{usr:}}",
+ desc: "用户设置的变量,类似一个全局配置项",
+ match: /{{usr:(.*?)}}/gm,
+ repl: (text, userData) => {
+ let filterd = userData.filter((x) => x.id === text.slice(6, -2));
+ return filterd.length ? filterd[0].value : "";
},
- LocalId: {
- name: "LocalId",
- label: "{{LocalId}}",
- desc: "本机唯一ID",
- disabledType: [],
- match: /{{LocalId}}/mg,
- repl: () => utools.getNativeId()
- },
- BrowserUrl: {
- name: "BrowserUrl",
- label: "{{BrowserUrl}}",
- disabledType: [],
- desc: "浏览器当前链接",
- match: /{{BrowserUrl}}/mg,
- repl: () => utools.getCurrentBrowserUrl()
- },
- ClipText: {
- name: "ClipText",
- label: "{{ClipText}}",
- disabledType: [],
- desc: "剪贴板内容",
- match: /{{ClipText}}/mg,
- repl: () => window.clipboardReadText()
- },
- subinput: {
- name: "subinput",
- label: "{{subinput:请输入}}",
- disabledType: [],
- desc: "子输入框的文本,冒号后为占位符",
- match: /{{subinput(:.+?){0,1}}}/mg,
- },
- input: {
- name: "input",
- label: "{{input}}",
- desc: "主输入框的文本",
- match: /{{input}}/mg,
- repl: (text, enterData) => enterData.payload
- },
- pwd: {
- name: "pwd",
- label: "{{pwd}}",
- desc: "文件管理器当前目录",
- match: /{{pwd}}/mg,
- repl: () => window.getCurrentFolderPathFix()
- },
- WindowInfo: {
- name: "WindowInfo",
- label: "{{WindowInfo}}",
- desc: "当前窗口信息,JSON格式,可以指定键值,如{{WindowInfo.id}}",
- type: "json",
- match: /{{WindowInfo(.*?)}}/mg,
- repl: (jsonVar, enterData) => handlingJsonVar(jsonVar, "WindowInfo", enterData.payload)
- },
- MatchImage: {
- name: "MatchImage",
- label: "{{MatchImage}}",
- desc: "匹配到图片的 DataUrl",
- match: /{{MatchImage}}/mg,
- repl: (text, enterData) => enterData.payload
- },
- SelectFile: {
- name: "SelectFile",
- label: "{{SelectFile}}",
- desc: "文件管理器选中的文件,不支持Linux",
- match: /{{SelectFile}}/mg,
- repl: (text, enterData) => window.getSelectFile(enterData.payload.id)
- },
- MatchedFiles: {
- name: "MatchedFiles",
- label: "{{MatchedFiles}}",
- desc: "匹配的文件,JSON格式,可以指定键值,如{{MatchedFiles[0].path}}",
- type: "json",
- match: /{{MatchedFiles(.*?)}}/mg,
- repl: (jsonVar, enterData) => handlingJsonVar(jsonVar, "MatchedFiles", enterData.payload)
- },
- type: {
- name: "type",
- label: "{{type}}",
- desc: "onPluginEnter的type,匹配的类型",
- match: /{{type}}/mg,
- repl: (text, enterData) => enterData.type
- },
- payload: {
- name: "payload",
- label: "{{payload}}",
- desc: "onPluginEnter的payload,当为JSON时可以指定键值,如{{payload.id}}",
- type: "json",
- match: /{{payload(.*?)}}/mg,
- repl: (jsonVar, enterData) => handlingJsonVar(jsonVar, "payload", enterData.payload)
- },
- js: {
- name: "js",
- label: "{{js:}}",
- desc: "获取js表达式的值,如{{js:utools.isMacOs()}}",
- tooltip: "注意,必须为表达式而非语句,类似Vue的文本插值",
- type: "command",
- match: /{{js:(.*?)}}/mg,
- repl: js => handlingJsExpression(js)
- },
- python: {
- name: "python",
- label: "{{py:}}",
- desc: "模拟python -c,并获取返回值,如{{py:print(1)}}",
- tooltip: "只支持单行语句",
- type: "command",
- match: /{{py:(.*?)}}/mg,
- repl: py => window.runPythonCommand(py.slice(5, -2))
- },
- userData: {
- name: "userData",
- label: "{{usr:}}",
- desc: "用户设置的变量,类似一个全局配置项",
- match: /{{usr:(.*?)}}/mg,
- repl: (text, userData) => {
- let filterd = userData.filter(x => x.id === text.slice(6, -2))
- return filterd.length ? filterd[0].value : ''
- },
- tooltip: "仅本机可用时,该变量值只在本机有效,否则,所有电脑有效",
- }
-}
+ tooltip: "仅本机可用时,该变量值只在本机有效,否则,所有电脑有效",
+ },
+};
-export default specialVars
+export default specialVars;
diff --git a/src/pages/ConfigurationPage.vue b/src/pages/ConfigurationPage.vue
index 7e21f56..0b00aa5 100644
--- a/src/pages/ConfigurationPage.vue
+++ b/src/pages/ConfigurationPage.vue
@@ -24,7 +24,7 @@
@@ -40,7 +40,7 @@
import { defineAsyncComponent } from "vue";
import { useCommandManager } from "js/commandManager.js";
import changeLog from "js/options/changeLog.js";
-import { utoolsFull, dbManager } from "js/utools.js";
+import { utoolsFull } from "js/utools.js";
import CommandEditor from "components/CommandEditor";
import ComposerEditor from "components/ComposerEditor";
import FooterBar from "src/components/config/FooterBar.vue";
@@ -214,13 +214,14 @@ export default {
},
saveCommand(command) {
const code = this.commandManager.saveCommand(command);
+ if (!code) return;
this.locateToCommand(command.tags, code);
quickcommand.showMessageBox("保存成功!");
},
- editorEvent(event) {
- switch (event.type) {
+ handleEditorEvent(event, data) {
+ switch (event) {
case "save":
- this.saveCommand(event.data);
+ this.saveCommand(data);
break;
case "back":
this.isEditorShow = false;
@@ -265,20 +266,12 @@ export default {
}
.editor-container {
- color: var(--utools-bright-font-color);
+ color: var(--utools-font-color);
overflow: hidden;
position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
+ inset: 0;
z-index: 5000;
- background: var(--utools-bright-bg);
-}
-
-.body--dark .editor-container {
- color: var(--utools-dark-font-color);
- background: var(--utools-dark-bg);
+ background: var(--utools-bg-color);
}
/* 编辑器容器动画 */
diff --git a/src/pages/RunCodePage.vue b/src/pages/RunCodePage.vue
index af676e2..7c60d94 100644
--- a/src/pages/RunCodePage.vue
+++ b/src/pages/RunCodePage.vue
@@ -1,7 +1,5 @@