[emacs] add eclim
[~bandali/configs] / init.org
index 60031a4..c582f71 100644 (file)
--- a/init.org
+++ b/init.org
@@ -32,6 +32,46 @@ anyway.  So, I've opted to use =straight.el=.  I also used Borg for a
 few months, but decided to try =straight.el= which allows direct use
 of the various package archives.
 
+** Installation
+
+To use this config for your Emacs, first you need to clone this repo,
+then tangle =init.org= into =init.el=, and optionally byte-compile
+=init.el=.
+
+First, clone the repository and =cd= into it:
+
+#+begin_src sh :tangle no
+git clone https://git.sr.ht/~bandali/dotfiles ~/.emacs.d
+cd ~/.emacs.d
+#+end_src
+
+Then, decide if you would like to use a byte-compiled init file, and
+set the following variable accordingly:
+
+#+begin_src emacs-lisp
+(defvar a/byte-compiled-init t
+  "If non-nil, byte-(re)compile init.el on successful tangles.")
+#+end_src
+
+Now, first tangle =init.org=, and only if you chose to have a
+byte-compiled init, build init as well:
+
+#+begin_src sh :tangle no
+make tangle-init
+make build-init
+#+end_src
+
+If you'd like to use a byte-compiled init, it's important that it be
+recompiled whenever =init.el= is generated from an updated =init.org=.
+Not only does my setup automatically and asynchronously tangle
+=init.org= to =init.el= every time you edit and save =init.org= in GNU
+Emacs, it will also invoke =make build-init= if you set
+=a/byte-compiled-init= to =t= above, so you wouldn't have to worry
+about manually tangling and compiling your init file whenever you
+change it.  The output of the last byte-compilation in the current
+session is kept in a =*compilation*= buffer, which will automatically
+be displayed if compilation fails.
+
 * Contents                                                   :toc_1:noexport:
 
 - [[#about][About]]
@@ -201,7 +241,8 @@ hacker.
 #+begin_src emacs-lisp
 ;; Main engine start...
 
-(setq straight-repository-branch "develop")
+(setq straight-repository-branch "develop"
+      straight-check-for-modifications '(check-on-save find-when-checking))
 
 (defun a/bootstrap-straight ()
   (defvar bootstrap-version)
@@ -255,11 +296,13 @@ and without compromising on performance.
 
 #+begin_src emacs-lisp
 (straight-use-package 'use-package)
-(if nil  ; set to t when need to debug init
-    (setq use-package-verbose t
-          use-package-expand-minimally nil
-          use-package-compute-statistics t
-          debug-on-error t)
+(if nil                             ; set to t when need to debug init
+    (progn
+      (setq use-package-verbose t
+            use-package-expand-minimally nil
+            use-package-compute-statistics t
+            debug-on-error t)
+      (require 'use-package))
   (setq use-package-verbose nil
         use-package-expand-minimally t))
 
@@ -281,8 +324,8 @@ database, low-level functions for querying the database, and a
 (use-package epkg
   :commands (epkg-list-packages epkg-describe-package)
   :bind
-  (("C-c P e d" . epkg-describe-package)
-   ("C-c P e p" . epkg-list-packages))
+  (("C-c p e d" . epkg-describe-package)
+   ("C-c p e p" . epkg-list-packages))
   :config
   (setq epkg-repository "~/.emacs.d/straight/repos/epkgs/")
   (eval-when-compile (defvar ivy-initial-inputs-alist))
@@ -346,7 +389,8 @@ in my shell.
 (use-package exec-path-from-shell
   :defer 1
   :init
-  (setq exec-path-from-shell-check-startup-files nil)
+  (setq exec-path-from-shell-arguments           nil
+        exec-path-from-shell-check-startup-files nil)
   :config
   (exec-path-from-shell-initialize)
   ;; while we're at it, let's fix access to our running ssh-agent
@@ -695,6 +739,8 @@ for this.
 
 ** Bindings
 
+Some bindings for functions from built-in GNU Emacs packages:
+
 #+begin_src emacs-lisp
 (bind-keys
  ("C-c a i" . ielm)
@@ -702,6 +748,9 @@ for this.
  ("C-c e b" . eval-buffer)
  ("C-c e r" . eval-region)
 
+ ("C-c e i" . emacs-init-time)
+ ("C-c e u" . emacs-uptime)
+
  ("C-c F m" . make-frame-command)
  ("C-c F d" . delete-frame)
  ("C-c F D" . delete-other-frames)
@@ -719,6 +768,35 @@ for this.
  ("s-n"     . end-of-buffer))
 #+end_src
 
+While at it, let's bind a few for some =straight-*= functions too:
+
+#+begin_src emacs-lisp
+(bind-keys
+ :prefix-map a/straight-prefix-map
+ :prefix "C-c p s"
+ ("u" . straight-use-package)
+ ("f" . straight-freeze-versions)
+ ("t" . straight-thaw-versions)
+ ("P" . straight-prune-build)
+ ("r" . straight-get-recipe)
+ ;; M-x ^straight-.*-all$
+ ("a c" . straight-check-all)
+ ("a f" . straight-fetch-all)
+ ("a m" . straight-merge-all)
+ ("a n" . straight-normalize-all)
+ ("a F" . straight-pull-all)
+ ("a P" . straight-push-all)
+ ("a r" . straight-rebuild-all)
+ ;; M-x ^straight-.*-package$
+ ("p c" . straight-check-package)
+ ("p f" . straight-fetch-package)
+ ("p m" . straight-merge-package)
+ ("p n" . straight-normalize-package)
+ ("p F" . straight-pull-package)
+ ("p P" . straight-push-package)
+ ("p r" . straight-rebuild-package))
+#+end_src
+
 ** Packages
 
 The packages in this section are absolutely essential to my everyday
@@ -798,7 +876,7 @@ And here's where my actual Org configurations begin:
 
 #+begin_src emacs-lisp
 (use-feature org
-  :defer 0.5
+  :defer 2
   :config
   (setq org-src-tab-acts-natively t
         org-src-preserve-indentation nil
@@ -810,13 +888,6 @@ And here's where my actual Org configurations begin:
         org-catch-invisible-edits 'show-and-error
         org-log-done 'time)
   (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t)
-  (font-lock-add-keywords
-   'org-mode
-   '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)"
-      (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive
-      (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind
-      (4 '(:foreground "#c5c8c6") t))) ; title
-   t)
   :bind (:map org-mode-map ("M-L" . org-insert-last-stored-link))
   :hook ((org-mode . org-indent-mode)
          (org-mode . auto-fill-mode)
@@ -834,20 +905,15 @@ And here's where my actual Org configurations begin:
   (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
                '("IEEEtran" "\\documentclass[11pt]{IEEEtran}"
-                 ("\\section{%s}" . "\\section*{%s}")
-                 ("\\subsection{%s}" . "\\subsection*{%s}")
+                 ("\\section{%s}"       . "\\section*{%s}")
+                 ("\\subsection{%s}"    . "\\subsection*{%s}")
                  ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-                 ("\\paragraph{%s}" . "\\paragraph*{%s}")
-                 ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
-               t))
-
-(use-feature ox-beamer
-  :demand
-  :after ox)
+                 ("\\paragraph{%s}"     . "\\paragraph*{%s}")
+                 ("\\subparagraph{%s}"  . "\\subparagraph*{%s}"))
+               t)
+  (require 'ox-beamer))
 #+end_src
 
 **** asynchronous tangle
@@ -864,9 +930,13 @@ file.
   (defvar a/show-async-tangle-time nil
     "Show the time spent tangling the file.")
 
-  (defvar a/async-tangle-post-compile "make bi"
+  (defvar a/async-tangle-post-compile
+    (when a/byte-compiled-init "make build-init")
     "If non-nil, pass to `compile' after successful tangle.")
 
+  ;; TODO: look into why directly byte-compiling init.el causes a
+  ;; number of problems, including magit-status not loading (busy
+  ;; waiting).
   (defvar a/async-tangle-byte-recompile nil
     "If non-nil, byte-recompile the file on successful tangle.")
 
@@ -886,7 +956,7 @@ file.
          `(lambda (result)
             (if result
                 (progn
-                  (setq byte-compile-warnings '(not noruntime unresolved))
+                  ;; (setq byte-compile-warnings '(not noruntime unresolved))
                   (message "Tangled %s%s"
                            ,file-nodir
                            (if a/show-async-tangle-time
@@ -915,7 +985,7 @@ Not just how I do git, but /the/ way to do git.
 
 #+begin_src emacs-lisp
 (use-package magit
-  :defer 1
+  :defer 2
   :bind (("C-x g" . magit-status)
          ("s-g s" . magit-status)
          ("s-g l" . magit-log-buffer-file))
@@ -1018,7 +1088,7 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-feature eshell
-  :defer 1
+  :defer 2
   :commands eshell
   :bind ("C-c a s e" . eshell)
   :config
@@ -1247,9 +1317,17 @@ Highlight matching parens.
 
 #+begin_src emacs-lisp
 (use-feature paren
+  :demand
   :config (show-paren-mode))
 #+end_src
 
+** simple (for column numbers)
+
+#+begin_src emacs-lisp
+(use-feature simple
+  :config (column-number-mode))
+#+end_src
+
 ** =savehist=
 
 Save minibuffer history.
@@ -1291,7 +1369,7 @@ Automatically save place in each file.
 
 #+begin_src emacs-lisp
 (use-package company
-  :defer 1
+  :defer 3
   :bind
   (:map company-active-map
         ([tab]    . company-complete-common-or-cycle)
@@ -1378,7 +1456,7 @@ Automatically save place in each file.
 ** [[https://coq.inria.fr][Coq]] (with [[https://github.com/ProofGeneral/PG][Proof General]])
 
 #+begin_src emacs-lisp
-(use-package proof-site
+(use-package proof-site  ; Proof General
   :straight proof-general)
 #+end_src
 
@@ -1631,9 +1709,9 @@ instead.
   :hook (web-mode css-mode html-mode sgml-mode))
 #+end_src
 
-** COMMENT Java
+** Java
 
-*** meghanada
+*** COMMENT meghanada
 
 #+begin_src emacs-lisp
 (use-package meghanada
@@ -1644,7 +1722,7 @@ instead.
   :hook (java-mode . meghanada-mode))
 #+end_src
 
-*** lsp-java
+*** COMMENT lsp-java
 
 #+begin_comment
 dependencies:
@@ -1712,7 +1790,25 @@ treemacs
   :after (treemacs))
 #+end_src
 
-** COMMENT geiser
+*** eclim
+
+#+begin_src emacs-lisp
+(use-package eclim
+  :bind (:map eclim-mode-map ("S-SPC" . company-complete))
+  :hook ((java-mode . eclim-mode)
+         (eclim-mode . (lambda ()
+                         (make-local-variable 'company-idle-delay)
+                         (defvar company-idle-delay)
+                         ;; (setq company-idle-delay 0.7)
+                         (setq company-idle-delay nil))))
+  :custom
+  (eclim-auto-save nil)
+  ;; (eclimd-default-workspace "~/src/eclipse-workspace-exp")
+  (eclim-executable "~/.p2/pool/plugins/org.eclim_2.8.0/bin/eclim")
+  (eclim-eclipse-dirs '("~/usr/eclipse/dsl-2018-09/eclipse")))
+#+end_src
+
+** geiser
 
 #+begin_src emacs-lisp
 (use-package geiser)
@@ -1722,7 +1818,7 @@ treemacs
   (setq geiser-guile-load-path "~/src/git/guix"))
 #+end_src
 
-** COMMENT guix
+** guix
 
 #+begin_src emacs-lisp
 (use-package guix)
@@ -1765,19 +1861,21 @@ Emacs package that displays available keybindings in popup
     ;; prefixes for my personal bindings
     "C-c a"   "applications"
     "C-c a s" "shells"
-    "C-c P"   "package-management"
-    "C-c P e" "package-management/epkg"
-    "C-c P s" "package-management/straight.el"
+    "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 c"   "compile-and-comments"
     "C-c e"   "eval"
     "C-c f"   "files"
     "C-c F"   "frames"
     "C-S-h"   "help(ful)"
     "C-c m"   "multiple-cursors"
-    "C-c p"   "projectile"
-    "C-c p s" "projectile/search"
-    "C-c p x" "projectile/execute"
-    "C-c p 4" "projectile/other-window"
+    "C-c P"   "projectile"
+    "C-c P s" "projectile/search"
+    "C-c P x" "projectile/execute"
+    "C-c P 4" "projectile/other-window"
     "C-c q"   "boxquote"
     "s-g"     "magit"
     "s-o"     "outline"
@@ -1795,7 +1893,10 @@ Emacs package that displays available keybindings in popup
     "C-c C-e" "web/element"
     "C-c C-t" "web/tags")
 
-  (which-key-mode))
+  (which-key-mode)
+  :custom
+  (which-key-add-column-padding 5)
+  (which-key-max-description-length 32))
 #+end_src
 
 ** theme
@@ -1810,6 +1911,7 @@ Emacs package that displays available keybindings in popup
 #+begin_src emacs-lisp
 (use-package smart-mode-line
   :commands (sml/apply-theme)
+  :demand
   :config
   (sml/setup))
 #+end_src
@@ -1823,19 +1925,29 @@ Emacs package that displays available keybindings in popup
 ** theme helper functions
 
 #+begin_src emacs-lisp
+(defvar a/org-mode-font-lock-keywords
+  '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)"
+      (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive
+      (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind
+      (4 '(:foreground "#c5c8c6") t))))                    ; title
+
 (defun a/lights-on ()
   "Enable my favourite light theme."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
   (load-theme 'tangomod t)
-  (sml/apply-theme 'automatic))
+  (sml/apply-theme 'automatic)
+  (font-lock-remove-keywords
+   'org-mode a/org-mode-font-lock-keywords))
 
 (defun a/lights-off ()
   "Go dark."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
   (load-theme 'doom-tomorrow-night t)
-  (sml/apply-theme 'automatic))
+  (sml/apply-theme 'automatic)
+  (font-lock-add-keywords
+   'org-mode a/org-mode-font-lock-keywords t))
 
 (bind-keys
  ("s-t d" . a/lights-off)
@@ -1871,7 +1983,7 @@ Emacs package that displays available keybindings in popup
 
 #+begin_src emacs-lisp
 (use-package projectile
-  :bind-keymap ("C-c p" . projectile-command-map)
+  :bind-keymap ("C-c P" . projectile-command-map)
   :config
   (projectile-mode)
 
@@ -1892,7 +2004,7 @@ Emacs package that displays available keybindings in popup
 
 #+begin_src emacs-lisp
 (use-package helpful
-  :defer 1
+  :defer 3
   :bind
   (("C-S-h c" . helpful-command)
    ("C-S-h f" . helpful-callable)        ; helpful-function
@@ -1911,7 +2023,6 @@ Make =*scratch*= and =*Messages*= unkillable.
   :config
   (unkillable-scratch 1)
   :custom
-  (unkillable-scratch-behavior 'do-nothing)
   (unkillable-buffers '("^\\*scratch\\*$" "^\\*Messages\\*$")))
 #+end_src
 
@@ -1985,10 +2096,8 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
 #+begin_src emacs-lisp
 (use-package shrink-path
   :defer 2
+  :after eshell
   :config
-  (setq eshell-prompt-regexp "\\(.*\n\\)*λ "
-        eshell-prompt-function #'+eshell/prompt)
-
   (defun +eshell/prompt ()
     (let ((base/dir (shrink-path-prompt default-directory)))
       (concat (propertize (car base/dir)
@@ -1998,9 +2107,10 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
               (propertize (+eshell--current-git-branch)
                           'face 'font-lock-function-name-face)
               "\n"
-              (propertize "λ" 'face 'eshell-prompt-face)
+              ;; "λ"
+              ;; (propertize "λ" 'face 'eshell-prompt)
               ;; needed for the input text to not have prompt face
-              (propertize " " 'face 'default))))
+              (propertize "λ " 'face 'default))))
 
   (defun +eshell--current-git-branch ()
     (let ((branch (car (loop for match in (split-string (shell-command-to-string "git branch") "\n")
@@ -2008,22 +2118,24 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
                              collect match))))
       (if (not (eq branch nil))
           (concat " " (substring branch 2))
-        ""))))
+        "")))
+  (setq eshell-prompt-regexp "\\(.*\n\\)*λ "
+                         eshell-prompt-function #'+eshell/prompt))
 #+end_src
 
 ** [[https://github.com/peterwvj/eshell-up][eshell-up]]
 
 #+begin_src emacs-lisp
 (use-package eshell-up
-  :commands eshell-up
-  :after eshell)
+  :after eshell
+  :commands eshell-up)
 #+end_src
 
 ** multi-term
 
 #+begin_src emacs-lisp
 (use-package multi-term
-  :defer 1
+  :defer 3
   :bind (("C-c a s m" . multi-term-dedicated-toggle)
          :map term-mode-map
          ("C-c C-j" . term-char-mode)
@@ -2083,6 +2195,14 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
                ("a" . mc/mark-all-like-this))))
 #+end_src
 
+** forge
+
+#+begin_src emacs-lisp
+(use-package forge
+  :after magit
+  :demand)
+#+end_src
+
 * Email
 :PROPERTIES:
 :CUSTOM_ID: email
@@ -2133,7 +2253,11 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
    gnus-save-newsrc-file nil
    gnus-read-newsrc-file nil
    gnus-interactive-exit nil
-   gnus-gcc-mark-as-read t))
+   gnus-gcc-mark-as-read t)
+  :config
+  (require 'ebdb)
+  (require 'ebdb-mua)
+  (require 'ebdb-gnus))
 
 (use-feature gnus-art
   :config
@@ -2249,6 +2373,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
         message-dont-reply-to-names
         "\\(\\(.*@aminb\\.org\\)\\|\\(amin@bandali\\.me\\)\\|\\(\\(aminb?\\|mab\\|bandali\\)@gnu\\.org\\)\\|\\(\\(m\\|a\\(min\\.\\)?\\)bandali@uwaterloo\\.ca\\)\\)"
         message-user-fqdn "aminb.org")
+  (require 'company-ebdb)
   :hook (;; (message-setup . mml-secure-message-sign-pgpmime)
          (message-mode . flyspell-mode)
          (message-mode . (lambda ()
@@ -2312,17 +2437,11 @@ Convenient footnotes in =message-mode=.
 ;;   (ebdb-complete-enable))
 
 (use-package company-ebdb
-  :after (:all company message)
   :config
-  (defun company-ebdb--post-complete (_) nil)
-  :hook
-  (message-mode . (lambda ()
-                    (add-to-list (make-local-variable 'company-backends)
-                                 'company-ebdb))))
+  (defun company-ebdb--post-complete (_) nil))
 
 (use-feature ebdb-gnus
   :after ebdb
-  :demand
   :custom
   (ebdb-gnus-window-configuration
    '(article
@@ -2334,7 +2453,6 @@ Convenient footnotes in =message-mode=.
 
 (use-feature ebdb-mua
   :after ebdb
-  :demand
   ;; :custom (ebdb-mua-pop-up nil)
   )
 
@@ -2346,9 +2464,13 @@ Convenient footnotes in =message-mode=.
 ;;   :after ebdb)
 #+end_src
 
-** COMMENT message-x
+** message-x
 
 #+begin_src emacs-lisp
+(use-package message-x)
+#+end_src
+
+#+begin_src emacs-lisp :tangle no
 (use-package message-x
   :custom
   (message-x-completion-alist
@@ -2382,10 +2504,8 @@ Convenient footnotes in =message-mode=.
 
 #+begin_src emacs-lisp
 (use-package ox-hugo
-  :after ox)
-
-(use-feature ox-hugo-auto-export
-  :after ox-hugo)
+  :after ox
+  :demand)
 #+end_src
 
 * Post initialization
@@ -2413,5 +2533,5 @@ Display how long it took to load the init file.
 * COMMENT Local Variables                                           :ARCHIVE:
 # Local Variables:
 # eval: (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local)
-# eval: (typo-mode -1)
+# eval: (when (featurep 'typo (typo-mode -1)))
 # End: