Hexo renderer plugin for emacs org-mode.
Switch to your hexo blog directory and run:
npm install https://github.com/coldnew/hexo-renderer-org#master --save
Then restart your hexo server.
You can configure this plugin in _config.yml
according to the backend you want to use.
If highlight.js is enough for you, here’s the minimal config:
org:
emacs: 'emacs'
emacsclient: 'emacsclient'
If you want to use emacs’s htmlize to syntax highlight your code block, you can use this config instead:
org:
emacs: 'emacs'
emacsclient: 'emacsclient'
htmlize: true # <--- for htmlize user, this MUST set true
theme: 'leuven'
Some options may not uesed on above example, here’s the doc:
config | description | default value |
---|---|---|
emacs | executable file of emacs | emacs |
emacsclient | executable file of emacsclient | emacsclient |
common | common org content you’ll use | #+OPTIONS: toc:nil num:nil\n#+BIND: org-html-postamble nil |
cachedir | where cache file located | ./hexo-org-cache/ |
clean_cache | set true to clean cache by ‘hexo clean’ | false |
theme | emacs’s theme you want to use | |
user_config | extra emacs config you want to load | |
htmlize | use emacs’s htmlize to syntax highlight | false |
line_number | Enable line-number globally on src-block | false |
debug | Show more debug message | false |
daemonize | Enable/Disable use emacs server | true |
Create source/_posts/foobar.org
with followin content:
#+TITLE: Hello World
#+DATE: <2017-03-05 Sun 08:52>
#+LAYOUT: post
#+CATEGORIES: org-mode
#+TAGS: hexo, org-mode
Welcome to [[https://github.com/coldnew/hexo-renderer-org][coldnew/hexo-renderer-org]]!
#+HTML: <!-- more -->
You also can add some code block:
#+BEGIN_SRC js
console.log("hi");
#+END_SRC
org-mode has it’s own way to describe the front-matter.
Front-matter | org-mode | value |
---|---|---|
layout | #+LAYOUT | post/page |
title | #+TITLE | string |
date | #+DATE | <2017-04-15 Sat 12:30>, use M-x org-time-stamp to insert |
updated | #+UPDATED | <2017-04-15 Sat 12:30>, use M-x org-time-stamp to insert |
comments | #+COMMENTS | yes/no |
tags | #+TAGS | tag1, tag2, tag3 |
categories | #+CATEGORIES | string |
To insert date in org-mode, the default keybinding is C-c .
, you can also use C-u C-c .
instead.
For more tutorials, please see:
This renderer ONLY support org-mode 9.x
syntax, be careful there’s some conflict with org-mode 9.x and 8.x.
If you really want to use org-mode 8.x, here’s the guide.
Place #+HTML: <!-- more -->
in where you would like to add a Read more
.
If the emacs theme you want to use is not installed by default, you can setup the _config.yml
For example, if we want to use moe-theme for your code block, we need to edit _config.yml
like this:
org:
# skip ...
theme: 'moe-dark'
user_config: './emacs/init.el'
Then add following code to your ./emacs/init.el
.
;; install moe-theme and use it
(package-install 'moe-theme)
(require 'moe-theme)
If you want to make hexo clean
work with hexo-renderer-org, you can setup your _config.yml
.
org:
# skip ...
clean_cache: true
Note that the emacs-lisp cache in cachedir will be kept after hexo clean
, you can manually remove it if you want to re-fetch all emacs-lisp plugin.
You can add following to your _config.yml
to make line-number display on your src-block globally:
org:
# Make src-block has line-number (this won't make effect on example-block)
line_number: true
Or use org-mode’s standard method to add line-number manually:
#+BEGIN_SRC js -n
console.log("This is line 1")
#+END_SRC
If you still want to use CodeFalling/hexo-renderer-org method, which start emacs process to render post instead of using emacs daemon, you can switch to emacs process by setting _config.xml
org:
# disable use emacs server by set 'false'
daemonize: false
Yes, first you need to install org-download to your emacs.
Then add following to .dir-locals.el
at the top of your hexo project:
((nil .
((eval .
(progn
;; make drag-and-drop image save in the same name folder as org file
;; ex: `aa-bb-cc.org' then save image test.png to `aa-bb-cc/test.png'
(defun my-org-download-method (link)
(let ((filename
(file-name-nondirectory
(car (url-path-and-query
(url-generic-parse-url link)))))
(dirname (file-name-sans-extension buffer-file-name) ))
;; if directory not exist, create it
(unless (file-exists-p dirname)
(make-directory dirname))
;; return the path to save the download files
(expand-file-name filename dirname)))
;; only modify `org-download-method' in this project
(setq-local org-download-method 'my-org-download-method)
)))))