Talk:Pacman (Español)/Tips and tricks (Español)

From ArchWiki

Edición la página

Una página muy importante para mantener.

Voy a realizar una edición rápida de la página que iré mejorando en los siquientes días.


Respaldo para reciclar

Coloreando la salida de pacman

Ahora que makepkg tiene una salida colorizada, ¿por qué no pacman también? El administrador de paquetes en Gentoo llamado 'portage' usa colores ampliamente, y como pueden ver en esta screenshot, se mejora enormemente la legibilidad.

Scripts

El usuario citral usa el siguiente script en su .bashrc:

alias pacs="pacsearch"
pacsearch () {
       echo -e "$(pacman -Ss $@ | sed \
       -e 's#core/.*#\\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 más limpia. Sin embargo, si deseas un script para todo el sistema, ejecuta como root:

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

y copia esto dentro de /usr/bin/pacs también como root:

 #!/bin/bash
 echo -e "$(pacman -Ss $@ | sed \
 -e 's#core/.*#\\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 esas lineas por lo que quieras. Puedes crear tambien un alias de "pacs" por otra cosa en tu .bashrc, como se hizo antes..

El uso de estos comandos es muy sencillo; solo usa tu nuevo comando en vez de 'pacman', el resto sigue siendo lo mismo!

Alternativas

Una alternativa es usar este script en python, que emula la salida de pacman -Ss (¡con colores!) pero obtiene la lista de paquetes eso si desde el sitio web. Busca los repositorios oficiales y AUR (las dos community y unsupported).

#!/usr/bin/python

import os
import re
import sys
import urllib2

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

# Repos and colors
repos = {"Core":'32',"Extra":'36',"Testing":'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)

Usando 'acoc'

Hay otra, una posibilidad más general de colorear arbitrariamente la salida de los comandos. Puedes descargar la pequeña herramienta en Ruby, llamada acoc (y sus dependencias, term-ansicolor y tpty. ). tpty no es realmente requerida, pero algunas aplicaciones como "ls" no funcionan con acoc (necesitan ser iniciadas en la terminal (o pseudo terminal, en este caso), o bien se comportarán diferente).

La instalación es relativamente fácil, aquí hay un paseo rápido:

$ 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 en si:

$ 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 configura acoc como se te plazca. Crea un enlace para 'pacman' también, ya que es principalmente para eso que lo estamos haciendo. Una vez ejecutes acoc, puedes añadir estas lineas a tu 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 no ser perfecto, o particulármente bonito, pero por lo menos funciona bien para mí. Las lineas de arriba solo hacen que pacman imprima todos los nombres de los paquetes en negrita, que es particularmente útil en p.ej. "pacman -Ss xfce". Si lo que quieres son más colores, puedes modificar las lineas a tu gusto. Lee la documentación de acoc contenida en la paquete con las fuentes del programa para más información.

Links

Forum thread

Alternativa

En AUR está disponible un PKGBUILD con el parche para los colores para pacman de Vogo.