Use the Python and vim plug-ins to allow Vim to support multi-Folder comparison,
On Vim's official website, there is a plug-in DirDiff that supports 2 folder comparisons. Link: http://www.vim.org/scripts/script.php? Script_id = 102. However, only two folders are supported. I aligned the research and improved IT TO MAKE IT support comparison of files in Multiple folders.
The basic principle of the DirDiff plug-in is to generate a list of all files in the folders to be compared. Each line of the file corresponds to a file and Its folder. when the folder comparison mode is enabled, the list file will be loaded. When a row is selected, the file path will be parsed, and the corresponding files in different folders will be opened in diff mode for comparison.
For convenience, I will use Python to generate a list of files in this specific format, then start vim and start folder plug-in comparison.
The Python script is as follows:
1 #! /Usr/bin/env python
2 # coding: UTF-8
3
4 import OS, sys, shutil, subprocess
5 from OS import path
6 # Put the files in the directory list in dirlist in a file dictionary filesdict,
7 # The dictionary key is the file name under a directory in dirlist (excluding this directory name ),
8 # value indicates all directories with corresponding keys in dirlist.
9 def getfilesfromdirs (dirlist ):
10 filesdict = {}
11 for onedir in dirlist:
12 onedir = path. realpath (onedir) # canonicalized directory name
13 # process all objects in the target path (including subdirectories)
14 for root, dirs, files in OS. walk (onedir ):
15 # record the directory to which each file name belongs. files with the same name will belong to multiple different directories.
16 # in this way, an inverted index is generated for the file name to the directory where the file is located.
17 for onefile in files:
18 # If the key value of the file name has not been created, create
19 onefile = OS. path. join (root, onefile) [len (onedir):]
20 if onefile not in filesdict:
21 filesdict [onefile] = []
22 filesdict [onefile] + = [onedir]
23 return filesdict
24
25 def vimDirDiffN (diffdirs ):
26 diffbuffer = './vimdirdiffntmpbuffer'
27 filesdict = getfilesfromdirs (diffdirs)
28 fileslines = []
29 for key, values in filesdict. iteritems ():
30 fileslines + = ['file: '+ key +' @ '+', '. join (values)]
31 write2fileline = str (len (diffdirs ))
32 fileslines = '\ n'. join (fileslines)
33 dirsymbol = 'A'
34 for onedir in diffdirs:
35 dirline = '<' + dirsymbol + '>' + '=' + onedir
36 write2fileline + = '\ n' + dirline
37 fileslines = fileslines. replace (onedir, '<' + dirsymbol + '> ')
38 dirsymbol = chr (ord (dirsymbol) + 1)
39 write2fileline + = '\ n \ n' + fileslines
40 fp = open (diffbuffer, 'w ')
41 fp. write (write2fileline)
42 fp. close ()
43 subprocess. Popen ('gvim-c ": dirdiffn' + path. join (OS. getcwd (), diffbuffer) + '"', shell = True)
44
45 if _ name _ = "_ main __":
46 if len (sys. argv)> 2:
47 diffdirs = sys. argv [1:]
48 for index in range (0, len (diffdirs )):
49 diffdirs [index] = path. realpath (diffdirs [index])
50 vimDirDiffN (diffdirs)
51 else:
52 print "Interactive Mode ."
53 diffdirs = raw_input ('input the dirs you want to diff (in List ["A", "B"]): ')
54 if diffdirs = '':
55 diffdirs = ['f:/PYOutput/old', 'f:/PYOutput/new', 'f:/PYOutput/third_merge ']
56 else:
57 diffdirs = eval (diffdirs)
58 for index in range (0, len (diffdirs )):
59 diffdirs [index] = path. realpath (diffdirs [index])
60 vimDirDiffN (diffdirs)
61 raw_input ('Press to exit .')
This script is used to read the list of folders that the user inputs need to compare, scan the file to generate a Comparison List, start vim, and execute the modified multi-Folder comparison plug-in DirDiffN.
There are many modified DirDiffN plug-ins. You can download the. DirDiffN plug-in from the attachment.
Put DirDiffN in the Vim plug-in directory.
Effect preview: