CtrlX и CtrlV "как в Windows"

Здесь обсуждается всё, что касается макросов.
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

CtrlX и CtrlV "как в Windows"

Post by DV »

Вроде бы простой вопрос - а готового решения для FAR3 не нашёл.
Задача:
1) CtrlX в командной строке "вырезает" выделенный текст в буфер обмена; CtrlX в панели "вырезает" (для последующего перемещения) выделенные файлы в буфер обмена.
2) CtrlV в командной строке "вставляет" текст из буфера обмена; CtrlV в панели "вставляет" (с копированием) файлы из буфера обмена.
  1. -- Hotkeys to execute cut/copy/paste commands: Ctrl-X, Ctrl-C, Ctrl-V
  2.  
  3.  
  4.  
  5. -- configurable options:
  6.  
  7. local UseWholeCmdLineWhenNoSelection = true
  8.  
  9.  
  10.  
  11. -- internal variables:
  12.  
  13. local ffi = require("ffi")
  14.  
  15. local C = ffi.C
  16.  
  17. ffi.cdef[[
  18.  
  19.   int IsClipboardFormatAvailable(unsigned int fmt);
  20.  
  21. ]]
  22.  
  23. local CF_HDROP = 15
  24.  
  25. local EMENU_GUID = "742910F1-02ED-4542-851F-DEE37C2E13B2"
  26.  
  27.  
  28.  
  29. local function EMenuCommand(cmd)
  30.  
  31.   Far.DisableHistory(-1)
  32.  
  33.   Plugin.Command(EMENU_GUID, "rclk_cmd:" .. cmd)
  34.  
  35. end
  36.  
  37.  
  38.  
  39. local function IsClipboardContainingFiles()
  40.  
  41.   if C.IsClipboardFormatAvailable(CF_HDROP) ~= 0 then
  42.  
  43.     return true
  44.  
  45.   else
  46.  
  47.     return false
  48.  
  49.   end
  50.  
  51. end
  52.  
  53.  
  54.  
  55. Macro {
  56.  
  57.   area="Shell";
  58.  
  59.   key="CtrlC";
  60.  
  61.   description="Clipboard: Copy selected text from CmdLine or selected files from APanel";
  62.  
  63.   flags="";
  64.  
  65.   action = function()
  66.  
  67.     if CmdLine.Empty and APanel.Visible then
  68.  
  69.       if APanel.Selected or (APanel.Current ~= ".." and APanel.Current ~= ".") then
  70.  
  71.         EMenuCommand("copy")
  72.  
  73.       end
  74.  
  75.     else
  76.  
  77.       if UseWholeCmdLineWhenNoSelection or CmdLine.Selected then
  78.  
  79.         Keys("CtrlIns")
  80.  
  81.       end
  82.  
  83.     end
  84.  
  85.   end;
  86.  
  87. }
  88.  
  89.  
  90.  
  91. Macro {
  92.  
  93.   area="Shell";
  94.  
  95.   key="CtrlX";
  96.  
  97.   description="Clipboard: Cut selected text from CmdLine or selected files from APanel";
  98.  
  99.   flags="";
  100.  
  101.   action = function()
  102.  
  103.     if CmdLine.Empty and APanel.Visible then
  104.  
  105.       if APanel.Selected or (APanel.Current ~= ".." and APanel.Current ~= ".") then
  106.  
  107.         EMenuCommand("cut")
  108.  
  109.       end
  110.  
  111.     else
  112.  
  113.       if CmdLine.Selected then
  114.  
  115.         Keys("CtrlIns Del")
  116.  
  117.       elseif UseWholeCmdLineWhenNoSelection then
  118.  
  119.         Keys("CtrlIns CtrlY")
  120.  
  121.       end
  122.  
  123.     end
  124.  
  125.   end;
  126.  
  127. }
  128.  
  129.  
  130.  
  131. Macro {
  132.  
  133.   area="Shell";
  134.  
  135.   key="CtrlV";
  136.  
  137.   description="Clipboard: Paste text to CmdLine or files to APanel";
  138.  
  139.   flags="";
  140.  
  141.   action = function()
  142.  
  143.     if CmdLine.Empty and APanel.Visible and IsClipboardContainingFiles() then
  144.  
  145.       EMenuCommand("paste \"" .. APanel.Path .. "\"")
  146.  
  147.     else
  148.  
  149.       Keys("ShiftIns")
  150.  
  151.     end
  152.  
  153.   end;
  154.  
  155. }
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CtrlX и CtrlV "как в Windows"

