2010-02-10

ウィンドウ・バッファ関連のキーバインドを晒してみる

キーバインドを晒してみる。と言うのも…

を読んで、自分の .emacs を見てみたら、キーバインドのカスタマイズは、ほとんどがウィンドウとバッファ関連だったから。

愚直にほぼデフォルトのキーバインドをずっと使ってきたので、長いこと使ってるわりには他のベテランの人みたいな味わい?は無いです。最近になって他のかたの twitter や blog から勉強させてもらって、それで真似てみたのが多いかな。

なのでただ晒すだけ。普段から新しい情報を探している人には目新しいものは無いと思われます。

ぼくが普段使っているのは Windows の GUI の(-nw ではない) Emacs で、一つの Emacs を二つの縦長 80桁のフレームで、頻繁に縦に二分割しながら使ってます。分割するかどうかは window-full-height-p を見ます。

最大化(フルスクリーン)と横分割はあんまりしないです。いまどき 80桁へのこだわりも無いので、そのうち突然横幅を広げるかも知れないけど。

;; ~/.emacs.d/emacs23_nt.el -*- mode: emacs-lisp; coding: utf-8-dos -*-
;; $Id: emacs23_nt.el 635 2010-02-10 11:32:17Z yu-ji $

;;
;; key bindings
;;

