;;; $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. It is optional. ;; (setq user-full-name "John Doe" ;; user-mail-address "john@doe.com") ;; Doom exposes five (optional) variables for controlling fonts in Doom: ;; ;; - `doom-font' -- the primary font to use ;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) ;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for ;; presentations or streaming. ;; - `doom-symbol-font' -- for symbols ;; - `doom-serif-font' -- for the `fixed-pitch-serif' face ;; ;; See 'C-h v doom-font' for documentation and more examples of what they ;; accept. For example: ;; ;;(setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light) ;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13)) ;; ;; If you or Emacs can't find your font, use 'M-x describe-font' to look them ;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to ;; refresh your font settings. If Emacs still can't find your font, it likely ;; wasn't installed correctly. Font issues are rarely Doom issues! ;; 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: (setq doom-theme 'doom-one) ;; 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 t) ;; 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-startup-with-inline-images t) ;; (add-hook 'org-mode-hook 'org-display-inline-images) (setq ispell-program-name "hunspell") (setq ispell-dictionary "en_US,ru_RU") (after! ispell (ispell-set-spellchecker-params) (ispell-hunspell-add-multi-dic "en_US,ru_RU")) (defun transform-square-brackets-to-round-ones(string-to-transform) "Transforms [ into ( and ] into ), other chars left unchanged." (concat (mapcar #'(lambda (c) (if (equal c ?\[) ?\( (if (equal c ?\]) ?\) c))) string-to-transform))) (defun get-current-layout () "Получить текущую раскладку клавиатуры для текущего окна с помощью xkb-switch." (string-trim (shell-command-to-string "xkb-switch"))) (defun set-layout (layout) "Установить раскладку клавиатуры для текущего окна с помощью xkb-switch." (shell-command (concat "xkb-switch -s " layout))) (defvar prev-lang "us" "Хранит текущую раскладку перед переключением в insert mode.") (add-hook 'evil-insert-state-entry-hook (lambda () (setq prev-lang (get-current-layout)) (set-layout "us"))) ;; Переключаем на английский в insert mode (add-hook 'evil-insert-state-exit-hook (lambda () (set-layout prev-lang))) ;; Восстанавливаем предыдущую раскладку (setq org-attach-method 'cp) ;; copy file to an attachments dir. (setq org-attach-id-dir "~/org/attachments/") (setq org-adapt-indentation t) (setq org-startup-indented t) (setq org-indent-mode t) (setq org-archive-location "%s_archive::") (add-hook 'org-mode-hook (lambda () (visual-line-mode 1))) ;; (setq org-agenda-files '("~/org/grocery.org" "~/org/todos.org" "~/org/inbox.org" "~/org/priorities.org")) (setq org-agenda-files (append org-agenda-files (directory-files-recursively "~/org/braindump/" "\\.org$"))) (use-package org-roam ;; :ensure nil :custom (org-roam-directory "~/org/roam/") (org-roam-capture-templates '(("d" "default" plain "%?\n\n\n* Related:\n\n* References:\n" :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+filetags:\n")))) (custom-set-faces '((org-roam-link org-roam-link-current) :foreground "#e24888" :underline t)) :config ;; (org-roam-db-autosync-mode) (setq org-roam-completion-everywhere t) (setq org-roam-database-connector 'sqlite-builtin) (setq org-roam-db-node-include-function (lambda () (not (member "ATTACH" (org-get-tags))))) ) (setq org-capture-templates '( ("p" "Private" entry (file+headline "~/org/private.org.gpg" "Private") "* %?" :empty-lines 0) ;; ("i" "Inbox" ;; entry (file+headline "~/org/inbox.org" "Inbox") ;; "* [%<%Y-%m-%d>] %U %? :inbox: \n %:annotation\n %:link" ;; :empty-lines 0) ("d" "Braindump" entry (file+headline "~/org/inbox.org" "Inbox") "* [%<%Y-%m-%d>] %? :inbox:\n:PROPERTIES:\n:ID: %(org-id-new)\n:END:\n" :empty-lines 1) ("r" "Grocery list" entry (file+headline "~/org/grocery.org" "Grocery list") "* NEED2BUY [#C] %?\n:PROPERTIES:\n:Created: %T\n:END:\n " :empty-lines 0) ("g" "General To-Do" entry (file+headline "~/org/todos.org" "General Tasks") "* TODO [#C] %?\n:PROPERTIES:\n:Created: %T\n:END:\n " :empty-lines 0) ("m" "Meeting" entry (file+datetree "~/org/meetings.org") "* %? :meeting:%^g \n:PROPERTIES:\n:Created: %T\n:END:\n** Notes\n** Action Items\n*** TODO [#A] " :tree-type week :clock-in t :clock-resume t :empty-lines 0) ("c" "Code To-Do" entry (file+headline "~/org/todos.org" "Code Related Tasks") "* TODO [#C] %?\n:PROPERTIES:\n:Created: %T\n:END:\n%i\nProposed Solution:\n" :empty-lines 0) ("w" "Selected web capture" entry (file+headline "~/org/inbox.org" "Selected web capture") "* [%<%Y-%m-%d>] [[%:link][%(transform-square-brackets-to-round-ones \"%:description\")]] :inbox:\n:PROPERTIES:\n:ID: %(org-id-new)\n:END:\n Source: %:link\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n%?" :empty-lines 1) ("L" "Unselected web capture" entry (file+headline "~/org/inbox.org" "Web links") "* [%<%Y-%m-%d>] [[%:link][%(transform-square-brackets-to-round-ones \"%:description\")]]\n%? :inbox:\n:PROPERTIES:\n:ID: %(org-id-new)\n:END:\n" :empty-lines 1))) (setq org-todo-keywords '((sequence "TODO(t)" "NEED2BUY(n)" "PLANNING(p)" "IN-PROGRESS(i@/!)" "VERIFYING(v!)" "BLOCKED(b@)" "|" "DONE(d!)" "CANCELED(c@/!)" ) )) (setq org-todo-keyword-faces '( ("TODO" . (:foreground "GoldenRod" :weight bold)) ("PLANNING" . (:foreground "DeepPink" :weight bold)) ("IN-PROGRESS" . (:foreground "Cyan" :weight bold)) ("VERIFYING" . (:foreground "DarkOrange" :weight bold)) ("BLOCKED" . (:foreground "Red" :weight bold)) ("DONE" . (:foreground "LimeGreen" :weight bold)) ("NEED2BUY" . (:foreground "Red" :weight bold)) )) ;; Tags (setq org-tag-alist ' ( ;; context (:startgroup) ("@shop" . ?s) ("@home" . ?h) ("@outdoor" . ?o) ("@any" . ?a) ("@meeting" . ?m) (:endgroup) ;; basic tags (:startgroup) ("chores" . ?C) ("meeting" . ?M) ("finance" . ?F) ("sport" . ?S) ("code" . ?O) ("social" . ?I) ("productivity" . ?P) ("study" . ?U) ("privacy" . ?R) ("family" . ?A) ("travel" . ?T) ("life" . ?L) ("health" . ?H) ("friends" . ?E) ("hobby" . ?B) ("research" . ?G) ("article" . ?I) ("job" . ?J) (:endgroup) ;; Special tags ("CRITICAL" . ?X) ;; other tags ("backend") ("broken_code") ("frontend") ("hike") ("cycle") ("pkm") ("pentest") ("immigration") ("devops") ("pet") ("accomplishment") ("music") ("youtube") ("trash") ("devsecops") ("book") ("movie") ("inbox") )) ;; Tag colors (setq org-tag-faces '( ("@home" . (:foreground "medium Purple1" :weight bold)) ("@outdoor" . (:foreground "royalblue1" :weight bold)) ("@shop" . (:foreground "forest green" :weight bold)) ("QA" . (:foreground "sienna" :weight bold)) ("chores" . (:foreground "yellow1" :weight bold)) ("sport" . (:foreground "green yellow" :weight bold)) ("finance" . (:foreground "tomato" :weight bold)) ("privacy" . (:foreground "dark olive green" :weight bold)) ("study" . (:foreground "aquamarine" :weight bold)) ("productivity" . (:foreground "violet" :weight bold)) ("family" . (:foreground "medium violet red" :weight bold)) ("health" . (:foreground "DarkOrange1" :weight bold)) ("code" . (:foreground "snow3" :weight bold)) ("travel" . (:foreground "salmon4" :weight bold)) ("life" . (:foreground "goldenrod1" :weight bold)) ("friends" . (:foreground "plum4" :weight bold)) ("hobby" . (:foreground "SeaGreen1" :weight bold)) ("social" . (:foreground "RoyalBlue1" :weight bold)) ("research" . (:foreground "deep sky blue" :weight bold)) ("meeting" . (:foreground "magenta" :weight bold)) ("CRITICAL" . (:foreground "red1" :weight bold)) ("job" . (:foreground "medium spring green" :weight bold)) ) ) ;; Agenda View "d" (defun air-org-skip-subtree-if-priority (priority) "Skip an agenda subtree if it has a priority of PRIORITY. PRIORITY may be one of the characters ?A, ?B, or ?C." (let ((subtree-end (save-excursion (org-end-of-subtree t))) (pri-value (* 1000 (- org-lowest-priority priority))) (pri-current (org-get-priority (thing-at-point 'line t)))) (if (= pri-value pri-current) subtree-end nil))) (setq org-agenda-skip-deadline-if-done t) (setq org-agenda-skip-timestamp-if-done t) (setq org-agenda-custom-commands '( ;; Daily Agenda & TODOs ("d" "Daily agenda and all TODOs" ;; Display items with priority A ((tags "PRIORITY=\"A\"" ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) (org-agenda-overriding-header "High-priority unfinished tasks:"))) ;; View 7 days in the calendar view (agenda "" ((org-agenda-span 7))) ;; Display items with priority B (really it is view all items minus A & C) (alltodo "" ((org-agenda-skip-function '(or (air-org-skip-subtree-if-priority ?A) (air-org-skip-subtree-if-priority ?C) (org-agenda-skip-if nil '(scheduled deadline)))) (org-agenda-overriding-header "ALL normal priority tasks:"))) ;; Display items with pirority C (tags "PRIORITY=\"C\"" ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) (org-agenda-overriding-header "Low-priority Unfinished tasks:"))) ) ;; Don't compress things (change to suite your tastes) ((org-agenda-compact-blocks nil))) ;; My Super View ("j" "My Super View" ( (agenda "" ( (org-agenda-remove-tags t) (org-agenda-span 7) (org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done) '(org-agenda-skip-entry-if 'regexp ":inbox:")) ) ) (alltodo "" ( ;; Remove tags to make the view cleaner (org-agenda-remove-tags t) (org-agenda-prefix-format " %t %s") (org-agenda-overriding-header "CURRENT STATUS") (org-agenda-skip-function '(org-agenda-skip-entry-if 'regexp ":inbox:")) ;; Define the super agenda groups (sorts by order) (org-super-agenda-groups '( ;; Filter where tag is CRITICAL (:name "Critical Tasks" :tag "CRITICAL" :order 0 ) ;; Filter where TODO state is IN-PROGRESS (:name "Currently Working" :todo "IN-PROGRESS" :order 1 ) ;; Filter where TODO state is BLOCKED or where the tag is obstacle (:name "Problems & Blockers" :todo "BLOCKED" :order 3 ) ;; Filter where tag is research (:name "Research Required" :tag "research" :order 4 ) ;; Filter where tag is chores (:name "Chores" :tag "chores" :order 5 ) ;; Filter where tag is meeting and priority is A (only want TODOs from meetings) (:name "Meeting Action Items" :and (:tag "meeting" :priority "A") :order 6 ) ;; Filter where state is TODO and the priority is A and the tag is not meeting (:name "Other Important Items" :and (:todo "TODO" :priority "A" :not (:tag "meeting")) :order 7 ) ;; Filter where state is TODO and priority is B (:name "General Backlog" :and (:todo "TODO" :priority "B") :order 8 ) ;; Filter where the priority is C or less (supports future lower priorities) (:name "Non Critical" :priority<= "C" :order 9 ) ;; Filter where TODO state is VERIFYING (:name "Currently Being Verified" :todo "VERIFYING" :order 10 ) ;; Filter where TODO state is PLANNING (:name "Planning Next Steps" :todo "PLANNING" :order 11 ) ) ) ) ) )) )) ;; Whenever you reconfigure a package, make sure to wrap your config in an ;; `after!' block, otherwise Doom's defaults may override your settings. E.g. ;; ;; (after! PACKAGE ;; (setq x y)) ;; ;; The exceptions to this rule: ;; ;; - Setting file/directory variables (like `org-directory') ;; - Setting variables which explicitly tell you to set them before their ;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). ;; - Setting doom variables (which start with 'doom-' or '+'). ;; ;; Here are some additional functions/macros that will 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 ;; This will open documentation for it, including demos of how they are used. ;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, ;; etc). ;; ;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how ;; they are implemented.