2008年05月30日

Kelie Feng制作的UliPad介绍的视频,现在可以在Showmedo网站上看到了。

观看地址在 http://showmedo.com/videos/series?name=ZODUqnEaL

另外Dick Moores将原始的视频放在了他的网站上可以下载 http://www.rcblue.com/u3/Introducing_Ulipad_2008-05-22.avi

感谢Kelie Feng和Dick Moores的努力和宣传。

2008年05月12日
  1. I made blue theme as default theme, so you don’t need to set yourself now. And if you want to use it as default color theme, you should remove all the files in conf/stx, including Python.stx.

  2. With this new implemention, there is still a [default_style] session can be configured in config.ini, and here is the options which you can configure now:

    [default_style]
    STC_STYLE_TEXT = u"fore:#8DB0D3"
    STC_STYLE_NUMBER = u"fore:#FF00FF"
    STC_STYLE_STRING = u"fore:#00FF80"
    STC_STYLE_COMMENT = u"italic,fore:#008040"
    STC_STYLE_KEYWORD1 = u"fore:#FFFF00"
    STC_STYLE_KEYWORD2 = u"fore:#AFFFEE"
    STC_STYLE_IDENTIFIER = u"fore:#8DB0D3"
    STC_STYLE_OPERATOR = u"fore:#F0804F"
    STC_STYLE_CHARACTER = u"fore:#E19618"
    STC_STYLE_REGEX = u"fore:#FFFF80"
    STC_STYLE_DEFAULT = u"fore:#FFFFFF,back:#112435,face:%(mono)s,size:%(size)d"
    STC_STYLE_LINENUMBER = u"fore:#FFFFFF,back:#1F4661,face:%(mono)s,size:%(lnsize)d"
    STC_STYLE_CONTROLCHAR = u"fore:#FFFFFF"
    STC_STYLE_BRACELIGHT = u"bold,fore:#FF0000"
    STC_STYLE_BRACEBAD = u"bold,fore:#0000FF"
    STC_STYLE_CARET_FORE = u"fore:#FF0000"
    STC_STYLE_CARETLINE_BACK = u"back:#5F0054"
    STC_STYLE_SELECTION_BACK = u"back:#000080"
    STC_STYLE_FOLDER = u"back:#3476A3"
    STC_STYLE_MARKER = u"fore:#F0804F,back:#FFFFFF"
    STC_STYLE_TAG = u"fore:#15852B"
    STC_STYLE_TAG1 = u"fore:#2CEF50"
    STC_STYLE_TAGKEY = u"fore:#FFFF00"
    STC_STYLE_ATTRNAME = u"fore:#F0804F"
    STC_STYLE_ATTRVALUE = u"fore:#156EB2"
    STC_STYLE_CLASSNAME = u"fore:#BBFF4F"
    STC_STYLE_DEFNAME = u"fore:#4179C5"
    STC_STYLE_LINK = u"fore:#FEFF8F,underline"
    STC_STYLE_STRINGEOL = u"fore:#FF6F82,back:#E0C0E0,eol"

  3. For STC_STYLE_DEFAULT and STC_STYLE_LINENUMBER, you should notice there are string place holderes, and you can set fontname and fontsize in [default] session, just like:

    [default]
    editor_font = "fontname"
    editor_fontsize = 12
    editor_linesize = 10

And of cause you can directly set the fontname and fontsize in STC_STYLE_DEFAULT and STC_STYLE_LINENUMBER. If you don’t directly set fontname and fontsize in style string, then UliPad will use default Mono font and the font size will be 12, linesize will be 10.

So if you want to custom a new theme, but not limit a single language, you should define [default_style] in config.ini, just like above example. And the old white theme you will be:

