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

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

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

Post by John Doe » Tue 29 Mar, 2011 18:05

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

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: 12110
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 29 times
Been thanked: 155 times

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

Post by John Doe » Tue 29 Mar, 2011 18:05

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

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

Имхо, правильнее было бы просто научить фар по eval("й",2) вызывать макрос назначеный на "q".
Какие будут мнения?

User avatar
John Doe
Бюрократ
Posts: 12110
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 29 times
Been thanked: 155 times

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

Post by John Doe » Tue 29 Mar, 2011 18:07

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

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

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

Поэтому предлагаю сделать чтобы $AKey вызывал действие соответствующее комбинации текущего макроса (а не того, из которого вызван текущий).
Какие будут возражения?

User avatar
HaRT
Moderator
Posts: 8553
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 76 times
Been thanked: 138 times

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

Post by HaRT » Tue 29 Mar, 2011 18:27

John Doe wrote:Имхо, правильнее было бы просто научить фар по eval("й",2) вызывать макрос назначеный на "q".
Какие будут мнения?
В принципе вполне закономерная постановка вопроса, только вот валить совсем уж в одну кучу вряд ли стоит. А вот если выделить под это новое значение второго параметра (Mode), то было бы удобно.
John Doe wrote:Поэтому предлагаю сделать чтобы $AKey вызывал действие соответствующее комбинации текущего макроса (а не того, из которого вызван текущий).
Какие будут возражения?
$AKey по самой своей задумке означает то, что нажал пользователь. А для решения означенной проблемы было бы лучше добавить новый режим (Mode) функции akey().
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 12110
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 29 times
Been thanked: 155 times

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

Post by John Doe » Tue 29 Mar, 2011 18:47

HaRT wrote:В принципе вполне закономерная постановка вопроса, только вот валить совсем уж в одну кучу вряд ли стоит. А вот если выделить под это новое значение второго параметра (Mode), то было бы удобно.
Вопрос в том надо ли этот новый Mode (и так уже чёрт ногу в них сломит). По-моему предлагаемое изменение никому не помешает и так.
Если нет, то хотелось бы увидеть пример задачи, для которой это нежелательно.

User avatar
John Doe
Бюрократ
Posts: 12110
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 29 times
Been thanked: 155 times

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

Post by John Doe » Tue 29 Mar, 2011 18:48

HaRT wrote:$AKey по самой своей задумке означает то, что нажал пользователь.
A eval(...,2) по своей задумке имитирует вызов макроса пользователем, так что тут всё сходится.
HaRT wrote:А для решения означенной проблемы было бы лучше добавить новый режим (Mode) функции akey().
Т.е. предлагается абсолютно во всех макросах поменять привычное и короткое $AKey на гипотетическое eval(akey(x))? Давайте вначале подумаем, может ли предлагаемое изменение $AKey кому-то гипотетически помешать, или нет?
(Хотелось бы конкретный пример)

User avatar
HaRT
Moderator
Posts: 8553
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 76 times
Been thanked: 138 times

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

Post by HaRT » Tue 29 Mar, 2011 19:12

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

А насчёт параметра у akey() я всё-таки ошибся — имелся в виду параметр Type. Кстати, не покрывает ли он уже то, что хочется (а то документация что-то недостаточно ясная)?
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 12110
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 29 times
Been thanked: 155 times

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

Post by John Doe » Tue 29 Mar, 2011 19:22

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: 8553
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 76 times
Been thanked: 138 times

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

Post by HaRT » Tue 29 Mar, 2011 19:30

Мне надоело спорить, т.к. тема не то чтобы очень для меня важная. Меня не переубедили, но я отстраняюсь.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 12110
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 29 times
Been thanked: 155 times

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

Post by John Doe » Tue 29 Mar, 2011 19:37

У нас не спор, а дискуссия. Вопрос тут сугубо практический.
И я не утверждаю, что безусловно прав.
Моя практика показывает, что лучше так.
Возможно чья-то практика покажет иначе, и я пересмотрю свои предложения.

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

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

Post by Max Rusov » Tue 29 Mar, 2011 19:45

Сомнительна сама идея "прозрачных макросов". Пока работает такой макрос - не сработают никакие другие макросы, и многое другое (например, автодополнение в диалогах). Вас это не смущает?

User avatar
John Doe
Бюрократ
Posts: 12110
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 29 times
Been thanked: 155 times

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

Post by John Doe » Wed 30 Mar, 2011 11:22

Max Rusov wrote:Сомнительна сама идея "прозрачных макросов".
Идея сомнительна? Отчего же, по-моему идея прекрасна (жаль что не моя :-)
А без прозрачных макросов кое-что невозможно никак реализовать (кроме как плагином).
И многое реализуется намного проще, чем обычными.
Легко реализуются макросы-фильтры, модифицирующие пользовательский ввод на лету.
Например, см. тему Переходы и пометки сразу на обеих панелях: то что там реализовано сотней макросов можно сделать одним единственным "прозрачным" макросом.
Max Rusov wrote:Пока работает такой макрос - не сработают никакие другие макросы
Вот о том и речь, что они прекрасно работают, посредством exec(...,2). Единственный затык только в $AKey.
Неработающее автодополнение это мелочь.
Какие ещё недостатки?

User avatar
John Doe
Бюрократ
Posts: 12110
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 29 times
Been thanked: 155 times

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

Post by John Doe » Wed 30 Mar, 2011 11:44

SUSim wrote:по поводу eval("й",2) я считаю запускать макрос надо ТОЛЬКО по конкретному имени, и имя это не должно быть клавишей, но быть однозначным!
"й" это не имя макроса, а название комбинации клавиш. Основное назначение и исключительная польза eval(...,2) в возможности запускать реальные макросы, назначеные на реальные клавиши.

User avatar
HaRT
Moderator
Posts: 8553
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 76 times
Been thanked: 138 times

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

Post by HaRT » Wed 30 Mar, 2011 11:57

Запускать макросы по именам безотносительно того, назначены ли они на какие-либо клавиши, — тоже очень полезная возможность. Поэтому-то и предлагается делать это двумя разными режимами. Конкретные их номера лично мне не существенны.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

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

Post by Max Rusov » Wed 30 Mar, 2011 12:01

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

User avatar
HaRT
Moderator
Posts: 8553
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 76 times
Been thanked: 138 times

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

Post by HaRT » Wed 30 Mar, 2011 12:24

Max Rusov wrote:создается впечатление что FAR работает как обычно
Строго говоря, во время работы макроса в левом верхнем уголке окна есть индикация “P” на каком-то зелёненьком фоне. Или теперь уже нет?
Фар есть инструмент, а не нянька. © 2009 DrKnS

Locked

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