Search This Blog

Thursday, October 27, 2005

又对common lisp感兴趣了

前段时间看了点elisp,改了几个函数让它们符合我的习惯,也初步体会到了fp的魅力
不过elisp只针对于emacs,离开了emacs就不行了,于是想学学common lisp了
今天照着水木的帖子把clisp环境搭了起来,先apt-get install cmucl binfmt-support
然后建个bash脚本:
#!/bin/sh
[ $1 ] && lisp -quiet -eval "(compile-file "$1")(quit)"
chmod a+x ${1%.lisp}.x86f

用这个脚本就可以编译.lisp的源程序
还下了几本书,有空好好看看
感觉lisp语言是很有前途的,虽然现在用的人还不算很多
即使不考虑这些,多体验一种编程风格,倒也是可以自娱一下

Wednesday, October 26, 2005

模拟鼠标点击

fvwmbuttons有一个很好的功能是可以把pager啊buttons啊之类的玩意儿收起来,或者再放出来。
以前照着王垠的说明弄过,但是用fvwm就应该发挥它的优势,老是拿鼠标biajibiaji地点岂不是很郁闷?但是那时候我又不知道怎么可以用键盘来控制被buttons作为panel的模块的收放,后来就去掉了,让它们一直放在桌面上好了。
不过今天又想把桌面变得再简洁点,于是想用键盘来实现上面说的功能。
google了几分钟,在fvwm faq上找到答案了:
FakeClick是用来实现键盘模拟鼠标点击事件的,为此可以定义一个函数
AddToFunc Press_FvwmButtons
+ I SetEnv pointer_x $[pointer.x]
+ I SetEnv pointer_y $[pointer.y]
+ I Next ($1, CirculateHit) WarpToWindow $2 $3
+ I FakeClick depth 1 press $0 release $0
+ I WindowId root WarpToWindow $[pointer_x]p $[pointer_y]p

这个函数先把当前鼠标指针的位置保存下来,然后移到指定的FvwmButtons,用FakeClick模拟点击事件后再把指针返回到原来的位置
现在举个例子,假如我有一个FvwmButtons叫MainPanel,它把一个FvwmPage作为一个panel,在MainPanel上点击鼠标 就可以把FvwmPage展开或者收起,然后我可以这样调用Press_FvwmButtons函数:Press_FvwmButtons 1 MainPanel 50 50
其中1表示鼠标的左键,MainPanel就是FvwmButtons的名字,50和50是鼠标指针移动到FvwmButtons的位置比例
这样就可以实现模拟鼠标点击,如果再把Press_FvwmButtons绑定到一个快捷键上,就可以实现用键盘来控制panel的展开或收起

Tuesday, October 25, 2005

教训啊

