Прозрачные макросы

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Прозрачные макросы

Post by John Doe »

Иногда требуется чтобы макрос завершался не сразу, а после какого-либо события.
А до тех пор он должен быть "прозрачен", т.е. свободно пропускать в фар все нажатия клавиш.
Простейший пример:

Code: Select all

%Key=waitkey();
$while(%Key!="Esc")
	eval(%Key)
	%Key=waitkey();
$end
Примеры реальных макросов на форуме: 1, 2, 3, 4.

Но есть одно "но": так невозможно вызвать "вложенный" макрос.

С появлением eval(...,2) возможно и это:

Code: Select all

%Key=waitkey();
$while(%Key!="Esc")
	$If(eval(%Key,2)==-2)
		eval(%Key)
	$End
	%Key=waitkey();
$end
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Прозрачные макросы

Post by John Doe »

Но есть несколько проблем.
Первая:
Допустим есть макрос на "q".
Допустим, текущая раскладка - русская.
Нажимаем "q" - получаем "й". Проблема в том, что eval("й",2) не сработает, т.е. не вызовет макрос назначеный на "q".

Проблема невелика, такие макросы редко встретишь в природе, можно просто их не учитывать.
Если же учитывать, то придётся городить огород, определять текущую раскладку, применять xlat().

Имхо, правильнее было бы просто научить фар по eval("й",2) вызывать макрос назначеный на "q".
Какие будут мнения?
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Прозрачные макросы

Post by John Doe »

Вторая проблема:

В макросах у меня часто встречается $AKey.
Использую его я для того, чтобы было сразу видно, что "вот тут мы выполняем изначальное действие клавиши".
Соответственно, при необходимости макрос можно свободно переназначить на другую комбинацию клавиш, не трогая его текст.

Допустим, на комбинацию xxx назначен макроc, в котором используется $AKey. (При вызове $AKey срабатывает xxx, тут всё понятно).
Допустим, есть другой макрос, назначеный на yyy, из которого через eval(xxx,2) вызывается первый макрос.
Внимание, проблема: при этом $AKey выполнит вовсе не xxx, а yyy, и это испортит нам всю задачу.

Поэтому предлагаю сделать чтобы $AKey вызывал действие соответствующее комбинации текущего макроса (а не того, из которого вызван текущий).
Какие будут возражения?
User avatar
HaRT
Moderator
Posts: 10866
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: Прозрачные макросы

Post by HaRT »

John Doe wrote:Имхо, правильнее было бы просто научить фар по eval("й",2) вызывать макрос назначеный на "q".
Какие будут мнения?
В принципе вполне закономерная постановка вопроса, только вот валить совсем уж в одну кучу вряд ли стоит. А вот если выделить под это новое значение второго параметра (Mode), то было бы удобно.
John Doe wrote:Поэтому предлагаю сделать чтобы $AKey вызывал действие соответствующее комбинации текущего макроса (а не того, из которого вызван текущий).
Какие будут возражения?
$AKey по самой своей задумке означает то, что нажал пользователь. А для решения означенной проблемы было бы лучше добавить новый режим (Mode) функции akey().
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Прозрачные макросы

Post by John Doe »

HaRT wrote:В принципе вполне закономерная постановка вопроса, только вот валить совсем уж в одну кучу вряд ли стоит. А вот если выделить под это новое значение второго параметра (Mode), то было бы удобно.
Вопрос в том надо ли этот новый Mode (и так уже чёрт ногу в них сломит). По-моему предлагаемое изменение никому не помешает и так.
Если нет, то хотелось бы увидеть пример задачи, для которой это нежелательно.
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Прозрачные макросы

Post by John Doe »

HaRT wrote:$AKey по самой своей задумке означает то, что нажал пользователь.
A eval(...,2) по своей задумке имитирует вызов макроса пользователем, так что тут всё сходится.
HaRT wrote:А для решения означенной проблемы было бы лучше добавить новый режим (Mode) функции akey().
Т.е. предлагается абсолютно во всех макросах поменять привычное и короткое $AKey на гипотетическое eval(akey(x))? Давайте вначале подумаем, может ли предлагаемое изменение $AKey кому-то гипотетически помешать, или нет?
(Хотелось бы конкретный пример)
User avatar
HaRT
Moderator
Posts: 10866
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: Прозрачные макросы

Post by HaRT »

John Doe wrote: A eval(...,2) по своей задумке имитирует вызов макроса пользователем, так что тут всё сходится.
Так ведь хочется иметь возможность вызвать и макрос, назначенный на ‘й’, и макрос, назначенный на ‘q’, притом независимо от текущего языка ввода. Поэтому я и предлагаю добавить новый режим, а не переосмыслить существующий.
John Doe wrote:абсолютно во всех макросах поменять привычное и короткое $AKey на гипотетическое eval(akey(x))?
Во-первых, сколько у Вас таких макросов, в которых важно не то, что нажато пользователем изначально, а то, на что это макрос непосредственно назначен?
Во-вторых, выстраивать макросы в такие цепочки — весьма сомнительная практика с точки зрения программирования. Я в таких случаях делаю одну функцию, которую вызываю из двух в остальном независимых друг от друга макросов.

