Posted on 02-03-2015
Filed Under (技术) by waterlin

今天看到 org2blog 有最新版本,就更新了一下,然后在使用 org2blog 的时候,就提示说需要升级到 orgmode 8.x 版本。于是我从源里安装了最新的 orgmode,可是依然提示这个 orgmode 版本不对的问题。我用的是 Emacs 24.3 版本(里面自带是 7.x orgmode 版本),于是我下了一个最新的 Emacs 24.4 版本(里面自带的是 org mode 8.2.10 版本),这时再使用 org2blog,则提示如下错误:

File error: Cannot open load file, org-publish

仔细找了一找,原来是 org mode 升到到 8.x 版本后,有大量的函数或是变量名称被修改了,从而导致原来适用于 orgmode 7.x 版本的配置文件需要进行修改。在我的配置文件里,主要存在以下几种修改:

1. 针对 org-publish 函数的修改

如果你的 org 配置文件提示如下错误(针对 Emacs 24.3):

File error: Cannot open load file, org-publish

或是如下错误(针对 Emacs 24.4):

File error: Cannot open load file, no such file or directory, org-publish

则你需要把代码里的

(require 'org-publish)

修改为

(require 'ox-publish)

2. org-publish-org-to-html 函数的修改

如果你和我一样,使用 org mode 来导出笔记为 html 文档以方便阅读,则在升级到 orgmode 8.x 后用 M-x org-publish-current-project 来发布当前工程时,一定会碰到类似下面的错误:

Debugger entered--Lisp error: (void-function org-publish-org-to-html)

这时,记得把配置文件里的 org-publish-org-to-html 这个函数修改为 org-html-publish-to-html 这个新函数名称。

如果你需要把 org 文件发布成 LaTeX,同样也有类似的函数需要更新。

3. 在配置文件里内置 style 的修改

如果你和我一样,为了方便,让生成的本地 html 文件使用了 :style 关键字来指定 html 的样式,则需要把 :style 修改为 :html-head

To specify a style for the project :style keyword changes to :html-head

4. 吐槽

Emacs 界是不是从来不关心向下兼容的问题?起码我感觉我经常在升级的过程中,碰到一些莫名其妙的配置文件错误。

(0) Comments    Read More   
Posted on 11-04-2014
Filed Under (技术) by waterlin

经常在 Putty 里连到服务器写代码,不像其他大多数人使用 Vi/Vim 来编辑文件,我使用 Emacs。这样问题就来了,一来现在的 Linux 发行版默认都不带 Emacs,除了安装需要耗费时间以外,emacs 这个命令使用起来过长,并且 Emacs 的配置文件如果一大,Emacs 的启动速度还是受一点影响,另外,默认的 Emacs 配色在 Putty 下也是有一点问题的。

总之,Emacs 如果想在 Putty 下使用得爽的话,还得做一番配置。今天就简单分享一下我自己在 Putty 里使用 Emacs 时做的一些最基本的配置,希望能对 Emacs 新手有帮助。

Putty 下配置 Emacs 小缓冲区 (minibuffer)的颜色

默认情况下,在 Putty 里使用 Emacs,当在 minibuffer 里有系统提示信息时,会显示深蓝色,这和黑色背景显然是不搭配的,导致提示信息看不清楚。我们肯定不会把 Putty 的黑色背景改变成浅颜色的,不然用起来多难受呀。我们只有修改一下 minibuffer 的颜色了:

(set-face-foreground 'minibuffer-prompt "white")

这样就解决了撞色的问题。

Putty 下快速简便地启动 Emacs

终端或是 Putty 下,不喜欢反复开启或是关闭 Emacs,这个时候,可以开启 Emacs Server,并且使用 emacsclient 来把文件发送到 Emacs Server 从而实现编辑文件,当关闭了该文件后, emacsclient 才会返回,让命令行得以继续编辑。

什么,这样还是太麻烦,还有更简单的办法吗?这时可以使用 Emacs daemon

Emacs daemon 就是为了这个而诞生的。它将 Emacs 变成了一个 C/S 模型——只需要启动一个服务器在后台作为守护进程(daemon)跑着,之后启动的每个 emacs 都是一个客户端,它连接上服务器进行工作。这样一来,只要在启动服务器时运行初始化脚本,客户端启动无需运行脚本,实现启动时间从 Firefox 到 Chrome 的转变。

先用命令把 Emacs Server 跑起来:

emacs -daemon

以后在需要编辑文件的地方,直接可以用 emacsclient 来快速打开文件了:

emacsclient test.c

如果你觉得 emacsclient 太长的话,可以给这个命令设置一个别名。然后我们编辑 ~/.bashrc 文件,添加如下内容:

#use ec as alias for emacs client
alias ec='emacsclient -t -a ""'

#use emacs as default editor
export EDITOR="ec"

以后就可以用 ec 命令来编辑文件了,同样也不用先手动启动 emacs server。

当然,如果你是经常使用 ssh 来远程登陆主机,那还是需要在 .bash_profile 里加上这么一条

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

这样的话,当你 ssh 登陆主机的时候,.bashrc 里的设置才会被引导,ec 这个命令才能代表 emacsclient。

有些人可能对 .bashrc 和 .bash_profile 的区别不是太理解,可以看看这篇文章

给你的 elisp 文件建立一个代码库

相信大家肯定是要在很多台服务器上工作,比如说生产环境、测试环境、虚拟机等等,这些机器可能是不相通的。这个时候,你要在上面使用 Emacs,没有配置文件可怎么办?有一个办法很简单地解决了这个问题,那就是找一个代码版本管理库,比如说 GitHub 或是 Bitbucket,把你的 Emacs 配置文件放在自己的代码库里,到了一台服务器上,就从里面 clone 一份 elisp 配置出来。

一般来说,你可以把你的 elisp 主配置文件放在一个名叫 common.el 的文件里,然后你可以在 .emacs 里写上 load-file 来引导真正的 emacs 配置。通过这种方式,你到了一台新机器上,只需要把 elisp 代码 clone 下来,然后引导这个目录里的 common.el 文件即可。

因为是在服务器上写东西,自然最好不要把一些和代码编辑不相关的配置放到这个代码库里,比如说 org mode 的配置等。还是专心写代码吧!

一些杂项

  1. 终端下打开 Emacs 菜单:F10 或是命令 M-x menu-bar-open;
  2. 在 Emacs 里写东西的时候,想查一下 shell 里的东西,这时可以不用退出 Emacs 而直接用 eshell,只用 M-x eshell <RET> 就可以启动,功能整合了操作系统自带的终端,退出 eshell 可以输入 exit <RET> 也可以 kill-buffer。

(0) Comments    Read More   
Posted on 06-03-2014
Filed Under (技术) by waterlin

如果本地系统的语言区域(locale )是非英文系统,Org Mode 标记条目为 DONE 时记上时间戳会显示为如下式样:

CLOSED: [2014-03-06 周四 10:38]

其中的中文字样“周四”看起来特别别扭,要知道,在生成一些纯英文的页面时,还是使用纯英文来得有味道,再一个时间戳这种东西,还是统一用英文处理比较好。

只要在 .emacs 文件里使用

(setq system-time-locale "C")

就可以使得上述时间戳变为

[2014-03-06 Thu 10:47]

这样的全英文字样。

(0) Comments    Read More   
Posted on 06-03-2014
Filed Under (技术) by waterlin

不重启 Emacs 让 .emacs 新修改的内容生效,有四个函数可以做到:

  1. M-x eval-last-sexp 使当前 elisp 配置中光标前的那一条语句立刻生效;
  2. M-x eval-region 使当前 elisp 配置中选中的 region 中的语句立刻生效;
  3. M-x eval-buffer 使当前的 buffer 中的设置语句立刻生效;
  4. M-x load-file ~/.emacs 载入 .emacs 文件,从而使其中的设置生效,要生效其它 elisp 文件只需要把 .emacs 文件名换成其它的即可。
(0) Comments    Read More   
Posted on 20-02-2014
Filed Under (技术) by waterlin

自从有了 Evernote 这个东西后,经常把网上看到的文章、图片以及一些自己的想法一股脑扔到 Evernote 里。Evernote 里的东西越来越多,也越来越有价值,变得越来越像一个数据仓库了。那么,如何使用这些数据、如何有效地找到这些数据,就成了一个迫切需要解决的问题。

我是 Emacs 的重度使用者,并且最喜欢使用 Org Mode 来写笔记,喜欢在合适的时候会把 org 文件全转为 html 以便阅读。那么,我自然非常希望能在 Org Mode 里直接链接 Evernote 里的文章。Evernote 支持 URL Protocol,可以在浏览器里直接通过 Evernote 打开内部链接,那 Emacs 是否也可以这样做呢?我们稍微试验一下就知道了。

比如说,有一个 Evernote 的内部链接:

evernote:///view/52572/s1/6e53e0ed-272a-4ec9-89c7-f636b16d6a3c/6e53e0ed-272a-4ec9-89c7-f636b16d6a3c/

我按照 Org Mode 的方式,写一个链接出来:

[[evernote:///view/52572/s1/6e53e0ed-272a-4ec9-89c7-f636b16d6a3c/6e53e0ed-272a-4ec9-89c7-f636b16d6a3c/][Som Evernote note title]]

我希望这个链接,在 org 源代码(即你在 Emacs 编辑 org 文件时)里,可以直接用鼠标一点就通过 Evernote 打开该内部链接、跳转到相对应的文章;或是,在把 org 文件转成 html 文件时,同样保留这个链接的形式,以方便浏览器直接通过生成的链接、发送给 Evernote 来打开这篇文章。

现在来看看 Emacs 默认配置下的结果:

  1. 在 org 文件里用鼠标点击该 evernote:/// 链接,无效;
  2. 把 org 文件转成 html 文件后,该链接变成了如下奇怪的形式:
    index.html#evernote-view/52572/s1/6e53e0ed-272a-4ec9-89c7-f636b16d6a3c/6e53e0ed-272a-4ec9-89c7-f636b16d6a3c
    

    evernote:///view 被 Org Mode 转义成了 evernote-view。

看来结果不尽如人意,我们需要解决两个问题。

对于第一个问题,我们可以让 Emacs 把 evernote:/// 链接直接发送给操作系统来处理:

(defun org-pass-link-to-system (link)
  (if (string-match "^[a-zA-Z0-9]+:" link)
     (browse-url link)
    nil)
  )

(add-hook 'org-open-link-functions 'org-pass-link-to-system)

对于第二个问题,我们可以让 org-add-link-type 不转义 evernote 的链接

(require 'org)
(org-add-link-type "evernote" nil '(lambda (path desc frmt)
      (format "<a href=\"evernote:%s\">%s</a>" path desc)))

这样,在把 org 转成 html 文件时, evernote:/// 这样的链接就会原封不动的保存起来。

就这样,我在 Evernote 里汇总别人的笔记,但是依然在 Emacs Org 里记录自己的笔记,并且在 Emacs Org Mode 里链接别人的笔记。对于一些特别有价值的文章,我会把这些信息收录到 Evernote 里,在必要的时候,通过 Emacs 链接 Evernote 的内部链接来作为检索的依据,这样一来,在上不了网或是网页被作者下线后资料无从检索的时候,就再也不用烦恼了。

这样,我就搭建了一个完美的笔记生态系统!工欲善其事,必行利其器,说的就是这个道理。

(0) Comments    Read More   
Posted on 17-02-2014
Filed Under (技术) by waterlin

当用 Org Mode 写的笔记一多,要寻找相关的内容花的时间也就越多,这个时候,很有必要建立一个索引或是导航条,这样才像全功能版本的 wiki 嘛。

要建立这样的索引有两种方法。

第一种,用站点地图的方法。

把下面的代码添加到你的 project 配置文件里:

:auto-sitemap t
:sitemap-filename "sitemap.org"  ; ... call it sitemap.org ...
:sitemap-title "Sitemap"         ; ... with title 'Sitemap'.

然后每次发布这个工程的时候,就会生成一个 sitemap.org 的文件,这个文件会递归地遍历你工程里的所有文件并生成链接,并会生成一个名叫 sitemap.html 的文件。

然后,我们只要在我们的 index.org 里 include 这个文件即可:

#+INCLUDE: sitemap.org

这样我们就再也不用手动添加页面的索引链接了。

或者,我们可以在每个页面的页脚里把这个 sitemap.org 的链接给加上,方便随手访问这个索引。

第二种,生成导航条。

当然,我们或许更喜欢在各个单独页面阅读的时候,有一个导航条可以很方便地回到上级目录、主页目录或是其它的导航链接等。

通过 org-info.js 这个脚本,我们可以把一个页面拆分成好几个部分,有点像翻书一样了,不过这个功能需要借助 org-info.js 功能。

小结

如果对于自己的笔记,采用第一种方法更好,方便搜索、配置也简单。如果是给别人用,可以用第二种方法,免得一次性把太多的内容推给别人看,吓到别人。

(0) Comments    Read More   
Posted on 14-02-2014
Filed Under (技术) by waterlin

习惯了用 Org Mode 来写笔记,然后直接发布成网页,倒也是一件快事。用 Emacs 来写东西,爽手;用 Org Mode 来发布成网页,利索;再给这个网页配配色,美观。现在一些长一点的笔记或是经验总结,我倒是喜欢直接用 Org Mode 来发布到我的静态网站上。

如果 Org Mode 工程里,有一些文件,不希望发布成 html 页面;或者说,有一些是配置文件、网页的头文件或是页脚文件,只需要在 Org Mode 工程里使用(用 include 就可以把一些重复出现的内容写成单独的 org 文件),但是却没必要发布成网页。也就是说,你不想把它们上传到服务器或是根本不需要发布它们。

Org Mode 很好地考虑到了这个问题,在配置 Org Mode 工程时,就可以直接使用 :exclude 这个选项来指定哪些文件不用发布。

这里需要特别说明的是,:exclude 使用的是正则表达式,并且你在这里填写文件名称时,不需要指定路径,仅仅需要指定文件名即可。

比如,在我的工程里,有如下几个文件,是纯粹作为配置来使用的:

./addon/header.org
./addon/setup.org
./addon/footer.org

从这几个文件名,大概也能看出来它们的用处。对于这几个文件,我不需要发布它们,这时,我可以在我的 org-publish-project-alist 配置里,填上这么一行:

:exclude "footer.org\\|header.org\\|setup.org"   ;; regexp

这样,我就可以在发布工程的时候,得到一个非常干净整洁的网页工程,不带一点不需要的文件!在把这些文件上传到服务器后,再也不用担心有人会误访问到这些对用户来说无用的文件了。

(0) Comments    Read More   
Posted on 13-02-2014
Filed Under (技术) by waterlin

Org Mode 里把条目标记成 DONE 时如果需要同时记录时间状态,可以有两种方法:

  1. 设置全局的变量,使得标记条目为 DONE 时把时间戳也记录上。
    (setq org-log-done 'time)
    (setq org-log-done 'note)
    

    用上述代码可以标记上时间,还可以写上备忘录。

  2. 第 1 种方法会对所有的 org 文件产生影响,所以我们也可以针对单独的文件进行设置,在文件开头写上这样一段声明:
    #+STARTUP: logdone lognotedone
    

    上述代码产生的效果和第 1 种方法里的代码一样,不过作用范围仅限本文件。

这两种方式个人觉得用后一种方式比较好。

(0) Comments    Read More   
Posted on 08-02-2014
Filed Under (技术) by waterlin

最近发现,Emacs Org Mode 配置好的静态网页生成工程,已经没有办法自动生成 sitemap.html 文件了。众所周知,sitemap.html 文件是为了方便搜索引擎检索,并且对于 Org Mode 生成静态网页的工程来说也是十分重要的,保不准哪天文件一多你就记不得你的工程里都有一些啥文件了。

我原来的工程,是按照 Publishing Org-mode files to HTML 使用如下 elisp 配置来定义自动生成 sitemap.html 文件的:

:auto-index t
:index-filename "sitemap.org"
:index-title "Sitemap"

根据最新的 Org Mode 文档 Generating a sitemap ,我应该使用如下 elisp 配置文件:

:auto-sitemap t
:sitemap-filename "sitemap.org"  ; ... call it sitemap.org ...
:sitemap-title "Sitemap"         ; ... with title 'Sitemap'.

从旧版本的 Org Mode 升级的用户可能需要注意一点,有可能是 Publishing Org-mode files to HTML 的文档没有及时更新。

(0) Comments    Read More   
Posted on 07-12-2013
Filed Under (技术) by waterlin

在 Org 建立的网页工程里,经常需要建立内部链接,即类似于 Wiki 的内部跳转链接,否则你建立这个知识库使用起来就太不方便了!虽然我们可以用锚链来给文章打上永久的链接,但是这个功能在文章中各级标题里使用不是太友好。另外,在默认情况下标题的链接依然不是太方便,因为Org Mode 默认情况下生成的标题链接,是如下形式:

#sec-2.2

如果你使用这种链接方式,你的文章或本地 Org Mode 工程文件有进行修改,尤其是对标题顺序或是数量作了调整,那你之前的链接则会失效,因为 #sec-2.2 有可能会变成 #sec-2.3 或是 #sec-1.5。

在这种情况下,最佳的解决办法,就是使用永久链接。

我们可以通过 CUSTOM_ID 的功能来实现给标题添加永久链接,形式如下:

* Headline
  :PROPERTIES:
  :CUSTOM_ID: myID
  :END:

这样发布成网页的时候,Org 网页工程里文章的各级标题就有指定名称的固定链接了。

另外,如果你觉得输入上面这一长串的字符太麻烦的话,你还可以用 YASnippet 来更快捷的方式插入及补全。

另外,Org Mode的锚链和文章各级标题还有一些区别:锚链适合用于文章中间的任何地方,而标题的自定义链接则只可以使用在标题里。

(0) Comments    Read More