summaryrefslogblamecommitdiff
path: root/emacs/custom/my-org.el
blob: 81f7a07c45392fe7abaa8f57ed58e17e82100ef9 (plain) (tree)
1
2
3
4
5
                                    


               
                      






















                                                                               
 


                   
                    

            

                
                                                        





                                                                   
                                 
 





                                                   
         


                                               





                                                        
 
         
                                  


                               



                                                     
                         
 
                               
                      
                         
 

                          

                               
                                                                                    
 

                                                                                    


                                                                     
 

                            

                                                                                     
                                                                                             


                                                   
 




                                                                                   


                                  

                                               

                                       

                                        

                                
                                                
                                
 
            
                                  
                                                                                
 

                                                     
 
                             
 








                                                                      
                                                                       














                                                                                              
                                                                       
                                 
                                                                   
                              
                                                                         

                                                                                                          


                          

                        














                                                                                         
         
                        
                                         

                                                            
                                         
                                                  
 

                                                 
 
                         
                                       
                                                                    
 

                       
;;; my-org.el --- Configure org-mode
;;; Commentary:
;;; Code:

(require 'use-package)
(require 's)

(defvar my/org-directory
  (if (memq window-system '(mac ns))
      (expand-file-name "~/workspace/notebooks/")
    (expand-file-name "~/documents/notes/")))

(defun my/clipboard-get-contents ()
  "Return the contents of the system clipboard as a string."
  (condition-case nil
      (cond
       ((fboundp 'ns-get-pasteboard)
        (ns-get-pasteboard))
       ((and (featurep 'mac)
             (fboundp 'gui-get-selection))
        (gui-get-selection 'CLIPBOARD 'NSStringPboardType))
       ((and (featurep 'mac)
             (fboundp 'x-get-selection))
        (x-get-selection 'CLIPBOARD 'NSStringPboardType))
       ((fboundp 'gui-get-selection)
        (gui-get-selection 'CLIPBOARD (or x-select-request-type 'UTF8_STRING)))
       (t
        (error "Clipboard support not available")))))

(use-package org-ml
  :ensure t)

(use-package htmlize
  :ensure t)

(use-package org
  :ensure t
  :commands (org-check-agenda-file org-protocol-capture)
  :mode (("\\.txt\\'" . org-mode))
  :hook ((org-mode                     . org-indent-mode)
         (org-mode                     . org-hide-block-all)
         (org-mode                     . visual-line-mode)
         (org-capture-after-finalize   . org-save-all-org-buffers)
         (org-capture-prepare-finalize . org-save-all-org-buffers))
  :bind (("C-c c" . org-capture))

  :init
  ;; save all the org buffers after refilling tasks
  (advice-add 'org-refile :after
              (lambda (&rest _)
                (org-save-all-org-buffers)))

  :config
  (defvar load-language-list '((emacs-lisp . t)
                               (python . t)
                               (shell . t)))
  (use-package ob-go
    :ensure t
    :init (cl-pushnew '(go . t) load-language-list))

  (org-babel-do-load-languages 'org-babel-load-languages
                               load-language-list)

  :custom
  (org-directory my/org-directory)
  ;; hide emphasis markup
  (org-hide-emphasis-markers t)

  ;; when archiving, inherit the tags from the parent
  (org-archive-subtree-add-inherited-tags t)

  ;; display unicode characters
  (org-pretty-entities t)

  ;; log the time of completion
  (org-log-done 'time)
  (org-log-into-drawer t)

  (org-startup-indented t)

  (org-cycle-separator-lines 0)
  (org-startup-folded 'content)
  (org-todo-keywords '((sequence "TODO" "STARTED" "WAITING" "|" "DONE" "CANCELED")))

  ;; priorities
  (org-priority-start-cycle-with-default nil) ;; Start one over/under default value.
  (org-highest-priority ?A)
  (org-lowest-priority ?D)
  (org-default-priority ?C) ;; Ensures unset tasks have low priority.

  ;; refile
  (org-refile-use-cache nil)
  (org-refile-targets `((,(expand-file-name "tasks.org" org-directory) :maxlevel . 1)
                        (,(expand-file-name "notes.org" org-directory) :maxlevel . 1)
                        (,(expand-file-name "projects.org" org-directory) :tag . "project")))
  (org-refile-use-outline-path 'file)
  (org-outline-path-complete-in-steps nil)
  (org-refile-allow-creating-parent-nodes 'confirm)

  ;; org babel related
  ;; prevent the conversion of spaces into tabs (necessary for Python code exports)
  (org-src-fontify-natively t)
  (org-src-preserve-indentation t)
  (org-edit-src-content-indentation t)

  ;; I want to follow links on RET
  (org-return-follows-link t)

  ;; some configurations for exporting document
  (org-export-with-toc nil)
  (org-export-with-section-numbers nil)

  ;; A few abbreviations I use regularly
  (org-link-abbrev-alist
   '(("src"  . "~/workspace/%s")
     ("jira" . "https://jira.rbx.com/browse/%s")
     ("go"   . "http://go/%s")))

  ;; entries
  (org-blank-before-new-entry nil)
  (org-blank-before-new-entry (quote ((heading . nil) (plain-list-item . nil))))

  ;; see https://github.com/abo-abo/swiper/issues/986
  (org-goto-interface 'outline-path-completion)

  (org-reverse-note-order t))

(use-package org-agenda
  :ensure nil
  :after (org)
  :bind (("C-c a" . org-agenda))
  :custom
  (org-agenda-files `(,(expand-file-name "inbox.org" org-directory)
                      ,(expand-file-name "notes.org" org-directory)
                      ,(expand-file-name "tasks.org" org-directory)
                      ,(expand-file-name "projects.org" org-directory)
                      ,(expand-file-name "bookmarks.org" org-directory)
                      ,(expand-file-name "journal.org" org-directory)))
  (org-agenda-show-all-dates t)
  (calendar-week-start-day 1)
  (org-agenda-custom-commands nil)
  (org-agenda-start-on-weekday 1)

  :config
  (add-to-list 'org-agenda-custom-commands
               '("A" "Agenda"
                 ((agenda ""
                          ((org-agenda-span 'week)))
                  (todo "TODO"
                        ((org-agenda-overriding-header "To Refile")
                         (org-agenda-files `(,(expand-file-name "inbox.org" org-directory)))))
                  (todo "STARTED"
                        ((org-agenda-overriding-header "In Progress")))
                  (todo "WAITING"
                        ((org-agenda-overriding-header "Blocked")))
                  (todo "TODO"
                        ((org-agenda-overriding-header "Not yet started")
                         (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline 'scheduled))))))))

(use-package org-web-tools
  :ensure t)

(use-package org-capture
  :ensure nil
  :after (org org-web-tools)
  :preface
  (defun my/org-capture-link ()
  "Make a TODO entry with a link in clipboard.
The page title is used as an entry heading."
  (let* ((url-string (s-trim (my/clipboard-get-contents)))
         (pdf (string-suffix-p "pdf" url-string)))
    (unless pdf
      (let ((page-title (org-web-tools--html-title (org-web-tools--get-url url-string))))
        (concat "* "
                page-title
                "\t%^g"
                "\n:PROPERTIES:\n:CREATED: %T\n:URL: "
                url-string
                "\n:END:\n%?")))))
  :custom
  (org-capture-templates
   `(("t" "Todo" entry (file "inbox.org")
      "* TODO [#D] %?\n:PROPERTIES:\n:CREATED: %U\n:END:\n")

     ("n" "Note" entry (file "notes.org")
      "* %?\n:PROPERTIES:\n:CREATED: %T\n:END:\n")

     ("l" "Bookmark" entry (file "bookmarks.org")
      (function my/org-capture-link))

     ("j" "Journal" entry
      (file+olp+datetree "journal.org")
      "* %?\n:PROPERTIES:\n:CREATED: %T\n:END:\n" :tree-type day))))

(provide 'my-org)
;;; my-org.el ends here