CtrlX и CtrlV "как в Windows"

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

CtrlX и CtrlV "как в Windows"

Post by DV » Thu 25 Jun, 2015 14:34

Вроде бы простой вопрос - а готового решения для FAR3 не нашёл.
Задача:
1) CtrlX в командной строке "вырезает" выделенный текст в буфер обмена; CtrlX в панели "вырезает" (для последующего перемещения) выделенные файлы в буфер обмена.
2) CtrlV в командной строке "вставляет" текст из буфера обмена; CtrlV в панели "вставляет" (с копированием) файлы из буфера обмена.
Code: [Select all] [Expand/Collapse] [Download] (HotkeyClipboard.lua)
  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: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Thu 25 Jun, 2015 14:48

1. Работа с выделением вроде бы тривиальна.
2. Работа с файлами — через emenu или clipcopy (макросы в дистрибутиве, или соответствующих темах)
Остаётся совместить 1+2

DV
Posts: 280
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 1 time
Been thanked: 2 times

CtrlX и CtrlV "как в Windows"

Post by DV » Thu 25 Jun, 2015 15:24

Вот, вспомнил, что плохо в стандартном макросе от 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: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Thu 25 Jun, 2015 15:43

Это в тему emenu. Там есть решение.

DV
Posts: 280
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 1 time
Been thanked: 2 times

CtrlX и CtrlV "как в Windows"

Post by DV » Fri 26 Jun, 2015 09:56

Добавил в первое сообщение получившийся скрипт.
А есть ли в скрипте Lua возможность определить тип объекта в Clipboard? Чтобы, если это текст, по CtrlV автоматически делать вставку текста в командную строку?

User avatar
John Doe
Бюрократ
Posts: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Fri 26 Jun, 2015 10:02

DV wrote: А есть ли в скрипте Lua возможность определить тип объекта в Clipboard?
Встроенной нет.
Но через ffi можно использовать winapi. Тогда и emenu не понадобится.

User avatar
John Doe
Бюрократ
Posts: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Fri 26 Jun, 2015 10:16

John Doe wrote: Но через ffi можно использовать winapi
Или так: http://files.luaforge.net/releases/jasl ... oard/1.0.0

DV
Posts: 280
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 1 time
Been thanked: 2 times

CtrlX и CtrlV "как в Windows"

Post by DV » Fri 26 Jun, 2015 13:04

добавил проверку формата буфера обмена через ffi

User avatar
John Doe
Бюрократ
Posts: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Fri 26 Jun, 2015 13:11

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: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Fri 26 Jun, 2015 15:05

Emenu намного удобнее вызывать через Plugin.Command

DV
Posts: 280
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 1 time
Been thanked: 2 times

CtrlX и CtrlV "как в Windows"

Post by DV » Fri 26 Jun, 2015 15:39

спасибо, обновил скрипт в первом сообщении

User avatar
John Doe
Бюрократ
Posts: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Wed 01 Jul, 2015 15:44

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

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: 7987
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 66 times
Been thanked: 98 times

CtrlX и CtrlV "как в Windows"

Post by HaRT » Wed 01 Jul, 2015 15:57

При вставке нескольких файлов в командную строку хорошо бы закавычивать в соответствии с System.QuotedSymbols
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Wed 01 Jul, 2015 16:02

@HaRT
Пожелание интересное, но имеет ли оно отношение к сабжу?
Насколько я понимаю у предлагаемых макросов обратная цель: при наличии в клипборде списка файлов запускать paste.

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

CtrlX и CtrlV "как в Windows"

Post by HaRT » Wed 01 Jul, 2015 16:28

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

User avatar
John Doe
Бюрократ
Posts: 11083
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 11 times
Been thanked: 64 times

CtrlX и CtrlV "как в Windows"

Post by John Doe » Wed 01 Jul, 2015 17:57

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

Post Reply

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

Who is online

Users browsing this forum: No registered users and 3 guests