2010年11月24日星期三

关于Django和OrgMode的杂乱物

警告:此文是个坑!
* 前言
之前有帖子把Emacs和Python一起写,这次也把可以涉及到的一些内容写在一起了。
仅仅是写在一起而已,它们的内容在下面还是将区分开来放在不同的章节里的
* Django
** 什么是Django
已经很长时间没碰Django了,以下的内容算是回顾一下之前接触到的一些状况,仅是回顾而已不再深入。
** Apache上Django
这一段说的是Apache的共享主机上一个可行配置方案,是目前比较常见的部署环境了。
用VPS的话,在更大的权限下会有更好的方案,还是看Django文档吧,这里暂不做更多尝试。
个人参照了helionet.org上方案,并做了尝试。可以用fcgi或者mod_wsgi的方式。
Django文档中在howtodeployment一节里面有同样原理的说明。
** rewrite
在用户访问的路径下建立".htaccess"文件,权限为644。
这里要做的事情有两件,让静态文件文件可以直接被返回,让对Django页面的请求能够转发到我们编写的项目上。
#+BEGIN_EXAMPLE
RewriteEngine On
RewriteBase /
RewriteRule ^(media/.*)$ - [L]
RewriteRule ^(admin_media/.*)$ - [L]
RewriteRule ^(dispatch\.wsgi/.*)$ - [L]
RewriteRule ^(.*)$ project_subdirectory/dispatch.wsgi/$1 [QSA,PT,L]
#+END_EXAMPLE
这个文件根据自身的需要来写,以上仅仅是一个示例。
** wsgi
紧接上一段,建立文件dispatch.wsgi,并设置权限为755。
#+BEGIN_EXAMPLE
import os, sys
sys.path.insert(0,"/home/zsyweb/public_html/python-site/");
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
os.environ['PYTHON_EGG_CACHE'] = '/home/your_cpanel_username/.python_egg_cache'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
#+END_EXAMPLE
django模块和我们的站点都是作为一个模块被import,随意要添加到"sys.path"中。
然后会有一个"environ['PATH_INFO']"字符串,它就是交给我们的urls.py匹配的部分。
该文件会被作为一个进程执行,并在被更新时自动重启。
** ……
在自己的home路径下建立目录".python_egg_cache",并设置权限为777。
上传Django模块,以及自己的项目,是它们都成为一个单独的目录,并保证父目录已添加到"sys.path"中。
在服务器上设置好数据库,然后执行"manage.py syncdb",即使无法使用shell也可以通过上传cgi脚本或执行call_command函数来解决。
如果使用Sqlite的话,要让它所在的目录具有可读写的权限,不然肯定有500错误。
** GAE上Django
目前Django程序是不能直接在GAE上执行,主要是由于ORM模块不能使用,导致依赖Model的部分需要以GAE提供的界面的来编写。
不过就目前而言,Django-nonrel是个很不错的解决办法,它为Django的ORM提供了NoSQL数据库的后端,其中就包括GAE。
目前觉得GAE还是不错的,注册时只需要用手机收取一下注册码,然后就可以免费建立若干应用了。
** GAE
需要安装Python2.5和GAE SDK1.3.5,我那时候故意选择这个版本的,因为they work。
不知到好来的GAE又更新了什么,当时安装了新版本却反而不能正常工作。
之前用Google的CLI工具也出现过最新版不如之前某些版本稳定的状况。
** Django-nonrel
*** 获取
去它的网站下载若干压缩包回来,它们就是下面烹饪过程中的食材。
其中的django-testapp解出来就是我们的项目目录,可以看到我们熟悉的manage.py文件在里面。
其他的文件是我们的项目import入我们项目的模块。根据Python的规则,一个模块就是一个有__init__.py的目录,目录名作为模块名使用。
就目前DN提供的模块而言,我们解开它们应该得到的是:
- <project>/django
- <project>/djangotoolbox
- <project>/dbindexer
- <project>/djangoappengine
不过因为GAE对文件数有限制,以上文件肯定是已经超过了。所以接下来的可算步骤成立必须要做的事情:
- 把django模块(就上上面列出的那个目录)打包为django.zip,放到名为"zip-packages"的目录下。
这个目录已经添加到"sys.path"中了,我们的Django App或者其他模块也可以以同样的方式处理。
不过DN的其他几个模块就不要动了,它们和我们项目结合较紧,会在较早的时候被import到。
*** 使用
**** ORM
DN最大的作用,同时也是比较通常Django应用最需要的注意的地方即是它的ORM。在NoSQL数据库上,数据是也对象的形式保存的,对象可以包含可若干属性,对象的属性可以不存在,也可以建立索引。但是在关系型数据上的JOIN查询却是不提供的,同时在数据库事务中如何保持数据的一致性上也有些许区别。
那么也就是说包含JOIN的查询,aggregates,select_reated目前都是不可以使用的。此外many-to-many和transactions也不能使用。
当然不能使用并不是说我们在用到这些特性的时候就达到不了我们需要的结果,而只是实现方式上不那么直接。一是需要自己再多去实现一些代码,一是会有性能上的损失。
例如对于join查询,可以增加查询的次数,将一些判断从SQL中移到Python中来。值得注意的是在迭代中使用查询是一件很恐怖的性能损耗,即使必须用到这样的方法来实现某写功能,一定要设置好缓存,并额外设置计划任务对缓存进行更新。
对于M2M关系,也需要手工建立"through"用到表,也就是有两个ForeignKey指向要建立关联的两个对象。
然后通过重写save以及相关的方法或者建立signal来确保这个表示Reletionship的表中记录能够在正确的时候被创建和删除。
事务方面,GAE提供了额外的支持,暂时和Django的事物模块没有关系,相关的内容在GAE的文档中。
**** Mangae
使用的格式是"manage.py <command>",命令shell、createsuperuser、syncdb都可以使用。
需要注意的是这些命令是对本地GAE数据库操作的,在NoSQL中虽然表依旧存在,但是字段是属于数据而不是表的,在对表的字段作出修改的时候,原有的数据项依然存在数据库中。
GAE的开发环境是把数据库以文件的形式存在本地硬盘上的,可以手工删除这个database文件。
此外"manage.py deploy"会上传整个项目,命令中加了"romote"如"manage.py remote createsuperuser"那么它所操作的数据库就是服务器上的数据了,它和本地的开发环境是想独立的。
静态文静也是同样的上传,然后需要在GAE的文件app.yaml中做关于路径定向的设置。
最然直接访问Django的Admin页面,但是在表和superuser建立之后,就可以正常工作了,所以不小心看到了500的错误的时候,不要慌乱了手脚哦。
**** GAE的限制
坑,涉及数据查询和运行时间
** Django的Style
*** 倾向
之前社团里说来建议一个站点,于是我就拿Django来写了写,不过最后还是中断了。
因为觉得使用现成的Php应用可以减少维护成本,其次也没有人去推动这个社团站点的设想。
再者当代码越来越多的使用,如何去掌控这个规模也是自己的短处,频繁的重构只使得结构变得脆弱,而新代码使得代码越来越难以修改。
所以,这里有必要重新回顾一些最Django的方式:
Django的出现是英国一个新闻站点的需要,它们需要以一个快速固定的方式,为新闻事件建立站点。
在这一个过程中,需要尽可能的实现功能的重用,此外还有整个开发流程的重用。
在Django中Model和URL是站点构建的一个出发点,Model部分将决定我们我们做要呈现的数据是什么,而URL部分是站点提供给用户的一个接口。
然后,另两个需要同时考虑到的重要要素是View和Template,View表明了站点呈现到用户面前的是什么,而Template将表示这种呈现将是以何种的效果。
可以以Restful的URL通过Generic views实现对Model的操作,也可以让Model和URl配合让Generic views能够正确的展现出来。
*** 避免
话说自己之前对Model过于重视了,觉得数据是站点的全部内容,其他的部分之不过是对数据的表达。
直到看了未来的Django1.3中View是可以mixin了,才发觉原先想法中的不足。
有时一个站点的构建也可以是从View开始的,人们是先意识到一个站点是要呈现什么,然后再去实现构建它的数据模型的。
当然,我只是说Django的使用去保持一种量产的态度,而不要太过调整它的结构(仅是说使用,Django的开发不在此限制之内)。
例如自己的一个不够如意的尝试就是利用ContentType机制,也就是相当如Java中反射加Python中的鸭子类型的一类东西那种不会用的时候很容易滥用的东西。
让整个站点的代码通过派生共用抽象模型,全部变成模型的一部分。
再加上metaclass等动态机制,让model提供一堆protected virtual的东西,而把CURD的View以及Form等东西全部抽象掉。
虽然这种修改我原以为会让之后代码修改变得简单,不过之际中,严格依照Django提供的结构把一个Model和它涉及到的View啦Form啦什么的都分开来写一遍。
这里仅仅是分开来写一遍而已,Django已经是提供的声明式的语法而且还有一段时间的向后兼容时间。
保持代码的基础以一个简洁稳定的方式,对于之后代码量大后的维护,才是可行的方式。
特别是通过建立自己的template tags,使得每个view只需要负责他所负责的数据,或许即使是像国内站点首页那样的庞然大物,也可以参照类似的方式来增加代码的灵活性。

