Emacsが呼び出すプログラムからemacsclientを呼び出す


9

AucTexでPDFドキュメントファイルを表示するときに問題が発生しました。私はpdf-toolsEmacs内からPDFファイルを表示するために使用しemacsclient -n、デフォルトのpdf-viewerとして設定しました(Debian Linuxのxdg-mimeを介して)。これはほとんどの状況(Tex-documentation-texdoc ...)で正常に機能しますが、Auctex(C-c ?)の機能を壊します。

問題を1行のコードに絞り込みました。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を呼び出すのですか?(そして、私はでPDFファイルを開くことができることを知っていfind-fileます。ファイルを見つけるために外部プロセス(texdoc)を呼び出す必要があり、そのプロセスがemacsclientを呼び出すため、ここではオプションではありません)。


を使用texdoc -M --list listingsしてファイルを見つけ、それから使用しないのはなぜfind-fileですか?
Quarky、2016

@suvayu便利さ。もう1つの方法は、ターミナルに切り替えて呼び出しtexdoc --view、ファイルを開いたときにEmacsに切り替えることです。しかし、私はこれをEmacsから単一のステップで行う方法があるはずだと思いますか?
タイラー

1
(async-shell-command "emacsclient -n tmp.pdf")問題を解決できますか?
名前は

1
@Name興味深い- (async-shell-command "emacsclient -n tmp.pdf")機能しますが、(async-shell-command "texdoc --view listings")機能しません。ですから、それは有用な手がかりです。
Tyler

1
DOESのC-u C-c ?作品?まず、パッケージに関連するドキュメントのリストを表示し、次にでビューアを開きます(call-process "texdoc" nil 0 nil "--just-view" doc)
giordano

回答:


5

解決策はtexdoc、非同期プロセス内で実行することです。

これを行うための最良の方法は、start-file-process代わりに使用することですshell-command-to-string(これは、対応するElispコードよりも小さなシェルスクリプトを作成する方が便利ですが、それ以外の場合は私の経験では避けた方が便利です)。

ただしstart-file-process、プロセスの出力を直接返さないため、周囲のコードに大幅な変更が必要になります。代わりに、出力を配置するバッファーを指定し、そのバッファーから出力set-process-sentinelをフェッチするコールバック関数を使用する必要があります。コマンドが完了すると、「何をする必要があるか」が実行されます。


texdocAUCTeX で実行する特定のケースでは、これは基本的な機能ではないため、センチネルの使用は少々やり過ぎです(出力ドキュメントのビューアを開くようなもので、この場合はセンチネル)。
giordano 2016

「-to-string」関数が使用された理由がわからないので、コマンドの出力で何が行われるのかわかりません。この出力が必要な場合(の使用で示唆されているように...-to-string)、非同期ソリューションにはプロセスフィルターまたはプロセスセンチネルのいずれかが必要になります。そうでない場合は、コードでのようなものを使用でき(shell-command "texdoc --view listings &")ます。
Stefan

これは、コメントに説明されていますTeX-documentation-texdoc...-to-stringバリアントは、ユーザーに可能なエラーメッセージを表示するために使用されます(たとえば、ドキュメントが見つからない場合)。さらに、texdoc nonexistingpackage0を返しますが、センチネルを使用して出力を解析できます。
ジョルダーノ16

次に、歩哨が最良の選択肢であるようです。
Stefan

start-file-processここで実際に機能する呼び出しは見つかりません。(start-file-process "texdoc" "*texdoc*" "texdoc" "--view" "listings")バッファを作成し、*texdoc*そこに「Process texdoc finished」が挿入され、pdfが開かない。xdg-mime pdfビューアをevinceにも設定すると、同じことが起こります。
タイラー

1

回答を待たずに、リクエストをEmacsにフィードバックするだけの場合emacsclientは、バックグラウンドで実行できます。UnixスタイルのOS(Linux、macOS、Cygwinなど)の場合:

emacsclient … &

ネイティブWindowsの場合:

start emacsclient …

もちろん、この特定のケースでは、プログラム(texdoc)を呼び出してから(emacsclient)を呼び出す必要があります。追加レベルのリダイレクトが問題を引き起こしています。
タイラー

@Tyler texdocは非同期です(つまり、完了するのを待っていません)。したがって、同じ原則を適用できますtexdoc … &。シェルコマンドとして実行します。
ジル 'SO-邪悪なことをやめなさい'

私は私の質問の下のコメントでそれを試してみました。emacsclient直接呼び出す場合は機能しますが、を呼び出す場合は機能しませんtexdoc
タイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.