そういえば設定したなとおもっておもむろに M-x vc-annotate してみたら git でもできた!
設定はこんなんで
http://svn.coderepos.org/share/dotfiles/emacs/typester/.emacs.d/conf/50_git.el
elファイルはgit自体についてくる。
そういえば設定したなとおもっておもむろに M-x vc-annotate してみたら git でもできた!
設定はこんなんで
http://svn.coderepos.org/share/dotfiles/emacs/typester/.emacs.d/conf/50_git.el
elファイルはgit自体についてくる。
kentaroさんが最近やたらemacsづいてるので影響を受けて先週末に.emacsを整理したのでついでにcodereposにあげてみました。
整理したら300行ちょっとしかなくなってしょんぼり。まぁまだ今までやってた設定全部は移せてないのだけども。
あとmmm-modeに再挑戦したがやっぱりむりだった>< javascript.elでコメントアウトしたりしてるのがその名残。
nxml-mode + css-mode はうまくいくんだが javascript-mode とだとうまくうごかんなぁ。
が面白いなーと思ったので自分用に改造してみた。
モードラインの色を変えるようにしただけだけど。
;; C-c m でTDDのモード切替え
(defvar tdd-bgcolor-alist
'(("Think" ."snow")
("Red" ."#ff4444")
("Green" ."#44dd44")
("Refactoring"."#ffaa44")))
(defvar tdd-bgcolor-mode 3)
(defvar tdd-bgcolor-mode-name "")
(let (
(cell (or (memq 'mode-line-position mode-line-format)
(memq 'mode-line-buffer-identification mode-line-format)))
(newcdr 'tdd-bgcolor-mode-name))
(unless (member newcdr mode-line-format)
(setcdr cell (cons newcdr (cdr cell)))))
(defun tdd-bgcolor-rotate ()
(interactive)
(let (pair)
(if (>= tdd-bgcolor-mode 3)
(setq tdd-bgcolor-mode 0)
(setq tdd-bgcolor-mode
(+ tdd-bgcolor-mode 1)))
(setq pair
(nth tdd-bgcolor-mode tdd-bgcolor-alist))
(setq tdd-bgcolor-mode-name (format "[%s]" (car pair)))
(message tdd-bgcolor-mode-name)
(set-face-foreground 'mode-line (cdr pair))))
(global-set-key "\C-cm" 'tdd-bgcolor-rotate)
mmm-mode はいままで3回くらい挑戦してると思うけどうまく使えたためしがないのであきらめている。
今度社内でemacs自慢大会やるつもりなのでそのときにだれかやってくれないかな。
これ読んですぐ導入したflymake。上記サイトのを少し改造したらperlでもできたのでいまはjsとperlでリアルタイムでシンタックスエラーチェックができている。
僕はすごくtypoがおおいと思うのだけどこれを導入してからtypoではまることがずいぶん減った。もうないとこまるelispのひとつになってる。
ちなみにperl版はこんな感じにしている。
(require 'flymake)
;; flymake for perl
(defvar flymake-perl-err-line-patterns '(("\\(.*\\) at \\([^ \n]+\\) line \\([0-9]+\\)[,.\n]" 2 3 nil 1)))
(defconst flymake-allowed-perl-file-name-masks '(("\\.pl$" flymake-perl-init)
("\\.pm$" flymake-perl-init)
("\\.t$" flymake-perl-init)))
(defun flymake-perl-init ()
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list "perl" (list "-wc" local-file))))
(defun flymake-perl-load ()
(interactive)
(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
(setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)
(setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-perl-file-name-masks))
(setq flymake-err-line-patterns flymake-perl-err-line-patterns)
(flymake-mode t))
(add-hook 'cperl-mode-hook '(lambda () (flymake-perl-load)))
でも、これだと単純に perl -wc しているだけで編集中の lib パスなどを @INC につっこまないため、その lib 以下にあるモジュールを use したりするとそこでエラーになってしまう。
なので今はモジュールやCatalystアプリの開発するときはいちいち emacs 上で M-x setenv してその lib パスを PERL5LIB にセットしている。。ちょうめんどくさい。。
そんでこれを自動化したいわけだがどうすればいいのかなぁ。
~/.svk/config を起動時にしか見に行かないということで、emacs起動後にcoパスが増えた場合などリロードしたいとおもったら
M-: (auto-save-buffers-enhanced-add-svk-checkout-path-into-include-regexps)
とすればいいらしい。メモメモ。
開いてるファイルが svn(k) の copath だったらON、それ以外だったらOFFって自動でなるといいのになー。
今は
(run-with-idle-timer 0.5 t 'auto-save-buffers "^/home/typester/dev/" "^$")
とかしてるけれど、その領域でもたまにsvn管理じゃないファイルつかったりするし、それで自動保存されると困るし。
(global-set-key "\M-1" 'bm-toggle)
(global-set-key "\M-3" 'bm-next)
(global-set-key "\M-2" 'bm-previous)
とかで設定してるけどまったく使ってない。
Buffer `svk-commitvP9pW.tmp' still has clients; kill it? (yes or no)
などといわれるのをなくしたいのだが、どうすればいいのか! 強制yesでいいんだけど。
それとも C-x # 的なもので保存せずに閉じるものあるのかな。
を見て便利そうなので導入。
elisp よくわかんねーので、psgml-mode と cperl-mode で動かしたかっただけなのにものすごい時間かかった。。
; snippet.el
(require 'snippet)
(require 'psgml)
(snippet-with-abbrev-table 'xml-mode-abbrev-table
("ahref" . "<a href=\"$${url}\" title=\"$${title}\">$${title}</a>"))
(defvar cperl-mode-abbrev-table nil
"Abbrev table in use in CPerl mode.")
(define-abbrev-table 'cperl-mode-abbrev-table ())
(snippet-with-abbrev-table 'cperl-mode-abbrev-table
("formy" . "for my $${item} ($${items}) {\n}")
("cataction" . "sub $${fn} :$${attribute} {\n$>my ($self, $c) = @_;\n}"))
こんなんでいけた。
psgmlのxml-modeは普通にやったら xml-mode-abbrev-table なんてねーよっておこられるので、先に (require 'psgml) しておいたらいけた。
cperl-mode も同じ方法でやろうとしたらなんかエラーになったのでソース見たら、cperl-mode-abbrev-table がすでに定義されてあったら cperl-mode 側では上書きしないっぽい感じになっていたのでてけとうに定義してやったらいけた。うむ、よくわからん。
まぁつかえたからいいや的な。
あとはabbrev-tableふやすだけ~。
(iswitchb-mode 1)
をやめて
(ido-mode t)
をためしてみてる。
より。
iswitchbライクなバッファ切り替えと同じようなのをfind-fileでも使える。あとfind-file中にC-bするとバッファ切り替えに切り替わるのは人によっては便利かな。逆も可(バッファ切り替えじにC-fでfind-file)
どうなんだろうなこれは。すぐ戻すかもしれない。
あとnXML-modeもいれてみたけど、まだ使ってみていない。
最近のemacsではLocal variablesがあるファイルを開こうとすると
The local variables list in clmemo.txt
contains values that may not be safe (*).
Do you want to apply it? You can type
y -- to apply the local variables list.
n -- to ignore the local variables list.
! -- to apply the local variables list, and permanently mark these
values (*) as safe (in the future, they will be set automatically.)
mode : change-log
* clmemo-mode : t
tab-width : 4
left-margin : 4
とかでるようになったらしい。へぇ、いいね。
はてのくんの真似してemacsマニュアルをひまなとき眺めてみることにしてみるかもしれない。
iswitchbとかuniquifyとかもemacsマニュアルに載ってたんだなぁ。ちゃんと読んだらだいぶ違いそうだ。
しょうがないのでさらすよ。colinux version。日本語のコメントはいまつけたもの。
結構短いな。でもかなり汚いw
性格が出るのかねー。部屋が汚い人はdotfilesも汚い法則。
;(require 'browse-kill-ring) ; 今使ってない
;(require 'mutt) ; autoload にした
; clmemo 用の設定
(setq user-full-name "Daisuke Murase")
(setq user-mail-address "murase@kayac.com")
; emacsclient用の設定。~/tmp/emacsclient-caller にはemacsclientを呼び出したscreenのウィンドウ番号が格納してある
; ので自動的にもとのウィンドウへ戻る。詳しくはこのエントリの一番下に書いたリンクを見るといいかも
(server-start)
(add-hook 'after-init-hook 'server-start)
(add-hook 'server-done-hook
(lambda ()
(shell-command
"screen -r -X select `cat ~/tmp/emacsclient-caller`")))
; まなんか見た目かえたり
(menu-bar-mode 0)
(column-number-mode t)
(line-number-mode t) ; default
; 最近開いたファイル開けるように
(recentf-mode)
; color ; 色つけとかね
(global-font-lock-mode t)
(setq-default transient-mark-mode t)
; input method ; anthy使う自鯖用
;(set-language-environment "Japanese")
;(setq default-input-method "japanese-anthy")
;(autoload 'uim-mode "uim" nil t)
;(global-set-key "\C-o" 'uim-mode)
; load library
;(require 'svk-ediff) ; 使いたいけどうまく動かん
(require 'yaml-mode) ; 最高 clouder++
(autoload 'javascript-mode "javascript" "JavaScript mode" t) ; ecmascript-modeよりイイネ higepon++
;(autoload 'ecmascript-mode "ecmascript-mode" "ECMAScript mode" t)
;(autoload 'pod-mode "pod-mode" "pod mode" t)
;(autoload 'navi2ch "navi2ch" "Navigator for 2ch for Emacs" t) ; 昔使ってたシリーズ
; backup and autosave ; なんだっけこれ #foo.txt# ファイルとかのやつだっっけ。わすれた
(setq auto-save-default nil)
(setq auto-save-list-file-prefix "~/.autosave/")
(defun make-backup-file-name (filename) ; バックアップファイルは違うディレクトリに保存するよ
(expand-file-name
(concat "~/.backup/" (file-name-nondirectory filename) "~")
(file-name-directory filename)))
(require 'auto-save-buffers) ; 自動セーブのやつ。まぁ必須。でも作業ディレクトリでだけ有効にしてるよ
(run-with-idle-timer 0.5 t 'auto-save-buffers "^(/mnt)?/home/typester/workdir/" "^$")
(define-key ctl-x-map "as" 'auto-save-buffers-toggle) ; 一応ホットキーでトグルできるようにしてたらしい。今思い出した
; riece ; 昔使ってたシリーズ2 重いしあんまり良くない。irssiのが良いよ
;(setq load-path
; (append (list "/usr/share/emacs/site-lisp/riece/") load-path))
;(require 'riece)
; mew ; 昔使ってたシリーズ3 割と好きなメーラ。最近のバージョンでHyperEstraierも使えるようになったらしいし、また使うかも
(setq load-path
(cons "/usr/share/emacs/site-lisp/mew/" load-path))
(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)
; completer ; by kentaro zshみたいにC-x C-fでファイル名補完できるらしいがうごかんんんんn
;(require 'completer)
;(setq completer-words "---. <_")
; windmove ; rieceのときのカーソル移動用キーバインド。今はまったく使ってない
(require 'windmove)
(setq windmove-wrap-around t)
(global-set-key "\C-\M-h" 'windmove-left)
(global-set-key "\C-\M-j" 'windmove-down)
(global-set-key "\C-\M-k" 'windmove-up)
(global-set-key "\C-\M-l" 'windmove-right)
; dabbrev ; 動的補完。デフォキーは押しづらすぎるので。M-spaceにも挑戦したがこっちのがよかった
(global-set-key "\M-o" 'dabbrev-expand)
(setq dabbrev-case-fold-search nil)
(global-set-key "\C-h" 'delete-backward-char) ; バックスペースとか遠い
; Changelog memo mode ; Changelog memo 自鯖で使っている
;(autoload 'clmemo "clmemo" "ChangeLog memo mode." t)
;(setq clmemo-file-name "~/public_html/pub/clmemo.txt")
;(global-set-key "\C-xM" 'clmemo)
;(setq clmemo-subtitle-char "["
; clmemo-subtitle-punctuation-char '(" [" . "]")
; clmemo-time-string-with-weekday t)
;(defun my-clmemo-title-formatting (title)
; (setq title (concat (format-time-string "(%T) " (current-time)) title)))
;(setq clmemo-title-format-function 'my-clmemo-title-formatting)
; ELscreen ; 使ってないシリーズ4
(global-set-key "\C-t" nil)
(setq elscreen-prefix-key "\C-t")
(setq elscreen-display-tab nil)
(load "elscreen" "ElScreen" t)
; auto mode ; 自動モード設定たち
(setq auto-mode-alist
(append '(("\\.as\\'" . javascript-mode)
("\\.js\\'" . javascript-mode)
("\\.tt\\'" . xml-mode)
("\\.pod\\'" . pod-mode)
("mutt-[a-z0-9]+-[0-9]+-[0-9]+\\'" . mutt-mode)
("\\.ya?ml\\'" . yaml-mode))
auto-mode-alist))
; mode ;モード別設定
(setq cssm-indent-function #'cssm-c-style-indenter) ; CSSモード
(setq javascript-indent-level 4) ; Javascriptモード
(defalias 'perl-mode 'cperl-mode) ; cperlモード
(setq cperl-indent-level 4)
(setq cperl-continued-statement-offset 4)
(setq cperl-brace-offset -4)
(setq cperl-label-offset -4)
(setq cperl-indent-parens-as-block t)
(setq cperl-close-paren-offset -4)
(setq cperl-tab-always-indent t)
;(setq cperl-invalid-face nil)
(setq cperl-highlight-variables-indiscriminately t)
; test
(setq fill-column 78) ; これ書いてみたけどうごかね。どうでもいいので放置してある
(setq auto-fill-mode t)
; mmm-mode ; 挑戦したけどうまくうごかなかったシリーズ
;(require 'mmm-mode)
;(require 'mmm-auto)
;(setq mmm-global-mode t)
;(setq mmm-submode-decoration-level 2)
;
;(mmm-add-classes
; '((html-javascript
; :submode ecmascript-mode
; :front "<script[^>]*>"
; :back "</script>")))
;(mmm-add-mode-ext-class nil "\\.tt\\'" 'html-javascript)
; cperl tidy func ; perltidy-region。 必須だね
(defun perltidy-region ()
"Run perltidy on the current region."
(interactive)
(save-excursion
(shell-command-on-region (point) (mark) "perltidy -q" nil t)))
(defun perltidy-defun ()
"Run perltidy on the current defun."
(interactive)
(save-excursion (mark-defun)
(perltidy-region)))
; mode-hook ; モードフック系
(defun my-ecmascript-mode-hook () ; javascriptモードにするまで使ってた
(c-set-style "cc-mode")
(setq tab-width 4)
(setq indent-tabs-mode nil))
(add-hook 'ecmascript-mode-hook 'my-ecmascript-mode-hook)
(defun my-javascript-mode-hook () ; 今はこっち
(setq tab-width 4)
(setq indent-tabs-mode nil))
(add-hook 'javascript-mode-hook 'my-javascript-mode-hook)
(defun my-php-mode-hook () ; 昔一瞬使った系。いまはphp-modeすら入ってない
(c-set-style "cc-mode")
(setq tab-width 4)
(setq indent-tabs-mode nil))
(add-hook 'php-mode-hook 'my-php-mode-hook)
;(defun my-perl-mode-hook () ; perl-mode使ってたときの設定かな?覚えてないや
;; (c-set-style "cc-mode")
; (setq indent-level 4)
; (setq tab-width 4)
; (setq indent-tabs-mode nil)
; (setq continued-statement-offset 4)
; (setq brase-offset -4)
; (setq label-offset -4))
;(add-hook 'perl-mode-hook 'my-perl-mode-hook)
(defun my-cperl-mode-hook () ; 今はcperl-mode
(setq indent-tabs-mode nil)
; BestPractices
(setq fill-column 78) ; コレもうごかんわぁ
(setq auto-fill-mode t))
(add-hook 'cperl-mode-hook 'my-cperl-mode-hook)
(defun my-w3m-mode-hook ()
(setq w3m-use-filter nil)) ; よく覚えてない、なんだっけか
(add-hook 'w3m-mode-hook 'my-w3m-mode-hook)
; from Best Practices ; Vimっぽく % で対応する括弧へ飛べるやつ BestPracticesに載ってたコードは動かんのでどっかからぱくったの .tt 書くとき割と邪魔になるのが玉にキズ
; Use % to match various kinds of brackets...
;(defun match-paren (arg)
; "Go to the matching paren if on a paren; otherwide insert %."
; (interactive "p")
; (let ((prev-char (char-to-string (preceding-char)))
; (next-char (char-to-string (following-char))))
; (cond ((string-match "[[{(<]" next-char) (forward-sexp 1))
; ((string-match "[\]})>" prev-char) (backward-sexp 1))
; (t (self-insert-command (or arg 1))))))
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
((looking-at "\\s\)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))
(global-set-key "%" 'match-paren)
(defun my-insert-date () ; 日付入れる関数。perlモジュールのChanges書くときに主に使用
(interactive)
(insert (format-time-string "%Y-%m-%dT%R:%S+09:00" (current-time))))
; my keys ;いろいろキー設定
(global-set-key "\C-cu" 'w3m-browse-url) ; 昔使ってたかも
(global-set-key "\C-cr" 'replace-string) ; 置換ね
(global-set-key "\C-c\C-r" 'recentf-open-files) ; 最近開いたファイル一覧
(global-set-key "\C-c\C-y" 'browse-kill-ring) ; 使ってね
(global-set-key "\C-cd" 'my-insert-date) ; 日付挿入
(global-set-key "\C-ct" 'perltidy-region) ; perlコード整形、必須。でもmode-hookでやればいいな
(global-set-key "\C-c\C-t" 'perltidy-defun) ; こっちはつかってないや
; colors ; こっからカラーの設定だけどこれはMeadow使ってたときの設定。コンソールでは意味ない(256色モード使ってないので)
(require 'font-lock)
(set-face-foreground 'font-lock-comment-face "red")
; colors for Tab and Space
(defface my-face-b-1 '((t (:background "gray"))) nil)
(defface my-face-b-2 '((t (:background "gray26"))) nil)
(defface my-face-u-1 '((t (:foreground "SteelBlue" :underline t))) nil)
(defvar my-face-b-1 'my-face-b-1)
(defvar my-face-b-2 'my-face-b-2)
(defvar my-face-u-1 'my-face-u-1)
; タブと全角スペースの色かえる
(defadvice font-lock-mode (before my-font-lock-mode ())
(font-lock-add-keywords
major-mode
'(("\t" 0 my-face-b-2 append)
(" " 0 my-face-b-1 append)
("[ \t]+$" 0 my-face-u-1 append)
)))
(ad-enable-advice 'font-lock-mode 'before 'my-font-lock-mode)
(ad-activate 'font-lock-mode)
; test scroll ; 一行ずつスクロールするよ。デフォルトのかくかくスクロールはキモイ
; clouder かどっかにもっとスマートに同じことするのが載ってて、それに変えようと思ってたけど忘れてた。今思い出した
(defun sane-next-line (arg)
"Goto next line by ARG steps with scrolling sanely if needed."
(interactive "p")
;;(let ((newpt (save-excursion (line-move arg) (point))))
(let ((newpt (save-excursion (next-line arg) (point))))
(while (null (pos-visible-in-window-p newpt))
(if (< arg 0) (scroll-down 1) (scroll-up 1)))
(goto-char newpt)
(setq this-command 'next-line)
()))
(defun sane-previous-line (arg)
"Goto previous line by ARG steps with scrolling back sanely if needed."
(interactive "p")
(sane-next-line (- arg))
(setq this-command 'previous-line)
())
(defun sane-newline (arg)
"Put newline\(s\) by ARG with scrolling sanely if needed."
(interactive "p")
(let ((newpt (save-excursion (newline arg) (indent-according-to-mode) (point))))
(while (null (pos-visible-in-window-p newpt)) (scroll-up 1))
(goto-char newpt)
(setq this-command 'newline)
()))
(global-set-key [up] 'sane-previous-line)
(global-set-key [down] 'sane-next-line)
;(global-set-key "\C-m" 'sane-newline)
(define-key global-map "\C-n" 'sane-next-line)
(define-key global-map "\C-p" 'sane-previous-line)
; インクリメンタルにバッファきりかえられるやつ。必須すぎ
;(iswitchb-default-keybindings) ; emacs21の人はこっち
(iswitchb-mode 1) ; emacs22の人はこっち
; 同じ名前のバッファがあった場合上の階層のディレクトリとかも一緒に出して区別できるようにユニークなバッファ名にしてくれるやつ
; コレも必須
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)
こう見ると、あんまりカスタマってないなぁ。perl書く分にはこれでまぁ満足。
この中で必須なのはscreenとの連携部と、cperl-modeの設定、perltidy-region、iswitchb&uniquify、C-hでバックスペースくらいかな。
次点でjavascript-mode、一行ずつのスクロールとかか。
.zshrcもさらそうと思ったけどこれ以上にごちゃってるうえにプライベートな関数多いからやめた。