Top >

Emacs

Emacs 

emacs.png

Emacsに関するメモ。
設定は全てGentoo Linux上でのEmacs 23で利用しているもの。
一部を除いてそのままWindows上のNTEmacs 22でも利用している。

Contents

  1. 設定サンプル
    1. .emacs
    2. 一般的な設定
    3. 表示関連
    4. dired関連
    5. font-lock関連
    6. ATOK X3関連
  2. 関数メモ
    1. ファイル/バッファ
      1. 読み取り専用/解除の切り替え(toggle-read-only)
      2. 全てのバッファを閉じる(close-all-buffers)
    2. 表示
      1. 行番号の表示(linum-mode)
      2. Diredで不要なファイルの表示切り替え(dired-omit-mode)
    3. 編集
      1. 右にあるS式をkill(kill-sexp)
    4. 検索
      1. バッファ内のgrep(occur)
    5. ウィンドウ
      1. ウィンドウの移動(next-multiframe-window/previous-multiframe-window)
    6. ミニバッファ
      1. インクリメンタルサーチにyank
      2. 以前に実行した関数の履歴を辿る
    7. ユーティリティ
      1. 変数情報の表示(describe-variable)
      2. 関数情報の表示(describe-function)
      3. キー情報の表示(describe-key)
      4. ショートカットキー割り当て一覧(describe-bindings)
      5. 色設定の一覧(list-faces-display)
      6. 色の一覧(list-colors-display)
      7. 構文情報の表示(c-show-syntactic-information)
      8. インデントの設定(c-set-offset)
  3. 便利かもしれない自作一行関数
    1. リージョンに上書きで貼り付け(yank-overwrite-region)
    2. kill-ringを逆にたどる(yank-unpop)

設定サンプル

.emacs

.emacsは、基本的にバージョン・環境などに応じた切り替え用で設定は別ファイルにしている。

