aboutsummaryrefslogtreecommitdiff
path: root/.emacs.d/rul-init.d
diff options
context:
space:
mode:
authorRaúl Benencia <id@rbenencia.name>2023-07-20 07:53:35 -0700
committerRaúl Benencia <id@rbenencia.name>2023-07-22 10:45:18 -0700
commit5860445da55ac3abc3935c6ffd5e9bb4539225c9 (patch)
tree2de3124b4c0577245a0b7e1dec30732af7fcc191 /.emacs.d/rul-init.d
parentfd0754be08f4b2f9ef58625c17544a238afefade (diff)
emacs: move everything to ~/.emacs.d
Diffstat (limited to '.emacs.d/rul-init.d')
-rw-r--r--.emacs.d/rul-init.d/auto-fill.el4
-rw-r--r--.emacs.d/rul-init.d/company.el42
-rw-r--r--.emacs.d/rul-init.d/dashboard.el9
-rw-r--r--.emacs.d/rul-init.d/doom-modeline.el11
-rw-r--r--.emacs.d/rul-init.d/flycheck.el20
-rw-r--r--.emacs.d/rul-init.d/flyspell.el12
-rw-r--r--.emacs.d/rul-init.d/fonts.el31
-rw-r--r--.emacs.d/rul-init.d/go-lang.el23
-rw-r--r--.emacs.d/rul-init.d/hydra.el97
-rw-r--r--.emacs.d/rul-init.d/ibuffer.el35
-rw-r--r--.emacs.d/rul-init.d/imenu.el12
-rw-r--r--.emacs.d/rul-init.d/ivy.el38
-rw-r--r--.emacs.d/rul-init.d/latex.el9
-rw-r--r--.emacs.d/rul-init.d/logos.el29
-rw-r--r--.emacs.d/rul-init.d/lsp.el17
-rw-r--r--.emacs.d/rul-init.d/magit.el15
-rw-r--r--.emacs.d/rul-init.d/mail-mode.el15
-rw-r--r--.emacs.d/rul-init.d/markdown.el5
-rw-r--r--.emacs.d/rul-init.d/mu4e.el61
-rw-r--r--.emacs.d/rul-init.d/notmuch.el133
-rw-r--r--.emacs.d/rul-init.d/projectile.el8
-rw-r--r--.emacs.d/rul-init.d/python.el1
-rw-r--r--.emacs.d/rul-init.d/sml.el7
-rw-r--r--.emacs.d/rul-init.d/staging.el158
-rw-r--r--.emacs.d/rul-init.d/tabbar.el25
-rw-r--r--.emacs.d/rul-init.d/themes.el47
-rw-r--r--.emacs.d/rul-init.d/vterm.el6
-rw-r--r--.emacs.d/rul-init.d/which-key.el5
-rw-r--r--.emacs.d/rul-init.d/writeroom.el34
29 files changed, 909 insertions, 0 deletions
diff --git a/.emacs.d/rul-init.d/auto-fill.el b/.emacs.d/rul-init.d/auto-fill.el
new file mode 100644
index 0000000..dad2831
--- /dev/null
+++ b/.emacs.d/rul-init.d/auto-fill.el
@@ -0,0 +1,4 @@
+;; auto-fill mode
+(add-hook 'text-mode-hook 'turn-on-auto-fill)
+(global-set-key (kbd "C-c q") 'auto-fill-mode)
+
diff --git a/.emacs.d/rul-init.d/company.el b/.emacs.d/rul-init.d/company.el
new file mode 100644
index 0000000..d52000e
--- /dev/null
+++ b/.emacs.d/rul-init.d/company.el
@@ -0,0 +1,42 @@
+(use-package company
+ :ensure t
+ :defer t
+ :init (global-company-mode)
+ :config
+ (progn
+ ;; Use Company for completion
+ (bind-key [remap completion-at-point] #'company-complete company-mode-map)
+
+ (setq company-tooltip-align-annotations t
+ ;; Easy navigation to candidates with M-<n>
+ company-show-numbers t)
+ (setq company-dabbrev-downcase nil))
+
+ (setq company-idle-delay 0)
+ (setq company-minimum-prefix-length 1)
+ :diminish company-mode)
+
+(use-package company-quickhelp ; Documentation popups for Company
+ :ensure t
+ :defer t
+ :init (add-hook 'global-company-mode-hook #'company-quickhelp-mode))
+
+(use-package company-go
+ :ensure t
+ :defer t
+ :init
+ (with-eval-after-load 'company
+ (add-to-list 'company-backends 'company-go)))
+
+(use-package company-lsp
+ :ensure t
+ :commands company-lsp)
+
+(use-package yasnippet
+ :ensure t
+ :config
+ (yas-global-mode 1)
+ (global-set-key (kbd "C-c y") 'company-yasnippet))
+
+(use-package yasnippet-snippets
+ :ensure t)
diff --git a/.emacs.d/rul-init.d/dashboard.el b/.emacs.d/rul-init.d/dashboard.el
new file mode 100644
index 0000000..7bf51a9
--- /dev/null
+++ b/.emacs.d/rul-init.d/dashboard.el
@@ -0,0 +1,9 @@
+(use-package dashboard
+ :ensure t
+ :diminish dashboard-mode
+ :config
+ (setq dashboard-banner-logo-title "Happy hacking!")
+ (setq dashboard-items '((recents . 10)
+ (projects . 5)
+ (bookmarks . 10)))
+ (dashboard-setup-startup-hook))
diff --git a/.emacs.d/rul-init.d/doom-modeline.el b/.emacs.d/rul-init.d/doom-modeline.el
new file mode 100644
index 0000000..b212652
--- /dev/null
+++ b/.emacs.d/rul-init.d/doom-modeline.el
@@ -0,0 +1,11 @@
+;; Elpa packages: doom-modeline all-the-icons
+;; Run: all-the-icons-install-fonts
+
+(use-package doom-modeline
+ :ensure t
+ :hook (after-init . doom-modeline-mode)
+ :config
+ (setq doom-modeline-height 1)
+ (set-face-attribute 'mode-line nil :family "Noto Sans" :height 150)
+ (set-face-attribute 'mode-line-inactive nil :family "Noto Sans" :height 150)
+)
diff --git a/.emacs.d/rul-init.d/flycheck.el b/.emacs.d/rul-init.d/flycheck.el
new file mode 100644
index 0000000..6662c06
--- /dev/null
+++ b/.emacs.d/rul-init.d/flycheck.el
@@ -0,0 +1,20 @@
+;; Debian-packages: elpa-flycheck python3-proselint
+
+(flycheck-define-checker proselint
+ "A linter for prose."
+ :command ("proselint" source-inplace)
+ :error-patterns
+ ((warning line-start (file-name) ":" line ":" column ": "
+ (id (one-or-more (not (any " "))))
+ (message) line-end))
+ :modes (text-mode markdown-mode gfm-mode org-mode))
+
+(add-to-list 'flycheck-checkers 'proselint)
+
+;; TODO: docker run --rm -p 8010:8010 erikvl87/languagetool
+(use-package flycheck-languagetool
+ :ensure t
+ :hook (message-mode . flycheck-languagetool-setup)
+ :init
+ (setq flycheck-languagetool-url "http://localhost:8010")
+)
diff --git a/.emacs.d/rul-init.d/flyspell.el b/.emacs.d/rul-init.d/flyspell.el
new file mode 100644
index 0000000..8cf27b8
--- /dev/null
+++ b/.emacs.d/rul-init.d/flyspell.el
@@ -0,0 +1,12 @@
+(defcustom flyspell-delayed-commands nil
+ "List of commands that are \"delayed\" for Flyspell mode.
+After these commands, Flyspell checking is delayed for a short time,
+whose length is specified by `flyspell-delay'."
+ :group 'flyspell
+ :type '(repeat (symbol)))
+
+(setq ispell-dictionary "en")
+(setq flyspell-default-dictionary "en")
+
+(setq flyspell-issue-welcome-flag nil)
+(setq-default ispell-list-command "list")
diff --git a/.emacs.d/rul-init.d/fonts.el b/.emacs.d/rul-init.d/fonts.el
new file mode 100644
index 0000000..69eb304
--- /dev/null
+++ b/.emacs.d/rul-init.d/fonts.el
@@ -0,0 +1,31 @@
+;; elpa-packages: fontaine
+
+(setq fontaine-presets
+ '((tiny
+ :default-family "Fira Code Retina"
+ :default-height 100)
+ (small
+ :default-family "Fira Code Retina"
+ :default-height 120)
+ (medium
+ :default-height 140)
+ (large
+ :default-weight semilight
+ :default-height 180
+ :bold-weight extrabold)
+ (presentation
+ :default-weight semilight
+ :default-height 200
+ :bold-weight extrabold)
+ (jumbo
+ :default-weight semilight
+ :default-height 230
+ :bold-weight extrabold)
+ (t
+ :default-family "Fira Code Retina"
+ :default-weight regular
+ :default-height 140
+ :variable-pitch-family "Fira Code Retina")))
+
+;; Set desired style from `fontaine-presets'
+(fontaine-set-preset 'medium)
diff --git a/.emacs.d/rul-init.d/go-lang.el b/.emacs.d/rul-init.d/go-lang.el
new file mode 100644
index 0000000..8ec678b
--- /dev/null
+++ b/.emacs.d/rul-init.d/go-lang.el
@@ -0,0 +1,23 @@
+;; Debian packages: elpa-go-mode
+;; Elpa packages: go-eldoc
+
+(use-package go-mode
+ :ensure t
+ :init
+ (progn
+ (bind-key [remap find-tag] #'godef-jump))
+ :config
+ (add-hook 'go-mode-hook #'yas-minor-mode)
+ (add-hook 'go-mode-hook 'electric-pair-mode)
+ (add-hook 'go-mode-hook 'my-go-mode-hook)
+ (add-hook 'before-save-hook 'gofmt-before-save)
+)
+
+(use-package go-eldoc
+ :ensure t
+ :init
+ (add-hook 'go-mode-hook 'go-eldoc-setup))
+
+;; Define function to call when go-mode loads
+(defun my-go-mode-hook ()
+ (set 'compile-command "go build -v && go test -v && go vet"))
diff --git a/.emacs.d/rul-init.d/hydra.el b/.emacs.d/rul-init.d/hydra.el
new file mode 100644
index 0000000..8afe86f
--- /dev/null
+++ b/.emacs.d/rul-init.d/hydra.el
@@ -0,0 +1,97 @@
+(use-package hydra
+ :defer 1)
+
+;; projectile
+(defhydra hydra-projectile-other-window (:color teal)
+ "projectile-other-window"
+ ("f" projectile-find-file-other-window "file")
+ ("g" projectile-find-file-dwim-other-window "file dwim")
+ ("d" projectile-find-dir-other-window "dir")
+ ("b" projectile-switch-to-buffer-other-window "buffer")
+ ("q" nil "cancel" :color blue))
+
+(defhydra hydra-projectile (:color teal
+ :hint nil)
+ "
+ PROJECTILE: %(projectile-project-root)
+
+ Find File Search/Tags Buffers Cache
+------------------------------------------------------------------------------------------
+_s-f_: file _a_: ag _i_: Ibuffer _c_: cache clear
+ _ff_: file dwim _g_: update gtags _b_: switch to buffer _x_: remove known project
+ _fd_: file curr dir _o_: multi-occur _s-k_: Kill all buffers _X_: cleanup non-existing
+ _r_: recent file _s_: ripgrep ^^^^_z_: cache current
+ _d_: dir
+
+"
+ ("a" projectile-ag)
+ ("b" projectile-switch-to-buffer)
+ ("c" projectile-invalidate-cache)
+ ("d" projectile-find-dir)
+ ("s-f" projectile-find-file)
+ ("ff" projectile-find-file-dwim)
+ ("fd" projectile-find-file-in-directory)
+ ("g" ggtags-update-tags)
+ ("s-g" ggtags-update-tags)
+ ("i" projectile-ibuffer)
+ ("K" projectile-kill-buffers)
+ ("s-k" projectile-kill-buffers)
+ ("m" projectile-multi-occur)
+ ("o" projectile-multi-occur)
+ ("s-p" projectile-switch-project "switch project")
+ ("p" projectile-switch-project)
+ ("s" projectile-save-project-buffers "save project buffers")
+ ("r" projectile-recentf)
+ ("x" projectile-remove-known-project)
+ ("X" projectile-cleanup-known-projects)
+ ("z" projectile-cache-current-file)
+ ("`" hydra-projectile-other-window/body "other window")
+ ("q" nil "cancel" :color blue))
+
+
+(global-set-key (kbd "C-c p") 'hydra-projectile/body)
+
+;; tab-bar
+(defhydra hydra-tab-bar (:color amaranth)
+ "Tab Bar Operations"
+ ("t" tab-new "Create a new tab" :column "Creation" :exit t)
+ ("d" dired-other-tab "Open Dired in another tab")
+ ("f" find-file-other-tab "Find file in another tab")
+ ("x" tab-close "Close current tab")
+ ("m" tab-move "Move current tab" :column "Management")
+ ("r" tab-rename "Rename Tab")
+ ("<return>" tab-bar-select-tab-by-name "Select tab by name" :column "Navigation")
+ ("l" tab-next "Next Tab")
+ ("j" tab-previous "Previous Tab")
+ ("q" nil "Exit" :exit t))
+
+(global-set-key (kbd "C-x t") 'hydra-tab-bar/body)
+
+;; Zoom
+(defhydra hydra-zoom ()
+ "zoom"
+ ("g" text-scale-increase "in")
+ ("l" text-scale-decrease "out"))
+
+(global-set-key (kbd "C-c z") 'hydra-zoom/body)
+
+;; Go
+(defhydra hydra-go ()
+ "zoom"
+ ("=" gofmt :exit t)
+ ("c" go-coverage :exit t))
+
+;; vterm
+(defhydra hydra-vterm ()
+ "zoom"
+ ("t" multi-vterm "Open a terminal" :exit t)
+ ("d" multi-vterm-dedicated-open "Dedicated" :exit t)
+ ("p" multi-vterm-prev "Previous terminal")
+ ("n" multi-vterm-next "Next terminal")
+ ("r" multi-vterm-rename-buffer "Rename buffer" :exit t)
+ )
+
+(global-set-key (kbd "C-c t") 'hydra-vterm/body)
+
+
+(global-set-key (kbd "C-c m") 'hydra-go/body)
diff --git a/.emacs.d/rul-init.d/ibuffer.el b/.emacs.d/rul-init.d/ibuffer.el
new file mode 100644
index 0000000..d5198d8
--- /dev/null
+++ b/.emacs.d/rul-init.d/ibuffer.el
@@ -0,0 +1,35 @@
+;; Debian packages: elpa-ibuffer-vc
+
+(use-package ibuffer ; Better buffer list
+ :bind (([remap list-buffers] . ibuffer))
+ ;; Show VC Status in ibuffer
+ :config (setq ibuffer-formats
+ '((mark modified read-only vc-status-mini " "
+ (name 18 18 :left :elide)
+ " "
+ (size 9 -1 :right)
+ " "
+ (mode 16 16 :left :elide)
+ " "
+ (vc-status 16 16 :left)
+ " "
+ filename-and-process)
+ (mark modified read-only " "
+ (name 18 18 :left :elide)
+ " "
+ (size 9 -1 :right)
+ " "
+ (mode 16 16 :left :elide)
+ " " filename-and-process)
+ (mark " "
+ (name 16 -1)
+ " " filename))))
+
+(use-package ibuffer-vc ; Group buffers by VC project and status
+ :ensure t
+ :defer t
+ :init (add-hook 'ibuffer-hook
+ (lambda ()
+ (ibuffer-vc-set-filter-groups-by-vc-root)
+ (unless (eq ibuffer-sorting-mode 'alphabetic)
+ (ibuffer-do-sort-by-alphabetic)))))
diff --git a/.emacs.d/rul-init.d/imenu.el b/.emacs.d/rul-init.d/imenu.el
new file mode 100644
index 0000000..1a2b29b
--- /dev/null
+++ b/.emacs.d/rul-init.d/imenu.el
@@ -0,0 +1,12 @@
+;; Debian packages: elpa-imenu-list
+(use-package imenu-list
+ :ensure t
+ :bind ("C-." . imenu-list-minor-mode)
+ :config
+ (setq imenu-list-focus-after-activation t)
+ (setq imenu-list-size 0.2)
+ (setq imenu-list-position 'left)
+ (add-hook 'go-mode-hook #'imenu-list-minor-mode))
+
+
+
diff --git a/.emacs.d/rul-init.d/ivy.el b/.emacs.d/rul-init.d/ivy.el
new file mode 100644
index 0000000..fcf69ca
--- /dev/null
+++ b/.emacs.d/rul-init.d/ivy.el
@@ -0,0 +1,38 @@
+(use-package ivy
+ :diminish (ivy-mode . "")
+ :init (ivy-mode 1) ; globally at startup
+
+ :bind (:map ivy-minibuffer-map
+ ("TAB" . ivy-alt-done))
+ :config
+ (setq ivy-use-virtual-buffers t)
+ (setq ivy-height 20)
+ (setq ivy-count-format "%d/%d ")
+ (setq ivy-re-builders-alist
+ '((swiper . ivy--regex-plus)
+ (t . ivy--regex-fuzzy)))
+)
+
+;; Override the basic Emacs commands
+(use-package counsel
+ :bind* ; load when pressed
+ (("M-x" . counsel-M-x)
+ ("C-s" . swiper)
+ ("C-x C-f" . counsel-find-file)
+ ("C-x C-r" . counsel-recentf) ; search for recently edited
+ ("C-c g" . counsel-git) ; search for files in git repo
+ ("C-c /" . counsel-ag) ; Use ag for regexp
+ ("C-x l" . counsel-locate)
+ ("C-x C-f" . counsel-find-file)
+ ("<f1> f" . counsel-describe-function)
+ ("<f1> v" . counsel-describe-variable)
+ ("<f1> l" . counsel-find-library)
+ ("<f2> i" . counsel-info-lookup-symbol)
+ ("<f2> u" . counsel-unicode-char)
+ ("C-c C-r" . ivy-resume))) ; Resume last Ivy-based completion
+
+(use-package ivy-hydra
+ :defer t
+ :after hydra)
+
+(provide 'init-ivy)
diff --git a/.emacs.d/rul-init.d/latex.el b/.emacs.d/rul-init.d/latex.el
new file mode 100644
index 0000000..de4de1f
--- /dev/null
+++ b/.emacs.d/rul-init.d/latex.el
@@ -0,0 +1,9 @@
+(add-hook 'latex-mode-hook 'flyspell-mode)
+(setq TeX-PDF-mode t)
+
+(defun pdfevince ()
+ (add-to-list 'TeX-output-view-style
+ '("^pdf$" "." "evince %o %(outpage)")))
+
+(add-hook 'LaTeX-mode-hook 'pdfevince t) ; AUCTeX LaTeX mode
+
diff --git a/.emacs.d/rul-init.d/logos.el b/.emacs.d/rul-init.d/logos.el
new file mode 100644
index 0000000..23d9937
--- /dev/null
+++ b/.emacs.d/rul-init.d/logos.el
@@ -0,0 +1,29 @@
+(use-package logos
+:ensure t
+:config
+
+;; If you want to use outlines instead of page breaks (the ^L)
+(setq logos-outlines-are-pages t)
+(setq logos-outline-regexp-alist
+ `((emacs-lisp-mode . "^;;;+ ")
+ (org-mode . "^\\*+ +")
+ (markdown-mode . "^\\#+ +")
+ ))
+
+;; These apply when `logos-focus-mode' is enabled. Their value is
+;; buffer-local.
+(setq-default logos-hide-mode-line t
+ logos-hide-buffer-boundaries t
+ logos-hide-fringe t
+ logos-variable-pitch nil
+ logos-buffer-read-only nil
+ logos-scroll-lock nil
+ logos-olivetti t)
+
+
+(let ((map global-map))
+ (define-key map [remap narrow-to-region] #'logos-narrow-dwim)
+ (define-key map [remap forward-page] #'logos-forward-page-dwim)
+ (define-key map [remap backward-page] #'logos-backward-page-dwim)
+ (define-key map (kbd "<f9>") #'logos-focus-mode))
+)
diff --git a/.emacs.d/rul-init.d/lsp.el b/.emacs.d/rul-init.d/lsp.el
new file mode 100644
index 0000000..a565b03
--- /dev/null
+++ b/.emacs.d/rul-init.d/lsp.el
@@ -0,0 +1,17 @@
+(use-package lsp-mode
+ :ensure t
+ :commands
+ (lsp lsp-deferred)
+ :hook
+ (dart-mode go-mode . lsp)
+ :init
+ (setq lsp-keymap-prefix "H-l")
+ )
+
+(defun lsp-go-install-save-hooks ()
+ (add-hook 'before-save-hook #'lsp-format-buffer t t)
+ (add-hook 'before-save-hook #'lsp-organize-imports t t))
+
+(use-package lsp-ui
+ :ensure t
+ :commands lsp-ui-mode)
diff --git a/.emacs.d/rul-init.d/magit.el b/.emacs.d/rul-init.d/magit.el
new file mode 100644
index 0000000..cd52e67
--- /dev/null
+++ b/.emacs.d/rul-init.d/magit.el
@@ -0,0 +1,15 @@
+;; Debian packages: elpa-magit
+
+(use-package magit
+ :ensure t
+ :defer t
+ :bind (("C-x g" . magit-status))
+ :config
+ (progn
+ (defun inkel/magit-log-edit-mode-hook ()
+ (flyspell-mode t)
+ (turn-on-auto-fill))
+ (defadvice magit-status (around magit-fullscreen activate)
+ (window-configuration-to-register :magit-fullscreen)
+ ad-do-it
+ (delete-other-windows))))
diff --git a/.emacs.d/rul-init.d/mail-mode.el b/.emacs.d/rul-init.d/mail-mode.el
new file mode 100644
index 0000000..09b04f9
--- /dev/null
+++ b/.emacs.d/rul-init.d/mail-mode.el
@@ -0,0 +1,15 @@
+(setq auto-mode-alist (append '((".*tmp/mutt.*" . message-mode)) auto-mode-alist))
+(setq auto-mode-alist (append '((".*tmp/neomutt.*" . message-mode)) auto-mode-alist))
+(add-to-list 'auto-mode-alist '("/mutt" . mail-mode))
+
+(setq mml-secure-openpgp-sign-with-sender t)
+
+(add-hook 'mail-mode-hook
+ (lambda ()
+ (font-lock-add-keywords nil
+ '(("^[ \t]*>[ \t]*>[ \t]*>.*$"
+ (0 'compilation-error))
+ ("^[ \t]*>[ \t]*>.*$"
+ (0 'compilation-column-number))
+ ("^[ \t]*>.*$"
+ (0 'comint-highlight-prompt))))))
diff --git a/.emacs.d/rul-init.d/markdown.el b/.emacs.d/rul-init.d/markdown.el
new file mode 100644
index 0000000..f035509
--- /dev/null
+++ b/.emacs.d/rul-init.d/markdown.el
@@ -0,0 +1,5 @@
+(autoload 'markdown-mode "markdown-mode.el"
+ "Major mode for editing Markdown files" t)
+
+(setq auto-mode-alist
+ (cons '("\\.mdwn" . markdown-mode) auto-mode-alist))
diff --git a/.emacs.d/rul-init.d/mu4e.el b/.emacs.d/rul-init.d/mu4e.el
new file mode 100644
index 0000000..da8b7c8
--- /dev/null
+++ b/.emacs.d/rul-init.d/mu4e.el
@@ -0,0 +1,61 @@
+(require 'mu4e)
+
+;; sending mail
+(setq message-send-mail-function 'message-send-mail-with-sendmail
+ sendmail-program "/home/lur/bin/te-msmtp"
+ user-mail-address "raul@thousandeyes.com"
+ user-full-name "Raúl Benencia")
+
+(setq mu4e-user-mail-address-list (list "raul@thousandeyes.com"))
+
+(setq message-kill-buffer-on-exit t)
+;; Use fancy chars
+(setq mu4e-use-fancy-chars t)
+;; don't save message to Sent Messages, Gmail/IMAP takes care of this
+(setq mu4e-sent-messages-behavior 'delete)
+(setq mu4e-update-interval 60) ;; update every 5 minutes
+
+;; use 'fancy' non-ascii characters in various places in mu4e
+;;(setq mu4e-use-fancy-chars t)
+
+(setq relevant-maildirs " (maildir:/INBOX OR maildir:/jira OR maildir:/news OR maildir:/git)")
+(mu4e-alert-enable-notifications)
+(mu4e-alert-set-default-style 'libnotify)
+(setq mu4e-alert-interesting-mail-query
+ (concat "flag:unread"
+ " AND NOT flag:trashed"
+ " AND" relevant-maildirs))
+
+(mu4e-alert-set-default-style 'libnotify)
+;;(add-hook 'after-init-hook #'mu4e-alert-enable-notifications)
+(add-hook 'after-init-hook #'mu4e-alert-enable-mode-line-display)
+
+(setq mu4e-bookmarks
+ `(,(make-mu4e-bookmark
+ :name "INBOX"
+ :query "maildir:/INBOX"
+ :key ?i)
+ ,(make-mu4e-bookmark
+ :name "Unread messages"
+ :query (concat "flag:unread AND NOT flag:trashed AND" relevant-maildirs)
+ :key ?u)
+ ,(make-mu4e-bookmark
+ :name "Today's messages"
+ :query (concat "date:today..now AND" relevant-maildirs)
+ :key ?t)
+ ,(make-mu4e-bookmark
+ :name "Last 7 days"
+ :query (concat "date:7d..now AND" relevant-maildirs)
+ :key ?w)
+ ,(make-mu4e-bookmark
+ :name "Today's unread logs "
+ :query (concat "date:today..now flag:unread AND NOT" relevant-maildirs)
+ :key ?l)
+ ,(make-mu4e-bookmark
+ :name "Today's logs "
+ :query (concat "date:today..now AND NOT maildir:/fim AND NOT" relevant-maildirs)
+ :key ?l))
+)
+
+;; (require 'mu4e-maildirs-extension)
+;; (mu4e-maildirs-extension)
diff --git a/.emacs.d/rul-init.d/notmuch.el b/.emacs.d/rul-init.d/notmuch.el
new file mode 100644
index 0000000..19ea823
--- /dev/null
+++ b/.emacs.d/rul-init.d/notmuch.el
@@ -0,0 +1,133 @@
+;; --------
+;; notmuch mode
+;; --------
+(require 'notmuch)
+(require 'notmuch-indicator)
+(require 'rul-config-mail)
+
+;;;; General UI
+(setq notmuch-show-logo nil
+ notmuch-column-control 1.0
+ notmuch-hello-auto-refresh t
+ notmuch-hello-recent-searches-max 20
+ notmuch-hello-thousands-separator ""
+ notmuch-show-all-tags-list t)
+
+;; Keymaps
+(defun rul/capture-mail()
+ "Capture mail to org mode."
+ (interactive)
+ (org-store-link nil)
+ (org-capture nil "m")
+ )
+
+(bind-key "c" 'rul/capture-mail notmuch-show-mode-map)
+
+(define-key notmuch-show-mode-map "R" 'notmuch-show-reply)
+(define-key notmuch-search-mode-map "R" 'notmuch-search-reply-to-thread)
+
+; Spam
+(define-key notmuch-show-mode-map "S"
+ (lambda ()
+ "mark message as spam"
+ (interactive)
+ (notmuch-show-tag (list "+spam" "-inbox" "-unread"))))
+
+(define-key notmuch-search-mode-map "S"
+ (lambda (&optional beg end)
+ "mark thread as spam"
+ (interactive (notmuch-search-interactive-region))
+ (notmuch-search-tag (list "+spam" "-inbox" "-unread") beg end)))
+
+; Archive
+(setq notmuch-archive-tags (list "-inbox" "+archive"))
+(define-key notmuch-show-mode-map "A"
+ (lambda ()
+ "archive"
+ (interactive)
+ (notmuch-show-tag (list "+archive" "-inbox" "-unread"))
+ (notmuch-refresh-this-buffer)))
+
+(define-key notmuch-search-mode-map "A"
+ (lambda (&optional beg end)
+ "archive thread"
+ (interactive (notmuch-search-interactive-region))
+ (notmuch-search-tag (list "+archive" "-inbox" "-unread") beg end)
+ (notmuch-refresh-this-buffer)))
+
+; Mark as read
+(define-key notmuch-search-mode-map "r"
+ (lambda (&optional beg end)
+ "mark thread as read"
+ (interactive (notmuch-search-interactive-region))
+ (notmuch-search-tag (list "-unread") beg end)
+ (notmuch-search-next-thread)))
+
+(define-key notmuch-search-mode-map (kbd "RET")
+ (lambda ()
+ "Show the selected thread with notmuch-tree if it has more
+than one email. Use notmuch-show otherwise."
+ (interactive)
+ (if (= (plist-get (notmuch-search-get-result) :total) 1)
+ (notmuch-search-show-thread)
+ (notmuch-tree (notmuch-search-find-thread-id)
+ notmuch-search-query-string
+ nil
+ (notmuch-prettify-subject (notmuch-search-find-subject))))))
+
+(defun color-inbox-if-unread () (interactive)
+ (save-excursion
+ (goto-char (point-min))
+ (let ((cnt (car (process-lines "notmuch" "count" "tag:inbox and tag:unread"))))
+ (when (> (string-to-number cnt) 0)
+ (save-excursion
+ (when (search-forward "inbox" (point-max) t)
+ (let* ((overlays (overlays-in (match-beginning 0) (match-end 0)))
+ (overlay (car overlays)))
+ (when overlay
+ (overlay-put overlay 'face '((:inherit bold) (:foreground "green")))))))))))
+
+(defvar notmuch-hello-refresh-count 0)
+(defun notmuch-hello-refresh-status-message ()
+ (let* ((new-count
+ (string-to-number
+ (car (process-lines notmuch-command "count"))))
+ (diff-count (- new-count notmuch-hello-refresh-count)))
+ (cond
+ ((= notmuch-hello-refresh-count 0)
+ (message "You have %s messages."
+ (notmuch-hello-nice-number new-count)))
+ ((> diff-count 0)
+ (message "You have %s more messages since last refresh."
+ (notmuch-hello-nice-number diff-count)))
+ ((< diff-count 0)
+ (message "You have %s fewer messages since last refresh."
+ (notmuch-hello-nice-number (- diff-count)))))
+ (setq notmuch-hello-refresh-count new-count)))
+
+(add-hook 'notmuch-hello-refresh-hook 'color-inbox-if-unread)
+(add-hook 'notmuch-hello-refresh-hook 'notmuch-hello-refresh-status-message)
+
+(setq notmuch-hello-sections '(notmuch-hello-insert-saved-searches
+ notmuch-hello-insert-search
+ notmuch-hello-insert-recent-searches
+ notmuch-hello-insert-alltags
+ ))
+
+;; https://git.sr.ht/~tslil/dotfiles/tree/4e51afbb/emacs/notmuch-config.el#L76-82
+(defmacro make-binds (mode-map binds argfunc &rest body)
+ "Create keybindings in `mode-map' using a list of (keystr . arg)
+pairs in `binds' of the form ( ... (argfunc arg) body)."
+ `(progn ,@(mapcar (lambda (pair)
+ `(define-key ,mode-map (kbd ,(car pair))
+ (lambda () (interactive) (,argfunc ,(cdr pair)) ,@body)))
+ (eval binds))))
+
+(defvar notmuch-hello-tree-searches '(("u" . "tag:unread")
+ ("i" . "tag:inbox")
+ ("*" . "*"))
+ "List of (key . query) pairs to bind in notmuch-hello.")
+
+(make-binds notmuch-hello-mode-map
+ notmuch-hello-tree-searches
+ notmuch-search)
diff --git a/.emacs.d/rul-init.d/projectile.el b/.emacs.d/rul-init.d/projectile.el
new file mode 100644
index 0000000..ed95775
--- /dev/null
+++ b/.emacs.d/rul-init.d/projectile.el
@@ -0,0 +1,8 @@
+;; Debian packages: elpa-projectile
+
+(use-package projectile
+ :hook
+ (after-init . projectile-global-mode)
+ :config
+ (setq projectile-completion-system 'ivy)
+)
diff --git a/.emacs.d/rul-init.d/python.el b/.emacs.d/rul-init.d/python.el
new file mode 100644
index 0000000..3186c72
--- /dev/null
+++ b/.emacs.d/rul-init.d/python.el
@@ -0,0 +1 @@
+(add-hook 'python-mode-hook 'py-autopep8-enable-on-save)
diff --git a/.emacs.d/rul-init.d/sml.el b/.emacs.d/rul-init.d/sml.el
new file mode 100644
index 0000000..247d9b2
--- /dev/null
+++ b/.emacs.d/rul-init.d/sml.el
@@ -0,0 +1,7 @@
+;; Debian packages: elpa-smart-mode-line elpa-smart-mode-line-powerline-theme
+
+(use-package smart-mode-line
+ :ensure t
+ :config
+ (setq sml/theme 'respectful)
+ (sml/setup))
diff --git a/.emacs.d/rul-init.d/staging.el b/.emacs.d/rul-init.d/staging.el
new file mode 100644
index 0000000..7134fc3
--- /dev/null
+++ b/.emacs.d/rul-init.d/staging.el
@@ -0,0 +1,158 @@
+;; Debian packages: elpa-consult elpa-orderless elpa-vertico elpa-marginalia
+
+;; Example configuration for Consult
+(use-package consult
+ ;; Replace bindings. Lazily loaded due by `use-package'.
+ :bind (;; C-c bindings in `mode-specific-map'
+ ("C-c M-x" . consult-mode-command)
+ ("C-c h" . consult-history)
+ ("C-c k" . consult-kmacro)
+ ("C-c m" . consult-man)
+ ("C-c i" . consult-info)
+ ([remap Info-search] . consult-info)
+ ;; C-x bindings in `ctl-x-map'
+ ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command
+ ("C-x b" . consult-buffer) ;; orig. switch-to-buffer
+ ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window
+ ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame
+ ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump
+ ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer
+ ;; Custom M-# bindings for fast register access
+ ("M-#" . consult-register-load)
+ ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated)
+ ("C-M-#" . consult-register)
+ ;; Other custom bindings
+ ("M-y" . consult-yank-pop) ;; orig. yank-pop
+ ;; M-g bindings in `goto-map'
+ ("M-g e" . consult-compile-error)
+ ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck
+ ("M-g g" . consult-goto-line) ;; orig. goto-line
+ ("M-g M-g" . consult-goto-line) ;; orig. goto-line
+ ("M-g o" . consult-outline) ;; Alternative: consult-org-heading
+ ("M-g m" . consult-mark)
+ ("M-g k" . consult-global-mark)
+ ("M-g i" . consult-imenu)
+ ("M-g I" . consult-imenu-multi)
+ ;; M-s bindings in `search-map'
+ ("M-s d" . consult-find)
+ ("M-s D" . consult-locate)
+ ("M-s g" . consult-grep)
+ ("M-s G" . consult-git-grep)
+ ("M-s r" . consult-ripgrep)
+ ("M-s l" . consult-line)
+ ("M-s L" . consult-line-multi)
+ ("M-s k" . consult-keep-lines)
+ ("M-s u" . consult-focus-lines)
+ ;; Isearch integration
+ ("M-s e" . consult-isearch-history)
+ :map isearch-mode-map
+ ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string
+ ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string
+ ("M-s l" . consult-line) ;; needed by consult-line to detect isearch
+ ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch
+ ;; Minibuffer history
+ :map minibuffer-local-map
+ ("M-s" . consult-history) ;; orig. next-matching-history-element
+ ("M-r" . consult-history)) ;; orig. previous-matching-history-element
+
+ ;; Enable automatic preview at point in the *Completions* buffer. This is
+ ;; relevant when you use the default completion UI.
+ :hook (completion-list-mode . consult-preview-at-point-mode)
+
+ ;; The :init configuration is always executed (Not lazy)
+ :init
+
+ ;; Optionally configure the register formatting. This improves the register
+ ;; preview for `consult-register', `consult-register-load',
+ ;; `consult-register-store' and the Emacs built-ins.
+ (setq register-preview-delay 0.5
+ register-preview-function #'consult-register-format)
+
+ ;; Optionally tweak the register preview window.
+ ;; This adds thin lines, sorting and hides the mode line of the window.
+ (advice-add #'register-preview :override #'consult-register-window)
+
+ ;; Use Consult to select xref locations with preview
+ (setq xref-show-xrefs-function #'consult-xref
+ xref-show-definitions-function #'consult-xref)
+
+ ;; Configure other variables and modes in the :config section,
+ ;; after lazily loading the package.
+ :config
+
+ ;; Optionally configure preview. The default value
+ ;; is 'any, such that any key triggers the preview.
+ ;; (setq consult-preview-key 'any)
+ ;; (setq consult-preview-key "M-.")
+ ;; (setq consult-preview-key '("S-<down>" "S-<up>"))
+ ;; For some commands and buffer sources it is useful to configure the
+ ;; :preview-key on a per-command basis using the `consult-customize' macro.
+ (consult-customize
+ consult-theme :preview-key '(:debounce 0.2 any)
+ consult-ripgrep consult-git-grep consult-grep
+ consult-bookmark consult-recent-file consult-xref
+ consult--source-bookmark consult--source-file-register
+ consult--source-recent-file consult--source-project-recent-file
+ ;; :preview-key "M-."
+ :preview-key '(:debounce 0.4 any))
+
+ ;; Optionally configure the narrowing key.
+ ;; Both < and C-+ work reasonably well.
+ (setq consult-narrow-key "<") ;; "C-+"
+
+ ;; Optionally make narrowing help available in the minibuffer.
+ ;; You may want to use `embark-prefix-help-command' or which-key instead.
+ ;; (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help)
+
+ ;; By default `consult-project-function' uses `project-root' from project.el.
+ ;; Optionally configure a different project root function.
+ ;;;; 1. project.el (the default)
+ ;; (setq consult-project-function #'consult--default-project--function)
+ ;;;; 2. vc.el (vc-root-dir)
+ ;; (setq consult-project-function (lambda (_) (vc-root-dir)))
+ ;;;; 3. locate-dominating-file
+ ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git")))
+ ;;;; 4. projectile.el (projectile-project-root)
+ ;; (autoload 'projectile-project-root "projectile")
+ ;; (setq consult-project-function (lambda (_) (projectile-project-root)))
+ ;;;; 5. No project support
+ ;; (setq consult-project-function nil)
+)
+
+;; Enable vertico
+(use-package vertico
+ :init
+ (vertico-mode)
+
+ ;; Different scroll margin
+ ;; (setq vertico-scroll-margin 0)
+
+ ;; Show more candidates
+ ;; (setq vertico-count 20)
+
+ ;; Grow and shrink the Vertico minibuffer
+ ;; (setq vertico-resize t)
+
+ ;; Optionally enable cycling for `vertico-next' and `vertico-previous'.
+ ;; (setq vertico-cycle t)
+ )
+
+;; Enable rich annotations using the Marginalia package
+(use-package marginalia
+ ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding
+ ;; available in the *Completions* buffer, add it to the
+ ;; `completion-list-mode-map'.
+ :bind (:map minibuffer-local-map
+ ("M-A" . marginalia-cycle))
+
+ ;; The :init section is always executed.
+ :init
+
+ ;; Marginalia must be actived in the :init section of use-package such that
+ ;; the mode gets enabled right away. Note that this forces loading the
+ ;; package.
+ (marginalia-mode))
+
+(setq completion-styles '(flex basic)
+ completion-category-defaults nil
+ completion-category-overrides nil)
diff --git a/.emacs.d/rul-init.d/tabbar.el b/.emacs.d/rul-init.d/tabbar.el
new file mode 100644
index 0000000..a492e85
--- /dev/null
+++ b/.emacs.d/rul-init.d/tabbar.el
@@ -0,0 +1,25 @@
+(global-set-key (kbd "C-<next>") 'tab-bar-switch-to-next-tab)
+(global-set-key (kbd "C-<prior>") 'tab-bar-switch-to-prev-tab)
+
+(setq tab-bar-show t)
+
+(defun my/project-create-tab ()
+ (interactive)
+ (tab-bar-new-tab)
+ (magit-status))
+
+(setq project-switch-commands #'my/project-create-tab)
+
+(defun my/switch-to-tab-buffer ()
+ (interactive)
+ (if (project-current)
+ (call-interactively #'projectile-switch-to-buffer)
+ (call-interactively #'switch-to-buffer)))
+
+(global-set-key (kbd "C-x b") #'my/switch-to-tab-buffer)
+
+;; Turn on tab bar mode after startup
+(tab-bar-mode 1)
+
+;; Save the desktop session
+(desktop-save-mode 1)
diff --git a/.emacs.d/rul-init.d/themes.el b/.emacs.d/rul-init.d/themes.el
new file mode 100644
index 0000000..c94d4a1
--- /dev/null
+++ b/.emacs.d/rul-init.d/themes.el
@@ -0,0 +1,47 @@
+(use-package ef-themes :ensure t)
+
+(setq
+ modus-themes-mode-line '(accented borderless padded)
+ modus-themes-region '(bg-only)
+ modus-themes-bold-constructs t
+ modus-themes-italic-constructs t
+ modus-themes-paren-match '(bold intense)
+ modus-themes-headings (quote ((1 . (rainbow variable-pitch 1.3))
+ (2 . (rainbow 1.1))
+ (t . (rainbow))))
+ modus-themes-org-blocks 'tinted
+ )
+
+(use-package dbus)
+(defun mf/set-theme-from-dbus-value (value)
+ "Set the appropiate theme according to the color-scheme setting value."
+ (message "value is %s" value)
+ (if (equal value '1)
+ (progn (message "Switch to dark theme")
+ (modus-themes-select 'modus-vivendi-tinted))
+ (progn (message "Switch to light theme")
+ (modus-themes-select 'modus-operandi-tinted))))
+
+(defun mf/color-scheme-changed (path var value)
+ "DBus handler to detect when the color-scheme has changed."
+ (when (and (string-equal path "org.freedesktop.appearance")
+ (string-equal var "color-scheme"))
+ (mf/set-theme-from-dbus-value (car value))
+ ))
+
+;; Register for future changes
+(dbus-register-signal
+ :session "org.freedesktop.portal.Desktop"
+ "/org/freedesktop/portal/desktop" "org.freedesktop.portal.Settings"
+ "SettingChanged"
+ #'mf/color-scheme-changed)
+
+;; Request the current color-scheme
+(dbus-call-method-asynchronously
+ :session "org.freedesktop.portal.Desktop"
+ "/org/freedesktop/portal/desktop" "org.freedesktop.portal.Settings"
+ "Read"
+ (lambda (value) (mf/set-theme-from-dbus-value (caar value)))
+ "org.freedesktop.appearance"
+ "color-scheme"
+ )
diff --git a/.emacs.d/rul-init.d/vterm.el b/.emacs.d/rul-init.d/vterm.el
new file mode 100644
index 0000000..54abbbf
--- /dev/null
+++ b/.emacs.d/rul-init.d/vterm.el
@@ -0,0 +1,6 @@
+(use-package multi-vterm
+:ensure t
+:config
+(setq
+ vterm-max-scrollback 100000
+))
diff --git a/.emacs.d/rul-init.d/which-key.el b/.emacs.d/rul-init.d/which-key.el
new file mode 100644
index 0000000..1d8fd8d
--- /dev/null
+++ b/.emacs.d/rul-init.d/which-key.el
@@ -0,0 +1,5 @@
+(use-package which-key
+ :ensure t
+ :config
+ (which-key-mode)
+)
diff --git a/.emacs.d/rul-init.d/writeroom.el b/.emacs.d/rul-init.d/writeroom.el
new file mode 100644
index 0000000..50780cc
--- /dev/null
+++ b/.emacs.d/rul-init.d/writeroom.el
@@ -0,0 +1,34 @@
+(use-package writeroom-mode
+ :defer t
+ :config
+ (setq writeroom-width 140
+ writeroom-mode-line nil
+ writeroom-global-effects '(writeroom-set-bottom-divider-width
+ writeroom-set-internal-border-width
+ (lambda (arg)
+ (let ((langs '("python"
+ "emacs-lisp"
+ "common-lisp"
+ "js"
+ "ruby")))
+ (cond
+ ((= arg 1)
+ (progn
+ (setq org-src-block-faces
+ (mapcar (lambda (lang) (list lang '(:family "Source Code Pro" :height 0.8))) langs))
+ (normal-mode)
+ (variable-pitch-mode)))
+ ((= arg -1)
+ (progn
+ (setq org-src-block-faces
+ (mapcar (lambda (lang) (list lang '(:family "Source Code Pro" :height 1.0))) langs))
+ (normal-mode)
+ (variable-pitch-mode)
+(variable-pitch-mode)))))))))
+
+(use-package olivetti
+ :defer t
+ :config
+ (setq
+ olivetti-body-width 86
+ ))
nihil fit ex nihilo