Como usar um programa externo como a maneira padrão de abrir PDFs do Emacs?

42

Quando eu M-x find-filePDF, ele é aberto no Emacs. Embora isso seja legal, o visualizador de PDF do Emacs não possui muitos recursos que eu preciso e prefiro abrir PDFs em um programa externo. Como posso configurar o Emacs para usar um programa externo como visualizador padrão de PDFs?

Tmalsburg
fonte

Respostas:

34

Tente openwith. O código a seguir o habilitará e permitirá que você abra PDFs com evince(mude para o visualizador de PDF favorito):

(require 'openwith)
(openwith-mode t)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
Dan
fonte
11
Estou surpreso que um pacote de terceiros seja necessário para algo simples como isso. Mas funciona, obrigado!
tmalsburg
Não é necessário (veja a resposta de Drew), mas é uma maneira agradável e limpa de fazer isso. Observe que possivelmente entrará em conflito com outros programas, como um leitor de música (mpg123), se você usar um.
Ehvince
Esta solução tem problemas. Parece que alguns pacotes não gostam quando você mexe find-file. Por exemplo, o envio de emails com PDFs anexados (via mu4e) faz com que o PDF anexado seja aberto no editor externo e o envio falha (veja aqui para detalhes).
tmalsburg
11
@tmalsburg: veja este tópico da SO discutindo o problema com anexos de email e uma solução nesse caso de uso específico.
Dan
Acabei de escrever um pouco de código para aconselhar os comandos que não funcionam openwith-modepara desativá-lo: veja esta essência .
Omar
21

Se você deseja visualizar o PDF com muitos recursos (realçando a pesquisa, realçando a seleção, anotando, árvore de conteúdo), use as ferramentas pdf . Como você pode ver na demonstração , eu posso usar o Isearch com destaque. O Emacs agora é meu leitor de PDF favorito. Você também pode marcar uma página PDF específica usando o Marcador (+).

EDIT : Se você usar helme quer usar o programa externo, helmjá tem um no menu de ação para a abertura de arquivo externo: Open file externally C-c C-x. C-u to choose again. O que faz é que ele oferece uma lista de todos os programas disponíveis no seu sistema e apresenta uma ótima interface do Helm para seleção; Depois de selecionar, o Helm se lembra dele até você executar o comando com o argumento prefix C-upara selecionar um novo.

Tu Do
fonte
3
+1 Não posso agradecer o suficiente por mencionar pdf-tools!! Pacote incrível. Adoro! Sua demonstração é tão grande assim, mesmo que apenas arranha a superfície do que é possível ... :)
itsjeyd
O pdf-tools não parece disponível através dos gerenciadores de pacotes padrão, e o procedimento de instalação não parece funcionar com o emacs 24.4: /
Clément
Funciona para mim. Mas você precisa clonar o pdf-toolsrepositório, compilar e instalar a parte C em qualquer lugar em que o seu Emacs possa ver o binário, antes de instalar e usar a parte Emacs Lisp.
Tu Do
As ferramentas pdf permitem destacar (ou seja, em amarelo) palavras e frases ou não?
incandescentman
11

Você perguntou sobre find-file. Além do que outras pessoas (por exemplo, Dan) dizem sobre isso, vale a pena também saber sobre a abertura de arquivos usando um aplicativo associado ao tipo de arquivo (por exemplo, extensão) na opção dired-guess-shell-alist-user. E se você usa o Emacs no MS Windows, vale a pena saber como abrir um arquivo usando associações de arquivos do Windows.

A opção dired-guess-shell-alist-userestá disponível após o carregamento da biblioteca padrão dired-x.el. A associação padrão de um arquivo PDF é definida na variável dired-guess-shell-alist-defaulte é programa xpdf(disponível no UNIX e GNU / Linux). Usando opção dired-guess-shell-alist-uservocê pode, por exemplo, associá-lo ao invés com o Adobe Acrobat Reader, adicionando esta associação ao alist: ("\.pdf$" . "AcroRd32.exe").

Em seguida, você pode abrir um arquivo PDF no Dired usando !. Isso fornece programas padrão como "suposições", que você pode acessar repetindo M-n. Então, !seguido por M-nvocê fornecerá o comando shell AcroRd32.exese point estiver em um nome de arquivo PDF e se esse comando / programa estiver associado ao regexp \.pdf$.

Além de Dired, você pode usar as associações de arquivos dired-guess-shell-alist-usercomo manipulador de arquivos de indicadores, ou seja, fazer com que a associação de arquivos PDF entre em vigor para quaisquer indicadores de arquivos PDF, se você usar a biblioteca Indicador + . O valor atual de dired-guess-shell-alist-useré usado como o valor padrão da opção bmkp-default-handlers-for-file-types, que controla isso.

Você pode pensar em opções dired-guess-shell-alist-usere bmkp-default-handlers-for-file-typescomo algo análogo auto-mode-alist. Mas eles mapeiam padrões de nome de arquivo para ações de arquivo, em vez de mapeá-los para modos de buffer. E eles só entram em vigor quando você usa determinados comandos.

Se você usa o MS Windows, pode (ou também) tirar proveito das associações de arquivos existentes do Windows ao abrir um arquivo em Dired ou "pular" para um marcador. Para isso, você precisa de uma biblioteca w32-browser.el.

Para Dired, você também precisa da biblioteca Dired + - consulte Usando associações de arquivos do Windows em Dired . Para marcadores, você também precisa de Marcador + - consulte Marcando arquivos que você não pode visitar com o Emacs e abrindo marcadores usando associações de arquivos do Windows .

Desenhou
fonte
3

Eu estou usando corredor . Aqui está um trecho do meu arquivo de configuração

    (defun my:open-file-with-dired (file)
      "Ask dired how it would open FILE.
This code is useful if dired is well configured to open files
with external applications. I recommend using the `runner`
package to do so."
      (use-package dired-aux)
      (dired-do-async-shell-command
       (dired-guess-shell-command (format  "Open %s " file) (list file))
       0
       (list file)))

    (add-to-list 'org-file-apps '(t . (my:open-file-with-dired file)))
    (add-to-list 'org-file-apps '("\\.png\\'" . default))
Damien Cassou
fonte
0

Minha maneira de conseguir isso sem plugins é o seguinte. Eu corro o Emacs 25.3 no Ubuntu 16.04 LTS. Se o seu sistema operacional for macOS ou Windows, você definitivamente precisará alterar a primeira função xdg-open definida aqui. Eu achei este link muito útil como ponto de partida.

(defun xdg-open (filename)
  (interactive "fFilename: ")
  (let ((process-connection-type))
    (start-process "" nil "xdg-open" (expand-file-name filename))))

(defun find-file-auto (orig-fun &rest args)
  (let ((filename (car args)))
    (if (cl-find-if
         (lambda (regexp) (string-match regexp filename))
         '("\\.pdf\\'" "\\.docx?\\'"))
        (xdg-open filename)
      (apply orig-fun args))))

(advice-add 'find-file :around 'find-file-auto)

Depois que o código acima é carregado, quando você pressiona o C-x C-farquivo PDF e Word, ele abre automaticamente o arquivo usando o aplicativo padrão do sistema.

Eu realmente gosto do mecanismo de aconselhamento fornecido pelo Emacs, consulte Funções de aconselhamento (elisp) . Ao aconselhar a função existente de maneira compatível, evito vincular novamente as chaves comuns, como C-x C-fa nova função.

Lei Zhao
fonte