1

Тема: 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.

Post's attachments

Generate PSPad (mod).zip 2.15 kb, 667 downloads since 2007-05-07 

You don't have the permssions to download the attachments of this post.
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).