tokuhirom's Blog

ふと思いたって、emacs の設定を1からやりなおしたの記

久々に Emacs の設定をした。普段は vim をつかっているのだが、日本語の長 文を vim で書くのはつらいので Emacs 環境を整備したかったのだ。 (Emacs ですべてを書くと左手の小指が死ぬので、日本語のときだけにつかう ことにしている)

Emacs の設定は最近は MELPA だか package.el だか el-get だかでやるのが ナウいらしいのだが、どうちがうのかよくわからない。いろいろと日本語の情 報があるのだが、「そもそもどれがなんなのか」というところをあんま説明し てくれてなくて辛い。

いろいろと調べた結果、僕は以下のような結論にたっした。

package.el

インストーラ。tar ball とか file を指定すると、それをインストールして くれる。便利。

MELPA

レポジトリから定期的にフェッチしてきて、いいかんじに package.el 対応の サイトをつくってくれるくん。

イメージ的には github の URL を羅列しておくと、cron で自動的に tar ball つくって darkpan つくってくれるようなかんじ。

el-get

homebrew 的なパッケージマネージャ。package.el をサポートしているが、あ くまでインストールメソッドのひとつとしてサポートしているだけ。

自分でインストールレシピ的なのかくにはこれが楽な気がする。package.el なり MELPA なりは、既存のものでつかえるのがあれば、とてもよいし、自分 でかいた elisp とか github で管理されている elisp をインストールするに はよいのだが、そのレールを一歩でもはずれると詰む。そういう場合でも el-get ならなんとかなる、という感じをうけた。

実際の設定

以下のような基本的な設定を ~/.emacs.d/init.el にかく。

まずは、package.el の設定。MELPA を追加する程度。