** 回顾
居然这段打算说的被前面说掉了,大意就是这段时间没写Django代码过了。也没为自己写个博客程序,应为觉得还是blogspot省心。而且就搭建开发环境上来说还是php省心,最简单的情况是存一个php文件就能运行。想随手一个Django应用的话,则一下子就要面对许多需要涉及和不需要涉及的事情,MVC啦ORM啦如何去部署啦都是一下子都会考虑到的问题。当这种复杂性不是瞬间需要的时候,反而是对随手写几行代码这种行为的一种困扰。
不过,相比于Php门槛低应用多的优势,使用Django还是有他可以胜任的场合的。例如Django所要求的结构可以降低自行编写的站点的复杂度,有一个直接完整的学习过程,而且拿Python写算法的话也要相比而言等方便一些。
学习成本和使用成本,如果绘制成为曲线的话,它们陡缓的场合是不同的。
** 代码片段
这里内容并没有什么特定的内容,仅作为一个堆放而已。
#+BEGIN_SRC python
- url: /static
static_dir: static

from django.contrib.auth.models import User
user = User.objects.create_user('root', 'email', 'pass')
user.is_staff = True
user.save()

User.objects.create_superuser('root', 'e@mail.com', 'pass')

def profile_create(**kwargs):
if kwargs['created']:
profile = UserProfile.get_or_create(user=kwargs['instance'])
profile.save();
post_save.connect(profile_create, sender=User)

class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)

#+END_SRC
user singal
django-registration
Nonrel-search
各种各样的缓存,只能指定的方式使用乖哦能
#+BEGIN_SRC emacs-lisp
点对点
#+END_SRC
#+BEGIN_EXAMPLE
点对点
#+END_EXAMPLE
abspath(
* org-mode
** 什么是org-mode
在emacs中,Org-Mode已经是自带的了,它已经是我开Emacs的主要用途了。
输入"M-x org-mode <RET>"就可以进入,用info可以查看它们的使用说明,文件名后缀.org。
自己主要拿它来写文档用,比如说这篇就是在org-mode里面写的,之前有一篇小说也是。
包括上文提到的那个站点项目,也是用org-mode来描述想法和记录进程的。
首先呢,建议阅读[[http://orgmode.org/orgguide.pdf][OrgGuide]]这份文档,它是对info手册的摘要,对系统地去了解一下org-mode还是很有帮助的。其中对org-mode的定义是:
: Org is a mode for keeping notes, maintaining TODO lists, and doing project planning with a fast and effective plain-text system. It is also an authoring and publishing system.
这段话概括了Org-Mode的功能,不过再接下来的文字里所要关注的,不是去列举org-mode的功能或者单纯的学习操作,而去寻找若干实际的应用场合,来看看Org-Mode是如何帮助我们完成特定的任务的。
享受Org-mode带来的文本显示与展示效果,使用它提供的种种功能,以及简化输入用的快捷键。
关于它所拥有的各种,本文无意去全部涉及或概括。至于使用上的创意则完全是看各自发挥了。
通过org-mode提供的格式,让其中文本语义在编辑中展现出来。
出于习惯,为节约编写时间,除非有特别的要专门要求,以下内容将从略,所以会以意义不甚明了的状况。
** Emacs的使用
仅当热身用,仅涉及光标移动什么的,对键盘的亲切感是下文展开的基础,因为org-mode的使用就是就是和文本大交道的。
那么,来尝试一个最基础的小问题吧:
1) 创建文件demo.txt
2) 输入"I don't like Emacs."
3) 保存一下
4) 把文本中的"don't"去掉
注意,这时候的光标在行末,编辑后也要把光标移到行末哦。
那么,我们可以有多上中手段来达成这个需且呢:
+ 用<Left>键向左移动光标
+ 用C-b来向左移动光标
+ 先用M-b移动到句首光标
+ 先用C-a来移动到行首
+ 用C-s来根据字符定位光标
+ 用鼠标来移动点击要移动的地方
+ 用bs建向左删除字符
+ 用delete向右删除字符
+ 用C-d向右删除字符
+ 用M-d向右删除单词
+ 用M-%把单词替换为空白
+ 用鼠标拖选单词后删除
+ 在单词一端M-@标记,在另一端C-w剪切
+ 在行首C-k删除行后重输
+ 最后C-移到行末
+ 或者M->移到文末
当然这里这样列举纯粹为了娱乐,况且这些确实是最基本的一些操作。
而且都是很有规律的按键,想必各位都已经对此出于机械反应了吧。
M-空格也很有用
** Outline
这个记号"*"星号,就是用来建立文本层次的,顶格写,后更一个空格。"*"连写则表示是一个子层次。
在层次下面还可以补充的使用"-"、"+"、"*"、"1."、"1)"建立列表,有前后空格,用缩进表示子层次,可"::"后跟描述。
注意要避免发生和前一种方式的混淆,前者是用来组织文档结构的方式。
然后来看一组快捷键:
#+BEGIN_EXAMPLE
折叠显示
TAB Subtree cycling,
S-TAB and C-u TAB Global cycling,
C-u C-u C-u TAB Show all, including drawers.
C-c C-x b 在新缓冲区内显示树
光标的移动
C-c C-n Next heading,
C-c C-p Previous heading,
C-c C-f Next heading same level,
C-c C-b Previous heading same level,
C-c C-u Backward to higher level heading.
编辑
M-RET 创建同层次同类型新项目
M-S-RET 见下文TodoList部分
M-LEFT/RIGHT 改变当前项目的层次
M-S-LEFT/RIGHT 改变项目层次,包括子项目
M-LEFT/M-RIGHT 移动当前项目位置
M-S-UP/DOWN 自动项目位置,包括子项目
C-c C-w 移动项目往某个位置
C-x n s/w 显示当前全部/项目
C-c - 或 S-方向键 改变项目状态
S-<Tab> 改变项目层次
C-c ^ 排序项目列表
C-c * list和tree之间转换
匹配
C-c / sparse tree
#+END_EXAMPLE
在Emacs中Outline也可以做单独的主模式或副模式使用。
有时后为了美观,会使用org-indent-mode。手工调用或#+STARTUP: indent都可以。
此外C-c C-c是个很有常用的按键,其功嫩根据场合,且没有破坏作用。
M-<TAB> 是多种场合下用来补全的快捷键。
这里sparse tree只是+-|&的条件查询
** Rich Text
*** Footnotes
个人比较喜欢的方式是用来做生成文档是用的页脚注释
: [fn:: This is the inline definition of this footnote]
不过一般还是在文本中"C-c C-x f"分开写,然后用利用OM的自动的链接功能,如
: [1] [fn:name]
*** Hyperlinks
用来实现HTML中的超级链接的功能
[[link][description]]
: [[link][description]]
其中[description]可以省略
可用的快捷键有:
: C-c C-l 创建/编辑链接
: C-c C-o 打开链接
: C-c & 返回跳转之前的位置
此外关于link的格式
#+BEGIN_EXAMPLE
[[My Target]] 或自动寻找文档内文本的位置
# <<My Target>> 用注释添加目标
[[*My Targets]] 仅查找项目
<<<My Target>>> 会自动创建指向它的链接
文档内章节引用的指向文字,也通过这样的机制来实现。
也可跨文件查找
[[file:~/code/main.c::255]]
[[file:~/xx.org::My Target]]
[[file:~/xx.org::*My Target]]
[[file:~/xx.org::/regexp/]]
使用URL
file: mailto: 或 http:// 来用不同协议指向本地或远程地址
可用此在插入图像
对于同类链接,可以用#+LINK简写
#+END_EXAMPLE
链接可以直接在Org-Mode中使用,或者在到处为其他格式时有特别的效果。
*** Markup
这一节说说富文本的标记
#+BEGIN_EXAMPLE
默认只用"\\"才表示换行,
不过这个可以该设定为"\n",也就是按实际文本的换行来。

