从Emacs调用的程序中调用emacsclient


9

我在使用AucTex查看pdf文档文件时遇到问题。我pdf-tools曾经在Emacs中查看PDF文件,并且将其设置emacsclient -n为默认的pdf查看器(通过Debian Linux上的xdg-mime)。在大多数情况下,此方法工作正常,但会破坏(Tex-documentation-texdoc ...)Auctex(C-c ?)的功能。

我已将问题缩小为一行代码。当我尝试查看该listings软件包的文档时,TeX-documentation-texdoc将其转换为以下sexp:

(shell-command-to-string "texdoc --view  listings")

texdoc依次调用emacsclient实际打开文件(基于我通过xdg配置桌面的方式)。但是,此时,Emacs挂起,我需要退出(C-g)以重新获得控制权。之后,将不会打开新的pdf。如果我尝试直接调用emacsclient,则会发生相同的事情:

(shell-command-to-string "emacsclient -n tmp.pdf")

这两个命令都在命令行上运行(即emacsclient -n tmp.pdf和)texdoc --view listings

我的问题是,在这种情况下,如何在Emacs中调用emacsclient?(而且我知道我可以使用find-file;仅打开pdf文件,这不是一个选项,因为我需要调用外部进程(texdoc)来查找文件,然后该进程调用emacsclient)。


为什么不只是使用texdoc -M --list listings查找文件,然后使用find-file
夸克

@suvayu方便。另一种选择是切换到终端进行调用texdoc --view,然后在打开文件时切换回Emacs。但是我认为从Emacs一步就应该有办法做到这一点?
泰勒(Tyler)

1
(async-shell-command "emacsclient -n tmp.pdf")解决问题吗?
名称

1
@Name很有趣- (async-shell-command "emacsclient -n tmp.pdf")可以,但(async-shell-command "texdoc --view listings")不能。所以这是一个有用的线索。
泰勒(Tyler)2016年

1
C-u C-c ?工作吗?它首先显示与该软件包相关的文档列表,然后通过打开查看器(call-process "texdoc" nil 0 nil "--just-view" doc)
giordano '16

Answers:


5

解决方案是texdoc在异步进程中运行。

最好的方法可能是使用start-file-process而不是shell-command-to-string(对于较脏的代码,这是一个方便的功能,当比相应的Elisp代码更方便地编写一些shell脚本时,以我的经验可以避免)。

但这将需要对周围的代码进行实质性更改,因为start-file-process它不会直接返回流程的输出,而是让您指示将输出放置在哪个缓冲区中,然后必须使用set-process-sentinel回调函数来从该缓冲区中获取输出,然后命令完成后,将执行“需要执行的所有操作”。


texdocAUCTeX 中运行的特定情况下,我发现使用哨兵有点过头了,因为这不是基本功能(就像打开输出文档的查看器一样,在这种情况下,我们确实使用了哨兵)。
giordano '16

我不知道为什么要使用“ -to-string”功能,所以我不知道该命令的输出如何处理。如果需要此输出(如使用所建议...-to-string),那么异步解决方案将需要流程过滤器或过程前哨。如果没有,那么代码可能可以使用(shell-command "texdoc --view listings &")
Stefan

在对的注释中对此进行TeX-documentation-texdoc了解释:该...-to-string变体用于向用户显示可能的错误消息(例如,未找到文档时)。此外,texdoc nonexistingpackage返回0,但是前哨可以用于解析输出。
giordano '16

那么哨兵似乎是最好的选择。
斯特凡

我找不到start-file-process在这里实际起作用的调用。(start-file-process "texdoc" "*texdoc*" "texdoc" "--view" "listings")创建缓冲区*texdoc*,将其插入“ Process texdoc finish”,并且pdf永远不会打开。当我还将xdg-mime pdf查看器设置为evince时,也会发生同样的事情。
泰勒(Tyler)

1

如果您只需要将请求反馈给Emacs,而无需等待答案,则可以emacsclient在后台运行。在Unix风格的操作系统(Linux,macOS,Cygwin等)下:

emacsclient … &

在本机Windows下:

start emacsclient …

可以,但是在这种情况下,我需要先调用程序(texdoc),然后再调用(emacsclient)。重定向的附加级别引起了问题。
泰勒(Tyler)

@Tyler texdoc是异步的(即您不等待它完成),不是吗?因此,您可以应用相同的原则:texdoc … &以shell命令运行。
吉尔(Gilles)'所以

我们在我的问题下的评论中对此进行了尝试;emacsclient直接调用时有效,但调用时无效texdoc
泰勒(Tyler)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.