如何在终端中为 SVN 控制的文件夹着色?

如何在终端中为 SVN 控制的文件夹着色?

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

谢谢。(抱歉,这个问题问得很愚蠢。)

答案1

您需要一个包装器ls来完成此操作。

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

它的基本工作原理:

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

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

#!/usr/bin/env perl
# by Kevin Grant ([email protected])
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;
}

相关内容