(custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(ledger-reports (quote (("test" "ledger bal") ("bal" "%(binary) -f %(ledger-file) bal") ("reg" "%(binary) -f %(ledger-file) reg") ("payee" "%(binary) -f %(ledger-file) reg @%(payee)") ("account" "%(binary) -f %(ledger-file) reg %(account)")))) '(org-agenda-files (quote ("/home/blaise/org/agenda.org" "/home/blaise/org/anniversaries.org" "/home/blaise/org/repeat.org" "/home/blaise/org/todo.org" "/home/blaise/org/projects/"))) '(org-capture-templates (quote (("c" "Contact" entry (file "~/org/contacts.org") "* %(org-contacts-template-name) :PROPERTIES: :ADDRESS: :EMAIL: :PHONE: :NOTE: :END:" :empty-lines 0)))) '(org-contacts-files (quote ("~/org/contacts.org"))) '(package-selected-packages (quote (projectile notmuch which-key use-package spaceline smart-mode-line org-brain ivy helm-swoop helm-flyspell helm-bibtex flycheck exec-path-from-shell evil-ledger evil-leader company color-theme-sanityinc-tomorrow)))) ;; Bootstrap `use-package' (setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3") (require 'package) (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/")) (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") ("melpa" . "https://melpa.org/packages/"))) (package-initialize) (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) ;; settings --------------------------------------------------------------------------------------- (global-auto-revert-mode t) (setq visual-line-fringe-indicators '(left-curly-arrow right-curly-arrow)) (setq make-backup-files nil) ;; packages --------------------------------------------------------------------------------------- ;; exec-path-from-shell ;; must be first as this populates environment variables (use-package exec-path-from-shell :ensure t ) (exec-path-from-shell-initialize) (load-file "~/source/dotfiles/emacs/undo-tree.el") (require 'undo-tree) ;; company (use-package company :ensure t ) ;; evil (use-package evil :config (evil-mode 1) (modify-syntax-entry ?_ "w") ) (use-package evil-leader :ensure t :config (evil-leader/set-leader "") (global-evil-leader-mode) ) ;; frames-only-mode (use-package frames-only-mode :ensure t ) (frames-only-mode) ;; flycheck (use-package flycheck :ensure t :init (global-flycheck-mode)) ;; helm (use-package helm :ensure t :config (define-key helm-map (kbd "TAB") #'helm-execute-persistent-action) (define-key helm-map (kbd "") #'helm-execute-persistent-action) (define-key helm-map (kbd ":") #'helm-select-action) ) (use-package helm-flyspell :ensure t :init (flyspell-mode) ) (use-package helm-swoop :ensure t ) (use-package helm-bibtex :ensure t :init (setq bibtex-completion-bibliography '("~/literature/database.bib")) (setq bibtex-completion-library-path '("~/literature")) (setq bibtex-completion-notes-path "~/literature") (setq bibtex-completion-pdf-open-function (lambda (fpath) (call-process "evince" nil 0 nil fpath) ) ) ) ;; ledger (use-package ledger-mode :ensure t :mode "\\.ledger$" ) ; TODO: consider using flycheck-ledger ;; org (use-package org :ensure t ) (setq org-todo-keywords '((sequence "TODO" "WAITING" "|" "DONE" "DELEGATED" "CANCELED"))) (setq org-tags-column -99) (setq org-id-track-globally t) (setq org-id-locations-file "~/.emacs.d/.org-id-locations") (setq org-brain-visualize-default-choices 'all) (setq org-brain-title-max-length 12) (setq org-agenda-files '("~/org/")) (setq org-agenda-span 1) (setq org-agenda-start-with-log-mode t) (setq org-agenda-start-day "0d") (setq org-agenda-window-setup 'only-window) (setq org-clock-mode-line-total 'today) (setq org-duration-format (quote h:mm)) (setq org-agenda-prefix-format '( (agenda . "%i %-12.12:c %?-12t %s") ;; file name + org-agenda-entry-type (timeline . " % s") (todo . " %i %-12:c") (tags . " %i %-12:c") (search . " %i %-12:c") ) ) (load "~/source/dotfiles/emacs/org-contacts.el") (use-package org-contacts :ensure nil :after org :custom (org-contacts-files '("~/org/contacts.org")) ) (use-package org-capture :ensure nil :after org :preface (defvar my/org-contacts-template "* %(org-contacts-template-name) :PROPERTIES: :ADDRESS: :EMAIL: :PHONE: :NOTE: :END:" "Template for org-contacts.") :custom (org-capture-templates `(("c" "Contact" entry (file "~/org/contacts.org"), my/org-contacts-template :empty-lines 0)))) ;; projectile (use-package projectile :ensure t ) ;; spaceline (use-package spaceline :ensure t) (spaceline-compile ; left side '( (buffer-id :priority 99) (major-mode :priority 76) (version-control :when active :priority 75) (org-clock :when active :priority 99) ) ; right side '( (line-column :priority 99) (buffer-position :priority 75) (buffer-size :priority 95) ) ) (setq powerline-default-separator 'bar) (spaceline-emacs-theme) (spaceline-toggle-minor-modes-off) (spaceline-toggle-buffer-encoding-abbrev-off) (spaceline-compile) ;; which-key (use-package which-key :ensure t :config (setq which-key-popup-type 'minibuffer) (setq which-key-allow-evil-operators t) ) (which-key-mode) ;;; theme ----------------------------------------------------------------------------------------- (menu-bar-mode -1) (tool-bar-mode -1) (toggle-scroll-bar -1) (setq-default left-margin-width 0 right-margin-width 0) (load-file "~/source/dotfiles/emacs/color-theme-tomorrow.el") (color-theme-tomorrow-night) (set-face-attribute 'highlight nil :background "#373b41" ) (set-face-attribute 'helm-selection nil :background "#373b41" :foreground "#c5c8c6" ) (set-face-attribute 'hl-line nil :background "#373b41" ) (set-face-attribute 'org-agenda-clocking nil :background "#373b41" :foreground "#8abeb7" :underline nil :inverse-video nil ) (global-hl-line-mode 1) (setq mouse-highlight nil) (add-to-list 'org-emphasis-alist '("*" (:background "#373b41" :foreground "#c5c8c6" ) )) ;;; functions ------------------------------------------------------------------------------------- (defun flyspell-goto-previous-error (arg) "Go to arg previous spelling error." (interactive "p") (while (not (= 0 arg)) (let ((pos (point)) (min (point-min))) (if (and (eq (current-buffer) flyspell-old-buffer-error) (eq pos flyspell-old-pos-error)) (progn (if (= flyspell-old-pos-error min) ;; goto beginning of buffer (progn (message "Restarting from end of buffer") (goto-char (point-max))) (backward-word 1)) (setq pos (point)))) ;; seek the next error (while (and (> pos min) (let ((ovs (overlays-at pos)) (r '())) (while (and (not r) (consp ovs)) (if (flyspell-overlay-p (car ovs)) (setq r t) (setq ovs (cdr ovs)))) (not r))) (backward-word 1) (setq pos (point))) ;; save the current location for next invocation (setq arg (1- arg)) (setq flyspell-old-pos-error pos) (setq flyspell-old-buffer-error (current-buffer)) (goto-char pos) (if (= pos min) (progn (message "No more miss-spelled word!") (setq arg 0)))))) (defun check-previous-spelling-error () "Jump to previous spelling error and correct it" (interactive) (push-mark-no-activate) (flyspell-goto-previous-error 1) (call-interactively 'helm-flyspell-correct)) (defun check-next-spelling-error () "Jump to next spelling error and correct it" (interactive) (push-mark-no-activate) (flyspell-buffer) (flyspell-goto-next-error) (call-interactively 'helm-flyspell-correct)) (defun push-mark-no-activate () "Pushes `point' to `mark-ring' and does not activate the region Equivalent to \\[set-mark-command] when \\[transient-mark-mode] is disabled" (interactive) (push-mark (point) t nil) (message "Pushed mark to ring")) ;;; hooks ----------------------------------------------------------------------------------------- ;; text mode (add-hook 'text-mode-hook 'flyspell-mode) (add-hook 'text-mode-hook 'turn-on-visual-line-mode) ;; global (add-hook 'after-init-hook 'global-company-mode) (add-hook 'before-save-hook 'delete-trailing-whitespace) ;;; journaling ------------------------------------------------------------------------------------ (setq org-journal-dir "~/journal/") (defun get-journal-file-today () "Return filename for today's journal entry." (let ((daily-name (format-time-string "%Y-%m-%d.org"))) (expand-file-name (concat org-journal-dir daily-name)))) (defun journal-file-today () "Create and load a journal file based on today's date." (interactive) (copy-file "~/journal/template.org" (get-journal-file-today)) (find-file (get-journal-file-today))) ;;; keybindings ----------------------------------------------------------------------------------- (org-babel-do-load-languages 'org-babel-load-languages (append org-babel-load-languages '((python . t) (ledger . t) (shell .t) (ruby . t)))) (global-set-key "\t" 'company-complete-common) (evil-leader/set-key "a" 'org-agenda-list) (evil-leader/set-key "c" 'calc) (evil-leader/set-key "f" 'helm-find-files) (evil-leader/set-key "j" 'journal-file-today) (evil-leader/set-key "k" 'kill-buffer) (evil-leader/set-key "l" 'helm-bibtex) (evil-leader/set-key "m" 'helm-mini) (evil-leader/set-key "p" 'helm-projectile) (evil-leader/set-key "q" 'save-buffers-kill-terminal) (evil-leader/set-key "r" 'shell-command) (evil-leader/set-key "s" 'check-next-spelling-error) (evil-leader/set-key "t" 'org-clock-goto) (evil-leader/set-key "T" 'org-clock-out) (evil-leader/set-key "," 'other-window) (evil-leader/set-key "/" 'helm-swoop) (evil-leader/set-key "" 'helm-M-x) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. )