altera a formatação de prompt baseada em cwd

5

Eu uso o tcsh. Gostaria de ter minha formatação de prompt (coloração / realce) alterada com base no diretório em que estou, ou em outros aspectos críticos do meu ambiente.

Eu não sou o suficiente de um hacker para saber como fazer isso.

Propriedade do diretório atual

Se eu estiver em um dos diretórios "meus" (ou seja, sou proprietário do diretório de trabalho atual), ele deverá ter aparência normal. Mas se eu estiver no diretório de outra pessoa (eu faço muito suporte e cd para as áreas de trabalho dos outros), então eu quero que o prompt pareça claramente diferente.

Isso é para lembrar-me de não digitar comandos impolitos nos diretórios de outros. (pense em make clobber ou p4 sync , etc.)

Configuração variável de ambiente crítico

Outra informação importante para o meu ambiente é se uma determinada variável de ambiente está configurada, chame-a de SWDEV. Se o SWDEV não estiver configurado, então meus scripts e fluxos vêm de sua localização padrão. Mas se essa variável for definida, ela será considerada um novo local raiz para meus scripts e fluxos, com comportamentos que mudam de acordo com os scripts nesse local.

É importante ser lembrado da configuração dessa variável, para que eu não espere um comportamento "normal", mas, ao invés disso, execute código a partir do novo local.

    
por Winston Smith 15.05.2013 / 02:08

3 respostas

2

Eu não descobri como fazer isso nativamente no shell (tcsh), mas resolvi o problema usando um script Perl.

Com um script Perl, você pode ter a lógica tão sofisticada quanto desejar para verificar se você possui o $ cwd, quais variáveis de ambiente estão definidas, etc. Em seguida, faça com que o script imprima a string de prompt desejada.

tcsh tem um alias especial precmd que é executado toda vez antes de o prompt ser impresso. Então, ter um script Perl "formatPrompt.pl"

#!/home/utils/perl-5.8.8/bin/perl

use strict;
use warnings;

use Cwd;
# "SWDEV" is an env var special to our environment. Want to be reminded in the prompt of its setting.
use Env qw(SWDEV prompt);

my $prompt = '%U{%m}%~%u> ';
my $prefix = '';

if (defined $SWDEV) {
    # set a prompt prefix if special env var is set. use "Boldface" highlighting.
    $prefix = "%Bspecial env var SWDEV=$SWDEV%b\n";
}
if (! -o getcwd) {
    # change the highlighting of the prompt if not your dir.
    $prompt = '%U{%m}-->%~<--%u> ';
}
$prompt = $prefix . $prompt;
print $prompt;

exit 0;

e um alias definido como

% alias precmd
set prompt="'perl /home/source/perl/formatPrompt.pl'"

pode produzir

{o-xterm-62}~> setenv SWDEV "/some/special/env/var/value"
special env var SWDEV=/some/special/env/var/value
{o-xterm-62}~> cd /usr
special env var SWDEV=/some/special/env/var/value
{o-xterm-62}-->/usr<--> unsetenv SWDEV
{o-xterm-62}-->/usr<--> cd ~
{o-xterm-62}~>

(Observe que, se SWDEV for definido, seu valor será impresso e o cWd será circundado por - > cwd < - se o diretório não pertencer ao usuário. Tente outro realce de prompt, como% S% ~% s também.)

    
por 04.02.2014 / 03:01
2

Bem, se um script externo é uma solução aceitável, você poderia fazer algo assim:

#!/usr/bin/env perl 
use Cwd;
my $cwd=getcwd();
$cwd =~ /$ENV{HOME}/ ? 
             print "$cwd % " : 
             print "%{3[1;31m%}CAREFUL\\!%{3[0m%} $cwd % ";

Salve isso em algum lugar em $PATH as make_prompt.pl e torne-o executável. E, em seguida, no seu ~/.tcshrc :

alias precmd 'set prompt="'make_prompt.pl'"'

Isso resultará em:

Vocêtambémpodeadicionarmaiscondiçõesparaalteraropromptdemaneirasespecíficasemdiretóriosdiferentes:

#!/usr/bin/envperluseCwd;my$cwd=getcwd();##Herearesomecolorstochoosefrommy$red="%{3[1;31m%}";
my $green="%{3[0;32m%}";
my $yellow="%{3[1;33m%}";
my $blue="%{3[1;34m%}";
my $magenta="%{3[1;35m%}";
my $cyan="%{3[1;36m%}";
my $white="%{3[0;37m%}";
## This resets the color, you need it after each color command
my $end="%{3[0m%}";


## If you are in $HOME or one of its sub dirs, print a green prompt
if($cwd =~ /$ENV{HOME}/){
   print "$green$cwd$end % ";
}
## If you are in /usr or one of its sub dirs, print a red prompt
elsif($cwd=~ /\/usr/){
   print "$red$cwd$end % ";
}
## If you are in /etc or one of its sub dirs, print a blue prompt
elsif($cwd=~/\/etc/){
    print "$blue$cwd$end % ";
}
## If you're in /root. As you can see, colors can be combined
elsif($cwd=~/\/root/){
    print $red . "OY\! You're not allowed in here\!" . 
          $end . $magenta . " $cwd$end % ";

}
## For wherever else, just print a plain prompt
else {
    print "$cwd % ";
}
    
por 06.02.2014 / 13:33
1

Por diversão eu forneço outro protótipo, baseado no que eu vi os outros aqui, usando simples if declarações; make_prompt :

#!/bin/tcsh

set     red="%{3[1;31m%}"
set   green="%{3[1;32m%}"
set  yellow="%{3[1;33m%}"
set    blue="%{3[1;34m%}"
set magenta="%{3[1;35m%}"
set    cyan="%{3[1;36m%}"
set   white="%{3[0;37m%}"
set     end="%{3[0m%}" 

if ("$dirstack[1]" == "/") then
  echo " ${blue}r${magenta}o${cyan}o${green}t${end} "
else if ("$dirstack[1]" =~ "/home/thisguy*") then
  echo " ${yellow}Watch this guy out\!${end} "
else if ("$dirstack[1]" =~ "/hom*") then
  echo " ${red}Be mindful of the home dir\!${end} "
else if ("$dirstack[1]" =~ "/usr*") then
  echo " ${magenta}You're in /usr now\!${end} "
else if ("$dirstack[1]" =~ "/etc*") then
  echo " ${green}-=etc=-${end} "
endif

Com o bit que entra em .tcshrc , optando por usar rprompt em vez de prompt para alinhar automaticamente as informações à direita:

alias precmd 'set rprompt="'if "$?" == 0 echo "\(ok\)"''if "$?" == 1  echo "\(err\)"''if ("$?" != 0 && "$?" != 1) echo "\($?\)"''make_prompt'"'

Também é adicionada uma indicação simples do status de saída do último comando (ok = 0, err = 1, $? para qualquer outra coisa).

A limitação é que uma ordem específica é necessária (do específico ao geral) ao criar mensagens personalizadas no script para diretórios que são objetos dentro de outros, por exemplo, /home/thisguy vs. /home here.

    
por 08.02.2014 / 08:55

Tags