终于在ubuntu下成功安装好了QQ,兴奋
操作非常简单,只需要将QQ目录下的TIMPlatform.exe 删除就好了
Qemu
以前用过VMWare,编译内核驱动经常失败,只有VMWare-Server是免费的,但我的Feisty装VMWare出问题了,因此我就开始用Qemu,现在才发现Qemu这么好用,关键是,它属于我们开源社区。
Qemu作为开源虚拟机,安装简便,和Linux内核协作很好,安装Qemu加速器后性能也有了很大提升,完全不逊色
于其他商业软件,推荐大家使用Qemu。 Qemu虚拟机安装Windows
英文原文:https://help.ubuntu.com/community/WindowsXPUnderQemuHowTo1.安装
代码: |
sudo apt-get install qemu kernel-package linux-source kqemu-source build-essential |
2.Qemu的二进制程序已经安装,但Qemu加速器安装的是源码,所以要加以编译
代码: |
cd /usr/src/linux sudo module-assistant prepare kqemu sudo module-assistant build kqemu sudo module-assistant install kqemu sudo depmod -a |
3.载入kqemu模块
代码: |
sudo modprobe kqemu sudo mknod /dev/kqemu c 250 0 sudo chmod 666 /dev/kqemu |
4.创建Windows虚拟硬盘
代码: |
qemu-img create -f qcow windows.img 2G |
(这里的2G大小可以自己设置,使用qcow文件格式,因此它根据用户使用而增大减小,但最大上限为2G) 5.从光驱安装Windows
代码: |
qemu -localtime -cdrom /dev/cdrom -m 384 -boot d windows.img |
(同样也可以从硬盘镜像安装
代码: |
qemu -localtime -cdrom cdimagefile.iso -m 384 -boot d windows.img |
这里的-m 384是指定内存,384 MB是很好的XP最小内存
如果内存不够,可以这样
代码: |
sudo umount /dev/shm sudo mount -t tmpfs -o size=400m none /dev/shm |
) 64位用户请使用’qemu-system-x86_64’而不是’qemu’,否则”-kernel-kqemu”不能启用. 安装Windows 2000请加入参数’-win2k-hack’.6.使用
Ctrl + Alt 控制切换
Ctrl + Alt + F 全屏切换
7.保存配置
每次启动qemu之前都要手动载入kqemu模,可以将那些命令写入/etc/rc.local,
这样系统启动就会运行这些命令
8.网络
请参考http://fabrice.bellard.free.fr/qemu/qemu-doc.html
9.宿主和客系统之间的文件共享
QEMU为你配置了一个虚拟局域网和DHCP服务器.
首先在宿主Ubuntu上配置好Samba,然后这样启动qemu
(这里假设你有个qemu_share文件夹)
代码: |
qemu -smb $HOME/qemu_share -m 384 -localtime windows.img |
在客系统Windows下,这样来访问共享文件
net use e: \10.0.2.2\qemu_share
而且宿主Ubuntu的IP地址永远是10.0.2.2,因此如果你在宿主Ubuntu上运行了服务器,同样可以访问,比如
ftp:\10.0.2.2,等等. 10.挂载虚拟硬盘,先要确保关闭qemu
代码: |
sudo mount -o loop,offset=32256 windows.img /mnt |
11.保存和恢复虚拟机的状态
当你安装好了一个虚拟机后,你可以在其上创建一个”叠加镜像”,
代码: |
qemu-img create -b windows.img -f qcow windows.ovl |
现在你可以运行叠加镜像
代码: |
qemu windows.ovl -enable-audio -user-net -localtime -smb qemu_share |
叠加镜像非常小,只保存对原始镜像作出的改变,如果你想回到安装后的初始状态,
只需简单地删掉叠加镜像,然后创建一个新的. 12.运行QEMU命令
当QEMU正在运行时,他还可以接受命令
在QEMU窗口按CTRL+ALT+2,会出想QEMU监视器,输入help可以看到你能做很多事情
退出请按CTRL+ALT+113.将raw格式的虚拟硬盘转换为qcow格式
代码: |
qemu-img convert windows.img -O qcow windows.qcow |
14.故障解决
如果你遇到鼠标始终挂在右下角,请在启动QEMU前运行
代码: |
export SDL_VIDEO_X11_DGAMOUSE=0 |
在ubuntu7.04中编译安装能使用QQ和MSN的pidgin
重新安装ubuntu7.04以后的gaim不能使用qq,非常不爽,所以准备重新编译安装gaim,现在的gaim由于版权问题改了名字叫pidgin了,是只小鸟。
下载pidgin2.02的源代码,然后解包到/tmp,准备开始安装
sudo ./configure 的时候说缺少几个包,
configure: error: C compiler cannot create executables
按照错误提示安装缺少的包
sudo apt-get install libc6-dev
再次
./configure
出现错误
checking for GLIB… no
no
configure: error: You must have the GLib 2.0 development headers installed to build.
根据错误提示 用新得立 搜索 GLib 2.0 或者 用命令 apt-cache search GLib 2.0
有个包 libglib2.0-dev - Development files for the GLib library
安装
sudo apt-get install libglib2.0-0-dev
./configure
又出现错误
checking for X… no
checking for GTK… no
no
configure: error:
You must have the GTK+ 2.0 development headers installed to compile Pidgin.
If you only want to build Finch then specify –disable-gtkui when running configure.
用如上同样的方法查找到缺少的包 并安装
sudo apt-get install libgtkmm2.0-dev
./configure 出现错误
checking for LIBXML… no
no
configure: error:
You must have libxml2 >= 2.6.0 development headers installed to build.
于是安装
sudo apt-get install libxml2-dev
终于不少包了,准备安装
sudo make
sudo make install
安装以后成功运行,可以使用qq了。新的图标、界面也比gaim好看点。但随即发现不能使用MSN,郁闷说是少了ssl支持。
只好卸载重新编译
sudo make uninstal
然后下载ssl支持包
`sudo apt-get install libnss-dev
sudo ./configure
sudo make
sudo makeinstall
终于OK了。QQ也能用了,MSN也能用了,不知道是不是心理作用,感觉pidgin的速度比gaim快得多
可惜还是有问题没解决:不是所有的QQ都能登录,至少我就有一个qq不能登录。
`
Ubuntu下fcitx安装小记
忍受不了SCIM了,于是决定投入fcitx的怀抱。
从http://www.fcitx.org上下载最新的3.4.1版,最开始的时候下载的是预编译好的包,下载回来,解压开,直接运行里面的fcitx.install,安装。执行fcitx,提示说SCIM正在运行,kill掉所有和SCIM有关的进程,再执行fcitx,可爱的小企鹅如期出现在桌面上,马上建个文档测试输入法,刚用Ctrl+Space把输入法打开,才按下一个字母fcitx就自动退出了,根据终端下的提示,是找不到智能拼音的数据库文件。想了想,再去弄这个也是个麻烦事情,就执行下载包里面的fcitx.uninstall把这个预编译版卸载掉。
vi常用操作
)文件操作
vi FileName 打开文件 FileName,并将光标置于第一行首。
vi +n FileName 打开文件 FileName,并将光标置于第 n 行首。
vi + FileName 打开文件 FileName,并将光标置于最后一行。
vi + /pattern File 打开文件 File,并将光标置于其中第一个于 pattern 匹配的字符串处。
vi �Cr FileName 在上次正用 vi 编辑 FileName 发生系统崩溃后,恢复FileName。
vi File1 … Filen 打开多个文件,依次对之进行编辑。 :%!xxd 按十六进制查看当前文件
:%!xxd -r 从十六进制返回正常模式:n1,n2 co n3 将 n1 行到 n2 行之间的内容拷贝到第 n3 行下。
:n1,n2 m m3 将 n1 行到 n2 行之间的内容移至第 n3 行下。
:n1,n2 d 将 n1 行到 n2 行之间的内容删除。
:n1,n2 w filename 将 n1 行到 n2 行之间的内容保存到文件 filename 中
:n1,n2 w! Command 将文件中n1行到n2行的内容作为 Command的输入并执行之,
若不指定 n1、n2,则将整个文件内容作为 Command 的输入。
:r! Command 将命令 Command 的输出结果放到当前行。
:nr <文件> 把<文件>插入到第n行
:so <文件> 读取<文件>,再执行文件里面的命令(文件中的命令应该都是一些ex命令)
:l1,l2w <文件> 把第l1和第l2行之间的文本写到<文件>中去
:w >> <文件> 添加到<文件>末尾. 也可以使用行号
:e! 重新编辑当前文件,忽略所有的修改
・(、[、{、}、]、)对应显示
% 显示当前(、[、{ 、}、] 、)的对应项
) 显示对应的(
) 显示对应的[
] 显示对应的{
・(、[、{、}、]、)内数据选择
daB 删除{}及其内的内容 (在非v可视模式下)
diB 删除{}中的内容
ab 选择()中的内容
ib 选择()中的内容( 不含() )
aB 选择{}中的内容
iB 选择{}中的内容( 不含{} )
・语法提示与自动补齐
★ <C-N><C-P> 插入模式下的单词自动完成
★ <C-X><C-L> 行自动完成(超级有用)
・设置ctags
#ctags -f /usr/share/vim/vim63/funcs.tags -R /opt/j2sdk/src /usr/src/kernels/2.6.9-5.EL-i686
^p 自动补齐上下文已有相近项
^n 自动补齐~/.tags中的相近函数
^[ 显示~/.tags中的光标下的函数的原型,
按^t退出函数
:pta 函数名 预览窗口快速打开相应函数所在文件,并将光标定位在对应函数的开头
K 显示光标下的C函数的man说明手册
・变量定位
gd 转到光标下局部变量的定义处
Gd 转到光标下全局变量的定义处
・编译选项
:cn 命令会把你带到下一个出错地点,而不考虑它在什么文件里。
:cc 命令会向你显示当前错误的编译器输出信息;
:cl 会生成一个列有项目所有错误的列表,以供浏览这些错误
3]光标移动
・字符
h 光标左移一个字符。
l 光标右移一个字符。
・字
w 或 W 光标右移一个字至字首。
B 或 b 光标左移一个字至字首。
E 或 e 光标右移一个字至字尾。
・句} 光标移至句尾。
( 光标移至句首。
・段) 光标移至段落开头。
{ 光标移至段落结尾。
・行k 或 Ctrl+p 光标上移一行。
j 或 Ctrl+n 光标下移一行。
Enter 光标下移一行。
nG 光标移至第 n 行首。
n+ 光标下移 n 行。
n- 光标上移 n 行。
n$ 光标移至第 n 行尾。
0 光标移至当前行首。
$ 光标移至当前行尾。
・屏幕
H 光标移至屏幕顶行。
M 光标移至屏幕中间行。
L 光标移至屏幕最后行。
Ctrl+u 向文件首翻半屏。
Ctrl+d 向文件尾翻半屏。
Ctrl+f 向文件尾翻一屏。
Ctrl+b 向文件首翻一屏。
nz 将第 n 行滚至屏幕顶部。不指定 n 时将当前行滚至屏幕顶。
4}插入
在文件中插入行号(不是显示行号,是插入!)
★:g/^/exec “s/^/“.strpart(line(“.”).” “, 0, 4)
・光标
i 在光标前插入。
a 在光标后插入。
・行
I 在当前行首插入。
A 在当前行尾插入。
o 在当前行之下一新行插入。
O 在当前行之上新开一行插入。
5)替换
r 替换当前字符。
R 替换当前字符及其后的字符,直至按 ESC 键。
s 从当前光标位置处开始,以输入的文本代替指定数目的字符。
S 删除指定数目的行,并以所输入的文本代替。
6)修改
ncw 或 nCW 修改指定数目的字符。
nCC 修改指定数目的行。
:r filename 将文件 filename 插入在当前行之下
7)查找替换
/<C-R><C-W> 把狭义单词 <cword> 写到 搜索命令 行
/<C-R><C-A> 把广义单词 <cWORD> 写到 搜索命令 行
:g/str/s/str1/str2/g
第一个g表示对每一个包括s1的行都进行替换,
第二个g表示对每一行的所有进行替换
包括str的行所有的str1都用str2替换
:%s/f $/for$/g 将每一行尾部的”f “(f键和空格键)替换为for
:%s/^/mv /g 在每一行的头部添加”mv “(mv键和空格键)
:s/fred/<c-r>a/g 替换fred成register a中的内容,呵呵
:g/<input|<form/p 显示含<input或<form的行
替换一个visual区域
选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式
:’<,’>s/Emacs/Vim/g 前面的’<,’>是vim自动添加的
在多个文档中搜索
:bufdo /searchstr
:argdo /searchstr
复制与剪切
xp 交换前后两个字符的位置
ddp 上下两行的位置交换
:g/fred/t$ 拷贝行,从fred到文件末尾(EOF)
9)窗口操作
:vne [filename]
:sp [filename]
:S [filename]
:new [filename]
:^w + ^r 交换两个窗口的位置
^w = 窗口等宽
:res -n 窗口高度减小n
:res +n 窗口高度增大n
:vert res -n
:vert res +n
10)DOS格式文本转成Unix格式文本
:1,$s/^M//g
11)书签
在阅读和编写大的程序文件时,利用标记(书签)功能定位是十分有帮助的。
将光标移到想做标记的位置。假如做一个名为”debug1”的标记,那么用户可在命令模式下输入做标记的命令”mdebug1”,然后敲入回车键,一个名为”debug1”的标记就做好了。
接下来用户可以随意将光标移到其它的位置,当在命令模式下输入”`debug1”后,就能快速回到”debug1”的标记所在行的行首。
12)删除操作
:%s/r//g 删除DOS方式的回车^M
:%s= *$== 删除行尾空白
:%s/^(.*)n1/1$/ 删除重复行
:%s/^.{-}pdf/new.pdf/ 只是删除第一个pdf
:%s/<!–_.{-}–>// 又是删除多行注释(咦?为什么要说「又」呢?)
:g/^s*$/d 删除所有空行
:g!/^dd/d 删除不含字符串’dd’的行
:v/^dd/d 同上 (译释:v == g!,就是不匹配!)
:g/str1/,/str2/d 删除所有第一个含str1到第一个含str2之间的行
:v/./.,/./-1join 压缩空行
:g/^$/,/./-j 压缩空行
ndw 或 ndW 删除光标处开始及其后的 n-1 个字符。
d0 删至行首。
d$ 删至行尾。
ndd 删除当前行及其后 n-1 行。
x 或 X 删除一个字符。
Ctrl+u 删除输入方式下所输入的文本。
^R 恢复u的操作
J 把下一行合并到当前行尾
V 选择一行
^V 按下^V后即可进行矩形的选择了
aw 选择单词
iw 内部单词(无空格)
as 选择句子
is 选择句子(无空格)
ap 选择段落
ip 选择段落(无空格)
D 删除到行尾
x,y 删除与复制包含高亮区
dl 删除当前字符(与x命令功能相同)
d0 删除到某一行的开始位置
d^ 删除到某一行的第一个字符位置(不包括空格或TAB字符)
dw 删除到某个单词的结尾位置
d3w 删除到第三个单词的结尾位置
db 删除到某个单词的开始位置
dW 删除到某个以空格作为分隔符的单词的结尾位置
dB 删除到某个以空格作为分隔符的单词的开始位置
d7B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d) 删除到某个段落的结尾位置
d{ 删除到某个段落的开始位置
d7{ 删除到当前段落起始位置之前的第7个段落位置
dd 删除当前行
d/text 删除从文本中出现”text”中所指定字样的位置,
一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
dfc 删除从文本中出现字符”c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
dtc 删除当前行直到下一个字符”c”所出现位置之间的内容
D 删除到某一行的结尾
d$ 删除到某一行的结尾
5dd 删除从当前行所开始的5行内容
dL 删除直到屏幕上最后一行的内容
dH 删除直到屏幕上第一行的内容
dG 删除直到工作缓存区结尾的内容
d1G 删除直到工作缓存区开始的内容
修改命令操作
r 更改当前字符
cw 修改到某个单词的结尾位置
c3w 修改到第三个单词的结尾位置
cb 修改到某个单词的开始位置
cW 修改到某个以空格作为分隔符的单词的结尾位置
cB 修改到某个以空格作为分隔符的单词的开始位置
c7B 修改到前面7个以空格作为分隔符的单词的开始位置
c0 修改到某行的结尾位置
c} 修改到某个语句的结尾位置
c4} 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c) 修改到某个段落的结尾位置
c{ 修改到某个段落的开始位置
c7{ 修改到当前段落起始位置之前的第7个段落位置
ctc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
cc 修改当前行
5cc 修改从当前行所开始的5行内容
. 重复上一次修改!
13}Set 选项设置
set all 列出所有选项设置情况。
set term 设置终端类型。
set ignorecase 在搜索中忽略大小写。
set list 显示制表位(^I)和行尾标志($)。
set number 显示行号。
set showmode 示用户处在什么模式下
set report 显示由面向行的命令修改国的行数目。
set terse 显示简短的警告信息。
set warn 在转到别的文件时,若没有保存当前文件则显示 No write 信息。
set autowrite 在”:n”和”:!”命令之前都自动保存文件
set nomagic 允许在搜索模式中,使用前面不带的特殊字符。
set nowrapscan 禁止 vi 在搜索到达文件两端时,又从另一端开始。
set mesg 允许 vi 显示其他用户用 write 写到自己终端上的信息。
autoindent (ai) noai 使新行自动缩进,和上(下)行的位置对齐
autoprint (ap) ap 每条命令之后都显示出修改之处
autowrite (aw) noaw 在:n,:!命令之前都自动保存文件
beautify (bf) nobf 在输入的时候忽略所有的控制字符(除了制表键(tab),换行(newline),进纸(formfeed))
directory= (dir=) /tmp 存放缓冲区的目录名
edcompatible noedcompatible 在替换的时候使用类ed的用法
errorbells (eb) errorbells 出错的时候响铃
exrc (ex) noexrc 允许在主目录(home)外面之外放.exrc文件
hardtabs= (ht=) 8 设置硬制表的边界
ignore case (ic) noic 正规式里忽略大小写
lisp nolisp 打开lisp模式
list nolist 显示所有的制表键和行的结尾
magic agic 可以使用更多的正规表达式
mesg mesg 允许向终端发送消息
number (nu) nonumber 显示行号
open open 允许开放和可视化
optimize (opt) optimize 优化吞吐量,打印时不发回车
paragraphs= (para=) IPLPPPQPPLIbp 设置{ & }的分界符
prompt prompt 命令模式下的输入给出:的提示符
readonly (ro) noro 除非用!号否则不准保存文件
redraw noredraw 当编辑的时候重绘屏幕
remap remap 允许宏指向其他的宏
report= 5 如果影响的行数>这个数的话就报告
scroll 1/2 window 下卷屏幕时滚动屏幕的数目, 同样这也是z命令输出的行数(z 输出2倍滚屏的大小)
sections= SHNHH HU 定义节的末尾(当使用命令[[ 和 ]] 时)
shell= (sh=) /bin/sh 缺省的SHELL,如果设置了环境变量SHELL的话,就使用变量
shiftwidth= (sw=) 8 当使用移动(shift)命令时移动的字符数
showmatch (sm) nosm 显示{, }, (, ), [, 或者 ] 的匹配情况
showmode noshowmode 显示你处在什么模式下面
slowopen (slow) 插入之后不要立刻更新显示
tabstop= (ts=) 8 设置制表停止位(tabstop)的长度
taglength= (tl=) 0 重要标记的字符个数(0表示所有的字符)
tags= tag, /usr/lib/tags 定义包含标记的文件路径
term= 设置终端类型
terse noterse 显示简短的错误信息
timeout (to) timeout 一秒钟后键盘映射超时
ttytype= 设置终端类型
warn warn 显示”No write since last change”信息
window= (w=) 可视模式下窗口的行数
wrapmargin= (wm=) 0 右边距,大于0的话最右边的单词将折行,留出n个空白位置
wrapscan (ws) ws 查找到文件尾后再重头开始
writeany (wa) nowa 可以保存到任意一个文件去
14}特殊字符
^ 匹配字符串位于行首。
$ 匹配字符串位于行尾。
. 用在模式串中,表示任何单个字符。
在命令模式下,重复上次的命令。
- 在模式串中,表示其前字符可出现任意多次。
[] 用在模式串中,表示指定方位内字符,其中可用-表示一个字
符范围,用^表示不在某个范围内的字符。
ESC 从插入状态转换到命令状态
^[ 功能同 ESC
15]大小写转换
guu 行小写
gUU 行大写
g~~ 行翻转(当然指大小写啦)
guw 字小写(狭义字) 译注:建议对比iw
gUw 字大写(狭义字)
g~w 字翻转(狭义字)
vEU 字大写(广义字)
vE~ 字翻转(广义字)
ggguG 把整个文章全部小写(ft!bt!)
16) 跳转足迹’. 跳到最后修改的那一行 (超级有用)(ft,怎么又是这个评价)
`. 不仅跳到最后修改的那一行,还要定位到修改点
<C-O> 依次沿着你的跳转记录向回跳 (从最近的一次开始)
<C-I> 依次沿着你的跳转记录向前跳
:ju(mps) 列出你跳转的足迹
17)命令历史
:history 列出历史命令记录
:his c 命令行命令历史
:his s 搜索命令历史
q/ 搜索命令历史的窗口
q 命令行命令历史的窗口
:<C-F> 历史命令记录的窗口
18]寄存器
列出寄存器(Registers)
:reg 显示所有当前的registers
“1p 表示引用register,1表示一个名字叫做1的register,p就是粘贴(paste)命令
译释:
“也用来定义register
先输入 “,表示定义register
然后输入名字,如0~9,a~z
然后执行删除或复制命令,如dd或y,
或者是visual模式下的d(删除选中的部分)或y(复制选中的部分)
则被删除或复制的部分就被存入了这个命名的register
观察:一个特殊的register, “” ,里面存储了一个匿名的删除/复制
在你执行dd或y的时候,被作用的部分被存到了””中
19}命令行
“ayy@a 把当前行作为一个Vim命令来执行
译释:”ayy 是定义当前行到register a,然后@a是执行register a中存储的指令
10yy copy 当前行以下10行
11} 排序
:%!sort -u 使用sort程序排序整个文件(用结果重写文件)
!1) sort -u 排序当前段落 (只能在normal模式下使用!!)
:.,+5!sort 排序当前行及以下5行
20) 列操作
:%s= [^ ]+$=&&= 复制最后一列
:%s= f+$=&&= 一样的功能
:%s= S+$=&& ft,还是一样
:s/(.).)/2”1/ 颠倒用:分割的两个字段
:%s(w+s+){2})str1:1str2: 处理列,替换所有在第三列中的str1
:%sw+)(.*s+)(w+)$:321: 交换第一列和最后一列 (共4列)
・.vimrc
“ Use Vim settings, rather then Vi settings (much better!).
set nocompatible
“c风格的缩进
:set expandtab “不使用tab只使用空格
:set cindent shiftwidth=4
“自动缩进
:set ai
“语法
“:set filetype=java
:set syntax=java
“键入)、] 、},显示(、[、{
:set showmatch
“手工定义折叠
:set foldmethod=manual
“标签文件位置
set tags=/usr/share/vim/vim63/funcs.tags
“在插入模式下通过按[Ctrl]N自动地将任何类、方法或者字段名补齐
set complete+=k
“ 不要用声音烦我!
set visualbell
“历史
:set history=50
“显示行列位置
:set ruler
“设置字符编码
set fileencodings=gb2312
“set encoding=euc-cn
“设置ruler
set ruler
“显示当前命令
set showcmd
“incsearch
set incsearch
“ allow backspacing over everything in insert mode
set backspace=indent,eol,start
“自动检测文件类型
:filetype on
“””””””””””快捷键定义”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
if version >= 600
“查找
“map <C-H> /
“查找函数原型
map <C-H> yiw/^(s)(sub)|(function)(s)<C-r>”<CR>
“继续查找
map <F3> n
“使用<F10>显示类、属性、方法列表
map <F2> :Tlist<CR>
“ 用compiler定义的编译程序来编译当前程序
“map <F9> :make “%”<CR>
“使用<F11>来进行php语法检测
map <F11> :!php -l “%” <CR>
map ;w :call FormatText()<CR>
“查找当前光标下的字
map <F4> /<C-R><C-W><CR>
endif
“””””””””””::快捷键定义”””””””””””””””””””””””””””””””””””””””””””””””””””””””””
“””””””””””格式化文件”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
function FormatText()
:%s/t/ /g “把t换成4个空格
:%s/ *$//g “去掉行尾空格
endfunction
“””””””””””格式化文件”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
“”””””””””显示行尾的tab和多余空格”””””””””””””””””””””””””””””””””””””””””””””””
set listchars=tab:>-,trail:~
set list
syntax match Trail “ +$”
highlight def link Trail Todo
“”””””””””::显示行尾的tab和多余空格”””””””””””””””””””””””””””””””””””””””””””””
function LastMod()
if line(“$”) > 5
let l = 5
else
let l = line(“$”)
endif
exe “1,” . l . “/CnsProgCMTime/s/CnsProgCMTime .*/CnsProgCMTime “ . strftime(“%Y-%m-%d %H:%M:%S”).”/e”
endfunction
“map <F5> :call LastMod()<CR>
“””””””””””自动加注释的星号””””””””””””””””””””””””””””””””””””””””””””””””””””
“使用如/ … / 的注释时,r在插入模式下回车时插入 ;
“o 在普通模式下,使用 “o” 或 “O” 时插入*
:set formatoptions=tcro
“””””””””””::自动加注释的*星号””””””””””””””””””””””””””””””””””””””””””””””””””
vi扩展的正则表达式
| 指示交替,如home|house 指匹配home或house
() 用于分组,如home|house可以写为ho(me|use)
可以用到()上(home|house) 可以匹配home, homehouse,househome, homehousehomehouse
(…) 实际匹配的文本可以使用1、2等在替换命令的替换部分进行检索
- 可匹配正则表达式的一次或多次出现,既可以是单个字符也可以是()或(…)括起的内容,至少匹配一次
ho(use|me)+ 指至少是house或home不允许是空
? 指前面正则表达式的零次或一次出现,表示出现或未出现。如free?d 将匹配fred或freed除此不能匹配其他文本
{…} 定义区间表达式。区间表达式描述了表示重复次数的计数数字。 同{…}
{n} (home|house){2} 只能匹配homehome, homehouse, househome, househouse
{n,}
{n,m}
{,n}
编译相关
・用编译器来编译 当前文件
:!perl -c %
:!php -l % 用php来检查错误
:!php -q % 用php来运行程序
・编译当前程序为a.out并执行该./a.out
:!gcc % -o a.out && ./a.out
执行结果
old umask is %#0
new umask is %#0
・编译错误信息
:cl! 列出所有错误信息的详细列表
:cl 列出当前条错误信息
:cn 列出下一条错误信息
:cp 列出上一条错误信息
:cnew 最新错误信息条数
:cold 旧的错误信息条数
:cwin 或 :copen 打开错误信息窗口
:cclose 关闭上面打开的信息窗口
自动补齐
CTRL-X CTRL-F 文件名
CTRL-X CTRL-L 整行
CTRL-X CTRL-D 宏定义 (并搜索所包含的文件)
CTRL-X CTRL-I 当前文件以及所包含的文件
CTRL-X CTRL-K 词典文件内的单词
CTRL-X CTRL-T 近义词词典文件内的单词
CTRL-X CTRL-] 标记
CTRL-X CTRL-V Vim 命令行
C程序设计
gd 反色显示光标下局部标识符串的所有出现,并转到第一次出现处。
gD 反色显示光标下全局标识符串的所有出现,并转到第一次出现处。
:checkpath 列出所有include的头文件
[i 显示函数定义
extern mode_t umask (mode_t mask) THROW;
[+CTRL+i 跳转到[i所标识的函数定义处
————————————————————————————–[I 列出当前文件及包含文件内的含有当前字符的行
————————————————————————————–[d 显示由#define所定义的标识符的定义语句
printf(|tom);
#define tom “yaoshuyin”
CTRL+] 跳转到光标当前位置的标签处 (例如:一个函数的定义)。
CTRL+T 跳转到执行 CTRL-] 命令前的地方。
:tselect 从一连串匹配的标签中选出一个。
[/ 跳转到注释开始的位置。
]/ 跳转到注释结束的位置。
[# 返回到未闭合的 #if, #ifdef, or #else 处。
]# 前进到未闭合的 #else 或
QEMU+Accelerator
QEMU刚刚发布的Accelerator带来了QEMU革命,它不再是一个性能低等的模拟器
使用Accelerator的QEMU速度一下提升了5倍之多。OSNews报道:
This means you could theoretically run Windows (or another OS) on
a Linux machine at near native speeds without buying a commercial emulator.
今天赶紧升了级,果然不同反响,安装了RHEL4,Win2k,速度很好,也没有以前版本分出大于2G空间
linux硬件时间的调整
首先使用date设置正确的时间(如果你的时间设置也不对的话,首先得调整时区).
调整后,使用date命令查看是否正确:
shell$date
Fri Apr 21 18:47:09 CST 2006
首先查看一下硬件时钟:
shell#hwclock �Cshow
然后使用hwclock将硬件时间调整为与系统时间一致:
shell#hwclock �Cdirectisa �Csystohc
这时间再查看一下硬件时钟是否已经调整过来了?
shell#hwclock �Cshow
Fri 21 Apr 2006 06:47:25 PM CST -0.764909 seconds
请注意�Cdirectisa参数,如果出现文中开头的错误信息,则必须加上此参数,表示直接以I/O指令存取硬件时间而不通过/dev/rtc设备来存取。
如果您的硬件时间是正确的,要将系统时钟调整的与硬件时钟一致,则只需要将�Csystohc换成�Chctosys即可。
hwclock的参数详解:
语法:hwclock [�Cadjust][�Cdebug][�Cdirectisa][�Chctosys][�Cshow][�Csystohc][�Ctest] [�Cutc][�Cversion][�Cset �Cdate=<日期与时间>]
参数:
�Cadjust hwclock每次更改硬件时钟时,都会记录在/etc/adjtime文件中。使用�Cadjust参数,可使hwclock根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟。
�Cdebug 显示hwclock执行时详细的信息。
�Cdirectisa hwclock预设从/dev/rtc设备来存取硬件时钟。若无法存取时,可用此参数直接以I/O指令来存取硬件时钟。
�Chctosys 将系统时钟调整为与目前的硬件时钟一致。
�Cset �Cdate=<日期与时间> 设定硬件时钟。
�Cshow 显示硬件时钟的时间与日期。
�Csystohc 将硬件时钟调整为与目前的系统时钟一致。
�Ctest 仅测试程序,而不会实际更改硬件时钟。
�Cutc 若要使用格林威治时间,请加入此参数,hwclock会执行转换的工作。
�Cversion 显示版本信息。
或许每次都要加上�Cdirectisa比较麻烦,因此可以用以下方法作一些改变:
shell#cd /sbin
shell#mv hwclock hwclock.ori
shell#cat > hwclock <
#!/bin/bash
/sbin/hwclock.ori �Cdirectisa $@
EOF
shell#chmod +x hwclock
FVWM简明使用指南
简明使用指南
Fvwm is a window manager for X11. It is designed to minimize memory consumption, provide a 3D look to window frames, and a virtual desktop.
― The FVWM(F? Virtual Window Manager) manual
在看这个文档之前你最好对 Xwindow 的工作机制有一定了解。知道 X server 跟 WM 有什么关系。你可以参考我的 Xwindow 网页1. FVWM 到哪里下载?有问题到哪里问?先说正事吧。FVWM 的老巢在http://www.fvwm.org。那里有所有源码和各种按钮,菜单样式,图标,声音,抓图,……下载。
另外,你可能想要FVWM支持鼠标动作。你可以在 [http://www.etla.net/libstroke/ ](http://www.etla.net/libstroke/)得到 libstroke. 下载那个为 FVWM 准备的版本,编译后安装,然后再编译 FVWM,它一般就会找到 libstoke,从而加入 stroke 的功能。
FVWM 的问题最好到 FVWM 邮件列表讨论,那里的人们都很热情。地址见 FVWM 的主页。
谁需要 FVWM?并不是任何人都会喜欢 FVWM。使用 FVWM 显然不像用 KDE,Gnome 的桌面那么简单,你需要自己对它进行配置。它是一个老牌的,长久不衰的窗口管理器,它永远以一个忠实的 Xwindow 窗口管理器的方式工作。使用 FVWM,你可以学到很多有关 Xwindow 的东西,你会很快的明白 Xwindow 的工作原理,见识到 Xwindow 的强大和灵活。
如果你喜欢随意的控制自己窗口,让它们都乖乖听话,而不是老是跳出来挡在你面前。你喜欢随意定制自己窗口样式,喜欢快速高效的控制窗口,喜欢节省资源,…… 总之,你是一个挑剔的人。那么 FVWM 就是你最终的选择。
FVWM 的用户包括很多超级大拿。你猜下面这个屏幕抓图是谁的 FVWM? (点击可以放大)
我与 FVWM 的故事FVWM 的缺省配置是非常简陋的。当我第一次看到它时,”天哪!世界上还有这么难看的窗口啊!”我立即选择了 “quit”。然后我选择了 KDE 和 Gnome。
但是当我被 KDE,Gnome 华丽的难以忍受的不稳定性烦透了时候,当我快要放弃使用 Linux 和 Xwindow 的时候,我在 Knuth 的主页上看到了他的 Linux 系统下的漂亮的 FVWM 抓图。天哪!我忽略了世界上最强大的窗口管理器。它完全可以变得比任何其它窗口管理器漂亮,它让我领悟到了 Xwindow 的魅力。它不但很强大,而且可以和 KDE, Gnome 里的程序一起工作。
FVWM 是什么样子?这个问题是永远不会有答案的。问这个问题就像在问:”Xwindow 是什么样子的?”也许勉强可以接受的回答是:”你想让它是什么样子,它就会成为什么样子。”
FVWM 是一个完全可定制的窗口管理器。这是FVWM不同于很多其它WM的一个特点,它的一切行为方式都是由一个配置文件: .fvwm2rc 决定的。没有了这个配置文件,FVWM 就成了一个废物: 鼠标和键盘几乎不起任何作用,没有菜单,没有窗口边框,没有按钮,甚至你根本不知道它其实正在运行!
但是一旦有了配置文件,FVWM就会变得威力无比,简单的配置文件可以实现基本的功能,复杂的配置文件甚至可以模拟很多其它WM甚至 Windows XP。下面就是一个模拟 Windows XP 的例子,点击可以放大。很漂亮吧?什么时候 Windows XP 也能这么漂亮就好了 :)
下面是一个模拟 CDE 的 dtwm 的例子:
以后如果有人告诉你:”FVWM是那个样子。”你就可以对他说:”FVWM不一定是那个样子。” :)
你可以在http://www.fvwm.org/screenshots/看到很多漂亮的配置。
配置文件和它的位置配置文件叫做 ~/.fvwm/.fvwm2rc, 在你的用户目录下。
配置文件有点像一个脚本语言。不要怕,这种脚本语言比起 Perl, awk 简单多了。你不需要学会编程。配置文件是在FVWM启动时读入并被FVWM执行的,你也可以在FVWM正在运行的时候与它”对话”,即时执行命令和修改界面风格。
写配置文件,一个很好的出发点就是随 FVWM 源码发行的 system.fvwm2rc 文件。它的位置现在在源码包的 sample.fvwmrc/system.fvwm2rc。你也可以在这里下载一份 2.5.4 的system.fvwm2rc. 把它拷贝到你的 ~/.fvwm/ 目录下面, 改名为 .fvwm2rc. 作为我们的起始点。
注意sample.fvwmrc/ 这个目录下还有system.fvwm2rc-sample-95这样的配置文件,它们可以模拟 Windows 95 的操作方式,但是这个配置文件太大了,不适合用来修改成为自己的配置文件,你有兴趣可以自己看看,然后把里面某些你觉得很cool的东西贴到你的配置文件里。
现在我们就来分析一下这个简单的配置文件里到底在说些什么。
什么是FVWM命令一个配置文件里基本上是一些命令,与其它WM不同的是,FVWM并不区分样式命令和动作命令,你可以几乎在任何情况下使用任何命令。比如命令:
Mouse 1 A CSM Style gvim TitleAtBottom
让你在任何时候按住 Ctrl-Shift-Alt 再点击鼠标左键(编号1),名叫gvim的窗口的标题栏就会跑到下面去。是不是很好玩?呵呵。这里 “Style” 是一个样式命令。Mouse 2 A CSM All (rxvt) MoveToDesk 0
按住 Ctrl-Shift-Alt 再点击鼠标左键中键(编号2),所有的 rxvt 都会被移动到当前的桌面. 这里的 “All” 是一个可以附加条件和操作的条件动作命令,我们在后面会介绍。- 怎样实验新的FVWM命令实验一个命令的作用不需要重新启动FVWM,你可以先在 .fvwm2rc 里这样定义:
Key F3 A A Module FvwmConsole
然后启动fvwm, 这样你在任何时候按下 <F3> 键,就会启动一个叫做 FvwmConsole 的模块,你可以在里面输入Fvwm命令,回车它们就会执行,并且立即生效。这是直接与FVWM对话的方法。当然如果你想得到下面这么漂亮的 FvwmConsole, 还需要对 xterm/rxvt 的参数作一些设定。其实我的定义是:Key F3 A A Module FvwmConsole -terminal rxvt -geometry 45x5-0+0 -bg gold -fg midnightblue -fn “-adobe-courier-medium-r---14-------*”
常用命令
FVWM 可以有很多个虚拟桌面(desk)(几乎无穷多!),每个虚拟桌面可以被分成很多个页(“page”)。这些page相当于把你的屏幕扩大了很多倍。这一行就是设定每个desk包含多少page.DeskTopSize 这类语句指定了整个FVWM的某种行为方式,类似的语句还有很多。下面列举一些,你第一次看本文可以草草略过这一节。
- Read file. 插入另外一个文件file的内容。如果你会C语言,你就知道这个语句相当于 #include . 当你的配置文件在某一方面有很长内容时,比如我的配置文件里有大量stroke,你就可以把这些都写到另一个文件里,这样使主配置文件容易修改。
- Exec app. 启动一个shell,并且在里面执行”app”命令。这时用菜单和按钮来启动程序时经常用到的命令。如果你要启动一个X程序最好同时使用 exec, 比如
Exec exec rxvt
这样shell会执行”exec rxvt”, 用rxvt替代自己的正文段,这样才不会出现很多shell在那里等待X程序返回。 - Module FvwmXxx. 启动一个叫做 FvwmXxx 的模块。一个模块是一个程序,它直接通过管道与Fvwm通信,所以必须从Fvwm fork() 出来,而不能从一个 xterm 独立启动。模块可以无限制的扩展Fvwm的功能,只要 Xlib 允许。
- ImagePath path. 指定一个路径,在配置文件里要用到的图标等文件就会到这个路径里去寻找。比如:
ImagePath +:/usr/share/icons:/usr/share/pixmaps: $HOME/.fvwm/icons
加号是表示以前定义过的那个 ImagePath. FVWM 可以使用 .xbm, .xpm 和 .png 格式的图标。 - Move, Raise, Lower, Resize, … 这些都是常用的操纵窗口的命令。
- Close, Delete, Destroy, Iconify, Maximize, WindowShade. 关闭窗口,图标化窗口,最大化窗口,shade 化窗口. 你会发现Xwindow关闭窗口的方式有很多种,其中 Close 是最文明的一种,这会发给窗口一个消息让它收拾干净然后退出。Destroy 是立即杀死这个窗口,跟 xkill 的功能一样。Delete介于两者之间,先礼后兵,如果窗口不知道怎么收拾干净,那么就强行杀死它。
- OpaqueMoveSize x. 如果一个窗口移动时显示内容,那么它必需占屏幕面积的 x%.
- MoveToDesk, MoveToPage. 可以把任何窗口移动到指定的桌面和页面。
- SnapAttraction. 设定在什么距离以内,满足什么条件的窗口就被吸附在一起。biaji
~ - WarpToWindow x[p] y[p]. 让鼠标移动到窗口范围以内。x,y是在窗口内的坐标,用百分比表示。后面如果有后缀”p”, 就用像素来表示。
- IgnoreModifiers. 你可以忽略某些键盘控制键。这将影响到你的鼠标和键盘热键定义。详细情况见鼠标和键盘一节。
- DesktopName desk name. 定义第desk号桌面的名字叫 name.
- Scroll. 移动你在桌面上的 viewport, 这样你可以把桌面当成一个整体来浏览。看到很大的范围。
- Nop. 不操作,在有些时候需要用它来占位,下面我们会遇到这样的例子。
- PipeRead. 从一个外部命令得到输入。这可以用来根据你的系统构造许多非常高级的控制方式。其中一种叫做”菜单式文件管理器”。我们在菜单一节会遇到这个用法。
- SetEnv. 设置FVWM的环境变量。
就举这些吧……我只是举出了我有时会用到的,其实还有很多很多,你看看 FVWM 的manpage就知道了。9. 窗口上下文Move, Close, WarpToWindow …这些命令如何知道作用于那个窗口呢?如果你因为点击了窗口上的按钮,边框,……而激发了这些命令,那么这些命令就会作用于这个窗口。或者你也可以用条件选择命令确定一个或者一批窗口进行操作,见条件命令。否则,这些命令不知道应该作用于哪个窗口,比如你在 FvwmConsole 里键入 “Close”, Close 命令就没有窗口上下文,它缺省会出现一个”+”状的选择器让你选择一个窗口。如果你不希望命令在没有窗口上下文的时候自动让你选择一个窗口,那么你可以在命令前面加上 “Silent”.
鼠标和键盘FVWM几乎可以以无穷的方式组合,来进行鼠标和键盘的操作。你还可以加入窗口上下文来进行更方便的动作。
键盘操作的定义:
Key Keyname Context Modifiers Function
它表示:在名叫 Keyname 的键在 Context 上下文按下时,如果控制键 Modifiers 组合按下,那么执行 Function. 键盘操作后面的部分跟鼠标一样的含义,我们下面只用鼠标操作来一起说明这些命令的用途。鼠标操作的定义:
Mouse Button Context Modifiers Function
它表示:在鼠标编号为 Button 的键在 Context 上下文按下时,如果键盘控制键 Modifiers 组合按下,那么执行 Function.鼠标键编号的方法是:1 左键,2 中键,3 右键。如果你的鼠标有轮子,那么一般4表示往上滚动,5表示往下滚动。
Context是鼠标按下的位置,它可以是:
- R(Root Window) 根窗口
- n (n 是0…9 之间的一个数)。第 n 号窗口按钮。按钮是这样编号的:
1 3 5 7 9 0 8 6 4 2
左边是奇数右边是偶数, 外面的大中间的小。 - T(Title)标题栏
- S(Sidebar)也就是边框. 也可以用 ‘[‘, ‘]’, ‘-‘ , ‘_’ 分别表示左,右,上,下的边框。
- F(Frame)就是用来resize的那四个角落. 也可以用 ‘<’, ‘^’, ‘>’ and ‘v’ 分别表示左上,右上,右下,左下的角落。
- W(Working Area) 应用程序窗口工作区域
- I(Icon window) 图标化的窗口。
这些上下文可以组合。比如 “FST” 表示在frame, sidebar, 或者 title.
Modifiers 是鼠标操作时同时的键盘控制键。M 表示 “Meta”,在PC上就是Alt,S: shift, C: ctrl. 还有 A: any, N: none. 也可以组合,比如”MS” 表示同时按下Alt-Shift.
Function 就是任意的FVWM操作了,可以是一个直接的命令,也可以是一个 FVWM 函数。
现在我们分析一下下面这个定义:
Mouse 3 W SC CloseOrNot这个定义是说,在窗口上点击鼠标右键,并且先按下 Shift-Ctrl,那么调用 CloseOrNot 这个FVWM函数。这个函数会作用与当前鼠标所在的上下文,也就是一个窗口。函数是这样定义的:11. 函数
DestroyFunc CloseOrNot AddToFunc CloseOrNot + C Silent Close + M Nop你可以把一系列的操作有条件的加入到一个叫做"函数"的结构里,以后这个函数就可以像命令一样被使用了。 AddToFunc 把动作附加到函数, 如果函数不存在就先创建这个函数。除了第一行,后面的行都以一个"+"号开头,这说明以下是上一个命令(AddToFunc)的继续。DestroyFunc 是为了消除以前有可能定义过的函数体。这个函数 CloseOrNot 表示: * 如果是一个鼠标点击(C), 那么关闭这个窗口(Close), 但是如果现在不是在窗口上下文,也就是说,函数调用的时候没有一个确定的目标,那么不进行操作,而不是出现一个"+"字瞄准器让用户选择窗口。 这就是 "Silent" 的含义。 * 如果鼠标点下去之后移动了,也就是"拖动"(M),那么不进行操作。 12. 启动函数和退出函数 在 FVWM 启动和重新启动时都会调用 StartFunction, 而且在首次启动时会调用 InitFunction, 在重新启动时会调用 RestartFunction, InitFunction 和 RestartFunction 都是在 StartFunction 之后调用。每次重起和完全退出时都要执行 ExitFunction. 如果你有什么程序需要在FVWM启动时启动,那么就把它加到合适的函数里面去。比如,我的配置文件有这些内容:
DestroyFunc StartFunction AddToFunc StartFunction + I Module FvwmButtons MainPanel + I Module FvwmAuto 500 Raise Nop + I Module FvwmAnimate + I Module FvwmTaskBar + I Exec exec xdaliclock + I Exec exec xloadimage -onroot -fullscreen ~/pic/cat_20.jpg + I Exec exec xsim DestroyFunc InitFunction AddToFunc InitFunction + I Exec exec xscreensaver -no-splash DestroyFunc ExitFunction AddToFunc ExitFunction + I All (xdaliclock) Close + I All (xscreensaver) Close + I All (xsim) Close可见,我在第一次启动时会启动 xscreensaver 屏幕保护程序。-no-splash 是 xscreensaver 的参数。在每次重新启动和第一次启动时都要运行 FvwmButtons, FvwmAuto, FvwmAnimate, FvwmTaskBar 几个模块和 xdaliclock,一种 morph 数字的时钟,然后用 xloadimage 放一张漂亮的图片作为桌面背景,最后启动 xsim 中文输入法。 退出和重起时,我特意关闭了那几个启动时打开的程序,因为如果不关闭他们,像 xwin32, Exceed 这样的 Windows X server 不会 Reset. 每个命令前的 "I" 表示 Imediately, 立即执行,联想上面提到的 "C" 和 "M", 这个操作不等待任何鼠标动作。 13. 窗口样式Style 语句用于设定窗口的样式。你可以随心所欲的让不同的窗口有不同的样式。语法为:
Style stylename options其中_stylename_是你的窗口的名字,窗口的class名字,或者窗口的resource名字。如果你不知道这些 X window 的术语,那现在就姑且当作窗口的名字好了,以后多看看 Xlib 的说明书你就会明白这些东西。窗口的名字有可能不同于程序的名字,你不知道它叫什么名字可以用 xwininfo 程序或者 FvwmIdent 模块来查询。再次说明,FvwmIdent 是模块,不能从 xterm 的命令行运行。 stylename 里可以有 "*" 作为通配符。比如你可以说
Style *term TitleAtLeft让所有以 "term" 结尾的那些窗口的标题拦都在左边。比如 "xterm", "cxterm", "qterm", ... 都会采用这种样式。 _options_ 是你想让满足条件的窗口以什么样的方式存在。options 的种类非常之多。比如:BorderWidth, HandleWidth, FocusFollowsMouse, TileCascadePlacement, ... 它们有的需要参数,比如 BorderWidth 7, 指定边框宽度为7个像素。有些不需要参数,比如 FocusFollowsMouse/ SloppyFocus/ NeverFocus/ ClickToFocus 指明了几种互相排斥的键盘聚焦方式。 先举几个例子,这些都是 system.fvwm2rc 里的内容:
Style * FocusFollowsMouse Style * TileCascadePlacement Style "Fvwm*" NoTitle, Sticky, WindowListSkip Style "Fvwm*" BorderWidth 2, CirculateSkipIcon, CirculateSkip Style "FvwmPager" StaysOnTop Style "FvwmBanner" StaysOnTop Style "FvwmButtons" Icon toolbox.xpm, ClickToFocus开头的两行说明所有窗口,都是鼠标移进去的时候得到键盘聚焦,鼠标移出来就失去聚焦(FocusFollowsMouse),窗口出现的时候,先试图找一个可以放下它而不挡住其它窗口的地方,如果不行再采用层叠放置的方式(TileCascadePlacement)。 下面是说明所有名字以 "Fvwm" 开头的窗口(在这里一般都是 FVWM 内部的模块),它们都没有标题栏(NoTitle),而且是sticky,也就是说即使桌面切换,它们也一直显示在屏幕上,边框宽度为 2, CirculateSkip 说明当FVWM要求轮询窗口进行批量操作时,这些窗口不被计算在内。第3,4行说明 FvwmPager, FvwmBanner 这两个模块一直显示在最上面。最后一行说明 FvwmButtons 模块使用 toolbox.xpm 的图标,需要鼠标点击才能得到键盘聚焦(ClickToFocus)。 总的说来,options指出了控制窗口的基本样式和政策,而不包括窗口各个部件具体的样式,它包括以下几个方面内容: * 窗口聚焦方式。是跟随鼠标(FocusFollowsMouse),还是需要点击才聚焦(ClickToFocus)... * 窗口标题栏。是否给窗口加上标题拦?如果加上,是放在左边,上边,还是下边?注意这里也不是设定具体标题样式的地方,参看 TitleStyle. * 窗口应该显示哪些按钮。FVWM可以为每个窗口设定最多10个按钮,但是你通常用不到10个,这样你可以设定对于某一个程序那些按钮应该出现。注意这里也不是设定按钮样式的地方,参看 ButtonStyle. * 窗口边框样式。边框宽度,handle(就是边框角上那个用来resize的东东)的宽度,边框被鼠标按住的时候是否陷下去?... * 窗口图标。用那个图标作为窗口iconify时候的图标? * 窗口最大化,移动,改变大小操作时的样式。是显示窗口内容还是只显示一个"橡皮框"?还是让尺寸小于某个值的窗口才在拖动时显示内容?... * 窗口放置策略。窗口出现的时候,是层叠放置,最小遮挡放置,还是……? * 是否允许程序自己放置自己?这是一个政策问题,有些窗口程序启动时会自己选择一个位置出现,但是你可能会发现你不喜欢它那样做,你可以设定NoPPosition, 不允许那个程序自作聪明。 * 对瞬时窗口(transient window)的策略。transient window 是指类似弹出菜单,对话框之类的窗口。当它们出现的时候,你是否想给它们也加上标准的边框? * 高级特性。还有很多很多选项比如是否允许窗口 backing store,这些如果你还不理解现在暂时不用管它。 以上每项都包含许许多多可以设定的东西。具体还是请参考 fvwm 的manpage。14. 菜单 一个窗口管理器怎么能没有菜单?FVWM的菜单是可以随意自己定义的,它在任何时候出现在你想让它出现的任何地方。一个菜单首先有一个定义,然后有一个激发这个菜单的条件,菜单的样式也可以随意定制。如果使用 PipeRead 命令和一些 shell 命令组合,你就可以用菜单的方式遍历你的文件目录树,成为一个"菜单式file manager"。 * 菜单的定义菜单是由AddToMenu命令定义的,比如这样一个菜单 ![](http://learn.tsinghua.edu.cn/homepage/2001315450/menu.png) 是这样定义的
DestroyMenu RootMenu AddToMenu RootMenu "Root Menu" Title + "&xterm%mini.display.xpm%" Exec exec xterm + "&Rxvt%mini.monitor.xpm%" Exec exec rxvt + "&Big Rxvt" Exec exec rxvt -geometry 78x43 + "" Nop + "&Programs" Popup ProgramsMenu + "&Utilities" Popup Utilities + "" Nop + "Re&fresh Screen" Refresh + "Re&capture Screen" Recapture + "" Nop + "&Lock" Exec exec xscreensaver-command -lock + "&Exit Fvwm%mini.exit.xpm%" Popup Quit-Verify除了第一行,后面的行都以一个+号开头,这说明以下是上一个命令的继续。这样我们定义了一个菜单,它的名字叫 "RootMenu", 它有一个标题叫"Root Menu", 里面有一些程序。当我们选中 "XTerm" 时,会使用FVWM 的 Exec 命令启动一个shell,这个shell马上会执行"exec xterm", 也就是启动一个 xterm。空字串"" 表示在菜单里画一条分隔线。Popup 可以弹出子菜单,子菜单也是用同样的方法定义的。"&"后面的那个字母会变成键盘的热键而被加上下划线,"%"括起来的是图标文件的名字,你需要设置 ImagePath 指向图标文件所在的目录。你还可以在菜单里加入侧面图标,等等等等。 * 菜单的消灭随后的AddToMenu命令会把内容附加到菜单的末尾。所以如果你想重新定义一个菜单,就需要先把它销毁掉。用
DestroyMenu RootMenu就可以把刚才那个 "RootMenu" 菜单消灭掉。 * 菜单的激活光是定义了一个菜单你是不能马上使用它的。这个菜单在什么情况下出现?这个问题是需要你自己来决定,这也是显示FVWM的完全可定制性的地方。比如,我们可以这样定义一个激活菜单的方式:
Mouse 1 R A Menu RootMenu Nop这句话的意思是:"当鼠标(Mouse)左键(1)在根窗口(R)上点击,同时有任何控制键(A)按下,这个时候显示叫做 RootMenu 的菜单。" 但是有时候我们不容易在屏幕上找到一个可以看到根窗口的地方来点击鼠标。我们可以再加一个定义:
Mouse 3 A MC Menu RootMenu Nop这样,当右键(3) 在任何地方(A)点击, 同时有Alt(M)和Ctrl(C)按下,那么弹出名叫 "RootMenu" 的菜单。 上面的 "Nop" 表示的是鼠标在菜单上进行双击时的操作。我定义为不操作。另外 Menu 还可以随意定义菜单出现的位置,详细请看 fvwm manpage。 * 菜单的样式菜单的样式是由 MenuStyle 定义的:
MenuStyle * MWM MenuStyle * PopupDelayed, PopupDelay 160, Animation, TitleWarp MenuStyle * Foreground gold, Background gray40 MenuStyle * ActiveFore White MenuStyle * Font -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-* MenuStyle * MenuFace VGradient 64 darkgray MidnightBlue这样我规定:所有的菜单,他们使用 mwm 的行为方式,弹出子菜单延时 160 ms,子菜单弹出时如果靠近屏幕边沿放不下,那么菜单整体移动使得子菜单刚好能弹出,前景色gold,背景色 gray40, 活动的项目(就是鼠标正在它上方的时候)前景色变为白色,菜单使用字体 -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*, 背景是垂直的梯度颜色,一共64阶,从 darkgray 变化到 MidnightBlue. * 动态菜单定义前面我们说过了,可以用 PipeRead 来构造一个动态菜单。现在举一个简单的例子:
AddToMenu HomeDirMenu PipeRead 'for i in $HOME/prog/*.c; do echo "+ $i Exec xterm -e vi $i"; done'当你激发这个菜单 HomeDirMenu, 就会出现你主目录/prog下的所有C程序文件的列表,当你点击其中一个就会启动vi来编辑这个C程序。是不是很方便呢?你想一想,可以用怎样无穷无尽的方式来构造一个菜单呢? 15. 按钮窗口的标题栏上都有一些按钮。那不是窗口程序自己的,而是WM给它们加上的。 FVWM 可以给窗口加上最多10个按钮,它们不光可以实现基本的最大化,最小化,关闭,等功能。FVWM的灵活性允许你赋予按钮几乎任意的功能! * 按钮编号按钮是这样编号的: ![](http://learn.tsinghua.edu.cn/homepage/2001315450/buttonnumber.png) 左边是奇数右边是偶数, 外面的大中间的小。 * 按钮功能定义下面看看按钮的功能是怎么定义的,在[鼠标和键盘](http://learn.tsinghua.edu.cn/homepage/2001315450/fvwm.html#mouse)一节我们已经知道怎么定义鼠标了,按钮的功能只不过是把鼠标与按钮号码组合在一起。 比如我的窗口上一般有三个按钮, 都在右上角,注意它们的编号: 6 4 2 ![](http://learn.tsinghua.edu.cn/homepage/2001315450/button.png) 他们的功能是这样定义的:
Mouse 1 4 A Iconify Mouse 1 6 A Close Mouse 3 2 A Maximize-Func2其中 Maximize-Func2 是用了 system.fvwm2rc 里一个函数:
DestroyFunc Maximize-Func2 AddToFunc Maximize-Func2 "M" Maximize 100 0 + "C" Maximize 80 0 + "D" Maximize 100 100如果鼠标右键在"最大化"按钮上点击(C)那么高度增长为屏幕的 80%, 宽度不变。如果按下鼠标右键后有拖动(M), 那么高度增长为屏幕高度(100%), 宽度不变。如果双击(D), 就是一般的最大化。 为什么是右键?因为我为左键在这个按钮上定义了更高级的 stroke 来改变窗口大小。我们稍后介绍。 * 按钮样式 按钮的样式是用ButtonStyle定义的。比如我的那三个按钮实际上是如下几句话定义的。
ButtonStyle All -- UseTitleStyle ButtonStyle All ActiveDown VGradient 8 palevioletred black ButtonStyle 6 16 20x20@1 30x20@1 50x40@1 70x20@1 80x20@1 80x30@0 60x50@0 80x80@0 70x80@0 50x60@0 30x80@0 20x80@0 20x70@0 40x50@1 20x30@0 20x20@1右边两个按钮的图案是系统缺省的,那个"X"形按钮是下面第三句话画出来的。这种绘图语句非常简单。ButtonStyle 之后的数字是按钮编号,后面一个数子表示一共有多少笔画。后面的XxY@C都是笔画的内容,XxY是坐标, 坐标都是用百分比表示的。@C 表示颜色, C是一个数字,0 表示阴影色,1 是高亮色,2 是背景色,3 是前景色,4 是移动光标而不画线。 你可以画你自己的按钮,也可以去拿别人设计好的来用。FVWM 的主页上有很多人提供这种按钮。 第二个语句 "ActiveDown VGradient 8 palevioletred black" 设定了所有按钮按下去还没有松开鼠标时候的样式,是一个颜色梯度。 16. 其它样式我们已经知道 Style 可以决定窗口的样式,MenuStyle 可以决定菜单的样式,ButtonStyle 按钮的样式。其实还有 CursorStyle, TitleStyle, BorderStyle. 他们决定了光标,标题栏,边框的样式。他们都有多样的语法,详细的就看 magpage 吧。这里就不照抄了。 17. 条件命令 All, Any, Cond, Current, Direction, Next, None, Pick, WindowId, ... 这些命令是条件选择窗口的办法,它们让你可以用非常多样的方法,来确定你的操作需要对哪一个或者哪些窗口进行。比如:
All (Iconic) MoveToPage -1 -1把所有图标化的窗口都移动到桌面右下角的那一页。
Key F5 A A Direction North Maximize True 0 growdown以后按 F5 就可以让当前聚焦窗口上面(North)那个窗口往下长大,直到被当前窗口挡住去路。你有时候想在VIM里抄 Acrobat Reader 里的内容,安排窗口大小的时候就可以用这招。 18. 手写操作 (Stroke)你用过 EDA 软件吗?用过的话,你就可以知道鼠标动作(stroke)是多么的方便!你是否想在你的窗口管理器里也使用鼠标动作? * 让 FVWM 支持 Stroke如果你的FVWM窗口管理器编译进了 libstroke, 你就可以使用鼠标动作操纵程序。libstroke 是一个免费使用的 stroke 库,你可以在 [http://www.etla.net/libstroke/ ](http://www.etla.net/libstroke/)得到 libstroke. 下载那个为 FVWM 准备的版本,编译后安装,然后再编译 FVWM,它一般就会找到 libstoke,从而加入 stroke 的功能。 比如我在屏幕上按住 ctrl, 用右键 * 画一个 "r" 字就可以启动 rxvt * 画一个 "V" 就可以启动 vim * 画出 "D" 右边的弧线就可以启动 IBM 智能辞典 * 画一个 "e" 启动 emacs ... * 鼠标左右一晃,就可以启动 xkill,再往某个窗口一点,就可以强制杀死不听话的窗口 * 在窗口里右键往下一划,就可以最小化窗口 * 在窗口边框上用右键…… * 向上拖就可以使窗口往上一直长到被别的窗口挡住的地方 * 向左拖就可以使窗口往左一直长到被别的窗口挡住的地方 * 右……下……斜上…… 从边框开始画一个"L"形就可以回复窗口原来大小 当然这些控制方式都是你自己决定的, 这一切只需要在 .fvwm2rc 里加入一些Stroke语句. 因为太多了,写在主配置文件影响编辑, 这些语句被我写到了另一个文件里,然后在主文件用 Read 语句读入。你可以在这里下载我的[fvwm.stroke](http://learn.tsinghua.edu.cn/homepage/2001315450/src/fvwm.strokes)文件作为参考。 你还可以定义非常高级的操作,你甚至可以这样:按住 ctrl, 用鼠标中键画出一条射线箭头指向的那个窗口, 不论它在那个桌面,就会被吸过来,并且随鼠标移动,你点击左键就可以放置它。19. 轨迹stroke 的原理很简单,libstroke 可以识别出你在屏幕上画出的轨迹,把它报告给FVWM,这样FVWM根据轨迹的不同采取不同的操作。轨迹是由一个电话拨号盘的方式确定的。也就是说,把你画出的东西分成9个区域,看你的鼠标依次经过那几个区域。
1 2 3 4 5 6 7 8 9轨迹也可以用你的小键盘上的数字键来确认。看看你的小键盘:
7 8 9 4 5 6 1 2 3
Stroke 项目的定义在你的配置文件里写入一些 Stroke 语句:
Stroke Sequence Button Context Modifiers Function
比如:Stroke N7414789 0 A C Exec exec rxvt Stroke N7414759 0 A C Exec exec rxvt Stroke N74147589 0 A C Exec exec rxvt Stroke N7414756 0 A C Exec exec rxvt Stroke N74156 0 A C Exec exec rxvt Stroke N74159 0 A C Exec exec rxvt
Stroke 关键字之后跟上轨迹说明。轨迹是一系列数字,如果数字前面有一个”N”, 就表示我们采用小键盘的布局,而不是电话拨号盘。你看我的那几个轨迹,实际上是我们在写 “r” 字母的时候有可能出现的几种情况。比如,这个轨迹就是符合 “N7414589”.
轨迹之后是鼠标按键号码。如果号码不是0,那么一旦识别到这个轨迹,就会马上执行操作。但是如果号码是0,那么说明这个定义不是在任何时候识别到就马上进行的。而是当 StrokeFunc 命令被调用的时候才进行。StrokeFunc 为你提供了更多的灵活性。
号码之后是 Context Modifiers Function. 他们跟 Mouse, Key 的那两个同名参数是一个意思,参看 鼠标和键盘.
StrokeFunc如果你的鼠标号码是0. 那么当 StrokeFunc 被调用的时候,这个轨迹如果被识别,就会执行相应的操作。比如:
#Drag mouse 1 on the maxmize button Mouse 1 2 N StrokeFunc DrawMotion
现在看到了? 这就是我的最大化按钮上对鼠标左键的绑定。DrawMotion 是 StrokeFunc 的一个可选参数,它可以让轨迹在屏幕上被画出来,这样你可以清楚的看到你到底写了什么。我有如下的一系列 stroke 定义:
#grow horizontal and vertically Stroke N258 0 TSF2 N Maximize True 0 growup Stroke N852 0 TSF2 N Maximize True 0 growdown Stroke N456 0 TSF2 N Maximize True growright 0 Stroke N654 0 TSF2 N Maximize True growleft 0 #grow bidirectional Stroke N25852 0 TSF2 N Maximize True 0 grow Stroke N5852 0 TSF2 N Maximize True 0 grow …….. #reverse to unmaximized Stroke N74123 0 TSF2 N Maximize False
我的鼠标左键按下”最大化”按钮之后可以进行绘画,然后窗口会随着轨迹的不同而采取各种各样的改变大小的行动!我还有一个定义:
Mouse 3 TSF N StrokeFunc DrawMotion
这样鼠标右键在窗口标题栏,边框,frame 上绘画时也会触发 StrokeFunc 函数,达到跟左键在”最大化”按钮上绘画同样的效果。发现了吧?StrokeFunc 为我省去了重复的轨迹定义,否则我需要为”左键+最大化按钮”和”右键在边框”定义两套 stroke.- 实例分析我们来分析一种可能的执行情况:用鼠标左键按下”最大化”按钮(2),然后向右画。就像这个样子:
当鼠标左键在"最大化"按钮(2)上按下之后,如果没有键盘控制键按下(N),而那么根据"Mouse 1 2 N StrokeFunc DrawMotion", FVWM就会发现应该调用 StrokeFunc.
StrokeFunc 会马上记录鼠标按下的时候有哪些控制键按下了,现在是没有控制键(N).
然后它发现鼠标随即向右画出了一条线,看看你的小键盘,这是N456。StrokeFunc 就会在已经定义的 Stroke 里去找,是否存在这样的一个定义,它的前面部分是
Stroke N456 0 2 N ...它发现有一个
Stroke N456 0 TSF2 N Maximize True growright 0它的 Context: TSF2 包含了标题栏按钮2。鼠标动作开始时没有控制键按下,而这个项目的Modifiers里也是N. 那么这是一个符合的项目。所以进行操作 "Maximize True growright 0":把窗口向右扩大,直到被另一个窗口或者屏幕边沿挡住。 ![](http://learn.tsinghua.edu.cn/homepage/2001315450/grow.png) 注意控制键都是在动作开始时就已经记录下来了。如果你在绘画的途中放开了或者按下了控制键是不会改变识别的效果的。 23. 怎样提高识别率通常不要定义太复杂的轨迹,因为变化太多了就不容易识别。左右晃一晃,上下摇一摇,转个圈儿,……已经可以完成你很多任务了。 如果是复杂的 stroke, 比如写一个字母,你需要定义很多相似的 stroke,否则有时不能匹配。如果你不能确定会出现那些轨迹,你可以给 StrokeFunc 一个参数,比如:
Mouse 1 2 N StrokeFunc EchoSequence然后你在屏幕上多画几次你的那个字母,无论它是否匹配一个定义,FVWM 会在启动它的那个终端输出你画出的轨迹号码。那些就是你写这个字母时有可能出现的轨迹,你把这些序列都加到你的配置文件,这样就提高了识别率。 注意这个输出号码的终端很有可能是 tty1,在Linux下你需要Ctrl-Alt-F1切换到tty1才能看到输出。如果你不喜欢这么麻烦,你可以在启动X的时候只启动一个 xterm, 然后在这个 xterm 里面启动 fvwm. 24. 键盘触发 Strokestroke 也可以由键盘来触发。比如:
Key F6 A C StrokeFunc DrawMotion NotStayPressed按下 Ctrl-F6 之后,FVWM就会调用 StrokeFunc, 由于我们设定了 NotStayPressed 参数,绘画一直会延续到一个鼠标键按下的时候才结束。这时你就可以用鼠标移动画出一个轨迹,然后按一下鼠标。 25. 模块模块是FVWM可以扩展的奥秘。模块是通过管道跟FVWM通信的程序,它们必须由FVWM启动(fork). 也就是说,你可以从 FvwmConsole 来启动这些模块,也可以用菜单,鼠标,热键……来启动。但是就是不能从 xterm 或者 rxvt 敲入命令来启动它们。 * 你有没有发现。当你的鼠标移动到窗口后,如果它被别的窗口挡住了,它并不会跑到上面来。如果你想让它自动上来,你可以使用 FvwmAuto 模块来实现一个简单的"自动提升"功能。我的 StartFunction 里有如下内容:
AddToFunc StartFunction + I Module FvwmAuto 500 Raise Nop其实你还可以用 FvwmAuto 实现非常复杂的自动提升功能。 * 你想让你的窗口图标化(Iconify) 和取消图标化(Deinconify) 的时候都有漂亮的动画吗?用以下设定来配置你的 FvwmAnimate 模块,然后启动它,就可以有眼花缭乱的效果了 :)
*FvwmAnimate: Delay 25 *FvwmAnimate: Effect Random *FvwmAnimate: Width 3这些行是对 FvwmAnimate 的配置,模块的配置命令都是 "*" 号开始的。 * 你想要一个 Windows 那样的任务栏吗?启动 FvwmTaskBar 模块就行了。 * 想要一个 Pager? FvwmPager 可以提供你用不完的功能。参看[FvwmPager](http://learn.tsinghua.edu.cn/homepage/2001315450/fvwm.html#pager). * Drag & Drop? 启动 FvwmDragWell, 就可以让支持 XDND 的程序工作。 * 你想这样一种功能:每次当名叫 XXX 的程序出现时,就把它大小变为 400x300, 移动到屏幕右边,然后启动一个 rxvt 跟它作伴?用 FvwmEvent 可以轻松达到你的目的。 * 你想做一个简单的图形界面程序?用 FvwmScript 可以快速的达到你的目的。 * 写配置文件太冗长了?用 FvwmM4 可以让你用 M4 宏处理语言来预处理配置文件。 * 你想有更加超级的操纵方式?FvwmPerl 可以让你使用 Perl 脚本的方式来操纵 FVWM. 模块的功能可能很复杂,它们都有自己分别的 manpage. 下面几节我们介绍一些常用的模块。26. FvwmPager既然 fvwm 有很多工作区。能不能有一个东西可以方便的看到那些工作区上有哪些程序,而且可以方便的切换工作区呢?FvwmPager就是为这个目的设计的。 我的Pager是这个样子: ![](http://learn.tsinghua.edu.cn/homepage/2001315450/pager.png) FvwmPager有很多可以设定的参数,现在你可以试试这个简单的配置,这就是上面这个 pager 的配置。
*FvwmPager: Rows 4 *FvwmPager: Columns 1 *FvwmPagerBack #908090 *FvwmPagerFore #484048 *FvwmPager:Font -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-* *FvwmPagerHilight #cab3ca *FvwmPagerLabel 0 Main *FvwmPagerLabel 1 Internet *FvwmPagerLabel 2 Program *FvwmPagerLabel 3 Amusement *FvwmPager:SmallFont -*-simsun-medium-r-*-*-12-*-*-*-*-*-*-* *FvwmPagerBalloons All *FvwmPagerBalloonBack Yellow *FvwmPagerBalloonFore Black *FvwmPager:BalloonFont -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-* *FvwmPagerBalloonYOffset +2 *FvwmPagerBalloonBorderWidth 1 *FvwmPagerBalloonBorderColor Black这些行是对 FvwmPager 的配置,模块的配置命令都是 "*" 号开始的。 在 FVWM 里启动它:
Module FvwmPager 0 3
FvwmButtons上面的Pager不错吧?不过它总是在屏幕上占那么一块位置,有没有办法让它可以在需要的时候才伸出来呢?你可以用 FvwmButtons 把FvwmPager包装起来实现这个功能。
这里是我的一个简单的配置:
FvwmButtonsBack bisque3 MainPanel: Geometry 80x18+40+4 MainPanel: Back SeaGreen MainPanel: (Panel(down, indicator, delay 0, steps 1) PagerPanel “Module FvwmButtons PagerPanel”) MainPanel: Font --simsun-medium-r---16------- PagerPanel: Geometry 80x352 PagerPanel: (Swallow FvwmPager “Module FvwmPager 0 3”) PagerPanel: Font --simsun-medium-r---16-------
这个FvwmButtons设置了一个 button 叫做 “MainPanel”. 你可以用:Module FvwmButtons MainPanel
来启动它. 它启动时是这个样子:挂在屏幕左上偏右一点的地方,既没有挡住左边的按钮,又不会挡住窗口的下拉菜单。点一下就会展开,展开以后就是这个样子:
再点就会缩回去。
FvwmButtons 可以提供的功能远远不止这些。FvwmButtons 是一个非常强大的模块。你有兴趣可以看看它的 manpage.
-
- 为什么 FVWM 不能用图片作为背景?不熟悉Xwindow的人经常问这种问题。答案是FVWM确实不能设置复杂的高清晰图片作为背景,但是你却可以用图片作为背景。原因是:设置背景根本不是WM的职责,你需要用其它程序,比如 xloadimage, xv, … 在根窗口上放置一幅图片,那就是所谓的”桌面背景”。你可以把它加入你的启动函数,一个 xloadimage 的例子可以在上面 看到。
FVWM怎么锁定屏幕呢?你又问到一个容易混淆的问题。锁定屏幕也不是WM必须有的功能。几乎所有WM都是调用另外一个程序,比如 xscreensaver 来锁定屏幕和提供屏幕保护,然后在它们的菜单里加入对 xscreensaver 配置程序 xscreensaver-demo 的调用。看起来好像是WM提供了屏幕保护功能,让很多用户模糊了WM的职责。
你可以把 xsreensaver 加入到FVWM的启动函数里。参看启动函数和退出函数.
为什么 FVWM 的窗口标题不能显示汉字?FVWM当然能显示汉字了,它是一个国际化的程序。原因在于你没有设置好汉字字体。你可以在配置文件里加入汉字字体的设定:
Style Font --simsun-medium-r---14-------
simsun 是我机器上一种同时可以支持汉字和英语编码的字体,如果你的字体只有汉字编码,那么你的英文全部都会”乱码”,这时你需要在后面再加一个英文字体。比如:Style Font “-cjacker-magicsong-medium-r---14------gb2312.1980-0,-r-*”
类似的,pager,windowlist 都有自己的字体设定,你需要把它们都设置为你喜欢的中文字体。另外,据说 FVWM 2.5 以前的版本对汉字支持不好。我没有用过 2.4.x,不知道怎么解决。如果你遇到这个问题就升级到 2.5.x 吧。
- FVWM 有工具条吗?有。启动 FvwmTaskBar 模块就行了。你还可以把它配置的非常漂亮。这里给出一个我的简陋的配置方案。
Style FvwmTaskBar HandleWidth 0, BorderWidth 0 FvwmTaskBar: UseSkipList FvwmTaskBar: AutoStick FvwmTaskBar: DeskOnly FvwmTaskBar: Action Click1 DeiconifyRaiseAndFocus FvwmTaskBar: Action Click2 Iconify On FvwmTaskBar: Action Click3 Lower FvwmTaskBar: MailCommand Exec exec rxvt -e mutt FvwmTaskBar: 3DFvwm FvwmTaskBar: StartName FVWM FvwmTaskBar: StartMenu RootMenu FvwmTaskBar: Font --simsun-medium-r---14------- FvwmTaskBar: SelFont --simsun-medium-r---14------- FvwmTaskBar: ShowTips FvwmTaskBar: ClockFormat FvwmTaskBar: WindowButtonsRightMargin 20 FvwmTaskBar: Back seagreen FvwmTaskBar: Fore gold2 FvwmTaskBar: FocusFore cornsilk FvwmTaskBar: IconBack darkgreen FvwmTaskBar: IconFore white
另外,FvwmButtons 模块提供了更加复杂的功能。你可以把很多小程序(xclock,biff…)和模块(FvwmIconMan)嵌入到它里面。形成一个复杂的工具条。详情请 man FvwmButtons。你也可以使用 KDE 的 kicker 工具条和 Gnome 的 gnome-panel. 请看 后面。 - FVWM 能不能像 Windows 那样用 Alt-Tab 切换窗口?能。把这行加入 .fvwm2rc:
Key Tab A M WindowList Root c c NoDeskSort
这个绑定不知道什么时候好像成了 FVWM 缺省的。如果你不喜欢,那么加入:Key Tab A M -
取消这个定义。 我不想要鼠标移动到窗口上就自动聚焦的方式怎么办?FVWM 缺省的聚焦方式是 MouseFocus,也就是说,鼠标如果移动到哪个窗口,那个窗口就得到键盘聚焦。如果你想用 Windows 那样的需要点击鼠标才聚焦,那么你可以用 ClickToFocus 方式:
Style * ClickToFocus, ClickToFocusPassesClick
我用 MouseFocus 方式,可是当我的一个窗口被 Lower 后,我只能把鼠标移到其它窗口再移回来才能重新提升它。缺省的 MouseFocus 方式不会在点击时提升窗口。如果你想点击窗口时提升它,那么加入配置:
Style * MouseFocusClickRaises
怎样才能使窗口获得焦点后自动提升?你需要使用 FvwmAuto 模块。把 FvwmAuto 加入你的起动函数:
AddToFunc StartFunction + I Module FvwmAuto 500 Raise Nop
为什么 Acrobat Reader 打开一个全屏 PDF 文件后,还原为窗口还是不能移动?把这行加到你的配置文件就行了:
Style "AcroRead" VariablePosition, VariableUSPosition
怎样才能让 ImageMagick 或者 Gimp 的几个小窗口同时提升或者下降呢?把这行加到你的配置文件就行了:
Style "Display" RaiseTransient LowerTransient StackTransientParent Style "Gimp" RaiseTransient LowerTransient StackTransientParent
屏幕保护出现时,XSIM 输入法的状态窗口为什么不消失呢?这是 XSIM 的一个 bug, 它设置了状态窗口的 OverrideRedirect 属性以至于没有窗口管理器能够管理它。我已经帮助修正了这个 bug。你只需要在 plugins/StatusPanels/std/statuspanel_std.cpp 的
TWstring TStatusPanel_STD::create(Obj_Config conf, Status_Pack * sp)
函数末尾 return NULL; 之前加入以下两行:wa.override_redirect = False; set_winattr(CWOverrideRedirect, &wa);
问题就已经解决了。
如果你还不满意,你想让 FVWM 可以设定 xsim 的样式,那么你可以把这个函数中设置 OverrideRedirect 的那几行代码去掉。
/ XSetWindowAttributes wa; wa.override_redirect = True; set_winattr(CWOverrideRedirect, &wa); /
自己设置它的属性。我们可以给它边框,也可以不给它边框。你可以把这些配置写到你的 .fvwm2rc 得到一个比较好的效果。Style “XSIM” Layer 7, NoTitle, HandleWidth 1, Sticky, WindowListSkip
注意如果去掉了 OverrideRedirect 属性,在某些不能随意定制窗口样式的窗口管理器里,状态窗口会被包上厚重的标题栏和边框!你可以试试 fcitx 输入法服务器。我现在换用这个了。我觉得比 XSIM 好用。直接安好就可以了,没有以上问题 :)
FVWM 能和KDE, Gnome 一起工作吗?KDE 和 Gnome 都是完整的桌面系统,包括了WM和其它很多东西。FVWM 只是一个WM。FVWM可以替代 KDE 缺省的 kwin,或者 Gnome 缺省的 sawfish 成为它们的WM。
只用KDE和Gnome的工具条很多时候 Gnome 和 KDE 的程序是跟他们的桌面系统可以分开使用的。其实你有可能只需要它们漂亮的panel。
Gnome 的工具条叫做 gnome-panel, 在 xterm 启动一个就行了。
KDE 的工具条叫做 kicker. 注意 KDE 有些程序需要 dcopserver, 你可以先启动 dcopserver。
KDE 和 gnome 的panel上的pager和fvwm的FvwmPager都是相通的,所以你可以用它们任何一个来切换桌面 :)
如果你在kde的任务条用右键选择”总在最前”可能不起作用,因为现在它们得完全听fvwm的话不过你可以给它们额外的权力,请参考fvwm manpage 的有关EWMH 的部分
- 完全启动Gnome和KDE与FVWM一起工作还有些kde程序不知道用了什么通信方式,启动后就dump了。你可以用 startkde 来启动整个 KDE 系统。一般来说它们都可以与fvwm一起很好的工作。
Gnome 的启动命令叫做 gnome-session. 它也可以完全与 fvwm 一起工作。
这样你就可以用 fvwm 的方式来控制所有桌面系统的窗口了。嘿嘿
- 特种技巧
即时战略游戏式的控制窗口很多即时战略游戏都可以对士兵等进行分组比如选定一组士兵后按 Ctrl-Alt-1,可以把一组士兵标记为第1小分队以后按 Ctrl-1 就可以让这些士兵待命。
其实FVWM可以很容易把一些窗口当成士兵。只要把这些行加入 .fvwm2rc
Key 0 WI MC Key 0 A C WindowId $[w.id] WarpToWindow 50 50 Key 1 WI MC Key 1 A C WindowId $[w.id] WarpToWindow 50 50 Key 2 WI MC Key 2 A C WindowId $[w.id] WarpToWindow 50 50 …. Key 9 WI MC Key 9 A C WindowId $[w.id] WarpToWindow 50 50
聚焦一个窗口后按 Ctrl-Alt-n, 就把它标记为n号。以后不论什么时候按 Ctrl-n,就会回到这个窗口。
$[w.id] 是 FVWM 2.5.6 以后使用的表示窗口id的变量。较老版本的FVWM使用 $w 来表示窗口id。 2.4.x 的用户试试:
Key 0 WI MC Key 0 A C WindowId $w WarpToWindow 50 50 Key 1 WI MC Key 1 A C WindowId $w WarpToWindow 50 50 Key 2 WI MC Key 2 A C WindowId $w WarpToWindow 50 50 …. Key 9 WI MC Key 9 A C WindowId $w WarpToWindow 50 50
这显示 Key 等命令全都可以嵌套使用!当然你可以用类似的办法得到更令人惊讶的效果!just imagine!
…………….
…………….
想到了吗?好了,来看看一个更超级的用法。在你的 .fvwm2rc 加入这些:
Key 0 WI SC State 0 Key 1 WI SC State 1 Key 2 WI SC State 2 Key 3 WI SC State 3 Key 4 WI SC State 4 Key 5 WI SC State 5 Key 6 WI SC State 6 Key 7 WI SC State 7 Key 8 WI SC State 8 Key 9 WI SC State 9 Key a WI SC State 10 …. DestroyFunc GroupFunc AddToFunc GroupFunc I Layer 1 + I MoveToPage + I Iconify off + I Raise Key 0 A M All (State 0) GroupFunc Key 1 A M All (State 1) GroupFunc Key 2 A M All (State 2) GroupFunc Key 3 A M All (State 3) GroupFunc Key 4 A M All (State 4) GroupFunc Key 5 A M All (State 5) GroupFunc Key 6 A M All (State 6) GroupFunc Key 7 A M All (State 7) GroupFunc Key 8 A M All (State 8) GroupFunc Key 9 A M All (State 9) GroupFunc Key a A M All (State 10) GroupFunc ….
以后按 Ctrl-Shift-n,就可以把当前聚焦窗口设置为”第n组”(State n)。n 可以从 0 到 31。以后我们可以按 Alt-n 来把第n组的窗口都移动到当前 page,全部 deiconify 并且提升–待命!
你是否听到那些窗口在说:”Yes, Sir?” 你能想出更好玩的用法吗?发挥你的想象力吧!
我的配置文件定义了很多奇怪的热键加鼠标的用法,还有 stroke。你肯定不希望马上拷贝到你的目录里使用,因为你会不知道怎么用了 :)
各种工具之正则表达式语法比较
grep 2.5.1 | egrep 2.5.1 | sed 3.02 sed 4.07 | awk 3.1.1 | perl 5.8.0 | vim 6.1 | JavaScript ?? | |
转义 | |||||||
行头 | ^ | ^ | ^ | ^ | ^ | ^ | ^ |
行尾 | $ | $ | $ | $ | $ | $ | $ |
n个 {n} {m,n} {m,} {,n} | {n} | {n} | {n} | {n}或{n} 仅定义 –posix 或 –re-interval有效(要表达}和{,得用{和} 没有定义–posix或–re-interval时,不能用{n}的语法, }{和}{同义 | {n} | {n} | {n} |
{0,} | 或, (要表达,得用*) | * | |||||
{1,} | + | + | + | +或+, (要表达+, 得用+) | + | + | + |
{0,1} | ? | ? | ? | ?或?, (要表达?, 得用\?) | ? | ? | ? |
任意字符 | . | . | . | . 含n. | . /s修饰后则含n | . 除n | . 除n |
(pat) 匹配并获结果 | (pat) | (pat) | (pat) | (pat)或(pat) (要表达括号,用( ) ) | (pat) | (pat) | (pat) |
(?:pat) 匹配但不获结果 | 不支持 | 不支持 | 不支持 | 不支持 | (?:pat) | 不支持 | (?:pat) |
(?=pat) 等于预查 | 不支持 | 不支持 | 不支持 | 不支持 | (?=pat) | 不支持 | (?=pat) |
(?!pat) 不等预查 | 不支持 | 不支持 | 不支持 | 不支持 | (?!pat) | 不支持 | (?!pat) |
| 或 | | | | | | | |或| (要表达|,得用|) | | | | | | |
其中任意字符 | [xyz] | [xyz] | [xyz] | [xyz] | [xyz] | [xyz] | [xyz] |
[.ch.] [=ch=] | 不支持 | 不支持 | [.ch.] | 不支持 | 不支持 | 不支持 | 不支持 |
单词边界 b | b | b | b | 不支持 | b | 不支持 | b |
非单词边界 B | B | B | B | 不支持 | B | 不支持 | B |
单词左右边界 <> | < > | < > | < > | 不支持 (><和><和\>\<同义 | 不支持(><和><同义 | < > | 不支持(><和><同义 |
控制字符 /cx | 不支持 | 不支持 | cx | 不支持 | cx | 不支持 | cx |
数字d | 不支持 | 不支持 | 不支持 | 不支持 | d | d | d |
非数字D | 不支持 | 不支持 | 不支持 | 不支持 | D | D | D |
换页 f | 不支持 | 不支持 | 高版本支持 | f | f | 另义 f表示文件名字符 | f |
换行 n | 不支持 | 不支持 | 不支持 | n | n | n | n |
回车 r | 不支持 | 不支持 | r | r | r | r | r |
空白 s | 不支持 | 不支持 | 不支持 | 不支持 | s | s | s |
非空白 S | 不支持 | 不支持 | 不支持 | 不支持 | S | S | S |
制表符 t | 不支持 | 不支持 | 高版本支持 | t | t | t | t |
垂直制表符 v | 不支持 | 不支持 | 高版本支持 | v | v | 另义 v表示very magic | v |
单词字符 w [A-Za-z0-9_] | w | w | w | 不支持 | w | w | w |
非单词字符 W [^A-Za-z0-9] | W | W | W | 不支持 | W | W | W |
xn 16进制 | 不支持 | 不支持 | 高版本支持 | xn | xn | 另义 x表示[0-9A-Za-z] | xn |
n 八进制 | 不支持 | 不支持 | 不支持 | n | n | 不支持 | n |
n 后向引用 | n | n | n | n 仅取结果可用 | n | n 仅取结果可用 | n |
[:alnum:] 字母和数字 | [:alnum:] | [:alnum:] | [:alnum:] | [:alnum:] | [:alnum:] | [:alnum:] | 不支持 |
[:alpha:] 字母 | [:alpha:] | [:alpha:] | [:alpha:] | [:alpha:] | [:alpha:] | [:alpha:] | 不支持 |
[:cntrl:] 控制字符 | [:cntrl:] | [:cntrl:] | [:cntrl:] | [:cntrl:] | [:cntrl:] | [:cntrl:] | 不支持 |
[:digit:] 数字 | [:digit:] | [:digit:] | [:digit:] | [:digit:] | [:digit:] | [:digit:] | 不支持 |
[:graph:] 可打印字符(不含空格) | [:graph:] | [:graph:] | [:graph:] | [:graph:] | [:graph:] | [:graph:] | 不支持 |
[:lower:] 小写 | [:lower:] | [:lower:] | [:lower:] | [:lower:] | [:lower:] | [:lower:] | 不支持 |
[:print:] 可打印字符(含空格) | [:print:] | [:print:] | [:print:] | [:print:] | [:print:] | [:print:] | 不支持 |
[:punct:] 标点 | [:punct:] | [:punct:] | [:punct:] | [:punct:] | [:punct:] | [:punct:] | 不支持 |
[:space:] 空格 | [:space:] | [:space:] | [:space:] | [:space:] | [:space:] | [:space:] | 不支持 |
[:upper:] 大写字母 | [:upper:] | [:upper:] | [:upper:] | [:upper:] | [:upper:] | [:upper:] | 不支持 |
[:xdigit:] 16进制数字 | [:xdigit:] | [:xdigit:] | [:xdigit:] | [:xdigit:] | [:xdigit:] | [:xdigit:] | 不支持 |
[:return:] | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | [:return:] | 不支持 |
[:tab:] | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | [:tab:] | 不支持 |
[:escape:] | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | [:escape:] | 不支持 |
[:backspace:] | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | [:backspace:] | 不支持 |
Shell 条件判断总结
UNIX Shell 编程
一些条件判断 总结
-b file 若文件存在且是一个块特殊文件,则为真
-c file 若文件存在且是一个字符特殊文件,则为真
-d file 若文件存在且是一个目录,则为真
-e file 若文件存在,则为真
-f file 若文件存在且是一个规则文件,则为真
-g file 若文件存在且设置了SGID位的值,则为真
-h file 若文件存在且为一个符合链接,则为真
-k file 若文件存在且设置了”sticky”位的值
-p file 若文件存在且为一已命名管道,则为真
-r file 若文件存在且可读,则为真
-s file 若文件存在且其大小大于零,则为真
-u file 若文件存在且设置了SUID位,则为真
-w file 若文件存在且可写,则为真
-x file 若文件存在且可执行,则为真
-o file 若文件存在且被有效用户ID所拥有,则为真
-z string 若string长度为0,则为真
-n string 若string长度不为0,则为真
string1 = string2 若两个字符串相等,则为真
string1 != string2 若两个字符串不相等,则为真
int1 -eq int2 若int1等于int2,则为真
int1 -ne int2 若int1不等于int2,则为真
int1 -lt int2 若int1小于int2,则为真
int1 -le int2 若int1小于等于int2,则为真
int1 -gt int2 若int1大于int2,则为真
int1 -ge int2 若int1大于等于int2,则为真
!expr 若expr为假则复合表达式为真。expr可以是任何有效的测试表达式
expr1 -a expr2 若expr1和expr2都为真则整式为真
expr1 -o expr2 若expr1和expr2有一个为真则整式为真
特殊变量
$0 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径
$n 该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2…)
$# 提供脚本的参数号
$ 所有这些参数都被双引号引住。若一个脚本接收两个参数,$等于$1$2
$@ 所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2
$? 前一个命令执行后的退出状态
$$ 当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID
$! 前一个后台命令的进程号