Latest post of the previous page:
Проще всего - через Shared Memory.John Doe wrote:Тут основная задача в другом: грамотно реализовать межпроцессное взаимодействие (IPC)
Latest post of the previous page:
Проще всего - через Shared Memory.John Doe wrote:Тут основная задача в другом: грамотно реализовать межпроцессное взаимодействие (IPC)
Я понимаю, что реализовать такое копирование при помощи межпроцессного взаимодействия очень интересно. Но, если я не пропускаю какие-то подводные камни, мне видится другой путь.John Doe » Вт 13 янв, 2015 12:47
Тут основная задача в другом: грамотно реализовать межпроцессное взаимодействие (IPC)
Выше по теме уже предлагалось. Да, это должно быть возможно, хоть и с ограничениями.
У кого-то умения, а у кого-то желания.
[code]
...[/code]
Code: Select all
local unit = {}
local FILENAME
local function ExpandEnv (s)
return s:gsub("%%(.-)%%", win.GetEnv) -- подставляет значение %FARPROFILE%
end
-- Парсинг имени файла, на входе имя_файла
-- на выходе {диск, путь, имя, расширение}
local function ParseFileName(str)
local a, b, c, d
if str == nil then str="" end
a = string.match(str, "^%s*(.*:)")
str=str:gsub("^%s*(.*:)","")
b=string.match(str, "^(.*)[\\/]")
str=str:gsub("^(.*)[\\/]","")
d=string.match(str, "%.([^%.]*)$")
c=str:gsub("%.([^%.]*)$","")
if d == nil then d="" end
if c == nil then c="" end
if b == nil then b="" end
if a == nil then a="" end
return a, b, c, d
end
do
function unit.DefinePanelInfoFileName()
local Path = ExpandEnv([[%FARPROFILE%\PanelInfo\]])
local List = far.GetDirList(Path)
local no = 0
if #List then
for i = 1, #List do
local a,b,c,d = ParseFileName(List[i].FileName)
local n = tonumber(c)
if no < n then no = n end
end -- нашли максимум
end
FILENAME = Path..(no+1) -- здесь надо брать номер на 1 больше, чем тот,
-- который существует
-- far.Message('FILENAME='..FILENAME) --
end
function unit.SavePanelInfo()
if FILENAME == nil then unit.DefinePanelInfoFileName() end
local f=io.output(FILENAME)
local ADir = panel.GetPanelDirectory(nil,0)
local BDir = panel.GetPanelDirectory(nil,1)
f:write(ADir.Name.."\n")
f:write(BDir.Name.."\n")
f:close()
-- far.Message('WRITTEN: to '..FILENAME) --
end
function unit.CopyToPanelsOfOtheFar()
local Path = ExpandEnv([[%FARPROFILE%\PanelInfo\]])
local List = far.GetDirList(Path)
local A = {}
local B = {}
for i = 1,#List do
local name = List[i].FileName
local f=io.input(name)
A[i] = f:read()
B[i] = f:read()
f:close()
end
local s = 'LIST of directories'
for i = 1,#List do
s = s..'\nFAR<'..i..'>: \n'..A[i]..'\n'..B[i]
end
far.Message(s)
end
function unit.RemovePanelInfo()
os.remove(FILENAME)
end
end -- do
-----------------------------------------------------------------
Event { group = "ExitFAR", description = "Remove information file",
action = function ()
unit.RemovePanelInfo()
end,
} -- Event "ExitFAR"
Macro { description="Save Panel Info to information file";
area="Shell"; key="Enter";
condition=function()
unit.SavePanelInfo()
return false
end;
action=function()
end;
}
Macro { description="Get Panel Info from all Far's";
area="Shell"; key="ShiftF7";
action=function()
unit.CopyToPanelsOfOtheFar()
end;
}
Code: Select all
local unit = {}
local FILENAME
local function ExpandEnv (s)
return s:gsub("%%(.-)%%", win.GetEnv) -- подставляет значение %FARPROFILE%
end
do
function unit.DefinePanelInfoFileName()
local Path = ExpandEnv([[%FARPROFILE%\PanelInfo\]])
FILENAME = Path..os.date("%d_%H_%M_%S") -- имя по дате
end
function unit.SavePanelInfo()
if FILENAME == nil then unit.DefinePanelInfoFileName() end
local f=io.output(FILENAME)
local ADir = panel.GetPanelDirectory(nil,0)
local BDir = panel.GetPanelDirectory(nil,1)
f:write(ADir.Name.."\n")
f:write(BDir.Name.."\n")
f:close()
end
function unit.CopyToPanelsOfOtherFar()
local Path = ExpandEnv([[%FARPROFILE%\PanelInfo\]])
local List = far.GetDirList(Path)
local Items = {}
local name = panel.GetCurrentPanelItem(nil,1) -- File to copy
name = name.FileName
local width = name:len() + 13
for i = 1,#List do
local name = List[i].FileName
if name ~= FILENAME then -- Exclude itself
local f=io.input(name)
local A = f:read()
local curw = A:len()
if width < curw then width = curw end
table.insert(Items,{ Flags = 0, Text = A })
A = f:read()
curw = A:len()
if width < curw then width = curw end
table.insert(Items,{ Flags = 0, Text = A })
f:close()
end
end
if #Items then
local Form = {{"DI_LISTBOX", 0, 0, width+3, #Items+1, Items, 0, 0, 0,
"Copy '"..name.."' to:"}}
local function DlgProc (dlg, msg, param1, param2) end -- заглушка
local hDlg = far.DialogInit("",5,5,8+width, 6+#Items, nil, Form, 0, DlgProc)
local Index = far.DialogRun(hDlg) > 0 and
far.SendDlgMessage(hDlg, far.Flags.DM_LISTGETCURPOS, 1).SelectPos or nil
far.DialogFree(hDlg)
if Index then
local to = Items[Index].Text..[[\]]..name
Keys("F5")
print(to)
Keys("Enter")
end
end
end
function unit.RemovePanelInfo()
os.remove(FILENAME)
end
end -- do
-----------------------------------------------------------------
Event { group = "ExitFAR", description = "Remove information file",
action = function ()
unit.RemovePanelInfo()
end,
} -- Event "ExitFAR"
Macro { description="Save Panel Info to information file";
area="Shell"; key="Enter";
condition=function()
unit.SavePanelInfo()
return false
end;
action=function()
end;
}
Macro { description="Copy current file to other Far's";
area="Shell"; key="ShiftF7";
action=function()
unit.CopyToPanelsOfOtherFar()
end;
}
Code: Select all
key=[[/[\w]/ Enter Tab Left Right Up Down Esc /F[1-9]/ F11 F12]];
Никак. Просто его следует избегать.
Ваш макрос мог бы вызываться прямо из диалога копирования, а не из панелей.
CtrlUp
(в предопредёлённых диалогах)Заглянул на форум и обрадовался, что мои каракули подвигли Вас, John Doe, написать такой макрос. Как я понял, Вы посчитали, что выгоднее привязать создание файлов с данными о директориях с запросом на копирование, а не со сменой каталога, как пытался сделать я.Postby John Doe » Wed 14 Jan, 2015 20:50
Вот набросал что-то: