2009-01-13 11 views
5

Utilizo el archivo por lotes de Windows para abrir archivos en una instancia de Emacs que ya se está ejecutando utilizando emacsclientw.exe. Sin embargo, cualquier archivo abierto de esa manera se abre en modo servidor, lo que significa que tengo que usar C-x # para matarlo, en lugar del habitual C-x k. ¿Cómo cambio este comportamiento?¿Cómo se usa C-x k para matar un búfer de Emacs abierto en modo servidor?

+1

Este es un duplicado de http://stackoverflow.com/questions/268088/, que tiene más respuestas. – Glenn

Respuesta

5

uso:

D:\> emacsclientw -n foo.txt 

la -n dice "no esperar". Esto está en GNU Emacs 22.2.1 (i386-mingw-nt5.1.2600) de 2008-03-26 en RELEASE (y muchas versiones anteriores, IIRC).

+0

hrm - no puedo hacer que funcione con FireFox "Es todo el "complemento" de texto. No se puede encontrar la ruta

+0

yo uso También es texto completo y solo tiene D: \ producto \ emacs \ bin \ emacsclientw.exe. No tengo problemas para eliminar los búferes visitados usando IAT. No recuerdo haber cambiado nunca el kill-buffer para acomodar esto (y una comprobación rápida a través de mis .emacs confirma esto). –

4

Ya sabes, odio sugerir soluciones alternativas en lugar de una solución real ... pero después de leer el código del servidor, estoy confundido en cuanto a cómo emacs incluso determina que un búfer es un búfer del servidor.

Con esto en mente, ¿por qué no abrir archivos como:

emacsclient --eval '(find-file "/path/to/file")' 

De esta manera Emacs no saben que el tampón se abre a través de emacsclient, que suena como lo que realmente quiere.

Editar:

No estoy muy contento con esto, pero parece que funciona:

(global-set-key (kbd "C-x k") (lambda() (interactive) (server-kill-buffer (current-buffer)))) 
+0

Obtengo un depurador ingresado - Error Lisp: (número-de-argumentos incorrecto # [nil " Estoy ejecutando GNU Emacs 23.0.60.1 (i386-mingw-nt5.1.2600) de 2008-08-19 en LENNART-69DE564 (parcheado) –

7

Mi solución fue volver a enlazar (bueno en realidad Mw) a:

(lambda() 
    (interactive) 
    (if server-buffer-clients 
     (server-edit) 
    (kill-this-buffer))) 

[edit: ahora que ha leído el código para editar el servidor, es mejor usar server-done (dependiendo de lo que desee). server-edit lo cambiará a un búfer editado por el servidor (si aún existe alguno) pero server-done simplemente lo cambiará al siguiente buffer. También podría usar la salida de server-done para ver si el búfer realmente fue eliminado (no es el caso si el archivo estaba abierto antes de invocar emacsclient) y luego matarlo si no lo hace. . O el uso del servidor-kill-buffer como se sugiere en otros lugares]

+0

Esto romperá las cosas horriblemente. 'server-edit' cambiará a un búfer de servidor si no está actualmente en uno, lo que significa que solo puede matar búferes si ha matado a todos los búferes del servidor. Además, Mw es un enlace bastante importante, ¿nunca lo usaste?) – jrockway

+0

server-buffer-clients es no-nil si estoy editando si ya estoy en un buffer que un cliente espera, a menos que la documentación esté mal. Y no, no uso kill-ring-save vinculado a Mw. Debo admitir que probablemente vuelva a enlazar demasiadas teclas, pero ... –

+0

OK, tienes razón. Yo usaría server-kill-buffer en su lugar de server-edit. – jrockway

2

Bueno, esto ha funcionado para mí:

(global-set-key (kbd "C-x k") '(lambda() 
    (interactive) 
    (if server-buffer-clients 
     (server-done) 
    (kill-this-buffer)))) 

(este es el código de la respuesta de IvanAndrus con los cambios explícitos de ediciones y comentarios, y el uso de jrockway's keybinding.)

Y, sí, estoy reencuadernando un enlace estándar. PERO es un reemplazo funcional NO algo completamente diferente (por ejemplo, reemplazar el kill-ring-save con cosas del kill-buffer).

Por cierto, EmacsWiki tiene un par de páginas en este topic-- KillKey y KillingBuffer - ninguno de los cuales de aclarar cuáles para mí que el anterior (aunque la primera función de KillKey también utilizó "servidor-editar" .. .).

7

Esto es lo que puso en mi .emacs para hacer esto:

(add-hook 'server-switch-hook 
    (lambda() 
    (local-set-key (kbd "C-x k") '(lambda() 
            (interactive) 
            (if server-buffer-clients 
             (server-edit) 
             (ido-kill-buffer)))))) 

gusta esta obra k Cx de la forma habitual cuando no estoy encontrando un archivo de emacsclient (que para mí es ido-mata -buffer), y si estoy usando emacsclient, Cx k hace server-edit si el cliente está esperando, o ejecuta ido-kill-buffer de lo contrario (si usé emacsclient -n).

+0

¡Oh, qué bonito! ¡Funciona como un amuleto, y elimina ese problema de reenlace completo! –

+0

Éste. Este es el que funcionó para mí. – robru

0

No estoy seguro de si eso funcionará en Windows, pero en Linux, emacs -daemon es genial. Con él, no tiene que ejecutar un programa diferente, y sus enlaces son los mismos. Supongo que hay otras ventajas, pero como nunca pude aprender esas encuadernaciones de emacsclient, nunca las utilicé y no puedo decir.

No creo que haya sido lanzado aún, estoy usando 23.0.60.1 de CVS.

Cuestiones relacionadas