关于org-page的配置
Table of Contents
1 坑在哪里?
之前我配置过一个 hexo 博客,大概花了一个多小时,一个多小时后,我就安心用 markdown 来写博文,发布了,好吧,本来也就那样啦,不过,一不小心看到了 org-page ,当时的第一印象是字体真他妈漂亮,回来再看看自己那个博客,觉得虽然效果非常炫丽,但其实是华而不实的东西。所以就想尝试一下 org-page 。
我真的有些佩服自己,干啥不好,喜欢折腾这个鬼东西。我花了多久才折腾好这个博客呢?大概两天。请对比一下前面的一个小时,看看这个东西坑在哪里。
我来小小地吐槽一下我碰到的坑。
1.命令的执行的过程中提示的信息非常少,只是报错,而且报的错对于小白来说简直就是不知所云。
一个很简单的例子,我在执行:
op/new-repository
命令的时候, emacs 经常会给我报如下的错误:
Failed to change branch to 'source' of repository XXX
无法转换到 source 分支,什么鬼?怎么会出这个错误?哪里出错了?简直不知道这东西在报什么鬼。
对,刚开始的我也是这样的。我在自己的 win7 上试了几遍,每次都报错,我怀疑,作者设计的这个东西只能用在 linux 上面?我换了 ubuntu kylin 去尝试,依旧问题不断,我配了一段时间,不过老是出错挺打击人的。
然而转机终于还是出现了,在某个点,我不知道发了什么疯,居然想到了到虚拟机上的 linux 主机上去配置,居然一次就成功了,真够神奇的。然后又跑到自己的 win7 和 ubuntu kylin 上去配置,居然又失败了,这个时候我的感觉是,作者写的代码很不健壮,出了问题自己很难解决。
2. org-page
的说明文档少得可怜,这我也没什么好说的,毕竟只是一个很小众的东西。可是这东西,如果真的要给人用的话,请写得详细一点,最好还配置一个图文教程,否则,这个东西永远都是小众的东西。
2 解决方案
linux 用户一般使用这个东西问题不大。 windows 用户碰到的问题应该会有很多,我恰好用的是 windows ,这里记录一下我的解决方案。
windows 系统出错,主要是在 git 命令上,如果被坑的次数多了话,说实话,看源码其实更加实在,更加快。
比如说,我执行 op/new-repository
命令老是出错,那么就到目录下面找到 org-page.el
文件的 op/new-repository
的源码:
(defun op/new-repository (repo-dir) "Generate a new git repository in directory REPO-DIR, which can be perfectly manipulated by org-page." (interactive (list (read-directory-name "Specify a directory to become the repository: " nil nil nil))) (op/git-init-repo repo-dir) ; 执行git init命令 (op/generate-readme repo-dir) ; 产生 readme 文件 (op/git-commit-changes repo-dir "initial commit") ; 提交git commit -m "initial commit" (op/git-new-branch repo-dir op/repository-org-branch) ; 新建分支 (op/generate-index repo-dir) ; 产生 index.org 文件 (op/git-commit-changes repo-dir "add source index.org") ;执行 commit -m "add source index.org" (op/generate-about repo-dir) ; 产生 about.org 文件 (op/git-commit-changes repo-dir "add source about.org") ; 执行 git commit -m "add sorce about.org" (mkdir (expand-file-name "blog/" repo-dir) t)) ; 新建 blog 文件夹
上面的注释写明了 op/new-repository
函数所干的事情,我们可以单步执行。
一些与 git 相关的函数都定义 op-git.el
文件之中,下面是初始化 git 的命令 op/git-int-repo
的源代码:
(defun op/git-init-repo (repo-dir) "This function will initialize a new empty git repository. REPO-DIR is the directory where repository will be initialized." (unless (file-directory-p repo-dir) (mkdir repo-dir t)) ; 如果 repo-dir 所指示的文件夹不存在,建立文件夹 (unless (string-prefix-p "Initialized empty Git repository" (op/shell-command repo-dir "git init" nil)) ; 执行 git init 命令 (error "Fatal: Failed to initialize new git repository '%s'." repo-dir)))
在上面的文件中,我发现了一个很有趣的东西,那就是作者写的 elisp 文件更像是一个脚本,只是通过执行相应的命令,然后比对命令输出的结果,来判断命令执行是否正确,看到这里,我知道为什么我的 ubuntu kylin
系统执行 op/new-repository
命令老是出错了,因为它的git命令是中文的,而作者的代码比对的是英文的结果,自然会出错。
所以我立马把 kylin 系统里面的中文删掉了,换成了英文,然后按照说明来配置,果然成功了。
然而,在 linux 下面写博客真心不太容易,虽然我也很想在 linux 下面生活,但是 linux 就是一个坑,我下了一个 emacs ,居然无法使用中文输入,当然办法肯定有的,但是非常麻烦,要是这么弄的话,我宁愿不用这玩意了,并且 linux 下输入法的效果也没有 windows 下面好,好吧,*linux* 还是活在我的远程连接里面吧!
有了成功的经验,我就在 win7 下面配置起了 org-page
,果然又是一个坑,又不行,我将语言换成了英文也不行,那么怎么办呢?也没有什么好办法,只能看源码,好在学过一段时间 scheme ,索性玩起了 elisp 调试,使用 edebug-defun 命令调试起了源码。后来跟踪了一段,发现在提交的时候老是出错的原因是, 没有配置邮箱和用户名 。
我重点检查了这一段:
(defun op/git-commit-changes (repo-dir message) "This function will commit uncommitted changes to git repository presented by REPO-DIR, MESSAGE is the commit message." (let ((repo-dir (file-name-as-directory repo-dir)) output) (op/shell-command repo-dir "git add ." t) ; 执行git add . 命令 (setq output (op/shell-command repo-dir (format "git commit -m \"%s\"" message) ; 提交命令 t)) (when (not (string-match "\\[.* .*\\]" output)) (error "Failed to commit changes on current branch of repository '%s'." repo-dir))))
我单步执行了一下,执行到 git commit -m XXX
发现了一个很大的问题,实际上这条命令返回的结果是:
Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your name" to set your account's default identity.
这个结果显然和作者预定的东西不匹配,因此就有了错误。解决方法很简单,无非就是自己照猫画虎,添加了下面的两句话:
(defun op/git-commit-changes (repo-dir message) "This function will commit uncommitted changes to git repository presented by REPO-DIR, MESSAGE is the commit message." (let ((repo-dir (file-name-as-directory repo-dir)) output) (op/shell-command repo-dir "git add ." t) (op/shell-command repo-dir "git config --global user.email \"lishuhuakai@gmail.com\"" t) ; 此处换成你的邮箱 (op/shell-command repo-dir "git config --global user.name \"lishuhuakai\"" t) ; 此处换成你的名字 ....))
运行一遍之后删除原来的两句话即可,此时在 emacs 的目录下多了一个 .gitconfig
文件,里面记录了你的邮箱和用户名。
执行完上面的操作之后,我运行 op/new-repository
命令就正常了。
还有一种方法,其实我也没试过,不过我记录在这里,那就是直接在你的 emacs 配置里面设置:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 设置有用的个人信息 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq user-full-name "Yihulee") (setq user-mail-address "Yihulee@gmail.com")
3 我是这样配置的:
首先,你要在你的 emacs 配置文件中添加下面的代码,主要是用于告诉 emacs 到哪里去找 org-page
包。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; package ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (require 'package) (package-initialize) (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
然后执行安装包的命令 M-x package-list-packages
,然后 emacs 会显示一大堆的包,用 C-s org-page
来寻找 org-page
包:
点击安装:
安装完成后,你要进行一些配置,下面是我的关于 org-page
的配置
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 设置org-page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (require 'org-page) ;; repository-directory 是你的本地仓库的地址,如下面的配置,我的博客放在"C:/emacs/Yihulee"目录下 (setq op/repository-directory "C:/emacs/Yihulee") ;; 下面是你的博客的地址 (setq op/site-domain "http://Yihulee.github.io") ;; 你的github的地址 (setq op/personal-github-link "https://github.com/Yihulee") ; if you want to show a personal github link ;; 主 title (setq op/site-main-title "Yihulee's world!") ;; 副 title (setq op/site-sub-title "=========>易燃又美味!") ;; 多说 (setq op/personal-duoshuo-shortname "lishuhuakai") ; use for duoshuo comments
上面的配置,你只需要照猫画虎即可。
使用 op/new-repository
命令一般要指定文件夹,将这个文件夹作为你本地的仓库,这个文件夹建议指定你上面配置的地址(你调用 op/new-post
写博客,该博客的 org 文件会自动保存到你上面配置的本地仓库的 blog 文件夹下面,使用 op/do-publication
命令发布的时候,渲染的也是你上面指定的本地仓库地址里的 org 文件),如我指定的是 C:/emacs/Yihulee
,如果你想直接用 op/do-publication
命令直接发布到你的博客,恐怕你还得为之前设置的本地仓库关联上远程的仓库。我这里以 github 为例做一下演示。
op/new-repository
命令执行完了以后,如果一切正常,你的目录下面应该是如此:
.git
是个隐藏的目录,你的电脑里面可能看不见,然后关联一下你的远程仓库:
git remote add origin git@github.com:Yihulee/Yihulee.github.io.git
上面是我的博客的 git
项目的地址,当然,要能把git项目推到远程仓库中去的话,你要有github的账号,并且账号要关联你的 ssh-key
,你才可以推送。
调用 op/do-publication
命令,并且你选择了推送到远程仓库的时候,该命令生成网页后,会自动执行与 git push -u orign master
类似的命令,将你的文件推送到远程仓库。
差不多就是这样啦,不过也别太相信这两个命令,在命令执行不成功的时候,要手动纠错,正如前面所说,作者写的代码还是不够健壮,无法应对很多意想不到的情况。
总之我经常手动纠错啦,比如说,每次写完一篇博客后,我都要自己提交,然后才执行 op/do-publication
命令,这样发布才正确, 否则的话,我写完一篇新博客直接用 op/do-publication
命令的话,一般会报错(window 下) Failed to change branch to 'master' of repository XXX
,原因是发布的时候 source 分支没有自动提交更改,自己要手动执行添加更改:
git add . git commit "xxx"
当然,有时候将 master 分支推送到远程仓库的命令也不灵,这个时候你可以手动推送:
git push -u origin master
我手动推送几次之后,远程推送的功能突然又好了,我一直不明白,也不想明白各中缘由。
这里对本地仓库做一下说明,仓库有两个分支,一个是 master ,一个是 source 分支,*master* 里面是生成的网页, source 分支里面是 org 源文件,被推送到 github 的是 master 分支,而 source 分支不会被推送到远程的仓库去。
** 一些常用的git命令
git remote 查看分支
git add . 添加文件夹中所有的东西到git中
git commit -m "remark" 提交
git checkout branch-name 切换到某个分支
git log 查看提交日志
4 我的建议
这个东西,估计不会有很多人玩得转。真的,要用 org-page
来写博客并且发表的话,要求挺高的,首先,你要懂 emacs 的一些基本操作,其次, git 的一些命令,你要玩得特别转,最后你还要会用 org-mode
,当然不用很精通。最好的,你还要会点 elisp
。
好吧,小白就别玩这种东西啦,去用 hexo
吧!傻瓜化的配置。你只要安心写好你的 markdown
就行了。
5 最后再给一个参考资料
参考了我的配置,然后参考了上面我给的链接,相信你应该能够配置出 org-page 啦!
6 最后要注意的地方
6.1 如何显示toc呢?
toc是什么?toc就是这个页面右上角的目录。默认的,这个选项是关闭的。在你写org文件的时候,你应该可以看到这么一行:
#+OPTIONS: H:3 num:nil toc:nil \n:nil ::t |:t ^:nil -:nil f:t *:t <:t
现在,我们稍微改动一下即可,看我的:
#+OPTIONS: H:3 num:nil toc:t \n:nil ::t |:t ^:nil -:nil f:t *:t <:t
现在就可以了!
6.2 对于一个特定目录下面的文章,如何设置特定的属性?
这里看我的一段代码:
;; t 代表true,而nil代表false (setq op/category-config-alist (cons '("essay" ;; 目录的名字 :show-meta t ;; 是否显示摘要的信息,即文章下方的发表时间,修改时间,所属类别等信息 :show-comment t ;; 是否显示评论信息,这很好懂,如我的多说 :uri-generator op/generate-uri ;; 这个照抄即可 :uri-template "/essay/%y/%m/%d/%t/" :sort-by :date ;; index文件如何排序文章 :category-index t) ;; 是否生成目录以及index文件 op/category-config-alist))
6.3 为什么我写的博文没有被发布?
请自习检查,是否org文件的名字是中文,改成英文或者数字即可。
上面,就是关于 org-page 的全部的故事啦!