老韩
21六/100

Mailman2.1.9系统的一些BUG修复

1、邮件列表归档中文乱码问题。

  A.错误描述:如果客户端发送的邮件编码为GB2312编码,则当把邮件归档时,会出现信体为乱码的现象。

  B.问题分析:经过对邮件原文的分析,邮件本身没有问题,信头上也有编码信息,比如我发送的测试信信体为:

  1. ------=_NextPart_000_0180_01CB096D.0DEF1A50
  2. Content-Type: text/plain;
  3.     charset="gb2312"
  4. Content-Transfer-Encoding: base64
  5.  
  6. 1eLKx9K7t+K3otfUT3V0bG9va7XEsuLK1NPKvP6jrNPKvP6x4MLrzqqjukdCMjMxMg0KDQpUaGlz
  7. IGlzIGEgdGVzdCBtYWlsIHNlbmRlZCBieSBPVVRMT09LLCBhbmQgaXShr3MgZW5jb2RpbmcgYnkg
  8. R0IyMzEyLi4NCg0KIA0KDQpIYW5kYW9saWFuZw0KDQq6q7XAwcENCg0K
  9.  
  10. ------=_NextPart_000_0180_01CB096D.0DEF1A50

  经过对信体进行Base64解码,发现信体信息正常,编码正常。这就跟踪到问题可能出现在解码的模块。经过读代码发现,Mailman是调用pipermail进行解码的,据此跟踪到信体的解解码在HyperArch.py模块的Article类里完成。

  C.问题修正:在Article类里加入编码判断并进行转码:

  1. if body and charset != Utils.GetCharSet(self._lang):
  2.     # decode body
  3.     try:
  4.         #body = body.decode(charset)
  5.         if charset == 'gb2312':
  6.             body  =  body.decode(charset, 'ignore').encode(Utils.GetCharSet(self._lang))
  7.         else:
  8.             body = unicode(body, charset)
  9.     except (UnicodeError, LookupError):
  10.         body = None

2、邮件列表的List页面乱码问题

  A.问题描述:在Mailman2.1.9版本中,如果管理员后台设置了语言为中文,而系统又没有进行编码设置,那么Mailman邮件列表中文界面极有可能显示为乱码。

  B.问题分析:通过查看网页源代码发现,此时的编码为“us-ascii”,这是默认的编码。再检查模板,发现模板的编码都是UTF-8,此时编码是混淆的。

  C.修正:更改Default.py或者mm_cfg.py文件,把zh_CN编码改成:add_language('zh_CN', _('Chinese (China)'), 'utf-8')。

  3、脚本change_pw无法找到列表错误。

  A.错误描述:当邮件列表的名字有大小写字母时,会出现无法修改邮件列表的错误,例如:
当我在命令行下输入:./change_pw --listname=Mailman-dev-test --password=123456,此时可能出现:No such list "Mailman-dev-test"的错误。

  B.问题分析:这是因为没有把所有字母转成小写的缘故,邮件列表在本地都存储为小写。如果没有转换,则Mailman/MailList.py模块第616会抛出:Errors.MMUnknownListError错误:

  1. if not Utils.list_exists(self.internal_name()):
  2.     raise Errors.MMUnknownListError

  
  C. 修正:在change_pw脚本的openlist方法中,将传入的listname转成小写:

  1. listname = listname.lower().strip()
21五/100

转换Putty ppk 文件到OpenSSH格式的Key文件

出于安全的考虑,我的服务器SSH远程认证去掉了通过用户名+密码模式的认证机制。转而使用Windows下的Puttygen生成的Key(以.ppk结尾)来验证登录,同时为了增强安全性,把SSH的端口配到了高端端口上。然而转到Mac平台下去之后,因其本身就带有Shell(Mac是基于FreeBSD进行的包装),所以本身也就有了SSH,用不上Putty了,但是因此所导致的问题是,我在Windows下的Key到了Mac平台上也就用不上了,在这种情况下,迫不得已,就只有去找转变认证机制的方法。

出于思维的习惯(人类避重就轻的惰性),一开始考虑的是把服务器改回使用用户名加密码的认证机制,但显然这不是一个明智的做法。于是就把眼光转向了转换ppk key的方向,基于这个想法,再想到解铃还得系铃人,所以目光自然又重新定位回了Putty这个开源的东东,下载下源码一读,发现它对Uninx的支持也还是很好的。那好,我只需要一个puttygen,编译无非是一点体力活。

