我有一个函数应该创建一个ctags文件并异步加载到Emacs中。如果在非常大的文件上调用ctags可能需要一段时间才能运行,并且我不希望我的函数执行任何阻塞,因此我使用start-process
。这就是它的全貌:
(defun temp-tags-file-for-file (file)
"Generate a temporary tags file for FILE.
Add the file to tags list and return the name of the file."
(if (not (boundp 'ctags-command))
(setq ctags-command "/usr/bin/ctags"))
(let* ((temp-file (make-temp-file "EMACS_TAGS"))
(proc (start-process "temp-tags-proc" nil ctags-command
"-f" temp-file file)))
(set-process-sentinel proc
(lambda (proc msg)
(when (eq (process-status proc) 'exit)
(if (boundp 'temp-tags-file)
(progn
(add-to-list 'tags-table-list
temp-tags-file)
(makunbound 'temp-tags-file))))))
(setq temp-tags-file temp-file)
temp-file))
由于某种原因,标签文件始终为空白。使用shell中完全相同的参数调用ctags会生成一个非空白的工作标记文件。如何让ctags正确打印输出?
答案 0 :(得分:1)
如果ctags
想要shell,只需将它提供给shell:
(start-process "temp-tags-proc" nil shell-file-name shell-command-switch
(format "/usr/bin/ctags ~/Dropbox/source/c/*.c -f %s"
(make-temp-file "EMACS_TAGS")))