emacs マニュアル
はてのくんの真似してemacsマニュアルをひまなとき眺めてみることにしてみるかもしれない。
iswitchbとかuniquifyとかもemacsマニュアルに載ってたんだなぁ。ちゃんと読んだらだいぶ違いそうだ。
.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もさらそうと思ったけどこれ以上にごちゃってるうえにプライベートな関数多いからやめた。
hackathon #3
miyagawa さんの emacs さばきをみていてなんかバッファの切り替えが違うぞと思って聞いたところ、iswitchb とかいうのを使ってると教えてもらった。
emacs21なら
(iswitchb-default-keybindings)
22 なら
(iswitchb-mode 1)
で C-x b がインクリメンタルに。やべぇぇえぇ。ありえないほど便利。
mmm-mode 悪戦苦闘
みやーんととくひろむが教えてくれた mmm-mode をためしてるのだけど、html-mode 内で ecmascript-mode 使おうとするとエラーる。
mmm-mode-on して C-c % C-r してリージョンを ecmascript-mode にしてからその中で Tab かなんかで整形させようとすると
c-looking-at-decl-block: Wrong type argument: stringp, nil
こんなのでる。
うう、cc-mode の何かとの関係? 全然わからん。
ちなみに同じく html-mode 内で css-mode ならちゃんと動く。
CSS とかまったくインラインでかかねっつの!! もう眠いので今度にしよう。
EmacsClient with screen
EmacsWiki に載ってたよ。
emacsclient で emacs のウィンドウをアクティブに
↓の zshrc の case で処理わけているところに
emacsclient)
screen -X eval "select 1"
return
;;
とか追加してみる。僕は emacs は常に window 1 で開くので、select 1 でおk。
んでこのあと C-x #
したら元のウィンドウにもどってくれたらかっけーんだけど、elisp で screen -X other
とかよべばいいかなとか思ったけど、emacs 画面いってからファイル閉じる間にウィンドウ切り替えしたらうまく動かんし。どーやるんだろう。
alias ec='emacsclient -n'
とかしててほとんどこっちしか使わないので戻んなくてもいいのだけど、svn(k) コミット時とかで便利そうだなぁ。
perltidy-region
indent-region
じゃ vim の整形にかてなそうだったので、perltidy-region を導入した。
(defun perltidy-region ()
"Run perltidy on the current region."
(interactive)
(save-excursion
(shell-command-on-region (point) (mark) "perltidy -q" nil t)))
これを \C-ct
とかに割り振っておいた。ちょーーー便利なんだけど!
perltidy のパラメータ設定は Best Practices 参照。
ignore case
zsh とか emacs の補完で大文字小文字区別しないようにする設定よくみるからちょっとやってみたけど、うざくね?
たとえば OSX とかで /Users と /usr とか見に行こうとすると、もうっ!ってなる。
ファイル変数
昨日の emacs の文字化けの件についてメールをもらった。
ファイル変数で文字コードを指定してやればいいのではないか、とのこと。
試してみたが、だめだった。やっぱ化ける。( PuTTY では ? とみえる) そもそも C-f Enter c
C-x Enter c
して utf-8 を指定してから開いた場合でも化けるので、文字コード判別にしっぱいとかじゃなくなんかもっと根本的な理由なきもする。
でもファイル変数自体を知らなかったのでよかった(だめ
あと、CLON もファイル変数かかれててもそれまでパースしちゃわないようにした。 (空行以外でかつタブで始まっていない行を無視するようにしただけだけど)
ぎゃーー
自鯖の emacs のバージョン古くて、cperl-mode でコメント(pod部分)いろわけされねー。もーなんだよ。
関数ごとに
=item name
=cut
とかつけてるから、これすげみにく。リビルドっすかリビルドっすか。
ちなみに今の自鯖に入ってるのは
GNU Emacs 22.0.50.3 (i686-pc-linux-gnu) of 2005-04-19
colinux のは
GNU Emacs 22.0.50.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of 2005-11-04 on pacem, modified by Debian
あれ。。?