您的位置:首页 > 其它

关于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 主机上去配置,居然一次就成功了,真够神奇的。然后又跑到自己的 win7ubuntu 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 的全部的故事啦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: