技术手记

Windows下使用gVIM工作

前面有一个_vimrc的文件说明, 用了几天还是有一些小修补更改了一些小细节使得使用更加顺手, 这次一起写一下gVIM的全部安装, 方便大众, 推广vim :P
1.要使用的软件描叙
  1.1 环境为WindowsXP SP2 + gVIM7.0 + vimdoc1.5.0sc + MinGW3.0.0.1, 各软件的下载直接点前面的链接.
  1.2 gVIM7.0就是我们要介绍的主角啦, 完美的编辑器, 任何赞美加在这个几十年历史并且还依然青春依旧的艺术品上都不为过的.
  1.3 vimdoc1.5.0sc是VIM中文帮助文档, 别以为跟Windows下那些无聊的软件帮助一样, 这个才叫帮助, 对不管新手还是老鸟的完美指导参考帮助, 感谢国内无私的译者让我们享用.
  1.4 MinGW3.0.0.1是GNU标准的各个编译器集合, 有更新的版本, 但是似乎这个版本更加通用, 我只是用这个编译C/C++文件.
2.软件安装
  2.1 gVIM, 没什么好说的, 一路next就好了. 装好后需要对其进行必要的配置从而更符合我们的使用习惯, 配置方法在后面一部分详细介绍, 如果想在命令行下能直接唤出gVIM, 可以把安装目录下的vim70文件夹加入到系统环境变量中.
  2.2 vimdoc, 也没什么好说的, 一路next搞定. 如果嫌麻烦可以在安装时把 [安装完成后显示帮助] 的钩去掉.
  2.3 MinGW, 安装到默认目录下, 切记, 如果不这样会出问题, 对Eclipse可能会有影响. 安装完成后将MinGW下的bin目录添加到系统环境变量中, 如果没有一个g++.exe文件则将mingw32-g++.exe改名为g++.exe, 如果使用Eclipse, 推荐将mingw32-make.exe也改名为make.exe.
  2.4 环境变量配置. 桌面上打开[我的电脑], 选[属性], 选[高级]标签页, 点开下面的[环境变量], 双击下面系统变量中的Path, 要加入的就是在原始的后面加;和要添加的目录了, 比如我的在装了JDK和MinGW以及gVIM后(均为默认目录)的环境变量为

%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;C:Program FilesJavajdk1.5.0_02bin;C:MinGWbin;C:Program FilesVimvim70
3. vim配置
  3.1 配置vim就是配置安装目录下的_vimrc文件(Windows下, Linux下是用户自己的根目录下的.vimrc), 有时候这个文件会出现在C:Documents and Settings当前用户名下, 很奇怪, 我在实验室和宿舍的机器位置就不一样.
  3.2 关于此配置文件, 网络上有很多样例, 比较推荐的有下面链接给的,有英文注释,上面一个是彩色高亮的,下面一个是纯文本的. 可以通过这个文件来学习一下vim的详细配置. 不过事实上能用到的远远没有这么多, 这个只是一个比较完全的, 我只是看懂了里面的一些直接用户界面有关的东西, 更详细的跟Windows的沟通部分没明白…
http://www.vi-improved.org/vimrc.php
http://www.vi-improved.org/_vimrc
  3.3 vimrc里面注释是以 ” 开始到行末尾, 注意这一点, 其他的都没什么.
  3.4 点击_vimrc打开我给出的一个有详细解释的说明, 或点击_vimrc.rar下载我打包的配置文件, 可以根据自己喜好来改动, 如果不熟悉可以先拷贝到指定位置, 然后重新用gVIM打开来慢慢调整.
4. 使用
  4.1 使用没什么好说的, 如果需要VIM的使用指南, 看看安装后提供的新手入门就能在30分钟内被手把手教会常用的功能了, 然后就可以跟用一般的编辑器一样了, 只是注意, 你用的是gVIM, 你可以在使用中不断发现很多奇妙的地方的, 并且可以通过帮助文件来获得更高级的使用方法.
  4.2 快速编译. 安装MinGW就是为了编译C/C++, 我的配置文件里面加入了几个快捷键来快速实现, 均在命令模式下有效, 详细的可以看_vimrc文件里面的map部分, 简单来说F2是保存(w), F3是保存退出(wq), F10是编译(!g++ -o %< %), F11是运行(!%<).

使用C/C++工作的Eclipse的安装

最近突然很多人要用Eclipse, 不仅仅是写Java, 也要使用C/C++, 很多问题, 一起写出来吧 :)

实验室的配置是WindowsXP SP2 + Eclipse3.2 with CDT Embedded for Win32 + MinGW 3.0.0.1 + JDK 1.5.02, 本次讨论最重要的Eclipse3.2withCDT却没找到合适的下载, 官方给的没有集成版的, 只有自己去找一下,我有上传过到 药学院 的FTP, 可惜好像被删了. MinGW和JDK都可以在官方主页上找下载, 或者你可以点 MinGW 来从台湾的镜像下载MinGW, 访问 Java 2 SDK 来从yaguo下载JDK.

