2010年9月1日水曜日

Emacs仕事術(1) インストールと初期・日本語設定


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


前の仕事PCがぶっ壊れて起動しなくなったため、使わなくなった検証PCに仕事環境を構築した。

いずれ新PCが届いたら(会社の申請と発注の関係で2カ月くらいはかかりそう)に移行するので、がっつり環境構築するのも面倒なので、NTEmacsにできるだけポータビリティを持たせて環境構築し、新PCが来たら最小の労力で移行できるように環境を整えた。

ついでなので、最新のNTEmacsへ移行し、基本的な仕事は全てそこでできるように頑張ってみる。

** 基本環境の構築

*** インストール
**** 方針
・Windows XP SP3 32bit Core2Duo, 1GBメモリ
・Ntemacsを使う
・極力追加インストールが必要なソフトは避ける(elispだけで実現する)
・Cygwinは使わない(パス解釈がNTEmacsと違うので厄介)


**** インストール方法
gnupackプロジェクトでコンパイル&日本語パッチ適用済みのバイナリが配布されているので、これを使う。

入手先:http://sourceforge.jp/projects/gnupack/releases/?package_id=10839


入手したら、解凍し、C:\emacs へ配置する。

ここで使ったのはNTEmacs23.2


**** 起動ショートカットの作成と環境変数の設定
バッチファイルを、C:\emacs\bin\emacs.bat 作成
---------------------------------
rem 以下のディレクトリが無ければ作成しておく
rem このディレクトに.emacsを作成し、カスタマイズしていく
set HOME=C:\emacs\home
runemacs.exe
---------------------------------
この設定はOS環境変数としても設定しても良いが、いずれPCを移行する関係上、
設定の集約を行うため、上記のような運用にした。

これでemacs.bat を実行すればとりあえずはNTEmacsが起動してくる。
好きな場所にemacs.batへのショートカットを作成しておく。


*** 初期設定と日本語環境整備
基本的な日本語環境のため、以下の設定をc:\emacs\home\.emacs ファイルを作成し記述する。
*ほとんどネットで見つけたものを組み合わせて使っています。

詳細はコメントを参照。

事前に以下を取得して、c:\emacs\site-lisp\site-lispへ入れておく。 http://nijino.homelinux.net/emacs/cp5022x.el
↓↓↓↓↓↓ここから↓↓↓↓↓↓
; -*- Mode: Emacs-Lisp ; Coding: utf-8 -*-

;; ---------------------------------------------
;; 日本語設定
;; ---------------------------------------------

; デフォルト言語を日本語に
(set-language-environment "Japanese")

