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

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

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

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

Давно использую пункты главного меню F2 -> F9 для сравнения двоичных файлов и F2 -> F10 для сравнения текстовых файлов/папок/архивов.
Выкладываю макрос для FAR3, основанный на "WinMerge Macro" by gene.pavlovsky ( http://forum.farmanager.com/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 file_name(filepath)
  15.   return mf.fsplit(filepath, 0x0C)
  16. end
  17.  
  18. local function full_path(dir, filename)
  19.   if filename:len() >= 2 then
  20.     local c = filename:sub(2, 2)
  21.     if c == ':' or ((c == '\\' or c == '/') and c == filename.sub(1, 1)) then
  22.       -- filename is either "X:..." or "\\..." or "//..."
  23.       return filename
  24.     end
  25.   end
  26.   return dir .. "\\" .. filename
  27. end
  28.  
  29. local function winmerge(path1, path2)
  30.   local files = '"' .. path1 .. '" "' .. path2 .. '"'
  31.   run_cmd(winmerge_path .. ' /r ' .. files, false)
  32. end
  33.  
  34. local function bincmp(path1, path2, swap)
  35.   local files = '"' .. path1 .. '" "' .. path2 .. '"'
  36.   run_cmd('edit:<1 ' .. bincmp_path .. ' -err1 -diffs=10000 -buf=16k -t=5000 ' .. files, true)
  37. end
  38.  
  39. local function compare(comparer)
  40.   local path1
  41.   local path2
  42.   if APanel.SelCount == 2 then -- Compare 2 selected files from the Active Panel
  43.     path1 = full_path(APanel.Path, panel.GetSelectedPanelItem(nil, 1, 1).FileName)
  44.     path2 = full_path(APanel.Path, panel.GetSelectedPanelItem(nil, 1, 2).FileName)
  45.   else -- Compare current files from different Panels
  46.     local dir1 = panel.GetPanelDirectory(nil, 1).Name
  47.     local dir2 = panel.GetPanelDirectory(nil, 0).Name
  48.     local file1 = panel.GetCurrentPanelItem(nil, 1).FileName
  49.     local file2 = panel.GetCurrentPanelItem(nil, 0).FileName
  50.     if file1 == ".." then
  51.       path1 = full_path(dir1, file_name(file2))
  52.       path2 = full_path(dir2, file2)
  53.     elseif file2 == ".." then
  54.       path1 = full_path(dir1, file1)
  55.       path2 = full_path(dir2, file_name(file1))
  56.     else
  57.       path1 = full_path(dir1, file1)
  58.       path2 = full_path(dir2, file2)
  59.     end
  60.   end
  61.   comparer(path1, path2)
  62. end
  63.  
  64. Macro {
  65.   area = "Shell";
  66.   key = "cmp_winmerge";
  67.   description = "Compare with WinMerge";
  68.   action = function()
  69.     compare(winmerge)
  70.   end;
  71. }
  72.  
  73. Macro {
  74.   area = "Shell";
  75.   key = "cmp_bincmp";
  76.   description = "Compare with BinCmp";
  77.   action = function()
  78.     compare(bincmp)
  79.   end;
  80. }
Пример соответствующих пунктов в 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: 363
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 10 times
Been thanked: 3 times

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

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

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

Shmuel
Posts: 5836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 213 times

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

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

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

DV
Posts: 363
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 10 times
Been thanked: 3 times

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

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

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

DV
Posts: 363
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 10 times
Been thanked: 3 times

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

Post by DV » Wed 17 Jan, 2018 22:52

Немного обновил скрипт, чтобы он поддерживал и полные пути в файловых панелях (например, во временной панели).

DV
Posts: 363
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 10 times
Been thanked: 3 times

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

Post by DV » Fri 19 Jan, 2018 16:40

Подкорректировал скрипт для случая, когда в одной из панелей текущий элемент содержит полный путь (например, когда это элемент временной панели), а в противоположной панели выбран элемент ".." .

pepak
Posts: 413
Joined: Sun 13 Jul, 2008 11:18
Has thanked: 6 times
Been thanked: 21 times

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

Post by pepak » Wed 07 Mar, 2018 20:53

My usermenu for the same purpose:

Code: Select all

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

Post Reply

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