关于org-page的坑
2016-02-22 23:05
197 查看
Table of Contents
1. 坑在哪里?2. 解决方案
3. 我是这样配置的:
4. 我的建议
5. 最后再给一个参考资料
6. 最后要注意的地方
6.1. 如何显示toc呢?
6.2. 对于一个特定目录下面的文章,如何设置特定的属性?
6.3. 为什么我写的博文没有被发布?
坑在哪里?
之前我配置过一个 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的说明文档少得可怜,这我也没什么好说的,毕竟只是一个很小众的东西。可是这东西,如果真的要给人用的话,请写得详细一点,最好还配置一个图文教程,否则,这个东西永远都是小众的东西。
解决方案
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")
我是这样配置的:
首先,你要在你的 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 查看提交日志
我的建议
这个东西,估计不会有很多人玩得转。真的,要用org-page来写博客并且发表的话,要求挺高的,首先,你要懂 emacs 的一些基本操作,其次, git 的一些命令,你要玩得特别转,最后你还要会用
org-mode,当然不用很精通。最好的,你还要会点
elisp。
好吧,小白就别玩这种东西啦,去用
hexo吧!傻瓜化的配置。你只要安心写好你的
markdown就行了。
最后再给一个参考资料
关于org-page的配置参考了我的配置,然后参考了上面我给的链接,相信你应该能够配置出 org-page 啦!
最后要注意的地方
如何显示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
现在就可以了!
对于一个特定目录下面的文章,如何设置特定的属性?
这里看我的一段代码:;; 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))
为什么我写的博文没有被发布?
请自习检查,是否org文件的名字是中文,改成英文或者数字即可。上面,就是关于 org-page 的全部的故事啦!
相关文章推荐
- Intent
- 4. 对list进行sort
- ThinkPHP3.2.3 Nginx 下 URL_MODEL 的配置
- 深入理解java中的package关键字 http://blog.csdn.net/lindir/article/details/8067732
- CentOS搭建SVN服务器
- SetColumnInfo、GetRowInfo、RecalcLayout
- MVC5 Bundles发布到IIS失效问题解决方案
- 【基础技术】Java基础那些事儿系列-成员变量与局部变量
- 带dos调试窗口的win32程序
- 使用Python统计深圳市公租房申请人省份年龄统计
- 错误票库
- 出现error .so: undefined reference to 的解决办法
- nanomsg的使用与分析
- iOS Facebook 最新最简单快速分享方法
- React Native学习笔记-1:JSC profiler is not supported.
- ubuntu安装和使用appium遇到的问题解决方案
- spring类型自动转换——@InitBinder和Converter
- Maven-010-maven 编译报错:Failure to ... in ... was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced.
- Leetcode旅途一
- 平面凸包