Pacman - Colorear la salida

De Arch Linux Comunidad Hispana

Revisión a fecha de 03:41 29 may 2007; Skatox (Discusión | contribuciones)
(dif) ← Revisión anterior | Ver revisión actual (dif) | Revisión siguiente → (dif)

Tabla de contenidos

[editar] Colorear la salida de pacman

Ahora que makepkg tiene salida coloreada, ¿por qué no hacerlo con pacman? El gestor de paquetes de Gentoo llamado 'portage' usa muchos colores y como puedes ver en este screenshot, se ve muy bien.

[editar] Scripts

Se puede usar esta configuración en .bashrc:

alias pacs="pacsearch"
pacsearch () {
       echo -e "$(pacman -Ss $@ | sed \
       -e 's#current/.*#\\033[1;31m&\\033[0;37m#g' \
       -e 's#extra/.*#\\033[0;32m&\\033[0;37m#g' \
       -e 's#community/.*#\\033[1;35m&\\033[0;37m#g' \
       -e 's#^.*/.* [0-9].*#\\033[0;36m&\\033[0;37m#g' )"
}

Que es la solución mas sencilla. Sin embargo, si deseas un script para todo el sistema, hazlo como root:

 touch /usr/bin/pacs && chmod 755 /usr/bin/pacs

y pega esto en /usr/bin/pacs como root:

 #!/bin/bash
 echo -e "$(pacman -Ss $@ | sed \
 -e 's#current/.*#\\033[1;31m&\\033[0;37m#g' \
 -e 's#extra/.*#\\033[0;32m&\\033[0;37m#g' \
 -e 's#community/.*#\\033[1;35m&\\033[0;37m#g' \
 -e 's#^.*/.* [0-9].*#\\033[0;36m&\\033[0;37m#g' )"

Puedes sustituir "pacs" en estas líneas para lo que quieras. También puedes usar alias "pacs" a lo que sea en .bashrc, como se hizo arriba.

Usando estos comandos es muy lineal; simplemente usa este nuevo comando en vez de 'pacman',de resto ¡es lo mismo!

[editar] Alternativas

qpkg en AUR también usa salida colored, busca en AUR y también en TURepositories.

Otra alternativa es usar este script de python, emula la salida de pacman -Ss (¡con color!) pero descarga los paquetes desde la página. Utiliza los repositorios oficiales y AUR (tanto community y unsupported).

#!/usr/bin/python

import os,re,sys,urllib2

OFFICIAL_QUERY = "http://archlinux.org/packages/search/\?q="
AUR_QUERY = "http://aur.archlinux.org/packages.php?K="

# Repos and colors
repos = {"Current":'32',"Extra":'36',"Testing":'31',"Unstable":'31',"community":'33',"unsupported":'35'}

def strip_html(buffer):
    buffer = re.sub('<[^>]*>','',buffer)
    buffer = re.sub('(?m)^[ \t]*','',buffer)
    return buffer

def cut_html(beg,end,buffer):
    buffer = re.sub('(?s).*' + beg,'',buffer)
    buffer = re.sub('(?s)' + end + '.*','',buffer)
    return buffer

