2020-05-31 21:14:41 +02:00
#+STARTUP : content
2020-05-31 21:15:17 +02:00
* Table of Contents :TOC_3:
2020-04-10 17:40:46 +02:00
- [[#misc ][Misc ]]
2020-05-31 21:24:27 +02:00
- [[#lexical-bindings ][Lexical bindings ]]
- [[#dir-local-variables ][Dir local variables ]]
2020-12-25 22:56:15 +01:00
- [[#taking-svg-screenshots ][Taking SVG screenshots ]]
2020-05-23 12:55:05 +02:00
- [[#theme ][Theme ]]
2020-05-31 21:24:27 +02:00
- [[#main-theme ][Main theme ]]
2020-05-23 15:33:17 +02:00
- [[#dark-theme-toggle ][Dark theme toggle ]]
2020-04-10 17:40:46 +02:00
- [[#font ][Font ]]
- [[#line-numbers ][Line numbers ]]
2020-04-15 09:52:00 +02:00
- [[#battery-indicator ][Battery indicator ]]
2020-04-10 17:40:46 +02:00
- [[#programming ][Programming ]]
2022-02-07 17:06:41 +01:00
- [[#tridactyl-mode ][Tridactyl mode ]]
2020-08-03 16:24:17 +02:00
- [[#smart-parens ][Smart parens ]]
2020-04-10 17:40:46 +02:00
- [[#rust ][Rust ]]
2020-08-03 17:08:08 +02:00
- [[#column-width ][Column width ]]
2020-12-31 02:03:49 +01:00
- [[#run-clippy-in-rust-analyzer ][Run clippy in rust-analyzer ]]
2021-10-13 18:29:49 +02:00
- [[#enable-proc-macro-support ][Enable proc macro support ]]
2020-04-10 17:40:46 +02:00
- [[#cc ][C/C++ ]]
2020-05-31 21:24:27 +02:00
- [[#default-style ][Default style ]]
2020-04-10 18:35:06 +02:00
- [[#org-mode ][Org mode ]]
2020-04-27 23:41:49 +02:00
- [[#directory ][Directory ]]
2020-05-23 12:55:31 +02:00
- [[#appearance ][Appearance ]]
2020-05-31 21:24:27 +02:00
- [[#fancier-ellipsis-indicator ][Fancier ellipsis indicator ]]
2022-04-09 18:18:44 +02:00
- [[#logging ][Logging ]]
2022-04-09 19:04:47 +02:00
- [[#archiving ][Archiving ]]
2020-04-11 16:59:02 +02:00
- [[#agenda-setup ][Agenda setup ]]
2020-05-31 21:24:27 +02:00
- [[#default-task-keywords ][Default task keywords ]]
- [[#org-capture-setup ][Org capture setup ]]
- [[#main-agenda-view ][Main agenda view ]]
- [[#habits ][Habits ]]
2020-06-05 12:46:38 +02:00
- [[#save-all-org-buffers-shortcut ][Save all org buffers shortcut ]]
2020-04-12 22:50:39 +02:00
- [[#roam ][Roam ]]
2020-05-31 21:24:27 +02:00
- [[#roam-directory ][Roam Directory ]]
2020-05-14 00:52:30 +02:00
- [[#export-backends ][Export backends ]]
2020-04-11 16:59:02 +02:00
- [[#doom-specific ][Doom specific ]]
2020-10-07 11:09:17 +02:00
- [[#magit ][Magit ]]
2021-01-03 01:25:10 +01:00
- [[#gitlab-ci-skip-flag ][Gitlab CI skip flag ]]
2021-11-30 14:56:08 +01:00
- [[#magit-delta ][magit-delta ]]
2021-03-18 01:14:28 +01:00
- [[#email ][Email ]]
- [[#account-configuration ][Account configuration ]]
2022-04-10 00:52:40 +02:00
- [[#sending-mail ][Sending mail ]]
2021-03-18 01:14:28 +01:00
- [[#disable-org-msg-by-default ][Disable =org-msg= by default ]]
2021-03-18 19:21:57 +01:00
- [[#message-quoting-style ][Message quoting style ]]
2021-03-30 00:02:54 +02:00
- [[#use-gnus-view-for-mu4e ][Use Gnus view for =mu4e= ]]
- [[#disable-formatflowed ][Disable format=flowed ]]
- [[#add-git-apply-path-to-mu4e-actions ][Add git-apply-path to mu4e actions ]]
2020-04-10 17:40:46 +02:00
2020-04-10 17:40:18 +02:00
* Misc
2020-05-31 21:24:27 +02:00
** Lexical bindings
2020-04-10 17:40:18 +02:00
Enable lexical binding, of course...
#+BEGIN_SRC emacs-lisp
;;; -*- lexical-binding: t; -* -
#+END_SRC
2020-05-31 21:24:27 +02:00
** Dir local variables
Disable these because I don't use them and don't want to get prompted by them in
some projects.
2020-04-10 17:40:18 +02:00
#+BEGIN_SRC emacs-lisp
(setq enable-dir-local-variables nil)
#+END_SRC
2020-12-25 22:56:15 +01:00
** Taking SVG screenshots
Since Emacs 27, we can take SVG screenshots! Emacs needs to be built with
=cairo= to support this.
#+begin_src emacs-lisp
(defun screenshot-svg ()
"Save a screenshot of the current frame as an SVG image.
Saves to a temp file and puts the filename in the kill ring."
(interactive)
(let* ((filename (make-temp-file "Emacs" nil ".svg"))
(data (x-export-frames nil 'svg)))
(with-temp-file filename
(insert data))
(kill-new filename)
(message filename)))
#+end_src
2020-05-23 12:55:05 +02:00
* Theme
2020-05-31 21:24:27 +02:00
** Main theme
2020-05-23 12:55:05 +02:00
A list of all doom themes can be found here:
https://github.com/hlissner/emacs-doom-themes
#+BEGIN_SRC emacs-lisp
(setq doom-theme 'doom-solarized-light)
#+END_SRC
2020-04-10 16:57:07 +02:00
2020-05-23 15:33:17 +02:00
** Dark theme toggle
I've come to prefer using a light theme during the day, and a dark theme at
night. Using a dark theme with daylight leads to cranking up the screen
brightness, which hurts my eyes more than using the light theme.
Set my light and dark themes:
#+BEGIN_SRC emacs-lisp
(setq my/light-theme doom-theme
my/dark-theme 'doom-one)
#+END_SRC
Function to toggle between the two easily:
#+BEGIN_SRC emacs-lisp
(defun my/toggle-dark-theme ()
(interactive)
(if (eq my/dark-theme doom-theme)
(load-theme my/light-theme t)
(load-theme my/dark-theme t)))
#+END_SRC
Bind this to =SPC t d= :
#+BEGIN_SRC emacs-lisp
(map! :leader
(:prefix-map ("t" . "toggle")
:desc "Dark theme" "d" #'my/toggle-dark-theme))
#+END_SRC
2020-04-10 16:57:07 +02:00
** Font
Doom exposes five (optional) variables for controlling fonts in Doom. Here are
the three important ones:
- =doom-font=
- =doom-variable-pitch-font=
- =doom-big-font= -- used for =doom-big-font-mode= ; use this for presentations
or streaming.
They all accept either a font-spec, font string (=Input Mono-12= ), or xlfd font
string. You generally only need these two:
#+BEGIN_SRC emacs-lisp
2020-04-21 22:03:44 +02:00
(setq doom-font
2021-04-22 17:14:08 +02:00
(font-spec :family "Iosevka Fixed" :size 10.0 :weight 'medium))
2020-04-10 16:57:07 +02:00
#+END_SRC
** Line numbers
Possible values of =display-line-numbers-type= are =nil= , =t= , and ='relative= .
#+BEGIN_SRC emacs-lisp
2020-12-23 00:45:46 +01:00
(setq display-line-numbers-type 'relative)
2020-04-10 16:57:07 +02:00
#+END_SRC
2020-04-15 09:52:00 +02:00
** Battery indicator
I'm on a laptop, so let's display my battery in the modeline:
#+BEGIN_SRC emacs-lisp
(display-battery-mode 1)
#+END_SRC
2020-04-10 16:57:07 +02:00
* Programming
2022-02-07 17:06:41 +01:00
** Tridactyl mode
#+begin_src emacs-lisp
(defvar tridactylrc-font-lock-keywords
`( ;; Line comment
("^[\t ]*\\(\"\\)\\(.* \\)$"
(1 font-lock-comment-delimiter-face)
(2 font-lock-comment-face))
;; Trailing comment
("[\t ]+\\(\"\\)\\([^\"\r\n]*\\)$"
(1 font-lock-comment-delimiter-face)
(2 font-lock-comment-face))
;; String start:
("\\(\"[^\n\r\"]*\"\\)\\|\\('[^\n\r]* '\\)"
(0 font-lock-string-face)) ;; String end;
))
(defvar tridactylrc-mode-syntax-table
(let ((table (make-syntax-table)))
(modify-syntax-entry ?' "\"" table)
(modify-syntax-entry ?\" "<" table)
(modify-syntax-entry ?\n ">" table)
table))
(define-derived-mode tridactylrc-mode prog-mode "tridactylrc"
"Major mode for editing tridactylrc configuration files."
:group 'tridactylrc-mode
:syntax-table tridactylrc-mode-syntax-table
(font-lock-add-keywords nil tridactylrc-font-lock-keywords)
(setq-local comment-start "\"")
(setq-local comment-end ""))
#+end_src
2020-08-03 16:24:17 +02:00
** Smart parens
Disable smart parens because half of the time it doesn't do what I want:
#+BEGIN_SRC emacs-lisp
(remove-hook 'doom-first-buffer-hook #'smartparens-global-mode)
#+END_SRC
2020-04-10 16:57:07 +02:00
** Rust
2020-08-03 17:08:08 +02:00
*** Column width
2020-06-19 23:17:34 +02:00
=rustfmt= limits lines to 100 characters, let's display it correctly.
#+BEGIN_SRC emacs-lisp
2020-12-25 22:56:49 +01:00
(add-hook! rustic-mode
2020-06-19 23:17:34 +02:00
(set-fill-column 100))
#+END_SRC
2020-12-31 02:03:49 +01:00
*** Run clippy in rust-analyzer
The default is ~"check"~ , but I want clippy lints as well.
#+begin_src emacs-lisp
(setq lsp-rust-analyzer-cargo-watch-command "clippy")
#+end_src
2021-10-13 18:29:49 +02:00
*** Enable proc macro support
By default lsp-mode disable these, I want them.
#+begin_src emacs-lisp
(setq lsp-rust-analyzer-experimental-proc-attr-macros t)
(setq lsp-rust-analyzer-proc-macro-enable t)
#+end_src
2020-04-10 16:57:07 +02:00
** C/C++
2020-05-31 21:24:27 +02:00
*** Default style
2020-04-10 16:57:07 +02:00
Setup the default format for C/C++ editing.
#+BEGIN_SRC emacs-lisp
2020-04-21 23:01:10 +02:00
(add-hook! (c-mode c++-mode)
(setq c-default-style "gnu")
(setq c-basic-offset 2))
2020-04-10 16:57:07 +02:00
#+END_SRC
2020-04-10 18:35:06 +02:00
* Org mode
2020-04-27 23:41:49 +02:00
** Directory
Set a default directory for all my org-mode files.
#+BEGIN_SRC emacs-lisp
(setq org-directory "~/org/ ")
#+END_SRC
2020-05-23 12:55:31 +02:00
** Appearance
2020-05-31 21:24:27 +02:00
*** Fancier ellipsis indicator
2020-05-23 12:55:58 +02:00
#+BEGIN_SRC emacs-lisp
(setq org-ellipsis " ▼ ")
#+END_SRC
2022-04-09 18:18:44 +02:00
** Logging
Log state changes in a src_org{:LOGBOOK:} drawer so that it doesn't pollute the main content.
#+begin_src emacs-lisp
(after! org
(setq org-log-into-drawer t))
#+end_src
2022-04-09 19:04:47 +02:00
** Archiving
I don't want to see archival files appearing when listing files in the current
directory, so hide them by default.
#+begin_src emacs-lisp
(after! org
(setq org-archive-location ".%s_archive::"))
#+end_src
2020-04-11 16:59:02 +02:00
** Agenda setup
2020-05-31 21:24:27 +02:00
*** Default task keywords
2020-04-11 23:03:07 +02:00
Here are the [[https://orgmode.org/manual/TODO-Extensions.html#TODO-Extensions ][keywords ]] I'm using to track task progress. I'm also making use of
some automatic [[https://orgmode.org/manual/Tracking-TODO-state-changes.html#Tracking-TODO-state-changes ][state changes ]].
2020-05-23 13:02:17 +02:00
| keyword | meaning |
|-------------+----------------------------------------------------------|
| =TODO= | Self explanatory |
| =DONE= | This task is finished, no longer displayed in the agenda |
| =CANCELLED= | This task isn't finished but is no longer relevant |
2020-04-11 23:03:07 +02:00
#+BEGIN_SRC emacs-lisp
(after! org
(setq org-todo-keywords
'((sequence
"TODO(t)"
"|"
"DONE(d!)"
"CANCELLED(c@/!)")
(sequence
"[ ](T)"
"|"
"[X](D)"))))
#+END_SRC
2020-05-31 21:24:27 +02:00
*** Org capture setup
2020-04-11 23:03:07 +02:00
Of course I also need to setup [[https://orgmode.org/manual/Capture-templates.html ][capture templates ]]:
The first one just prompts me for a new task to add to my inbox, I can then
[[https://orgmode.org/guide/Refile-and-Copy.html ][refile ]] them where I want later.
The second one exists because I like to keep a separate list of articles /
papers / books to read.
2020-04-10 18:35:06 +02:00
#+BEGIN_SRC emacs-lisp
2020-04-11 16:59:02 +02:00
(after! org
2020-04-11 23:03:07 +02:00
(setq org-capture-templates
2020-05-31 21:24:57 +02:00
'(("t" "New entry" entry (file "inbox.org")
"* TODO %?")
2020-08-27 14:35:36 +02:00
("T" "Task" entry (file+headline "tasks.org" "Misc")
2020-04-11 23:03:07 +02:00
"* TODO %?")
("r" "Reading" entry (file "reading.org")
2020-06-19 10:52:26 +02:00
"* TODO %x"
:immediate-finish t)
("w" "Watching" entry (file "watching.org")
2020-04-16 23:25:23 +02:00
"* TODO %x"
:immediate-finish t))))
2020-04-11 23:03:07 +02:00
#+END_SRC
2020-05-31 21:40:10 +02:00
I also change [[https://github.com/hlissner/doom-emacs/blob/134554dd69d9b1cea3d2190422de580fddf40ecd/modules/config/default/%2Bevil-bindings.el#L265 ][the default Doom binding ]] for ~#'org-capture~ to be =SPC x= instead
of =SPC X= . Also need to rebind what was [[https://github.com/hlissner/doom-emacs/blob/134554dd69d9b1cea3d2190422de580fddf40ecd/modules/config/default/%2Bevil-bindings.el#L264 ][previously bound ]] to =SPC x= , to =SPC
X=.
#+BEGIN_SRC emacs-lisp
(map! :leader
:desc "Org Capture" "x" #'org-capture
:desc "Pop up scratch buffer" "X" #'doom/open-scratch-buffer)
#+END_SRC
2020-05-31 21:24:27 +02:00
*** Main agenda view
2020-04-11 23:03:07 +02:00
All these tasks, once captured, are then centralized in my [[https://orgmode.org/guide/Agenda-Views.html ][agenda view ]].
I'm using multiple categories to organize tasks, depending on their triage /
status (inspired by [[https://blog.jethro.dev/posts/org_mode_workflow_preview/ ]]).
#+BEGIN_SRC emacs-lisp
(after! org-agenda
(setq org-agenda-custom-commands
'((" " "Agenda"
((agenda ""
((org-agenda-span 'day)
(org-agenda-start-day nil)
(org-deadline-warning-days 365)))
(todo "TODO"
((org-agenda-overriding-header "Triage")
(org-agenda-files '("~/org/inbox.org"))))
2021-04-06 15:41:02 +02:00
(todo "TODO"
((org-agenda-overriding-header "Job")
(org-agenda-files '("~/org/job.org"))
(org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline
'scheduled))))
2021-08-06 23:09:57 +02:00
(todo "TODO"
((org-agenda-overriding-header "Tasks")
(org-agenda-files '("~/org/tasks.org"))
(org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline
'scheduled))))
2020-04-11 23:03:07 +02:00
)))))
#+END_SRC
I want the default agenda view to be a weekly view, with a log of what I've done
during the day.
#+BEGIN_SRC emacs-lisp
(after! org-agenda
(setq org-agenda-span 'week)
(setq org-agenda-start-on-weekday 1)
(setq org-agenda-start-with-log-mode '(clock)))
#+END_SRC
I also remove the block separators in the agenda view:
#+BEGIN_SRC emacs-lisp
(after! org-agenda
(setq org-agenda-block-separator ""))
2020-04-10 18:35:06 +02:00
#+END_SRC
2020-04-10 18:52:52 +02:00
2020-05-31 21:24:27 +02:00
*** Habits
2020-05-12 10:48:34 +02:00
Let's enable the =org-habit= module:
#+BEGIN_SRC emacs-lisp
(add-to-list 'org-modules 'org-habit)
#+END_SRC
2020-06-05 12:46:38 +02:00
*** Save all org buffers shortcut
By default bound to =C-x C-s= , rebind it to =SPC m s= in =org-agenda-mode= :
#+BEGIN_SRC emacs-lisp
(map! :after org-agenda
:map org-agenda-mode-map
:localleader
"s" #'org-save-all-org-buffers)
#+END_SRC
2020-04-12 22:50:39 +02:00
** Roam
Setup for [[https://github.com/jethrokuan/org-roam ][org-roam ]].
2020-05-31 21:24:27 +02:00
*** Roam Directory
2020-04-12 22:50:39 +02:00
First, set a directory where =org-roam= will index things.
#+BEGIN_SRC emacs-lisp
(setq org-roam-directory (expand-file-name "notes/" org-directory))
#+END_SRC
2020-05-14 00:52:30 +02:00
** Export backends
Sometimes I need to export an Org subtree to a file, which is quite easy with
the =org= export backend. It doesn't seem to be enabled by default, so let's add
it to the list:
#+BEGIN_SRC emacs-lisp
(after! org
(add-to-list 'org-export-backends 'org))
#+END_SRC
2020-04-11 16:59:02 +02:00
** Doom specific
2022-04-07 19:56:33 +02:00
Doom makes some changes to org-id behaviour which I don't like / think are necessary.
#+begin_src emacs-lisp
(after! org
(setq org-id-locations-file (expand-file-name "~/.config/emacs/ .org-id-locations"))
(setq org-id-locations-file-relative nil))
#+end_src
2020-04-11 16:59:02 +02:00
Doom replaces the default tab behavior on headings, this restores the default
one. Taken from [[https://github.com/hlissner/doom-emacs/tree/develop/modules/lang/org#hacks ][here ]].
2020-04-10 18:52:52 +02:00
#+BEGIN_SRC emacs-lisp
2020-04-11 16:59:02 +02:00
(after! evil-org
(remove-hook 'org-tab-first-hook #'+org-cycle-only-current-subtree-h))
2020-04-10 18:52:52 +02:00
#+END_SRC
2020-10-07 11:09:17 +02:00
* Magit
2021-01-03 01:25:10 +01:00
** Gitlab CI skip flag
This option tells GitLab to skip the CI run for this push, in case I know it's
not ready yet.
2020-10-07 11:09:17 +02:00
#+BEGIN_SRC emacs-lisp
(after! magit
(transient-append-suffix 'magit-push "-n"
'(4 "-s" "Skip GitLab CI" "--push-option=ci.skip")))
#+END_SRC
2021-01-03 01:25:10 +01:00
GitLab push options are documented [[https://docs.gitlab.com/ee/user/project/push_options.html ][here ]].
2021-03-18 01:14:28 +01:00
2021-11-30 14:56:08 +01:00
** magit-delta
#+begin_src emacs-lisp
(use-package! magit-delta
:hook (magit-mode . magit-delta-mode))
#+end_src
2021-03-18 01:14:28 +01:00
* Email
** Account configuration
This setting instructs =mu4e= to prompt for login credentials if none are found
when trying to connect to one of the servers that match the regex (see variable
documentation).
#+begin_src emacs-lisp
2021-03-20 00:32:53 +01:00
(setq smtpmail-servers-requiring-authorization "smtp.migadu.com\\|smtp.lrde.epita.fr")
2021-03-18 01:14:28 +01:00
#+end_src
Setup my main email account.
#+begin_src emacs-lisp
2022-04-10 00:52:40 +02:00
(set-email-account! "alarsyo"
'((mu4e-sent-folder . "/alarsyo/Sent")
(mu4e-drafts-folder . "/alarsyo/Drafts")
(mu4e-refile-folder . "/alarsyo/Archive")
(mu4e-trash-folder . "/alarsyo/Trash")
2021-03-18 01:14:28 +01:00
(user-mail-address . "antoine@alarsyo.net")
(user-full-name . "Antoine Martin")
(mu4e-compose-signature . "Antoine Martin"))
t)
2021-03-20 00:32:53 +01:00
(set-email-account! "lrde"
'((mu4e-sent-folder . "/lrde/Sent")
(mu4e-drafts-folder . "/lrde/Drafts")
(mu4e-trash-folder . "/lrde/Trash")
(user-mail-address . "amartin@lrde.epita.fr")
(user-full-name . "Antoine Martin")
(mu4e-compose-signature . "Antoine Martin"))
nil)
2021-03-18 01:14:28 +01:00
#+end_src
2022-04-10 00:52:40 +02:00
** Sending mail
I use =msmtp= as a SMTP forwarder
#+begin_src emacs-lisp
(after! mu4e
(setq sendmail-program (executable-find "msmtp")
send-mail-function #'smtpmail-send-it
message-sendmail-f-is-evil t
message-sendmail-extra-arguments '("--read-envelope-from")
message-send-mail-function #'message-send-mail-with-sendmail))
#+end_src
2021-03-18 01:14:28 +01:00
** Disable =org-msg= by default
Doom adds a hook, making it impossible to disable. This allows us to toggle it
manually.
#+begin_src emacs-lisp
(remove-hook! mu4e-compose-pre #'org-msg-mode)
#+end_src
2021-03-18 19:21:57 +01:00
** Message quoting style
Has to be duplicated because =mu4e= doesn't use ~message-cite-style~ 's values.
#+begin_src emacs-lisp
(defconst message-cite-style-custom
'((message-cite-function 'message-cite-original-without-signature)
(message-citation-line-function 'message-insert-formatted-citation-line)
(message-cite-reply-position 'traditional)
(message-yank-prefix "> ")
(message-yank-cited-prefix "> ")
(message-yank-empty-prefix ">")
(message-citation-line-format "%f writes:"))
"Message citation style used for email. Use with `message-cite-style'.")
(after! message
(setq message-cite-style message-cite-style-custom
message-cite-function 'message-cite-original-without-signature
message-citation-line-function 'message-insert-formatted-citation-line
message-cite-reply-position 'traditional
message-yank-prefix "> "
message-yank-cited-prefix "> "
message-yank-empty-prefix ">"
message-citation-line-format "%f writes:"))
#+end_src
2021-03-30 00:02:54 +02:00
** Use Gnus view for =mu4e=
#+begin_src emacs-lisp
(after! mu4e
(setq mu4e-view-use-gnus t))
#+end_src
** Disable format=flowed
#+begin_src emacs-lisp
(after! mu4e
(setq mu4e-compose-format-flowed nil))
#+end_src
** Add git-apply-path to mu4e actions
#+begin_src emacs-lisp
(after! mu4e
(add-to-list 'mu4e-view-actions
'("GitApply" . mu4e-action-git-apply-patch) t)
(add-to-list 'mu4e-view-actions
'("MboxGitApply" . mu4e-action-git-apply-mbox) t))
#+end_src