2009-06-03 3 views
5

emacs 23をOS Xでマルチティティモードでうまく動作させるにはどうすればよいですか?Emacs 23、OS X、マルチtty、emacsclient

私は.emacsに(server-start)を追加しました。実行すると/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n ~/myfile.txtがemacs.appで開きますが、emacsは前面に表示されません。

emacsclientを実行すると、emacs.appが前面に来るようにするにはどうすればよいですか? (私は、ファイルが開かれるたびに現在のフレームを前面に置く関数を書くことを考えました。あるいは、emacsclientと同時に呼び出すことができる同様の仕事をするApplescriptを書くかもしれません)

Emacs.app内のemacsclientは使用するのに最適なものですか?もしそれがあればエイリアスを書くつもりだと思うが、/ usr/local/binにあるものではなくむしろそれを使うのが奇妙だと思う。

これを得るためのヒントや例は誰にもありますか?

答えて

2

AppleScriptのは簡単だろう:

tell app "Emacs" to activate 
+0

ありがとう、これは素晴らしいです。ただ展開する。/etc/Contents/MacOS/bin/emacsclient -n ' – Singletoned

5

おそらくこれは、仕事と、クライアントが接続するときだけフレームを上げる呼び出す:

(add-hook 'server-visit-hook 'call-raise-frame) 
(defun call-raise-frame() 
    (raise-frame)) 

(私のLinuxマシン上で冗長であることを起こります。 )

+0

これを実行するには、次のようにエイリアスをエイリアスにエイリアスしています: ' osascript -e '\' '私のために働く。私はそれを.emacsに入れて評価しましたが、何の効果もないようです。 – Singletoned

+1

あなたがそれを試しているなら、これをデバッグすることができます。ステップ1、Emacsで、 'call-raise-frame defun'の中のポイントを移動し、M-x edebug-defunを実行します。次に、emacsclientを使用して接続します。 Emacsはデバッガに入るべきです - あなたの.emacs(または 'raise-frame'行の隣に小さな矢印を持つバッファに 'call-raise-frame'が入っているもの)を表示します。そして、モード行にはそのまわりに[]がなければなりません(あなたがデバッグ中であることを示しています)。あなたはM-x上昇フレームを行うことができるはずです。もちろん、Linuxでは、デバッガのすべてのアクションがフレームを上げ、デバッグの有用性を減らします。 –

+0

これは23.0で動作することが確認できます。92 on OS X –

6

私はemacsのから

open -a /Applications/Emacs.app "[email protected]" 
へのエイリアスを持っています

あなたは、それが各ファイルに対して新しいフレーム(ウィンドウ)を開くという事実に悩まされている場合 - あなたの.emacsに

(setq ns-pop-up-frames nil) 

を追加して固定。

0

私はフレームを上げるためにこれを使用すると、私の.emacsに

(defun ns-raise-emacs() 
    (ns-do-applescript "tell application \"Emacs\" to activate")) 

を、この関数を定義します。

emacsclient -e '(ns-raise-emacs)' 

私はこのようにそれをやって代わりのosascriptをを呼び出すことをお勧めします。それはosascriptを使うよりも速く(時にはかなり速く)応答するようです。

1

Singletonedによりトレイ・ジャクソンとコメントによって与えられた回答に展開するには:私は私の.emacsに以下のいる

;;; 
;;; Run in server-mode so other sessions can connet 
;;; 
(defun call-raise-frame() 
    (raise-frame)) 
(defun end-server-edit() 
    (shell-command "osascript -e \"tell application \\\"System Events\\\" to keystroke tab using command down\"")) 
(add-hook 'server-visit-hook 'call-raise-frame) 
(add-hook 'server-done-hook 'end-server-edit) 
(server-start) 

そして、私のシェル初期化ファイルにファイル私は、次の別名があります。

alias e='emacsclient'  # edit 
alias enw='emacsclient -n' #edit (no wait) 

これで、CocoaEmacsインスタンスとサイドバイサイドシェルを開いて、2つのシェルをシームレスに一緒に使用できます。私はeエイリアスを使って現在のターミナルフローでエディタを "インライン"と呼ぶことができ、emacsでの編集が終わると、フォーカスは呼び出し元の端末に返されます。

2

私はこれを私のに使っています。唯一のコールサーバスタートにemacsのサーバがすでに実行されていない場合:

(if (file-exists-p 
(concat (getenv "TMPDIR") "emacs" 
     (number-to-string 
      (user-real-uid)) "/server")) 
nil (server-start)) 

を次に変更のカップルを私の.zshrcに私が無思慮にシェルからの私のエディタコマンドとしてecを実行できるように:

4

提案された解決策のいくつかは、 'raise-frame'を使用することを推奨します。それはemacsのフレームを上げますが、それはそれに焦点を当てません。ターミナルウィンドウからemacsを起動すると、ターミナルウィンドウがフォーカスを保持しているので、emacsはターミナルウィンドウの下にあります。 にフォーカスを置くために 'select-frame-set-input-focus'を使用します。

例:

/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n ~/myfile.txt \ 
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))' 

私はemacsの別々のインスタンスを実行することを好むので、私は「^ X^C」で終了し、私はすべてのウィンドウを失わないとき。私はシェルスクリプト持ってこれを実現するために:
ステップ1:

#!/bin/bash 
/Applications/Emacs.app/Contents/MacOS/Emacs \ 
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))' \ 
    "[email protected]" 
0

FWIWを、ここに私のソリューションです

#!/usr/bin/bash 
emacsclient -c --alternate-editor='/Applications/Emacs.app/Contents/MacOS/Emacs' "[email protected]" 2>/dev/null 
:以下 内容では/ usr/local/bin/emacsのでスクリプトを作成します以下を追加するには、〜/の.emacsファイルに+ Xは/ usr/local/bin/emacsのchmodの

ステップ3を::

ステップ2.経由で実行可能それを作る

(server-start) 

(defun ns-raise-emacs() 
(ns-do-applescript "tell application \"Emacs\" to activate")) 

(ns-raise-emacs) 

(add-hook 'server-visit-hook 'raise-frame) 
;;(add-hook 'server-visit-hook 'ns-raise-emacs) 

説明:

は/ usr/local/bin/emacsのでemacsのスクリプトが呼び出され、サーバーが現在実行中のEmacsがありますされていない場合は、のemacsclientは(この場合はEmacsエディタで代替エディタを起動します/Applications/Emacs.app/Contents/MacOS/Emacs)。

ステップ3では、最初のEmacsウィンドウが他のすべてのものの前に表示されるように、(ns-raise-emacs)への最初の呼び出しが必要なようです。

(add-hook 'server-visit-hook 'raise-frame)は、次のフレームが他のものの前に現れるようになっています。

また、コマンドラインからemacsを呼び出すたびにすべてのEmacsフレームが他のものの前に表示されるようにするには、(add-hook 'server-visit-hook 'ns-raise-emacs)行のコメントを解除できます。

関連する問題