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


91

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

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

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

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

端末プロンプトで「emacs」と入力しても、満たされない基準はどれですか。要件は、Linuxのデフォルトの動作を説明しています。私はしばらくMacを使用していませんが、トリックは実行する適切なプログラムを見つけるだけだったと思います-emacs.app多分?
タイラー

8
Linuxのバックグラウンド出身のタイラー、私はずっとあなたと一緒にいます。プロンプトで「emacs」と入力するだけで十分です。ただし、OSXでそれを行うと、ターミナルウィンドウでEmacsがテキストモードで起動するため(条件1が満たされません)、それは私が望んでいることではありません。
ヨハンウォレス

1
ヨハン-その間に解決策を見つけましたか?私は同じ問題に苦しんでいて、賞金を始めることを考えています。特に迷惑な...コマンドラインから(Emacs.appとしない)のemacsを呼び出すと、バックグラウンドでウィンドウを開くことである
alexurba

1
@DougHarris私の要件は、あらゆるLinuxディストリビューションでの現実と一致しています。自分に合ったワークフローを見つけられてうれしいです。乾杯!
Johan Walles 2013

2
OSXで動作するかどうかはわかりませんが、次のことを試してみてください。emacsclient -c -a "" "$@"コマンド
jfs

回答:


113

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

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

これは、#2、#3、および#4をカバーしています。

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

(x-focus-frame nil)

emacsformacosx.comのサイトでは、今持っているハウツーページトップスニペットがどこから来ています、。emacsclientEmacsの実行とフックアップに関する詳細情報がありgit mergetoolます。


1
デービッドに感謝します、あなたは支配します!
Johan Walles 2013年

1
よく働く。バウンティが近づいています。
Tamzin Blake 2013

2
Mavericksでは、フォルダー内にいて~/foo、開こbar.txtうとすると、次のように入力しますが、を開くのgmacs bar.txtでは~/bar.txtなく、で新しいファイルを作成します~foo/bar.txt。私は何か間違ったことをしていますか?
ダニエルコンプトン

2
.emacsファイルはどこにありますか?
ブレン2015

1
(x-focus-frame nil)をどこにでも追加することはできません。カスタマイズによって何かを設定すると、emacsが作成する(custom-set-variables)式内にある必要があります。「点滅カーソル」をオンに設定する(気に入らない場合はオフにする)など、メニューバーから何かをカスタマイズすると、そのセクションが.emacsに作成されます。また、これはテスト済みですか?Cocoaのemacsがこの設定を尊重するかどうかはわかりません。
チャックアダムス

70

シェルで、OSX emacsアプリケーションを指すようにコマンド '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セッションにロードするには!


4
こんにちはクリス!最初の答えは基準2と4に失敗します。2番目の答えは基準2に失敗します。番号付きの基準のすべてを満たすソリューションを探しています。よろしく/ Johan
Johan Walles

3
コマンドラインに依存して毎回新しいインスタンスを起動するのではなく、emacs自体を使用してファイルをロードするだけで、すべての問題が解決されるようです。私は通常、1日の初め(まだ実行されていない場合)にemacsを起動し、これを使用して、ファイルのロード、ディレクトリの変更、新しいファイルの作成など、ターミナルウィンドウに触れることなく実行します。
クリスマクマハン

このサイトでは、この質問に対処するための質問がいくつかありますが、ファイルを開くという問題を雄弁な方法で完全に解決できるのはこれだけです。
tylerthemiler 2012年

3
@tylerthemiler、問題を完全に解決する答えはどこですか?この回答の両方の回答が基準2に失敗し、最初の回答も4に失敗しています。
Johan Walles、2012年

5
少し工夫するだけで、質問への回答が得られます。少しググリングもします。
duma

10

これは、バックグラウンドでEmacsを開始することにより、David Caldwellの回答を改善します。

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

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

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

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

1
これにより、OSXの問題が修正されます(おそらく10.9 Mavericksから始まる)。10.9以降、「非推奨」メソッドは失敗します。少なくとも10.6までは、非推奨はシェル$ PWDとEmacs(pwd)を同期していました。デビッドの答えはどこかにあるかもしれませんが、どのようにして検索エンジンに「pwdではなくpwd」を理解させるのですか?
infogizmo 2016年

5

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

  • ログイン時に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」と入力すると、GUIのEmacsウィンドウが起動し、「foo.txt」という名前の空のテキストバッファーが表示されます。そのバッファで^ 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

驚くばかり!argsとno-argsの脚が入れ替わっているようです。
eriksensei 16


4

簡単な解決策...

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

ただし、このソリューションは私には本当にうまく機能します。

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

使用法

ec file [...]

何が起こっているのかを展開してみましょう:

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

3

このガイドに従って、自作パッケージマネージャでジャスト建てのemacs: http://www.emacswiki.org/emacs/EmacsForMacOS 1は、私の場合にあった、GUIを取得するの.appバージョンを起動する必要があり、その後醸造で--cocoaのemacsをインストール/usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs


--cocoaは廃止されました。代わりに--with-cocoaを使用してください!
Erwin Rooijakkers

3

デビッド・ジェームズの反応をさらに改善することで、次のことがうまくいきました。

http://www.emacswiki.org/emacs/EmacsForMacOS#toc20にあるターミナルからファイルを開くための指示に従って

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

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

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

警告:emacsで現在のディレクトリを名前によるdiredモードで開くには、以下を使用する必要があります。

emax .

環境:

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

これは、既存のファイルのために働く、そのことがあった場合、それは1を作成する習慣
Stíofánを。

私はmacOS 10.15(Catalina)を使用していますが、これは最初は(Emacsがまだ開いていない場合)機能しますが、2回目(Emacsウィンドウが既に開いている場合)は機能しないようです。これを修正する方法を知っていますか?
user102008

1

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

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

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

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

代わりに。


1
私の特定のビルド/インストールにはその問題はありませんが、ソリューションに問題があります。複数のファイルを開こうとすると、最初のファイルのみがPWDディレクトリに展開されます。残りには、$ PWDパスがプレフィックスされません。
kmarsh

0

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

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

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


0

これは、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

上記のすべてで「open」を使用する場合-「--args」オプションを必ず使用してください

こんなことしないで:

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

代わりにこれ:

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

この--argsオプションは、「open」がEmacs向けのさまざまなオプションを消費するのを防ぎます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.