在用 Emacs Muse 或 Org 来写文档的时候,经常需要用到内部链接,尤其是要链接到某一章节,这个时候,启用固定的锚链接是最合适的方法。
经常需要内部链接 Emacs Muse 写的文档,即链接一个锚链接,可以用下面的方法设置一个锚链接:
#Open-Ubuntu-ssh
把上面这个语句放到文档的任意地方,然后,在 Muse 文档里直接用下面的方式即可生成锚链接:
[[test.html#Open-Ubuntu-ssh][test anchor link]]
当然,如果你要链接其它文件的锚链接,则要加上相应的文件名。
Emacs Org Mode 也可以方便地实现文档内部的锚链接功能,与 Muse 类似,用下面的语句就可以生成相应的锚链接:
# <<My Target>>
把上面这句话放到文档的任意地方,即可设置文档的锚连接。至于目标链接的形式,和普通链接一样。
Org Mode 比 Muse Mode 设计得更好的地方在于:如果你没有用形如 # My Target 的方式来设置锚链接,并且你依然采用了锚链接的形式来生成一个链接,则 Org 会自动根据你文档的子标题关键字来寻找最接近的锚链接(当然,这个方法对中文标题来讲,会麻烦一些吧?)。
今天在写《Emacs Org Mode 与 BibTeX 的结合》这篇笔记的时候,有一段如下的东西要放到文章里:
#+TODO: TODO(t) STARTED(s) | DONE(d) DEFERRED(f) REFTEX
结果我忘记在前面空格,导致我一用 C-c C-t 来设置 Org 笔记状态的时候,Emacs 只显示上面这几种状态。
害得我把今天在 .emacs 里新加的设置全部取消来找原因,折腾了很久,无果。最后碰巧发现是这句的问题,真是郁闷死了!
所以,以后用 Org Mode 写东西,注意放在 block 里的内容,最好都空格而不是顶格写。
我在多台电脑上使用 Emacs,同时也开启了 Desktop 功能,可是我并不想让所有电脑的 .emacs.desktop 存储的是同一批文件,这样我可以在不同的电脑上有针对性地干不同的事情。因此,我琢磨着,怎么在用 Dropbox 同步 Emacs 文件的时候,并不同步 .emacs.desktop 文件。
总的来说,可以有几种方法来设置这个 .emacs.desktop 的相关信息:
通过使用命令 M-x customize-group RET desktop 可以配置 desktop 的相关属性,即打开 desktop 组的设置选项进行相关设置。
(setq desktop-path '("~/.emacs.d/")) (setq desktop-dirname "~/.emacs.d/") (setq desktop-base-file-name ".emacs-desktop")
因为我用 Dropbox 在多台电脑里同步 Emacs 配置文件,所以采用的是第2种方法,这样各台机的配置就不会相互影响了。如果你需要针对不同的机器设置不同的参数,可以参考多台电脑间同步 Emacs 配置文件的方法,针对不同的机器使用不同的参数进行配置;如果设置项太多,还可以写成一个函数重复调用。
Emacs Org Mode 可以是一个优秀的笔记工具,可是,如果你想用它来写正式一点的论文,可以吗?当然可以了,你可以把 Org Mode 和 LaTeX 结合起来用,当然最重要的是要解决参考文献引用的问题。
整体的思路如下:
可以用 Emacs BibTeX Mode 或 JabRef 之类的方式来生成这个文件,当然也可以用其它文献管理工具,只要它能导出 BibTeX 文件即可。
创建 Org 工程的时候,和一般的工程没有任何区别。
在这里,重点介绍一下第三个步骤,即如何在 Org Mode 里插入 BibTeX 记录。从官方的这篇参考文献里可以看出,我们可以用三种方法在 org 文件里引用 BibTeX 参考文献,从而插入 LaTeX 类的参考文献。
1). 最简单的办法,给所有的 Org 文件指定一个 BibTeX 文件,然后在 Org 文件里插入该 BibTeX 文件的参考文献记录
具体的办法,先把下面的代码放到 .emacs 里:
(setq reftex-default-bibliography
(quote
("default.bib" "~/org/notes/refer.bib")))
(define-key org-mode-map (kbd "C-c )") 'reftex-citation)
在这里,我指定的 BibTeX 文件为 default.bib 和 ~/org/notes/refer.bib 。然后,可以在所有的 Org 文件里,通过命令 C-c ) 或 M-x reftex-citation 来进行参考文献的插入,根据提示进行相关操作即可。
2). 为特定的 Org 文件,指定特定的 BibTeX 文件
这个方法是 Marios Braindump 的博客里介绍的,具体方法如下:
先把下面的代码放到 .emacs 里:
(defun org-mode-reftex-setup () (load-library "reftex") (and (buffer-file-name) (file-exists-p (buffer-file-name)) (reftex-parse-all)) (define-key org-mode-map (kbd "C-c )") 'reftex-citation)) (add-hook 'org-mode-hook 'org-mode-reftex-setup)
然后在你需要插入 BibTeX 参考文献的 Org 文件里,加入下面这段话(可以是任意位置):
\bibliographystyle{plain} \bibliography{BIB-NAME}
把上面的 BIB-NAME 换成你想指定的 BibTeX 文件,这样就可以对该 Org 文件指定特定的 BibTeX 文件,然后可以用 C-c ) 或 M-x reftex-citation 来插入该 BibTeX 文件里的参考文献。
上面的代码会在 Emacs 启动的时候,要求你指定一个 master 文件,用来存储生成的 tex 文件。
3). 另外一种方法,实现为特定的 Org 文件指定特定 BibTeX 文件的功能
还有另外一种方法,可以实现第2种方法类似的功能,即为特定 Org 文件指定特定 BibTeX 文件的方法。把下面的代码放到 .emacs 文件里:
(defun org-mode-article-modes () (reftex-mode t) (and (buffer-file-name) (file-exists-p (buffer-file-name)) (reftex-parse-all))) (add-hook 'org-mode-hook (lambda () (if (member "REFTEX" org-todo-keywords-1) (org-mode-article-modes))))
然后把下面这一行加到你需要插入 BibTeX 的 Org 文件的开头:
#+TODO: TODO(t) STARTED(s) | DONE(d) DEFERRED(f) REFTEX
其它步骤与第2种方法类似。这种方法我没有仔细测试,有兴趣的 Emacser 们可以试试。
通过以上方法,就可以在用 Org Mode 打造的笔记本里,很方便地索引 BibTeX 里的参考文献了。
当然,如果你不喜欢用 Org Mode,也有其它用 Emacs 来写论文的思路,例如:Emacs + AucTeX + RefTeX + Outline-minor-mode
在 Emacs 里用 Org mode 来编辑,如果链接一张图片,只能显示图片的链接地址,并不能真正显示一张图片。
如果用 iimage 这个 minor mode,则可以使 Emacs 在编辑区里显示图片。下载 iimage.el 文件扔到 Emacs 的目录里,然后在 .emacs 里添加下面的代码:
;; iimage mode (autoload 'iimage-mode "iimage" "Support Inline image minor mode." t) (autoload 'turn-on-iimage-mode "iimage" "Turn on Inline image minor mode." t)
然后就可以用命令
M-x iimage-mode RET
在当前模式里启动 iimage 这个 minor mode。
如果想在 Emacs org 模式里启用 iimage 模式,把下面的代码放到配置文件里,则可以在 Emacs Org 的编辑区里显示图片。
(defun org-toggle-iimage-in-org () "display images in your org file" (interactive) (if (face-underline-p 'org-link) (set-face-underline-p 'org-link nil) (set-face-underline-p 'org-link t)) (iimage-mode))
以后要写图文并茂的笔记就方便多了,不用发布后再浏览图片在文章里的效果了。
可以用 M-x org-toggle-iimage-in-org 或 M-x iimage-mode 命令来激活 iimage 模式,类似以下这些链接形式会直接显示为图片:
file://foo.png `file://foo.png' [[foo.gif]] ‹foo.png› `foo.JPG'
在我的 Windows 系统下,用 Gpg4Win 来作为 Emacs EasyPG 文件加密解密的工具,可是每次用 EasyPG 打开加密的文件时,都会弹出一个对话框来让我输 Key。
弹出对话框来倒也无所谓,很要命的是,在这个对话框里,没有办法输入 Key。每每要用加密文件的关键时刻,我都不知所措,想尽办法重启电脑之类的来解决该问题。
今天一怒之下,改用 Cygwin 里的 GnuPG 了,现在 EasyPG 的表现和 Linux 下终于一样了,在 MiniBuffer 里输 Key 即可。
有人知道这是什么问题吗?是我哪里配置得有问题吗?
我之前是用 SVN 来在多台电脑间同步 Emacs 配置文件,主要是担心 Dropbox 不安全,导致文件随便就删掉了。没办法,Dropbox 的操作太便捷了。
现在发现,其实可以把 SVN 的文件也一起用 Dropbox 同步,这样就可以在任意一台电脑上同步所有文件在 SVN 里的状态,也可以同步 Gnus 使用的大量变化快速、不方便用 SVN 同步的文件。
不过我很害怕,不小心把 Dropbox 里的文件一下子全删掉了,Dropbox 虽然有文件恢复功能,不过我还是用 SVN 一起来同步比较保险。
哈,好吧,我承认,到目前为止,Dropbox 完胜了!
Linux 下可以很方便地使用 EasyPG 来对文本文件进行加密,最近工作迁移到了 Windows 下,所以,有些东西也得在 Windows 下配起来。
要在 Windows 下使用 EasyPG,装一个 GPG4Win 就基本上可以替换 Linux 下的 GnuPG 了。
安装成功后,会自动在系统的 PATH 里添加一个执行路径,默认安装的情况下路径是
c:/Program Files/GNU/GnuPG/pub
当然,你也可以在 .emacs 里指定 GPG 的可执行文件路径,类似下面的代码就可以(声明:这个代码是我抄 chunhui 的,我没仔细测试,有问题找他!):
(custom-set-variables '(epa-file-name-regexp "\\.gpg\\(~\\|\\.~[0-9]+~\\)?\\'") '(epg-gpg-program "c:/Program Files/GNU/GnuPG/pub/gpg2.exe"))
如果提示如下错误,肯定是你的 GnuPG 安装或配置得有问题,从而导致 Emacs 不知道如何去读取该文件:
File exists, but cannot be read
感谢水木社区 chunhui 的代码与帮助。
如果你有 Windows,Linux 等多台机器,你可能要试着在多台机器间同步你的 Emacs 配置文件,这样才用得爽嘛!我就是这样,采用下面的步骤就可以实现此目的:
1) 尽量把与本地路径相关的东西放到 .emacs 文件,而把其它通用的内容放到其它 el 文件里
我用 svn 管理我的 Emacs 配置文件,扩展的 el 文件我也保存到 SVN 里面,这样,随便到哪台机器上只要把配置文件 check out 出来,就可以使用了。
当然,在不同的机器上,会面临字体、文件路径等问题,这时,需要根据各台机器的实际情况,单独配置一下。
可以用 (system-type) 来识别当前机器的操作系统版本,同样,你也可以根据更多的属性,如用户名等来判断配置文件应该设置哪些参数。
如果对于多台同样类型的机器,你也可以根据 (system-name) 来判断一下你的 Emacs 所在路径。
这两种方法性质类似,完全可以根据自己的属性灵活选用这两种识别机器的方法。
当要在 Window 或是 Linux 机器上识别、配置不同的代码的时,可以参考下面的例子代码:
;;如果是 Windows 平台,则进行如下设置 (if (eq system-type 'windows-nt) ;;current system is Windows, do some specific setting for Windows ;;(message "Current system is Windows") ;;use Cygwin as bash (let* ((cygwin-root "d:/cygwin") (cygwin-bin (concat cygwin-root "/bin"))) ;;根据不同的 Windows 系统设置不同的路径 ;;设置公司电脑的路径 (if (string-match (system-name) "SCUT-9C14ED3B4C") (setenv "HOME" (concat cygwin-root "/home/water"))) ;;设置家里电脑的路径 (if (string-match (system-name) "32283744FF164E6") (setenv "HOME" (concat cygwin-root "/home/water/water"))) (setenv "PATH" (concat cygwin-bin ";" (getenv "PATH"))) (setq exec-path (cons cygwin-bin exec-path))) (setq shell-file-name "bash") (setq explicit-shell-file-name "bash") ;;else current system is Linux, do some specific setting for Linux (if (or (eq system-type 'cygwin) (eq system-type 'gnu/linux) (eq system-type 'linux)) (message "Current system is Linux, please do some specific setting here")))
如果要专门针对某一类型的系统设置字体等,就可以参考下面的代码来设置:
;; font set (if (or (eq system-type 'cygwin) (eq system-type 'gnu/linux) (eq system-type 'linux)) (set-default-font "Courier 10 Pitch-12") (set-default-font "Courier New-14"))
如果专项设置的代码量比较大,还可以把不同平台的代码分成几个文件,导入不同的文件即可。
2) 选择需要同步的文件
并不是所有的配置文件都需要同步,我也不赞同一股脑地把所有的文件同步,有一些配置文件完全可以根据平台的需要选择不同步。
像我的习惯就是 .ido.last, .recentf, .emacs.desktop 这些文件就不同步了。
因为家里的电脑和公司的电脑,干的事情基本上是不同的,没有必要搅成一堆,这样也不容易产生冲突。再一个,回家了,就不干公家的事情了嘛!
3) 文件远程同步软件或工具
至于文件同步工具,水木社区 Emacs 版上有人推荐的,用 ProjectLocker 和 DropBox 都不错,前者是免费 SVN 服务器,后者也是一个免费的文件同步工具。同样,还有一些其它的同步软件也可以试用。
通过以上三个步骤仔细设置,就可以一劳永逸地在多台电脑间同步 Emacs 工作环境,同步 org,muse 等文件了。
感谢水木社区 Emacs 版的 ahei0802,swdonline,Madsen 等兄弟们的经验分享。
通过使用 Jabber 插件,可以在 Emacs 里进行即时通讯聊天,相关截图可以在 Emacs-wiki 上看到,怎么样,很不错吧?!我们可以通过 Jabber 来在 Emacs 里使用若干即时通讯工具,这里就以 Gtalk 为例简单说明一下 Jabber 的基本使用方法。
Ubuntu/Debian 上可以直接从源里安装 emacs-jabber 的软件包。
例如,我要配置 Google Talk 的话,可以在 .emacs 里用下面的方法来配置:
(setq jabber-account-list
'(("waterlin.org@gmail.com"
(:network-server . "talk.google.com")
(:connection-type . ssl))))
配置好了以后,可以用 M-x jabber-connect 来登陆,它会让你输入 JID,你直接输入你设置好的邮箱名即可。
登录成功后,Emacs 会有一个 \*-jabber-roster-\* 的 buffer,从里面就能找到你想聊天的人一起聊天。
和某个人聊天的话,就用 M-x jabber-chat-with 命令,输入某个人的帐号,或者直接从 \*-jabber-roster-\* buffer 里找到某人的帐号并按回车,就会出现 \*-jabber-chat-:-person-\* 这样的一个 buffer。在这个 Buffer 里,你就可以和他/她聊天了。如果对方有消息过来,Emacs 会在 minibuffer 里提示对方的名字,提示你有新的消息。
聊天时,用回车就是发送消息,用 C-j 就是新建一行输入消息。
默认情况下,你会显示为在线状态,如果需要修改状态,例如修改为 away,可以用命令 M-x jabber-send-presence 或快捷键 C-x C-j C-p 来切换状态。
其它常用命令:
这个玩意不错,尤其是作为 Linux 下面的 Gtalk 客户端挺好的,不仅能聊天,同时也支持在 Gmail 里保存聊天记录。