Сравнение файлов с панелей (например, используя WinMerge)

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

Сравнение файлов с панелей (например, используя WinMerge)

Post by DV »

Давно использую пункты главного меню F2 -> F9 для сравнения двоичных файлов и F2 -> F10 для сравнения текстовых файлов/папок/архивов.
Выкладываю макрос для FAR3, основанный на "WinMerge Macro" by gene.pavlovsky ( http://forum.farmanager.com/viewtopic.php?f=35&t=9769 ).

Code: Select all

local winmerge_path = 'winmerge'
local bincmp_path = 'bincmp'

local function run_cmd(cmd, use_console)
  if use_console then
    Keys("Esc")
    print(cmd)
    Keys("Enter")
  else
    win.system(cmd)
  end
end

local function file_name(filepath)
  return mf.fsplit(filepath, 0x0C)
end

local function full_path(dir, filename)
  if filename:len() >= 2 then
    local c = filename:sub(2, 2)
    if c == ':' or ((c == '\\' or c == '/') and c == filename.sub(1, 1)) then
      -- filename is either "X:..." or "\\..." or "//..."
      return filename
    end
  end
  return dir .. "\\" .. filename
end

local function winmerge(path1, path2)
  local files = '"' .. path1 .. '" "' .. path2 .. '"'
  run_cmd(winmerge_path .. ' /r ' .. files, false)
end

local function bincmp(path1, path2, swap)
  local files = '"' .. path1 .. '" "' .. path2 .. '"'
  run_cmd('edit:<1 ' .. bincmp_path .. ' -err1 -diffs=10000 -buf=16k -t=5000 ' .. files, true)
end

local function compare(comparer)
  local path1
  local path2
  if APanel.SelCount == 2 then -- Compare 2 selected files from the Active Panel
    path1 = full_path(APanel.Path, panel.GetSelectedPanelItem(nil, 1, 1).FileName)
    path2 = full_path(APanel.Path, panel.GetSelectedPanelItem(nil, 1, 2).FileName)
  else -- Compare current files from different Panels
    local dir1 = panel.GetPanelDirectory(nil, 1).Name
    local dir2 = panel.GetPanelDirectory(nil, 0).Name
    local file1 = panel.GetCurrentPanelItem(nil, 1).FileName
    local file2 = panel.GetCurrentPanelItem(nil, 0).FileName
    if file1 == ".." then
      path1 = full_path(dir1, file_name(file2))
      path2 = full_path(dir2, file2)
    elseif file2 == ".." then
      path1 = full_path(dir1, file1)
      path2 = full_path(dir2, file_name(file1))
    else
      path1 = full_path(dir1, file1)
      path2 = full_path(dir2, file2)
    end
  end
  comparer(path1, path2)
end

Macro {
  area = "Shell";
  key = "cmp_winmerge";
  description = "Compare with WinMerge";
  action = function()
    compare(winmerge)
  end;
}

Macro {
  area = "Shell";
  key = "cmp_bincmp";
  description = "Compare with BinCmp";
  action = function()
    compare(bincmp)
  end;
}
Пример соответствующих пунктов в FarMenu.ini:

Code: Select all

F9: Compare with BinCmp
    lua:eval("Shell/cmp_bincmp",2)
F10: Compare with WinMerge
    lua:eval("Shell/cmp_winmerge",2)
WinMerge берём здесь: https://sourceforge.net/projects/winmerge/files/stable/
и его 7-zip плагин здесь: https://sourceforge.net/projects/winmer ... ip-plugin/
BinCmp берём здесь: https://sourceforge.net/projects/bincmp/files/bincmp2/
Last edited by DV on Fri 19 Jan, 2018 16:38, edited 4 times in total.
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Сравнение файлов с панелей (например, используя WinMerge)

Post by DV »

Отличия от "WinMerge Macro" by gene.pavlovsky:
- для сравнения файлов (а в случае WinMerge также папок и архивов) с разных панелей выделение не требуется: берутся текущие файлы;
- если текущим элементом на одной из панелей является "..", имя файла берётся с противоположной панели.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Сравнение файлов с панелей (например, используя WinMerge)

Post by Shmuel »

Вместо os.execute лучше пользовать win.system, для правильной обработки юникодных путей и имён.
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Сравнение файлов с панелей (например, используя WinMerge)

Post by DV »

Спасибо, заменил на win.system! (Действительно, при системной локали, не поддерживающей кириллицу, os.execute некорретно передавало имена файлов с кириллицей).
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Сравнение файлов с панелей (например, используя WinMerge)

Post by DV »

Немного обновил скрипт, чтобы он поддерживал и полные пути в файловых панелях (например, во временной панели).
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

Сравнение файлов с панелей (например, используя WinMerge)

Post by DV »

Подкорректировал скрипт для случая, когда в одной из панелей текущий элемент содержит полный путь (например, когда это элемент временной панели), а в противоположной панели выбран элемент ".." .
pepak
Posts: 604
Joined: Sun 13 Jul, 2008 11:18
Has thanked: 17 times
Been thanked: 54 times

Сравнение файлов с панелей (например, используя WinMerge)

Post by pepak »

My usermenu for the same purpose:

Code: Select all

W: WinMerge
   @winmergeu "!.!" "!#!\!^!.!"
Doesn't need any macros.
Post Reply

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