ふと思いたって、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 の設定を追加。