以下是全过程:
1、下载Putty 0.6源代码并编译:

  1. wget http://putty.very.rulez.org/latest/putty-0.60.tar.gz
  2. tar xzvf putty-0.60.tar.gz
  3. cd putty-0.60
  4. configureprefix=/opt/iApps/putty
  5. make

嗯,不用讶异,接下来没有make install的过程,因为我们不需要真的把Putty安装到/opt/iApps/putty里,当你在Make的时候,Puttygen已经编译完成,这里在Configure写上一个prefix路径,只是想提醒你,如果想安装的话,最好指定一个目录,以便于管理。

那么接下来转换我们Windows下的Putty key:

  1. putty-0.60/unix/puttygen my_ssh_key.ppk -O private-openssh -o my_openssh_key.ssh

顺利的生成my_openssh_key.ssh文件,此时就可以通过以下命令来进行登录了:

  1. ssh root@172.16.1.99 -i my_openssh_key.ssh -p 9999
20四/105

盛大在线游戏格子客开始封测

  格子客是我来到盛大创新院之后参与的第一个项目,这是一款新概念的在线游戏,首推“玩游戏!为乐趣更为奖品!”的全新概念!与其它传统游戏不同,它不是单纯依靠同质化的游戏乐趣吸引玩家,而是把丰富,刺激的“奖品”有机化的融入到游戏当中,玩游戏的同时不但可以体验到冒险的刺激,而且可以拿到奖品,这个奖品不是虚拟的,是实物的,比如:PSP、Ipod等。
  2010年4月19日格子客开始邀请封测,如果你想体验一下这个游戏,可以找我要邀请码。要邀请码的同学请在回复中留下Email。:)

格子客截图

格子客截图

格子客截图

格子客截图

格子客截图

格子客截图

格子客截图

20四/100

我的GVim配置

  工作中,我大部分时间都是和VIM打交道的,甚至Windows下的编程也开始完全用GVIM替代Editplus。这两天对自己的vimrc文件做了一下整理。同时给每一行的配置增加了注释。整理完成之后,好用多了,因为借鉴了很多网友的经验,所以本着分享的精神公布出来,希望有朋友能用上。
  另外,我这份_vimrc配置使用的字体是:YaHei Mono,如果您没有此字体,可以到这里下载:(下载YaHei Mono字体)。下载后放到Windows文件夹下的fonts目录里即可。如果你不想用YaHei Mono字体,那么有一个替代方案就是用Courier_New字体,需要修改以下配置:

  1. " 设置显示字体
  2. if has("win32")
  3.     " set guifont=Courier_New:h11:cANSI
  4.     set guifont=YaHei\ Mono:h11
  5.     "set guifontwide=Microsoft\ Yahei\ Monotype:h11
  6.     "set guifont=YaHei\ Consolas\ Hybrid:h12
  7. endif

将“set guifont=YaHei\ Mono:h11”注掉,同时把“set guifont=Courier_New:h11:cANSI”项打开即可。

