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

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 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: 10847
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4254
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

DV, у меня примерно такой скрипт:
  1. Macro {
  2.  
  3.   description = "Find File Results: Copy Item Text to Clipboard";
  4.  
  5.   area = "Dialog";
  6.  
  7.   key = "CtrlIns";
  8.  
  9.   condition = function() return Dlg.Id == far.Guids.FindFileResultId end;
  10.  
  11.   action = function()
  12.  
  13.    local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id
  14.  
  15.    local tt = (hDlg:send("DM_GETTEXT",2) or '')
  16.  
  17.    tt = tt:match"^.*│.*│.*│(.*)%s*$" or tt
  18.  
  19.    if tt then
  20.  
  21.     far.CopyToClipboard(tt)
  22.  
  23.    end
  24.  
  25.   end;
  26.  
  27. }
Вроде, работает …
User avatar
buniak_a_h
Posts: 4254
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

Полная версия (с полным путём):
  1. local F = far.Flags
  2.  
  3. Macro {
  4.  
  5.   description = "Find File Results: Copy Item Text to Clipboard";
  6.  
  7.   area = "Dialog";
  8.  
  9.   key = "CtrlIns";
  10.  
  11.   condition = function() return Dlg.Id == far.Guids.FindFileResultId end;
  12.  
  13.   action = function()
  14.  
  15.    local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id
  16.  
  17.    local tt = hDlg:send("DM_GETTEXT",2)
  18.  
  19.    if tt then
  20.  
  21.     tt = tt:match"^.*│.*│.*│(.*)%s*$" or tt
  22.  
  23.     if tt then
  24.  
  25.      far.CopyToClipboard(tt)
  26.  
  27.     end
  28.  
  29.    end
  30.  
  31.   end;
  32.  
  33. }
  34.  
  35.  
  36.  
  37. Macro {
  38.  
  39.   description = "Find File Results: Copy Item`s FullPath Text to Clipboard";
  40.  
  41.   area = "Dialog";
  42.  
  43.   key = "CtrlAltIns";
  44.  
  45.   condition = function() return Dlg.Id == far.Guids.FindFileResultId end;
  46.  
  47.   action = function()
  48.  
  49.    local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id
  50.  
  51.    local tt = hDlg:send("DM_GETTEXT",2)
  52.  
  53.    if tt then
  54.  
  55.     tt = tt:match"^.*│.*│.*│(.*)%s*$"
  56.  
  57.     if tt then
  58.  
  59.      local iItem = hDlg:send("DM_LISTGETCURPOS", 2).SelectPos
  60.  
  61.      for i=iItem,1,-1 do
  62.  
  63.       if i == 1 or band(hDlg:send("DM_LISTGETITEM",2,i-1).Flags, F.LIF_SEPARATOR) == F.LIF_SEPARATOR then
  64.  
  65.        tt = hDlg:send("DM_LISTGETITEM",2,i).Text .. tt
  66.  
  67.        break
  68.  
  69.       end
  70.  
  71.      end
  72.  
  73.      far.CopyToClipboard(tt)
  74.  
  75.     end -- if tt
  76.  
  77.    end
  78.  
  79.   end;
  80.  
  81. }
Post Reply

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