前言
在這個月之前,我一直都是Vimmer
,可是VimScript
語法令人無語的混亂和棉花般的軟弱無力,讓我苦惱不已,可是工作學習卻對其頗多依賴,始終舍之不得。 然而,就在上個月,我無意瞥了一眼我那腫脹龐雜臭長不堪的.vimrc
,一眼…便失去了維護的信心,放棄Vim
,自然只能轉投Emacs
。 經過一個月的反覆折騰和深入研究後,我越加感受到神之編輯器的神聖魅力。種種以前感受到卻想不到、想得到而做不到的操作方式,一一呈現。
如此神器,有如神蹟!
既然長纓在手,自然要將之發揮至極至。恰逢最近打算用Jekyll
生成靜態站點上傳至Github
上搭建部落格,於是想到了Org-Mode
。
Jekyll 部署
可以參考Github Help
。
Jekyll
是一個將markdown
文件釋出成HTML
靜態站點的ruby
程式。Jekyll
部署是指本地部署,在本地搭建站點測試。
安裝
ruby
: version>=1.9.3
bundler
: ruby
的包管理器, gem install bundler
Jekyll
: 在site根目錄
下新增檔案Gemfile
,並輸入
source `https://rubygems.org`
gem `github-pages`
bundle install
執行
jekyll serve&
執行伺服器
通過 http://localhost:4000 訪問部落格
以後若部落格有改動,jekyll build
重新生成頁面即可。
目錄結構
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
才是王道。
上傳至 Github
在Github
上申請一個名為Username.github.io
的倉庫,然後將部落格站點目錄上傳。
然後訪問Username.github.io
,便可訪問主頁(首次上傳需要等二十多分鐘方能看到)。
注:Username
為你的 Github
帳戶名
SEO
Baidu
: 到 百度站長平臺 登記,並申請百度統計
,按其要求安裝程式碼,我的安裝程式碼放在_include/custom/baidu-analytics
,並安裝在 _include/theme/havee/default.html
底下
Ping服務
: See Blog傳送ping服務請求的Python實現
程式碼高亮
可用我寫的 _pygment-html.py 指令碼對org-mode
生成的html
檔案進行程式碼高亮,詳情可見博文: 用Python高亮org-mode程式碼塊
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
至最新版。
配置
對於Jekyll
而言,只能作用於_post
目錄中的markdown
檔案,若要用Org-Mode
,需要將org
檔案轉換成html
檔案。
又因為md檔案允許內嵌HTML
,因此便可利用Org-Mode
的HTML
釋出功能:
在站點目錄中新建_org
目錄,並在其下建三個子目錄:_assest
,_posts
,_drafts
加入我的配置檔案:init-org-jekyll.el,更改其中org-publish-project-alist
中的部份引數(將其中的目錄改成你自己的)
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
中
基本操作
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]]
-
-
字型
-
粗體: 夾在兩個
*
間 -
斜體: 夾在兩個
/
間 -
下劃線:夾在兩個
_
間 -
上下標:
^
或_{}
,{}
之間放文字,需要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 ^ 根據當前列排序,可以選擇排序方式 -
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
常用引數:
-
:exports result | code | both | none
-
:var varname=value 程式碼中可用的變數
-
:eval no-export | 不設定
-
:result output | value
有待深究
[ ] 圖片插入
[ ] 公式插入
[ ] SEO
[ ] 固定側欄Catorgories等
[ ] 新增跟隨頁面移動、可彈出的Table Of Contents
[ ] 尋找更好輸入法
[ ] 程式碼塊輸出html
顏色改進