2009年11月4日水曜日

cocoa emacs のインストール

leopardに、cocoa emacs (emacs23.1) をインストールした時のメモ。

INSTALL

インストールそのものは、 MacEmacs JP Project の 「IMEパッチの適用」に書いてあるコマンドを、そのまま実行すればうまくいく。
$ tar xvfz inline_patch-20090617.tar.gz
$ tar xvfz emacs-23.1.tar.gz
$ cd emacs-23.1
$ patch -p 0 < ../inline_patch-20090617/emacs-inline.patch
$ ./configure --with-ns --without-x
$ make bootstrap
$ make install
$ open nextstep/Emacs.app
ただし、これらの作業を、emacsのシェルモードで行うと、
 Error: charsets directory does not exist.
 ethiopic.el: Error: Failure in loading charset map: MULE-ethiopic
のエラーが出てコンパイルに失敗する。
たぶん、EMACS関連の環境変数が邪魔になっているのだろうと思い、 configure実行の前に、
$ unset EMACSAPP EMACSDATA EMACSPATH EMACSDOC INSIDE_EMACS EMACSLOADPATH
を実行すれば解決。もっとも、ターミナルで作業する分には問題ない。

フォント設定

フォントは、 ここ とか ここ を参考にして、意味もわからずに見様見真似で設定してみた。
こんな感じだ。
(create-fontset-from-fontset-spec
  "-*-*-medium-r-normal--14-*-*-*-*-*-fontset-hiramaru14" nil t)
(create-fontset-from-fontset-spec
  "-*-*-medium-r-normal--16-*-*-*-*-*-fontset-hiramaru16" nil t)
(create-fontset-from-fontset-spec
  "-*-*-medium-r-normal--20-*-*-*-*-*-fontset-hiramaru20" nil t)
