Частичная замена ввода в диалоге определённого плагина Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
tyrex
Posts: 45
Joined: Fri 17 Jul, 2009 08:14
Has thanked: 2 times

Частичная замена ввода в диалоге определённого плагина

Post by tyrex »

Здравствуйте!

Подскажите, можно ли написать макрос на lua, который бы в калькуляторе (плагин Calc) всегда подменял введенную запятую(,) на точку(.) ?
Работать такая замена должна только в калькуляторе.

Есть ли в lua возможность подменить обработчик событий для определенного плагина?
Last edited by HaRT on Fri 06 Mar, 2026 14:16, edited 2 times in total.
Reason: Тема перенесена, заголовок уточнён.
Shmuel
Posts: 7230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 632 times

Замена

Post by Shmuel »

Code: Select all

local F = far.Flags
local CalcId = win.Uuid("E45555AE-6499-443C-AA04-12A1AADAB989")

local function ProcessEvent (Event, DlgEvent)
  if Event==F.DE_DLGPROCINIT and DlgEvent.Msg==F.DN_CONTROLINPUT and DlgEvent.Param1==3 then
    local Info = far.SendDlgMessage(DlgEvent.hDlg, F.DM_GETDIALOGINFO)
    if Info and Info.Id == CalcId then
      local Rec = DlgEvent.Param2
      if Rec.EventType==F.KEY_EVENT and Rec.KeyDown then
        if far.InputRecordToName(Rec) == "," then
          mf.postmacro(Keys, ".")
          return true
        end
      end
    end
  end
end

Event {
  description="Calc plugin: replace commas with dots";
  group="DialogEvent";
  action=ProcessEvent;
}
tyrex
Posts: 45
Joined: Fri 17 Jul, 2009 08:14
Has thanked: 2 times

Замена

Post by tyrex »

Прекрасно работает, спасибо!
А можно расширить скрипт, чтобы подмена запятой на точку также работала при вставке в калькулятор текста из буфера обмена?
Shmuel
Posts: 7230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 632 times

Замена

Post by Shmuel »

Code: Select all

local F = far.Flags
local CalcId = win.Uuid("E45555AE-6499-443C-AA04-12A1AADAB989")

local function ProcessEvent (Event, DlgEvent)
  if Event==F.DE_DLGPROCINIT and DlgEvent.Msg==F.DN_EDITCHANGE and DlgEvent.Param1==3 then
    local Info = far.SendDlgMessage(DlgEvent.hDlg, F.DM_GETDIALOGINFO)
    if Info and Info.Id == CalcId then
      local Item = DlgEvent.Param2
      Item[10] = Item[10]:gsub(",", ".")
      mf.postmacro(far.SetDlgItem, DlgEvent.hDlg, 3, Item)
    end
  end
end

Event {
  description="Calc plugin: replace commas with dots";
  group="DialogEvent";
  action=ProcessEvent;
}
Last edited by Shmuel on Fri 06 Mar, 2026 11:11, edited 1 time in total.
tyrex
Posts: 45
Joined: Fri 17 Jul, 2009 08:14
Has thanked: 2 times

Замена

Post by tyrex »

Второй вариант работает, но после вставки из буфера плагин Calc видимо не получает событие завершения вставки и поэтому выражение не считает
Shmuel
Posts: 7230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 632 times

Частичная замена ввода в диалоге определённого плагина

Post by Shmuel »

Code: Select all

local F = far.Flags
local CalcId = win.Uuid("E45555AE-6499-443C-AA04-12A1AADAB989")

local function ProcessEvent (Event, DlgEvent)
  if Event==F.DE_DLGPROCINIT and DlgEvent.Msg==F.DN_EDITCHANGE and DlgEvent.Param1==3 then
    local Info = far.SendDlgMessage(DlgEvent.hDlg, F.DM_GETDIALOGINFO)
    if Info and Info.Id == CalcId then
      local txt = DlgEvent.Param2[10]:gsub(",", ".")
      if txt ~= DlgEvent.Param2[10] then
        mf.postmacro(far.SendDlgMessage, DlgEvent.hDlg, F.DM_SETTEXT, 3, txt)
      end
    end
  end
end

Event {
  description="Calc plugin: replace commas with dots";
  group="DialogEvent";
  action=ProcessEvent;
}
Yegor
Posts: 1503
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 52 times
Been thanked: 94 times

Частичная замена ввода в диалоге определённого плагина

Post by Yegor »

А как же тогда вводить что-тот типа: if(10==10,1,2) ?

Шутка :)
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
Post Reply

Return to “Нужна помощь”