Difference between revisions of "Pacman 彩色输出 (简体中文)"

From ArchWiki
Jump to: navigation, search
(more translation from english version)
m (另一种选择: rm all traces of [unstable])
Line 51: Line 51:
 
   
 
   
 
  # Repos and colors
 
  # Repos and colors
  repos = {"Core":'32',"Extra":'36',"Testing":'31',"Unstable":'31',"community":'33',"unsupported":'35'}
+
  repos = {"Core":'32',"Extra":'36',"Testing":'31',"community":'33',"unsupported":'35'}
 
   
 
   
 
  def strip_html(buffer):
 
  def strip_html(buffer):

Revision as of 16:03, 14 December 2008

Template:I18n links start Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n links end


让pacman的输出字符带有色彩

现在makepkg的输出已是彩色的了,pacman为什么就不能多彩多姿呢? Gentoo的包管理程序“portage”有一个色彩扩展,您可以参阅此屏幕快照,了解它所增强的可读性。

脚本

用户citral在他的.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' )"
}

上面是最干净的方法。如果你想要作用于整个系统的脚本,用root权限执行:

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

然后用root权限把下面的内容粘贴到:/usr/bin/pacs

 #!/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' )"

上述脚本中的命令名"pacs"可以随意设定,你也可以在.bashrc中alias它。完成后,只需用新命令代替'pacman',其余不变!

另一种选择

另一种选择是使用下面的python脚本,它是先从网上抓取包列表,然后模拟pacman -Ss的形式输出,(加上颜色!)。它能搜索官方包存档以及AUR(包括community和unsupported)。

#!/usr/bin/python

import os
import re
import sys
import urllib2

OFFICIAL_QUERY = "http://archlinux.org/packages/search/\?q="
AUR_QUERY = "http://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)

使用 'acoc'

还有一种可使任意命令能彩色输出的通用方法。 下载 Ruby 小工具 acoc (它需要 term-ansicolortpty。 )。 tpty并不是必需的,但如果没有它,有些程序如“ls”不能在acoc下使用(它们需要从终端开始运行,(这里假终端也可),否则它们会运行异常)

安装相对简单,如下:

$ 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

安装acoc:

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

然后,阅读acoc的INSTALL文件中“Advanced Installation”一节,根据你的喜好配置acoc。 给‘pacman’创建一个链接,因为这是我们之前要做这些的目的。 当acoc能运行时,将下面的内容加到你的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

可能并不完美或特别好,但到目前为止在我这工作得很好。 上面的内容只是让pacman把所有的包名用粗体输出,这样会特别方便。如果你需要更多色彩,可自己修改上述内容。 更多信息请阅读acoc源码中的文档。

链接

论坛帖子

其它选择

在AUR中,Vogo提供的pacman彩色补丁: PKGBUILD