;;; for Gentoo
(require 'site-gentoo)

;;; load configurations
(cond
 ((= emacs-major-version 23)
  (progn
    (load "~/.elisp/common")
    (load "~/.elisp/dired")
    (load "~/.elisp/iiimecf")
    (if window-system
        (progn
          (load "~/.elisp/display")
          (load "~/.elisp/font-lock")
          (load "~/.elisp/jdee")
          (load "~/.elisp/nxml")
;;          (load "/usr/share/emacs/site-lisp/nxhtml/autostart.el")
          ))
    ))
 ((= emacs-major-version 22)
  (progn
    (load "~/.elisp/common")
    (load "~/.elisp/dired")
    (load "~/.elisp/wb-line-number")
    (if window-system
        (progn
          (load "~/.elisp/display-22")
          (load "~/.elisp/font-lock")
          (load "~/.elisp/jdee")
          (load "~/.elisp/nxml")
          ))
    ))
 )

一般的な設定

;;; language
(set-language-environment "Japanese")

;;; character-code
(prefer-coding-system 'utf-8-unix)
(set-default-coding-systems 'utf-8)
(set-buffer-file-coding-system 'utf-8-unix)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)

;;; behavior
(setq next-line-add-newlines nil)         ; ファイルの終端で勝手に新しい行を作らない
(setq scroll-step 1)                      ; 1行ずつスクロール
(setq next-screen-context-lines 1)        ; C-v/M-vで前のページの1行を残す
(setq kill-whole-line t)                  ; C-kで改行も切り取る
(setq transient-mark-mode nil)            ; リージョンをハイライトしない
(setq x-select-enable-clipboard t)        ; killringとクリップボードを同期する
(setq dabbrev-case-fold-search nil)       ; 動的保管にて大文字・小文字を区別する
(setq-default show-trailing-whitespace t) ; 行末の不要なスペースを強調表示する
(setq-default tab-width 4)                ; タブ幅
(setq-default indent-tabs-mode nil)       ; インデントにタブを使わない
(setq compilation-scroll-output t)        ; コンパイル時に出力を追って表示する
(setq recenter-positions '(middle))       ; C-l(recenter-top-bottom)をmiddleのみに限定
(add-hook 'before-save-hook 'delete-trailing-whitespace) ; 保存時に無駄なスペースを削除

;;; delete, backspace and help
(keyboard-translate ?\C-h ?\C-?)
(keyboard-translate ?\C-? ?\C-h)
(global-set-key "\C-h" 'backward-delete-char)

;;; key customize
(global-set-key [zenkaku-hankaku] 'toggle-input-method)
(global-set-key [C-next] 'next-multiframe-window)
(global-set-key [C-prior] 'previous-multiframe-window)
(global-set-key [M-next] 'next-buffer)
(global-set-key [M-prior] 'previous-buffer)
(global-set-key [?\C->] 'next-buffer)
(global-set-key [?\C-<] 'previous-buffer)
(global-set-key [?\C-.] 'next-multiframe-window)
(global-set-key [?\C-,] 'previous-multiframe-window)
(global-set-key [?\M-n] 'next-error)
(global-set-key [?\M-p] 'previous-error)
(global-set-key [?\C-\S-w] 'delete-region)
(global-set-key [f1] 'help)
(global-set-key [f2] 'previous-error)
(global-set-key [f3] 'next-error)
(global-set-key [f4] 'recentf-open-files)
(global-set-key [f5] 'revert-buffer)
(global-set-key [f8] 'compile)
(global-set-key [f9] 'goto-line)
(global-set-key [f10] 'grep-find)

;;; custom functions
(defun yank-unpop () (interactive) (yank-pop -1))
(defun yank-overwrite-region () (interactive) (delete-region (mark) (point)) (yank))
(defun close-all-buffers () (interactive) (mapc 'kill-buffer (buffer-list)))
(global-set-key [?\M-Y] 'yank-unpop)
(global-set-key [?\C-\S-y] 'yank-overwrite-region)

;;; mode-line
(display-time)
(column-number-mode t)

;;; semantic.cache
(setq semanticdb-default-save-directory (expand-file-name "~/.semantic.cache/"))

;;; extension
(setq auto-mode-alist
      (append
       '(("\\.h$" . c++-mode))
       '(("\\.js$" . javascript-mode))
       '(("\\.jsm$" . javascript-mode))
       '(("\\.x?html$". nxml-mode))
       '(("\\.htm$". nxml-mode))
       '(("\\.jsp$" . nxml-mode))
       '(("\\.xsd$" . nxml-mode))
       '(("\\.xsl$" . nxml-mode))
       '(("\\.xml$" . nxml-mode))
       '(("\\.xul$" . nxml-mode))
       '(("\\.rdf$" . nxml-mode))
       '(("\\.tag$" . nxml-mode))
       '(("\\.wsdl$" . nxml-mode))
       '(("\\.sql$" . sql-mode))
       '(("\\.pks$" . sql-mode))
       '(("\\.pkb$" . sql-mode))
       '(("\\.war$" . archive-mode))
       '(("\\.ear$" . archive-mode))
       auto-mode-alist))

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

;;; recent files
(recentf-mode t)
(setq recentf-max-saved-items 50)

;;; saveplace
(require 'saveplace)
(setq-default save-place t)

;;; mouse wheel
(if window-system
    (mwheel-install))

;;; utility functions
(setq grep-find-command-java "find %s -type f -name '*.java' -o -name '*.jsp' | xargs grep -Hn %s")

(defun grep-find-java (regexp)
  (interactive "sGrep-find (regexp): ")
  (grep-find (format grep-find-command-java "." regexp)))

(defun grep-find-java-dir (root regexp)
  (interactive "DGrep-find (directory): \nsGrep-find (regexp): ")
  (grep-find (format grep-find-command-java root regexp)))

表示関連

;;; scroll bar
(set-scroll-bar-mode 'right)

;;; tool bar
(blink-cursor-mode 0)
(auto-image-file-mode t)
(menu-bar-mode -1)
(tool-bar-mode 0)
(tooltip-mode 0)
(setq tooltip-delay 0.1)

;;; font-set
(set-default-font "Monospace-10")
(set-fontset-font
 (frame-parameter nil 'font)
 'japanese-jisx0208
 '("VL ゴシック" . "unicode-bmp"))

;;; frame
(setq default-frame-alist (append(list
				  '(foreground-color . "#fafafa")
				  '(background-color . "#001039")
				  '(cursor-color . "#fafafa")
				  '(pointer-color . "#fafafa")
				  '(width . 125)
				  '(height . 64)
				  '(top . 20)
				  '(left . 365)
				  '(title . "Emacs 23")
				  '(fontset . "default")
				  )
				 default-frame-alist))

dired関連

;;; configuration for dired

;;; hook
(add-hook 'dired-load-hook
          (lambda ()
            (load "dired-x")
            ))

font-lock関連

;;; font-lock
(global-font-lock-mode t)

;(setq font-lock-support-mode 'fast-lock-mode)

(let* ((file-dir "~/.emacs-flc"))
  (if (file-exists-p file-dir) ; ~/.emacs-flc の存在をチェック
      ;; 存在するならば、キャッシュファイルの格納先に指定
      (setq fast-lock-cache-directories (list file-dir))))

;; Bilt in
(set-face-foreground 'font-lock-builtin-face "#0080ff")
(set-face-bold-p 'font-lock-builtin-face t)
;; コメント
(set-face-foreground 'font-lock-comment-delimiter-face "#00e000")
(set-face-foreground 'font-lock-comment-face "#00e000")
;; コンスタント
(set-face-foreground 'font-lock-constant-face "#b2e7fb")
;; doc (javadoc etc.)
(set-face-foreground 'font-lock-doc-face "#72de5d")
;; 関数名 タグ名など
(set-face-foreground 'font-lock-function-name-face "#00ffff")
;; Keyword
(set-face-foreground 'font-lock-keyword-face "#0080ff")
(set-face-bold-p 'font-lock-keyword-face t)
;; negation character
;(set-face-foreground 'font-lock-negation-char-face "red")
;; preprocessor
;(set-face-foreground 'font-lock-preprocessor-face "red")
;; 正規表現
;(set-face-foreground 'font-lock-regexp-grouping-backslash "")
;(set-face-foreground 'font-lock-regexp-grouping-construct "")
;; 文字列
(set-face-foreground 'font-lock-string-face "#888888")
;; Type
(set-face-foreground 'font-lock-type-face "#92b7ff")
;; 変数名
(set-face-foreground 'font-lock-variable-name-face "#fafafa")
;; warning?
;(set-face-foreground 'font-lock-warning-face "#fafafa")

ATOK X3関連

全然記憶にない。何かのコピペ。

(setq iiimcf-server-control-hostlist (list (concat "/tmp/.iiim-" (user-login-name) "/:0.0")))
(when (and (= 0 (shell-command
                 (concat
                  "netstat --unix -l | grep -q " (car iiimcf-server-control-hostlist))))
           (require 'iiimcf-sc nil t))
  (setq iiimcf-server-control-default-language "ja")
  (setq iiimcf-server-control-default-input-method "atokx3")
  (setq default-input-method 'iiim-server-control))

関数メモ

よく使う関数、忘れがちな関数、知らなかった関数を何となくメモっておく。

ファイル/バッファ

読み取り専用/解除の切り替え(toggle-read-only)

機能
カレントバッファの読み取り専用状態を切り替える。
キー
C-x C-q

全てのバッファを閉じる(close-all-buffers)

機能
開いている全てのバッファを閉じる。
関数定義
(defun close-all-buffers ()
  (interactive)
  (mapc 'kill-buffer (buffer-list)))
参考サイト
http://osdir.com/ml/emacs.windows/2006-05/msg00012.html

表示

行番号の表示(linum-mode)

機能
行番号を表示する。(Emacs 23以降)
Emacs 22以前は、wb-line-numberを利用していた。

Diredで不要なファイルの表示切り替え(dired-omit-mode)

機能
Dired時にバックアップファイルなどの不要なファイルの表示/非表示を切り替える。
キー
M-o

編集

右にあるS式をkill(kill-sexp)

機能
カーソルの右にあるS式を1つkillする。
キー
C-M-k

検索

バッファ内のgrep(occur)

機能
バッファ内を正規表現で検索して一覧表示する。
grep-find同様、検索結果をprevious-error,next-errorで辿れる。
キー
M-s o

ウィンドウ

ウィンドウの移動(next-multiframe-window/previous-multiframe-window)

機能
分割表示しているウィンドウを移動する。other-windowとは異なる。
キー
デフォルトではないが、何か設定しておくと便利。
3つ以上に分割しているとother-window(C-x o)だけでは煩わしい。

ミニバッファ

インクリメンタルサーチにyank

機能
インクリメンタルサーチ中のミニバッファにyankする。
キー
C-x M-y

以前に実行した関数の履歴を辿る

機能
M-xで関数入力時に、M-nまたはM-pで過去の実行履歴を辿れる。
関数だけではなく対話的に入力する引数の履歴も辿れる事を忘れがち。
キー
M-xの後、M-nまたはM-p

ユーティリティ

変数情報の表示(describe-variable)

機能
変数の説明と現在の値などを表示する。

関数情報の表示(describe-function)

機能
関数の説明と設定されているショートカットキーなどを表示する。

キー情報の表示(describe-key)

機能
ショートカットキーにバインドされている関数の情報を表示する。

ショートカットキー割り当て一覧(describe-bindings)

機能
ショートカットキーとバインドされている関数の一覧を表示する。

色設定の一覧(list-faces-display)

機能
faceの名前とそれに設定されている色の一覧を表示する。

色の一覧(list-colors-display)

機能
色の名前とその16進数RGB値の一覧を表示する。

構文情報の表示(c-show-syntactic-information)

機能
カレント行の構文情報を表示する。
c-set-offsetなどで何を設定すれば良いのかを調べるのに便利。
キー
C-c C-s

インデントの設定(c-set-offset)

機能
インデントの設定を行う。
バッファ内で実行すると、カレント行の構文シンボルが自動的に入力されているので便利。
これで設定を試した後、実際に.emacsなどに記述するといった感じ。
キー
C-c C-o

便利かもしれない自作一行関数

リージョンに上書きで貼り付け(yank-overwrite-region)

機能
リージョン内の文字列に上書きでyankする。
関数定義
(defun yank-overwrite-region () (interactive) (delete-region (mark) (point)) (yank))

コーディングしているとよくあるのが、同じペーストを上書きで繰り返したい事。
かといってマクロを使うほど大げさでも無いといった感じで…。

んでしょうがないので、通常の貼り付け(yank)と切り取り(kill-region)や一行カット(kill-line)でペーストを繰り返そうとすると、kill-regionやkill-lineによってkill-ringが更新されてしまうので、yankが、2個目でyank+yank-pop、3個目はyank+yank-pop+yank-popと切ない感じになっていく…。

んで、リージョンに対して上書きでyankできたら便利だなぁっと思って作った関数。
自分は、

(global-set-key [?\C-\S-y] 'yank-overwrite-region)

こんな感じで、Ctrl+Shift+yに割り当てて使っている。
時々便利♪

delete-regionにショートカットを割り当てるってのもありだったか…。
Ctrl+Shift+W辺りに良いかも。
そうなるとkill-lineもCtrl+Shift+Kでdelete-lineを…なんて関数無かった。まぁつくりゃあいいのか。

kill-ringを逆にたどる(yank-unpop)

機能
yankの後、kill-ringを逆順にたどる。
関数定義
(defun yank-unpop () (interactive) (yank-pop -1))

yankした後に、kill-ringをたどるためにAlt+y(yank-pop)を連打する事はよくある事。
そんなとき、kill-ringの目的のテキストを通り過ぎるとちょっと切ない感じになる。

普通は、undo(Ctrl+/)すれば、戻れるのでこれで問題ないのだが、間抜けな事にまたさらに行き過ぎたりする(T-T)
そうなると、再度yank-popしてももうkill-ringは辿れない。もう一度yankからやり直し。

そこで、yank-popで逆に辿れればkill-ringを行ったり来たりが自由自在になるだろうという事で作った関数。
これを

(global-set-key [?\M-Y] 'yank-unpop)

こんな感じで、Alt+Shift+yに割り当てると、yankのあとAlt+yでkill-ringを進み、Alt+Shift+yでkill-ringを逆に辿れる。
もちろん、何度も行ったり来たり可能。
ちょっと便利♪