[default_style]
STC_STYLE_TEXT = "fore:#000000"
STC_STYLE_NUMBER = "fore:#6B238E"
STC_STYLE_STRING = "fore:#2A2AA5"
STC_STYLE_COMMENT = "italic,fore:#238E23,back:#E8FFE8"
STC_STYLE_KEYWORD1 = "bold,fore:#0000FF"
STC_STYLE_KEYWORD2 = "bold,fore:#2F032A"
STC_STYLE_IDENTIFIER = "fore:#000000"
STC_STYLE_OPERATOR = "fore:#000000"
STC_STYLE_CHARACTER = "fore:#9F9F9F"
STC_STYLE_REGEX = "fore:#DB70DB"
STC_STYLE_DEFAULT = "face:%(mono)s,size:%(size)d"
STC_STYLE_LINENUMBER = "back:#AAFFAA,size:%(lnsize)d" #back:#C0C0C0
STC_STYLE_CONTROLCHAR = "fore:#000000" #xxxxxxx
STC_STYLE_BRACELIGHT = "fore:#FF0000,bold" #fore:#0000FF,back:#AAFFAA,bold
STC_STYLE_BRACEBAD = "fore:#0000FF,bold" #fore:#FF0000,back:#FFFF00,bold
STC_STYLE_CARET_FORE = "fore:#FF0000"
STC_STYLE_CARETLINE_BACK = "back:#EEEEEE"
STC_STYLE_SELECTION_BACK = "back:#000080"
STC_STYLE_FOLDER = "back:#FFFFFF"
STC_STYLE_MARKER = "fore:#FFFFFF,back:#000000"
STC_STYLE_TAG = ‘fore:#15852B’
STC_STYLE_TAG1 = ‘fore:#2CEF50′
STC_STYLE_TAGKEY = ‘bold,fore:#0000FF’
STC_STYLE_ATTRNAME = ‘bold,fore:#F0804F’
STC_STYLE_ATTRVALUE = ‘fore:#156EB2′
STC_STYLE_CLASSNAME = "bold,fore:#FF0000"
STC_STYLE_DEFNAME = "bold,fore:#007F7F"
STC_STYLE_LINK = "fore:#0000FF,underline"
STC_STYLE_STRINGEOL = "fore:#000000,back:#E0C0E0,eol" #"fore:#2A2AA5,eol"

Remeber, this setting will only effect default configuration, but not existed *.stx file .

2008年05月11日

具体的代码在: http://code.google.com/p/ulipad/wiki/BlueThemeForPython

而且在UliPad中的最新代码中,你还可以设置Folder Margin的背景色。还可以设置Marker的前景和背景色。关键字分别为: -folercolor 和 -markercolor。

如果你想修改缺省字体,可以设置default的字体。

2008年04月25日

