5

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

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

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

emacs.app 内の emacsclient は使用するのに最適ですか? もしそうなら、エイリアスを書くと思いますが、 /usr/local/bin にあるものではなく、それを使用しているのは奇妙に思えます

これを機能させるための他のヒントや例はありますか?

4

8 に答える 8

6

私はemacsからへのエイリアスを持っています

open -a /Applications/Emacs.app "$@"

ファイルごとに新しいフレーム (ウィンドウ) を開くことに悩まされている場合は、追加します。

(setq ns-pop-up-frames nil)

あなたの.emacsに修正してください。

于 2009-11-25T23:43:23.867 に答える
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」で終了しても、すべてのウィンドウが失われることはありません。これを達成するために、私はシェルスクリプトを持っています:

#!/bin/bash
/Applications/Emacs.app/Contents/MacOS/Emacs \
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))' \
    "$@"
于 2012-11-28T04:59:56.353 に答える
2

サーバーがまだ実行されていない場合にのみ、 .emacsで次のようなものを使用してserver-start を呼び出します。

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

次に、.zshrcecにいくつかの変更を加えて、シェルからエディター コマンドとして無意識に実行できるようにします。

# I use the Emacs package from emacsformacosx.com
alias emacs='open -a emacs'
alias emacsclient='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'
alias ec='emacsclient -a /Applications/Emacs.app/Contents/MacOS/Emacs'
export EDITOR='ec'
于 2011-03-11T04:22:42.757 に答える
1

Trey Jackson の回答と 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 での編集が終了すると、呼び出し元の端末にフォーカスが返されます。

于 2010-10-19T10:17:17.400 に答える
0

この関数を .emacs で定義します

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

次に、これを使用してフレームを上げます。

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

osascript を呼び出す代わりに、この方法で行うことをお勧めします。osascript を使用するよりも高速に応答するようです (場合によっては大幅に高速になります)。

于 2010-01-10T23:41:15.303 に答える
0


ステップ 1: /usr/local/bin/emacs に次の内容のスクリプトを作成します。

#!/usr/bin/bash
emacsclient -c --alternate-editor='/Applications/Emacs.app/Contents/MacOS/Emacs'  "$@" 2>/dev/null

ステップ 2. 次の方法で実行可能にします: chmod +x /usr/local/bin/emacs

ステップ 3. ~/.emacs ファイルに以下を追加します。

(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 では、(ns-raise-emacs)最初の Emacs ウィンドウが他のすべてのウィンドウの前に表示されるようにするには、最初に を呼び出す必要があるようです。

これ(add-hook 'server-visit-hook 'raise-frame)は、後続のフレームが他のすべてのフレームの前に表示されるようにするためです。

または、コマンド ラインから emacs を呼び出すたびに、すべての Emacs フレームを他のすべてのフレームより前に表示したい場合は、その(add-hook 'server-visit-hook 'ns-raise-emacs)行のコメントを外すことができます。

于 2013-10-28T10:27:25.970 に答える