;;; evil-collection-pdf.el --- Evil bindings for pdf-tools -*- lexical-binding: t -*- ;; Copyright (C) 2017 Pierre Neidhardt ;; Author: Pierre Neidhardt ;; Maintainer: James Nguyen ;; Pierre Neidhardt ;; URL: https://github.com/emacs-evil/evil-collection ;; Version: 0.0.1 ;; Package-Requires: ((emacs "25.1")) ;; Keywords: evil, pdf, tools ;; This file 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, or (at your ;; option) any later version. ;; ;; This file 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. ;; ;; For a full copy of the GNU General Public License ;; see . ;;; Commentary: ;; Evil bindings for pdf-tools. ;;; Code: (require 'evil-collection) (require 'pdf-tools nil t) (require 'pdf-view nil t) (defconst evil-collection-pdf-maps '(pdf-view-mode-map pdf-outline-buffer-mode-map pdf-occur-buffer-mode-map)) (declare-function pdf-view-last-page "pdf-view") (declare-function pdf-view-first-page "pdf-view") (declare-function pdf-view-goto-page "pdf-view") (declare-function pdf-view-previous-line-or-previous-page "pdf-view") (declare-function pdf-view-next-line-or-next-page "pdf-view") (defvar pdf-view-mode-map) (defvar pdf-outline-buffer-mode-map) (defvar pdf-occur-buffer-mode-map) (defvar pdf-view-mode-map) (defvar pdf-outline-buffer-mode-map) (defvar pdf-occur-buffer-mode-map) ;; TODO: The following 2 functions are workarounds for ;; 'pdf-view-next-line-or-next-page' and ;; 'pdf-view-previous-line-or-previous-page' not playing well with ;; EVIL. The root cause should be found and fixed instead. ;; See https://github.com/emacs-evil/evil-collection/pull/137 for ;; details. (defun evil-collection-pdf-view-next-line-or-next-page (&optional count) "'evil' wrapper include a count argument to `pdf-view-next-line-or-next-page'" (interactive "P") (if count (dotimes (_ count nil) (pdf-view-next-line-or-next-page 1)) (pdf-view-next-line-or-next-page 1))) (defun evil-collection-pdf-view-previous-line-or-previous-page (&optional count) "'evil' wrapper include a count argument to `pdf-view-previous-line-or-previous-page'" (interactive "P") (if count (dotimes (_ count nil) (pdf-view-previous-line-or-previous-page 1)) (pdf-view-previous-line-or-previous-page 1))) (defun evil-collection-pdf-view-goto-page (&optional page) "`evil' wrapper around `pdf-view-last-page'." (interactive "P") (if page (pdf-view-goto-page page) (pdf-view-last-page) (image-eob))) (defun evil-collection-pdf-view-goto-first-page (&optional page) "`evil' wrapper around `pdf-view-first-page'." (interactive "P") (if page (pdf-view-goto-page page) (pdf-view-first-page) (image-bob))) (defun evil-collection-pdf-setup () "Set up `evil' bindings for `pdf-view'." (evil-collection-inhibit-insert-state 'pdf-view-mode-map) (evil-set-initial-state 'pdf-view-mode 'normal) (evil-collection-define-key 'normal 'pdf-view-mode-map ;; motion (kbd "") 'image-next-line "j" 'evil-collection-pdf-view-next-line-or-next-page "k" 'evil-collection-pdf-view-previous-line-or-previous-page (kbd "SPC") 'pdf-view-scroll-up-or-next-page (kbd "S-SPC") 'pdf-view-scroll-down-or-previous-page (kbd "") 'pdf-view-scroll-down-or-previous-page (kbd "C-f") 'pdf-view-scroll-up-or-next-page (kbd "C-b") 'pdf-view-scroll-down-or-previous-page "]" 'pdf-view-next-page-command "[" 'pdf-view-previous-page-command (kbd "C-j") 'pdf-view-next-page-command (kbd "C-k") 'pdf-view-previous-page-command "gj" 'pdf-view-next-page-command "gk" 'pdf-view-previous-page-command (kbd "") 'forward-page (kbd "") 'backward-page (kbd "") 'evil-collection-pdf-view-next-line-or-next-page (kbd "") 'evil-collection-pdf-view-previous-line-or-previous-page "gg" 'evil-collection-pdf-view-goto-first-page "G" 'evil-collection-pdf-view-goto-page ;; mark "'" 'pdf-view-jump-to-register "m" 'pdf-view-position-to-register ;; zoom "+" 'pdf-view-enlarge "zi" 'pdf-view-enlarge "=" 'pdf-view-enlarge "-" 'pdf-view-shrink "zo" 'pdf-view-shrink "0" 'pdf-view-scale-reset "z0" 'pdf-view-scale-reset ;; TODO: Why are those image-* bindings in pdf-tools? "a+" 'image-increase-speed "a-" 'image-decrease-speed "a0" 'image-reset-speed "ar" 'image-reverse-speed "F" 'image-goto-frame "b" 'image-previous-frame "f" 'image-next-frame "h" 'image-backward-hscroll "^" 'image-bol "$" 'image-eol "l" 'image-forward-hscroll "H" 'pdf-view-fit-height-to-window ; evil-image has "H" "P" 'pdf-view-fit-page-to-window "W" 'pdf-view-fit-width-to-window ; evil-image has "W" ;; refresh "gr" 'revert-buffer (kbd "") 'pdf-view-mouse-extend-region (kbd "") 'pdf-view-mouse-set-region-rectangle (kbd "") 'pdf-view-mouse-set-region (kbd "C-c C-c") 'docview-mode (kbd "C-c ") 'pdf-view-extract-region-image "sb" 'pdf-view-set-slice-from-bounding-box "sm" 'pdf-view-set-slice-using-mouse "sr" 'pdf-view-reset-slice ;; goto "gl" 'pdf-view-goto-label ;; search (kbd "M-s o") 'pdf-occur ; TODO: More Evil bindings? "/" 'isearch-forward "?" 'isearch-backward "n" 'isearch-repeat-forward "N" 'isearch-repeat-backward "zd" 'pdf-view-dark-minor-mode "zm" 'pdf-view-midnight-minor-mode "zp" 'pdf-view-printer-minor-mode "o" 'pdf-outline ;; quit "q" 'quit-window "Q" 'kill-this-buffer "ZQ" 'kill-this-buffer "ZZ" 'quit-window) (evil-collection-define-key 'visual 'pdf-view-mode-map "y" 'pdf-view-kill-ring-save) (evil-collection-inhibit-insert-state 'pdf-outline-buffer-mode-map) (evil-set-initial-state 'pdf-outline-buffer-mode 'normal) (evil-collection-define-key 'normal 'pdf-outline-buffer-mode-map ;; open (kbd "") 'pdf-outline-follow-link-and-quit (kbd "S-") 'pdf-outline-follow-link (kbd "M-") 'pdf-outline-display-link "go" 'pdf-outline-follow-link "." 'pdf-outline-move-to-current-page (kbd "SPC") 'pdf-outline-select-pdf-window "G" 'pdf-outline-end-of-buffer "^" 'pdf-outline-up-heading "<" 'pdf-outline-up-heading ; TODO: Don't set this by default? "zf" 'pdf-outline-follow-mode ; Helm has "C-c C-f" in Emacs state. ;; quit (kbd "C-w q") 'pdf-outline-quit-and-kill ; TODO: Do we need to set this? I think not. "q" 'quit-window "ZQ" 'quit-window "ZZ" 'pdf-outline-quit-and-kill) (evil-collection-inhibit-insert-state 'pdf-occur-buffer-mode-map) (evil-set-initial-state 'pdf-occur-buffer-mode 'normal) (evil-collection-define-key 'normal 'pdf-occur-buffer-mode-map ;; open (kbd "") 'pdf-occur-goto-occurrence (kbd "S-") 'pdf-occur-view-occurrence (kbd "SPC") 'pdf-occur-view-occurrence "gd" 'pdf-occur-goto-occurrence "gD" 'pdf-occur-view-occurrence "A" 'pdf-occur-tablist-gather-documents "D" 'pdf-occur-tablist-do-delete ;; sort "o" 'tabulated-list-sort "O" 'tablist-sort ; TODO: Do we need this? ;; refresh "G" 'tablist-revert "K" 'pdf-occur-abort-search ;; mark "*m" 'tablist-mark-forward "m" 'tablist-mark-forward "~" 'tablist-toggle-marks "u" 'tablist-unmark-forward "U" 'tablist-unmark-all-marks "*!" 'tablist-unmark-all-marks "*c" 'tablist-change-marks "*n" 'tablist-mark-items-numeric "*r" 'tablist-mark-items-regexp "%" 'tablist-mark-items-regexp "a" 'tablist-flag-forward ;; "f" 'tablist-find-entry ; TODO: Equivalent to 'pdf-occur-goto-occurrence? "r" 'pdf-occur-revert-buffer-with-args "d" 'tablist-do-kill-lines "x" 'pdf-occur-tablist-do-flagged-delete (kbd "") 'tablist-unmark-backward (kbd "S-SPC") 'scroll-down-command (kbd "") 'tablist-backward-column (kbd "C-c C-e") 'tablist-export-csv [remap evil-first-non-blank] 'tablist-move-to-major-columnj [remap evil-next-line] 'tablist-next-line [remap evil-previous-line] 'tablist-previous-line ;; filter ;; TODO: See if overriding "/" is a good idea. "/!" 'tablist-negate-filter "//" 'tablist-display-filter "/=" 'tablist-push-equal-filter "/C" 'tablist-clear-filter "/D" 'tablist-delete-named-filter "/a" 'tablist-push-named-filter "/d" 'tablist-deconstruct-named-filter "/e" 'tablist-edit-filter "/n" 'tablist-push-numeric-filter "/p" 'tablist-pop-filter "/r" 'tablist-push-regexp-filter "/s" 'tablist-name-current-filter "/t" 'tablist-toggle-first-filter-logic "/z" 'tablist-suspend-filter ;; quit "q" 'tablist-quit "ZQ" 'tablist-quit "ZZ" 'tablist-quit)) (provide 'evil-collection-pdf) ;;; evil-collection-pdf.el ends here