]> git.vanrenterghem.biz Git - Dotty.git/blobdiff - emacs/.emacs.d/init.el
Add capture template for calendar event.
[Dotty.git] / emacs / .emacs.d / init.el
index 0e6bd9db69a09d7d6362162137ea66a4f217407c..ec85953a7dbcbc748fd2ee5ba785a96b9885469f 100644 (file)
@@ -10,7 +10,8 @@
 
 ;; Configure printing using CUPS network printer
 (setq lpr-switches
-      (append '("-o raw")
+      (append '("-o raw"
+               "-o media=A4")
               lpr-switches))
 
 ;; Enable the melpa archive for packages
@@ -53,43 +54,112 @@ vc-follow-symlinks t
 (setq inferior-julia-program-name "/usr/bin/julia")
 
 ;; enable autocomplete
-(use-package company
+(use-package corfu
   :ensure t
-  :bind(:map company-active-map
-             ("<return>" . nil)
-             ("RET" . nil)
-             ("C-<return>" . company-complete-selection)
-            ([tab]    . company-complete-common)            
-             ("TAB"    . company-complete-common))
-  :config
-  (global-company-mode 1))
+  ;; Optional customizations
+  :custom
+  (corfu-cycle t)                ;; Enable cycling for `corfu-next/previous'
+  (corfu-auto t)                 ;; Enable auto completion
+  ;; (corfu-separator ?\s)          ;; Orderless field separator
+  ;; (corfu-quit-at-boundary nil)   ;; Never quit at completion boundary
+  ;; (corfu-quit-no-match nil)      ;; Never quit, even if there is no match
+  ;; (corfu-preview-current nil)    ;; Disable current candidate preview
+  ;; (corfu-preselect 'prompt)      ;; Preselect the prompt
+  ;; (corfu-on-exact-match nil)     ;; Configure handling of exact matches
+  ;; (corfu-scroll-margin 5)        ;; Use scroll margin
+
+  ;; Enable Corfu only for certain modes. See also `global-corfu-modes'.
+  ;; :hook ((prog-mode . corfu-mode)
+  ;;        (shell-mode . corfu-mode)
+  ;;        (eshell-mode . corfu-mode))
+
+  ;; Recommended: Enable Corfu globally.  This is recommended since Dabbrev can
+  ;; be used globally (M-/).  See also the customization variable
+  ;; `global-corfu-modes' to exclude certain modes.
+  :init
+  (global-corfu-mode)
+  (corfu-history-mode))
+
+(use-package cape
+  :ensure t
+  ;; Bind prefix keymap providing all Cape commands under a mnemonic key.
+  ;; Press C-c p ? to for help.
+  :bind ("C-c p" . cape-prefix-map) ;; Alternative keys: M-p, M-+, ...
+  ;; Alternatively bind Cape commands individually.
+  ;; :bind (("C-c p d" . cape-dabbrev)
+  ;;        ("C-c p h" . cape-history)
+  ;;        ("C-c p f" . cape-file)
+  ;;        ...)
+  :init
+  ;; Add to the global default value of `completion-at-point-functions' which is
+  ;; used by `completion-at-point'.  The order of the functions matters, the
+  ;; first function returning a result wins.  Note that the list of buffer-local
+  ;; completion functions takes precedence over the global list.
+  (add-hook 'completion-at-point-functions #'cape-dict) ;; requires words package to be installed on Arch to provide /usr/share/dict/words
+  (add-hook 'completion-at-point-functions #'cape-dabbrev)
+  (add-hook 'completion-at-point-functions #'cape-file) 
+  (add-hook 'completion-at-point-functions #'cape-elisp-block)
+  ;; (add-hook 'completion-at-point-functions #'cape-history)
+  ;; ...
+  )
 
 (use-package org
   :ensure t
-  :after
-  denote
   :bind
-    (("C-c c" . org-capture)
-     ("C-c l" . org-store-link))
-    :custom
-    (org-default-notes-file "~/Nextcloud/notes/inbox.org")
-    (org-capture-bookmark nil)
-    ;; Capture templates
-    (org-capture-templates
-     '(("f" "Fleeting note" item
-        (file+headline org-default-notes-file "Notes")
-        "- %?\nEntered on %U\n  %i\n  %a")
-       ("p" "Permanent note" plain
-        (file denote-last-path)
-        #'denote-org-capture
-        :no-save t
-        :immediate-finish nil
-        :kill-buffer t
-        :jump-to-captured t)
-       ("t" "New task" entry
-        (file+headline org-default-notes-file "Tasks")
-        "* TODO %i%?")))
+  (("C-c c" . org-capture)
+   ("C-c l" . org-store-link)
+   ("C-c a" . org-agenda))
+  :custom
+  (org-default-notes-file "~/Nextcloud/notes/inbox.org")
+  (org-agenda-files `(,org-default-notes-file "~/Nextcloud/notes/calendar.org"))
+  (org-capture-bookmark nil)
+  ;; Capture templates
+  (org-capture-templates
+   '(("f" "Fleeting note" entry
+      (file+headline org-default-notes-file "Notes")
+      "* %?\nEntered on %U\n  %i\n  %a")
+     ("b" "Tax receipt" item
+      (file "~/Documents/belastingen/FY24-25.org")
+      "* %t %a\n")
+     ("a" "Appointment" entry
+           (file+olp+datetree "~/Nextcloud/notes/calendar.org")
+           "* %?\n :PROPERTIES:\n :location: %^{Location}\n :END:\n%^T--%^T\n\n"
+           :jump-to-captured t
+          :tree-type month
+          :time-prompt t)
+     ("p" "Permanent note" plain
+      (file denote-last-path)
+      #'denote-org-capture
+      :no-save t
+      :immediate-finish nil
+      :kill-buffer t
+      :jump-to-captured t)
+     ("t" "New task" entry
+      (file+headline org-default-notes-file "Tasks")
+      "* TODO %i%?")
+     ("e" "Email follow-up" entry (file+headline org-default-notes-file "Tasks")
+      "* TODO %:fromname: %a %?\nDEADLINE: %(org-insert-time-stamp (org-read-date nil t \"+2d\"))")))
+  ;; Agenda views
+  (org-agenda-custom-commands
+   '(("P" "Expired calendar events" ((tags "TIMESTAMP<=\"<now>\"")))
+     ("n" "Agenda and all TODOs"  ((agenda "") (alltodo "")))))
   :config
