web-dev-qa-db-ja.com

OSXのコマンドラインからGUI Emacsを起動する方法は?

OSXのコマンドラインからGUI Emacsを起動するにはどうすればよいですか?

http://emacsformacosx.com/ からEmacsをダウンロードしてインストールしました。

次の基準をすべて満たす回答を受け入れます。

  1. Emacsウィンドウが端末ウィンドウのの前に開きます。
  2. 「emacs」と入力すると、GUI Emacsウィンドウが起動します。そのウィンドウでファイルを検索すると、デフォルトでEmacsを起動したディレクトリが検索されます。
  3. Foo.txtが存在するときに「emacs foo.txt」と入力すると、foo.txtが読み込まれたGUI Emacsウィンドウが起動します。
  4. Foo.txtがnotが存在するときに「emacs foo.txt」と入力すると、「foo.txt」という名前の空のテキストバッファーを持つGUI Emacsウィンドウが起動します。そのバッファーで^ X ^ Sを実行すると、foo.txtがEmacsを起動したディレクトリに保存されます。
84
Johan Walles

次のスクリプト「emacs」を呼び出して、PATHのどこかに配置します。

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@"

#2、#3、#4をカバーしています。

#1の場合、これを.emacsファイルのどこかに置きます。

(x-focus-frame nil)

emacsformacosx.com サイトに How-Toページ が追加されました。これは、トップスニペットの由来です。 emacsclientの実行とgit mergetoolへのEmacsの接続に関する詳細情報があります。

109
David Caldwell

シェルで、コマンド「emacs」にエイリアスを設定して、OSX emacsアプリケーションを指すようにします

私のシェル(デフォルトのbashを実行)には、次のものがあります(私の.bashrcに)

alias emacs='open -a /Applications/Emacs.app $1'

次に、コマンドラインでemacsと入力すると、emacsアプリケーションが起動します。

ただし、emacsのコピーを開いて、そのまま実行することをお勧めします。その場合、ファイルを既存のemacsのコピーにロードする場合は、.bashrcに以下を配置してemacsclientを使用できます。

alias ec='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'

次に、以下を.emacsファイルに追加して、emacsサーバー(emacsclient呼び出しを受け取る)を開始します。

;;========================================
;; start the emacsserver that listens to emacsclient
(server-start)

次に、入力することができます

ec .bashrc

.bashrcのコピーを既存のemacsセッションにロードするには!

70
Chris McMahan

これは David Caldwellの答え をEmacsをバックグラウンドで起動することで改善します:

#!/bin/sh
$(/Applications/Emacs.app/Contents/MacOS/Emacs "$@") &

他の回答で述べたように、これは#2、#3、#4を対象としています。 #1の場合、これを.emacsファイルのどこかに配置します:(x-focus-frame nil)