这次rm了/var/lib下的东西,应该吸取教训了:
.bashrc:
alias rm='rm -i'
这样每次删除都会问一下,虽然是麻烦点,但是总比误操作强
顺便就解决了一下历史遗留问题:
以前照着网上的资料把bash的提示符弄成彩色的了,有两个好处,第一,在输出一大堆信息的时候,往回翻时可以很方便地找到提示符的位置,这样就知道输出的信息是从哪儿开始的了,第二,当然是好看了。
但是之前在我的工作目录很长的时候,命令会超出一屏的长度而自动换行,这时候问题就出来了,当到第二行后,我用left回到上一行会出现定位的问题,具体 也说不清楚,就是很混乱,根本就不知道现在的光标是在哪个字符上。那时候我还以为这是用ascii控制符带来的必然的副作用。
后来一想,怎么可能,这么优秀的软件不会有这种低级bug的,尤其是它经过了这么多年这么多人的考验。于是又找资料,终于发现应该用\[和\]把ascii控制符括起来,这样就告诉bash在计算光标位置的时候把方括号里的内容忽略掉,就不会出现刚才说的混乱的情况了。
顺便提一下,ascrii控制符这样表达:\033[xx;xxm,xx是数字,代表颜色,以及一些乱七八糟的东西,比如下划线之类的

debian的tex包太郁闷了

哦,不是包郁闷,是我郁闷。
前两天tetex升级了,我也没想什么就dist-upgrade了,结果……
tetex-bin就总是装不上。可这是debian啊,它装不上我的apt就老是报错,还影响我装别的包,于是前天就想把它弄好。开始在google 搜,然后又去水木看,都没找到有用的东西,最后……在我想看/var/lib下的东西的时候,实在是懒得打目录了,于是up啊up,up到一个有 /var/lib目录的命令,没看就ret了,然后才发现那个命令是rm……
悲剧就这样发生了,无奈。
昨天把/etc备份了一下,/home本来就在一个单独的分区,重装还挺快的,美化也已经轻车熟路了,然后还是装tetex,又装不上,说是无法删除 /var/lib/texmf/web2c/*fmt,没有这个文件目录,我一看,倒还真是没有。那没有就没有,反正你要删掉的,继续装不就得了,白痴不 白痴么。
然后我就戏弄了它一回,在/var/lib/texmf/web2c/下vim了个123fmt内容是123,保存,再装,这个傻x脚本就高高兴兴地把tetex-bin装上了:(
反正我就是觉得这次包的升级有很多问题,后来也是少很多文件,我根据它的提示一个一个地从网上下,后来才搞定的,弄到5点多才睡,郁闷。
有一个倒是要记一下,就是当fmtutil-sys或者updmap-sys提示找不到配置文件的时候,不妨先texhash一下,应该就能找到了

Saturday, October 15, 2005

关于自动换行显示的问题,也就是truncate

我用ecb,edit窗口我一直是non truncate的,但是不知道那些ecb windows和speedbar window怎么才可以自动换行。于是先从.emacs里把控制edit window的truncate的var找了出来,是truncate-lines,然后C-h v ecb- TAB,这样会出来一个complete window,然后跳进去,C-s,找truncate,果然被我找到了,ecb-tree-truncate-lines和ecb-truncate- long-names,把这两个都设置成nil,发现ecb的d,s等窗口都可以自动换行了,但是speedbar还是不行,找了半天似乎也没有对应的变 量,于是google之,还是没找着,最后发现,先speedbar-get-focus,然后toggle-truncate-lines就可以让 speedbar自动换行,于是写个函数:
(defun my-speedbar-toggle-truncate ()
(interactive)
(speedbar-get-focus)
(toggle-truncate-lines -1)
(speedbar-get-focus))

把my-speedbar-toggle-truncate hook到ecb-activate-hook上就可以让ecb-speedbar自动换行了

Friday, October 14, 2005

今天搞明白了一个困扰已久的问题

我一直在纳闷ecb的speedbar为什么就跟死的一样,非得再另开一个speedbar的frame才会“活”。之前我一直理解为ecb- speedbar只是一个躯壳,需要一个真正的speedbar来驱动它工作。直到今天无意间发现一个函数:ecb-speedbar- activate,才明白原来ecb-speedbar是可以独立工作的,害得我以前还老是另开一个frame :P
只要把ecb-speedbar-activate这个函数hook到ecb-activate-hook上就可以了:)如下:
(add-hook 'ecb-activate-hook 'ecb-speedbar-activate)

又改了一下smart-operator

发现%还是不方便,现在这个版本可以判断当前光标是不是处于引号内部,如果是的话%前后就不加空格了,否则还是加
(defun smart-insert-operator (op &optional only-back)
"Automatically insert whitespaces before and after '=', '>=', etc.
Make it look nicer: ' = ', ' >= '.


OP is the operator. If optional ONLY-BACK is t, only insert one
whitespace at back. When confused, try C-q."
(interactive "s")
(delete-horizontal-space)
(let ((op-p nil) ; another op at front?
(one-char-back nil) ; have we stepped back one char?
(sec-sp nil)
(no-fir-sp nil))
(unless (bolp)
(unless (and (equal op "*") (looking-back "int\|char\|float\|double\|short\|long\|signed\|unsighned\|void\|\("))
(setq sec-sp t))
(if (looking-back "\(")
(setq no-fir-sp t))
(backward-char)
(setq one-char-back t))
(setq op-p
(catch 'return
(dolist (front smart-operator-alist)
(when (looking-at front)
(throw 'return t)))))
(when (and (or op-p (not (and (bolp) (eolp))))
one-char-back)
(forward-char))
(if (equal op ">")
((lambda ()
(while (looking-back " ")
(backward-char))
(if (looking-back "-")
((lambda ()
(setq sec-sp nil)
(setq no-fir-sp t)
(backward-char)
(delete-horizontal-space)
(forward-char)
(delete-horizontal-space)
())))))
())
(if (and (equal op "%") (comint-within-quotes 0 (point)))
((lambda ()
(setq sec-sp nil)
(setq no-fir-sp t)
())))
(if (or op-p only-back no-fir-sp (bolp))
(insert op)
(insert (concat " " op)))
(delete-horizontal-space)
(if sec-sp
(insert " "))))

Wednesday, October 12, 2005

一个elisp函数,smart-operator

这是从一个smart-operator.el里翻出来的,我把它改了一下,更符合我的习惯
原来的smart-insert-operator函数对输入的smart-operator-alist里的运算符都会自动在两边加上空格,但是我不喜 欢->两边有空格,因为我觉得这么一个东西:struct->somevar本身应该是一个变量,不应该在中间加上空格,还有"!"我也不喜 欢它加上空格,还有",",".",哦,对了,还有"*"当指针用的时候,比如"int *p",我也不喜欢"*"和"p"之间有空格,所以输入时往前搜索,如果发现"int""char"之类的关键字,后面就不加空格。OK,就这些了
(defvar smart-operator-alist
'( "=" "< " ">" "%" "\+" "-" "\*" "/" "&" "|" ":" "\?"))


(defun smart-insert-operator (op &optional only-back)
"Automatically insert whitespaces before and after '=', '>=', etc.
Make it look nicer: ' = ', ' >= '.


OP is the operator. If optional ONLY-BACK is t, only insert one
whitespace at back. When confused, try C-q."
(interactive "s")
(delete-horizontal-space)
(let ((op-p nil) ; another op at front?
(one-char-back nil) ; have we stepped back one char?
(sec-sp nil)
(no-fir-sp nil))
(unless (bolp)
(unless (looking-back "int\|char\|float\|double\|short\|long\|signed\|unsighned\|void\|\(")
(setq sec-sp t))
(if (looking-back "\(")
(setq no-fir-sp t))
(backward-char)
(setq one-char-back t))
(setq op-p
(catch 'return
(dolist (front smart-operator-alist)
(when (looking-at front)
(throw 'return t)))))
(when (and (or op-p (not (and (bolp) (eolp))))
one-char-back)
(forward-char))
(if (equal op ">")
((lambda ()
(while (looking-back " ")
(backward-char))
(if (looking-back "-")
((lambda ()
(setq sec-sp nil)
(setq no-fir-sp t)
(backward-char)
(delete-horizontal-space)
(forward-char)
(delete-horizontal-space)
())))))
())
(if (or op-p only-back no-fir-sp (bolp))
(insert op)
(insert (concat " " op)))
(delete-horizontal-space)
(if sec-sp
(insert " "))))
(defun smart-insert-operator-hook ()
(local-set-key (kbd "=") (lambda () (interactive) (smart-insert-operator "=")))
(local-set-key (kbd "+") (lambda () (interactive) (smart-insert-operator "+")))
(local-set-key (kbd "-") (lambda () (interactive) (smart-insert-operator "-")))
(local-set-key (kbd "/") (lambda () (interactive) (smart-insert-operator "/")))
(local-set-key (kbd "%") (lambda () (interactive) (smart-insert-operator "%")))
(local-set-key (kbd "&") (lambda () (interactive) (smart-insert-operator "&")))
(local-set-key (kbd "*") (lambda () (interactive) (smart-insert-operator "*")))
(local-set-key (kbd "!") (lambda () (interactive) (smart-insert-operator "!")))
(local-set-key (kbd "|") (lambda () (interactive) (smart-insert-operator "|")))
(local-set-key (kbd "< ") (lambda () (interactive) (smart-insert-operator "<")))
(local-set-key (kbd ">") (lambda () (interactive) (smart-insert-operator ">")))
(local-set-key (kbd ",") (lambda () (interactive) (smart-insert-operator "," t)))
(local-set-key (kbd ".") (lambda () (interactive) (smart-insert-operator "." t)))
(local-set-key (kbd ":") (lambda () (interactive) (smart-insert-operator ":")))
(local-set-key (kbd "?") (lambda () (interactive) (smart-insert-operator "?"))))


(defun my-c-mode-common-hook()
(smart-insert-operator-hook)
(local-unset-key (kbd "."))
(local-unset-key (kbd "!"))
(local-unset-key (kbd ",")))


把my-c-mode-common-hook hook到你需要这个功能的mode上就可以了,enjoy:)

让cvs用代理

教育网最讨厌的一点就是不能直连国外,于是用cvs下载最新代码的时候很是郁闷。找了好久终于找到方法了
装一个软件叫corkscrew,其实其他的也行,不过设置方法就不一样了,主要取决于这个软件的参数
export CVS_RSH=ssh
在/etc/ssh/ssh_config里加上:
ProxyCommand corkscrew proxy port %h %p
在终端:
cvs -d :ext:username@the.host.name:/the/repository/path checkout repository
不过似乎不怎么管用:(因为能连上的代理我就没找到过,无奈,换个办法
有个软件叫cvsgrab,可以利用viewcvs提供的http服务来下载repository,而且可以直接在命令行参数里指定http proxy,方便!
主页:http://cvsgrab.sourceforge.net/
需要j2sdk,设置好JAVA_HOME就可以用了
常用参数:./cvsgrab.sh -url http://url/you/need -destDir /local/path -proxyHost xxx.xxx.xxx.xxx -proxyPort xx
具体-h看吧,是个不错的东西