Page 1 of 4
CtrlX и CtrlV "как в Windows"
Posted: Thu 25 Jun, 2015 14:34
by DV
Вроде бы простой вопрос - а готового решения для FAR3
не нашёл.
Задача:
1) CtrlX в командной строке "вырезает" выделенный текст в буфер обмена; CtrlX в панели "вырезает" (для последующего перемещения) выделенные файлы в буфер обмена.
2) CtrlV в командной строке "вставляет" текст из буфера обмена; CtrlV в панели "вставляет" (с копированием) файлы из буфера обмена.
-- Hotkeys to execute cut/copy/paste commands: Ctrl-X, Ctrl-C, Ctrl-V
-- configurable options:
local UseWholeCmdLineWhenNoSelection = true
-- internal variables:
local ffi = require("ffi")
local C = ffi.C
ffi.cdef[[
int IsClipboardFormatAvailable(unsigned int fmt);
]]
local CF_HDROP = 15
local EMENU_GUID = "742910F1-02ED-4542-851F-DEE37C2E13B2"
local function EMenuCommand(cmd)
Far.DisableHistory(-1)
Plugin.Command(EMENU_GUID, "rclk_cmd:" .. cmd)
end
local function IsClipboardContainingFiles()
if C.IsClipboardFormatAvailable(CF_HDROP) ~= 0 then
return true
else
return false
end
end
Macro {
area="Shell";
key="CtrlC";
description="Clipboard: Copy selected text from CmdLine or selected files from APanel";
flags="";
action = function()
if CmdLine.Empty and APanel.Visible then
if APanel.Selected or (APanel.Current ~= ".." and APanel.Current ~= ".") then
EMenuCommand("copy")
end
else
if UseWholeCmdLineWhenNoSelection or CmdLine.Selected then
Keys("CtrlIns")
end
end
end;
}
Macro {
area="Shell";
key="CtrlX";
description="Clipboard: Cut selected text from CmdLine or selected files from APanel";
flags="";
action = function()
if CmdLine.Empty and APanel.Visible then
if APanel.Selected or (APanel.Current ~= ".." and APanel.Current ~= ".") then
EMenuCommand("cut")
end
else
if CmdLine.Selected then
Keys("CtrlIns Del")
elseif UseWholeCmdLineWhenNoSelection then
Keys("CtrlIns CtrlY")
end
end
end;
}
Macro {
area="Shell";
key="CtrlV";
description="Clipboard: Paste text to CmdLine or files to APanel";
flags="";
action = function()
if CmdLine.Empty and APanel.Visible and IsClipboardContainingFiles() then
EMenuCommand("paste \"" .. APanel.Path .. "\"")
else
Keys("ShiftIns")
end
end;
}
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
.