Я хочу, чтобы некоторые Emacs lisp манипулировали одним и тем же файлом из разных процессов Emacs.Поэтому я написал следующий скрипт, чтобы проверить, как работает lock-buffer
.Однако он останавливается при попытке заблокировать файл вторым процессом Emacs (find-and-lock-file $es2 /tmp/dummy
).Мне нужно перейти на другой терминал и отправить emacsclient --socket-name server-2 --eval '(kill-emacs)'
, чтобы остановить процесс Emacs.Emacs запрашивает, что делать с файлом, если я открываю пользовательский интерфейс с помощью emacsclient -t --socket-name server-2
, но я хочу сделать все это в фоновом режиме и избегать использования запроса Emacs для продолжения процесса.Как я могу это сделать?Можно ли заставить Emacs вызвать какую-либо ошибку, если не удается заблокировать файл?
EDIT : @event_jr предложил ответ, используя file-locked-p
.Я думаю, что это работает большую часть времени.Однако, я думаю, что другой процесс Emacs может заблокировать файл между выполнением file-locked-p
и lock-buffer
. Итак, я буду держать этот вопрос открытым. Решено.Спасибо, @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