New Features and Changes:

  1. Add php.acp thanks for 魏振 <etggy@163.com>
  2. Replace old snippet with new snippet, more details please see <Snippet Howto>
  3. Binding F5 to editor but not MainFrame, and add F5(Refresh) support in Directory Browser.
  4. Improve Python class browser, threading update, change some icons
  5. Add indent cursor move functionality see <Indent Moving Howto>
  6. Improve threading document modification process, so you can get better efficiency
  7. Introduce meide(http://code.google.com/p/meide) project to simplify the interface creation
  8. Add FNB.FNB_DROPDOWN_TABS_LIST style to EditorCtrl
  9. Change auto file check in Editor on_set_focus event handler
  10. Change DDE to asyncore and asynchat framework
  11. Change preference dialog from notebook to treebook
  12. Add icon set theme support
  13. Add strip line ending when saving functionality option in Preferences
  14. Strip leading space when doing "Run in Shell"
  15. Add auto detect python interpreter in windows platform
  16. Improve ReST document render, and fix the setfocus lost bug when auto modified the html output, thanks a lot to ygao
  17. Change setmenutext to use fix width to set the menu text, replace with ‘t’
  18. Chanage notebook left double click to right double click(enlarge notebook size)
  19. Add search text count in Find & Replace pane
  20. Add line ending mixture check when saving file feature
  21. Improve preference dialog input assistant checkbox process. When you check the first checkbox(Enable input assistant) it’ll automatically toggle other 5 checkboxes.
  22. Change new toolbutton to dropdown toolbutton, and it can remember the last new file type(select new type menu first), then when you select new menu, it’ll create a new file with the last new file type
  23. Improve command search and pairprog plugin caret display process
  24. Add auto new version of UliPad check
  25. Add slice language syntax support
  26. Add auto pop up project setting dialog when adding directory to directoy browser window
  27. Add Open Explorer Window Here menu to editoctrl tab context menu
  28. Add open snippet tool button, change open dirbrowser and open snippet toolbutton to check toolbutton
  29. Change explorer.exe %s as explorer.exe /e, %s in windows platform
  30. Add copy filename to clipboard menu on document area tab context menu
  31. Add wrap text feature, via [Edit]->[Format]->[Wrap Text...]

New Plugins:

  1. canvas_test_plugin, you can directly test DC api
  2. web2py_plugin, supply web2py shell

Bug fix:

  1. Fix webopen twice open bug
  2. Fix editor shortcuts key caption error
  3. Fix if set DROP_DOWN_TABS_LIST style, right arrow will disappear bug
  4. Fix utf-16 convertion bug
  5. Fix mako tag auto complete bug #issue 14
  6. Fix if lines are folded, when goto hiding lines will no effect bug
  7. Fix DDE bug, thanks to LP <liupengf12@gmail.com>
  8. Fix webopen bug, can’t correctly deal with ‘mailto:’
  9. Fix smart tabs bug
  10. Fix copy and paste lineending is not correct bug
  11. Fix tab invisible bug after changing size or changing the page title
  12. Fix template line-ending not match the default line-ending setting
  13. Fix password widget is not Password type widget bug
  14. Fix script filename cannot be unicode(chinese) bug
  15. Fix syntax check exception process bug
  16. Fix ruler bug

 UliPad has ported to code.google.com, so you can visit the new project site at:
http://code.google.com/p/ulipad, and also visit the new svn address. Recommends
using source version.

source version download: http://ulipad.googlecode.com/files/ulipad.3.9.zip
window exe version: http://ulipad.googlecode.com/files/ulipad.3.9.exe

maillist: http://groups.google.com/group/ulipad
ulipad snippets site: http://ulipad.appspot.com (hosted by GAE)

Hope you enjoy it.

2008年04月21日

可以访问 http://ulipad.appspot.com
可以为ulipad写一些使用技巧之类的,当然也可以写其它的。这是我使用GAE(Google Application Engine)开发的一个小网站。

要求:

1. 必须是gmail用户,且要登录
2. 内容是使用rst格式,支持语法高亮,具体格式见: http://www.djangosnippets.org/snippets/42/
3. 写完后别人不会马上看到,需要由管理员(我)的审核,但自已还可以看到和修改

功能:

1. 一般用户可以添加,可以修改自已写的
2. 管理员可以添加,修改其它用户的,删除,修改发布,允许评论选项

Todo:

1. 完成分类,标签(虽然已经可以输入,但是没有显示,需要增加)

有兴趣可以将你平台积累的ulipad相关的技术,心得放上去让大家分享。

2008年04月11日

前几天Google APP Engin Preview版本发布了,我也注册了一个,不过当天没有收到确认信,以为没戏了。结果今天收到了,还不错。那么做些什么呢?我想做一个XML-RPC服务用于ulipad中,可以让ulipad通过xml-rpc来得到最新版本信息,同时还考虑是否可以做一个插件,把ulipad用户信息传到这个网站上,这样可以了解有多少人在使用ulipad。

为什么使用XML-RPC呢?因为使用方便,这样我可以将这个网站认为是一个服务器,开发方便。基本功能已经做好,你可以访问: http://ulipad.appspot.com/

上面已经提供了一个测试程序可以得到最新的ulipad版本。回头再开发新的插件,做些有意思的东西。

Dick在邮件列表中说当打开Shell窗口后,输入焦点如果移到其它的地方,光标还存在,这样造成一种错觉。仔细检查了代码,发现是由于我对KILL_FOCUS进行了处理,并且没有使用event.Skip(),所以事件被我屏蔽掉了。但这样为什么会引起光标不消失呢?我想是由于wxPython可能在KILL_FOCUS的缺省处理中会隐藏光标。这让我突然想起它还可以有其它的用处,特别是在协同编程插件中。当进入协同编程状态时,某一用户移动光标时,如果你的输入焦点在其它的窗口中,这样你会看不到变化,但截获KILL_FOCUS事件会使光标不消失,这一效果已经在ulipad中进行了改进。原来则有可能消失,因此让我感觉实用性有问题,这下多少让我感觉还可以用了。

2008年03月29日

在UliPad中定义菜单项时可以同时设定Accelerator(快捷键),通常是采用:

caption\tCtrl+A

之类的形式。但是一旦你这样定义,它就变成全局的了。这样如果你定义了Ctrl+C, Ctrl+V之类的,不管你在哪个窗口按下这样的组合键,它都会被激活。那么这带来一个问题,当你有多个编辑窗口时,这此事件应该对应哪个窗口呢?一种办法是使用FindFocus()方法来查找有输入焦点的窗口,然后调用这个窗口相应的事件处理函数。一般情况下可以足够了。但是对于Ulipad有些特殊。UliPad允许自定义快捷键,同时会修改菜单上的快捷键显示。并且有些快捷键希望不是全局性的,只有在某个窗口有输入焦点时才起作用。因此从这些方面来讲,我希望菜单上的显示只是一个显示,而不是真正的定义,真正的定义我会通过SetAcceleratorTable来进行设定,所以也不需要在设置菜单项文本时自动使用快捷键自动生效。但是我试来试去,发现我无法控制它无效。只要你是按菜单的快捷键来定义的,它就会生效。

想来想去后来想到一个办法。我发现菜单文本是等宽字体,因此我可以不使用\t为分隔,而是使用空格来填充,这样快捷键右对齐,看上去显示效果同真正的快捷键,而且经过试验,的确可以不起作用。但另一个问题时,每个下拉菜单要多宽合适呢?如果每次动态计算最大的宽度很麻烦,后来想了一个偷懒的办法就是假定一个最大的宽度40。其本上够用了。同时还要对汉字以两个字符进行处理。

上面的方法虽然看上去不怎么样,不过这也是我目前能想到的办法了。:)