;; C-h を backspace として使う。
(define-key global-map [(C h)] 'delete-backward-char)

;; (・ω・)モキュ
(define-key global-map [(M o)] 'moccur)

;; C-x M-f で recentf
(define-key ctl-x-map [(M f)] 'recentf-open-files)

;; C-x 4 M-f u-recentf-open-files-other-window
(defun u-recentf-open-files-other-window ()
  "Show a dialog to open a recent file in other window."
  (interactive)
  (if (window-full-height-p)
      (split-window-vertically))
  (other-window 1)
  (recentf-open-files))
(define-key ctl-x-4-map [(M f)] 'u-recentf-open-files-other-window)

;; C-x C-b で list-buffers のかわりに ibuffer
(define-key ctl-x-map [(C b)] 'ibuffer-other-window)

;; C-x 4 C-b 
(define-key ctl-x-4-map [(C b)] 'ibuffer)

;; C-aで「行頭」と「インデントを飛ばした行頭」を行き来する - ポロポロ
;; http://d.hatena.ne.jp/kitokitoki/20100131/p4
(defun u-move-beginning-of-line ()
  (interactive)
  (if (bolp)
      (back-to-indentation)    
      (beginning-of-line)))
(define-key global-map [(C a)] 'u-move-beginning-of-line)

;; ibuffer
;; Meadow/Emacs memo: バッファリストとバッファの切り替え
;; http://www.bookshelf.jp/soft/meadow_28.html
(define-ibuffer-column
 ;; ibuffer-formats に追加した文字
 coding
 ;; 一行目の文字
 (:name " coding ")
 ;; 以下に文字コードを返す関数を書く
 (if (coding-system-get buffer-file-coding-system 'mime-charset)
     (format " %s" (coding-system-get buffer-file-coding-system :mime-charset))
   " undefined"
   ))
(setq ibuffer-formats
      '((mark modified read-only " "
	      (name 18 18 :left :elide) " "
	      (size 6 -1 :right) " "
	      (mode 10 10 :left :elide) " "
	      (coding 10 10 :left :elide) " "
	      filename-and-process)
	(mark " " (name 16 -1) " " filename)))

;; 分割したウィンドウ間の移動
;; マイ.emacs探訪 - I am Cruby!
;; http://d.hatena.ne.jp/authorNari/20091225/1261667956
(define-key global-map [(C S n)] 'windmove-down)
(define-key global-map [(C S p)] 'windmove-up)
(define-key global-map [(C S b)] 'windmove-left)
(define-key global-map [(C S f)] 'windmove-right)

;; 分割したウィンドウの大きさを Ctrl-上下キーで変える
;; とりあえず暇だったし何となく始めたブログ
;; http://d.hatena.ne.jp/khiker/20100118/emacs_arrow
(define-key global-map [(C up)] 'shrink-window)
(define-key global-map [(C down)] 'enlarge-window)

;; 細かいことはキニシナイ。
(define-key global-map [(C left)]
  '(lambda (size) (interactive "p") (shrink-window size t)))
(define-key global-map [(C right)]
  '(lambda (size) (interactive "p") (enlarge-window size t)))

;; w3m
;; w3m-mode-hook で
;;(define-key w3m-mode-map (kbd "C-c C-q") 'w3m-delete-buffer)

;; twittering-mode
(define-key twittering-edit-mode-map (kbd "C-c C-q")
  'twittering-edit-cancel-status)

;; そろそろEmacsのウィンドウについて一言いっとくか
;; (rubikitch loves (Emacs Ruby CUI))
;; http://d.hatena.ne.jp/rubikitch/20100210/emacs
(defun u-other-window-or-split (arg)
  (interactive "p")
  (if (window-full-height-p)
      (split-window-vertically))
  (other-window arg))
(define-key global-map [(C t)] 'u-other-window-or-split)
(define-key global-map [(C S t)]
  '(lambda (arg) (interactive "p") (u-other-window-or-split (- arg))))

;; URL をブラウザで開く
;;(define-key ctl-x-map "m" 'browse-url-at-point)

;; App キーを Hyper に
;;(setq w32-pass-lwindow-to-system nil)
;;(setq w32-apps-modifier 'hyper)
;;(define-key global-map [(H f)] 'forward-char)

冒頭の rubikitchさんのも早速入れてみました。ちょっと手を加えて。
前述の理由で横分割しないのと、引き数取るのと、C-t で順方向、C-S-t か C-- C-t で逆方向。

手がこれを使うかどうかは分からないけど…。細々操作してると、二分割して「こっちのウィンドウでなにかしたい」ときと「あっちのウィンドウでなにかしたい」ときとありますよね。そういうとき従来のキーバインドを使うと思う。C-t を使いはじめたら、C-t 連打で使い分けるようになるかなぁ。

あと変数の設定は custom でやってるので、関係しそうなところだけ手抜きコピペ。

;; ~/.emacs.d/custom23_nt.el
;; $Id: custom23_nt.el 627 2010-02-03 21:36:35Z yu-ji $
(custom-set-variables
 '(cursor-in-non-selected-windows nil)
 '(custom-file "~/.emacs.d/custom23_nt.el")
 '(history-delete-duplicates t)
 '(ibuffer-mode-hook (quote ((lambda nil (ibuffer-switch-to-saved-filter-groups "u")))))
 '(ibuffer-saved-filter-groups (quote (("u" ("dired" (saved . "dired")) ("Development" (saved . "Development")) ("Text" (saved . "Text")) ("Mew" (saved . "Mew")) ("Twitter" (saved . "Twitter")) ("w3m" (saved . "w3m")) ("Custom" (saved . "Custom")) ("Help" (saved . "Help")) ("Emacs" (saved . "Emacs"))))))
 '(ibuffer-saved-filters (quote (("dired" ((or (mode . dired-mode) (mode . vc-dir-mode)))) ("Emacs" ((or (name . "\\*scratch\\*") (name . "\\*Messages\\*") (mode . Buffer-menu-mode) (mode . completion-list-mode) (mode . apropos-mode)))) ("Text" ((or (mode . texinfo-mode) (mode . org-mode) (mode . text-mode)))) ("Mew" ((or (mode . mew-summary-mode) (mode . mew-virtual-mode) (mode . mew-draft-mode) (mode . mew-message-mode)))) ("Development" ((or (mode . bat-generic-mode) (mode . c++-mode) (mode . c-mode) (mode . change-log-mode) (mode . conf-mode) (mode . conf-windows-mode) (mode . cperl-mode) (mode . css-mode) (mode . diff-mode) (mode . emacs-lisp-mode) (mode . html-mode) (mode . java-mode) (mode . js2-mode) (mode . lisp-mode) (mode . makefile-gmake-mode) (mode . makefile-mode) (mode . moccur-mode) (mode . nxml-mode) (mode . php-mode) (mode . reg-generic-mode) (mode . sgml-mode) (mode . sh-mode) (mode . sql-mode) (mode . vc-bzr-log-view-mode) (mode . vc-git-log-view-mode) (mode . vc-svn-log-view-mode) (mode . visual-basic-mode) (mode . xml-mode) (name . "\\*vc-diff\\*") (name . "\\*vc\\*") (name . "\\.\\(php\\|yml\\|cmd\\)")))) ("w3m" ((or (mode . w3m-mode)))) ("Twitter" ((or (mode . twittering-mode) (name . "^\\*Twit-")))) ("Custom" ((or (mode . Custom-mode)))) ("Help" ((or (mode . help-mode) (mode . Man-mode) (mode . Info-mode)))))))
 '(iswitchb-mode t)
 '(recentf-exclude (quote ("^c:/Users/yu-ji/AppData/Local/Temp" "^c:/Users/yu-ji/home/work/ExtractedFiles/" "^c:/Users/yu-ji/home/Mail/draft/" "^c:/Users/yu-ji/home/.mozilla/firefox/firefox35/itsalltext/")))
 '(recentf-max-saved-items 40)
 '(recentf-mode t)
 '(recentf-save-file "~/.emacs.d/.recentf")
 '(save-place t nil (saveplace))
 '(save-place-file "~/.emacs.d/.emacs-places")
 '(save-place-limit 100)
 '(savehist-mode t nil (savehist))
 '(shift-select-mode nil)
 '(uniquify-buffer-name-style (quote post-forward) nil (uniquify))
 '(w3m-mode-hook (quote ((lambda nil (define-key w3m-mode-map (kbd "C-c C-q") (quote w3m-delete-buffer))))))
 '(windmove-wrap-around t))

見辛いな(-ω-;)

C-S-n, C-S-p, C-S-f, C-S-b は transient-mark-mode と相性悪いめです。

2010-02-06

ActiveState Perl Dev Kit 8.2 / ActivePerl 5.10.1 Build 1007 released

ActiveState の Perl Dev Kit(PDK) 8.2.0 と ActivePerl 5.10.1.1007、ついでに 5.8.9.827 がリリースされました。

ダウンロードのディレクトリ構造が掃除されて、ActivePerl は古いリリースのファイルがダウンロードできなくなってる。いっぱいあったからなぁ。古いファイル捨てられなくなっちゃったな。ActivePerl 5.6 系はもう完全に終了なのかしら。

ActivePerl 5.10 はセキュリティ修正があります。5.8 は cpan モジュールのアップデートくらいかな。

PDK 8.2 は、UTF-8 の取り扱いが腐ってて日本語圏では PerlApp が実質使い物にならなかった問題が修正されています。

同じテストプログラムが PDK 8.2 では正常に動くようになっています。Windows でも Linux でも。

あとは、Windows 7 と x64 Windows ではまだちょこちょこ問題がある様子ですね。それほど問題にはならないかな。たぶん。

2010-02-01

AOD250 に Crystal HD 載せてみた

Acer Aspire One D250 (AOD250) に Broadcom Crystal HD BCM970012 を載せてみた。(あいかわらず酷い写真だけど気にしない)

CrystalHD_BCM970012

購入はヤフオクで。ネジを 2種類つけてくれたので、小さいほうのネジで取り付けました。きちんと差し込んでネジ締めて、Windows 起動してドライバを入れるだけ。

Broadcom CrystalHD Video Decoder

ドライバは 32bit / 64bit 両方あって、Windows 7 Ultimate x86 に 3.1.0 の 32bit 版を入れました。

Atom N280, 945GSE Express (GMA950) の AOD250 では、これまで DVD の SD 画質でどうにかやっと、フル HD とか夢でも再生は無理な状況でした。まぁ、そもそも画面が 1024×600 しか無いので、外のモニタに出さないとアレなんだけど。

Playing FullHD with MPC-HC
涼しい顔してるだろ。フル HD 再生中なんだぜ、これ。

H.264 1920×1080 の動画を MPC-HC (ちょっと古いやつ 1.3.1449) で再生させたところです。なんか楽勝です…。だいたい 50% を上回らない感じ。

エンドロールみたいな文字がスクロールするのもモタつかないし、動きの激しい場面でもコマ落ちしてるように見えないし、ちょっとすごいです。

あと、Crystal HD と DXVA 対応の Flash で YouTube がワーイという触れ込みだったので、Flash 10.1 beta 2 を入れて試してみたんだけど、これはぜんぜんダメげでした。IE8 + Flash ActiveX, Firefox 3.6 + Flash plug-in どちらも。adbsn

ま、Flash は現時点ではβ版だし期待してなかったのでさておき、ふつうの動画は映像にもよるけど 10% ~ 50% くらいの CPU usage でいけちゃうみたい。

ただ、動画再生していなくてもわりとぬくい、再生すると熱いです。すのこタン。必須と思われます。AOD250 はファンがあるからマシだけど、ファンレスのマシンは厳しそう。

結論として、いい買い物だった、かな。
でも、もうこれ以上 AOD250 にはお金かけないぞっ!w

2010-01-31

Emacs pretest 23.1.92

NTEmacs 23.1.92

予定どおりに 23.1.92 が出たようです。

bzr を使って追っかけするのにもだいぶ慣れてきました。

が、やっぱ、なにをするにも遅いんだよなぁ。
Cygwin 1.7 の bzr は 2.0.0 なんですけど、これが遅いんですかね?なんだろうな。

公式で git を使えるようになったらすぐに乗り換えると思います。

一応、有志による git ミラーは以下にあります。

さて、こないだから MinGW + MSYS でビルドするようになったので、そこらへんを少しだけ。

うちでは Windows 7 Enterprise x64, MinGW 5.1.6, MSYS 1.0.13-2, gcc 4.4.0 でビルドしています。

$ msysinfo
msysinfo-1.3: Send this to the MSYS support list:

MSYS 1.0.13(0.47/3/2) 2010-01-27 23:29 i686 unknown; targ=MINGW32
GNU bash, version 3.1.17(1)-release (i686-pc-msys); ENV=.profile
GNU Make 3.81This program built for i686-pc-msys; MAKE_MODE=unix
gcc.exe (GCC) 4.4.0; targ=MINGW32
GNU ld (GNU Binutils) 2.20
00 2010-01-28 13:31:10.000000000 +0900 /bin/msys-1.0.dll
92 2009-07-11 15:34:34.000000000 +0900 /bin/msys-bz2-1.dll
74 2010-01-06 19:46:31.000000000 +0900 /bin/msys-lzma-1.dll
52 2009-11-08 10:09:15.000000000 +0900 /bin/make.exe
2009-06-23 11:46:39.000000000 +0900 /c/MinGW/bin/gcc.exe
8 2009-10-24 09:13:00.000000000 +0900 /c/MinGW/bin/ld.exe
HOME=/c/Users/yu-ji/home
Sysname=MINGW32_NT-6.1  OSTYPE=msys  TERM=cygwin
PATH=.:/usr/local/bin:/mingw/bin:/bin:/usr/bin:/c/MinGW/bin:/c/Windows/system32:/c/Windows

普段使いの環境は Cygwin 1.7 に合わせてあるので、msys.bat で MinGW + MSYS 用の環境を調整しています。Emacs をビルドするときには、cmd でも bash でも大丈夫ですが、なんとなく bash からやってます。

$ diff msys.bat~ msys.bat
1a2,3
> set Path=C:\msys\1.0\bin;C:\MinGW\bin;%SystemRoot%\system32;%SystemRoot%
> set LANG=C

間違って Cygwin 環境でやっちゃうとややこしいことになるので、configure と make はそれぞれシェルスクリプトをかませてやっています。

emacs.config.sh とかファイル名つけて…、

#!/bin/sh
if [[ $MSYSTEM != "MINGW32" ]]; then
    echo emacs.config.sh must run under the MSYS shell;
    exit;
fi
export LANG=C
time $COMSPEC /c \
    'configure.bat --with-gcc --no-cygwin --no-debug --prefix=C:/emacs/23' \
    2>&1 | tee config.log.yu-ji;

引数とか忘れますしね。

以下は emacs.make.sh とかファイル名つけて…、

#!/bin/sh
if [[ $MSYSTEM != "MINGW32" ]]; then
    echo emacs.make.sh must run under the MSYS shell;
    exit;
fi
export LANG=C
time make \
    --jobs=4 XMFLAGS="--jobs=3" \
    ARCH_CFLAGS="-c -mno-cygwin -march=native -O3 -fno-tree-vectorize -mfpmath=sse -mthreads -pipe" \
    $1 $2 $3 $4 $5 \
    2>&1 | tee make.log.yu-ji;

うちの CPU は一昨年くらいの Core 2 Duo です。-O3 だけだと temacs をダンプするとき(だったと思う)にこけるので optimization 関係のオプションを調整した結果 -O3 -fno-tree-vectorize になりました。これが何を意味するかは知りませんし、他のマシンにバイナリを持っていくことも考えてません…。
※追記参照のこと

普段追っかけるときには、以下のようにやってます。ローカルのリポジトリの持ち方によって違う気がします。ワーキングコピーに merge してから diff して commit するほうが通信量も少ない気がします。

$ cd ~/src/wc/emacs/trunk/
(emacs のワーキングコピーに移動)
$ bzr merge --preview | lv
(変更点を眺めてみる)
$ bzr merge --pull
(変更点を取り込む)
$ cd nt
$ ../../../emacs.make.sh all
(上に載せたシェルスクリプトです)
$ ../../../emacs.make.sh recompile EMACS=../src/oo-spd/i386/emacs.exe
(lisp/ 以下に変更があったときにはこれやらないと .elc が古いままです)
$ ../../../emacs.make.sh install
(いんすこ)

なにかおかしくなったら、ワーキングコピーを綺麗にして bootstrap からやりなおします。

$ ../../../emacs.make.sh realclean
$ ../../../emacs.make.sh distclean
$ ../../../emacs.config.sh
$ ../../../emacs.make.sh bootstrap

こんな感じで。

MinGW-w64 で x64 Emacs はビルドできるんですかねえ。画像用の DLL 作るあたりが鬼門そうだ…。

追記Sun Feb 14 02:39:06 2010

@dnerkxさんが -O3 -fno-tree-vectorize の件を調べてくれました。thx!