Carbon Emacs用 .emacs 2008年7月版

.emacsの記事が思ったより多くの人が見てくれているみたいなので、現在の.emacsを改めて公開してみる。


主な変更点

  • 新たにChangeLog Memo dsvn を使い始めるようになった。
  • highlight-completionの代わりにmcompleteを使うようになった。
  • migemoめちゃくちゃ便利なんだけど、なんか入れたら英語が検索できなくなったんだけど…(調査中)


最近は仕事でもMacを使うようになったので、EmacsMeadowで両方色々いじってみるという面倒なことが無くなり非常に便利。
エディタは完全にEmacsしか使わないようになった。が、ファインダーからドラッグ&ドロップでファイル開いてるへたれです。


追記:
オレオレ.emacs最新版をGithubに上げました。
http://github.com/goryugo/my-dot-files/tree/master/.emacs.el

;;migemo 英語が検索できなくなったぞ?
;; (setq migemo-command "migemo"
;;       migemo-options '("-t" "emacs"  "-i" "\a"))
;; (setenv "RUBYLIB" "/Applications/Emacs.app/Contents/Resources/lib/ruby/site_ruby/")
;; (require 'migemo)

;;elisp load-path
(setq load-path
      (append
       (list
       (expand-file-name "~/site-lisp/")
       )
       load-path))

;;Chamgelog Memo
(setq user-full-name "USERNAME")
(setq user-mail-address "MAIL")
     (autoload 'clmemo "clmemo" "ChangeLog memo mode." t)
     ;; あなたの ChangeLog メモファイルへのパス
     (setq clmemo-file-name "~/howm/clmemo.txt")
     ;; 好きなキーへバインド
     (global-set-key "\C-xM" 'clmemo)
;;changelogタイトル補完
(setq clmemo-title-list '("log" "idea" "perl" "unix" "shell"))
(setq clmemo-time-string-with-weekday 't)

;;;;;;;;;;;;;;;;;;;;
;;テスト中の機能
;;;;;;;;;;;;;;;;;;;;

;;dsvn
(autoload 'svn-status "dsvn" "Run `svn status'." t)
(autoload 'svn-update "dsvn" "Run `svn update'." t)

;;ミニバッファで M-x 時のインクリメンタル補完
(require 'mcomplete)
;さらによく使うヒストリを優先させる
(load "mcomplete-history")
(turn-on-mcomplete-mode)

;;ファイルを開く時に,カーソルキーだけで,ファイルを選択
;;カーソル上下で従来のヒストリ。ctrl+P,ctrl+nでファイル名補完
(require 'cycle-mini)
(define-key minibuffer-local-map [up] 'previous-history-element)
(define-key minibuffer-local-completion-map [up] 'previous-history-element)
(define-key minibuffer-local-must-match-map [up] 'previous-history-element)
(define-key minibuffer-local-ns-map [up] 'previous-history-element)
(define-key minibuffer-local-ns-map [down] 'next-history-element)
(define-key minibuffer-local-map [down] 'next-history-element)
(define-key minibuffer-local-completion-map [down] 'next-history-element)
(define-key minibuffer-local-must-match-map [down] 'next-history-element)

;;;;;;;;;;;;;;;;;;;;
;; mode毎の設定
;;;;;;;;;;;;;;;;;;;;

;;; yaml-mode
(require 'yaml-mode)
(add-to-list 'auto-mode-alist '("\\.\\(yml\\|yaml\\)\\'" . yaml-mode))

;;CSS-mode
(autoload 'css-mode "css-mode")
(setq auto-mode-alist       
     (cons '("\\.css\\'" . css-mode) auto-mode-alist))

;;Javascript-mode
(add-to-list 'auto-mode-alist (cons  "\\.\\(js\\|as\\|json\\|jsn\\)\\'" 'js2-mode))
(autoload 'js2-mode "js2" nil t)
(setq js-indent-level 2)

;; cperl mode
(autoload 'cperl-mode "cperl-mode" "alternate mode for editing Perl programs" t)
(setq auto-mode-alist
      (append '(("\\.\\([pP][Plm]\\|al\\|cgi\\|t\\)$" . cperl-mode))  auto-mode-alist ))
(setq interpreter-mode-alist (append interpreter-mode-alist
                                     '(("miniperl" . cperl-mode))))
(add-hook 'cperl-mode-hook
          (lambda ()
            ))

;;simple hatena mode
(require 'simple-hatena-mode)
(setq simple-hatena-default-id "goryugo")

;;;;;;;;;;;;;;;;;;;;
;;その他設定
;;;;;;;;;;;;;;;;;;;;

;;font
(if (eq window-system 'mac)
   (progn
    (require 'carbon-font)
     (fixed-width-set-fontset "hiramaru" 12)))

;; メニューバーの消去
(tool-bar-mode -1)

;; 初期フレームの設定
(setq default-frame-alist
      (append (list '(width . 110)
		    '(height . 63)
		    '(top . 0)
		    '(left . 0))
	      default-frame-alist))

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

;; 括弧の対応をハイライト.
(show-paren-mode 1)

;; BS で選択範囲を消す
(delete-selection-mode 1)

;;ビープ音を消す
(setq ring-bell-function 'ignore)

;;カラーテーマ
(require 'color-theme)
(color-theme-initialize)
(color-theme-deep-blue)

;;リージョン色づけ
(setq transient-mark-mode t)

;;カーソルでのリージョン選択
(pc-selection-mode)

;;一行カット
(setq kill-whole-line t)

;;モードラインにカーソルがある位置の文字数を表示
(column-number-mode 1)

;;;;;;;;;;;;;;;;;;;;
;;howm
;;;;;;;;;;;;;;;;;;;;
(setq howm-menu-lang 'ja)
(global-set-key "\C-c,," 'howm-menu)
(mapc
 (lambda (f)
   (autoload f
     "howm" "Hitori Otegaru Wiki Modoki" t))
 '(howm-menu howm-list-all howm-list-recent
             howm-list-grep howm-create
             howm-keyword-to-kill-ring))
;; リンクを TAB で辿る
(eval-after-load "howm-mode"
  '(progn
     (define-key howm-mode-map [tab] 'action-lock-goto-next-link)
     (define-key howm-mode-map [(meta tab)] 'action-lock-goto-previous-link)))
;; 「最近のメモ」一覧時にタイトル表示
(setq howm-list-recent-title t)
;; 全メモ一覧時にタイトル表示
(setq howm-list-all-title t)
;; メニューを 2 時間キャッシュ
(setq howm-menu-expiry-hours 2)

;; howm の時は auto-fill で
;;(add-hook 'howm-mode-on-hook 'auto-fill-mode)

;; RET でファイルを開く際, 一覧バッファを消す
;; C-u RET なら残る
(setq howm-view-summary-persistent nil)

;; メニューの予定表の表示範囲
;; 10 日前から
(setq howm-menu-schedule-days-before 10)
;; 3 日後まで
(setq howm-menu-schedule-days 3)

;; howm のファイル名
;; 1 メモ 1 ファイル (デフォルト)
(setq howm-file-name-format "%Y/%m/%Y-%m-%d-%H%M%S.howm")
;; 検索しないファイルの正規表現
(setq
 howm-excluded-file-regexp
 "/\\.#\\|[~#]$\\|\\.bak$\\|/CVS/\\|\\.doc$\\|\\.pdf$\\|\\.ppt$\\|\\.xls$")

;; いちいち消すのも面倒なので
;; 内容が 0 ならファイルごと削除する
(if (not (memq 'delete-file-if-no-contents after-save-hook))
    (setq after-save-hook
          (cons 'delete-file-if-no-contents after-save-hook)))
(defun delete-file-if-no-contents ()
  (when (and
         (buffer-file-name (current-buffer))
         (string-match "\\.howm" (buffer-file-name (current-buffer)))
         (= (point-min) (point-max)))
    (delete-file
     (buffer-file-name (current-buffer)))))

;; http://howm.sourceforge.jp/cgi-bin/hiki/hiki.cgi?SaveAndKillBuffer
;; C-cC-c で保存してバッファをキルする
(defun my-save-and-kill-buffer ()
  (interactive)
  (when (and
         (buffer-file-name)
         (string-match "\\.howm"
                       (buffer-file-name)))
    (save-buffer)
    (kill-buffer nil)))
(eval-after-load "howm"
  '(progn
     (define-key howm-mode-map
       "\C-c\C-c" 'my-save-and-kill-buffer)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;バッファの切り替え
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar my-ignore-blst             ; 移動の際に無視するバッファのリスト
  '("*Help*" "*Compile-Log*" "*Mew completions*" "*Completions*"
    "*Shell Command Output*" "*Apropos*" "*Buffer List*" "*GNU Emacs*"
    ".howm-keys" "*Messages*" "*SimpleHatena*" ".howm-history"))
(defvar my-visible-blst nil)       ; 移動開始時の buffer list を保存
(defvar my-bslen 15)               ; buffer list 中の buffer name の最大長
(defvar my-blist-display-time 10)   ; buffer list の表示時間
(defface my-cbface                 ; buffer list 中で current buffer を示す face
  '((t (:foreground "wheat" :underline t))) nil)

(defun my-visible-buffers (blst)
  (if (eq blst nil) '()
    (let ((bufn (buffer-name (car blst))))
      (if (or (= (aref bufn 0) ? ) (member bufn my-ignore-blst))
          ;; ミニバッファと無視するバッファには移動しない
          (my-visible-buffers (cdr blst))
        (cons (car blst) (my-visible-buffers (cdr blst)))))))

(defun my-show-buffer-list (prompt spliter)
  (let* ((len (string-width prompt))
         (str (mapconcat
               (lambda (buf)
                 (let ((bs (copy-sequence (buffer-name buf))))
                   (when (> (string-width bs) my-bslen) ;; 切り詰め 
                     (setq bs (concat (substring bs 0 (- my-bslen 2)) "..")))
                   (setq len (+ len (string-width (concat bs spliter))))
                   (when (eq buf (current-buffer)) ;; 現在のバッファは強調表示
                     (put-text-property 0 (length bs) 'face 'my-cbface bs))
                   (cond ((>= len (frame-width)) ;; frame 幅で適宜改行
                          (setq len (+ (string-width (concat prompt bs spliter))))
                          (concat "\n" (make-string (string-width prompt) ? ) bs))
                         (t bs))))
               my-visible-blst spliter)))
    (let (message-log-max)
      (message "%s" (concat prompt str))
      (when (sit-for my-blist-display-time) (message nil)))))

(defun my-operate-buffer (pos)
  (unless (window-minibuffer-p (selected-window));; ミニバッファ以外で
    (unless (eq last-command 'my-operate-buffer)
      ;; 直前にバッファを切り替えてなければバッファリストを更新
      (setq my-visible-blst (my-visible-buffers (buffer-list))))
    (let* ((blst (if pos my-visible-blst (reverse my-visible-blst))))
      (switch-to-buffer (or (cadr (memq (current-buffer) blst)) (car blst))))
    (my-show-buffer-list (if pos "[-->] " "[<--] ") (if pos " > "  " < " )))
  (setq this-command 'my-operate-buffer))

(global-set-key [?\C-,] (lambda () (interactive) (my-operate-buffer nil)))
(global-set-key [?\C-.] (lambda () (interactive) (my-operate-buffer t)))