Версия: 0.5 beta Автор: ColR_iT Это не то, чтобы программа и даже не утилита - это скорее затачивание малоизвестных функций Notepad++ под нужды модмейкеров Сталкера. Малоизвестная функция - это окно отображения списка функций/методов того или иного языка программирования. Я не буду рассказывать с чего всё началось, а просто покажу, что получилось...
Список функций
Список функций. Отображение списка классов и его методов в виде разворачиваемого списка, а также отдельных функций (табличных в том числе). Итого, скрипт распознаёт функции/методы следующего вида:
Код
function funcName1(paramName) end local function funcName2(paramName) end local funcName3 = function (paramName) end function class_name:method_name (paramName) end tableName.funcName4 = function (paramName) end
В последнем случае, к имени функции вначале допишется имя таблицы (кроме случая, когда функция была объявлена внутри самого конструктора таблицы).
Комментарии. Учитывается и наличие комментариев в тексте, как одно-, так и много- строчных. В общем и целом, поведение такое же, как их бы воспринял сам Lua.
Список функций. В данном случае поведение списка функций приобрело несколько иной вид. Так, например, если это конфиг-файл логики, то в качестве имени "класса" будет выступать секция logic (полное её название), а "методов" - секции (схем) принадлежащие к данной секции logic. Если же это обычный конфиг-файл, то просто будут перечислены имена секций.
Комментарии. Способ комментирования остался прежним - символ точки с запятой, но имеет значение в каком месте он стоит: 1. Если комментарий стоит перед открывающейся квадратной скобкой секции logic, то в списке функций данной секции не будет, в том числе и причастных к ней, другими словами вырезается целиком вся логика; 2. Если комментарий стоит перед открывающейся квадратной скобкой любой другой секции/схемы, то из списка функции удаляется только эта секция; 3. Если комментарий стоит перед словом active в секции logic, то данная секция логики, ранее группировавшаяся как "класс" будет разбита на "функции" и каждая секция будет отображаться в конце списка функций отдельно.
Уточнения. 1. В силу реализации опции показа списка функций в Notepad++, для того, чтобы корректно отобразить последнюю секцию логики в файле (актуально для конфиг-файлов гулага), необходимо в конце файла на новой строке дописывать комбинацию деление и пробел: "/ ", либо пустую секцию logic без параметра active: [logic]. Такая строка не приведёт к сбоям игры или другим неприятным моментам. К сожалению от этого никак не избавиться. 2. Всё из-за той же реализации данной опции в самой программе, в секцию logic будут включены все принадлежащие ей схемы, которые находятся ниже неё, т.е. поиск необходимых схем не осуществляется по ссылка прописанным в параметрах, а выискиваются только те, что ниже по списку и до следующей секции логики.
Для .xml файлов это был эксперимент и по факту он не закончился (собственно именно поэтому это beta) и гарантировать правильную и быструю работу я не могу.
Список функций. Группировка в "классы" реализована только для диалогов. В качестве имени "класса" используется название диалога. Методами же выступают id фраз, после которых следуют символ ">" и id переходов на другие фразы из текущей, если таковые вообще имеются. Выглядит это не очень эстетично, но при наличии небольшой сноровки - это не столько критично. Если же это файл отличный от структуры диалога, то в списке функций будут отображаться id следующих тегов: game_task, article, character, info_portion и specific_character, которые находятся в соответствующих файлах.
Добавляет меню автозавершения имён функций/методов при начале ввода оных. Т.е. Вы начинаете набирать имя метода, после чего появляется меню в котором будут отображаться все методы начинающиеся на уже набранные символы, после нажатия Enter оставшаяся часть имени допишется автоматически. При начале ввода параметров данного метода, а точнее при написание открывающейся круглой скобки, появится подсказка с описанием данного метода, возвращаемого значения и его параметрах. Описаны только класс game_object и пространств имён game и level.
Опция требует некоторого обучения, которое достаточно подробно описано в ReadMe.txt лежащий в архиве. Настоятельно рекомендую прочитать имеющийся там пункт 3 (Использование -> Autocompletion). Способ включения описан так же в ReadMe.
Для скачивая доступна программа для автоматического генерированния файла lua.xml, предназначенный для автозавершения и подсказок при вводе имени функции или метода. Инструкция по использованию находится в самой программе и доступна по нажатию F1 в программе.
Проверка синтаксиса Lua
Полноценный плагин за авторством Charsi, за что ему преогромное спасибо! Думаю многие его ждали. Принцип работы прост: Вы пишите скрипт, нажимаете комбинацию клавиш Alt+S (или выбираете соответствующий пункт меню "Плагины -> ~~Lua Plagin~~ -> Проверка синтаксиса" и видите результат.
Список функций: Скопировать файл functionList.xml из архива в директорию: для Windows XP: C:\Documents and Settings\<your user name>\Application Data\Notepad++\ для Windows 7 / Windows 8: C:\Users\<your user name>\AppData\Roaming\Notepad++\ На запрос о замене ответить утвердительно.
Автозавершение: Скопировать файл lua.xml из архива в директорию: для Windows XP: C:\Program Files\Notepad++\plugins\APIs\ для Windows 7 / Windows 8: C:\Program Files (x86)\Notepad++\plugins\APIs\ На запрос о замене ответить утвердительно.
Проверка синтаксиса: Поместить .dll файл в папку: для Windows XP: C:\Program Files\Notepad++\plugins\ для Windows 7 / Windows 8: C:\Program Files (x86)\Notepad++\plugins\ (потребуется перезапуск программы Notepad++)
Яндекс.Диск P.S. Внутри имеется ридми с описание и небольшим F.A.Q., который я рекомендую к прочтению.
Предложения по улучшению функционального и визуального вида - приветствуются!
Категорически запрещены публикация данного материала в любом виде, а также размещение ссылок на скачивание данного "дополнения" к программе Notepad++ на сайтах amk-team.ru и amk-2.ru, а также их форумах без согласия автора. Эта тема - единственное и последнее место в котором был опубликован данный материал. Данное утверждение не относится к плагину проверки синтаксиса, автором которого я не являюсь.
Сообщение отредактировал BozKurt - Четверг, 11.01.2018, 01:12
Господа (и Дамы, если таковые имеются)! Есть вопрос для тех, кто умеют писать скрипты и тех, кому приглянулся плагин автозавершения имён методов. Имеется возможность генерировать список имён для всех функций и методов всех файлов скриптов, т.е. возможно (с большой вероятностью) появится поддержка пользовательских функций и методов. От чего появился вопрос: какие именно методы и функции нужно отображать в списке? Что я имею ввиду... Например, я считаю, что функции с областью видимости local, не нужны т.к. дальше файла-модуля, в котором эта функция описана, её видно не будет, да и как правило это разного рода вспомогательные узконаправленные функции и функторы. Также, считаю, лишним добавление в список движковых методов для класса object_binder, т.е. тех, что вызываются автоматически движком, например: __init, net_spawn, reinit, update и т.д. Как считаете Вы?
Также, считаю, лишним добавление в список движковых методов для класса object_binder, т.е. тех, что вызываются автоматически движком, например: __init, net_spawn, reinit, update и т.д.
Имеется ввиду, чтобы при написании кода появлялась возможность автозаполнения этими именами? А как она может помешать?
Пожелание: добавить также проверку синтаксиса, хотя бы луа-скриптов. Чтобы не приходилось использовать сторонние проги\сервисы.
Сообщение отредактировал Shadows - Вторник, 08.07.2014, 20:34
Помешать - никак. Но есть два "но": 1. Есть ограничение на наличие одноимённых методов/функций, в списке оно должно быть уникальным. 2. Эти методы не вызываются явно. Лично я не видел ни одного примера, где бы коллбек вызывался явно, поэтому, имхо, абсолютно не за чем.
Отличное пожелание, кто добавит - тоже скажу спасибо! Когда я писал, про "принимаются пожелания", то я имел ввиду пожелания по данному функционалу, а не Notepad++ в принципе. Без отдельного плагна на С++ этому не быть.
Эти методы не вызываются явно. Лично я не видел ни одного примера, где бы коллбек вызывался явно, поэтому, имхо, абсолютно не за чем.
Ну так вызывает движок Да и вроде где-то видел случай, когда одна из функций не вызывалась движком и в качестве костыля, это делалось вручную. Имхо, в любом случае не помешает.
Кстати, учтено ли наличие нескольких классов в одном модуле?
При начале ввода параметров данного метода, а точнее при написание открывающейся круглой скобки, появится подсказка с описанием данного метода, возвращаемого значения и его параметрах. Описаны только класс game_object и пространств имён game и level.
Вот тут бы я лучше упростил. Объясню почему.
1) Не все методы имеют однозначное действие, например вызов для одного типа объекта делает одно действие, для другого соответственно другое действие. Это надо учитывать. 2) Не все методы описаны в lua_help и соответственно в справочнике от malandrinus тоже (откуда он собственно и брал инфу). За полной информацией надо лезть именно внутрь движка. 3) Количество игровых методов составляет чуть более чем over9000. Банально надоест разбирать и описывать каждый. Да и правильнее тогда бы составлять отдельный справочник аля "Справочник функций и классов от malandrinus".
Исходя из всего этого, я бы посоветовал при набирании имени метода просто добавлять хинт с информацией о функции в виде: <возвращаемое значение> <имя функции>(<параметры>) Причем именно в луа-стиле. А вот разных void, u32 не надо)))
Кстати, учтено ли наличие нескольких классов в одном модуле?
Да хоть все классы в один модуль... Это не intellisense из VS. Принцип самой опции автодополнения реализована в движке самой программы, я же предлагаю эту опцию максимально заточить под сталкер. Автодополнение Notepad++ не различает объекты, он их и определять не умеет, это текстовый редактор, а не IDE. Список выпадает при наборе трёх (зависит от выставленных настроек) буквенно-цифровых символов. Имеются и ограничения: - В .xml файле имена функций не должны повторяться. Точнее могут, но учитывается последний; - В .xml файле имена должны быть упорядочены строго по алфавиту. Хотя это больше моя забота. - Описание должно быть исключительно латиницей. Не смог я заставить Notepad++ читать кириллицу.
ЦитатаShadows ()
например вызов для одного типа объекта делает одно действие, для другого соответственно другое действие
А можно пример такого метода?
ЦитатаShadows ()
Количество игровых методов составляет чуть более чем over9000
Именно по тому, что я не совсем псих, я описал только game_object и два пространства имён.
ЦитатаShadows ()
я бы посоветовал при набирании имени метода просто добавлять хинт с информацией о функции в виде: <возвращаемое значение> <имя функции>(<параметры>) Причем именно в луа-стиле. А вот разных void, u32 не надо)))
Почему именно в Lua-стиле? Из "заимствованных" я предлагаю только void - как обозначение того, что метод ничего не возвращает (избавит начинающего скриптёра от проблемы, когда попытается присвоить значение метода какой-лио переменной) и float/int - для определения того, какого именно вида число принимает/возвращает метод. В остальном указывается именно Lua типы и типы экспортированные из движка.
ЦитатаLaRento ()
Кстати да, шикарное пожелание, самому в голову не приходило, хотя постоянно пользуюсь различными утилитами.
Потому что скрипты сталкера на луа и программист вообще может не знать ничего кроме этого языка
Ну здесь два варианта: либо ты недооцениваешь программистов, либо ты переоцениваешь обычного пользователя. То, что float - это вещественный (с плавающей запятой), а int - целочисленный типы, знать должен каждый школьник, который ходил на уроки информатики, т.к. они в ознакомительных целях используют Pascal, но в любом случае типизированный язык (говорю, как преподаватель) => если не знает, то учиться плохо или же такому человеку плевать на программирование, а значит и скрипты писать он вряд ли будет. Про void - вообще молчу, дословный перевод на русский говорит сам за себя.
ЦитатаShadows ()
А если там беззнаковое uint?
Не нужно утрировать и цепляться за слова. Целью было и есть помочь определить какой тип числового значения должен использоваться: целый или дробный.
ЦитатаShadows ()
Все все методы?
Все все, что нашёл на StalkerInside в статье "Описание класса game_object". Статью оформлял K.D. вроде как...
ЦитатаShadows ()
Например character_rank() можно вызвать и для CBaseMonster, и для CInventoryOwner
Одно дело вызывать для разных типов, другое:
ЦитатаShadows ()
вызов для одного типа объекта делает одно действие, для другого соответственно другое действие
Добавлено (21.07.2014, 12:15) --------------------------------------------- Добавил в шапку программу AutocompletionScanning для генерирования файла lua.xml исходя из предоставленной папки со скирптами. Подробная инструкция есть в самой программе, если нажать F1 в запущенной программе. Если коротко, то: Вы указываете папку со скриптами, на основе файлов которой будет создан список имён функций и методов из этих файлов. Программу можно запустить и в автономном режиме, тогда она будет периодически сканировать указанную папку и пополнять список только что написанными функциями. Подробнее в справке (она не большая, но нужная:)). Жду отзывов и предложений.
Добавлено (23.07.2014, 11:21) --------------------------------------------- В шапку добавлен полноценный плагин проверки синтаксиса. Читаем, качаем, устанавливаем, пользуемся. Предложения приветствуются!
Сообщение отредактировал BozKurt - Среда, 23.07.2014, 11:22
HellRatz, у меня, к сожалению, нет актуальной, да и любой другой, версии плагина. Но я знаю где можно достать. В профиле Charsi на амк точно сможешь найти последнюю версию.
Прошу помощи. Если пишу не туда, подскажите куда надо или выйдите на связь и уделите минут 10 Я не владею никакими базовыми знаниями в написании кода (умею менять значения в конфигах через блокноты)
Опишу ситуацию, а вы скажите своё мнение 1. хочу увеличить цены на артефакты в 2 раза 2. открываю 2 конфига в notepad++ 3. жму ctrl+f и нахожу все строчки "cost" Есть возможность умножить их на *2 по быстрому, не перемножая их в голове и не меняя каждую строчку вручную?
Возможно у Вас есть совет, как облегчить/ускорить "замену значений"
PS Заранее ОГРОМНОЕ спасибо, всем, кто откликнется