True Template — использование текстовых шаблонов при написании кода

Здесь можно обсудить ваш любимый плагин.
Kildor
Posts: 1515
Joined: Wed 16 Mar, 2005 06:26
Location: Новосибирск
Been thanked: 1 time
Contact:

Re: True Template

Post by Kildor »

Latest post of the previous page:

Извиняюсь, но нет.
В тру-темплейт *очень* подробный мануал. Читай, и обрящешь это знание.

Могу лишь подсказать, что важно не значение, а название атрибута. А в атрибуте To ключевыми являются одинарные скобки.
Ты мне не выкай!
«ФарФорум не для пользователей!»
Upd:
P.S. Я просто поддерживаю беседу.» © Народ.

xmpp:kildor@jabber.ru
amigo421
Posts: 11
Joined: Tue 25 Mar, 2008 16:16

Re: True Template

Post by amigo421 »

та инструкция которую вы привели выше, предполагалось что она должна срабатывать на ввод имени функции и пробел (в зависимости от настроек)?
у меня че то совсем не то что я предполагал выходит :)
Image

подскажите что за файл такой css? где его брать, это вроде что то для web'a? каким боком он для С?
User avatar
qfox
Posts: 21
Joined: Mon 29 Jun, 2009 18:46
Location: Москва
Contact:

Re: True Template

Post by qfox »

Мужики, а работа над плагином еще ведется?)
Я создаю шаблон с пользовательским вводом, но автоматизировать его создание достаточно проблематично.
1. Человек, вводящий в кучу @@INPUTов значения, не видит что там происходит сзади. Но это, возможно, пол беды, да и сложно интегрируемо. Но.
2. Человек, опять же, вводя все эти значения подряд, а не скопом, типа как на скриншоте пред. посте, несколько теряется, не может поправить, если что-то забыл. Конечно он может это сделать в коде чуть позже, но если эти значения используются много раз, то это напряг).
3. Хочу подставить по умолчанию имя класса, но использование @@FILE_NAME@@ внутри @@INPUT:...@@, как я понял, невозможно. Можете сделать какойнибудь обход? Язык для шаблонов не для детей, поэтому разницы, я думаю, нет как он будет выглядеть. Лиж бы работало)

Юзаю версию 2.10
Мне с Си после пхп достаточно сложно общаться, да и другим, вероятно, будет полезны фичи.

