久々に Emacs の設定をした。普段は vim をつかっているのだが、日本語の長 文を vim で書くのはつらいので Emacs 環境を整備したかったのだ。 (Emacs ですべてを書くと左手の小指が死ぬので、日本語のときだけにつかう ことにしている)
Emacs の設定は最近は MELPA だか package.el だか el-get だかでやるのが ナウいらしいのだが、どうちがうのかよくわからない。いろいろと日本語の情 報があるのだが、「そもそもどれがなんなのか」というところをあんま説明し てくれてなくて辛い。
いろいろと調べた結果、僕は以下のような結論にたっした。
インストーラ。tar ball とか file を指定すると、それをインストールして くれる。便利。
レポジトリから定期的にフェッチしてきて、いいかんじに package.el 対応の サイトをつくってくれるくん。
イメージ的には github の URL を羅列しておくと、cron で自動的に tar ball つくって darkpan つくってくれるようなかんじ。
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
(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 の設定を追加。