emacs: pdf-tools: convenient history bindings, more gentle resizing
[~bandali/configs] / .emacs.d / init.el
index 82d1afe..c723488 100644 (file)
@@ -425,6 +425,7 @@ For disabling the behaviour for certain buffers and/or modes."
  ("C-c a i" . ielm)
 
  ("C-c e b" . eval-buffer)
+ ("C-c e e" . eval-last-sexp)
  ("C-c e r" . eval-region)
 
  ("C-c e i" . emacs-init-time)
@@ -440,6 +441,8 @@ For disabling the behaviour for certain buffers and/or modes."
 
  ("C-x k"   . kill-this-buffer)
  ("C-x K"   . kill-buffer)
+ ("C-x s"   . save-buffer)
+ ("C-x S"   . save-some-buffers)
 
  :map emacs-lisp-mode-map
  ("<C-return>" . b/add-elisp-section))
@@ -480,8 +483,7 @@ For disabling the behaviour for certain buffers and/or modes."
   (("C-c a o a" . org-agenda)
    :map org-mode-map
    ("M-L" . org-insert-last-stored-link)
-   ("M-O" . org-toggle-link-display)
-   ("s-T" . org-todo))
+   ("M-O" . org-toggle-link-display))
   :hook ((org-mode . org-indent-mode)
          (org-mode . auto-fill-mode)
          (org-mode . flyspell-mode))
@@ -560,14 +562,19 @@ For disabling the behaviour for certain buffers and/or modes."
 ;; *the* right way to do git
 (use-package magit
   :defer 0.5
-  :bind (("C-x g" . magit-status)
-         ("s-g s" . magit-status)
-         ("s-g l" . magit-log-buffer-file))
+  :bind (("C-x g"   . magit-status)
+         ("C-c g g" . magit-status)
+         ("C-c g b" . magit-blame-addition)
+         ("C-c g l" . magit-log-buffer-file))
   :config
   (magit-add-section-hook 'magit-status-sections-hook
                           'magit-insert-modules
                           'magit-insert-stashes
                           'append)
+  ;; (magit-add-section-hook 'magit-status-sections-hook
+  ;;                         'magit-insert-ignored-files
+  ;;                         'magit-insert-untracked-files
+  ;;                         'append)
   (setq magit-repository-directories '(("~/" . 0)
                                        ("~/src/git/" . 1)))
   (nconc magit-section-initial-visibility-alist
@@ -608,6 +615,19 @@ For disabling the behaviour for certain buffers and/or modes."
         ivy-use-virtual-buffers t
         ivy-virtual-abbreviate 'abbreviate
         ivy-count-format "%d/%d ")
+
+  (defvar b/ivy-ignore-buffer-modes '(magit-mode erc-mode dired-mode))
+  (defun b/ivy-ignore-buffer-p (str)
+    "Return non-nil if str names a buffer with a major mode
+derived from one of `b/ivy-ignore-buffer-modes'.
+
+This function is intended for use with `ivy-ignore-buffers'."
+    (let* ((buf (get-buffer str))
+           (mode (and buf (buffer-local-value 'major-mode buf))))
+      (and mode
+           (apply #'provided-mode-derived-p mode b/ivy-ignore-buffer-modes))))
+  (add-to-list 'ivy-ignore-buffers 'b/ivy-ignore-buffer-p)
+
   (ivy-mode 1)
   ;; :custom-face
   ;; (ivy-minibuffer-match-face-2 ((t (:background "#e99ce8" :weight semi-bold))))
@@ -626,12 +646,11 @@ For disabling the behaviour for certain buffers and/or modes."
   :delight
   :bind (([remap execute-extended-command] . counsel-M-x)
          ([remap find-file]                . counsel-find-file)
-         ("C-c x"                          . counsel-M-x)
+         ("C-c b b"                        . ivy-switch-buffer)
          ("C-c f ."                        . counsel-find-file)
          ("C-c f l"                        . counsel-find-library)
          ("C-c f r"                        . counsel-recentf)
-         ("s-."                            . counsel-find-file)
-         ("s-r"                            . ivy-switch-buffer)
+         ("C-c x"                          . counsel-M-x)
          :map minibuffer-local-map
          ("C-r" . counsel-minibuffer-history))
   :config
@@ -647,7 +666,6 @@ For disabling the behaviour for certain buffers and/or modes."
            ("C-x C-b" . helm-buffers-list)
            ("C-x C-f" . helm-find-files)
            ("C-h r"   . helm-info-emacs)
-           ("s-r"     . helm-recentf)
            ("C-s-r"   . helm-resume)
            :map helm-map
            ("<tab>" . helm-execute-persistent-action)
@@ -764,6 +782,7 @@ For disabling the behaviour for certain buffers and/or modes."
   :hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default"))))
 
 (use-package outline
+  :disabled
   :hook (prog-mode . outline-minor-mode)
   :delight (outline-minor-mode " outl")
   :bind
@@ -1165,7 +1184,10 @@ For disabling the behaviour for certain buffers and/or modes."
   :config
   (cl-delete-if
    (lambda (p) (string-match "^---?" (car p)))
-   tex--prettify-symbols-alist))
+   tex--prettify-symbols-alist)
+  :hook ((tex-mode . auto-fill-mode)
+         (tex-mode . flyspell-mode)
+         (tex-mode . (lambda () (electric-indent-local-mode -1)))))
 
 \f
 ;;; Theme
@@ -1211,8 +1233,8 @@ For disabling the behaviour for certain buffers and/or modes."
    'org-mode b/org-mode-font-lock-keywords t))
 
 (bind-keys
- ("s-t d" . b/lights-off)
- ("s-t l" . b/lights-on))
+ ("C-c t d" . b/lights-off)
+ ("C-c t l" . b/lights-on))
 
 \f
 ;;; Emacs enhancements & auxiliary packages
@@ -1241,15 +1263,12 @@ For disabling the behaviour for certain buffers and/or modes."
     "C-c a e" "erc"
     "C-c a o" "org"
     "C-c a s" "shells"
-    "C-c p"   "package-management"
-    ;; "C-c p e" "package-management/epkg"
-    "C-c p s" "straight.el"
-    "C-c psa" "all"
-    "C-c psp" "package"
+    "C-c b"   "buffers"
     "C-c c"   "compile-and-comments"
     "C-c e"   "eval"
     "C-c f"   "files"
     "C-c F"   "frames"
+    "C-c g"   "magit"
     "C-S-h"   "help(ful)"
     "C-c m"   "multiple-cursors"
     "C-c P"   "projectile"
@@ -1257,9 +1276,9 @@ For disabling the behaviour for certain buffers and/or modes."
     "C-c P x" "projectile/execute"
     "C-c P 4" "projectile/other-window"
     "C-c q"   "boxquote"
-    "s-g"     "magit"
-    "s-O"     "outline"
-    "s-t"     "themes")
+    "C-c t"   "themes"
+    ;; "s-O"     "outline"
+    )
 
   ;; prefixes for major modes
   (which-key-add-major-mode-key-based-replacements 'message-mode
@@ -1280,8 +1299,7 @@ For disabling the behaviour for certain buffers and/or modes."
 
 (use-package crux            ; results in Waiting for git... [2 times]
   :defer 0.4
-  :bind (("C-c b k" . crux-kill-other-buffers)
-         ("C-c d"   . crux-duplicate-current-line-or-region)
+  :bind (("C-c d"   . crux-duplicate-current-line-or-region)
          ("C-c D"   . crux-duplicate-and-comment-current-line-or-region)
          ("C-c f c" . crux-copy-file-preserve-attributes)
          ("C-c f d" . crux-delete-file-and-buffer)
@@ -1386,7 +1404,8 @@ For disabling the behaviour for certain buffers and/or modes."
   :delight " typo"
   :config
   (typo-global-mode 1)
-  :hook ((text-mode erc-mode) . typo-mode))
+  :hook (((text-mode erc-mode) . typo-mode)
+         (tex-mode             . (lambda ()(typo-mode -1)))))
 
 ;; highlight TODOs in buffers
 (use-package hl-todo
@@ -1504,6 +1523,16 @@ For disabling the behaviour for certain buffers and/or modes."
   (add-to-list 'yas-snippet-dirs "~/src/git/guix/etc/snippets" t)
   (yas-reload-all)
   (setq yas-verbosity yas-verbosity-cur)
+
+  (defun b/yas--maybe-expand-key-filter (cmd)
+    (when (and (yas--maybe-expand-key-filter cmd)
+               (not (bound-and-true-p git-commit-mode)))
+      cmd))
+  (defconst b/yas-maybe-expand
+    '(menu-item "" yas-expand :filter b/yas--maybe-expand-key-filter))
+  (define-key yas-minor-mode-map
+    (kbd "SPC") b/yas-maybe-expand)
+
   (yas-global-mode))
 
 (use-package debbugs)
@@ -1531,25 +1560,25 @@ For disabling the behaviour for certain buffers and/or modes."
 
 (use-package window
   :bind
-  (("s-o"   . other-window)
-   ("s-/ ." . split-window-right)
-   ("s-/ ," . split-window-below)
-   ("s-/ 0" . delete-window)
-   ("s-q"   . delete-window))
+  (("C-c w <right>" . split-window-right)
+   ("C-c w <down>"  . split-window-below)
+   ("C-c w s l"     . split-window-right)
+   ("C-c w s j"     . split-window-below)
+   ("C-c w q"       . quit-window))
   :custom
   (split-width-threshold 150))
 
 (use-package windmove
   :defer 0.6
   :bind
-  (("s-h" . windmove-left)
-   ("s-j" . windmove-down)
-   ("s-k" . windmove-up)
-   ("s-l" . windmove-right)
-   ("s-H" . windmove-swap-states-left)
-   ("s-J" . windmove-swap-states-down)
-   ("s-K" . windmove-swap-states-up)
-   ("s-L" . windmove-swap-states-right)))
+  (("C-c w h" . windmove-left)
+   ("C-c w j" . windmove-down)
+   ("C-c w k" . windmove-up)
+   ("C-c w l" . windmove-right)
+   ("C-c w H" . windmove-swap-states-left)
+   ("C-c w J" . windmove-swap-states-down)
+   ("C-c w K" . windmove-swap-states-up)
+   ("C-c w L" . windmove-swap-states-right)))
 
 (use-package pass
   :commands pass
@@ -1559,11 +1588,31 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-package pdf-tools
   :defer 0.5
   :bind (:map pdf-view-mode-map
-              ("M-RET" . image-previous-line))
-  :config (pdf-tools-install nil t))
+              ("<XF86Back>"    . pdf-history-backward)
+              ("<XF86Forward>" . pdf-history-forward)
+              ("M-RET"         . image-previous-line))
+  :config (pdf-tools-install nil t)
+  :custom (pdf-view-resize-factor 1.05))
 
 (use-package biblio)
 
+(use-package reftex
+  :hook (latex-mode . reftex-mode))
+
+(use-package reftex-cite
+  :after reftex
+  :disabled                             ; enable to disable
+                                        ; reftex-cite's default choice
+                                        ; of previous word
+  :config
+  (defun reftex-get-bibkey-default ()
+    "If the cursor is in a citation macro, return the word before the macro."
+    (let* ((macro (reftex-what-macro 1)))
+      (save-excursion
+        (when (and macro (string-match "cite" (car macro)))
+          (goto-char (cdr macro)))
+        (reftex-this-word)))))
+
 \f
 ;;; Email (with Gnus)
 
@@ -1577,8 +1626,10 @@ For disabling the behaviour for certain buffers and/or modes."
  read-mail-command 'gnus)
 
 (use-package gnus
-  :bind (("s-m"   . gnus)
-         ("s-M"   . gnus-unplugged))
+  :bind (("s-m"     . gnus)
+         ("s-M"     . gnus-unplugged)
+         ("C-c a m" . gnus)
+         ("C-c a M" . gnus-unplugged))
   :init
   (setq
    gnus-select-method '(nnnil "")
@@ -1630,8 +1681,8 @@ For disabling the behaviour for certain buffers and/or modes."
              (nnimap-split-fancy (|
                                   ;; (: gnus-registry-split-fancy-with-parent)
                                   ;; se212-f19
-                                  ("subject" "SE\\s-?212" "course.se463-s19")
-                                  (from "SE\\s-?212" "course.se463-s19")
+                                  ("subject" "SE\\s-?212" "course.se212-f19")
+                                  (from "SE\\s-?212" "course.se212-f19")
                                   ;; catch-all
                                   "INBOX")))
      (nnimap "csc"
@@ -2062,7 +2113,7 @@ https://csclub.uwaterloo.ca/~abandali")
 ;;; IRC (with ERC and ZNC)
 
 (use-package erc
-  :bind (("C-c a e b" . erc-switch-to-buffer)
+  :bind (("C-c b e" . erc-switch-to-buffer)
          :map erc-mode-map
          ("M-a" . erc-track-switch-buffer))
   :custom
@@ -2074,9 +2125,6 @@ https://csclub.uwaterloo.ca/~abandali")
   (erc-server-reconnect-attempts 5)
   (erc-server-reconnect-timeout 3)
   :config
-  (with-eval-after-load 'ivy
-    ;; ignore channel buffer names
-    (add-to-list 'ivy-ignore-buffers "^#"))
   (defun erc-cmd-OPME ()
     "Request chanserv to op me."
     (erc-message "PRIVMSG"
@@ -2179,6 +2227,8 @@ updates of `erc-lurker-state'."
 
 (use-package erc-track
   :after erc
+  :bind (("C-c a e t d" . erc-track-disable)
+         ("C-c a e t e" . erc-track-enable))
   :custom
   (erc-track-enable-keybindings nil)
   (erc-track-exclude-types '("JOIN" "MODE" "NICK" "PART" "QUIT"