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

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

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

Post by DV » Wed 02 Aug, 2017 10:07

Давно использую пункты главного меню F2 -> F9 для сравнения двоичных файлов и F2 -> F10 для сравнения текстовых файлов/папок/архивов.
Выкладываю макрос для FAR3, основанный на "WinMerge Macro" by gene.pavlovsky ( viewtopic.php?f=35&t=9769 ).
  1. local winmerge_path = 'winmerge'
  2. local bincmp_path = 'bincmp'
  3.  
  4. local function run_cmd(cmd, use_console)
  5.   if use_console then
  6.     Keys("Esc")
  7.     print(cmd)
  8.     Keys("Enter")
  9.   else
  10.     win.system(cmd)
  11.   end
  12. end
  13.  
  14. local function winmerge(path1, path2)
  15.   local files = '"' .. path1 .. '" "' .. path2 .. '"'
  16.   run_cmd(winmerge_path .. ' /r ' .. files, false)
  17. end
  18.  
  19. local function bincmp(path1, path2, swap)
  20.   local files = '"' .. path1 .. '" "' .. path2 .. '"'
  21.   run_cmd('edit:<1 ' .. bincmp_path .. ' -err1 -diffs=10000 -buf=16k -t=5000 ' .. files, true)
  22. end
  23.  
  24. local function compare(comparer)
  25.   local path1
  26.   local path2
  27.   if APanel.SelCount == 2 then -- Compare 2 selected files from the Active Panel
  28.     path1 = APanel.Path .. "\\" .. panel.GetSelectedPanelItem(nil, 1, 1).FileName
  29.     path2 = APanel.Path .. "\\" .. panel.GetSelectedPanelItem(nil, 1, 2).FileName
  30.   else -- Compare current files from different Panels
  31.     local dir1 = panel.GetPanelDirectory(nil, 1).Name .. "\\"
  32.     local dir2 = panel.GetPanelDirectory(nil, 0).Name .. "\\"
  33.     local file1 = panel.GetCurrentPanelItem(nil, 1).FileName
  34.     local file2 = panel.GetCurrentPanelItem(nil, 0).FileName
  35.     if file1 == ".." then
  36.       path1 = dir1 .. file2
  37.       path2 = dir2 .. file2
  38.     elseif file2 == ".." then
  39.       path1 = dir1 .. file1
  40.       path2 = dir2 .. file1
  41.     else
  42.       path1 = dir1 .. file1
  43.       path2 = dir2 .. file2
  44.     end
  45.   end
  46.   comparer(path1, path2)
  47. end
  48.  
  49. Macro {
  50.   area = "Shell";
  51.   key = "cmp_winmerge";
  52.   description = "Compare with WinMerge";
  53.   action = function()
  54.     compare(winmerge)
  55.   end;
  56. }
  57.  
  58. Macro {
  59.   area = "Shell";
  60.   key = "cmp_bincmp";
  61.   description = "Compare with BinCmp";
  62.   action = function()
  63.     compare(bincmp)
  64.   end;
  65. }
Пример соответствующих пунктов в 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 Wed 02 Aug, 2017 14:05, edited 2 times in total.

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

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

Post by DV » Wed 02 Aug, 2017 10:14

Отличия от "WinMerge Macro" by gene.pavlovsky:
- для сравнения файлов (а в случае WinMerge также папок и архивов) с разных панелей выделение не требуется: берутся текущие файлы;
- если текущим элементом на одной из панелей является "..", имя файла берётся с противоположной панели.

Shmuel
Posts: 5230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Wed 02 Aug, 2017 10:52

Вместо os.execute лучше пользовать win.system, для правильной обработки юникодных путей и имён.

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

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

Post by DV » Wed 02 Aug, 2017 14:12

Спасибо, заменил на win.system! (Действительно, при системной локали, не поддерживающей кириллицу, os.execute некорретно передавало имена файлов с кириллицей).

Post Reply

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