class RepoSearch:
    def __init__(self,keyword):
        self.keyword = keyword
        self.results = ''
        for name in ['official','aur']:
            self.get_search_results(name)
            self.parse_results(name)
        self.colorize()

    def get_search_results(self,name):
        if name == "official":
            query = OFFICIAL_QUERY
        elif name == "aur":
            query = AUR_QUERY

        f = urllib2.urlopen( query + self.keyword )
        self.search_results = f.read()
        f.close()

    def preformat(self,header,a,b):
        self.buffer = cut_html('<table class=\"' + header + '\"[^>]*>','</table',self.search_results)
        self.buffer = strip_html(self.buffer)
        self.buffer = self.buffer.split('\n')
        self.buffer = [line for line in self.buffer if line]
        del self.buffer[a:b]

    def parse_results(self,name):
        self.buffer = ''
        if name == 'official':
            if re.search('<table class=\"results\"',self.search_results):
                self.preformat('results',0,6)
            elif re.search('<div class=\"box\">',self.search_results):
                temp = re.search('<h2 class=\"title\">([^<]*)</h2>',self.search_results)
                temp = temp.group(1)
                temp = temp.split()
                self.preformat('listing',7,-1)
                for i in range(0,3): del self.buffer[i]
                for i in temp: self.buffer.insert(temp.index(i) + 2,i)

        elif name == 'aur':
            p = re.compile('<td class=.data[^>]*>')
            self.buffer = self.search_results.split('\n')
            self.buffer = [strip_html(line) for line in self.buffer if p.search(line)]

        l = len(self.buffer)/6
        parsed_buf = ''

        for i in range(l):
            parsed_buf += self.buffer[i*6] + '/'
            parsed_buf += self.buffer[i*6+1] + ' '*(24-len(self.buffer[i*6] + self.buffer[i*6+1]))
            parsed_buf += self.buffer[i*6+2]
            if name == "official":
                parsed_buf += ' ' + self.buffer[i*6+3]
            parsed_buf += '\n' + self.buffer[i*6+4] + '\n'

        self.results += parsed_buf

    def colorize(self):
        for repo,repo_color in repos.iteritems():
            self.results = re.sub(repo + '/.*','\\033[1;' + repo_color + 'm' + '\g<0>' + '\\033[0;0m',self.results)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print "Usage: " + sys.argv[0] + " <keyword>"
        sys.exit(2)
    reposearch = RepoSearch(sys.argv[1])
    sys.stdout.write(reposearch.results)

[editar] Usando 'acoc'

Existe otra manera, con la posibilidad de colorear arbitrariamente la salida. Puedes bajar la pequeña herramienta Ruby acoc (y sus requisitos, term-ansicolor y tpty. ). tpty no es necesario tenerlo, pero algunas aplicaciones como "ls" no corren con acoc (necesitan ser lanzadas desde un termina (ó un pseudo terminal, en este caso), o se comportará de manera diferente).

La instalación es sencilla:

$ tar xvzf tpty-0.0.1.tar.gz
$ cd tpty-0.0.1
$ ruby extconf.rb
$ make
$ ruby ./test.rb
# make install
$ tar xvzf term-ansicolor-1.0.1.tar.gz
$ cd term-ansicolor-1.0.1
# ruby install.rb

Y ahora acoc:

$ tar xvzf acoc-0.7.1.tar.gz
$ cd acoc-0.7.1
# make install

Ahora, solo lee la sección "Advanced Installation" en el archivo INSTALL de acoc y configúralo como tu desees. Create a link for 'pacman' as well, since that's primarily what we're doing this for. Once acoc runs, you can add these lines to your acoc.conf:

[pacman -Si]
/^Name\s+:\s([\w.-]+)/                              bold
[pacman -Qi]
/^Name\s+:\s([\w.-]+)/                              bold
[pacman -Qi$]
/^([\w.-]+)\s([\w.-]+)/                 bold,clear
[pacman -Ss]
/^([\w.-]+)\/([\w.-]+)\s+([\w.-]+)/     clear,bold,clear
[pacman -Qs]
/^([\w.-]+)\/([\w.-]+)\s+([\w.-]+)/     clear,bold,clear
[pacman -Sl]
/^([\w.-]+)\s([\w.-]+)\s([\w.-]+)/              clear,bold,clear
[pacman -Qo]
/^([\w.-\/]+)\sis\sowned\sby\s([\w.-]+)\s([\w.-]+)/     clear,bold,clear
[pacman -Qe$]
/^([\w.-]+)\s([\w.-]+)/                 bold,clear
[pacman -Qg$]
/^([\w.-]+)\s([\w.-]+)/                 clear,bold

Puede que no sea perfecto, pero al parecer funciona bien para muchos. Las líneas de arriba solo hacen que pacman imprima todos los paquetes en negrita, lo cual ayuda por ejemplo al hacer "pacman -Ss xfce". Modifica las líneas como tu quieras.

Herramientas personales