修改exvim目录过滤逻辑为匹配拒绝

exVim 是一个非常优秀的 Vim 环境,通过它能够省去很多 Vim 插件的配置工作。自从使用上 exVim 后,我基本没有再自定义 Vim 插件,完全依赖 exVim 打包的辅助功能。

最近让我略有不爽的使用问题是:exVim 默认的 file filter 和 dir filter 都是匹配通过的,即“匹配 filter 过滤条件的目录和文件被通过,列入项目目录、文件列表中”。

exVim 的 dir filter

对于文件来说,设置匹配通过毫无问题。因为我也想要项目中仅包含 “.cpp,.c,.h,.py” 这样的源代码文件,选出来匹配这些模式的文件就是我希望的结果。

但是对于目录来说,设置匹配通过就与我通常的需求相悖了。一般情况下,项目目录下的所有目录都是程序需要的。但是一些专门存放测试程序、测试框架、输出文件的目录,我其实不希望显示在我的项目中。而且 exVim 中的目录过滤貌似仅限在项目顶层目录中,过滤的意义不大。

所以我修改了一下 exVim 的代码,将默认的 dir filter 含义修改为匹配拒绝,即:“匹配 dir filter 的目录被拒绝(被过滤掉),无论它在哪一级。"例如,我将 dir filter 设置为 “test,output”,那么我项目目录下所有叫做 test 或者 output 的子目录都不会显示到项目目录列表中,而不妨碍其它名称目录的通过。

可以想见两个 filter 采用不同的通过逻辑并不是 exVim 开发者希望看到的,所以我想这个修改也没必要提交给开发者。不过我仍然觉得这是很有用的一个修改,所以拿出来分享一下。修改的补丁文件见:http://share.solrex.org/ibuild/exvim-dir_filter-8.05_b2.patch

PS: patch 文件中还有一个改动是将 quick_gen_project_PROJECT_autogen.sh 文件从项目目录下,移动到项目目录下的 .vimfiles.PROJECT/ 目录中,原因是看起来碍眼 :)

Google 拼音词库转 Vimim 词库脚本

我写了一个将 Google 拼音输入法词库转换为 Vimim 词库的脚本,贴在这里,希望对大家有用。

#!/bin/bash
iconv -f gbk -t utf-8 "$@" | sed -e 's/ //g;s/^M$//g' | awk 'NR==1 {a=$3; printf "%s %s",$3,$1; next; }{ if($3==a) printf " %s",$1;else printf "n%s %s",$3,$1; a=$3;}' | sort  -d

(注意:上面那个 ^M 在 vim 中的输入方法是 Ctrl+vm。)

使用方法:
1. 在 Google 拼音输入法“属性设置->词典”选项页,将 Google 输入法词库导出为 .dic 文件,例如 google.dic。
2. 将 google.dic 拷贝到 Linux 中,或者使用 Cygwin,进入到包含 google.dic 的目录。
3. 下载本邮件附件 google2vimim,给它增加可执行权限 chmod u+x google2vimim。
4. ./google2vimim google.dic > vimim.pinyin.txt,得到的 vimim.pinyin.txt 就是符合 Vimim 规范的词库。

PS: 是的,我忘记了 r 的作用,所以上面脚本可以完全替换为:

#!/bin/bash
iconv -f gbk -t utf-8 "$@" | sed -e 's/ //g;s/r$//g' | awk 'NR==1 {a=$3; printf "%s %s",$3,$1; next; }{ if($3==a) printf " %s",$1;else printf "n%s %s",$3,$1; a=$3;}' | sort  -d

脚本的最新版本下载地址可以是:http://share.solrex.org/scripts/google2vimim

用 Vim 对矩阵转置

前两天某个同学在科苑星空 BBS 上问到了一个有趣的问题:如何在 Vim 中对矩阵进行转置?

我当时想,转置不就是行列互换嘛,awk 可以取一列,那么拿出来每列然后打印成一行不就好了?类似于:

echo `awk '{printf "%s ",$1}' file`
echo `awk '{printf "%s ",$2}' file`
echo `awk '{printf "%s ",$3}' file`
...

本来觉得用 bash 写一个循环语句就可以了,但是怎么也尝试不出来如何替换那个 $1, $2, $3...就想没办法了只能搞 eval 了。但是我觉得这种事情 Unix 前辈们应该干过,所以就搜了一斧子,果然搜到了一个 AWK 程序,《Sed & Awk》 Ch13.9 Perform a Matrix Transposition:

#! /bin/sh
# Transpose a matrix: assumes all lines have same number of fields

exec awk '
NR == 1 {
    n = NF
    for (i = 1; i <= NF; i++)
        row[i] = $i
    next
}
{
    if (NF > n)
        n = NF
    for (i = 1; i <= NF; i++)
        row[i] = row[i] " " $i
}
END {
    for (i = 1; i <= n; i++)
        print row[i]
}' ${1+"$@"}

哈,除了觉得这样内存占用可能比较大之外,这可是一个相当不错的程序。

在 Vim 中调用就很简单了,将上面脚本保存成 transpose,加上可执行属性放在某个可执行路径下(比如 ~/bin),然后在 Vim 编辑矩阵文件时 :%!transpose 就可以了。

PS: 另外,在查证矩阵的“转置”应该写成“转秩”还是“转置”时,我在 Wikipedia 发现一个很有意思的东西:

矩阵用词
在中国大陆,横向称为“行”,纵向称为“列”。 在台湾,横向称为“列”,纵向称为“行”。

天那,要是用汉语和台湾同学讨论矩阵的话,该有多痛苦呀!

Vim 中文输入法插件 Vimim

有位朋友在 TopLanguage 讨论组里向我推荐了一款非常 cool 的 vim 输入法插件:vimim,您可以从 Vim 插件页下载 Vimim,演示程序和码表可以在 Vimim Googlepage下载。Vimim 作为一个 Vim 插件项目起始于 09 年一月份,可能知晓它的用户还比较少,所以我觉得有必要向大家推荐一下这款优秀的 Vim 插件。

作为中文用户,在 Vim 里输入中文往往是一件非常痛苦的事情,最别扭的地方在于使用中文输入法时进行 Vim 编辑模式之间切换比较麻烦,还容易误操作,这也是我一般不使用 Vim 编辑中文文档的原因。

简单地来说,这个插件使得你在 Vim 里直接输入中文(使用 Ctrl+\ 开启选词单而不是通常输入法使用的空格键)。当你不按 Ctrl+\ 时,你就是在输入英文字母,这样就避免了中英文输入法切换的问题。这个插件的使用方法和演示在 Demo 页展示得很清楚,这里我就不再赘述了。

不过在使用上我仍然面临着一个小问题,Vimim 目前提供的双拼码表是基于微软双拼的,而我习惯于智能 ABC 双拼,所以我在 Vimim 的讨论组里抱怨了一下:《希望双拼音节映射独立于码表》。

------------------------------ 我是分割线 ------------------------------

我的 BSP yo2.cn 服务器宕机从 09 年 5 月 12 日起延续了将近三天,期间可能导致部分用户遇到无法访问问题,请见谅。