ターミナルで SVN 制御のフォルダー リストを異なる色で表示する方法はありますか? 「ls」のエイリアスのようなものです。つまり、「ls」と入力すると、たとえば「.svn」サブフォルダーを持つすべてのフォルダーが黄色になるのでしょうか?
ありがとうございます。(愚かな質問だったらごめんなさい。)
答え1
これを行うにはラッパーが必要になりますls
。
下記にそのようなラッパーを書きました...
基本的な仕組み:
ls -F
/
ディレクトリには検出可能なサフィックスが付くことが保証されるため、強制されます。- ディレクトリの名前をその場所に解決するには、現在のディレクトリ、または最初のダッシュ以外の引数 (ターゲット ディレクトリであると想定) のいずれかが使用されます。
- 前景色/背景色は、各行の最初の数字セットを使用して実現されます。XTerm スタイルの数字は 3 桁なので、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;
}