:after (:any org notmuch))
#+end_src
+**** asynchronous tangle
+
+=amin/async-babel-tangle= is a function closely inspired by [[https://github.com/dieggsy/dotfiles/tree/cc10edf7701958eff1cd94d4081da544d882a28c/emacs.d#dotfiles][dieggsy's
+d/async-babel-tangle]] which uses [[https://github.com/jwiegley/emacs-async][async]] to asynchronously tangle an org
+file.
+
+#+begin_src emacs-lisp
+(after! org
+ (defvar amin-show-async-tangle-results nil
+ "Keep *emacs* async buffers around for later inspection.")
+
+ (defvar amin-show-async-tangle-time nil
+ "Show the time spent tangling the file.")
+
+ (defvar amin-async-tangle-post-compile "make ti"
+ "If non-nil, pass to `compile' after successful tangle.")
+
+ (defun amin/async-babel-tangle ()
+ "Tangle org file asynchronously."
+ (interactive)
+ (let* ((file-tangle-start-time (current-time))
+ (file (buffer-file-name))
+ (file-nodir (file-name-nondirectory file))
+ (async-quiet-switch "-q"))
+ (async-start
+ `(lambda ()
+ (require 'org)
+ (org-babel-tangle-file ,file))
+ (unless amin-show-async-tangle-results
+ `(lambda (result)
+ (if result
+ (progn
+ (message "Tangled %s%s"
+ ,file-nodir
+ (if amin-show-async-tangle-time
+ (format " (%.3fs)"
+ (float-time (time-subtract (current-time)
+ ',file-tangle-start-time)))
+ ""))
+ (when amin-async-tangle-post-compile
+ (compile amin-async-tangle-post-compile)))
+ (message "Tangling %s failed" ,file-nodir))))))))
+
+(add-to-list
+ 'safe-local-variable-values
+ '(eval add-hook 'after-save-hook #'amin/async-babel-tangle 'append 'local))
+
+(setq compilation-exit-message-function
+ (lambda (status code msg)
+ "Close the compilation window if successful."
+ ;; if M-x compile exits with 0
+ (when (and (eq status 'exit) (zerop code))
+ (bury-buffer)
+ (delete-window (get-buffer-window (get-buffer "*compilation*"))))
+ ;; return the result of compilation-exit-message-function
+ (cons msg code)))
+#+end_src
+
*** [[https://magit.vc/][Magit]]
#+begin_quote
(eshell-life-is-too-much)
(delete-char arg)))
+ (defun amin/eshell-clear ()
+ (interactive)
+ (let ((inhibit-read-only t))
+ (erase-buffer))
+ (eshell-send-input))
+
(defun amin|eshell-setup ()
(bind-keys :map eshell-mode-map
- ("C-d" . amin/eshell-quit-or-delete-char)))
+ ("C-d" . amin/eshell-quit-or-delete-char)
+ ("C-l" . amin/eshell-clear)))
:hook (eshell-mode . amin|eshell-setup))
#+end_src
("C-c b K" . crux-kill-other-buffers)
("C-c f c" . crux-copy-file-preserve-attributes)
("C-c f D" . crux-delete-file-and-buffer)
- ("C-c f R" . crux-rename-file-and-buffer)))
+ ("C-c f R" . crux-rename-file-and-buffer)
+ ("C-S-j" . crux-top-join-line)
+ ("C-c j" . crux-top-join-line)))
#+end_src
** [[https://github.com/alezost/mwim.el][mwim]]
'(("*Help*" :align right :select t :size 0.5)
("\\`\\*helm.*?\\*\\'" :regexp t :align t)
((compilation-mode "\\`\\*magit-diff: .*?\\'") :regexp t :noselect t)
+ ("*magit-dispatch-popup*" :align bottom)
((inferior-scheme-mode "*shell*" "*eshell*") :popup t))
shackle-default-rule '(:select t)
shackle-default-size 0.4
shackle-inhibit-window-quit-on-same-windows t))
#+end_src
+** [[https://github.com/Wilfred/helpful][helpful]]
+
+#+begin_src emacs-lisp
+(use-package helpful
+ :bind
+ (("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)))
+#+end_src
+
+** [[https://github.com/kyagi/shell-pop-el][shell-pop]]
+
+#+begin_src emacs-lisp
+(use-package shell-pop
+ :config
+ (add-to-list 'shackle-rules '("\\*eshell\\*" :regexp t :same t))
+ :custom
+ (shell-pop-universal-key "C-c e")
+ (shell-pop-shell-type '("eshell" "*eshell*" (lambda nil (eshell)))))
+#+end_src
+
* Email
** [[https://notmuchmail.org][notmuch]]
#+begin_src emacs-lisp :comments none
;;; init.el ends here
#+end_src
+
+* COMMENT Local Variables :ARCHIVE:
+# Local Variables:
+# eval: (add-hook 'after-save-hook #'amin/async-babel-tangle 'append 'local)
+# End: