Como colorir pastas controladas pelo SVN no terminal?

Como colorir pastas controladas pelo SVN no terminal?

Existe uma maneira de obter a lista de pastas controladas pelo SVN com cores diferentes no terminal? Como um apelido para "ls". Então, quando digitamos "ls", todas as pastas com uma subpasta ".svn" devem ser amarelas, por exemplo?

Obrigado. (Desculpe se essa é uma pergunta estúpida.)

Responder1

Você precisaria de um invólucro lspara fazer isso.

Eu escrevi um invólucro abaixo ...

Como basicamente funciona:

  • ls -Fé forçado porque é garantido que os diretórios tenham um /sufixo que pode ser detectado.
  • Para resolver o nome de um diretório para sua localização, o diretório atual é usado ou o primeiro argumento sem traço (presume-se que seja um diretório de destino).
  • As cores de primeiro plano/fundo são obtidas usando os primeiros conjuntos de números de cada linha. Os números no estilo XTerm são trigêmeos, então o terceiro e o sexto números são as cores (19 e 85 no meu exemplo). É claro que as cores podem ser alteradas para o que você quiser.
  • Isso depende das versões originais de svnonde .svnestava presente em cada subdiretório. Se você estiver usando a versão mais recente, onde .svnestá presente apenas na parte superior, o script deve mudar para "drill up" de "$root/$dir" até encontrar um diretório pai contendo .svn.

Aqui está todo o meu script (use em vez de lsdiretamente):

#!/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;
}

informação relacionada