Console Control

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

Re: Console Control

Post by Max Rusov » Mon 25 Feb, 2013 13:51

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: 12531
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 235 times

Re: Console Control

Post by John Doe » Wed 27 Feb, 2013 00:38

Перевёл дистрибутивные макросы из .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: 12531
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 235 times

Re: Console Control

Post by John Doe » Wed 27 Feb, 2013 00:51

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

1. Было бы удобнее не трогать размер буфера, если изменение окна невозможно.
2. Как опция, можно пытаться установить максимально возможный размер окна.

fml2
Posts: 518
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 7 times

Re: Console Control

Post by fml2 » Wed 13 Mar, 2013 15:12

Может, стоит переименовать пункт меню "Font size" в "Font" или "Console Font", а то трудно догадаться, что там можно не только размер, но и сам шрифт поменять.

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

Re: Console Control

Post by John Doe » Sun 17 Mar, 2013 15:51

Новая версия 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: 10 times

Re: Console Control

Post by Max Rusov » Sun 17 Mar, 2013 16:07

John Doe wrote:В текущей реализации таблица модуля попадает в глобальное пространство имён.
Ну и замечательно. Вызовы доступны в любом контексте + работает дополнение.
John Doe wrote:А можно проще: condition = ConsoleControl.Installed
Работает, хотя я не понял почему. LUA - язык загадка.

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

Re: Console Control

Post by John Doe » Sun 17 Mar, 2013 16:24

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: 10 times

Re: Console Control

Post by Max Rusov » Sun 17 Mar, 2013 16:47

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

macro:post ConsoleControl.Menu()

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

По поводу "плохая практика" - мне кажется это сильным преувеличением. У каждого свой FAR и в него не ставят те плагины, которые не нужны. Следовательно, говорить о "засорении" - бессмысленно.
John Doe wrote:Если по-простому, то имя функции на самом деле переменная
Понял, спасибо.

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

Re: Console Control

Post by John Doe » Sun 17 Mar, 2013 16:56

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: 10 times

Re: Console Control

Post by Max Rusov » Sun 17 Mar, 2013 17:08

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: 12531
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 235 times

Re: Console Control

Post by John Doe » Sun 17 Mar, 2013 17:11

Я не хочу писать лишнего кода.
Где я это предлагаю?
Весь код останется прежним, просто глобальная переменная переедет из вашего модуля в ваш макрос.ConsoleControl-Macros.lua

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

Re: Console Control

Post by Max Rusov » Sun 17 Mar, 2013 17:17

Ну а macro:post? А если я хочу вычислить выражение в LUA калькуляторе? Вы упорно не желаете понять, что я как раз _хочу_ чтобы эта таблица попала в глобальный контекст. С моей точки зрения - это большое преимущество.

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

Re: Console Control

Post by John Doe » Sun 17 Mar, 2013 17:23

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

Но зачем устанавливать какую-то переменную где-то в модуле? Если можно сделать это явно, в собственном макросе.
Я подчёркиваю, для пользователя этот модуль чужой, он вообще не знает (не помнит) что там этом модуль внутри делает.
И вообще, пользователь предпочитает другую переменную, покороче.
ConCtrl

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

Re: Console Control

Post by John Doe » Sun 17 Mar, 2013 17:33

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

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: 10 times

Re: Console Control

Post by Max Rusov » Sun 17 Mar, 2013 17:45

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: 10 times

Re: Console Control

Post by Max Rusov » Sun 17 Mar, 2013 17:48

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)
Вот этого, кстати не понял. Что это?

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

Re: Console Control

Post by John Doe » Sun 17 Mar, 2013 20:56

Max Rusov wrote:Что то оно у меня не заработало
Ну я же не думал что вы его на самом деле попробуете запустить!
Я лично не пробовал :-)
(набросал на скорую руку)

В любом случае, предлагаю вам более интересную версию, на этот раз проверил )

Code: Select all

local cc = {}
cc.ID = "94624B7B-FFDB-435F-B955-F99DBBC3BFE0"
local interface=[[
  Width, Height = WindowSize ([Width], [Height]) -- размеры окна 
  Width, Height = BufferSize ([Width], [Height]) -- размеры буфера
  Size,  Name   = FontSize ([Size])              -- размер шрифта
  Size,  Name   = FontSizeDelta ([DeltaSize])    -- +/- размер шрифта
  Size,  Name   = FontName ([Name], [Size])      -- параметры шрифта
  {0|1}         = Maximize ([On])                -- максимизация/восстановление 
                                                    размеров окна (-1 - переключить)
  {0|1}         = Topmost ([On])                 -- Always On Top (-1 - переключить)
  {0-255}       = Transparency ([Value])         -- прозрачность
]]
--Width, Height = WindowSizeDelta (DX, DY)       -- +/- размеры окна
--Width, Height = BufferSizeDelta (DX, DY)       -- +/- размеры буфера

for c in interface:gmatch("(%w+)%s*%(.-\n") do
  cc[c] = function(...)  return Plugin.Call(cc.ID,c,...)  end
end

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

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
[attachment=0]ConsoleControl.lua.7z[/attachment]Этот вариант мне нравится тем, что модуль как бы "автогенерируется" из собственной "документации" (interface).

P.S.
Если эту тему немного развить, то возможно сделать и универсальную функцию, на манер Plugin.require
А LuaMacroComplit можно будет снабдить подсказкой!
Attachments
ConsoleControl.lua.7z
(1.93 KiB) Downloaded 106 times

Post Reply

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