現在の init.el を晒してみた

他のパソコンでも使うので、メモっておく。

;;; .emacs
;(setq debug-on-error t)

;; ===============================================================================
;;
;; Environmental discrimination(環境識別)
;;
;; ===============================================================================
(defvar *run-unix*
  (or (equal system-type 'gnu/linux)
      (equal system-type 'darwin)
      (equal system-type 'usg-unix-v)))
(defvar *run-windows*
  (and (null *run-unix*)
       (or (equal system-type 'windows-nt)
           (equal system-type 'ms-dos))))
(defvar *run-macosx*
  (and *run-unix*
       (null *run-windows*)
       (and (equal window-system 'ns)
            (equal system-type 'darwin))))
(defvar *run-win32*
  (and (null *run-unix*)
       *run-windows*
       (equal system-type 'w32)))
(defvar *run-emacs20*
  (and (equal emacs-major-version 20)
       (null (featurep 'xemacs))))
(defvar *run-emacs21*
  (and (equal emacs-major-version 21)
       (null (featurep 'xemacs))))
(defvar *run-emacs22*
  (and (equal emacs-major-version 22)
       (null (featurep 'xemacs))))
(defvar *run-emacs23*
  (and (equal emacs-major-version 23)
       (null (featurep 'xemacs))))
(defvar *run-meadow* (featurep 'meadow))
(defvar *run-meadow1* (and *run-meadow* *run-emacs20*))
(defvar *run-meadow2* (and *run-meadow* *run-emacs21*))
(defvar *run-meadow3* (and *run-meadow* *run-emacs22*))
(defvar *run-xemacs* (featurep 'xemacs))
(defvar *run-xemacs-no-mule*
  (and *run-xemacs* (not (featurep 'mule))))


;; ===============================================================================
;;
;; User script directory(ユーザースクリプト用ディレクトリ)
;;
;; ===============================================================================
(setq load-path (cons "~/.emacs.d/conf" load-path))
(setq load-path (cons "~/.emacs.d/elisp" load-path))
(setq load-path (cons "~/.emacs.d/elisp/ruby" load-path))
(setq load-path (cons "~/.emacs.d/egg" load-path))


;; ===============================================================================
;;
;; i18n(国際化と地域化)
;;
;; ===============================================================================
;; 日本語環境を指定します。
(set-language-environment "Japanese")

;; メニューを日本語化します。
;; 文字化けする場合は、menu-tree.elをロードする前に menu-tree-coding-system に適当な coding-system をセットします。
(if (and (= emacs-major-version 22)
         (eq window-system 'x))
    (setq menu-tree-coding-system 'utf-8))
(require 'menu-tree)
;; 「utf-8」の部分は各自の環境に合わせて設定してください。
;(require 'menu-tree nil t)


;; ===============================================================================
;;
;; Charset Encoding(文字エンコーディング)
;;
;; ===============================================================================
(if *run-windows*
    (progn
      (if *run-meadow*
          (set-w32-system-coding-system 'sjis))
      (if (boundp 'set-default-coding-sytem)
          (set-default-coding-sytem 'sjis))
      (set-terminal-coding-system 'sjis)
      (set-clipboard-coding-system 'sjis-dos)
      (set-keyboard-coding-system 'sjis)
      (prefer-coding-system 'sjis))
  ;; else
  (progn
    (if (boundp 'set-default-coding-sytem)
        (set-default-coding-sytem 'utf-8))
    (set-terminal-coding-system 'utf-8)
    (set-clipboard-coding-system 'utf-8-unix)
    (set-keyboard-coding-system 'utf-8)
    (prefer-coding-system 'utf-8)))


;; ===============================================================================
;;
;; IME configuration(IME 設定)
;;
;; ===============================================================================
(when *run-meadow*
  ;; IME のモードごとにカーソル色を変えます。
  (add-hook 'mw32-ime-on-hook
            (function
             (lambda ()
               (set-cursor-height 4)
               (set-cursor-color "maroon"))))
  (add-hook 'mw32-ime-off-hook
            (function
             (lambda ()
               (set-cursor-height 4)
               (set-cursor-color "black"))))
  ;; IME を初期化します。
  (mw32-ime-initialize)
  (setq default-input-method "MW32-IME")
  ;; IME ON/OFF mode-line
  (setq mw32-ime-show-mode-line t)
  ;; IME mode-line indicator
  ;; OFF : [--]
  ;; ON  : [あ]
  (setq-default mw32-ime-mode-line-state-indicator "[--]")
  (setq mw32-ime-mode-line-state-indicator "[--]")
  (setq mw32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]")))


;; ===============================================================================
;;
;; Fonts(フォント)
;;
;; ===============================================================================
;; * フォントの設定
;;
(when *run-windows*
  ;; フォントセットを追加します。
  (load "ms-gothic-13.el")
  (load "ms-ui-gothic-13.el")

  ;; 起動時およびnew-frame時のフレーム(ウィンドウ)の設定。
  (add-to-list 'default-frame-alist '(font . "MS Gothic 13"))
  ;; 現在のフレームの設定(.emacs中では省略可)
  (set-frame-font "MS Gothic 13")

  ;; IMEのフォントを設定。こういう書式でないとだめらしい。
  (let ((logfont '(w32-logfont "MS Gothic" 0 0 400 0 nil nil nil 128 1 3 0)))
    (modify-frame-parameters (selected-frame) (list (cons 'ime-font logfont)))
    (add-to-list 'default-frame-alist (cons 'ime-font logfont)))

  (set-face-font 'mode-line "MS Gothic 13"))


;; ===============================================================================
;;
;; Display theme(ディスプレイテーマ)
;;
;; ===============================================================================

(when window-system
  ;; 選択範囲に色をつけます。
  (setq-default transient-mark-mode t)
  ;; 選択範囲の色を指定します。
  (set-face-background 'region "SkyBlue")
  (set-face-foreground 'region "black")

  ;; カーソルを縦棒にします。
  (if (boundp 'set-cursor-type)
      (set-cursor-type 'hairline-caret)
    (if *run-meadow3*
        (add-to-list 'default-frame-alist '(cursor-type . hairline-caret))
      (add-to-list 'default-frame-alist '(cursor-type . (bar . 5)))))
  ;; カーソルの色を黒にします。
  (set-cursor-color "black")

  ;;
  ;; ** フレーム透過設定
  (if *run-meadow3*
      ;; カレントウィンドウ(ウィンドウ全体?)の透明度です。
      (set-frame-parameter nil 'alpha 85)
    ;; デフォルトの透明度です。
    (add-to-list 'default-frame-alist '(alpha . 85)))

  ;; 一行あたりの文字数は 170 です。
  (add-to-list 'default-frame-alist '(width . 170))
  ;; 20 行を表示します。
  (add-to-list 'default-frame-alist '(height . 20))
  ;; ディスプレイのX座標(ピクセル)
  (add-to-list 'default-frame-alist '(top . 5))
  ;; ディスプレイのY座標(ピクセル)
  (add-to-list 'default-frame-alist '(left . 5))

  ;; 背景色を白にします。
  (add-to-list 'default-frame-alist '(background-color . "white"))
  ;; 文字の色を黒にします。
  (add-to-list 'default-frame-alist '(foreground-color . "black"))

  ;; モードラインの文字色。
  (set-face-foreground 'mode-line "white")
  ;; モードラインの背景色。
  (set-face-background 'mode-line "black")

  ;;
  ;; *** アクティブでないモードラインの文字、背景色
  ;; Meadow 2 では定義されていないようです。
  ;;
  (when (not *run-meadow2*)
    ;; アクティブでないモードラインの文字色。
    (set-face-foreground 'mode-line-inactive "gray30")
    ;; アクティブでないモードラインの背景色。
    (set-face-background 'mode-line-inactive "gray85")))



;; ===============================================================================
;;
;; Highlights(ハイライト)
;;
;; ===============================================================================
(when window-system
  ;; キーワードのカラー表示を有効化します。
  (global-font-lock-mode t)

  ;; コメント
  (set-face-foreground 'font-lock-comment-face "gray55")
  ;; キーワード
  (set-face-foreground 'font-lock-keyword-face "green4")
  ;; キーワードを太文字にします。
  (make-face-bold 'font-lock-keyword-face)
  ;; 関数名
  (set-face-foreground 'font-lock-function-name-face "bisque4")
  ;; 関数名を太文字にします。
  (make-face-bold 'font-lock-function-name-face)
  ;; 変数
  (set-face-foreground 'font-lock-variable-name-face "gray10")
  ;; 文字列
  (set-face-foreground 'font-lock-string-face "blue")
  ;; 定数
  (set-face-foreground 'font-lock-constant-face "OliveDrab3")
  ;; 変数の型
  (set-face-foreground 'font-lock-type-face "PaleGreen4")
  ;; びるといんふぇいす?
  (set-face-foreground 'font-lock-builtin-face "MediumPurple3")
  ;; わーにんぐふぇいす?
  (set-face-foreground 'font-lock-warning-face "LightSteelBlue4")

  ;; ハイライトの文字色。
  (set-face-foreground 'highlight "gray88")
  ;; ハイライトの背景色。
  (set-face-background 'highlight "white"))


;; ===============================================================================
;;
;; Highlights parentheses(括弧のハイライト)
;;
;; ===============================================================================
;; 対応するカッコをハイライト表示します。
(show-paren-mode 1)

;(require 'paren)
;(set-face-background 'show-paren-match-face (face-background 'default))
(set-face-background 'show-paren-match-face "gray85")
;(set-face-foreground 'show-paren-match-face "#def")
;(set-face-attribute 'show-paren-match-face nil :weight 'extra-bold)


;; ===============================================================================
;;
;; Setting the title bar and toolbar(タイトルバーとツールバーの設定)
;;
;; ===============================================================================
;;; タイトルバーにファイル名を表示します。
;; タイトルバーに開いているバッファのパスを表示
;(if *run-meadow*
;    (setq frame-title-format (format "%%f - Meadow@%s" (system-name)))
;    (setq frame-title-format (format "%%f - Emacs@%s" (system-name))))
(when *run-meadow*
  (setq about-meadow (let* ((meadow-about-text (car (split-string (Meadow-version) " ")))
                            (first-hyphen (string-match "-" meadow-about-text)))
                       (store-substring meadow-about-text first-hyphen " ")))
  (setq frame-title-format
        `(" %b [" (buffer-file-name "%f") "] - " about-meadow "@", (system-name))))
;;; %f だと、フルパス名。 %b ならバッファの名前。


;; ===============================================================================
;;
;; Highlight cursor line(カーソル行ハイライト)
;;
;; ===============================================================================
;; カーソルのある行をハイライトします。
(setq hl-line-face 'underline)
(global-hl-line-mode)

(defface hlline-face
         '((((class color)
             (background dark))
            (:background "blue" :foreground "white"))
           (((class color)
             (background light))
            (:background "AliceBlue"))
           (t
            ()))
         "*Face used by hl-line.")
(setq hl-line-face 'hlline-face)


;; ===============================================================================
;;
;; Scrolling(スクロール)
;;
;; ===============================================================================
;; ウィンドウの一番下にカーソルがある場合、そこから下に移動したときに何行スクロールするかの設定です。
;; 以下は 15 行の場合。
; line-setting
(setq next-line-add-newlines nil)
(when (not next-line-add-newlines)
  (line-number-mode 15)
  (column-number-mode 15))

;; スクロール行単位を 1 行にします。
(setq scroll-step 1)
;; 画面をはみ出す場合に 1 行だけスクロールするようにします。
(setq scroll-conservatively 1)
;; カーソルを一番上か一番下まで持っていけます。
(setq scroll-margin 0)


;; ===============================================================================
;;
;; Fringe(フリンジ)
;;
;; ===============================================================================
;; 左フリンジの上下にマークをつける
(setq-default indicate-buffer-boundaries 'left)
;; 右フリンジの上下にマークをつける
(setq-default indicate-buffer-boundaries 'right)

;; 左フリンジの上と右フリンジの下にマークをつける
(setq-default indicate-buffer-boundaries '((top . left) (t . right)))
;; 右フリンジの上と左フリンジの下にマークをつける
(setq-default indicate-buffer-boundaries '((top . right) (t . left)))
;; 右フリンジの上にのみマークをつける
(setq-default indicate-buffer-boundaries '((top . right) (t . nil)))


;; ===============================================================================
;;
;; Key binds(キー割り当て)
;;
;; ===============================================================================
;; i-search for japanese
(define-key isearch-mode-map "\C-k" 'isearch-edit-string)

;; M-g で指定行にカーソルを飛ばします。
(global-set-key "\M-g"
                (lambda (x)
                  (interactive "Line to goto: ")
                  (goto-line x)))

;; *** comment/uncomment-regeon
;; C-x ; でコメントアウト
;; C-x : でコメントをはずす
(global-set-key "\C-x;" 'comment-region)
(fset 'uncomment-region "\C-u\C-[xcomment-region\C-m")
(global-set-key "\C-x:" 'uncomment-region)

;; 自動インデントを行ないます。
(global-set-key "\C-m" 'newline-and-indent)
(global-set-key "\C-j" 'newline)


;; ===============================================================================
;;
;; Useful functions(便利関数)
;;
;; ===============================================================================
;; ** [EOF] を表示します。
;;
(if *run-meadow1*
    (progn
      ;; Meadow 1.99 なら以下のようにすると同じことができるようです。
      (defun set-buffer-end-mark1()
        "At the end of the buffer [EOF] padding. This string can not be edited to be reflected in the file."
        (let ((overlay (make-overlay (point-max) (point-max))))
          (overlay-put overlay 'before-string #("[EOF]" 0 5 (face highlight)))
          (overlay-put overlay 'insert-behind-hooks
                       '((lambda (overlay after beg end &optional len)
                           (when after
                             (move-overlay overlay (point-max) (point-max))))))))
      (add-hook 'find-file-hooks 'set-buffer-end-mark1))
  (progn
    ;; あるいは
    (defun set-buffer-end-mark2()
      "At the end of the buffer [EOF] padding. This string can not be edited to be reflected in the file."
      (let ((overlay (make-overlay (point-max) (point-max))))
        (overlay-put overlay 'before-string #("[EOF]" 0 5 (face highlight)))
        (overlay-put overlay 'insert-behind-hooks
                     '((lambda (overlay after beg end &optional len)
                         (when after
                           (move-overlay overlay (point-max) (point-max))))))))
    (add-hook 'find-file-hooks 'set-buffer-end-mark2)))
;; でもいい。

;; ** スクリプトを保存する時,自動的に chmod +x を行なうようにする
;;
;; 次のようなコードを ~/.emacs に加えておくと、
;; + ファイルの先頭に #! で始まる行が含まれている
;; + ファイル名の先頭がピリオド以外
;; の場合,実行用のスクリプトファイルであると見なして、保存時に実行許可属性を自動的に設定します。
(defun make-file-executable ()
  "Make the file of this buffer executable, when it is a script source."
  (save-restriction
    (widen)
    (if (string= "#!" (buffer-substring-no-properties 1 (min 3 (point-max))))
        (let ((name (buffer-file-name)))
          (or (equal ?. (string-to-char (file-name-nondirectory name)))
              (let ((mode (file-modes name)))
                (set-file-modes name (logior mode (logand (/ mode 4) 73)))
                (message (concat "Wrote " name " (+x)"))))))))
(add-hook 'after-save-hook 'make-file-executable)

;; 日付を挿入します。
(defun my-insert-time ()
  "Insert the date the current cursor location."
  (interactive)
  (insert (format-time-string "%Y-%m-%dT%H:%M:%S")))


;; ===============================================================================
;;
;; SHELL(M-x shell のときの設定)
;;
;; ===============================================================================
(when *run-windows*
  ;; MSYS の bash を使用します。
  (setq explicit-shell-file-name "bash.exe")
  (setq shell-file-name "sh.exe")

  ;; SHELL で ^M が付く場合は ^M を削除します。
  (add-hook 'shell-mode-hook
            (lambda ()
              (set-buffer-process-coding-system 'undecided-dos 'sjis-unix)))
  ;; shell-mode での保管(for drive letter)
  (setq shell-file-name-chars "~/A-Za-z0-9_^$!#%&{}@`'.,:()-")

  ;; shell-modeで上下で補完しモード。
  (setq shell-mode-hook
        (function (lambda ()
                    (define-key shell-mode-map [up] 'comint-previous-input)
                    (define-key shell-mode-map [down]
                                'comint-next-input)))))


;; ===============================================================================
;;
;; Language mode(各言語モード)
;;
;; ===============================================================================
;; Ruby
(autoload 'ruby-mode "ruby-mode"
          "Mode for editing ruby source files" t)
(setq auto-mode-alist
      (append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
                                     interpreter-mode-alist))
;; ECMA Scrirpt
(require 'ecmascript-mode)

;; C++ モード。
(add-hook 'c++-mode-hook
          '(lambda ()
            ;; cc-mode スタイルにします。
            (c-set-style "cc-mode")
            ;; インデントは空白文字で行ないます。
            (setq indent-tabs-mode nil)
            ;; タブ幅を 4 にします。
            (setq tab-width 4)
            ;; 標準オフセットを tab-width と同じにします。
            (setq c++-basic-offset tab-width)
            ;; インデントを tab-width と同じにします。
            (setq c-indent-level tab-width)
            ;; 引数リストの閉じ括弧もインデントします。
            (c-set-offset 'arglist-close 1)))

;; *.bat, *.ini に色付します。
(when *run-meadow*
  (require 'generic-x)
  (if (and (boundp 'bat-generic-mode)
           (boundp 'ini-generic-mode))
      ;; が、Meadow3 ではこれらのモードが無いため、出来ませんでした。
      (setq auto-mode-alist (append (list
                                     '("\\.bat$" . bat-generic-mode)
                                     '("\\.ini$" . ini-generic-mode)
                                     auto-mode-alist)))
    ;; else
    (progn
      (require 'any-ini-mode)
      (add-to-list 'auto-mode-alist '(".*\\.ini$" . any-ini-mode))
      (add-to-list 'auto-mode-alist '(".*\\.conf$" . any-ini-mode))

      (require 'bat-mode)
      ;; bat-mode
      (setq auto-mode-alist
            (append
             (list (cons "\\.[bB][aA][tT]$" 'bat-mode))
             ;; For DOS init files
             (list (cons "CONFIG\\."   'bat-mode))
             (list (cons "AUTOEXEC\\." 'bat-mode))
             auto-mode-alist))

      (autoload 'bat-mode "bat-mode"
                "DOS and Windows BAT files" t))))


;; ===============================================================================
;;
;; Line number(行番号)
;;
;; ===============================================================================
;; 行数を左に表示します。
;(setq wb-line-number-scroll-bar nil)
;(require 'wb-line-number)
;(wb-line-number-toggle)
;;; 行番号・桁番号をモードラインに表示する・しない設定
(line-number-mode t)    ; 行番号。t なら表示、nil なら非表示
(column-number-mode t)  ; 桁番号。t なら表示、nil なら非表示

;; 行番号をデフォルトで表示します。

(when (>= emacs-major-version 22)
  ;; 23 以上から linum.el が入っているので要らないが、Meadow3 は 22 なので
  ;; require が必要。
  (require 'linum))
;; デフォルトで linum-mode を有効にします。
(global-linum-mode t)
;; 5 桁分の領域を確保して行番号を入れます。
(setq linum-format "%5d")


;; ===============================================================================
;;
;; Time stamp(ファイル更新日)
;;
;; ===============================================================================
(require 'time-stamp)
(add-hook 'before-save-hook 'time-stamp)
(setq time-stamp-active t)
(setq time-stamp-start "@date ")
(setq time-stamp-format "%04y-%02m-%02d")
(setq time-stamp-end " \\|$")


;; ===============================================================================
;;
;; egg
;;
;; ===============================================================================
(require 'egg)


;; ===============================================================================
;;
;; CLISP & SLIME package(CLIP と SLIME)
;;
;;  1. clisp-directory をインストールパスに合わせて設定します。
;;  2. M-x clisp-start
;;  3. M-x slime-connect
;;
;; ===============================================================================
;(setq clisp-directory "C:/usr/developments/clisp/2.49")

;(setq slime-directory (concat clisp-directory "/slime"))
;(pushnew slime-directory load-path)


;; ===============================================================================
;;
;; Backup file(バックアップファイル)
;;
;; ===============================================================================
;; オートセーブを有効にします。
(auto-save-mode t)
;; バックアップファイルを作ります。
(setq backup-inhibited nil)

;; 簡易バージョンコントロール機能を有効にします。
(setq version-control t)

(when version-control
  ;; 新しいものを 6 つまで残すようにします。
  (setq kept-new-versions 6)
  ;; 古いものを 6 つまで残すようにします。
  (setq kept-old-versions 6)
  ;; 古いバージョンを消す際に尋ねないようにします。
  (setq delete-old-versions t))

;; 終了時にオートセーブファイルが削除されません。
(setq delete-auto-save-files nil)


;; ===============================================================================
;;
;; Miscellaneous Settings(雑多な設定)
;;
;; ===============================================================================
;; カレントディレクトリをホームディレクトリに設定
;; ""内は任意のディレクトリを指定可能
(cd "~/")

;; 起動時のメッセージを表示しません。
(setq inhibit-startup-message t)
;;; エラー時に画面がフラッシュするようにします。
;(setq visible-bell t)
;;;; フラッシュするのがうざいのでしないようにしました。

;; ツールバーを表示しないようにします。
(tool-bar-mode 0)

;; 最近使ったファイルの一覧を表示します。
(recentf-mode 1)

(if (boundp 'server-start)
    ;; emacsclient を使います。
    (server-start))

;;
(setq display-time-string-forms
      '((let ((system-time-locale "C"))
          (format-time-string "%Y-%m-%dT%H:%M"))))
;; モードラインに現在時刻を表示します。
(if *run-meadow*
    (display-time)
  (display-time 1))


;; 選択領域を入力で置き換えるようにします。
(delete-selection-mode 1)
;; S-[←→]で範囲を選択できるようになります。
(if *run-meadow3*
    (pc-selection-mode)
  (pc-selection-mode 1))

;; auto-fill モードを使用します。
(setq-default auto-fill-function 'do-auto-fill)

;; キー入力を記憶しておきます。
(open-dribble-file "~/.emacs_dribble")

;; 70 字目で自動的に改行されないようにします。
;; これでも駄目なときは M-x set-fill-column RET 300 を実行してください。
(setq-default fill-column 300)