首页

2010年5月29日星期六

emacs23的编译和安装

#./configure \
--prefix=/usr \
--with-x-toolkit=gtk \
--with-xft \
--enable-font-backend \
--with-freetype \
--with-gtkmake && make bootstrap && make info && make install

呵呵,23支持中文很好!
特别注意的是在编译的时候会出现--with-gif=no --with-trff=no --with-libXpm=no 等错误,但是首先你需要把这三个缺省包安装上,不然你忽略了,无法启动图形界面的EMACS 所以需要安装上,GIF这个可以直接忽略掉,我就忽略了,因为实在找不到安装包,没办法,不会影响到其他的,能装上最好装上。

Mysql数据库操作

创建数据库:create database name;
查看数据库:show databases;(查看所有数据库)
选择数据库:use db_admin;
删除数据库:drop database name;

------------------------------------------
Mysql 数据表操作:
------------------------------------------
创建数据表:create table name(表名);
    如:create table tb_admin(
        id int auto_increment primary key,
        user varchar(30)not null,
        password varchar(30) not null,
        createtime datetime);
查看表结构:show columns from name(表名);
    如:show columns from tb_admin;
查看表信息:desc name(表名) id;
    如:desc tb_admin id;
修改表结构:alter table name(表名) add email varchar(50)
        not null,modify user varchar(40);
重命名表:rename table name(表名) to newname(新表名);
      如:rename table tb_admin to tb_user;
删除数据表:drop table name(表名);
    如:drop table tb_admin;
------------------------------------------
Mysql语句操作
------------------------------------------
插入记录:insert into (表名)tb_admin(user,password,email,createtime)
        values('tsoft','111','bb.qnyd@gmail.com','2009-8-3 17:00:12');
查询记录:select id,user,password,email from tb_admin where id=1;
    select * from tb_admin(表名);
修改记录:update name(表名) set password='(密码)' where user='(名字)';
    如:update tb_admin set password='520300' where user='tsoft';
删除记录:delete from name(表名) where user='(条件)';
    如:delete from tb_admin where user='tsoft';

正则表达式中的“原子”

①a-z A-Z _ 0-9  //最常见的字符
②(abc) (skd)  //用圆括号包含起来的单元符合
③[abcs] [^abd] //用方括号包含的原子表,原子表中的^代表排除或相反内容
④转义字符
\d  包含所有数字[0-9]
\D  除所有数字外[^0-9]
\w  包含所有英文字符[a-zA-Z_0-9]
\W  除所有英文字符外[^a-zA-Z_0-9]
\s   包含空白区域如回车、换行、分页等 [\f\n\r]

正则表达式定义

正则表达式定义   正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
  • 列目录时, dir *.txt或ls *.txt中的*.txt就是一个正则表达式,因为这里*与正则式的*的含义是不同的。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符   由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
 非打印字符
字符 含义
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要 对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。

特别字符 说明
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。 要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制 转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示 不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。
  •   构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的 组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
正则表达式的限定符有:

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
定位符
用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。
3.6 选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作 用。
其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜 索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
3.7 后向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容 存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。

正则表达式元字符

*  匹配前一个内容的0次1次或多次
.  匹配内容的0次1次或多次,但不包含回车换行
+ 匹配前一个内容的1次或多次
?匹配前一个内容的0次或1次
|  选择匹配类似PHP中的| (因为这个运算符合是弱类型导致前面最为整体匹配)
^  匹配字符串首部内容
$  匹配字符串尾部内容
\b 匹配单词边界,边界可以是空格或者特殊符合
\B 匹配除带单词边界意外内容
{m} 匹配前一个内容的重复次数为M次
{m,} 匹配前一个内容的重复次数大于等于M次
{m,n} 匹配前一个内容的重复次数M次到N次
( ) 合并整体匹配,并放入内存,可使用\1 \2…依次获取

javascrpit状态栏的效果代码





jquery 实现用户名检测实例

/*
*需要通过JAVASCRIPT做两件事情
*1.button按下的时候,需要将文本中的数据获取到,然后发送给服务器端,
*最后接收服务器返回的数据,填充到我们预留的DIV中去这样可以看到结果。
*2.文本框上,用户按键之后,需要判断文本框的内容是否为null,
*如果不时null红色的边框和背景图片就应该取消,否则保留。
*/
/*
*需要在页面装载完成时注册上这些工作
*/
$(document).ready(function(){
//这些内容是装在完成过后要执行的
var userNameNode = $("#userName");
//需要找到button按钮,注册事件。
$("#verifyButton").click(function(){
   //1.获取文本框内容
   var userName = userNameNode.val();
   //2.将这个内容发送给服务器端
   if(userName == ""){
    alert("用户名不能为空!");
   }else{
    $.get("http://localhost/MyBlog/index.php?userName=" + userName,null,function(response){
     //3.接受服务器端返回的数据,填充在DIV中
     $("#result").html(response);
    });
   }
});
//需要找到文本框,注册事件。
userNameNode.keyup(function(){
//获取当前文本框的内容
var value = userNameNode.val();
if(value == ""){
   //让边框变成红色
   userNameNode.addClass("userText");
}else{
   //否则去掉边框颜色
   userNameNode.removeClass("userText");
}
});
});

jquery 实现网页上的表格可编辑状态!

//需要通过javascript解决内容部分奇数和偶数行的 背景不同

$(function(){
//找到表格里面的内容区域中除了第一个TR以外所有奇数行

//使用EVEN是为了吧通过tbody tr 返回的所有tr元素中,在数组里下标时偶数的元素返回,因为这些元素,实际上才是我们期望的tbody里的奇数行
$("tbody tr:even").css("background-color","#ECE9D8");
//找到表格里面得内容区域中所有偶数行
//$("tbody tr:odd").css("background-color","#938887");

//我们需要找到所有的编号单元格
var numTD = $("tbody td");
//给这些单元格注册鼠标点击的事件
numTD.click(function(){
   //找到当前鼠标点击的td,this对应的就是响应click的那个td
   var tdobj = $(this);
   if(tdobj.children("input").length > 0){
    //当前TD中input,不执行click处理
    return false;
   }
   var text = tdobj.html();
   //清空TD中的内容
   tdobj.html("");
   //创建文本框
   //去掉文本框的边框
   //设置文本框中字体大小为16xp
   //使文本框iangde宽度和TD的宽度相同
   //设置文本框的背景色
   //需要将当前的TD的内容放到文本框当中
   //将文本框插入到td中
   var inputObj = $("").css("border-width","0").css("font-size","16xp").width(tdobj.width()).css("background-color",tdobj.css("background-color")).val(text).appendTo(tdobj);
   //时文本框插入之后被选中
   inputObj.trigger("focus").trigger("select");
   inputObj.click(function(){
    return false;
   });
   //处理文本框上回车和ESC按键的操作
   inputObj.keyup(function(event){
    //获取当前按下键盘的键值
    var keycode = event.whith;
    //处理回车键的情况
    if(keycode == 13){
     //获取当前文本框中的内容
     var inputtext = $(this).val();
     //将TD的内容修改成文本框中的内容
     tdobj.html(inputtext);
  
    }
    //处理ESC按键的情况
    if(keycode == 27){
     //将TD中的内容还原成TEXT
     tdobj.html(text);
    }
   });

});
});

Emacs 自动补全 yasnippet

(add-to-list 'load-path
             "~/.emacs.d/plugins")
