Может кто-нибудь уже добавлял поддержку нового языка в SlickEdit? Я пытаюсь подружить SE с fasm'ом, но пока что ничего путного не выходит. Может у кого-нибудь уже есть готовый вариант (будет полезно, даже если там другой (желательно родственный) язык, главное чтобы я смог найти кусок кода на этом языке и прогнать скрипт под отладчиком)? Либо может у кого-нибудь есть полезная иноформация по этому вопросу. Я читал мануал по добавлению нового языка на сайте SE (там про добавление языка LOGO), но это не мануал, а скорее краткая записка для самого автора, чтобы не забыть. Содержание примерно следующее: возмите 4 тонны железа, молото, напильник и сделайте с помощью этого трактор, отстутствие документации замените импровизацией. Ещё читал "Prof. SlickEdit" wrox'a, там вообще глухо. Искал тут на сайте, нашёл только "SlickEditforMASM32.doc" - но там всё на уровние примитивов. В моём случае нужно написать новый лексер (не тот лексер, что с расширением .vlx(с ним у меня проблем нет), а скрипт, котрый будет добавлять имена процедур, переменные, метки и тд.) для фасма, а вот документации как надо писать лексеры как раз и нет.... Если у кого-нибудь появилось желание написать что нужно посмотреть исходники для асма в директории "макрос", то советую подавить это желание немедленно потому, что это бесполезно - там такое наворочено (в кучу свалена поддержка сразу для нескольких языков)!!! Да, для каждой функции есть краткая документация (памятка для разработчиков), но вот понять как всё делать в комплексе очень трудно. Поэтому хочу найти либо простенький пример (желательно родственного языка) либо внятную документацию. Я в директории "макрос" нашёл лексер для awk. Теперь я уже могу находить имена процедур . Только вот странно получается, строка КОНТЕКСТ не всегда верно отображается. До объявления ф-ии всё нормально, а вот после endp она всё равно показывает, что мы находимся в теле ф-ии. У меня есть подозрения, что за верное определение контекста отвечает другой калбэк. Нужно больше информации, как-то лень тратить время копаясь в недрах SE. А пока что мой лексер работает не совсем правильно если в файле больше двух процедур. На данном этапе главное, что он просто работает. Я тренировался на minipad.asm из экзамплов фасма. P.S.: Интересно, сколько людей пишущих на фасме используют SE??? Я каждый раз когда думаю о том, чтобы прикрутить фасм к SE вспоминаю слова светова: Настоящие ассемблерщики - народ неприхотливый, хорошая находка для рачительной хозяйки. (...) Поэтому Microsoft Developer Studio (читай SlickEdit прим. Z3N'a) для них - как стадион "Уэмбли" для единственной выжившей после зимовки коровы симментальской породы из колхоза "Привет коммунизму": гораздо больше, чем нужно. [C] Svet(R)off P.P.S.: Видимо, я не настоящий ассемблерщик - я считаю, что надо максимально облегчить себе жизнь при написании программ, ведь асм не даёт особо расслабиться. Да и качество и скорость написания кода возрастает при использовании примочек вроде автодополнения и подобной лабуды.
Хех! Вот так всегда! Во всех туторах функция поиска была реализована через задницу. Даже сами разработчики SE писали подобные функции через зад. Возможно, мы имеем дело с какой-нибудь сектой . Их поддержка ассемблера проста ужасна (по крайней мере та часть, которая отвечает за поиска процедур), иногда просто неправильно определяется конец процедуры, а иногда контекст продолжается после процедуры до конца файла. В общем - полный ахтунг! Сколько чудных эсперементов я провёл... пока не нашёл то, что нужно. Желающие могут убедиться, что первый и второй вариант отличаются значительно. За это время я даже успел написать разработчикам, но ничего путного они мне не предложили (боюсь, что их спугнула надпись "Unknown License" (я по их просьбе прислал им информацию, которую сгенерировал SE)). Ладно, будем дзенить дальше... . Ещё один вопрос - делать всё сразу или по маленьким частям??? На данный момент я делаю всю работу по частям - нашёл одну процедуру и отдал управление. Если юзер успел напечатать что-то новое то я бросаю всё и начинаю искать сначала. А можно делать всё за раз и отдавать управление когда всё уже сделано. Что лучше???. Пока что реализован только поиск процедур и в их имени не поддерживается "uses". Но я обязательно сделаю поддержку фасма... в будущем. Файл предоставлен просто для любопытства - он у вас не будет работать нормально просто потому что у вас не файла fasm.vlx =O.
Были исправлены ошибки в proc_search, изза которых процедуры вели себя забавно . Хотя до сих пор не поддерживается uses. Была добавлена поддержка локальных переменных (local VariableWORD), а также переменных из декларации процедуры (proc ZzZ VarWORD,varVithoutSize). Они показываются с зелёной стрелочкой, если вы в контексте процедуры и с красной если вы вне контекста или в другом контексте. К сожалению, они не показываются в окне Defs (насколько я понял - это политика SE), зато показываются в ниспадающем списке контекст, что немного неудобно. К сожалению, я опять забыл взять с собой fasm.vlx. Без него могут неправильно находиться процедуры и всё такое (просто будет вестись поиск в комментариях). Касательно локальных переменных - сейчас поддерживается только каноническое определение (local VariableWORD), не поддерживается local VarWORD,Var1WORD,Var2WORD и уж тем более не поддерживается конструкция locals / endl . Довести всё до ума помешало нестабильное поведение SE. Он не по детски глючит, если в него постоянно загружать макро, который активно меняется. После опр. периода он просто перестаёт запускаться и спасает только удаление vslick.sta (как-то так) из директории конфига в Документах. Этот вариант уже хоть создаёт видимость поддержки фасма. А я продолжу работу....
Приложил файл fasm.vlx - он должен быть помещён в директорию конфига в Документах. Временно приостановил работу - открыл для себя lua. Сейчас собираюсь продолжить работу над добавление фасма.
Доведённый до ума вариант.... Переваривает uses stdcall|ccall при декларации ф-ии. Поддерживаются всевозможные варианты локальных переменных: local MozgCWORD а также local ZizaWORD,ZweiWORD а также local Rafferty dd ? а также local Jason dd ?,CyberManiac dd 1337h а также монструозную locals Amber dd ? Merlin dd 1337h ; чистую строку алго трактует как конец локалс, сделано, чтобы не уехать неизвестно куда endl Пытаюсь разобраться как устроены другие ф-ии. Поэтому работу над распознаванием других конструкции приостановил. Надо написать ф-ию, которая распознавала остальные конструкции фасма и вызывать её потом локально или глобально. Знакомство в lua я закончил, поэтому теперь продолжу работу.
Накидал такой шаблон для поиска функций, макросов и структур. По хорошему, нужно добавить разбор параметров функции (uses и пр.), разбор полей структур. Ну и обработку locals. Вот чего я не понимаю, так это нахрена разработчикам редакторов нужно писать какие-то свои недоязыки программирования типа Slick-C и т.д., если всегда есть куча вариантов использования питонов и иже с ними
А зачем uses я его просто скипаю Я тоже уже добавил поиск структур и виртуал, но после просмотра вашего файла понял, что мне надо всё немного переписать.... Лучше уж пользоваться самопальным, чем никаким (RadAsm), если бы кетило добавил допустим, луа (размер просто мизерный), то я бы даже не посмотрел в сторону SE ~8)
Я про uses вот что имел в виду: там когда выводится информация о контексте, неплохо бы было, чтобы выводилась информация о uses, а не только прототип функции. Как-то нужно добавить данные к созданному контексту, но что-то я сходу не смог найти как... Ну что, ждём вашего релиза
У меня же есть пример добавление нужного текста. Можно добавить текст в формате html. tag_insert_local2(kw,'param',p_buf_name,p_RLine,word_seek,p_RLine,word_seek,p_RLine,word_seek+length(kw),'',0,VS_TAGSEPARATOR_equals:+'<b>':+args'</b> = Local variable from proc declaration.'); ^^^^^^^^^^^^^^^^^ Я использовал чтобы показывать где объявлена переменная. Также можно использовать <br> для форматирования и выводить нужную вам информацию. Про uses хорошая мысль, добавлю всё таки. Только она выводится при наведения курсора на имя ф-ии. Но можно сделать так, чтобы инфа отражалась и в окне defs. Есть много ключей я использовал VS_TAGSEPARATOR_equals, но там есть и другие....
Всё оказалось немного труднее чем я думал, дейстительно, текст добавляется через VS_TAGSEPARATOR_equal, но нормально отображается только в том случае, если он там один . Оказывается, что это не лучший способ, если символ отображается в окне дефс . Думаю, что подобное извращение, не сильно влияет на логику их программы подсветки, поэтому оставлю такую фичу у локальных переменных (если на них навести курсор, то вам покажут определение локальной переменной). Я думаю, что вот эта ф-ия это то, что нам нужно: int _[lang]_get_expression_info(boolean PossibleOperator, VS_TAG_IDEXP_INFO &idexp_info); Определение: This function is used to get information about the code at the current buffer location, including the current identifier under the cursor, the expression before the current identifier, and other supplementary information useful to Context Tagging. If the _[lang]_get_expression_info hook function is not implemented, the editor will use a default implementation which simply returns the current identifier under the cursor and no prefix expression. Взято из "Tutorial: Adding Language Support to SlickEdit" on SE site. Но я точно не уверен, я только одним глазком посмотрел. Там в asm.e столько строчек, что мне тутже захотелось занятся чем-нибудь другим.... Было бы хорошо, если бы при наведении курсора на макро показывалось его содержание, а то я не всегда помню для чего создавальсь макро. Я немного тормознул потому, что не совсем понятно как искать "вне контекста". Ставить курсор в нулевую позицию и тупа сканить от начала как-то не особо хочется. Ищю другие способы. Я знаю, что можно делать структуры так, чтобы они "раскрывались" в окне Defs. Лучше, наверно, довести до ума то, что есть, а уже потом браться за другое. А за что взяться там есть. Там одних калбэков штук восем. Ещё я не знаю как парсить остальные файлы, чтобы создавать таг-файлы. Это было бы следующим, что я хотел бы добавить. Кстати, мной было замечено, что если попользоваться ранней версией моего лексера, то потом он некорректно работает. Как он работает можно легко проверить - если у вас в Document->SelectMode->(fasm) - то вам не повезло, надо чтобы было FASM. Сранность в том, что там есть два режима fasm и FASM но переключиться невозможно!!! И нормально у меня стало только тогда, когда я удалил что-то из дериктории конфига (vslick.sta по-моему). Так что никаких революционных изменения я не делал, только добавил нахождение структур (корректно отображаются параметры, название которых берётся из определения структуры. То есть если: struc point one,two{ .x dd one .y dd two } ppoint point 13,37 то при наведении на ppoint будет выводиться ppoint <x,y> (замедте, что без точек!). Просто так на мой взгляд правильней. И это, кстати, единственно возможный вариант для struct. Так что структуры двух типов и виртуал. Я виртуал нахожу, но ставлю специальный флаг, чтобы он не показывался в окне defs. Просто не знаю что с ним делать.... Добавил пару строк для поддержки извращённого синтаксиса вроде: proc DllEntryPoint hinstDLL,\ fdwReason, \ lpvReserved Действует только для proc я ,конечно, мог бы понатыркать везде эти пару строк, чтобы поддерживать везде '\', но я думаю, что это никому не надо, а проц жрать будет . Я знаю, что сишники и иже с ними любят каждый параметр на новую строчку переносить, сам же не терплю этого (слишком длинный получается код, я уже не мальчишка чтобы елозить скролом вверх-вниз =О). Хорошо, наверно, когда есть монитор XXXL с поворотом.... Да, и ещё теперь макро нармально отображается, без { в аргументах. У меня вопрос: Стоит ли убирать WORD из аргуметов proc. В ассемблере аргументы редко бывают не дворд (вернее, я таких ещё не видел). Это будет легко, тем более, что нужный код я уже написал для других целей.
Добавил определение db du file и иже с ним. Правда, довольно сложно назвать это решение интеллектуальным - я просто ставлю курсор в начало файла и ищу нужное. Также исправил ошибку с макросом. Думаю, как научиться определять структуры. Экспериментирую, оказывается, что можно локальные переменные регистрировать через другую ф-ю и тогда они отображаются как члены процедуры (+\-). Пока такая возможность не добавлена, глючит.... Запостил на их форуме свой вопрос, ни ответа ни привета. Похоже, что форум вымер, оно и неудивительно.
Неудивительно потому, что отношение у них с пользователями не очень. Писал я им в суппорт, так мало того, что ответа нормального не получил, так ещё и послали меня... на форум, который бесполезен. И ещё мне "нравиться" их стратегия с лицензиями... фри версии у них нет.... Неужели им гораздо приятней знать, что где-то есть крэк на их программу, чем сделать людям приятное в виде лицензии??? P.S.: Имею богатый опыт общения с службами поддержки. Как ни странно, но все, с кем я до них общался были хорошие адекватные люди. Парни из бесплатного(!) FreeType мне здорово помогли.
ага, тока теперь обьясните как прикрутить все что вы выложили к SE. Кручу-верчу и чето ничего не понятно как добавить фасм и импортировать то, что вы выложили.
Последнее, что мне удалось сделать приаттачено.... Сейчас небольшой завал у меня, надо было срочно написать одну программу, да и сессия скоро, хоть что-то нужно почитать. Да и SE артачиться. Я доделал поиск структур (и по-моему, глобальных переменных), но SE глючит не по-детски. Иногда, курсор 100% стоит в контексте, а функция говорит, что нет.... И структуры отображаются криво . Немного о том, как устанавливать мой скрипт. Вообще-то, есть возможность создания авто-установочного пакета, но мне лень. Поэтому, просто копируете файл fasm.vlx в директорию SE в документах (\My SlickEdit Config\14.0.2\), затем открыть fasm.e и нажать F12 (либо загрузить любым другим способом). После этого можно открывать асм файлы и в меню документ выбрать моде FASM. Если нет подсветки, то ей нужно поставить в меню вью.