+  ;; Configure refile
+  (defun my/opened-buffer-files ()
+    "Return the list of org files currently opened in emacs"
+    (delq nil
+          (mapcar (lambda (x)
+                    (if (and (buffer-file-name x)
+                             (string-match "\\.org$"
+                                           (buffer-file-name x)))
+                        (buffer-file-name x)))
+                  (buffer-list))))
+  (setq org-refile-targets `((my/opened-buffer-files :maxlevel . 9)
+                             (,(file-expand-wildcards  "~/Nextcloud/notes/*.org") :maxlevel . 1)))
+  (setq org-agenda-skip-scheduled-if-done t)
+  (setq org-agenda-skip-deadline-if-done t)
+  (setq org-agenda-start-on-weekday nil)
+  (setq org-log-done 'time)
   ;; Automatically flow lines based on window width and use
   ;; variable width fonts in org-mode.
   (add-hook 'org-mode-hook 'visual-line-mode)
@@ -98,10 +168,20 @@ vc-follow-symlinks t
   (org-babel-do-load-languages
    'org-babel-load-languages
    '((R . t)
-     (latex . t)))
-  ;; Security risk - This is somewhat ill-advised it appears
-  (setq org-confirm-babel-evaluate nil))
-       
+     (latex . t))))
+
+(use-package org-caldav
+  :ensure t
+  :config
+  (setq org-caldav-url "https://owncloud.vanrenterghem.biz/remote.php/dav/calendars/frederik")
+  (setq org-caldav-calendar-id "orgmode")
+  ;; Org filename where new entries from calendar stored
+  (setq org-caldav-inbox "~/Nextcloud/notes/calendar.org")
+  ;; Additional Org files to check for calendar events
+  (setq org-caldav-files nil)
+  ;; Usually a good idea to set the timezone manually
+  (setq org-icalendar-timezone "Australia/Perth"))
+
 (use-package tex
   :ensure auctex
   :config
@@ -123,6 +203,7 @@ vc-follow-symlinks t
     '(("\\.mdwn\\'" . markdown-mode)
       ("\\.md\\'" . markdown-mode)
       ("\\.yarn\\'" . markdown-mode)
+      ("\\.cpp\\'" . c++-mode)
       ("\\.js\\'" . js-mode)
       ("\\.json\\'" . js-mode)
       ("Makefile" . makefile-mode)
@@ -153,7 +234,8 @@ vc-follow-symlinks t
    '("8d146df8bd640320d5ca94d2913392bc6f763d5bc2bb47bed8e14975017eea91" "9a977ddae55e0e91c09952e96d614ae0be69727ea78ca145beea1aae01ac78d2" "0cf95236abcf59e05b1ea69b4edd53d293a5baec4fe4c3484543fee99bfd2204" "80b00f3bf7cdbdca6c80aadfbbb03145f3d0aacf6bf2a559301e61109954e30a" default))
  '(org-export-backends '(ascii html icalendar latex md odt))
  '(package-selected-packages
-   '(nov eat mu4e ellama emms mpdel-embark libmpdel pass password-store fontaine osm orderless embark-consult embark consult jinx dired-preview ftable flx nerd-icons-dired nerd-icons all-the-icons-dired marginalia vertico denote ox-rss org-ql org-contrib mustache org-static-blog haskell-mode julia-mode elfeed-protocol ack company magit auctex lsp-mode elpy ## org htmlize leuven-theme lua-mode ess-smart-underscore ess-R-data-view ess)))
+   '(devdocs straight calfw calfw-org engrave-faces org-caldav nov eat mu4e ellama emms mpdel-embark libmpdel pass password-store fontaine osm orderless embark-consult embark consult jinx dired-preview ftable flx nerd-icons-dired nerd-icons all-the-icons-dired marginalia vertico denote ox-rss org-ql org-contrib mustache org-static-blog haskell-mode julia-mode elfeed-protocol ack company magit auctex lsp-mode elpy ## org htmlize leuven-theme lua-mode ess-smart-underscore ess-R-data-view ess))
+ '(use-package-compute-statistics t))
 (custom-set-faces
  ;; custom-set-faces was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
@@ -220,7 +302,9 @@ vc-follow-symlinks t
        mu4e-sent-folder   "/Sent"
        mu4e-drafts-folder "/Drafts"
        mu4e-trash-folder  "/Trash"
-       message-kill-buffer-on-exit t)
+       message-kill-buffer-on-exit t
+       ;;Fixing duplicate UID errors when using mbsync and mu4e
+       mu4e-change-filenames-when-moving t)
   ;; attach files to mu4e messages by marking the file(s) in dired and pressing C-c RET C-a
   (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
   ;; Define all bookmarks starting with favourite query used in mailcount modeline
@@ -288,8 +372,15 @@ vc-follow-symlinks t
 ;; Denote config
 (use-package denote
   :ensure t
+  :hook (dired-mode . denote-dired-mode)
+  :bind
+  (("C-c n n" . denote)
+   ("C-c n r" . denote-rename-file)
+   ("C-c n l" . denote-link)
+   ("C-c n b" . denote-backlinks))
   :config
-  (setq denote-directory "/home/frederik/Nextcloud/notes/"))
+  (setq denote-directory "/home/frederik/Nextcloud/notes/")
+  (denote-rename-buffer-mode 1))
 
 (use-package nerd-icons
   ;; :custom
@@ -325,6 +416,11 @@ vc-follow-symlinks t
   (setq vertico-resize nil)
   (vertico-mode 1))
 
+;; Persist history over Emacs restarts. Vertico sorts by history position.
+(use-package savehist
+  :init
+  (savehist-mode))
+
 ;; Use `marginalia' package.  This will display useful
 ;; annotations next to entries in the minibuffer.  For example, when
 ;; using M-x it will show a brief description of the command as well
@@ -368,6 +464,23 @@ vc-follow-symlinks t
    ;; Other custom bindings
    ("M-y" . consult-yank-pop)))              ;; orig. yank-pop
 
+(use-package consult-mu
+  :ensure nil ;; cloned in
+  :load-path "~/.emacs.d/lisp/consult-mu"
+  :after (consult mu4e)
+  :custom
+  ;;maximum number of results shown in minibuffer
+  (consult-mu-maxnum 200)
+  ;;show preview when pressing any keys
+  (consult-mu-preview-key 'any)
+  ;;do not mark email as read when previewed
+  (consult-mu-mark-previewed-as-read nil)
+  ;;do not amrk email as read when selected. This is a good starting point to ensure you would not miss important emails marked as read by mistake especially when trying this package out. Later you can change this to t.
+  (consult-mu-mark-viewed-as-read nil)
+  ;; open the message in mu4e-view-buffer when selected.
+  (consult-mu-action #'consult-mu--view-action)
+  )
+
 ;; Configure `world-clock'
 (use-package time
   :ensure nil
@@ -378,7 +491,8 @@ vc-follow-symlinks t
 
 ;; View PDFs in Emacs
 (pdf-loader-install) ; On demand loading, leads to faster startup time
-
+(setq pdf-misc-print-programm "/usr/bin/lpr")
+  
 (use-package magit
   :ensure t)
 
@@ -453,6 +567,11 @@ vc-follow-symlinks t
         :variable-pitch-height 1.0
          :line-spacing 1))))
 
+(use-package devdocs
+  :ensure t
+  :bind
+  ("C-h D" . devdocs-lookup))
+
 ;; Custom functions
 
 ;; Might want to run this automatically