Console Control

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

Console Control

Post by Max Rusov »

Console Control for FAR 3

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

Re: Console Control

Post by Max Rusov »

Latest post of the previous page:

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

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

Code: Select all

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

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 115 times
User avatar
John Doe
Бюрократ
Posts: 12871
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

Re: Console Control

Post by John Doe »

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

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

Re: Console Control

Post by fml2 »

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

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: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: Console Control

Post by Max Rusov »

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

Re: Console Control

Post by John Doe »

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

Code: Select all

my_print=print
print=error
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 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: 12871
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 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: 12871
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

Re: Console Control

Post by John Doe »

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

Re: Console Control

Post by Max Rusov »

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

Re: Console Control

Post by John Doe »

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

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

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 (или вы намеренно пропустили?)

А вот вся "документация:"
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: Console Control

Post by Max Rusov »

John Doe wrote:Для интереса "свернул" ваш модуль
Что то оно у меня не заработало
...Far3\Config\Macros\scripts\ConsoleControl-Macros.lua:68: attempt to call field 'Maximize' (a nil value)
stack traceback:
...Far3\Config\Macros\scripts\ConsoleControl-Macros.lua:68: in function <...Far3\Config\Macros\scripts\ConsoleControl-Macros.lua:67>
Да и по любому - это brainfuck у не интерфейс :). А документацией он станет только при наличии комментариев, конечно.
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 12 times

Re: Console Control

Post by Max Rusov »

John Doe wrote:А вот вся "документация:"

Code: Select all

ID = "94624B7B-FFDB-435F-B955-F99DBBC3BFE0"
Installed ()
Call ()
Menu ()
WindowSize (X, Y)
WindowSizeDelta (DX, DY)
BufferSize (X, Y)
BufferSizeDelta (DX, DY)
FontSize (Size)
FontSizeDelta (D)
FontName (Name, Size)
Maximize (On)
Topmost (On)
Transparency (Value)
Вот этого, кстати не понял. Что это?
Post Reply

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