[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Monotone-devel] Improved Vim Merger

From: Matthew Nicholson
Subject: [Monotone-devel] Improved Vim Merger
Date: Wed, 27 Feb 2008 21:46:48 -0600
User-agent: Mozilla-Thunderbird (X11/20080109)


I have attached an improved vim merger which uses diff3 to merge non conflict changes before passing the files on to vim. If there are no objections to these changes, I will go ahead and commit them.

Further information:

In short, vim's merger sucks. In fact, it is not a merger at all, it is really a diff tool that will show you the differences between files and allow you to copy those differences between files. To compensate for that, this new merger hook calls diff3 to merge the left and right files so that you only see non conflict changes in vim. This makes using vim to merge files much more pleasant because you now, don't have to sort through all of the non conflicting changes when merging large files.

P.S. I am not sure if anyone other then me is using vim to merge, it seems like a lot of you use real merge tools (e.g., kdiff3, xxdiff, ...).
Matthew Nicholson
mergers.vim = {
   cmd = function (tbl)
      function execute_diff3(mine, yours, out)
         local diff3_args = {
         table.insert(diff3_args, string.gsub(mine, "\\", "/") .. "")
         table.insert(diff3_args, string.gsub(tbl.afile, "\\", "/") .. "")
         table.insert(diff3_args, string.gsub(yours, "\\", "/") .. "")
         return execute_redirected("", string.gsub(out, "\\", "/"), "", 

      io.write (string.format("\nWARNING: 'vim' was choosen to perform external 
3-way merge.\n"..
          "You should merge all changes to *LEFT* file due to limitation of 
      local vim
      if os.getenv ("DISPLAY") ~= nil and program_exists_in_path ("gvim") then
         vim = "gvim"
         vim = "vim"

      local lfile_merged = tbl.lfile .. ".merged"
      local rfile_merged = tbl.rfile .. ".merged"

      -- first merge lfile using diff3
      local ret = execute_diff3(tbl.lfile, tbl.rfile, lfile_merged)
      if ret == 2 then
         io.write(string.format(gettext("Error running diff3 for merger 
'%s'\n"), vim))
         return false

      -- now merge rfile using diff3
      ret = execute_diff3(tbl.rfile, tbl.lfile, rfile_merged)
      if ret == 2 then
         io.write(string.format(gettext("Error running diff3 for merger 
'%s'\n"), vim))
         return false
      os.rename(lfile_merged, tbl.lfile)
      os.rename(rfile_merged, tbl.rfile)
      local ret = execute(vim, "-f", "-d", "-c", string.format("file %s", 
                          tbl.lfile, tbl.rfile)
      if (ret ~= 0) then
         io.write(string.format(gettext("Error running merger '%s'\n"), vim))
         return false
      return tbl.outfile
   end ,
   available =
      function ()
         return program_exists_in_path("diff3") and
            (program_exists_in_path("vim") or
      end ,
   wanted =
      function ()
         local editor = os.getenv("EDITOR")
         if editor and
            not (string.find(editor, "vim") or
                 string.find(editor, "gvim")) then
            return false
         return true

reply via email to

[Prev in Thread] Current Thread [Next in Thread]