p.s.
4. Было бы очень неплохо, если часть текста не рисовалась, если пользователь ничего не ввел. Типа строки «protected int smiles = "@@STR:Smiles@@"». Если пользователь оставил Smiles пустым, то оно только хуже сделает. Может что-то вроде @@IF:Smiles==@@...@@STR:Smiles@@...@@/IF@@ или @@WRAPSTR:prefix:Smiles:suffix@@. Первая конструкция более сложна в реалзиации но ясна, вторая - выводит строку, если параметр не пустой, и более проста в реализации. Как думаете? Если покажете где лежат обработки директив @@ я могу подготовить почти компиляемый код на C++ для варианта 2, но компилить нечем ;-(.

p.p.s.

Code: Select all

45 строка true-tpl.h:
+    CMD_WrappedString,
548 (или еще какая) строка commands.cpp
+	case CMD_WrappedString:
+		{
+			// не понял как они там делятся. хотя, это ссылки, наверное). жаль что давно с с++ дела не имел
+			// пусть будет @@WRAPSTR:String name:PREFIX:SUFFIX@@
+			if (szParam1 && *szParam1)
+			{
+				szParam3 = GetParamParam (szParam2); // ???
+				psz = DoString (szParam1, 0, szString, sizeof (szString)); // !!!?
+				if ( psz && *psz ) { // psz != ""
+					psz... // psz = szParam2 + psz + szParam3;
+				} else
+					*psz = 0; // psz = "";
+			}
+
+			conv = false;
+		}
+		break;
примерно 799 строка commands.cpp
+									else if (!lstrcmpi (macro, "WRAPSTR"))
+										eCommand = CMD_WrappedString;
Пока копался в коде, понял, что для единого окна для всех пользовательских переменных нужны будут 2 прохода по файлу шаблона (сейчас 1, и показывает по мере нахождения), и в первом проходе собрать все переменные, после вывести окно, и уже после этого сделать тот проход, который есть сейчас, но с измененным INPUT/INPUTSTR - тупо вывод. С другой стороны, будут полюбому проблемы со STR и подстановкой. Логика, вероятно, не всегда будет ясна шаблонописцу. Гемор ;-(, а жаль.
bla-bla. bla.
User avatar
qfox
Posts: 21
Joined: Mon 29 Jun, 2009 18:46
Location: Москва
Contact:

Re: True Template

Post by qfox »

Лол. Может подскажете как при нажатии ентера внутри определенного контекста отрисовать кусок текста?

Code: Select all

/**
 * [курсор здесь, нажимаем ентер]
 */
Делаю:

Code: Select all

    <Define Name="PHPDoc" Value="\s*\*\s\p"/>
    <Expand At="&PHPDoc;" Key="Enter" To="\r * \p"/>
должно выйти:

Code: Select all

/**
 * 
 * [курсор]
 */
А фар падает с Exception в тру темплейте)

Есть лекарство?
p.s. Оно кроме FarMail нигде и не используется... хм.
p.p.s. А на ShiftEnter вешается нормально. похоже, баг.
bla-bla. bla.
User avatar
qfox
Posts: 21
Joined: Mon 29 Jun, 2009 18:46
Location: Москва
Contact:

Re: True Template

Post by qfox »

Еще баг нашел. При вставке файла сбросы строк работают только виндовые \r\n. Если сбросы в файле \n - они просто вырезаются и получается одна длинная строка.
bla-bla. bla.
User avatar
qfox
Posts: 21
Joined: Mon 29 Jun, 2009 18:46
Location: Москва
Contact:

Re: True Template

Post by qfox »

Ковыряю Indent. Странно, что Relative на Next не влияет, как-то странно. Получается, что будут фейлить все конструкции вида:

Code: Select all

    /**
     * phpdoc
     */
     oops.

product:
- sku         : Yaml
  description : Files
- sku         : BL4438H
  description : Super Hoop

  oops?
Хотя с yaml'ом, конечно, все сложнее. регулярки расчитаны на построчный поиск, а тут начало /[a-z]+:/ и конец, грубо говоря, \n\n.

Все равно не пойму какой логикой руководствовался программист. Если пользователь задает Indent или Bracket для того, чтобы, например, уровнять начало и конец, то почему следующая за блоком строка считается от текущей, а не от Relative = читай начала блока, от которого все пляшет.

Можно было, конечно, если бы пробелы имелись в строке, вставить пробел в конструкцию завершающей скобки, но их нет. Либо же не тупое кол-во табов, а какой-то префикс. Туда и можно было бы всунуть пробел.

Code: Select all

  <Indent Pattern="\s\*\/" Relative="\/\*\*" Line="0" Next="0"/> пробел в начале
  <Indent Pattern="\*\/" Relative="\/\*\*" Line="0" LinePrefix=" " Next="0"/>
Хороший плагин, но чуть-чуть не хватает... ;-(

На одну клавишу в разных контекстах не вяжется.

Code: Select all

  <Expand  At="&PHPDocFilled;"        Key="ShiftEnter"    To="\r* \p"/>
  <Expand  At="&PHPDocOpen;"          Key="ShiftEnter"    To="\r * \p"/>
Вот еще косяк с регуляркой в Pattern и подставлением результатов в To:

Code: Select all

  <Expand Imm="'" Pattern="'(\w+)'" To="=\$1=\p" /> тестируем это.
  'qwe' → =qwe'=
Последний символ, не входящий в скобки, залез во =внутрь'= знаков равно.
bla-bla. bla.
Kildor
Posts: 1515
Joined: Wed 16 Mar, 2005 06:26
Location: Новосибирск
Been thanked: 1 time
Contact:

Re: True Template

Post by Kildor »

Погляди на версию плагина из отсюда. Я вроде делал какие-то правки касательно подстановок.
Ты мне не выкай!
«ФарФорум не для пользователей!»
Upd:
P.S. Я просто поддерживаю беседу.» © Народ.

xmpp:kildor@jabber.ru
User avatar
qfox
Posts: 21
Joined: Mon 29 Jun, 2009 18:46
Location: Москва
Contact:

Re: True Template

Post by qfox »

Под Far3 никто не собирал? Думаю, терпеть truetemplate или более свежее что-то есть...

Хотя бы x64 версию под Far2 (есть прокси-плагин фар2-фар3)... Могу собрать и выложить, если скажите чем лучше и дадите исходники.
bla-bla. bla.
User avatar
qfox
Posts: 21
Joined: Mon 29 Jun, 2009 18:46
Location: Москва
Contact:

Re: True Template

Post by qfox »

Памятка любителям пособирать плагины.
иначе не собиралось в C::B+minGW
C::B - Code::Blocks - http://www.codeblocks.org/downloads
minGW - http://sourceforge.net/projects/mingw/f ... -get-inst/ (либо качается вместе с C::B, если оставят эту возможность)

И тут есть список разных IDE и компиляторов: http://www.freebyte.com/programming/cpp/ и http://en.wikipedia.org/wiki/List_of_co ... _compilers

p.s. Че-то у меня сходу так и не собралось нормально, minGW ставил отдельно. dll получается на 5 кб меньше (130,5 Кб) и даже фар2 отказывается её жрать...
p.p.s. Оказалось, что кривой компилятор или билдер minGW. Когда установил версию, которая шла с minGW, все собралось ок под х32, но под x64 он собрать не смог, не хватило знаний о доп. инструкциях. Попробовать собрать вижал студией руки не дошли ;-(
bla-bla. bla.
User avatar
4ekucT
Posts: 507
Joined: Tue 05 Apr, 2005 23:44
Location: Беларусь, Минск

Re: True Template

Post by 4ekucT »

Я наконец перешел на новый Far 3 x64 и теперь пытаюсь смигрировать True Template на новые рельсы. Поскольку я не в теме новых изменений буду спрашивать насчет проблем миграции с которыми я сталкиваюсь.
Вопрос номер один - как нынче зачитываются и сохраняются конфигурации плагинов? Есть скажем такой код, во что он превратится в новом API:

Code: Select all

void WINAPI _export SetStartupInfoW(const struct PluginStartupInfo *Info)
{
	::Info = *Info;
	IsOldFar = true;
	if (Info->StructSize >= sizeof(PluginStartupInfo))
	{
		::Info=*Info;
		FSF=*Info->FSF;
		::Info.FSF=&FSF;
		IsOldFar = false;
		GetRegKey (HKEY_CURRENT_USER, "", "AutoCompile", autocompile, 1);
		GetRegKey (HKEY_CURRENT_USER, "", "AutoFormat", autoformat, 1);
		GetRegKey (HKEY_CURRENT_USER, "", "Disable", pluginStop, 0);
		GetRegKey (HKEY_CURRENT_USER, "", "UseScrollLock", scrollStop, 1);
		GetRegKey (HKEY_CURRENT_USER, "", "IgnorePosition", ignoreposn, 1);
		GetRegKey (HKEY_CURRENT_USER, "", "OutputMenu", outputmenu, 1);
		GetRegKey (HKEY_CURRENT_USER, "", "OutputFilter", filterring, 1);
		GetRegKey (HKEY_CURRENT_USER, "", "Key", defExpandFKey, KEY_SPACE);
		InitMacro ();
	}
}
Вопрос номер два: как послать клавишу с заданным кодом как было в этом примере (KEY_SPACE, KEY_LEFT | KEY_CTRL)?

Code: Select all

static inline void EditorProcessFARKey (int key)
{
	Info.EditorControl (ECTL_PROCESSKEY, (void *) key);
}
Вопрос номер три: что делать с ACTL_POSTKEYSEQUENCE?

Code: Select all

static inline void EditorProcessGlobalFARKey (int key)
{
	DWORD				newkey = key;
	KeySequence ks;
	ks.Flags = KSFLAGS_DISABLEOUTPUT;
	ks.Count = 1;
	ks.Sequence = &newkey;
	Info.AdvControl (Info.ModuleNumber, ACTL_POSTKEYSEQUENCE, (void *) &ks);
}
Спасибо за ответы!
User avatar
Alexey Samlyukov
Posts: 1765
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 7 times
Contact:

Re: True Template

Post by Alexey Samlyukov »

проще глянуть в сорцы редакторного стандартного плага :)
тот же editcase и drawline вполне подойдет
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: True Template

Post by Shmuel »

4ekucT wrote:Вопрос номер один - как нынче зачитываются и сохраняются конфигурации плагинов?
[...]
Вопрос номер два: как послать клавишу с заданным кодом
[...]
Вопрос номер три: что делать с ACTL_POSTKEYSEQUENCE?
1. См. в энциклопедии SettingsControl. Примеры использования должны найтись в стандартных плагинах.
2. Даже не знаю. Может быть ECTL_INSERTTEXT ?
3. MCTL_SENDSTRING(MSSC_POST) - с учётом вызова ф-ции Keys, то-есть поле SequenceText может быть типа:
L"Keys('CtrlA Esc F7')".
User avatar
Alexey Samlyukov
Posts: 1765
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 7 times
Contact:

Re: True Template

Post by Alexey Samlyukov »

>Может быть ECTL_INSERTTEXT?
ECTL_PROCESSINPUT
User avatar
4ekucT
Posts: 507
Joined: Tue 05 Apr, 2005 23:44
Location: Беларусь, Минск

Re: True Template

Post by 4ekucT »

Спасибо! Буду пробовать.
User avatar
4ekucT
Posts: 507
Joined: Tue 05 Apr, 2005 23:44
Location: Беларусь, Минск

Re: True Template

Post by 4ekucT »

Вот еще столкнулся с проблемой - при попытке эмулировать нажатие клавиши Enter через ECTL_PROCESSINPUT вставялется текущее имя файла, как будто я нажимаю ShiftEnter...

Code: Select all

void EditorProcessReturnKey ()
{
	INPUT_RECORD	tr;
	tr.EventType = KEY_EVENT;
	tr.Event.KeyEvent.bKeyDown = true;
	tr.Event.KeyEvent.wRepeatCount = 1;
	tr.Event.KeyEvent.wVirtualKeyCode = VK_RETURN;
	tr.Event.KeyEvent.wVirtualScanCode = 0;
	tr.Event.KeyEvent.uChar.UnicodeChar = 0;
	tr.Event.KeyEvent.dwControlKeyState = 0;
	Info.EditorControl (-1, ECTL_PROCESSINPUT, 0, &tr);
}
В чем интересно подвох может быть?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: True Template

Post by Shmuel »

4ekucT wrote:В чем интересно подвох может быть?
У меня аналогичный код на Lua работает:
Post Reply

Return to “Обсуждение плагинов”