用Org-Mode和Jekll写博客
该文章同时发布在我的github blog上:http://cheukyin.github.io/jekyll/emacs/2014-08/org2jekyll.html
1 前言
在这个月之前,我一直都是Vimmer,可是VimScript语法令人无语的混乱和棉花般的软弱无力,让我苦恼不已,可是工作学习却对其颇多依赖,始终舍之不得。 然而,就在上个月,我无意瞥了一眼我那肿胀庞杂臭长不堪的.vimrc,一眼…便失去了维护的信心,放弃Vim,自然只能转投Emacs。 经过一个月的反复折腾和深入研究后,我越加感受到神之编辑器的神圣魅力。种种以前感受到却想不到、想得到而做不到的操作方式,一一呈现。
如此神器,有如神迹!
既然长缨在手,自然要将之发挥至极至。恰逢最近打算用Jekyll生成静态站点上传至Github上搭建博客,于是想到了Org-Mode。
2 Jekyll部署
可以参考Github Help。
Jekyll 是一个将 markdown 文档发布成HTML静态站点的 ruby 程序。Jekyll部署是指本地部署,在本地搭建站点测试。
2.1 安装
ruby : version>=1.9.3
bundler : ruby的包管理器, gem install bundler
Jekyll : 在 site根目录 下添加文件 Gemfile ,并输入
source 'https://rubygems.org'
gem 'github-pages'
bundle install
2.2 运行
2.3 目录结构
Directory structure:
/home/**/Repo_Dir
├── ...Other files in Repo
├── assets(D)
│ ├── images(D)
│ └── themes(D)
├── atom.xml
├── config.rb
├── _config.yml
├── _includes(D)
│ ├── custom(D)
│ ├── JB(D)
│ └── themes(D)
├── index.html
├── _layouts(D)
│ ├── default.html
│ ├── page.html
│ └── post.html
├── _org(D)
│ ├── _drafts(D)
│ ├── assets(D)
│ └── _posts(D)
├── _plugins(D)
├── _posts(D)
├── robots.txt
├── rss.xml
├── _site(D)
├── sitemap.xml
(D) for Directory
_config.yml: 整个站点的配置文件,存放全局变量(如插件信息,CDN节点或者作者信息等),可通过liquid语言的site.XXX访问。_layouts: 存放页面布局模板_posts: 存放用markdown写就的博文_org: 存放利用org-mode写就的文章,利用emacs生成md文件发布至_posts目录,稍后会详细介绍。_includes: 存放页面插件,所谓插件,就是某段可重用的HTML或JS代码(如主题模板,评论界面等),利用{% include **/** %}可嵌入页面中_assets: 存放图片,主题CSS,JS等静态资源_plugins: 存放Jekyll插件,一般为Ruby脚本程序_index.html: 博客网站主页_site: 运行jekyll build生成的全部静态页面,最终产物
Jekyll 就是一个利用模板化生成HTML的程序,本身没什么好研究的,最多就是了解一下 liquid 语言,因为当中的自动化工作都是通过 liquid 实现的。博客搭建剩余的就是常规的前端工作,因此写好 CSS 和 JS 才是王道。
2.4 上传至Github
在Github上申请一个名为 Username.github.io 的仓库,然后将博客站点目录上传。
然后访问 Username.github.io ,便可访问主页(首次上传需要等二十多分钟方能看到)。
注: Username 为你的 Github 帐户名
2.5 SEO
Baidu: 到 百度站长平台 登记,并申请百度统计,按其要求安装代码,我的安装代码放在_include/custom/baidu-analytics,并安装在_include/theme/havee/default.html底下- Ping服务: See Blog发送ping服务请求的Python实现
2.6 代码高亮
可用我写的_pygment-html.py 脚本对 org-mode 生成的 html 文件进行代码高亮,详情可见博文: 用Python高亮org-mode代码块
3 Org-Mode
本来 Jekyll 是利用 markdown 书写博客的,不过个人不太熟悉这种语言,而且其功能也过于简洁,不能适应技术博客各种特殊需要,因此我选择 Org-Mode 。
Org-Mode 是 Emacs 的一种编辑模式,有着各种各样强大到无法想像、令人感动到cry的功能,尤适于写文章和做笔记,总之就是 where miracle happens 啦。
以下讲解基于 Org-Mode 8.2 , 可以在 emacs 中 M-x org-version 检查版本, Ubuntu 可以通过 apt-get 更新Org-Mode 至最新版。
3.1 配置
对于Jekyll而言,只能作用于 _post 目录中的 markdown 文件,若要用 Org-Mode ,需要将 org 文件转换成 html 文件。又因为md文件允许内嵌HTML,因此便可利用Org-Mode的HTML发布功能:
- 在站点目录中新建
_org目录,并在其下建三个子目录:_assest,_posts,_drafts - 加入我的配置文件:init-org-jekyll.el ,更改其中
org-publish-project-alist中的部份参数(将其中的目录改成你自己的)
3.2 WorkFlow
- 打开
Emacs,M-x jekyll-draft-post,按提示输入标题,Emacs便会在_org/_drafts中新建该文件,在_org/_drafts中编辑的文件不会被发布。 - 当文章写好后,
M-x jekyll-publish-post,Emacs便会将文章转移至_org/_posts中 M-x org-publish,选择jekyll-cheukyin-github-io(取决于你配置中改的名字),Emacs会将_org/_posts中的所有org文件转换成md文件并存于_posts中,并把_org/_assest中图片等静态资源全部复制至_assest中
3.3 基本操作
Org-Mode 也算是一种标记语言,旨在分离文字的结构和表现,写作时只需把注意力放在内容上。它用一系列的标号来标识文字的分级等,至于每层文字的样式则交由 CSS 管理。
- 标题: 输入
*,有几个*,代表几级标题 - 段落: 按一次
Enter,发布时只有一个空格,按两次Enter才算重新开一段 - 内部post链接:如我要链接到
2014-08-04-ping-service.html这篇文章,则这样写@@html:<a href="{% post_url 2014-08-04-ping-service %}">@@Blog发送ping服务请求的Python实现@@html:</a>@@ - Anchor
- 添加Anchor
<<anchor>>
- 链接到anchor
[[anchor]]
- 添加Anchor
- 字体
- 粗体: 夹在两个
*间 - 斜体: 夹在两个
/间 - 下划线: 夹在两个
_间 - 上下标:
^或_{},{}之间放文字,需要M-x customize-variable,将org-use-sub-superscript设成{} - 强调: 夹在两个
~或两个=之间,发布成HTML时会转换成<code></code>
- 粗体: 夹在两个
- 列表
- 无序列表以
-、+或者开头 - 有序列表以
1.或者1)开头 - 描述列表用
::
- 无序列表以
- 表格
- 建立和操作: 在某一行顶格的位置输入
|,然后输入表格第一行第一列的内容,再输入| - 标题: #+CAPTION: 表格的标题
- 列长限制,如下面,将列长限制为6
| | <6> |
| 1 | one |
| 2 | two |
| 3 | This=> |
| 4 | four | - 计算:如一张3*3表格,在第二行第三列中输入
=$1*$2。$1和$2表示第一列和第二列,C-u C-c C-c强制org-mode为整个表格进行计算,若只希望在某一特定项上进行计算,可在等号前再加一个:
- 建立和操作: 在某一行顶格的位置输入
- 快捷键
- 缩进:
C-q TAB - 链接:
C-c C-l - 折叠
S-TAB 循环切换整个文档的大纲状态 TAB 循环切换光标所在的大纲状态 - 大纲或者列表之间移动
C-c C-n/p 移动到下上一个标题(不断标题是哪一级) C-c C-f/b 移动到同一级别的下/上标题 C-c C-u 跳到上一级标题 C-c C-j 切换到大纲预览状态 - 基于大纲/标题的编辑
M-RET 插入一个同级别的标题 M-S-RET 插入一个同级别的TODO标题 M-LEFT/RIGHT 将当前标题升/降级 M-S-LEFT/RIGHT 将子树升/降级 M-S-UP/DOWN 将子树上/下移动 C-c * 将本行设为标题或者正文 C-c C-w 将子树或者区域移动到另一个标题处(跨缓冲区) C-c C-x b 在新缓冲区显示当前分支 C-c / 只列出包含搜索结果的大纲,并高亮,支持多种搜索方式 - or + 更改列表序号样式 - 表格
- 整体区域
C-c 竖线 创建或者转化成表格 C-c C-c 调整表格,不移动光标,并计算公式 TAB 移动到下一区域,必要时新建一行 S-TAB 移动到上一区域 RET 移动到下一行,必要时新建一行 - 编辑行和列
M-LEFT/RIGHT 移动列 M-UP/DOWN 移动行 M-S-LEFT/RIGHT 删除/插入列 M-S-UP/DOWN 删除/插入行 C-c - 添加水平分割线 C-c RET 添加水平分割线并跳到下一行 C-c ^ 根据当前列排序,可以选择排序方式
- 整体区域
- 缩进:
3.4 Org-Babel
Babel ,即巴别塔,圣经所载,巴别塔若要完工,需各种语言互通。因此, Org-Babel 的作用便在于是各种编程语言和谐协调地运作于同一篇文档中,即 Literate Programming (文学化编程)。
Org-babel 的工作方式很简单,在 Org-Mode 中嵌入相应语言的代码,然后 C-c C-c ,Emacs便会调用相关的interpreter执行代码,并按照用户要求的格式生成结果,而且不同语言的代码的执行结果可以互为输入,实是写报告、写文档、居家旅行、杀人放火的必备良方。
因此,上帝禁止巴别塔建成了,在Org-Mode里!
就如上文的目录结构图便是在博文的org文件中嵌入 shell 命令 tree ,指定发布html是只输出结果而得到的。
#+BEGIN_SRC sh :results output :eval no-export :exports result
echo "Directory structure:"
tree -L 2 ~/Cheukyin.github.io
#+END_SRC
Org-babel支持的语言可以在 /usr/share/emacs/site-lisp/org-mode/ob-* 下看到。
想要添加语言,可以修改变量 org-babel-load-languages
常用参数:
:exportsresult | code | both | none:varvarname=value 代码中可用的变量:evalno-export | 不设置:resultoutput | value
4 有待深究
[ ]图片插入[ ]公式插入[ ]SEO[ ]固定侧栏Catorgories等[ ]添加跟随页面移动、可弹出的Table Of Contents[ ]寻找更好输入法[ ]代码块输出html颜色改进
用Org-Mode和Jekll写博客的更多相关文章
- 新功能发布!Markdown写博客!
有一种神奇的语言,它比html还简单,它巧妙地将内容与格式整合在一起--它就是Markdown. 现在我们实现了博客对Markdown的内置支持,可以让您轻松地在园子里用这个神奇的语言写博客! &qu ...
- 第一次写博客Poj1044
Date bugs Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3005 Accepted: 889 Descript ...
- (转)[BetterExplained]为什么你应该(从现在开始就)写博客
(一)为什么你应该(从现在开始就)写博客 用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处.(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太的个例来反驳抽烟对健康的极 ...
- 推荐几款自己写博客使用的Ubuntu软件
使用Ubuntu桌面有段时间,到现在也写过几篇博客了,期间用到的几款好用的软件推荐给大家.1. 图片简单编辑软件gthumbubuntu默认提供shotwell查看图片,类似与windows的图片查看 ...
- QQ表情动图,增加写博客的乐趣
QQ表情动图,增加写博客的乐趣 body{margin:0px;}
- 如果简单的记录,就可以为这个世界创造更多的财富,那么还有什么理由不去写博客呢? — 读<<黑客与画家>> 有感
上一次博文发文时间是2016.1.15,7个月已经过去了.最近读了一本<>的书,对我触动挺大的!里面有关于技术趋势的探讨,也有关于人生和财富的思考! 开始更新iOS122的文章的初衷是,聚 ...
- 好久没有写博客了,发现Live Writer也更新了
最近由于工作变动,工作内容和心态也有所变化,所以很久没有写博客了,而且我的开源项目深蓝词库转换也很近没有更新了.今天打开LiveWriter发现居然有新版本,于是果断更新.现在新的LiveWriter ...
- 150922-写写博客监督下不自觉的自己-PPT,Linux,HTML
开始学PHP的日子里,总是懒散的有一天没一天的.无意间听闻写博客来展示代码(现在还远远做不到哇),来监督个人每天的学习进度,鉴于自己还是爱写一点文字,但愿可以坚持下去. 凡是都喜欢有个计划,骨子里的理 ...
- 第一次尝试用 Live Writer 写博客
之前在官网上下载了最新版的Windows Live Writer,可是安装不了,就在其他网站下了一个试试,可以安装,不过却是2009年的版本,很不喜欢,我希望能体验最新版的,回头还得重新下个最新版的安 ...
随机推荐
- Operfire/XMPP
Operfire/XMPP 关于Openfire.XMPP协议.IM相关知识 基于开源 Openfire 聊天服务器 - 开发聊天记录插件 posted @ 2013-03-29 11:03 hooj ...
- bash手册 之重定向原理与实现
http://www.gnu.org/software/bash/manual/bashref.html#Redirections http://www.cnblogs.com/weidagang20 ...
- 使用Broadcast实现android组件之间的通信 分类: android 学习笔记 2015-07-09 14:16 110人阅读 评论(0) 收藏
android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...
- POSIX字符类型
[:alnum:] 字母与数字 [:alpha:] 字母 [:blank:] 空格与制表符 [:cntrl:] 控制字符 [:digit:] 数字 [:graph:] 可打印的与可见的(不包括空格)字 ...
- Java SE (1)之 JFrame 组件 GridLayout布局
package com.sunzhiyan; import java.awt.*; import javax.swing.*; public class Demo_2 extends JFrame{ ...
- MVC 中的Areas支持
在ASP.NET MVC 2中对于Area功能的增强,这样的增强是如何在同一个项目中更好地组织应用程序的? ASP.NET MVC 1.0时,如果我们要在一个项目中做自己网站的后台应用,而又保持URL ...
- (转)C# NameValueCollection集合
1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCollectionBase 不同,该类在一个键下存储多个字符 ...
- java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
在使用Fragment的过程中,常常会遇到在Activity的onSaveInstanceState方法调用之后,操作commit或者popBackStack而导致的crash. 因为在onSaveI ...
- js跨浏览器事件对象、事件处理程序
项目中有时候会不用jquery这么好用的框架,需要自己封装一些事件对象和事件处理程序,像封装AJAX那样:这里面考虑最多的还是浏览器的兼容问题,原生js封装如下:var EventUtil={ //节 ...
- .Net下的MSMQ(微软消息队列)的同步异步调用
一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具.消息队列 和电子邮件有着很多相似处,他们都包含多个属性, ...