Colorindo seu terminal e ambiente shell?

Colorindo seu terminal e ambiente shell?

Passo a maior parte do tempo trabalhando em ambientes Unix e usando emuladores de terminal. Tento usar cores na linha de comando, porque as cores tornam a saída mais útil e intuitiva.

Quais opções existem para adicionar cor ao meu ambiente de terminal? Que truques você usa? Que armadilhas você encontrou?

Infelizmente, o suporte para cores varia dependendo do tipo de terminal, sistema operacional, configuração TERM, utilitário, implementações com bugs, etc.

Aqui estão algumas dicas da minha configuração, depois de muita experimentação:

  1. Costumo definir TERM=xterm-color, que é compatível com a maioria dos hosts (mas não todos).
  2. Eu trabalho em vários hosts diferentes, diferentes versões de sistemas operacionais, etc. Eu uso tudo, desde macOS X, Ubuntu Linux, RHEL/CentOS/Scientific Linux e FreeBSD. Estou tentando manter as coisas simples e genéricas, se possível.
  3. Eu faço muito trabalho usando GNU screen, o que adiciona outra camada de diversão.
  4. Muitos sistemas operacionais definem coisas como dircolorse por padrão, e não quero modificar isso em cem hosts diferentes. Então tento manter os padrões. Em vez disso, ajusto a configuração de cores do meu terminal.
  5. Use cores para algunsComandos Unix( ls, grep, less, vim) e aPrompt de bash. Esses comandos parecem usar o padrão "Sequências de escape ANSI". Por exemplo:

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

Vou postar .bashrce responder minha própria pergunta Jeopardy Style.

Responder1

Aqui estão algumas coisas que você pode fazer:

Editores + Código
Muitos editores têm suporte para realce de sintaxe. vime emacsativá-lo por padrão. Você também podeative-o emnano.

Você também pode realçar a sintaxe do código no terminal usandoPigmentoscomo uma ferramenta de linha de comando.

grep
grep --color=autodestaca todas as partidas. Você também pode usar export GREP_OPTIONS='--color=auto'para torná-lo persistente sem um alias. Se você usar --color=always, vaiuse cor mesmo quando estiver tubulando, o que confunde as coisas.

eu

ls --color=always

Cores especificadas por:

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

(dica: dircolorspode ser útil)

PS1
Você pode configurar seu PS1 (shell prompt) para usar cores. Por exemplo:

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

Produzirá um PS1 como:

[amarelo]lucas@ubuntu: [vermelho]~[normal]$

Você pode ser realmente criativo com isso. Como ideia:

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

Coloca uma barra no topo do seu terminal com algumas informações aleatórias. (Para obter melhores resultados, use também alias clear="echo -e '\e[2J\n\n'".)

Livrar-se das sequências de fuga

Se algo travar na saída de cor quando você não deseja, uso esta sedlinha para remover as sequências de escape:

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

Se quiser uma experiência mais autêntica, você também pode se livrar das linhas que começam com \e[8m, que instrui o terminal a ocultar o texto. (Não é amplamente suportado.)

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

Observe também que esses ^[s devem ser ^[s reais e literais. Você pode digitá-los pressionando ^V^[ no bash, ou seja Ctrl, + V, Ctrl+ [.

Responder2

Eu também uso:

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

E se você gosta de colorir seu prompt, vars de cores definidas podem ser úteis:

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'

E então meu prompt é mais ou menos assim:

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) está chamando um script python em meu ~/sbin que imprime informações de controle de versão sobre o caminho atual. Inclui suporte para Mercurial, Git, Svn, Cvs, etc. O autor do script tem ofonte aqui.

Captura de tela do prompt do Bash

Isto é ofonte completada minha configuração de prompt:

Responder3

grepe lsjá foram mencionados, se quiserem muito mais cores confiramColorizador genérico, seu objetivo inicial era colorir arquivos de log, mas imediatamente ele também colore ping, traceroute, gcc, make, netstat, diff, last, ldap, e cvs.

É facilmente estendido se você conhece regexes. Eu adicionei pse nmapà lista (se você entrar, grcficarei feliz em compartilhar os arquivos .conf para essas duas ferramentas)

(Aliás, para instalá-lo via synaptic, pacman, e similares, você pode ter mais sorte procurando por "grc")

Responder4

Cores parapáginas de manual(Mais detalhes):

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

Cores paragrep( 1;32é verde brilhante, veja outros posts aqui para outras cores):

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'

Usar LC_ALL=Cfor fgrep pode fornecer umAumento de desempenho de 140x

Mais cores paraGNU 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

Instalargrc(Colorizante Genérico) e adicione-o aos seus aliases:

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

Cores paradiferença: Muito conteúdo para uma função, use um script e coloque um alias em seu arquivo rc (desnecessário se você instalou 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;

Cores paraprompt do 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

demonstração do prompt do bash

informação relacionada