Console Control

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

Console Control

Post by Max Rusov »

Console Control for FAR 3

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

Re: Console Control

Post by Max Rusov »

Latest post of the previous page:

Да ну, нафиг. Там куча команд для Plugin.Call. Всякие экзотические алгоритмы можно реализовать с помощью макросов.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

Max Rusov wrote:Да ну, нафиг. Там куча команд для Plugin.Call. Всякие экзотические алгоритмы можно реализовать с помощью макросов.
Команд хоть и куча, но все для установки.
Плагин пока не предоставляет возможности получения размеров/координат.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Console Control

Post by Max Rusov »

Предоставляет, читайте внимательнее:
"WindowSize", {Width}, {Height}

Изменение размеров консольного окна.
Если параметр опущен или = 0, соответствующая координата не изменяется
Возвращает новые значения размера окна: Width, Height
т.е.

Code: Select all

local CX, CY = Plugin.Call(ConCtrlID, "WindowSize")
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

Перевёл дистрибутивные макросы из .fmlua в .lua, плюс применил Plugin.require.
При желании можно сделать ConCtrl глобальной: _G.ConCtrl = Plugin.require("94624B7B-FFDB-435F-B955-F99DBBC3BFE0")


Update
В текст вложения случайно закрался print, он лишний, удалите.
Attachments
ConsoleControl.lua.7z
(1.74 KiB) Downloaded 141 times
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

Есть одна неприятная особенность.
Если задать для WindowSize размер больше возможного, то окно остаётся прежним, зато буфер увеличивается, и появляются скроллбары.

1. Было бы удобнее не трогать размер буфера, если изменение окна невозможно.
2. Как опция, можно пытаться установить максимально возможный размер окна.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

Re: Console Control

Post by fml2 »

Может, стоит переименовать пункт меню "Font size" в "Font" или "Console Font", а то трудно догадаться, что там можно не только размер, но и сам шрифт поменять.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

Новая версия ConsoleControl комплектуется lua-модулем и -макросами.
Есть пара пожеланий.

модуль ConsoleControl.lua
  • В текущей реализации таблица модуля попадает в глобальное пространство имён.
    На самом деле такой необходимости нет, можно сделать как-то так:

    Code: Select all

    local cc = {}
    
    function cc.FontSize(Size)
      ...
    end
    
    return cc
    
    В этом случае в макросах будет local ConsoleControl = require"ConsoleControl"
    (А если хочется глобально, то _G.ConsoleControl = require"ConsoleControl")

    Есть и другие способы.
    Например функции в модуле можно определять и не используя локальную таблицу:
макросы ConsoleControl-Macros.lua
  • В каждом макросе присутствует условие

    Code: Select all

      condition=function() 
        return ConsoleControl.Installed() 
      end;
    
    А можно проще: condition = ConsoleControl.Installed
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Console Control

Post by Max Rusov »

John Doe wrote:В текущей реализации таблица модуля попадает в глобальное пространство имён.
Ну и замечательно. Вызовы доступны в любом контексте + работает дополнение.
John Doe wrote:А можно проще: condition = ConsoleControl.Installed
Работает, хотя я не понял почему. LUA - язык загадка.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

Max Rusov wrote:Ну и замечательно. Вызовы доступны в любом контексте + работает дополнение.
Насколько я знаю это плохая практика, по ряду причин.
И я не понял что означает "в любом контексте", и о каком автодополнении речь.
Max Rusov wrote:Работает, хотя я не понял почему.
Если по-простому, то имя функции на самом деле переменная.
Например, эти определения равнозначны:
Вот ещё пример:

Code: Select all

my_print=print
print=error
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Console Control

Post by Max Rusov »

John Doe wrote:Насколько я знаю это плохая практика, по ряду причин.
И я не понял что означает "в любом контексте", и о каком автодополнении речь.
В "любом контексте" значит, например, macro:post или или Eval....

