でらうま倶楽部

バカってゆうか、ゲームを作る事しか能の無いプログラマの、面白おかしな日々を綴ってみる実験。

Emacs

Emacs24.4の文字コード設定を見直す

photo
コード書いとる??

自分にとって手に馴染んだテキストエディタEmacsが24.4になって一週間。色々環境整備を続けとります。

ずっと引き継いでる初期設定ファイルが秘伝のタレみたいになってるのはいくない!!

クリーンな環境だいじ!!!!

というわけで、今回はEmacs24.4の言語設定に関して整理した内容のメモ。

ちなみにEmacs24.4はこちらで解説されているパッチを当ててビルドしたのを使ってます。


まずは言語設定の一覧。

set-language-environment
;; 実行環境(OSX Emacs24.4ではJapanese)

set-default-coding-systems
;; 以下の値を変更
;; buffer-file-coding-system
;; default-file-name-coding-system
;; default-terminal-coding-system
;; default-keyboard-coding-system
;; default-process-coding-system


set-buffer-file-coding-system
;; buffer-file-coding-systemを安全に変更

set-keyboard-coding-system
;; keyboard-coding-systemを安全に変更

set-terminal-coding-system
;; terminal-coding-systemを安全に変更

set-file-name-coding-system
;; file-name-coding-systemを安全に変更

set-buffer-process-coding-system
;; current buffer の process-coding-system を安全に変更

prefer-coding-system
;; ファイル新規作成時のcoding指定


default-file-name-coding-system
;; file name のエンコード設定の初期値
;; set-language-environmentで設定される

default-terminal-coding-system
;; Terminalのエンコード設定の初期値
;; set-language-environmentで設定される

default-keyboard-coding-system
;; キー入力のエンコード設定の初期値
;; set-language-environmentで設定される

default-process-coding-system
;; I/Oのエンコード設定の初期値
;; set-language-environmentで設定される

default-buffer-file-coding-system
;; 23.2以降では非推奨


buffer-file-coding-system
;; baffer local な coding

locale-coding-system
;; ???

多すぎ!!

なので、こんな感じのポリシーを決めて、設定を見直してみた。
  • 普段はutf-8で統一
  • VisualStudioでも扱うソースファイルはutf-8-with-signature
  • OSXで最低限の設定
初期値を調べたり、設定を削ってみたりすること小一時間…

結果、OSX Emacs24.4の言語設定に関しては以下の項目まで絞り込めた。

;; 特定の拡張子だけ、文字コードを指定
(modify-coding-system-alist 'file ".+\\.\\(cpp\\|c\\|hpp\\|h\\|mm\\|h\\)$" 'utf-8-with-signature)

