分类:'编程随笔' 的所有文章

VIM有没有办法绑定 (Ctrl + 数字键)快捷键?

最近安装了几个不错的插件以后,感觉vim的快捷键开始不够用了

于是想把Ctrl和逗号、句号两键做成快捷键,但是试了好几次发现不行

后来又尝试绑定Ctrl+数字键,还是失败

不得已,在vim-cn邮件组发了一封邮件有没有办法map Ctrl+,./;0-9

发完以后一两天没有回音,差点都忘了,后来tocer给出一个链接:
how to bind CTRL- to something else?

过去看了看,发现老同志 Tony Mechelynck 指出:

For portability, the only “Ctrl+printable key” combinations recognized
by Vim are those where the “printable key” corresponds to a character in
the range 0×3F-0×5F, or a lowercase letter, as follows:
? 0×3F Ctrl-? 0×7F (DEL)
@ 0×40 Ctrl-@ 0×00
A 0×41 a 0×61 Ctrl-a or Ctrl-A 0×01
B 0×42 b 0×62 Ctrl-b or Ctrl-B 0×02

Y 0×59 y 0×79 Ctrl-y or Ctrl-Y 0×19
Z 0×5A z 0×7A Ctrl-z or Ctrl-Z 0×1A
[ 0x5B Ctrl-[ 0x1B (ESC)
\ 0x5C Ctrl-\ 0x1D
] 0×5D Ctrl-] 0×1D
^ 0×5E Ctrl-^ 0×1E
_ 0×5F Ctrl-_ 0×1F

就是说,为了平台之间的可移植性,只允许0×3F-0×5F之间的字符和Ctrl绑定快捷键
也就是这些字符:
? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _

于是乎,我决定卸载几个基本不用的插件,把快捷键再省点儿出来算了

gvim中文字符显示不全问题(显示为一个字母宽度)

GVIM是我最喜欢的编辑软件,我写过许多与vim相关的文章

有一个问题困扰我很久,一直都没有解决:vim在线式中文字符的时候是按照半角显示的,所以看起来和汉字会有重叠
我试过设置fileencoding、language等等,都没用,搜索了几次都没有找到结果
由于这个问题也不是很重要,我后来就没有找了

今天不知道搜啥的时候,居然让我瞥到了解决方案,很简单:

set ambiwidth=double

其中注册会员800指出了为什么会这样:

这个问题似乎跟字体有关,set ambiwidth=double解决。
有点奇怪,网上几乎没有该问题的描述,即使用ambiwidth作keyword搜索,也只有两三篇中文文档提到了这个问题。

有兴趣知道为什么的请看源码,mbyte.c中的utf_char2cells函数。
p_ambw在option.h中定义,即ambiwidth。

网络真好,如果没有网络,这个问题估计也就一直带到老了

Django论坛程序,无缝整合phpBB3

首先说一下,无缝整合指的是:
1. Django用户能够不重新登录正常访问论坛发表文章、评论
2. Django和phpBB3的退出、登录操作是一致的

Django 是Python的一套web开发框架,用起来很是爽啊,发芽网就是用它搭建的。

但是由于Django还比较嫩,很多配套的东西都没有开发出来,比如说blog和论坛程序

2007年B-list上面发表了一篇:Where is Django’s blog application?
不过现在Blog程序其实还有些不错的,比如说 Banjo,但是还是功能不够完善,比起Wordpress来说,还有很长的路要走。

论坛程序也差不多,Django站点上有个专门的Wiki页面,比较所有已知的Django论坛程序,比如:
django-forum, counterpoint, snapboard, MyghtyBoard, Sphene, PYBB, Django-ForumBR, django-simpleforum

我差不多都试过,发现其中Sphene, django-forumPYBB成熟度比较高,可以试着吃吃了。

不过,试过就知道,味道还是不够老辣。

好了,废话说的差不多了,如果你想要好论坛,又要享受Django开发,来试试phpBB和Django的结合吧!

————-我们开始吧————

想法
1. 让Django的用户登陆后转到论坛不需要重新登陆,通过一系列的session处理可以做到,这里不细讲了
2. Django上的用户在登陆后,第一次访问论坛的时候,创建对应的phpBB用户
3. 为了保证互相之间的数据同步,论坛不能注册用户、登陆、注销、修改密码、email,必须到Django上进行

