diff --git a/users/crumb/programs/emacs.nix b/users/crumb/programs/emacs.nix index 26c9940..52cd3f7 100755 --- a/users/crumb/programs/emacs.nix +++ b/users/crumb/programs/emacs.nix @@ -80,6 +80,7 @@ in { package = emacsWrapper; extraPackages = epkgs: [ epkgs.jinx + epkgs.pdf-tools ]; }; diff --git a/users/crumb/programs/emacs/init.el b/users/crumb/programs/emacs/init.el index be6ec65..a5ecbcc 100755 --- a/users/crumb/programs/emacs/init.el +++ b/users/crumb/programs/emacs/init.el @@ -58,6 +58,7 @@ (require 'syd-keybinds) (require 'syd-lang) (require 'syd-org) +(require 'syd-pdfs) (require 'syd-projects) (require 'syd-scratch) (require 'syd-smartparens) diff --git a/users/crumb/programs/emacs/modules/syd-pdfs.el b/users/crumb/programs/emacs/modules/syd-pdfs.el new file mode 100644 index 0000000..7d5c627 --- /dev/null +++ b/users/crumb/programs/emacs/modules/syd-pdfs.el @@ -0,0 +1,66 @@ +;;; syd-pdfs.el -*- lexical-binding: t; -*- + +;; A better PDF reader for Emacs. +(use-package pdf-tools + ;; Managed by Nix: pdf-tools depends on a standalone compiled binary. + :straight nil + :mode ("\\.pdf\\'" . pdf-view-mode) + :magic ("%PDF" . pdf-view-mode) + :general (:keymaps 'pdf-view-mode-map + :states 'motion + "q" #'kill-current-buffer) + :custom ((pdf-view-display-size 'fit-page)) + :config + ;; HACK: Fix "Symbol's function definition is void: + ;; pdf-occur-global-minor-mode" errors on load. + ;; https://github.com/politza/pdf-tools/issues/206#issuecomment-614885793 + (use-package pdf-occur + :straight nil + :commands (pdf-occur-global-minor-mode)) + (use-package pdf-history + :straight nil + :commands (pdf-history-minor-mode)) + (use-package pdf-links + :straight nil + :commands (pdf-links-minor-mode)) + (use-package pdf-outline + :straight nil + :commands (pdf-outline-minor-mode)) + (use-package pdf-annot + :straight nil + :commands (pdf-annot-minor-mode)) + (use-package pdf-sync + :straight nil + :commands (pdf-sync-minor-mode)) + ;; Despite its namesake, this does not call `pdf-tools-install', it only sets + ;; up hooks, auto-mode-alist/magic-mode-alist entries, global modes, and + ;; refreshes pdf-view-mode buffers, if any. + ;; + ;; I avoid calling `pdf-tools-install' directly because `pdf-tools' is easy to + ;; prematurely load in the background (e.g. when exporting an org file or by + ;; packages like org-pdftools). And I don't want pdf-tools to suddenly block + ;; Emacs and spew out compiler output for a few minutes in those cases. It's + ;; abysmal UX. The `pdf-view-mode' advice above works around this with a less + ;; cryptic failure message, at least. + (pdf-tools-install-noverify) + (syd-add-hook 'pdf-view-mode-hook + #'pdf-view-themed-minor-mode + #'hide-mode-line-mode + (defun syd-pdf--init-ui-h () + ;; HACK: Flickering pdfs when evil-mode is enabled. + (setq-local evil-normal-state-cursor (list nil)))) + (set-popup-rules! + '(("^\\*Outline*" :side right :size 40 :select nil) + ("^\\*Edit Annotation " :quit nil) + ("\\(?:^\\*Contents\\|'s annots\\*$\\)" :ignore t))) + ;; Silence "File *.pdf is large (X MiB), really open?" prompts for PDFs. + (syd-defadvice syd-pdf--suppress-large-file-prompts-a + (fn size op-type filename &optional offer-raw) + :around #'abort-if-file-too-large + (unless (string-match-p "\\.pdf\\'" filename) + (funcall fn size op-type filename offer-raw)))) + +(use-package saveplace-pdf-view + :after pdf-view) + +(provide 'syd-pdfs)