Тема: AutoHotkey: скрипт для создания подсветки синтаксиса для PSPad'а
Я пишу и читаю скрипты в PSPad'е. Помимо прочего, из-за подсветки синтаксиса. Но поставляемый с этим редактором файл подсветки AHK ИМХО никуда не годится. Немного лучше обстоит дело с файлом подсветки, идущим в комплекте с AutoHotkey. Но и этот файл кривоват, т.к. создаётся устаревшим скриптом (...\AutoHotkey\Extras\Editors\Syntax\Scripts\Generate PSPad.ahk). Существует скрипт toralf'а, создающий и файл подсветки, и шаблон автозавершения ключевых слов, команд, директив и функций. Скрипт любопытный и неслабый. Но меня не устраивают оба создаваемых этим скриптом файла (подсветка неполная, а шаблон - с ошибками). В общем, накатал я свой скрипт для создания подсветки. Скрипт простой, но полезный. И работает лучше обоих упомянутых (создаваемый файл подсветки более полный).
;*******************************************************************************
; AutoHotkey Version: 1.0.46.06+
; Автор: Androgen Belkin
; Имя скрипта: Generate PSPad (mod).ahk (v.1.0)
;*******************************************************************************
; Скрипт создаёт файл подсветки синтаксиса AutoHotkey для PSPad'а.
; Созданный скриптом файл (имя задаётся ниже)
; нужно поместить в папку подсветок PSPad'а (...\PSPad\Syntax\).
;
; Этот скрипт является улучшенной версией поставляемого с AutoHotkey скрипта:
; (...\AutoHotkey\Extras\Editors\Syntax\Scripts\Generate PSPad.ahk)
; По сравнению с исходным скриптом:
; - добавляются ключевые слова для подсветки функций AHK
; - не создаются дубликаты ключевых слов
; - не создаются всяческие мусорные строки
; - ключевые слова корректнее распределяются по секциям
; - скрипт можно хранить и запускать из любого места
; (исходный - только оттуда, где он лежит по умолчанию)
;*******************************************************************************
SetBatchLines, -1 ; максимальная скорость для скрипта
#NoEnv ; запрещаем имена переменных как у переменных окружения
SplitPath, A_AHKPath,, AHK_Dir ; получаем папку AutoHotkey
; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
NeededAHKFilesPath = %AHK_Dir%\Extras\Editors\Syntax ; путь к нужным файлам
TargetFile = %A_ScriptDir%\AutoHotkey.ini ; имя создаваемого файла
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========
; Проверяем наличие нужных файлов
NeededAHKFiles = ; список нужных файлов
(LTrim
%NeededAHKFilesPath%\Commands.txt
%NeededAHKFilesPath%\Functions.txt
%NeededAHKFilesPath%\Keys.txt
%NeededAHKFilesPath%\Keywords.txt
%NeededAHKFilesPath%\Variables.txt
)
Loop, Parse, NeededAHKFiles, `n
If ( NOT FileExist( A_LoopField ) )
MissingAHKFiles = %MissingAHKFiles%%A_LoopField%`n
If MissingAHKFiles
{
MsgBox, 48, Не найдены файлы, ; показываем сообщение
( LTrim
Не найдены следующие необходимые файлы:
%MissingAHKFiles%
Проверьте в настройках скрипта пути к этим файлам.
)
ExitApp ; конец скрипта
}
; AHK команды и директивы
; Из файла Commands.txt строки помещаются в секцию [KeyWords]
Loop, Read, %NeededAHKFilesPath%\Commands.txt
{
; если строка пуста или это комментарий, то...
If ( A_LoopReadLine = "" OR InStr( A_LoopReadLine, ";" ) = 1 )
Continue ; пропускаем строку
StringReplace, CurrCmd, A_LoopReadLine, `,, %A_Space%, All ; заменяем все запятые на пробелы
StringReplace, CurrCmd, CurrCmd, [, %A_Space%, All ; заменяем все [ на пробелы
StringSplit, CurrCmd, CurrCmd, %A_Space% ; разбиваем строку на части, разделённые пробелом
If ( InStr( CurrCmd1, "#" ) = 1 ) ; если это директива
StringTrimLeft, CurrCmd1, CurrCmd1, 1 ; удаляем символ "#"
AHKCommands = %AHKCommands%%CurrCmd1%=`n ; добавляем первое слово к общему списку
}
; AHK функции
; Из файла Functions.txt строки тоже помещаются в секцию [KeyWords]
Loop, Read, %NeededAHKFilesPath%\Functions.txt
{
; если строка пуста или это комментарий, то...
If ( A_LoopReadLine = "" OR InStr( A_LoopReadLine, ";" ) = 1 )
Continue ; пропускаем строку
StringSplit, CurrCmd, A_LoopReadLine, ( ; разбиваем строку на части, разделённые скобкой (
AHKFunctions = %AHKFunctions%%CurrCmd1%=`n ; добавляем первое слово к общему списку
}
AHKCommands = %AHKCommands%%AHKFunctions% ; соединяем списки команд и функций
Sort, AHKCommands, U ; сортируем список, удаляем дубликаты
; AHK ключевые слова
; Из файла Keywords.txt строки помещаются в секцию [ReservedWords]
Loop, Read, %NeededAHKFilesPath%\Keywords.txt
{
; если строка пуста или это комментарий или названия клавиш для Send, то...
; (названия клавиш для Send исключаются, так как эти клавиши перечислены в Keys.txt)
If ( A_LoopReadLine = "" OR InStr( A_LoopReadLine, ";" ) = 1 OR InStr( A_LoopReadLine,"{" ) = 1 )
Continue ; пропускаем строку
StringReplace, CurrCmd, A_LoopReadLine, `,, %A_Space%, All ; заменяем все запятые на пробелы
StringReplace, CurrCmd, CurrCmd, [, %A_Space%, All ; заменяем все [ на пробелы
StringSplit, CurrCmd, CurrCmd, %A_Space% ; разбиваем строку на части, разделённые пробелом
AHKKeywords = %AHKKeywords%%CurrCmd1%=`n ; добавляем первое слово к общему списку
}
Sort, AHKKeywords, U ; сортируем список, удаляем дубликаты
; AHK переменные
; Из файла Variables.txt строки помещаются в секцию [KeyWords2]
Loop, Read, %NeededAHKFilesPath%\Variables.txt
{
; если строка пуста или это комментарий, то...
If ( A_LoopReadLine = "" OR InStr( A_LoopReadLine, ";" ) = 1 )
Continue ; пропускаем строку
AHKVariables = %AHKVariables%%A_LoopReadLine%=`n ; добавляем строку к общему списку
}
Sort, AHKVariables, U ; сортируем список, удаляем дубликаты
; AHK клавиши
; Из файла Keys.txt строки помещаются в секцию [KeyWords3]
Loop, Read, %NeededAHKFilesPath%\Keys.txt
{
; если строка пуста или это комментарий, то...
If ( A_LoopReadLine = "" OR InStr( A_LoopReadLine, ";" ) = 1 )
Continue ; пропускаем строку
AHKKeys = %AHKKeys%%A_LoopReadLine%=`n ; добавляем строку к общему списку
}
Sort, AHKKeys, U ; сортируем список, удаляем дубликаты
; Бэкапим предыдущий файл
SplitPath, TargetFile,, Dir, Ext, Name
BackUp = %Dir%\%Name%_backup_%A_YYYY%-%A_MM%-%A_DD% (%A_Hour%-%A_Min%-%A_Sec%).%Ext%
FileMove, %TargetFile%, %BackUp%, 1
; Пишем результирующий файл
FileAppend,
(LTrim Com
`; Файл подсветки синтаксиса AutoHotkey v%A_AhkVersion% для PSPad'а
`; Создан скриптом "%A_ScriptName%" (by Androgen)
`; (%A_ScriptDir%\)
`; Дата создания: %A_DD%-%A_MMMM%-%A_YYYY%, %A_Hour%:%A_Min%:%A_Sec%
[Settings]
Name=AutoHotkey
HTMLGroup=0
FileType=*.ahk
CommentString=`;~
CComment=1
BasComment=1
IndentChar={
UnIndentChar=}
TabWidth=0
DoubleQuote=1
;~ Preprocessors=1
KeyWordChars=_
[KeyWords]
%AHKCommands%
[ReservedWords]
%AHKKeywords%
[KeyWords2]
%AHKVariables%
[KeyWords3]
%AHKKeys%
), %TargetFile%
Примечание: я бы выложил уже готовые файл подсветки и шаблон, но особого смысла в этом нет, т.к. синтаксис AutoHotkey постоянно пополняется/изменяется. В этом и заключается главное достоинство этого скрипта: файл подсветки генерируется на основании самых свежих ключевых строк AutoHotkey.