以下はnot動作しないことに注意してください-コマンドラインで指定されたディレクトリでEmacsを起動しません(例:emacs .

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &
8
David J.

私はあなたのどちらかを仮定しています:

  • ログイン時にemacsデーモンを開始します
  • .emacsに(server-start)がある
  • 実行中のemacsのコピーがたくさんあることを気にしないでください

もしそうなら、これは元の4つの基準に加えてもう1つを満たすと思います:

  1. Emacsウィンドウが端末ウィンドウの前に開きます。

常に前面に開きます(x-focus-frameを使用)。

  1. 「emacs」と入力すると、GUI Emacsウィンドウが起動します。そのウィンドウでファイルを検索すると、デフォルトでEmacsを起動したディレクトリが検索されます。

既存のemacsウィンドウをdiredモードで開きます。

  1. Foo.txtが存在するときに「emacs foo.txt」と入力すると、foo.txtがロードされたGUI Emacsウィンドウが起動します。

Emacsがすでに実行されており、サーバーがある場合、既存のウィンドウで開き、フォアグラウンドになります。

  1. Foo.txtが存在しないときに「emacs foo.txt」と入力すると、「foo.txt」という名前の空のテキストバッファーを持つGUI Emacsウィンドウが起動します。そのバッファーで^ X ^ Sを実行すると、foo.txtがEmacsを起動したディレクトリに保存されます。

正しい。

もう1つ:

コマンドを入力すると、すぐに制御がターミナルセッションに戻ります。

〜/ bin/emacs

#!/bin/bash
EMACSPATH=/Applications/Emacs.app/Contents/MacOS

# Check if an emacs server is available 
# (by checking to see if it will evaluate a LISP statement)

if ! (${EMACSPATH}/bin/emacsclient --eval "t"  2> /dev/null > /dev/null )
then
    # There is no server available so,
    # Start Emacs.app detached from the terminal 
    # and change Emac's directory to PWD

    Nohup ${EMACSPATH}/Emacs --chdir "${PWD}" "${@}" 2>&1 > /dev/null &
else
    # The emacs server is available so use emacsclient

    if [ -z "${@}" ]
    then
        # There are no arguments, so
        # tell emacs to open a new window

        ${EMACSPATH}/bin/emacsclient --eval "(list-directory \"${PWD}\")"
    else    
        # There are arguments, so
        # tell emacs to open them

        ${EMACSPATH}/bin/emacsclient --no-wait "${@}"
    fi

    # Bring emacs to the foreground

    ${EMACSPATH}/bin/emacsclient --eval "(x-focus-frame nil)"
fi
5
The Dave

Mountain Lionでは、山本光晴のポート https://github.com/railwaycat/emacs-mac-port を次のエイリアスで使用しています。

alias emacs=/Applications/Emacs.app/Contents/MacOS/Emacs

そして、それはあなたのすべての基準を満たします。

4
mforbes

このガイドに従って、homebrewパッケージマネージャーでemacsを作成しました。 http://www.emacswiki.org/emacs/EmacsForMacOS with brew install --cocoa emacsその後、.appバージョンを起動してgui、私の場合は/usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs

3
Yuriy Skvortsov

David Jamesの応答をさらに改善すると、次のように動作します。

http://www.emacswiki.org/emacs/EmacsForMacOS#toc2 にある端末からファイルを開くための指示に従って

open -a /Applications/Emacs.app <file-name>

これをDavid Jameの応答と組み合わせて、次のemaxbashスクリプトを作成し、〜/ binのパスに配置しました

#!/bin/bash
(open -a /Applications/Emacs.app "$@") &

Caveat:emacsにDired by nameモードで現在のディレクトリを開かせるには、使用する

emax .

環境:

  • OS X Yosemiteバージョン10.10.2
  • GNU Emacs 24.4.2(x86_64-Apple-darwin14.0.0、NS Apple-appkit-1343.14)2014-11-13
3
sbecker11

ここでの他の答えは私にとってはうまくいきませんでした。特に、私のマシンでは、bashスクリプト

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" 

常にホームディレクトリでemacsを開きます。現在の作業ディレクトリで開くために、私はしなければなりませんでした

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$PWD/$@"

代わりに。

1
jackkamm

シンプルなソリューション...

この問題に対する非常に複雑な解決策の多くがここに投稿されています。自明ではないように見えるので、それは公平です。

しかし、この解決策は私にとって非常にうまく機能します。

ec() {
  emacsclient -n $@ 2> /dev/null
  if [[ $? == 1 ]]; then
    open -a Emacs.app  -- $@
  fi
}

使用法

ec file [...]

何が起きているのかを解きましょう:

  1. すべてのec引数をemacsclientに渡し、続行する前にemacsを待機(-n)しないでください。
    1. Emacsがすでに実行されている場合は、すべて完了し、編集中です。
  2. emacsが実行されていないときにemacsclientによって投稿されたエラーメッセージを飲み込みます。 (2> /dev/null
  3. 終了コードを手動で処理する1[[ $? == 1 ]]
    1. emacs.appを開き、ファイル引数を渡します(パスは正しく開かれます)。
    2. すべて完了し、Emacsがファイルを開きました。
1
ocodo

次の手順に従ってEmacsをコンパイルします。

./configure --with-x --prefix=/usr
make
Sudo make install

これで完了です! XQuartzをダウンロードしてインストールすると役立つかもしれませんが、それは私の意見です。

0
rake

これは、osx上のemacs/emacsclientを開くための私のスクリプトです。

#!/bin/bash

# Ensure (server-start) is added in your emacs init script.

EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
EMACSCLIENT=/Applications/Macports/Emacs.app/\
Contents/MacOS/bin/emacsclient

# test if client already exsit.
$EMACSCLIENT -e "(frames-on-display-list)" &>/dev/null

# use emacsclient to connect existing server.
if [ $? -eq 0 ]; then
    $EMACSCLIENT -n "$@"
# open emacs.app instead.
else
    `$EMACS "$@"` &
fi
0
Koren.H