Colorize filename according to svn status

后端 未结 2 866
自闭症患者
自闭症患者 2021-01-17 10:07

When invoking ls, I would like to have file names with a different color depending on their subversion status. For example, an added file will be cyan, a modifi

2条回答
  •  醉梦人生
    2021-01-17 10:39

    As far as I know, it is not possible to achieve that with pure bash (scripting aside).

    You can quite easily get colorised file listing using scripts (bash, python, perl, whatever your poison). Here's a rather crude proof-of-concept implementation written in python : https://gist.github.com/776093

    #!/usr/bin/env python
    import re
    from subprocess import Popen, PIPE
    
    colormap = {
        "M" : "31", # red
        "?" : "37;41", # grey
        "A" : "32", # green
        "X" : "33", # yellow
        "C" : "30;41", # black on red
        "-" : "31", # red
        "D" : "31;1", # bold red
        "+" : "32", # green
    }
    re_svnout = re.compile(r'(.)\s+(.+)$')
    file_status = {}
    
    
    def colorise(line, key):
        if key in colormap.keys():
            return "\001\033[%sm%s\033[m\002" % (colormap[key], line)
        else:
            return line
    
    def get_svn_status():
        cmd = "svn status"
        output = Popen(cmd, shell=True, stdout=PIPE)
        for line in output.stdout:
            match = re_svnout.match(line)
            if match:
                status, f = match.group(1), match.group(2)
    
                # if sub directory has changes, mark it as modified
                if "/" in f:
                    f = f.split("/")[0]
                    status = "M"
    
                file_status[f] = status
    
    if __name__ == "__main__":
        get_svn_status()
        for L in Popen("ls", shell=True, stdout=PIPE).stdout:
            line = L.strip()
            status = file_status.get(line, False)
            print colorise(line, status)
    

提交回复
热议问题