; デフォルト文字コードをUTF8に、改行コードをUNIXに
(set-default-coding-systems 'utf-8-unix)

; ファイル名をSJISで取り扱う
(setq default-file-name-coding-system 'sjis-dos)

; IMEの設定
(setq default-input-method "W32-IME")

; IMEの初期化
(w32-ime-initialize)

; IME OFF時の初期カーソルカラー
(set-cursor-color "red")

; IME ON/OFF時のカーソルカラー
(add-hook 'input-method-activate-hook
          (lambda() (set-cursor-color "green")))
(add-hook 'input-method-inactivate-hook
          (lambda() (set-cursor-color "red")))

; バッファ切り替え時にIME状態を引き継ぐ
(setq w32-ime-buffer-switch-p nil)


;; ---------------------------------------------
;; 表示フォントの設定
;; ---------------------------------------------

; デフォルトフォントの設定
(set-default-font "MS ゴシック-10")



;; ---------------------------------------------
;; 機種依存文字
;; http://nijino.homelinux.net/emacs/cp5022x.el
;; ---------------------------------------------

(require 'cp5022x)
(define-coding-system-alias 'euc-jp 'cp51932)

;; decode-translation-table の設定
(coding-system-put 'euc-jp :decode-translation-table
     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
(coding-system-put 'iso-2022-jp :decode-translation-table
     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
(coding-system-put 'utf-8 :decode-translation-table
     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))

;; encode-translation-table の設定
(coding-system-put 'euc-jp :encode-translation-table
     (get 'japanese-ucs-cp932-to-jis-map 'translation-table))
(coding-system-put 'iso-2022-jp :encode-translation-table
     (get 'japanese-ucs-cp932-to-jis-map 'translation-table))
(coding-system-put 'cp932 :encode-translation-table
     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
(coding-system-put 'utf-8 :encode-translation-table
     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))

;; charset と coding-system の優先度設定
(set-charset-priority 'ascii 'japanese-jisx0208 'latin-jisx0201
          'katakana-jisx0201 'iso-8859-1 'cp1252 'unicode)
(set-coding-system-priority 'utf-8 'euc-jp 'iso-2022-jp 'cp932)

;; PuTTY 用の terminal-coding-system の設定
(apply 'define-coding-system 'utf-8-for-putty
       "UTF-8 (translate jis to cp932)"
       :encode-translation-table 
       (get 'japanese-ucs-jis-to-cp932-map 'translation-table)
       (coding-system-plist 'utf-8))
(set-terminal-coding-system 'utf-8-for-putty)

;; East Asian Ambiguous
(defun set-east-asian-ambiguous-width (width)
  (while (char-table-parent char-width-table)
    (setq char-width-table (char-table-parent char-width-table)))
  (let ((table (make-char-table nil)))
    (dolist (range 
         '(#x00A1 #x00A4 (#x00A7 . #x00A8) #x00AA (#x00AD . #x00AE)
          (#x00B0 . #x00B4) (#x00B6 . #x00BA) (#x00BC . #x00BF)
          #x00C6 #x00D0 (#x00D7 . #x00D8) (#x00DE . #x00E1) #x00E6
          (#x00E8 . #x00EA) (#x00EC . #x00ED) #x00F0 
          (#x00F2 . #x00F3) (#x00F7 . #x00FA) #x00FC #x00FE
          #x0101 #x0111 #x0113 #x011B (#x0126 . #x0127) #x012B
          (#x0131 . #x0133) #x0138 (#x013F . #x0142) #x0144
          (#x0148 . #x014B) #x014D (#x0152 . #x0153)
          (#x0166 . #x0167) #x016B #x01CE #x01D0 #x01D2 #x01D4
          #x01D6 #x01D8 #x01DA #x01DC #x0251 #x0261 #x02C4 #x02C7
          (#x02C9 . #x02CB) #x02CD #x02D0 (#x02D8 . #x02DB) #x02DD
          #x02DF (#x0300 . #x036F) (#x0391 . #x03A9)
          (#x03B1 . #x03C1) (#x03C3 . #x03C9) #x0401 
          (#x0410 . #x044F) #x0451 #x2010 (#x2013 . #x2016)
          (#x2018 . #x2019) (#x201C . #x201D) (#x2020 . #x2022)
          (#x2024 . #x2027) #x2030 (#x2032 . #x2033) #x2035 #x203B
          #x203E #x2074 #x207F (#x2081 . #x2084) #x20AC #x2103
          #x2105 #x2109 #x2113 #x2116 (#x2121 . #x2122) #x2126
          #x212B (#x2153 . #x2154) (#x215B . #x215E) 
          (#x2160 . #x216B) (#x2170 . #x2179) (#x2190 . #x2199)
          (#x21B8 . #x21B9) #x21D2 #x21D4 #x21E7 #x2200
          (#x2202 . #x2203) (#x2207 . #x2208) #x220B #x220F #x2211
          #x2215 #x221A (#x221D . #x2220) #x2223 #x2225
          (#x2227 . #x222C) #x222E (#x2234 . #x2237)
          (#x223C . #x223D) #x2248 #x224C #x2252 (#x2260 . #x2261)
          (#x2264 . #x2267) (#x226A . #x226B) (#x226E . #x226F)
          (#x2282 . #x2283) (#x2286 . #x2287) #x2295 #x2299 #x22A5
          #x22BF #x2312 (#x2460 . #x24E9) (#x24EB . #x254B)
          (#x2550 . #x2573) (#x2580 . #x258F) (#x2592 . #x2595) 
          (#x25A0 . #x25A1) (#x25A3 . #x25A9) (#x25B2 . #x25B3)
          (#x25B6 . #x25B7) (#x25BC . #x25BD) (#x25C0 . #x25C1)
          (#x25C6 . #x25C8) #x25CB (#x25CE . #x25D1) 
          (#x25E2 . #x25E5) #x25EF (#x2605 . #x2606) #x2609
          (#x260E . #x260F) (#x2614 . #x2615) #x261C #x261E #x2640
          #x2642 (#x2660 . #x2661) (#x2663 . #x2665) 
          (#x2667 . #x266A) (#x266C . #x266D) #x266F #x273D
          (#x2776 . #x277F) (#xE000 . #xF8FF) (#xFE00 . #xFE0F) 
          #xFFFD
          ))
  (set-char-table-range table range width))
    (optimize-char-table table)
    (set-char-table-parent table char-width-table)
    (setq char-width-table table)))
(set-east-asian-ambiguous-width 2)

;; emacs-w3m
(eval-after-load "w3m"
  '(when (coding-system-p 'cp51932)
     (add-to-list 'w3m-compatible-encoding-alist '(euc-jp . cp51932))))

;; Gnus
(eval-after-load "mm-util"
  '(when (coding-system-p 'cp50220)
     (add-to-list 'mm-charset-override-alist '(iso-2022-jp . cp50220))))

;; SEMI (cf. http://d.hatena.ne.jp/kiwanami/20091103/1257243524)
(eval-after-load "mcs-20"
  '(when (coding-system-p 'cp50220)
     (add-to-list 'mime-charset-coding-system-alist 
          '(iso-2022-jp . cp50220))))

;; 全角チルダ/波ダッシュをWindowsスタイルにする
(let ((table (make-translation-table-from-alist '((#x301c . #xff5e))) ))
  (mapc
   (lambda (coding-system)
     (coding-system-put coding-system :decode-translation-table table)
     (coding-system-put coding-system :encode-translation-table table)
     )
   '(utf-8 cp932 utf-16le)))


;; cp932エンコード時の表示を「P」とする
(coding-system-put 'cp932 :mnemonic ?P)
(coding-system-put 'cp932-dos :mnemonic ?P)
(coding-system-put 'cp932-unix :mnemonic ?P)
(coding-system-put 'cp932-mac :mnemonic ?P)



;; ---------------------------------------------
;; 基本設定
;; ---------------------------------------------

(setq default-directory "~/")            ; 初期ディレクトリを設定
(setq inhibit-startup-message t)         ; 起動画面を消す
(setq w32-enable-synthesized-fonts t)    ; 文字飾りを有効にする
(setq initial-scratch-message "")        ; scratchバッファの初期メッセージを消す
(tool-bar-mode nil)                      ; メニューバー、ツールバー非表示
(scroll-bar-mode t)                      ; スクロールバーの表示
(setq visible-bell nil)                  ; ヴィジブルベルを抑制
(setq ring-bell-function '(lambda ()))   ; ビープ音を抑制
(fset 'yes-or-no-p 'y-or-n-p)            ; yes/no を y/n へ簡略化

; ガベージコレクションの頻度を落とす
(setq gc-cons-threshold (* 1024 1024 50))


;; ---------------------------------------------
;; ファイルの自動バックアップ
;; ---------------------------------------------

; バックアップファイルを一箇所にまとめる
(setq make-backup-files t)
(setq backup-directory-alist
      (cons (cons "\\.*$" (expand-file-name "~/.emacs.d/backup"))
 backup-directory-alist))

; バックアップのバージョン管理を行う
(setq version-control t)
  
; 新しいものをいくつ残すか
(setq kept-new-versions 3)

; 古いものをいくつ残すか
(setq kept-old-versions 3)

; 古いバージョンを消去するのに確認を求めない。
(setq delete-old-versions t)



;; ---------------------------------------------
;; バッファ操作
;; ---------------------------------------------

; C-c b 時のバッファ切り替えにインクリメンタルサーチを使う
(iswitchb-mode 1)

; C-c b 時にお手軽バッファ切替
(add-hook 'iswitchb-define-mode-map-hook
      (lambda ()
        (define-key iswitchb-mode-map "\C-n" 'iswitchb-next-match)
        (define-key iswitchb-mode-map "\C-p" 'iswitchb-prev-match)
        (define-key iswitchb-mode-map "\C-f" 'iswitchb-next-match)
        (define-key iswitchb-mode-map "\C-b" 'iswitchb-prev-match)))



;; ---------------------------------------------
;; バッファ表示
;; ---------------------------------------------

; バッファ中の行番号表示
(global-linum-mode t)

; 行番号のフォーマット
(set-face-attribute 'linum nil :foreground "red" :height 0.8)
(setq linum-format "%4d")

; カーソル点滅表示
(blink-cursor-mode 0)

; スクロール時のカーソル位置の維持
(setq scroll-preserve-screen-position t)

; スクロール行数(一行ごとのスクロール)
(setq vertical-centering-font-regexp ".*")
(setq scroll-conservatively 35)
(setq scroll-margin 0)
(setq scroll-step 1)

; 画面スクロール時の重複行数
(setq next-screen-context-lines 1)

; スタートアップ時のエコー領域メッセージの非表示
;(setq inhibit-startup-echo-area-message -1)

; カーソル行にアンダーラインを引く
(setq hl-line-face 'underline)
(global-hl-line-mode)

; 行間を指定
(setq-default line-spacing 0.2)

;; バッファ画面外文字の切り詰め表示
(setq truncate-lines nil)

;; ウィンドウ縦分割時のバッファ画面外文字の切り詰め表示
(setq truncate-partial-width-windows t)

;; 同一バッファ名にディレクトリ付与
(require 'uniquify)
(setq uniquify-buffer-name-style 'forward)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)
(setq uniquify-ignore-buffers-re "*[^*]+*")



;; ---------------------------------------------
;; モードライン表示
;; ---------------------------------------------

; 行番号の表示
(line-number-mode t)

; 列番号の表示
(column-number-mode t)

; 日付、時刻の表示
(require 'time)
(setq display-time-24hr-format t)
(setq display-time-string-forms
      '( year  "/" month "/" day "(" dayname ") " 24-hours ":" minutes))
(display-time-mode t)



;; ---------------------------------------------
;; *scratch* バッファをkillさせない。
;; ---------------------------------------------

(defun my-make-scratch (&optional arg)
  (interactive)
  (progn
    ;; "*scratch*" を作成して buffer-list に放り込む
    (set-buffer (get-buffer-create "*scratch*"))
    (funcall initial-major-mode)
    (erase-buffer)
    (when (and initial-scratch-message (not inhibit-startup-message))
      (insert initial-scratch-message))
    (or arg (progn (setq arg 0)
                   (switch-to-buffer "*scratch*")))
    (cond ((= arg 0) (message "*scratch* is cleared up."))
          ((= arg 1) (message "another *scratch* is created")))))

(add-hook 'kill-buffer-query-functions
          ;; *scratch* バッファで kill-buffer したら内容を消去するだけにする
          (lambda ()
            (if (string= "*scratch*" (buffer-name))
                (progn (my-make-scratch 0) nil)
              t)))

(add-hook 'after-save-hook
          ;; *scratch* バッファの内容を保存したら *scratch* バッファを新しく作る
          (lambda ()
            (unless (member (get-buffer "*scratch*") (buffer-list))
              (my-make-scratch 1))))



;; ---------------------------------------------
;; リージョン関連
;; ---------------------------------------------

; リージョンをハイライト(暫定マークモード)
(setq-default transient-mark-mode t)

; バッファ切り替え時にリージョンを保持
(setq highlight-nonselected-windows t)



;; ---------------------------------------------
;; スタイルの設定
;; ---------------------------------------------

;; 初期のウインドウサイズの設定
(setq initial-frame-alist
      (append
       '((top    . 0)                 ; フレーム左上の縦位置(ドット数)
  (left   . 180)               ; フレーム左上の横位置(ドット数)
  (width  . 165)               ; フレーム幅(文字数)
  (height . 75)                ; フレーム高(文字数)
  (alpha . (nil nil nil nil))) ; フレームの透明度 透過率を%指定 nilで0%
       initial-frame-alist))


;; ---------------------------------------------
;; キーバインド
;; ---------------------------------------------

; バッファ一覧を使い易く
(global-set-key "\C-x\C-b" 'buffer-menu)

; C-hをバックスペースに
(global-set-key "\C-h" 'delete-backward-char)

; C-h に割り当てられている関数 help-command を C-x C-h に割り当てる
(define-key global-map "\C-x\C-h" 'help-command)

; help-for-help を F1に
(global-set-key [f1] 'help-for-help)
↑↑↑↑↑↑ここまで↑↑↑↑↑↑
設定を入れ込んでEmacsを再起動すれば、基本的なエディタとしての使用が可能になる(日本語入力等)

入門Meadow/Emacs

入門Meadow/Emacs

価格:2,940円(税込、送料別)