• このエントリーをはてなブックマークに追加

2010-08-29 07:10 追記
Emacs Lisp の記述を一部修正しました.
Thanks to @clairvy

ss-2010-08-28-10

はじめに

この数日で,Perl開発環境としてのEmacsの設定 | おいぬま日報 とか Emacsテクニックバイブル ~作業効率をカイゼンする200の技~ とか WEB+DB PRESS Vol.58 のEmacs特集とかを読んで,私のEmacs環境的にいろいろインプットできた気がするので,それらをまとめてアウトプット.

以下,新たに知った中で,個人的によく使うだろうと思った機能,以前の言及 からの設定の変更とかなどを書いていきます.

なお,.emacsの変更以外にもインストール作業等が必要なものが多々ありますが,そのあたりは省略していますのであしからず.

インプットいろいろ

ヘルプいくつか

  • <f1> kdescribe-key
  • <f1> bdescribe-bindings
  • <f1> vdescribe-variable
  • <f1> fdescribe-function

同一バッファでの反復入力の省エネ化

M-/dabbrev-expand

Emacs Lispの評価

C-x C-eeval-last-sexp

M-:eval-expression

特に前者は,.emacs 編集時,その中でも変数の値を試行錯誤する際に重宝しています.

ロードパス設定

setq 関数の引数に,設定のペアをいくつも連ねられるようなので,ちょこっと書き換え.

;; del: 2010-08-29T07:10+09:00
;(setq load-path (cons "~/.emacs.d/site-lisp/" load-path)
;      load-path (cons "~/.emacs.d/auto-install/" load-path)
;
;      load-path (cons "~/.emacs.d/site-lisp/migemo-0.40/" load-path)
;      ;load-path (cons "~/.emacs.d/site-lisp/apel-10.7/" load-path)
;      load-path (cons "~/.emacs.d/site-lisp/apel/" load-path) ; cvs で 10.8 を checkout
;      load-path (cons "~/.emacs.d/site-lisp/elscreen-1.4.6/" load-path)
;      load-path (cons "~/.emacs.d/site-lisp/wp-emacs/" load-path) ; これは使わなさげ
;      load-path (cons "~/.emacs.d/site-lisp/ac/" load-path)
;      load-path (cons "~/.emacs.d/site-lisp/twittering-mode/" load-path)
;      load-path (cons "~/.emacs.d/site-lisp/zencoding/" load-path)
;      )
 