macro:post ConsoleControl.Menu()

Автодополнение делается, например, макросом LuaMacroComplit, из сборки SimSu

По поводу "плохая практика" - мне кажется это сильным преувеличением. У каждого свой FAR и в него не ставят те плагины, которые не нужны. Следовательно, говорить о "засорении" - бессмысленно.
John Doe wrote:Если по-простому, то имя функции на самом деле переменная
Понял, спасибо.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

Max Rusov wrote:В "любом контексте" значит, например, macro:post или или Eval...
Это не совсем так.
Чтобы скрипт модуля исполнился - необходимо выполнить require.
В вашей сборке макросов ConsoleControl-Macros.lua есть вызов require, и эта часть исполняется в момент загрузки макросов, поэтому всё работает.

Но зачем глобальную переменную устанавливать в модуле? С таким же успехом её можно установить в том же самом ConsoleControl-Macros.lua, использовав возвращаемое значение require.

Это как минимум гибче.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Console Control

Post by Max Rusov »

John Doe wrote:Прежде чем модуль станет доступным надо исполнить require. В вашей сборке макросов ConsoleControl-Macros.fmlua есть вызов require, и эта часть исполняется при старте, поэтому всё работает.
Да, это так. Согласен, что это неудобство. Поэтому я и предлагал, кстати, регистрировать интерфейсный модуль из плагина, чтобы его не надо было копировать в %FARPROFILE%\Macros\Modules и подключать через require. Хорошо хоть то, что подключить достаточно один раз в любом макросе, и после этого становится доступным везде...
John Doe wrote:Но зачем глобальную переменную устанавливать в модуле? С таким же успехом её можно установить в том же самом макросе, использовав возвращаемое значение require. Это как минимум гибче.
Я не хочу писать лишнего кода. Хочу, чтобы мои функции были доступны в любой момент, в любом LUA выражении. Почему вы не возражаете, что LuaMacro в api.lua добавляет кучу глобальных таблиц?
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

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

Re: Console Control

Post by Max Rusov »

Ну а macro:post? А если я хочу вычислить выражение в LUA калькуляторе? Вы упорно не желаете понять, что я как раз _хочу_ чтобы эта таблица попала в глобальный контекст. С моей точки зрения - это большое преимущество.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

Для вас это преимущество, супер, не возражаю.
macro:post будет работать, потому что таблица тоже попадёт в глобальный контекст.

Но зачем устанавливать какую-то переменную где-то в модуле? Если можно сделать это явно, в собственном макросе.
Я подчёркиваю, для пользователя этот модуль чужой, он вообще не знает (не помнит) что там этом модуль внутри делает.
И вообще, пользователь предпочитает другую переменную, покороче.
ConCtrl
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Console Control

Post by John Doe »

Для интереса "свернул" ваш модуль.

Code: Select all

local cc = {}

cc.ID = "94624B7B-FFDB-435F-B955-F99DBBC3BFE0"
                     
for c in ("Exist Call Command Config Menu"):gmatch("%w+") do
  cc[c] = function(...)
    return Plugin[c](cc.ID,...)
  end
end

cc.Installed = cc.Exist

for c in ("WindowSize BufferSize FontSize FontSizeDelta FontName Maximize Topmost Transparency"):gmatch("%w+") do
  cc[c] = function(...)
    return Plugin.Call(cc.ID,c,...)
  end
end

cc.WindowSizeDelta = function(DX, DY)
  local X, Y = cc.WindowSize()
  return cc.WindowSize(X+DX, Y+DY)
end

cc.BufferSizeDelta = function(DX, DY)
  local X, Y = cc.BufferSize()
  return cc.BufferSize(X+DX, Y+DY)
end

ConsoleControl = cc
Вместо ConsoleControl = cc лучше return cc, как я предлагал ранее.
Добавил ещё Config и Command (или вы намеренно пропустили?)

А вот вся "документация:"
Post Reply

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