October 18th, 2008emacs muse mode – issues
muse是emacs中emacs-wiki mode的继任者, 兼容原来wiki的所有操作, 当然也有不少改进, 照wiki里讲它的优点, 大致有以下几点(直接从原文翻译过来的):
讲了这么多废话, 其实是因为这两天比较枯燥无聊的时候, 自己在瞎折腾Emacs, 所以找到了这么个东西准备用了当记事本用, 不过配置的时候发现了几个问题, 现在解决了, 写下来, 估计一定会有人和我遇到相同的问题!
问题一: 在Muse的QuickStart Tutorial中的源代码那一小节讲到插入源代码然后再发布出的文件里的代码就是高亮的, 可是我在刚开始试的时候是没有成功的: 发布出的代码是没有任何处理的. 经过调查后发现这个功能是需要htmlize.el 扩展的支持的, htmlize.el是被包含在XEmacs发布的, 所以使用XEmacs的兄弟们不会遇到这个问题, 估计写这个QuckStart的哥们用的就是XEmacs, 而htmlize.el默认是不在Emacs中的, 所以就需要自己手动下载这个文件并放到你的加载路径里喽.
问题二: 如何直接在edit模式就可以看到高亮的代码, 刚才讲到Muse发布时是支持高亮其中的代码的, 但是默认情况下是不支持在编辑状态就高亮代码的, 效果应该和下面的差不多
找了半天总算从这里(作者: 叶文彬)找到了一个比较好看的实现(没办法, 谁让咱是不会写lisp的菜鸟呢!~~~~~), 作者的配置文件里有支持代码高亮的一些自定义函数, 就是从(defun muse-colors-src-tag (beg end) 到(add-to-list ‘muse-colors-tags ‘("src" t nil nil muse-colors-src-tag)) 这一段, 有了这些就可以让你的Muse支持高亮了. 另外建议也把htmlize-region-for-paste这个函数放到你的配置文件里, 有了这个函数, 就会把生成的代码的样式使用css样式而不是直接使用html的颜色标记指定, 当然你需要有一个css文件里包含了所需要的样式, 你要是不知道的话也参考这位作者定义的! 他的CSS样式文件在这里可以找到.
基本上为了支持代码高亮我从作者那抄了如下代码, 版权归原作者所有, 我只是引用一下下:
(defun htmlize-region-for-paste (beg end)
"Htmlize the region and return just the HTML as a string.
This forces the `inline-css’ style and only returns the HTML body,
but without the BODY tag. This should make it useful for inserting
the text to another HTML buffer."
(let ((htmlbuf (htmlize-region beg end)))
(unwind-protect
(with-current-buffer htmlbuf
(buffer-substring (plist-get htmlize-buffer-places ‘content-start)
(plist-get htmlize-buffer-places ‘content-end)))
(kill-buffer htmlbuf))))
;;}}};(defvar muse-colors-overlays nil)
(defun muse-colors-src-tag (beg end)
"Strip properties and mark as literal."
(let (face)
(muse-unhighlight-region beg end)
(save-excursion
(goto-char beg)
(let ((fs 1) content face-list fe mode attrs number ov ovs
(font-lock-verbose nil))
(when (re-search-forward "<src\\(.*\\)>" nil t)
(setq beg (match-end 0)
attrs (mapcar
(lambda (pair)
(setq pair (split-string pair "="))
(setcdr pair (substring (cadr pair) 1 -1))
pair)
(split-string (match-string 1)))
mode (and (assoc "lang" attrs)
(intern-soft (concat (cdr (assoc "lang" attrs))
"-mode"))))
(when (and mode (fboundp mode))
(goto-char end)
(setq end
(if (re-search-backward "</src>" nil t)
(match-beginning 0)
(point-max))
content (buffer-substring-no-properties beg end))
(with-current-buffer (get-buffer-create "*muse-temp*")
(funcall mode)
(insert content)
(font-lock-fontify-buffer)
(htmlize-ensure-fontified)
(or (get-text-property fs ‘face)
(setq fs (next-single-property-change fs ‘face)))
(while (and fs (< fs (point-max)))
(setq fe (or (next-single-property-change fs ‘face)
(point-max))
face (get-text-property fs ‘face))
(and face fe (setq face-list (cons (list (1- fs) (1- fe) face) face-list)))
(setq fs fe))
(kill-buffer (current-buffer)))
(when face-list
;; (message "%S" face-list)
(dolist (f (nreverse face-list))
(put-text-property (+ beg (car f)) (+ beg (cadr f))
‘face (nth 2 f)))))
(when (and (assoc "number" attrs)
(setq number (string-to-number (cdr (assoc "number" attrs)))))
(mapc (lambda (o)
(let ((pos (overlay-start o)))
(if (or (null pos)
(and (> pos beg) (< pos end)))
(delete-overlay o)
(push o ovs))))
muse-colors-overlays)
(setq muse-colors-overlays ovs)
(goto-char beg)
(forward-line 1)
(while (and (not (eobp)) (< (point) end))
(when (not (looking-at "</src>"))
(setq ov (make-overlay (point) (point)))
(push ov muse-colors-overlays)
(overlay-put ov ‘before-string (format "%4d " number))
(setq number (1+ number)))
(forward-line 1))))))))
(add-to-list ‘muse-colors-tags ‘("src" t nil nil muse-colors-src-tag))
基本在搞Muse的时候就遇到这两个比较麻烦的问题, Over:)






