2007年9月29日星期六

Bash下的自动完成

目录下有个文件名乱码,想要用convmv转换之,convmv需要乱码文件名做为参数,直接输入是不行的,我没有乱码输入法。写个脚本没有问题,以前就做过

有没有更简单的办法呢?

于是想到了WindowsXP的命令行窗口,它的自动完成是以一种称作menu-complete的方式进行的,呵呵,幸亏我刚刚翻译过一篇介绍ipython的文章,里面提到了这种方式,否则,都不知如何去搜索(啊,Google不让Google)。显然,让shell自动为我填上文件名是个不错的主意。

以下就是我的设置:

jack@kubuntu:~$ cat ~/.inputrc
set completion-ignore-case on
"\C-[[Z": menu-complete
第1行配置是说自动完成时忽略大小写,比如我输个a,tab一下,给出的结果可以是Abc.txt或者是abc.txt。

关键是第2行,设定menu-complete的快捷键是shift+tab。我是怎么得到这么个疑似乱码的键名的呢?技巧在这里
cat > tmp
然后按shift+tab,得到^[[Z,这里^表示Ctrol键,使用标准的readline语法表示就是\C-。有点混乱吧,怎么冒出个Ctrol来了呢?反正我就是这样试验成功的,可能是我的keymap有问题?其实我一开始是想用ctrl+tab的,可即使这种方法,也得不到正确的key sequence。

上面我说了“tab一下”,其实在Ubntu,默认是要tab两下的,但的确也有发行版只要tab一下就够了,比如Mandriva。关键的配置是这个:
set show-all-if-ambiguous off
其实说白了就是配置一下readline。建议看一下Bash readline 使用技巧和readline的man页。

不知是幸运还是必然,乱码文件第一个就被选中,转码成功,原来是个“新建 文本文件.txt”。

2007年9月24日星期一

TexLive2007安装手记

TeTex的作者宣布自2006年5月起不再发布新版了,号召大家都去用TexLive。

先去这里下载live (DVD),足有1.8G,建议使用bt方式,FTP方式在我这里估计要下一个礼拜。

我准备把texlive安装到~/opt/texlive:

mkdir ~/opt/texlive
不刻盘了,直接挂载下的ISO文件:
sudo mount -o loop texlive2007-live-20070212.iso /mnt
拷贝几个目录到本地硬盘上:
cp -R /mnt/bin/i386-linux ~/opt/texlive
cp -R /mnt/{texmf,texmf-dist} ~/opt/texlive
chmod u+w ~/opt/texlive/texmf-dist/ls-R
拷贝出来的ls-R文件权限不对,需要手动修改一下

将i386-linux目录加入到$PATH变量:
export PATH=~/opt/texlive/bin/i386-linux:$PATH
安装到此已经基本结束了。你可以运行一下tex来测试:
jackphil@kubuntu:~$ tex
This is TeX, Version 3.141592 (Web2C 7.5.6)
**
输入\relax\bye,按回车查看输出。第1次运行,会自动生成~/.texlive2007目录,用以存放临时文件及用户自己的配置。

查看tex环境的设置:
texconfig conf
中文处理

TexLive2007环境下,关于中文处理你要做的只是用xetex、xelatex分别代替tex和latex。

在你的文章中也需要稍许改变,看下面这个例子foo.tex:
\documentclass[12pt,a4paper]{article}
\usepackage{fontspec}
\usepackage{xunicode}
\usepackage{xltxtra}
\setromanfont{AR PL ShanHeiSun Uni}
\begin{document}
\XeTeX 可以使用系统自带的字体,而不需要再另外生成。
\end{document}
可以看到,我们这里明确指明了使用的字体AR PL ShanHeiSun Uni,这些字体是操作系统环境中的字体,这即是xetex的优点,也是它的缺点。

很明显,我们不必再为Tex环境生成各种编码的中文字体了,如果你看过这个,就知道摆弄Tex字体有多烦人了。缺点是源文件依赖于系统所带的字体,这显然脱离了Tex系统的控制,如果我的Windows上没有安装
AR PL ShanHeiSun Uni,上面的例子就不能在Windows上编译通过了。

Linux下要查看系统中可用字体,可以这样做:
fc-list
你可以这样来编译foo.tex:
xelatex foo.tex
该命令会直接生成pdf文档。

上面的示例来自Ubuntu中文论坛,帖子中还提到了直接使用外部字体文件(该字体不必被安装到Tex或操作系统环境中)的方法。

本文安装部分参考了最简单的 TeXLive CD 安装指南一文。

2007年9月9日星期日

reStructuredText的Emacs支持:保持目录是最新的

保持目录是最新的

这里有个问题是如何维护目录的更新?有一个函数可以帮上忙: rst-toc-insert-update 。 你可以将它添加到节标记调整函数的hook,以后你每次调整一个节标记时,目录也会被自动更新了。 在Emacs配置文件中添加如下内容:

(add-hook 'rst-adjust-hook 'rst-toc-insert-update)

当然也可以显式的呼叫函数了更新当前buffer,快捷键是 C-c p u

2007年9月8日星期六

reStructuredText的Emacs支持:大纲视图

大纲视图

在一份长文档中导航通常是一件困难的事情。为此,特意提供了一个函数,它可以迅速 分析文档,然后将文档的目录结构以缩进的形式在一个临时buffer中展示出来。 在这个临时buffer中,你可以方便的导航,选中一个标题,按回车,就会跳到主文档中 相应的地方。

这个函数就是 rst-toc (快捷键是 C-c p t )。临时buffer看起来 象这样

Table of Contents:
Debugging Meta-Techniques
Introduction
Debugging Solution Patterns
Recognize That a Bug Exists
Subdivide and Isolate
Identify and Verify Assumptions
Use a Tool for Introspection
Change one thing at a time
Learn about the System
Understanding a bug
The Basic Steps in Debugging
Attitude
Bad Feelings
Good Feelings
References

选中一个节标题后,临时buffer会消失(译按:但窗口还在),光标停留在 文档中相应节标题的最左端。

插入目录

一份较长的文档开头通常会有一个目录。就象你在互联网上大多数FAQs中 看到的那样。对于 reStructuredText 文档,目录由分析器根据指令 .. contents:: 自动生成,人们通常并不会在源文档中再添加纯文本目录,因为编辑和维护它都是件很麻烦的事。

但是Emacs的 reStructuredText 插件提供了一个函数,可以在文档中插入这样的目录。 注意纯文本目录不应该成为文档的主体内容之一,你需要把它放在注释中,这样就可以被分析器忽略了。 以下是最常见的用法:

. contents::
..
1 Introduction
2 Debugging Solution Patterns
2.1 Recognize That a Bug Exists
2.2 Subdivide and Isolate
2.3 Identify and Verify Assumptions
2.4 Use a Tool for Introspection
2.5 Change one thing at a time
2.6 Learn about the System
3 Understanding a bug
4 The Basic Steps in Debugging
5 Attitude
5.1 Bad Feelings
5.2 Good Feelings
6 References

可以使用快捷键 C-c p i 来呼叫这个函数,目录会从当前光标处开始插入。 目录的内容是在插入点所在节中(译注:插入点必须在某一节中)级别更低的所有节标题。 这样你就可以(在合适的地方)方便地插入本节的局部目录。

如果你的节标题嵌套很深,可以使用数字前缀来限定显示的目录深度。

下面的变量通常用来定制目录的显示:rst-toc-indent, rst-toc-insert-style, rst-toc-insert-max-level

2007年9月5日星期三

reStructuredText的Emacs支持:查看节标记的层次

想知道当前文档中各个级别的节标记到底使用什么符号也很简单: 呼叫rst-display-decorations-hierarchy 函数就可以了,快捷键是 C-c p h 。在一个临时buffer中会显示表示标题级别的节标题以及相应的 节标记。通常在编辑别人的文档时用来查询某个节标记符号是什么级别。

2007年9月4日星期二

ACPI问题,DSDT解决

如果你的系统有电源管理方面的问题,比如关机、挂起,笔记本电池等等, 或者是硬件传感器方面的问题,如CPU温度检测,风扇状态控制等,你可以考虑一下 是否是你的ACPI(Advanced Configuration and Power Interface)出了问题。

快速应用

  • 我们需要一个软件来处理dsdt,Intel提供了一个工具叫做 iasl(下载的是较小的 Unix Build Environment):

    sudo apt-get install bison flex-old
    make

    生成的可执行文件iasl,可以拷贝出来单独使用。

  • 得到系统当前使用的dsdt,生成asl文件dsdt.dsl:

    sudo cat /proc/acpi/dsdt > dsdt.dat
    iasl -d dsdt.dat
  • 编译dsdt.dsl文件:

    iasl -sa dsdt.dsl

    根据输出的Error,Warning信息修改dsdt.dsl文件,再次编译,直到 0 Errors, 0 Warnings

  • 使用新的dsdt.aml代替BIOS中的版本:

    cp /boot/initrd.img-2.6.20-16-generic /boot/initrd.img-2.6.20-16-generic-bak
    sudo cp dsdt.aml /etc/initramfs-tools/DSDT.aml
    sudo update-initramfs -u -k all

常见DSDT语法

在实例讲解怎样出错之前,我们先来了解一下DSDT文件的语法

  • Name (SWIT, One)

    One对象有了个新名字SWIT

  • Store (0x02, Local0)

    将0x02存储到Local0标示的一段内存中。

  • Method (INCS, 1, NotSerialized)

    定义一个函数INCS,INCS带1个参数等等。函数名也可以是规范中定义的一个对象名。

  • Multiply (Local0, 0x04, Local1)

    Local0中的数据乘以0x04,结果保存在Local1

  • CreateDWordField (BUF1, Local2, CAPB)

    为标示为BUF1的一段内存中第Local2个字节开始的4个字节(Dword:Double word)命名为CAPB

  • And (CAPB, 0xFFFFFFFC, CAPB)

    将CAPB中的值和0xFFFFFFFC按位与后,保存在CAPB中

DSDT的修改

这是一件令人头痛的事,我所能做的,只是依据编译时的错误(警告)信息,参考 《ACPI规范》 , 做一些语法上的修正。

  • 错误信息:

    dsdt.dsl   323:             Method (_CST, 0, NotSerialized)
    Warning 1086 - ^ Not all control paths return a value (_CST)

    查看323行开始的一段代码:

    Method (_CST, 0, NotSerialized)
    {
    If (CSMD) {}
    Else
    {
    ...
    }
    }

    很明显,意思是说if分句中没有返回值。

  • 错误信息:

    dsdt.dsl 1177: Method (_OSC, 5, NotSerialized)
    Warning 1075 - ^ Reserved method has too many arguments
    (_OSC requires 4)

    很清楚,_OSC的参数是4个,把Method中的5改作4即可。

  • 错误信息:

    dsdt.dsl 1191: CreateDWordField (BUF1, Local2, CAPB)
    Error 4111 - Creating a named object in a While loop ^

    这是个新修正的 bug ,命名对象BUF1不能用在一个while循环里。我用老版本的iasl
    编译并无此错,而可能关键的问题就是这个。我不知道该怎么修复这个问题。

  • 错误信息:

    dsdt.dsl  1193:                             And (CAPB, 0xFFFFFFFC)
    Warning 1104 - ^ Result is not used, operator has no effect

    查阅规范,And还可有第3个参数,用以存放比较后的值,我直接改为:

    And (CAPB, 0xFFFFFFFC, CAPB)

    我完全没把握这个改动是否恰当,因为它改变了内存中CAPB标示的一段内容

  • 错误信息:

    dsdt.dsl 1935: Method (INCS, 1, NotSerialized)
    Warning 1086 - ^ Not all control paths return a value (INCS)

    查看相应的代码:

    Method (INCS, 1, NotSerialized)
    {
    If (...)
    {...}
    ...
    IF (...)
    {...}
    }

    这里的错误是,如果所有If都不满足,Method将没有返回值。因为我不知道前面的If中为什么是那些值,我在最后添加了个Return(Zero),随便返回了个Zero对象,也不知是否会被正确处理。但至少,编译又少了个Warning

  • 许多Error或Warning是相关连的,解决1个往往连带消除好几个。 比如1个Not all control paths return a value类警告的修正, 会连带消除相关的Reserved method must return a valueCalled method may not always return a value警告

其它一些相关的资源

Gentoo论坛上有个非常详细的 教程

而Ubuntu的 HowTo 则参考了上面的教程。

我在 这里 还发现了一个和我一模一样的dsdt。去它的论坛上 了一下。回说论坛刚被黑过,所有附件都丢失了,估计原始帖除了这个附件,也没有什么实质性内容。

BenQ S73U似乎也有类似问题,而且 它的dsdt 和我的很相像。

一个中文 ACPI论坛 ,没什么人气。

Linux2下 ACPI PCI Hot-Plug 的实现 ,一些概念很名词的讲解

ACPI学习笔记 ,看来是干这行的,牛人。

Linux ACPI Howto ,linux下解决acpi问题的相关知识,和本文一样,有dsdt错误解决示范。

Linux-ready Firmware Developer Kit ,检查firmware(bios)Linux兼容性的工具,提供了可启动盘,不过几乎没有机器可以全部通过的,所以如果有项目没通过,并不意味着有问题。另外,它的源代码也可以参考一下。

acpiscoperead-write everythin 是Windows下两个查看提取各个acpi表、bios信息的工具。这里是我收藏的备份。

后记

当然ACPI还有个操作系统的支持问题。事实上,因为我的神舟L205T总是死不瞑目,关机时不能关闭电源,我开始找寻ACPI问题的解决办法,到现在,编译了自己的dsdt,问题依旧,我看Ubuntu的这个 bug报告 ,难兄难弟还真是不少。现在看来,内核的ACPI支持部分出了问题,可能性更大一点,毕竟MS Windows下关机正常。

(2008-11-19修订)

2007年9月3日星期一

reStructuredText的Emacs支持:节标记调整

rst插件并不彻底分析所有的 reStructuredText 指令, 但它还是能识别节标记并用来构建文档大纲结构。我们所说的节标记就是用来标记节标题 的那些下划线,或者是环绕标题的上下两行。

有一个函数可以为处理这个标记带来很大的方便: rst-adjust (默认绑定键 C-c p aC-c p =C-= )。这个函数就象一把瑞士军刀,可以被反复调用,实际效果 依赖于上下文:

  1. 如果标记不完整,例如:

    My Section Title
    ^^

    调用该命令就会帮你自动完成标记中剩余的部分。 你可以只输入节标记的开头然后调用这个函数来 补全。它也在你修改标题后被用来重新调整节标记的长度。

  2. 如果光标位置没有节标记,就添加一个。级别和上一个节标记相同。

  3. 如果节标记已经存在, 它的级别会被提升,如果反复调用,就会在当前存在的所有标题级别中循环。

如果在调用函数时使用了否定前缀,如 C-- C-= ,就会在标题级别中按反方向循环。 要在节标记的下划线或上下行包围两种风格间切换,你可以使用正规的命令前缀,就象这样 C-u C-= 。更多关于前缀的使用,参见 rst-adjust 的文档。

一次操作多个节的提升或降级

当你在重新编排文档结构的时候,经常会碰到需要一次改变多个节的级别的情况。这和改变 一个节标记的函数(以及绑定到该函数的快捷键)是一样的:你需要做的只是选中一个区域(region), 然后调用 rst-adjust 来提升区域中所有节标记的级别(或降级,如果使用了否定前缀的话)。

使节标记符合你的习惯

如果你在查看别人的文档,发现它使用了陌生的节标记符号,你会想要把它们替换成符合自己 习惯的符号。如果手工一个一个来改的话会很烦人。不要怕,有一个函数可以帮你轻松的完成 这件工作: rst-straighten-decorations (C-c p s)。该命令会影响整个buffer。

定制

你可以将你喜欢的节标记指定给变量 rst-preferred-decorations ,每个人都有他的 偏好。 变量 rst-default-indent 用来设置使用上下行包围风格的节标记时 标题文字缩进几个空格。

2007年9月2日星期日

reStructuredText的Emacs支持:基本设置

我会把Emacs Support for reStructuredText部翻译出来,为Blog充一下数吧


Emacs的所有支持由 rst.el 提供。为了使用它,你需要把rst.el放到 你的emacs的load-path中,然后加载它:

(require 'rst) ;; or (load "rst")

你可以在 rst.el 源代码中找到其它的配置。

接下来你要为那些最常用的命令设置键绑定。 rst.el 提供了一个 标准的text-mode hook函数来做这件事,你可以这样设置:

(add-hook 'text-mode-hook 'rst-text-mode-bindings)

所有的 rst.el 命令都有一个前缀。默认绑定是使用mode-specific-map变量和 p , 例如 C-c p ...