端末とシェル環境に色を付けますか?

端末とシェル環境に色を付けますか?

私はほとんどの時間をUnix環境で作業し、端末エミュレータを使用します。色が出力をより便利で直感的にするので、コマンドラインで色を使用したいと思います。

端末環境に色を追加するにはどのようなオプションがありますか?どの技術を使用していますか?どの罠に直面しましたか?

残念ながら、色のサポートは、端末の種類、オペレーティングシステム、用語の設定、ユーティリティ、バグの実装などによって異なります。

多くの実験を行った後、セットアップに関するいくつかのヒントは次のとおりです。

  1. 私はそれを設定しようとしていますが、TERM=xterm-colorほとんどのホスト(すべてではありません)がそれをサポートしています。
  2. 私はさまざまなホスト、さまざまなOSバージョンなどを使用してきました。私はmacOS X、Ubuntu Linux、RHEL / CentOS / Scientific Linux、FreeBSDを含むすべてのオペレーティングシステムを使用しました。私は可能であれば単純で一般的なものを維持しようとします。
  3. 私はGNUを使ってたくさんのことをしているscreenので、これはもう一つの楽しみを追加します。
  4. 多くのオペレーティングシステムにはデフォルトでdircolorsこのようなエントリが設定されており、何百もの異なるホストでそれを変更したくありません。だから私はデフォルト値に固執しようとしています。代わりに、端末の色設定を調整しました。
  5. 特定の部分に色を使用するUnixコマンドls、、、、、)とgreplessvimバッシュプロンプト。このコマンドは標準 "ANSIエスケープシーケンス". 例えば:

    alias less='less --RAW-CONTROL-CHARS'
    export LS_OPTS='--color=auto'
    alias ls='ls ${LS_OPTS}'
    

私は.bashrcJeopardy Styleに関する私の質問を投稿して答えます。

答え1

できることはいくつかあります。

編集+コード
多くのエディタが構文強調をサポートしています。デフォルトで有効にしますvimemacsあなたもできます以下で有効にしてください。nano

次のコマンドを使用して、端末で構文強調コードを使用することもできます。コマンドラインツールとして。

grep
grep --color=autoすべての一致を強調表示します。これを使用して、export GREP_OPTIONS='--color=auto'エイリアシングなしで永続化することもできます。使用すると--color=alwaysそうです。配管時にも色を使用、状況を混乱させる。

エルエス

ls --color=always

カラー仕様:

export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33'

(ヒント:dircolors役に立つかもしれません)

PS1
色を使用するようにPS1(シェルプロンプト)を設定できます。たとえば、

PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '

PS1は次のように製造されます。

[黄色]lucas@ubuntu: [赤]〜[一般]$

これで本当に創造性を発揮できます。アイデアとして:

PS1='\e[s\e[0;0H\e[1;33m\h    \t\n\e[1;32mThis is my computer\e[u[\u@\h:  \w]\$ '

任意の情報を含むバーを端末の上部に配置します。 (最良の結果を得るには、を使用してくださいalias clear="echo -e '\e[2J\n\n'"。)

エスケープシーケンスの削除

不要なカラー出力が中断された場合は、次の行をsed使用してエスケープシーケンスを削除します。

sed "s/\[^[[0-9;]*[a-zA-Z]//gi"

