2011-03-22

Emacs Mac port に追加されている機能

Emacs Mac port についてはこちら Emacs Mac port を使う

Emacs Mac port に追加されている機能ですが、パッチに含まれる README-mac に詳細が書いてあります。
ここではその一部をまとめてみました。

パッチのバージョン emacs-23.3-mac-1.9992 を元に書いています。

  • 変数 window-system の値は mac
  • Command-Control-D でカーソル位置の単語の意味を辞書で表示
  • AppleEvent に対応
    Emacs に設定してあるメーラーが開く。 QuickCursor も使えるらしい
    osascript -e 'tell application "Emacs" to open location "mailto:foo@example.com"'
    
  • Emacs がビジーな時は、タイトルバー右側のインジケータがグルグル回る
  • fullscreen フレイムパラメータが認識される
    (set-frame-parameter nil 'fullscreen 'fullboth) でメニューバーと Dock が消えてフルスクリーンに!
    こんなコマンドを作って手軽に切り替えられるようにしてます
    (defun my-toggle-fullscreen ()
      "Toggle fullscreen."
      (interactive)
      (if (eq (frame-parameter nil 'fullscreen) 'fullboth)
          (progn
            (set-frame-parameter nil 'fullscreen nil)
            (display-time-mode 0))
        (set-frame-parameter nil 'fullscreen 'fullboth)
        (display-time-mode 1)))
    
    (global-set-key "\C-cf" 'my-toggle-fullscreen)
    
  • sticky フレイムパラメータが認識される
    (set-frame-parameter nil 'sticky t) で Spaces で全てのスクリーンに表示されるようになる
  • 関数 system-move-file-to-trash が定義されている
    変数 delete-by-moving-to-trash に設定することで、 Emacs からファイルを消去する際にゴミ箱に移動するようになる
    (setq delete-by-moving-to-trash 'system-move-file-to-trash) としてしまうと一時ファイル等でゴミ箱が溢れるので、 Dired 等特定のコマンドでのみ有効にするのが良いかもしれない
    ;; Dired の x や D でゴミ箱に捨てる。Finder での「取り消し」「戻す」は不可。
    (when (fboundp 'system-move-file-to-trash)
      (defadvice dired-do-flagged-delete
        (around move-to-trash activate)
        "Use `system-move-file-to-trash'."
        (let ((delete-by-moving-to-trash 'system-move-file-to-trash))
          ad-do-it))
    
      (defadvice dired-do-delete
        (around move-to-trash activate)
        "Use `system-move-file-to-trash'."
        (let ((delete-by-moving-to-trash 'system-move-file-to-trash))
          ad-do-it)))
    
  • M-x menu-bar-open でメニューバーが開く (menu-bar-mode が non-nil の場合)
    (global-set-key "\M-`" 'menu-bar-open) ; tmm-menubar
    
  • mac-mouse-wheel-mode. 行単位のカクついたスクロールではなく、ピクセル単位の滑らかなスクロール
  • トラックパッドのジェスチャーを認識する。 magnify-up, magnify-down, rotate-left, rotate-right
    デフォルトではテキストスケールの変更と、フルスクリーンの切り替えに割り当てられている
  • システム環境設定 → アピアランス の「クリックされた場所にジャンプ」が Emacs でも有効
  • システム環境設定 → キーボード の「キーボードショートカット (キーボードと文字入力)」が Emacs でも有効。
    例えば ^F2 でメニューバーが開く。 ^F4 でウィンドウ切り替え等
  • 他のアプリで画像をコピーした場合、 yank-pop でその画像を挿入できる。(変数 yank-excluded-properties で display を除外してない場合に限る)
  • Mac OS X 10.6 以上で、メニューバーのヘルプの検索語入力欄から info ノードを検索可能
  • Mac OS X 10.6 以上で、他のアプリにて選択したテキストがファイルのパスならば、 Emacs で開くためのコンテキストメニューとサービスが追加される
  • ことえりで、かなキー2回連打でカーソル位置の単語を再変換する機能が Emacs でも有効
  • 関数 mac-convert-property-list の追加
    Mac OS X の plist を lisp 等に変換できる。 plutil や xml.el とかでも似たようなものは実装できそうですが
    使用例としてはこんな感じで
    (mac-convert-property-list
     (let ((coding-system-for-read 'no-conversion))
       (with-temp-buffer
         (insert-file-contents "~/Library/Preferences/.GlobalPreferences.plist")
         (buffer-string))))
    

他に、 SVG やマルチページ TIFF の表示、 関数 mac-file-alias-p の追加、 Option-Command-T で「文字ビューアを表示」、 Resolution independence, 等々。

あと、私の環境では lookup.el で辞書を引くスピードが Cocoa Emacs では異様に遅かったのですが、 Emacs Mac port では軽快に動きました。

その他の注意点

  • mac-allow-anti-aliasing は削除された
    システム環境設定 -> アピアランス で設定するか、Terminal から以下を実行
    defaults write "org.gnu.Emacs" AppleAntiAliasingThreshold 12
  • ことえりの半角英字モードで C-S-a (Shift を押しながらの C-a) が効かなくなることがある。再現性はいまいち

do-applescript 関数について

  • Emacs Mac port の do-applescript は Carbon Emacs のそれと挙動は同じで、数点注意が必要です
    • do-applescript へ渡す文字列、返す文字列は変数 mac-system-coding-system でエンコード、デコードする必要がある
    • 変数 mac-system-coding-system は端末から Emacs を -nw 起動した時には初期化されていない
    • バックスラッシュは全て \200 (0x80) に置き換えられるので変換が必要
    • do-applescript が返す文字列はダブルクオートで囲まれているので、除去する必要がある
  • Cocoa Emacs の do-applescript (ns-do-applescript) は上記の面倒は無いのですが、端末で起動した時には do-applescript 関数は使えません
  • X11 用にビルドした Emacs では do-applescript は恐らく使えません
  • 外部コマンドの osascript を使う場合次の利点があります
    • Emacs Mac port, Carbon Emacs に特有の面倒が無い
    • 端末からの -nw 起動でも X11 版でも AppleScript を使える
    • on run argv で引数渡しができる
    • スクリプトの実行が失敗したかどうかが call-process の返り値でわかる

上記の理由から当ブログで紹介している Dired 関連の tips では do-applescript は使わず osascript を使っています