2009-06-03 110 views
5

我怎样才能得到emacs的23多TTY模式在OS X上工作很好?Emacs的23,OS X,多TTY和emacsclient

我已将(server-start)添加到我的.emacs中,并且发现运行/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n ~/myfile.txt会在我的emacs.app中打开它,但它不会将emacs带到前面。

所以,我怎样才能得到emacs.app到前面来,当我运行emacsclient? (我考虑写,每一次打开文件时将当前帧的前一个功能,或者也许写一个AppleScript做类似的工作,可以在同一时间为emacsclient调用)

的是emacs.app中的emacsclient是最好用的吗?我想我会写一个别名,如果是这样的话,但似乎很奇怪,而不是在/ usr/local/bin中使用的东西

有没有人有任何其他的提示或例子,让这个工作?

回答

2

的AppleScript的将是简单:

tell app "Emacs" to activate 
+0

谢谢,这个作品很棒。只是为了扩大。我将emacs别名为: 'osascript -e'''告诉应用程序“Emacs”激活'\'';/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n' – Singletoned 2009-06-11 12:39:06

5

也许这会工作,只是呼吁提高帧时,客户端将附加:

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

(这恰好是我的Linux机器上的冗余。 )

+0

这不会为我工作。我把它放在.emacs中,并对它进行评估,但它似乎没有任何效果。 – Singletoned 2009-06-03 16:52:38

6

我已经从的emacs到

open -a /Applications/Emacs.app "[email protected]" 
别名

如果你被它打开每个文件的新框架(窗口)的事实恼火 - 添加

(setq ns-pop-up-frames nil) 

到你的.emacs和固定。

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) 

而且在我的壳init文件,我有以下别名:

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

现在我可以有一个壳开放并排侧我CocoaEmacs实例,并使用两个完美地结合在一起。我可以通过使用e别名以我的当前终端流量调用编辑器“inline”,并且一旦我在emacs中完成编辑,焦点将返回到主叫终端。

2

我用我的这样的事情。emacs的只能呼叫服务器启动,如果服务器尚未运行:

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

然后一些改动,以我的.zshrc这样我就可以盲目运行ec从壳我的编辑命令:

# 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' 
4

一些建议的解决方案建议使用“提升框架”。这将提高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”退出我不会失去所有窗口。要做到这一点我有一个shell脚本:

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

FWIW,这里是我的解决方案:
第1步:创建位于/ usr/local/bin目录/ emacs的脚本与以下 内容:

#!/usr/bin/bash 
emacsclient -c --alternate-editor='/Applications/Emacs.app/Contents/MacOS/Emacs' "[email protected]" 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)行。