我想要一些 Emacs lisp 来操作来自不同 Emacs 进程的相同文件。所以我写了下面的脚本来检查它是如何lock-buffer
工作的。但是,当尝试通过第二个 Emacs 进程 ( find-and-lock-file $es2 /tmp/dummy
) 锁定文件时,它会停止。我需要去另一个终端并发送emacsclient --socket-name server-2 --eval '(kill-emacs)'
以停止 Emacs 进程。如果我通过 来打开 UI,Emacs 会提示对文件执行什么操作emacsclient -t --socket-name server-2
,但我想让这一切都在后台完成,并避免使用 Emacs 提示符来继续该过程。我怎样才能做到这一点?是否有可能使 Emacs 在无法锁定文件时引发一些错误?
编辑:@event_jr 使用file-locked-p
. 我认为它在大多数情况下都有效。file-locked-p
但是,我认为其他 Emacs 进程可以在和执行之间锁定文件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