;; setup package.el
(require 'package)
(add-to-list 'package-archives
  '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

そして、el-get とかにパスをとおす。~/.emacs.d/elisp/ の下には、自前の elisp とかをおく。

;; setup el-get
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(add-to-list 'load-path "~/.emacs.d/elisp/")

el-get の設定は以下のように。

;; なんかautoload余計なおせわ機能が変にうごいてて
;; だめなときあるので無効にするのが吉
;; -- typester
(setq el-get-generate-autoloads nil)

(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))

package.el で管理するパッケージは以下のように羅列する。はいってなけれ ば自動的にインストール。

;; install packages by package.el
(mapc
 (lambda (package)
   (or (package-installed-p package)
       (package-install package)))
 '(
   auto-save-buffers-enhanced
   starter-kit
   starter-kit-perl
   popwin
   markdown-mode
   helm
   ))

el-get で管理してるものは以下のように記述。これらもはいってなかったら なんとなくはいるっぽい。

;; install packages by el-get
(el-get 'sync '(
                howm
                ddskk
                navi2ch
                ))

基本的に、package-list-nantoka とか、el-get-list-nantoka とかではいれず、init.el に記述していれることにする。

GUI の設定

フォントとかを適当に設定しておく。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GUI
(set-frame-font "Ricty 24" nil t)
(set-fontset-font
 nil 'japanese-jisx0208
 (font-spec :family "Ricty"))

キーの設定

C-h を backspace にしたり。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Setup C-h
(keyboard-translate ?\C-h ?\C-?)
;;次のウィンドウへ移動
(define-key global-map (kbd "C-x C-n") 'next-multiframe-window)
;;前のウィンドウへ移動
(define-key global-map (kbd "C-x C-p") 'previous-multiframe-window)

あとはてきとうに設定する。

元々 Emacs

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; starter-kit
(require 'starter-kit)
(require 'starter-kit-perl)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; popwin
(require 'popwin)
(setq display-buffer-function 'popwin:display-buffer)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; markdown-mode
(require 'markdown-mode)

(add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode))
(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; setup howm

(setq howm-view-title-header "#") ;; ← howm のロードより前に書くこと
(setq howm-view-title-regexp-grep "^\# +[^2]")
(setq howm-view-title-regexp "^\\#\\( +\\([^2].*\\)\\|\\)$")

(require 'howm)

(setq howm-directory "~/Dropbox/howm")

;; 完了ずみ todo は表示しない
(setq howm-todo-menu-types "[-+~!]")

;; menu を二時間キャッシュ
;; (setq howm-menu-expiry-hours 2)
(setq howm-menu-expiry-hours nil)

;; いちいち消すのも面倒なので
;; 内容が 0 ならファイルごと削除する
(if (not (memq 'delete-file-if-no-contents after-save-hook))
    (setq after-save-hook
          (cons 'delete-file-if-no-contents after-save-hook)))
(defun delete-file-if-no-contents ()
  (when (and
         (buffer-file-name (current-buffer))
         (string-match "\\.howm" (buffer-file-name (current-buffer)))
         (= (point-min) (point-max)))
    (delete-file
     (buffer-file-name (current-buffer)))))

;; http://howm.sourceforge.jp/cgi-bin/hiki/hiki.cgi?SaveAndKillBuffer
;; C-cC-c で保存してバッファをキルする
(defun my-save-and-kill-buffer ()
  (interactive)
  (when (and
         (buffer-file-name)
         (string-match "\\.howm"
                       (buffer-file-name)))
    (save-buffer)
    (kill-buffer nil)))
(eval-after-load "howm"
  '(progn
     (define-key howm-mode-map
       "\C-c\C-c" 'my-save-and-kill-buffer)))

;; M-t で今日の日付で todo 入力。
(defun oreore-howm-insert-todo ()
  (interactive)
  (insert (format-time-string "[%Y-%m-%d]+ ")))
(define-key esc-map
  "t"
  'oreore-howm-insert-todo)

;; markdown-mode でメモる
(setq howm-template "# %title%cursor\n%date\n")

;; menu ファイルの位置をうつす
(setq howm-menu-file "~/Dropbox/.howm-menu")

(setq howm-file-name-format "%Y%m%d-%H%M%S.md")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ddskk
(require 'skk-vars)

(global-set-key "\C-x\C-j" 'skk-mode)
(autoload 'skk-mode "skk" nil t)
(autoload 'skk-auto-fill-mode "skk" nil t)
(autoload 'skk-isearch-mode-setup "skk-isearch" nil t)
(autoload 'skk-isearch-mode-cleanup "skk-isearch" nil t)
;; (global-set-key "\C-j" 'skk-j-mode-on)

;; Enter キーを押したときには確定する
(setq skk-egg-like-newline t)
;; 句読点に ., を使う
;;(setq skk-kutouten-type 'en)
;; 送り仮名が厳密に正しい候補を優先して表示する
(setq skk-henkan-strict-okuri-precedence t)
;; 辞書登録のとき、余計な送り仮名を送らないようにする
(setq skk-check-okurigana-on-touroku 'auto)
;; look コマンドを使った検索をする(これ便利)
(setq skk-use-look t)
;; migemo を使うから skk-isearch にはおとなしくしていて欲しい
(setq skk-isearch-start-mode 'latin)
;; 複数の Emacsen を起動して個人辞書を共有する
(setq skk-share-private-jisyo t)
;;; 西暦で表示
(setq skk-date-ad t)
;;; 半角数字
(setq skk-number-style nil)

;; key
(define-key global-map (kbd "C-x C-j") 'skk-mode)
(setq skk-kakutei-key (kbd "C-j"))
(setq mac-pass-control-to-system nil)

;; skkserv
(setq skk-server-host "127.0.0.1")
(setq skk-server-portnum 1178)

;; user dic
(setq skk-jisyo-code 'utf-8)
;; (setq skk-jisyo (concat (getenv "HOME") "/Dropbox/skk/skk-jisyo.utf8"))
(setq skk-share-private-jisyo t)
(setq skk-save-jisyo-instantly t)

;;; カナモードのときにC-oしてもひらがなモードにもどる
;; (defun my:skk-kakutei-key (arg)
;;   (interactive "P")
;;  (if skk-henkan-mode
;;       (skk-kakutei arg)
;;     (skk-j-mode-on)))

;; (add-to-list 'skk-rom-kana-rule-list
;;                   '(skk-kakutei-key nil my:skk-kakutei-key))

;; Do not use C-x C-j as dired's binding
(setq dired-bind-jump nil)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; navi2ch
(require 'navi2ch)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; auto-save-bufferes-enhanced
(require 'auto-save-buffers-enhanced)
(auto-save-buffers-enhanced t)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; hogememo
(autoload 'hogememo "hogememo" "HogeMemo" t nil)
(define-key esc-map "m" 'hogememo)

【20130502 追記】 フォントまわりの設定を簡素に。bobcat やめて keyboard-translate つかうように。 C-x C-n/C-x C-p の設定を追加。