;; ファイル名の文字コード
(require 'ucs-normalize)
(set-file-name-coding-system 'utf-8-hfs)

;; Shellの文字コード
(defun osx-shell-mode-hooks()
	(set-buffer-process-coding-system 'utf-8-hfs 'utf-8-hfs))
(add-hook 'shell-mode-hook 'osx-shell-mode-hooks)

うむ。スッキリ!!


あとなぜだか、set-buffer-file-coding-systemでutf-8-sまで入力して補完しようとすると、以下のエラーが出る。

completion--some: Internal error: utf-8-dos doesn't match \`utf\(.*?\)-\([-_./:| *]\|\([[:alpha:]]\)[[:digit:]]*?\)8\(.*?\)-\([-_./:| *]\|\([[:alpha:]]\)[[:digit:]]*?\)s

これなんだろね…


ではまた次回!!

結局私が Cocoa ではなく、 Carbon Emacs 23.3b を選んだ理由

photo
結論から始めるなら「Cocoa版EmacsよりCarbon版Emacsの方が使い勝手がいいよ。」という事です。まぁ私の主観ですが…もし同じような道を辿ってくる人がいるなら…というメモ書き。

それがけもの道だったらすいません。

先日、メインマシン(Win7)のACアダプタを自宅に忘れてくるという大失態をやらかしました。ACアダプタなくてもコードを書くだけなら快調に動くのですが、さすがに4時間以上の作業はムリ…^^;

「だがしかし、こんなこともあろうかとMacにもEmacs23.3bを導入しておいたわ!」と、その日一日、順調にCocoa 版 Emacs23.3bでゴリゴリ作業してたんですか…なんか違和感…。

設定ファイルはおろか、表示フォントまで一緒のはずなのになんか変。

Windows版と比べてみたら、なんとフルスクリーン表示に当てたパッチが、タイトルバーも消してしまっているじゃあ、ありませんか!う~ん。咄嗟にファイル名をフルパスで確認したい場合に目がタイトルバーにいってしまうのは癖だしな…という訳で調査開始!

で、色々調べているうちに、Carbon Emacsと呼ばれるビルドを23に取り込んだパッチが存在することを発見!IMEでの入力やフルスクリーンの仕様とか、公式より細やかな修正&機能追加であることは知っていたし、一時期使っていたことも手伝って「こ…これはぜひ試さにゃ…!」と鼻息荒くたどり着いたサイトがこちら

OSX10.6.8 + Xcode4.2 という環境なら、ここで案内されている通りの手順で Carbon Emacs 23.3b はビルドできます。ただひとつ困ったことがあって、実行バイナリが /usr/local 以下に格納されてしまうという事です。

つまり、Emacs のアイコンをほかのマシンにコピーしても動きません。

これはちょっと困ったぞ…ということで、まずは以下のようにビルド手順を変更。
./configure --with-mac --without-x --enable-mac-app="/Users/nishi/Downloads/emacs-app" --prefix="/Users/nishi/Downloads/emacs-bin"
make
make install
こうすると、バイナリは --prefix で指定したディレクトリ以下に格納されます。アプリは --enable-mac-app で指定したディレクトリに生成されていることになります。

で!Carbon Emacsで配布されてるアプリのパッケージ内容と同じ場所に同じようにバイナリをコピーするとあら不思議。単独実行可能なアプリが出来上がる…という寸法です。公式ソースに各種パッチを当てないと解消されない不具合もほぼ解消されています。そしてx64。ゴイスー!

フルスクリーン化も機能が細かく、タイトルバーを表示したままにしたいなら、こんな感じでelispを書けばよい。
(defun my-toggle-fullscreen ()
"Toggle fullscreen."
(interactive)
(if (eq (frame-parameter nil 'fullscreen) 'maximized)
(set-frame-parameter nil 'fullscreen nil)
(set-frame-parameter nil 'fullscreen 'maximized)))

あはは! 楽チン楽チン。

Carbon Emacs の修正作業を手掛けられた方と、それをEmacs23.3bにも適用できるようにしていただいた方々には、感謝してもしきれないです。ほんとうにありがとうございまする。もう明日からでも、開発マシンをMacに一本化できる勢いです(苦笑)


ではまた次回!

Emacs23 で VCパッケージ+Subversion1.7.1の組み合わせを動かす

photo
Windows7にしてから困ったことが起きました。
正確にはCygwinを新しくしてから。

EmacsのVCがうまく動作しなくなっていたんですわ。
C-x v = とか C-x v l とかでなんかへんなエラーが出る!

で、以下その顛末記です。

今使ってるCygwinのSubvirsionは1.7.1。標準設定だと .svn フォルダをチェックアウトしたディレクトリのルートにしか作らないので、これが非常にありがたかった。これまでは全サブディレクトリに.svnフォルダが作られてイヤ~ンな感じだったのだ。

で、これがEmacs23のVC(正確には vc-svn )が正しく動作しなくなる原因で、当該ファイルがバージョン管理されているかどうかの判定をミスる。コレ、ファイルと同じパスに.svnがあるかどーかで判定しているみたい。

んでやっぱり、Emacs24(pretest)だとこれが直ってる。まじかー。

なので、こうやって解決しました。
  1. 標準のlispより先に読み込むパスに、Emacs24(pretest)に含まれてる vc-svn.el をコピー
  2. init.el に以下を追加
    (defun vc-svn-registered (f)
    (let ((admin-dir (cond ((and (eq system-type 'windows-nt)
    (getenv "SVN_ASP_DOT_NET_HACK"))
    "_svn")
    (t ".svn"))))
    (when (vc-find-root f admin-dir)
    (load "vc-svn")
    (vc-svn-registered f))))
  3. 必要なら vc-svn.el をバイトコンパイル
  4. 完了

そんだけかよ! …や、ここにたどり着くまでにえらい試行錯誤しました。

なぜこうなるかというと。

vc-svn.el を読み込む判定が loaddefs.el にあるんだけど、このファイル、Emacsのビルド時に自動的に生成される。 update-file-autoloads で作り直せる…かもしれないんだけど…ダメ元で vc-svn.el の中の ###autoload コメントのある個所の関数をinit.elに書いたらなんとかいい感じに動いてくれた模様。

まあ応急処置という事で…

また次回!

emacs 23.3b を Windowsで野良ビルド

photo
emacs は 24 の pretest がいよいよ大詰め…の中、しれっと23.3bが出ておりました。

gnupackの中の人もとても多忙なのでしょう、なかなか23.3bのビルドが見つかりませぬ。
自分も一度 VisualStudio2008 とか cygwin でビルドしようとして挫折。

そしたら、たいへん素晴らしいemacsのビルド記事をみつけました。
どうもありがとうございます!

という訳でさっそく野良ビルド。

こちらの記事を参考に、MinGWとmsysをインストール。
ちなみに環境変数は変更しません。

んで、こちらの記事を見ながらビルド開始。
ただ、画像系のライブラリは軒並み要らない派ので自分はこうしました。
>configure.bat --no-debug --with-gcc --enable-w32-ime --cflags -O3 --cflags -mthreads --cflags -pipe --cflags -DRECONVERSION --cflags -DIME_UNICODE --without-png --without-jpeg --without-gif --without-tiff --without-xpm
>mingw32-make ARCH_CFLAGS="-c -mtune=native" bootstrap
>mingw32-make install
gcc のバージョンは 4.6.1 です。

はい、完了~。
インラインで日本語入力もできるし、心なしか公式ビルドよりはやいきがするぜ!

Windows7 の人はここからアプリケーションIDを再設定するツールを拾ってきて、runemacs.exeのショートカットのアプリケーションIDを「GNU.Emacs」にすると、ちょこっと幸せになれるかもしれません。

ちなみに 23.3b で何が修正されたのか…リリースノートが見当たらないのでわからない。
どなたかご存知ありませぬか?

ではまた次回!

Emacs23でDarkRoomとか

DarkRoomとは、フルスクリーンでテキストを編集する事に特化したエディタです。

やはり集中するには余計な情報を排除した方がよいのでしょう。画面に色々な情報が散らばっとるとかえって効率が落ちるという研究報告もあるくらいですからな^^;

で、そのDarkRoom的なのをEmacsで実現するには単にフルスクリーンにしてメニューを消してしまえばいい…はずなのですが。

photo1
んー。微妙。

画面右側。勿体なくね?

コードって比較的短い文の繰り返しなのでこんな感じに左に寄る寄る。で、常にその左側を見てる訳なので、姿勢も目も悪くなる悪くなるw

アウトラインとかヘルプとか…何か補足的な情報を表示してみては?とのアドバイスも頂きましたが…どれも今んとこしっくりきてないのよね。左右2分割とかなぜか混乱する始末^^; 我儘ですいません…

文句ばっか言ってては進展せーへんので色々試行錯誤しつつマクロを書いてみた。
;; 左右margin変更
(defvar my-window-margin 18)

(defun my-margin-hooks(&optional target)
(set-window-margins target my-window-margin my-window-margin))

(defadvice display-buffer (after my-display-buffer activate)
(my-margin-hooks ad-return-value))

(my-margin-hooks (minibuffer-window))
(add-hook 'window-configuration-change-hook 'my-margin-hooks)
(add-hook 'minibuffer-setup-hook 'my-margin-hooks)
どうかな?

photo2

こんどはバッチリだ!左右このくらい隙間があるとだいたい目が画面の中央付近を見る事になって集中集中。たまに左右の隙間が無くなる事があるんだけど…原因を特定できず。なにかを…忘れてるんだよね。きっと。あと、上下分割は問題ありませんが左右分割はえらい事になるんで、普段左右分割して使っとる人にはオススメできません。

ついでに… 自分はEmacsの設定ファイルや追加lispファイルを ~/.emacs.d 以下に放り込んでて、org-modeのinfoファイルもまたしかり。 ~/.emacs.d/info/org みたいな。でもWinもMacも初期設定だとこの場所のinfoを読んでくれない!

のでこーしてます。
(add-to-list 'load-path "~/.emacs.d/lisp")

infoはWinとMacで個別指定。
(add-to-list 'Info-default-directory-list "~/.emacs.d/info")
↑これがWindowsでの設定

(setenv "INFOPATH" (concat "~/.emacs.d/info:" (getenv "INFOPATH")))
↑これがOSXでの設定

詳しい実装方法を見てないのですが、WindowsとOSXで微妙に振る舞いが違っててこの設定に辿り着くまでにえらい時間が掛ってもーた。まぁでも一回設定したらずっと変更しない設定なので満足。

さいきんEmacsネタばっかだな^^;

さいきんEmacsネタばっかですね。


ではまた次回!

Emacs23 カーソル位置の単語をいきなりisearch…とか。

photo
先月Emacs22.3から乗りかえたEmacs23.3ですがかなり慣れました。ので、前回の続きで色々知った事や判った事をブログに書いときます。

ではダイジェストでお楽しみください。

OSX版Emacs23.3で、org-modeの挙動が微妙なのは、以下の設定をinit.elに追加したら直りました。やっぱマウス要らないw
(defun org-agenda-mode-hooks()
  (local-unset-key [mouse-2])
  (local-unset-key [mouse-3]))
(add-hook 'org-agenda-mode-hook 'org-agenda-mode-hooks)

(defun org-mode-hooks()
  (local-unset-key [mouse-2])
  (local-unset-key [mouse-3]))
(add-hook 'org-mode-hook 'org-mode-hooks)

Windowsは諸々文字コードはSJISかと思ってましたが、厳密にはSJISを拡張したCP932だそうで…。のでファイル名の文字コードはその設定に変更。これで「~」とかの文字化けが直った…ような。
(setq file-name-coding-system 'cp932)

ついでに、デフォルトの文字コードはUTF-8でも、新規ファイル作成の時だけ文字コードをCP932にするようなマクロも書いた。
自分、Windowsでプログラムを書く場合にUTF-8やEUC-JPにできない故の特殊仕様^^;
(defun my-find-file ()
  "新規ファイル作成時だけcp932-unix"
  (interactive)
  (and (not buffer-read-only)
       (or (eq this-command 'auto-insert)
           (and (bobp) (eobp)))
       (set-buffer-file-coding-system 'cp932-unix nil t)))
(add-hook 'find-file-hook 'my-find-file)

OSXのファイルの文字コードはUTF-8とビミョーに違うくて、Shellでlsした時にファイル名が化ける。みんな無茶しやがって…!これはこんな感じに設定すれば回避できる。
(defun mac-shell-mode-hooks()
  (set-buffer-process-coding-system 'utf-8-nfd 'utf-8-nfd))
(add-hook 'shell-mode-hook 'mac-shell-mode-hooks)

他の人の書いたelispや内蔵elispが何かの弾みで動かなくなった場合、エラー箇所を特定するのは(自分的に)難しい。
でもこうすると実行中のelispでエラーが発生した時にバックトレースできる。
(setq debug-on-error t)

今更ながら、割と初心者向きなgrepを発見。grepの難しいコマンドを覚えなくても対話的に入力するだけでgrep。

lgrep …カレントディレクトリでgrep
rgrep …カレントディレクトリ以下のディレクトリ全てでgrep

ただしWindowsだと初期設定状態の動作が微妙なので、以下のように再設定。ありえるえりあの記事に多謝。いつもお世話になっています^^;
(setq grep-host-defaults-alist nil) ;; これはおまじないだと思ってください
(setq grep-template "grep -nH <C> <R> <F>")
(setq grep-find-template "find . <X> -type f <F> -exec grep -nH <C> <R> '{}' +")
(setq grep-find-ignored-files nil)

去年あたりに書いたカーソル位置の単語をisearchをすっきり手直し。
範囲選択中なら、その文字列でいきなしisearch-forwordします。これ便利ですよ。自画自賛。
(defun my-isearch-get-word()
  "カーソル位置の単語をisearch"
  (interactive)
  (if(not isearch-mode)
      (progn
        (call-interactively 'isearch-forward)
        (let ((string
               (if (and transient-mark-mode mark-active)
                   (buffer-substring (region-beginning) (region-end))
                 (thing-at-point 'symbol))))
          (deactivate-mark)
          (isearch-yank-string string)))))

自分的にはisearch中でもC-gで問答無用にisearchを抜けて欲しいのでそう設定。
(define-key isearch-mode-map "\C-g" 'isearch-cancel)

EmacsいいよねEmacs。

ではまた次回!

Emacs23.3と暮らし始めてみた

拙作TieGunner窓の杜MOONGIFTで紹介して頂きました。
趣味丸出しで作ったゲームをこうして紹介して頂けて嬉しい限りです。

取り上げて下さった記者の方、完成までに色々とアドバイスをくれた方。動作確認を手伝ってくれた方。…そして何より実際にプレイして下さった方。多謝。

まーちょい裏技入れときゃよかった!

ではなくて…これで暮らしていけたら最高なんですが(笑)
や、笑い事じゃない!


さてさて、久々Emacsの話題。

ちょい前からEmacs22.3→23.3にしたのでその話です。
Emacsって何?って人すいません。こっから下の文章は訳ワカメだと思うので今が最後の退室のチャンスです。ちなみにEmacs、EmacsゆーてますがすべてWindows版(gnupack版)を指してます。


そのEmacsですが、あれだけ「Consolas!Consolas!」と叫んどりましたがもう慣れました。やればできる子!
photo1
Emacs23.3(gnupack) + Bitstream Vera Sans Mono

Windows版のEmacsは23から一部フォントの描画が異様に重くなってて、Consolasもそんな感じで困ってたのよ。nVIDIAのビデオカードとか積んでるマシンでもだよ!
で、修正される気配がないのでエイヤっと切り替えました。

photo2
フォントによってはまったく見分けのつかない文字もちゃんと見分けられるし。

photo3
メイリオの文字幅を調整したMeiryoWideだと、9ポイントで半角2文字=全角1文字で表示されるし。

photo4
数字のゼロが斜線入りではなく中黒ですが、いくつも並ぶと誰かさんの目に見えておちゃめだし。見えんか。

よいかんじ。

そんなEmacs23.3ですが…22.3から乗りかえてみて振る舞いが変わった?点やら便乗して手直ししたelispやらを中間報告的にまとめてみましたん。
  • 22.3だとバッファをファイルに書き出す時に勝手に文字コードを変更される
    コレ困ってました。htmlのmetaタグを見て…とかそういうレベルじゃない。auto-coding-functionsを設定し直しても効果なし。どんなファイルでも半角カナとかをコピペして書き出すと何の警告も無く勝手にUTF-8に変更されてしまうという不具合。仕事で幾つか携帯サイトをメンテナンスしてる都合上半角カナは避けては通れず…これには大変困った。
    S-JISやらEUC-JPやらUTF-8やら沢山ファイルを開いてるとアウト。複数バッファのcoding-systemの値を正しく扱えなくなってる感じ。でも23.3だと直ってたんでハッピー。
  • 22.3だとorg-agendaのmode名がbs-showで正しく表示されない
    微妙に困りレベル(笑) ちょっと見た目が悪い程度。どうやら23以降の新しいモードラインの機能を使ってるのが原因。
    これも23.3だと直ってたんでハッピー。
  • フォントを変更したら最大化の時に右端と下端に隙間ができた
    かなり困りレベル(笑) Emacsは常に最大化して使ってる派ですから、その微妙な隙間が気になって仕方が無い。その隙間から誰か覗いてる…とかあると怖すぎ。誰も覗きませんて。
    これは、Emacsを最小化→再表示すると隙間が埋まるのを発見して解決。嘘みたいなホントの話。
  • shell-quote-argumentの振る舞いが直ってる…?
    22.3の時、grepとかediffとかをEmacsからcygwin経由で実行する時、引数のquoteがちゃんできてないっぽかったのでshell-quote-argumentを自分で直してたんだけど、23.3は大丈夫っぽい。アレ?違う理由だっけ…みたいな。
  • JSONファイルを扱うモードが追加された
    22.3ではjavascript.elを使ってJSONファイルを編集してましたが、23.3ではjs-modeが追加されとりました。
    (add-to-list 'auto-mode-alist '("\\.\\(js\\|json\\)$" . js-mode))
    ;;(autoload 'javascript-mode "javascript" nil t)
    (defun js-mode-hooks()
      (setq truncate-lines t)
      (setq tab-width 4))
    (add-hook 'js-mode-hook 'js-mode-hooks)
    init.elを↑こんな感じにして完了。
  • 論理行表示でのカーソル移動
    22.3では論理行表示モードでの縦方向のカーソル移動が微妙。でもほとんど改行の入ってないhtmlファイルとか触る事があるのでそのへんなんとか…みたいな。で、解決する為にphysical-line.elを使ってました。
    でも23以降で標準装備になっててハッピー。変数line-move-visualで設定。初期設定でonになってるから触る必要無いけど。
  • ファイル名に全角が含まれとるとbs-showで正しく表示されない
    これ、22.3でも23.3でも一緒。bs-show-in-bufferでファイル名の文字数を数える時にlengthを使ってるのが原因。ので、
    (eval-after-load "bs"
      '(progn
         (defun my-bs-show-in-buffer (list)
           "bs-show-in-bufferファイル名の幅を全角文字に対応"
           (setq bs-current-list list)
           (switch-to-buffer (get-buffer-create "*buffer-selection*"))
           (bs-mode)
           (let* ((inhibit-read-only t)
                  (map-fun (lambda (entry)
                             (string-width (buffer-name entry))))
                  (max-length-of-names (apply 'max
                                              (cons 0 (mapcar map-fun list))))
                  (name-entry-length (min bs-maximal-buffer-name-column
                                          (max bs-minimal-buffer-name-column
                                               max-length-of-names))))
             (erase-buffer)
             (setq bs--name-entry-length name-entry-length)
             (bs--show-header)
             (dolist (buffer list)
               (bs--insert-one-entry buffer)
               (insert "\n"))
             (delete-backward-char 1)
             (bs--set-window-height)
             (bs--goto-current-buffer)
             (font-lock-fontify-buffer)
             (bs-apply-sort-faces)
             (set-buffer-modified-p nil)))
         (fset 'bs-show-in-buffer 'my-bs-show-in-buffer)))
    init.elで↑こんな感じに追加。これってバグレポに上がってたっけ?
  • org-modeで左右マージンを設定してみた
    Emacs最大化派にとってワイド液晶は天敵です。テキストがかなり左に寄るので。特にorg-agendaがえらい左寄りで見辛い。これは良くない。両目はバランスよく使いたい。ので、こんな感じに
    (defvar my-org-mode-margin 20 "org-modeの左右マージン値")

    (defun org-agenda-mode-hooks()
      (setq left-margin-width my-org-mode-margin)
      (setq right-margin-width my-org-mode-margin)
      (set-window-margins nil my-org-mode-margin my-org-mode-margin))
    (add-hook 'org-agenda-mode-hook 'org-agenda-mode-hooks)
    init.elで↑こんな感じにhookに追加。お好みでorg-modeのhookにも追加。
    でも、バッファを閉じた後、他のバッファにマージンの設定が反映されてしまう事があって微妙。そんな時は一旦他のバッファに切り替えると直ります。これも誰か解決策を知ってたら教えてください。
  • 補完バッファをショートカット一発で閉じる
    (define-key completion-list-mode-map "\C-g" 'abort-recursive-edit)
    (define-key completion-list-mode-map "q" 'abort-recursive-edit)
    ↑こんな感じ。補完バッファってC-g一発で閉じてくれなかったので超便利。他に影響が出てない事を祈る…
  • diredでmarkのトグル
    (defun my-dired-toggle-mark()
      (let ((cur (cond ((eq (following-char) dired-marker-char) ?\040)
                       (t dired-marker-char))))
        (delete-char 1)
        (insert cur)))

    (defun my-dired-mark (arg)
      "toggle mark the current (or next ARG) files.
    If on a subdir headerline, mark all its files except `.' and `..'.

    Use \\[dired-unmark-all-files] to remove all marks
    and \\[dired-unmark] on a subdir to remove the marks in
    this subdir."

      (interactive "P")
      (if (dired-get-subdir)
          (save-excursion (dired-mark-subdir-files))
        (let ((inhibit-read-only t))
          (dired-repeat-over-lines
           (prefix-numeric-value arg)
           'my-dired-toggle-mark))))

    (defun my-dired-mark-backward (arg)
      "In Dired, move up lines and toggle mark there.
    Optional prefix ARG says how many lines to unflag; default is one line."
      (interactive "p")
      (my-dired-mark (- arg)))

    (defun dired-mode-hooks()
      (local-set-key (kbd "SPC") 'my-dired-mark)
      (local-set-key (kbd "S-SPC") 'my-dired-mark-backward))
    (add-hook 'dired-mode-hook 'dired-mode-hooks)
    init.elで↑こんな感じに追加。SPACEでmarkをトグルしつつ一行下へ移動。SHIFT-SPACEでmarkをトグルしつつ一行上へ移動。これなんで標準で入ってないん?って感じ。
    mでmark、uでunmarkでもいいんだけどさ…常用するキーを1つでも減らす方が優先。イマドキのマクロは空気を読んで実行内容を微調整しなくっちゃ。
  • imenu起動時にカレントバッファを補完バッファへきりかえる
    (eval-after-load "imenu"
      '(progn
         (defun my-imenu--completion-buffer (index-alist &optional prompt)
           "Let the user select from INDEX-ALIST in a completion buffer with PROMPT.

    Return one of the entries in index-alist or nil.

    Modified by nishi
    1.自動ポップアップ時にカーソルを補完バッファへ移動
    2.カーソル位置の文字列が補完対象の場合は自動ポップアップしない"
           ;; Create a list for this buffer only when needed.
           (let ((name (thing-at-point 'symbol))
                 (name-exists nil)                      ; added by nishi
                 choice
                 (prepared-index-alist
                  (if (not imenu-space-replacement) index-alist
                    (mapcar
                     (lambda (item)
                       (cons (subst-char-in-string ?\s (aref imenu-space-replacement 0)
                                                   (car item))
                             (cdr item)))
                     index-alist))))
             (when (stringp name)
               (setq name (or (imenu-find-default name prepared-index-alist) name)))
             (cond (prompt)
                   ((and name (imenu--in-alist name prepared-index-alist))
                    (setq prompt (format "Index item (default %s): " name))
                    (setq name-exists t))
                   (t (setq prompt "Index item: ")))
             (let ((minibuffer-setup-hook minibuffer-setup-hook))
               ;; Display the completion buffer.
               ;; (if (not imenu-eager-completion-buffer)
               ;; modified by nishi
               (if (and
                    (not imenu-eager-completion-buffer)
                    (not name-exists))
                   (add-hook 'minibuffer-setup-hook 'my-minibuffer-completion-help))
               (setq name (completing-read prompt
                                           prepared-index-alist
                                           nil t nil 'imenu--history-list name)))

             (when (stringp name)
               (setq choice (assoc name prepared-index-alist))
               (if (imenu--subalist-p choice)
                   (imenu--completion-buffer (cdr choice) prompt)
                 choice))))

         (defun my-minibuffer-completion-help()
           (minibuffer-completion-help)
           (switch-to-completions))

         (fset 'imenu--completion-buffer 'my-imenu--completion-buffer)))
    init.elで↑こんな感じに追加。imenuの元の関数に少し手を入れただけ~。で、imenu-eager-completion-bufferをnilにすると、imenuを起動した瞬間補完バッファも開き、さらにカレントバッファも補完バッファになってるという寸法さ!イエス!imenu起動直後に補完バッファを開く人にオススメ。
    ただしEmacsのバージョンが上がってimenu.elに手が入った時にいちいち変更箇所を調べて修正しないといけないのが残念。良い方法をご存知の方いませんかー!
  • TAB⇔space
    この記事を書いてて見つけました。tabifyとuntabifyでTABとSPACEの相互置換ができるのか…!このブログみたくTABが使いにくい環境にコードをコピペする時に重宝するぜ。
ちなみに最近お気に入りなvc-modeはまだ検証中。22.3で存在してたUTF-8の文脈依存な文字の扱いやらput-char-code-propertyで設定してた文字化け問題とかまだまだ22.3→23.3で調べなきゃイカン事が山積。OSX版もほったらかしだし…使いながら学んでいくって感じ。

Emacsってelispに慣れれば不満な箇所は自分で直せるのが素敵。

これがけっこう楽しいんだよね。

Emacs+Subversionで文字化けと格闘する事幾星霜…

EmacsでSubversion…!

subversion-logo

コードの修正箇所をササっとチェックしたり、一定段階のバージョンを保存したり、プロジェクトが終わればリポジトリがそのままバックアップになるという感じで一人開発でも便利なSCM。

Xcodeではとっくに使ってましたが、やっぱEmacsから使いたいからなー、といそいそとEmacs(Win)+Cygwin+Subversionのセットアップを始めたのですが…

やはりブチ当たりました。文字化けー!

という訳でなんでそんな事になったのか?如何にその状況から脱したのか…以下その詳細。
お時間のある方はお付き合い頂ければこれ幸いです。


自分のテキスト環境はEmacs22.3(Windows)+Cygwin1.7系。SubversionはCygwinのセットアップを使って導入しました。で、init.elには以下のような設定を追加。

(setenv "PATH" "C:\\cygwin\\bin")
(setenv "CYGWIN" "nodosfilewarning")
(setenv "LC_ALL" "ja_JP.UTF-8")
(setenv "LANG" "ja_JP.UTF-8")

Emacsにはすでに「vc」と呼ばれる版管理システムがあり、svnにも対応しているのでこれでいきなりEmacs上からSubversionが使えるよーになる。すこぶる便利。で、早速開いたファイルでC-x v =(vc-diff)。おーちゃんとdiffできとる!けど、リビジョン表示がなんか文字化け。

「--- nn_gamemain.c    (繝ェ繝薙ず繝ァ繝ウ 8)」

こんな感じ。さっそく暗雲きたる。

調べてみると原因はこう。ソースの文字コードはSJIS。Subversionは文字コードをまるっとスルーして出力。Cygwinのsvnはちゃんとローカライズされてて、設定通りメッセージをja_JP.UTF-8で出力。vc-diffは開いてるバッファの文字コードを元にdiffのバッファの文字コードを決める。 結果、diffのバッファはSJISで開き、そこにUTF-8なsvnのメッセージ「リビジョン」が表示されて文字化ける。まま、まじっすか。

でもこれは、ロケールをこうする事で回避。

(setenv "LC_ALL" "en_US.UTF-8")
(setenv "LANG" "en_US.UTF-8")

全角文字なファイル名でコケる事も回避できて一石二鳥。各種Cygwinコマンドのメッセージが英語になるのはこの際我慢だ。


さて、ただこれだけだと自分の運用的に物足りないので、機能強化版でもあるdsvnを導入。これもほんのちょっとの設定追加で使えるようになって便利!しかもこれだと、M-x svn-status した後、操作メニューが出たり、ディレクトリ一覧からdiffが取れたりとほんのり初心者に優しい設計。そんなに動作も重くないしね。

が…M-x svn-diff-file で表示されるテキストがもう化け化け…!一難去ってまた一難。しかもコードを追っかけてみるとこっちの実装は複数ファイルをまとめてdiffできるようにする都合上、バッファの文字コードがUTF-8の決め打ち…。自分、iPhoneのコードはUTF-8、趣味で書いてるコードはSJIS、PerlスクリプトがEUC-JPとそれはもう自分の経歴以上にバラエティ豊かなコード群のため、これじゃ便利な機能がまったく活かされない。

しかもググった感じ、もう見つかるわ見つかるわ。先人たちの大量の苦心の跡が。やっぱSubversionで文字コードをガン無視しとるのが問題っぽい。じゃあ設定ファイルで文字コードを自動判別させようかとも思うも、先に述べたように同じ.cファイルでも多様な文字コードになってる為、拡張子から文字コードを決める作戦も却下。そもそも拡張子から判断ってナンセンス。

これ、UNIX系だと、nkfを拾ってきて、

#!/bin/sh
svn "$@" | nkf -w

みたいなスクリプトを書いてやり、そっちを呼び出すようにしてやればいい…実際Cygwinのシェル上ではこれで解決した…んだけど、dsvnの実装だと外部プログラムの起動にstart-processを使っていて、シェルスクリプトはNGな模様。さあコイツは難問だ。でもここまで深みにハマったらもう後には引けないので、dsvnのソースを追っかけてなんとかそれっぽい箇所を発見。

(set-process-coding-system proc 'utf-8)
                            ↓こうする
(set-process-coding-system proc 'undecided)

この修正は二か所。そして、init.elに以下のように追加。

(eval-after-load "dsvn"
  '(progn
  (define-key svn-status-mode-map "!" 'svn-update-current)
  ;; キーコンフィグ

  ;; 異なる文字コードのソースもちゃんと閲覧できるようにする
  (defadvice svn-output-filter (before my-svn-output-filter activate)
    "dsvnからのsvn出力を加工する"
    (let ((coding default-buffer-file-coding-system))
      (setq str (decode-coding-string (encode-coding-string str coding) coding))
      (setq str (replace-regexp-in-string "^M" "" str))))))
※replace-regexp-in-stringに渡してる「^M」は、「M-x quoted-insert」してCtrl-mして入力する改行コードなので気をつけてちょ

ラッキーな事にサブプロセスからの出力をフックしている箇所を見つけたので、そこで文字列を自分の設定に合わせて変換するコードを突っ込んだった。あと、ついでにキーコンフィグも少々。おお~UTF-8なコードもSJISなコードもEUC-JPなコードも改行がCRLFもぜーんぶ正しくdiff取れるようになった!こんな風にコードを追加できるEmacsもスゲェが見つけた俺もスゲェ!設定の都合上コミットはできないけど、ネットワークドライブ越しのMacにあるiPhoneのコード(UTF-8)もdiffが取れてなんて便利なんだ。

で、dsvn内部で出力バッファの文字コードを決め打ちしてる箇所を直したのを上げときます(M-x customize-group で変更可能)。自分で書き替えるのに自信の無い人はどーぞ。無保証ですが。


とまぁ、EmacsとCygwinとSubversionの三つ巴のバトルは延々に続くかと思いましたが…それになんとか自分なりに終止符を打つ事ができたと思うぜ!果たして上手に説明できてるかは甚だギモンですが…^^; あとローカライズなんて無ければいいのに…!

WindowsでEmacsを使うのは茨の道…。

[Emacs]スクラッチバッファを自動保存したり行末コメントをまとめて削除したりな小粒マクロ集

久々Emacsネタです。

普段使いで「欲しいな」と思った機能をネットで見つけたり自作したり。稚拙だとは思いつつも再び記事にしてみました。

今回は3つほど。どれも非常に限定かつマニアックな内容ですが、興味のある人は5分ほどお時間を頂ければ幸いでっす。


1. スクラッチバッファを保存する

メモ帳的に使えて便利なスクラッチバッファ。URLメモやら引用テキストメモやらマクロの実験やらと大活躍!でもうっかりEmacsを終了してしまって痛い目を見た人も多いと思います。…私もかなり痛い目みました。

ので、「終了時に保存→起動時に自動的に読み込み」するマクロを探してみたら…ありました!こんな感じ。

;;; auto save and restore scratch buffer
(defun save-scratch-data ()
  (let ((str (progn
               (set-buffer (get-buffer "*scratch*"))
               (buffer-substring-no-properties
                (point-min) (point-max))))
        (file "~/.emacs.d/.scratch"))
    (if (get-file-buffer (expand-file-name file))
        (setq buf (get-file-buffer (expand-file-name file)))
      (setq buf (find-file-noselect file)))
    (set-buffer buf)
    (erase-buffer)
    (insert str)
    (save-buffer)
    (kill-buffer buf)))

(defadvice save-buffers-kill-emacs
  (before save-scratch-buffer activate)
  (save-scratch-data))

(defun read-scratch-data ()
  (let ((file "~/.emacs.d/.scratch"))
    (when (file-exists-p file)
      (set-buffer (get-buffer "*scratch*"))
      (erase-buffer)
      (insert-file-contents file))
    ))


(read-scratch-data)    ;; ←これは初期設定ファイルの最後に追加

すっげぇ!これを考えた人は神。コードを読めば確かにそう実装すればいい事はわかるんだけど…それをゼロから考えるまでには至ってないなぁ。

そうそう、上のマクロでは保存用のファイルは「~/.emacs.d/.scratch」になってます。これは各自の環境に合わせて変更してちょ。


2. スクラッチバッファ以外をキル

事務所で作業してる時のバッファ構成を覚えておくのに、こちらのrevive.elを利用しています。これを「自分のタイミングで呼び出してバッファ内容を保存→自分のタイミングで復元」的な。で、これまでは「バッファ内容を保存→全バッファ破棄」というマクロを自作してましたが、上で紹介したマクロに対応させるため「バッファ内容を保存→スクラッチバッファ以外のバッファを破棄」に変更しました。まあこんな感の簡単なマクロです。

(defun my-kill-all-buffers ()
  "scratch bufferを除く全てのバッファをkillして、復元情報を作成"
  (interactive)
  (save-current-configuration)
  (dolist (buf (buffer-list))
    (if(not (string= "*scratch*" (buffer-name buf))) (kill-buffer buf))))

revive.elはバッファの分割状態まで保存→復帰してくれてホント便利なマクロです。普段ノートパソコンを使っていると作業場所に応じてファイルを開いたりしてメンドーだったのですが、それが一気に解消。また複数の状態を保存できるので、仕事、趣味、マクロ開発など、幾つかの状態を保存しておいてショートカット一発で切り替えられる環境はもっと広まって欲しい。


3. 行末コメント削除(リージョン対応版)

コードを書いてる時に、行末コメントをまとめて消したい状況があったりします。まあ主に人の書いたコードをコピペした時なんですが。で、範囲選択してcomment-kill …なんも反応なし。みたいな。ええー!comment-dwimは範囲指定対応してるのにー。という訳で自力で調べてマクロを書いたのがコチラ。

(defun my-comment-kill(arg)
  "コメント削除(リージョン対応)"
  (interactive "p")
  (if mark-active
      (let ((start (region-beginning)) (end (region-end)))
        (if (> (point) (mark))
              (goto-char (mark)))
        (comment-kill (count-lines start end))
        (if (= (point) (mark))
              (goto-char start))
        (deactivate-mark))
    (comment-kill arg)))

あぁ…そうそうこんな感じ。とりあえず気分が落ち着きました(笑)


気づけばinit.elも1200行を超えて順調に育っております(*^_^*)

日々の使用で「これ欲しいなぁ」とか「ちょっと振る舞いを変えたいんだけど…」という要求が、(ちょっと頑張れば)実現可能だというのがEmacs。プログラム開発向けに便利な統合環境も数多く存在する中、当分手放せそうにありません(笑)

Emacs 便利な桁揃え機能の封印を解く(Objective-C)

photoすっかりEmacsの虜です。
とくに自動インデント。

専門学校でVisualStudioとか触るんが…
いい感じにインデントしてくれなくて度々イラッとする。

Xcodeはサービス過剰すぎて落ち着かん(笑)

以前は自動インデントモードには否定的だったんだけど…
自分の思った通りの振る舞いをしてくれるぶんには大歓迎。

キータイプはそんなに早い方じゃないんで、
こういった補助機能でカバー。

Emacsにはプログラムのインデント機能以外に桁揃え機能があって、
M-x align でいい感じに桁揃えしてくれる。
もちろんリージョン内での実行にも対応。

BOOL didLaunch;
NSArray *materials;
sMaterialParam *matParam;
NSMutableDictionary *materialTexture;
UIImage *bgThumb;

↑これを一発でこうしてくれるのだ↓

BOOL                   didLaunch;
NSArray                *materials;
sMaterialParam        *matParam;
NSMutableDictionary *materialTexture;
UIImage *bgThumb;


なのに!
Emacsでこの便利なalignが使えなくて少々困ってた。
というか、使えないと思いこんでた。

alignの設定を調べてみたら、初期状態ではObjective-Cでの桁揃え機能が有効になってない…!
相変わらずObjective-Cモードは忘れられがちだのぅ…。

という訳で、カスタマイズ機能を使って align-c++-modes に objc-mode を追加するか、
init.el に

(setq align-c++-modes (cons 'objc-mode align-c++-modes))

と追加すればオッケー。

すっきり!

Emacs 巷はバージョンアップ祭り開催中(23.2)。でも指をくわえて見てるしか…!

photo1Emacsのバージョンが23.2になったのでいそいそとバージョンアップ作業。

特にWindows環境は、公式バイナリで日本語がインライン入力できるようになるという、嬉しすぎる機能強化があったので期待大。でも若干いまさら感もあり(笑)

ま、UNIX畑のソフトだからねー。Windowsで使うには色々諸々工夫が必要なのだ。でも時間を掛ければそのへんのテキストエディタより格段に使いやすくなるはずなので我慢の子。使い古した道具が手に馴染む感じ。

そしてあえなく玉砕。

WindowsXPだとConsolasフォントを指定すると激重になる件が相変わらず。ハンパなく重い。これじゃ使いモノにならんので思い切ってバグレポ書くべ…と思って検索してみたら、やっぱり上がってたよバグレポ。なんだよもう!

という訳で、この件FIXされるまでバージョンアップはおあずけになりました。Macだとぜんぜん問題ないのになー。

Macの場合、23.2のソースを取ってきて

./configure --with-ns --without-x
make
make install

でなんの問題も無くバイナリが出来あがる。もちろん64bit。素晴らしい!


で、Consolas問題で四苦八苦してた時になんとなく見つけたEmacs23.2のTips…とか?

  1. set-face-foregroundで色を変えてると、org-modeの色分けが変になるんで、カスタマイズ機能を使って指定し直す必要がある。
  2. (setq redisplay-preemption-period nil)で、描画が重い時にそれなりに描画完了を待ってくれるようになる。
  3. フォント設定は
    (set-frame-font "Bitstream Vera Sans Mono-9")
    みたいに書く。いいかげん set-default-font は使うなって事らしい。
  4. Mac版で簡易的にフルスクリーンにしたければ、フレームの幅と高さに1000とか大きな値を設定すればよい。23.2からはいい塩梅にサイズ調整してくれる。
  5. org-mode、なにげにバージョンが上がって6.36になってた。

では次回までごきげんよう!

Emacs23 偶然にも爆速設定を発見。でもどーすれば…(泣)

phito1気づけばEmacsも23.1.96
23.2のリリースも間近なんじゃなーい?

そんなタイミングでEmacsを使い始められてなんかラッキー。周りが賑やかなので良い。情報も集めやすいからね。

だけど部長のノートPCだと、Emacs23はけっこう…いやかなり重い(T T)

カーソル移動が飛び飛びになったり、スクロール中に画面が更新されなくなったりと、ストレス溜まりまくりんぐ。だからEmacs22.3を捨てられない。

で、その原因がようやく判明しました。

なんとなく初期化ファイルを読み込まない状態でEmacs23.1.96を立ち上げたわけさ。そしたらなんか色々と快適…というか軽い。…軽っ!スクロールとか、バッファオープンとか、これまでの重々~なのが嘘みたいにサクサク動く。

ももも、もしかして…!と思って初期設定ファイルを読み込ませたら…やっぱ重いんですけどー。

という事で一つづつ設定を外してって判明したのがコチラ。


フォント設定!



フォントをConsolasにしただけでもうアウト。どないせーっちゅーねん(涙)

午前3時は彼の独壇場。部長の独壇場でもありますが。

さっそくチェックしてる人もいるのかな?

テニプリの木更津淳役や、セサミストリートのビッグバードの声(実は中の人でもある)などなどで有名な鶴岡聡さん。

こないだのリーディングイベントでもご一緒させていただきました。

その彼が!
つぶやいとります。
それもツイッターじゃなくってYouTubeで。

『午前三時の独壇場』


とても彼らしい、しぶ~いつぶやき。なにせ時間が時間ですから!
彼の独壇場って、どんなだ?って思ってくれたのなら、さっそく聴いて確かめてみよう。⇒ケータイ向けリンク ⇒公式チャンネル

ブログも始めてるみたいだね。


photo1そんで、そんな時間でもせっせと部長はプログラム書いたりEmacsのカスタマイズに精を出してるよ。もう寝ようよ。

Emacsのカレンダーを使い始めたはいいものの、月齢表が微妙に見辛い。なんか桁が不揃いなのが気に入らん。英語圏の人って桁が不揃いなのは気にならんのかしら?

ので、直してみました。前回の設定に追加する感じです。

(defun calendar-load-hooks()
  (define-key calendar-mode-map "M" 'my-calendar-phases-of-moon))
(add-hook 'calendar-load-hook 'calendar-load-hooks)

(defun calendar-mode-hooks()
  (require 'lunar)
  (fset 'lunar-phase-name 'my-lunar-phase-name))
(add-hook 'calendar-mode-hook 'calendar-mode-hooks)

(defun my-lunar-phase-name (phase)
  "Name of lunar PHASE.\n0 = new moon, 1 = first quarter, 2 = full moon, 3 = last quarter."
  (cond ((= 0 phase) "新月")
        ((= 1 phase) "上弦")
        ((= 2 phase) "満月")
        ((= 3 phase) "下弦")))

(defun my-calendar-phases-of-moon()
  (interactive)
  (let ((calendar-day-name-array ["日" "月" "火" "水" "木" "金" "土"])
        (calendar-date-display-form (quote ((format "%4s-%02d-%02d" year (string-to-int month) (string-to-int day)) (if dayname (format " %2s" dayname))))))
    (calendar-phases-of-moon)))

(setq calendar-time-display-form (quote (24-hours ":" minutes (if time-zone " (") time-zone (if time-zone ")"))))
※時間表示のフォーマットはカスタマイズ機能で変更可。


phoo2だいたいこんな感じかな?いい感じに桁が揃って表示されてかなり満足。

スッキリ!

Emacs イマドキのプログラミングでは避けて通れない文字コード。だったら積極的になってみよう。

photo1日本で生まれて育ったからには、一生ついて回る『文字コード関連』
部長も昔から苦労しとります。

携帯サイトを扱ってる時はとくに、複雑…というか各社仕様がバラバラで頭がこんがらがってもうダメかと思った。

でもそこは日本語関連の機能が満載なEmacs。今後は攻めの姿勢ですよ。

まず、Windowsで問題になった「~」モンダイ。
他のソフトからEmacsに「~」をコピペすると文字化けするヤツ。は、init.elに以下の設定を追加して解決。

(set-clipboard-coding-system 'shift_jis)

Emacsから他のソフトに「~」をコピペすると「〜」(波ダッシュ)になってしまうモンダイは相変わらず…。

その他UTF-8のテキストを扱っていて遭遇した問題はこうして解決


以下、さいきん見つけた便利な機能を紹介。

C-x = で、カーソル位置の文字コードを表示。
C-u C-x = だと、別ウィンドウに詳細表示。

全角と半角の相互変換や、ひらがなとカタカナの相互変換には

M-x japanese-hankaku-region
M-x japanese-zenkaku-region
M-x japanese-hiragana-region
M-x japanese-katakana-region

これらのコマンドを使う。
C-u と入力してから実行すると若干振る舞いが変わって便利。

使ってみると、「Yep, I Twitter.」が「Yep、 I Twitter。」って変換されるし、さらには半角に変換すると「Yep、 I Twitter。」ってなるしで具合が悪い。
調べてみたら「put-char-code-property」で、相互変換の振る舞いを細かく設定できるみたいなので、見よう見真似で以下の設定を init.el に追加。

(eval-after-load "japan-util"
  '(progn
     (put-char-code-property ?ー 'jisx0201 ?ー)
     (put-char-code-property ?ー 'ascii nil)
     (put-char-code-property ?ー 'jisx0208 ?ー)
     (put-char-code-property ?ー 'ascii nil)
     (put-char-code-property ?〜 'ascii nil)
     (put-char-code-property ?、 'ascii nil)
     (put-char-code-property ?。 'ascii nil)
     (put-char-code-property ?, 'jisx0208 ?,)
     (put-char-code-property ?. 'jisx0208 ?.)
     (put-char-code-property ?, 'jisx0201 ?,)
     (put-char-code-property ?. 'jisx0201 ?.)
     (put-char-code-property ?,  'jisx0208 ?,)
     (put-char-code-property ?.  'jisx0208 ?.)
     ))

まさに意図した通りの振る舞いになって大満足。

あとよく使うのが、

M-x set-buffer-file-coding-system
・バッファの文字コードを指定し直す
M-x revert-buffer-with-coding-system
・バッファを指定した文字コードとみなして読み込み直す

の2つ。

iPhone開発ではソースをUTF-8で書いてるので、新しくファイルを作った時にset-buffer-file-coding-systemで文字コードを変更。

あとなぜか古いソースやPerlスクリプトの文字コード判別に失敗する事が多いので、revert-buffer-with-coding-system で文字コードを指定して読み込み直してる。なーぜーだー!

どれもコマンド名が長いので、よく使うならキーバインドを割り当てておくのがよいと思われ。


スッキリ!

Emacs 改めてカスタマイズ機能の便利さを思い知った一件。

photo今さらな話で申し訳なさすぎですが…
発見した事が嬉しすぎて、どーしても誰かに言わずにはいれらなかったんだ。

結局のところ、Emacsしょーもな小ネタ。
以下スルー気味で。

Dired でディレクトリのファイル一覧を表示する時の「日付」の表示形式。
Windwosみたく、単純に「2010/04/14 12:00」とかって表示してくれればいいのに、最近のファイルだと「04-09 01:55」、ちょっと古いと「2008-05-09」って感じで表示してくれるのが、部長的にはなんか微妙に見辛い。Windowsの表示形式に慣れてるってのもあるからね。

そこ、気ぃ遣ってくれなくていいですから!

で、これをEmacsのカスタマイズ機能を使えはお手軽かつ安全に変更できるのを今さらながら発見したという訳なのさ。

M-x customize-group
して、グループ名に ls-lisp を指定。

んで、画面下の方。
「Ls Lisp Format Time List」に、自分好みの日付のフォーマット式を入力して、
「Ls Lisp Use Localized Time Format」を「on」にする。

たったこれだけで、diredでのファイルの日付が変更できる。

ちなみに日付のフォーマットの詳細は、
C-h f format-time-string で確認可。


カスタマイズ機能を使わない人は init.el で

(setq ls-lisp-use-localized-time-format t)
(setq ls-lisp-format-time-list (quote ("%Y-%m-%d %H:%M" "%Y-%m-%d %H:%M")))

とかすれば設定を変更できる。

はースッキリ!

Emacs ゲームプログラマなら必須。操作性と機能を両立させたポケット電卓

phoo1詳しい人には当たり前すぎる話だけど、Emacs にも電卓機能があります。

M-x calc
で起動するんだけど…これが、Emacsらしいというか操作感が独特というか多機能すぎるというか。どーにも部長的には使い辛い。なんか、F-1マシンでコンビニにポテチ買い物に行く感じ。

なんかこう…もっとシンプルでいいんだって!普段使ってる電卓的な。

という訳であらためてグーグルせんせに聞いてみた。
ら、こちらのサイトで素晴らしい機能を発見!

M-x calculator
で起動する電卓機能。
まさに、電卓をEmacsで実現しちゃいました~的な。
入力方法とか、マジまんま電卓(笑)

でもなにげに三角関数とか16進数モードとか、プログラマ的に欲しい機能は全部入ってる。でもあくまで操作感はポケット電卓そのもの。
操作に困ったらいつでも「?」でヘルプ画面。これがまたシンプルでよい。

やればできるじゃん!Emacs!!

電卓ソフトに切り替えたり机の上の電卓に手を伸ばしたりする事無く、全てをEmacs内で完結できるなんて素晴らしすぎるぜ。


ちなみに写真のは部長の電卓じゃないっす。こんな電卓欲しいよね~と思って。

Emacs カレンダーの設定を日本人向けに極める

Emacs使いなら、ほぼ皆さんご存知なカレンダー機能。

を、ついさっき見つけた部長(笑)
ホントEmacsって何でもあるね。お陰で最近はすっかり手帳を使ってない。真っ白。これでカレンダーすらEmacsでチェックできると、ますます紙媒体が必要なくなって身の周りのモノをまた一つ減らせる。スゴイ勢いでIT化が進んどるて。


M-x calendar
とすると画面の下半分くらいにウィンドウが作成されて三カ月分表示。なんかいい感じじゃん。

C-h b としてキーバインドを見てみると、祝日の表示や日の出・日の入り、果ては月齢計算と、かなりアレコレ機能が盛りこまれているのがわかる。

ただいかんせん日本の祝祭日はサポート外。でもそこが一番知りたい情報なんだよな……と思ってグーグル経由で探してみたら、ここのサイトで非常にわかりやすい解説を発見。多謝。

さっそく導入しつつちょこっと手直し。

japanese-holidays.el の最後の方は以下のように修正。

(defvar calendar-weekend '(0)
  "*List of days of week to be marked as holiday.")
(defvar calendar-weekend-marker '(nil)
  "*List of faces of week to be marked as holiday.")

(defun calendar-mark-weekend ()
  (let ((m displayed-month)
    (y displayed-year))
    (increment-calendar-month m y -1)
    (calendar-for-loop
     i from 1 to 3 do
     (let ((sunday (- 1 (calendar-day-of-week (list m 1 y))))
       (last (calendar-last-day-of-month m y)))
       (while (<= sunday last)
         (mapcar (lambda (x)
                   (let ((d (+ sunday x)))
                     (and (<= 1 d)
                          (<= d last)
                          (mark-visible-calendar-date
                           (list m d y)
                           (nth x calendar-weekend-marker)))))
         calendar-weekend)
     (setq sunday (+ sunday 7))))
     (increment-calendar-month m y 1))))

init.el には以下のように設定を追加。

;; Calendar
;;(setq number-of-diary-entries 31)
(setq mark-holidays-in-calendar t)

(make-face 'my-calendar-title-face)
(set-face-foreground 'my-calendar-title-face "Black")
(make-face 'my-calendar-week-normal-face)
(set-face-foreground 'my-calendar-week-normal-face "#404040")
(make-face 'my-calendar-week-sunday-face)
(set-face-foreground 'my-calendar-week-sunday-face "#ff7070")
(make-face 'my-calendar-week-saturday-face)
(set-face-foreground 'my-calendar-week-saturday-face "#7070ff")
(make-face 'my-calendar-sunday-face)
(set-face-foreground 'my-calendar-sunday-face "Red")
(make-face 'my-calendar-saturday-face)
(set-face-foreground 'my-calendar-saturday-face "Blue")

(setq calendar-weekend '(0 6))
(setq calendar-weekend-marker '(my-calendar-sunday-face nil nil nil nil nil my-calendar-saturday-face))

(setq calendar-latitude 35.35)
(setq calendar-longitude 139.44)
(setq calendar-location-name "Tokyo, JP")
;; 観測地点を東京に設定
(setq calendar-time-zone +540)
(setq calendar-standard-time-zone-name "JST")
(setq calendar-daylight-time-zone-name "JST")
;; タイムゾーン

(global-set-key [f7] 'calendar)
(defun calendar-load-hooks()
  (setq calendar-font-lock-keywords
        `((,(concat (regexp-opt (mapcar 'identity calendar-month-name-array) t)
                    " -?[0-9]+")
           . 'my-calendar-title-face)
          (,(regexp-opt (list (substring (aref calendar-day-name-array 0) 0 2)))
           . 'my-calendar-week-sunday-face)
          (,(regexp-opt (list (substring (aref calendar-day-name-array 6) 0 2)))
           . 'my-calendar-week-saturday-face)
          (,(regexp-opt (mapcar (lambda (x) (substring x 0 2)) calendar-day-name-array))
           . 'my-calendar-week-normal-face)))
  (define-key calendar-mode-map "\C-f" 'calendar-forward-week)
  (define-key calendar-mode-map "\C-b" 'calendar-backward-week)
  (define-key calendar-mode-map "f" 'calendar-forward-month)
  (define-key calendar-mode-map "b" 'calendar-backward-month)
  (define-key calendar-mode-map "\C-cf" 'calendar-forward-year)
  (define-key calendar-mode-map "\C-cb" 'calendar-backward-year)
  (define-key calendar-mode-map [f7] 'exit-calendar)
  (require 'japanese-holidays)
  (setq calendar-holidays
        (append japanese-holidays local-holidays other-holidays))
  (add-hook 'today-visible-calendar-hook 'calendar-mark-today)
  (add-hook 'today-visible-calendar-hook 'calendar-mark-weekend)
  (add-hook 'today-invisible-calendar-hook 'calendar-mark-weekend))

(add-hook 'calendar-load-hook 'calendar-load-hooks)

読み込み時のフック関数で各種設定を済ませてしまうのがミソ…だと思いますがどーでしょう?

photo1やっぱ土曜日は青、日曜日は赤で表示されないとね:)

そして、日本の祝日も表示されるようになって大満足。打ち合わせの日程決めとかで、たま~に祝日を提示して相手に「?」って思われる事があるのよ。そんな微妙なミスもこれで減るでしょう。

キーバインドは各自お好みで。部長的には起動キーをもう一度押してモード終了ってのが好み。


ここんとこ18時間以上作業してちょっと寝る…という生活が続いてたんだけど…足が異常にむくんできててちょっと青ざめた。さすがにこれはマズイ(汗)

みんなも気を付けよう!

なぜかパッチの存在しないEmacs22.3で日本語をインライン入力を実現する

ええーっ!

もう新しなっとりますよ…6.35gだって。
org-modeめ!

でも、そのぶんどんどん不具合が解消されたり便利になってるって事だよね~。

んで、部長の開発環境。
白状しますが、一個だけ妥協していた部分がありました。

Windows版Emacs22.3で日本語を入力する時に、インラインで入力できない。

まあかなり重大な問題です。

Mac版は有志の方が修正してくれたので問題ないんだけど、Windows版は一個前のバージョン(22.2)か、次のバージョン(23.1~)じゃないとインライン入力できるバイナリが存在しないという悲しい現実。よりにもよって、22台の最終バージョンだけ無いなんて…。
ホントは23.1以降の新しいバージョンに乗り換えたいんだけど、手持ちのPCだとかなり重いんだよね。Mac版はちゃんとしたバイナリが見あたらないし。

photo1で、もうどうにも我慢が出来なくなって自分で作りました。
無いなら作れの精神。
正直無駄な労力だとは思ってますが…これも勉強の一環だと思って頑張りました。

修正にあたって、NTEmacsのサイトgnupackのサイトを参考。特にEmacs23.1.94のパッチは、日本語を入力中に周りの文字が消えてしまう現象を解決するのに大役立ち。

久しぶりに日本語をインライン入力できてとにかく幸せ…(笑)


もし部長と同じく、Emacs22.3でインライン入力できなくて日々不自由しとる人!試してみる価値があると思います。

ただ…何か不具合があっても対応できるかどうか微妙なのは許してちょ。自分の環境だけのテストでは限界があるし、かなり突貫で直したのよ。

※(mw32-ime-initialize)の直前で
   (set-w32-system-coding-system 'sjis)しないと、
半角カナの入力でいろいろ問題があった(汗)
 
あと、画像関連のライブラリは軒並み入ってないからね(笑)

Emacsの二次配布に当たってのライセンスをいまいち理解してないので、もしかしたら公開を取りやめるかもしれないのでお早めに。

⇒バイナリだけ
⇒ソース一式

Emacs スケジュールから企画書まで、なんでもござれのorg-modeが新しなっとる!

phot1待ってました!

org-mode 6.35eが公開されとるがね。

org-mode無しのスケジュール管理はもはや考えられないほどドップリorg-modeにハマっとるでねー。バージョンアップすらちょっとしたニュースだがね。

orgの導入については手前味噌ながら、こことかこことかこことかこことかここあたりを読んでちょ。

とりあえずなんも考えずに更新。特に問題なし。

更新履歴を見るに、細かい機能追加や互換性の無い変更が散見されますが…いまんとこ特に問題なし。


それよか、もやしナムルを作ったのはいいものの、デスソースの分量を間違えて激辛を通り越してもはや食べられないレベルなのをどーにかしたい。

辛すぎるのが命にかかわるデスソース(笑)

Emacs カスタマイズ10番勝負!的な

photo1NTEmacs23.1や、NTEmacs23.1.94が配布されとるね。日本語をインライン入力できるようにパッチを当てた有志の方々にはホント、頭が下がりっぱなしです。

Emacs22.3のWindows版公式ビルドだと日本語がインライン入力できなくて若干不便な思いをしとって、自分でパッチ当てたの使っとるんだけど、次期Emacs(23.2)だと、どうやらWindows版も標準でインライン入力が可能な模様。これでWindows版の普及にますますはずみがつくといいね。


んで、標準機能でついてるカスタマイズ機能。
M-x customize
で、ほぼ全ての機能の振る舞いを設定できるんだけど、目的のカスタマイズを探すのがえらいしんどくてそんなに使ってなかったんだけど…やっぱりちゃんと存在してました。

M-x customize-group
実行すると、グループ名の入力を求められるので、re-builderとかorgとか入力すると、そのカスタマイズ機能が一発で表示される。今までの苦労はなんだったんだ!ってくらい便利。

ちなみに
M-x customize-apropos
で、入力した文字列に引っ掛かる項目をバラバラっと表示してくれるよ。

それぞれ適当にキーバインドを割り当てとくと幸せになれそうな予感。


そうそう、Emacs23~ではview-mode関連がautoloadに変更されてるっぽくて、初期状態だと変数が存在しない。
ので、前回紹介した方法でキーバインドを変更しようとすると怒られるー!

これは以下のようにhookにすれば解決。

(defun view-mode-hooks()
  (define-key view-mode-map "q" 'my-quit-view-buffer))
(add-hook 'view-mode-hook 'view-mode-hooks)


式の評価を行うマクロ(eval-~)。いつもどれを使えばいいか迷ってたので、状況から一番最適なマクロを選んで実行するマクロを作った。

(defun my-eval-buffer(arg)
  "式を評価\n\n・リージョンが有効なら eval-region\n・文末なら evanl-buffer\n・行末なら eval-last-sexp\n・それ以外は eval-defun\nを実行"
  (interactive "P")
  (cond (mark-active (eval-region (region-beginning) (region-end)))
        ((eobp) (eval-buffer))
        ((eolp) (eval-last-sexp arg))
        (t (eval-defun arg))))


一発でスクラッチバッファを表示するマクロ。なんか、ちょくちょく出番があるんだよね。

(defun my-switch-scratch-buffer()
  "スクラッチバッファに切り替える"
  (interactive)
  (switch-to-buffer "*scratch*"))


つぃでに、あんまし使わないだろうとは思ったんだけど、re-builderのsyntaxをトグルするマクロ。
C-c C-t に割り当ててみたら、これがいがいと便利。

(defun my-toggle-syntax()
  "syntaxをreadとstringでトグル"
  (interactive)
  (let ((syntax (if (eq reb-re-syntax 'string) 'read 'string)))
    (reb-change-syntax syntax)))


こうして細かいマクロが積み上がり、気づけばinit.elは1000行越え。なのに、今度はanythingに手を出しかねない勢い(笑)
だって、便利そーなんだよね。
記事検索
このブログを書いとる人
電子書籍発売中

「チュートリアル形式で始めるOpenAL」
サウンド怖くない。C++による8つのチュートリアルで始めるOpenALプログラミング。さああなたも、自作アプリに魅力的な音効を添えてみませんか??
⇒Kindle版 ⇒iBooks版


「iPhoneアプリ『ういろう』のレシピ」
ゲームってどうやって作ってるの?? 拙アプリ『ういろう』の製作過程を本にまとめました。もちろんソースコードつき
⇒Kindle版 ⇒iBooks版


『チュートリアル形式で始めるOpenGL[2D編]』
OpenGL怖くない。C++による16のチュートリアルで始めるOpenGLプログラミング[2D編]。さああなたも、ゲーム作りを始めてみませんか?
⇒Kindle版 ⇒iBooks版
自作ゲーム配信中

『ういろう』
名古屋土産ういろうがiPhoneで大活躍?! 白ういろうを守れるのはあなただけ。ひゅーん、ぼよよーん!!
⇒AppStore ⇒LITE版


『こなへん』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒AppStore ⇒LITE版


『GEOSPOT』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒Windows ⇒Mac


『TieGunner』
マウス片手に大宇宙へ飛び立とう!『しっぽシューティング』というジャンルを作って頂きました^^; WinでもMacでも動きます。ソースもあるでよw
⇒Windows ⇒Mac
監修を担当しました

QRコード
QRコード
  • ライブドアブログ