sublime 插件开发

sublime text用来做开发真的非常棒,这种高度可定制的文本编辑器太吸引人,而强大的 packagecontrol 已经可以解决我们绝大部分需求,但作为一名爱折腾的程序员,必须要自己的撸一把,造一回轮子玩玩,于是……

项目结构

....Default (Linux).sublime-keymap
....Default (OSX).sublime-keymap
....Default (Windows).sublime-keymap
....GenerateFolderOfString.py
....GenerateFolderOfString.sublime-settings
....Main.sublime-menu

基本上已经涵盖绝大部分功能所需文件。*.sublime-keymap 快捷键、*.py 核心文件、*.sublime-settings 配置文件、*.sublime-menu 菜单项配置文件。

*.py

可以通过 toolsNew Plugin... 来生成一个简单所必须的 Python 代码模块。

import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")

然后我们将文件保存至 C:\Users\asdf\AppData\Roaming\Sublime Text 3\Packages\DemoPlugin,至于名称无所谓这里用 DemoPlugin.py;View – Show Console,运行:view.run_command('example'),就会在当前的文件里插入 Hello, World!。

注意这里运行命令是 example,即插件名,这和 class ExampleCommand(sublime_plugin.TextCommand):ExampleCommand 所对应,只不过去掉 Command,并且用下划线符号命名替换驼峰式命名。假如我们用 GenerateFolderOfStringCommand 得到的命令必须是 view.run_command("generate_folder_of_string")

Command 类型

sublime text 有三种不同 Command 类型,分别:

  • Text Commands:通过 View 对象访问被选定文件或缓存区。
  • Window Commands:通过 Window 对象,可引用当前窗口。
  • Application Commands:没有引用任何特定的窗口,文件或者缓存区,很少使用。

同一个插件里面可以同时使用不同 Command 类型。

比如:

import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")

class WinExampleCommand(sublime_plugin.WindowCommand):
    def run(self):
        self.window.show_input_panel(
            "请输入要查询的文本",
            "",
            self.on_text,
            None,
            None)
        pass

Application Commands 并不是很了解,而对于另外两种其实也是带着包含关系,即 Window Commands 通常是运用在菜单中对应的命令,可以访问当前所有打开文件的 View 对象;相反 Text Commands 只允许对当前激活状态下文件的 View 对象。而 View 对象才是我们核心的对象,因为我们需要用它来给文件插入文本、获取选中的文本并给予加工等等。

所有这一切我们都可以使用 Python 语言来做任何你想做的事,包括访问远程文件。当然这可能会涉及到一些性能问题,但你不需要担心,因为你可以使用线程来解决这些问题。详细可参考后面的文档,由于我对 Python 语言了解只停留粗浅部分,所以具体自行发挥。

*.sublime-keymap

在IDE里面应该说有句谚语:能用快捷键决不用鼠标,而 sublime text 有个其它 IDE 所不具备的功能就是 Command Palette... 命令面板,要知道我们永远不可能记住所有快捷键,但我们可以记得一些单词,按 Ctrl+Shift+P 可以快速打开命令面板,我们可以搜索出需要执行的一切命令,而每个条目的后面也会有相应的快捷键提醒。

而这些快捷键就是通过 *.sublime-keymap 设置,内容:

[
    {
        "keys": ["ctrl+alt+g,ctrl+t"],
        "command": "do_generate_folder_of_string"
    }
]

以上相当于同时按下 ctrl+alt+g,ctrl+t 执行 do_generate_folder_of_string 命令。

而针对不同系统需要创建不同文件,格式按:Default (platform).sublime-keymap 来命令,其中有效的platform为:Windows, Linux, OSX,可以参考项目结构规则。

*.sublime-settings

很多插件我们可以修改一些配置信息以达到个性化,比如打开Package Control的debug功能,只需要:Preferences-Package Settings-Package Control-Setting Default(或Setting User),来开启 "debug": true

配置文件是一个标准的json文件,比如:

{
    // 前缀字符
    "prefix_character": "....",
    // 开始等级
    "start_level": 1
}

配置文件是可以出现在不同文件中,所有配置文件中定义的相同名称都会被合并,当然这会有一个合并的顺序规则,比如Windows下:

Packages/Default/Preferences.sublime-settings
Packages/Default/Preferences (Windows).sublime-settings
Packages/User/Preferences.sublime-settings
Packages/Python/Python.sublime-settings
Packages/User/Python.sublime-settings

其实有点晕,而我有一种比较不会出错办法,即在插件包下创建一个 demo.sublime-settings,然后通过 *.sublime-menu 配置一个用于访问该配置文件的路径,这样就确保我们访问的配置文件只有一个。

读取配置信息

settings = sublime.load_settings('GenerateFolderOfString.sublime-settings')
# 读取start_level
settings.get('start_level')
# 设置start_level为5
settings.set('start_level', 5)

*.sublime-menu

