如何在终端上对SVN控制的文件夹进行着色?


1

有没有办法在终端中获得具有不同颜色的SVN控制文件夹列表?就像“ls”的别名。所以当我们输入“ls”时,带有“.svn”子文件夹的所有文件夹都应该是黄色的?

谢谢。(对不起,如果这是一个愚蠢的问题。)


这个链接看起来像你想要的。
Jasonw

@Jasonw:不太好。该链接.svn仅涉及目录,而不是SVN仓库的一部分。
伊格纳西奥·巴斯克斯 - 艾布拉姆斯

这是一个重复的问题。请看这个链接。 stackoverflow.com/questions/4667887 / ...

Answers:


2

你需要一个包装ls来做这件事。

我在下面写了这样一个包装器......

它基本上如何工作:

  • ls -F是强制的,因为目录保证有一个/可以检测到的后缀。
  • 要将目录的名称解析为其位置,请使用当前目录或第一个非破折号参数(假定为目标目录)。
  • 使用每行的第一组数来实现前景/背景颜色。XTerm样式的数字是三元组,因此第3和第6个数字是颜色(在我的示例中为19和85)。颜色当然可以改变为你想要的任何颜色。
  • 这依赖于原始版本svn,其中.svn存在于每一个子目录了。如果您使用的最新版本.svn仅存在于顶部,则脚本应从“$ root / $ dir”更改为“向上钻取”,直到找到包含的父目录为止.svn

这是我的整个脚本(使用而不是ls直接):

#!/usr/bin/env perl
# by Kevin Grant (kevingrant.engineer@gmail.com)
use FileHandle;
my $term = (exists $ENV{'TERM'} && defined $ENV{'TERM'}) ? $ENV{'TERM'} : 'vt100';
my $is_xterm = ($term =~ /xterm/);
my $ifh = new FileHandle("ls -F @ARGV|");
(defined $ifh) or die;
my $root = '.';
foreach (@ARGV) {
  (! /^\-/) and $root = $_; # assume bare argument is the directory being listed
}
foreach (<$ifh>) {
  # 1st is for "ls -l" output (no spaces supported), 2nd is normal "ls" output
  if (m|\s(\S+)/| or m|^([^/]+/)|) {
    my $dir = $1;
    if (-e "$root/$dir/.svn") {
      # has a ".svn" subdirectory; colorize it
      if ($is_xterm) {
        s/\Q${dir}\E/\033[48;5;19;38;5;85m${dir}\033[0m/;
      } else {
        s/\Q${dir}\E/\033[44;36m${dir}\033[0m/;
      }
    }
  }
  print;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.