Панель результатов поиска и CtrlIns, CtrlAltIns Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
DV
Posts: 387
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 14 times
Been thanked: 14 times

Панель результатов поиска и CtrlIns, CtrlAltIns

Post by DV »

Хочется, чтобы в панели результатов поиска, подобно файловым панелям, срабатывали следующие сочетания клавиш:
CtrlIns - скопировать в буфер обмена имя текущего элемента (файла или папки);
CtrlAltIns - скопировать в буфер обмена полный путь к текущему элементу.

Первоначальная попытка написать такой макрос выглядит приблизительно так:

Code: Select all

Macro {
  description = "Find File Results: Copy Item Text to Clipboard";
  area = "Dialog";
  key = "CtrlIns";
  condition = function() return Dlg.Id == far.Guids.FindFileResultId end;
  action = function() far.CopyToClipboard(Dlg.GetValue(Dlg.CurPos)) end;
}
И вот тут оказывается, что добраться до имён файлов не так-то просто. Код, приведенный выше, копирует в буфер обмена текст кнопки, имеющей фокус ввода...

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

Панель результатов поиска и CtrlIns, CtrlAltIns

Post by HaRT »

Фар есть инструмент, а не нянька. © 2009 DrKnS

buniak_a_h
Posts: 1437
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 116 times
Contact:

Панель результатов поиска и CtrlIns, CtrlAltIns

Post by buniak_a_h »

DV, у меня примерно такой скрипт:
  1. Macro {
  2.   description = "Find File Results: Copy Item Text to Clipboard";
  3.   area = "Dialog";
  4.   key = "CtrlIns";
  5.   condition = function() return Dlg.Id == far.Guids.FindFileResultId end;
  6.   action = function()
  7.    local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id
  8.    local tt = (hDlg:send("DM_GETTEXT",2) or '')
  9.    tt = tt:match"^.*│.*│.*│(.*)%s*$" or tt
  10.    if tt then
  11.     far.CopyToClipboard(tt)
  12.    end
  13.   end;
  14. }
Вроде, работает …

buniak_a_h
Posts: 1437
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 103 times
Been thanked: 116 times
Contact:

Панель результатов поиска и CtrlIns, CtrlAltIns

Post by buniak_a_h »

Полная версия (с полным путём):
  1. local F = far.Flags
  2. Macro {
  3.   description = "Find File Results: Copy Item Text to Clipboard";
  4.   area = "Dialog";
  5.   key = "CtrlIns";
  6.   condition = function() return Dlg.Id == far.Guids.FindFileResultId end;
  7.   action = function()
  8.    local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id
  9.    local tt = hDlg:send("DM_GETTEXT",2)
  10.    if tt then
  11.     tt = tt:match"^.*│.*│.*│(.*)%s*$" or tt
  12.     if tt then
  13.      far.CopyToClipboard(tt)
  14.     end
  15.    end
  16.   end;
  17. }
  18.  
  19. Macro {
  20.   description = "Find File Results: Copy Item`s FullPath Text to Clipboard";
  21.   area = "Dialog";
  22.   key = "CtrlAltIns";
  23.   condition = function() return Dlg.Id == far.Guids.FindFileResultId end;
  24.   action = function()
  25.    local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id
  26.    local tt = hDlg:send("DM_GETTEXT",2)
  27.    if tt then
  28.     tt = tt:match"^.*│.*│.*│(.*)%s*$"
  29.     if tt then
  30.      local iItem = hDlg:send("DM_LISTGETCURPOS", 2).SelectPos
  31.      for i=iItem,1,-1 do
  32.       if i == 1 or band(hDlg:send("DM_LISTGETITEM",2,i-1).Flags, F.LIF_SEPARATOR) == F.LIF_SEPARATOR then
  33.        tt = hDlg:send("DM_LISTGETITEM",2,i).Text .. tt
  34.        break
  35.       end
  36.      end
  37.      far.CopyToClipboard(tt)
  38.     end -- if tt
  39.    end
  40.   end;
  41. }

Post Reply

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