emacs applescript elisp

El método más eficiente para activar una función de Emacs con un AppleScript



elisp (1)

¿Hay un método mejor para activar una función en Emacs con un AppleScript en lugar de abrir el minibúfer para iniciar la función? Hay una demora necesaria para quitar el dedo de la tecla de control para iniciar AppleScript con un atajo de teclado (para que Emacs no lo registre como un comando), y hay otra demora después de escribir el nombre de la función en el minibúfer Idealmente, me gustaría decirle a Emacs debajo del capó para ejecutar una función en particular sin abrir el minibúfer . El siguiente es un AppleScript simple para activar Emacs, y abre el minibúfer con Mx , y escribe el nombre de la función ( dock ), y presiona la tecla de retorno. El método debería funcionar ya sea que Emacs esté actualmente abierto (oculto o en el frente) o cerrado.

FYI: Para los programadores novatos como yo, aquí hay una hoja de trucos para los códigos clave: https://apple.stackexchange.com/questions/36943/how-do-i-automate-a-key-press-in-applescript / 36947 # 36947? Newreg = 9adf36816f4245d69f0900ec09588057

EDITAR : Un método más corto sería configurar un atajo de teclado dentro de Emacs que está conectado a una función (global-set-key (kbd "<f6>") (lambda () (interactive) (dired "/Applications"))) - por ejemplo, F6 para activar la función, y luego usar el key code 97 para la tecla F6. Sin embargo, aún sería bueno aprender a especificar la ejecución de una función de Emacs por su nombre (con un AppleScript) sin abrir el minibúfer.

tell application "System Events" tell application "/Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/MacOS/Emacs" to activate delay .3 key code 53 # escape key code 7 # x key code 2 # d key code 31 # o key code 8 # c key code 40 # k delay .1 key code 36 # return end tell

o

tell application "System Events" tell application "/Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/MacOS/Emacs" to activate delay .3 key code 97 # F6 end tell

EDITAR : Borrador revisado (basado en la respuesta de @Francesco): requiere que (server-start) esté dentro del archivo de inicio de Emacs (p. init.el ., init.el ). SI la GUI de Emacs ya se está ejecutando, ejecute emacsclient sin una pausa previa; ELSE, inicie la GUI de Emacs (pausa de 1 segundo para que cargue el servidor) y luego ejecute emacsclient .

on is_running(appName) tell application "System Events" to (name of processes) contains appName end is_running set EmacsRunning to is_running("Emacs") if EmacsRunning then tell application "/Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/MacOS/Emacs" to activate do shell script "/Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/MacOS/bin/emacsclient -e ''(dired /"/Applications/")''" else tell application "/Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/MacOS/Emacs" to activate delay 1 do shell script "/Users/HOME/.0.data/.0.emacs/Emacs.app/Contents/MacOS/bin/emacsclient -e ''(dired /"/Applications/")''" end if


No sé sobre applescript, pero ¿no puedes usar emacsclient para hacer esto?

Una vez que haya iniciado el servidor en su instancia de Emacs existente ( Mx server-start RET ), puede ejecutar algo como:

emacsclient -e "(call-interactively ''dock)"

para evaluar el código de ceceo arbitrario en Emacs.