Ocorreu um problema ao exibir arquivos de documentação em pdf com o AucTex. Eu uso pdf-tools
para visualizar arquivos PDF no Emacs e defini emacsclient -n
como meu visualizador de PDF padrão (via xdg-mime no Debian Linux). Isso funciona bem na maioria das circunstâncias, mas quebra a (Tex-documentation-texdoc ...)
função de Auctex ( C-c ?
).
Eu reduzi o problema a uma única linha de código. Quando tento visualizar a documentação do listings
pacote, TeX-documentation-texdoc
transforma isso no seguinte sexp:
(shell-command-to-string "texdoc --view listings")
texdoc
por sua vez, chama emacsclient
para realmente abrir o arquivo (com base em como eu configurei minha área de trabalho via xdg). No entanto, neste momento, o Emacs trava e eu preciso sair ( C-g
) para recuperar o controle. Depois disso, nenhum novo pdf é aberto. O mesmo acontece se eu tentar ligar diretamente para o emacsclient:
(shell-command-to-string "emacsclient -n tmp.pdf")
Ambos os comandos funcionam na linha de comando (ou seja, emacsclient -n tmp.pdf
e texdoc --view listings
.
Minha pergunta é, em uma instância como esta, como chamo o emacsclient de dentro do Emacs? (e eu sei que eu poderia simplesmente abrir o arquivo pdf find-file
; isso não é uma opção aqui, pois preciso chamar um processo externo (texdoc) para encontrar o arquivo, e esse processo chama o emacsclient).
fonte
texdoc -M --list listings
para encontrar o arquivo e depois usá-lofind-file
?texdoc --view
e depois voltar para o Emacs quando ele abrir o arquivo. Mas acho que deveria haver uma maneira de fazer isso em uma única etapa do Emacs?(async-shell-command "emacsclient -n tmp.pdf")
resolver o problema?(async-shell-command "emacsclient -n tmp.pdf")
funciona, mas não(async-shell-command "texdoc --view listings")
, não. Então essa é uma pista útil.C-u C-c ?
? Primeiro, mostra a lista de documentos relacionados ao pacote e abre o visualizador com(call-process "texdoc" nil 0 nil "--just-view" doc)
.Respostas:
A solução é executar
texdoc
dentro de um processo assíncrono.A melhor maneira de fazer isso é provavelmente usar em
start-file-process
vez deshell-command-to-string
(que é uma função útil para código rápido e sujo, quando é mais conveniente escrever um pequeno script de shell que o código Elisp correspondente, mas é melhor evitar isso em minha experiência).Mas isso exigirá alterações substanciais no código circundante, já
start-file-process
que não retorna a saída do processo diretamente. Em vez disso, permite indicar em qual buffer colocar a saída e você precisará usarset-process-sentinel
uma função de retorno de chamada que busca a saída desse buffer e faz "o que precisa ser feito com ele" quando o comando termina.fonte
texdoc
no AUCTeX, considero o uso de um sentinela um pouco exagerado, já que esse não é um recurso fundamental (como a abertura do visualizador para o documento de saída). Nesse caso, usamos o sentinela)....-to-string
), uma solução assíncrona precisará de um filtro de processo ou de um processo-sentinela. Caso contrário, talvez o código possa usar algo parecido(shell-command "texdoc --view listings &")
.TeX-documentation-texdoc
: a...-to-string
variante é usada para mostrar aos usuários possíveis mensagens de erro (por exemplo, quando nenhuma documentação é encontrada). Além disso,texdoc nonexistingpackage
retorna 0, mas o sentinela pode ser usado para analisar a saída.start-file-process
que realmente funcione aqui.(start-file-process "texdoc" "*texdoc*" "texdoc" "--view" "listings")
cria o buffer*texdoc*
no qual está inserido "Processo texdoc concluído" e o pdf nunca é aberto. O mesmo acontece quando eu configuro o visualizador de PDF do xdg-mime para evidenciar também.Se você precisar apenas enviar uma solicitação ao Emacs, sem aguardar uma resposta, poderá executar
emacsclient
em segundo plano. Em sistemas operacionais no estilo Unix (Linux, macOS, Cygwin,…):No Windows nativo:
fonte
texdoc
é assíncrono (ou seja, você não está esperando a conclusão), não é? Portanto, você pode aplicar o mesmo princípio: executetexdoc … &
como o comando shell.emacsclient
diretamente, mas não ao ligartexdoc
.