From 5012d2f08b7f01468baa07804a760d2f70e5f706 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Sun, 8 Nov 2020 15:03:33 -0800 Subject: [PATCH 01/32] Fix bullet in README 'why' section --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 28e82f29..8a52405b 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ AutoHotkey Plus Plus (AHK++) provides actively maintained, comprehensive AutoHot AutoHotkey Plus Plus is one of many extensions that offer VS Code language support. So why should you use this one? - **IntelliSense**: Smart code completion, syntax highlighting, code navigation, and more. - **Actively Maintained**: Any issues encountered while using this extension can be reported and fixed. With other extensions, anything that's broken will stay broken forever. You can report any issues (and view all issues) at [the issue tracker](https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues) +- **Actively Maintained**: Any issues encountered while using this extension can be reported and fixed. With other extensions, anything that's broken will stay broken forever. You can report any issues (and view all issues) at [the issue tracker](https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues) - **Debug Support**: Run and debug AHK scripts from VS Code. - **New Features**: Another benefit to active maintenance is that AHK++ can add new features as users request them. From eb3b66d274648557b175697a44c6718c888b5e68 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Sun, 8 Nov 2020 15:04:21 -0800 Subject: [PATCH 02/32] Make dev note to confirm md files render correctly --- docs/Development.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Development.md b/docs/Development.md index 4b74191c..5d6cf9a3 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -7,6 +7,7 @@ This document covers the development process, from writing code to publishing a 1. Push the changes, open a PR, review the changes, and merge to `master`. 1. Confirm the package version has been updated 1. Confirm the changelog has been updated + 1. Confirm Markdown files appear as intended 1. Pull the new master branch 1. Package the new release using `vsce package`. 1. Publish the release through [Visual Studio Marketplace](https://marketplace.visualstudio.com/manage/publishers/mark-wiemer) From 01f6a766eebc3b876ec1fe990ee3125de7e1cb05 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Sun, 8 Nov 2020 19:52:22 -0800 Subject: [PATCH 03/32] Remove redundant references to AHK in commands --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6f18efda..b994125a 100644 --- a/package.json +++ b/package.json @@ -148,12 +148,12 @@ }, { "command": "run.ahk", - "title": "Run AHK Script", + "title": "Run Script", "category": "AHK" }, { "command": "debug.ahk", - "title": "Debug AHK Script", + "title": "Debug Script", "category": "AHK", "icon": { "light": "./image/run.png", From 98faa17cb0ed59d8ba4ca8414964d0df77cec7e5 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 9 Nov 2020 19:42:43 -0800 Subject: [PATCH 04/32] Change "the original author" to "cweijan" slevesque is really the original author --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a52405b..3f1f708c 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ AutoHotkey Plus Plus is one of many extensions that offer VS Code language suppo ## Coffee -If you like this extension, consider [buying the orignal author a coffee](https://www.buymeacoffee.com/cweijan). Thank you! +If you like this extension, consider [buying cweijan a coffee](https://www.buymeacoffee.com/cweijan). Thank you! ## Install From c3428f00d335134e98dc21e4b73c6e4d6fdaecf3 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 9 Nov 2020 21:38:55 -0800 Subject: [PATCH 05/32] Update 'why' section of README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f1f708c..05f20696 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ AutoHotkey Plus Plus (AHK++) provides actively maintained, comprehensive AutoHot AutoHotkey Plus Plus is one of many extensions that offer VS Code language support. So why should you use this one? - **IntelliSense**: Smart code completion, syntax highlighting, code navigation, and more. -- **Actively Maintained**: Any issues encountered while using this extension can be reported and fixed. With other extensions, anything that's broken will stay broken forever. You can report any issues (and view all issues) at [the issue tracker](https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues) +- **Actively Maintained**: Any issues encountered while using this extension can be reported and fixed. With other extensions, anything that's broken will stay broken forever. You can report any issues with AHK++ (and view all issues) through the [issue tracker](https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues) - **Debug Support**: Run and debug AHK scripts from VS Code. - **New Features**: Another benefit to active maintenance is that AHK++ can add new features as users request them. From 849f94ebc2bec07eb18b6eff59cf99ac31ed0559 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Thu, 12 Nov 2020 18:45:09 -0800 Subject: [PATCH 06/32] Capitalize keybindings internally --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b994125a..9931a984 100644 --- a/package.json +++ b/package.json @@ -185,17 +185,17 @@ "keybindings": [ { "command": "debug.ahk", - "key": "f9", + "key": "F9", "when": "editorLangId == ahk" }, { "command": "run.ahk", - "key": "ctrl+f9", + "key": "Ctrl+F9", "when": "editorLangId == ahk" }, { "command": "compile.ahk", - "key": "ctrl+shift+f9", + "key": "Ctrl+Shift+F9", "when": "editorLangId == ahk" } ], From ddc8b9fcf51a83f0b9ec90f92a9ea1dc43dd73d5 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Thu, 12 Nov 2020 22:02:41 -0800 Subject: [PATCH 07/32] Clarify "execute path" and "compile path" settings --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9931a984..7b23e998 100644 --- a/package.json +++ b/package.json @@ -212,12 +212,12 @@ "ahk++.executePath": { "type": "string", "default": "C:/Program Files/AutoHotkey/AutoHotkeyU64.exe", - "description": "The execute path of AHK." + "description": "Absolute path to an AutoHotkey.exe file." }, "ahk++.compilePath": { "type": "string", "default": "C:/Program Files/AutoHotkey/Compiler/Ahk2Exe.exe", - "description": "The compiler path of AHK." + "description": "Absolute path to an Ahk2Exe.exe file." }, "ahk++.intellisense": { "type": "boolean", From 40956d4ae4f350a65c20261b6b4fcc843cf4c8ab Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Sat, 14 Nov 2020 01:59:43 -0800 Subject: [PATCH 08/32] Clarify license as MIT license --- LICENSE | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 53d8954c..46ccf4f8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ -Copyright 2020 weijan (https://github.com/cweijan), Mark Wiemer (https://github.com/mark-wiemer) +Copyright (c) 2020 [weijan](https://github.com/cweijan), [Mark Wiemer](https://github.com/mark-wiemer) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/package.json b/package.json index 7b23e998..cdf63206 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "Programming Languages", "Snippets" ], - "license": "See LICENSE file", + "license": "MIT", "icon": "icon.png", "bugs": { "url": "https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues" From 4b53164859ed6d5db59254c70d3b99c08d0cc108 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Sun, 13 Dec 2020 11:19:45 -0800 Subject: [PATCH 09/32] Fix coloring of funcs with keyword names --- demos/demo_for_ahk_v1.ahk | 14 ++++++++++++++ syntaxes/ahk.tmLanguage.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/demos/demo_for_ahk_v1.ahk b/demos/demo_for_ahk_v1.ahk index f786de4b..6cd9dfaa 100644 --- a/demos/demo_for_ahk_v1.ahk +++ b/demos/demo_for_ahk_v1.ahk @@ -55,3 +55,17 @@ class Cls method() { } } + +; Does a thing +LAlt() { + ; do a thing +} + +<#Tab:: AltTab +<#c:: CenterActiveWindow() +$LAlt:: LAlt() +$*Pause:: Pause() +$AppsKey:: AppsKey() +$CapsLock:: CapsLock() + +Pause \ No newline at end of file diff --git a/syntaxes/ahk.tmLanguage.json b/syntaxes/ahk.tmLanguage.json index 16d58390..be279a59 100644 --- a/syntaxes/ahk.tmLanguage.json +++ b/syntaxes/ahk.tmLanguage.json @@ -184,7 +184,7 @@ "example": "this" }, { - "match": "\\b(?!MsgBox)(?i:new|__New|__Delete|shift|lshift|rshift|alt|lalt|ralt|control|lcontrol|rcontrol|ctrl|lctrl|rctrl|lwin|rwin|appskey|altdown|altup|shiftdown|shiftup|ctrldown|ctrlup|lwindown|lwinup|rwindown|rwinup|lbutton|rbutton|mbutton|wheelup|wheelleft|wheelright|wheeldown|xbutton1|xbutton2|joy1|joy2|joy3|joy4|joy5|joy6|joy7|joy8|joy9|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy30|joy31|joy32|joyx|joyy|joyz|joyr|joyu|joyv|joypov|joyname|joybuttons|joyaxes|joyinfo|space|tab|enter|escape|esc|backspace|bs|delete|del|insert|ins|pgup|pgdn|home|end|up|down|left|right|printscreen|ctrlbreak|pause|scrolllock|capslock|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadmult|numpadadd|numpadsub|numpaddiv|numpaddot|numpaddel|numpadins|numpadclear|numpadup|numpaddown|numpadleft|numpadright|numpadhome|numpadend|numpadpgup|numpadpgdn|numpadenter|f1|f2|f3|f4|f5|f6|f7|f8|f9|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f20|f21|f22|f23|f24|browser_back|browser_forward|browser_refresh|browser_stop|browser_search|browser_favorites|browser_home|volume_mute|volume_down|volume_up|media_next|media_prev|media_stop|media_play_pause|launch_mail|launch_media|launch_app1|launch_app2|vk\\d+|sc\\d+)\\b", + "match": "\\b(?!MsgBox)(?i:new|__New|__Delete|shift|lshift|rshift|alt|lalt|ralt|control|lcontrol|rcontrol|ctrl|lctrl|rctrl|lwin|rwin|appskey|altdown|altup|shiftdown|shiftup|ctrldown|ctrlup|lwindown|lwinup|rwindown|rwinup|lbutton|rbutton|mbutton|wheelup|wheelleft|wheelright|wheeldown|xbutton1|xbutton2|joy1|joy2|joy3|joy4|joy5|joy6|joy7|joy8|joy9|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy30|joy31|joy32|joyx|joyy|joyz|joyr|joyu|joyv|joypov|joyname|joybuttons|joyaxes|joyinfo|space|tab|enter|escape|esc|backspace|bs|delete|del|insert|ins|pgup|pgdn|home|end|up|down|left|right|printscreen|ctrlbreak|pause|scrolllock|capslock|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadmult|numpadadd|numpadsub|numpaddiv|numpaddot|numpaddel|numpadins|numpadclear|numpadup|numpaddown|numpadleft|numpadright|numpadhome|numpadend|numpadpgup|numpadpgdn|numpadenter|f1|f2|f3|f4|f5|f6|f7|f8|f9|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f20|f21|f22|f23|f24|browser_back|browser_forward|browser_refresh|browser_stop|browser_search|browser_favorites|browser_home|volume_mute|volume_down|volume_up|media_next|media_prev|media_stop|media_play_pause|launch_mail|launch_media|launch_app1|launch_app2|vk\\d+|sc\\d+)\\b(?!\\s*\\()\\b", "name": "keyword.keys.ahk", "example": "LButton" }, From d6826689bc63f2c77b176cdd4f94b24c61e12606 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Sun, 13 Dec 2020 15:01:41 -0800 Subject: [PATCH 10/32] Organize gitignore --- .gitignore | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index e4c48304..a3617d82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,12 @@ -out -node_modules -.vscode-test/ -*.vsix +# Folders .idea/ -package-lock.json \ No newline at end of file +.vscode-test/ +node_modules +out + +# Files +.vscode/settings.json +package-lock.json + +# Both +*.vsix \ No newline at end of file From ad6c39950cced7d9ff5c89488cbfce19508ac7b7 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Sun, 13 Dec 2020 15:05:06 -0800 Subject: [PATCH 11/32] Support functions with space before call --- demos/demo_for_ahk_v1.ahk | 110 +++++++++++++++++++---------------- syntaxes/ahk.tmLanguage.json | 2 +- 2 files changed, 60 insertions(+), 52 deletions(-) diff --git a/demos/demo_for_ahk_v1.ahk b/demos/demo_for_ahk_v1.ahk index 6cd9dfaa..79312493 100644 --- a/demos/demo_for_ahk_v1.ahk +++ b/demos/demo_for_ahk_v1.ahk @@ -4,68 +4,76 @@ function() return function() { - globalVar := "Local" - SuperGlobalVar := "Local" - bool := true - str := "string" - if (str == "str") { - MsgBox Overwrite primitive variable! - } - str_multiline := " - (LTrim - line 1 - line 2 - line 3 - )" - int := 123 - float := 123.456 + globalVar := "Local" + SuperGlobalVar := "Local" + bool := true + str := "string" + if (str == "str") { + MsgBox Overwrite primitive variable! + } + str_multiline := " + (LTrim + line 1 + line 2 + line 3 + )" + int := 123 + float := 123.456 - emptyArray := [] - smallArray := [1, 2, { str: "string" }] + emptyArray := [] + smallArray := [1, 2, { str: "string" }] sparseArray := { 1: 1, 3: 3 } - arrayLike := { 1: 1, 2: 2, 3: 3, length: 3 } - bigArray := [] - Loop 150 { - bigArray.push(A_Index) - } - if (bigArray == "str") { - MsgBox Overwrite object variable! - } + arrayLike := { 1: 1, 2: 2, 3: 3, length: 3 } + bigArray := [] + Loop 150 { + bigArray.push(A_Index) + } + if (bigArray == "str") { + MsgBox Overwrite object variable! + } - obj := { str: str, int: int, float: float } - objobj := { str: str, obj: obj } - objobjobj := { str: str, int: int, obj: { str: str, obj: obj } } + obj := { str: str, int: int, float: float } + objobj := { str: str, obj: obj } + objobjobj := { str: str, int: int, obj: { str: str, obj: obj } } - circular := {} - circular.circular := circular - instance := new Cls() + circular := {} + circular.circular := circular + instance := new Cls() - enum := obj._NewEnum() + enum := obj._NewEnum() } class Cls { - instanceVar := "instance" - static str := "string" - static num := 123 - static obj := { str: "string", int: 123, float: 123.456 } - property[] { - get { - } - } - method() { - } + instanceVar := "instance" + static str := "string" + static num := 123 + static obj := { str: "string", int: 123, float: 123.456 } + property[] { + get { + } + } + method() { + } } -; Does a thing +; Hotkeys and Keywords + +<#Tab:: AltTab + +; FUNCTIONS + +; Method header comment accessible to IntelliSense LAlt() { - ; do a thing + ; do a thing } -<#Tab:: AltTab -<#c:: CenterActiveWindow() -$LAlt:: LAlt() -$*Pause:: Pause() -$AppsKey:: AppsKey() -$CapsLock:: CapsLock() +; Function calls +foo() +bar () +baz () -Pause \ No newline at end of file +; Functions with keyword names +LAlt() +Pause() +AppsKey() +CapsLock() \ No newline at end of file diff --git a/syntaxes/ahk.tmLanguage.json b/syntaxes/ahk.tmLanguage.json index be279a59..8dff9820 100644 --- a/syntaxes/ahk.tmLanguage.json +++ b/syntaxes/ahk.tmLanguage.json @@ -279,7 +279,7 @@ "name": "support.function.ahk" }, { - "match": "\\b(?!MsgBox)([\\w]+)(?=\\()", + "match": "\\b(?!MsgBox)[\\w]+\\s*(?=\\()", "name": "entity.name.function.ahk", "example": "fun(" }, From 05c865079beeffaf249119c05687047620b1c808 Mon Sep 17 00:00:00 2001 From: cweijan Date: Tue, 17 Nov 2020 10:39:09 +0800 Subject: [PATCH 12/32] Refactor code, init document service --- package.json | 25 +++++++++--- src/common/fileManager.ts | 6 +-- src/common/global.ts | 3 +- src/common/out.ts | 1 - src/debugger/debugDispatcher.ts | 8 ++-- src/extension.ts | 38 ++++++++++--------- src/{core/detect => parser}/model.ts | 0 .../detect/detecter.ts => parser/parser.ts} | 22 +++++------ src/{provider => providers}/SymbolProvider.ts | 4 +- .../ahkHoverProvider.ts | 17 ++++----- .../ahkRenameProvider.ts | 9 +++-- .../completionProvider.ts} | 6 +-- .../defProvider.ts} | 8 ++-- .../formattingProvider.ts | 0 .../refProvider.ts} | 4 +- .../signatureProvider.ts | 4 +- src/service/documentService.ts | 5 +++ .../runnerService.ts} | 2 +- .../templateService.ts} | 4 +- 19 files changed, 95 insertions(+), 71 deletions(-) rename src/{core/detect => parser}/model.ts (100%) rename src/{core/detect/detecter.ts => parser/parser.ts} (94%) rename src/{provider => providers}/SymbolProvider.ts (94%) rename src/{provider => providers}/ahkHoverProvider.ts (95%) rename src/{provider => providers}/ahkRenameProvider.ts (88%) rename src/{provider/CompletionProvider.ts => providers/completionProvider.ts} (94%) rename src/{provider/DefProvider.ts => providers/defProvider.ts} (93%) rename src/{provider => providers}/formattingProvider.ts (100%) rename src/{provider/RefProvider.ts => providers/refProvider.ts} (87%) rename src/{provider => providers}/signatureProvider.ts (91%) create mode 100644 src/service/documentService.ts rename src/{core/ScriptRunner.ts => service/runnerService.ts} (99%) rename src/{provider/templateProvider.ts => service/templateService.ts} (82%) diff --git a/package.json b/package.json index cdf63206..6ac43b73 100644 --- a/package.json +++ b/package.json @@ -140,6 +140,11 @@ } ], "commands": [ + { + "command": "document.open", + "title": "Open Autohotkey Help", + "category": "AHK" + }, { "command": "compile.ahk", "title": "Compile Script", @@ -183,6 +188,11 @@ ] }, "keybindings": [ + { + "command": "document.open", + "key": "shift+f1", + "when": "editorLangId == ahk" + }, { "command": "debug.ahk", "key": "F9", @@ -209,16 +219,21 @@ "type": "object", "title": "AutoHotkey Plus Plus", "properties": { - "ahk++.executePath": { - "type": "string", - "default": "C:/Program Files/AutoHotkey/AutoHotkeyU64.exe", - "description": "Absolute path to an AutoHotkey.exe file." - }, "ahk++.compilePath": { "type": "string", "default": "C:/Program Files/AutoHotkey/Compiler/Ahk2Exe.exe", "description": "Absolute path to an Ahk2Exe.exe file." }, + "ahk++.documentPath": { + "type": "string", + "default": "C:/Program Files/AutoHotkey/AutoHotkey.chm", + "description": "Document path of autohotkey." + }, + "ahk++.executePath": { + "type": "string", + "default": "C:/Program Files/AutoHotkey/AutoHotkeyU64.exe", + "description": "The execute path of AHK." + }, "ahk++.intellisense": { "type": "boolean", "default": true, diff --git a/src/common/fileManager.ts b/src/common/fileManager.ts index 4753332f..75b67cde 100644 --- a/src/common/fileManager.ts +++ b/src/common/fileManager.ts @@ -1,14 +1,14 @@ import * as fs from 'fs'; import * as path from 'path'; import * as vscode from 'vscode'; -import { Detecter } from '../core/detect/detecter'; +import { Parser } from '../parser/parser'; export class FileManager { private static storagePath: string; public static init(context: vscode.ExtensionContext) { - this.storagePath = context.globalStoragePath; // TODO + this.storagePath = context.globalStoragePath; vscode.workspace.onDidSaveTextDocument((e) => { - Detecter.buildScript(e); + Parser.buildScript(e); }); } diff --git a/src/common/global.ts b/src/common/global.ts index 38245849..abe2bc28 100644 --- a/src/common/global.ts +++ b/src/common/global.ts @@ -30,6 +30,7 @@ export class Global { export enum ConfigKey { compilePath = 'compilePath', + documentPath = 'documentPath', + enableIntelliSense = 'enableIntelliSense', executePath = 'executePath', - intellisense = 'intellisense', } diff --git a/src/common/out.ts b/src/common/out.ts index 01bbbf58..6ecc0504 100644 --- a/src/common/out.ts +++ b/src/common/out.ts @@ -1,4 +1,3 @@ -'user strict'; import * as vscode from 'vscode'; import { OutputChannel } from 'vscode'; diff --git a/src/debugger/debugDispatcher.ts b/src/debugger/debugDispatcher.ts index 4b6463e2..1990f0bb 100644 --- a/src/debugger/debugDispatcher.ts +++ b/src/debugger/debugDispatcher.ts @@ -1,7 +1,7 @@ import { EventEmitter } from 'events'; import { Scope, StackFrame, Variable } from 'vscode-debugadapter'; import { DebugProtocol } from 'vscode-debugprotocol'; -import { ScriptRunner } from '../core/ScriptRunner'; +import { RunnerService } from '../service/runnerService'; import { DebugServer } from './debugServer'; import { LaunchRequestArguments } from './debugSession'; import { BreakPointHandler } from './handler/breakpointHandler'; @@ -96,11 +96,11 @@ export class DebugDispatcher extends EventEmitter { } }); if (!args.program) { - args.program = await ScriptRunner.getPathByActive(); + args.program = await RunnerService.getPathByActive(); } if (!existsSync(runtime)) { - Out.log(`AutoHotkey Execute Bin Not Found: ${runtime}`); + Out.log(`AutoHotkey execute bin not found: ${runtime}`); this.end(); return; } @@ -119,7 +119,7 @@ export class DebugDispatcher extends EventEmitter { public async restart() { this.sendComand('stop'); this.end(); - ScriptRunner.startDebugger(this.startArgs.program); + RunnerService.startDebugger(this.startArgs.program); } /** diff --git a/src/extension.ts b/src/extension.ts index 8258a93d..c0c5bf7c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,24 +1,25 @@ import * as vscode from 'vscode'; import { ProviderResult } from 'vscode'; -import { Detecter } from './core/detect/detecter'; -import { ScriptRunner } from './core/ScriptRunner'; +import { Parser } from './parser/parser'; +import { RunnerService } from './service/runnerService'; import { DebugSession } from './debugger/debugSession'; -import { DefProvider } from './provider/DefProvider'; -import { TemplateProvider } from './provider/templateProvider'; -import { FormatProvider } from './provider/formattingProvider'; -import { SymBolProvider } from './provider/SymbolProvider'; +import { DefProvider } from './providers/defProvider'; +import { TemplateService } from './service/templateService'; +import { FormatProvider } from './providers/formattingProvider'; +import { SymBolProvider } from './providers/SymbolProvider'; import { FileManager } from './common/fileManager'; -import { AhkHoverProvider } from './provider/ahkHoverProvider'; -import { RefProvider } from './provider/RefProvider'; +import { AhkHoverProvider } from './providers/ahkHoverProvider'; +import { RefProvider } from './providers/refProvider'; import { Global, ConfigKey } from './common/global'; -import { AhkRenameProvider } from './provider/ahkRenameProvider'; -import { SignatureProvider } from './provider/signatureProvider'; -import { CompletionProvider } from './provider/CompletionProvider'; +import { AhkRenameProvider } from './providers/ahkRenameProvider'; +import { SignatureProvider } from './providers/signatureProvider'; +import { CompletionProvider } from './providers/completionProvider'; +import { DocumentService } from './service/documentService'; export function activate(context: vscode.ExtensionContext) { (async () => { Global.updateStatusBarItems('Indexing AutoHotkey Workspace...'); - await Detecter.buildByPath(vscode.workspace.rootPath); + await Parser.buildByPath(vscode.workspace.rootPath); Global.updateStatusBarItems('Index Workspace Success!'); Global.hide(); })(); @@ -53,21 +54,24 @@ export function activate(context: vscode.ExtensionContext) { new FormatProvider(), ), vscode.languages.registerReferenceProvider(language, new RefProvider()), - TemplateProvider.createEditorListenr(), vscode.debug.registerDebugAdapterDescriptorFactory( 'ahk', new InlineDebugAdapterFactory(), ), - vscode.commands.registerCommand('run.ahk', () => ScriptRunner.run()), + TemplateService.createEditorListener(), + vscode.commands.registerCommand('run.ahk', () => RunnerService.run()), + vscode.commands.registerCommand('document.open', () => + DocumentService.open(), + ), vscode.commands.registerCommand('debug.ahk', () => - ScriptRunner.startDebugger(), + RunnerService.startDebugger(), ), vscode.commands.registerCommand('compile.ahk', () => - ScriptRunner.compile(), + RunnerService.compile(), ), ); - if (Global.getConfig(ConfigKey.intellisense)) { + if (Global.getConfig(ConfigKey.enableIntelliSense)) { context.subscriptions.push( vscode.languages.registerCompletionItemProvider( language, diff --git a/src/core/detect/model.ts b/src/parser/model.ts similarity index 100% rename from src/core/detect/model.ts rename to src/parser/model.ts diff --git a/src/core/detect/detecter.ts b/src/parser/parser.ts similarity index 94% rename from src/core/detect/detecter.ts rename to src/parser/parser.ts index dc1c8b9b..3f8dbc30 100644 --- a/src/core/detect/detecter.ts +++ b/src/parser/parser.ts @@ -1,10 +1,10 @@ import * as fs from 'fs'; import * as vscode from 'vscode'; -import { CodeUtil } from '../../common/codeUtil'; -import { Out } from '../../common/out'; +import { CodeUtil } from '../common/codeUtil'; +import { Out } from '../common/out'; import { Script, Method, Ref, Label, Block, Variable } from './model'; -export class Detecter { +export class Parser { private static documentCache = new Map(); /** @@ -66,7 +66,7 @@ export class Detecter { if (blockComment) { continue; } - const methodOrRef = Detecter.detechMethodByLine(document, line); + const methodOrRef = Parser.detechMethodByLine(document, line); if (methodOrRef) { if (methodOrRef instanceof Method) { methods.push(methodOrRef); @@ -85,12 +85,12 @@ export class Detecter { CodeUtil.join(refs, methodOrRef); } } - const label = Detecter.getLabelByLine(document, line); + const label = Parser.getLabelByLine(document, line); if (label) { labels.push(label); continue; } - const block = Detecter.getBlockByLine(document, line); + const block = Parser.getBlockByLine(document, line); if (block) { blocks.push(block); } @@ -103,7 +103,7 @@ export class Detecter { currentMethod.endLine = line; } } - const variable = Detecter.detechVariableByLine(document, line); + const variable = Parser.detechVariableByLine(document, line); if (variable) { if (deep == 0 || !currentMethod) { this.joinVars(variables, variable); @@ -221,7 +221,7 @@ export class Detecter { ): Variable | Variable[] { const lineText = CodeUtil.purity(document.lineAt(line).text); - const defMatch = lineText.match(Detecter.varDefPattern); + const defMatch = lineText.match(Parser.varDefPattern); if (defMatch) { const varName = defMatch[1]; return { @@ -235,7 +235,7 @@ export class Detecter { } else { let vars = []; const commandMatchAll = CodeUtil.matchAll( - Detecter.varCommandPattern, + Parser.varCommandPattern, lineText.replace(/\(.+?\)/g, ''), ); for (let index = 0; index < commandMatchAll.length; index++) { @@ -298,7 +298,7 @@ export class Detecter { line, character, true, - Detecter.getRemarkByLine(document, line - 1), + Parser.getRemarkByLine(document, line - 1), ); } for (let i = line + 1; i < document.lineCount; i++) { @@ -314,7 +314,7 @@ export class Detecter { line, character, false, - Detecter.getRemarkByLine(document, line - 1), + Parser.getRemarkByLine(document, line - 1), ); } else { return new Ref(methodName, document, line, character); diff --git a/src/provider/SymbolProvider.ts b/src/providers/SymbolProvider.ts similarity index 94% rename from src/provider/SymbolProvider.ts rename to src/providers/SymbolProvider.ts index f1173eb8..4197e332 100644 --- a/src/provider/SymbolProvider.ts +++ b/src/providers/SymbolProvider.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { Detecter } from '../core/detect/detecter'; +import { Parser } from '../parser/parser'; export class SymBolProvider implements vscode.DocumentSymbolProvider { public async provideDocumentSymbols( @@ -8,7 +8,7 @@ export class SymBolProvider implements vscode.DocumentSymbolProvider { ): Promise { const result = []; - const script = await Detecter.buildScript(document, false); + const script = await Parser.buildScript(document, false); for (const method of script.methods) { result.push( diff --git a/src/provider/ahkHoverProvider.ts b/src/providers/ahkHoverProvider.ts similarity index 95% rename from src/provider/ahkHoverProvider.ts rename to src/providers/ahkHoverProvider.ts index 8c64785c..b1edb59a 100644 --- a/src/provider/ahkHoverProvider.ts +++ b/src/providers/ahkHoverProvider.ts @@ -1,17 +1,16 @@ +import { readFileSync } from 'fs'; +import { join } from 'path'; import { - HoverProvider, - TextDocument, - Position, CancellationToken, ExtensionContext, - Range, Hover, + HoverProvider, MarkdownString, + Position, + Range, + TextDocument, } from 'vscode'; -import { join } from 'path'; -import { readFileSync } from 'fs'; -import { worker } from 'cluster'; -import { Detecter } from '../core/detect/detecter'; +import { Parser } from '../parser/parser'; interface Snippet { prefix: string; @@ -42,7 +41,7 @@ export class AhkHoverProvider implements HoverProvider { return snippetHover; } - const method = await Detecter.getMethodByName(document, context.word); + const method = await Parser.getMethodByName(document, context.word); if (method) { const markdonw = new MarkdownString('', true).appendCodeblock( method.full, diff --git a/src/provider/ahkRenameProvider.ts b/src/providers/ahkRenameProvider.ts similarity index 88% rename from src/provider/ahkRenameProvider.ts rename to src/providers/ahkRenameProvider.ts index 0be969ea..8010a720 100644 --- a/src/provider/ahkRenameProvider.ts +++ b/src/providers/ahkRenameProvider.ts @@ -1,5 +1,6 @@ import * as vscode from 'vscode'; -import { Detecter } from '../core/detect/detecter'; +import { Parser } from '../parser/parser'; +import { Out } from '../common/out'; export class AhkRenameProvider implements vscode.RenameProvider { async provideRenameEdits( @@ -9,13 +10,13 @@ export class AhkRenameProvider implements vscode.RenameProvider { token: vscode.CancellationToken, ): Promise { for (const doc of vscode.workspace.textDocuments) { - Detecter.buildScript(doc); + Parser.buildScript(doc); } const word = document.getText( document.getWordRangeAtPosition(position), ); - const refs = Detecter.getAllRefByName(word); + const refs = Parser.getAllRefByName(word); const workEdit = new vscode.WorkspaceEdit(); for (const ref of refs) { if (ref.document.uri.scheme != 'file') { @@ -50,7 +51,7 @@ export class AhkRenameProvider implements vscode.RenameProvider { const wordRange = document.getWordRangeAtPosition(position); const word = document.getText(wordRange); - const method = await Detecter.getMethodByName(document, word); + const method = await Parser.getMethodByName(document, word); if (method != null) { return wordRange; } diff --git a/src/provider/CompletionProvider.ts b/src/providers/completionProvider.ts similarity index 94% rename from src/provider/CompletionProvider.ts rename to src/providers/completionProvider.ts index f6b5609a..fcae2fd3 100644 --- a/src/provider/CompletionProvider.ts +++ b/src/providers/completionProvider.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { Detecter } from '../core/detect/detecter'; +import { Parser } from '../parser/parser'; import { SnippetString } from 'vscode'; export class CompletionProvider implements vscode.CompletionItemProvider { @@ -27,7 +27,7 @@ export class CompletionProvider implements vscode.CompletionItemProvider { const result: vscode.CompletionItem[] = []; - (await Detecter.getAllMethod()).forEach((method) => { + (await Parser.getAllMethod()).forEach((method) => { const completionItem = new vscode.CompletionItem( method.params.length == 0 ? method.name : method.full, vscode.CompletionItemKind.Method, @@ -65,7 +65,7 @@ export class CompletionProvider implements vscode.CompletionItemProvider { } }); - const script = await Detecter.buildScript(document, true); + const script = await Parser.buildScript(document, true); script.variables.forEach((variable) => { const completionItem = new vscode.CompletionItem( variable.name, diff --git a/src/provider/DefProvider.ts b/src/providers/defProvider.ts similarity index 93% rename from src/provider/DefProvider.ts rename to src/providers/defProvider.ts index 1db15d51..fd14921b 100644 --- a/src/provider/DefProvider.ts +++ b/src/providers/defProvider.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { Detecter } from '../core/detect/detecter'; +import { Parser } from '../parser/parser'; import { existsSync } from 'fs'; export class DefProvider implements vscode.DefinitionProvider { @@ -23,7 +23,7 @@ export class DefProvider implements vscode.DefinitionProvider { document.lineAt(position.line).text, ) ) { - const method = await Detecter.getMethodByName(document, word); + const method = await Parser.getMethodByName(document, word); if (method) { const methodDoc = method.document; return new vscode.Location( @@ -34,7 +34,7 @@ export class DefProvider implements vscode.DefinitionProvider { } // getlabel - const label = await Detecter.getLabelByName(document, word); + const label = await Parser.getLabelByName(document, word); if (label) { const tempDocument = label.document; return new vscode.Location( @@ -43,7 +43,7 @@ export class DefProvider implements vscode.DefinitionProvider { ); } - const script = await Detecter.buildScript(document, true); + const script = await Parser.buildScript(document, true); for (const method of script.methods) { if ( diff --git a/src/provider/formattingProvider.ts b/src/providers/formattingProvider.ts similarity index 100% rename from src/provider/formattingProvider.ts rename to src/providers/formattingProvider.ts diff --git a/src/provider/RefProvider.ts b/src/providers/refProvider.ts similarity index 87% rename from src/provider/RefProvider.ts rename to src/providers/refProvider.ts index ba2b213f..2046b5fc 100644 --- a/src/provider/RefProvider.ts +++ b/src/providers/refProvider.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { Detecter } from '../core/detect/detecter'; +import { Parser } from '../parser/parser'; export class RefProvider implements vscode.ReferenceProvider { public provideReferences( @@ -13,7 +13,7 @@ export class RefProvider implements vscode.ReferenceProvider { ); const vscodeRefs = []; - const refs = Detecter.getAllRefByName(word); + const refs = Parser.getAllRefByName(word); for (const ref of refs) { vscodeRefs.push( new vscode.Location( diff --git a/src/provider/signatureProvider.ts b/src/providers/signatureProvider.ts similarity index 91% rename from src/provider/signatureProvider.ts rename to src/providers/signatureProvider.ts index fbe6be11..92198bca 100644 --- a/src/provider/signatureProvider.ts +++ b/src/providers/signatureProvider.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { Detecter } from '../core/detect/detecter'; +import { Parser } from '../parser/parser'; export class SignatureProvider implements vscode.SignatureHelpProvider { public async provideSignatureHelp( @@ -25,7 +25,7 @@ export class SignatureProvider implements vscode.SignatureHelpProvider { document.getWordRangeAtPosition(methodPosition), ); - const method = await Detecter.getMethodByName(document, word); + const method = await Parser.getMethodByName(document, word); if (method) { return { activeSignature: 0, diff --git a/src/service/documentService.ts b/src/service/documentService.ts new file mode 100644 index 00000000..6e071e80 --- /dev/null +++ b/src/service/documentService.ts @@ -0,0 +1,5 @@ +export class DocumentService { + public static open(): any { + throw new Error('Method not implemented.'); + } +} diff --git a/src/core/ScriptRunner.ts b/src/service/runnerService.ts similarity index 99% rename from src/core/ScriptRunner.ts rename to src/service/runnerService.ts index 228bd4e5..d8a92a12 100644 --- a/src/core/ScriptRunner.ts +++ b/src/service/runnerService.ts @@ -4,7 +4,7 @@ import { FileManager, FileModel } from '../common/fileManager'; import { ConfigKey, Global } from '../common/global'; import { Process } from '../common/processWrapper'; -export class ScriptRunner { +export class RunnerService { /** * start debuggin session */ diff --git a/src/provider/templateProvider.ts b/src/service/templateService.ts similarity index 82% rename from src/provider/templateProvider.ts rename to src/service/templateService.ts index 563b7adb..17048a3a 100644 --- a/src/provider/templateProvider.ts +++ b/src/service/templateService.ts @@ -1,7 +1,7 @@ import * as vscode from 'vscode'; -export class TemplateProvider { - public static createEditorListenr(): vscode.Disposable { +export class TemplateService { + public static createEditorListener(): vscode.Disposable { return vscode.window.onDidChangeActiveTextEditor((e) => { if ( e && From 91f3c96ca2661ff491e5b3f232fd1c3b166c2319 Mon Sep 17 00:00:00 2001 From: cweijan Date: Tue, 17 Nov 2020 11:03:03 +0800 Subject: [PATCH 13/32] Implement `Open Help` and fix command names --- package.json | 54 +++++++++++++++++----------------- src/common/global.ts | 2 +- src/extension.ts | 12 ++++---- src/service/documentService.ts | 5 ---- src/service/helpService.ts | 9 ++++++ 5 files changed, 43 insertions(+), 39 deletions(-) delete mode 100644 src/service/documentService.ts create mode 100644 src/service/helpService.ts diff --git a/package.json b/package.json index 6ac43b73..fe3957ea 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "activationEvents": [ "onLanguage:ahk", - "onCommand:run.ahk", + "onCommand:ahk++.run", "onDebug" ], "main": "./out/extension", @@ -141,25 +141,25 @@ ], "commands": [ { - "command": "document.open", - "title": "Open Autohotkey Help", - "category": "AHK" + "command": "ahk++.openHelp", + "title": "Open AutoHotkey Help", + "category": "AHK++" }, { - "command": "compile.ahk", - "title": "Compile Script", - "category": "AHK", + "command": "ahk++.compile", + "title": "Compile AHK Script", + "category": "AHK++", "icon": "./image/build.svg" }, { - "command": "run.ahk", - "title": "Run Script", - "category": "AHK" + "command": "ahk++.run", + "title": "Run AHK Script", + "category": "AHK++" }, { - "command": "debug.ahk", - "title": "Debug Script", - "category": "AHK", + "command": "ahk++.debug", + "title": "Debug AHK Script", + "category": "AHK++", "icon": { "light": "./image/run.png", "dark": "./image/run-dark.png" @@ -169,19 +169,19 @@ "menus": { "editor/context": [ { - "command": "run.ahk", + "command": "ahk++.run", "when": "editorLangId == ahk", "group": "navigation@0" }, { - "command": "compile.ahk", + "command": "ahk++.compile", "when": "editorLangId == ahk", "group": "navigation@1" } ], "editor/title": [ { - "command": "debug.ahk", + "command": "ahk++.debug", "when": "editorLangId == ahk", "group": "navigation@1" } @@ -189,23 +189,23 @@ }, "keybindings": [ { - "command": "document.open", + "command": "ahk++.openHelp", "key": "shift+f1", "when": "editorLangId == ahk" }, { - "command": "debug.ahk", - "key": "F9", + "command": "ahk++.debug", + "key": "f9", "when": "editorLangId == ahk" }, { - "command": "run.ahk", - "key": "Ctrl+F9", + "command": "ahk++.run", + "key": "ctrl+f9", "when": "editorLangId == ahk" }, { - "command": "compile.ahk", - "key": "Ctrl+Shift+F9", + "command": "ahk++.compile", + "key": "ctrl+shift+f9", "when": "editorLangId == ahk" } ], @@ -222,17 +222,17 @@ "ahk++.compilePath": { "type": "string", "default": "C:/Program Files/AutoHotkey/Compiler/Ahk2Exe.exe", - "description": "Absolute path to an Ahk2Exe.exe file." + "description": "Path to the AHK compiler." }, - "ahk++.documentPath": { + "ahk++.helpPath": { "type": "string", "default": "C:/Program Files/AutoHotkey/AutoHotkey.chm", - "description": "Document path of autohotkey." + "description": "Path to the AHK Help document." }, "ahk++.executePath": { "type": "string", "default": "C:/Program Files/AutoHotkey/AutoHotkeyU64.exe", - "description": "The execute path of AHK." + "description": "Path to the AHK runner." }, "ahk++.intellisense": { "type": "boolean", diff --git a/src/common/global.ts b/src/common/global.ts index abe2bc28..69146338 100644 --- a/src/common/global.ts +++ b/src/common/global.ts @@ -30,7 +30,7 @@ export class Global { export enum ConfigKey { compilePath = 'compilePath', - documentPath = 'documentPath', + helpPath = 'helpPath', enableIntelliSense = 'enableIntelliSense', executePath = 'executePath', } diff --git a/src/extension.ts b/src/extension.ts index c0c5bf7c..c97fb8eb 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -14,7 +14,7 @@ import { Global, ConfigKey } from './common/global'; import { AhkRenameProvider } from './providers/ahkRenameProvider'; import { SignatureProvider } from './providers/signatureProvider'; import { CompletionProvider } from './providers/completionProvider'; -import { DocumentService } from './service/documentService'; +import { HelpService } from './service/helpService'; export function activate(context: vscode.ExtensionContext) { (async () => { @@ -59,14 +59,14 @@ export function activate(context: vscode.ExtensionContext) { new InlineDebugAdapterFactory(), ), TemplateService.createEditorListener(), - vscode.commands.registerCommand('run.ahk', () => RunnerService.run()), - vscode.commands.registerCommand('document.open', () => - DocumentService.open(), + vscode.commands.registerCommand('ahk++.run', () => RunnerService.run()), + vscode.commands.registerCommand('ahk++.openHelp', () => + HelpService.open(), ), - vscode.commands.registerCommand('debug.ahk', () => + vscode.commands.registerCommand('ahk++.debug', () => RunnerService.startDebugger(), ), - vscode.commands.registerCommand('compile.ahk', () => + vscode.commands.registerCommand('ahk++.compile', () => RunnerService.compile(), ), ); diff --git a/src/service/documentService.ts b/src/service/documentService.ts deleted file mode 100644 index 6e071e80..00000000 --- a/src/service/documentService.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class DocumentService { - public static open(): any { - throw new Error('Method not implemented.'); - } -} diff --git a/src/service/helpService.ts b/src/service/helpService.ts new file mode 100644 index 00000000..5be07e97 --- /dev/null +++ b/src/service/helpService.ts @@ -0,0 +1,9 @@ +import { ConfigKey, Global } from '../common/global'; +import { Process } from '../common/processWrapper'; + +export class HelpService { + public static open(): void { + const helpPath = Global.getConfig(ConfigKey.helpPath); + Process.exec(`C:/Windows/hh.exe ${helpPath}`); + } +} From 77ade635f3d9dc74fe6910f95fd5eccdd38a1bb4 Mon Sep 17 00:00:00 2001 From: cweijan Date: Tue, 17 Nov 2020 11:37:43 +0800 Subject: [PATCH 14/32] Support running selection as standalone script --- package.json | 49 +++++++++++++------- src/debugger/debugSession.ts | 2 + src/extension.ts | 13 ++++-- src/service/runnerService.ts | 89 ++++++++++++++++-------------------- 4 files changed, 81 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index fe3957ea..846e3c43 100644 --- a/package.json +++ b/package.json @@ -140,22 +140,12 @@ } ], "commands": [ - { - "command": "ahk++.openHelp", - "title": "Open AutoHotkey Help", - "category": "AHK++" - }, { "command": "ahk++.compile", "title": "Compile AHK Script", "category": "AHK++", "icon": "./image/build.svg" }, - { - "command": "ahk++.run", - "title": "Run AHK Script", - "category": "AHK++" - }, { "command": "ahk++.debug", "title": "Debug AHK Script", @@ -164,19 +154,39 @@ "light": "./image/run.png", "dark": "./image/run-dark.png" } + }, + { + "command": "ahk++.openHelp", + "title": "Open AutoHotkey Help", + "category": "AHK++" + }, + { + "command": "ahk++.run", + "title": "Run AHK Script", + "category": "AHK++" + }, + { + "command": "ahk++.runSelection", + "title": "Run Selection", + "category": "AHK" } ], "menus": { "editor/context": [ + { + "command": "ahk++.compile", + "when": "editorLangId == ahk", + "group": "navigation@1" + }, { "command": "ahk++.run", "when": "editorLangId == ahk", "group": "navigation@0" }, { - "command": "ahk++.compile", - "when": "editorLangId == ahk", - "group": "navigation@1" + "command": "ahk++.runSelection", + "when": "editorLangId == ahk && editorHasSelection", + "group": "navigation@-1" } ], "editor/title": [ @@ -189,8 +199,8 @@ }, "keybindings": [ { - "command": "ahk++.openHelp", - "key": "shift+f1", + "command": "ahk++.compile", + "key": "ctrl+shift+f9", "when": "editorLangId == ahk" }, { @@ -198,14 +208,19 @@ "key": "f9", "when": "editorLangId == ahk" }, + { + "command": "ahk++.openHelp", + "key": "shift+f1", + "when": "editorLangId == ahk" + }, { "command": "ahk++.run", "key": "ctrl+f9", "when": "editorLangId == ahk" }, { - "command": "ahk++.compile", - "key": "ctrl+shift+f9", + "command": "ahk++.runSelection", + "key": "ctrl+f8", "when": "editorLangId == ahk" } ], diff --git a/src/debugger/debugSession.ts b/src/debugger/debugSession.ts index 05b5a7b2..193daf73 100644 --- a/src/debugger/debugSession.ts +++ b/src/debugger/debugSession.ts @@ -1,3 +1,4 @@ +import { commands } from 'vscode'; import { BreakpointEvent, InitializedEvent, @@ -61,6 +62,7 @@ export class DebugSession extends LoggingDebugSession { }) .on('output', (text) => { this.sendEvent(new OutputEvent(`${text}\n`)); + commands.executeCommand('workbench.debug.action.focusRepl'); }) .on('end', () => { this.sendEvent(new TerminatedEvent()); diff --git a/src/extension.ts b/src/extension.ts index c97fb8eb..a6b1b7cb 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -59,15 +59,18 @@ export function activate(context: vscode.ExtensionContext) { new InlineDebugAdapterFactory(), ), TemplateService.createEditorListener(), - vscode.commands.registerCommand('ahk++.run', () => RunnerService.run()), - vscode.commands.registerCommand('ahk++.openHelp', () => - HelpService.open(), + vscode.commands.registerCommand('ahk++.compile', () => + RunnerService.compile(), ), vscode.commands.registerCommand('ahk++.debug', () => RunnerService.startDebugger(), ), - vscode.commands.registerCommand('ahk++.compile', () => - RunnerService.compile(), + vscode.commands.registerCommand('ahk++.openHelp', () => + HelpService.open(), + ), + vscode.commands.registerCommand('ahk++.run', () => RunnerService.run()), + vscode.commands.registerCommand('ahk++.runSelection', () => + RunnerService.runSelection(), ), ); diff --git a/src/service/runnerService.ts b/src/service/runnerService.ts index d8a92a12..e8daa171 100644 --- a/src/service/runnerService.ts +++ b/src/service/runnerService.ts @@ -5,9 +5,19 @@ import { ConfigKey, Global } from '../common/global'; import { Process } from '../common/processWrapper'; export class RunnerService { - /** - * start debuggin session - */ + /** Runs the editor selection as a standalone script. */ + public static async runSelection(): Promise { + const editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showErrorMessage('No active editor found!'); + return; + } + + var selection = editor.selection; + var text = editor.document.getText(selection); + this.run(await this.createTemplate(text)); + } + public static async startDebugger(script?: string) { const cwd = script ? vscode.Uri.file(script) @@ -27,61 +37,35 @@ export class RunnerService { } /** - * run/debug script - * @param executePath runtime path - * @param path execute script path - * @param debug enable debug model? - * @param debugPort debug proxy port + * Runs the script at the specified path */ - public static async run( - executePath = null, - path: string = null, - debug: boolean = false, - debugPort = 9000, - ): Promise { - executePath = Global.getConfig(ConfigKey.executePath); - if (!vscode.window.activeTextEditor.document.isUntitled) { - vscode.commands.executeCommand('workbench.action.files.save'); - } - if (executePath) { - if (!path) { - path = await this.getPathByActive(); - } - try { - await Process.exec( - `\"${executePath}\"${ - debug - ? ' /ErrorStdOut /debug=localhost:' + debugPort - : '' - } \"${path}\"`, - { cwd: `${res(path, '..')}` }, - ); - return true; - } catch (error) { - return false; - } - } else { - return false; + public static async run(path?: string): Promise { + const executePath = Global.getConfig(ConfigKey.executePath); + this.checkAndSaveActive(); + if (!path) { + path = await this.getPathByActive(); } + Process.exec(`\"${executePath}\" \"${path}\"`, { + cwd: `${res(path, '..')}`, + }); } /** - * compile current script + * Compiles current script */ public static async compile() { const currentPath = vscode.window.activeTextEditor.document.uri.fsPath; - if (!vscode.window.activeTextEditor.document.isUntitled) { - vscode.commands.executeCommand('workbench.action.files.save'); - } if (!currentPath) { + vscode.window.showErrorMessage('Cannot compile never-saved files.'); return; } + this.checkAndSaveActive(); const pos = currentPath.lastIndexOf('.'); const compilePath = currentPath.substr(0, pos < 0 ? currentPath.length : pos) + '.exe'; if ( await Process.exec( - `"${Global.getConfig( + `"${Global.getConfig( ConfigKey.compilePath, )}" /in "${currentPath}" /out "${compilePath}"`, { cwd: `${res(currentPath, '..')}` }, @@ -94,17 +78,22 @@ export class RunnerService { public static async getPathByActive(): Promise { const document = vscode.window.activeTextEditor.document; if (document.isUntitled) { - const path = `temp-${this.getNowDate()}.ahk`; - const fullPath = await FileManager.record( - path, - document.getText(), - FileModel.WRITE, - ); - return fullPath; + return await this.createTemplate(document.getText()); } return document.fileName; } + public static async createTemplate(content: string) { + const path = `temp-${this.getNowDate()}.ahk`; + return await FileManager.record(path, content, FileModel.WRITE); + } + + private static checkAndSaveActive(): void { + if (!vscode.window.activeTextEditor.document.isUntitled) { + vscode.commands.executeCommand('workbench.action.files.save'); + } + } + private static getNowDate(): string { const date = new Date(); let month: string | number = date.getMonth() + 1; @@ -133,7 +122,7 @@ export class RunnerService { ); } - public static pad(n: any, width: number, z?: any): number { + private static pad(n: any, width: number, z?: any): number { z = z || '0'; n = n + ''; return n.length >= width From 0e79a07b074c941455b741bad1ef64c00a46dceb Mon Sep 17 00:00:00 2001 From: cweijan Date: Tue, 17 Nov 2020 12:03:34 +0800 Subject: [PATCH 15/32] Update README and remove unused images --- README.md | 44 ++++++++++++++------------------------- image/codeSymbol.jpg | Bin 12299 -> 0 bytes image/compile.jpg | Bin 17259 -> 0 bytes image/functionSymbol.jpg | Bin 13991 -> 0 bytes 4 files changed, 16 insertions(+), 28 deletions(-) delete mode 100644 image/codeSymbol.jpg delete mode 100644 image/compile.jpg delete mode 100644 image/functionSymbol.jpg diff --git a/README.md b/README.md index 05f20696..06e15c41 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,20 @@ # AutoHotkey Plus Plus (AHK++) -AutoHotkey Plus Plus (AHK++) provides actively maintained, comprehensive AutoHotkey language support for VS Code. This includes IntelliSense and debug support, along with the standard code highlighting. AHK++ is a fork of the deprecated [AutoHotkey Plus by cweijan](https://github.com/cweijan/vscode-autohotkey#readme). +AutoHotkey Plus Plus (AHK++) provides actively maintained, comprehensive AutoHotkey language support for VS Code. This includes IntelliSense and debug support, along with the standard code highlighting. AHK++ is a fork of the [once-deprecated AutoHotkey Plus by cweijan](https://github.com/AutoHotkey-Plus/vscode-autohotkey/commit/e87f12774692d4c0d792650c099e6071dc17b069). > View this README on the [project site](https://github.com/mark-wiemer/vscode-autohotkey-plus-plus#readme) ## Contents - [Why AutoHotkey Plus Plus?](#why-autohotkey-plus-plus) -- [Coffee](#coffee) - [Install](#install) +- [Commands](#commands) - [Debug](#debug) - [Language Features](#language-features) - [IntelliSense](#intellisense) - [Function Symbol](#function-symbol) - [Goto Definition](#goto-definition) - [Find References](#find-references) - - [Code Symbol](#code-symbol) - [Hover Tip](#hover-tip) - [Code Format](#code-format) - [Context Menu](#context-menu) @@ -30,14 +29,20 @@ AutoHotkey Plus Plus is one of many extensions that offer VS Code language suppo - **Debug Support**: Run and debug AHK scripts from VS Code. - **New Features**: Another benefit to active maintenance is that AHK++ can add new features as users request them. -## Coffee - -If you like this extension, consider [buying cweijan a coffee](https://www.buymeacoffee.com/cweijan). Thank you! - ## Install Install from VS Code Marketplace: [Install AutoHotkey Plus Plus](https://marketplace.visualstudio.com/items?itemName=mark-wiemer.vscode-autohotkey-plus-plus). +## Commands + +With AHK++, you can compile, debug, and run your scripts with keyboard shortcuts. You can also run a selection as a standalone script. Additionally, you can `Open Help` with `Shift + F1`. + +- Compile: `Ctrl + Shift + F9` +- Debug: `F9` +- Open Help: `Shift + F1` +- Run: `Ctrl + F9` +- Run Selection: `Ctrl + F8` + ## Debug 1. Click Run or press F9. @@ -64,8 +69,6 @@ Supports IntelliSense for variables and functions. 1. Detach source function as symbol 2. You can add a comment to the function using a semicolon on the line above the function declaration -![Function Symbol](image/functionSymbol.jpg) - ### Goto Definition 1. Support goto function and variable definition. @@ -75,16 +78,11 @@ Supports IntelliSense for variables and functions. ### Find Symbol References -Usage: Move coordinates to symbol, then: +Select a symbol, then: -- Right-click on a symbol, then select `Find All References`. +- Right-click and select `Find All References`. - Or press `Shift + F12`. -### Code Symbol - -Usage: Add two semicolon to comment code block -![Code Symbol](image/codeSymbol.jpg) - ### Hover Tip Usage: Move mouse to function call or command. @@ -98,19 +96,9 @@ Supports standard VS Code formatting. ![Code Format](image/codeFormat.jpg) -## Context Menu - -Run and compile code from the context menu. - -Right-click to open the context menu, then: - -- **Run**: Run script without debug (`Ctrl + F9`). -- **Compile**: Compile script in same directory (`Ctrl + Shift + F9`). - ![compile](image/compile.jpg) - ## Credits Previous extensions: -- [AutoHotkey Plus](https://github.com/cweijan/vscode-autohotkey) -- [AutoHotkey](https://github.com/stef-levesque/vscode-autohotkey) +- [AutoHotkey Plus by cweijan](https://github.com/cweijan/vscode-autohotkey) +- [AutoHotkey by stef-levesque](https://github.com/stef-levesque/vscode-autohotkey) diff --git a/image/codeSymbol.jpg b/image/codeSymbol.jpg deleted file mode 100644 index 04f6f91f90823d83d1baef07d5684a32ac7f37af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12299 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 E0@d*_N&o-= diff --git a/image/compile.jpg b/image/compile.jpg deleted file mode 100644 index cc8ee3bec1d78987d535d3f95922e1f1c1d671d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17259 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 diff --git a/image/functionSymbol.jpg b/image/functionSymbol.jpg deleted file mode 100644 index c492f19cf0a3dd9ab43aef32f39bd684e75ce51e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13991 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 M_S*gx4c*NA7wSl+tpET3 From f137e302fa2e899f2ce76624091c2b7b89146036 Mon Sep 17 00:00:00 2001 From: cweijan Date: Thu, 19 Nov 2020 21:51:40 +0800 Subject: [PATCH 16/32] Make indentation consistent for return and ExitApp --- src/providers/formattingProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/formattingProvider.ts b/src/providers/formattingProvider.ts index 6198fede..dbc0aedf 100644 --- a/src/providers/formattingProvider.ts +++ b/src/providers/formattingProvider.ts @@ -70,7 +70,7 @@ export class FormatProvider implements vscode.DocumentFormattingEditProvider { notDeep = false; } - if (purityText.match(/\b(return)\b/i) && tagDeep === deep) { + if (purityText.match(/\b(return|ExitApp)\b/i) && tagDeep === deep) { tagDeep == 0; deep--; notDeep = false; From 342b82d0f67e772563a1baf9cf0f24b8b72d551c Mon Sep 17 00:00:00 2001 From: cweijan Date: Thu, 19 Nov 2020 22:00:43 +0800 Subject: [PATCH 17/32] Remove variables from outline --- src/extension.ts | 4 ++-- src/providers/SymbolProvider.ts | 16 +--------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index a6b1b7cb..1c6d43fa 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -6,7 +6,7 @@ import { DebugSession } from './debugger/debugSession'; import { DefProvider } from './providers/defProvider'; import { TemplateService } from './service/templateService'; import { FormatProvider } from './providers/formattingProvider'; -import { SymBolProvider } from './providers/SymbolProvider'; +import { SymbolProvider } from './providers/symbolProvider'; import { FileManager } from './common/fileManager'; import { AhkHoverProvider } from './providers/ahkHoverProvider'; import { RefProvider } from './providers/refProvider'; @@ -47,7 +47,7 @@ export function activate(context: vscode.ExtensionContext) { ), vscode.languages.registerDocumentSymbolProvider( language, - new SymBolProvider(), + new SymbolProvider(), ), vscode.languages.registerDocumentFormattingEditProvider( language, diff --git a/src/providers/SymbolProvider.ts b/src/providers/SymbolProvider.ts index 4197e332..207a5873 100644 --- a/src/providers/SymbolProvider.ts +++ b/src/providers/SymbolProvider.ts @@ -1,7 +1,7 @@ import * as vscode from 'vscode'; import { Parser } from '../parser/parser'; -export class SymBolProvider implements vscode.DocumentSymbolProvider { +export class SymbolProvider implements vscode.DocumentSymbolProvider { public async provideDocumentSymbols( document: vscode.TextDocument, token: vscode.CancellationToken, @@ -52,20 +52,6 @@ export class SymBolProvider implements vscode.DocumentSymbolProvider { ); } - for (const variable of script.variables) { - result.push( - new vscode.SymbolInformation( - variable.name, - vscode.SymbolKind.Variable, - null, - new vscode.Location( - variable.document.uri, - new vscode.Position(variable.line, variable.character), - ), - ), - ); - } - return result; } } From 961dcb165a152e4bad95a089bd1c10241f18a600 Mon Sep 17 00:00:00 2001 From: fade2gray <1332009+fade2gray@users.noreply.github.com> Date: Sat, 5 Dec 2020 15:43:11 +0000 Subject: [PATCH 18/32] Remove deprecation warning from StrSplit function --- snippets/ahk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snippets/ahk.json b/snippets/ahk.json index 633322b7..56aefb70 100644 --- a/snippets/ahk.json +++ b/snippets/ahk.json @@ -1671,7 +1671,7 @@ "StrSplit()": { "prefix": "StrSplit()", "body": "StrSplit(${1:String}, ${2:[Delimiters}, ${3:OmitChars]})", - "description": "Separates a string into an array of substrings using the specified delimiters.\nāš Deprecated: Use the StrSplit function instead." + "description": "Separates a string into an array of substrings using the specified delimiters." }, "StrReplace()": { "prefix": "StrReplace()", From 43e71ae64154c25d132fcb8bde7eac4a335775d1 Mon Sep 17 00:00:00 2001 From: fade2gray <1332009+fade2gray@users.noreply.github.com> Date: Sat, 5 Dec 2020 15:58:55 +0000 Subject: [PATCH 19/32] Simplify creation of block comments /* ;region No identation required to allow block comments to be folded. */ ;endregion --- ahk.configuration.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ahk.configuration.json b/ahk.configuration.json index 8e12cadd..6b19d692 100644 --- a/ahk.configuration.json +++ b/ahk.configuration.json @@ -31,8 +31,8 @@ // Folding regions marked by ";region" and ";endregion" comments. "folding": { "markers": { - "start": "^\\s*\\;\\s*region\\b", - "end": "^\\s*\\;\\s*endregion\\b" + "start": "\\s*\\;\\s*region\\b", + "end": "\\s*\\;\\s*endregion\\b" } } } From 934964e12fc6776cf11baba8243860c94f193dba Mon Sep 17 00:00:00 2001 From: tmplinshi Date: Sun, 6 Dec 2020 11:34:06 +0800 Subject: [PATCH 20/32] Fix getLabelByLine to allow tab characters --- src/parser/parser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/parser.ts b/src/parser/parser.ts index 3f8dbc30..628f83b2 100644 --- a/src/parser/parser.ts +++ b/src/parser/parser.ts @@ -198,7 +198,7 @@ export class Parser { private static getLabelByLine(document: vscode.TextDocument, line: number) { const text = CodeUtil.purity(document.lineAt(line).text); - const label = /^ *([\u4e00-\u9fa5_a-zA-Z0-9]+) *:{1}(?!(:|=))/.exec( + const label = /^[ \t]*([\u4e00-\u9fa5_a-zA-Z0-9]+) *:{1}(?!(:|=))/.exec( text, ); if (label) { From e1510f66a732fa1c1e93c3bec6bc7d314b4079c8 Mon Sep 17 00:00:00 2001 From: fade2gray <1332009+fade2gray@users.noreply.github.com> Date: Sun, 13 Dec 2020 14:19:17 +0000 Subject: [PATCH 21/32] Allow some nesting in regions --- ahk.configuration.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ahk.configuration.json b/ahk.configuration.json index 6b19d692..1a3ddf6f 100644 --- a/ahk.configuration.json +++ b/ahk.configuration.json @@ -31,8 +31,8 @@ // Folding regions marked by ";region" and ";endregion" comments. "folding": { "markers": { - "start": "\\s*\\;\\s*region\\b", - "end": "\\s*\\;\\s*endregion\\b" + "start": "^(\\/\\*)?\\s*\\;\\s*region\\b", + "end": "^(\\*\\/)?\\s*\\;\\s*endregion\\b" } } } From b433bacc58296d6d7c90a841b85ad5ebe3012a67 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 12:49:15 -0800 Subject: [PATCH 22/32] Add tests and known bug references --- demos/demo_for_ahk_v1.ahk | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/demos/demo_for_ahk_v1.ahk b/demos/demo_for_ahk_v1.ahk index 79312493..1a9ceb98 100644 --- a/demos/demo_for_ahk_v1.ahk +++ b/demos/demo_for_ahk_v1.ahk @@ -11,11 +11,13 @@ function() if (str == "str") { MsgBox Overwrite primitive variable! } + ; Known bug: `line ` lines should be indented one level more + ; https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues/25 str_multiline := " (LTrim - line 1 - line 2 - line 3 + line 1 + line 2 + line 3 )" int := 123 float := 123.456 @@ -34,13 +36,15 @@ function() obj := { str: str, int: int, float: float } objobj := { str: str, obj: obj } - objobjobj := { str: str, int: int, obj: { str: str, obj: obj } } + ; Known bug: the entire body of a function should be indented + ; https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues/26 +objobjobj := { str: str, int: int, obj: { str: str, obj: obj } } - circular := {} - circular.circular := circular - instance := new Cls() +circular := {} +circular.circular := circular +instance := new Cls() - enum := obj._NewEnum() +enum := obj._NewEnum() } class Cls { @@ -56,6 +60,14 @@ class Cls } } +; Block comments and nested regions +/* ;region +Collapse me! +{ + Collapse me too! +} +*/ ;endregion + ; Hotkeys and Keywords <#Tab:: AltTab @@ -67,7 +79,7 @@ LAlt() { ; do a thing } -; Function calls +; Function calls (with a space before parens) foo() bar () baz () @@ -76,4 +88,11 @@ baz () LAlt() Pause() AppsKey() -CapsLock() \ No newline at end of file +CapsLock() + +; SUBROUTINES + +; ExitApp indentation for subroutines +MySub: + foo() +ExitApp \ No newline at end of file From 85731548f6d99a7c4b42e7b5c44c4930922f0ce9 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:08:58 -0800 Subject: [PATCH 23/32] Add Run Selection test --- demos/demo_for_ahk_v1.ahk | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/demos/demo_for_ahk_v1.ahk b/demos/demo_for_ahk_v1.ahk index 1a9ceb98..6335f3d3 100644 --- a/demos/demo_for_ahk_v1.ahk +++ b/demos/demo_for_ahk_v1.ahk @@ -95,4 +95,12 @@ CapsLock() ; ExitApp indentation for subroutines MySub: foo() -ExitApp \ No newline at end of file +ExitApp + +; RUN SELECTION + +; Select the following line and hit `Ctrl + F8` to run selection +f1:: MsgBox, You hit F1 + +; The F2 hotkey will not work because it was not part of the selection +f2:: MsgBox, You hit F2 \ No newline at end of file From 7e34a0d1720841fc4f5b5a8fd7592f4fb2b8c55d Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:09:16 -0800 Subject: [PATCH 24/32] Improve Development documentation --- docs/Development.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Development.md b/docs/Development.md index 5d6cf9a3..00b4ec7b 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -3,6 +3,8 @@ This document covers the development process, from writing code to publishing a new version. 1. Write the code on the `dev` branch, or offshoots of that branch. Merge the changes to the `dev` branch as they become stable. + 1. Test all added commands + 1. Perform the formatting tests 1. Once the `dev` branch has all the features for a new release, create a new release branch named `v-..` (e.g. `v-2.5.10`). 1. Push the changes, open a PR, review the changes, and merge to `master`. 1. Confirm the package version has been updated From e94be24c1d840a884e7491f37ca9a85ff5d658ad Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:10:29 -0800 Subject: [PATCH 25/32] Update Development.md --- docs/Development.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/Development.md b/docs/Development.md index 00b4ec7b..3597456f 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -3,13 +3,13 @@ This document covers the development process, from writing code to publishing a new version. 1. Write the code on the `dev` branch, or offshoots of that branch. Merge the changes to the `dev` branch as they become stable. - 1. Test all added commands - 1. Perform the formatting tests + - Test all added commands + - Perform the formatting tests + - Confirm Markdown files appear as intended 1. Once the `dev` branch has all the features for a new release, create a new release branch named `v-..` (e.g. `v-2.5.10`). + - Confirm the package version has been updated + - Confirm the changelog has been updated 1. Push the changes, open a PR, review the changes, and merge to `master`. - 1. Confirm the package version has been updated - 1. Confirm the changelog has been updated - 1. Confirm Markdown files appear as intended 1. Pull the new master branch 1. Package the new release using `vsce package`. 1. Publish the release through [Visual Studio Marketplace](https://marketplace.visualstudio.com/manage/publishers/mark-wiemer) From 17218b557facd9843ffd39b5e22bbc610229d6e8 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:14:30 -0800 Subject: [PATCH 26/32] Fix and remove unused links in README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 06e15c41..022d7ee0 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,9 @@ AutoHotkey Plus Plus (AHK++) provides actively maintained, comprehensive AutoHot - [IntelliSense](#intellisense) - [Function Symbol](#function-symbol) - [Goto Definition](#goto-definition) - - [Find References](#find-references) + - [Find References](#find-symbol-references) - [Hover Tip](#hover-tip) - [Code Format](#code-format) -- [Context Menu](#context-menu) - [Credits](#credits) ## Why AutoHotkey Plus Plus? From 6a85f609591d319b6066fee1e06fbbfd068936fa Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:15:04 -0800 Subject: [PATCH 27/32] Add note to confirm links in README work --- docs/Development.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Development.md b/docs/Development.md index 3597456f..e5f62997 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -5,7 +5,8 @@ This document covers the development process, from writing code to publishing a 1. Write the code on the `dev` branch, or offshoots of that branch. Merge the changes to the `dev` branch as they become stable. - Test all added commands - Perform the formatting tests - - Confirm Markdown files appear as intended + - Confirm README appears as intended + - Confirm links in README work 1. Once the `dev` branch has all the features for a new release, create a new release branch named `v-..` (e.g. `v-2.5.10`). - Confirm the package version has been updated - Confirm the changelog has been updated From 5fa77dcb625f1dc32d2c860c6925dbdd5ebdd49b Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:18:04 -0800 Subject: [PATCH 28/32] Change `Open Help` to `Ctrl + F1` --- README.md | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 022d7ee0..b6056665 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,11 @@ Install from VS Code Marketplace: [Install AutoHotkey Plus Plus](https://marketp ## Commands -With AHK++, you can compile, debug, and run your scripts with keyboard shortcuts. You can also run a selection as a standalone script. Additionally, you can `Open Help` with `Shift + F1`. +With AHK++, you can compile, debug, and run your scripts with keyboard shortcuts. You can also run a selection as a standalone script. Additionally, you can `Open Help` with `Ctrl + F1`. - Compile: `Ctrl + Shift + F9` - Debug: `F9` -- Open Help: `Shift + F1` +- Open Help: `Ctrl + F1` - Run: `Ctrl + F9` - Run Selection: `Ctrl + F8` diff --git a/package.json b/package.json index 846e3c43..8c32e0a9 100644 --- a/package.json +++ b/package.json @@ -210,7 +210,7 @@ }, { "command": "ahk++.openHelp", - "key": "shift+f1", + "key": "ctrl+f1", "when": "editorLangId == ahk" }, { From 709d1246101d82fdfd3ef5faccf8166811b4b600 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:22:27 -0800 Subject: [PATCH 29/32] Update README.md --- README.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b6056665..90f405f6 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ AutoHotkey Plus Plus (AHK++) provides actively maintained, comprehensive AutoHot - [Language Features](#language-features) - [IntelliSense](#intellisense) - [Function Symbol](#function-symbol) - - [Goto Definition](#goto-definition) + - [Go To Definition](#go-to-definition) - [Find References](#find-symbol-references) - [Hover Tip](#hover-tip) - [Code Format](#code-format) @@ -24,13 +24,13 @@ AutoHotkey Plus Plus (AHK++) provides actively maintained, comprehensive AutoHot AutoHotkey Plus Plus is one of many extensions that offer VS Code language support. So why should you use this one? - **IntelliSense**: Smart code completion, syntax highlighting, code navigation, and more. -- **Actively Maintained**: Any issues encountered while using this extension can be reported and fixed. With other extensions, anything that's broken will stay broken forever. You can report any issues with AHK++ (and view all issues) through the [issue tracker](https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues) +- **Actively Maintained**: Any issues encountered while using this extension can be reported and fixed. With other extensions, anything that's broken will stay broken forever. You can report any issues with AHK++ (and view all issues) through the [issue tracker](https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues). - **Debug Support**: Run and debug AHK scripts from VS Code. - **New Features**: Another benefit to active maintenance is that AHK++ can add new features as users request them. ## Install -Install from VS Code Marketplace: [Install AutoHotkey Plus Plus](https://marketplace.visualstudio.com/items?itemName=mark-wiemer.vscode-autohotkey-plus-plus). +Install from VS Code or install from VS Code Marketplace: [Install AutoHotkey Plus Plus](https://marketplace.visualstudio.com/items?itemName=mark-wiemer.vscode-autohotkey-plus-plus). ## Commands @@ -46,14 +46,18 @@ With AHK++, you can compile, debug, and run your scripts with keyboard shortcuts 1. Click Run or press F9. 2. Debugger supports breakpoints, stack tracing, and variable watching - ![Debug](image/debug.gif) + + ![Debug](image/debug.gif) ### Debug Features 1. **Output Message**: You can use `OutputDebug` command instead of `MsgBox` to log values. - ![Output](image/output.jpg) + + ![Output](image/output.jpg) + 2. **Evaluate**: Set and get variable values through the debug console. - ![Evaluate](image/evalute.jpg) + + ![Evaluate](image/evalute.jpg) This extension provides basic debugging functions. If you need more debugging functions (such as conditional breakpoints), you can add an additional extension: [Install vscode-autohotkey-debug](https://marketplace.visualstudio.com/items?itemName=zero-plusplus.vscode-autohotkey-debug). @@ -65,12 +69,11 @@ Supports IntelliSense for variables and functions. ### Function Symbol -1. Detach source function as symbol -2. You can add a comment to the function using a semicolon on the line above the function declaration +1. You can add a comment to the function using a semicolon on the line above the function declaration -### Goto Definition +### Go to Definition -1. Support goto function and variable definition. +1. Supports navigation to symbol definition. 2. Usage: Ctrl-click on the symbol to navigate to its definition. ![Goto Definition](image/gotoDefinition.jpg) @@ -84,7 +87,8 @@ Select a symbol, then: ### Hover Tip -Usage: Move mouse to function call or command. +Usage: Hover over symbol to see IntelliSense documentation. + ![Hover](image/hover.png) ### Code Format From 184479ea177269d352011e44ce2b4c046a16f2b1 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:30:19 -0800 Subject: [PATCH 30/32] v2.6.0 --- CHANGELOG.md | 16 ++++++++++++++++ package.json | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31f94c75..2878fe75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # CHANGELOG +## 2.6.0 - 2021-01-18 + +### Features + +- Add `Open Help` command +- Add `Run Selection` command +- Add foldable region comments + +### Fixes + +- Improve formatting for using `ExitApp` to end subroutines +- Fix function coloring for functions whose names were also keywords ([#11](https://github.com/mark-wiemer/vscode-autohotkey-plus-plus/issues/11)) +- Fix function coloring for calls with a space before the parentheses (e.g. `foo ()`) +- Fix detection of labels indented with a tab +- Remove confusing deprecation warning from `StrSplit` function + ## 2.5.12 - 2020-11-08 - Improve settings readability diff --git a/package.json b/package.json index 8c32e0a9..6bf49646 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-autohotkey-plus-plus", "displayName": "AutoHotkey Plus Plus", "description": "AutoHotkey IntelliSense, debug, and language support for VS Code, forked from AutoHotkey Plus by cweijan", - "version": "2.5.12", + "version": "2.6.0", "publisher": "mark-wiemer", "engines": { "vscode": "^1.30.0" From 2b0e4c30ac86d2c4c0e9348635da7b73c26c6d3c Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:35:51 -0800 Subject: [PATCH 31/32] Remove unnecessary comment --- ahk.configuration.json | 1 - 1 file changed, 1 deletion(-) diff --git a/ahk.configuration.json b/ahk.configuration.json index 1a3ddf6f..32b4354e 100644 --- a/ahk.configuration.json +++ b/ahk.configuration.json @@ -28,7 +28,6 @@ ["'", "'"], ["%", "%"] ], - // Folding regions marked by ";region" and ";endregion" comments. "folding": { "markers": { "start": "^(\\/\\*)?\\s*\\;\\s*region\\b", From b92e13acb9dfeb16350edbbd20f2dffee3b7b5a4 Mon Sep 17 00:00:00 2001 From: Mark Wiemer Date: Mon, 18 Jan 2021 13:44:08 -0800 Subject: [PATCH 32/32] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2878fe75..442130aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - Fix function coloring for calls with a space before the parentheses (e.g. `foo ()`) - Fix detection of labels indented with a tab - Remove confusing deprecation warning from `StrSplit` function +- Remove variables from outline ## 2.5.12 - 2020-11-08