为啥这里的markdown渲染的格式会出错"(ºДº*)
概述
EOG 默认是使用文章的标题来生成 URL 的,这么做的坏处有二:
- 如果文章的标题里面有汉字,生成的 URL 因为编码的原因会变的特别长,不美观。
- 只要更改了文章的标题,URL 就会随之而改变,以后就不好找了。而且 disqus 和多说也会把 修改标题之后的文章当成新的文章。
我修改了 EGO 生成 URL 的策略,现在我的博客就是使用 hack 之后的 EGO 来生成的。
改进方法
(defun liu233w//ego--generate-uri (default-uri-template creation-date title)
"类似于`ego--generate-uri',只不过读取 org 的文件名作为 title"
(let ((uri-template (or (ego--read-org-option "URI")
default-uri-template))
(date-list (split-string (if creation-date
(ego--fix-timestamp-string creation-date)
(format-time-string "%Y-%m-%d"))
"-"))
(encoded-title (ego--encode-string-to-url
;; 获取 buffer 的文件名
(replace-regexp-in-string "^.*/\\|\\.org$" "" (buffer-file-name)))))
(format-spec uri-template `((?y . ,(car date-list))
(?m . ,(cadr date-list))
(?d . ,(cl-caddr date-list))
(?t . ,encoded-title)))))
如果你不介意直接覆盖函数的话,可以把函数名换成 ego--generate-uri
,这样 EGO 的默认函数就
被覆盖了。如果你不想这么做,可以修改 ego--category-config-alist
中的 :uri-generator
,
如我的代码所示:
(setf ego--category-config-alist
'(("blog"
:show-meta t
:show-comment t
;; 将 org 的文件名当做 uri,参考函数
:uri-generator liu233w//ego--generate-uri
:uri-template "/blog/%y/%m/%d/%t/"
:sort-by :date ;; how to sort the posts
:category-index t) ;; generate category index or not
("acm"
:show-meta t
:show-comment t
;; 将 org 的文件名当做 uri,参考函数
:uri-generator liu233w//ego--generate-uri
:uri-template "/acm/%y/%m/%d/%t/"
:sort-by :date ;; how to sort the posts
:category-index t)
("index"
:show-meta nil
:show-comment nil
:uri-generator ego--generate-uri
:uri-template "/"
:sort-by :date
:category-index nil)
("about"
:show-meta nil
:show-comment nil
:uri-generator ego--generate-uri
:uri-template "/about/"
:sort-by :date
:category-index nil)
))
原理
相比于原来的函数,我只是把 let 中的参数 title
换成了
(replace-regexp-in-string "^.*/\\|\\.org$" "" (buffer-file-name))
而已。因为这个函数会在每一个打开的 buffer 中运行,所以可以通过 buffer-file-name
来获取当前 org 文件的路径,然后用正则表达式把多余的内容删掉,只保留文件名即可。
表达式的效果:
(replace-regexp-in-string "^.*/\\|\\.org$" ""
"d:/TOTALCMD/tools/emacs/home/documents/blog/blog/change-url-generator.org")
change-url-generator
比较神奇的是 emacs 的正则表达式居然是把转义之后的 |
符号当做分支符号,而没有转义的
是符号本身,这跟其他的正则表达式实现不一样啊。
(replace-regexp-in-string "ab|c" "dd" "ab|c")
dd
(replace-regexp-in-string "ab\\|c" "dd" "ab|c")
dd|dd
貌似括号也是这样的。