Emacs+org-modeで編集しているファイルをmobi形式にしてKindle内に保存する

  • 1. 現在開いているファイルをHTMLにエクスポート
  • 2. kindlegen で .mobi に変換
  • 3. Kindle内のフォルダに移動

スクリプト化しただけです。即席。UTF-8 だったら日本語入りでも大丈夫。
目次も勝手に生成されます。
Kindleの Home では org-mode の "#+TITLE: ..." で指定したタイトルが表示されます。

M-x org2mobi で変換・保存完了です。

Kindle内に保存する際 mv で上書きされる点に注意。


html2mobi(シェルスクリプト

#!/bin/bash
# -*- shell-script -*-

KINDLEGEN=~/bin/kindlegen
DEST_DIR=/media/Kindle/documents/memo

HTML=$1
MOBI=$2
MOBI_NONDIR=${MOBI##*/}

$KINDLEGEN -unicode "$HTML"

mv "$MOBI" "$DEST_DIR/$MOBI_NONDIR"


.emacs あたりに書く

(defun escape-special-chars-for-filename (str)
  (replace-regexp-in-string "[ \t*@/#\?!$\\]" "_" str))

(defun file-base-with-org-title ()
  (concat 
   (escape-special-chars-for-filename
    (plist-get (org-infile-export-plist) :title)) ;; #+TITLE: {this}
   "_"
   (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))))

(defun org2mobi ()
  (interactive)
  (let ((html2mobi "~/bin/html2mobi")
        (file-base (file-name-sans-extension (buffer-file-name)))
        html-file
        mobi-file)
    (setq html-file (concat file-base ".html"))
    (setq mobi-file (concat (file-base-with-org-title) ".mobi"))

    (save-buffer)
    (org-export-as-html-batch)

    (browse-url-firefox html-file)

    (shell-command
     (concat html2mobi
             " \"" html-file "\" "
             " \"" mobi-file "\" ")
     "org2mobi out"
     "org2mobi err")))

2011年 2月 20日 日曜日 00:03:55 JST

  • mobi のファイル名をタイトル+ファイル名にした。 #+TITLE が foo で ファイルが bar.org なら、できあがりのファイル名は "foo_bar.mobi" になるように。それに合わせて html2mobi の引数も修正
  • html2mobi で出力先ディレクトリのチェックを行わないようにした。シェル(?)にまかせる。エラーになる場合は org2mobi err バッファにメッセージが出力される

「タブでインデントしてyank」をコマンド化

手元でちょっとメモる時のオレオレ記法として、コマンドの出力やログ片、コード片はタブでインデントしている。

これまでは

  • yank
  • 貼り付けた範囲を選択
  • string-rectangle(C-x r t)でタブを挿入

とやっていたが、いいかげん面倒に感じてきたので「タブでインデントしてyank」をコマンド化してみた。

(defun yank-with-tab-indent ()
  (interactive)
  (insert
   (with-temp-buffer
     (yank)
     (goto-char (point-min))
     (replace-regexp "^" "\t")
     (when (= (point) (point-max))
       (delete-backward-char 1))
     (goto-char (point-max))
     (when (not (= ?\n (char-before)))
       (insert "\n"))
     (buffer-string))))

(global-set-key (kbd "C-S-y") 'yank-with-tab-indent)

(solved) フレームを最小化(アイコン化)すると frame-title-format で指定したように表示されない

frame-title-format を設定するのと同じ要領で icon-title-format を使って設定する。

参考:
マニュアル: Frame Titles
http://www.geocities.co.jp/SiliconValley-Bay/9285/ELISP-JA/elisp_440.html
Frame Titles - GNU Emacs Lisp Reference Manual
http://www.gnu.org/software/emacs/manual/html_node/elisp/Frame-Titles.html

(solved) sense-region でフェイスがおかしくなる

sense-region でフェイスがおかしくなるので調べたんですが、もうすでに解決されてましたorz

参考: sense-region.el on Emacs23でface設定が壊れないようにする - Emacs/Lisp/Drill - Emacsグループ
http://emacs.g.hatena.ne.jp/k1LoW/20090822/1250919668

でもせっかくなので自分のもメモ。

      • -

次のように .emacs の (require 'sense-region)
の後で sense-region-to-rectangle を上書きする。

(require 'sense-region)
(sense-region-on)
(defun sense-region-to-rectangle ()
  (interactive)
  (setq sense-region-status 'rectangle)

  ;; フェイスまわりのデフォルトの挙動が変なので
  ;; この2行を追加
  (copy-face mell-region-face 'sense-region-face)
  (copy-face 'region 'sense-region-region-face)

  (mell-sign-reset-face mell-region-face))

以下適当なメモ。

  • set-mark-command にアドバイスが付いていて、sense-region-toggle が呼ばれる。
  • sense-region-toggle で通常のリージョン設定と矩形選択が切り替わる。
  • 通常から矩形に切り替え → sense-region-to-rectangle
  • 矩形から通常に切り替え → sense-region-to-region
      • -

251
(defconst mell-region-face 'region)

sense-region-to-rectangle で
(copy-face mell-region-face 'sense-region-face)
して
sense-region-to-region で
(copy-face 'sense-region-face mell-region-face)
する…のかと思ったら前者がコメントアウトされている。

hi-list.el: カーソルを含んでいるリストを常時ハイライトするマイナーモードを作ってみた

impromptu のハイライト表示が便利そう! Emacs でも使ってみたい!

vimeo.com

というわけでマイナーモードを作ってみました。 動作は次の動画のようになってます:

www.youtube.com

ダウンロード

github.com

hi-list.el を load-path の通った場所に置いてください。

設定(.emacs.el)

(require 'hi-list)

;; ハイライト範囲の背景色を指定します。推奨。
;; これがないと色が付かない場合があるようです……
(set-face-background 'hi-list-face "#8aa")

使い方

M-x hi-list-mode RET でモードをトグルします。

他の設定など

必要なら .emacs.el に追加してください。

;; emacs-lisp-mode の場合は自動的にモードを有効に
(add-hook 'emacs-lisp-mode-hook 'hi-list-mode)

;; リスト内に含まれる文字数がこれ以上だとハイライトしません。
(setq hi-list:limit-chars 5000)

;; ハイライト表示を更新する間隔(秒)
(setq hi-list:repeat-sec 1)

上のデモ動画で行っているハイライト部分のコピーと切り取りを使いたい場合は 以下を追加してください。

(define-key hi-list:map
  (kbd "C-w") (lambda () (interactive)
                (apply-to-highlighted 'kill-region)))
(define-key hi-list:map
  (kbd "M-w") (lambda () (interactive)
                (apply-to-highlighted 'kill-ring-save)))

リージョンがアクティブな場合は通常の動作、 リージョンがアクティブでない場合は C-w でハイライト部分の切り取り(kill-region)、 M-w でコピー(kill-ring-save)を行います。

参考(外部リンク)