写了两个 elisp 函数

第一个:

(defun c-header (project module)
  "Insert some macro to prevent the header file included multiply"
  (interactive "sWhat's the project name? \nsWhat's the module name? ")
  (let ((p (upcase project)) (m (upcase module)))
    (insert (format "#ifndef %s_%s_HEADER\n" p m))
    (insert (format "#define %s_%s_HEADER\n\n\n\n" p m))
    (insert (format "#endif /* %s_%s_HEADER */\n" p m))
  )
  (let ((l (- (line-number-at-pos) 3)))
    (goto-line l)))

用于自动生成类似这样的 C 语言头文件代码:

#ifndef PM_POINTS_HEADER
#define PM_POINTS_HEADER



#endif /* PM_POINTS_HEADER */

第二个:

(defun gobject-macro (project object)
  "Insert some macroes about gobject"
  (interactive "sWhat's the project name? \nsWhat's the object name? ")
  (let ((P (upcase project)) 
	(O (upcase object))
	(p (downcase project))
	(o (downcase object))
	(pp (capitalize project))
	(oo (capitalize object)))
    (insert (format "#define %s_TYPE_%s (%s_%s_get_type ())\n" P O p o))
    (insert (format "#define %s_%s(object) (G_TYPE_CHECK_INSTANCE_CAST((object), %s_TYPE_%s, %s%s))\n" P O P O pp oo))
    (insert (format "#define %s_%s_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), %s_TYPE_%s, %sClass))\n" P O P O pp oo))
    (insert (format "#define %s_IS_%s(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), %s_TYPE_%s))\n" P O P O))
    (insert (format "#define %s_IS_%s_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), %s_TYPE_%s))\n" P O P O))
    (insert (format "#define %s_%s_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), %s_TYPE_%s, %s%sClass))\n" P O P O pp oo))))

用于生成类似这样的 GObject 类型宏:

#define PM_TYPE_POINTS (pm_points_get_type ())
#define PM_POINTS(object) (G_TYPE_CHECK_INSTANCE_CAST((object), PM_TYPE_POINTS, PmPoints))
#define PM_POINTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PM_TYPE_POINTS, PmClass))
#define PM_IS_POINTS(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), PM_TYPE_POINTS))
#define PM_IS_POINTS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PM_TYPE_POINTS))
#define PM_POINTS_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), PM_TYPE_POINTS, PmPointsClass))

lua 5.1 中的函数常量表大小限制

用 lua 的 table 来构造一份数据文件,这个数据文件包含了43w 多个三维点数据。用 lua 加载该数据文件时,结果出现“constant table overflow”错误。
这个错误是因 lua 的函数最多可以接受包含 2^18 个常量的表。

问:为什么要有这个限制?

曰:是因为 lua 虚拟机是基于寄存器的,而非堆栈。lua 的访问常量表的指令码所占据的寄存器长度为 18 位,因此它最多能接受的常量表大小为 (2^18 -1)。 

问:为啥要基于寄存器来实现虚拟机?

曰:为了快。

问:那我该如何处理元素数量大于 (2^18 -1) 的表?

曰:可将一个大型的表分割为多个子表。

又曰:lua 5.2 将常量表的大小提升到 (2^26 - 1)。

使用 gnuplot 的 ConTeXt 终端

gnuplot 针对许多图形格式提供了相应的输出终端,可这样查看到它们:

$ gnuplot
gnuplot> set term

Available terminal types:
           canvas  HTML Canvas object
              cgm  Computer Graphics Metafile
          context  ConTeXt with MetaFun (for PDF documents)
            corel  EPS format for CorelDRAW
           dpu414  Seiko DPU-414 thermal printer [small medium large]
             dumb  ascii art for anything that prints text
              dxf  dxf-file for AutoCad (default size 120x80)
            eepic  EEPIC -- extended LaTeX picture environment
              emf  Enhanced Metafile format
            emtex  LaTeX picture environment with emTeX specials
         epslatex  LaTeX picture environment using graphicx package