より現実的な経験をしたい場合は、\e[8m端末にテキストを隠すように指示することから始まる行を削除することもできます。 (広くサポートされていません。)

sed "s/^\[^[8m.*$//gi"

また、これらの ^[ は実際の文字通り ^[ でなければなりません。 bashで^ V ^ [(例:Ctrl+ VCtrl+)を押して入力できます[

答え2

私も使用します:

export TERM=xterm-color
export GREP_OPTIONS='--color=auto' GREP_COLOR='1;32'
export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad

プロンプトに色を割り当てるには、定義された色変数が便利です。

export COLOR_NC='\e[0m' # No Color
export COLOR_BLACK='\e[0;30m'
export COLOR_GRAY='\e[1;30m'
export COLOR_RED='\e[0;31m'
export COLOR_LIGHT_RED='\e[1;31m'
export COLOR_GREEN='\e[0;32m'
export COLOR_LIGHT_GREEN='\e[1;32m'
export COLOR_BROWN='\e[0;33m'
export COLOR_YELLOW='\e[1;33m'
export COLOR_BLUE='\e[0;34m'
export COLOR_LIGHT_BLUE='\e[1;34m'
export COLOR_PURPLE='\e[0;35m'
export COLOR_LIGHT_PURPLE='\e[1;35m'
export COLOR_CYAN='\e[0;36m'
export COLOR_LIGHT_CYAN='\e[1;36m'
export COLOR_LIGHT_GRAY='\e[0;37m'
export COLOR_WHITE='\e[1;37m'

それから私のプロンプトは次のようになります。

case $TERM in
     xterm*|rxvt*)
         local TITLEBAR='\[\033]0;\u ${NEW_PWD}\007\]'
          ;;
     *)
         local TITLEBAR=""
          ;;
    esac

local UC=$COLOR_WHITE               # user's color
[ $UID -eq "0" ] && UC=$COLOR_RED   # root's color

PS1="$TITLEBAR\n\[${UC}\]\u \[${COLOR_LIGHT_BLUE}\]\${PWD} \[${COLOR_BLACK}\]\$(vcprompt) \n\[${COLOR_LIGHT_GREEN}\]→\[${COLOR_NC}\] "  

$(vcprompt)は、現在のパスのバージョン管理情報を印刷する〜/ sbinでPythonスクリプトを呼び出しています。 Mercurial、Git、Svn、Cvsなどのサポートが含まれています。スクリプトの作成者は次のとおりです。ソースはこちら

Bashプロンプトのスクリーンショット

これは完全なソースコード私のプロンプトの設定:

答え3

grepそして、ls先ほどお話したように、より多くの色が欲しいなら確認してみてください。ユニバーサルシェーダー、元の目的はログファイルの色を指定することですが、デフォルトでは、、、、、、、、、およびにpingも色が割り当てられます。traceroutegccmakenetstatdifflastldapcvs

正規表現を理解すると簡単に拡張できます。リストにpsおよびを追加しました(サインアップすると、両方のツールの.confファイルを喜んで共有します)。nmapgrc

synaptic(ところで、などを介してインストールするには、pacman「grc」を検索する方が良いかもしれません)

答え4

色はマニュアルページ詳しくは):

function _colorman() {
  env \
    LESS_TERMCAP_mb=$'\e[1;35m' \
    LESS_TERMCAP_md=$'\e[1;34m' \
    LESS_TERMCAP_me=$'\e[0m' \
    LESS_TERMCAP_se=$'\e[0m' \
    LESS_TERMCAP_so=$'\e[7;40m' \
    LESS_TERMCAP_ue=$'\e[0m' \
    LESS_TERMCAP_us=$'\e[1;33m' \
    LESS_TERMCAP_mr=$(tput rev) \
    LESS_TERMCAP_mh=$(tput dim) \
    LESS_TERMCAP_ZN=$(tput ssubm) \
    LESS_TERMCAP_ZV=$(tput rsubm) \
    LESS_TERMCAP_ZO=$(tput ssupm) \
    LESS_TERMCAP_ZW=$(tput rsupm) \
    GROFF_NO_SGR=1 \
      "$@"
}
alias man="LANG=C _colorman man"
function perldoc() { command perldoc -n less "$@" |man -l -; }

色はgrep1;32明るい緑です。他の色については、ここの他の投稿を参照してください):

GREP_OPTS='--color=auto'      # for aliases since $GREP_OPTIONS is deprecated
GREP_COLOR='1;32'             # (legacy) bright green rather than default red
# (new) Matching text in Selected line = green, line numbers dark yellow
GREP_COLORS="ms=${GREP_COLOR}:mc=${GREP_COLOR}:ln=33"
alias grep='grep $GREP_OPTS'
alias egrep='grep -E $GREP_OPTS'
alias fgrep='LC_ALL=C grep -F $GREP_OPTS'

LC_ALL=Cfgrepを使用すると、次の利点が得られます。140倍の性能向上

より多くの色GNU言語:

# use the config at ~/.dircolors if it exists, otherwise generate anew
eval "$( dircolors --sh $(find ~/.dircolors -size +0 2>/dev/null) )"

# Usage: _ls_colors_add BASE NEW [NEW...]
# Have LS color given NEW extensions the way BASE extension is colored
_ls_colors_add() {
  local BASE_COLOR="${LS_COLORS##*:?.$1=}" NEW
  if [ "$LS_COLORS" != "$BASE_COLOR" ]; then
    BASE_COLOR="${BASE_COLOR%%:*}"
    shift
    for NEW in "$@"; do
      if [ "$LS_COLORS" = "${LS_COLORS#*.$NEW=}" ]; then
        LS_COLORS="${LS_COLORS%%:}:*.$NEW=$BASE_COLOR:"
      fi
    done
  fi
  export LS_COLORS
}

_ls_colors_add zip jar xpi            # archives
_ls_colors_add jpg ico JPG PNG webp   # images
_ls_colors_add ogg opus               # audio (opus now included by default)

export CLICOLOR=1   # BSD auto-color trigger (like  ls -G  but for everything)
if ls -ld --color=auto / >/dev/null 2>&1
  then alias ls="ls -ph --color=auto"
  else alias ls="ls -ph"
fi

インストールするgrc一般着色剤)エイリアスに追加します。

