Shell: Alterando a saída de cores ls se a pasta for Git repo

1

Minha distro é RHEL, então eu tenho uma pasta DIR_COLORS e uma variável LS_COLORS. Eu sei como modificar as cores. Eu também sei como verificar se uma pasta é um repositório do git. O que eu não sei é como alterar a cor do diretório se a pasta for um repositório (o padrão é azul, a pasta do repositório seria roxa ou algo assim).

Aqui está minha tentativa de usar um código sudo ruim

for d in ls
    if git_repo($d)
        LS_COLORS = git_colors
    else
        LS_COLORS = normal
    print ls[$d]

Eu sei que provavelmente não faz sentido "legal", mas espero que você consiga a essência. Eu sei que posso fazê-lo manualmente, ecoando em uma única coluna e alterando manualmente a cor do texto (em teoria), mas eu quero que ele se pareça com um ls normal com várias colunas.

Se há uma maneira melhor, vou aceitar. Eu também quero jogar isso no meu bashrc em uma função para que eu possa alias ls para essa função

    
por Excal 13.07.2018 / 16:58

1 resposta

1

O Git solicita

Em vez de criar o seu próprio aqui, recomendo usar o que é fornecido pelo projeto Git.

Em uma caixa do CentOS 7.x se você tiver yum install git , tudo já está incluso com o Git para fazer tanto a conclusão da linha de comando quanto o prompt do git.

$ rpm -ql git|grep completion
/etc/bash_completion.d
/etc/bash_completion.d/git
/usr/share/doc/git-1.8.3.1/contrib/completion
/usr/share/doc/git-1.8.3.1/contrib/completion/git-completion.bash
/usr/share/doc/git-1.8.3.1/contrib/completion/git-completion.tcsh
/usr/share/doc/git-1.8.3.1/contrib/completion/git-completion.zsh
/usr/share/doc/git-1.8.3.1/contrib/completion/git-prompt.sh
/usr/share/git-core/contrib/completion
/usr/share/git-core/contrib/completion/git-completion.tcsh
/usr/share/git-core/contrib/completion/git-prompt.sh

Aqui estão os passos para fazer isso manualmente, eles precisam adicionar seu ~/.bash_profile para torná-los permanentes.

$ . /usr/share/git-core/contrib/completion/git-prompt.sh
$ mkdir somedir && cd somedir
$ git init
$ PS1="$GREEN\t$RED-$BLUE\u$YELLOW\w\[3[m\]$MAGENTA\$(__git_ps1)$WHITE \$ "

Fazer o acima irá definir o seu pedido para que seja assim:

[root@centos7 somedir]#

-to-

13:18:42-root/home/vagrant/somedir (master) $

OBSERVAÇÃO: agora está exibindo a ramificação que estou atualmente neste repositório, no meu prompt.

Onde estão as cores?

Para obter essa cor, é necessário definir as cores para que a variável PS1 das variáveis de cor do prompt tenha códigos de escape correspondentes às respectivas cores:

RED="\[3[0;31m\]"
YELLOW="\[3[0;33m\]"
GREEN="\[3[0;32m\]"
BLUE="\[3[0;34m\]"
MAGENTA="\[3[0;35m\]"
WHITE="\[3[0;37m\]"

Agora, redefina o PS1 novamente para pegá-los:

13:24:26-root/home/vagrant/somedir (master) $ PS1="$GREEN\t$RED-$BLUE\u$YELLOW\w\[3[m\]$MAGENTA\$(__git_ps1)$WHITE \$ "
13:24:35-root/home/vagrant/somedir (master) $

E vai ficar assim agora:

E que tal mudar a cor de ls ?

Se é provavelmente algo que eu gostaria de desencorajar porque você precisa executar um git status em cada diretório em cada comando ls para determinar se é um repositório do Git ou não.

Imagine isso:

$ ls somedir
dir1
dir2
dir3
dir4
dir5
dir6
dir7

resultaria em 7% degit status de comandos para determinar qual diretório é um repositório do Git e qual não é, para que você possa decidir colori-lo como roxo ou não.

    
por 13.07.2018 / 19:25