Table of Contents
1 快速輸入 #+BEGIN_SRC … #+END_SRC
用org-mode寫文章的的時候,經常需要引用代碼片段或者程序輸出,這就需要輸入 #+BEGIN_SRC ... #+END_SRC
或者 #+BEGIN_EXAMPLE ... #+END_EXAMPLE
。輸入的次數多了,就會想辦法自動化,要么是用宏,要么是手工寫 elisp函數,要么是借助 yasnippets
或者 skeleton
框架來寫代碼片段(比如 Emacs中文網 就發過一篇 《GNU Emacs Org-mode 寫作的幾個快捷方式》 ,那是借助 skeleton 來實現的)。
但其實,org-mode已經內置了快速輸入的方法: 輸入 <s 再按TAB鍵 ,就會自動展開為 #+BEGIN_SRC ... #+END_SRC
。類似地,輸入 <e
再按TAB鍵,就會自動展開為 #+BEGIN_EXAMPLE ... #+END_EXAMPLE
。
參考:
2 代碼按語法高亮
org-mode在導出成HTML時,可以對代碼按照各自的語法進行高亮(只要在 #+begin_src
后面聲明的語言是emacs所 支持的,其實也就是對應的major mode存在,比如聲明為 #+begin_src js2
就要求 js2-mode
是存在的)。
但能不能在編輯的時候,就可以在org-mode里面看到語法高亮的效果呢?答案是肯定的!
(setq org-src-fontify-natively t)
不過沒有看到這個設置的更詳細說明(我也沒來看代碼),在org-mode的文檔中僅僅在Editing source code這一節 看到一句: To turn on native code fontification in the Org buffer, configure the variable org-src-fontify-natively. 另外,Pretty fontification of source code blocks這篇文檔里有效果圖:
3 導出成HTML時的一些問題和技巧
3.1 生成目錄表
如果想在導出成HTML時在文檔前面生成一個章節目錄表(Table of Contents),那么可以在文件頭部的 OPTIONS
里面添加 toc:t
參數
#+OPTIONS: toc:t ^:nil author:nil num:2
也可以設置 org-export-with-toc
這個變量
(setq org-export-with-toc t)
如果只想針對前面兩個級別生成目錄表,可以設置該值為相應的數字
#+OPTIONS: toc:2 ^:nil author:nil num:2
3.2 為每個分節的標題添加標號
導出成HTML時,如果不自定義css(這個高級話題留待下次再說),那么h1, h2, h3各個級別的標題只會字體大小有 點不同,不會呈現不同顏色,不會有縮進,於是閱讀起來各節之間的關系就搞不清楚了。可以設置 org-export-with-section-numbers
讓導出時為各章節的標題添加 1.2.3
這樣的
比如:
* header foobar
** header hello
** header welcome
* header hehe
some text here
** header haha
*** low level
導出時會變成:
1 header foobar 1.1 header hello 1.2 header welcome 2 header hehe some text here 2.1 header haha 2.1.1 low level
如果只想針對前面兩個級別生成分節號,可以設置該值為相應的數字。比如上面的例子如果設置 org-export-with-section-numbers
為 2
,導出時就變成了:
1 header foobar
1.1 header hello
1.2 header welcome
2 header hehe
some text here
2.1 header haha
*low level*
3.3 禁用下划線轉義
org-mode的文檔在導出到html時,有一個挺煩人的問題就是 abc_def
會變成 abcdef,這其實是一種類似TeX的 寫法,主要也就是在少數場景下有意義(其實與之相伴的還有一個 10^24
會變成 1024,不過這個對我影響不 大,因為我很少會用到這種寫法)。
關閉這個功能的方法是在org文件頭部的 OPTIONS
里面添加 ^:nil
:
#+OPTIONS: ^:nil
參考: Export settings - The Org Manual
上面的方法是針對當前文件的,如果想針對所有文件缺省關閉這個功能,需要在 ~/.emacs
中設置:
(setq-default org-use-sub-superscripts nil)
4 讓不同級別的標題采用不同大小的字體
我從vim轉到Emacs的其中一個原因是Emacs的GUI版本支持同時使用多種字體,比如上面的截圖中就可以看到標題采 用了較大的字體。而以前對Emacs不太熟悉時,試用 color-theme-tangotango 期間無意中發現它能讓 org-mode 的各種標題用不同大小的字體顯示,還以為是比較神奇的功能,而不願意切換到其他的theme去。
其實定制一下 org-level-1, org-level-2
等face的 height
屬性就可以了(不過如果你用了其它theme的話, 要在加載這些theme之后再執行一遍下面這些配置,或者你把它們放在 org-mode-hook
中去執行):
(set-face-attribute 'org-level-1 nil :height 1.6 :bold t) (set-face-attribute 'org-level-2 nil :height 1.4 :bold t) (set-face-attribute 'org-level-3 nil :height 1.2 :bold t)))
5 org-mode與CUA的兼容性問題
https://github.com/mlf176f2/org-cua-dwim.el
雖然我不喜歡 cua-mode
里面的 C-c, C-x, C-v 等鍵,但 cua-mode
里面的 shift 選中,cua rectangle這些功能我還是比較喜歡的,所以我默認還是打開 cua-mode
。
不過 org-mode
跟 cua-mode
不兼容,主要的問題是無法按住 Shift 來選擇文本了( <S-up> <S-home> <S-prior> S-M-b 等)。
安裝 org-cua-dwim 這個包即可解決這個問題。不過對於章節標題等特殊的地方,還是org-mode自己控制的。
6 兩個與中文相關的問題
6.1 不關閉中文輸入法,輸入章節標題里面的星號
頻繁打開/關閉輸入法還是挺翻的,比如在連續輸入章節或者列表項時,輸入章節前面的 * 或者 列表項 前面的 * 或者 - 號,都要先關閉輸入法,否則輸入的是 ×
和
不過可以用下面的方法解決:
(defun org-mode-my-init () ; ...... (define-key org-mode-map (kbd "×") (kbd "*")) (define-key org-mode-map (kbd "-") (kbd "-")) ) (add-hook 'org-mode-hook 'org-mode-my-init)
6.2 中英文字體混排時的表格對齊問題
org-mode的表格功能還是比較酷的,用起來相當方便(比較大的缺點是不支持跨列或者跨行合並單元格,甚至簡單 一點,表格的某一行實際兩行來存放內容(就是類似html編輯器里面那種單元格自動折行的顯示方式)也不行)。
對於中文用戶來說,最容易碰到的一個問題是一旦表格中同時有中英文的話,表格會無法對齊,中文比較少的時候 還好,只會有一點點錯位,但當中文比較多時,這個表格就亂成一團,沒法看了。
(本圖非本人制作,摘自: 讓中英混雜的orgmode table對齊)
這個問題困擾了很多人,大家也 折騰了各種方法。
首先是有人留意到,其實不僅僅是org-mode里面有問題,emacs本身在中英文混排時一個中文字符就跟兩個英文字符 不是同樣寬度的,除非有時碰巧了(比如當初我在Ubuntu下用Ubuntu Mono作為emacs默認字體時)。所以最開始我 一直在嘗試各種字體,看哪種可以解決這個問題——但一直沒有滿意的方案,在一個機器上試驗出來的結果在另外一 個系統上卻不好使。最后發現是搞錯了方向。
對於大部分的編輯器而言,我們只能選擇一種字體(比如寫代碼常用的DejaVu Sans Mono, Inconsolata, Consolas),但這個字體中可能僅包含英文字符(或者也包含了其它拉丁字符),但大部分情況下不包含CJK字符, 對這種情況下對CJK字符的顯示都是由系統來處理的,編輯器自己一般都不管。
不過Emacs畢竟是神的編輯器啊,它可以做到對不同體系的字符指定具體的字體,所以解決這個問題的辦法是: 針 對中英文指定不同大小的字體,英文用小字,中文用大字 (別問我為什么,我是沒去仔細研究。下面有一堆鏈接, 有興趣的自己去看吧)。
(set-default-font "DejaVu Sans Mono 10") (set-fontset-font "fontset-default" 'unicode"WenQuanYi Bitmap Song 12") ;;for linux (set-fontset-font "fontset-default" 'unicode "宋體 12") ;; for windows
在你的環境上,你可能得對針對自己喜歡的編程字體去試驗一下,看配哪個字號的中文字體(以及字號大小)可以 解決這個問題(或者可以試試下面的font.pl)。如果你還有日文、韓文什么的,可以詳細地針對各種charset設定 字體(而不是像上面籠統地用 'unicode 來制定),詳情請參看 折騰Emacs: 中文字體配置 | Emacs中文網。
參考:
- 懶惰的程序員: Big Chinese Small ASCII
- 懶惰的程序員 : 讓中英混雜的orgmode table對齊
- 折騰Emacs: 中文字體配置 | Emacs中文網
- http://jff.googlecode.com/svn/trunk/utils/font.pl 這個腳本可以在所安裝的字體中查找能對齊的中英文 字體及其字號,不過似乎只能在linux下跑,windows下不知道怎么搞
- Unicode Font Comparison: {Arial Unicode MS, DejaVu Sans, Lucida Sans Unicode}
- Best Unicode Fonts for Programing