status |
初稿 |
ZoomQuiet;101%,增补Tk 的快速8.5替换方法 |
PCS302 Leo
~ 文学化编程环境
- Leo is ...
- Leo 可以是 一个通用的数据管理环境
- Leo 可以是 一个柔韧的程序/文本/或是其它数据的综合浏览器
- Leo 可以是 一个项目管理器
- Leo 可以是 一个提纲式的程序编辑器
- Leo 可以是 ...
这个纯Python 的编辑环境用最简单的外观,实现了如此丰富的使用方式和编程思想! 以至于无法简单的定义 Leo 到底是什么! 不过可以肯定一点:Leo 不是 IDE!
- IDE之殇
- IDE ~ Integrated Development Environment 集成开发环境
维基百科定义: http://zh.wikipedia.org/wiki/集成开发环境
精巧地址: http://bit.ly/xouAm
- 是指在同一界面综合了编辑/调试/运行/外部环境交互 等等开发支持的环境,Eclipse 就是个经典的IDE环境;
- 不过从笔者的角度,认为IDE 是有害的,它令编程人员远离了真正的细节,以为编程就是控件的组合,放弃了对最终产品的多方面调节,而且,IDE 中的自动提醒/函式完成等等辅助工具,实际上起到的只是中断思路,岔开注意力,影响思考!
- 所以,推荐使用Leo 等等单纯的文本编程环境,来编程,通过函式复用或是合理模块化来加速开发,而不是盲目依赖IDE辅助开发支持!
进一步的, 行者有妙文流传:IDE综合症和攝影
概述
Leo 是基于 Noweb 数据工具的 文学化编程环境:
- Noweb 是一个已维护了15年的成熟自由软件,用以支持语言无关的文学化编程;
快速访问: http://bit.ly/3OvVCf
- 由于Leo 通过友好的界面包裹了 Noweb 的功能,一般不必对 Noweb 有太多的认识
Literate Programming ~ 文学化编程是 TEX 的发明人 Donald Knuth在1984年提出的概念:
- 源代码只是构成程序的一小部分; 程序的真正主体是对它的算法、结构、目的和用法的描述——实现它的源代码并不是主要的
- 所以,文学化编程关注人是怎么理解和构建程序的,而不是象其它主流开发环境那样,期望人来理解程序应该怎么样运行和组织!
定义: http://en.wikipedia.org/wiki/Literate_programming
精巧地址: http://bit.ly/aCxZG
官网: http://www.literateprogramming.com
精巧地址: http://bit.ly/3I9Rxg
所以,Leo 的名字含义是:Literate Editor with Outlines ~ 基于提纲的文学化编辑器, 但是,Leo 最常见的使用方式就是拿来文学化的组织软件开发工程.
使用
通过实际操作,可以快速体验到文学化编程的魅力:
安装
首先得确认Python 环境安装好了,测验标准就是在命令行状态中输入python 系统就返回一个标准的Python 交互环境
去官方网站 http://sourceforge.net/projects/leo ( 精巧地址: http://bit.ly/2mefKP )下载,当前最新版本是 Leo-4-5-1-final.zip (2008-09-14)
- 解开压缩后,复制到任何你希望的目录,不用安装,在命令行环境直接运行:
#GNU/Linux;Unix 中 $ python /path/to/leo/launchLeo.py #Windows 中: C:\> python C:\path\to\leo\launchLeo.py
就可以获得 Leo 环境了! 当然,可以创建快捷方式来不通过命令行快速调用Leo
- Tkinter是Python的GUI开发内置组件,一般GNU/Linux 软件仓库都有,但是可能没有被默认安装;安装Tkinter:
$ sudo apt-get install python-tk
默认的Leo 界面是由一个提纲窗口,一个正文窗口和一个提示窗口组成的;基本的操作就是在提纲窗口中组织章节/节点结构,在正文窗口中组织对应章节/节点的内容;
基础
在Leo 中核心的和唯一的操作单元就是提纲节点(outline)! 自然的最基础和关键的操作是对 提纲节点(outline) 的操作:
创建一个节点;快捷键是:Ctrl+i
点击 提纲节点 或是 Ctrl+h 就可以对节点名称进行修订
- 图pcs302-1 插入节点
调整一个节点的层级;快捷键是:Ctrl+u,Ctrl+d,Ctrl+l,Ctrl+r 对应的将节点向上下左右的移动
复制/粘贴一个节点;快捷键是:Ctrl+Shift+c,Ctrl+Shift+v,Ctrl+Shift+x 对应的就是对节点进行复制/粘贴/剪切
创建一个节点的 克隆(clone);快捷键是:Ctrl+`
- 图pcs302-2 提纲树中含有克隆节点的情景
- 克隆 的意思就是:不论克隆节点有多少,在哪儿,其实都是同一节点的自动复制,任何一个节点的修订,将立即导致所有克隆节点的同步变化;
- 这对编辑中,部分代码需要在不同文件或是函式中保持一致是多么的人性和可亲哪!
- 图pcs302-2 提纲树中含有克隆节点的情景
移动当前的编辑焦点到不同节点;快捷键是:Alt+↑ ↓ ← → 对应移动焦点到 上/下,左/右(上一级/次一级)节点
其中 Alt+← → 也同时自动对当前层级的节点进行折叠和展开的操作
- 小结
- 提纲节点(outline) 在文学中就是自然的章节和段落,在编程中就是类似/函式/逻辑段,,,在Leo 中,节点是唯一关注的单元,而不论节点中的内容是什么!这充分表达了 文学化编程中,关注结构不关注代码的思想!
- 对于Python 行者, Leo 中的节点操作有以下几个舒服的地方:
- 节点名可以使用中文
- 子节点的数量不限!(界限是自个儿机器的内存)
- 节点可以包含任何文本,不论这些文本来自哪个文件(这方面在下文详述)
- 节点可以通过各种算子原地引用在各种缩进的文本处,且可以在输出时继承挂接点的缩进,然而在节点正文中不用对应的缩进!
文件
Leo 只是个 文学化编辑环境,所有组织的内容,总得输出成标准的文件,来给其它应用使用/运行,所以,文件级别的操作也是非常必要和基础的:
- 导入
从File->Import 菜单中,有很多导入方式;
但是常用的就是两种: Import to @file(导入@file 容器) Import to @file(导入@root 容器)
- 都会自动根据导入的文件类型自动解析并将相关内容装配到对应的有良好命名的节点中!
- 导出
从File->Export 菜单中,有很多导出方式
不过,一般都是使用相应策略的文件导入"算子",令相关的节点自动组织成不同的文件输出,而且,导出动作的快捷键,也可以和保存 Leo 文件复用:Ctrl+s 就好!
算子
Leo 当然不是专门用来写小说的,所以,有一些特殊的约定 字串~"算子" 包含在正文或是节点中,协助我们高效的使用文学化思想操作大量的文本,笔者在此介绍几个最最常用的算子,进一步的可以参考 Leo 自带的文档;
- 图pcs302-3 Leo 安装包中内置的帮助文档树
- @nosent
- 文件净导出 算子
- 位置: 节点中
- 格式: @nosent+空格+文件名(可包含全路径)
- 作用: 将所有相关节点整理后,输出没有 noweb 节点说明注释格式的干净文本文件;
- 局限: 输出的文件不含Leo 中的定制结构信息,Leo 文件丢失,将无法自动复原文学化章节关系;
- 图pcs302-4 Leo 使用@nosent 算子的输出
- @file
- 文件注释导出 算子
- 位置: 节点中
- 格式: @file+空格+文件名(可包含全路径)
- 作用: 将所有相关节点整理后,输出含有 noweb 节点说明注释格式的文本文件
- 局限: 输出的文件含有Leo 中的定制结构信息,可以在另外Leo 文件中导入;但是另外成员不使用Leo时,过多的 noweb 注释是种干扰;
- 图pcs302-5 Leo 使用@file 算子的输出
- @path
- 目录声明 算子
- 位置: 节点正文
- 格式: @path+空格+相对或是绝对路径
- 作用: 配合各种文件导出算子指示Leo 将对应节点输出到何处
- 图pcs302-6 @path配合@nosent 算子进行文件输出
- @others
- 递归包含 算子
- 位置: 节点正文
- 格式: @others 单独一行
- 作用: 指示Leo 将当前节点之下所有子节点包含到当前位置
- @ ...@c
- 多行注释 算子
- 位置: 节点正文
- 作用: 指示Leo 将@和@c 中包含的所有内容,作为注释输出
- @ 表示注释开始
- @c 表示之下是代码
- <<引用>>
- 引用 算子
- 位置: 节点正文
作用: 指示Leo 将 节点名是 <<引用>> 的节点内容引用到当前位置;可以多次使用;引用的节点名不限长度
- @language python
- 语言 算子
- 位置: 节点正文,一般在首部
- 格式: @nosent+空格+文件名(可包含全路径)
- 作用: 指示Leo 使用什么语言来解析之下的代码,,,
- @nocolor/@color
- 语法色 算子
- 位置: 节点正文,一般在首部
- 格式: @nocolor 或是 @color 单独一行
- 作用: 指示Leo 对之后的文本是否尝试进行语法颜色的处理
- Leo 可以智能的根据文件后缀,或是语言算子,自动解决十数种程序语言的语法颜色!
编程
Leo 作为编程环境非常有个性,其感受和其它任何编程环境都不同!需要适应,这里笔者根据切身体验指出几个必须跨过的习惯门槛,分享使用Leo 进行Python 编程的快乐体验;
麻烦
当然,并不是说其它编程环境没有可取之处;这里就先指出使用Leo 时比较麻烦之处
- Leo 不是IDE,没有单步追踪,自动化完成提醒,包函式提醒等等,各种IDE的高级自动化功能!
- Leo 不是任何人都喜爱的,所以,在团队协同中,如果不是所有人都使用Leo,则!在配合时,如果统一使用包含 Leo 结构化信息的 noweb 注释文本的输出,对于不使用Leo 的伙伴就是种困挠;同理,如果统一使用没有 noweb 注释的干净文本,那么使用Leo 的伙伴将,无法方便的在Leo 环境中及时看到其它人的修订;
爽快
除以上提及的主要不便外,使用Leo 可以帮助我们真正高效的理解和控制代码的结构,体会到自如的重构快感!
- Leo 作为工程组织环境,可以自然的将多个工程,多个目录,多个文件,综合组织在一个界面中!
- 因为,在Leo 基本单位是 提纲节点(outline),而节点包含什么或是输出成什么,对于Leo 没有任何关系!
- 所以,在Leo 中,可以方便的作到多个工程中的文件/类/函式/代码段复用!
- Leo 作为文学化编辑环境,鼓励从伪代码开始组织应用!
- 即,完全可以先通过节点的设计和组织,建筑起完整的功能模块框架,通过函式名等等的预先设计,从文字方面确认功能如何完成后;
- 再,逐一使用真实代码完成;
- 进一步,这也鼓励先在设计好的空函式部分,对应设计好测试用例代码,进行TDD~测试驱动式开发!
- 使用 Leo 可以帮助我们快速的使用"丑陋"的代码,先将功能"堆"出来,然后快速重构成高效合理的对象化代码;
- 一开始不用顾虑什么设计模式,就用直觉式的代码,一段段将功能完成;
- 这其中必然会产生高过50行以上的巨型函式,但是在Leo 的帮助下,可以将函式根据我们自个儿的设计/理解,划分成任意层次的逻辑结构,这样一来:
- 可以安全的将需要实现的代码封闭在一个个小节点中进行调试,不会象使用IDE中那样,经常不小心错误移动到相似的代码段中编辑;
- 编辑结构可以使用中文来命名,无形中将功能的实现思路也记录了下来,方便在有空时,根据原有设计,逐一函式化,成为精简可控的小函式;
问题
学习使用Leo 必然要面对很多问题,这里分享其中两点问题的应对:
心理问题
- "使用Tk 开发的哪,界面这么简陋!"
- "什么是文学化编辑? 我只是需要个有自动完成提示的环境!"
- "为什么要调整和分享节点哪?!"
... 等等问题是很多尝试 Leo 后立即放弃的朋友们的反应,其实这就是使用不同于 VC 等等IDE 环境进行编程的必然门榏:
- 心理习惯
- 人都有先入为主的习性,对于不熟悉的环境,总是期望使用即有的经验进行对比/拟合;一但没有可比性就会失措,失望;
- 然而,Leo 的文学化编辑思想和操作是本质的飞跃,是和我们现有的体验完全不同的;
- 所以,建议,先不要试图理解,而是先习惯基本操作,在小的项目中先尝试运用Leo 进行组织,在使用中体验"文学化编辑",慢慢的,就会有一天猛然一贯而通,使用节点如同呼吸般自然和高效了!
中文问题
Leo 是使用Python 基于Tk框架开发的,而Tk 是一个古老而简洁的桌面图形化软件支持库,以往的版本对中文的支持,在非M$平台一直有问题;这里快速说明一下 Ubuntu(一种GNU/Linux 操作系统)中 Leo 中文显示问题的解决方法:
- 现象
- 无法使用输入法输入中文;字体可选择非常少,边缘显示有毛剌现象;
- 利用Python 来探测:
$ python Python 2.5.2 (r252:60911, Jun 21 2008, 09:47:06) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import Tkinter >>> print Tkinter.TclVersion 8.4
如果系统输出 Tk 版本是 8.4 的话,证明Tk 框架是不支持中文的老版本.
- 思路
感谢自由软件社区,这个问题早在2年前就由台湾的 aMSN社区(http://www.amsn-project.net)在开发过程中解决了,而且补丁被包含在 Tk8.5 版本中;但是在Ubuntu 等等操作系统中,Python 预编译版本都是绑定的 Tk8.4 版本,所以,只要重编译Python 将Tk 最新版本包含进来就可以完善中文的支持
- 处置
- 安装 Tk8.5, 在Ubuntu 的软件仓库中就有包含,所以,可以使用 快立得 工具快速安装,使用命令行安装的话如下:
$ sudo apt-get install tk8.5 tk8.5-dev
- 从 Python 官方网站下载对应本地CPU的源代码
- 依次进行以下操作
$ tar xjv Python-2.5.2.tar.bz2 $ cd Python-2.5.2 $ ./configure --prefix=/usr --enable-unicode=ucs4 $ make $ sudo make install
完成编译和安装,然后替换原先的 Python 调用:$ cd /usr/bin $ sudo rm python $ sudo ln -s python2.5 python
再进行之前的测试,就应该可以看到 Tkinter.TclVersion 的值变成了 8.5
而且可以从菜单 Cmds->Picklers->Show-Fonts 中看到之前无法选择到的各种中文字体了!
- 安装 Tk8.5, 在Ubuntu 的软件仓库中就有包含,所以,可以使用 快立得 工具快速安装,使用命令行安装的话如下:
- 提醒
- 如果处理后,还有问题,请及时升级 Leo 到最新版本, 2008-09-02 时,Leo 已经是 4.5.0 版本了,新版本对各种特性都有精心提升,可以支持最粗暴的操作,建议及时安装体验;-)
- 瞒天过海
由于Tk8.5 和 Tk8.4 的 API 改动并不大,所以其实可以瞒天过海用 Tk8.5 直接代替 Tk8.4 而不需要重新编译任何东西!(这是行者Jiahua Huang <[email protected]>探索出的好招;-) ~ 当然是指GNU/Linux 类的自由软件平台中,毕竟这是允许用户全权操控的环境哪;
可以在终端窗口粘贴执行下边命令
# 安装 Tk8.5 sudo apt-get install tk8.5 tcl8.5 # 备个份先 sudo cp /usr/lib/libtcl8.4.so.0 /usr/lib/libtcl8.4.so.0.old sudo cp /usr/lib/libtk8.4.so.0 /usr/lib/libtk8.4.so.0.old sudo cp /usr/lib/python2.5/lib-dynload/_tkinter.so /usr/lib/python2.5/lib-dynload/_tkinter.so.old # 再用 Tk8.5 覆盖 Tk8.4 sudo cp /usr/bin/tclsh8.5 /usr/bin/tclsh8.4 sudo cp /usr/bin/wish8.5 /usr/bin/wish8.4 sudo cp /usr/lib/libtcl8.5.so.0 /usr/lib/libtcl8.4.so.0 sudo cp /usr/lib/libtk8.5.so.0 /usr/lib/libtk8.4.so.0 # 篡改 "Tk8.4" 的版本号 sudo sed -i 's/8\.5/8.4/g' /usr/lib/libtk8.4.so.0 sudo sed -i 's/8\.5/8.4/g' /usr/lib/libtcl8.4.so.0
得了您咹!齐活儿!
探讨
Leo 社区是稳健活跃的,Leo 的开发和升级也是积极的,Leo 的FANs 们已经发展出了不少高级或是神奇的使用方法:
- LeoN
- 协同网络化的 Leo!
精巧地址: http://bit.ly/EIR8I
- 图 pcs302-7 LeoN 的使用情景
- 通过LeoN 可以支持多个开发人员,在网络中,同时协同同一个Leo 节点!
- 插件
- Leo 从一开始就提供了标准的接口,在手册中有专门一章进行描述: Chapter 7: Scripting Leo with Python
- 在社区维基中收集有最成熟和实用的插件:
精巧地址: http://bit.ly/390i9b
总结
使用 Leo 是绝对不同以往的编程体验,但其本身就是使用纯Python 实现的,值得学习和体验!
反馈
创建 by -- kongove [2008-12-11 13:19:46]