emacs-config/config.org
2018-04-26 21:58:00 -05:00

74 KiB
Raw Blame History

Emacs Configuration

Set customizations file

(setq custom-file "~/.emacs.d/custom.el")
(load custom-file 'noerror)
(setq backup-directory-alist `(("." . ,(concat user-emacs-directory "backups"))))

Accessibility

Reloading config

(defun reload-config () (interactive) (load-file "~/.emacs.d/init.el"))

Half Scroll

   (defun window-half-height ()
     (max 1 (/ (1- (window-height (selected-window))) 2)))
  
   (defun scroll-up-half ()
     (interactive)
     (scroll-up (window-half-height)))
  
   (defun scroll-down-half ()         
     (interactive)                    
     (scroll-down (window-half-height)))
  
   (global-set-key (kbd "M-n") 'scroll-up-half)
   (global-set-key (kbd "M-p") 'scroll-down-half)

Add to load-path ~/bin

(add-to-list 'exec-path "~/bin")

M-1 = windresize

(global-set-key (kbd "M-1") 'windresize)

Emacs which key

(use-package which-key)
(which-key-mode)

help window select

(setq help-window-select t)

Multi-term

  (use-package multi-term)
  (add-hook 'term-mode-hook
            (lambda ()
              (add-to-list 'term-bind-key-alist '("M-[" . multi-term-prev))
              (add-to-list 'term-bind-key-alist '("M-]" . multi-term-next))))

beacon

  (use-package beacon)
  (beacon-mode 1)
  (setq beacon-color "#006400")

Dashboard

(use-package dashboard)
(dashboard-setup-startup-hook)

Volume

(global-set-key (kbd "C-c v") 'volume)

Neo keyboard issues

(global-set-key (kbd "M-Ä") 'eval-expression)
(global-set-key (kbd "M-") 'beginning-of-buffer)
(global-set-key (kbd "M-•") 'end-of-buffer)

EXWM

Config

  (use-package exwm)  
  (require 'exwm-systemtray)
  (require 'exwm-config)
  (exwm-config-default)
  ;(setq exwm-input-line-mode-passthrough t)

Global keys

  (setq exwm-input-global-keys
   `(([?\s-r] . exwm-reset)
     ([?\s-w] . exwm-workspace-switch)
     ,@(mapcar (lambda (i)
                 `(,(kbd (format "s-%d" (mod (1+ i) 10))) .
                   (lambda ()
                     (interactive)
                     (exwm-workspace-switch-create ,i))))
               (number-sequence 0 9))))
  (global-set-key (kbd "M-T") 'flop-frame)
  (global-set-key (kbd "C-x p") 'launch-program)
  (global-set-key (kbd "M-…") 'multi-term)
  (global-set-key (kbd "C-ü") 'undo-tree-undo)

Custom

  (defvar workspace-list '(("s" 0 "school")
                           ("y" 1 "youtube")
                           ("w" 2 "work")
                           ("r" 3 "research")
                           ("c" 4 "code"))
    "My custom workspace list")

  (defun workspace-switch-prompt ()
    (exwm-workspace--update-switch-history)
    (let* ((current-workspace (exwm-workspace--position exwm-workspace--current))
           (workspace-string (elt exwm-workspace--switch-history current-workspace)))
      (mapcar (lambda (x)
                (setq workspace-string
                      (replace-regexp-in-string (number-to-string (cadr x))
                                                (caddr x)
                                                workspace-string)))
              workspace-list)
      workspace-string))

  (defun my-workspace-switch ()
    (interactive)
    (let* ((letter (read-char (workspace-switch-prompt)))
          (ws-info (assoc (char-to-string letter)
                          workspace-list)))
      (if ws-info
        (exwm-workspace-switch (cadr ws-info))
        (exwm-workspace-switch (string-to-number
                                (char-to-string
                                 letter))))))

  (global-set-key (kbd "s-w") 'my-workspace-switch)
  (global-set-key (kbd "s-l") '(lambda () (interactive) (launch-program "i3lock-fancy")))

Helper functions

  (defvar wallpaper-path "~/.emacs.d/res/digital_space_universe_4k_8k-wide.jpg")
  (defvar live-wallpaper-path "/home/benson/MEGA/pictures/wallpapers/videos/bg.mp4")
  (defvar exwm-startup-programs
    '("megasync"
      ("compton -f -i .7 -b" "compton")))
  (defvar hard-drive-space "")

  (setq enable-recursive-minibuffers t)
  (defun counsel-shell-command ()
    "Forward to `shell-command'."
    (interactive)
    (ivy-read "Shell Command: "
              shell-command-history
              :caller 'counsel-shell-command))

  (defun launch-program (command &optional process-name)
    (interactive (list (read-shell-command "$ ")))
    (let ((name (or process-name command)))
      (start-process-shell-command name nil command)))

  (defun dmenu-run ()
    (interactive)
    (shell-command "dmenu" nil "dmenu_run -b"))

  (defun call-startup-programs ()
    (dolist (program exwm-startup-programs)
      (if (listp program)
        (launch-program (car program) (cadr program))
        (launch-program program))))

  (defun setup-wallpaper ()
    (launch-program (concat "feh --bg-fill " wallpaper-path) "feh"))

  (defun setup-live-wallpaper () 
    (if (get-process "xwinwrap")
      (delete-process "xwinwrap"))
    (launch-program (concat "xwinwrap -ni -ov -g 1920x1080+1280+0 -s -st -sp -nf -- mpv --loop=inf -wid WID " live-wallpaper-path) "xwinwrap"))

  (defun get-hard-drive-space ()
    (shell-command-to-string "df -h -P -l ~/ | tail -n 1 | tr -s ' ' | cut -d ' ' -f 4"))

  (defun update-hard-drive-space-string ()
    (setq hard-drive-space
          (let ((space-left (get-hard-drive-space)))
            (concat " "
                    (substring space-left
                               0
                               (1- (length space-left)))))))

  (defun display-hard-drive-space-mode ()
    (if (not (member 'hard-drive-space
                     global-mode-string))
        (add-to-list 'global-mode-string
                     'hard-drive-space
                     t)))

Simulation keys

(setq exwm-input-simulation-keys
 '(
    ;; movement
    ([?\C-b] . left)
    ([?\M-b] . C-left)
    ([?\C-f] . right)
    ([?\M-f] . C-right)
    ([?\C-p] . up)
    ([?\C-n] . down)
    ([?\C-a] . home)
    ([?\C-e] . end)
    ([?\M-v] . prior)
    ([?\C-v] . next)
    ([?\C-d] . delete)
    ([?\M-d] . backspace)
    ([?\C-k] . (S-end delete))
    ;; cut/paste.
    ([?\C-w] . ?\C-x)
    ([?\M-w] . ?\C-c)
    ([?\C-y] . ?\C-v)
    ;; search
    ([?\C-s] . ?\C-f)
    ([?\C-.] . ?\C-w)
    ([?\C-/] . ?\C-z)
    ([?\M-s] . ?\C-s)
))

xrandr

(require 'exwm-randr)
;No dash when using intel driver
(setq exwm-randr-workspace-output-plist '(1 "HDMI1" 3 "HDMI1"))
(exwm-randr-enable)

Startup

  (add-hook 'exwm-init-hook 'server-start)

  ; Reminder: Hooks execute in order. Make sure megasync launches after systemtray is enabled
  (add-hook 'exwm-init-hook 'call-startup-programs)
  (add-hook 'exwm-init-hook 'setup-wallpaper)

  (exwm-systemtray-enable)
  (setq display-time-day-and-date t)

  (defvar my/exclude-buffer-modes '(helm-major-mode messages-buffer-mode special-mode))

  (defun my-buffer-predicate (buf)
    (with-current-buffer buf
      (if (memq major-mode my/exclude-buffer-modes)
          nil
        (exwm-layout--other-buffer-predicate buf))))

  (add-hook 'exwm-init-hook
            (lambda ()
              (interactive) 
              (modify-all-frames-parameters
               '((buffer-predicate . my-buffer-predicate)))))

  ;(add-to-list 'default-frame-alist '(alpha . (85 . 50)))
  (setq window-system-default-frame-alist '((x . ((alpha . (85 . 50)) ))))
  ;Display hard drive space

  (add-hook 'display-time-hook 'update-hard-drive-space-string)

  (display-time-mode)
  (display-battery-mode)
  (display-hard-drive-space-mode)

Shutdown

  (add-hook 'exwm-exit-hook 'org-save-all-org-buffers)
  (add-hook 'exwm-exit-hook 'save-org-agenda-files)
  (eval-after-load "term"
    '(progn 
       (define-key term-raw-map (kbd "C-c C-y") 'term-paste)
       (define-key term-raw-map (kbd "M-x") 'helm-M-x)))

My variables alist

  (defvar my/variable-alist-file "~/.emacs.d/codertilldeath_variables.el")
  (defvar my/variable-alist '())

  (save-excursion
     (set-buffer (find-file-noselect my/variable-alist-file))
     (setq my/variable-alist (eval (read (buffer-string))))
     (kill-buffer))

  (defun my/set-variable (key value)
    (let ((res (assq key my-variable-alist)))
      (setcdr res value))
    (my/save-variables))

  (defun my/add-variable (key value)
    (add-to-list 'my/variable-alist
                 '(key value))
    (my/save-variables))

  (defun my/get-variable (key)
    (assoc key my/variable-alist))

  (defun my/save-variables ()
    (interactive)
    (save-excursion
      (let ((buf (find-file-noselect my/variable-alist-file)))
        (set-buffer buf)
        (erase-buffer)
        (print (list 'quote my/variable-alist) buf)
        (save-buffer)
        (kill-buffer)
        (message "variable-alist file list saved to: %s" my/variable-alist-file))))

UI

Turn off menu bar and toolbar

(menu-bar-mode -1)
(tool-bar-mode -1)

Theming

Calm forest theme

(use-package color-theme-modern)
(load-theme 'calm-forest t)

powerline

Test new mode-line
  (defun my-airline-theme ()
    "Set the airline mode-line-format"
    (interactive)
    (setq-default mode-line-format
		  '("%e"
		    (:eval
		     (let* ((active (powerline-selected-window-active))
			    (separator-left (intern (format "powerline-%s-%s"
							    (powerline-current-separator)
							    (car powerline-default-separator-dir))))
			    (separator-right (intern (format "powerline-%s-%s"
							     (powerline-current-separator)
							     (cdr powerline-default-separator-dir))))
			    (mode-line-face (if active 'mode-line 'mode-line-inactive))
			    (visual-block (if (featurep 'evil)
					      (and (evil-visual-state-p)
						   (eq evil-visual-selection 'block))
					    nil))
			    (visual-line (if (featurep 'evil)
					     (and (evil-visual-state-p)
						  (eq evil-visual-selection 'line))
					   nil))
			    (current-evil-state-string (if (featurep 'evil)
							   (upcase (concat (symbol-name evil-state)
									   (cond (visual-block "-BLOCK")
										 (visual-line "-LINE"))))
							 nil))

			    (outer-face
			     (if (powerline-selected-window-active)
				 (if (featurep 'evil)
				     (cond ((eq evil-state (intern "normal"))  'airline-normal-outer)
					   ((eq evil-state (intern "insert"))  'airline-insert-outer)
					   ((eq evil-state (intern "visual"))  'airline-visual-outer)
					   ((eq evil-state (intern "replace")) 'airline-replace-outer)
					   ((eq evil-state (intern "emacs"))   'airline-emacs-outer)
					   (t                                  'airline-normal-outer))
				   'airline-normal-outer)
			       'powerline-inactive1))

			    (inner-face
			     (if (powerline-selected-window-active)
				 (if (featurep 'evil)
				     (cond ((eq evil-state (intern "normal")) 'airline-normal-inner)
					   ((eq evil-state (intern "insert")) 'airline-insert-inner)
					   ((eq evil-state (intern "visual")) 'airline-visual-inner)
					   ((eq evil-state (intern "replace")) 'airline-replace-inner)
					   ((eq evil-state (intern "emacs"))   'airline-emacs-inner)
					   (t                                 'airline-normal-inner))
				   'airline-normal-inner)
			       'powerline-inactive2))

			    (center-face
			     (if (powerline-selected-window-active)
				 (if (featurep 'evil)
				     (cond ((eq evil-state (intern "normal")) 'airline-normal-center)
					   ((eq evil-state (intern "insert")) 'airline-insert-center)
					   ((eq evil-state (intern "visual")) 'airline-visual-center)
					   ((eq evil-state (intern "replace")) 'airline-replace-center)
					   ((eq evil-state (intern "emacs"))   'airline-emacs-center)
					   (t                                 'airline-normal-center))
				   'airline-normal-center)
			       'airline-inactive3))

			    ;; Left Hand Side
			    (lhs-mode (if (featurep 'evil)
					  (list
					   ;; Evil Mode Name
					   (powerline-raw (concat " " current-evil-state-string " ") outer-face)
					   (funcall separator-left outer-face inner-face)
					   ;; Modified string
					   (powerline-raw "%*" inner-face 'l)
					   )
					  (list
					   ;; Modified string
					   (powerline-raw "%*" outer-face 'l)
					   ;; Separator >
					   (powerline-raw " " outer-face)
					   (funcall separator-left outer-face inner-face))))

			    (lhs-rest (list
				       ;; ;; Separator >
				       ;; (powerline-raw (char-to-string #x2b81) inner-face 'l)

				       ;; Eyebrowse current tab/window config
				       (if (featurep 'eyebrowse)
					   (powerline-raw (concat " " (eyebrowse-mode-line-indicator)) inner-face))

				       ;; Git Branch
				       (powerline-raw (airline-get-vc) inner-face)

				       ;; Separator >
				       (powerline-raw " " inner-face)
				       (funcall separator-left inner-face center-face)

				       ;; Directory
				       ;(when (eq airline-display-directory 'airline-directory-shortened)
				       ;  (powerline-raw (airline-shorten-directory default-directory airline-shortened-directory-length) center-face 'l))
				       ;(when (eq airline-display-directory 'airline-directory-full)
				       ;  (powerline-raw default-directory center-face 'l))
				       ;(when (eq airline-display-directory nil)
				       ;  (powerline-raw " " center-face))

				       ;; Buffer ID
				       ;; (powerline-buffer-id center-face)
				       ;; (powerline-raw "%b" center-face)
				       (powerline-buffer-id center-face)

				       (powerline-major-mode center-face 'l)
				       (powerline-process center-face)
				       ;(powerline-minor-modes center-face 'l)

				       ;; Current Function (which-function-mode)
				       (when (and (boundp 'which-func-mode) which-func-mode)
					 ;; (powerline-raw which-func-format 'l nil))
					 (powerline-raw which-func-format center-face 'l))

				       ;; ;; Separator >
				       ;; (powerline-raw " " center-face)
				       ;; (funcall separator-left mode-line face1)

				       (when (boundp 'erc-modified-channels-object)
					 (powerline-raw erc-modified-channels-object center-face 'l))

				       ;; ;; Separator <
				       ;; (powerline-raw " " face1)
				       ;; (funcall separator-right face1 face2)
				     ))

			    (lhs (append lhs-mode lhs-rest))

			    ;; Right Hand Side
			    (rhs (list (powerline-raw global-mode-string center-face 'r)

				       ;; ;; Separator <
				       ;; (powerline-raw (char-to-string #x2b83) center-face 'l)

				       ;; Minor Modes
				       ;(powerline-minor-modes center-face 'l)
				       ;; (powerline-narrow center-face 'l)

				       ;; Subseparator <
				       (powerline-raw (char-to-string airline-utf-glyph-subseparator-right) center-face 'l)

				       ;; Major Mode
				       ;(powerline-major-mode center-face 'l)
				       ;(powerline-process center-face)

				       ;; Separator <
				       (powerline-raw " " center-face)
				       (funcall separator-right center-face inner-face)

				       ;; Buffer Size
				       (when powerline-display-buffer-size
					 (powerline-buffer-size inner-face 'l))

				       ;; Mule Info
				       (when powerline-display-mule-info
					 (powerline-raw mode-line-mule-info inner-face 'l))

				       (powerline-raw " " inner-face)

				       ;; Separator <
				       (funcall separator-right inner-face outer-face)

				       ;; LN charachter
				       (powerline-raw (char-to-string airline-utf-glyph-linenumber) outer-face 'l)

				       ;; Current Line
				       (powerline-raw "%4l" outer-face 'l)
				       (powerline-raw ":" outer-face 'l)
				       ;; Current Column
				       (powerline-raw "%3c" outer-face 'r)

				       ;; % location in file
				       (powerline-raw "%6p" outer-face 'r)

				       ;; position in file image
				       (when powerline-display-hud
					 (powerline-hud inner-face outer-face)))
				 ))

		       ;; Combine Left and Right Hand Sides
		       (concat (powerline-render lhs)
			       (powerline-fill center-face (powerline-width rhs))
			       (powerline-render rhs))))))
    (powerline-reset)
    (kill-local-variable 'mode-line-format))

    (defun my-show-minor-modes ()
    "Set the airline mode-line-format"
    (interactive)
    (setq-default mode-line-format
		  '("%e"
		    (:eval
		     (let* ((active (powerline-selected-window-active))
			    (separator-left (intern (format "powerline-%s-%s"
							    (powerline-current-separator)
							    (car powerline-default-separator-dir))))
			    (separator-right (intern (format "powerline-%s-%s"
							     (powerline-current-separator)
							     (cdr powerline-default-separator-dir))))
			    (mode-line-face (if active 'mode-line 'mode-line-inactive))
			    (visual-block (if (featurep 'evil)
					      (and (evil-visual-state-p)
						   (eq evil-visual-selection 'block))
					    nil))
			    (visual-line (if (featurep 'evil)
					     (and (evil-visual-state-p)
						  (eq evil-visual-selection 'line))
					   nil))
			    (current-evil-state-string (if (featurep 'evil)
							   (upcase (concat (symbol-name evil-state)
									   (cond (visual-block "-BLOCK")
										 (visual-line "-LINE"))))
							 nil))

			    (outer-face
			     (if (powerline-selected-window-active)
				 (if (featurep 'evil)
				     (cond ((eq evil-state (intern "normal"))  'airline-normal-outer)
					   ((eq evil-state (intern "insert"))  'airline-insert-outer)
					   ((eq evil-state (intern "visual"))  'airline-visual-outer)
					   ((eq evil-state (intern "replace")) 'airline-replace-outer)
					   ((eq evil-state (intern "emacs"))   'airline-emacs-outer)
					   (t                                  'airline-normal-outer))
				   'airline-normal-outer)
			       'powerline-inactive1))

			    (inner-face
			     (if (powerline-selected-window-active)
				 (if (featurep 'evil)
				     (cond ((eq evil-state (intern "normal")) 'airline-normal-inner)
					   ((eq evil-state (intern "insert")) 'airline-insert-inner)
					   ((eq evil-state (intern "visual")) 'airline-visual-inner)
					   ((eq evil-state (intern "replace")) 'airline-replace-inner)
					   ((eq evil-state (intern "emacs"))   'airline-emacs-inner)
					   (t                                 'airline-normal-inner))
				   'airline-normal-inner)
			       'powerline-inactive2))

			    (center-face
			     (if (powerline-selected-window-active)
				 (if (featurep 'evil)
				     (cond ((eq evil-state (intern "normal")) 'airline-normal-center)
					   ((eq evil-state (intern "insert")) 'airline-insert-center)
					   ((eq evil-state (intern "visual")) 'airline-visual-center)
					   ((eq evil-state (intern "replace")) 'airline-replace-center)
					   ((eq evil-state (intern "emacs"))   'airline-emacs-center)
					   (t                                 'airline-normal-center))
				   'airline-normal-center)
			       'airline-inactive3))

			    ;; Left Hand Side
			    (lhs-mode (if (featurep 'evil)
					  (list
					   ;; Evil Mode Name
					   (powerline-raw (concat " " current-evil-state-string " ") outer-face)
					   (funcall separator-left outer-face inner-face)
					   ;; Modified string
					   (powerline-raw "%*" inner-face 'l)
					   )
					  (list
					   ;; Modified string
					   (powerline-raw "%*" outer-face 'l)
					   ;; Separator >
					   (powerline-raw " " outer-face)
					   (funcall separator-left outer-face inner-face))))

			    (lhs-rest (list
				       ;; ;; Separator >
				       ;; (powerline-raw (char-to-string #x2b81) inner-face 'l)

				       ;; Eyebrowse current tab/window config
				       (if (featurep 'eyebrowse)
					   (powerline-raw (concat " " (eyebrowse-mode-line-indicator)) inner-face))

				       ;; Git Branch
				       (powerline-raw (airline-get-vc) inner-face)

				       ;; Separator >
				       (powerline-raw " " inner-face)
				       (funcall separator-left inner-face center-face)

				       ;; Directory
				       ;(when (eq airline-display-directory 'airline-directory-shortened)
				       ;  (powerline-raw (airline-shorten-directory default-directory airline-shortened-directory-length) center-face 'l))
				       ;(when (eq airline-display-directory 'airline-directory-full)
				       ;  (powerline-raw default-directory center-face 'l))
				       ;(when (eq airline-display-directory nil)
				       ;  (powerline-raw " " center-face))

				       ;; Buffer ID
				       ;; (powerline-buffer-id center-face)
				       ;; (powerline-raw "%b" center-face)
				       (powerline-buffer-id center-face)

				       (powerline-major-mode center-face 'l)
				       (powerline-process center-face)
				       (powerline-minor-modes center-face 'l)

				       ;; Current Function (which-function-mode)
				       (when (and (boundp 'which-func-mode) which-func-mode)
					 ;; (powerline-raw which-func-format 'l nil))
					 (powerline-raw which-func-format center-face 'l))

				       ;; ;; Separator >
				       ;; (powerline-raw " " center-face)
				       ;; (funcall separator-left mode-line face1)

				       (when (boundp 'erc-modified-channels-object)
					 (powerline-raw erc-modified-channels-object center-face 'l))

				       ;; ;; Separator <
				       ;; (powerline-raw " " face1)
				       ;; (funcall separator-right face1 face2)
				     ))

			    (lhs (append lhs-mode lhs-rest))

			    ;; Right Hand Side
			    (rhs (list (powerline-raw global-mode-string center-face 'r)

				       ;; ;; Separator <
				       ;; (powerline-raw (char-to-string #x2b83) center-face 'l)

				       ;; Minor Modes
				       ;(powerline-minor-modes center-face 'l)
				       ;; (powerline-narrow center-face 'l)

				       ;; Subseparator <
				       (powerline-raw (char-to-string airline-utf-glyph-subseparator-right) center-face 'l)

				       ;; Major Mode
				       ;(powerline-major-mode center-face 'l)
				       ;(powerline-process center-face)

				       ;; Separator <
				       (powerline-raw " " center-face)
				       (funcall separator-right center-face inner-face)

				       ;; Buffer Size
				       (when powerline-display-buffer-size
					 (powerline-buffer-size inner-face 'l))

				       ;; Mule Info
				       (when powerline-display-mule-info
					 (powerline-raw mode-line-mule-info inner-face 'l))

				       (powerline-raw " " inner-face)

				       ;; Separator <
				       (funcall separator-right inner-face outer-face)

				       ;; LN charachter
				       (powerline-raw (char-to-string airline-utf-glyph-linenumber) outer-face 'l)

				       ;; Current Line
				       (powerline-raw "%4l" outer-face 'l)
				       (powerline-raw ":" outer-face 'l)
				       ;; Current Column
				       (powerline-raw "%3c" outer-face 'r)

				       ;; % location in file
				       (powerline-raw "%6p" outer-face 'r)

				       ;; position in file image
				       (when powerline-display-hud
					 (powerline-hud inner-face outer-face)))
				 ))

		       ;; Combine Left and Right Hand Sides
		       (concat (powerline-render lhs)
			       (powerline-fill center-face (powerline-width rhs))
			       (powerline-render rhs))))))
    (powerline-reset)
    (kill-local-variable 'mode-line-format))
Config
(use-package powerline)
(use-package airline-themes)
;(setq sml/theme 'powerline)
;(sml/setup)

(setq powerline-default-separator 'arrow)
(load-theme 'airline-powerlineish)
(my-airline-theme)
(setq battery-mode-line-format "[%b%p%%%%]")

;(powerline-default-theme)

;(setq sml/no-confirm-load-theme t)
;(setq sml/theme 'powerline)
;(sml/setup)

Splash image

(setq fancy-splash-image "~/.emacs.d/res/icon.png")

Navigation

Helm & counsel

  (require 'helm-config)
  (use-package company)
  (helm-mode 1)
  ;(setq ivy-initial-inputs-alist nil)
  (use-package ivy)
  (use-package smex)
  (add-to-list 'ivy-initial-inputs-alist '(counsel-M-x . ""))
  (global-set-key (kbd "C-h M-x") 'helm-M-x)
  (global-set-key (kbd "M-x") 'counsel-M-x)
  (global-set-key (kbd "C-x b") 'ivy-switch-buffer)

Evil mode

  (use-package evil)
  (global-set-key (kbd "C-z") 'evil-local-mode)
  (setq evil-default-state 'emacs)
  (evil-set-initial-state 'term-mode 'emacs)
  (evil-set-initial-state 'help-mode 'emacs)
  (evil-mode 1)

Buffer handling

Ido mode
(use-package ido)
(ido-mode t)
ibuffer
Keybindings
(global-set-key (kbd "C-x C-b") 'ibuffer)
Config
  (require 'ibuf-ext)
  (autoload 'ibuffer "ibuffer" "List buffers." t)
  (add-to-list 'ibuffer-never-show-predicates
               '(lambda (buf)
                  (with-current-buffer buf
                    (eq major-mode 'helm-major-mode))))

  (setq ibuffer-saved-filter-groups
        '(("General"
           ("X-Windows" (mode . exwm-mode))
           ("Terminals" (mode . term-mode))
           ("emacs-config" (or (filename . ".emacs.d")
                               (filename . "emacs-config")))
           ("code" (or (mode . clojure-mode)
                       (mode . c++-mode)
                       (mode . c-mode)
                       (mode . scala-mode)
                       (mode . emacs-lisp-mode)
                       (mode . java-mode)
                       (mode . js-mode)
                       (mode . python-mode)))
           ("Org Mode" (not or (not mode . org-mode)
                            (directory-name . "agenda")))
           ("text" (filename . "\\.txt"))
           ("Agenda Buffers" (mode . org-agenda-mode))
           ("Agenda Files" (mode . org-mode))
           ("Help" (or (name . "\*Help\*")
                       (name . "\*Apropos\*")
                       (name . "\*info\*")))
           )))

  (setq ibuffer-show-empty-filter-groups nil)

  (add-hook 'ibuffer-mode-hook
            '(lambda ()
               (ibuffer-auto-mode 1)
               (ibuffer-switch-to-saved-filter-groups "General")
               (ibuffer-do-sort-by-alphabetic)))
Custom Filters
  (eval-after-load "ibuf-ext"
    '(define-ibuffer-filter directory-name
         "Filter files in the agenda folder"
       (:description "agenda")
       (and (buffer-file-name buf) 
            (string-match qualifier
                          (buffer-file-name buf)))))

  ;(add-hook 'exwm-workspace-switch-hook 'ibuffer)
Ace window
(use-package switch-window)
(global-set-key (kbd "C-x o") 'switch-window)
(setq switch-window-shortcut-style 'qwerty)
(setq switch-window-qwerty-shortcuts
      '("a" "o" "e" "u" "i" "d" "h" "t" "n" "s"))

Ace jump

(use-package ace-jump-mode)
(global-set-key (kbd "C-c SPC") 'ace-jump-mode)
(global-set-key (kbd "C-c j") 'ace-jump-line-mode)

Font

  ;(set-face-attribute 'default t :font "Dotsies Training Wheels-20")
  ;(add-to-list 'default-frame-alist '(font . "Dotsies Training Wheels-20"))
  (let ((font (format "%s"
                      "RobotoMono-11"
                      ;; "Tamzen"
                      ;; "SourceCodePro"
                      ;; "Gohu Gohufont"
                      )))
    (add-to-list 'default-frame-alist `(font . ,font)))

Tools

Encryption

  (require 'epa-file)
  (epa-file-enable)
  (setq epa-pinentry-mode 'loopback)
  (setq epa-file-cache-passphrase-for-symmetric-encryption t)

Org Mode

Keybindings

(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cc" 'org-capture)
(global-set-key "\C-cb" 'org-iswitchb)
(global-set-key (kbd "<f12>") 'org-agenda)
(global-set-key (kbd "<f11>") (lambda () (interactive) (org-agenda "" "g")))
(global-set-key (kbd "<f9>") 'org-capture)
(global-set-key (kbd "C-x C-o") 'org-switchb)
(define-key org-mode-map (kbd "C-c SPC") nil)

Should always use visual-line-mode

(add-hook 'org-mode-hook (lambda () (visual-line-mode 1)))

Custom Journal

Attempt 3
  (defvar yearly-theme "Surpass")

  (defun completed-tags-search (start-date end-date)
    (let ((org-agenda-overriding-header "* Log")
          (tag-search (concat (format "TODO=\"DONE\"&CLOSED>=\"<%s>\"&CLOSED<=\"<%s>\""
                      start-date
                      end-date))))
      (org-tags-view nil tag-search)))

  (defun get-tasks-from (start-date end-date)
    (let (string)
      (save-window-excursion
        (completed-tags-search start-date end-date)
        (setq string (mapconcat 'identity
                                (mapcar (lambda (a)
                                          (concat "**" a))
                                        (butlast (cdr (split-string (buffer-string) "\n")) 1)) 
                                "\n"))
        (kill-buffer))
      string))

  (defun get-journal-entries-from (start-date end-date)
    (let ((string "")
      match)
      (save-window-excursion
    (switch-to-buffer (find-file "~/MEGA/org/entries/journal.gpg"))
    (goto-char (point-min))
    (while (setq match (re-search-forward "^\\*\\*\\* \\(2[0-9]\\{3\\}-[0-9]\\{2\\}-[0-9]\\{2\\}\\) \\w+$" nil t))
    (let ((date (match-string 1)))
      (when (and (org-time< start-date date)
             (or (not end-date) (org-time< date end-date)))
        (org-narrow-to-subtree)
        (org-shiftmetaleft)
        (setq string (concat string "\n" (buffer-string)))
        (org-shiftmetaright)
        (widen))))
    (not-modified)
    (kill-buffer))
      string))

  (defun weekly-review-file ()
    (set-buffer
     (org-capture-target-buffer (format "~/MEGA/org/entries/review/%s/Year of %s, Week %s.org"
                                        (format-time-string "%Y")
                                        yearly-theme
                                        (format-time-string "%V")))))
  (defun make-up-review-file ()
    (let* ((date (org-read-date))
           (week (number-to-string
                  (org-days-to-iso-week
                   (org-time-string-to-absolute date)))))
      (org-capture-put :start-date date)
      (org-capture-put :start-week week)
      (set-buffer 
       (org-capture-target-buffer
        (format "~/MEGA/org/entries/review/%s/Year of %s, Week %s-%s.org"
                (format-time-string "%Y")
                yearly-theme
                week
                (format-time-string "%V"))))))

Capture templates

  (setq org-default-notes-file "~/MEGA/org-old/notes.org")
  (setq org-capture-templates
        '(("t" "Todo" entry (file "~/MEGA/org/agenda/refile.org")
           "* TODO %?\n%U\n%a\n")
          ("s" "Stuff" entry (file "~/MEGA/org/agenda/refile.org")
           "* TODO %?\n%U")
          ("f" "Reference" entry (file "~/MEGA/org/agenda/reference.org")
          "* %?\n%i%U")
          ("a" "Appointment" entry (file "~/MEGA/org/agenda/refile.org")
           "* TODO %? :APT:")
          ;("p" "Panic" entry (file "~/MEGA/org/agenda/panic.org")
          ; "* TODO %?")
          ("r" "Reviews")
          ("rm" "Make-up Weekly Review" plain (function make-up-review-file)
           (file "~/MEGA/org/templates/review-interactive.org"))
          ("rw" "Weekly Review" plain (function weekly-review-file)
           (file "~/MEGA/org/templates/weekly-review-template.org"))
          ("i" "Important information" entry (file "~/MEGA/org/entries/important.gpg")
           "* %?")
          ("e" "Entries")
          ("ed" "Dream" entry (file+olp+datetree "~/MEGA/org/entries/dream.org")
           "* %?")
          ("ee" "Exercise" table-line (file "~/MEGA/org/entries/exercise.org")
           "| %u | %^{Push-ups} | %^{Leg-lifts} | %^{Squats}")
          ("em" "Expenditures" table-line (file "~/MEGA/org/entries/expenses.org")
           "| %u | $%^{Amount} | %^{Description}" )
          ("ej" "Journal")
          ("eje" "Journal Entry" entry (file+olp+datetree "~/MEGA/org/entries/journal.gpg")
           "* %<%R> %?\n%U\n\n")
          ("ejp" "Plan your day" entry (file+olp+datetree "~/MEGA/org/entries/journal.gpg")
           (file "~/MEGA/org/templates/daily-plan.org"))
          ("l" "Later")
          ("lr" "Read Later" entry (file "~/MEGA/org/agenda/reads.org")
           "* TODO %?\n%U\n")
          ("ll" "Links for life" entry (file "~/MEGA/org/entries/links.org")
           "* %?")
          ;("w" "Weekly Thoughts" entry (function org-capture-function)
          ;  "** %<%R> %?")
          ("p" "Protocol" entry (file+headline "~/MEGA/org/entries/org-protocol.org" "Inbox")
           "* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?")
          ("L" "Protocol Link" entry (file+headline "~/MEGA/org/entries/org-protocol.org" "Inbox")
           "* %? [[%:link][%:description]] \nCaptured On: %U")))

org-agenda

Agenda Files
  (defvar org-agenda-files-list
    "~/.emacs.d/agenda-files.el"
    "Path to save org-agenda-files list") 

  (defun save-org-agenda-files ()
    ""
    (interactive)
    (save-excursion
      (let ((buf (find-file-noselect org-agenda-files-list)))
        (set-buffer buf)
        (erase-buffer)
        (print (list 'quote org-agenda-files) buf)
        (save-buffer)
        (kill-buffer)
        (message "org-agenda file list saved to: %s" org-agenda-files-list))))

  (defun org-agenda-load-file-list ()
    ""
    (interactive)
    (save-excursion
      (let ((buf (find-file-noselect org-agenda-files-list)))
        (set-buffer buf)
        (setq org-agenda-files (eval (read (buffer-string))))
        (kill-buffer)
        (message "org-agenda-files-list loaded from: %s" org-agenda-files-list))))
General config
  (setq org-log-done 'time)
  (setq org-agenda-window-setup 'other-window)
  (setq org-agenda-restore-windows-after-quit t)
  (setq org-todo-keywords
         '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!)")
           (sequence  "WAIT(w@/!)" "HOLD(h)" "|" "CANCELLED(c@/!)")))

  (setq org-todo-keyword-faces 
        '(("NEXT" :foreground "cyan" :weight bold)
          ("WAIT" :foreground "yellow" :weight bold)
          ("HOLD" :foreground "red" :weight bold)
          ("CANCELLED" :foreground "dark gray" :weight bold)))

  (setq org-todo-state-tags-triggers
        (quote (("HOLD" ("HOLD" . t))
                ("WAIT" ("WAITING" . t))
                ("TODO" ("HOLD") ("WAITING")))))


  (setq org-use-fast-todo-selection t)

  ;(setq org-agenda-files (quote ("~/MEGA/org/agenda")))
  (org-agenda-load-file-list)

  (setq my/non-agenda-refiles
        '(("~/MEGA/org/agenda/someday.org" :maxlevel . 9)
          ("~/MEGA/org/agenda/tickler.org" :maxlevel . 9)
          ("~/MEGA/org/agenda/reference.org" :maxlevel . 9)))
  ; Targets include this file and any file contributing to the agenda - up to 9 levels deep
  (setq org-refile-targets `((nil :maxlevel . 9)
                             (org-agenda-files :maxlevel . 9)
                             ,@my/non-agenda-refiles))

  (setq org-refile-target-verify-function
        (lambda () 
          (not (member "ARCHIVE" (org-get-tags-at (point) nil)))))

  ; Use full outline paths for refile targets - we file directly with IDO
  (setq org-refile-use-outline-path 'file)

  ; Targets complete directly with IDO
  (setq org-outline-path-complete-in-steps nil)

  ; Allow refile to create parent tasks with confirmation
  (setq org-refile-allow-creating-parent-nodes (quote confirm))

  ; Use the current window for indirect buffer display
  (setq org-indirect-buffer-display 'current-window)

  ;; Do not dim blocked tasks
  (setq org-agenda-dim-blocked-tasks nil)

  (setq org-agenda-compact-blocks t)
Norang Projects code
     (require 'org-habit)

     (defun bh/find-project-task ()
       "Move point to the parent (project) task if any"
       (save-restriction
         (widen)
         (let ((parent-task (save-excursion (org-back-to-heading 'invisible-ok) (point))))
           (while (org-up-heading-safe)
             (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
               (setq parent-task (point))))
           (goto-char parent-task)
           parent-task)))

     (defun bh/is-project-p ()
       "Any task with a todo keyword subtask"
       (save-restriction
         (widen)
         (let ((has-subtask)
               (subtree-end (save-excursion (org-end-of-subtree t)))
               (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
           (save-excursion
             (forward-line 1)
             (while (and (not has-subtask)
                         (< (point) subtree-end)
                         (re-search-forward "^\*+ " subtree-end t))
               (when (member (org-get-todo-state) org-todo-keywords-1)
                 (setq has-subtask t))))
           (and is-a-task has-subtask))))

     (defun bh/is-project-subtree-p ()
       "Any task with a todo keyword that is in a project subtree.
     Callers of this function already widen the buffer view."
       (let ((task (save-excursion (org-back-to-heading 'invisible-ok)
                                   (point))))
         (save-excursion
           (bh/find-project-task)
           (if (equal (point) task)
               nil
             t))))

     (defun bh/is-task-p ()
       "Any task with a todo keyword and no subtask"
       (save-restriction
         (widen)
         (let ((has-subtask)
               (subtree-end (save-excursion (org-end-of-subtree t)))
               (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
           (save-excursion
             (forward-line 1)
             (while (and (not has-subtask)
                         (< (point) subtree-end)
                         (re-search-forward "^\*+ " subtree-end t))
               (when (member (org-get-todo-state) org-todo-keywords-1)
                 (setq has-subtask t))))
           (and is-a-task (not has-subtask)))))

     (defun bh/is-subproject-p ()
       "Any task which is a subtask of another project"
       (let ((is-subproject)
             (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
         (save-excursion
           (while (and (not is-subproject) (org-up-heading-safe))
             (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
               (setq is-subproject t))))
         (and is-a-task is-subproject)))

     (defun bh/list-sublevels-for-projects-indented ()
       "Set org-tags-match-list-sublevels so when restricted to a subtree we list all subtasks.
       This is normally used by skipping functions where this variable is already local to the agenda."
       (if (marker-buffer org-agenda-restrict-begin)
           (setq org-tags-match-list-sublevels 'indented)
         (setq org-tags-match-list-sublevels nil))
       nil)

     (defun bh/list-sublevels-for-projects ()
       "Set org-tags-match-list-sublevels so when restricted to a subtree we list all subtasks.
       This is normally used by skipping functions where this variable is already local to the agenda."
       (if (marker-buffer org-agenda-restrict-begin)
           (setq org-tags-match-list-sublevels t)
         (setq org-tags-match-list-sublevels nil))
       nil)

     (defvar bh/hide-scheduled-and-waiting-next-tasks t)

     (defun bh/toggle-next-task-display ()
       (interactive)
       (setq bh/hide-scheduled-and-waiting-next-tasks (not bh/hide-scheduled-and-waiting-next-tasks))
       (when  (equal major-mode 'org-agenda-mode)
         (org-agenda-redo))
       (message "%s WAITING and SCHEDULED NEXT Tasks" (if bh/hide-scheduled-and-waiting-next-tasks "Hide" "Show")))

     (defun bh/skip-stuck-projects ()
       "Skip trees that are not stuck projects"
       (save-restriction
         (widen)
         (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
           (if (bh/is-project-p)
               (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
                      (has-next ))
                 (save-excursion
                   (forward-line 1)
                   (while (and (not has-next) (< (point) subtree-end) (re-search-forward "^\\*+ NEXT " subtree-end t))
                     (unless (member "WAITING" (org-get-tags-at))
                       (setq has-next t))))
                 (if has-next
                     nil
                   next-headline)) ; a stuck project, has subtasks but no next task
             nil))))

     (defun bh/skip-non-stuck-projects ()
       "Only show subtrees that are stuck projects"
       ;; (bh/list-sublevels-for-projects-indented)
       (save-restriction
         (widen)
         (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
           (if (bh/is-project-p)
               (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
                      (has-next ))
                 (save-excursion
                   (forward-line 1)
                   (while (and (not has-next)
                               (< (point) subtree-end)
                               (re-search-forward "^\\*+ NEXT " subtree-end t))
                     (unless (member "WAITING" (org-get-tags-at))
                       (setq has-next t))))
                 (if has-next
                     next-headline
                   nil)) ; a stuck project, has subtasks but no next task
             next-headline))))

     (defun bh/skip-non-projects ()
       "Skip trees that are not projects"
       ;; (bh/list-sublevels-for-projects-indented)
       (if (save-excursion (bh/skip-non-stuck-projects))
           (save-restriction
             (widen)
             (let ((subtree-end (save-excursion (org-end-of-subtree t))))
               (cond
                ((bh/is-project-p)
                 nil)
                ((and (bh/is-project-subtree-p) (not (bh/is-task-p)))
                 nil)
                (t
                 subtree-end))))
         (save-excursion (org-end-of-subtree t))))

     (defun bh/skip-non-tasks ()
       "Show non-project tasks.
     Skip project and sub-project tasks, habits, and project related tasks."
       (save-restriction
         (widen)
         (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
           (cond
            ((bh/is-task-p)
             nil)
            (t
             next-headline)))))

     (defun bh/skip-project-trees-and-habits ()
       "Skip trees that are projects"
       (save-restriction
         (widen)
         (let ((subtree-end (save-excursion (org-end-of-subtree t))))
           (cond
            ((bh/is-project-p)
             subtree-end)
            ((org-is-habit-p)
             subtree-end)
            (t
             nil)))))

     (defun bh/skip-projects-and-habits-and-single-tasks ()
       "Skip trees that are projects, tasks that are habits, single non-project tasks"
       (save-restriction
         (widen)
         (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
           (cond
            ((org-is-habit-p)
             next-headline)
            ((and bh/hide-scheduled-and-waiting-next-tasks
                  (member "WAITING" (org-get-tags-at)))
             next-headline)
            ((bh/is-project-p)
             next-headline)
            ((and (bh/is-task-p) (not (bh/is-project-subtree-p)))
             next-headline)
            (t
             nil)))))

     (defun bh/skip-project-tasks-maybe ()
       "Show tasks related to the current restriction.
     When restricted to a project, skip project and sub project tasks, habits, NEXT tasks, and loose tasks.
     When not restricted, skip project and sub-project tasks, habits, and project related tasks."
       (save-restriction
         (widen)
         (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
                (next-headline (save-excursion (or (outline-next-heading) (point-max))))
                (limit-to-project (marker-buffer org-agenda-restrict-begin)))
           (cond
            ((bh/is-project-p)
             next-headline)
            ((org-is-habit-p)
             subtree-end)
            ((and (not limit-to-project)
                  (bh/is-project-subtree-p))
             subtree-end)
            ((and limit-to-project
                  (bh/is-project-subtree-p)
                  (member (org-get-todo-state) (list "NEXT")))
             subtree-end)
            (t
             nil)))))

     (defun bh/skip-project-tasks ()
       "Show non-project tasks.
     Skip project and sub-project tasks, habits, and project related tasks."
       (save-restriction
         (widen)
         (let* ((subtree-end (save-excursion (org-end-of-subtree t))))
           (cond
            ((bh/is-project-p)
             subtree-end)
            ((org-is-habit-p)
             subtree-end)
            ((bh/is-project-subtree-p)
             subtree-end)
            (t
             nil)))))

     (defun bh/skip-non-project-tasks ()
       "Show project tasks.
     Skip project and sub-project tasks, habits, and loose non-project tasks."
       (save-restriction
         (widen)
         (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
                (next-headline (save-excursion (or (outline-next-heading) (point-max)))))
           (cond
            ((bh/is-project-p)
             next-headline)
            ((org-is-habit-p)
             subtree-end)
            ((and (bh/is-project-subtree-p)
                  (member (org-get-todo-state) (list "NEXT")))
             subtree-end)
            ((not (bh/is-project-subtree-p))
             subtree-end)
            (t
             nil)))))

     (defun bh/skip-projects-and-habits ()
       "Skip trees that are projects and tasks that are habits"
       (save-restriction
         (widen)
         (let ((subtree-end (save-excursion (org-end-of-subtree t))))
           (cond
            ((bh/is-project-p)
             subtree-end)
            ((org-is-habit-p)
             subtree-end)
            (t
             nil)))))

     (defun bh/skip-non-subprojects ()
       "Skip trees that are not projects"
       (let ((next-headline (save-excursion (outline-next-heading))))
         (if (bh/is-subproject-p)
             nil
           next-headline)))


  (defun bh/widen ()
    (interactive)
    (if (equal major-mode 'org-agenda-mode)
        (progn
          (org-agenda-remove-restriction-lock)
          (when org-agenda-sticky
            (org-agenda-redo)))
      (widen)))
Views
  (defun test (throwaway)
    (org-agenda-prepare "This is a test")
    (insert throwaway)
    (org-agenda-finalize)
    (setq buffer-read-only t))

  (setq org-agenda-tags-todo-honor-ignore-options t)

  (defun bh/org-auto-exclude-function (tag)
    "Automatic task exclusion in the agenda with / RET"
    (and (cond
          ((string= tag "hold")
           t))
         (concat "-" tag)))

  (add-hook 'org-agenda-mode-hook
            '(lambda ()
               (org-defkey org-agenda-mode-map
                           "W"
                           (lambda ()
                             (interactive)
                             (setq bh/hide-scheduled-and-waiting-next-tasks
                                   (not bh/hide-scheduled-and-waiting-next-tasks))
                             (bh/widen))))
            'append)

  (setq org-agenda-auto-exclude-function 'bh/org-auto-exclude-function)
  (setq org-agenda-skip-deadline-prewarning-if-scheduled t)

  (defun cap/ignore-schedule-deadline (tag)
        `((org-agenda-overriding-header (concat ,tag
                                                (if bh/hide-scheduled-and-waiting-next-tasks
                                                    ""
                                                  " (including WAITING and SCHEDULED tasks)")))
          (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
          (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
          (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)))

  (defvar view/general-view 
    '(("g" "General View"
           ((agenda "" ((org-agenda-log-mode 1)))
            (tags-todo "+TODO=\"STAGED\""
              ((org-agenda-overriding-header "------------------------------------\nStaged Tasks")))
            (tags-todo "+REFILE"
              ((org-agenda-overriding-header "Refile tasks")))
            (tags-todo "WORK|SCHOOL-APT-TODO=\"STAGED\""
              ((org-agenda-overriding-header "Important Tasks")))
            (tags-todo "+APT"
              ((org-agenda-overriding-header "Appointments")))
            (tags-todo "+TODO=\"WAIT\""
              ((org-agenda-overriding-header "Tasks on hold")))
            (tags-todo "-WORK-SCHOOL+TODO=\"TODO\""
              ((org-agenda-overriding-header "All tasks")))))))

  (setq org-agenda-custom-commands
        `(,@view/general-view
          ("n" . "Norang overhaul")
          ("nv" "Norang View"
           ((agenda "" (;; (org-agenda-log-mode 1)
                        (org-agenda-skip-scheduled-if-done t)
                        (org-agenda-skip-deadline-if-done t)
                        (org-agenda-span 1)
                        ))
            (tags-todo "+REFILE"
                       ((org-agenda-overriding-header "-------------------------------------\nRefile tasks")))
            (tags-todo "SCHEDULED<\"<today>\""
                       ((org-agenda-files '("~/MEGA/org/agenda/tickler.org"))
                        (org-agenda-overriding-header "Tickler")))
            (tags-todo "-REFILE-HOLD-DOESNOTAPPLY/!NEXT"
                       (,@(cap/ignore-schedule-deadline "Project Next Tasks")
                        (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
                        (org-tags-match-list-sublevels t)))
            (tags-todo "-REFILE-HOLD-DOESNOTAPPLY/!"
                       (,@(cap/ignore-schedule-deadline "Standalone Tasks")
                        (org-agenda-skip-function 'bh/skip-project-tasks)))
            (tags-todo "+HOLD"
                       (,@(cap/ignore-schedule-deadline "On Hold Tasks")
                        (org-agenda-skip-function 'bh/skip-project-tasks)))))
          ("nn" "Next tasks" 
           ((tags-todo "+PLAN"
                       ((org-agenda-overriding-header "Today's plan")))
            (tags-todo "+REFILE"
                       ((org-agenda-overriding-header "Refile tasks")))
            (tags-todo "SCHEDULED<\"<today>\""
                       ((org-agenda-files '("~/MEGA/org/agenda/tickler.org"))
                        (org-agenda-overriding-header "Tickler")))
            (tags-todo "-REFILE-DOESNOTAPPLY-SCHEDULED>\"<today>\"/!"
                       ((org-agenda-overriding-header "Stuck Projects")
                        (org-tags-match-list-sublevels 'indented)
                        (org-agenda-skip-function 'bh/skip-non-stuck-projects)
                        (org-agenda-sorting-strategy
                         '(category-keep))))
            (tags-todo "-REFILE-HOLD-DOESNOTAPPLY/!"
                       ((org-agenda-overriding-header "Active Projects")
                        (org-agenda-skip-function 'bh/skip-non-projects)
                        (org-tags-match-list-sublevels 'indented)))
            (tags-todo "-REFILE-HOLD-DOESNOTAPPLY/!NEXT"
                       ((org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
                        (org-agenda-overriding-header "Next Tasks")
                        (org-tags-match-list-sublevels t)
                        (org-agenda-sorting-strategy '(deadline-up))))
            (tags-todo "-REFILE-HOLD-PLAN-DOESNOTAPPLY/!"
                       ((org-agenda-skip-function 'bh/skip-project-tasks)
                        (org-agenda-overriding-header "Standalone Tasks (including WAITING and SCHEDULED tasks)")
                        (org-agenda-sorting-strategy '(deadline-up))))))
          ("nh" "Projects on hold" todo "HOLD" ((org-tags-match-list-sublevels 'indented)))
          ("nt" "Tickler" agenda "" ((org-agenda-files '("/home/benson/MEGA/org/agenda/tickler.org"))))
          ("nd" "DOESNOTAPPLY" tags "DOESNOTAPPLY")
          ("u" "Test"
           ((tags-todo "+PLAN"
                       ((org-agenda-overriding-header "Today's plan")))
            (test "Hello"
                   ((org-agenda-overriding-header "Hello")))
            ))
          ("c" . "Custom Commands")
          ("ca" "Appointments" tags-todo "+APT")
          ("cs" "School"
           ((tags-todo "SCHOOL")))
          ("cr" "Archive" tags "TODO=\"DONE\"-PLAN")
          ("cf" "Refile" tags-todo "+REFILE")
          ("cp" "Post-panic" tags-todo "+PANIC")))
Face
  (custom-set-faces
'(org-agenda-date-today ((t (:inherit org-agenda-date :foreground "cyan" :slant italic :weight bold :height 1.1)))))

Plugins

org-bullets
(use-package org-bullets)
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
calfw-org
(use-package calfw)
(use-package calfw-ical)
(use-package calfw-gcal)
(use-package calfw-org)
(global-set-key (kbd "C-c A") 'cfw:open-org-calendar)
(setq cfw:org-overwrite-default-keybinding t)
sync with google calendar
  (use-package org-caldav)
  (use-package oauth2)
  (setq epa-pinentry-mode 'loopback)
  (setq plstore-cache-passphrase-for-symmetric-encryption t)

  (save-excursion
    (let ((filename "google-calendar-secret.el"))
      (when (file-exists-p filename)
        (set-buffer (find-file-noselect filename))
        (let ((var (eval (read (buffer-string)))))
          (setq org-caldav-oauth2-client-id (car var)
                org-caldav-oauth2-client-secret (cadr var))))))

  (setq org-caldav-url 'google
        org-caldav-calendar-id "jqeua8pamjrclakq3bg8mpnlis@group.calendar.google.com"
        org-caldav-inbox "~/MEGA/org/agenda/test.org"
        org-caldav-files '("~/MEGA/org/agenda/school.org" "~/MEGA/org/agenda/people.org") 
        org-icalendar-include-todo nil
        org-icalendar-include-sexp t
        org-icalendar-categories '(all-tags category)
        org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due)
        org-icalendar-use-scheduled '(event-if-todo event-if-not-todo todo-start)
        org-icalendar-with-timestamps nil
        org-caldav-delete-org-entries 'never)
  (defun always-use-loopback (fun context args)
    (setf (epg-context-pinentry-mode context) epa-pinentry-mode)
    (funcall fun context args))
  (advice-add 'epg--start :around #'always-use-loopback)
  (setq org-caldav-skip-conditions 
        '(nottodo ("TODO" "NEXT"))
        )
  (setq org-caldav-exclude-tags '("ARCHIVE"))

Code-blocks

(require 'ob-core)
(require 'ob-clojure)
(setq org-babel-clojure-backend 'cider)
(org-babel-do-load-languages
  'org-babel-load-languages
  '((clojure . t)))

View org files

(defun make-org-file (filename)
  "Make an org buffer in folder for all new incoming org files"
  (interactive "MName: ")
  (switch-to-buffer (find-file-noselect (concat "~/MEGA/org/random/" filename ".org"))))
  
(defun make-encrypted-org-file (filename) 
  (interactive "MName: ")
  (switch-to-buffer (find-file-noselect (concat "~/MEGA/org/random/" filename ".gpg")))
  (insert "# -*- mode:org; epa-file-encrypt-to: (\"bensonchu457@gmail.com\") -*-\n\n")
  (org-mode))
  

(defun view-org-files ()
  "Convenient way for openning up org folder in dired"
  (interactive)
  (dired "~/MEGA/org/"))

Reveal.js

(use-package ox-reveal)
(setq org-reveal-root "file:///home/benson/reveal.js")

Require org-protocol

(require 'org-protocol)

Allow alphabetic lists

  (setq org-list-allow-alphabetical t)

My Template

(add-to-list 'org-structure-template-alist
 '("sv" "#+BEGIN_SRC ? :results value\n\n#+END_SRC"))
(add-to-list 'org-structure-template-alist
 '("so" "#+BEGIN_SRC ? :results output\n\n#+END_SRC"))

Elfeed

  ;; Load elfeed-org
  (use-package elfeed)
  (use-package elfeed-org)

  ;; Initialize elfeed-org
  ;; This hooks up elfeed-org to read the configuration when elfeed
  ;; is started with =M-x elfeed=

  ;; Optionally specify a number of files containing elfeed
  ;; configuration. If not set then the location below is used.
  ;; Note: The customize interface is also supported.
  (setq rmh-elfeed-org-files (list "~/.emacs.d/elfeed.org"))
  (elfeed-org)
  (setq-default elfeed-search-filter "@6-months-ago +unread -youtube")
  (define-key elfeed-search-mode-map "U" 'elfeed-search-fetch-visible)
  (define-key elfeed-search-mode-map "Y" (lambda ()
					   (interactive)
					   (elfeed-search-set-filter "+youtube +unread")))
  (define-key elfeed-search-mode-map "h" (lambda ()
					   (interactive)
					   (elfeed-search-set-filter nil)))

  (defun elfeed-show-youtube-dl ()
    "Download the current entry with youtube-dl."
    (interactive)
    (pop-to-buffer (youtube-dl (elfeed-entry-link elfeed-show-entry))))

  (cl-defun elfeed-search-youtube-dl (&key slow)
    "Download the current entry with youtube-dl."
    (interactive)
    (let ((entries (elfeed-search-selected)))
      (dolist (entry entries)
	(if (null (youtube-dl (elfeed-entry-link entry)
			      :title (elfeed-entry-title entry)
			      :slow slow))
	    (message "Entry is not a YouTube link!")
	  (message "Downloading %s" (elfeed-entry-title entry)))
	(elfeed-untag entry 'unread)
	(elfeed-search-update-entry entry)
	(unless (use-region-p) (forward-line)))))

  (define-key elfeed-search-mode-map "d" 'elfeed-search-youtube-dl)
  (setq youtube-dl-directory "~/big_files/Videos/youtube-dl")

(require 'dired-aux)

(defvar dired-filelist-cmd
  '(("vlc" "-L")))

(defun dired-start-process (cmd &optional file-list)
  (interactive
   (let ((files (dired-get-marked-files
                 t current-prefix-arg)))
     (list
      (dired-read-shell-command "& on %s: "
                                current-prefix-arg files)
      files)))
  (let (list-switch)
    (start-process
     cmd nil shell-file-name
     shell-command-switch
     (format
      "nohup 1>/dev/null 2>/dev/null %s \"%s\""
      (if (and (> (length file-list) 1)
               (setq list-switch
                     (cadr (assoc cmd dired-filelist-cmd))))
          (format "%s %s" cmd list-switch)
        cmd)
      (mapconcat #'expand-file-name file-list "\" \"")))))

  (defun watch-youtube ()
    (interactive)
    (dired "~/big_files/Videos/youtube-dl")
    (local-set-key (kbd "RET") 'dired-start-process))

Programming

Autocompletion

  (use-package company)
  (use-package irony)
  (add-hook 'c++-mode-hook 'irony-mode)
  (add-hook 'c-mode-hook 'irony-mode)
  (add-hook 'objc-mode-hook 'irony-mode)

  (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)

  (global-company-mode)

Yasnippets

(use-package yasnippet)
(define-key yas-minor-mode-map (kbd "<backtab>") 'yas-expand)
(yas-global-mode 1)

Projectile

  (use-package projectile)
  (use-package helm-projectile)
  (use-package counsel-projectile)

  (projectile-global-mode)
  ; Deprecated?
  ;(counsel-projectile-on)
  (cons 'projectile-root-bottom-up
        (remove 'projectile-root-bottom-up
                projectile-project-root-files-functions))
  (setq projectile-indexing-method 'native)
  (setq projectile-completion-system 'ivy)
  (setq projectile-switch-project-action 'neotree-projectile-action)

hs-minor-mode

  (defun set-hiding-indentation (column)
    (interactive "P")
    (set-selective-display
     (or column
         (unless selective-display
           (1+ (current-column))))))

  (defun set-hiding-indentation-to-point (column)
    (interactive "P")
    (if hs-minor-mode
        (if (condition-case nil
                (hs-toggle-hiding)
              (error t))
            (hs-show-all))
      (set-hiding-indentation column)))

  (global-set-key (kbd "C-=") 'hs-toggle-hiding)
  (global-set-key (kbd "C--") 'set-hiding-indentation-to-point)
  (add-hook 'c-mode-common-hook   'hs-minor-mode)
  (add-hook 'emacs-lisp-mode-hook 'hs-minor-mode)
  (add-hook 'java-mode-hook       'hs-minor-mode)
  (add-hook 'lisp-mode-hook       'hs-minor-mode)
  (add-hook 'perl-mode-hook       'hs-minor-mode)
  (add-hook 'sh-mode-hook         'hs-minor-mode)

Ensime (scala)

(use-package ensime)

Magit

  (use-package magit)
  (global-set-key (kbd "C-x g") 'magit-status)
  (global-set-key (kbd "C-x M-g") 'magit-dispatch-popup)

SPACES

  (setq TeX-auto-untabify 't)
  (setq indent-tabs-mode nil)
  (add-hook 'java-mode-hook
            (lambda () 
              (setq indent-tabs-mode nil)))
  (add-hook 'clojure-mode
             (lambda ()
              (setq indent-tabs-mode nil)))

Freekeys

(use-package free-keys)
(bind-key "C-h C-k" 'free-keys)

Eww

  (global-set-key (kbd "C-c g")
    (lambda ()
      (interactive)
      (w3m-goto-url "https://google.com")))

New

Swiper or counsel-grep

  (global-set-key (kbd "C-s") 'counsel-grep-or-swiper)

Youtube-dl

  (add-to-list 'load-path "~/.emacs.d/custom/youtube-dl-emacs/")
  (require 'youtube-dl)

Spaces

(setq default-tab-width 4)
(setq-default indent-tabs-mode nil)

glsl-mode

(autoload 'glsl-mode "glsl-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.glsl\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.vert\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.frag\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.geom\\'" . glsl-mode))

Broken

mu4e

General config

(add-to-list 'load-path "~/.emacs.d/custom/mu/mu4e/")
(load "mu4e-meta.el.in")
(setq mu4e-msg2pdf "~/.emacs.d/custom/mu/toys/msg2pdf/msg2pdf")

(require 'mu4e-meta)
(require 'mu4e)
(add-to-list 'mu4e-view-actions
  '("ViewInBrowser" . mu4e-action-view-in-browser) t)
  (global-set-key (kbd "<f8>") 'mu4e)

Multiple accounts

(setq mu4e-sent-folder "/Gmail/[Gmail].Sent Mail"
mu4e-drafts-folder "/Gmail/[Gmail].Drafts"
mu4e-refile-folder "/Gmail/[Gmail].Archive"
user-mail-address "bensonchu457@gmail.com"
smtpmail-default-smtp-server "smtp.gmail.com"
smtpmail-smtp-server "smtp.gmail.com")

(defvar my-mu4e-account-alist
'(("Gmail"
(mu4e-sent-folder "/work/Sent Mail")
(mu4e-drafts-folder "/Gmail/[Gmail].Drafts")
(mu4e-refile-folder "/Gmail/[Gmail].Archive")
(user-mail-address "bensonchu457@gmail.com")
(smtpmail-default-smtp-server "smtp.gmail.com")
(smtpmail-smtp-user "bensonchu457")
(smtpmail-smtp-server "smtp.gmail.com"))
("work"
(mu4e-sent-folder "/work/Sent")
(mu4e-drafts-folder "/work/Drafts")
(mu4e-refile-folder "/work/Archive")
(user-mail-address "bchu3@uh.edu")
(smtpmail-default-smtp-server "smtp.account2.example.com")
(smtpmail-smtp-user "bchu3")
(smtpmail-smtp-server "smtp.account2.example.com"))))



;(defun my-mu4e-set-account ()
;  "Set the account for composing a message."
;  (let* ((account
;	  (if mu4e-compose-parent-message
;	      (let ((maildir (mu4e-message-field mu4e-compose-parent-message :maildir)))
;		(string-match "/\\(.*?\\)/" maildir)
;		(match-string 1 maildir))
;	    (completing-read (format "Compose with account: (%s) "
;				     (mapconcat #'(lambda (var) (car var))
;						my-mu4e-account-alist "/"))
;			     (mapcar #'(lambda (var) (car var)) my-mu4e-account-alist)
;			     nil t nil nil (caar my-mu4e-account-alist))))
;	 (account-vars (cdr (assoc account my-mu4e-account-alist))))
;    (if account-vars
;        (mapc #'(lambda (var)
;		  (set (car var) (cadr var)))
;	      account-vars)
;      (error "No email account found"))))

;	(add-hook 'mu4e~headers-jump-to-maildir 'my-mu4e-set-account)

Disabled

nnreddit

(use-package nnredit "~/.emacs.d/nnreddit/nnreddit.el")
(add-to-list 'gnus-secondary-select-methods '(nnreddit ""))

xwidget

(define-key xwidget-webkit-mode-map [mouse-4] 'xwidget-webkit-scroll-down)
(define-key xwidget-webkit-mode-map [mouse-5] 'xwidget-webkit-scroll-up)

Slime mode

(use-package slime)
(add-hook 'lisp-mode-hook (lambda () (slime-mode t)))
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
(setq inferior-lisp-program "/usr/bin/sbcl")
(load (expand-file-name "~/quicklisp/slime-helper.el"))

i3wm interaction

(use-package i3wm)
(defun insert-mode ()
  (interactive)
  (i3wm-command "mode insert"))
(global-set-key (kbd "M-\"") 'insert-mode)

Cyberpunk Theme

(load-theme 'cyberpunk t)
(use-package moe-theme)
(moe-dark)
(powerline-moe-theme)

Wanderlust

(autoload 'wl "wl" "Wanderlust" t)

linum

(use-package linum)
(linum-relative-global-mode)
(setq linum-relative-current-symbol "")

;(setq linum-format 
;  (lambda (line) 
;    (propertize (format (let ((w (length (number-to-string (count-lines (point-min) (point-max))))))
;                          (concat "%" (number-to-string w) "d ")) 
;		        line) 
;		'face 
;		'linum)))

;(setq linum-relative-format "%3s\u2502 ")

CTD Minor Mode

Keybinding

(use-package multi-term)
(define-minor-mode ctd-mode
"This is the mode for the CoderTillDeath"
:init-value t
:lighter " ctd"
:keymap (let ((map (make-sparse-keymap)))
(define-key map (kbd "M-e") 'launch-program)
(define-key map (kbd "C-x p") 'launch-program)
(define-key map (kbd "M-`") 'multi-term)
(define-key map (kbd "M-1") 'windresize)
map))
  (ctd-mode 1)

Precedence

(add-hook 'after-load-functions 'ctd-mode-priority)

(defun ctd-mode-priority (_file)
  "Try to ensure that my keybindings retain priority over other minor modes.

Called via the `after-load-functions' special hook."
  (unless (eq (caar minor-mode-map-alist) 'ctd-mode)
    (let ((mykeys (assq 'ctd-mode minor-mode-map-alist)))
      (assq-delete-all 'ctd-mode minor-mode-map-alist)
      (add-to-list 'minor-mode-map-alist mykeys))))

Screw delete

  (global-set-key (kbd "C-d") 'delete-backward-char)
  (global-set-key (kbd "M-d") 'backward-kill-word)

Custom Journal Attempt 1

(defvar yearly-theme "Insight")

  (defun insert-time-stamp ()
    (insert "** "
            (format-time-string "%A, %x")))

  (defun current-date-exists? () 
    (save-excursion
      (let ((match (re-search-forward (format-time-string "\\(* %A, %x\\)")
                                      nil t)))
        (match-beginning 1))))

  (defun add-date () 
    (search-forward "* Journal")
    (beginning-of-line)
    (org-narrow-to-subtree)
    (let ((point (current-date-exists?)))
      (if point
          (goto-char point)
        (goto-char (point-max))
        (insert-time-stamp)))
    (widen))

  (defun add-weekly-journal-entry () 
    (add-date))

  (defun org-capture-function ()
    (unless (file-exists-p "~/MEGA/org/entries/review/current.org")
      (create-weekly-review-file))
    (set-buffer (org-capture-target-buffer "~/MEGA/org/entries/review/current.org"))
    (let ((m (point-marker)))
      (set-buffer (marker-buffer m))
      (org-capture-put-target-region-and-position)
      (widen)
      (goto-char m)
      (set-marker m nil)
      (add-weekly-journal-entry)))

  (defun create-weekly-review-file ()
    (save-excursion
      (let ((entry-path "~/MEGA/org/entries/review/current.org"))
        (find-file-other-window entry-path)
        (insert (format "#+TITLE: Year of %s, week %s\n\n"
                        yearly-theme
                        (format-time-string "%V"))
                "* Log\n"
                "* Journal\n")
        (save-buffer)
        (kill-buffer))))

  (defun weekly-review ()
    (interactive)
    (let ((entry-path "~/MEGA/org/entries/review/current.org"))
      (find-file entry-path)
      (goto-char (point-max))
      (insert "\n* Review\n")))

  (defun wr/done ()
    (interactive)
    (save-buffer)
    (kill-buffer)
    (unless (file-directory-p (format-time-string "~/MEGA/org/entries/review/%Y"))
      (make-directory (format-time-string "~/MEGA/org/entries/review/%Y")))
    (rename-file "~/MEGA/org/entries/review/current.org" 
                 (format-time-string "~/MEGA/org/entries/review/%Y/Year of Insight, Week %V.org")
                 t)
    (create-weekly-review-file))

Custom Journal Attempt 2

  (defvar yearly-theme "Surpass")

  (defun completed-tags-search (start-date end-date)
    (let ((org-agenda-overriding-header "* Log")
          (tag-search (concat (format "TODO=\"DONE\"&CLOSED>=\"[%s]\"&CLOSED<=\"[%s]\""
                      start-date
                      end-date))))
      (org-tags-view nil tag-search)))

  (defun get-tasks-from (start-date end-date)
    (let (string)
      (save-window-excursion
        (completed-tags-search start-date end-date)
        (setq string (mapconcat 'identity
                                (mapcar (lambda (a)
                                          (concat "**" a))
                                        (butlast (cdr (split-string (buffer-string) "\n")) 1)) 
                                "\n"))
        (kill-buffer))
      string))

  (defun get-journal-entries-from (start-date end-date)
    (let ((string "")
      match)
      (save-window-excursion
    (switch-to-buffer (find-file "~/MEGA/org/entries/journal.gpg"))
    (goto-char (point-min))
    (while (setq match (re-search-forward "^\\*\\*\\* \\(2[0-9]\\{3\\}-[0-9]\\{2\\}-[0-9]\\{2\\}\\) \\w+$" nil t))
    (let ((date (match-string 1)))
      (when (and (org-time< start-date date)
             (or (not end-date) (org-time< date end-date)))
        (org-narrow-to-subtree)
        (org-shiftmetaleft)
        (setq string (concat string "\n" (buffer-string)))
        (org-shiftmetaright)
        (widen))))
    (not-modified)
    (kill-buffer))
      string))

  (defun generate-view-between (start-date end-date)
    (let ((start-date (or start-date
              (org-read-date)))
      (end-date (or end-date
            (org-read-date)))
      (org-agenda-skip-archived-trees nil))
      (get-buffer-create "review.org")
      (switch-to-buffer "review.org")
      (org-mode)
      (insert (format "#+Title of %s, Week %s\n\n"
              yearly-theme
              (format-time-string "%V")))
      (insert "* Log\n")
      (insert (get-tasks-from start-date end-date))
      (insert "\n* Journal"))
      (insert (get-journal-entries-from start-date end-date))
      (when (> (funcall outline-level) 1) (outline-up-heading 2))
      (org-cycle)
      (org-cycle)
      (goto-char (point-max)))

  (defun generate-view-from ()
    (interactive)
    (let ((date (org-read-date)))
      (generate-view-between date
                 (org-read-date nil nil ""))))

  (defun generate-weekly-view () 
    (interactive)
    (let ((start-date (org-read-date nil nil "-1w"))
      (end-date (org-read-date nil nil "")))
      (generate-view-between start-date end-date)))

  (defun weekly-review ()
    (interactive)
    (generate-weekly-view)
    (goto-char (point-max))
    (insert "\n* Review\n"))

  (defun offday-review ()
    (interactive)
    (generate-view-from)
    (goto-char (point-max))
    (insert "\n* Review\n"))

  (defun wr/done ()
    (interactive)
    (write-file (concat "~/MEGA/org/entries/review/"
            (format-time-string "%Y/")
            (format "Year of %s, Week "
                yearly-theme)
            (format-time-string "%V")
            ".org"))
    (kill-buffer))

  (defun view-reports ()
    (interactive)
    (dired (format-time-string "~/MEGA/org/entries/review/%Y/")))