... ...

上面所列举的只是部分输出终端,其中“context”终端是本文所讲述的重点内容。

继续阅读

使用 cloc 统计代码行数

可能大家都知道用 `wc -l` 命令进行代码行数统计,但是它会将代码中的注释、空行所占用的文本行都统计在内。如果想查看一个 tar 包或一个项目目录中“实际”的代码行数并且不愿意自己去写一个脚本来做此类工作,那么可以考虑使用 cloc

cloc 是一个 perl 脚本,它可以统计很多种编程语言的代码文件中的空行、注释以及实际的代 码行数。

示例 1:统计一个 tar 包中的代码行

$ > cloc small-2.0.tar.gz 
      42 text files.
      41 unique files.                              
       4 files ignored.

http://cloc.sourceforge.net v 1.50  T=1.0 s (38.0 files/s, 3451.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               21            435            482           1695
C/C++ Header                     8            102            161            275
m4                               4             18              4            136
make                             4             18             72             29
Bourne Shell                     1              2             20              2
-------------------------------------------------------------------------------
SUM:                            38            575            739           2137
-------------------------------------------------------------------------------

示例 2:统计项目目录中的代码行数

$> cd m2boxtree
$> cloc ./
      68 text files.
      65 unique files.                              
      23 files ignored.

http://cloc.sourceforge.net v 1.50  T=0.5 s (88.0 files/s, 9258.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               17            611             94           2490
C/C++ Header                    14            230            301            381
Bourne Shell                    10             56            155            252
make                             2              3              0             25
Python                           1              4              4             23
-------------------------------------------------------------------------------
SUM:                            44            904            554           3171
-------------------------------------------------------------------------------

在 GNOME 中为 Emacs 交换 Caps 与左 Ctrl 键

用 Emacs 要注意保护左手小拇指……

为了保护左手小拇指,很多人在打调整 Caps 键与左 Ctrl 键的主意,参见:http://emacser.com/capslock.htm

对于 GNOME 用户而言,调换 Caps 键与左 Ctrl 键实际上是件很容易的事情(至少在 GNOME 2.30 中如此),方法是打开“系统->首选项->键盘”的设置对话框,按下图所示进行调整:

TeX 的宏 / 第二集

TeX 宏的参数可被构造为可选的。例如对于宏 \xx,假设它接受一个参数,所谓可选参数,是指 \xx[#1]{...}\xx{...} 这两种宏调用方式都成立。当然,要实现这一目的,需要一些技巧,其中最关键的是掌握 \futurelet 的用法。

继续阅读

TeX 的宏 \ 第一集

以 ‘\’ 为开头的 TeX 命令被称为“控制序列”。如果一个控制序列仅由字母组成,将其称为“控制字”。如果一个控制序列由非字母构成,将其称为“控制符”。对于 TeX 用户使用 \def 定义的新的控制序列,将其称为“宏”。

继续阅读

VUE——功能很强大的 mindmap 软件

vue 是采用 Java 开发的一款开源思维导图软件。

阅读全文

Emacs 23 需要两款字体的支持

昨天,又遇到在 Emacs 23 中无法启用 ibus 的情况。

Gentoo Portage 里给出了这样的提示:

You need to install some fonts for Emacs.
Installing media-fonts/font-adobe-{75,100}dpi on the X server's
machine would satisfy basic Emacs requirements under X11.
See also http://www.gentoo.org/proj/en/lisp/emacs/xft.xml
for how to enable anti-aliased fonts.

发现 Emacs 还真变态。现代一点的文本编辑器有哪个还需要跟字体勾结在一起呢?

跟 Asymptote 认识了一下

在 2010 年初的某一个寒冷的晚上,一个叫做 Garfileo 的人类打开空调之后,开始考虑学习 Asymptote 的事情。这原本是他计划之外的事情。原来的计划是学习 MathGL,不过当他打开了 MathGL 的源码,看到许多类似下面那样的代码,很快就放弃了。

继续阅读