猫のように髪、尾などをどのように着色できますか?

猫のように髪、尾などをどのように着色できますか?

他の人のおかげで、私の「カラー猫」はうまくいきます
(参照未知のファイル形式を含む猫の出力を白黒で色付けする方法は?)。

.bashrc:

cdc() {
  for fn in "$@"; do
  source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn;
  done
}
alias cat='cdc' # To be next to the cdc definition above.

頭、尾などの他の機能にもこの技術を使用できることを願っています。

4つの機能すべてに対してこれをどのように実行できますか?答えを一般化する方法はありますか?

gd選択して使用できます。git diff

gd() { 
   git diff -r --color=always "$@"
}

ベストアンサー1

次のタスクが必要なタスクを実行する必要があります。

for cmd in cat head tail; do
  cmdLoc=$(type $cmd | awk '{print $3}')
  eval "
    $cmd() { 
      for fn in \"\$@\"; do 
        source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | 
            $cmdLoc - 
      done 
    }
  "
done

次のように圧縮できます。

for cmd in cat head tail; do
    cmdLoc=$(type $cmd |& awk '{print $3}')
    eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done

はい

上記の内容をというシェルスクリプトに入れますtst_ccmds.bash

#!/bin/bash

for cmd in cat head tail; do
    cmdLoc=$(type $cmd |& awk '{print $3}')
  eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done

type cat
type head
type tail

これを実行すると、要求どおりに機能が設定されます。

$ ./tst_ccmds.bash
cat () 
{ 
    for fn in "$@";
    do
        source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /bin/cat - ;
    done
}
head is a function
head () 
{ 
    for fn in "$@";
    do
        source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/head - ;
    done
}
tail is a function
tail () 
{ 
    for fn in "$@";
    do
        source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/tail -;
    done
}

行動中

shell() でこれらの関数を使用すると、source ./tst_ccmds.bash次のように動作します。

猫SS

SS章

テールSS

プレーンテキスト

テキストSS

どのようなヒントがありますか?

最大のトリック(私はそれをハッキングと呼ぶことを好む)は、パイプの引数としてダッシュ()を使用してパイプの-STDINからの内容を出力することです。この時点で:catheadtailsource-highlight

...STDOUT -i "$fn" | /usr/bin/head - ....

--failsafeもう1つの秘訣は、次のオプションを使用することですsource-highlight

   --failsafe
          if no language definition is found for the input, it  is  simply
          copied to the output

つまり、言語定義が見つからない場合は、cat単にその入力を標準出力にコピーするかのように動作します。

エイリアスに関する注意

headtailまたはがエイリアスの場合、cat呼び出しの結果typeは実行可能ファイルを指していないため、関数は失敗します。エイリアスと一緒にこの関数を使用する必要がある場合 (たとえば、色付けにlessrequire-Rフラグを使用する場合)、エイリアスを削除し、別名コマンドを別々に追加する必要があります。

less(){
     for fn in "$@"; do 
       source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" |
          /usr/bin/less -R || /usr/bin/less -R "$fn"; done
}

おすすめ記事