2

Due to emacs interlocking files I want to run org-mobile command via cron but using the emacsclient:

emacsclient -nw --eval "(org-mobile-pull)" --eval "(org-mobile-push)"

but if there is no emacs server running I want the command to run using emacs batch mode:

emacs --batch --eval "(org-mobile-pull)" --eval "(org-mobile-push)"

I'm not sure how to accomplish this so curious if anyone has any ideas.

4

2 回答 2

6

我很好奇你最终想要完成什么?为什么不总是启动一个新的 Emacs 进程呢?额外的开销将是几分之一秒

在我 2 岁的 MBP 上:

% time emacs --batch --eval nil emacs --batch --eval nil 0.03s user 0.01s system 87% cpu 0.054 total

沿着当前路径,您可以检查退出代码emacsclient 以决定是否应该批量运行

if emacsclient --eval nil >/dev/null 2>&1; then echo "run client"; else echo "run emacs"; fi

编辑:我看到你想编写一个脚本来回答锁盗问题。查看我对这个问题的回答ask-user-about-lock以解决这个问题。

编辑:所以想法是重新定义ask-user-about-lock返回 t。请参阅文档:

ask-user-about-lock 是 `userlock.el' 中自动加载的 Lisp 函数。

(询问用户关于锁定文件对手)

询问用户当他想编辑 FILE 但它被 OPPONENT 锁定时该怎么办。这个函数可以选择做三件事: do (signal 'file-locked (list FILE OPPONENT)) 避免编辑文件 return t (抓住文件的锁) return nil (编辑文件,即使它是锁定)。您可以重新定义此功能,以您喜欢的任何方式在这三个选项中进行选择。

[背部]

脚本示例(记得 chmod)

#!/usr/bin/env emacs --script

(defun ask-user-about-lock (file opponent)
  t)

(org-mobile-pull)
(org-mobile-push)
于 2012-07-15T06:58:55.837 回答
1

如果服务器未运行,emacsclient则返回错误代码。如果您确定要正常退出的代码evalemacsclient那么以下应该可以工作:

emacsclient -nw --eval "(org-mobile-pull)" --eval "(org-mobile-push)" 2>/dev/null || emacs --batch --eval "(org-mobile-pull)" --eval "(org-mobile-push)"

但是请注意,这种简单的方法会丢弃您可能感兴趣的潜在错误消息(但仅在emacsclient运行的情况下)。

于 2012-07-15T06:53:16.273 回答