以下是配置文件全部内容:

  1. " ***************Vimrc files for GVim *************
  2. " * CreateDate : Apr 20,2010
  3. " * LastModified : Apr 20,2010
  4.  
  5. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  6. "                                全局设定                                    "
  7. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  8. " 不要使用vi的键盘模式,而是vim自己的
  9. set nocompatible
  10.  
  11. " 加载配置。
  12. behave mswin
  13.  
  14. "设置快速编辑.vimrc文件 ,e 编辑.vimrc
  15. map <silent> <leader>e :call SwitchToBuf("~/_vimrc")<cr>
  16.  
  17. "保存.vimrc文件后会自动调用新的.vimrc
  18. autocmd! bufwritepost .vimrc source ~/_vimrc
  19.  
  20. " 设定解码
  21. if has("multi_byte")
  22.     " When 'fileencodings' starts with 'ucs-bom', don't do this manually
  23.     "set bomb
  24.     set fileencodings=ucs-bom,utf-8,chinese,taiwan,japan,korea,latin1
  25.     " CJK environment detection and corresponding setting
  26.     if v:lang =~ "^zh_CN"
  27.         " Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
  28.         set encoding=utf-8
  29.         set termencoding=utf-8
  30.         if &fileencoding == ''
  31.             set fileencoding=utf-8
  32.         endif
  33.     elseif v:lang =~ "^zh_TW"
  34.         " Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
  35.         set encoding=euc-tw
  36.         set termencoding=euc-tw
  37.         if &fileencoding == ''
  38.             set fileencoding=euc-tw
  39.         endif
  40.     elseif v:lang =~ "^ja_JP"
  41.         " Japanese, on Unix euc-jp, on MS-Windows cp932
  42.         set encoding=euc-jp
  43.         set termencoding=euc-jp
  44.         if &fileencoding == ''
  45.             set fileencoding=euc-jp
  46.         endif
  47.     elseif v:lang =~ "^ko"
  48.         " Korean on Unix euc-kr, on MS-Windows cp949
  49.         set encoding=euc-kr
  50.         set termencoding=euc-kr
  51.         if &fileencoding == ''
  52.             set fileencoding=ecu-kr
  53.         endif
  54.     endif
  55.     " Detect UTF-8 locale, and override CJK setting if needed
  56.     if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
  57.         set encoding=utf-8
  58.     endif
  59. else
  60.     echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'
  61. endif
  62.  
  63.  
  64. " browsedir设置
  65. set browsedir=buffer
  66.  
  67. " 自动格式化设置
  68. filetype indent on
  69. set autoindent
  70. set smartindent
  71.  
  72. " 设置备份及备份目录。
  73. set backspace=indent,eol,start
  74. set backupdir=D:\vim_back_files
  75. set autochdir
  76.  
  77. " history文件中需要记录的行数,恢复必须用到。
  78. set history=1024
  79.  
  80. " 窗口最大化
  81. autocmd GUIEnter * simalt ~x
  82.  
  83. " 解决菜单乱码,先指定语言。
  84. set langmenu=zh_CN.UTF-8
  85. source $VIMRUNTIME/vimrc_example.vim
  86. source $VIMRUNTIME/mswin.vim
  87. language message zh_CN.UTF-8
  88. set fileencodings=utf-8,GB2312,cp936,gb18030,big5,euc-jp,euc-kr,latin1
  89.  
  90. " 在处理未保存或只读文件的时候,弹出确认
  91. set confirm
  92.  
  93. " 共享外部剪贴板
  94. set clipboard+=unnamed
  95.  
  96. " 显示未完成命令
  97. set showcmd
  98. " 侦测文件类型
  99. filetype on
  100.  
  101. " 载入文件类型插件
  102. filetype plugin on
  103.  
  104. " 为特定文件类型载入相关缩进文件
  105. filetype indent on
  106.  
  107. " 保存全局变量
  108. set viminfo+=!
  109.  
  110. " 带有如下符号的单词不要被换行分割
  111. set iskeyword+=_,$,@,%,#,-
  112.  
  113. " 语法高亮
  114. syntax on
  115.  
  116. " 设置不兼容模式
  117. set nocp
  118.  
  119. " 设置鼠标支持
  120. set mouse=a
  121.  
  122. " 不要生成swap文件
  123. setlocal noswapfile
  124.  
  125. " 当buffer被丢弃时隐藏
  126. set bufhidden=hide
  127.  
  128. " 保存窗口大小
  129. set sessionoptions+=resize
  130.  
  131. " C++头文件识别
  132. au BufEnter /usr/include/c++/* setf cpp
  133. au BufEnter /usr/include/g++-3/* setf cpp
  134.  
  135. " GNU标准
  136. au BufEnter /usr/* call GnuIndent()
  137.  
  138. " 显示行号
  139. set number
  140.  
  141. " tab宽度
  142. set tabstop=4
  143. set cindent shiftwidth=4
  144. set autoindent shiftwidth=4
  145.  
  146. " C/C++注释
  147. set comments=://
  148.  
  149. " 修正自动C式样注释功能 <2005/07/16>
  150. set comments=s1:/*,mb:*,ex0:/
  151.  
  152. " 增强检索功能
  153. set tags=./tags,./../tags,./**/tags
  154.  
  155. " 保存文件格式
  156. set fileformats=unix,dos
  157.  
  158. " 文件被其他程序修改时自动载入
  159. set autoread
  160.  
  161. " 高亮字符,让其不受100列限制
  162. :highlight OverLength ctermbg=red ctermfg=white guibg=red guifg=white
  163. :match OverLength '\%101v.*'
  164.  
  165. " 总是显示状态行
  166. set laststatus=2
  167.  
  168. " 状态行颜色
  169. " highlight StatusLine guifg=SlateBlue guibg=Yellow
  170. highlight StatusLine guifg=SlateBlue guibg=White
  171. highlight StatusLineNC guifg=Gray guibg=White
  172.  
  173. " 我的状态行显示的内容(包括文件类型和解码)
  174. set statusline=[%n]%<%f%y%h%m%r%=[%b\ 0x%B]\ %l\ of\ %L,%c%V\ Page\ %N\ %P
  175.  
  176. " 设置命令行高度为2行
  177. set cmdheight=1
  178.  
  179. " 命令行补全
  180. set wildmenu
  181. " 自动补全括号,包括大括号
  182. :inoremap ( ()<ESC>i
  183. :inoremap ) <c-r>=ClosePair(')')<CR>
  184. :inoremap { {}<ESC>i
  185. :inoremap } <c-r>=ClosePair('}')<CR>
  186. :inoremap [ []<ESC>i
  187. :inoremap ] <c-r>=ClosePair(']')<CR>
  188. :inoremap < <><ESC>i
  189. :inoremap > <c-r>=ClosePair('>')<CR>
  190.  
  191.  
  192. " 打开文件时,总是跳到退出之前的光标处
  193. autocmd BufReadPost *
  194. \ if line("'\"") > 0 && line("'\"") <= line("$") |
  195. \   exe "normal! g`\"" |
  196. \ endif
  197.  
  198. " 用浅色高亮当前行
  199. if has("gui_running")
  200.     autocmd InsertLeave * se nocul
  201.     autocmd InsertEnter * se cul
  202. endif
  203.  
  204. filetype plugin on      "允许使用ftplugin目录下的文件类型特定脚本
  205. filetype indent on      "允许使用indent目录下的文件类型缩进
  206.  
  207. " 设置自动粘贴功能。
  208. set pastetoggle=<F3>
  209.  
  210. " 设置以缩进的方式自动折叠和设置快捷方式
  211. set foldmethod=indent
  212.  
  213. " map <F3> zO " 打开折叠
  214. map <F4> zc " 关闭折叠
  215. map <F5> zR    " 打开所有折叠
  216. map <F6> zM    " 关闭所有折叠
  217.  
  218. " 保存代码文件前自动修改最后修改时间
  219. au BufWritePre *.sh           call TimeStamp('#')
  220. au BufWritePre .vimrc,*.vim   call TimeStamp('"')
  221. au BufWritePre *.c,*.h        call TimeStamp('//')
  222. au BufWritePre *.cpp,*.hpp    call TimeStamp('//')
  223. au BufWritePre *.cxx,*.hxx    call TimeStamp('//')
  224. au BufWritePre *.java         call TimeStamp('//')
  225. au BufWritePre *.rb           call TimeStamp('#')
  226. au BufWritePre *.py           call TimeStamp('#')
  227. au BufWritePre Makefile       call TimeStamp('#')
  228. au BufWritePre *.php
  229.     \call TimeStamp('<?php //', '?>')
  230. au BufWritePre *.html,*htm
  231.     \call TimeStamp('<!--', '-->')
  232.  
  233. " 更改Leader为","
  234. let g:C_MapLeader = ','
  235.  
  236. " 设置显示字体
  237. if has("win32")
  238.     " set guifont=Courier_New:h11:cANSI
  239.     set guifont=YaHei\ Mono:h11
  240.     "set guifontwide=Microsoft\ Yahei\ Monotype:h11
  241.     "set guifont=YaHei\ Consolas\ Hybrid:h12
  242. endif
  243.  
  244. ab xmain int main(int argc, char *argv[])<cr>{<cr>}<up><cr>return
  245.  
  246. " 使用 murphy 调色板
  247. colo murphy
  248.  
  249. " 不要闪烁
  250. set novisualbell
  251.  
  252. " 能够漂亮地显示.NFO文件
  253. set encoding=utf-8
  254. function! SetFileEncodings(encodings)
  255.     let b:myfileencodingsbak=&fileencodings
  256.     let &fileencodings=a:encodings
  257. endfunction
  258. function! RestoreFileEncodings()
  259.     let &fileencodings=b:myfileencodingsbak
  260.     unlet b:myfileencodingsbak
  261. endfunction
  262.  
  263. au BufReadPre *.nfo call SetFileEncodings('cp437')|set ambiwidth=single
  264. au BufReadPost *.nfo call RestoreFileEncodings()
  265.  
  266. " 用空格键来开关折叠
  267. set foldenable
  268. set foldmethod=manual
  269. nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
  270.  
  271. " 隐藏掉菜单和工具条。
  272. set guioptions-=m
  273. set guioptions-=T
  274. map <silent> <F2> :if &guioptions =~# 'T' <Bar>
  275.         \set guioptions-=T <Bar>
  276.         \set guioptions-=m <bar>
  277.     \else <Bar>
  278.         \set guioptions+=T <Bar>
  279.         \set guioptions+=m <Bar>
  280.     \endif<CR>
  281.  
  282. " 标签页设置
  283. if has("gui_running")
  284.     set showtabline=2
  285.     map! tn tabnew
  286.     nmap <C-c> :tabclose<CR>
  287. endif
  288.  
  289. " 标签页只显示文件名
  290. function ShortTabLabel ()
  291.     let bufnrlist = tabpagebuflist (v:lnum)
  292.     let label = bufname (bufnrlist[tabpagewinnr (v:lnum) -1])
  293.     let filename = fnamemodify (label, ':t')
  294.     return filename
  295. endfunction
  296.  
  297. set guitablabel=%{ShortTabLabel()}
  298.  
  299. " 使回格键(backspace)正常处理indent, eol, start等
  300. set backspace=eol,start,indent
  301.  
  302. " 允许backspace和光标键跨越行边界
  303. " set whichwrap+=<,>,h,l
  304.  
  305. " 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
  306. set mouse=a
  307. set selection=exclusive
  308. set selectmode=mouse,key
  309.  
  310. " 启动的时候不显示那个援助索马里儿童的提示
  311. set shortmess=atI
  312.  
  313. " 通过使用: commands命令,告诉我们文件的哪一行被改变过
  314. set report=0
  315.  
  316. " 不让vim发出讨厌的滴滴声
  317. set noerrorbells
  318.  
  319. " 在被分割的窗口间显示空白,便于阅读
  320. set fillchars=vert:\ ,stl:\ ,stlnc:\
  321.  
  322. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  323. "                              搜索和匹配                                      "
  324. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  325. " 高亮显示匹配的括号
  326. set showmatch
  327.  
  328. " 匹配括号高亮的时间(单位是十分之一秒)
  329. set matchtime=3
  330.  
  331. " 在搜索的时候忽略大小写
  332. set ignorecase
  333.  
  334. " 不要高亮被搜索的句子(phrases
  335. " set nohlsearch
  336.  
  337. " 在搜索时,输入的词句的逐字符高亮(类似firefox的搜索)
  338. set incsearch
  339.  
  340. " 输入:set list命令是应该显示些啥?
  341. set listchars=tab:\|\ ,trail:.,extends:>,precedes:<,eol:$
  342. " Tab补全时忽略这些忽略这些
  343. set wildignore=*.o,*.obj,*.bak,*.exe
  344. " 光标移动到buffer的顶部和底部时保持3行距离
  345. set scrolloff=3
  346.  
  347. "搜索出之后高亮关键词
  348. set hlsearch
  349.  
  350. nmap <silent> <leader><cr> :noh<cr>
  351.  
  352. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  353. "                              CTags的设定                                     "
  354. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  355. set tags=tags;
  356. " 按照名称排序
  357. let Tlist_Sort_Type = "name"
  358.  
  359. " 在右侧显示窗口
  360. let Tlist_Use_Right_Window = 1
  361.  
  362. " 压缩方式
  363. let Tlist_Compart_Format = 1
  364.  
  365. " 如果只有一个bufferkill窗口也killbuffer
  366. let Tlist_Exist_OnlyWindow = 1
  367.  
  368. " 不要关闭其他文件的tags
  369. let Tlist_File_Fold_Auto_Close = 0
  370.  
  371. " 不要显示折叠树
  372. let Tlist_Enable_Fold_Column = 0
  373.  
  374. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  375. "                               快捷键映射                                     "
  376. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  377. "设置其他快捷键
  378. map <F7> :vsplit<ENTER>:edit `pwd`<ENTER>i
  379. "F7 打开左侧垂直窗口选择待编辑的文件
  380.  
  381. " 自动完成的缩进。
  382. if has("autocmd")
  383.     if has("gui")
  384.         autocmd WinLeave * set nocursorline nocursorcolumn
  385.         autocmd WinEnter * set cursorline cursorcolumn
  386.     else
  387.         autocmd WinLeave * set nocursorline nocursorcolumn
  388.         autocmd WinEnter * set cursorline nocursorcolumn
  389.     endif
  390.  
  391.     " Enable file type detection.
  392.  
  393.     " load view saved by the mkview command
  394.     autocmd FileType * loadview
  395.     autocmd FileType * set noexpandtab
  396.     autocmd BufWinEnter * loadview
  397.  
  398.     " Use the default filetype settings, so that mail gets 'tw' set to 72,
  399.     " 'cindent' is on in C files, etc.
  400.     " Also load indent files, to automatically do language-dependent indenting.
  401.     filetype plugin indent on
  402.  
  403.     " In text files, always limit the width of text to 78 characters
  404.     autocmd FileType text set textwidth=78 expandtab softtabstop=4
  405.     autocmd FileType sh set shiftwidth=4 expandtab softtabstop=4
  406.     autocmd FileType php set shiftwidth=4 expandtab softtabstop=4
  407.     autocmd FileType html set shiftwidth=4 expandtab softtabstop=4
  408.     autocmd FileType javascript set shiftwidth=4 expandtab softtabstop=4
  409.     autocmd FileType python set shiftwidth=4 expandtab softtabstop=4
  410.     autocmd FileType ruby set shiftwidth=4 expandtab softtabstop=4
  411.     autocmd FileType eruby set shiftwidth=4 expandtab softtabstop=4
  412.     autocmd FileType sql set shiftwidth=4 expandtab softtabstop=4
  413.  
  414.     " When editing a file, always jump to the last known cursor position.
  415.     " Don't do it when the position is invalid or when inside an event handler
  416.     " (happens when dropping a file on gvim).
  417.     autocmd BufReadPost *
  418.           \ if line("'\"") > 0 && line("'\"") <= line("$") |
  419.           \   execute "normal g`\"" |
  420.           \ endif
  421.  
  422.     augroup prog
  423.         " Remove all cprog autocommands
  424.         autocmd!
  425.  
  426.         " When starting to edit a file:
  427.         "   For C and C++ files set formatting of comments and set C-indenting on.
  428.         "   For other files switch it off.
  429.         "   Don't change the order, it's important that the line with * comes first.
  430.         autocmd FileType *      set formatoptions=tcoql nocindent comments&
  431.  
  432.         autocmd BufWinLeave *.sh,*.c,*.cpp,*.perl,*.py mkview
  433.         autocmd BufWinEnter *.sh,*.c,*.cpp,*.perl,*.py silent loadview
  434.  
  435.         function! CleverTab()
  436.             if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
  437.             return "\<Tab>"
  438.         else
  439.             return "\<C-N>"
  440.         endfunction
  441.  
  442.         autocmd FileType c,cpp  noremap! <S-Tab> <C-R>=CleverTab()<CR>
  443.         autocmd FileType c,cpp  noremap! <C-]> <C-X><C-]>
  444.         autocmd FileType c,cpp  noremap! <C-F> <C-X><C-F>
  445.         autocmd FileType c,cpp  noremap! <C-D> <C-X><C-D>
  446.         autocmd FileType c,cpp  noremap! <C-L> <C-X><C-L>
  447.  
  448.         autocmd FileType c,cpp,sh,perl,python set fileformat=unix
  449.         autocmd FileType sh     set formatoptions=croql cindent comments=b:#
  450.         autocmd FileType c,cpp  set expandtab shiftwidth=4 softtabstop=4
  451.     augroup END
  452. endif " has("autocmd")
  453.  
  454. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  455. "                            PYTHON 相关的设置                                 "
  456. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  457. "Python 文件的一般设置,比如不要 tab 等
  458. "设置自动缩进为4,插入模式里: 插入 <Tab> 时使用合适数量的空格。
  459. "要插入实际的制表,可用 CTRL-V<Tab> 
  460. autocmd FileType python setlocal expandtab | setlocal shiftwidth=4 |
  461.     \setlocal softtabstop=4 | setlocal textwidth=76 |
  462.     \tabstop=4
  463.  
  464. "pydiction插件设置(需要安装pydiction插件)
  465.  
  466. "设置python的字典路径
  467. let g:pydiction_location = '~/.vim/skeleton/pydict/complete-dict'
  468.  
  469. "设置pydict的菜单高度
  470. let g:pydiction_menu_height = 10  
  471.  
  472. "Python Unittest 的一些设置
  473. "在编写 Python 代码及 unittest 测试时不需要离开 vim
  474. "键入 :make 或者点击 gvim 工具条上的 make 按钮就自动执行测试用例
  475. autocmd FileType python compiler pyunit
  476. autocmd FileType python setlocal makeprg=python\ ~/.vim/skeleton/alltests.py
  477. autocmd BufNewFile,BufRead test*.py setlocal makeprg=python\ %
  478.  
  479. "自动使用新文件模板(需要提前准备skeleton相关文件)
  480. autocmd BufNewFile test*.py 0r ~/.vim/skeleton/test.py
  481. autocmd BufNewFile alltests.py 0r ~/.vim/skeleton/alltests.py
  482. autocmd BufNewFile wx*.py 0r ~/.vim/skeleton/wxskeleton.py
  483. autocmd BufNewFile *.py 0r ~/.vim/skeleton/skeleton.py
  484.  
  485. "设置= + - * 前后自动空格
  486. "设置,后面自动添加空格
  487. au FileType python inoremap <buffer>= <c-r>=EqualSign('=')<CR>
  488. au FileType python inoremap <buffer>+ <c-r>=EqualSign('+')<CR>
  489. au FileType python inoremap <buffer>- <c-r>=EqualSign('-')<CR>
  490. au FileType python inoremap <buffer>* <c-r>=EqualSign('*')<CR>
  491. au FileType python inoremap <buffer>/ <c-r>=EqualSign('/')<CR>
  492. au FileType python inoremap <buffer>> <c-r>=EqualSign('>')<CR>
  493. au FileType python inoremap <buffer>< <c-r>=EqualSign('<')<CR>
  494. au FileType python inoremap <buffer>: <c-r>=Swap()<CR>
  495. au FileType python inoremap <buffer>, ,<space>
  496.  
  497.  
  498. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  499. "                        脚本内部用到的自定义函数                              "
  500. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  501. "
  502. "函数后面加上!是防止vimrc文件重新载入时报错
  503. "实现光标位置自动交换:) -->  ):
  504. function! Swap()
  505.     if getline('.')[col('.') - 1] =~ ")"
  506.         return "\<ESC>la:"
  507.     else
  508.         return ":"
  509.     endif
  510. endf
  511.  
  512. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  513. "
  514. "实现+-*/前后自动添加空格,逗号后面自动添加空格,适用python
  515. "支持+= -+ *= /+格式
  516.  
  517. function! EqualSign(char)
  518.     if a:char  =~ '='  && getline('.') =~ ".*("
  519.         return a:char
  520.     endif
  521.     let ex1 = getline('.')[col('.') - 3]
  522.     let ex2 = getline('.')[col('.') - 2]
  523.  
  524.     if ex1 =~ "[-=+><>\/\*]"
  525.         if ex2 !~ "\s"
  526.             return "\<ESC>i".a:char."\<SPACE>"
  527.         else
  528.             return "\<ESC>xa".a:char."\<SPACE>"
  529.         endif
  530.     else
  531.         if ex2 !~ "\s"
  532.             return "\<SPACE>".a:char."\<SPACE>\<ESC>a"
  533.         else
  534.             return a:char."\<SPACE>\<ESC>a"
  535.         endif
  536.     endif
  537. endf
  538.  
  539. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  540. "
  541. "实现括号的自动配对后防止重复输入),适用python
  542. function! ClosePair(char)
  543.     if getline('.')[col('.') - 1] == a:char
  544.         return "\<Right>"
  545.     else
  546.         return a:char
  547.     endif
  548. endf
  549.  
  550. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  551. "
  552. "SwitchToBuf()实现它在所有标签页的窗口中查找指定的文件名,如果找到这样一个窗口,
  553. "就跳到此窗口中;否则,它新建一个标签页来打开vimrc文件
  554. "上面自动编辑.vimrc文件用到的函数
  555. function! SwitchToBuf(filename)
  556.     let bufwinnr = bufwinnr(a:filename)
  557.     if bufwinnr != -1
  558.     exec bufwinnr . "wincmd w"
  559.         return
  560.     else
  561.         " find in each tab
  562.         tabfirst
  563.         let tab = 1
  564.         while tab <= tabpagenr("$")
  565.             let bufwinnr = bufwinnr(a:filename)
  566.             if bufwinnr != -1
  567.                 exec "normal " . tab . "gt"
  568.                 exec bufwinnr . "wincmd w"
  569.                 return
  570.             endif
  571.             tabnext
  572.             let tab = tab + 1
  573.         endwhile
  574.         " not exist, new tab
  575.         exec "tabnew " . a:filename
  576.     endif
  577. endfunction
  578.  
  579. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  580. "
  581. "Last change用到的函数,返回时间,能够自动调整位置
  582. function! TimeStamp(...)
  583.     let sbegin = ''
  584.     let send = ''
  585.     if a:0 >= 1
  586.         let sbegin = a:1.'\s*'
  587.     endif
  588.     if a:0 >= 2
  589.         let send = ' '.a:2
  590.     endif
  591.     let pattern =  'Last Change: .\+'
  592.         \. send
  593.     let pattern = '^\s*' . sbegin . pattern . '\s*$'
  594.     let now = strftime('%Y-%m-%d %H:%M:%S',
  595.         \localtime())
  596.     let row = search(pattern, 'n')
  597.     if row  == 0
  598.         let now = a:1 .  ' Last Change:  '
  599.             \. now . send
  600.         call append(2, now)
  601.     else
  602.         let curstr = getline(row)
  603.         let col = match( curstr , 'Last')
  604.         let spacestr = repeat(' ',col - 1)
  605.         let now = a:1 . spacestr . 'Last Change:  '
  606.             \. now . send
  607.         call setline(row, now)
  608.     endif
  609. endfunction