Post by John Doe »

1. Работа с выделением вроде бы тривиальна.
2. Работа с файлами — через emenu или clipcopy (макросы в дистрибутиве, или соответствующих темах)
Остаётся совместить 1+2
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

CtrlX и CtrlV "как в Windows"

Post by DV »

Вот, вспомнил, что плохо в стандартном макросе от EMenu:

Code: Select all

Macro {
  area="Shell"; key="CtrlV"; flags=""; action = function()
Keys("Esc") Far.DisableHistory(0) print("rclk_cmd:paste") Keys("Enter")
  end;
}
Если активным элементом в панели является файл, то вместо ожидаемого по CtrlV копирования файлов получаем неожиданное сообщение:

Code: Select all

╔═══════ EMenu ════════╗
║ Can't show the menu. ║
╟──────────────────────╢
║        { OK }        ║
╚══════════════════════╝
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CtrlX и CtrlV "как в Windows"

Post by John Doe »

Это в тему emenu. Там есть решение.
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

CtrlX и CtrlV "как в Windows"

Post by DV »

Добавил в первое сообщение получившийся скрипт.
А есть ли в скрипте Lua возможность определить тип объекта в Clipboard? Чтобы, если это текст, по CtrlV автоматически делать вставку текста в командную строку?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CtrlX и CtrlV "как в Windows"

Post by John Doe »

DV wrote: А есть ли в скрипте Lua возможность определить тип объекта в Clipboard?
Встроенной нет.
Но через ffi можно использовать winapi. Тогда и emenu не понадобится.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CtrlX и CtrlV "как в Windows"

Post by John Doe »

John Doe wrote: Но через ffi можно использовать winapi
Или так: http://files.luaforge.net/releases/jasl ... oard/1.0.0
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

CtrlX и CtrlV "как в Windows"

Post by DV »

добавил проверку формата буфера обмена через ffi
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CtrlX и CtrlV "как в Windows"

Post by John Doe »

Code: Select all

local ffi = require("ffi")
  local C = ffi.C
  ffi.cdef[[
    int IsClipboardFormatAvailable(unsigned int fmt);
  ]]
  local CF_TEXT = 1
  local CF_OEMTEXT = 7
  local CF_UNICODETEXT = 13
Это лучше разместить за пределами функции.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CtrlX и CtrlV "как в Windows"

Post by John Doe »

Emenu намного удобнее вызывать через Plugin.Command
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

CtrlX и CtrlV "как в Windows"

Post by DV »

спасибо, обновил скрипт в первом сообщении
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CtrlX и CtrlV "как в Windows"

Post by John Doe »

Так немного проще:

Code: Select all

Macro {
  area="Shell";key="CtrlV";
  action = function()
    if CmdLine.Empty and APanel.Visible and C.IsClipboardFormatAvailable(15)~=0 then --CF_HDROP
      EMenuCommand('paste "'..APanel.Path..'"')
    else
      Keys("ShiftIns")
    end
  end;
}

Code: Select all

Macro {
  area="Shell"; key="CtrlC";
  condition=function()
    return not CmdLine.Empty or APanel.Current:match"^%.%.?$"
  end;
  action = function()
    if UseWholeCmdLineWhenNoSelection or CmdLine.Selected then
      Keys("CtrlIns")
    end
  end;
}
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

CtrlX и CtrlV "как в Windows"

Post by HaRT »

При вставке нескольких файлов в командную строку хорошо бы закавычивать в соответствии с System.QuotedSymbols
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

CtrlX и CtrlV "как в Windows"

Post by John Doe »

@HaRT
Пожелание интересное, но имеет ли оно отношение к сабжу?
Насколько я понимаю у предлагаемых макросов обратная цель: при наличии в клипборде списка файлов запускать paste.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

CtrlX и CtrlV "как в Windows"

Post by HaRT »

John Doe wrote: при наличии в клипборде списка файлов запускать paste
Да, но поскольку в Фаре не поддерживается цепочка макросов на одно и то же кнопкосочетание, где ещё и реализовывать моё предложение, как тут в макросе на CtrlV.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Post Reply

Return to “Обсуждение макросов”