Я столкнулся с проблемой просмотра PDF-файлов документации с AucTex. Я использую pdf-tools
для просмотра PDF-файлов из Emacs, и я установил emacsclient -n
pdf-viewer по умолчанию (через xdg-mime в Debian Linux). В большинстве случаев это работает нормально, но нарушает (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
.
Мой вопрос, как в таком случае, как я могу вызвать emacsclient из Emacs? (и я знаю, что могу просто открыть файл pdf с помощью find-file
; здесь это не вариант, так как мне нужно вызвать внешний процесс (texdoc), чтобы найти файл, и этот процесс затем вызывает emacsclient).
источник
texdoc -M --list listings
чтобы найти файл, а затем использоватьfind-file
?texdoc --view
а затем переключение обратно на Emacs, когда он открывает файл. Но я думаю, что должен быть способ сделать это за один шаг от Emacs?(async-shell-command "emacsclient -n tmp.pdf")
решить проблему?(async-shell-command "emacsclient -n tmp.pdf")
работает, а не(async-shell-command "texdoc --view listings")
нет. Так что это полезная подсказка.C-u C-c ?
? Сначала отображается список документов, связанных с пакетом, а затем открывается окно просмотра(call-process "texdoc" nil 0 nil "--just-view" doc)
.Ответы:
Решение состоит в том, чтобы работать
texdoc
в асинхронном процессе.Лучший способ сделать это, вероятно, использовать
start-file-process
вместоshell-command-to-string
(что является удобной функцией для быстрого и грязного кода, когда более целесообразно написать небольшой сценарий оболочки, чем соответствующий код Elisp, но в моем случае лучше избегать этого).Но это потребует существенных изменений в окружающем коде, так
start-file-process
как не возвращает вывод процесса напрямую, вместо этого он позволяет указать, в какой буфер помещать вывод, а затем вам нужно использоватьset-process-sentinel
функцию обратного вызова, которая извлекает вывод из этого буфера и делает "все, что нужно сделать с ним", когда команда заканчивается.источник
texdoc
в AUCTeX я считаю использование дозорного немного излишним, так как это не принципиальная особенность (как, например, открытие программы просмотра для выходного документа, и в этом случае мы используем сторожевой)....-to-string
), тогда асинхронному решению понадобится либо фильтр процесса, либо процессор процесса. Если нет, то код может использовать что-то вроде(shell-command "texdoc --view listings &")
.TeX-documentation-texdoc
:...-to-string
вариант используется, чтобы показать пользователям возможные сообщения об ошибках (например, когда документация не найдена). Кроме того,texdoc nonexistingpackage
возвращает 0, но для анализа вывода может использоваться часовой.start-file-process
который действительно работает здесь.(start-file-process "texdoc" "*texdoc*" "texdoc" "--view" "listings")
создает буфер*texdoc*
, в который вставляется «Процесс texdoc закончен», и PDF никогда не открывается. То же самое происходит, когда я устанавливаю средство просмотра PDF-файлов xdg-mime также.Если вам нужно только отправить запрос в Emacs, не дожидаясь ответа, вы можете работать
emacsclient
в фоновом режиме. Под операционными системами в стиле Unix (Linux, macOS, Cygwin,…):Под родной виндой:
источник
texdoc
асинхронный (то есть вы не ждете его завершения), не так ли? Таким образом, вы можете применить тот же принцип: запуститьtexdoc … &
как команду оболочки.emacsclient
напрямую, но не при звонкеtexdoc
.