2015年2月20日金曜日

.emacs.dを書き直す会 第一弾

ここのところ.emacs.dの秘伝のタレ化が進んで非常に汚く、重くなってきたので.emacs.dを書き直した。第一弾として特定のモードに依らない設定を書いた。

package.el(melpa)

Emacs 24からデフォルトで入るようになったpackage管理。非常に便利なので引き続き使う。公式レポジトリだけだと足りないのでmelpaも追加する。marmaladeは以前は入れていたがひとまず入れないでみる。

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

init-loader

設定ファイルを分散して書けるようなもの。.emacs.d/inits以下に設定ファイルを書くと、辞書順に呼ばれる。

(require 'init-loader)
(init-loader-load)

twittering-mode

emacsからtweetするために必要。普段も使っていた。いつでも呟ける様にキーバインドを設定しておく。

(require 'twittering-mode)
(global-set-key "\C-xt" 'twittering-update-status-interactive)

appearance

特定のモードではなく背景色とかそういうもの。以前はXのクリップボードとemacsのコピーが同期されるようなものも書いていたが気がついたら勝手に同期されるようになっていた。背景色はthemeとかを使おうかと思ったが良さそうな色がなかったので”秘伝のタレ”を取り出した。

;;背景色の設定
( when window-system 
  (custom-set-faces
   '(default ((t
           (:background "#000040" :foreground "#e0e0e0")
           )))
   '(cursor ((((class color)
           (background dark))
          (:background "#00AA00"))
         (((class color)
           (background light))
          (:background "#999999"))
         (t ())
         ))))

;; フレーム透過設定
(add-to-list 'default-frame-alist '(alpha . (0.75 0.75)))
;; tool-barを消す
(tool-bar-mode 0)

;; C-h でbackspaceにする
(global-set-key "\C-h" 'delete-backward-char)

;; 括弧を強調表示
(show-paren-mode t)

helm

色々と便利な子。こいつがいないともうファイルも開けない。設定がよくわからなかったのでここも”秘伝のタレ”。

(when (require 'helm-config nil t)
  (helm-mode 1)

  (define-key global-map (kbd "M-x")     'helm-M-x)
  (define-key global-map (kbd "C-x C-f") 'helm-find-files)
  (define-key global-map (kbd "C-x C-r") 'helm-recentf)
  (define-key global-map (kbd "M-y")     'helm-show-kill-ring)
  (define-key global-map (kbd "C-c i")   'helm-imenu)
  (define-key global-map (kbd "C-x b")   'helm-buffers-list)

  (define-key helm-map (kbd "C-h") 'delete-backward-char)
  (define-key helm-find-files-map (kbd "C-h") 'delete-backward-char)
  (define-key helm-find-files-map (kbd "TAB") 'helm-execute-persistent-action)
  (define-key helm-find-files-map (kbd "C-z") 'helm-select-action)
  (define-key helm-read-file-map (kbd "TAB") 'helm-execute-persistent-action)

  ;; Disable helm in some functions
  (add-to-list 'helm-completing-read-handlers-alist '(find-alternate-file . nil))

  ;; Emulate `kill-line' in helm minibuffer
  (setq helm-delete-minibuffer-contents-from-point t)
  (defadvice helm-delete-minibuffer-contents (before helm-emulate-kill-line activate)
    "Emulate `kill-line' in helm minibuffer"
    (kill-new (buffer-substring (point) (field-end))))

  (defadvice helm-ff-kill-or-find-buffer-fname (around execute-only-if-exist activate)
    "Execute command only if CANDIDATE exists"
    (when (file-exists-p candidate)
      ad-do-it))

  (defadvice helm-ff-transform-fname-for-completion (around my-transform activate)
    "Transform the pattern to reflect my intention"
    (let* ((pattern (ad-get-arg 0))
           (input-pattern (file-name-nondirectory pattern))
           (dirname (file-name-directory pattern)))
      (setq input-pattern (replace-regexp-in-string "\\." "\\\\." input-pattern))
      (setq ad-return-value
            (concat dirname
                    (if (string-match "^\\^" input-pattern)
                        ;; '^' is a pattern for basename
                        ;; and not required because the directory name is prepended
                        (substring input-pattern 1)
                      (concat ".*" input-pattern)))))))

日本語入力

日本語入力は普段\C-\ではなく[変換/無変換]を使っているのでその辺の設定をまずする。(2015/02/25修正)Emacs 24.3以降でinactive-input-methodがobsoleteになったので修正した。

;; IMEの設定
(define-key global-map [zenkaku-hankaku] 'toggle-input-method)
;; 変換キーでIME ON
(define-key global-map [henkan]
  (lambda ()
    (interactive)
    (if current-input-method (deactivate-input-method))
    (toggle-input-method)))

;; 無変換キーでIME OFF
(define-key global-map [muhenkan]
  (lambda ()
    (interactive)
    (deactivate-input-method)))

次にmozcの設定。

;; mozc
(require 'mozc)
(setq default-input-method "japanese-mozc")

auto-complete

コードを書くときとかにいい感じで補完してくれる子。emacs lispを書くにもこれがないとつらい。Cとか特定の言語に依存する設定は後で。

(require 'auto-complete)
(require 'auto-complete-config)
(ac-config-default)

magit

emacsからgitを操作するもの。そう言えば結構前は標準で入るVCからgitを使っていたが、VCはgitに特化しておらず色々とやりたいことが出来なかったのでmagitにした。git rebase -iに当たるものをmagit-statusじゃない場所からやるとか使用頻度の少ないキーバインドは消した。

(require 'magit)
(global-set-key "\C-xgs" 'magit-status)
(global-set-key "\C-xgb" 'magit-branch-manager)

iedit

共通部分を全部まとめて編集するもの。変数名とかを変えるときに便利。”\C-;”と書きたいがそれだと動かないのでこんな感じで書いた。

;; iedit
(global-set-key [?\C-;] 'iedit-mode)

Written with StackEdit.