首先安装JDK, 假设你安装到了默认目录, 然后将bin目录加入到环境变量中. 然后安装MinGW, 将bin目录加入到环境变量中, 并且把bin目录下的mingw32-make.exe改名为make.exe. 最后解压Eclipse到任何你喜欢的地方, Eclipse是一个基于Java编写的绿色软件, 不用担心安装问题, 打开后配置好WorkSpace的位置, 就可以任意使用了. 关于Eclipse的具体使用方法, 这就是另一个话题了…

附: 关于环境变量, 在桌面上打开[我的电脑], 选[属性], 选[高级]标签页, 点开下面的[环境变量], 双击下面系统变量中的Path, 要加入的就是在原始的后面加;和要添加的目录了, 比如我的在装了JDK和MinGW以及gVIM后的环境变量为

%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;C:Program FilesJavajdk1.5.0_02bin;C:MinGWbin;C:Program FilesVimvim70

Minimal Sets of .vimrc

A 14 lines only .vimrc files for the vim under linux, I can use it everywhere as I used to be.

set nocompatible " get out of horrible vi-compatible mode
syntax on " syntax highlight on
set ruler " Always show current positions along the bottom
set number " trun on line number
set showmatch " show matching brackets
set ai " autoindent
set si " smartindent
set cindent " do c-style indenting
set tabstop=4 " tab spacing
set softtabstop=4 " tab spacing
set shiftwidth=4 " tab spacing
set expandtab " not real tabs please!
set smarttab " use tabs at the start of a line, spaces elsewhere
set so=5 " Keep 5 lines (top/bottom) for scope

VIM的配置,有关_vimrc

自己用的vimrc配置文件, 这篇文章随时可能会更新以符合最新的使用习惯 :P
vimrc使用”来注释到行末, 类似C++里面的//, 我能理解的选项我都会添加部分中文注释的

我觉得比较有用的有以下几个:

autocmd GUIEnter * :simalt ~x " 启动时全屏
set nocompatible " 不使用vi兼容模式
set helplang=Cn " 帮助语言为中文
set background=dark " 黑色背景(我喜欢的)
syntax on " 语法高亮显示
colorscheme torte " torte颜色主题(我喜欢的)
set ruler " 显示按钮位置(一个我不是很明白的配置,但是一般都加上)
set number " 显示行号
set backspace=2 " 退格键工作模式, 2为一般
set showmatch " 显示匹配的括号
set so=5 " 翻页时屏幕上下各留5行缓冲区
set ai " 自动缩进
set si " 智能缩进 
set cindent " 使用C的语法模式缩进
set tabstop=4 " tab键宽度
set softtabstop=4 " 同上
set shiftwidth=4 " 同上 
set expandtab " 使用tab, 一个tab键产生一个真实的/t
set nowrap " 不要跨行
set smarttab " 智能tab

一个非常好的vimrc文件样例,有英文注释,上面一个是彩色高亮的,下面一个是纯文本的:
http://www.vi-improved.org/vimrc.php
http://www.vi-improved.org/_vimrc

我的_vimrc文件,有修改,基于Windows下的gVIM7.0(前一小部分)和上面提到的那个. 添加了几个快捷键, F2保存, F3保存退出, F10编译, F11运行. 同时注意要使用此文件请在VIM的安装目录下的vimfiles目录下建立backup和temp两个临时文件夹. 有很多冗余的, 因为不知道具体规则, 还没敢删. 本blog系统只能上传.rar文件, 大家自己解压到原来的目录吧.

UploadFiles/2006-10/1015736379.rar

Thinking in Java ?

Thinking in Java is a book’s name, a good book. This afternoon, I did a hard work to find a method which can check that a char is a letter or not, but got no answer. I complained that Java is too hard to learn if I don’t know any class library and its method, everything I need to deal by myself, then MagicPig advise us to read the book Thinking in Java, said that it will be the best book to learn Java.

I spent nearly the hole day to type some simple code of the text book, and get many errors some seems strange, there may be a good experiences and wealth, because it can make me not to do the stupid thing again and again. But there is still a little problem need to fixed, which I can’t use Ant in Eclipse to compile a .jar file and to run the .jar file by double-click, there is always a error hint break out when I try to run the .jar file by double-click, I doubt there is something wrong in the build.xml file, but I don’t know how to correct it also I used Baidu and Google for a solution.

Coding in Java

For the course, and for learning a useful skill, start coding in Java. Java is the third programming language I learned strictly, before it are Pascal and C. There is more easy that when you have used a programming language skilled to study another, because the ideas are the same, only the method to get the result are different. The last words may be wrong, because Java is an OO(Object Oriented) language, which is different to the Process-Oriented language likes Pascal/C, and I said I learned C only as I didn’t know the ideas of OO in C++.

In Java, everything is long, the name of class, function, variable, too long to type… I love C, I love VIM, which can do anything use keyboard only. Our Java text book used the Hungarian notation ordinary, so it’s a good way to make my coding habit standardization.

最优匹配(Kuhn_Munkras算法)

