1 (изменено: Vadus, 2023-03-19 14:27:37)

Тема: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Приветствую всех.
Решаю такую задачу: перемещение курсора в коде AHK-скрипта в окне в Notepad++ на нужную метку, Hotkey, подпрограмму, class и т. д.
Переход можно сделать по горячей клавише и из контекстного меню.

Пример: Перейти на на метку:

https://i.postimg.cc/RhZ33SWK/1.jpg

Например, так сделано в Visual Studio:

https://i.postimg.cc/C1MzRhtY/2.jpg

Решение хотелось бы иметь в виде AHK-скрипта, ну или плагина для Notepad++.

Начал решать задачу, но понял, что она чрезвычайно объемна. Получается, что в идеале нужно анализировать структуру скрипта, как это делает интерпретатор AHK: разбирать, где подпрограммы, метки и т. д.
Может быть есть готовое решение/заготовка для решения этой задачи?

Посмотрел, что, например, в SciTE4AutoHotkey нет такой функции.
Какие есть варианты?

2

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Что-то я не уверен, что такое реализовано хоть в одном текстовом редакторе. Дело в том, что AutoHotkey умеет так:

Goto %VarContainingLabelName%

В такой ситуации заранее неизвестно, куда "пошлёт" GoTo.

3

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Не совсем понимаю чем простой поиск не устраивает? Метки найти проще простого: 'название_метки:'.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

В VS Code есть плагин, но так себе.

Ищите регексом, запоминайте позиции, выводите в окошке по категориям.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

ypppu пишет:

Что-то я не уверен, что такое реализовано хоть в одном текстовом редакторе. Дело в том, что AutoHotkey умеет так:

Goto %VarContainingLabelName%

В такой ситуации заранее неизвестно, куда "пошлёт" GoTo.

Согласен, в этом случае невозможно перейти на метку в коде.

6 (изменено: Vadus, 2023-03-20 13:21:37)

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

__Михаил__ пишет:

Не совсем понимаю чем простой поиск не устраивает? Метки найти проще простого: 'название_метки:

Я привел переход на метку в качестве самого простого примера. Но и в этом случае не все так очевидно. Например, если строка 'название_метки:' будет где-то в комментариях, то поиск может найти ее, а не "настоящую" метку.

7 (изменено: Vadus, 2023-03-20 13:21:23)

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

serzh82saratov пишет:

В VS Code есть плагин, но так себе.

Спасибо, взгляну. Но только как на образец, ведь вопрос не только в том, чтобы самому пользоваться, а в том, что это задачка "на поломать голову" .

8

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Согласен, я себе когда то сделал простенький, тоже для Notepad++, и вам желаю.
https://i.imgur.com/3BLFuOQ.png

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

В VS Code вроде по категориям нельзя разбить, но могу ошибаться.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: Vadus, 2023-03-20 13:21:07)

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

serzh82saratov пишет:

Ищите регексом, запоминайте позиции, выводите в окошке по категориям.

Собственно, так и делаю.

Решил задачу с переходом на метку, на большинство стандартных хоткеев, типа:

F5::
	MsgBox Test 1
Return

Теперь по нажатию Win+> на строке вида Test.ahk>>HotKey>>F5::>>[[MsgBox Test 1]] (где где Test.ahk — имя файла скрипта)
открывается файл в Notepad++ и происходит переход на подпрограмму обработки горячей клавиши F5::, а затем в ней на текст "MsgBox Test 1".

Сама строка для поиска  Test.ahk>>F5::>>[[MsgBox Test 1]] генерируется и кладется в буфер по Win+Alt+K, когда выделен текст "MsgBox Test 1". Далее ее можно вставить как в Notepad++, так и, например, в код Visual Studio (частенько запускаю AHK-скрипты из Visual Studio). Там ее уже средствами VSPackage-расширения использую для открытия и перехода в Notepad++.

Почти решил с переходом на хоткеи внутри #IfWinActive:

#IfWinActive ahk_class OpusApp
	
	F5::
		MsgBox Test 2
	Return
#IfWinActive

Это делается по нажатию Win+> на строке вида.
Test.ahk>>#IfWinActive ahk_class OpusApp>>[[MsgBox Test 2]]

Проблема возникла с определением подпрограмм. Пока не получилось "чисто" находить именно саму подпрограмму, а не вызов ее в коде или упоминание в комментариях.
Застрял и уже долго не могу продвинуться, всё время какие-то косяки вылезают.

Думал, что может уже кто-то решал эту задачку...

11

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

serzh82saratov пишет:

Согласен, я себе когда то сделал простенький, тоже для Notepad++, и вам желаю.

На чем писали?

12

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Vadus пишет:

Теперь по нажатию Win+> на строке вида Test.ahk>>HotKey>>F5::>>[[MsgBox Test 1]] (где где Test.ahk — имя файла скрипта)

С этого момента перестал понимать что вам нужно.

