Хотите раскрасить среду терминала и оболочки?

Хотите раскрасить среду терминала и оболочки?

Я провожу большую часть времени, работая в средах Unix и используя эмуляторы терминала. Я стараюсь использовать цвет в командной строке, потому что цвет делает вывод более полезным и интуитивным.

Какие существуют варианты добавления цвета в мою терминальную среду? Какие приемы вы используете? С какими подводными камнями вы столкнулись?

К сожалению, поддержка цвета зависит от типа терминала, ОС, настроек TERM, утилиты, некорректных реализаций и т. д.

Вот несколько советов из моей установки, полученных после множества экспериментов:

  1. Я предпочитаю устанавливать TERM=xterm-color, который поддерживается на большинстве хостов (но не на всех).
  2. Я работаю на нескольких разных хостах, с разными версиями ОС и т. д. Я использую все: macOS X, Ubuntu Linux, RHEL/CentOS/Scientific Linux и FreeBSD. Я стараюсь делать вещи простыми и общими, если это возможно.
  3. Я выполняю большую часть работы с помощью GNU screen, что добавляет еще больше удовольствия.
  4. Многие ОС устанавливают такие вещи, как dircolorsи по умолчанию, и я не хочу изменять это на сотне разных хостов. Поэтому я стараюсь придерживаться значений по умолчанию. Вместо этого я настраиваю цветовую конфигурацию своего терминала.
  5. Используйте цвет для некоторыхКоманды Unix( ls, grep, less, vim) иBash-приглашение. Похоже, эти команды используют стандартный "Escape-последовательности ANSI". Например:

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

Я опубликую свой .bashrcвопрос и отвечу на него в стиле Jeopardy.

решение1

Вот несколько вещей, которые вы можете сделать:

Редакторы + Код
Многие редакторы поддерживают подсветку синтаксиса vimи emacsвключают ее по умолчанию. Вы также можетевключить его подnano.

Вы также можете подсветить синтаксис кода на терминале, используяПигментыкак инструмент командной строки.

грэп
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может быть полезно)

ПС1
Вы можете настроить 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"

Также обратите внимание, что эти ^[s должны быть фактическими, буквальными ^[s. Вы можете ввести их, нажав ^V^[ в bash, то есть Ctrl+ V, Ctrl+ [.

решение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) вызывает скрипт python в моем ~/sbin, который выводит информацию о текущем пути управления версиями. Он включает поддержку Mercurial, Git, Svn, Cvs и т. д. Автор скрипта имеетисточник здесь.

Скриншот командной строки Bash

Этополный источникмоей конфигурации подсказки:

решение3

grepи lsуже упоминались, если вы хотите больше цветов, посмотритеУниверсальный колоризатор, его первоначальной целью было раскрашивание файлов журналов, но прямо из коробки он также раскрашивает ping, traceroute, gcc, make, netstat, diff, last, ldapи cvs.

Его легко расширить, если вы знаете регулярные выражения. Я добавил psи nmapв список (если вы войдете, grcя буду более чем рад поделиться файлами .conf для этих двух инструментов)

(Кстати, чтобы установить его через 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 -; }

Цвета длягрэп( 1;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 ls:

# 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;

Цвета дляприглашение bash:

# 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

Связанный контент