随便我们一味着推荐用快捷键,但设置相应的菜单也是必须的,就拿上面的配置信息文件,我们需要给他一个配置入口,否则还得去找包文件,好不蛋疼。

(type).sublime-menu,其中 type 有效类型包括:

  • Main:菜单栏。
  • Context:右击菜单栏。

首先 Main.sublime-menu 创建一个入口:

[{  
    "id": "preferences", "children":[{
        "id": "package-settings",
        "children": [{
            "caption": "Generate Folder Of String",
            "children": [{
                "caption": "Settings",
                "command": "generate_folder_of_string_set_settings"
            }]
        }]
    }]
}] 

其次创建 generate_folder_of_string_set_settings 命令:

class GenerateFolderOfStringSetSettingsCommand(sublime_plugin.TextCommand):
  def run(self, edit):
    self.view.window().open_file(PLUGIN_FOLDER + "/" + SETTINGS_FILE)

这样我们可以通过 Preferences-Package Settings-Generate Folder Of String-Settings 打开配置文件。

总结

其实 sublime text 开发插件非常简单,只要懂得一点 Python 语言,大可创建一些非常有意思的插件。而以上可能是插件有主要部分,但典型的插件所需要资源可以包括:

  • 构建系统(.sublime-build
  • 快捷键绑定(.sublime-keymap
  • 宏处理(.sublime-macro
  • 菜单(.sublime-menu
  • py(.py
  • 配置文件(.sublime-settings
  • 代码片断(.sublime-snippet
  • 语法定义(.tmLanguage
  • 元数据(.tmPreferences
  • 主题(.sublime-theme

怎么样,非常丰富,所以 sublime text 是一个可以创建世界的编辑器,难怪那么多人喜欢它。

参考文档

python class

从接触python开始大部分都是基于Django进行开发,做的相对于简单得多。而python一切都是面向对象,今天需要做一个功能模块的封装,中间遇到关于继承、私有变量(方法)记录下一些开发中遇到的问题。

1、2.2版本以后使用new style class,任何类都必须继承某个类,如果不需要继承某个类也要继承object。当然如果你还是用老办法来处理子类对父类初始化的话,那就不需要关心这个。


class People(object):
 # 姓名
 name = None
 def __init__(self, name = None):
 self.name = name

 class Student(People):
 def __init__(self, name = None):
 #如果使用super对父类声明的话,哪怕父类不需要继承对象的话,那必须继承object对象
 #老办法不再说明
 super(Student, self).__init__(name)


2、私用变量,具体用法看Python Document,需要注意的是不管是公共变量(方法)、私用变量(方法),在类内部使用他们都加上self.,也许这个习惯可以给你带来开发‘乐趣’。

Django框架笔记-国际化

实现一次国际化真的累死我了,中间的过程就让我非常郁闷,先做一笔记录,给以后做个提醒:

先给复习一个课程:GNU gettext 说简单点就是由于提供一套完整的国际化解决方案,目前绝大部分国际化组件都基于此。

Django本身是完全国际化了的,具体为Python自带的标准模块 gettext。当然了,如果不需要国际化,那还是关掉它可以为Django节省一点开销。

对你的Django应用进行国际化的三个步骤:

  1. 第一步:在你的python代码和模板中嵌入待翻译的字符串。
  2. 第二步:把那些字符串翻译成你要支持的语言。
  3. 第三步:在你的django settings文件中激活做要地区的中间件。

如何做这三步,我后面有相应链接并且是中文的,我呢?只是谈谈中间遇到的一些问题,但是建议你先看完再去读文档,那样就比较不会迷糊:

第一:simplejson和ugettext_lazy冲突

在使用AJAX的时候,JSON是最适合不过的数据传输了,但是由于ugettext_lazy返回的是一个object对象,无法正常的显示数据,你可以使用ugettext实现国际化字符串,要不然你可以这样使用:


u"%s" % ugettext_lazy('操作成功')


第二:生成PO文件

当你的Python、模板、脚本中已经做好编码以后,接下来你只要用工具生成PO文件。而Django已经帮你做了这件事,所以如果你只要通过简单的命令自动帮你生成:

生成出python代码和模板中的字符串命令:django-admin.py makemessages -l zh_CN 其中“zh_CN”是语言类型,你可以改成en、zh_TW等等,这里生成后的文件会存在这么一个目录结构表中

  • $APPPATH/locale/<language>/LC_MESSAGES/django.(po|mo)
  • $PROJECTPATH/locale/<language>/LC_MESSAGES/django.(po|mo)
  • All paths listed in LOCALE_PATHS in your settings file are searched in that order for <language>/LC_MESSAGES/django.(po|mo)
  • $PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)

假设我的项目根目录下建立个locale目录,那么当我执行 django-admin.py makemessages -l zh_CN 自动生成/projectname/locale/zh_CN/LC_MESSAGES/django.(po|mo)。

假设我现在需要增加一下英文版,我只需要django-admin.py makemessages -l en

第三:翻译

有了PO文件,接下来就是翻译。专业一点的话用Poedit(呵呵,非常方便的工具,如果想翻译PO文件建议使用它),否则随便找个编辑器打开它自己改里面的代码,但真的会眼花的,如果你需要翻译量较大的话。

注:Django生成的PO文件使用Poedit保存时会出现一个错误提示,那是因为缺少工程信息,从“类目”》“设置”填写完整的信息后即可。

第四:脚本国际化小插曲

文档中介绍动态生成脚本链接:

<script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script>
总是出现异常,可以使用
<script type="text/javascript" src="/jsi18n/"></script>
原因不明,是我没有去查。

简化操作

我的项目里面有三种语言:英文、简体中文、繁体中文,所以我做了一个BAT文件,如果点一下自动生成数据:

@ECHO OFF
cd E:\Python\WEB\mood\
cd e:
echo 开始制作Python、HTML的PO文件
django-admin.py makemessages -l zh_CN
django-admin.py makemessages -l zh_TW
django-admin.py makemessages -l en
echo 完成
echo 开始制作JavaScript的PO文件
django-admin.py makemessages -d djangojs -l zh_CN
django-admin.py makemessages -d djangojs -l zh_TW
django-admin.py makemessages -d djangojs -l en
echo 完成
echo 开始编译PO文件
django-admin.py compilemessages
pause

哈哈,很开心的告诉你,你不用担心他的生成会破坏我原有已经翻译好的数据,因为Django已经很智能的帮你处理新数据、删除已经存在PO文件中的数据。

参考资料



			

Django框架笔记-开篇

越来越喜欢Python这种动态编译语言,一个简单的DOS窗口,可以做只要你想得到的事。在很早以前我有过对Python的简单了解,也是直到最近在学习正则表达式才重新对她进行较深入的学习,而这一篇主要还是说一下关于Django框架,她是WEB框架中的一种,其主要选择是因为她的风格和我自己的风格很相像。

一、安装

http://www.djangoproject.com/download/可以下载到最新版,可以放在任何目录下然后执行:python setup.py install。测试一下吧:

>>> import django
>>> django.VERSION
(1, 1, 0, final', 1)

二、创建一个项目

转到Django目录:django-admin.py startproject mysite 其中mysite是项目名称。自动在Django目录下生成mysite目录。

三、运行开发服务器

Django开发服务是可用在开发期间的,一个内建的,轻量的WEB服务,所以在开发过程中无须使用产品级的WEB服务(比如:Apache),只需要执行:python manage.py runserver 8080 当然必须在mysite目录下。你可以通过http://127.0.0.1:8080来访问您的站点。

四、模型(Django数据库层)

(一)、配置数据库,缺省都在:settings.py

(二)、创建模型

在mysite目录下执行:python manage.py startapp books她会自动创建几个模型相关文件在mysite目录下。当然这不是说你就创建一个模型了,我们还得写一些代码。这里的Django模型只是用Python代码形式描述数据在数据库中的定义。

第一步:编写生成文件当中的models.py用Python代码来描述你的模型。

第二步:安装模型。

这一步你需要修改settings.py中INSTALLED_APPS项,把你创建的模型添加到列表中,以便告诉Django需要激活这个模型。你可以先使用python manage.py validate来验证你是否已经正确,如果有错误会明细指出。你还可以用python manage.py sqlall books命令先检查一下Django为你生成的SQL命令是否正确,当然这需要跟你目前配置的数据库来判断。最后用python manage.py syncdb命令来同步你的模型和数据库定义,她傻了一点只会增加你不存在的表,不能同步模型的修改数据库,当然还是有办法的。

第三步:一起HIGHT一下

你可以通过SHELL窗口完成不可思议的操作:

>>> from books.models import Publisher
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Apress>, <Publisher: O'Reilly>]

五、Django站点管理

这是Django内置的,你只需要简单配置就可以有一个简单漂亮的站点管理平台,你可以通过他来做一些数据增删改动作。

第一步:对setting.py一点改动

  1. django.contrib.admin加入到INSTALLED_APPS
  2. django.contrib.auth、django.contrib.contenttypes、django.contrib.sessions加入到INSTALLED_APPS
  3. django.middleware.common.CommonMiddleware、django.contrib.sessions.middleware.SessionMiddleware、django.contrib.auth.middleware.AuthenticationMiddleware加入到MIDDLEWARE_CLASSES

第二步:运行python manage.py syncdb同步站点管理需要的数据库表。

第三步:将admin访问配置在URLconf。

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
  (r'^admin/', include(admin.site.urls)),
)

接下来还有什么呢?

The Django Book这里你可以获取到很完整的Django教程,当然他是中文的。

当然也有像The Definitive Guide to Django: Web Development Done Right权威书籍。

最后可别忘了http://www.djangoproject.com/比任何资源来得好,提供非常完整的文档,如遇到BUG咱们上面有人。 😎

© 2017 卡片机色彩 沪ICP备13032872号-3

Theme by cipchk

to top