Vadus пишет:

Пока не получилось "чисто" находить именно саму подпрограмму, а не вызов ее в коде или упоминание в комментариях.

В начале строки должны быть печатные символы, в начале не должно быть знака комента, в конце двоеточие, учесть что после может быть только пусто или пробелы, или знак комента и что угодно. Не особо сложная задача. Единственное что геморойно учесть что что то находится в многострочном коменте, это я не реализовал.

Vadus пишет:

На чем писали?

На AutoHotkey, зачем что то изобретать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

str =
( 
; label1:
	label2:  ; label3:		 
		Return
) 

p := RegExMatch(str, "m`a)(*UCP)^\s*(\w+):[ \t]*(`;|$)", m)   
MsgBox % m1 "`n" p
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

serzh82saratov пишет:

С этого момента перестал понимать что вам нужно.

Задача не только в том, чтобы переходить внутри одного файла по меткам/подпрограммам, но и в том, чтобы можно было перейти по ссылке на нужную метку/подпрограмму из другого редактора, например, из Visual Studio. В начальном посте я специально упростил задачу, чтобы не запутать.

15

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

serzh82saratov пишет:

В начале строки должны быть печатные символы, в начале не должно быть знака комента, в конце двоеточие, учесть что после может быть только пусто или пробелы, или знак комента и что угодно. Не особо сложная задача. Единственное что геморойно учесть что что то находится в многострочном коменте, это я не реализовал.

Речь идет видимо о хоткеях такого вида?


F5:: ;комментарий
	MsgBox Test 1
Return

А как насчет таких подпрограмм, как их искать?:

MyProc(Argument) ;комментарий
{
	MsgBox Test 3
}

16

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Vadus пишет:

перейти по ссылке на нужную метку/подпрограмму из другого редактора

Я вам привёл код который найдёт первую метку в тексте и узнает её имя.
У вас вопрос в чём? Как в Visual Studio из выделенный текст получить в переменую, или как получить текст из файла, или как в NPP перейти к нужной строке...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

serzh82saratov пишет:

p := RegExMatch(str, "m`a)(*UCP)^\s*(\w+):[ \t]*(`;|$)", m)

Отлично, спасибо, попробую.

18

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Vadus пишет:

А как насчет таких подпрограмм, как их искать?:

Это функция, про метку/подпрограмму которую вы спрашивали, я вам привёл пример, для этого другой RegEx нужен.

Vadus пишет:

Речь идет видимо о хоткеях такого вида?

Нет, именно о Label.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

serzh82saratov пишет:

Нет, именно о Label.

ОК, с Label более-менее понятно.

Гораздо сложнее с подпрограммами.
На скриншоте Вашей программы виден раздел Func:
https://i.postimg.cc/Z5FgPBFk/3.jpg

То есть Вы реализовали поиск подпрограмм, которые я имею в виду, или Func — это что-то другое?

20

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму


str =
( 
fun1()

fun2(dssdf)  {

} 
) 
 
p := RegExMatch(str, "S`a)(*UCP)\R\s*(\w+)\(.*?\)\s+\{.*?\R", m)   
MsgBox % m1 "`n" p 

Вроде так как то, но точно не скажу, там потом ещё проверка, лень разбирать.
Но это всё такое себе, До родного парсера очень далеко.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Vadus пишет:

поиск подпрограмм

ФУНКЦИЙ!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Спасибо, так работает:

serzh82saratov пишет:

str =
(
fun1()

fun2(dssdf)  {

}
)

p := RegExMatch(str, "S`a)(*UCP)\R\s*(\w+)\(.*?\)\s+\{.*?\R", m)   
MsgBox % m1 "`n" p

Но вот так уже нет:

str =
( 

fun1()

fun2(dssdf)  ;комментарий
{

} 
) 
 
p := RegExMatch(str, "S`a)(*UCP)\R\s*(\w+)\(.*?\)\s+\{.*?\R", m)   
MsgBox % m1 "`n" p 

23

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

if !p := RegExMatch(str, "S`a)(*UCP)\R\s*(\w+)\(.*?\)\s+\{.*?\R", m)   
	p := RegExMatch(str, "S`a)(*UCP)\R\s*(\w+)\(.*?\)\s+;.*?\R+\s*\{", m) 
MsgBox % m1 "`n" p 

Так как нибудь.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24 (изменено: Vadus, 2023-03-20 13:19:48)

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

serzh82saratov

Спасибо, буду пилить дальше .

25

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

Vadus, ознакомьтесь, пожалуйста, с Правилами, отредактируйте свои посты. Обратите внимание на точки в конце предложений.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: AHK: Перемещение курсора в коде на нужную метку, Hotkey, подпрограмму

teadrinker пишет:

Vadus, ознакомьтесь, пожалуйста, с Правилами, отредактируйте свои посты. Обратите внимание на точки в конце предложений.

Старался, но всё-таки пропустил . Вроде исправился...