16三/107

我们的开源Twitter客户端:TinyTui2

  TinyTui是由印客网前技术总监老庄(表伟)发起的一个开源项目,后来由于共同的兴趣爱好,我和另外一个朋友felixding也加入到了这个团队当中。项目虽然不大,但却凝聚了我们不少心血,当然,做为后来者加入的我,贡献有限,主要还是前面两位牛人在开发。目前产品正在完善当中,不过已经基本上满足需求。

  一、关于TinyTui2:
  TinyTui2是一个基于Twitter API构建的Twitter客户端程序,目标是建立一个高可用性、高智能的代_理平台,为墙内的互联网用户搭建起通往Twitter的桥梁。为了防止信息过载,我们在这个平台上加入了贝叶斯算法(bayesian,wiki:点这里),试图应用这个算法的自我学习机制,来过滤掉一些无意义的噪音,让用户能更有效Touch到目标信息。
  TinyTui2为开源程序,基于GPL协议,可二次开发,当然,我们也要求二次开发人员须具备能忍受我们在代码间叽叽歪歪的废话而不疯掉的心理承受能力,除此没其它的要求。祝您好运,感谢祖国,感谢父母,感谢国民党,感谢功夫网,感谢你丫挺的。
  项目主页:http://code.google.com/p/tinytui2/

  二、我们的信念:
  以佛主如来的名义,Fuck G_F_W 一万年。阿门。

  三、系统安装:
  1、将程序上传到你的WEB目录下,请保证域名指向的根目录是:apps
  2、保证:cache目录及其子目录可写。
  3、保证:libs/b8-0.4.4/etc/config_storage.php文件可写。
  4、运行:http://youdomain.com/install
  5、输入你的数据库账号及密码。点击安装。
  6、安装成功之后,请删除apps目录下的install文件夹。

  四、目录结构:
  /----apps - WEB应用程序所在目录
   | |
   | |----install -- 系统安装文件
   | |
   | |----src -- 静态资源文件
   |
   |--conf - 网站配置文件所在目录
   |
   |--libs - 库文件,包括开源的库,b8和smarty
   |
   |--view - 模板所在目录
   |
   |--lang - 语言包所在目录
   |
   |--cache - 缓存目录(此目录以及子目录必须设置为可写)
   | |
   | | ------ smarty_cache -- smarty缓存目录,可在配置文件里设置是否开启。
   | |
   | | ------ templates_c -- smarty模板编译默认目录。
   |
   |--Doc - 文档目录,包括原始的参考资源,以及原始的PSD文件等。

  五、系统配置:
  要运行本套系统,需要满足如下条件:
    1、墙外的虚拟主机或VPS一台。
    2、PHP+MySQL环境,虚拟主机要有可读写权限。
    3、不怕被墙的域名一个[可选]。

  六、开发人员Twitter及BLOG:
  @zhuangbiaowei - http://www.zhuangbiaowei.cn
  @felixding - http://dingyu.me/blog/
  @handaoliang - http://www.handaoliang.com

  七、其它:
  这是PHP版本,后续的Python+Tornado+GAE版本正在开发当中。
  线上版本:http://www.ijiyi.com,欢迎关注并使用。

   下一页