Yihulee's world!

========>易燃又美味!

关于org-page的配置

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 主机上去配置,居然一次就成功了,真够神奇的。然后又跑到自己的 win7ubuntu 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命令是中文的,而作者的代码比对的是英文的结果,自然会出错。 git-chinese.jpg

  所以我立马把 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 包: install-org-page.png

  点击安装: install-org-page-2.png

  安装完成后,你要进行一些配置,下面是我的关于 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-init.png

   .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的配置

  参考了我的配置,然后参考了上面我给的链接,相信你应该能够配置出 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 的全部的故事啦!

Comments