[emacs,rc] Gnus + Isync + Dovecot configs, notmuch-emacs phase out
[~bandali/configs] / init.org
index e4c7a1e..8de3fb8 100644 (file)
--- a/init.org
+++ b/init.org
@@ -324,6 +324,12 @@ it it's own file. While at it, treat themes as safe.
   (setf custom-safe-themes t))
 #+end_src
 
+** Secrets file
+
+#+begin_src emacs-lisp
+(load (no-littering-expand-etc-file-name "secrets"))
+#+end_src
+
 ** Better =$PATH= handling
 
 Let's use [[https://github.com/purcell/exec-path-from-shell][exec-path-from-shell]] to make Emacs use the =$PATH= as set up
@@ -642,14 +648,20 @@ Enable =winner-mode=.
 #+begin_src emacs-lisp
 (bind-keys
  ("C-c b k" . kill-this-buffer)
- ("C-c s s" . save-buffer)
  ("C-c b s" . save-buffer)
  ("C-c S"   . save-buffer)
  ("C-c o"   . other-window)
  ("C-c q q" . save-buffers-kill-terminal)
+
  ("C-c F m" . make-frame-command)
  ("C-c F d" . delete-frame)
- ("C-c F D" . delete-other-frames))
+ ("C-c F D" . delete-other-frames)
+
+ ("s-c e b" . eval-buffer)
+ ("s-c e r" . eval-region)
+
+ ("s-p"     . beginning-of-buffer)
+ ("s-n"     . end-of-buffer))
 #+end_src
 
 ** Packages
@@ -701,7 +713,9 @@ In short, my favourite way of life.
 
 (use-package ox-latex
   :config
-  (setq org-latex-listings 'listings)
+  (setq org-latex-listings 'listings
+        ;; org-latex-prefer-user-labels t
+        )
   (add-to-list 'org-latex-packages-alist '("" "listings"))
   (add-to-list 'org-latex-packages-alist '("" "color"))
   (add-to-list 'org-latex-classes
@@ -715,10 +729,8 @@ In short, my favourite way of life.
 
 (use-package ox-beamer)
 
-(use-package org-notmuch
-  :after (:any org notmuch))
-
-(use-package orgalist)
+(use-package orgalist
+  :hook (message-mode . orgalist-mode))
 #+end_src
 
 **** asynchronous tangle
@@ -781,8 +793,7 @@ Not just how I do git, but /the/ way to do git.
 (use-package magit
   :defer t
   :bind
-  (("s-g"   . magit-dispatch-popup)
-   ("C-x g" . magit-status)
+  (("s-g" . magit-status)
    :prefix-map amin--magit-prefix-map
    :prefix "C-c g"
    ("SPC" . magit-status)
@@ -934,7 +945,10 @@ There's no way I could top that, so I won't attempt to.
       ("emacs"
        (or
         (name . "^\\*scratch\\*$")
-        (name . "^\\*Messages\\*$"))))))
+        (name . "^\\*Messages\\*$")))
+      ("slack"
+       (or
+        (name . "^\\*Slack*"))))))
   (ibuffer-formats
    '((mark modified read-only locked " "
            (name 18 18 :left :elide)
@@ -958,8 +972,8 @@ There's no way I could top that, so I won't attempt to.
   (:map
    outline-minor-mode-map
    ("<s-tab>"  . outline-toggle-children)
-   ("s-p"      . outline-previous-visible-heading)
-   ("s-n"      . outline-next-visible-heading)
+   ("M-p"      . outline-previous-visible-heading)
+   ("M-n"      . outline-next-visible-heading)
    :prefix-map amin--outline-prefix-map
    :prefix "s-o"
    ("TAB" . outline-toggle-children)
@@ -1082,6 +1096,10 @@ TODO: break this giant source block down into individual org sections.
 #+begin_src emacs-lisp
 (use-package flycheck
   :hook (prog-mode . flycheck-mode)
+  :bind
+  (:map flycheck-mode-map
+        ("M-P" . flycheck-previous-error)
+        ("M-N" . flycheck-next-error))
   :config
   ;; Use the load-path from running Emacs when checking elisp files
   (setq flycheck-emacs-lisp-load-path 'inherit)
@@ -1378,6 +1396,70 @@ instead.
   :mode "\\.nix\\'")
 #+end_src
 
+** Java
+
+*** meghanada
+
+#+begin_src emacs-lisp :tangle yes
+(use-package meghanada
+  :bind
+  (:map meghanada-mode-map
+        (("C-M-o" . meghanada-optimize-import)
+         ("C-M-t" . meghanada-import-all)))
+  :hook (java-mode . meghanada-mode))
+#+end_src
+
+*** lsp-java
+
+#+begin_src emacs-lisp :tangle no
+(use-package treemacs)
+
+(use-package yasnippet
+  :config
+  ;; (yas-global-mode)
+  )
+
+(use-package lsp-mode
+  :init (setq lsp-eldoc-render-all nil
+              lsp-highlight-symbol-at-point nil)
+  )
+
+(use-package hydra)
+
+(use-package company-lsp
+  :after  company
+  :config
+  (setq company-lsp-cache-candidates t
+        company-lsp-async t))
+
+(use-package lsp-ui
+  :config
+  (setq lsp-ui-sideline-update-mode 'point))
+
+(use-package lsp-java
+  :config
+  (add-hook 'java-mode-hook
+           (lambda ()
+             (setq-local company-backends (list 'company-lsp))))
+
+  (add-hook 'java-mode-hook 'lsp-java-enable)
+  (add-hook 'java-mode-hook 'flycheck-mode)
+  (add-hook 'java-mode-hook 'company-mode)
+  (add-hook 'java-mode-hook 'lsp-ui-mode))
+
+(use-package dap-mode
+  :after lsp-mode
+  :config
+  (dap-mode t)
+  (dap-ui-mode t))
+
+(use-package dap-java
+  :after (lsp-java))
+
+(use-package lsp-java-treemacs
+  :after (treemacs))
+#+end_src
+
 * Emacs Enhancements
 
 ** [[https://github.com/justbur/emacs-which-key][which-key]]
@@ -1458,12 +1540,23 @@ Emacs package that displays available keybindings in popup
 #+begin_src emacs-lisp
 (use-package helpful
   :bind
-  (("C-h f"   . helpful-callable)
+  (;; ("C-h F"   . helpful-function)
+   ("C-h f"   . helpful-callable)
    ("C-h v"   . helpful-variable)
    ("C-h k"   . helpful-key)
    ("C-c C-d" . helpful-at-point)
-   ("C-h F"   . helpful-function)
-   ("C-h C"   . helpful-command)))
+   ("C-h C"   . helpful-command)
+   ("C-h c"   . describe-char)
+   ("C-h F"   . describe-face)))
+
+(use-package help
+  :bind
+  (("C-S-h f" . describe-function)
+   ("C-S-h v" . describe-variable)
+   ("C-S-h k" . describe-key)
+   ("C-S-h C" . describe-coding-system)
+   ("C-S-h c" . describe-key-briefly))
+  :config (setq help-window-select t))
 #+end_src
 
 ** [[https://github.com/kyagi/shell-pop-el][shell-pop]]
@@ -1546,13 +1639,17 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 #+begin_src emacs-lisp
 (use-package pdf-tools
   :magic ("%PDF" . pdf-view-mode)
-  :config (pdf-tools-install)
+  :config
+  (setq pdf-view-resize-factor 1.05)
+  (pdf-tools-install)
   :bind
   (:map pdf-view-mode-map
         ("C-s" . isearch-forward)
         ("C-r" . isearch-backward)
         ("j"   . pdf-view-next-line-or-next-page)
-        ("k"   . pdf-view-previous-line-or-previous-page)))
+        ("k"   . pdf-view-previous-line-or-previous-page)
+        ("h"   . image-backward-hscroll)
+        ("l"   . image-forward-hscroll)))
 #+end_src
 
 ** anzu
@@ -1570,6 +1667,68 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
   :hook (text-mode . typo-mode))
 #+end_src
 
+** slack
+
+Hopefully temporary.
+
+#+begin_src emacs-lisp
+(use-package slack
+  :commands (slack-start)
+  :init
+  (eval-when-compile                    ; silence the byte-compiler
+    (defvar url-http-data nil)
+    (defvar url-http-extra-headers nil)
+    (defvar url-http-method nil)
+    (defvar url-callback-function nil)
+    (defvar url-callback-arguments nil)
+    (defvar oauth--token-data nil))
+  (setq slack-buffer-emojify t
+        slack-prefer-current-team t)
+  :config
+  (slack-register-team
+   :name "uw-apv"
+   :default t
+   :client-id uw-apv-client-id
+   :client-secret uw-apv-client-secret
+   :token uw-apv-token
+   :subscribed-channels '(general)
+   :full-and-display-names t)
+  (slack-register-team
+   :name "watform"
+   :default nil
+   :client-id watform-client-id
+   :client-secret watform-client-secret
+   :token watform-token
+   :subscribed-channels '(general)
+   :full-and-display-names t)
+  (add-to-list 'swiper-font-lock-exclude 'slack-message-buffer-mode t)
+  :bind
+  (("C-c s s" . slack-start)
+   ("C-c s u" . slack-select-unread-rooms)
+   ("C-c s b" . slack-select-rooms)
+   ("C-c s t" . slack-change-current-team)
+   ("C-c s c" . slack-ws-close)
+   :map slack-mode-map
+   ("M-p"     . slack-buffer-goto-prev-message)
+   ("M-n"     . slack-buffer-goto-next-message)
+   ("C-c e"   . slack-message-edit)
+   ("C-c k"   . slack-message-delete)
+   ("C-c C-k" . slack-channel-leave)
+   ("C-c r a" . slack-message-add-reaction)
+   ("C-c r r" . slack-message-remove-reaction)
+   ("C-c r s" . slack-message-show-reaction-users)
+   ("C-c p l" . slack-room-pins-list)
+   ("C-c p a" . slack-message-pins-add)
+   ("C-c p r" . slack-message-pins-remove)
+   ("@"       . slack-message-embed-mention)
+   ("#"       . slack-message-embed-channel)))
+
+(use-package alert
+  :commands (alert)
+  :init
+  (setq alert-default-style 'notifier))
+#+end_src
+
 * Email
 
 #+begin_src emacs-lisp
@@ -1578,6 +1737,91 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
   (add-to-list 'recentf-exclude amin-maildir))
 #+end_src
 
+** Gnus
+
+#+begin_src emacs-lisp :tangle yes
+(setq amin-gnus-init-file (no-littering-expand-etc-file-name "gnus"))
+
+(use-package gnus
+  :bind ("s-m" . gnus)
+  :init
+  (setq
+   gnus-select-method
+   '(nnimap "amin"
+            (nnimap-stream plain)
+            (nnimap-address "127.0.0.1")
+            (nnimap-server-port 143)
+            (nnimap-authenticator plain)
+            (nnimap-user "amin@aminb.org"))
+   gnus-secondary-select-methods
+   '((nnimap "uwaterloo"
+             (nnimap-stream plain)
+             (nnimap-address "127.0.0.1")
+             (nnimap-server-port 143)
+             (nnimap-authenticator plain)
+             (nnimap-user "abandali@uwaterloo.ca")))
+   gnus-message-archive-group "nnimap:Sent"
+   gnus-parameters
+   '(("amin"
+      (display . 20)
+      (posting-style
+       ((header "to" "amin@aminb.org")
+        (address "amin@aminb.org"))
+       ((header "delivered-to" "gnu@aminb.org")
+        (address "bandali@gnu.org"))))
+     ("uwaterloo"
+      (display . 20)
+      (posting-style
+       (address "abandali@uwaterloo.ca")
+       (gcc "\"nnimap+uwaterloo:Sent Items\""))))
+   ;; gnus-init-file        amin-gnus-init-file
+   gnus-home-directory   (no-littering-expand-var-file-name "gnus/")
+   gnus-directory        (no-littering-expand-var-file-name "gnus/News/")
+   message-directory     amin-maildir
+   gnus-save-newsrc-file nil
+   gnus-read-newsrc-file nil
+   gnus-interactive-exit nil
+   gnus-gcc-mark-as-read t))
+
+(use-package gnus-art
+  :config
+  (setq
+   gnus-visible-headers
+   (concat gnus-visible-headers "\\|^List-Id:\\|^X-RT-Originator:")
+   gnus-sorted-header-list
+   '("^From:" "^Subject:" "^Summary:" "^Keywords:"
+     "^Followup-To:" "^To:" "^Cc:" "X-RT-Originator"
+     "^Newsgroups:" "List-Id:" "^Organization:"
+     "^Date:")
+  ;; local-lapsed article dates
+  ;; from https://www.emacswiki.org/emacs/GnusFormatting#toc11
+  gnus-article-date-headers '(user-defined)
+  gnus-article-time-format
+  (lambda (time)
+    (let* ((date (format-time-string "%a, %d %b %Y %T %z" time))
+           (local (article-make-date-line date 'local))
+           (combined-lapsed (article-make-date-line date
+                                                    'combined-lapsed))
+           (lapsed (progn
+                     (string-match " (.+" combined-lapsed)
+                     (match-string 0 combined-lapsed))))
+      (concat local lapsed)))))
+
+(use-package gnus-sum
+  :config
+  (setq gnus-extra-headers (append gnus-extra-headers
+                                   '(List-Id X-RT-Originator))))
+
+(use-package nnmail
+  :config
+  (setq nnmail-extra-headers (append nnmail-extra-headers
+                                     '(List-Id X-RT-Originator))))
+
+(use-package mm-decode
+  :config
+  (setq mm-discouraged-alternatives '("text/html" "text/richtext")))
+#+end_src
+
 ** sendmail
 
 #+begin_src emacs-lisp
@@ -1616,15 +1860,67 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
         mml-secure-openpgp-sign-with-sender t))
 #+end_src
 
-** [[https://notmuchmail.org][notmuch]]
+** supercite
+
+#+begin_src emacs-lisp :tangle no
+(use-package supercite
+  :commands sc-cite-original
+  :init
+  (add-hook 'mail-citation-hook 'sc-cite-original)
+
+  (defun sc-remove-existing-signature ()
+    (save-excursion
+      (goto-char (region-beginning))
+      (when (re-search-forward message-signature-separator (region-end) t)
+        (delete-region (match-beginning 0) (region-end)))))
+
+  (add-hook 'mail-citation-hook 'sc-remove-existing-signature)
+
+  (defun sc-remove-if-not-mailing-list ()
+    (unless (assoc "list-id" sc-mail-info)
+      (setq attribution sc-default-attribution
+            citation (concat sc-citation-delimiter
+                             sc-citation-separator))))
+
+  (add-hook 'sc-attribs-postselect-hook 'sc-remove-if-not-mailing-list)
+
+  :config
+  (defun sc-fill-if-different (&optional prefix)
+    "Fill the region bounded by `sc-fill-begin' and point.
+Only fill if optional PREFIX is different than
+`sc-fill-line-prefix'.  If `sc-auto-fill-region-p' is nil, do not
+fill region.  If PREFIX is not supplied, initialize fill
+variables.  This is useful for a regi `begin' frame-entry."
+    (if (not prefix)
+        (setq sc-fill-line-prefix ""
+              sc-fill-begin (line-beginning-position))
+      (if (and sc-auto-fill-region-p
+               (not (string= prefix sc-fill-line-prefix)))
+          (let ((fill-prefix sc-fill-line-prefix))
+            (unless (or (string= fill-prefix "")
+                        (save-excursion
+                          (goto-char sc-fill-begin)
+                          (or (looking-at ">+  +")
+                              (< (length
+                                  (buffer-substring (point)
+                                                    (line-end-position)))
+                                 65))))
+              (fill-region sc-fill-begin (line-beginning-position)))
+            (setq sc-fill-line-prefix prefix
+                  sc-fill-begin (line-beginning-position)))))
+nil))
+#+end_src
+
+** COMMENT [[https://notmuchmail.org][notmuch]]                                                 :ARCHIVE:
 
 See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
 
 #+begin_src emacs-lisp
 (defun amin/notmuch ()
   "Delete other windows, then launch `notmuch'."
-  (interactive)
-  (delete-other-windows)
+  (interactive
+   (when (equal current-prefix-arg nil)
+     (delete-other-windows)))
   (notmuch))
 
 (use-package notmuch
@@ -1744,57 +2040,9 @@ See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
 
 (after! notmuch-crypto
   (setq notmuch-crypto-process-mime t))
-#+end_src
 
-** supercite
-
-#+begin_src emacs-lisp :tangle no
-(use-package supercite
-  :commands sc-cite-original
-  :init
-  (add-hook 'mail-citation-hook 'sc-cite-original)
-
-  (defun sc-remove-existing-signature ()
-    (save-excursion
-      (goto-char (region-beginning))
-      (when (re-search-forward message-signature-separator (region-end) t)
-        (delete-region (match-beginning 0) (region-end)))))
-
-  (add-hook 'mail-citation-hook 'sc-remove-existing-signature)
-
-  (defun sc-remove-if-not-mailing-list ()
-    (unless (assoc "list-id" sc-mail-info)
-      (setq attribution sc-default-attribution
-            citation (concat sc-citation-delimiter
-                             sc-citation-separator))))
-
-  (add-hook 'sc-attribs-postselect-hook 'sc-remove-if-not-mailing-list)
-
-  :config
-  (defun sc-fill-if-different (&optional prefix)
-    "Fill the region bounded by `sc-fill-begin' and point.
-Only fill if optional PREFIX is different than
-`sc-fill-line-prefix'.  If `sc-auto-fill-region-p' is nil, do not
-fill region.  If PREFIX is not supplied, initialize fill
-variables.  This is useful for a regi `begin' frame-entry."
-    (if (not prefix)
-        (setq sc-fill-line-prefix ""
-              sc-fill-begin (line-beginning-position))
-      (if (and sc-auto-fill-region-p
-               (not (string= prefix sc-fill-line-prefix)))
-          (let ((fill-prefix sc-fill-line-prefix))
-            (unless (or (string= fill-prefix "")
-                        (save-excursion
-                          (goto-char sc-fill-begin)
-                          (or (looking-at ">+  +")
-                              (< (length
-                                  (buffer-substring (point)
-                                                    (line-end-position)))
-                                 65))))
-              (fill-region sc-fill-begin (line-beginning-position)))
-            (setq sc-fill-line-prefix prefix
-                  sc-fill-begin (line-beginning-position)))))
-nil))
+(use-package org-notmuch
+  :after (:any org notmuch))
 #+end_src
 
 * Blogging