;; ins: 2010-08-29T07:10+09:00
(add-to-list 'load-path "~/.emacs.d/site-lisp")
(add-to-list 'load-path "~/.emacs.d/auto-install")
 
(add-to-list 'load-path "~/.emacs.d/site-lisp/migemo-0.40")
;(add-to-list 'load-path "~/.emacs.d/site-lisp/apel-10.7")
(add-to-list 'load-path "~/.emacs.d/site-lisp/apel") ; cvs で 10.8 を checkout
(add-to-list 'load-path "~/.emacs.d/site-lisp/elscreen-1.4.6")
(add-to-list 'load-path "~/.emacs.d/site-lisp/wp-emacs") ; これは使わなさげ
(add-to-list 'load-path "~/.emacs.d/site-lisp/ac")
(add-to-list 'load-path "~/.emacs.d/site-lisp/twittering-mode")
(add-to-list 'load-path "~/.emacs.d/site-lisp/zencoding")

グローバルなキーバインド

C-p 押しっぱなしによる上方向へのカーソル移動が非常にモッサリ,もしくはまったく動かないため,C-@ にも同様の役割を持たせるなど.

(global-set-key "\C-@" 'previous-line)  ; C-p 押しっぱなしだとモッサリするため
(global-set-key "\C-z" nil)             ; 最小化うざい

また,M-nM-p を「前後のバッファへの切り替え」に割り当てていましたが,auto-complete の候補選択に競合してしまうため,これらを無効に.

;; バッファ切り替えを簡単に
;(global-set-key "\M-n" 'next-buffer)
;(global-set-key "\M-p" 'previous-buffer)

カーソル点滅速度の調整

これをやりたかったのです.

(setq blink-cursor-interval 0.15)

ちなみに,デフォルト値は 0.5 です.

TAB時にスペースを

;; insert spaces when TAB
;; ref: WEB+DB PRESS vol.58 p.78
(setq-default indent-tabs-mode nil)

かっこ対応表示

ss-2010-08-28-01
;; ref: WEB+DB PRESS vol.58 p.78
(setq show-paren-delay 0)
(setq show-paren-style 'expression)
(set-face-background 'show-paren-match-face nil)
(set-face-underline-p 'show-paren-match-face "#99ff00")
(set-face-background 'show-paren-mismatch-face "#ff0000")
(set-face-underline-p 'show-paren-mismatch-face nil)
ss-2010-08-28-02

複数行にわたる場合,けっこううっとうしいので,そのうち変更してしまうでしょうけどねw

HTML記述環境

これまでは,関連ファイルを開いたときに xml-mode を呼びながらも,エラーで赤一色になってしまうため,毎回手動で sgml-mode に切り替えていました.

これを機に,直接 sgml-mode で開くように修正しました.ついでに,\ を入力しても ¥ が入ってしまっていたので,これも補正してみました.

;;
;; xml-mode
;;
;; (setq auto-mode-alist (append '(("\\.html$" . xml-mode)) auto-mode-alist))
;; (setq auto-mode-alist (append '(("\\.tpl$" . xml-mode)) auto-mode-alist))
;;;; Text::MicroTemplate
;;(setq auto-mode-alist (append '(("\\.mt$" . xml-mode)) auto-mode-alist))
 
;;
;; sgml-mode
;;
(setq auto-mode-alist (append '(("\\.html$" . sgml-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.tpl$" . sgml-mode)) auto-mode-alist))
(add-hook 'sgml-mode-hook
          '(lambda ()
             (define-key sgml-mode-map [] "\\")))

インストール作業をラクに

install-elisp と,その後継となる auto-install を追加.今考えてみると,後者だけで問題なさげですね><

それにしても,これのおかげで,elispのインストール作業効率が,100倍くらい上がったのではないでしょうか.最初に入れておくべき一品でしょうw

;;
;; install-elisp
;;
(require 'install-elisp)
(setq install-elisp-repository-directory "~/.emacs.d/site-lisp/")
 
;;
;; auto-install
;;
(require 'auto-install)
(setq auto-install-directory "~/.emacs.d/auto-install/")
(auto-install-update-emacswiki-package-name t)
(auto-install-compatibility-setup)             ; install-elisp との互換性確保

C-aC-e を拡張したり

C-a を押す度に,行頭 → バッファの先頭 → 元の位置,とカーソル位置が切り替わる,などの拡張が行われます.

;;
;; sequential-command
;;   ref:「Emacsテクニックバイブル」 p.76
;;
(require 'sequential-command-config)
(sequential-command-setup-keys)

「同時押し」というキーバインド

「chord」というネーミングがステキです.

;;
;; key-chord.el
;;   ref:「Emacsテクニックバイブル」 p.78
;;
(require 'key-chord)
(setq key-chord-two-keys-delay 0.04)
(key-chord-mode 1)
 
;; jk: 'view-mode
(key-chord-define-global "jk" 'view-mode)

C-x C-f を拡張

;;
;; ffap
;;   ref:「Emacsテクニックバイブル」 p.83
;;
(ffap-bindings)

ファイル名重複時のバッファ名調整

ss-2010-08-28-05
;;
;; uniquify
;;   ref:「Emacsテクニックバイブル」 p.84
;;
(require 'uniquify)
;; filename<dir> 形式のバッファ名にする
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)
;; * で囲まれたバッファ名は対象外にする
(setq uniquify-ignore-buffers-re "*[^*]+*")
</dir>

バッファ切り替えを賢く

ss-2010-08-28-06
ss-2010-08-28-07
;;
;; iswitchb
;;   ref:「Emacsテクニックバイブル」 p.85
;;
(iswitchb-mode 1)
;; バッファ読み取り関数を iswitchb にする
(setq read-buffer-function 'iswitchb-read-buffer)
;; 部分文字列の代わりに正規表現を使う場合は t に設定する
(setq iswitchb-regexp nil)
;; 新しいバッファを作成するときにいちいち聞いてこない
(setq iswitchb-prompt-newbuffer nil)

UndoとRedoを分離

デフォルトでは,1つのキーバインド(C-/)で Undo/Redo を行いますが,これがなかなかクセモノで,ある程度大きなステップ数になると,思ったところまでうまく戻せないことが多々あります.

Redo+ は,Undo と Redo の機能を分離し,それぞれ別のキーバインドで行えるよう拡張してくれます.

;;
;; redo+
;;   ref:「Emacsテクニックバイブル」 p.123
;;
(require 'redo+)
(global-set-key (kbd "C-M-/") 'redo)
(setq undo-no-redo t) ; 過去のundoがredoされないようにする
;; 大量のundoに耐えられるようにする
(setq undo-limit 600000)
(setq undo-strong-limit 900000)

とはいえ,以前の Undo/Redo 方式に,体がそれなりになじんでしまっているため,もう少し慣れが必要かも.

リージョン選択を賢く

矩形選択が容易になったり,など.

;;
;; sense-region
;;   ref:「Emacsテクニックバイブル」 p.124
;;
(require 'sense-region)
(sense-region-on)

自動補完・候補表示

ss-2010-08-27-04
;;
;; auto-complete
;;
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/site-lisp/ac/ac-dict")
(ac-config-default)
 
(add-hook 'cperl-mode-hook
          '(lambda ()
             (progn
               (setq indent-tabs-mode nil)
               (setq tab-width nil)
 
               ; perl-completion
               (require 'auto-complete)
               (require 'perl-completion)
               (add-to-list 'ac-sources 'ac-source-perl-completion)
               (perl-completion-mode t)
              )))

Emacs で Twitter

ss-2010-08-28-08
;;
;; twittering-mode
;;   ref:「Emacsテクニックバイブル」 p.173
;;
(require 'twittering-mode)
;(setq twittering-status-format
;      "%C{%Y/%m/%d %H:%M:%S} %s > %T // from %f%L%r%R")
(setq twittering-status-format
      "%i %s\n%T\n\t%C{%Y-%m-%d %H:%M:%S} [%f] %r%R\n")
(setq twittering-username "issm")
;; つぶやくとき,ミニバッファではなくて通常のバッファがポップアップしてほしい場合はこれを加える
(setq twittering-update-status-function 'twittering-update-status-from-pop-up-buffer)

Emacs で IRC

;;
;; rcirc
;;   ref:「Emacsテクニックバイブル」 p.178
;;
(setq rcirc-server-alist
      '(
        ("chat.freenode.net" :channels ("#perl-casual" "#yuruperl"))
        ))
(setq rcirc-log-flag t)

デフォルトニックネームの指定方法がまだわかっていません><

migemo:ローマ字で日本語検索

ss-2010-08-28-03
;;
;; migemo
;;   ref:「Emacsテクニックバイブル」 p.113
;;
(require 'migemo)

anything:そしてモダンな Emacs へ

ss-2010-08-28-09

これまでEmacs関連の話題で目にしつつも食わず嫌いな状態(といっても嫌ってはないです)が続いていた anything をついに導入してみました.

;;
;; anything
;;   ref:「Emacsテクニックバイブル」 pp.302-
;;
(require 'anything-startup)
(require 'anything-migemo)
(global-set-key (kbd "S-M-SPC") 'anything)
(define-key anything-map "\C-@" 'anything-previous-line)

何かが変わった気がしました.慣れるにつれて,その変化の大きさに気づくことになるのでしょうね,きっと.

気になること

  • anything + migemo が動作していない.
  • C-p の押しっぱなしはなぜモッサリするのか.

特に C-p の問題については,なんとか解決できたいものです.

おわりに

以上,Emacsな書籍やエントリを参考に(というか大半はサンプルコードそのままですが><),新しく知った機能や設定の変更などのインプットを書き連ねてみました.

ヘルプ(describe-*) の便利さ,migemo によるローマ字で日本語検索,そして anything によるインタフェイス革命(実感するのはこれからですがw),に,特に大きな印象を受けました.

とはいえ,インプットしたからといってすぐに使いこなせるようになるわけではないので.その辺は徐々に慣れていくしかないですね.精進精進,と.

amazonさん

ライトめなEmacsユーザさんであれば,読んでおいてまず損はないでしょう.