(require 'yasnippet-bundle)

new my .emacs

;;;;;;;;;author B.Qnyd(bb.qnyd@gmail.com) -----

;;;;;;;;;今天最新添加org-mode Emacs 23自带的功能,非常棒,做笔记最好,今天尝试了下..
;;;;;;;;;配置参考Emacs中文网的各位高手,,主要参考DEA 的作者ahei和
;;;;;;;;;common lisp开发环境配置由重庆的common lisp程序员(曾大哥)给我配置的第一次,
;;;;;;;;;后面自己进行升级和改进
;;;;;;;;;其 它快捷键参考VIM 的基本常用的功能自己通过M-x 进行设置的。
;;;;;;;;;下次更新GNUS 的新闻阅读 和MP3,MPLAYER的功能!
;;;;;;;;;里面注释比较多,主要是很多插件的使用快捷键.
;;;;;;;;;由于 我很懒,不想去记,不知道 可以看看,,hoho
;;;;;;;;;目前根据以前的代码 整理了下,但还有部分漏掉了。。
;;;;;;;;; 只要不影响Emacs正常工作,我就没管了,大家可以看看,最好不要直接COPY,
;;;;;;;;;因为我和你的操作系统环境可能不一 样;
;;;;;;;;;非常感谢DEA 的作者ahei和曾大哥 他俩所提供的配置源代码(
;;;;;;;;;都上了W行,看着眼花缭乱)





;解决emacs shell 乱码
(setq ansi-color-for-comint-mode t)
(customize-group 'ansi-colors)
(kill-this-buffer);关闭customize窗口
(setq default-major-mode 'text-mode);一打开就起用 text 模式
;自定义按键
(global-set-key [f1] 'shell);F1进入Shell
;;目的是开一个shell的小buffer,用于更方便地测试程序(也就是运行程序了),我经常会用到。
;;f1就是另开一个buffer然后打开shell,C-f1则是在当前的buffer打开shell
(global-set-key [C-f5] 'previous-error)
(global-set-key [f5] 'next-error)
(setq backup-inhibited t);;不产生备份
(setq auto-save-default nil);不生成名为#filename# 的临时文件
(defun open-eshell-other-buffer ()
"Open eshell in other buffer"
(interactive)
(split-window-vertically)
(eshell))
(global-set-key [C-f1] 'open-eshell-other-buffer)
;;(global-set-key [C-f1] 'eshell)
;;加载cedet
(add-to-list 'load-path "~/lisp/cedet/speedbar")
(add-to-list 'load-path "~/lisp/cedet/eieio")
(add-to-list 'load-path "~/lisp/cedet/semantic")
(add-to-list 'load-path "~/lisp/cedet/common")
(add-to-list 'load-path "~/.emacs.d/")
(require 'cedet)
;;加载ecb
(add-to-list 'load-path "~/lisp/ecb")
;;(require 'ecb)
(require 'ecb-autoloads)
;;(ecb-activate)
(when (require 'ecb nil 'noerror)
(setq ecb-tip-of-the-day nil)
(setq ecb-auto-compatibility-check nil)
(setq ecb-primary-secondary-mouse-buttons 'mouse-1--C-mouse-1))

;; 用M-x执行某个命令的时候,在输入的同时给出可选的命令名提示
(icomplete-mode 1)
(define-key minibuffer-local-completion-map (kbd "SPC") 'minibuffer-complete-word)
(setq column-number-mode t)
(setq line-number-mode t)
(global-linum-mode 'linum-mode);;在左边显示行号
;;(global-set-key (kbd "C-a") 'view-file-other-window)
(global-font-lock-mode t);语法高亮
(setq font-lock-maximum-decoration t)
(setq font-lock-global-modes '(not shell-mode text-mode))
(setq font-lock-verbose t)
(setq font-lock-maximum-size '((t . 1048576) (vm-mode . 5250000)))
(setq-default kill-whole-line t);;C-k 删除该行
(fset 'yes-or-no-p 'y-or-n-p);以 y/n代表 yes/no
(column-number-mode t);显示列号
(show-paren-mode t);显示括号匹配
(setq show-paren-mode t) ;;打开括号匹配显示模式
(setq show-paren-style 'parenthesis)
(display-time-mode 1);显示时间,格式如下
(setq display-time-24hr-format t)
(setq display-time-day-and-date t)
(setq display-time-use-mail-icon t);;时间栏旁边启用邮件设置
(setq display-time-interval 10);;时间的变化频率,单位多少来着?
(tool-bar-mode nil);去掉那个大大的工具栏
(scroll-bar-mode nil);去掉滚动条
(auto-save-mode nil);;禁止自动保存
(put 'scroll-left 'disabled nil);;允许屏幕左移
(put 'scroll-right 'disabled nil);;允许屏幕右移
(put 'set-goal-column 'disabled nil)
(put 'narrow-to-region 'disabled nil)
(put 'upcase-region 'disabled nil)
(put 'downcase-region 'disabled nil)
(put 'LaTeX-hide-environment 'disabled nil)
(mouse-avoidance-mode 'animate);光标靠近鼠标指针时,让鼠标指针自动让开
(setq mouse-yank-at-point t);支持中键粘贴
(transient-mark-mode t);允许临时设置标记
;; 高亮显示C/C++中的可能的错误(CWarn mode)
(global-cwarn-mode 1)
(global-set-key (kbd "") nil) ;; 去掉原来的帮定关系
(global-set-key (kbd "") 'mouse-buffer-menu);;ctrl+鼠标左键调出选择切换buffer功能
(global-set-key (kbd "") 'mouse-popup-menuar-stuff);;ctrl+鼠标右键调出和编辑相关功能
(global-set-key [C-f2] 'slime-compile-file);slime编译文件
(global-set-key [C-f3] 'python-shell);F3进入Python-Shell
(global-set-key [C-f6] 'gdb);F5调试程序
(setq compile-command "make -f Makefile")
;;(global-set-key [f7] 'compile);F7编译文件
;;  C-f7, 设置编译命令; f7, 保存所有文件然后编译当前窗口文件
(defun du-onekey-compile ()
"Save buffers and start compile"
(interactive)
(save-some-buffers t)
(switch-to-buffer-other-window "*compilation*")
(compile compile-command))
(global-set-key [C-f7] 'compile)
(global-set-key [f7] 'du-onekey-compile)
(setq speedbar-show-unknown-files t);;可以显示所有目录以及文件
;;让 dired 可以递归的拷贝和删除目录。
(setq dired-recursive-copies 'top)
(setq dired-recursive-deletes 'top)
(global-set-key (kbd "C-e")  'ecb-activate);;启动Ecb
(global-set-key [C-f9] 'dired);;设置[C-f9]为调用dired命令
(global-set-key [C-f10] 'undo);;设置C-F10为撤销
(global-set-key [C-f11] 'calendar) ;;设置C-F11快捷键指定Emacs 的日历系统
(global-set-key [C-f12] 'list-bookmarks);;设置C-F12 快速察看日程安排
(global-set-key (kbd "C-|") 'other-window);窗口间跳转
(global-set-key [f2] 'kill-this-buffer);F2关闭当前buffer
(global-set-key [M-return] 'kill-this-buffer);M-return关闭当前buffer
(global-set-key [C-return] 'kill-this-buffer);C-return关闭当前buffer
(global-set-key [f10] 'split-window-vertically);F10分割窗口
(global-set-key [f11] 'delete-other-windows);F11 关闭其它窗口
(global-set-key [f12] 'my-fullscreen);F12 全屏
(global-set-key (kbd "C-,") 'backward-page);文件首
(global-set-key (kbd "C-.") 'forward-page);文件尾
(global-set-key (kbd "C-'") 'next-buffer);转到下一个buffer
(global-set-key (kbd "C-;") 'previous-buffer);转到上一个buffer
(global-set-key (kbd "C-/") 'next-multiframe-window);;转到下一个窗口
(global-set-key (kbd "C-?") 'previous-multiframe-window);;转到上一个窗口
(global-set-key (kbd "C-<") 'beginning-of-line);;跳转到行首
(global-set-key (kbd "C->") 'end-of-line);;跳转到行尾
(global-set-key (kbd "C-c C-g") 'goto-char) ;;跳转到行任意位子
(setq mouse-drag-copy-region nil);;取消鼠标选择即复制
;普通设置
(setq inhibit-startup-message t);关闭起动时闪屏
(setq visible-bell t);关闭出错时的提示声
(menu-bar-mode nil);;关闭菜单
;;shell,gdb退出后,自动关闭该buffer  
(defun kill-buffer-when-shell-command-exit ()
"Close current buffer when `shell-command' exit."
(let ((process (ignore-errors (get-buffer-process (current-buffer)))))
(when process
(set-process-sentinel process
(lambda (proc change)
(when (string-match "\\(finished\\|exited\\)" change)
(kill-buffer (process-buffer proc))))))))

;; 退出gdb的时候关闭gdb对应的buffer
(add-hook 'gdb-mode-hook 'kill-buffer-when-shell-command-exit)
;; 退出term的时候关闭term对应的buffer
(add-hook 'term-mode-hook 'kill-buffer-when-shell-command-exit)
;;编译成功后自动关闭*compilation* 函数
(defun kill-buffer-when-compile-success (process)
"Close current buffer when `shell-command' exit."
(set-process-sentinel process
(lambda (proc change)
(when (string-match "finished" change)
(delete-windows-on (process-buffer proc))))))

;; 编译成功后自动关闭*compilation* buffer
(add-hook 'compilation-start-hook 'kill-buffer-when-compile-success)
;;退出时寻问
(setq kill-emacs-query-functions
(lambda ()
(y-or-n-p "Do you really want to quit? ")))

;; 设置时间戳,标识出最后一次保存文件的时间。
(setq time-stamp-active t)
(setq time-stamp-warn-inactive t)
(setq time-stamp-format "%:y-%02m-%02d %3a %02H:%02M:%02S chunyu")
(global-set-key (kbd "M-g") 'goto-line);;设置M-g为goto-line

;; 尽快显示按键序列
(setq echo-keystrokes 0.1)
(setq system-time-locale "C")
;;加载template
(defconst my-emacs-path           "~/.emacs.d/" "我的emacs相关配置文件的路径")
(load "template-settings")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  设置日历 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;设置日历的一些颜色
(setq calendar-load-hook
'(lambda ()
(set-face-foreground 'diary-face "skyblue")
(set-face-background 'holiday-face "slate blue")
(set-face-foreground 'holiday-face "white")))
;;设置我所在地方的经纬度,calendar里有个功能是日月食的预测,和你的经纬度相联系的。
;; 让emacs能计算日出日落的时间,在 calendar 上用 S 即可看到
(setq calendar-latitude +39.54)
(setq calendar-longitude +116.28)
(setq calendar-location-name "北京")
;; 设置阴历显示,在 calendar 上用 pC 显示阴历
(setq chinese-calendar-celestial-stem
["甲" "乙" "丙" "丁" "戊" "己" "庚" "辛" "壬" "癸"])
(setq chinese-calendar-terrestrial-branch
["子" "丑" "寅" "卯" "辰" "巳" "戊" "未" "申" "酉" "戌" "亥"])
;; 设置 calendar 的显示
(setq calendar-remove-frame-by-deleting t)
(setq calendar-week-start-day 1);; 设置星期一为每周的第一天
(setq mark-diary-entries-in-calendar t);; 标记calendar上有diary的日期
(setq mark-holidays-in-calendar nil); ; 为了突出有diary的日期,calendar上不标记节日
(setq view-calendar-holidays-initially nil) ; 打开calendar的时候不显示一堆节日
;; 去掉不关心的节日,设定自己在意的节日,在 calendar 上用 h 显示节日
(setq christian-holidays nil)
(setq hebrew-holidays nil)
(setq islamic-holidays nil)
(setq solar-holidays nil)
(setq general-holidays '((holiday-fixed 1 1 "元旦")
(holiday-fixed 2 14 "情人节")
(holiday-fixed 3 14 "白色情人节")
(holiday-fixed 4 1 "愚人节")
(holiday-fixed 5 1 "劳动节")
(holiday-float 5 0 2 "母亲节")
(holiday-fixed 6 1 "儿童节")
(holiday-float 6 0 3 "父亲节")
(holiday-fixed 7 1 "建党节")
(holiday-fixed 8 1 "建军节")
(holiday-fixed 9 10 "教师节")
(holiday-fixed 10 1 "国庆节")
(holiday-fixed 12 25 "圣诞节")))
;;Calendar模式支持各种方式来更改当前日期
;;(这里的“前”是指还没有到来的那一天,“后”是指已经过去的日子)
;;  q      退出calendar模式
;; C-f     让当前日期向前一天
;; C-b     让当前日期向后一天
;; C-n     让当前日期向前一周
;; C-p     让当前日期向后一周
;; M-}     让当前日期向前一个月
;; M-{     让当前日期向后一个月
;; C-x ]   让当前日期向前一年
;; C-x [   让当前日期向后一年
;; C-a     移动到当前周的第一天
;; C-e     移动到当前周的最后一天
;; M-a     移动到当前月的第一天
;; M-e     多动到当前月的最后一天
;; M-<     移动到当前年的第一天
;; M->     移动到当前年的最后一天
;;Calendar模式支持移动多种移动到特珠日期的方式
;; g d     移动到一个特别的日期
;;  o      使某个特殊的月分作为中间的月分
;;  .      移动到当天的日期
;; p d     显示某一天在一年中的位置,也显示本年度还有多少天。
;; C-c C-l 刷新Calendar窗口
;; Calendar支持生成LATEX代码。
;; t m     按月生成日历
;; t M     按月生成一个美化的日历
;; t d     按当天日期生成一个当天日历
;; t w 1   在一页上生成这个周的日历
;; t w 2   在两页上生成这个周的日历
;; t w 3   生成一个ISO-SYTLE风格的当前周日历
;; t w 4   生成一个从周一开始的当前周日历
;; t y     生成当前年的日历
;;EMACS Calendar支持配置节日:
;; h       显示当前的节日
;; x       定义当天为某个节日
;; u       取消当天已被定义的节日
;; e       显示所有这前后共三个月的节日。
;; M-x holiday  在另外的窗口的显示这前后三个月的节日。

;; 另外,还有一些特殊的,有意思的命令:
;; S       显示当天的日出日落时间(是大写的S)
;; p C     显示农历可以使用
;; g C     使用农历移动日期可以使用

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  设置日记 ;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;
(setq diary-file "~/文档");; 默认的日记文件
(setq diary-mail-addr "BB.Qnyd@gmail.com")
(add-hook 'diary-hook 'appt-make-list)
;;当你创建了一个'~/diary'文件,你就可以使用calendar去查看里面的内容。你可以查看当天的事件,相关命令如下 :
;;  d     显示被选中的日期的所有事件
;;  s     显示所有事件,包括过期的,未到期的等等
;; 创建一个事件的样例:
;; 02/11/1989
;;     Bill B. visits Princeton today
;;     2pm Cognitive Studies Committee meeting
;;     2:30-5:30 Liz at Lawrenceville
;;     4:00pm Dentist appt
;;     7:30pm Dinner at George's
;;     8:00-10:00pm concert
;; 创建事件的命令:
;; i d   为当天日期添加一个事件
;; i w   为当天周创建一个周事件
;; i m   为当前月创建一个月事件
;; i y   为当前年创建一个年事件
;; i a   为当前日期创建一个周年纪念日
;; i c   创建一个循环的事件

(setq compile-command "make")
;;emacs的默认compile命令是调用make -k,我把它改成了make。你也可以把它改成其他的,比如gcc之类的.
;;把c语言风格设置为k&r风格
(add-hook 'c-mode-hook
'(lambda ()
(c-set-style "k&r")))
;;把C++语言风格设置为stroustrup风格
(add-hook 'c++-mode-hook
'(lambda()
(c-set-style "stroustrup")))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;C/C++设定;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;缩进策略
(defun my-indent-or-complete ()
(interactive)
(if (looking-at "\\>")
(hippie-expand nil)
(indent-for-tab-command)))
;;按键定义
(define-key c-mode-base-map [(return)] 'newline-and-indent) 
(define-key c-mode-base-map [(meta \`)] 'c-indent-command)

;;能把一个代码块缩起来,需要的时候再展开
;;  M-x     hs-minor-mode
;;  C-c @ ESC C-s    show all
;;  C-c @ ESC C-h    hide all
;;  C-c @ C-s        show block
;;  C-c @ C-h        hide block
;;  C-c @ C-c toggle hide/show

(load-library "hideshow")
(add-hook 'c-mode-hook 'hs-minor-mode)
(add-hook 'c++-mode-hook 'hs-minor-mode)
(add-hook 'java-mode-hook 'hs-minor-mode)
(add-hook 'emacs-lisp-mode-hook 'hs-minor-mode)
(add-hook 'lisp-mode-hook 'hs-minor-mode)
(add-hook 'scheme-mode-hook 'hs-minor-mode)
(add-hook 'css-mode-hook 'hs-minor-mode)
(add-hook 'html-mode-hook 'hs-minor-mode)
(global-set-key (kbd "C-c C-:") 'hs-show-all);;显示
(global-set-key (kbd "C-c C-\"") 'hs-hide-all);;隐藏

;;输入左边的括号,就会自动补全右边的部分.包括(), "", [] , {} , 等等。
(defun my-common-mode-auto-pair ()
(interactive)
(make-local-variable 'skeleton-pair-alist)
(setq skeleton-pair-alist  '(
(? ? _ "''")
(? ? _ """")
(? ?  _ "()")
(? ?  _ "[]")
(?{ \n > _ \n ?} >)))
(setq skeleton-pair t)
(local-set-key (kbd "(") 'skeleton-pair-insert-maybe)
(local-set-key (kbd "\"") 'skeleton-pair-insert-maybe)
(local-set-key (kbd "{") 'skeleton-pair-insert-maybe)
(local-set-key (kbd "\'") 'skeleton-pair-insert-maybe)
(local-set-key (kbd "[") 'skeleton-pair-insert-maybe))
(add-hook 'c-mode-hook 'my-common-mode-auto-pair)
(add-hook 'c++-mode-hook 'my-common-mode-auto-pair)
(add-hook 'java-mode-hook 'my-common-mode-auto-pair)
(add-hook 'lisp-mode-hook 'my-common-mode-auto-pair)
(add-hook 'php-mode-hook 'my-common-mode-auto-pair)
(add-hook 'python-mode-hook 'my-common-mode-auto-pair)
(add-hook 'html-mode-hook 'my-common-mode-auto-pair)
(add-hook 'scheme-mode-hook 'my-common-mode-auto-pair)
(add-hook 'css-mode-hook 'my-common-mode-auto-pair)
(add-hook 'sql-mode-hook 'my-common-mode-auto-pair)
(add-hook 'emacs-lisp-mode-hook 'my-common-mode-auto-pair)
(add-hook 'text-mode-hook 'my-common-mode-auto-pair)

(setq x-select-enable-clipboard t);支持emacs和外部程序的粘贴
(setq frame-title-format '("Emacs@ " buffer-file-name " " ));在标题栏显示buffer名称

;;ido的配置,这个可以使你在用C-x C-f打开文件的时候在后面有提示;
;;这里是直接打开了ido的支持,在emacs23中这个是自带的.
(ido-mode t)
(setq visible-bell t)
;;设置 sentence-end 可以识别中文标点。不用在 fill 时在句号后插入两个空格。
(setq sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*")
(setq sentence-end-double-space nil)
;;可以递归的使用 minibuffer
(setq enable-recursive-minibuffers t)
;;设置个人信息
(setq user-full-name "B.Qnyd")
(setq user-mail-address "BB.Qnyd@gmail.com")
(setq track-eol t);; 当光标在行尾上下移动的时候,始终保持在行尾。
(setq Man-notify-method 'pushy);; 当浏览 man page 时,直接跳转到 man buffer。

;;设置home键指向buffer开头,end键指向buffer结尾
(global-set-key [home] 'beginning-of-buffer)
(global-set-key [end] 'end-of-buffer)
(setq default-fill-column 80);;把 fill-column 设为 80. 这样的文字更好读

;; 实现程序变量得自动对齐
(require 'align)
(global-set-key "\C-x\C-j" 'align)

;鼠标滚轮,默认的滚动太快,这里改为3行
(defun up-slightly () (interactive) (scroll-up 1))
(defun down-slightly () (interactive) (scroll-down 1))
(global-set-key [mouse-4] 'down-slightly)
(global-set-key [mouse-5] 'up-slightly)
(add-to-list 'load-path "/usr/share/emacs/site-lisp/xcscope.el")
;;(add-to-list 'load-path "~/lisp/cscope/contrib/xcscope/xcscope.el")
(require 'xcscope)
;;自动补全 yasnippet
(add-to-list 'load-path
"~/.emacs.d/plugins")
(require 'yasnippet-bundle)
(add-to-list 'load-path "~/.emacs.d/plugins/wcy-swbuff.el");;加载wcy-swbuff
(require 'wcy-swbuff)
;; then you can use and to switch buffer.
(global-set-key (kbd "") 'wcy-switch-buffer-forward);;设置C-TAB为切换BUFFER
(global-set-key (kbd "") 'wcy-switch-buffer-backward)
(setq wcy-switch-buffer-active-buffer-face  'highlight)
(setq wcy-switch-buffer-inactive-buffer-face  'secondary-selection )
;;=================================
(require 'psvn)
(require 'auto-complete+)
(require 'auto-complete-config)
(load-library "multi-gud.el")
(load-library "multi-gdb-ui.el")
(add-to-list 'ac-dictionary-directories "~/.emacs.d//ac-dict")
(ac-config-default)
(setq gdb-many-windows t)
(require 'recentf)
;;(recentf-mode 1)
(defun recentf-open-files-compl ()
(interactive)
(let* ((all-files recentf-list)
(tocpl (mapcar (function
(lambda (x) (cons (file-name-nondirectory x) x))) all-files))
(prompt (append '("File name: ") tocpl))
(fname (completing-read (car prompt) (cdr prompt) nil nil)))
(find-file (cdr (assoc-ignore-representation fname tocpl)))))

(global-set-key [(control x)(control r)] 'recentf-open-files-compl)


;;(require 'thumbs)
(autoload 'table-insert "table" "WYGIWYS table editor")

;; session,可以保存很多东西,例如输入历史(像搜索、打开文件等的输入)、
;; register的内容、buffer的local variables以及kill-ring和最近修改的文件列表等。非常有用。
(require 'my-session)
(add-hook 'after-init-hook 'session-initialize)
;;全屏
(defun my-fullscreen ()
(interactive)
(x-send-client-message
nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_FULLSCREEN" 0)))

;最大化
(defun my-maximized ()
(interactive)
(x-send-client-message
nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_HORZ" 0))
(x-send-client-message
nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_VERT" 0)))

;; 启动emacs时窗口最大化
(when window-system
(my-maximized))

;; 启动窗口大小
(when window-system
(setq default-frame-alist
'((height . 34) (width . 158) (menu-bar-lines . 20) (tool-bar-lines . 0))))

;;;;;;;;;;;;我的 Common Lisp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'load-path "~/lisp/src/slime/")
(add-to-list 'load-path "~/lisp/src/slime/contrib")

(require 'slime)
(slime-setup '(slime-fancy slime-asdf slime-tramp))

(setq inferior-lisp-program "/usr/bin/sbcl --noinform"
lisp-indent-function 'common-lisp-indent-function ;lisp-indent-function
slime-complete-symbol-function 'slime-fuzzy-complete-symbol
slime-net-coding-system 'utf-8-unix
slime-startup-animation t
slime-default-lisp 'sbcl
slime-enable-evaluate-in-emacs nil
slime-log-events t
slime-outline-mode-in-events-buffer nil
;;slime-repl-return-behaviour :send-only-if-after-complete
slime-autodoc-use-multiline-p t
slime-use-autodoc-mode t
slime-highlight-compiler-notes t
slime-fuzzy-completion-in-place nil)
(global-set-key [f4] 'slime);F4进入Slime
(defun lisp-indent-or-complete (&optional arg)
(interactive "p")
(if (or (looking-back "^\\s-*") (bolp))
(call-interactively 'lisp-indent-line)
(call-interactively 'slime-indent-and-complete-symbol)))


(eval-after-load "lisp-mode"
'(progn
(define-key lisp-mode-map (kbd "TAB") 'lisp-indent-or-complete)))


;;;;;;;;;;;;;;;;;;;;;;代码跳转;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key [f8] 'semantic-ia-fast-jump)
(global-set-key [S-f8]
(lambda ()
(interactive)
(if (ring-empty-p (oref semantic-mru-bookmark-ring ring))
(error "Semantic Bookmark ring is currently empty"))
(let* ((ring (oref semantic-mru-bookmark-ring ring))
(alist (semantic-mrub-ring-to-assoc-list ring))
(first (cdr (car alist))))
(if (semantic-equivalent-tag-p (oref first tag)
(semantic-current-tag))
(setq first (cdr (car (cdr alist)))))
(semantic-mrub-switch-tags first))))
(define-key c-mode-base-map [M-f1] 'semantic-analyze-proto-impl-toggle)

;;;;;;;;;;;;;;;;;;可视化书签;;;;;;;;;;;;;;;;;;;;;;;;;;
(enable-visual-studio-bookmarks)
;;;;;h/cpp切换;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'eassist nil 'noerror)
(define-key c-mode-base-map [M-f12] 'eassist-switch-h-cpp)
(setq eassist-header-switches
'(("h" . ("cpp" "cxx" "c++" "CC" "cc" "C" "c" "mm" "m"))
("hh" . ("cc" "CC" "cpp" "cxx" "c++" "C"))
("hpp" . ("cpp" "cxx" "c++" "cc" "CC" "C"))
("hxx" . ("cxx" "cpp" "c++" "cc" "CC" "C"))
("h++" . ("c++" "cpp" "cxx" "cc" "CC" "C"))
("H" . ("C" "CC" "cc" "cpp" "cxx" "c++" "mm" "m"))
("HH" . ("CC" "cc" "C" "cpp" "cxx" "c++"))
("cpp" . ("hpp" "hxx" "h++" "HH" "hh" "H" "h"))
("cxx" . ("hxx" "hpp" "h++" "HH" "hh" "H" "h"))
("c++" . ("h++" "hpp" "hxx" "HH" "hh" "H" "h"))
("CC" . ("HH" "hh" "hpp" "hxx" "h++" "H" "h"))
("cc" . ("hh" "HH" "hpp" "hxx" "h++" "H" "h"))
("C" . ("hpp" "hxx" "h++" "HH" "hh" "H" "h"))
("c" . ("h"))
("m" . ("h"))
("mm" . ("h"))))

;;;F12 u 更新当前版本
(global-set-key (kbd "C-u") 'vc-next-action)

;; 为各种只读mode加入vi的按键
(require 'man)
(require 'apropos)
(require 'log-view)
(require 'diff-mode)
(let ((list (list view-mode-map Man-mode-map apropos-mode-map completion-list-mode-map
log-view-mode-map compilation-mode-map diff-mode-map)))

(require 'grep)
(setq list (append list (list grep-mode-map))))
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(column-number-mode t)
'(cua-mode t nil (cua-base))
'(display-time-mode t)
'(show-paren-mode t))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background "white" :foreground "black" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 113 :width normal :foundry "microsoft" :family "Comic Sans MS")))))


;;用下面的办法对于编写 python, bash, per, awk, sed, 脚本的时候十分有用。在保存文件的时候,会自动给脚本增加可执行权限
(setq my-shebang-patterns
(list "^#!/usr/.*/perl\\(\\( \\)\\|\\( .+ \\)\\)-w *.*"
"^#!/usr/.*/sh"
"^#!/usr/.*/bash"
"^#!/bin/sh"
"^#!/.*/perl"
"^#!/.*/awk"
"^#!/.*/sed"
"^#!/bin/bash"))
(add-hook
'after-save-hook
(lambda ()
(if (not (= (shell-command (concat "test -x " (buffer-file-name))) 0))
(progn
;; This puts message in *Message* twice, but minibuffer
;; output looks better.
(message (concat "Wrote " (buffer-file-name)))
(save-excursion
(goto-char (point-min))
;; Always checks every pattern even after
;; match.  Inefficient but easy.
(dolist (my-shebang-pat my-shebang-patterns)
(if (looking-at my-shebang-pat)
(if (= (shell-command
(concat "chmod u+x " (buffer-file-name)))
0)
(message (concat
"Wrote and made executable "
(buffer-file-name))))))))
;; This puts message in *Message* twice, but minibuffer output
;; looks better.
(message (concat "Wrote " (buffer-file-name))))))

(setq default-directory "~/");;默认目录

;; author: pluskid
;; 调用 stardict 的命令行程序 sdcv 来查辞典
;; 如果选中了 region 就查询 region 的内容,否则查询当前光标所在的单词
;; 查询结果在一个叫做 *sdcv* 的 buffer 里面显示出来,在这个 buffer 里面
;; 按 q 可以把这个 buffer 放到 buffer 列表末尾,按 d 可以查询单词
(global-set-key (kbd "C-c d") 'kid-sdcv-to-buffer)
(defun kid-sdcv-to-buffer ()
(interactive)
(let ((word (if mark-active
(buffer-substring-no-properties (region-beginning) (region-end))
(current-word nil t))))
(setq word (read-string (format "Search the dictionary for (default %s): " word)
nil nil word))
(set-buffer (get-buffer-create "*sdcv*"))
(buffer-disable-undo)
(erase-buffer)
(let ((process (start-process-shell-command "sdcv" "*sdcv*" "sdcv" "-n" word)))
(set-process-sentinel
process
(lambda (process signal)
(when (memq (process-status process) '(exit signal))
(unless (string= (buffer-name) "*sdcv*")
(setq kid-sdcv-window-configuration (current-window-configuration))
(switch-to-buffer-other-window "*sdcv*")
(local-set-key (kbd "d") 'kid-sdcv-to-buffer)
(local-set-key (kbd "q") (lambda ()
(interactive)
(bury-buffer)
(unless (null (cdr (window-list))) ; only one window
(delete-window)))))
(goto-char (point-min))))))))
;;启动mew
(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)
(if (boundp 'read-mail-command)
(setq read-mail-command 'mew))
(autoload 'mew-user-agent-compose "mew" nil t)
(if (boundp 'mail-user-agent)
(setq mail-user-agent 'mew-user-agent))
(if (fboundp 'define-mail-user-agent)
(define-mail-user-agent
'mew-user-agent
'mew-user-agent-compose
'mew-draft-send-message
'mew-draft-kill
'mew-send-hook))
(setq mew-use-cached-password t)
(require 'color-theme)
(color-theme-calm-forest)
(setq user-full-name "B.Qnyd")
(setq user-mail-address "bb.qnyd@gmail.com")
;;w 写信
;;M-TAB 补齐收信人信息
;;Q 退出mew
;;i 收信
;;g 跳转邮箱
;;o 对邮件进行分类
;;d 把邮件标记为删除
;;* 作星号标记
;;u 清除标记
;;x 对所有标记进行处理
;;a 不带引用的回复,不建议使用
;;A 带引用的回复,推荐
;;f 转发邮件
;;y 保存邮件,会提示是保存整个邮件和是仅保存正文
;;SPACE 阅读邮件
;;ENTER 让阅读的邮件向上滚动一行
;;- 向下滚动一行
;;n 下一封邮件
;;p 前一封邮件
;;j 跳到某一封邮件
;;N 下一封带星号的邮件
;;P 上一封带星号的邮件
;;S 按某个指定项目对邮件排序
;;/ 按指定条件搜索邮件,并进入虚拟模式
;;tt 进入虚拟模式,根据线索查看,普通模式下是不可以的
;;C 如果设置了多个邮箱,用此切换
;;C-cC-m 编辑新邮件,放入草稿中
;;C-cC-c 发送邮件
;;C-cC-q 取消草稿
;;C-cC-a 插入附件
;;C-cTAB 插入签名
;;C-cC-l 转换当前邮件的编码格式
;;C-cC-y 复制部分邮件,带引用前缀
;;C-cC-t 复制部分邮件,不带引用前缀
;;C-cC-a 把当前的发信人加入地址薄
;;C-uC-cC-a 比C-cC-a多加入昵称和名字,推荐
(global-set-key [f6] 'mew)
(auto-image-file-mode);打开图片显示功能
(if window-system
(autoload 'keisen-mode "keisen-mouse" "MULE table" t)
(autoload 'keisen-mode "keisen-mule" "MULE table" t))

(add-hook 'LaTeX-mode-hook 'turn-on-reftex)
(add-hook 'laTeX-mode-hook 'turn-on-reftex)
(setq TeX-auto-save t)
(setq TeX-parse-self t)
(setq-default TeX-master nil)
(setq org-todo-keywords
'((sequence "TODO(t)" "DOING(i!)" "HANGUP(h!)" "|" "DONE(d!)" "CANCEL(c!)")))
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))


;;;;~/.mew.el  这个文件没有需要新建... 还有个密码保存没有,没搞定...
;;;; 谁知道enail发给我看看..email:bb.qnyd@gmail.com

;; Mew limits the size of receiveing messages to 54KB in default.
;; Messages larger than 54KB will marked 'T' by Mew. You can receive
;; the entire messages later.
;; This setting makes Mew remove the limitation. See Mew FAQ 3.2
(setq mew-pop-size 0)
;;(setq mew-imap-prefix-list '("#mh/" "#mhinbox"))
;;(setq mew-auto-get t)
(setq toolbar-mail-reader 'Mew)

;; input passwd once and won't ask anymore untill quit Mew.
(setq mew-use-cached-passwd t)
(setq mew-passwd-timer-unit 999)
(setq mew-passwd-lifetime 999)

(set-default 'mew-decode-quoted 't)
(setq mew-prog-pgp "gpg")
;; leave messages in mail server
(setq mew-pop-ssl-port t)
(setq mew-pop-delete t)
;; mark the unread mail with a 'U'
(setq mew-use-unread-mark t)

;; Send the mails in +queue when enter `i'.
;;(setq mew-auto-flush-queue t)
(setq mew-ssl-verify-level 0)
(setq mew-prog-ssl "/usr/bin/stunnel")


(setq mew-config-alist
;;Gmail
;; misc
'(
("default"
("name" . "B.Qnyd")
("user" . "bb.qnyd")
("mail-domain" . "gmail.com")
("proto" . "+")
("pop-ssl" . t)
("prog-ssl" . "/usr/bin/stunnel")
("pop-auth" . pass)
("pop-server" . "pop.gmail.com")
("pop-ssl-port" . "995")
("pop-user" . "bb.qnyd@gmail.com")
("smtp-ssl" . t)
("smtp-ssl-port". "465")
("smtp-auth-list" . ("PLAIN" "LOGIN" "CRAM-MD5"))
("smtp-user" . "bb.qnyd@gmail.com")
("smtp-server" . "smtp.gmail.com"))))
;;Thread
;;(setq mew-prog-imls-arg-list '("--thread=yes" "--indent=2"))
;;(setq mew-use-fancy-thread t)
;;(setq mew-fancy-thread-indent-strings [" +" " +" " |" " "] )
;;(setq mew-use-thread-separator nil)
;;(setq mew-thread-separator "--")

;; Open a html mail in external browser
;; You must open the browser manually first.
;; Look -> http://www.mew.org/pipermail/mew-int/2005-March/001530.html
;; only Mozilla or Firefox is valid.No support Opera.
;; Look -> http://www.mew.org/pipermail/mew-int/2007-June/001814.html
;;(setq mew-prog-text/html-ext
;;'("firefox" ("-a" "firefox" "-remote" "openFile(%s)") t))

;; Signature
(setq mew-signature-file "~/Mail/signature")
(setq mew-signature-insert-last t)

;; Biff - check new mail
(setq mew-use-biff t) ;; nil
(setq mew-use-biff-bell t) ;; nil
(setq mew-pop-biff-interval 5) ;; 5 (minutes)

;; cite
(setq mew-cite-fields '("From:" "Subject:" "Date:" "Message-ID:"))
(setq mew-cite-format "From: %s\nSubject: %s\nDate: %s\nMessage-ID: %s\n\n")

(setq mew-refile-guess-alist
'((nil . "%[Gmail]/All Mail")))
(auto-image-file-mode);打开图片显示功能

Scheme/Lisp map's usage

(map (lambda(x)
(* x x))
'(1 2 3))

(map (lambda(x y)
(* x y))
'(1 2 3)
'(4 5 6))
(for-each (lambda (x)
(display x)
(newline))
'(1 2 3))

Scheme/Lisp require's usage

;;In computer programming, to execute a call.

(require (lib "process.ss"))
(system "date")

Scheme/Lisp let and do usage

;; let is a variety lambda function, do treats as c inside the language for circulation.

(let ((in (open-input-file "hello")))
(do ((c (read-char in) (read-char in)))
((eqv? c #\l)

(close-input-port in))
(begin
(display c))
c))

Scheme中lambda表达式的形参表有3种

现在真正的介入正题吧,一个月来总结下自己所学的东西,和自己的感悟,首先,我来武汉研究的第一个程序,是lambda演算,当时的感觉很奇妙,该程序也 很好理解。也是很有趣的程序,很多程序员第一次接触Scheme的时候就是先学习的lambda演算,lambda本身就是一个匿名函数,而且 Scheme里面支持匿名函数,可以回顾下当时我的列子,如下:
(define foo (lambda (x)
(* x x)))
Scheme中lambda表达式的形参表有3种接收参数的方式:
1,定长,这种是最常见的,eg:
(define square (lambda (n) (* n n)))
(square 5)=>25

2,全定长,目前还没想通用处在哪里eg:
(define foo (lambda x x))
(foo 1 2 3)=>(1 2 3)

3,半定长,这种在很多语言中都有用到,比如C的printf函数eg:
(define f (lambda (x . y) (* x x)))
(f 10 20 30)=>100

通常函数由以下4个部分组成:
1,前继,n!(fac)
2,后续,(n-1)!(fac (- n 1))
3,测零,(= n 0)
4,不动点算子,1

Scheme/Lisp 倒序排列

尾递归实现倒序排序:

(define (foo x)
(let loop((n x) (l '()))
       (if (null? (cdr n)) (append (list (car n)) l)
             (loop (cdr n) (append (list (car n))l)))))
如:(foo '(1 2 3 4 5)) => (5 4 3 2 1)

等价于它的一般性递归排序:
(define (f x)
(if (null? (cdr x))
      (list (car x))
            (append (f (cdr x)) (list (car x)))))
如:(f '(1 2 3 4 5)) => (5 4 3 2 1)

Scheme/Lisp 中的连续

(((call/cc (lambda (k) k))
        (lambda (x) x))
              "Hong!")

Scheme中的连续用call/cc 函数来实现!以上就是它的实例,看不懂可以去看我的笔记,PDF格式的这里可以下载的,去找找吧,笔记里面介绍了它的过程!

Scheme/Lisp let,let*,letrec的使用

(let ((x 5))
    (define foo (lambda (y) (bar x y)))
    (define bar (lambda (a b) (+ (* a b) a)))
    (foo (+ x 3)))

(let* ((yin ((lambda (foo) (display "@") foo)
               (call/cc (lambda (bar) bar))))
       (yang ((lambda (foo) (display "+") foo)
               (call/cc (lambda (bar) bar)))))
(yin yang))


(letrec ((p (lambda (x)
              (if (= x 100) 'Done
                  (begin
                    (display x)
                    (newline)
                    (p (+ x 1)))))))
(p 0))

以上就是这三个函数的使用实例,如果看不懂就先去学习SCHEME开发!

Scheme/Lisp cond,if的使用 (use scheme's cond,if)

(define (abs x)
(cond ((< x 0) (- x))
        (else x)))

等价的if

(define (abs x)
(if (< x 0)
      (- x)
      x))

它们是等价的,也就是说cond可以理解为C等高级语言的IF,不过在这里cond的写法不一样!

Scheme/Lisp IO/case's use

(let ((in (open-input-file "filename")))
(let loop((c (read-char in)))
    (case c
       ((#\# #\o) 'yes)
       ((#\! #\.) 'no)
       (else
        (loop (read-char in))))))
读取一个文件当遇到#,o则停止打印yes,遇到!,.则打印no~!

Scheme/lisp 有理数的算术运算

(define (make-rat n d) (cons n d));;返回一个有理书,其分子是整数n,分母是整数d.
(define (number x) (car x));;返回有理数x的分子.
(define (denom x) (cdr x));;返回有理数x的分母.

;;规则表述如下几个过程
(define (add-rat x y)
(make-rat (+ (* (numer x) (denom y))
         (* (numer y) (denom x)))
          (* (denom x) (denom y))))
(define (sub-rat x y)
(make-rat (- (* (numer x) (denom y))
               (* (numer y) (denom x)))
        (* (denom x) (denom y))))
(define (mul-rat x y)
(make-rat (* (numer x) (numer y))
        (* (denom x) (denom y))))
(define (div-rat x y)
(make-rat (* (numer x) (denom y))
            (* (denom x) (numer y))))
(define (equal-rat? x y)
(= (* (numer x) (denom y))
     (* (numer y) (denom x))))


;;打印分子,在/之后打印分母.

(define (print-rat x)
(newline)
(display "/")
(display (denom x)))

;;过程

(define onr-half (make-rat 1 2))
(print-rat one-half)
(define one-third (make-rat 1 3))
(print-rat (add-rat one-half one-third))
(print-rat (mul-rat one-half one-third))
(print-rat (add-rat one-third one-third))

(define (make-rat n d)
(let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))

(print-rat (add-rat one-third one-third))

Scheme/Lisp 抛出异常!

Exceptions

Whenever a run-time error occurs, an exception is raised. Unless the exception is caught, then it is handled by printing a message associated with the exception, and then escaping from the computation.

> (/ 1 0)

/: division by zero
> (car 17)

car: expects argument of type ; given 17

To catch an exception, use the with-handlers form:

    (with-handlers ([predicate-expr handler-expr] ...)
      body ...+)

Each predicate-expr in a handler determines a kind of exception that is caught by the with-handlers form, and the value representing the exception is passed to the handler procedure produced by handler-expr. The result of the handler-expr is the result of the with-handlers expression.

For example, a divide-by-zero error raises an instance of the exn:fail:contract:divide-by-zero structure type:

> (with-handlers ([exn:fail:contract:divide-by-zero?
                     (lambda (exn) +inf.0)])
      (/ 1 0))

+inf.0
> (with-handlers ([exn:fail:contract:divide-by-zero?
                     (lambda (exn) +inf.0)])
      (car 17))

car: expects argument of type ; given 17

The error function is one way to raise your own exception. It packages an error message and other information into an exn:fail structure:

> (error "crash!")

crash!
> (with-handlers ([exn:fail? (lambda (exn) 'air-bag)])
      (error "crash!"))

air-bag

The exn:fail:contract:divide-by-zero and exn:fail structure types are sub-types of the exn structure type. Exceptions raised by core forms and functions always raise an instance of exn or one of its sub-types, but an exception does not have to be represented by a structure. The raise function lets you raise any value as an exception:

> (raise 2)

uncaught exception: 2
> (with-handlers ([(lambda (v) (equal? v 2)) (lambda (v) 'two)])
      (raise 2))

two
> (with-handlers ([(lambda (v) (equal? v 2)) (lambda (v) 'two)])
      (/ 1 0))

/: division by zero

Multiple predicate-exprs in a with-handlers form let you handle different kinds of exceptions in different ways. The predicates are tried in order, and if none of them match, then the exception is propagated to enclosing contexts.

> (define (always-fail n)
      (with-handlers ([even? (lambda (v) 'even)]
                      [positive? (lambda (v) 'positive)])
        (raise n)))
> (always-fail 2)

even
> (always-fail 3)

positive
> (always-fail -3)

uncaught exception: -3
> (with-handlers ([negative? (lambda (v) 'negative)])
     (always-fail -3))

negative

Using (lambda (v) #t) as a predicate captures all exceptions, of course:

> (with-handlers ([(lambda (v) #t) (lambda (v) 'oops)])
      (car 17))

oops

Capturing all exceptions is usually a bad idea, however. If the user types Ctl-C in a terminal window or clicks the Stop button in DrScheme to interrupt a computation, then normally the exn:break exception should not be caught. To catch only exceptions that represent errors, use exn:fail? as the predicate:

> (with-handlers ([exn:fail? (lambda (v) 'oops)])
      (car 17))

oops
> (with-handlers ([exn:fail? (lambda (v) 'oops)])
      (break-thread (current-thread)) ; simulate Ctl-C
      (car 17))

user break

Scheme/Lisp 模块

;;Scheme里面编写模块,模块以.ss为后缀名。
#lang scheme

(define foo (lambda (x)
                      (* x x)))

(provide foo)

------------------------------------------------------------------------------------
;;也可以写成多个模块加载进去,这样可以启动一个模块,
;;同时也把其他模块加载进去,这样的写法方便维护!

#lang scheme

(require "foo.ss")

(define foo1 (lambda (x)
                        (* x x x)))
(provide foo1)
(provide foo)
---------------------------------

Scheme/Lisp 合同(强制类型)、通讯、多回值

例如程序:
      #lang scheme

     (provide/contract
        (amount (and/c integer? positive?)) ;;约定类型必须是整数和正数
        (sum (-> number? number? number?)));;约定sum参数是两个数字,返回一个数字
      ;;如果你定义amount为一个负数或字符串、小数则都会返回你违反了约定
       ;;broke the contract (and/c integer? positive?) on amount; expected <(and/c integer? positive?)>, given: 你定义的参数(如-100,那么这里就是-100)

     (define amount 100)
      ;;然后定义sum进行计算,如果输入一个字符串(sum "name" 1)
      ;;则返回你违反了约定top-level broke the contract (-> number? number? number?) on sum; expected ;;, given: "name"
      (define sum (lambda (x y)
                              (+ x y)))
    ;;其实这也是异常捕获,我们也可以自己定义一个如:
(with-handlers ([exn:fail:contract? (lambda (x) "the is wrong!")))
      (sum "hello" 100))
    ;;现在则不会返回合同的约定了,将直接打印自己定义的匿名函数the is wrong!


今天除了学习写合同模块,还学习了使用IO/tcp协议在网络中通讯,跟我以前写的JAVA通讯录一样,属于C/S模式,不同的是,使用的语言不一样和写 法不一样,原理基本差不多。而scheme的最大好处就是不用编译,只要有解释器就能通讯,跟java一样需要加载模块,(require scheme/tcp)在scheme里面则是加载Scheme里面已经封装好了的TCP协议。
如client程序:

(require scheme/tcp) ;;加载TCP协议模块
(define list-of-env-var '(content-length query-string)) ;;定义一段话发送的时候可以直接调用此函数
(define-values (server->me me->server)   ;;链接服务器
    (tcp-connect "localhost" 8080))            ;;服务器地址和端口
(write list-of-env-var me->server);;写入消息给服务器,已经定义了一个函数 list-of-env-var 再此直接调用
(close-output-port me->server) ;;关闭输出流
(read server->me) ;;读取server发送给我的消息
(close-input-port server->me) 关闭输入流

如server程序:

(require scheme/tcp) ;;一样加载TCP协议模块
(define tcp-port-listener (tcp-listen 8080)) ;;监听8080端口
(define-values (client-me me-client) ;;连接客服机
    (tcp-accept tcp-port-listener)) ;;接受client发送的消息
(read client->me) ;;读取client发给我的信息
(write "hello!" me->client) ;;向client发送消息
(close-output-port me->client);;关闭输出流
(tcp-close tcp-port-listener);;关闭监听端口

这样在linux系统或uinx系统下面,只要知道对方的服务器IP或域名,就能直接给他发消息了。

((lambda () (values 1 2 3 4))) ;;values接受多个参数。

;;values接受多个参数进行计算。
(call-with-values
    (lambda () (values 1 2)) (lambda (x y) (+ x y)))

;;进行多个函数绑定值

(define-values (a s d f)(values 1 2 3 4))

;;使用多对进行计算,多回值。

(let-values (((x y) (values 1 2))
                    ((n m) (values 3 4)))
(+ x y m n))
;;文件的发送读入和写入的函数
with-input-from-file
with-output-to-file

以上就是我今天学习的东西,还不错,很好玩,虽然这样的流程用JAVA实现过,但是使用Scheme来实现也是很有趣的。

Scheme/lisp 将打印出来的CGI变量写入文件中

#! /bin/sh
":"; exec /usr/bin/mzscheme -qr $0 $"@"

(display "content-type: text/plain")
(newline)
(newline)

(define my-list (cons (getenv "GATEWAY_INTERFACE")
                (cons (getenv "SERVER_NAME")
            (cons (getenv"SERVER_SOFTWARE")
        (cons (getenv "ACCEPT")
        (cons (getenv "ACCEPT_ENCODING")
        (cons (getenv "ACCEPT_LANGUAGE")
            (cons (getenv "AUTORIZATION")
                (cons (getenv "FORM")
                (cons (getenv "IF_MODIFIED_SINGCE")
                (cons (getenv "PRAGMA")
        (cons (getenv "REFFERER")
        (cons (getenv "USER_AGENT")
                (cons (getenv "REQUEST_METHOD")
                (cons (getenv "QUERY_STRING")
            (cons (getenv "CONTENT_LENGTH")
                (cons (getenv "AUTH_TYPE")
                (cons (getenv "CONTENT_FILE")
                (cons (getenv "SCRPT_NAME")
            (cons (getenv "REQUEST_METHOD")
                (cons (getenv"REQUEST_LINE")
                (cons (getenv "REMOTE_USER")
        (cons (getenv "REMOTE_ADDR")
                (cons (getenv "QUERY_STRING")
                (cons (getenv"PATH_TRANSLATED")
                (cons (getenv "PATH_INFO") '()))))))))))))))))))))))))))
(define my-out-list (lambda (x)
                      (begin
                        (display x)
                        (newline))))
(for-each my-out-list my-list)
(define my-getenv (lambda (x)
            (display (getenv x))
            (newline)
            (newline)))
;;(for-each my-getenv my-list)
(define out-list (lambda (put-file list-name)
                   (let loop ((out-name list-name))
                     (if (null?(cdr out-name))(write (car out-name) put-file)
                         (begin
                           (write (car out-name)put-file)
                           (newline put-file)
                          (loop (cdr out-name)))))
   (close-output-port put-file)))

(display "hello")

(define my-output-port (open-output-file "./server.info" #:exists 'truncate))
;;(write my-list my-output-port)
;;(close-output-port my-output-port)
(out-list my-output-port my-list)

Scheme/Lisp CGI通讯,将访问的页面写入文本文件中

;;首先启动服务器
;;加载TCP协议模块
;; The lib we need
(require scheme/tcp)
;;监听90端口
;; Set a port for listening
(define tcp-port-listener (tcp-listen 90))

;;监听客户机发送的请求和消息,将客户机浏览的页面写入一个server.info文件里面。

(define listening (lambda ()
            (define-values (client->me me->client)
              (tcp-accept tcp-port-listener)) ;;监听90端口的信息

           ;;重新定义打开一个server.info文件
            (set! output-file (open-output-file "server.info" #:exists 'truncate))
                    (let loop((me (read client->me))) ;;读取将客户机发送的消息保存到me
                      (cond
               ((eof-object? me) '()) ;;判断读取文件是否到了最后eof
               ((list? me) ;;判断是否是一个列表
                        (begin
                        (display "running")
            ;;将me的参数传个新定义的ls,进行判断是不是为空,然后写入server.info文件里面去。每写完一句,换行继续写。写完后关闭输入输出和监控 端口的流。
            (let loop2((ls me))
                          (if (null? (cdr ls)) (write (car ls) output-file)                              
                             (begin
                               (display (car ls))
                               (newline)
                               (write (car ls) output-file)
                               (newline output-file)
                               (loop2 (cdr ls)))))))
                         (else
                          (begin
                           (display me)
                           (newline)
                           (loop (read client->me))))))
                               (close-output-port output-file)
                               (close-input-port client->me)
                               (close-output-port me->client)
                    (listening)))

;;CGI程序如下:
;;前面这段应该都知道是加载SCHEME解释器和文件类型
#!/bin/sh
":"; exec /usr/local/plt/bin/mzscheme -rq $0 "$@"
(display "content-type: text/plain")
(newline)
(newline)

;;定义一个输出列表,将打开一个文件server.info,将CGI变量写入该文件中
(define output-list (lambda (output-file list-name)
                      (let loop((out list-name))
            (if (null? (cdr out)) (write (car out) output-file)
                  (begin
                (write (car out) output-file)
                (newline output-file)
                (loop (cdr out)))))
(close-output-port output-file))) ;;关闭输出流
;;定义一个打开文件函数
(define output-port (open-output-file "server.info" #:exists 'truncate))
;;定义一个返回自身函数
(define new-display (lambda (n)
              (begin
            (display n)
            (newline))))
(display "The following environment variables are not request-specific and are set for all requests:SERVER_SOFTWARE,SERVER_NAME,GATEWAY_INTERFACE")
(newline)
;;取CGI变量的值
(define non-request (cons (getenv "SERVER_SOFTWARE")
            (cons (getenv "SERVER_NAME")
                (cons (getenv "GATEWAY_INTERFACE") '()))))
(for-each new-display non-request)

(newline)
(display "The following environment variables are specific to the request being fulfilled by the gateway
program: SERVER_PROTOCOL,SERVER_PORT,SERVER_METHOD,PATH_INFO,PATH_TRANSLATED,SCRIPT_NAME,QUERY_STRING,
REMOTE_HOST,REMOTE_ADDR,AUTH_TYPE,REMOTE_USER_REMOTE_INDENT,CONTENT_TYPE,CONTENT_LENGTH")
(newline)
;;取CGI变量的值
(define request (cons (getenv "SERVER_PROTOCOL")
              (cons (getenv "SERVER_PORT")
              (cons (getenv "SERVER_METH0D")
              (cons (getenv "PATH_INFO")
              (cons (getenv "PATH_TRANSLATED")
              (cons (getenv "SCRIPT_NAME")
              (cons (getenv "QUERY_STRING")
              (cons (getenv "REMOTE_HOST")
              (cons (getenv "REMOTE_ADDR")
              (cons (getenv "AUTH_TYPE")
              (cons (getenv "REMOTE_USER")
              (cons (getenv "REMOTE_INDENT")
              (cons (getenv "CONTENT_TYPE")
              (cons (getenv "CONTENT_LENGTH") '())))))))))))))))
(for-each new-display request)
;;取CGI变量HTTP_的值
(define HTTP-spec (cons (getenv "HTTP_ACCEPT")
           (cons "HTTP_USER_AGENT" '())))
(for-each new-display HTTP-spec)

;(output-list output-port (append non-request (append request HTTP-spec)))

;; Client will try to connect the server,and port is 5566.
;;链接服务器,跟服务器取得联系。
(define-values (server->me me->server)
        (tcp-connect "localhost" 90))

;; Send the server infos to tcp server
;;将 CGI的值传给server。
(write (append non-request (append request HTTP-spec)) me->server)

;; remember that if you are not going to close the port,your infos still
;; in buffers that will not send
;;关闭输出流
(close-output-port me->server)

Scheme/Lisp 启动一个多线程!

前面写了IO流,现在继续我的学习练习代码,玩具级的程序,多线程的实现。

;;首先定义一个线程吧!

(define thd-one (thread
                         (lambda ()
                         (let loop ((m (thread-receive)))
                            (if (equal? m 'hello)
                                (kill-thread thd-one)
                                (loop (thread-receive))))))

;;呵呵,好了,测试下这个线程是否在运行

(thread-running? thd-one)

;;向线程发送消息

(thread-send thd-one 'hello)

;;在测试下线程是否还在运行

(thread-dend? thd-one)

;;这下应该死掉了吧,因为程序是这样设计的,当给线程发送消息的时候判断,该信息是什么,就比如一个命令,你向该线程发送一个杀死的命令,所以就这样死 掉了。

Scheme/Lisp 启动一个进程中启动多线程!

(define thd-a (thread (lambda ()
      (let loop ((m (thread-receive)))
         (cond
            ((equal? m 'hello!)
              (thread-send thd-b 'nihao!))
            ((equal? m 'bye-bye!)
              (kill-thread thd-a))
            (else
              (loop (thread-receive))))))))

(define thd-b (thread (lambda ()
      (let loop ((n(thread-receive)))
         (cond
            ((equal? n 'nihao!)
              (thread-send thd-a 'hello!))
            ((equal? n 'bye-bye)
              (kill-thread thd-b))
            (else
               (loop (thread-receive))))))))

Scheme/Lisp 启动一个进程实现两个进程相互通讯

;首先加载TCP协议模块
(require Scheme/tcp)

;;定义一个server的线程

(define server (thread (lambda ()
   (let ((thd (tcp-listen 8080)))
     (let loop ((ready (tcp-accept-ready? thd)))
       (if ready
         (let-values (((in out) (tcp-accept thd)))
(read in)
(close-input-port in)
(write 'got-it out)
(close-output-port out)
(loop (tcp-accept-ready? thd)))))))))

;;然后一个客户机

(define client (thread (lambda ()
    (let-values (((in out) (tcp-connect "localhost" 8080)))
       (write "hello" out)
       (close-output-port out)
       (read in)
       (close-input-port in)
      (kill-thread client)))))

;;这个结合IO流的代码,也应该能看懂,前面文章我写的有IO的代码。

Scheme/Lisp 定义一个类

;;定义一个类必须在类名字后面加%,这个是Scheme语法规定 object%是超类
(define email% (class object%
                         (init to from)
                         (define To to)
                         (define From from)
                         (super-new)
                         (define/public (send) (display From))
                         (define/public (receviver) (displayer To))
                         (define/public (change-sender new-sende-name)
                                                (set! From new-sende-name))))

(define email-one (new email% (to 'hh) (from 'ss)));;定义第一个email
(define email-two (make-object email% 'fg 'bb));; 定义第二个,make-object 创建一个对象!
(send email-one sender) ;;发送第一个
(send email-two sender);;发送第二个
(send email-one change-sender 'xxxxx);;重新定义第一个

Scheme/Lisp 类里面启动线程

;;实现在类里面启动线程
;;代码如下:

(define email% (class object%
   (init)
(super-new)
(define/public (who)  
    (let ((thd-one (thread (lambda ()
                             (thread-suspend thd-one)
                                (void)))))
             (thread-resume thd-one)))))

(define myemail (new email%))
(send myemail who)

Scheme/Lisp UDP编程通讯

(require scheme/udp)
(define server (udp-open-socket "localhost" 8080))
(udp-bind! server "localhost" 8080)
(define s (make-bytes 10)) ;;make-bytes生成字节串,每个字节可以改动
(udp-receive! server s) ;;接受client发送的消息


(require scheme/udp)
(define client (udp-open-socket "localhost" 8081))
(udp-bind! client "localhost" 8081)
(define s (make-bytes 10))
(udp-send-to client "localhost" 8080 #"hello") ;;向server 8080端口发送消息
(udp-close client)

Scheme/Lisp 命名空间和模块另一种写法。

;;file 其实就是后面的foo.ss这个模块,但是必须先写这个,这个文件就是写一个合同

(define s (module->namespace "file")
      (module m scheme
           (define foo (lambda(n) (* n n n)))
           (define bar 100)
           (provide foo bar))

;;加载进来对foo bar 求值。

(require 'm)
(define ns (module->name ''m))
(eval '(foo bar) ns)
(parameterize ((current->namespace (module->namespace "foo.ss")))
    (eval '(foo bar) '(current->namespace)))

(parameterize ((current-output-port (open-output-file "foo.ss")))
    (write 'hello)(close-output-port (currten-output-port))   ;;利用命名空间函数向文件写入。

什么是算法?

什么是算法?

   所谓的算法就是定义良好的计算过程,简单的来说就是在有效的步骤中计算出结果!

什么是数据结构?

什么是数据结构?
数据结构是存储和组织数据的一种方式,以便对数据进行访问和修改!

直接插入排序算法

1.算法描述
void lnsertSort(SeqList R)
   { //对顺序表R中的记录R[1..n]按递增序进行插入排序
    int i,j;
    for(i=2;i<=n;i++) //依次插入R[2],…,R[n]
      if(R[i].key
                              //应在原有位置上
        R[0]=R[i];j=i-1; //R[0]是哨兵,且是R[i]的副本
        do{ //从右向左在有序区R[1..i-1]中查找R[i]的插入位置
         R[j+1]=R[j]; //将关键字大于R[i].key的记录后移
         j-- ;
         }while(R[0].key
        R[j+1]=R[0]; //R[i]插入到正确的位置上
       }//endif
   }//InsertSort

算法分析

1.算法的时间性能分析
     对于具有n个记录的文件,要进行n-1趟排序。
    各种状态下的时间复杂度:
┌─────────┬─────┬──────┬──────┐
│ 初始文件状态     │   正序   │     反序   │无序(平均) │
├─────────┼─────┼──────┼──────┤
│ 第i趟的关键      │   1      │     i+1    │ (i-2)/2 │
│ 字比较次数       │          │            │            │
├─────────┼─────┼──────┼──────┤
│总关键字比较次数 │   n-1    │(n+2)(n-1)/2│ ≈n2/4     │
├─────────┼─────┼──────┼──────┤
│第i趟记录移动次数 │   0      │ i+2        │ (i-2)/2 │
├─────────┼─────┼──────┼──────┤
│总的记录移动次数 │   0      │(n-1)(n+4)/2│ ≈n2/4     │
├─────────┼─────┼──────┼──────┤
│时间复杂度        │ 0(n) │ O(n2)    │ O(n2)    │
└─────────┴─────┴──────┴──────┘
注意:
     初始文件按关键字递增有序,简称"正序"。
    初始文件按关键字递减有序,简称"反序"。

2.算法的空间复杂度分析
     算法所需的辅助空间是一个监视哨,辅助空间复杂度S(n)=O(1)。是一个就地排序。

3.直接插入排序的稳定性
     直接插入排序是稳定的排序方法。

示例代码

示例代码为C语言,输入参数中,需要 排序的数组为array[],起始索引为first,终止索引为last。示例代码的函数采用in-place排序,调用完成后,array[]中从 first到last处于升序排列。
void insertion_sort(char array[], unsigned int first, unsigned int last)
 {
  int i,j;
  int temp;
  for (i = first+1; i<=last;i++)
  {
   temp = array[i];
   j=i-1;
 
   //与已排序的数逐一比较,大于temp时,该数移后
   while((j>=first) && (array[j] > temp))
   {
    array[j+1] = array[j]; 
    j--;
   }
 
   array[j+1] = temp; 
  }
 }
这个更好:
void InsertSort(char array[],unsigned int n)
 {
    int i,j;
    int temp;
    for(i=1;i<n;i++)
    {
      temp = array[i];//store the original sorted array in temp
      for(j=i ; j>0 && temp < array[j-1] ; j--)//compare the new array with temp
      {
          array[j]=array[j-1];//all larger elements are moved one pot to the right
      }
     array[j]=temp;
    }
 }
这个是c++语言版 本的插入排序。为了支持list使用了std::advance()。
#include 
 
template<typename biIter>
void insertion_sort(biIter begin, biIter end)
  {
    typedef typename std::iterator_traits<biIter>::value_type value_type;
    biIter bond = begin;
    std::advance(bond, 1);
    for(; bond!=end; std::advance(bond, 1)) {
      value_type key = *bond;
      biIter ins = bond;
      biIter pre = ins;
      std::advance(pre, -1);
      while(ins!=begin && *pre>key) {
        *ins = *pre;
        std::advance(ins, -1);
        std::advance(pre, -1);
      }
      *ins = key;
    }
  }
以下是PASCAL语言,程序使用链表做插入排序,目的:将读入的英文名字按字典序排列
TYPE
link=^node;
node=record
      data:string;
      next:link;
     end;
VAR
 
p,q,head,n:link;
t,m:integer;
f1,f2:text;
i:string;
BEGIN
 
assign(f1,'lianbiao-name-in.txt');
reset(f1);
assign(f2,'lianbiao-name-out.txt');
rewrite(f2);
head:=nil;
read(f1,t);
readln(f1);
read(f1,i);
new(p);
p^.data:=i;
p^.next:=nil;
head:=p;
readln(f1);
read(f1,i);
FOR m:=2 TO t DO
 BEGIN
  p:=head;
  new(n);
  n^.data:=i;
  while (i>p^.data) and (p^.next<>nil) do
   begin
    q:=p;
    p:=p^.next;
   end;
  if idata then begin
                        n^.next:=head;
                        head:=n;
                       end
                  else if (i>p^.data) and (p^.next=nil) then begin
                                                              p^.next:=n;
                                                              n^.next:=nil;
                                                             end
                                                        else begin
                                                              q^.next:=n;
                                                              n^.next:=p;
                                                             end;
  readln(f1);
  read(f1,i);
 end;
p:=head;
while p<>nil do
 begin
  write(f2,p^.data,' ');
  p:=p^.next;
 end;
CLOSE(f1);
CLOSE(f2);
END.