// ** Start of PerfectMatch *******************************
// Name: PerfectMatch by Kuhn_Munkras O(n^3)
// Description: w is the adjacency matrix, nx,ny are the size of x and y,
// lx, ly are the lables of x and y, fx[i], fy[i] is used for marking
// whether the i-th node is visited, matx[x] means x match matx[x],
// maty[y] means y match maty[y], actually, matx[x] is useless,
// all the arrays are start at 1

int nx,ny,w[MAXN][MAXN],lx[MAXN],ly[MAXN];
int fx[MAXN],fy[MAXN],matx[MAXN],maty[MAXN];

int path(int u)
{
    int v;
    fx[u]=1;
    for(v=1;v&lt;=ny;v++)
        if((lx[u]+ly[v]==w[u][v])&amp;&amp;(fy[v]&lt;0)) {
            fy[v]=1;
            if((maty[v]&lt;0)||(path(maty[v]))) {
                matx[u]=v;
                maty[v]=u;
                return(1);
            } // end of if((maty[v]...
        } // end of if((lx[u]...
    return(0);
} // end of int path()

int PerfectMatch()
{
    int ret=0,i,j,k,p;

    memset(ly,0,sizeof(ly));
    for(i=1;i&lt;=nx;i++) {
        lx[i]=-INF;
        for(j=1;j&lt;=ny;j++)
            if(w[i][j]&gt;lx[i])
                lx[i]=w[i][j];
    } // end of for(i...

    memset(matx,-1,sizeof(matx));
    memset(maty,-1,sizeof(maty));
    for(i=1;i&lt;=nx;i++) {
        memset(fx,-1,sizeof(fx));
        memset(fy,-1,sizeof(fy));
        if(!path(i)) {
            i--;
            p=INF;
            for(k=1;k&lt;=nx;k++)
                if(fx[k]&gt;0)
                    for(j=1;j&lt;=ny;j++)
                        if((fy[j]&lt;0)&amp;&amp;(lx[k]+ly[j]-w[k][j]&lt;p))
                            p=lx[k]+ly[j]-w[k][j];
            for(j=1;j&lt;=ny;j++) ly[j]+=(fy[j]&lt;0?0:p);
            for(k=1;k&lt;=nx;k++) lx[k]-=(fx[k]&lt;0?0:p);
        } // end of if(!path(i))
    } // end of for(i...

    for(i=1;i&lt;=ny;i++) ret+=w[maty[i]][i];
    return ret;
} // end of int PerfectMatch()
// ** End of PerfectMatch *********************************

最大匹配(匈牙利算法)

// ** Start of MaximumMatch *******************************
// Name: MaximumMatch by Hungray O(n^3)
// Description: mat is the adjacency matrix, nx,ny are the size of x and y,
// fy is used for marking whether the k-th node is visited, matx[x] means x
// match matx[x], maty[y] means y match maty[y], actually, matx[x] is useless,
// all the arrays start at 1

int nx,ny,mat[MAXN][MAXN],fy[MAXN],matx[MAXN],maty[MAXN];

int path(int u)
{
    int v;
    for(v=1;v&lt;=ny;v++)
        if((mat[u][v])&amp;&amp;(fy[v]&lt;0)) {
            fy[v]=1;
            if((maty[v]&lt;0)||(path(maty[v]))) {
                matx[u]=v;
                maty[v]=u;
                return(1);
            } // end of if((maty[v]...
        } // end of if((mat[u][v]...
    return(0);
} // end of int path()

int MaximumMatch()
{
    int i,ret=0;
    memset(matx,-1,sizeof(matx));
    memset(maty,-1,sizeof(maty));
    for(i=1;i&lt;=nx;i++)
        if(matx[i]&lt;0) {
            memset(fy,-1,sizeof(fy));
            ret+=path(i);
        } // end of if(matx[i]...
    return(ret);
} // end of int MaximumMatch()
// ** End of MaximumMatch *********************************

KMP

直接抄的武大李春葆老师的数据结构上的改进KMP

// return the first matching string2 in the string1
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#define MaxSize 1000

typedef struct
{
    char ch[MaxSize];
    int len;
} SqString;

void GetNextval(SqString t,int nextval[])
{
    int j=0,k=-1;
    nextval[0]=-1;
    while(j&lt;t.len)
    {
        if((k==-1)||(t.ch[j]==t.ch[k]))
        {
            j++;
            k++;
            if(t.ch[j]!=t.ch[k]) nextval[j]=k;
            else nextval[j]=nextval[k];
        }
        else k=nextval[k];
    }
}

int KMP(SqString s,SqString t)
{
    int nextval[MaxSize],i=0,j=0,v;
    GetNextval(t,nextval);
    while((i&lt;s.len)&&(j&lt;t.len))
    {
        if((j==-1)||(s.ch[i]==t.ch[j]))
        {
            i++;
            j++;
        }
        else j=nextval[j];
    }
    if(j&gt;=t.len) v=i-t.len;
    else v=-1;
    return(v);
}

int main()
{
//    freopen("kmp.in","r",stdin);
//    freopen("kmp.out","w",stdout);

    SqString str1,str2;
    gets(str1.ch);
    str1.len=strlen(str1.ch);
    gets(str2.ch);
    str2.len=strlen(str2.ch);
    printf("%dn",KMP(str1,str2));
    return(0);
}