解决Emacs 24.4 + eww Windows下图片显示问题和配置clojure repl cider

Emacs中偶尔会用一下eww, 大多数情况下, 只需要显示文本就可以了, 不过有时也需要能够显示图片. Emacs的Windows版中只支持xpm格式. 用来显示启动画面中的Emacs logo.

其他的格式需要额外的dll来支持. 之前尝试过一次, 拷贝了各种dll到emacs 的bin目录, 但没有成功. 原因是版本没有搞对, 并不是随便哪个dll文件都可以用, 而必须考虑Emacs本身的版本及其所需要的dll文件的版本.

所以首先应该搞清楚哪些版本的dll是需要的, 可以用如下命令来得到

 
ELISP> (print image-library-alist)
 
((xpm "libxpm.dll" "xpm4.dll" "libXpm-nox4.dll") (png "libpng16.dll" "libpng16-16.dll") (tiff "libtiff-5.dll" "libtiff3.dll" "libtiff.dll") (jpeg "libjpeg-9.dll") (gif "libgif-7.dll") (svg "librsvg-2-2.dll") (gdk-pixbuf "libgdk_pixbuf-2.0-0.dll") (glib "libglib-2.0-0.dll") (gobject "libgobject-2.0-0.dll") (gnutls "libgnutls-28.dll" "libgnutls-26.dll") (libxml2 "libxml2-2.dll" "libxml2.dll") (zlib "zlib1.dll" "libz-1.dll"))
 
((xpm "libxpm.dll" "xpm4.dll" "libXpm-nox4.dll")
 (png "libpng16.dll" "libpng16-16.dll")
 (tiff "libtiff-5.dll" "libtiff3.dll" "libtiff.dll")
 (jpeg "libjpeg-9.dll")
 (gif "libgif-7.dll")
 (svg "librsvg-2-2.dll")
 (gdk-pixbuf "libgdk_pixbuf-2.0-0.dll")
 (glib "libglib-2.0-0.dll")
 (gobject "libgobject-2.0-0.dll")
 (gnutls "libgnutls-28.dll" "libgnutls-26.dll")
 (libxml2 "libxml2-2.dll" "libxml2.dll")
 (zlib "zlib1.dll" "libz-1.dll"))
 

因为这些DLL文件都是14年最近才发布的, 因此几乎没有地方可以下载, 需要到sourceforge.net项目页上去下载.

到这里下载需要的dll文件.

 
http://sourceforge.net/projects/ezwinports/files/
 

找到所有的dll文件, 拷贝到emacs的bin目录即可.

测试图片格式支持是否OK, 可以用一个HTML文件来演示.

 
<html>
  <head></head>
  <body>
  <img src="splash.xpm"/>
  <img src="splash.png"/>
  <p style="color:green">
  sya you say me, as we go down, life , seems the hardest thing to do
  </p>
  <img src="splash.xpm"/>
    <p style="color:red">
  sya you say me, as we go down, life , seems the hardest thing to do
  as the way it should be
  </p>
  <img src="splash.png"/>
    <p style="color:blue">
  sya you say me, as we go down, life , seems the hardest thing to do
  as the way it should be
  naturally
  </p>
  <img src="emacs-eww.gif"/>
 
  <p>now it should support jepg format</p>
  <img src="epicurus-philosophers-philosophy-quotes-131774-1280x800.jpg"/>
  </body>
</html>
 
 

将各种格式的图片添加到img标签中, 然后用eww打开, 如果正常显示, 说明支持格式

emas eww

配置Emacs Clojure REPL cider

大部分情况下cmd中的repl就够用了, 不过编辑文本大部分是在Emacs里面的, 有时候希望直接在Emacs里面执行Cojure REPL. 以下步骤安装cider作为Emacs中的REPL.

首先安装cider, 这个包托管在Melpa上, 先修改.emacs文件如下, 这样当安装package的时候Emacs会去这里搜索.

 
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/") t)
(when (< emacs-major-version 24)
  ;; For important compatibility libraries like cl-lib
  (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/")))
(package-initialize)
 

然后可以执行M-x package-install RET cider RET

下面需要启动一个nREPL server, 我们将会在Emacs里面连接到这个server. 首先要下载以下依赖

 
[cider/cider-nrepl "0.8.2"]
[org.clojure/tools.nrepl "0.2.5"]
 

或者确保以下jar包在Clojure REPL的classpath范围内

 
compliment-0.2.0.jar
tools.trace-0.7.8.jar
dynapath-0.2.3.jar
cider-nrepl-0.8.2.jar
tools.nrepl-0.2.5.jar
tools.namespace-0.2.5.jar
java.classpath-0.2.0.jar
cljs-tooling-0.1.3.jar
 

运行lein deps会下载所有依赖, 确保这些jar文件在Clojure REPL的classpath中. 启动CMD中的REPL

然后执行

 
(require 'cider.nrepl)
(require 'clojure.tools.nrepl.server)
(clojure.tools.nrepl.server/start-server :port 7888 :handler cider.nrepl/cider-nrepl-handler)
 

这样会在本机的7888端口启动一个nrepl server.

然后在Emacs中执行 M-x cider-connect, 然后会提示输入host, 直接Enter, 即localhost, 然后输入端口号, 这里是7888. 然后就会连接到nrepl服务器. 可以在Emacs中执行Clojure代码了.

有一个小问题, 如果在Emacs中执行Clojure code, 某些输出会输出到CMD的REPL中, 另一些则会输出到Emacs中. 例如Clojure调用了Java中的代码, 其中用System.out.println输出, 而Clojure 代码用println输出, 前者会输出到CMD窗口中, 后者会输出到Emacs repl中.