2008年03月15日

今天在ulipad中增加了一个新功能:当你运行在windows平台上时,它可以自动查找已经安装的python解释器,这样对于初次使用ulipad的人来说会非常方便。

在windows平台上安装python时,python会在注册表中创建相应的键值。我在effbot上找到一篇文章是关于如何将python环境加入到注册表的,正好拿来一用。具体的查找代码如下:

def check_python():
    interpreters = []
    if wx.Platform == ‘__WXMSW__’:
        from modules import winreg
        for v in (‘2.3′, ‘2.4′, ‘2.5′, ‘2.6′, ‘3.0′):
            try:
                key = winreg.Key(winreg.HKLM, r’SOFTWARE\Python\Pythoncore\%s\InstallPath’ % v)
                interpreters.append((v+’ console’, os.path.join(key.value, ‘python.exe’)))
                interpreters.append((v+’ window’, os.path.join(key.value, ‘pythonw.exe’)))
            except:
                pass
    else:
        version = ‘.’.join(map(str, sys.version_info[:2]))
        interpreters.append((version, sys.executable))
    return interpreters

这里我使用了一个winreg的模块,它已经放在了ulipad的modules目录下,当时是因为开发svn插件找到的。这是一个_winreg的封装,使用起来要更为方便。上面的处理很简单,依将尝试查找2.3到3.0的python版本。找到安装目前,然后分别按console和window两个解释器进行处理。

如果是其它的平台,一般只能是以源码运行的,所以sys.executable应该就是解释器路径了。

