EmacsWiki のコードが冗長なので短くしてみた。
(setq erc-prompt (lambda ()
(let* ((buffer (buffer-name))
(channel (when (string-match "\\(#[^@]+\\)" buffer)
(match-string 1 buffer))))
(erc-propertize
(concat
(or channel
(if (and (boundp 'erc-default-recipients) (erc-default-target))
(erc-default-target)
"ERC"))
">")
'read-only t 'rear-nonsticky t 'front-nonsticky t))))
elisp的にはこういうのどうかくのが良いのかわからんけどとりあえず短くはなった。
id:IMAKADO さんにバッファ作らずに使わずに正規表現マッチする方法教えてもらったのでちょっと短くできた。
(setq erc-prompt (lambda ()
(let* ((buffer (buffer-name))
(channel (when (string-match "\\(#[^@]+\\)" buffer)
(match-string 1 buffer))))
(if channel
(erc-propertize (concat channel ">") 'read-only t 'rear-nonsticky t 'front-nonsticky t)
(if (and (boundp 'erc-default-recipients) (erc-default-target))
(erc-propertize (concat (erc-default-target) ">") 'read-only t 'rear-nonsticky t 'front-nonsticky t)
(erc-propertize (concat "ERC>") 'read-only t 'rear-nonsticky t 'front-nonsticky t))))))
ERCのプロンプトにチャンネル名表示
というネタは EmacsWiki: Erc Configuration の Channel-specific prompts に書いてあるんだけど、そこにも書いてあるとおり、初回表示時にはチャンネル名にならないのでこんな感じにハック。
(setq erc-prompt (lambda ()
(let* ((buffer (buffer-name))
(channel (with-temp-buffer
(insert buffer)
(beginning-of-buffer)
(when (re-search-forward "\\(#[^@]+\\)" nil t)
(match-string 1)))))
(if channel
(erc-propertize (concat channel ">") 'read-only t 'rear-nonsticky t 'front-nonsticky t)
(if (and (boundp 'erc-default-recipients) (erc-default-target))
(erc-propertize (concat (erc-default-target) ">") 'read-only t 'rear-nonsticky t 'front-nonsticky t)
(erc-propertize (concat "ERC>") 'read-only t 'rear-nonsticky t 'front-nonsticky t))))))
バッファ名からチャンネル名部分とるようにした感じ。
1:1 トークとかどうなるかわからないのでとりあえず EmacsWiki のルーチンも書いておいた。
dopplr.el
最近 ERC つかって IRC も emacs でやるようにしたのだけど、昔 irssi 用に作った dopplr.pl とおなじことが emacs でもしたくなったのでちょっと書いてみたりした。
使い方は dopplr.pl と同じで最初に
(setq dopplr-api-token "your api token") ; M-x customize-group RET dopplr でもできる
しておいて、あとは
M-x dopplr-local-clock RET miyagawa
するという感じになっています。
dopplr.el などとたいそうな名前ですがまだこれしか作ってません。
はじめて設定以外で elisp 書いたけどむずかしい。すごいぐちゃぐちゃになってしまった。絶対もっとうまく書けるはず。
CarbonEmacs + CodingFontTobi
フォント設定もさらしておく。
`~/.emacs.d/conf/carbon-emacs-05font.el
;; i <3 bitmap font
(setq mac-allow-anti-aliasing nil)
(create-fontset-from-fontset-spec
(concat
"-*-fixed-medium-r-normal--10-*-*-*-*-*-fontset-tobi"
",ascii:-apple-codingfonttobi-medium-r-normal--16-120-72-72-m-120-*-*"
",japanese-jisx0208:-apple-osaka-*"
",katakana-jisx0201:-apple-osaka-*"))
(create-fontset-from-fontset-spec
(concat
"-*-fixed-medium-r-normal--10-*-*-*-*-*-fontset-proggy"
",ascii:-apple-proggycleanttsz-medium-r-normal--16-120-72-72-m-120-*-*"
",japanese-jisx0208:-apple-osaka-*"
",katakana-jisx0201:-apple-osaka-*"))
(set-default-font "fontset-tobi")
CodingFontTobi と Proggy のフォントセットを定義して気分で使い分けてる。
デフォルトの Monaco+ヒラギノ も捨てがたく、たまに使いたくなったりするのでアンチエイリアスは
;; アンチエイリアストグル
(defun my-mac-toggle-antialias ()
(interactive)
(if mac-allow-anti-aliasing
(setq mac-allow-anti-aliasing nil)
(setq mac-allow-anti-aliasing t)))
こんなんでトグルできるようにしてる。この関数よびだしたあと画面が更新されると反映される。
こういう環境依存のコードは今までは自前で環境見てロードしていたのだけど、id:IMAKADO さんが公開してくれた init-loader 使うと carbon-emacs-*
とか言うファイルは CarbonEmacs の時だけ読む、とかできて便利。
CarbonEmacsを使ってみる
先週 id:IMAKADO さんにあって、emacs
使いこなしててかっこよかったので影響されて僕も GUI な emacs が使いたくなったのでこの間書いた Cocoa Emacs を使い出そうとしたんだけど、なんかどうがんばってもバッファを縦分割したときのボーダーを表示させることが出来ないという理由であきらめた。(フリンジは消したかった)
なので CarbonEmacs を入れた。こっちはなんかボーダー出た。
Cocoa Emacs なら multitty で端末内でファイル開いちゃえばいいんだけど、CarbonEmacs にはそれがないので普通に emacsclient で開き、閉じたら端末にフォーカスが戻るという設定を書いた。
具体的には emacsclient で開いたときは勝手に CarbonEmacs がアクティブになるので、CarbonEmacs 側で閉じたときに端末に戻るように、
;; emacsclientで開いた端末をアクティブにする。とりあえずiTerm決めうち
(add-hook 'server-done-hook
(lambda ()
(do-applescript "tell application \"iTerm\"
activate
end")))
とするだけでOKだった。
emacs23をつかってみた
昨日のエントリで CarbonEmacs を使えばいいのかもと思ってちょっとためしてみようと思ったのだけど、どうせなら MultiTTY 使いたいなーなどという気持ちが出てきてしまった。
それで emacs23 ベースな CarbonEmacs 的なのがないかと探してみたら、いまの CVS の emacs は普通に Emacs.app を作ることができるみたい。
cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co emacs
とかで co してきて
./configure --with-ns
make
make install
で nextstep ディレクトリに Emacs.app ができている。
CLI で起動したい場合は
Emacs.app/Contents/MacOS/Emacs -nw
でおk。emacsclient は
Emacs.app/Content/MacOS/bin/emacsclient
にある。etags とかもここにある。
とりあえず multitty をためしてみるために Emacs.app と CLI (-nw) と両方立ち上げて
emacsclient -t /path/to/file
としてみたところ、ちゃんとどちらの emacs でも同じファイルを開き、編集内容も共有できた。
これで徐々に GUI な emacs に移行できるかなー。
vc-annotate
そういえば設定したなとおもっておもむろに M-x vc-annotate
してみたら git でもできた!
設定はこんなんで
http://svn.coderepos.org/share/dotfiles/emacs/typester/.emacs.d/conf/50_git.el
elファイルはgit自体についてくる。
.emacsを公開した!
kentaroさんが最近やたらemacsづいてるので影響を受けて先週末に.emacsを整理したのでついでにcodereposにあげてみました。
整理したら300行ちょっとしかなくなってしょんぼり。まぁまだ今までやってた設定全部は移せてないのだけども。
あとmmm-modeに再挑戦したがやっぱりむりだった>< javascript.elでコメントアウトしたりしてるのがその名残。
nxml-mode + css-mode はうまくいくんだが javascript-mode とだとうまくうごかんなぁ。
TDD支援elisp
が面白いなーと思ったので自分用に改造してみた。
モードラインの色を変えるようにしただけだけど。
;; 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)