
Я провожу большую часть времени, работая в средах Unix и используя эмуляторы терминала. Я стараюсь использовать цвет в командной строке, потому что цвет делает вывод более полезным и интуитивным.
Какие существуют варианты добавления цвета в мою терминальную среду? Какие приемы вы используете? С какими подводными камнями вы столкнулись?
К сожалению, поддержка цвета зависит от типа терминала, ОС, настроек TERM, утилиты, некорректных реализаций и т. д.
Вот несколько советов из моей установки, полученных после множества экспериментов:
- Я предпочитаю устанавливать
TERM=xterm-color
, который поддерживается на большинстве хостов (но не на всех). - Я работаю на нескольких разных хостах, с разными версиями ОС и т. д. Я использую все: macOS X, Ubuntu Linux, RHEL/CentOS/Scientific Linux и FreeBSD. Я стараюсь делать вещи простыми и общими, если это возможно.
- Я выполняю большую часть работы с помощью GNU
screen
, что добавляет еще больше удовольствия. - Многие ОС устанавливают такие вещи, как
dircolors
и по умолчанию, и я не хочу изменять это на сотне разных хостов. Поэтому я стараюсь придерживаться значений по умолчанию. Вместо этого я настраиваю цветовую конфигурацию своего терминала. Используйте цвет для некоторыхКоманды 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 и т. д. Автор скрипта имеетисточник здесь.
Этополный источникмоей конфигурации подсказки:
решение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=C
fgrep может обеспечить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