Life is very short

2014-10-11

第五回 init.el読書会に参加しました

| 12:08

第五回は @さんでした.


リポジトリ

https://github.com/wataken44/dot.emacs.d2


cd(change directory)するなら let + default-directory

https://github.com/wataken44/dot.emacs.d2/blob/master/init.el#L7

オリジナル
(progn (cd "~/.emacs.d/site-lisp/")
       (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
           (normal-top-level-add-subdirs-to-load-path)))

;; ...

(progn (cd "~"))

改正案

letを使うことで, 元の位置に戻す必要がなくなります. letを抜けると

元の位置に戻ります. Guardオブジェクト的な感じで使えるので便利です.


default-directoryに設定する値の末尾は '/'にする必要があるので

注意してください. file-name-as-directoryを使うと無難です.

(let ((default-directory "~/.emacs.d/site-lisp/"))
  (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
      (normal-top-level-add-subdirs-to-load-path)))

server起動

https://github.com/wataken44/dot.emacs.d2/blob/master/init.d/init-misc.el#L53


複数台起動を考慮して, server-running-pのチェックでラップするとよいです.

server-running-pは autoloadでないので, (require 'server)が必要です.

(require 'server)
(unless (server-running-p)
  (server-start))

marmalde

https://github.com/wataken44/dot.emacs.d2/blob/master/init.d/init-elpa.el#L3


marmaladeは最近はあまり使われていないので, melpa-stableに

した方がよいです. marmaladeにしかないパッケージがあれば

別ですが, 安定版を使うという用途であれば melpa-stableの

方がよいです.


indent-tabs-modeのモードの設定

各種プログラミングモードで nilにしていますが, setq-defaultで nilに

しているので不要です.


これに限った話ではないですが, 各 hookで同じ設定を追加するのであれば,

デフォルト値をそちらにしてしまって, 別の値を使うときだけ設定するという

ようにすると設定量が少なくなり, 重複が減ってよいかと思います.


おわりに

次回は 10月 11日 22:00-です.

2014-10-04

eval-after-load設定すべきもの, hookで設定すべきもの

| 10:11

eval-after-loadで設定すべきもの

一度だけ設定すればよいものは, eval-after-loadで設定すべきです.

具体的にはキーバインド, face, バッファローカルでない変数の設定,

ファイルのロードなどです. (defcustomizeで定義された変数については

custom-set-variablesを使えば, eval-after-load内に書く必要はありません)


local-set-keyを使いたい場合は hookになります.


with-eval-after-load

Emacs 24.4からは with-eval-after-loadというマクロが加わっています.

これにより, quote+prognを書く必要がなくなります. 少しすっきりします.


Before
(eval-after-load 'comint
  '(progn
     (setq comint-input-history-ignore "^\\s-+#")
     (set-face-attribute 'comint-highlight-input nil
                         :foreground "grey80" :weight 'semi-bold)))
After
(with-eval-after-load 'comint
  (setq comint-input-history-ignore "^\\s-+#")
  (set-face-attribute 'comint-highlight-input nil
                      :foreground "grey80" :weight 'semi-bold))

hookで設定すべきもの

バッファローカルな変数の設定, local-set-keyなどです. hookは

バッファを開くたびに呼ばれます(バッファ切り替え等では呼ばれません).

変数がバッファローカルであるかどうかは describe-variableで確認

できます.


setq-defaultを hookで行っている設定をたまに見かけますが, それは

誤りです. setq-defaultは eval-after-load, toplevelに置くべきです.


具体例

(eval-after-load 'cc-mode
  ;; key bindings
  '(progn
     (define-key c-mode-map (kbd "C-c C-t") 'ff-find-other-file)
     (define-key c-mode-map (kbd "C-c C-s") 'my/unwrap-at-point)

     (require 'ac-c-headers)))

(defun my/c-mode-hook ()
  (c-set-style "k&r")
  (setq indent-tabs-mode t
        c-basic-offset 8)
  (c-toggle-electric-state -1)
  (add-to-list 'ac-sources 'ac-source-c-headers)
  (add-to-list 'ac-sources 'ac-source-c-header-symbols t))

(add-hook 'c-mode-hook 'my/c-mode-hook)

おわりに

何かわからないことがありましたら, twitter, lingr等で聞いてくれたら

答えますので遠慮なくお願いします.