;;; -*- lexical-binding: t; -*- (setq org-latex-packages-alist '(("" "amsfonts" t)) org-format-latex-options (plist-put org-format-latex-options :scale 1.5)) ;; tempo (require 'org-tempo) (add-to-list 'org-structure-template-alist (cons "g" "src durand-greek")) (add-to-list 'org-structure-template-alist (cons "el" "src emacs-lisp")) (add-to-list 'org-modules 'ol-gnus) ;;; TODO: To finish this configuration file... ;;; Some variables (setq org-todo-keywords '((sequence "TODO(t)" "START(s)" "WORKING(w)" "HARD-WORKING(h)" "ALMOST(a)" "|" "DONE(d)") (sequence "TO-THINK(c)" "PENDING(p)" "HARD(r)" "IMPOSSIBLE(i)" "|" "SOLVED(v)")) org-tags-column -110 org-hide-emphasis-markers t org-special-ctrl-a/e nil org-highlight-latex-and-related '(native latex script entities) org-agenda-files (mapcar (lambda (fn) (expand-file-name fn org-directory)) (list "notes.org" "agenda.org" "aujourdhui.org" "math_article_links.org")) org-log-into-drawer t org-highest-priority ?A org-lowest-priority ?E org-default-priority ?B org-pretty-entities t org-link-file-path-type 'noabbrev ) ;;; open link functions (dolist (scheme '("ftp" "http" "https" "mailto" "news")) (org-link-set-parameters scheme :follow (lambda (url &optional arg) (browse-url (concat scheme ":" url) arg)))) (use-package "tablist" 'tablist) (load-config "org-pdftools.el") (set 'org-pdftools-link-prefix "pdfview") (org-pdftools-setup-link) ;;; Archive advice ;;;###autoload (defun durand-archive-save-and-kill (old-fun &optional find-done) "Save and kill the buffer after archiving." (let* ((location (org-archive--compute-location (or (org-entry-get nil "ARCHIVE" 'inherit) org-archive-location))) (archive-buffer-name (file-name-nondirectory (car location))) (opened (get-buffer archive-buffer-name))) (funcall old-fun find-done) (unless opened (when (get-buffer archive-buffer-name) (with-current-buffer archive-buffer-name (ignore-errors (save-buffer 0))) (kill-buffer archive-buffer-name))))) (advice-add 'org-archive-subtree :around 'durand-archive-save-and-kill) ;;; Archiving ;;;###autoload (defun durand-org-archive-file-name (file-name) "Produce an archive file name. The rule is as follows: example.org example.org_archive example(1).org_archive example(2).org_archive etc." (cond ((not (or (string-match "org$" file-name) (string-match "org_archive$" file-name))) (user-error "Not an org file."))) (cond ((string-match "org$" file-name) (replace-match "org_archive" nil nil file-name)) ((string-match "\\((\\([[:digit:]]+\\))\\).org_archive$" file-name) (replace-match (format "(%d)" (1+ (string-to-number (match-string-no-properties 2 file-name)))) nil nil file-name 1)) (t (replace-regexp-in-string ".org_archive$" "(1).org_archive" file-name)))) ;;;###autoload (defun durand-org-goto-archive () "Go to the archive file of the current org file, if any. It will cycle through all archive files of the file. The rule is as follows: example.org example.org_archive example(1).org_archive example(2).org_archive etc." (interactive) (unless (derived-mode-p 'org-mode) (user-error "Not in an org file.")) (let* ((current-name (buffer-file-name (current-buffer))) (base-name (cond ((string-match "org_archive$" current-name) (replace-match "org" nil nil current-name)) (t current-name))) (base-name (cond ((string-match "\\(([[:digit:]])\\).org$" base-name) (replace-match "" nil nil base-name 1)) (t base-name))) (next-name (durand-org-archive-file-name current-name)) (next-name (cond ((file-exists-p next-name) next-name) (t base-name)))) (find-file next-name))) ;; NOTE: Modified by Durand to use `completing-read-multiple' instead of ;; `completing-read'. ;;;###autoload (defun durand-org-set-tags-command (&optional arg) "Set the tags for the current visible entry. When called with `\\[universal-argument]' prefix argument ARG, \ realign all tags in the current buffer. When called with `\\[universal-argument] \\[universal-argument]' prefix argument, \ unconditionally do not offer the fast tag selection interface. If a region is active, set tags in the region according to the setting of `org-loop-over-headlines-in-active-region'. This function is for interactive use only; in Lisp code use `org-set-tags' instead." (interactive "P") (let ((org-use-fast-tag-selection (unless (equal '(16) arg) org-use-fast-tag-selection))) (cond ((equal '(4) arg) (org-align-tags t)) ((and (org-region-active-p) org-loop-over-headlines-in-active-region) (let (org-loop-over-headlines-in-active-region) ; hint: infinite recursion. (org-map-entries #'org-set-tags-command nil (if (eq org-loop-over-headlines-in-active-region 'start-level) 'region-start-level 'region) (lambda () (when (org-invisible-p) (org-end-of-subtree nil t)))))) (t (save-excursion (org-back-to-heading) (let* ((all-tags (org-get-tags)) (table (setq org-last-tags-completion-table (org--tag-add-to-alist (and org-complete-tags-always-offer-all-agenda-tags (org-global-tags-completion-table (org-agenda-files))) (or org-current-tag-alist (org-get-buffer-tags))))) (current-tags (cl-remove-if (lambda (tag) (get-text-property 0 'inherited tag)) all-tags)) (inherited-tags (cl-remove-if-not (lambda (tag) (get-text-property 0 'inherited tag)) all-tags)) (tags (replace-regexp-in-string ;; Ignore all forbidden characters in tags. "[^[:alnum:]_@#%]+" ":" (if (or (eq t org-use-fast-tag-selection) (and org-use-fast-tag-selection (delq nil (mapcar #'cdr table)))) (org-fast-tag-selection current-tags inherited-tags table (and org-fast-tag-selection-include-todo org-todo-key-alist)) (let ((org-add-colon-after-tag-completion (< 1 (length table)))) ;; I change this part (org-trim (org-make-tag-string (completing-read-multiple "Tags: " #'org-tags-completion-function nil nil (replace-regexp-in-string ":" "," (org-make-tag-string current-tags)) 'org-tags-history)))))))) (org-set-tags tags))))) ;; `save-excursion' may not replace the point at the right ;; position. (when (and (save-excursion (skip-chars-backward "*") (bolp)) (looking-at-p " ")) (forward-char)))) (advice-add 'org-set-tags-command :override 'durand-org-set-tags-command) ;;; Accounts ;;;###autoload (defvar durand-org-capture-account-which-list '("breakfast" "brunch" "brunverage" "lunch" "dinner" "beverage" "snack" "fruit") "The list of purposes of accounts in the capture-template for accounting.") ;;;###autoload (defun durand-org-capture-account-template () "Org capture template for account." (let* ((shop-and-items (durand-org-complete-capture-account)) (which (completing-read "For what? " durand-org-capture-account-which-list)) (cost (number-to-string (read-number "Cost: " 0))) (from (completing-read "From: " '("Cash" "etique"))) (active-time (format-time-string (cdr org-time-stamp-formats))) (inactive-time (let ((temp active-time)) (while (string-match "<\\|>" temp) (setf temp (replace-match (cond ((string= (match-string-no-properties 0 temp) "<") "[") ((string= (match-string-no-properties 0 temp) ">") "]")) nil nil temp))) temp))) (format "%s\n :PROPERTIES:\n :cost: %s\n :FROM: %s\n :RECORD_TIME: %s\n :END: \n %s%%?" which cost from inactive-time shop-and-items))) (setq org-capture-templates '(("g" "GNUS" entry (file "~/org/notes.org") "* TO-THINK %:subject\n :PROPERTIES:\n :RECORD_TIME: %U\n :END:\n %:from\n %:to\n %a\n %?" :empty-lines 1 :kill-buffer t))) (setq org-capture-templates-contexts '(("g" ((in-mode . "gnus-summary-mode") (in-mode . "gnus-article-mode"))))) (setq org-agenda-custom-commands '(("o" "Custom" ((agenda "" (;; (org-super-agenda-groups ;; '((:name "Progress today" ;; :log t ;; :order -1) ;; (:name "Morning Tasks" ;; :log t ;; :tag "morning" ;; :order 1) ;; (:name "Afternoon Taks" ;; :log t ;; :tag "afternoon" ;; :order 2) ;; (:name "Night Taks" ;; :log t ;; :tag "night" ;; :order 3) ;; (:name "Deadlines" :deadline t) ;; (:name "Health" ;; :tag "santé" ;; :log t ;; :order 5) ;; (:name "MATH" ;; :tag "math" ;; :order -1) ;; (:name "Très Important" ;; :priority "A" ;; :order -1) ;; (:name "Scheduled" ;; :and (:scheduled t :not (:priority "A")) ;; :order 5 ;; :log t))) (org-agenda-span 'day) (org-agenda-sorting-strategy '(priority-down time-up)))) ;; NOTE: A reading plan (tags "a_voir+matin|a_voir+après_midi|a_voir+nuit" ((org-agenda-files '("~/org/notes.org" "~/org/math_article_links.org")) (org-agenda-overriding-header "À Lire") ;; (org-super-agenda-groups ;; '((:name "Le Matin" :tag "matin") ;; (:name "L'après-midi" :tag "après_midi") ;; (:name "La Nuit" :tag "nuit"))) )) (todo "TO-THINK" (;; (org-super-agenda-groups ;; '((:name "À Voir" :tag "a_voir") ;; (:name "Mathématiques" :tag "math") ;; (:name "TeX" :tag "tex") ;; (:name "Question" :tag "question"))) (org-agenda-overriding-header "TO-THINK")))) ((org-agenda-block-separator nil))) ;; ("n" "test" ;; ((durand-agenda-command-test))) ;; ("m" "sections with time" ;; ((durand-agenda-command-sections-time))) ))