if type grc grcat >/dev/null 2>&1; then
  colourify() {  # using this as a function allows easier calling down lower
    if [[ -t 1 || -n "$CLICOLOR_FORCE" ]]
      then ${GRC:-grc} -es --colour=auto "$@"
      else "$@"
    fi
  }

  # loop through known commands plus all those with named conf files
  for cmd in g++ head ld ping6 tail traceroute6 `locate grc/conf.`; do
    cmd="${cmd##*grc/conf.}"  # we want just the command
    type "$cmd" >/dev/null 2>&1 && alias "$cmd"="colourify $cmd"
  done

  # This needs run-time detection. We even fake the 'command not found' error.
  configure() {
    if [[ -x ./configure ]]; then
      colourify ./configure "$@"
    else
      echo "configure: command not found" >&2
      return 127
    fi
  }

  unalias ll 2>/dev/null
  ll() {
    if [[ -n "$CLICOLOR_FORCE" || -t 1 ]]; then  # re-implement --color=auto
      ls -l --color=always "$@" |grcat conf.ls
      return ${PIPESTATUS[0]} ${pipestatus[1]} # exit code of ls via bash or zsh
    fi
    ls -l "$@"
  }
fi

色は違い:関数に内容が多すぎます。スクリプトを使用してrcファイルにエイリアスを指定します(インストールされている場合は必要ありませんgrc)。

#!/usr/bin/perl
use strict;
use warnings;

open (DIFF, "-|", "diff", @ARGV) or die $!;

my $ydiff = 1;
while (<DIFF>) {
  if (not -t 1) {
    print;
    next;
  }
  chomp;
  $ydiff = 0 if /^[ <>\@+-]/ or ($. == 1 && /^\d+[a-z]{1,5}\d+$/);
  my $color = "";
  if (! $ydiff && /^[\@+-<>]/) {
    $color = (/^[<-](?!--$)/ ? 1 : /^[+>]/ ? 2 : 5);
  } elsif ($ydiff && /\t {6}([<|>])(?:\t|$)/) {
    $color = ($1 eq "<" ? 1 : $1 eq ">" ? 2 : 4);
  }
  $color ? printf ("\e[1;3%dm%s\e[0;0m\n",$color,$_) : print "$_\n";
}
close DIFF;

色はバッシュプロンプト:

# Shorten home dir, Cygwin drives, paths that are too long
function PSWD() {
  local p="$*" space A B cols="${COLUMNS:-`tput cols 2>/dev/null || echo 80`}"
  p="${p/$HOME/\~}"         # shrink home down to a tilde
  if [ -d /cygdrive ] && [ "${p#/cygdrive/?/}" != "$p" ]; then
    p="${p:10:1}:${p:11}"   # /cygdrive/c/hi -> c:/hi
  fi
  space="$((${#USER}+${#HOSTNAME}+6))"  # width w/out the path
  if [ "$cols" -lt 60 ]; then echo -n "$N "; space=-29; p="$p$N\b"; fi
  if [ "$cols" -lt "$((space+${#p}+20))" ]; then # < 20 chars for the command
    A=$(( (cols-20-space)/4 ))      # a quarter of the space (-20 for cmd)
    if [ $A -lt 4 ]; then A=4; fi   # 4+ chars from beginning
    B=$(( cols-20-space-A*2 ))      # half (plus rounding) of the space
    if [ $B -lt 8 ]; then B=8; fi   # 8+ chars from end
    p="${p:0:$A}..${p: -$B}"
  fi
  echo "$p"
}

PSC() { printf $'\[\e[%sm\]' "${*:-0;0}"; }
PR="0;32"       # default color used in prompt is green
if [ "$(id -u)" = 0 ]; then
    sudo=41     # root is red background
  elif [ "$USER" != "${SUDO_USER:-$USER}" ]; then
    sudo=31     # not root, not self: red text
  else sudo="$PR"   # standard user color
fi
PROMPT_COMMAND='[ $? = 0 ] && PS1=${PS1[1]} || PS1=${PS1[2]}'
PSbase="$(PSC $sudo)\u$(PSC $PR)@\h $(PSC 33)\$(PSWD \w)"
PS1[1]="$PSbase$(PSC $PR)\$ $(PSC)"
PS1[2]="$PSbase$(PSC  31)\$ $(PSC)"
PS1="${PS1[1]}"
unset sudo PR PSbase

bashプロンプトデモ

関連情報