(mapc
 #'(lambda (fontset)
     (set-fontset-font fontset 'japanese-jisx0208
                       '("Hiragino Maru Gothic Pro" . "iso10646-1"))
     (set-fontset-font fontset 'katakana-jisx0201
                       '("Hiragino Maru Gothic Pro" . "iso10646-1"))
     (set-fontset-font fontset 'japanese-jisx0212
                       '("Hiragino Maru Gothic Pro" . "iso10646-1"))
     ) (list "fontset-hiramaru20" "fontset-hiramaru16" "fontset-hiramaru14"))
(let (
      ;; (my-fontset "fontset-hiramaru14") ;; ちっちゃいフォント
      (my-fontset "fontset-hiramaru20") ;; でっかいフォント
     )
  (set-default-font my-fontset)
  (add-to-list 'default-frame-alist `(font . ,my-fontset)))
いちおう、これで、英数文字と日本語文字の幅が1対2になり、 carbon の時と同等にきれいに表示されるようになった。

IMの設定

.emacs.el に以下を追加すると、 かなキーでモードラインに「あU:」とかが表示されるようになる。
(set-language-environment "Japanese")
(setq default-input-method "MacOSX")
ただ、「ことえり」の場合は、 C-x o などでバッファーを切り替えた時に、 モードラインの表示が現在の変換モードと一致しなくなる。
そこで、コマンドループのフック( post-command-hook )に、 IMの更新をするコードを追加してみた。
(load "cl")
(add-hook
 'post-command-hook
 (lexical-let ((previous-buffer nil))
   #'(lambda ()
       (unless (eq (current-buffer) previous-buffer)
         ;; (message "Change IM %S -> %S" previous-buffer (current-buffer))
         (if (bufferp previous-buffer) (mac-handle-input-method-change))
         (setq previous-buffer (current-buffer))))))
無理矢理っぽいコードだが、とりあえずこれで、 バッファー切り替えでも違和感なく使えるようになった。

DocView

emacs の中でPDFがみられるという、 doc-view を試してみた。 でも、ディスク内のあらゆるPDFを試してもうまく表示されない。
emacs-23.1/lisp/doc-view.el をみてみると、Ghostscript と、 xpdf または teTeX が必要と書いてある。
さっそく port でインストール。
$sudo port install ghostscript
$sudo port install ghostscript-fonts-hiragino
$sudo port install xpdf
これでdoc-viewが動き、PDFが表示できるようになる。
でも、macでは、全てのpdfをdocviewで表示できるわけではないらしい。 見れるファイルもあるし見れないのもある。

.emacs.el

cocoa emacs用に、僕が使っている .emacs.el の抜粋。
いろいろなサイトに載っていた設定例の寄せ集めだが、 これでも、試行錯誤の連続で、落ち着くまでには結構苦労した。
(if (>= emacs-major-version 23)
    ;; cocoa emacsの設定
    (progn
      ;; Command キーをMetaキーにする
      (setq ns-command-modifier (quote meta))
      ;; (setq ns-alternate-modifier (quote super))
      (setq ns-alternate-modifier nil)

      ;; IM 設定
      (set-language-environment "Japanese")
      (setq default-input-method "MacOSX")
      (prefer-coding-system  'utf-8-unix)
      ;; minibufferは英数モードで始める
      (add-hook 'minibuffer-setup-hook 'mac-change-language-to-us)
      ;; buffer切り替えの時にも、IM状態をアップデート
      (load "cl")
      (add-hook
       'post-command-hook
       (lexical-let ((previous-buffer nil))
         #'(lambda ()
             (unless (eq (current-buffer) previous-buffer)
               ;; (message "Change IM %S -> %S" previous-buffer (current-buffer))
               (if (bufferp previous-buffer) (mac-handle-input-method-change))
               (setq previous-buffer (current-buffer))))))

      (define-key global-map [ns-drag-file] 'ns-find-file) ;; find-file

      ;; Set text scale key 
      (global-set-key "\C-c+" #'(lambda () (interactive) (text-scale-increase 1)))
      (global-set-key "\C-c-" #'(lambda () (interactive) (text-scale-decrease 1)))
      (global-set-key "\C-c0" #'(lambda () (interactive) (text-scale-increase 0)))

      ;; font 設定
      ;; (setq fixed-width-use-QuickDraw-for-ascii t)
      (setq mac-allow-anti-aliasing t)

      (create-fontset-from-fontset-spec
       "-*-*-medium-r-normal--14-*-*-*-*-*-fontset-hiramaru14" nil t)
      (create-fontset-from-fontset-spec
       "-*-*-medium-r-normal--16-*-*-*-*-*-fontset-hiramaru16" nil t)
      (create-fontset-from-fontset-spec
       "-*-*-medium-r-normal--20-*-*-*-*-*-fontset-hiramaru20" nil t)
      (mapc
       #'(lambda (fontset)
           (set-fontset-font fontset 'japanese-jisx0208
                             '("Hiragino Maru Gothic Pro" . "iso10646-1"))
           (set-fontset-font fontset 'katakana-jisx0201
                             '("Hiragino Maru Gothic Pro" . "iso10646-1"))
           (set-fontset-font fontset 'japanese-jisx0212
                             '("Hiragino Maru Gothic Pro" . "iso10646-1"))
           ) (list "fontset-hiramaru20" "fontset-hiramaru16" "fontset-hiramaru14"))
      
      (create-fontset-from-fontset-spec
       "-*-*-medium-r-normal--14-*-*-*-*-*-fontset-hirakaku14" nil t)
      (create-fontset-from-fontset-spec
       "-*-*-medium-r-normal--16-*-*-*-*-*-fontset-hirakaku16" nil t)
      (create-fontset-from-fontset-spec
       "-*-*-medium-r-normal--20-*-*-*-*-*-fontset-hirakaku20" nil t)
      (mapc
       #'(lambda (fontset)
           (set-fontset-font fontset 'japanese-jisx0208
                             '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
           (set-fontset-font fontset 'katakana-jisx0201
                             '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
           (set-fontset-font fontset 'japanese-jisx0212
                             '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
           ) (list "fontset-hirakaku20" "fontset-hirakaku16" "fontset-hirakaku14"))

      (setq face-font-rescale-alist
            '(("^-apple-hiragino.*" . 1.2)
              (".*osaka-bold.*" . 1.2)
              (".*osaka-medium.*" . 1.2)
              (".*courier-bold-.*-mac-roman" . 1.0)
              (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
              (".*monaco-bold-.*-mac-roman" . 0.9)
              ("-cdac$" . 1.3)))

      (let ((my-fontset "fontset-hirakaku20")
            ;; (my-fontset "fontset-hiramaru20")
            )
        (set-default-font my-fontset)
        (add-to-list 'default-frame-alist `(font . ,my-fontset)))
      )
  
  ;; carbon emacs (emacs 22) の設定
  (progn
    (require 'carbon-font)
    ;; ...................................................
    ;; ...................................................
    ))