有若干按格式引用文本的话,有方法
用 #+BEGIN_*** 和 #+END_*** 的形式可以
VERSE、QUOTE、CENTER

文字样式
*bold* 粗体
/italic/ 斜体
_underlined_ 下划线
`=code=' 代码
`~verbatim~' 字面的
`+strike-through+' 删除线

水平线用单独一行至少5个"-----"

可以在文本中添加注释
顶格写# 不顶格写#+
用COMMENT开始文本树的标题
结合BEGIN块使用,可以用M-<Tab>方便输入
快捷键 C-c ; 也是照常工作

在文本中插入示例使用
名为EXAMPLE的BEGIN块,或者": "(冒号+空格)开头
插入源代码用SRC块,之后跟参数如"#+BEGIN_SRC emacs-lisp"
编辑源码的快捷键有 C-c ' 和 C-c l
代码块提供参数支持格式或文本内引用的功能
使用参数-t则在HTML中以TextArea来显示

可以插入其他文件中的文本
如 #+INCLUDE: "~/.emacs" src emacs-lisp
这里的第二个参数是块名SRC,按键"C-c '"依然可用
可选参数 “:prefix1 " + " :prefix " " ”为引入内容添加前缀

可以在文本中使用宏
定义: #+MACRO: name replacement text $1, $2 are arguments
插入: {{{name(arg1,arg2)}}}
#+END_EXAMPLE
这段用来一个EXAMPLE块来展示,不过依然建议只在需要的时候再使用,以是文档结构清晰。
*** Tex & LaTex
此项功能用来在文本中插入特殊符号和数学公式,也或者为导出PDF格式做特别的标记。

特殊符号以"\"开始,可以使用补全,如
: \alpha \beta \gamma
将得到 \alpha \beta \gamma
它在HTML和LaTex输出中都可以使用,将分别得到
: &alpha; $\alpha$
{}符号依照Tex做结尾可选的间隔符用

上下标使用类似Tex的语法
: x^{2} a_{1} 10^30
得到 x^{2} a_{1} 10^30

对于特殊输入,都可以用\符号来转回原意

数学公式可以用dvipng程序转为图片,例如供HTML使用
LaTex片段使用\begin或直接插入公式片段
#+BEGIN_EXAMPLE
\begin{equation} % arbitrary environments,
x=\sqrt{b} % even tables, figures
\end{equation} % etc

If $a^2=b$ and \( b=2 \), then the solution must be
either $$ a=+\sqrt{2} $$ or \[ a=-\sqrt{2} \].
(setq org-export-with-LaTeX-fragments t)
#+END_EXAMPLE
可以在编辑模式中`C-c C-x C-l'插入预览效果,`C-c C-c'恢复文本显示
注意$里面不可以有多余的空格,不然直接作为文本识别了。

