エディタ難民からEmacs統一へ

前振り

 その昔、NitemacsっていうMS-DOSで動くエディタがあった。これが最初に使ったエディタ。文字通りEmacsに似ていたみたいだがこれしか知らんから普通に使ってた。その後SE3っていう教育用エディタに移って、Macintoshに乗り換えた。MacOS-9ではYooEditを愛用してて、ほとんどマウス操作だったために特に問題なく使ってた。この頃のHTMLなんて1.0とかっていうごく単純なものだったため、そんな操作でも問題なく書けてた。その後不覚にも社会人になってしまい、なぜかまだDOSだったため支給されたMIFESを使用した。そのままの流れで職場のWindowsではMIFES、家ではMacOS-9のYooEditだったんだが・・・。MacOS-Xが出てエディタ難民になってしまった。

 MacOS-Xではミミカキエディットを不満ながらも使用していて、miに名前がかわった頃には特に支障もなく使ってた。職場はMIFES、家はmiで、キーボードは家も職場もHHKLite2なので、同じキーバインドにしておけば、家でも職場でも全く同じに作業できたわけ。家ではMacOS-X&Linuxなんで、もう文字コード変換のオンパレード。でもmiはその辺うまくできてた。職場ではWindowsオンリーなんでMIFESでSJISだけを扱っていれば良かった。

 ところが世の中変化していくもので、ネットワークディスクを作り、家と職場でテキストファイル(メモとかだけど)のやり取りをしたり、職場でLinuxを使用するようになったりして、MIFESが非常に不便に思えてきた。MIFESはテキストファイルの文字コードを自動認識して開いてくれない。SJIS以外の文字コードの場合自分で指定しなきゃならん。使用していたMIFESは5.5だったが、メガソフトのおそらくVer7でも一緒だろう。不便だ・・・。

 そこで、せっかく乗り換えるなら、LInuxでもMacOS-XでもWindowsでも動くやつにしよう!。強力なカスタマイズ機能があれば、どこでも同じようなキーバインドにできるが、めんどい。そこで候補に挙がるのはOpenSourceのEmacsとVIM。以前はMacOS-XのEmacsはインライン変換できなかったので、gVIMでカスタマイズしていい線までいったのだが、swapが残ると立ち上がらないという欠点があった。今のEmacsはインライン変換できるのでこっちで挑戦!。いやぁ、長い前振りだったな。(2005.05.22)

このページのコンセプト

 だいたい以下の通り。

  • MacOS-X,Windowsで動かす(X11用はとりあえずほっとく)
  • Emacsを使う
  • 挙動はMIFESに近づける
  • マウスもそれなりに使う
  • 「邪道だ!」と言われても耐える
  • 適当に更新する
  • コンセプトすら変わる

CarbonEmacsとMeadow

 Macで動くEmacsもWindowsで動くEmacsもいくつか種類がある。MacOS-Xでは本家、Emacs on Aqua、Aquamacs Emacs。WindowsではNTEmacs、Meadowかな?、NTEmacsが本家かな?、よくわからんけど。WindowsのほうはググルとMeadowが主流らしいのでMeadowを使う。MacOS-Xのほうは本家のEmacsのcarbonで動くやつを日本でパッケージ化して配布してくれている人がいるのでこれを使う。中身はCarbonEmacsがEmacs22でMeadow2.0のほうはEmacs21ベース。

 それぞれの作法に従い適当にインストール。

HOMEと.emacs.elとemacs.el<

 用意ができたらカスタマイズの記述をする.emacs.elを用意する。.emacs.elはhomeディレクトリに置くわけだが、MacOS-Xは中身がUNIXなんで普通にhomeデイレクトリがあるけど、windowsはそういうのないんで自分で設定せにゃならん。HOME環境変数を設定するとそこがhomeディレクトリになる。やり方は覚えてないんで"環境変数 設定 WIN32"とかでググル。MacOS-Xの方はこのアイコンがついてるところがhome。
 で、頭にピリオドがついてるのはMacOS-Xでは隠しファイルで、何かと不便なので、.emacs.elからemacs.elをloadするようにして、主な編集はそっちでやることにする。 他の各種モジュールも追加するので、homeディレクトリの下にlispというフォルダを作って、その中にemacs.elの方は置く。

 以下をエディタにコピペして".emacs.el"って名前でhomeディレクトリに保存。MacOS-Xだとファイル名の頭に後で"."を付けられないので、新規保存時に.emacs.elとして保存する。

;;====================================================
;; .emacs.el
;; carbon emacs & meadow共通
;;==================================================== 
(setq load-path
      (append
       (list
       (expand-file-name "~/lisp") 
       )
       load-path))

(load "emacs")
;;end of file

 これで、lispフォルダを作って、その中に空のemacs.elを置けばとりあえずの準備は完了。参考サイトは以下のところその他多数。見つけられたら引用もとも書いとく。