А насчёт параметра у akey() я всё-таки ошибся — имелся в виду параметр Type. Кстати, не покрывает ли он уже то, что хочется (а то документация что-то недостаточно ясная)?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Прозрачные макросы

Post by John Doe »

HaRT wrote:
John Doe wrote: A eval(...,2) по своей задумке имитирует вызов макроса пользователем, так что тут всё сходится.
Так ведь хочется иметь возможность вызвать и макрос, назначенный на ‘й’, и макрос, назначенный на ‘q’, притом независимо от текущего языка ввода. Поэтому я и предлагаю добавить новый режим, а не переосмыслить существующий.
Разве у нас могут существовать такие макросы вместе?
Вероятно существовать могут, но вызываться с клавиатуры точно нет (раньше могли, да).
HaRT wrote:Во-первых, сколько у Вас таких макросов, в которых важно не то, что нажато пользователем изначально, а то, на что это макрос непосредственно назначен?
Все без исключения в которых используется $AKey у меня именно такие.
HaRT wrote:Во-вторых, выстраивать макросы в такие цепочки — весьма сомнительная практика с точки зрения программирования.
Потому я и привёл живые конкретный пример, где требуется именно так, а не иначе. Вроде как ничего сомнительно не вижу.
HaRT wrote:А насчёт параметра у akey() я всё-таки ошибся — имелся в виду параметр Type. Кстати, не покрывает ли он уже то, что хочется (а то документация что-то недостаточно ясная)?
Не покрывает, т.е. не позволяет различить регистр и раскладку.
Если быть точным, то до недавнего момента покрывал, но тут пришёл SUSim...
В любом случае, решение с akey() неудовлетворительно, пока все пользуются $AKey.
User avatar
HaRT
Moderator
Posts: 10866
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: Прозрачные макросы

Post by HaRT »

Мне надоело спорить, т.к. тема не то чтобы очень для меня важная. Меня не переубедили, но я отстраняюсь.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Прозрачные макросы

Post by John Doe »

У нас не спор, а дискуссия. Вопрос тут сугубо практический.
И я не утверждаю, что безусловно прав.
Моя практика показывает, что лучше так.
Возможно чья-то практика покажет иначе, и я пересмотрю свои предложения.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Прозрачные макросы

Post by Max Rusov »

Сомнительна сама идея "прозрачных макросов". Пока работает такой макрос - не сработают никакие другие макросы, и многое другое (например, автодополнение в диалогах). Вас это не смущает?
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Прозрачные макросы

Post by John Doe »

Max Rusov wrote:Сомнительна сама идея "прозрачных макросов".
Идея сомнительна? Отчего же, по-моему идея прекрасна (жаль что не моя :-)
А без прозрачных макросов кое-что невозможно никак реализовать (кроме как плагином).
И многое реализуется намного проще, чем обычными.
Легко реализуются макросы-фильтры, модифицирующие пользовательский ввод на лету.
Например, см. тему Переходы и пометки сразу на обеих панелях: то что там реализовано сотней макросов можно сделать одним единственным "прозрачным" макросом.
Max Rusov wrote:Пока работает такой макрос - не сработают никакие другие макросы
Вот о том и речь, что они прекрасно работают, посредством exec(...,2). Единственный затык только в $AKey.
Неработающее автодополнение это мелочь.
Какие ещё недостатки?
User avatar
John Doe
Бюрократ
Posts: 13862
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Прозрачные макросы

Post by John Doe »

SUSim wrote:по поводу eval("й",2) я считаю запускать макрос надо ТОЛЬКО по конкретному имени, и имя это не должно быть клавишей, но быть однозначным!
"й" это не имя макроса, а название комбинации клавиш. Основное назначение и исключительная польза eval(...,2) в возможности запускать реальные макросы, назначеные на реальные клавиши.
User avatar
HaRT
Moderator
Posts: 10866
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: Прозрачные макросы

Post by HaRT »

Запускать макросы по именам безотносительно того, назначены ли они на какие-либо клавиши, — тоже очень полезная возможность. Поэтому-то и предлагается делать это двумя разными режимами. Конкретные их номера лично мне не существенны.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Прозрачные макросы

Post by Max Rusov »

John Doe wrote:
Max Rusov wrote:Пока работает такой макрос - не сработают никакие другие макросы
Вот о том и речь, что они прекрасно работают, посредством exec(...,2)
Я имею ввиду: не будут запускаться макросы, повешенные на кнопки. Т.е. во время работы "прозрачного" макроса создается впечатление что FAR работает как обычно, хотя, на самом деле, он находится в особом, весьма непредсказуемом режиме. В общем я бы никогда подобной фичей пользоваться не стал...
Locked

Return to “Обсуждение макросов”