summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Gonzalez <roger@rogs.me>2023-10-01 22:41:52 -0300
committerRoger Gonzalez <roger@rogs.me>2023-10-01 22:41:52 -0300
commit9dcc0b756204771137cdd28239a2e29f03c1c41f (patch)
treed4dfcb03218e7a20551841db90e5c53ae3c18a9a
parent803aca06e3f3c2e39cc492ee5c66b1c631d22628 (diff)
Changed Emacs config to a literate config
-rw-r--r--.config/doom/config.el274
-rw-r--r--.config/doom/config.org583
-rw-r--r--.config/doom/init.el2
-rw-r--r--.config/doom/packages.el2
4 files changed, 671 insertions, 190 deletions
diff --git a/.config/doom/config.el b/.config/doom/config.el
index 7758c93b..51878c0d 100644
--- a/.config/doom/config.el
+++ b/.config/doom/config.el
@@ -1,46 +1,12 @@
-;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
-
-;; Place your private configuration here! Remember, you do not need to run 'doom
-;; sync' after modifying this file!
-
-
-;; Some functionality uses this to identify you, e.g. GPG configuration, email
-;; clients, file templates and snippets.
(setq user-full-name "Roger Gonzalez"
user-mail-address "roger@rogs.me")
-;; Add custom packages
-(add-to-list 'load-path "~/.config/doom/custom-packages")
+(if (not (eq system-type 'darwin))
+ (progn
+ (setq doom-font (font-spec :family "MesloLGS NF" :size 14)
+ doom-variable-pitch-font (font-spec :family "sans")
+ doom-big-font (font-spec :family "MesloLGS NF" :size 24))))
-;; Load custom packages
-(require 'screenshot)
-(require 'ox-slack)
-(require 'deferred)
-(require 'private) ;; Private file. Generate manually
-
-;; 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:
-;; (setq doom-font (font-spec :family "monospace" :size 12 :weight 'semi-light)
-;; doom-variable-pitch-font (font-spec :family "sans" :size 13))
-
-(setq doom-font (font-spec :family "Mononoki Nerd Font" :size 14)
- doom-variable-pitch-font (font-spec :family "sans")
- doom-big-font (font-spec :family "Mononoki Nerd Font" :size 24))
-(setq doom-font (font-spec :family "MesloLGS NF" :size 14)
- doom-variable-pitch-font (font-spec :family "sans")
- doom-big-font (font-spec :family "MesloLGS NF" :size 24))
-
-;; There are two ways to load a theme. Both assume the theme is installed and
-;; available. You can either set `doom-theme' or manually load a theme with the
-;; `load-theme' function. This is the default:
(after! doom-themes
(setq doom-themes-enable-bold t
doom-themes-enable-italic t))
@@ -49,87 +15,11 @@
'(font-lock-keyword-face :slant italic))
(setq doom-theme 'doom-badger)
-;; Update init file
-;; More info here: https://github.com/doomemacs/doomemacs/issues/581#issuecomment-645448095
-(defun doom/ediff-init-and-example ()
- "ediff the current `init.el' with the example in doom-emacs-dir"
- (interactive)
- (ediff-files (concat doom-user-dir "init.el")
- (concat doom-emacs-dir "templates/init.example.el")))
-
-(define-key! help-map "di" #'doom/ediff-init-and-example)
+(setq display-line-numbers-type 'relative)
-;; If you use `org' and don't want your org files in the default location below,
-;; change `org-directory'. It must be set before org loads!
(setq org-directory "~/org/")
(setq org-roam-directory "~/roam/")
-;; This determines the style of line numbers in effect. If set to `nil', line
-;; numbers are disabled. For relative line numbers, set this to `relative'.
-(setq display-line-numbers-type 'relative)
-
-
-;; Here are some additional functions/macros that could help you configure Doom:
-;;
-;; - `load!' for loading external *.el files relative to this one
-;; - `use-package!' for configuring packages
-;; - `after!' for running code after a package has loaded
-;; - `add-load-path!' for adding directories to the `load-path', relative to
-;; this file. Emacs searches the `load-path' when you load packages with
-;; `require' or `use-package'.
-;; - `map!' for binding new keys
-;;
-;; To get information about any of these functions/macros, move the cursor over
-;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k').
-;; This will open documentation for it, including demos of how they are used.
-;;
-;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how
-;; they are implemented.
-;; HTTP Statuses for Helm
-(defvar helm-httpstatus-source
- '((name . "HTTP STATUS")
- (candidates . (("100 Continue") ("101 Switching Protocols")
- ("102 Processing") ("200 OK")
- ("201 Created") ("202 Accepted")
- ("203 Non-Authoritative Information") ("204 No Content")
- ("205 Reset Content") ("206 Partial Content")
- ("207 Multi-Status") ("208 Already Reported")
- ("300 Multiple Choices") ("301 Moved Permanently")
- ("302 Found") ("303 See Other")
- ("304 Not Modified") ("305 Use Proxy")
- ("307 Temporary Redirect") ("400 Bad Request")
- ("401 Unauthorized") ("402 Payment Required")
- ("403 Forbidden") ("404 Not Found")
- ("405 Method Not Allowed") ("406 Not Acceptable")
- ("407 Proxy Authentication Required") ("408 Request Timeout")
- ("409 Conflict") ("410 Gone")
- ("411 Length Required") ("412 Precondition Failed")
- ("413 Request Entity Too Large")
- ("414 Request-URI Too Large")
- ("415 Unsupported Media Type")
- ("416 Request Range Not Satisfiable")
- ("417 Expectation Failed") ("418 I'm a teapot")
- ("421 Misdirected Request")
- ("422 Unprocessable Entity") ("423 Locked")
- ("424 Failed Dependency") ("425 No code")
- ("426 Upgrade Required") ("428 Precondition Required")
- ("429 Too Many Requests")
- ("431 Request Header Fields Too Large")
- ("449 Retry with") ("500 Internal Server Error")
- ("501 Not Implemented") ("502 Bad Gateway")
- ("503 Service Unavailable") ("504 Gateway Timeout")
- ("505 HTTP Version Not Supported")
- ("506 Variant Also Negotiates")
- ("507 Insufficient Storage") ("509 Bandwidth Limit Exceeded")
- ("510 Not Extended")
- ("511 Network Authentication Required")))
- (action . message)))
-
-(defun helm-httpstatus ()
- (interactive)
- (helm-other-buffer '(helm-httpstatus-source) "*helm httpstatus*"))
-
-;; Org Mode
(after! org
;; Include diary
(setq org-agenda-include-diary t)
@@ -355,17 +245,9 @@ text and copying to the killring."
(require 'org-download)
(add-hook 'dired-mode-hook 'org-download-enable))
-;; My own menu
-(map! :leader
- (:prefix-map ("a" . "applications")
- :desc "HTTP Status cheatsheet" "h" #'helm-httpstatus)
- (:prefix-map ("ao" . "org")
- :desc "Org focus X-Team" "x" #'org-focus-xteam
- :desc "Org focus private" "p" #'org-focus-private
- :desc "Org focus all" "a" #'org-focus-all
- ))
-
-;; Python
+(after! lsp-mode
+ (setq lsp-headerline-breadcrumb-enable t)
+ (setq lsp-headerline-breadcrumb-icons-enable t))
(require 'auto-virtualenv)
(after! python
@@ -373,80 +255,98 @@ text and copying to the killring."
(add-hook 'python-mode-hook 'auto-virtualenv-set-virtualenv)
(setq enable-local-variables :all))
-;; LSP config
-(after! lsp-mode
- (setq lsp-headerline-breadcrumb-enable t)
- (setq lsp-headerline-breadcrumb-icons-enable t))
+(after! groovy-mode
+ (define-key groovy-mode-map (kbd "<f4>") 'my/jenkins-verify))
+
+(setq lsp-go-analyses '((shadow . t)
+ (simplifycompositelit . :json-false)))
+
+(add-to-list 'load-path "~/.config/doom/custom-packages")
+
+(require 'screenshot)
+(require 'private)
+
+(defun rg/ediff-init-and-example ()
+ (interactive)
+ (ediff-files (concat doom-user-dir "init.el")
+ (concat doom-emacs-dir "templates/init.example.el")))
+
+(define-key! help-map "di" #'rg/ediff-init-and-example)
+
+(defvar helm-httpstatus-source
+ '((name . "HTTP STATUS")
+ (candidates . (("100 Continue") ("101 Switching Protocols")
+ ("102 Processing") ("200 OK")
+ ("201 Created") ("202 Accepted")
+ ("203 Non-Authoritative Information") ("204 No Content")
+ ("205 Reset Content") ("206 Partial Content")
+ ("207 Multi-Status") ("208 Already Reported")
+ ("300 Multiple Choices") ("301 Moved Permanently")
+ ("302 Found") ("303 See Other")
+ ("304 Not Modified") ("305 Use Proxy")
+ ("307 Temporary Redirect") ("400 Bad Request")
+ ("401 Unauthorized") ("402 Payment Required")
+ ("403 Forbidden") ("404 Not Found")
+ ("405 Method Not Allowed") ("406 Not Acceptable")
+ ("407 Proxy Authentication Required") ("408 Request Timeout")
+ ("409 Conflict") ("410 Gone")
+ ("411 Length Required") ("412 Precondition Failed")
+ ("413 Request Entity Too Large")
+ ("414 Request-URI Too Large")
+ ("415 Unsupported Media Type")
+ ("416 Request Range Not Satisfiable")
+ ("417 Expectation Failed") ("418 I'm a teapot")
+ ("421 Misdirected Request")
+ ("422 Unprocessable Entity") ("423 Locked")
+ ("424 Failed Dependency") ("425 No code")
+ ("426 Upgrade Required") ("428 Precondition Required")
+ ("429 Too Many Requests")
+ ("431 Request Header Fields Too Large")
+ ("449 Retry with") ("500 Internal Server Error")
+ ("501 Not Implemented") ("502 Bad Gateway")
+ ("503 Service Unavailable") ("504 Gateway Timeout")
+ ("505 HTTP Version Not Supported")
+ ("506 Variant Also Negotiates")
+ ("507 Insufficient Storage") ("509 Bandwidth Limit Exceeded")
+ ("510 Not Extended")
+ ("511 Network Authentication Required")))
+ (action . message)))
+
+(defun helm-httpstatus ()
+ (interactive)
+ (helm-other-buffer '(helm-httpstatus-source) "*helm httpstatus*"))
-;; Create new spikes, saved for later
-;; (defun certn/new-spike ()
-;; "Create a new org spike in ~/org/Lazer/Certn/."
-;; (interactive)
-;; (let ((name (read-string "Ticket: ")))
-;; (expand-file-name (format "%s.org" name) "~/org/Lazer/Certn/Spikes")))
-
-
-;; Dashboard mode
-;; (use-package dashboard
-;; :init ;; tweak dashboard config before loading it
-;; (setq dashboard-set-heading-icons t)
-;; (setq dashboard-set-file-icons t)
-;; (setq dashboard-center-content nil) ;; set to 't' for centered content
-;; (setq dashboard-items '((recents . 5)
-;; (bookmarks . 5)
-;; (projects . 5)))
-;; (setq dashboard-set-navigator t)
-;; :config
-;; (dashboard-setup-startup-hook)
-;; (dashboard-modify-heading-icons '((recents . "file-text")
-;; (bookmarks . "book"))))
-;; (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*")))
-;; (setq doom-fallback-buffer-name "*dashboard*")
-
-(defun my/html2org-clipboard ()
- "Convert clipboard contents from HTML to Org and then paste (yank)."
+(defun rg/html2org-clipboard ()
(interactive)
(kill-new (shell-command-to-string "timeout 1 xclip -selection clipboard -o -t text/html | pandoc -f html -t json | pandoc -f json -t org --wrap=none"))
(yank)
(message "Pasted HTML in org"))
-(define-key org-mode-map (kbd "<f4>") 'my/html2org-clipboard)
+(after! org
+ (define-key org-mode-map (kbd "<f4>") 'rg/html2org-clipboard))
+
+(map! :leader
+ (:prefix-map ("a" . "applications")
+ :desc "HTTP Status cheatsheet" "h" #'helm-httpstatus)
+ (:prefix-map ("ao" . "org")
+ :desc "Org focus X-Team" "x" #'org-focus-xteam
+ :desc "Org focus private" "p" #'org-focus-private
+ :desc "Org focus all" "a" #'org-focus-all
+ ))
-;; Clipmon as emacs clipboard manager
(global-set-key (kbd "M-y") 'helm-show-kill-ring)
(add-to-list 'after-init-hook 'clipmon-mode-start)
(defadvice clipmon--on-clipboard-change (around stop-clipboard-parsing activate) (let ((interprogram-cut-function nil)) ad-do-it))
(setq clipmon-timer-interval 1)
-(after! groovy-mode
- (define-key groovy-mode-map (kbd "<f4>") 'my/jenkins-verify))
+(after! forge
+(add-to-list 'forge-alist '("github.com-underarmour" forge-github-repository)))
-;; Git
-(setq forge-alist '(("github.com-underarmour" "api.github.com" "github.com" forge-github-repository)
- ("github.com" "api.github.com" "github.com" forge-github-repository)
- ("gitlab.com" "gitlab.com/api/v4" "gitlab.com" forge-gitlab-repository)
- ("salsa.debian.org" "salsa.debian.org/api/v4" "salsa.debian.org" forge-gitlab-repository)
- ("framagit.org" "framagit.org/api/v4" "framagit.org" forge-gitlab-repository)
- ("gitlab.gnome.org" "gitlab.gnome.org/api/v4" "gitlab.gnome.org" forge-gitlab-repository)
- ("codeberg.org" "codeberg.org/api/v1" "codeberg.org" forge-gitea-repository)
- ("code.orgmode.org" "code.orgmode.org/api/v1" "code.orgmode.org" forge-gogs-repository)
- ("bitbucket.org" "api.bitbucket.org/2.0" "bitbucket.org" forge-bitbucket-repository)
- ("git.savannah.gnu.org" nil "git.savannah.gnu.org" forge-cgit**-repository)
- ("git.kernel.org" nil "git.kernel.org" forge-cgit-repository)
- ("repo.or.cz" nil "repo.or.cz" forge-repoorcz-repository)
- ("git.suckless.org" nil "git.suckless.org" forge-stagit-repository)
- ("git.sr.ht" nil "git.sr.ht" forge-srht-repository)))
-
-;;;; Use delta instead of the default diff
(add-hook 'magit-mode-hook (lambda () (magit-delta-mode +1)))
-;; ChatGPT
(setq chatgpt-shell-model-version "gpt-4")
(setq chatgpt-shell-streaming "t")
(setq chatgpt-shell-system-prompt "You are a senior developer knowledgeable in every programming language")
-;; Github Copilot
-;; accept completion from copilot and fallback to company
-;; More info https://robert.kra.hn/posts/2023-02-22-copilot-emacs-setup/
(use-package! copilot
:hook (prog-mode . copilot-mode)
:bind (:map copilot-completion-map
@@ -455,18 +355,14 @@ text and copying to the killring."
("C-TAB" . 'copilot-accept-completion-by-word)
("C-<tab>" . 'copilot-accept-completion-by-word)))
-;; PlantUML
(setq plantuml-executable-path "/usr/bin/plantuml")
(setq plantuml-default-exec-mode 'executable)
(setq org-plantuml-exec-mode 'plantuml)
(setq plantuml-server-url 'nil)
-(add-to-list 'org-src-lang-modes '("plantuml" . plantuml))
(org-babel-do-load-languages 'org-babel-load-languages '((plantuml . t)))
(add-to-list 'auto-mode-alist '("\\.plantuml\\'" . plantuml-mode))
(setq org-babel-default-header-args:plantuml
'((:results . "verbatim") (:exports . "results") (:cache . "no")))
-
-;; Go
-(setq lsp-go-analyses '((shadow . t)
- (simplifycompositelit . :json-false)))
+(after! org
+(add-to-list 'org-src-lang-modes '("plantuml" . plantuml)))
diff --git a/.config/doom/config.org b/.config/doom/config.org
new file mode 100644
index 00000000..dd8069f3
--- /dev/null
+++ b/.config/doom/config.org
@@ -0,0 +1,583 @@
+#+TITLE: rogs DOOM Emacs config
+#+AUTHOR: Roger Gonzalez (rogs)
+#+DESCRIPTION: rogs personal Doom Emacs config.
+
+* Basic configuration
+:PROPERTIES:
+:ID: 4e8ec984-b517-4e34-b018-7464650b2b9f
+:END:
+
+First off, set my user and email
+#+begin_src emacs-lisp
+(setq user-full-name "Roger Gonzalez"
+ user-mail-address "roger@rogs.me")
+#+end_src
+
+* Look and feel
+:PROPERTIES:
+:ID: 0b198a7a-c736-4dd4-84a3-0ea21bcdc4fb
+:END:
+
+This part of the configuration focus on the look and feel of Doom Emacs.
+
+** Fonts
+:PROPERTIES:
+:ID: b4df4ef4-d0ca-4047-90b3-f4128425aa9f
+:END:
+
+This works only in Linux. On MacOS we keep the default fonts.
+
+#+begin_src emacs-lisp
+(if (not (eq system-type 'darwin))
+ (progn
+ (setq doom-font (font-spec :family "MesloLGS NF" :size 14)
+ doom-variable-pitch-font (font-spec :family "sans")
+ doom-big-font (font-spec :family "MesloLGS NF" :size 24))))
+#+end_src
+
+** Theme
+:PROPERTIES:
+:ID: 3bae130e-3336-4bc7-9378-82c315e2aea6
+:END:
+
+#+begin_src emacs-lisp
+(after! doom-themes
+ (setq doom-themes-enable-bold t
+ doom-themes-enable-italic t))
+(custom-set-faces!
+ '(font-lock-comment-face :slant italic)
+ '(font-lock-keyword-face :slant italic))
+(setq doom-theme 'doom-badger)
+#+end_src
+
+** Misc
+:PROPERTIES:
+:ID: cf3c202b-7610-4038-8e15-654a95a9d1dc
+:END:
+
+*** Display relative numbers on the buffer
+:PROPERTIES:
+:ID: 6a510691-0b78-44b8-ab92-518971051d8a
+:END:
+#+begin_src emacs-lisp
+(setq display-line-numbers-type 'relative)
+#+end_src
+
+* Org Mode + Org Roam
+:PROPERTIES:
+:ID: 96b93a81-3272-4f7a-a667-8a8783849d64
+:END:
+
+The big one. My entire life is in Org Mode and/or Org Roam.
+
+** Set the directory
+:PROPERTIES:
+:ID: 99cbc04c-604c-4427-94fc-aa0603c78809
+:END:
+
+#+begin_src emacs-lisp
+(setq org-directory "~/org/")
+(setq org-roam-directory "~/roam/")
+#+end_src
+
+** Configuration
+:PROPERTIES:
+:ID: 37915445-e875-4da0-bab0-3f8f8b8e89f5
+:END:
+
+TODO: Breakup later
+
+#+begin_src emacs-lisp
+(after! org
+ ;; Include diary
+ (setq org-agenda-include-diary t)
+ ;; Logs
+ (setq org-log-state-notes-insert-after-drawers nil
+ org-log-into-drawer "LOGBOOK"
+ org-log-done 'time
+ org-log-repeat 'time
+ org-log-redeadline 'note
+ org-log-reschedule 'note)
+ ;; Keyword and faces
+ (setq-default org-todo-keywords
+ '((sequence "REPEAT(r)" "NEXT(n@/!)" "DELEGATED(e@/!)" "TODO(t@/!)" "WAITING(w@/!)" "SOMEDAY(s@/!)" "PROJ(p)" "|" "DONE(d@)" "CANCELLED(c@/!)" "FORWARDED(f@)")))
+ (setq-default org-todo-keyword-faces
+ '(
+ ( "REPEAT" . (:foreground "white" :background "indigo" :weight bold))
+ ( "NEXT" . (:foreground "red" :background "orange" :weight bold))
+ ( "DELEGATED" . (:foreground "white" :background "blue" :weight bold))
+ ( "TODO" . (:foreground "white" :background "violet" :weight bold))
+ ( "WAITING" (:foreground "white" :background "#A9BE00" :weight bold))
+ ( "SOMEDAY" . (:foreground "white" :background "#00807E" :weight bold))
+ ( "PROJ" . (:foreground "white" :background "deeppink3" :weight bold))
+ ( "DONE" . (:foreground "white" :background "forest green" :weight bold))
+ ( "CANCELLED" . (:foreground "light gray" :slant italic))
+ ( "FORWARDED" . (:foreground "light gray" :slant italic))
+ ))
+ (setq org-fontify-done-headline t)
+ (setq org-fontify-todo-headline t)
+ ;; Priorities
+ ;; A: Do it now
+ ;; B: Decide when to do it
+ ;; C: Delegate it
+ ;; D: Just an idea
+ (setq org-highest-priority ?A)
+ (setq org-lowest-priority ?D)
+ (setq org-default-priority ?B)
+ (setq org-priority-faces '((?A . (:foreground "white" :background "dark red" :weight bold))
+ (?B . (:foreground "white" :background "dark green" :weight bold))
+ (?C . (:foreground "yellow"))
+ (?D . (:foreground "gray"))))
+ ;; Capture templates
+ (setq org-capture-templates
+ (quote
+ (
+ ("G" "Define a goal" entry (file+headline "~/org/capture.org" "Capture") (file "~/org/templates/goal.org") :empty-lines-after 1)
+ ("R" "REPEAT entry" entry (file+headline "~/org/capture.org" "Capture") (file "~/org/templates/repeat.org") :empty-lines-before 1)
+ ("N" "NEXT entry" entry (file+headline "~/org/capture.org" "Capture") (file "~/org/templates/next.org") :empty-lines-before 1)
+ ("T" "TODO entry" entry (file+headline "~/org/capture.org" "Capture") (file "~/org/templates/todo.org") :empty-lines-before 1)
+ ("W" "WAITING entry" entry (file+headline "~/org/capture.org" "Capture") (file "~/org/templates/waiting.org") :empty-lines-before 1)
+ ("S" "SOMEDAY entry" entry (file+headline "~/org/capture.org" "Capture") (file "~/org/templates/someday.org") :empty-lines-before 1)
+ ("P" "PROJ entry" entry (file+headline "~/org/capture.org" "Capture") (file "~/org/templates/proj.org") :empty-lines-before 1)
+ ("B" "Book on the to-read-list" entry (file+headline "~/org/private.org" "Libros para leer") (file "~/org/templates/book.org") :empty-lines-after 2)
+ ("p" "Create a daily plan")
+ ("pP" "Daily plan private" plain (file+olp+datetree "~/org/plan-free.org") (file "~/org/templates/dailyplan.org") :immediate-finish t :jump-to-captured t)
+ ("pX" "Daily plan X-Team" plain (file+olp+datetree "~/org/plan-xteam.org") (file "~/org/templates/dailyplan.org") :immediate-finish t :jump-to-captured t)
+ ("j" "Journal entry")
+ ("jP" "Journal entry private" entry (file+olp+datetree "~/org/journal-private.org") "** %U - %^{Heading}")
+ ("jX" "Journal entry X-Team" entry (file+olp+datetree "~/org/journal-xteam.org") "** %U - %^{Heading}")
+ )))
+ ;; Custom agenda views
+ (setq org-agenda-custom-commands
+ (quote
+ (
+ ("A" . "Agendas")
+ ("AT" "Daily overview"
+ ((tags-todo "URGENT"
+ ((org-agenda-overriding-header "Urgent Tasks")))
+ (tags-todo "RADAR"
+ ((org-agenda-overriding-header "On my radar")))
+ (tags-todo "PHONE+TODO=\"NEXT\""
+ ((org-agenda-overriding-header "Phone Calls")))
+ (tags-todo "COMPANY"
+ ((org-agenda-overriding-header "Cuquitoni")))
+ (tags-todo "SHOPPING"
+ ((org-agenda-overriding-header "Shopping")))
+ (tags-todo "Depth=\"Deep\"/NEXT"
+ ((org-agenda-overriding-header "Next Actions requiring deep work")))
+ (agenda ""
+ ((org-agenda-overriding-header "Today")
+ (org-agenda-span 1)
+ (org-agenda-start-day "1d")
+ (org-agenda-sorting-strategy
+ (quote
+ (time-up priority-down)))))
+ nil nil))
+ ("AW" "Weekly overview" agenda ""
+ ((org-agenda-overriding-header "Weekly overview")))
+ ("AM" "Monthly overview" agenda ""
+ ((org-agenda-overriding-header "Monthly overview"))
+ (org-agenda-span
+ (quote month))
+ (org-deadline-warning-days 0)
+ (org-agenda-sorting-strategy
+ (quote
+ (time-up priority-down tag-up))))
+ ("W" . "Weekly Review Helper")
+ ("Wn" "New tasks" tags "NEW"
+ ((org-agenda-overriding-header "NEW Tasks")))
+ ("Wd" "Check DELEGATED tasks" todo "DELEGATED"
+ ((org-agenda-overriding-header "DELEGATED tasks")))
+ ("Ww" "Check WAITING tasks" todo "WAITING"
+ ((org-agenda-overriding-header "WAITING tasks")))
+ ("Ws" "Check SOMEDAY tasks" todo "SOMEDAY"
+ ((org-agenda-overriding-header "SOMEDAY tasks")))
+ ("Wf" "Check finished tasks" todo "DONE|CANCELLED|FORWARDED"
+ ((org-agenda-overriding-header "Finished tasks")))
+ ("WP" "Planing ToDos (unscheduled) only" todo "TODO|NEXT"
+ ((org-agenda-overriding-header "To plan")
+ (org-agenda-skip-function
+ (quote
+ (org-agenda-skip-entry-if
+ (quote scheduled)
+ (quote deadline)))))))
+ ))
+ ;;
+ ;; Enforce ordered tasks
+ (setq org-enforce-todo-dependencies t)
+ (setq org-enforce-todo-checkbox-dependencies t)
+ (setq org-track-ordered-property-with-tag t)
+
+ ;; Org bullets
+ (require 'org-bullets)
+ (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
+
+ ;; Org recur
+ (use-package org-recur
+ :hook ((org-mode . org-recur-mode)
+ (org-agenda-mode . org-recur-agenda-mode))
+ :demand t
+ :config
+ (define-key org-recur-mode-map (kbd "C-c d") 'org-recur-finish)
+
+ ;; Rebind the 'd' key in org-agenda (default: `org-agenda-day-view').
+ (define-key org-recur-agenda-mode-map (kbd "C-c d") 'org-recur-finish)
+ (define-key org-recur-agenda-mode-map (kbd "C-c 0") 'org-recur-schedule-today)
+
+ (setq org-recur-finish-done t
+ org-recur-finish-archive t))
+
+ ;; Truncate lines to 105 chars
+ ;; Why 105 chars? Because that's the max my screen can handle on vertical split
+ (add-hook 'org-mode-hook #'auto-fill-mode)
+ (setq-default fill-column 105)
+
+ ;; Custom ORG functions
+ ;; Refresh org-agenda after rescheduling a task.
+ (defun org-agenda-refresh ()
+ "Refresh all `org-agenda' buffers."
+ (dolist (buffer (buffer-list))
+ (with-current-buffer buffer
+ (when (derived-mode-p 'org-agenda-mode)
+ (org-agenda-maybe-redo)))))
+
+ (defadvice org-schedule (after refresh-agenda activate)
+ "Refresh org-agenda."
+ (org-agenda-refresh))
+
+ (defun org-focus-private() "Set focus on private things."
+ (interactive)
+ (setq org-agenda-files '("~/org/private.org"))
+ (message "Focusing on private Org files"))
+ (defun org-focus-xteam() "Set focus on X-Team things."
+ (interactive)
+ (setq org-agenda-files '("~/org/xteam.org"))
+ (message "Focusing on X-Team Org files"))
+ (defun org-focus-all() "Set focus on all things."
+ (interactive)
+ (setq org-agenda-files '("~/org/"))
+ (message "Focusing on all Org files"))
+
+ (defun my/org-add-ids-to-headlines-in-file ()
+ "Add ID properties to all headlines in the current file which
+do not already have one."
+ (interactive)
+ (org-map-entries 'org-id-get-create))
+ (add-hook 'org-mode-hook
+ (lambda ()
+ (add-hook 'before-save-hook
+ 'my/org-add-ids-to-headlines-in-file nil 'local)))
+ (defun my/copy-idlink-to-clipboard() "Copy an ID link with the
+headline to killring, if no ID is there then create a new unique
+ID. This function works only in org-mode or org-agenda buffers.
+
+The purpose of this function is to easily construct id:-links to
+org-mode items. If its assigned to a key it saves you marking the
+text and copying to the killring."
+ (interactive)
+ (when (eq major-mode 'org-agenda-mode) ;if we are in agenda mode we switch to orgmode
+ (org-agenda-show)
+ (org-agenda-goto))
+ (when (eq major-mode 'org-mode) ; do this only in org-mode buffers
+ (setq mytmphead (nth 4 (org-heading-components)))
+ (setq mytmpid (funcall 'org-id-get-create))
+ (setq mytmplink (format "[[id:%s][%s]]" mytmpid mytmphead))
+ (kill-new mytmplink)
+ (message "Copied %s to killring (clipboard)" mytmplink)
+ ))
+
+ (global-set-key (kbd "<f5>") 'my/copy-idlink-to-clipboard)
+
+ (defun org-reset-checkbox-state-maybe ()
+ "Reset all checkboxes in an entry if the `RESET_CHECK_BOXES' property is set"
+ (interactive "*")
+ (if (org-entry-get (point) "RESET_CHECK_BOXES")
+ (org-reset-checkbox-state-subtree)))
+
+ (defun org-checklist ()
+ (when (member org-state org-done-keywords) ;; org-state dynamically bound in org.el/org-todo
+ (org-reset-checkbox-state-maybe)))
+
+ (add-hook 'org-after-todo-state-change-hook 'org-checklist)
+
+ (defun org-roam-node-insert-immediate (arg &rest args)
+ (interactive "P")
+ (let ((args (cons arg args))
+ (org-roam-capture-templates (list (append (car org-roam-capture-templates)
+ '(:immediate-finish t)))))
+ (apply #'org-roam-node-insert args)))
+
+ ;; Save all org buffers on each save
+ (add-hook 'auto-save-hook 'org-save-all-org-buffers)
+ (add-hook 'after-save-hook 'org-save-all-org-buffers)
+ (require 'org-download)
+ (add-hook 'dired-mode-hook 'org-download-enable))
+#+end_src
+
+* Programming languages
+:PROPERTIES:
+:ID: fcb176c9-c9e5-42f6-b31d-3dafe8d0f64b
+:END:
+
+** LSP
+:PROPERTIES:
+:ID: 84836840-8642-46ad-8068-dc07086708f3
+:END:
+
+#+begin_src emacs-lisp
+(after! lsp-mode
+ (setq lsp-headerline-breadcrumb-enable t)
+ (setq lsp-headerline-breadcrumb-icons-enable t))
+#+end_src
+
+** Python
+:PROPERTIES:
+:ID: 8f3279cf-53e2-4fe5-b30b-724d2d081cbe
+:END:
+
+#+begin_src emacs-lisp
+(require 'auto-virtualenv)
+(after! python
+ :init
+ (add-hook 'python-mode-hook 'auto-virtualenv-set-virtualenv)
+ (setq enable-local-variables :all))
+#+end_src
+** Groovy
+:PROPERTIES:
+:ID: 8f8956c2-a7a3-4508-8f30-dc7a2f5e105b
+:END:
+
+#+begin_src emacs-lisp
+(after! groovy-mode
+ (define-key groovy-mode-map (kbd "<f4>") 'my/jenkins-verify))
+#+end_src
+
+** Go
+:PROPERTIES:
+:ID: ee0c0fc1-7801-45ba-9302-73a78ce3d329
+:END:
+
+#+begin_src emacs-lisp
+(setq lsp-go-analyses '((shadow . t)
+ (simplifycompositelit . :json-false)))
+#+end_src
+
+* Custom
+:PROPERTIES:
+:ID: cd8a28bd-d91f-4ba8-b637-cb542ff5cca4
+:END:
+
+Here's where custom functionalities get configured.
+
+** Custom packages
+:PROPERTIES:
+:ID: 483ed79c-9eba-4544-8333-dda0139e9a08
+:END:
+
+ | Package name | Description | URL |
+ |-----------------+------------------------------------------------+-----------------------------------------|
+ | ~screenshot.el~ | Good for taking screenshots directly in Emacs. | https://github.com/tecosaur/screenshot |
+ | ~private.el~ | This is a file for private values. | ~./custom-packages/private.el.example~. |
+
+#+begin_src emacs-lisp
+(add-to-list 'load-path "~/.config/doom/custom-packages")
+
+(require 'screenshot)
+(require 'private)
+#+end_src
+
+** Custom functions
+:PROPERTIES:
+:ID: 0888b2db-9a0d-463d-89ad-371fcbfa0473
+:END:
+*** Update DOOM Emacs init.el file
+:PROPERTIES:
+:ID: af485cc4-be52-4bb4-889d-7de8bea1ed66
+:END:
+
+This function brings up a comparisson between the current ~init.el~ file and the example file
+(~templates/init.example.el~). Very useful for upgrading manually.
+
+More info here: https://github.com/doomemacs/doomemacs/issues/581#issuecomment-645448095
+
+#+begin_src emacs-lisp
+(defun rg/ediff-init-and-example ()
+ (interactive)
+ (ediff-files (concat doom-user-dir "init.el")
+ (concat doom-emacs-dir "templates/init.example.el")))
+
+(define-key! help-map "di" #'rg/ediff-init-and-example)
+#+end_src
+*** HTTP Statuses
+:PROPERTIES:
+:ID: 3fa9d843-f163-4f04-8129-918fb57603a4
+:END:
+
+This is a custom helm command that displays all the HTTP status with its description.
+
+#+begin_src emacs-lisp
+(defvar helm-httpstatus-source
+ '((name . "HTTP STATUS")
+ (candidates . (("100 Continue") ("101 Switching Protocols")
+ ("102 Processing") ("200 OK")
+ ("201 Created") ("202 Accepted")
+ ("203 Non-Authoritative Information") ("204 No Content")
+ ("205 Reset Content") ("206 Partial Content")
+ ("207 Multi-Status") ("208 Already Reported")
+ ("300 Multiple Choices") ("301 Moved Permanently")
+ ("302 Found") ("303 See Other")
+ ("304 Not Modified") ("305 Use Proxy")
+ ("307 Temporary Redirect") ("400 Bad Request")
+ ("401 Unauthorized") ("402 Payment Required")
+ ("403 Forbidden") ("404 Not Found")
+ ("405 Method Not Allowed") ("406 Not Acceptable")
+ ("407 Proxy Authentication Required") ("408 Request Timeout")
+ ("409 Conflict") ("410 Gone")
+ ("411 Length Required") ("412 Precondition Failed")
+ ("413 Request Entity Too Large")
+ ("414 Request-URI Too Large")
+ ("415 Unsupported Media Type")
+ ("416 Request Range Not Satisfiable")
+ ("417 Expectation Failed") ("418 I'm a teapot")
+ ("421 Misdirected Request")
+ ("422 Unprocessable Entity") ("423 Locked")
+ ("424 Failed Dependency") ("425 No code")
+ ("426 Upgrade Required") ("428 Precondition Required")
+ ("429 Too Many Requests")
+ ("431 Request Header Fields Too Large")
+ ("449 Retry with") ("500 Internal Server Error")
+ ("501 Not Implemented") ("502 Bad Gateway")
+ ("503 Service Unavailable") ("504 Gateway Timeout")
+ ("505 HTTP Version Not Supported")
+ ("506 Variant Also Negotiates")
+ ("507 Insufficient Storage") ("509 Bandwidth Limit Exceeded")
+ ("510 Not Extended")
+ ("511 Network Authentication Required")))
+ (action . message)))
+
+(defun helm-httpstatus ()
+ (interactive)
+ (helm-other-buffer '(helm-httpstatus-source) "*helm httpstatus*"))
+#+end_src
+
+*** Convert HTML to org
+:PROPERTIES:
+:ID: b81dff7f-9bc5-4601-97fe-6c2b9e78366c
+:END:
+
+Depends on ~pandoc~ and ~xclip~.
+
+Convert clipboard contents from HTML to Org and then paste (yank).
+
+#+begin_src emacs-lisp
+(defun rg/html2org-clipboard ()
+ (interactive)
+ (kill-new (shell-command-to-string "timeout 1 xclip -selection clipboard -o -t text/html | pandoc -f html -t json | pandoc -f json -t org --wrap=none"))
+ (yank)
+ (message "Pasted HTML in org"))
+(after! org
+ (define-key org-mode-map (kbd "<f4>") 'rg/html2org-clipboard))
+#+end_src
+*** My own menu
+:PROPERTIES:
+:ID: 60a0316f-8bb8-40fe-af45-e42cdb6da60a
+:END:
+
+This is a custom menu for my own functions
+
+#+begin_src emacs-lisp
+(map! :leader
+ (:prefix-map ("a" . "applications")
+ :desc "HTTP Status cheatsheet" "h" #'helm-httpstatus)
+ (:prefix-map ("ao" . "org")
+ :desc "Org focus X-Team" "x" #'org-focus-xteam
+ :desc "Org focus private" "p" #'org-focus-private
+ :desc "Org focus all" "a" #'org-focus-all
+ ))
+#+end_src
+* Misc
+:PROPERTIES:
+:ID: b57fe5fe-18ce-4215-ba94-8deee3a2b64f
+:END:
+** Clipmon
+:PROPERTIES:
+:ID: 7b6776af-f357-4f87-9850-4eae4f8daa76
+:END:
+
+Clipmon is my clipboard manager in Emacs.
+
+#+begin_src emacs-lisp
+(global-set-key (kbd "M-y") 'helm-show-kill-ring)
+(add-to-list 'after-init-hook 'clipmon-mode-start)
+(defadvice clipmon--on-clipboard-change (around stop-clipboard-parsing activate) (let ((interprogram-cut-function nil)) ad-do-it))
+(setq clipmon-timer-interval 1)
+#+end_src
+
+** Git
+:PROPERTIES:
+:ID: 51176440-f985-4c90-94a7-bed48286272c
+:END:
+*** Add UnderArmour to forge-alist
+:PROPERTIES:
+:ID: 559b5963-3aee-480c-a982-7e49fa41c52b
+:END:
+
+I had to do this to manage multiple git profiles.
+
+#+begin_src emacs-lisp
+(after! forge
+(add-to-list 'forge-alist '("github.com-underarmour" forge-github-repository)))
+#+end_src
+
+*** Set ~delta~ as the default magit diff
+:PROPERTIES:
+:ID: fa6dc3cb-50d7-49cd-96cb-e91a122b1316
+:END:
+
+#+begin_src emacs-lisp
+(add-hook 'magit-mode-hook (lambda () (magit-delta-mode +1)))
+#+end_src
+
+** ChatGPT
+:PROPERTIES:
+:ID: 0a32d2a9-2156-42a3-90f7-419ac1a25496
+:END:
+
+#+begin_src emacs-lisp
+(setq chatgpt-shell-model-version "gpt-4")
+(setq chatgpt-shell-streaming "t")
+(setq chatgpt-shell-system-prompt "You are a senior developer knowledgeable in every programming language")
+#+end_src
+** Github Copilot
+:PROPERTIES:
+:ID: 7f88ce20-846c-47e4-aeed-d853212c9db5
+:END:
+
+#+begin_src emacs-lisp
+(use-package! copilot
+ :hook (prog-mode . copilot-mode)
+ :bind (:map copilot-completion-map
+ ("<tab>" . 'copilot-accept-completion)
+ ("TAB" . 'copilot-accept-completion)
+ ("C-TAB" . 'copilot-accept-completion-by-word)
+ ("C-<tab>" . 'copilot-accept-completion-by-word)))
+#+end_src
+
+** PlantUML
+:PROPERTIES:
+:ID: 87ed3201-3df7-4ee1-a4ce-4fe8312f9d08
+:END:
+
+#+begin_src emacs-lisp
+(setq plantuml-executable-path "/usr/bin/plantuml")
+(setq plantuml-default-exec-mode 'executable)
+(setq org-plantuml-exec-mode 'plantuml)
+(setq plantuml-server-url 'nil)
+
+(org-babel-do-load-languages 'org-babel-load-languages '((plantuml . t)))
+(add-to-list 'auto-mode-alist '("\\.plantuml\\'" . plantuml-mode))
+(setq org-babel-default-header-args:plantuml
+ '((:results . "verbatim") (:exports . "results") (:cache . "no")))
+(after! org
+(add-to-list 'org-src-lang-modes '("plantuml" . plantuml)))
+#+end_src
diff --git a/.config/doom/init.el b/.config/doom/init.el
index 10dc999a..6ae1f4c4 100644
--- a/.config/doom/init.el
+++ b/.config/doom/init.el
@@ -196,5 +196,5 @@
;;twitter ; twitter client https://twitter.com/vnought
:config
- ;;literate
+ literate
(default +bindings +smartparens))
diff --git a/.config/doom/packages.el b/.config/doom/packages.el
index 1dca1bb1..02122738 100644
--- a/.config/doom/packages.el
+++ b/.config/doom/packages.el
@@ -70,3 +70,5 @@
(package! magit-delta)
(package! org-download)
(package! axe)
+(package! deferred)
+(package! ox-slack)