Cómo hacer que Emacs lock-buffer de error cuando no se puede bloquear un archivo?
-
09-12-2019 - |
Pregunta
Quiero algunos Emacs lisp para manipular mismo archivo en diferentes Emacs procesos.Así que escribí la siguiente secuencia de comandos para comprobar cómo lock-buffer
obras.Sin embargo, se detiene al intentar bloquear el archivo por el segundo proceso de Emacs (find-and-lock-file $es2 /tmp/dummy
).Tengo que ir a la otra terminal y enviar emacsclient --socket-name server-2 --eval '(kill-emacs)'
para detener el proceso de Emacs.Emacs pregunte qué hacer con el archivo si puedo abrir una interfaz de usuario emacsclient -t --socket-name server-2
, pero quiero hacer todo esto en el fondo y evitar el uso de Emacs mensaje para continuar con el proceso.¿Cómo puedo hacer esto?Es posible hacer que Emacs plantear algunas de error cuando se produce un error de bloqueo de un archivo?
EDITAR:@event_jr propuso una respuesta usando file-locked-p
.Creo que funciona la mayoría del tiempo.Sin embargo, pienso que otros Emacs proceso puede bloquear el archivo entre la ejecución de file-locked-p
y lock-buffer
. Así que, voy a mantener esta pregunta abierta. Solucionado.Gracias, @event_jr!
#!/bin/bash
es1="server-1"
es2="server-2"
start-server () {
emacs -q --daemon --eval "(progn (setq server-name \"$1\") (server-start) (require 'cl))"
}
emacs-eval () {
echo "@$1 >>> $2"
emacsclient --socket-name "$1" --eval "$2"
}
kill-emacs () {
emacs-eval "$1" '(kill-emacs)'
}
find-and-lock-file () {
emacs-eval "$1" "(progn (find-file \"$2\") (set-buffer-modified-p t) (lock-buffer))"
}
start-server $es1
start-server $es2
find-and-lock-file $es1 /tmp/dummy
find-and-lock-file $es2 /tmp/dummy
kill-emacs $es1
kill-emacs $es2
Solución
No parece ser una forma de hacer emacsclient --eval
devolver el código de error.Pero Usted puede hacer es imprimir lo que usted necesita saber:
#!/usr/bin/env bash
es1="server-1"
es2="server-2"
emacs=/Applications/Emacs.app/Contents/MacOS/Emacs
[ -e $emacs ] || emacs=emacs
start-server () {
read -r -d '' script <<EOF
(progn
(setq server-name "$1")
(server-start)
(require 'cl)
(defun my-set-buffer-modified-p (flag)
(flet ((ask-user-about-lock
(&rest args)
;; (signal 'file-locked args)
(apply 'error "%s was locked by %s" args)))
(set-buffer-modified-p flag))))
EOF
$emacs -q --daemon --eval "$script"
}
emacs-eval () {
echo "@$1 >>> $2"
emacsclient --socket-name "$1" --eval "$2"
}
kill-emacs () {
emacs-eval "$1" '(kill-emacs)'
}
find-and-lock-file () {
read -r -d '' script <<EOF
(with-current-buffer (find-file-noselect "$2")
(my-set-buffer-modified-p t))
EOF
emacs-eval "$1" "$script"
}
start-server $es1
start-server $es2
find-and-lock-file $es1 /tmp/dummy
find-and-lock-file $es2 /tmp/dummy
kill-emacs $es1
kill-emacs $es2
EDITAR:He excavado alrededor de la fuente un poco y encontré una referencia a
ask-user-about-lock
, que resuelve muy bien.
Otros consejos
He encontrado otra respuesta usando run-with-timer
, para omitir el emacsclient --eval error, por lo que puedo comprobar que (signal 'file-locked ...)
trabaja en "normal" la situación.
#!/usr/bin/env bash
es1="server-1"
es2="server-2"
emacs=/Applications/Emacs.app/Contents/MacOS/Emacs
[ -e $emacs ] || emacs=emacs
start-server () {
read -r -d '' script <<EOF
(progn
(setq server-name "$1")
(server-start)
(require 'cl)
(defvar my-file-is-locked "undefined")
(defun my-set-buffer-modified-p (flag)
(flet ((ask-user-about-lock
(&rest args)
(setq my-file-is-locked "no")
(signal 'file-locked args)))
(set-buffer-modified-p flag)
(setq my-file-is-locked "yes"))))
EOF
$emacs -q --daemon --eval "$script"
}
emacs-eval () {
echo "@$1 >>> $2"
emacsclient --socket-name "$1" --eval "$2"
}
kill-emacs () {
emacs-eval "$1" '(kill-emacs)'
}
find-and-lock-file () {
read -r -d '' script <<EOF
(run-with-timer 0 nil (lambda ()
(with-current-buffer (find-file-noselect "$2")
(my-set-buffer-modified-p t))))
EOF
emacs-eval "$1" "$script"
}
file-locked-p () {
emacs-eval "$1" "(message \"my-file-is-locked = %s\" my-file-is-locked)"
}
start-server $es1
start-server $es2
find-and-lock-file $es1 /tmp/dummy
find-and-lock-file $es2 /tmp/dummy
file-locked-p $es1
file-locked-p $es2
kill-emacs $es1
kill-emacs $es2