2008年01月10日

在前面的Blog中我已经介绍了关于让按键处理更精确,并且如何当按下一个键后延迟一段时间的处理,那么基本想法就是:在向Queue中添加按键信息的同时,增加当时的时间戳,然后在线程中循环读取这个Queue,直到没有数据为止,然后比较按键时间与当时时间,如果时间间隔不到预设值,则进行循环。当下一次循环时首先从Queue再进行读取,如果有新的按键信息则重新开始计算时间,如果没有,则继续判断是否到了预设时间,如果已经到了,则进行相应的按键的处理。那么为了在读Queue时不阻塞,我是使用了非阻塞的读取,因此需要自已来做循环。

让我们再整理一下需求:需要一个Queue,用来放按键信息,然后当用户录入时,可以不停地放到这个Queue中。有一个线程可以读这个Queue,如果Queue中有从个消息,则全部读出,然后只保留最后一个。当存在最后一个消息时,需要等待一个时间段,如果时间段到达,并且再没有新的消息时,执开始执行处理。

整个处理代码都在modules/AsyncAction程序中。上一次改进后的处理代码为(有删节,去掉了些不是重点的代码):

    def __init__(self, timestep=.1, interval=0.05):
        super(AsyncAction, self).__init__()
        self.q = Queue.Queue(0)
        self.setDaemon(True)
        self.lock = thread.allocate_lock()
        self.stop = False
        self.running = False
        self.timestep = timestep
        self.last = None
        self.interval = interval
       
    def put(self, obj):
        self.q.put((obj, time.time()))
       
    def run(self):
        try:
            while not self.stop:
                if Globals.app.wxApp.Active and not self.q.empty() and not self.running:
                    self.lock.acquire()
                    while 1:
                        try:
                            obj = self.q.get_nowait()
                            if obj:
                                self.last = obj
                        except:
                            break
                    self.lock.release()
                if self.last:
                    if not self.running:
                        if time.time() – self.last[1] < self.timestep:
                            continue
                        self.running = True
                        try:
                            self.do_action(self.last[0])
                            self.last = None
                        except:
                            pass
                        self.running = False
                time.sleep(self.interval)
        except:
            pass
           
    def do_action(self, obj):
        pass

从上面可以看出,在调用put放置消息时,会自动加上当时的时间,然后在线程中会对这个时间进和检查。同时对于Queue的读取是采用非阻塞方式,因此需要自行做循环。

那么我发现,如果考虑使用Queue的带超时时间的阻塞处理方式的话,可以更加简化代码,并且由于阻塞,可以减少不必要的线程的循环,应该可以对资源的占用更少,那么改进后的处理代码为:

class AsyncAction(threading.Thread):
    def __init__(self, timestep=.1):
        super(AsyncAction, self).__init__()
        self.q = Queue.Queue(0)
        self.setDaemon(True)
        self.stop = False
        self.timestep = timestep
        self.last = None
       
    def put(self, obj):
        self.q.put(obj)
       
    def run(self):
        try:
            while not self.stop:
                self.last = None
                while 1:
                    try:
                        obj = self.q.get(True, self.timestep)
                        self.last = obj
                    except:
                        if self.last:
                            break

                if self.last:
                    try:
                        self.do_action(self.last)
                        self.last = None
                    except:
                        pass

        except:
            pass
           
    def do_action(self, obj):
        pass

从上面可以看出,put时不再计算时间了,因为真正的时间的作用是对最后一个消息有效,并且它的作为是为了延迟,所以只要在读取Queue时,采用阻塞方式,并且设置超时时间为预设值,当已经没有可读取的数据时,读取会阻塞一段时间后返回,这时就是一个合适的处理时机了。如果用户没有输入,那么线程将阻塞一段时间,然后再次阻塞。如果有输入,会立刻读出来,减少了循环处理,同时减少了循环所带来的开销。所以现在在UliPad中就是使用这种方式了。