最低限の設定

 ここからは、emacs.elを編集する。最低限の日本語が使えないとお話にならない。けど、MeadowもCarbon Emacsのパッケージ版も日本の人が配布してるので、どっちもデフォルトで日本語が使えるようになってる。なってなければ以下をemacs.elに書く。";"以降はコメント。

;;日本語環境
(set-language-environment 'Japanese)

 日本語がでなかったら、meadowのページやcarbon emacsに行くと色々書いてある。現時点での日本語関連の俺の設定は以下。

;;-----------------------------------------------------
;;日本語設定
;;-----------------------------------------------------
(set-language-environment 'Japanese)

(if (eq window-system 'mac) (progn
  (set-default-coding-systems 'euc-jp-unix)
  (set-buffer-file-coding-system 'euc-jp-unix)
  (set-clipboard-coding-system 'sjis-mac)
  (utf-translate-cjk-mode 1)
  (set-file-name-coding-system 'utf-8)

  (if window-system
      (set-keyboard-coding-system 'sjis-mac)
    (progn
      (set-keyboard-coding-system 'utf-8)
      (set-terminal-coding-system 'utf-8)
  ))
))

(if (eq window-system 'w32) (progn
  (set-language-environment "Japanese")
  (set-default-coding-systems 'sjis)
  (set-keyboard-coding-system 'sjis)
  (set-terminal-coding-system 'sjis)
  (setq file-name-coding-system 'sjis)
  (set-clipboard-coding-system 'sjis-dos)
  (set-w32-system-coding-system 'sjis-dos)
 
  (mw32-ime-initialize)
  (setq default-input-method "MW32-IME")
  (setq-default mw32-ime-mode-line-state-indicator "[--]")
  (setq mw32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))
  (add-hook 'mw32-ime-on-hook
	  (function (lambda () (set-cursor-height 2))))
  (add-hook 'mw32-ime-off-hook
	  (function (lambda () (set-cursor-height 4))))
))

 どっちもどこかからかパクってきた。ifから始まる行にmacって入っているのがcarbon emacs用。w32って入っているのがWindows用。Emacsのバージョンじゃなくてwinかmacかで分岐したいのでこうしてる。Macほうは、通常であれば、sjis-macなんだけど、ruby1.6.8がeuc-jpじゃないとうまく機能しなかったのでeuc-jpにしてる。変更するとしたらここくらい。

マウスの右クリックでコピペを

 やっぱり、googleとか探してきて、コピペするのにはマウスの方が便利だよね。MacOS-Xの方にもスクロールマウスをつけているので、右クリックでのコピペができる用にする。これは、編集メニューの項目を右クリックで出すようにするもの。

;;------------------------------------------------------
;; マウス設定
;;------------------------------------------------------
(if window-system (progn
;; 右ボタンの割り当て(押しながらの操作)をはずす。
(global-unset-key [down-mouse-3])

;; マウスの右クリックメニューを出す(押して、離したときにだけメニューが出る)
(defun bingalls-edit-menu (event)
  (interactive "e")
  (popup-menu menu-bar-edit-menu))
(global-set-key [mouse-3] 'bingalls-edit-menu)
))

 これもどっかから持ってきただけだから中身はよくわからん。とりあえず、これでMeadowでもcarbon emacsでも動いてるよ。とりあえず、色々調べながらコピペしてemacs.elを作る準備はできた。(meadow/emacs memoから取ってきた。)

外観の設定

 次は外観(笑)。基本となる色の設定とwindowサイズの設定。

;;-------------------------------------------------------
;;ベースとなるColorの設定
;;M-x list-colors-display でリストが出せる
;;--------------------------------------------------------
(if window-system (progn
  ;;フレームのサイズ
  (if (eq window-system 'mac) (progn 
    (setq initial-frame-alist '((width . 80) (height . 46)))
  ))
  (if (eq window-system 'w32) (progn
    (setq initial-frame-alist '((width . 80) (height . 50) (top . 55) ))
  ))
 ;;背景色 
  (set-background-color "#00004A")
  ;;文字色
  (set-foreground-color "AntiqueWhite")
  ;;カーソルカラー
  (set-cursor-color "Gray")
  ;;モードライン背景色
  (set-face-background 'modeline "darkorange")
  ;;モードライン文字色
  (set-face-foreground 'modeline "black")
))

 色はwindowsとmacで同じ色を使うwindowのサイズと表示位置はmacとwindowでわけてる。同じでもいいんだけど、windowsのタスクバーを上にしてるので毎回ずらすのが面倒でtopからの位置を55に設定してる。色のリストはM-x list-colors-displayで出せる。キーの操作としてはESCキーを押してxを入力すると、モードラインの下に"M-x"って出てくるのでそこにlist-colors-displayと入れてリターンするとリスト一覧が見れる。ESCキーじゃなくてもいいけど、俺のキーボードHHKだから、他がなんていうキーだかわからん。適当に押して"M-"とかって出るキーがそれ。ない色は背景色のところみたいにRGBで入れる。

 widthとheightは文字数が入るけど、topはピクセル指定だね。topだけじゃなくて左からどれくらいの位置に表示するかも指定できるけど使ってない。指定したい場合は同じように(left . 数字)って追加してあげればいい。詳しい情報はググルか、helpメニューのDescribe>DescribeVariableを選んで"initial-frame-alist"って入れると表示される。英語だけど。メニューから選ぶ代わりに"C-h v"でもいい。"C-h v"はCTRLキーを押しながら"h"を押してその後単独でvを押すって意味。setq xxxxってかいてあるのは同じ操作でhelpを見ることができる。同じ系統のことで「こういう設定ないかなー?」とか思ったらやってみると色々出てくる。英語だけどね。

 これだけやってもキーワードの色分け表示がされないので、font-lockを設定する。MIFES5だとCのキーワードしか表示されなかったけど、様々な言語のキーワードを色づけしてくれる。

(if window-system (progn
  (require 'font-lock)
  (global-font-lock-mode t)

  (set-face-foreground 'font-lock-comment-face "lime green")
  (set-face-foreground 'font-lock-keyword-face "DeepSkyBlue1")

;  (set-face-foreground 'font-lock-string-face  "purple")
;  (set-face-foreground 'font-lock-function-name-face "blue")
;  (set-face-bold-p 'font-lock-function-name-face t)
;  (set-face-foreground 'font-lock-variable-name-face "black")
;  (set-face-foreground 'font-lock-type-face "LightSeaGreen")
;  (set-face-foreground 'font-lock-builtin-face "purple")
;  (set-face-foreground 'font-lock-constant-face "black")
;  (set-face-foreground 'font-lock-warning-face "blue")
;  (set-face-bold-p 'font-lock-warning-face nil)

;;対応する括弧をハイライトする
  (show-paren-mode t)
  ;; マッチした場合の色
  (set-face-background 'show-paren-match-face "RoyalBlue1")
  (set-face-foreground 'show-paren-match-face "AntiqueWhite")
;; マッチしていない場合の色
  (set-face-background 'show-paren-mismatch-face "Red")
  (set-face-foreground 'show-paren-mismatch-face "black")

))

 キーワードの色づけだけするならとりあえず上の2,3行だけでいい。(global-font-lock-mode t)で全域で色づけを行うっていう指定。これもどこかからかパクってきたんだけど、コメントしてあるところはデフォルトの色でいいやと思ったところ。見にくい色だけ換えればいいんじゃん?。括弧のハイライト表示指定もしてる。これをしておくとemacs.elのsyntaxチェックで楽、括弧だらけだからねぇ。

  (show-paren-)とかっていう(setq xx)じゃないやつは関数なので"C-h v"じゃなくて"C-h f"で表示される。途中まで打ってリターンを押せば一覧表示してくれる。この設定で、こんな感じ。現時点での最終的な設定だからこの通りじゃないけど、色はこんな感じ。

Fontの設定

 Fontの設定はMacとWinで違うので別々に。

CarbonEmacsのFont設定

 Windowsは仕事で仕方なく使ってるだけだからMacの設定から。CarbonEmacsではインストールされているほとんどのフォントが使える。使えるフォントの一覧は以下の式を評価すると全部出る。

(insert (prin1-to-string (x-list-fonts "*")))

これをemacsのどこかのバッファにコピペして、一番最後の括弧の後ろにカーソルを置いて、Ctrl+xCtrl+eと押すと出てくる。結構時間かかるんで、一回出したらどこかに保存しておいた方がいい。(Emacs21 on Mac入門から中毒までからのパクり)

(if (eq window-system 'mac) (progn 

  (create-fontset-from-fontset-spec
    (concat
     "-*-fixed-medium-r-normal-*-14-*-*-*-*-*-fontset-motoyamono14," 
     "japanese-jisx0208:-apple-fmotoyacedar w1 mono-medium-r-normal--14-0-75-75-m-0-jisx0208.1983-sjis," 
     "ascii:-apple-fmotoyacedar w1 mono-medium-r-normal--14-0-75-75-m-0-jisx0201.1976-0")
    )

    (set-default-font "fontset-motoyamono14")
    (setq default-frame-alist (append '((font . "fontset-motoyamono14")))
  )

  ;;アンチエイリアシングoff
  (setq mac-allow-anti-aliasing nil)
  ;;行間0
  (modify-frame-parameters nil '((line-spacing . 0)))
))

 これが今の俺の設定。(create-fontset-from-specで始まるブロックは複数書ける。いくつか書いて状況によって使い分けてもいい。引用府でくくられてる部分がFontを指定しているところだが、1行目はFontSetを指定してる。motoyamono14ってやつね。2行目はjapanese-jisx0208のフォントを指定してる。3行目はasciiコードのしていだね。デフォルトでインストールされているフォントを色々試したんだけど、どれも納得いかなくて、結局、以前Mifesとmiで使ってたモトヤシーダってフォントを使ってる。モトヤフォントここから落とせる。登録しなきゃだめだけど。このフォントを14ポイントで使うと下のような感じになる。アンチエイリアシングをoffにしてるけど、実は効いてるっぽい。

MeadowのFont設定

 Meadowのほうは簡単なFontの設定と面倒くさいFontの設定がある。簡単な方だと意図通りにならなかったので、面倒くさい方式でやる。

 とりあえず、俺の設定。asciiはMSゴシック、日本語のJISX0208はモトヤシーダー。

; windows用
;
(if (eq window-system 'w32) (progn 
;;; NFモトヤシーダ設定
(w32-add-font
 "motoya9-font"
 '((spec

    ((:char-spec ascii :height any)
     strict
     (w32-logfont "MS ゴシック" 0 -15 400 0 nil nil nil 0 1 3 49)) 
    ((:char-spec ascii :height any :weight bold)
     strict
     (w32-logfont "MS ゴシック" 0 -15 700 0 nil nil nil 0 1 3 49)) 
    ((:char-spec ascii :height any :slant italic)
     strict
     (w32-logfont "MS ゴシック" 0 -15 400 0   t nil nil 0 1 3 49)) 
    ((:char-spec ascii :height any :weight bold :slant italic)
     strict
     (w32-logfont "MS ゴシック" 0 -15 700 0   t nil nil 0 1 3 49)) 

    ((:char-spec japanese-jisx0208 :height any)
     strict 
     (w32-logfont "NFモトヤシーダ1" 0 -15 400 0 nil nil nil 128 1 3 49))
    ((:char-spec japanese-jisx0208 :height any :weight bold)
     strict 
     (w32-logfont "NFモトヤシーダ1" 0 -15 700 0 nil nil nil 128 1 3 49)
     ((spacing . -1)))
    ((:char-spec japanese-jisx0208 :height any :slant italic)
     strict 
      (w32-logfont "NFモトヤシーダ1" 0 -15 400 0 t nil nil 128 1 3 49))
    ((:char-spec japanese-jisx0208 :height any :weight bold :slant italic)
     strict 
      (w32-logfont "NFモトヤシーダ1" 0 -15 700 0 t nil nil 128 1 3 49)
    ((spacing . -1))))))

   (set-face-attribute 'variable-pitch nil :font "motoya9-font") 
   (setq default-frame-alist (append
     (list
      '(font . "motoya9-font") 
	  '(ime-font . (w32-logfont "NFモトヤシーダ1"
					      0 -13 400 0 nil nil nil
					      128 1 3 49)) ; TrueType のみ 
     )default-frame-alist))

  (modify-frame-parameters nil '((line-spacing . 1)))
))

 使いたいフォントは以下の式を評価することで得られる。

(setq eval-expression-print-level nil)
(setq  eval-expression-print-length nil) 
(w32-query-get-logfont)

 1行目から順番に括弧の最後で"C-xC-e"とするとフォントを選択するパネルが現れるので使いたいフォントを選択する。すると、minibufferに上の設定に入れる値が表れる。とりあえず見てみたい場合には、上のacsii,jisx0208のそれぞれの1行目だけをセットしてみればいい。ボールド体やイタリック体は別に後でもいいでしょ。

 上の設定をするとこんな感じになる。

 やっぱりOS-Xのアンチエイリアシングのほうが綺麗だね。。WindowsXPってアンチエイリアシング効くんだっけ?。

beepを切る!

 emacs.elを書いていると、ファイルの頭に来たり終わりに来たりするとbeepがうるさい!。ってことで消す。

; beepを消す
;(setq visible-bell t)
;何もおこらなくする
(setq ring-bell-function '(lambda ()))

 beepを消すと今度は画面がフラッシュするので、それもイヤだから、何も起こらなくしてる。画面をフラッシュさせたいなら上。何もしないなら下の設定で。

キー設定

 キーはねぇ、それぞれ好みがあるからねぇ。とりあえずwindows風にしたければcua-modeってやつを自分でつくったlispディレクトリの中に放り込んで、

(require 'cua)
(CUA-mode t)

ってやれば、windows風に"C-c","C-v","C-x"が使えるようになるし、Shift-矢印で選択もできる。でもDOS時代からのMIFESユーザーってF6キーで選択開始じゃない?。Shift-矢印で選択できるってつい最近知ったよ、使ってないけど。

キーに割り当てられてるコマンドを調べる/コマンドがどのキーに割り当てられているか調べる

 とりあえず、"C-h b"ってやると、どのキーにどのコマンドが割り当てられているかはわかる。これを見ながら自分の好きなように入れ替えてく。入れ替えちゃうと元のキーがわからないから、一度出したらカスタマイズする前に保存することをお薦めする(笑)。"C-h a"ってやると使えるコマンド全部と、そのコマンドがどこに割り振られているかわかる。

グローバルキー,ローカルキー

 こんな名前だったかな・・・。Emacsにはメジャーモードってのがあって、そこではローカルキーをセットできる。ローカルキーでセットされていないキーはグローバルキーが有効になる。メジャーモードってのはc-modeとかhtmlモードとかって書く言語によってモードを変化させられるもの、例えばC言語を編集している時にはCキーワードを色表示し、htmlモードではhtmlタグを色表示してくれる。またそれぞれの独特の操作もキーに割り当てられてる。MIFESにはない機能だがこれを覚えると楽。MIFESだとグローバルキーで全部やるって感じかな。慣れてくると自然に手が動くようになるみたい。

 グローバルキーの設定は(global-set-key キーの名称 '実行コマンド)って感じで行う。ローカルキーは自分でメジャーモードを作らない限り設定することはないかな。グローバルキーをメジャーモードのローカルキーで上書きされちゃって、不便な場合にローカルキーの設定を外すことはあるけど。

 例えば、Ctrl+cにコピーを割り当てる場合以下のようにセットする。

(global-set-key "\C-c" 'kill-ring-save)

 バックスベースをセットする場合はこう。

(global-set-key [backspace] 'backward-delete-char)

 コピーはemacs標準のコピーコマンドだけど、バックスベースには標準でないものを割り当ててる。通常は、TABを入れた後バックスベースを押すといったんスペースに変換してスペースを1つずつ消す、というコマンドが割り当てられてる。慣れないと不便なので、MIFESとあった感じのコマンドに換えた。

 あとは自分の好きなようにカスタマイズすると。

メジャーモードのローカルキーを無効にする

 "C-c"にコピーを割り当ててると、ローカルキーで別のキーが割り当てられてしまうことがよくある。例えば、cc-modeっていうC言語、java、C++なんかのキーワードカラーやら、TABの挙動やらをアシストしてくれるメジャーモードがあるが、ここでは"C-c"がローカルキーに割り当てられてしまっていてコピーができない。これかなり重要。

 でも所詮邪道のMIFES乗り換え組なので容赦なくローカルキーはつぶしてコピーを優先する。

(defun my-c-mode-common-hook () 
  (local-unset-key "\C-c")
 )
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook) 

こんな感じ。hookってやつはモジュールの機能のカスタマイズに使用する。cc-modeの場合c-mode-common-hookってやつがjavaやC++と共通してるhook関数なので、ここにhookしてローカルキーの定義を取り消してやると、cc-modeが受け持ってるすべてのモードで"C-c"がコピーとして使える。hookは持ってきたモジュールのメインになる.elのファイルをhookで検索してやれば見つかる。

MIFES風のキーコマンドを作る

 たぶんここが本題。Emacsで設定されているコマンドだけじゃ、MIFESちっくな動きには出来ない。慣れちゃえば問題ないんだろうけど、使ってて間違えるようなものはMIFESの挙動にあわせるためにMIFES風のコマンドを作る。そいつを、MIFESと同じキーにバインドすれば完璧だ。

選択開始/選択解除

 コピペコマンドは以下のように設定していて、選択範囲は色が変わるようにしている。

;;++++コピペ関連 +++++++++++++++++++
;;Ctrl+c  (copy) 
(global-set-key "\C-c" 'kill-ring-save)
;;Ctrl+v   (paste)
(global-set-key "\C-v" 'yank)
;;Ctrl+w   (cut)
(global-set-key "\C-w" 'kill-region)

(transient-mark-mode 1)
(if window-system (progn
 (set-face-background 'region "royal blue")
 (set-face-foreground 'region "black")
))

 ところが、MIFESではF6で選択開始/解除とトグルになっていたんだが、Emacsにはそういうコマンドはなさげ。そこで選択開始/解除と交互に作用するやつを作ると。

(defun toggle-select-region()
  (interactive)
  (if (eq mark-active nil)  (set-mark (point)) (setq mark-active nil))
)
(global-set-key "\C-r" 'toggle-select-region)

 これで"C-r"で選択範囲を交互に切り替えられる。

行選択開始/行選択解除

 いやまてよ・・・MIFESのF6に振られてたのは行選択開始/解除だったような・・。ってことでこれも作る。

(defun toggke-select-line ()
  (interactive)
  (beginning-of-line)
  (if (eq mark-active nil)  (set-mark (point)) (setq mark-active nil))
)
(global-set-key [f6] 'toggle-select-line)

 これはMIFES同様F6に振ってみた。

行末まで削除、行頭まで削除、1行削除

 Emacsの削除コマンドはCUTコマンドでDeleteコマンドではないらしい。MIFESにあった行頭まで削除や、1行削除はクリップボードには入らずに削除される仕様だった。ところがEmacsで削除コマンドを使うとクリップボードに入ってしまう。別のところでコピーしておいて、ペースト先で「この行イラネ」とかって削除すると、「ガーン、コピーしておいたところ消えた。また戻らなきゃ」ってことになる。Emacsはクリップボードがキューイングされるので、消えた訳じゃないので呼び出せるんだが、削除は削除だろ!ってことでMIFESにあわせる。

 また、行末まで削除は最初からあるんだが、行頭まで削除と1行削除は別になっていないので、その辺も関数として作る。

;;+++削除コマンド+++++++++++ 
;;Ctrl+k   (行末まで削除)
(defun delete-line-end ()
  (interactive)
  (delete-region (point) (progn (end-of-line) (point)))
)
(global-set-key "\C-k" 'delete-line-end)

;;Ctrl+u   (行頭まで削除)
(defun backward-delete-line ()
 (interactive)
 (delete-region (point) (progn (beginning-of-line) (point)))
)
(global-set-key "\C-u" 'backward-delete-line)

;;Ctrl+y   (1行削除)
(defun kill-line-all ()
 (interactive)
 (beginning-of-line)
 (delete-region (point) (progn (end-of-line)(point)))
 (delete-indentation)
 (next-line 1)
 (beginning-of-line)
)
(global-set-key "\C-y" 'kill-line-all)

 割り当てるキーは好きなように。。1行削除はMIFESでは改行まで含めて1行削除なんで、"C-y"を連打するとどんどん行がなくなっていくようになってた。"C-y"だったかどうかは定かではないが、多分そう。。

行指定ジャンプ

 通常HOMEキーやENDキーなんかでページの最初や最後に飛べるが、HHKのキーボード以外ではHOMEキーもENDキーも遠いので、行指定ジャンプはよく使ってた。emacsでも同じことができるので、MIFESの時に割り当てていた"C-j"に割り当てる。

;; goto-line を C-j
(global-set-key "\C-j" (lambda (x) (interactive "nLine: ") (goto-line x)))

(Petit emacs lisp tips on .emacs.elから取ってきた。)

前方検索

 MIFESの検索はグローバル検索と、カレントファイル内の検索だったが、Emacsには便利なインクリメンタルサーチがついてる!。これを使わない手を使わない手はないでしょう・・。それはそのまま"C-s"に振っておいて、"C-f"にMIFESチックな検索を割り振りたい。

 MIFESの検索はカーソルのある位置の単語を取得してそれをデフォルトとする。なんとかしてそれを実現したい。がまだ未完成。。highlightってどうやってやるんだろう・・・。カーソルいつの単語を取得って関数ないのかねぇ・・。

;;----------------------------
;; Current Wordを取得する
;;----------------------------
(defun mf_current-word() 
  "カーソルのある位置の単語を取得する。"
  (save-excursion
	(let ((ret_value nil)) 
	  (if (string-match "\\w+\\W*" (char-to-string (char-before (+ 1 (point))))) ;カーソルの位置が単語文字と一致したら
		  (progn
			(if (string-match "\\w+\\W*" (char-to-string (char-before))) 
				(backward-word 1)
			  )
			(set-mark (point)) 
			(forward-word 1)
			(copy-region-as-kill (mark) (point)) 
			(setq ret_value (car kill-ring-yank-pointer)) 
			(rotate-yank-pointer 1) 
			)
		)
	  ret_value
	  )
	)
)
;;----------------------------------
;; 前方検索
;;---------------------------------
(defvar mf-word-search-value nil "search-value")
(defun mf-word-search-forward ()
  "カーソル位置の単語をデフォルトキーワードとして前方検索する。"
  (interactive) 
  (let ((str "search-forward:")(old_point (point)))
	(setq str (read-string str (mf_current-word))) 
	(search-forward str) 
	(backward-word 1)
	(if (equal old_point (point)) 
		(progn 
		  (forward-char)
		  (search-forward str)
		  (backward-word 1)
		  )
	  )
	(setq mf-word-search-value str)
  ) 
)
;;----------------------------------
;; 前方再検索
;;---------------------------------
(defun mf-word-search-forward-next ()
  "前方再検索。"
  (interactive)
  (forward-char) 
  (search-forward mf-word-search-value) 
  (backward-word 1)
)
(global-set-key "\C-f" 'mf-word-forward-search)

新規バッファー作成

 Emacsではタイトルなしのバッファーを作って、最後にファイルに保存するという方法はとらず、まずファイルを作成する。ここで拡張子が確定するために、その拡張子にあったメジャーモードをロードして通常編集時と同じように色付けされる。Macやwindowsの一般的なエディタは最初に名前なしのバッファを作って編集してから保存する。MIFESもご多分に漏れずこのタイプ。ちょっとメモを取るだけの場合気軽に新しいバッファを作れる方が便利だと思うが、ソースコードを書いていて長くなってくると一度保存して色付けされるように開き直すこともある。結局どっちもどっちか。。

 簡単なメモならEmacsがデフォルトで開く"*scratch*"にメモればいいんだが、閉じる時に警告がでないのでやっぱり"新規バッファを作成する"というのはあると便利な気がする。MIFESでは"C-n"に振っていたのでここでもそこに振る。Macの場合ほとんどは"新規ウィンドウ"なんだが、EmacsはSDIで使った方が便利な気がする。"C-n"を押すたびに"untitled-1","untitled-2"と数字を付けながら新規バッファを開いて行く。

;;----------------------------------
;; 新規バッファーを作る
;;----------------------------------
(defvar mf-newbuffer-count 1 "new bufferを作った数")
(defun mf-new-buffer ()
"新規にuntitled-Nというバッファーを作る。"
  (interactive) 
	(switch-to-buffer  (concat "untitled-" (number-to-string mf-newbuffer-count))) 
  (setq mf-newbuffer-count (+ 1 mf-newbuffer-count))
  ) 
(global-set-key "\C-n" 'mf-new-buffer)

別フレームで単独にバッファー一覧

 MIFESではF2を押すと編集中のbuffer一覧を表示できた。通常はbuffer切り替えで事足りるが、bufferが増えてくると一覧を出してその中から選びたい時もある。デフォルトのbuffer一覧ではかなりむかつくが、Meadow/Emacs Memoで紹介されてた"ibuffer"ってのを使うとかなり便利になる。入手先と書いてあるところには、どこにあるんだかようわからん。。ibufferでググってどっかに入れておくと。

 そんでだ、MIFESではバッファ一覧は別フレームで開くのよ。それを実現しようと。そういうこと。


;;----------------------------------
;; バッファリスト
;;----------------------------------
(require 'font-lock)
(global-font-lock-mode t)
(require 'ibuffer) 
(setq ibuffer-formats
	  '((mark modified read-only " " (name 30 30)
			  " " (size 6 -1) " " (mode 16 16) " " filename)
		(mark " " (name 30 -1) " " filename))) 
(defvar mf-main-frame nil "main frame keep")
(defvar mf-ibuffer-frame nil "ibuffer frame keep")

(defun mf-buffer-visit-main-frame ()
  (interactive)
  (let ((buf (ibuffer-current-buffer)))
	(raise-frame  mf-main-frame)	;main-frameを表に
	(select-frame mf-main-frame) 	;main-frameにFocusをあてる
    (unless (buffer-live-p buf)
      (error "Buffer %s has been killed!" buf))
    (bury-buffer (current-buffer))
    (switch-to-buffer buf))
)
(defun my-ibuffer-mode-hook () 
  (define-key ibuffer-mode-map (kbd "RET") 'mf-buffer-visit-main-frame )
  (define-key ibuffer-mode-map (kbd "e") 'mf-buffer-visit-main-frame )
  (define-key ibuffer-mode-map (kbd "f") 'mf-buffer-visit-main-frame )
)
(add-hook 'ibuffer-mode-hooks 'my-ibuffer-mode-hook)

;;frame一覧の中にIBufferがあるかのチェック
;;
(defun mf-frame-list-check (fl)
  (let ((element (car fl))) 
	(if element
		(progn 
		  (if (equal mf-ibuffer-frame element)
			  t 
			(mf-frame-list-check (cdr fl))
		  ))
	  nil
	  )
	)
  ) 

(defun mf-buffer-list ()
"MIFESみたいなバッファ一覧"
  (interactive) 
  (if (not (mf-frame-list-check (frame-list)))
	  (progn
		(setq mf-main-frame (selected-frame))
		(select-frame (make-frame '( (height . 24) 
									 (minibuffer . nil)
									 (background-color . "#00004A")
									 (foreground-color . "AntiqueWhite")
									 (cursor-color . "Yellow")
									 (background-mode  . dark)
									 )))
		(ibuffer)
		(setq mf-ibuffer-frame (selected-frame))
		)
	(raise-frame  mf-ibuffer-frame)
	(select-frame mf-ibuffer-frame)
	)
  )
(global-set-key [f2] 'mf-buffer-list)

 なっげーな。もうちょっと短くならんのか・・・。しかし、オブジェクト指向でないカプセル化されてない言語ってのはカスタマイズするには楽だね。通常ならprivateな変数を平気で使えるしね。ん?、継承して関数をオーバーライドする方が楽か?。

 これを入れたからといってキーの操作が減る訳ではないんだけどね。見た目だけ:p。ま、こんな感じ。

Carbon Emacs ビルドしてみたりして

 なんとなく気に食わないところとか自分でいじれるかなと。cvsからチェックアウトしてきてビルドする。どこかにprojectてフォルダを作って、terminalを立ち上げて、

$cd project
$export CVS_RSH="ssh"
$cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/emacs co emacs

 でほっといて寝る。全部cvsで落としてくるの時間掛かるのよねぇ。 アーカイブしてくれるcvsWebのプラグインみたいのもあるみたいなのにねぇ。

 起きた。お、終わってる。時間かかったので、もう一回チェックアウトする。

 
$cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/emacs co emacs

 おもむろにREADMEを見てみる。英語でわからんorz。

$./configure --with-carbon --without-x
$./make bootstrap
$make install

 おぉ、macフォルダの中に16MBくらいのcarbon-emacsが出来た。おぉ、動いたー。しかもちょっと早いー。インライン変換できないけど。

 しらばくこの状態で使っていたけど、別のマックにコピーしたら動かなくなっちゃった。必要なファイルがEmacs.appの中に全部なくて、一段上のフォルダにあるみたいね。。他のマックに移動させるにはパッケージにしなきゃだめだよね。

 そのために、またまたおもむろにmacフォルダを眺めてみる。make-packageっていうのがあるね。。-おぉ!--self-containedなんてオプションがある!、これだ。多分。make-packageって単独起動するのかな・・。一段上のmake-distあたりから呼び出されるようにしむけるんだろうか。。

 とりあえずmacフォルダの中に入って、

$cd mac
$./make-package --self-contained
powerpc-apple-darwin8-gcc-4.0.0: getopt.o: No such file or directory
powerpc-apple-darwin8-gcc-4.0.0: getopt1.o: No such file or directory
make[1]: *** [movemail] Error 1
make: *** [lib-src] Error 2
Make failed... Aborting make-package.

 ありゃ?。止まっちまった。なんかもう一個それっぽいオプションがある。それもつけてみよう。。

$./make-package --self-contained --build-in-place
イメージ作成エンジンを準備中...
“Driver Descriptor Map (DDM : 0)”を読み込み中...
   (CRC32 $45F59280:Driver Descriptor Map (DDM : 0))
“Apple (Apple_partition_map : 1)”を読み込み中...
   (CRC32 $CE3D9F9A:Apple (Apple_partition_map : 1))
“disk image (Apple_HFS : 2)”を読み込み中...
..............................................................................
   (CRC32 $779D4F7B:disk image (Apple_HFS : 2))
“ (Apple_Free : 3)”を読み込み中...
...............................................................................
   (CRC32 $00000000: (Apple_Free : 3))
リソースを追加中...
...............................................................................
経過時間: 4.969s
ファイルサイズ:31310677 バイト、チェックサム:CRC32 $0AF336D2
処理されたセクタ数:70834、61137 コピーしました
速度:6.0M バイト/秒
節約率:13.7%
created: /Users/tuck/pj/emacs/emacs/mac/../mac/EmacsInstaller.dmg
Cleaning up the staging directory

 ヤッターデキター。

 ここをみると、G4に最適化するってのも乗ってる。

CFLAGS="-fast -mcpu=7450" ./configure

だそうな。。

$CFLAG="-fast -mcpu=7450" ./configure --with-carbon --without-x

ってやらなくていいのかな?。なんかほかのREADMEなんかを見てると、jpg,gif,pngなんかの画像をサポートしないオプションとかあるみたい。emacs-w3mとか使わんし、mailもつかわないから画像表示なんかいらん。

 このオプションをつけると、多少早くなるような・・・なってないような・・・。


 今はTigerに移行したばっかりで不具合が多く、日に日に改善されてるみたいだからCVSを追っかけていたいんだけど、いちいちcvsのチェックアウトからdmg作成まで手動でやるのイヤになってきた・・。簡単なスクリプトを作る。

#/bin/sh

cd ~/pj/emacs
export CVS_RSH="ssh"
cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/emacs co emacs
cd ~/pj/emacs/emacs
CFLAG="-fast -mcpu=7450" ./configure --with-carbon --without-x 
./make bootstrap
make install
cd ~/pj/emacs/emacs/mac
DAY=`date +%Y%m%d` 
mv EmacsInstaller.dmg emacs$DAY.dmg
./make-package --self-contained --build-in-place

 autoemacs.commandとして保存して"chmod 755 autoemacs.command"で実行権を与えればダブルクリックで起動するぜ。pathとかはまねしちゃだめ。MacOS-Xで.commandって名前にすると、ダブルクリックでシェルスクリプトを実行できるようになる。applescriptを覚えるのもいいけど、mac上でしか動かない言語覚える気になれん。当然VBAとかC#も全く興味なし。

Top 前へ戻る