Page 1 of 3

CtrlX и CtrlV "как в Windows"

Posted: Thu 25 Jun, 2015 14:34
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. -- configurable options:
  4. local UseWholeCmdLineWhenNoSelection = true
  5.  
  6. -- internal variables:
  7. local ffi = require("ffi")
  8. local C = ffi.C
  9. ffi.cdef[[
  10.   int IsClipboardFormatAvailable(unsigned int fmt);
  11. ]]
  12. local CF_HDROP = 15
  13. local EMENU_GUID = "742910F1-02ED-4542-851F-DEE37C2E13B2"
  14.  
  15. local function EMenuCommand(cmd)
  16.   Far.DisableHistory(-1)
  17.   Plugin.Command(EMENU_GUID, "rclk_cmd:" .. cmd)
  18. end
  19.  
  20. local function IsClipboardContainingFiles()
  21.   if C.IsClipboardFormatAvailable(CF_HDROP) ~= 0 then
  22.     return true
  23.   else
  24.     return false
  25.   end
  26. end
  27.  
  28. Macro {
  29.   area="Shell";
  30.   key="CtrlC";
  31.   description="Clipboard: Copy selected text from CmdLine or selected files from APanel";
  32.   flags="";
  33.   action = function()
  34.     if CmdLine.Empty and APanel.Visible then
  35.       if APanel.Selected or (APanel.Current ~= ".." and APanel.Current ~= ".") then
  36.         EMenuCommand("copy")
  37.       end
  38.     else
  39.       if UseWholeCmdLineWhenNoSelection or CmdLine.Selected then
  40.         Keys("CtrlIns")
  41.       end
  42.     end
  43.   end;
  44. }
  45.  
  46. Macro {
  47.   area="Shell";
  48.   key="CtrlX";
  49.   description="Clipboard: Cut selected text from CmdLine or selected files from APanel";
  50.   flags="";
  51.   action = function()
  52.     if CmdLine.Empty and APanel.Visible then
  53.       if APanel.Selected or (APanel.Current ~= ".." and APanel.Current ~= ".") then
  54.         EMenuCommand("cut")
  55.       end
  56.     else
  57.       if CmdLine.Selected then
  58.         Keys("CtrlIns Del")
  59.       elseif UseWholeCmdLineWhenNoSelection then
  60.         Keys("CtrlIns CtrlY")
  61.       end
  62.     end
  63.   end;
  64. }
  65.  
  66. Macro {
  67.   area="Shell";
  68.   key="CtrlV";
  69.   description="Clipboard: Paste text to CmdLine or files to APanel";
  70.   flags="";
  71.   action = function()
  72.     if CmdLine.Empty and APanel.Visible and IsClipboardContainingFiles() then
  73.       EMenuCommand("paste \"" .. APanel.Path .. "\"")
  74.     else
  75.       Keys("ShiftIns")
  76.     end
  77.   end;
  78. }

CtrlX и CtrlV "как в Windows"

Posted: Thu 25 Jun, 2015 14:48
by John Doe
1. Работа с выделением вроде бы тривиальна.
2. Работа с файлами — через emenu или clipcopy (макросы в дистрибутиве, или соответствующих темах)
Остаётся совместить 1+2

CtrlX и CtrlV "как в Windows"

Posted: Thu 25 Jun, 2015 15:24
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 }        ║
╚══════════════════════╝

CtrlX и CtrlV "как в Windows"

Posted: Thu 25 Jun, 2015 15:43
by John Doe
Это в тему emenu. Там есть решение.

CtrlX и CtrlV "как в Windows"

Posted: Fri 26 Jun, 2015 09:56
by DV
Добавил в первое сообщение получившийся скрипт.
А есть ли в скрипте Lua возможность определить тип объекта в Clipboard? Чтобы, если это текст, по CtrlV автоматически делать вставку текста в командную строку?

CtrlX и CtrlV "как в Windows"

Posted: Fri 26 Jun, 2015 10:02
by John Doe
DV wrote: А есть ли в скрипте Lua возможность определить тип объекта в Clipboard?
Встроенной нет.
Но через ffi можно использовать winapi. Тогда и emenu не понадобится.

CtrlX и CtrlV "как в Windows"

Posted: Fri 26 Jun, 2015 10:16
by John Doe
John Doe wrote: Но через ffi можно использовать winapi
Или так: http://files.luaforge.net/releases/jasl ... oard/1.0.0

CtrlX и CtrlV "как в Windows"

Posted: Fri 26 Jun, 2015 13:04
by DV
добавил проверку формата буфера обмена через ffi

CtrlX и CtrlV "как в Windows"

Posted: Fri 26 Jun, 2015 13:11
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
Это лучше разместить за пределами функции.

CtrlX и CtrlV "как в Windows"

Posted: Fri 26 Jun, 2015 15:05
by John Doe
Emenu намного удобнее вызывать через Plugin.Command

CtrlX и CtrlV "как в Windows"

Posted: Fri 26 Jun, 2015 15:39
by DV
спасибо, обновил скрипт в первом сообщении

CtrlX и CtrlV "как в Windows"

Posted: Wed 01 Jul, 2015 15:44
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;
}

CtrlX и CtrlV "как в Windows"

Posted: Wed 01 Jul, 2015 15:57
by HaRT
При вставке нескольких файлов в командную строку хорошо бы закавычивать в соответствии с System.QuotedSymbols

CtrlX и CtrlV "как в Windows"

Posted: Wed 01 Jul, 2015 16:02
by John Doe
@HaRT
Пожелание интересное, но имеет ли оно отношение к сабжу?
Насколько я понимаю у предлагаемых макросов обратная цель: при наличии в клипборде списка файлов запускать paste.

CtrlX и CtrlV "как в Windows"

Posted: Wed 01 Jul, 2015 16:28
by HaRT
John Doe wrote: при наличии в клипборде списка файлов запускать paste
Да, но поскольку в Фаре не поддерживается цепочка макросов на одно и то же кнопкосочетание, где ещё и реализовывать моё предложение, как тут в макросе на CtrlV.

CtrlX и CtrlV "как в Windows"

Posted: Wed 01 Jul, 2015 17:57
by John Doe
HaRT wrote:в Фаре не поддерживается цепочка макросов на одно и то же кнопкосочетание
Расскажите как вы это представляете (может оказаться что всё поддерживается).
HaRT wrote: где ещё и реализовывать моё предложение, как тут в макросе на CtrlV.
Например полно других сочетаний.
Во всяком случае мне пока не ясно как именно вы предлагаете на одной и той же клавише совместить два на первый взгляд несовместимых действия.