使用CDLaTeX minor mode可以得到类似AUCTeX的编辑便捷
*** Include
使用 #+INCLUDE: "file.org" 可以引入另一个文本的内容
也可以以块的形式引入,或者 “:prefix " "”为每行添加前缀
: #+INCLUDE: "~/.emacs" src emacs-lisp
也有宏替换的功能
: #+MACRO: name replacement text $1, $2 are arguments
在文本中可以使用】
: {{{name(arg1,arg2)}}}
: {{{title}}}
这里的title是由 #+TITLE: 指定的
*** Image
插入图像的功能,通常用在到处为其他格式时嵌入显示。
关于如何将org文件导出为其他格式的文本,将在下一节里说明。
#+BEGIN_EXAMPLE
插入表格
#+CAPTION: This is the caption for the next table (or link)
#+LABEL: tbl:basic-data
| ... | ...|
|-----|----|

#+CAPTION: This is the caption for the next figure link (or table)
#+LABEL: fig:SED-HR4049
[[./img/a.jpg]]
#+END_EXAMPLE
这里的CAPTION是插入内容的说明文字,而LABEL则是用于文本中的引用。
*** Source Code
导出或执行代码。
** Export & Publish
*** Org2____
功能集中在 "C-c C-e"按键下面,如果此时按键停留一段时间,屏幕上会给出进一步按键的提示。
输入`C-c C-e t'将给当前的文本插入一段输出选项的模板,对此模板的修改是接下来将org文件转换为其他格式的基础,因为很难保证默认的转换规则对当前文本适用。
至于为什么要org-mode的文件转换为其他格式,这个问题是...
如果一点这样的需要也没有的话,那么以下的内容就是在废话了,所以就暂且默认一下吧。
1. org-mode方便文本的编写与管理
2. 有时我们需要在不同场合使用不同分发格式
3. org-mode格式并不适合发布
不过,编写与发布其实是一个连贯的过程,org-mode的使用是一个流程中的一部分。
而不是像这里分出123在列举某一方面的优势和不足的。
*** Option
关于选项模板中的的 #OPTIONS选项,因为不像其他选项那样可以按照名称辨别,所以这里转一下说明:
#BEGIN_EXAMPLE
H: set the number of headline levels for export
num: turn on/off section-numbers
toc: turn on/off table of contents, or set level limit (integer)
\n: turn on/off line-break-preservation
@: turn on/off quoted HTML tags
:: turn on/off fixed-width sections
|: turn on/off tables
^: turn on/off TeX-like syntax for sub- and superscripts. If
you write "^:{}", `a_{b}' will be interpreted, but
the simple `a_b' will be left as it is.
-: turn on/off conversion of special strings.
f: turn on/off footnotes like this[1].
todo: turn on/off inclusion of TODO keywords into exported text
pri: turn on/off priority cookies
tags: turn on/off inclusion of tags, may also be `not-in-toc'
<: turn on/off inclusion of any time/date stamps like DEADLINES
*: turn on/off emphasized text (bold, italic, underlined)
TeX: turn on/off simple TeX macros in plain text
LaTeX: turn on/off LaTeX fragments
skip: turn on/off skipping the text before the first heading
author: turn on/off inclusion of author name/email into exported file
creator: turn on/off inclusion of creator info into exported file
timestamp: turn on/off inclusion creation time into exported file
d: turn on/off inclusion of drawers
#+END_EXAMPLE
关于LaTeX的数学公式的导出方式,在HTML文件中还有更具体的选项,需要参考具体的org-mode版本。
*** ___2what
个人是转为HTML较常用些,转为Text或者LaTeX也是可以的,org-mode还支持其他一些格式。
针对要转为的格式,可以添加一些直接的额外的标记。它们通用的形式如下:
#BEGIN_EXAMPLE
插入单行 #+DOCBOOK:
插入块 #+BEGIN_DOCBOOK
对标记插入 #+ATTR_DOCBOOK
#+END_EXAMPLE
具体一些什么的,之后再来根据遇到的一些实际的情况来补充,所以暂且略过。
*** HTML
1. CSS样式调整
2. JS交互界面
参见http://orgmode.org/Changes.html
*** Latex
1. 配合XeLaTeX使用
2. 关于中文的设置
*** Org
关于直接发布org-mode格式的一些说明
*** Project
到处项目的作用是将一组org文件转换为一个HTML站点
命令依然是以"C-c C-e"开始,不过还是需要提前来做一些配置。
** TodoList
*** GTD
前面貌似说到过,本文的目的并不是关于org怎么用,或者或来说明org-mode有哪些功能。
本文的目的是,如何用org-mode来达成我们需要的一些任务,也就是说想写成CookBook一样的东西。
当然,这只是对文本进行考虑的一个出发点,至于做到没做到就有时另一回事情了。
而且出于自私的想法,写着写着来跑题聊一些轻松的话题也是很有趣的事情。
甚至有时为了写着轻松,留了很多类似“请自行参考文档”一类的话,而让文本的内容常常莫名其妙。
然后,我还会有一个借口,叫什么“本文的目的是导读,而不是作为参考重点用的笔记。”
其实吧,本文也确实不是笔记。笔记什么的是学习时候的记录,用来之后做参考的。
而本文呢,出发点是对自己的使用感受做一下总结,看看对目前自己比较实用的有哪些用法。
好了,org-mode的那么多功能自己也还不都能用好,说成总结是有点牵强了,因为自己对om的使用也毕竟只算个开始。
不过话说会这里的关注点,本文只是恰巧是用om写关于om的话题,更多的机会还是用om写和om无关的东西。
只是om有功能可以让自己的事情完成的更方便一些,对om使用的增加只是会是om的存在感变得降低。
这样来说的话,对org-mode的使用就根本不是在一个学习om的过程之中了。
对于一个工具的使用,会存在两个方面的因素,一是自己能做什么,一是工具能做什么。
虽然这两者必须依赖于自己用工具做了什么,才能够显示出双方的意义,而且双方并不都是永恒不变的东西。
课本上面那种“普遍真理”一类的话,这里不想拿出来说了,因为它总是想用我遇到的例子来说明它的正确性,而不是关注到自己面前所处理的问题上。

