Emacs On OSX

| 分类 Emacs  | 标签 emacs  osx 

OS X 下可以通过 Gentoo Prefix 或者 macport 或者 home brew 来安装 Emacs。安装完的 Emacs 使 OS X 原生的 Cocoa UI,很不错。但如果在 Finder 里面直接双机打开文件的话,每次都会新创出一个新的 Frame 来。

在使用 Finder 打开文件时,可不可以这样:

  • 如果没有启动的 Emacs 实例,则创建 Emacs 实例,并打开文件。
  • 如果已经有启动的 Emacs,则在新的 buffer 中打开,并升起 Emacs 窗口。

Google 一下,发现有现成的解决方案:Automator。

具体步骤如下:

  1. 打开 Automator,创建一个新的 App。
  2. 从 Automator 中选择 shell,并添加如下代码:
    #!/bin/bash
    #
    
    EMACS=/opt/Applications/Gentoo/Emacs-24.app/Contents/MacOS/Emacs
    EMACSCLIENT=/opt/usr/bin/emacsclient
    
    export LC_CTYPE=zh_CN.UTF-8
    export LC_ALL=
    
    _is_emacs_daemon_started () {
        netstat -nl 2> /dev/null | awk '{print $NF}' | grep -q "emacs"
    }
    
    _is_emacs_window_exist () {
        _is_emacs_daemon_started && \ $EMACSCLIENT -e '(<= 2 (length (visible-frame-list)))' | grep -q -x t
    }
    
    kill_emacs () {
        if _is_emacs_daemon_started;
        then $EMACSCLIENT -e -n '(let ((desktop-save '\''if-exists)) (dolist (f (cdr-safe (reverse (frame-list)))) (delete-frame f t)) (kill-emacs "yyyyyy"))'
             if _is_emacs_daemon_started;
             then ps -u $UID -o pid,comm= | grep Emacs$ | cut -d' ' -f1 | xargs -n 1 kill
             fi
        fi
        return 0
    }
    
    start_emacs ()
    {
        $EMACS &>/dev/null &
        return $?
    }
    
    main () {
        _is_emacs_daemon_started
        if [ $? -ne 0 ] ; then
            start_emacs
            if [ $? -eq 0 ]; then
                echo ' [sucess]'
            else
                echo ' [faild]'
                return 1
            fi
        fi
    
        if [ "$1" = "-t" ]; then
            $EMACSCLIENT -n "$@"
        elif [ -z "$1" ];  then
            if ! _is_emacs_window_exist;  then
                $EMACSCLIENT -n
            fi
            osascript -e 'tell application "Emacs" to activate'
            return 0
        else
            if ! _is_emacs_window_exist;  then
                $EMACSCLIENT -n
            fi
            if ! echo "$*" | grep -q -e '-n'; then
                osascript -e 'tell application "Emacs" to activate'
            fi
            $EMACSCLIENT -n "$@"
        fi
        osascript -e 'tell application "Emacs" to activate'
    }
    
    main "$@"
    

    其中的 EMACSEMACSCLIENT 根据实际情况填写正确的路径。

    之后将右侧的传递输入改成 “作为自变量”,最后将工程保存为 RunEmacs.App 即可:

    automator-emacs.png

  3. 将 RunEmacs.app 设置为默认程序即可。

PS:

修改 RunEmacs 的图标 http://apple.stackexchange.com/questions/369/can-i-change-the-application-icon-of-an-automator-script%EF%BC%9A

After the script has been created do the following :

  1. Find the source app with the icon you want

  2. Get Info of the source app (cmd-i)

  3. Click on the icon inside the source app's info window (Not the one in the big Preview section at the bottom, if you have one of those; the little one in the top-left corner.)

  4. Copy it (cmd-c)

  5. Get Info of the automator script (i.e., the destination app) (cmd-i)

  6. Click on the icon inside the destination app's info window

  7. Paste the icon from the clipboard (cmd-v)

This method works for every files in Mac OS X.


上一篇     下一篇