diff options
Diffstat (limited to 'elpa/pdf-tools-20200512.1524/pdf-tools.el')
-rw-r--r-- | elpa/pdf-tools-20200512.1524/pdf-tools.el | 525 |
1 files changed, 0 insertions, 525 deletions
diff --git a/elpa/pdf-tools-20200512.1524/pdf-tools.el b/elpa/pdf-tools-20200512.1524/pdf-tools.el deleted file mode 100644 index 7c9144c..0000000 --- a/elpa/pdf-tools-20200512.1524/pdf-tools.el +++ /dev/null @@ -1,525 +0,0 @@ -;;; pdf-tools.el --- Support library for PDF documents. -*- lexical-binding:t -*- - -;; Copyright (C) 2013, 2014 Andreas Politz - -;; Author: Andreas Politz <politza@fh-trier.de> -;; Keywords: files, multimedia -;; Package: pdf-tools -;; Version: 1.0 -;; Package-Requires: ((emacs "24.3") (tablist "1.0") (let-alist "1.0.4")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see <http://www.gnu.org/licenses/>. - -;;; Commentary: -;; -;; PDF Tools is, among other things, a replacement of DocView for PDF -;; files. The key difference is, that pages are not prerendered by -;; e.g. ghostscript and stored in the file-system, but rather created -;; on-demand and stored in memory. -;; -;; Note: This package requires external libraries and works currently -;; only on GNU/Linux systems. -;; -;; Note: If you ever update it, you need to restart Emacs afterwards. -;; -;; To activate the package put -;; -;; (pdf-tools-install) -;; -;; somewhere in your .emacs.el . -;; -;; M-x pdf-tools-help RET -;; -;; gives some help on using the package and -;; -;; M-x pdf-tools-customize RET -;; -;; offers some customization options. - -;; Features: -;; -;; * View -;; View PDF documents in a buffer with DocView-like bindings. -;; -;; * Isearch -;; Interactively search PDF documents like any other buffer. (Though -;; there is currently no regexp support.) -;; -;; * Follow links -;; Click on highlighted links, moving to some part of a different -;; page, some external file, a website or any other URI. Links may -;; also be followed by keyboard commands. -;; -;; * Annotations -;; Display and list text and markup annotations (like underline), -;; edit their contents and attributes (e.g. color), move them around, -;; delete them or create new ones and then save the modifications -;; back to the PDF file. -;; -;; * Attachments -;; Save files attached to the PDF-file or list them in a dired buffer. -;; -;; * Outline -;; Use imenu or a special buffer to examine and navigate the PDF's -;; outline. -;; -;; * SyncTeX -;; Jump from a position on a page directly to the TeX source and -;; vice-versa. -;; -;; * Misc -;; + Display PDF's metadata. -;; + Mark a region and kill the text from the PDF. -;; + Search for occurrences of a string. -;; + Keep track of visited pages via a history. - -;;; Code: - -(require 'pdf-view) -(require 'pdf-util) -(require 'pdf-info) -(require 'cus-edit) -(require 'compile) -(require 'cl-lib) -(require 'package) - - - -;; * ================================================================== * -;; * Customizables -;; * ================================================================== * - -(defgroup pdf-tools nil - "Support library for PDF documents." - :group 'data) - -(defgroup pdf-tools-faces nil - "Faces determining the colors used in the pdf-tools package. - -In order to customize dark and light colors use -`pdf-tools-customize-faces', or set `custom-face-default-form' to -'all." - :group 'pdf-tools) - -(defconst pdf-tools-modes - '(pdf-history-minor-mode - pdf-isearch-minor-mode - pdf-links-minor-mode - pdf-misc-minor-mode - pdf-outline-minor-mode - pdf-misc-size-indication-minor-mode - pdf-misc-menu-bar-minor-mode - pdf-annot-minor-mode - pdf-sync-minor-mode - pdf-misc-context-menu-minor-mode - pdf-cache-prefetch-minor-mode - pdf-view-auto-slice-minor-mode - pdf-occur-global-minor-mode - pdf-virtual-global-minor-mode)) - -(defcustom pdf-tools-enabled-modes - '(pdf-history-minor-mode - pdf-isearch-minor-mode - pdf-links-minor-mode - pdf-misc-minor-mode - pdf-outline-minor-mode - pdf-misc-size-indication-minor-mode - pdf-misc-menu-bar-minor-mode - pdf-annot-minor-mode - pdf-sync-minor-mode - pdf-misc-context-menu-minor-mode - pdf-cache-prefetch-minor-mode - pdf-occur-global-minor-mode - ;; pdf-virtual-global-minor-mode - ) - "A list of automatically enabled minor-modes. - -PDF Tools is build as a series of minor-modes. This variable and -the function `pdf-tools-install' merely serve as a convenient -wrapper in order to load these modes in current and newly created -PDF buffers." - :group 'pdf-tools - :type `(set ,@(mapcar (lambda (mode) - `(function-item ,mode)) - pdf-tools-modes))) - -(defcustom pdf-tools-enabled-hook nil - "A hook ran after PDF Tools is enabled in a buffer." - :group 'pdf-tools - :type 'hook) - -(defconst pdf-tools-auto-mode-alist-entry - '("\\.[pP][dD][fF]\\'" . pdf-view-mode) - "The entry to use for `auto-mode-alist'.") - -(defconst pdf-tools-magic-mode-alist-entry - '("%PDF" . pdf-view-mode) - "The entry to use for `magic-mode-alist'.") - -(defun pdf-tools-customize () - "Customize Pdf Tools." - (interactive) - (customize-group 'pdf-tools)) - -(defun pdf-tools-customize-faces () - "Customize PDF Tool's faces." - (interactive) - (let ((buffer (format "*Customize Group: %s*" - (custom-unlispify-tag-name 'pdf-tools-faces)))) - (when (buffer-live-p (get-buffer buffer)) - (with-current-buffer (get-buffer buffer) - (rename-uniquely))) - (customize-group 'pdf-tools-faces) - (with-current-buffer buffer - (set (make-local-variable 'custom-face-default-form) 'all)))) - - -;; * ================================================================== * -;; * Installation -;; * ================================================================== * - -;;;###autoload -(defcustom pdf-tools-handle-upgrades t - "Whether PDF Tools should handle upgrading itself." - :group 'pdf-tools - :type 'boolean) - -(make-obsolete-variable 'pdf-tools-handle-upgrades - "Not used anymore" "0.90") - -(defconst pdf-tools-directory - (or (and load-file-name - (file-name-directory load-file-name)) - default-directory) - "The directory from where this library was first loaded.") - -(defvar pdf-tools-msys2-directory nil) - -(defcustom pdf-tools-installer-os nil - "Specifies which installer to use. - -If nil the installer is chosen automatically. This variable is -useful if you have multiple installers present on your -system (e.g. nix on arch linux)" - :group 'pdf-tools - :type 'string) - -(defun pdf-tools-identify-build-directory (directory) - "Return non-nil, if DIRECTORY appears to contain the epdfinfo source. - -Returns the expanded directory-name of DIRECTORY or nil." - (setq directory (file-name-as-directory - (expand-file-name directory))) - (and (file-exists-p (expand-file-name "autobuild" directory)) - (file-exists-p (expand-file-name "epdfinfo.c" directory)) - directory)) - -(defun pdf-tools-locate-build-directory () - "Attempt to locate a source directory. - -Returns a appropriate directory or nil. See also -`pdf-tools-identify-build-directory'." - (cl-some #'pdf-tools-identify-build-directory - (list default-directory - (expand-file-name "build/server" pdf-tools-directory) - (expand-file-name "server") - (expand-file-name "../server" pdf-tools-directory)))) - -(defun pdf-tools-msys2-directory (&optional noninteractive-p) - "Locate the Msys2 installation directory. - -Ask the user if necessary and NONINTERACTIVE-P is nil. -Returns always nil, unless `system-type' equals windows-nt." - (cl-labels ((if-msys2-directory (directory) - (and (stringp directory) - (file-directory-p directory) - (file-exists-p - (expand-file-name "usr/bin/bash.exe" directory)) - directory))) - (when (eq system-type 'windows-nt) - (setq pdf-tools-msys2-directory - (or pdf-tools-msys2-directory - (cl-some #'if-msys2-directory - (cl-mapcan - (lambda (drive) - (list (format "%c:/msys64" drive) - (format "%c:/msys32" drive))) - (number-sequence ?c ?z))) - (unless (or noninteractive-p - (not (y-or-n-p "Do you have Msys2 installed ? "))) - (if-msys2-directory - (read-directory-name - "Please enter Msys2 installation directory: " nil nil t)))))))) - -(defun pdf-tools-msys2-mingw-bin () - "Return the location of /mingw*/bin." - (when (pdf-tools-msys2-directory) - (let ((arch (intern (car (split-string system-configuration "-" t))))) - (expand-file-name - (format "./mingw%s/bin" (if (eq arch 'x86_64) "64" "32")) - (pdf-tools-msys2-directory))))) - -(defun pdf-tools-find-bourne-shell () - "Locate a usable sh." - (or (and (eq system-type 'windows-nt) - (let* ((directory (pdf-tools-msys2-directory))) - (when directory - (expand-file-name "usr/bin/bash.exe" directory)))) - (executable-find "sh"))) - -(defun pdf-tools-build-server (target-directory - &optional - skip-dependencies-p - force-dependencies-p - callback - build-directory) - "Build the epdfinfo program in the background. - -Install into TARGET-DIRECTORY, which should be a directory. - -If CALLBACK is non-nil, it should be a function. It is called -with the compiled executable as the single argument or nil, if -the build failed. - -Expect sources to be in BUILD-DIRECTORY. If nil, search for it -using `pdf-tools-locate-build-directory'. - -See `pdf-tools-install' for the SKIP-DEPENDENCIES-P and -FORCE-DEPENDENCIES-P arguments. - -Returns the buffer of the compilation process." - - (unless callback (setq callback #'ignore)) - (unless build-directory - (setq build-directory (pdf-tools-locate-build-directory))) - (cl-check-type target-directory file-directory) - (setq target-directory (file-name-as-directory - (expand-file-name target-directory))) - (cl-check-type build-directory (and (not null) file-directory)) - (when (and skip-dependencies-p force-dependencies-p) - (error "Can't simultaneously skip and force dependencies")) - (let* ((compilation-auto-jump-to-first-error nil) - (compilation-scroll-output t) - (shell-file-name (pdf-tools-find-bourne-shell)) - (shell-command-switch "-c") - (process-environment process-environment) - (default-directory build-directory) - (autobuild (shell-quote-argument - (expand-file-name "autobuild" build-directory))) - (msys2-p (equal "bash.exe" (file-name-nondirectory shell-file-name)))) - (unless shell-file-name - (error "No suitable shell found")) - (when msys2-p - (push "BASH_ENV=/etc/profile" process-environment)) - (let ((executable - (expand-file-name - (concat "epdfinfo" (and (eq system-type 'windows-nt) ".exe")) - target-directory)) - (compilation-buffer - (compilation-start - (format "%s -i %s%s%s" - autobuild - (shell-quote-argument target-directory) - (cond - (skip-dependencies-p " -D") - (force-dependencies-p " -d") - (t "")) - (if pdf-tools-installer-os (concat " --os " pdf-tools-installer-os) "")) - t))) - ;; In most cases user-input is required, so select the window. - (if (get-buffer-window compilation-buffer) - (select-window (get-buffer-window compilation-buffer)) - (pop-to-buffer compilation-buffer)) - (with-current-buffer compilation-buffer - (setq-local compilation-error-regexp-alist nil) - (add-hook 'compilation-finish-functions - (lambda (_buffer status) - (funcall callback - (and (equal status "finished\n") - executable))) - nil t) - (current-buffer))))) - - -;; * ================================================================== * -;; * Initialization -;; * ================================================================== * - -;;;###autoload -(defun pdf-tools-install (&optional no-query-p skip-dependencies-p - no-error-p force-dependencies-p) - "Install PDF-Tools in all current and future PDF buffers. - -If the `pdf-info-epdfinfo-program' is not running or does not -appear to be working, attempt to rebuild it. If this build -succeeded, continue with the activation of the package. -Otherwise fail silently, i.e. no error is signaled. - -Build the program (if necessary) without asking first, if -NO-QUERY-P is non-nil. - -Don't attempt to install system packages, if SKIP-DEPENDENCIES-P -is non-nil. - -Do not signal an error in case the build failed, if NO-ERROR-P is -non-nil. - -Attempt to install system packages (even if it is deemed -unnecessary), if FORCE-DEPENDENCIES-P is non-nil. - -Note that SKIP-DEPENDENCIES-P and FORCE-DEPENDENCIES-P are -mutually exclusive. - -Note further, that you can influence the installation directory -by setting `pdf-info-epdfinfo-program' to an appropriate -value (e.g. ~/bin/epdfinfo) before calling this function. - -See `pdf-view-mode' and `pdf-tools-enabled-modes'." - (interactive) - (if (or (pdf-info-running-p) - (ignore-errors (pdf-info-check-epdfinfo) t)) - (pdf-tools-install-noverify) - (let ((target-directory - (or (and (stringp pdf-info-epdfinfo-program) - (file-name-directory - pdf-info-epdfinfo-program)) - pdf-tools-directory))) - (if (or no-query-p - (y-or-n-p "Need to (re)build the epdfinfo program, do it now ?")) - (pdf-tools-build-server - target-directory - skip-dependencies-p - force-dependencies-p - (lambda (executable) - (let ((msg (format - "Building the PDF Tools server %s" - (if executable "succeeded" "failed")))) - (if (not executable) - (funcall (if no-error-p #'message #'error) "%s" msg) - (message "%s" msg) - (setq pdf-info-epdfinfo-program executable) - (let ((pdf-info-restart-process-p t)) - (pdf-tools-install-noverify)))))) - (message "PDF Tools not activated"))))) - -(defun pdf-tools-install-noverify () - "Like `pdf-tools-install', but skip checking `pdf-info-epdfinfo-program'." - (add-to-list 'auto-mode-alist pdf-tools-auto-mode-alist-entry) - (add-to-list 'magic-mode-alist pdf-tools-magic-mode-alist-entry) - ;; FIXME: Generalize this sometime. - (when (memq 'pdf-occur-global-minor-mode - pdf-tools-enabled-modes) - (pdf-occur-global-minor-mode 1)) - (when (memq 'pdf-virtual-global-minor-mode - pdf-tools-enabled-modes) - (pdf-virtual-global-minor-mode 1)) - (add-hook 'pdf-view-mode-hook 'pdf-tools-enable-minor-modes) - (dolist (buf (buffer-list)) - (with-current-buffer buf - (when (and (not (derived-mode-p 'pdf-view-mode)) - (pdf-tools-pdf-buffer-p) - (buffer-file-name)) - (pdf-view-mode))))) - -(defun pdf-tools-uninstall () - "Uninstall PDF-Tools in all current and future PDF buffers." - (interactive) - (pdf-info-quit) - (setq-default auto-mode-alist - (remove pdf-tools-auto-mode-alist-entry auto-mode-alist)) - (setq-default magic-mode-alist - (remove pdf-tools-magic-mode-alist-entry magic-mode-alist)) - (pdf-occur-global-minor-mode -1) - (pdf-virtual-global-minor-mode -1) - (remove-hook 'pdf-view-mode-hook 'pdf-tools-enable-minor-modes) - (dolist (buf (buffer-list)) - (with-current-buffer buf - (when (pdf-util-pdf-buffer-p buf) - (pdf-tools-disable-minor-modes pdf-tools-modes) - (normal-mode))))) - -(defun pdf-tools-pdf-buffer-p (&optional buffer) - "Return non-nil if BUFFER contains a PDF document." - (save-current-buffer - (when buffer (set-buffer buffer)) - (save-excursion - (save-restriction - (widen) - (goto-char 1) - (looking-at "%PDF"))))) - -(defun pdf-tools-assert-pdf-buffer (&optional buffer) - (unless (pdf-tools-pdf-buffer-p buffer) - (error "Buffer does not contain a PDF document"))) - -(defun pdf-tools-set-modes-enabled (enable &optional modes) - (dolist (m (or modes pdf-tools-enabled-modes)) - (let ((enabled-p (and (boundp m) - (symbol-value m)))) - (unless (or (and enabled-p enable) - (and (not enabled-p) (not enable))) - (funcall m (if enable 1 -1)))))) - -;;;###autoload -(defun pdf-tools-enable-minor-modes (&optional modes) - "Enable MODES in the current buffer. - -MODES defaults to `pdf-tools-enabled-modes'." - (interactive) - (pdf-util-assert-pdf-buffer) - (pdf-tools-set-modes-enabled t modes) - (run-hooks 'pdf-tools-enabled-hook)) - -(defun pdf-tools-disable-minor-modes (&optional modes) - "Disable MODES in the current buffer. - -MODES defaults to `pdf-tools-enabled-modes'." - (interactive) - (pdf-tools-set-modes-enabled nil modes)) - -(declare-function pdf-occur-global-minor-mode "pdf-occur.el") -(declare-function pdf-virtual-global-minor-mode "pdf-virtual.el") - -;;;###autoload -(defun pdf-tools-help () - (interactive) - (help-setup-xref (list #'pdf-tools-help) - (called-interactively-p 'interactive)) - (with-help-window (help-buffer) - (princ "PDF Tools Help\n\n") - (princ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n") - (dolist (m (cons 'pdf-view-mode - (sort (copy-sequence pdf-tools-modes) 'string<))) - (princ (format "`%s' is " m)) - (describe-function-1 m) - (terpri) (terpri) - (princ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")))) - - -;; * ================================================================== * -;; * Debugging -;; * ================================================================== * - -(defvar pdf-tools-debug nil - "Non-nil, if debugging PDF Tools.") - -(defun pdf-tools-toggle-debug () - (interactive) - (setq pdf-tools-debug (not pdf-tools-debug)) - (when (called-interactively-p 'any) - (message "Toggled debugging %s" (if pdf-tools-debug "on" "off")))) - -(provide 'pdf-tools) - -;;; pdf-tools.el ends here |