这节是叫GTD来着,看来我跑题了。其实这也是一个自私的想法,因为对于一篇没人看的文字,我只好以满足自己的YY来作为优先原则。
话说什么叫GTD呢,它是一种时间管理的方法,很多PIM软件如果知道GTD方面的理论的话,会用起来顺手一些。
自己用的熟悉而是也是唯一的一款PIM软件是MS的OutLook,这是因为我手机上自带的关系。
虽然在新闻讨论中它并不常见,但是它确实功能成熟,而且确实很好用。
它包括了若干组件,比如邮件,日历,任务,便签,联系人,还有其他什么我不清楚的东西。
话说据说其实org-mode还有点像OneNote来着,因为都可以用于记笔记,手机上ON是还可以手写和录音。

不过自己用Org-Mode的话,还是以它的笔记功能为主,对日程方面的很多功能还不熟悉,而且暂时也觉得没有去熟悉它们的必要和动力。
所以这节换题虽然是如何以orgmode去实现任务列表功能,不过还是将继续上面几节的话题的方向。
*** TodoItem & CheckBox
按键 M-S-RET 用来将下方插入,headline对应todo headline,list对应checkbox。
headline可以通过"C-c C-t"或者"S-RIGHT/LEFT"在unmarked和TODO以及DONE状态之间转换,用来标记代办事项。
用"C-c /"来sparse tree时可以显示依照TODO状态来显示部分条目,树状条目的状态存在依赖关系,即子项目的状态是父项目的一部分。
有#+TODO:用于对状态的设定,S-UP/DOWN可以用来改变条目优先级状态。
CheckBox是list前包含[ ]或[x],父条目后包含[%][/]来统计状态。
其中后者对headline也适用,其状态会根据子条目的TODO状态自动改变。
用C-c C-c来改变其选中状态。关于细节在M-S-RET之后就会很明了的。
*** Tags
用:tag:标在headline后面,以方面整理,或添加属性。
相关的按键是"C-c C-c",可以":key1:key2:"使用多个tags。
Properties以k-v的形式实现类似的功能。
*** Dates & Times
"C-c ./!"插入,用S-LEFT/RIGHT/UP/DOWN改变光标位置的状态。
也支持时间范围(A--B)和离散的时间点(如每个...),可插入在headline后与om的其他机制配合。
*** Dict
在org-mode中使用字典,虽然这不是OM自己的功能,不过有实用价值。
** Calendar
出来MS的OutLook,Xfce的Orage也是自己很喜欢的日程类软件,OM的Mobile暂时无条件享用。
不过就目前的自己而言更多还是依赖纸和笔的传统方式,对GTD软件的使用还不大,以下部分从略。
*** Deadlines and scheduling
C-c C-d Insert ‘DEADLINE’
C-c C-s Insert ‘SCHEDULED’
配合TODO有Progress Logging
*** Capture - Refile - Archive
若干特定显示模式,或者项目的管理
其中C-c C-w Refile在文件内移动条目位置还是很有用的功能。
*** Agenda Views
建立文件列表来进行日程管理,以及相应的界面。
可以结合着使用全局的TODO列表。
用"C-c ["加入当前文件
*** Attachment
C-c C-a
** Spreadsheet
在org-mode可以插入表格,或者充当电子表格使用
*** Tbl
在菜单中有Tbl,其中列举了会用到的功能。如果菜单让你费解的话,请看下面的文字。虽然在接下来的使用中没有用到菜单,不过它们涉及的内容是一致的。
*** Tables
| ID | Key | Value |
|----+-------+--------|
| 1 | apple | Red |
| 2 | pear | Yellow |
| 3 | | |
#+TBLFM: $1=0
表格以|开始行或者|-做分割,之后TAB或RET键就可以被识别,C-c-c表示刷新。
表格的行宽会被自动根据内容的长度被调整。
#BEGIN_EXAMPLE
`C-c |' 创建或转化为表格
`M-<left>/<right>' 移动栏
`M-S-<left>' 删除当前栏
`M-S-<right>' 在左边插入栏
`M-<up>/<down>' 移动列
`M-S-<up>' 删除当前列
`M-S-<down>' 在上方插入列
`C-c -/<RET>' 在下方插入水平线
`C-c ^' 排序区域
`C-c C-x M-w' 区域复制
`C-c +' 获得栏的和
`S-<RET>' 自动插入栏
#+END_EXAMPLE
标题<N>指定显示宽度,用`C-c `'编辑。
列有水平线,栏则通过
#BEGIN_EXAMPLE
| / | <> | < | | > | < | > |
| / | < | | | < | |