步骤1/5:先配置好DjangophpBB
我用的是phpBB3中文版,其中phpBB放在public_html/fayaa/bbs目录下,就像处理Django配置里面static的处理一样,设置.htaccess处理t.fcgi之前把bbs目录滤掉,现在public_html/fayaa目录下的.htaccess是这样的

安装的时候保证phpBB和Django方面有相同的admin用户名和密码

步骤2/5:在Django这边做工作
这里(django-login-for-phpbb),下载django到phpBB认证的文件(svn)

svn checkout http://django-login-for-phpbb.googlecode.com/svn/trunk/ django-login-for-phpbb-read-only

然后解压sessionprofile到Django工程(发芽网)根目录,然后在settings.py里面注册两个东东:
1. 注意一定要放到SessionMiddleware前面,紧靠着
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'fayaa.sessionprofile.middleware.SessionProfileMiddleware’,
‘django.contrib.sessions.middleware.SessionMiddleware’,

2.

INSTALLED_APPS = (
...
'fayaa.sessionprofile’,

然后生成数据表:python manage.py syncdb

注意:我在sessionprofile下面添加了admin.py,因为Django1.0以后需要这样才能在后台管理数据表
而且在sessionprofile的middleware.py和test.py里面import的地方,都是用的fayaa.xxx这种方式

现在代开浏览器到localhost:8000/admin/页面,找找sessionprofile,看看有没有一条记录呢?
如果有,就可以进行下一步了,否则先查查哪里写错了

步骤3/5
现在Django方面做完了,该到phpBB了
svn下载下

华容道“无横” 到 “五横”最难的开局、新添的数字系列开局

刚刚去看了看,几个月前做的“智取华容道”在线游戏已经有三千多个过关记录了,这里有个过关英雄榜 :)
看来,限制过关记录直接播放还是有点作用的,之前没有这么快的增长

前段时间回看自己找出来的所有开局,选出了一些有意思的放在了智取华容道上。

华容道可以按照横向方块的数量来分类,可以分成6种,从没有横(无横)到五个大将都是横向(五横)
很自然的问题是:每一种最难的开局是哪个呢?
穷举所有开局以后,终于能够找出这个答案。

无横到五横最难的开局,分别是:
无横单兵种的没落(#63),最少需要19步
一横欲罢不能(#64),最少需要93步
两横峰会路转(#55),最少需要138步
三横小兵探路(#61),最少需要135步
四横横行之将(#65),最少需要97步
五横五横最难的开局(#60),最少需要56步

从中可以看出,这个分布居然很像是正态分布,两边最少,中间最高,特别是“单兵种的没落”,最难的“无横”开局竟然只需要19步。

华容道从无横到五横最难的开局

嗯,后来我又找出几个有意思的来,比如数字系列,就是用两个缺失的空格模拟出数码表数字的形象
当然,本着追求难度的宗旨,这个系列都是选择同样图形里最高难度的(数字7除外,因为前面有过峰回路转了)
这个不多介绍了,直接看图吧:
华容道数字系列

封装了Django的send_mail函数,方便在localhost进行邮件相关的测试

最近在为发芽网添加一些邮件通知功能
由于本地没有邮件服务器,在发邮件的那段代码就会产生异常
虽然在发生异常时仍可以通过Debug=True来看本地变量的值,但是这样毕竟很不爽

很多天以前在Python-cn讨论组问过这个问题,其中Leo Jay和Zoom Quiet的回答很不错,提出根据server的地址或者端口来判断,本地一般不是80端口,而且一般是127.0.0.1,所以比较好判断

这样就可以封一个mock,本地自动采用print打出来,Server端则可以正常收发Email

最近工作太忙,直到今日才有时间实现,代码如下:

Python语言: 封装Django的send_mail函数,方便在本地(没有邮件服务器)进行邮件相关的测试
def my_send_mail(request, subject, body, sender, recv_list, reply_to=None):
    ""”send_mail wrapper: write to command line if it's called on localhost
    ""”
    local = "127.0.0.1"
    if request.META['HTTP_HOST'][:len(local)] == local:
        print "Subject:", subject
        print "From:", sender
        print "To:", recv_list
        if reply_to:
            print "Reply-To:", reply_to
        print "Body:\n", body
    else:
        if reply_to:
            email = EmailMessage(
                        subject,
                        body,
                        sender,
                        recv_list,
                        [],
                        headers = {'Reply-To': reply_to})
            email.send()
        else:
            send_mail(subject, body, sender, recv_list)

下一页 »