2009-06-03 12 views
5

¿Cómo puedo hacer que emacs 23 funcione bien en modo multi-tty en OS X?Emacs 23, OS X, multi-tty y emacsclient

He agregado (server-start) a mi .emacs, y he descubierto que ejecutar /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n ~/myfile.txt lo abrirá en mi emacs.app, pero no trae emacs al frente.

Entonces, ¿cómo puedo hacer para que emacs.app salga al frente cuando ejecuto emacsclient? (He considerado escribir una función que coloca el marco actual al frente cada vez que se abre un archivo, o tal vez escribir un Applescript para hacer un trabajo similar que podría llamarse al mismo tiempo que emacsclient)

Es el emacsclient dentro de emacs.app ¿cuál es el mejor para usar? Supongo que escribiré un alias si es así, pero parece extraño usar eso en lugar de algo en/usr/local/bin

¿Alguien ha recibido otros consejos o ejemplos para que funcione?

Respuesta

2

El AppleScript sería simple:

tell app "Emacs" to activate 
+0

Gracias, esto funciona muy bien. Solo para expandir. Aliased emacs a: 'osascript -e' \ '' decirle a la aplicación "Emacs" que active '\' ';/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n' – Singletoned

5

Tal vez esto quiere trabajar, simplemente llamando a elevar-marco cuando el cliente se conecta:

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

(que pasa a ser redundante en mi máquina Linux.)

+0

Esto no significa trabaja para mi. Lo puse en .emacs y lo evalué, pero no parece tener ningún efecto. – Singletoned

+1

Si está preparado, puede intentar depurar esto. Paso uno, en Emacs, mueva el punto dentro del defun de call-raise-frame y ejecute M-x edebug-defun. Luego, conéctese usando emacsclient. Emacs debe ingresar al depurador, que debe mostrar sus .emacs (o cualquier buffer que contenga el 'call-raise-frame') con una pequeña flecha al lado de la línea (raise-frame). Y la línea de modo debería tener [] a su alrededor (lo que indica que está realizando una depuración). En ese punto, deberías poder hacer M-x raise-frame. Por supuesto, en Linux, cada acción en el depurador aumenta el marco, reduciendo la utilidad de la depuración. –

+0

Puedo confirmar que esto funciona con 23.0.92 en OS X –

6

tengo un alias de emacs a

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

Si está molesto por el hecho de que se abre un nuevo marco (ventana) para cada archivo - añadir

(setq ns-pop-up-frames nil) 

a su .emacs y fijo.

0

que definen esta función en mi .emacs

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

los utilizan para impulsar el bastidor:

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

Yo recomiendo hacerlo de esta manera en lugar de llamar osascript. Parece responder más rápido (significativamente más rápido a veces) que usar osascript.

1

Para ampliar las respuestas dadas por Trey Jackson y el comentario de Singletoned: Tengo el siguiente en mi fichero .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) 

Y en mi archivo de cáscara init tengo los siguientes alias:

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

Ahora puedo tener un shell abierto al lado de mi instancia de CocoaEmacs y usar los dos juntos sin problemas. Puedo llamar al editor "en línea" con mi flujo de terminal actual usando el alias e y una vez que termine de editar en emacs, el foco se devolverá al terminal llamante.

2

Uso algo como esto en mi .emacs a única llamada al servidor de arranque si el servidor no está en ejecución:

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

A continuación, un par de cambios en mi .zshrc de manera que sin pensar que puedo correr ec como mi editor de comandos de la shell:

# 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

Algunas de las soluciones propuestas sugieren usar 'raise-frame'. Eso elevará el marco de emacs, pero no lo enfocará. Cuando inicie emacs desde una ventana de terminal, emacs seguirá estando debajo de la ventana del terminal porque la ventana del terminal retiene el foco. Yo uso 'select-frame-set-input-focus' para aumentar y dar el foco.

Ejemplos:

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

que prefieren correr instancia independiente de emacs, por lo que cuando la salida con "^ X^C" que no pierdan todas las ventanas. Para lograr esto tengo un script de shell:

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

fwiw, aquí está mi solución:
Paso 1: Crear un script en// bin/emacs usr/local con las siguientes contenidos:

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

paso 2. hacerlo ejecutable a través de: chmod + x/usr/bin/emacs/locales

el paso 3. en sus ~/.emacs presentar añadir lo siguiente:

(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) 

explicación:

Si la secuencia de comandos emacs en// local/bin/emacs usr se invoca y no hay emacs servidor que ejecuta actualmente, la emacsclient invocará el editor alternativo, que en este caso es el editor Emacs (/Aplicaciones/Emacs.app/Contents/MacOS/Emacs).

En el paso 3, la llamada inicial a (ns-raise-emacs) parece ser necesaria para que la ventana inicial de Emacs se muestre frente a todo lo demás.

El (add-hook 'server-visit-hook 'raise-frame) es para que los siguientes fotogramas aparezcan frente a todo lo demás.

Alternativamente, si prefiere que todos los marcos de Emacs aparezcan frente a todo lo demás cada vez que invoque emacs desde la línea de comandos, puede descomentar la línea (add-hook 'server-visit-hook 'ns-raise-emacs).