.dotfilesのソースを強調する基本色を作成するには?

.dotfilesのソースを強調する基本色を作成するには?

通常、これらのファイルをキャプチャするとき

ここに画像の説明を入力してください。

着色しないと読みにくいです。

私はcat次のようにソースハイライトを使用しました。

cdc() {
  for fn in "$@"; do
    source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn
  done; }; alias cat='cdc'

これで、認識されたファイル拡張子(この場合は.sh)に対して次のように生成されます。

ここに画像の説明を入力してください。

ただし、.shがない場合、たとえばそのファイルを呼び出すと、.bash_functions色付けは行われません。ファイル拡張子がわからないからです。

color-highlightカラードットファイル(ドットで始まるファイル)をカラーで取得する方法はありますかsh

ちなみに、これはベースで作られました。未知のファイル形式を含む猫の出力を白黒で色付けする方法は?

man source-higlight以下が表示されますが、どうすればいいかわかりません。

...
--outlang-def=filename
      output language definition file

--outlang-map=filename
      output language map file (default=`outlang.map')

--data-dir=path
      directory where language definition files and language maps are searched for.   If  not  specified
      these files are searched for in the current directory and in the data dir installation directory

--output-dir=path
      output directory

--lang-def=filename
      language definition file

--lang-map=filename
      language map file  (default=`lang.map')

--show-lang-elements=filename
      prints the language elements that are defined

      in the language definition file

--infer-lang
      force to infer source script language (overriding given language specification)

答え1

-s sh$fnドットファイルのように見える場合にのみ指定されます。

cdc() {
  for fn in "$@"; do
    OPTIONS="-f esc"
    case "${fn##*/}" in
      .*) OPTIONS="$OPTIONS -s sh" ;;
    esac
    source-highlight $OPTIONS -i "$fn" 2>/dev/null || \cat "$fn"
  done
}
alias cat=cdc

で追加のカスタムファイル名一致規則を追加できますcase

答え2

八重ヶ市の考えが正しい、たとえ私はそうしますが:

cdc() {
    for path
    do
        command=(source-highlight --out-format=esc -o STDOUT --failsafe)
        case "${path##*/}" in
            .*) command+=(-s sh)
                ;;
        esac
        "${command[@]}" -i "$path"
    done
}
  • --failsafecat言語を検出できないかのように動作します。すべてのエラーを無視するよりもはるかに優れています。
  • 使うコマンドパラメータ配列

答え3

cdc機能を次のように定義します。

cdc() {
    for fn do
        if [[ "${fn##*/}" == .* ]]
        then
            source-highlight --src-lang=sh --out-format=esc -i "$fn"
        else
            source-highlight               --out-format=esc -i "$fn"
        fi 2> /dev/null  ||  /bin/cat "$fn"
    done
}
  • for fn doうん、短縮for fn in "$@"; do
  • ${fn##*/}値を確認$fnし、最初から最後の項目まですべての項目を削除します/。つまり、$fnフルパス名の場合、これはファイル名部分にすぎません。
  • [[ (the_above) == .* ]]ファイル名が.*glob/wildcardパターンと一致することを確認してください。つまり、ファイル名が次から始まることを確認してください。.。この使用法は==内部でのみ機能し、[[ … ]]内部には影響しません[ … ]
  • したがって、$fn「ドットファイル」の場合は、source-highlightその--src-lang=shオプションを使用して実行してください。

    • そうしない妥当な理由がなく、実行中の作業を確実に知っていない限り、必ずシェル変数参照を二重引用符で囲む必要があります。 Unix/Linux ファイル名にはスペースを含めることができます。名前の付いたファイルがあり、そうすると、 foo barそのファイルの内容が表示されます。しかし、(現在のバージョンの関数を使用して) with で実行すると言うと、名前付きファイルを見つけて一般的に問題を引き起こします。だからそれは失敗し、あなたの関数も試してみて、それも失敗します。これを使用すると、スペースを含むファイル名に対してこの方法が機能します。/bin/cat "foo bar"catfoo barcdc "foo bar"cdcsource-highlight-i foo barfoo/bin/cat foo bar"$fn"
    • プログラムcpでは、パラメータリストに書き込むファイルまたはディレクトリの名前を指定する必要があります。これは、ほとんどのプログラムがデフォルトで(特に指定しない限り)標準出力に書き込むルールに関するいくつかの例外の1つです。そう言う必要はなく-o STDOUT、プログラム作成者がなぜこれを指定できるようにしたのか気になります。

    はい、回答から他の質問まですべての内容をコピーしたことがわかります。

  • 明らかに$fnドットファイルではない場合は、source-highlight通常の方法で実行して拡張子を確認してください。
  • 2> /dev/nullはブロック全体に対して実行でき、各ブランチに対して繰り返す必要はありません。|| /bin/cat "$fn"if … then … else … fi

よく。私のバージョンsource-highlight(3.1.7)にはオプション(省略してyaegashiという)があります。私はあなたの質問に含まれているマニュアルページの抜粋にその内容がないことがわかりました。したがって、あなたのバージョンがそのオプションをサポートしていない場合、私の答えはあなたには適していません。 (もちろんyaegashiも同様です。)この場合、バージョン3.1.7(または互換バージョン)をインストールできることを確認する必要があります。--src-lang=LANGUAGE-s LANGUAGEsource-highlightsource-highlightsource-highlight

答え4

ファイル拡張子を表示することに加えて、ソースハイライトには言語を検出するいくつかの異なる方法があります。次のようにシェルスクリプトファイルに注釈を付けることができます。

  1. shabang行:#!/bin/shまたは#!/bin/bashファイルの最初の行に入れます。
  2. # -*- shell -*-Emacsスタイルのファイルタイプコメント:ファイルにor # -*- bash -*-(最初の行を減らす必要はありません)などのコメントを追加します。

もっと入力言語を見つける方法ソースハイライトマニュアルから。

関連情報