#+END_EXAMPLE
有minor mode叫orgtbl-mode在其他mode中使用。
还可以结合gnuplot-mode使用。
*** Excel
这里是说那om充当Excel的部分功能,虽然统计分析什么的om并不可用。
引用单元格使用@ROW$COLUMN以及$2..$7,可以绝对数值或+-的相对数值。
然后可结合Calc或Lisp的表达式使用。
:=对当前单元格输入表达式,=为栏输入。
`C-u C-c C-c' `C-u C-u C-c C-c' 执行计算更新
** End
说明一下,虽然本文有好多处是说什么待写啦暂略啦,不过如果有补充的话会另开文的,所以对上面含糊的内容就不必要有期待了。
额,发现一文,比我写得好:
http://linuxtoy.org/archives/emacs-org-mode.html。

* 文本信息 :noexport:
** 笔记
todolist 思维导航 GTD 笔记 发布 日历 xiangmu xelatex
#+TITLE: Django和Org-Mode的若干
#+AUTHOR: ee.zsy
#+EMAIL: ee.zsy@163.com
#+DATE: 2010-11-10 星期三
#+DESCRIPTION:
#+KEYWORDS: django org-mode emacs python
#+LANGUAGE: zh_CN
#+OPTIONS: H:3 num:t toc:t \n:t @:t ::t |:t ^:t -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:nil skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+INFOJS_OPT: view:nil toc:nil ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js
#+EXPORT_SELECT_TAGS: export
#+EXPORT_EXCLUDE_TAGS: noexport
#+LINK_UP:
#+LINK_HOME:

没有评论: