mirror of
https://github.com/pestctrl/emacs-config.git
synced 2026-02-16 16:24:18 +00:00
150 KiB
150 KiB
Emacs Configuration
- Enable lexical binding
- Bugs
- Neo keyboard issues
- Lib
- Custom file
- EXWM
- e2wm
- desktop-environment
- Meta
- Naming Windows
- exwm-x stuff and naming windows
- Youtube split
- Disable simulation keys on an emacs window
- Custom keymap
- exwm-background
- toggle dedicated
- This is so that I can send fullscreen windows to the back
- Switch window
- Multimonitor support
- Keybindings
- Helper functions
- Workspace counsel
- Simulation keys
- Startup
- Shutdown
- Xephyr launches in tiling-mode
- Wallpaper
- Volume
- exwm-edit
- Floating windows don't need that many faces ^_^
- Emacs
- Look and feel
- Navigation
- org-mode in separate file
- Tools
- Programming
- Autocompletion
- irony
- Yasnippets
- Projectile and dumb-jump
- hs-minor-mode
- Ensime (scala)
- Magit
- SPACES
- Geiser
- Paredit
- Cider
- YAML
- show parens
- lsp-mode
- Rainbow delimiters
- elisp
- C#
- React js
- Golang
- Elpy
- EIN
- Web-mode
- Processing
- Treemacs
- Hy-mode
- glsl-mode
- indent-guide
- rust cargo
- maven support
- multiple-cursors
- Setup-dev-environment
- skeletor project templates
- Spaces
- Erlang
- New
- Youtube-dl
- pdf-tools use isearch
- Time to game!
- Winner Mode
- Skewer Mode (web development)
- ediff
- Scroll interval
- AUR PKGBUILD
- Eyebrowse
- Writing mode
- re-builder specify read method
- scrollkeeper
- set-default-directory
- World time include Taiwan
- arch-linux
- Compile java run test
- ansi-term colors
- expand-region
- wtf
- auto-save files in same directory
- csv-mode
- kdeconnect
- Purpose-mode
- erc
- posting sourc code
- eosd
- helpful
- ediff snippet
- leetcode
- freezing time
- Ace-window
- function to set tabwith
- bookmark+
- Custom bookmarks location
- Subtitles editing
- docker
- compilation buffer in same window
- compilation scroll
- google-it with qutebrowser
- 256-color
- read only buffers in view-mode
- hyperbole
- Go to work
- magit-todos
- wgrep
- Use cider's display result
- centaur tabs
- solaire-mode
- Hydra's don't show your faces
- tramp things
- CASA Schedule
- Credit Card Statement Macro
- Vivaldi
- Magit Push All
- New stuff, lost to git stupidity
- Profiler Keymap
- Slime mode
- new etzy
- Google Translate
- Broken
- Disabled
Enable lexical binding
;;; -*- lexical-binding: t -*-
Bugs
Need this to fix broken config
(use-package magit-popup)
Neo keyboard issues
(global-set-key (kbd "M-Ä") 'eval-expression)
(defun reset-keyboard ()
(interactive)
(shell-command "setxkbmap de neo_dvorak"))
Lib
memoize
(use-package memoize)
hydra
(use-package hydra)
cl
(require 'cl)
Custom file
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file 'noerror)
(setq backup-directory-alist `(("." . ,(concat user-emacs-directory "backups"))))
EXWM
e2wm
(use-package e2wm
:bind (("M-+" . e2wm:start-management)))
desktop-environment
(use-package desktop-environment
:init
(desktop-environment-mode))
Meta
(use-package exwm)
(require 'exwm-config)
(exwm-config-default)
(fringe-mode '(10 . 0))
Naming Windows
(defvar my/window-name nil)
(defun exwmx-name-buffer ()
(interactive)
(let* ((xprograms (mapcar (lambda (a) (plist-get a :instance)) (exwmx-appconfig--get-all-appconfigs)))
(name (completing-read "Name: " xprograms)))
(if (and (get-buffer name)
(not (equal (get-buffer name) (current-buffer)))
(y-or-n-p (format "Already a buffer named \"%s\". Would you like to swap?" name)))
(let ((oname (completing-read "Name of other buffer: " xprograms)))
(exwm-workspace-rename-buffer "This is a stupid name that no one would ever choose for a buffer, hopefully")
(save-window-excursion
(switch-to-buffer (get-buffer name))
(exwm-workspace-rename-buffer oname)
(setq-local exwm-instance-name oname))
(exwm-workspace-rename-buffer name)
(setq-local exwm-instance-name name))
(exwm-workspace-rename-buffer name)
(setq-local exwm-instance-name name))))
(defun exwm-rename-buffer ()
(interactive)
(when my/window-name
(exwm-workspace-rename-buffer my/window-name)
(setq-local exwm-instance-name my/window-name)
(setq my/window-name nil)))
;; Add these hooks in a suitable place (e.g., as done in exwm-config-default)
(add-hook 'exwm-manage-finish-hook 'exwm-rename-buffer)
(defun launch-program-with-name (cmd name)
(interactive)
(when name (setq my/window-name name))
(start-process-shell-command cmd nil cmd))
exwm-x stuff and naming windows
(use-package exwm-x)
(require 'exwmx-quickrun)
(defun exwmx-quickrun (command &optional search-alias ruler)
(exwmx--switch-window)
(let* ((ruler-plist-p (and ruler (exwmx--plist-p ruler)))
(keys
;; Deal with ruler which is like (:class :instance :title)
(if (and ruler (listp ruler) (not ruler-plist-p))
(exwmx--clean-keylist ruler)
'(:class :instance)))
(appconfigs (exwmx-appconfig--get-all-appconfigs))
(cmd (if search-alias
(or (plist-get (exwmx-appconfig--search
`((:alias ,command)))
:command)
(when appconfigs
(let ((appconfig (exwmx-appconfig--select-appconfig)))
(plist-put appconfig :alias command)
(exwmx-appconfig--add-appconfig appconfig)
(plist-get appconfig :command))))
command))
(buffer (or (if search-alias
(exwmx-quickrun--find-buffer
(if ruler-plist-p
ruler
(exwmx-appconfig--get-subset
(exwmx-appconfig--search
`((:alias ,command)))
keys)))
(exwmx-quickrun--find-buffer
(if ruler-plist-p
ruler
(exwmx-appconfig--get-subset
(exwmx-appconfig--search
`((:command ,command)))
keys)))))))
(if (and search-alias (not cmd))
(message "EXWM-X: please run `exwmx-appconfig' to add appconfig.")
(message "EXWM-X Quick Run: %s" cmd))
;; If current application window is a floating-window, minumize it.
(when (and (eq major-mode 'exwm-mode)
exwm--floating-frame)
(exwm-floating-hide))
(if buffer
(exwm-workspace-switch-to-buffer buffer)
(when cmd
(launch-program-with-name cmd (plist-get ruler :instance))))))
(defun exwmx-quickrun--find-buffer (ruler)
"Find a exwm buffer which match `ruler', ruler is
a plist with three keys: :class, :instance and :title."
(let ((current (current-buffer))
(buffers (buffer-list))
(result '()))
(while buffers
(let ((buffer (pop buffers))
(class (plist-get ruler :class))
(instance (plist-get ruler :instance))
(title (plist-get ruler :title)))
(with-current-buffer buffer
(when (and (or class instance title)
(exwmx--string-match-p (or class ".*") exwm-class-name)
(exwmx--string-match-p (or (concat "^" instance "$") ".*") exwm-instance-name)
(exwmx--string-match-p (or title ".*") exwm-title))
(push buffer result)))))
(setq result (reverse result))
;; If two more buffers are found, switch between these buffer.
(if (and (cadr result)
(eq (car result) current))
(cadr result)
(car result))))
(defmacro quickrun-lambda (cmd instance)
(if (null instance)
`(lambda ()
(interactive)
(exwmx-quickrun ,cmd))
`(lambda ()
(interactive)
(exwmx-quickrun ,cmd nil '(:class ".*" :instance ,instance)))))
(use-package dmenu)
(make-thread
#'dmenu--cache-executable-files)
(defun read-program ()
(funcall #'ido-completing-read "$ "
(append dmenu--history-list
(cl-remove-if (lambda (x)
(member x dmenu--history-list))
dmenu--cache-executable-files))))
(defun launch-program (command &optional process-name)
(interactive (list (read-program)))
(setq dmenu--history-list (cons command (remove command dmenu--history-list)))
(when (> (length dmenu--history-list)
dmenu-history-size)
(setcdr (nthcdr (- dmenu-history-size 1)
dmenu--history-list)
nil))
(let ((name (or process-name command)))
(start-process-shell-command name nil command)))
(defun exwmx-launch-program (command &optional process-name)
(interactive (list (read-program)))
(setq dmenu--history-list (cons command (remove command dmenu--history-list)))
(when (> (length dmenu--history-list)
dmenu-history-size)
(setcdr (nthcdr (- dmenu-history-size 1)
dmenu--history-list)
nil))
(exwmx-quickrun command))
;; (exwmx-quickrun "firefox" nil '(:class ".*" :instance "School"))
;; (exwmx-quickrun--find-buffer '(:class ".*" :instance "Hello"))
Youtube split
(defun youtube-split (arg)
(interactive "P")
(let ((buf (get-buffer "youtube"))
(back (current-buffer)))
(delete-other-windows)
(if buf
(switch-to-buffer buf)
(when arg
(launch-program-with-name "firefox" "youtube")))
(side-window-op 'left 472 buf)
(switch-to-buffer back)))
(defun big-youtube-split (arg)
(interactive "P")
(delete-other-windows)
(let ((buf (get-buffer "youtube")))
(if buf
(switch-to-buffer buf)
(when arg
(launch-program-with-name "firefox" "youtube")))
(side-window-op 'left 630 buf)))
(defun side-window-op (side &optional size buffer)
(let ((prev-win (selected-window))
(win (display-buffer-in-side-window
(or buffer (current-buffer))
`((side . ,side)))))
(select-window win)
(set-window-dedicated-p win t)
(set-window-parameter win 'no-delete-other-windows t)
(when size
(window-resize win (- size (window-pixel-width)) t nil t))
(select-window prev-win)))
(defun side-left-window ()
(interactive)
(side-window-op 'left))
(defun side-right-window ()
(interactive)
(side-window-op 'right))
(defun side-bottom-window ()
(interactive)
(side-window-op 'bottom))
(setq window-sides-vertical t)
Disable simulation keys on an emacs window
(add-hook 'exwm-manage-finish-hook
(lambda ()
(when (and exwm-class-name (string= exwm-class-name "Emacs"))
(exwm-input-set-local-simulation-keys nil))))
Custom keymap
(use-package vterm)
(define-key vterm-mode-map (kbd "C-t") nil)
(defmacro exec (body)
`(lambda ()
(interactive)
,body))
(defun toggle-notifications ()
(interactive)
(shell-command "kill -s USR1 $(pidof deadd-notification-center)"))
(define-prefix-command '*root-map*)
;;(global-set-key (kbd "C-t") '*root-map*)
(add-to-list 'exwm-input-prefix-keys ?\C-t)
(defun simulate-C-t (arg)
(interactive "P")
(if (eq major-mode 'exwm-mode)
(exwm-input--fake-key ?\C-t)
(transpose-chars arg)))
(use-package zeal-at-point)
(define-key *root-map* (kbd "C-d") (quickrun-lambda "zeal" "zeal"))
(define-key *root-map* (kbd "d") #'zeal-at-point)
(define-key *root-map* (kbd "C-b") (lambda () (interactive) (switch-to-buffer (other-buffer (current-buffer) 1))))
(define-key *root-map* (kbd "C-t") 'simulate-C-t)
(define-key *root-map* (kbd "c") 'multi-term)
(define-key *root-map* (kbd "C-p") 'exwmx-launch-program)
(define-key *root-map* (kbd "e") (quickrun-lambda "emacs" "emacs"))
(define-key *root-map* (kbd "s") (quickrun-lambda "steam" nil))
(define-key *root-map* (kbd "q") (quickrun-lambda "qutebrowser" nil))
(define-key *root-map* (kbd "V") (quickrun-lambda "VBoxManage startvm \"Windows 7\"" "VirtualBox Machine"))
(define-key *root-map* (kbd "r") 'exwmx-name-buffer)
(define-key *root-map* (kbd ")") (lambda () (interactive) (leaving-computer) (shell-command "sleep 2s ; xset dpms force off")))
(define-key *root-map* (kbd "C-n") 'switch-window)
(define-key *root-map* (kbd "i") 'org-mru-clock-in)
(define-key *root-map* (kbd "C-i") 'leaving-computer)
(define-key *root-map* (kbd "C") 'org-resolve-clocks)
(define-key *root-map* (kbd "j") 'org-clock-goto)
(define-key *root-map* (kbd "o") 'switch-window)
(define-key *root-map* (kbd "n") 'toggle-notifications)
(define-key *root-map* (kbd "RET") 'dired-jump)
(define-prefix-command '*window-map*)
(define-key *root-map* (kbd "w") '*window-map*)
(define-key *window-map* (kbd "y") 'youtube-split)
(define-key *window-map* (kbd "Y") 'big-youtube-split)
(define-key *window-map* (kbd "j") 'side-bottom-window)
(define-key *window-map* (kbd "h") 'side-left-window)
(define-key *window-map* (kbd "l") 'side-right-window)
(define-key *window-map* (kbd "d") 'window-toggle-side-windows)
(define-prefix-command '*firefox-map*)
(define-key *firefox-map* (kbd "c") (quickrun-lambda "google-chrome-stable" "chrome"))
(define-key *firefox-map* (kbd "f") (quickrun-lambda "firefox" "firefox"))
(define-key *firefox-map* (kbd "1") (quickrun-lambda "firefox" "firefox1"))
(define-key *firefox-map* (kbd "2") (quickrun-lambda "firefox" "firefox2"))
(define-key *firefox-map* (kbd "3") (quickrun-lambda "firefox" "firefox3"))
(define-key *firefox-map* (kbd "4") (quickrun-lambda "firefox" "firefox4"))
(define-key *firefox-map* (kbd "d") (quickrun-lambda "firefox" "development"))
(define-key *firefox-map* (kbd "s") (quickrun-lambda "firefox" "school"))
(define-key *firefox-map* (kbd "w") (quickrun-lambda "firefox" "work"))
(define-key *firefox-map* (kbd "y") (quickrun-lambda "firefox" "youtube"))
(define-key *root-map* (kbd "f") '*firefox-map*)
(define-prefix-command '*music-map*)
(define-key *music-map* (kbd "SPC") (exec (shell-command "clementine -t")))
(define-key *music-map* (kbd "n") (exec (shell-command "clementine --next")))
(define-key *music-map* (kbd "p") (exec (shell-command "clementine --previous")))
(defhydra clementine-volume-hydra (*music-map* "v")
"Clementine volume up and down"
("j" (lambda () (interactive) (shell-command "clementine --volume-down")))
("J" (lambda () (interactive) (shell-command "clementine --volume-decrease-by 25")))
("k" (lambda () (interactive) (shell-command "clementine --volume-up")))
("K" (lambda () (interactive) (shell-command "clementine --volume-increase-by 25")))
("q" nil))
(define-key *root-map* (kbd "m") '*music-map*)
exwm-background
(add-to-list 'load-path "~/.emacs.d/custom/exwm-background/")
(require 'exwm-background)
(define-key *window-map* (kbd "t") 'exwm-background/window-transparency-hydra/body)
(setq window-system-default-frame-alist `((x . ((alpha . (,exwm-background/current-transparency . 50))))))
(global-set-key (kbd "s-v") #'exwm-background/toggle-viewing-background)
(global-set-key (kbd "s-b") #'exwm-background/exwm-background-window)
(define-key desktop-environment-mode-map (kbd "<S-XF86MonBrightnessDown>") #'exwm-background/decrease-transparency)
(define-key desktop-environment-mode-map (kbd "<S-XF86MonBrightnessUp>") #'exwm-background/increase-transparency)
(define-key *window-map* (kbd "b") #'exwm-background/exwm-background-window)
(define-key *root-map* (kbd "k") #'exwm-background/exwm-send-key-to-background)
(define-key *root-map* (kbd "C-k") #'exwm-background/exwm-send-key-to-background-loop)
toggle dedicated
(defun my/toggle-dedicated-window ()
(interactive)
(let ((win (selected-window)))
(set-window-dedicated-p win (not (window-dedicated-p win)))))
This is so that I can send fullscreen windows to the back
(cl-defun my/exwm-layout-set-fullscreen (&optional id)
"Make window ID fullscreen."
(interactive)
(exwm--log "id=#x%x" (or id 0))
(unless (and (or id (derived-mode-p 'exwm-mode))
(not (exwm-layout--fullscreen-p)))
(cl-return-from exwm-layout-set-fullscreen))
(with-current-buffer (if id (exwm--id->buffer id) (window-buffer))
;; Expand the X window to fill the whole screen.
(with-slots (x y width height) (exwm-workspace--get-geometry exwm--frame)
(exwm--set-geometry exwm--id x y width height))
;; Raise the X window.
(xcb:+request exwm--connection
(make-instance 'xcb:ConfigureWindow
:window exwm--id
:value-mask (logior xcb:ConfigWindow:BorderWidth
xcb:ConfigWindow:StackMode)
:border-width 0
:stack-mode xcb:StackMode:Above))
(xcb:+request exwm--connection
(make-instance 'xcb:ewmh:set-_NET_WM_STATE
:window exwm--id
:data (vector xcb:Atom:_NET_WM_STATE_FULLSCREEN)))
(xcb:flush exwm--connection)
;;(set-window-dedicated-p (get-buffer-window) t)
(cl-pushnew xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)
(exwm-input--release-keyboard exwm--id)))
(advice-add #'exwm-layout-set-fullscreen :override #'my/exwm-layout-set-fullscreen)
Switch window
(setq switch-window-input-style 'minibuffer)
Multimonitor support
(require 'exwm-randr)
(exwm-randr-enable)
Keybindings
(use-package transpose-frame)
(defconst my/keymap-key (kbd "C-t"))
(setq exwm-input-global-keys
`(([?\s-r] . exwm-reset)
;; ([?\s-w] . exwm-workspace-switch)
([?\s-l] . lock-screen)
(,(kbd "s-b") . ivy-switch-buffer)
(,(kbd "s-c") . org-capture)
(,(kbd "s-n") . switch-window)
(,(kbd "s-k") . kill-this-buffer)
(,(kbd "s-z") . resize-window)
(,(kbd "s-s") . youtube-split)
(,(kbd "s-n") . switch-to-next-buffer)
(,(kbd "s-p") . switch-to-prev-buffer)
(,(kbd "s-a") . my/toggle-keyboard)
(,my/keymap-key . *root-map*)))
(global-set-key (kbd "s-h") 'windmove-left)
(global-set-key (kbd "s-l") 'windmove-right)
(define-key desktop-environment-mode-map (kbd "s-l") nil)
;; Disable C-t for all others
(with-eval-after-load "ibuf-ext"
(define-key ibuffer-mode-map my/keymap-key nil))
(define-key dired-mode-map my/keymap-key nil)
(defun dvorak? ()
(string-match-p "de(neo_dvorak)"
(shell-command-to-string "setxkbmap -v | grep symbols")))
(defun set-keyboard (layout)
(shell-command (format "setxkbmap %s" layout)))
(defun my/toggle-keyboard ()
(interactive)
(if (dvorak?)
(set-keyboard "us")
(set-keyboard "de neo_dvorak")))
(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)
(defun prompt-workspace (&optional prompt)
"Prompt for a workspace, returning the workspace frame."
(exwm-workspace--update-switch-history)
(let* ((current-idx (exwm-workspace--position exwm-workspace--current))
(history-add-new-input nil) ;prevent modifying history
(history-idx (read-from-minibuffer
(or prompt "Workspace: ")
(elt exwm-workspace--switch-history current-idx)
exwm-workspace--switch-map nil
`(exwm-workspace--switch-history . ,current-idx)))
(workspace-idx (mod (1- (cl-position history-idx exwm-workspace--switch-history
:test #'equal))
10)))
(elt exwm-workspace--list workspace-idx)))
(advice-add 'exwm-workspace--prompt-for-workspace
:override
#'prompt-workspace)
Helper functions
(defvar wallpaper-path "/home/benson/.emacs.d/res/digital_space_universe_4k_8k-wide.jpg")
(defvar live-wallpaper-path "/home/benson/MEGA/pictures/wallpapers/videos/bg.mp4")
(setq i3-string "Xephyr -br -ac -noreset -resizeable -screen 1920x1080 :8 & sleep 1s; DISPLAY=:8 i3")
(setq xfce4-string "Xephyr -br -ac -noreset -resizeable -screen 1920x1080 :8 & sleep 1s; DISPLAY=:8 xfce4-session")
(setq kde-string "Xephyr -br -ac -noreset -resizeable -screen 1920x1080 :8 & sleep 1s; DISPLAY=:8 startkde")
(setq kde+exwm-string "Xephyr -br -ac -noreset -resizeable -screen 1920x1080 :8 & sleep 1s; DISPLAY=:8 KDEWM=/usr/bin/emacs startkde")
(defvar exwm-startup-programs
'("megasync"
"deadd-notification-center"
"/usr/lib/kdeconnectd"
("compton -f -i .7 -b")
;; ("compton -f -i .7 -b --backend glx --blur-background --blur-method kawase --blur-strength 2")
("/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1")
("/usr/lib/notification-daemon-1.0/notification-daemon")
("nm-applet")
))
(defvar hard-drive-space "")
(defun launch-i3 ()
(interactive)
(launch-program i3-string))
(defun launch-xfce ()
(interactive)
(launch-program xfce4-string))
(defun launch-kde ()
(interactive)
(launch-program kde-string))
(defun launch-kde+emacs ()
(interactive)
(launch-program kde-string))
(defun lock-screen ()
(interactive)
(shell-command "~/Github/my-projects/i3lock-fancy/i3lock-fancy & disown"))
(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 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)))
(propertize (concat " "
(substring space-left
0
(1- (length space-left))))
'face 'sml/time))))
(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)))
Workspace counsel
;;; Workspace naming
(setq exwm-workspace-number 2)
(defvar my/workspace-list '((scratch0 . 0)
(scratch1 . 1))
"My custom workspace list")
(defun delete-frame-cleanup-workspace-monitor (&rest args)
(unless exwm--floating-frame
(let ((wnumber exwm-workspace-current-index))
(setq my/workspace-list
(remove-if (lambda (cell) (= wnumber (cdr cell)))
my/workspace-list))
(assq-delete-all wnumber my/monitor-list)
(unless (= (1+ wnumber) (exwm-workspace--count))
(setq my/workspace-list
(mapcar (lambda (cell)
(if (< (cdr cell) wnumber)
cell
(cons (car cell) (1- (cdr cell)))))
my/workspace-list))
(setq my/monitor-list
(mapcar (lambda (cell)
(if (< (car cell) wnumber)
cell
(cons (1- (car cell)) (cdr cell))))
my/monitor-list))))))
(defun my/get-current-workspace ()
(car (remove-if-not (lambda (cell)
(= (cdr cell)
exwm-workspace-current-index))
my/workspace-list)))
(defun workspace-switch-record-last (&rest args)
(setq my/last-workspace (car (my/get-current-workspace))))
(defun my/switch-workspace (name)
(interactive (list (completing-read "Workspace name? "
(mapcar #'car my/workspace-list))))
(let* ((key (intern name))
(workspace-number (cdr (assoc key my/workspace-list))))
(if workspace-number
(exwm-workspace-switch workspace-number)
(my/make-new-workspace name))))
(defun my/get-empty-workspace ()
(exwm-workspace--count))
(defun my/make-new-workspace (name &optional no-switch)
(let ((workspace-number (my/get-empty-workspace)))
(add-to-list 'my/workspace-list
`(,(intern name) . ,workspace-number))
(add-to-list 'my/monitor-list
`(,workspace-number . ,(car (my/get-screens))))
(my/update-workspace-monitors)
(exwm-workspace-switch-create workspace-number)
(when no-switch
(my/switch-to-last-workspace))
workspace-number))
(defun my/rename-workspace (name)
(interactive (list (intern (read-from-minibuffer "What name? "))))
(cl-flet ((current-workspace-p (cell) (= (cdr cell) exwm-workspace-current-index)))
(let* ((results (remove-if-not #'current-workspace-p
my/workspace-list))
(res-count (length results)))
(when (not (= 0 res-count))
(setq my/workspace-list
(remove-if #'current-workspace-p
my/workspace-list)))
(add-to-list 'my/workspace-list
`(,name . ,exwm-workspace-current-index)))))
(defun my/move-window-to-workspace ()
(interactive)
(let* ((key (completing-read "Move to which workspace? "
(mapcar #'car my/workspace-list)))
(workspace-number (or (cdr (assoc (intern key) my/workspace-list))
(my/make-new-workspace key t))))
(exwm-workspace-move-window workspace-number)))
(defvar my/last-workspace nil)
(defun my/switch-to-last-workspace ()
(interactive)
(when-let (cell (assoc my/last-workspace my/workspace-list))
(exwm-workspace-switch (cdr cell))
(message (format "Switched to workspace: \"%S\"" (car cell)))))
(defun my/current-workspace ()
(interactive)
(let* ((results (remove-if-not (lambda (cell) (= (cdr cell) exwm-workspace-current-index)) my/workspace-list))
(res-count (length results)))
(if (= res-count 0)
(message "No name for current workspace")
(message (format "Current Workspace: #%d \"%s\" on %s"
exwm-workspace-current-index
(car (car results)))))))
(defun my/workspace-report ()
(interactive)
(loop for i in my/workspace-list
do (message "Workspace #%d: \"%s\" on \"%s\""
(cdr i) (car i)
(cdr (assoc (cdr i) my/monitor-list)))))
;; Handle deleting if frame was destroyed
(define-key *root-map* (kbd "b") #'my/switch-workspace)
(define-key *root-map* (kbd "R") #'my/rename-workspace)
(define-key *root-map* (kbd "M") #'my/move-window-to-workspace)
(define-key *root-map* (kbd "P") #'my/current-workspace)
(add-to-list 'exwm-input-global-keys
`(,(kbd "<s-tab>") . my/switch-to-last-workspace))
;; (define-key *window-map* (kbd "s") #'my/switch-workspace)
;;; Workspace positioning
(defvar my/monitor-list '((0 . "eDP1")
(1 . "eDP1")))
(defun my/setup-workspace-monitors ()
(let* ((monitors (my/get-screens))
(primary (car monitors))
(secondary (or (cadr monitors) primary)))
(setq my/monitor-list
`((0 . ,primary)
(1 . ,secondary)))
(my/update-workspace-monitors t)))
(defun flatten-list (list)
(let ((f (car list)))
(cond ((null f) '())
((listp f)
(append (flatten-list f)
(flatten-list (cdr list))))
(t
(cons f (flatten-list (cdr list)))))))
(defun my/update-workspace-monitors (&optional no-refresh)
(->> (loop for j in (cl-sort (copy-seq my/workspace-list) #'< :key 'cdr)
collect (list (cdr j) (cdr (assoc (cdr j) my/monitor-list))))
(flatten-list)
(setq exwm-randr-workspace-monitor-plist))
(unless no-refresh
(exwm-randr-refresh)))
(defun my/move-to-monitor (monitor)
(interactive (list (let ((monitors (my/get-screens)))
(if (= (length monitors) 2)
(if (string= (car monitors)
(cdr (assoc exwm-workspace-current-index my/monitor-list)))
(cadr monitors)
(car monitors))
(completing-read "Which Monitor? "
monitors)))))
(setf (alist-get exwm-workspace-current-index my/monitor-list)
monitor)
(my/update-workspace-monitors))
;; Switch monitor
(defvar monitor-active-list '())
(defun workspace-switch-record-monitor (&rest args)
(setf (alist-get (intern (frame-parameter exwm-workspace--current 'exwm-randr-monitor))
monitor-active-list)
exwm-workspace--current))
(defun my/switch-monitor ()
(interactive)
(let ((monitors (my/get-screens))
(current (frame-parameter exwm-workspace--current 'exwm-randr-monitor)))
(setf (alist-get (intern current) monitor-active-list)
exwm-workspace--current)
(when (= 2 (length monitors))
(let ((other-monitor (if (string= current (car monitors))
(cadr monitors)
(car monitors))))
(when-let ((workspace (alist-get (intern other-monitor) monitor-active-list)))
(exwm-workspace-switch workspace))))))
(define-key *root-map* (kbd "%") #'my/move-to-monitor)
(add-to-list 'exwm-input-global-keys
`(,(kbd "<s-iso-lefttab>") . my/switch-monitor))
(defun my/init-workspace-module ()
(my/setup-workspace-monitors)
(advice-add #'delete-frame
:before
#'delete-frame-cleanup-workspace-monitor)
(advice-add #'exwm-workspace-switch
:before
#'workspace-switch-record-last))
(add-hook 'exwm-init-hook 'my/init-workspace-module)
(defun my/flip-screens ()
(interactive)
(let* ((screens (my/get-screens))
(primary (car screens))
(secondary (cadr screens)))
(setq my/monitor-list
(mapcar (lambda (a)
(cons (car a)
(if (string= (cdr a)
primary)
secondary
primary)))
my/monitor-list)))
(my/update-workspace-monitors))
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)
))
Startup
Emacs server, startup programs, wallpaper
(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)
(defvar my/monitor-primary "eDP1")
(defvar my/monitor-secondary nil)
(defun my/get-screens ()
(-> "xrandr --listmonitors | grep -v Monitors | cut -d ' ' -f 6"
(shell-command-to-string)
(split-string "\n")
(reverse)
(cdr)
(reverse)
(cl-sort (lambda (a b)
(cond ((string-match-p "^eDP" a) a)
((string-match-p "^eDP" b) b)
(t a))))))
(defun my/setup-screens ()
(interactive)
(let* ((monitors (my/get-screens))
(primary (car monitors))
(secondary (or (cadr monitors) "")))
(setq exwm-randr-workspace-monitor-plist `(0 ,primary 1 ,primary 2 ,secondary 3 ,secondary))
(setq my/monitor-primary primary
my/monitor-secondary secondary)
(when (and (> (length secondary) 0)
(y-or-n-p (format "Monitor %s detected. Setup? " secondary)))
(let* ((response (completing-read (format "Resolution for %s? " secondary) '("2560x1440" "1920x1080" "3840x2160") nil t "^"))
(length (string-to-number (substring response 0 4)))
(height (string-to-number (substring response 5 9))))
(shell-command (format "xrandr --output %s --mode %s --above %s" secondary response primary))
(let ((pos (completing-read "Position? " '("left-of" "above") nil t "^")))
(shell-command (format "xrandr --output %s --%s %s" secondary pos primary))))))
(setup-wallpaper))
(defun my/disconnect-screen ()
(interactive)
(shell-command (format "xrandr --output %s --off" my/monitor-secondary))
(setq exwm-randr-workspace-monitor-plist nil)
(setq my/monitor-secondary nil)
(exwm-randr-refresh)
(setup-wallpaper))
(add-hook 'exwm-init-hook 'my/setup-screens)
(defvar my/in-presentation-mode? nil)
(defun my/enter-presentation-mode ()
(let ((primary (shell-command-to-string "xrandr --query | grep ' connected' | grep eDP | cut -d ' ' -f 1 | tr -d '\n'"))
(secondary (shell-command-to-string "xrandr --query | grep ' connected' | grep -v eDP | cut -d ' ' -f 1 | tr -d '\n'")))
(shell-command
(format "xrandr --output %s --mode 1920x1080 --same-as %s"
secondary
primary))
(setq exwm-randr-workspace-monitor-plist nil)
(exwm-randr-refresh)))
(defun my/toggle-presentation-mode ()
(interactive)
(if my/in-presentation-mode?
(my/setup-screens)
(my/enter-presentation-mode))
(setq my/in-presentation-mode? (not my/in-presentation-mode?)))
System tray, display time, display battery, display hard-drive-space
(require 'exwm-systemtray)
(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)))))
;; 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)))
Xephyr launches in tiling-mode
(setq exwm-manage-configurations `(((equal exwm-class-name "Xephyr")
floating nil
char-mode t
fullscreen t)
((equal exwm-class-name "plasmashell")
floating t)))
Wallpaper
(setq wallpaper-path "/home/benson/.emacs.d/res/digital_space_universe_4k_8k-wide.jpg")
Volume
(use-package volume)
(define-key *root-map* (kbd "v") 'volume)
exwm-edit
(use-package exwm-edit)
Floating windows don't need that many faces ^_^
(defun my/frame-dont-copy-faces (frame &optional parameters)
"Initialize the frame-local faces of FRAME.
Calculate the face definitions using the face specs, custom theme
settings, X resources, and `face-new-frame-defaults'.
Finally, apply any relevant face attributes found amongst the
frame parameters in PARAMETERS."
;; The `reverse' is so that `default' goes first.
;; (dolist (face (nreverse (face-list)))
;; (condition-case ()
;; (progn
;; ;; Initialize faces from face spec and custom theme.
;; (face-spec-recalc face frame)
;; ;; Apply attributes specified by face-new-frame-defaults
;; (internal-merge-in-global-face face frame))
;; ;; Don't let invalid specs prevent frame creation.
;; (error nil)))
;; Apply attributes specified by frame parameters.
(let ((face-params '((foreground-color default :foreground)
(background-color default :background)
(font default :font)
(border-color border :background)
(cursor-color cursor :background)
(scroll-bar-foreground scroll-bar :foreground)
(scroll-bar-background scroll-bar :background)
(mouse-color mouse :background))))
(dolist (param face-params)
(let* ((param-name (nth 0 param))
(value (cdr (assq param-name parameters))))
(if value
(set-face-attribute (nth 1 param) frame
(nth 2 param) value))))))
(defun my/exwm-floating--advise-make-frame (orig id)
(advice-add 'face-set-after-frame-default
:override
'my/frame-dont-copy-faces)
(funcall orig id)
(advice-remove 'face-set-after-frame-default
'my/frame-dont-copy-faces))
(advice-add #'exwm-floating--set-floating
:around
#'my/exwm-floating--advise-make-frame)
Emacs
Reload Config
(defun reload-config () (interactive) (load-file "~/.emacs.d/init.el"))
Select Help Window
(setq help-window-select t)
Multi-term
(use-package multi-term)
(define-key term-mode-map (kbd "M-'") 'scroll-down)
(unbind-key (kbd "C-t") term-mode-map)
(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))
(add-to-list 'term-bind-key-alist '("M-'" . scroll-down))
(add-to-list 'term-bind-key-alist '("C-t" . *root-map*))))
resize-window
(use-package resize-window)
(global-set-key (kbd "M-1") 'resize-window)
which-key
(use-package which-key)
(setq which-key-idle-delay 3)
(which-key-mode)
beacon
(use-package beacon)
(beacon-mode 1)
(setq beacon-blink-delay 0.1)
(setq beacon-color "#006400")
Dashboard
(use-package dashboard)
;(dashboard-setup-startup-hook)
undo-tree
(use-package undo-tree)
advice for shell-command
(defun my/shell-command-advice (&rest args)
(switch-to-buffer "*Shell Command Output*"))
;;(advice-add #'shell-command :after #'my/shell-command-advice)
eval and replace
(defun my/eval-and-replace ()
"Replace the preceding sexp with its value."
(interactive)
(backward-kill-sexp)
(condition-case nil
(prin1 (eval (read (current-kill 0)))
(current-buffer))
(error (message "Invalid expression")
(insert (current-kill 0)))))
(global-set-key (kbd "C-c C-e") 'my/eval-and-replace)
New Scratch buffer
(defun scratch-buffer ()
(interactive)
(let ((count 0))
(while (get-buffer (format "*scratch%d*" count))
(incf count))
(switch-to-buffer (get-buffer-create (format "*scratch%d*" count)))
(lisp-interaction-mode)
(insert (substitute-command-keys initial-scratch-message))))
uniq emacs
(defun case-fold-string= (a b)
(eq t (compare-strings a nil nil b nil nil t)))
(defun case-fold-string-hash (a)
(sxhash (upcase a)))
(define-hash-table-test 'case-fold
'case-fold-string= 'case-fold-string-hash)
(defun uniq (beg end)
"Print counts of strings in region."
(interactive "r")
(let ((h (make-hash-table :test 'case-fold))
(lst (split-string (buffer-substring-no-properties beg end) "\n"
'omit-nulls " "))
(output-func (if current-prefix-arg 'insert 'princ)))
(dolist (str lst)
(puthash str (1+ (gethash str h 0)) h))
(maphash (lambda (key val)
(apply output-func (list (format "%d: %s\n" val key))))
h)))
Look and feel
Theme
(use-package color-theme-modern)
(load-theme 'calm-forest t)
mode-line
Smart Mode Line
;; (use-package smart-mode-line-powerline-theme)
;; (use-package smart-mode-line)
;; (setq sml/theme 'powerline)
;; (add-to-list
;; 'after-make-frame-functions
;; (lambda (&optional x)
;; (require 'smart-mode-line-powerline-theme)
;; (require 'smart-mode-line)
;; (setq sml/theme 'powerline)
;; (sml/setup)))
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 powerline-default-separator 'arrow)
(load-theme 'airline-powerlineish)
(my-airline-theme)
(setq battery-mode-line-format "[%b%p%%%%]")
Ocodo
(use-package ocodo-svg-modelines)
Font
;;(set-face-attribute 'default t :font "Dotsies Training Wheels-20")
;;(add-to-list 'default-frame-alist '(font . "Dotsies Training Wheels-20"))
;; (set-default-font "LinuxLibertine")
;; (set-default-font "Hack 10")
;; (set-default-font "UbuntuMono 11")
;; (set-default-font "OfficeCodePro 11")
(if (eq system-type 'windows-nt)
(set-frame-font "Roboto Mono 10")
(set-frame-font "RobotoMono 11")
(let ((font
(format "%s"
"RobotoMono-11"
;; "Tamzen"
;; "SourceCodePro"
;; "Gohu Gohufont"
)))
(add-to-list 'default-frame-alist `(font . ,font))))
;; (set-frame-font "Menlo")
(defun reading-buffer ()
(interactive)
(setq buffer-face-mode-face '(:family "LinuxLibertine" :height 200))
(buffer-face-mode))
Splash image
(setq fancy-splash-image "~/.emacs.d/res/icon.png")
new-text-color
(set-face-attribute 'default nil :background "gray8" :foreground "#70FF00")
sml faces
;; (set-face-attribute 'sml/line-number t :inherit sml/global :background "#5f00af" :foreground "light gray" :weight normal)
;; (set-face-attribute 'sml/time t :inherit sml/global :background "#5f00af" :foreground "light gray" :weight normal)
;; (set-face-attribute 'sml/charging t :inherit sml/global :background "#5f00af" :foreground "#00FF00" :weight normal)
;; (set-face-attribute 'sml/discharging t :inherit sml/global :background "#5f00af" :foreground "deep pink" :weight normal)
;; (set-face-attribute 'sml/charging t :inherit 'sml/global :foreground "forest green")
term faces
(set-face-attribute 'term-bold t :weight 'bold)
(set-face-attribute 'term-color-blue t :background "dodger blue" :foreground "dodger blue")
Navigation
IDO
(use-package ido)
(ido-mode t)
Helm & counsel/ivy
(use-package helm)
(require 'helm-config)
;(helm-mode 1)
;(setq ivy-initial-inputs-alist nil)
(use-package ivy)
(use-package smex)
(use-package counsel)
(ivy-mode 1)
;(advice-add 'ivy-completion-in-region :before (lambda (start end collection &optional predicate) (insert " ")))
(add-to-list 'ivy-initial-inputs-alist '(org-refile . ""))
(add-to-list 'ivy-initial-inputs-alist '(org-agenda-refile . ""))
(add-to-list 'ivy-initial-inputs-alist '(org-capture-refile . ""))
(add-to-list 'ivy-initial-inputs-alist '(counsel-M-x . ""))
(define-key ivy-minibuffer-map (kbd "<return>") 'ivy-alt-done)
(define-key ivy-minibuffer-map (kbd "C-<return>") 'ivy-done)
(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-c C-r") 'ivy-resume)
;; (global-set-key (kbd "C-x b") 'counsel-switch-buffer)
f3 helm
(use-package f3)
Swiper or counsel-grep
(global-set-key (kbd "C-S-s") 'counsel-grep-or-swiper)
;;(global-set-key (kbd "C-s") 'isearch-forward)
(setq counsel-grep-base-command "grep --ignore-case -E -n -e %s %s")
help should still use regular search
(define-key Info-mode-map (kbd "C-s") 'isearch-forward)
transpose-frame
Evil mode
(use-package evil)
(global-set-key (kbd "C-z") 'evil-local-mode)
(setq evil-insert-state-modes nil)
(setq evil-motion-state-modes nil)
(setq evil-default-state 'emacs)
(evil-set-initial-state 'term-mode 'emacs)
(evil-set-initial-state 'help-mode 'emacs)
(evil-mode 1)
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"))
iy-go-to-char
(use-package iy-go-to-char)
(global-set-key (kbd "M-m") 'iy-go-to-char)
ibuffer
Keybindings
(global-set-key (kbd "C-x C-b") 'ibuffer)
Config
(require 'ibuf-ext)
(add-to-list 'ibuffer-never-show-predicates
'(lambda (buf)
(with-current-buffer buf
(eq major-mode 'helm-major-mode))))
(setq ibuffer-saved-filter-groups
'(("default"
("X-Windows" (mode . exwm-mode))
("Terminals" (mode . term-mode))
("emacs-config" (not (or (mode . magit-status-mode)
(not (or (filename . ".emacs.d")
(filename . "emacs-config"))))))
("code-aux" (or (mode . slime-repl-mode)
(mode . magit-status-mode)
(mode . ein:notebooklist-mode)
(mode . cider-repl-mode)
(mode . comint-mode)
(mode . makefile-gmake-mode)))
("code" (or (mode . clojure-mode)
(mode . csharp-mode)
(mode . c++-mode)
(mode . c-mode)
(mode . scala-mode)
(mode . emacs-lisp-mode)
(mode . java-mode)
(mode . js-mode)
(mode . python-mode)
(mode . ng2-ts-mode)
(mode . lisp-mode)
(mode . ein:notebook-multilang-mode)))
("web" (or (mode . web-mode)
(mode . mhtml-mode)
(mode . js2-mode)
(mode . css-mode)))
("Org Mode" (not or (not mode . org-mode)
(directory-name . "agenda")))
("text" (filename . "\\.txt"))
("pdfs" (or (mode . doc-view-mode)
(mode . pdf-view-mode)))
("Agenda Buffers" (mode . org-agenda-mode))
("Agenda Files" (mode . org-mode))
("folders" (mode . dired-mode))
("Help" (or (name . "\*Help\*")
(name . "\*Apropos\*")
(name . "\*info\*"))))))
(setq ibuffer-show-empty-filter-groups nil)
(add-hook 'ibuffer-mode-hook
'(lambda ()
(ibuffer-switch-to-saved-filter-groups "default")
(ibuffer-do-sort-by-alphabetic)
;; (ibuffer-auto-mode)
))
;; (setq ibuffer-mode-hook nil)(list (car ibuffer-mode-hook)))
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)
view-mode
(defun my/ibuffer-view ()
(interactive)
(ibuffer-visit-buffer)
(when (null exwm--id)
(view-mode)))
(define-key ibuffer-mode-map (kbd "v") #'my/ibuffer-view)
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)
Word traversal
(global-set-key (kbd "M-f") 'forward-to-word)
(global-set-key (kbd "M-F") 'forward-word)
org-mode in separate file
(org-babel-load-file
(expand-file-name "config-org-new.org"
user-emacs-directory))
Tools
Encryption
(require 'epa-file)
(epa-file-enable)
(setq epa-pinentry-mode 'loopback)
(setq epa-file-cache-passphrase-for-symmetric-encryption t)
(setenv "GPG_AGENT_INFO" nil)
(setq epg-gpg-program "gpg2")
(setq auth-source-debug t)
(setq auth-sources '((:source "~/.emacs.d/secrets/.authinfo.gpg")))
;; (defun always-use-loopback (fun context args)
;; (setf (epg-context-pinentry-mode context) epa-pinentry-mode)
;; (funcall fun context args))
;; (advice-remove 'epg--start :around #'always-use-loopback)
dired
Dired+, for formatting
(add-to-list 'load-path
"~/.emacs.d/custom/dired-plus")
(require 'dired+)
(setq dired-listing-switches "-al --group-directories-first --sort=extension")
(setq diredp-hide-details-initially-flag nil)
(setq diredp-hide-details-propagate-flag nil)
(require 'dired-x)
(setq-default dired-omit-files-p t)
(setq dired-omit-files (concat dired-omit-files "\\|^\\..+$"))
dired-hacks
(use-package dired-filter)
(use-package dired-narrow)
(define-key dired-filter-map (kbd "F") 'dired-narrow-fuzzy)
(setq dired-filter-group-saved-groups
'(("default"
("PDF"
(extension . "pdf"))
("LaTeX"
(extension "tex" "bib"))
("Org"
(extension . "org"))
("Archives"
(extension "zip" "rar" "gz" "bz2" "tar")))))
(use-package dired-subtree)
(define-key dired-mode-map (kbd "i") 'dired-subtree-insert)
(define-key dired-mode-map (kbd "I") 'dired-subtree-remove)
(use-package dired-collapse)
dired-du
(use-package dired-du)
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 "\" \"")))))
(define-key dired-mode-map "r" 'dired-start-process)
(defun watch-youtube ()
(interactive)
(dired "~/big_files/Videos/youtube-dl")
(local-set-key (kbd "RET") 'dired-start-process))
async-command
;; (defun my/async-shell-command (command &optional output-buffer error-buffer)
;; (interactive
;; (list
;; (read-shell-command "Async shell command: " nil nil
;; (let ((filename
;; (cond
;; (buffer-file-name)
;; ((eq major-mode 'dired-mode)
;; (dired-get-filename nil t)))))
;; (and filename (file-relative-name filename))))
;; current-prefix-arg
;; shell-command-default-error-buffer))
;; (unless (string-match "&[ \t]*\\'" command)
;; (setq command (concat command " &")))
;; (shell-command command output-buffer error-buffer))
;; (add-to-list 'display-buffer-alist
;; (cons "\\*Async Shell Command\\*.*" (cons #'display-buffer nil)))
;; (setq display-buffer-alist (remove-if (lambda (a) (string= (car a) "\\*Async Shell Command\\*.*")) display-buffer-alist)
browse-url use w3m
(defun dired-browse-with-w3m (arg)
(interactive "P")
(let ((browse-url-browser-function (if arg
#'browse-url-browser-function
#'browse-url-w3)))
(browse-url-of-dired-file)))
;; (define-key dired-mode-map (kbd "W") 'dired-browse-with-w3m)
rename-follow
(defun my/dired-do-create-files (op-symbol file-creator operation arg
&optional marker-char op1
how-to)
(or op1 (setq op1 operation))
(let* ((fn-list (dired-get-marked-files nil arg))
(rfn-list (mapcar #'dired-make-relative fn-list))
(dired-one-file ; fluid variable inside dired-create-files
(and (consp fn-list) (null (cdr fn-list)) (car fn-list)))
(target-dir (dired-dwim-target-directory))
(default (and dired-one-file
(not dired-dwim-target) ; Bug#25609
(expand-file-name (file-name-nondirectory (car fn-list))
target-dir)))
(defaults (dired-dwim-target-defaults fn-list target-dir))
(target (expand-file-name ; fluid variable inside dired-create-files
(minibuffer-with-setup-hook
(lambda ()
(set (make-local-variable 'minibuffer-default-add-function) nil)
(setq minibuffer-default defaults))
(dired-mark-read-file-name
(concat (if dired-one-file op1 operation) " %s to: ")
target-dir op-symbol arg rfn-list default))))
(into-dir (cond ((null how-to)
;; Allow users to change the letter case of
;; a directory on a case-insensitive
;; filesystem. If we don't test these
;; conditions up front, file-directory-p
;; below will return t on a case-insensitive
;; filesystem, and Emacs will try to move
;; foo -> foo/foo, which fails.
(if (and (file-name-case-insensitive-p (car fn-list))
(eq op-symbol 'move)
dired-one-file
(string= (downcase
(expand-file-name (car fn-list)))
(downcase
(expand-file-name target)))
(not (string=
(file-name-nondirectory (car fn-list))
(file-name-nondirectory target))))
nil
(file-directory-p target)))
((eq how-to t) nil)
(t (funcall how-to target)))))
(if (and (consp into-dir) (functionp (car into-dir)))
(apply (car into-dir) operation rfn-list fn-list target (cdr into-dir))
(if (not (or dired-one-file into-dir))
(error "Marked %s: target must be a directory: %s" operation target))
;; rename-file bombs when moving directories unless we do this:
(or into-dir (setq target (directory-file-name target)))
(dired-create-files
file-creator operation fn-list
(if into-dir ; target is a directory
;; This function uses fluid variable target when called
;; inside dired-create-files:
(lambda (from)
(expand-file-name (file-name-nondirectory from) target))
(lambda (_from) target))
marker-char)
(dired target))))
(defun my/dired-rename-follow (orig &optional arg)
(when arg
(advice-add #'dired-do-create-files :override #'my/dired-do-create-files))
(funcall orig nil)
(when arg
(advice-remove #'dired-do-create-files #'my/dired-do-create-files)))
(advice-add #'dired-do-rename
:around
#'my/dired-rename-follow)
Elfeed
Setup feeds
;; Load elfeed-org
(use-package elfeed)
(use-package elfeed-org)
(setq rmh-elfeed-org-files (list "~/.emacs.d/elfeed.org"))
(elfeed-org)
(setq-default elfeed-search-filter "@1-week-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 "N" (lambda ()
(interactive)
(elfeed-search-set-filter "@1-day-ago +unread -youtube")))
(define-key elfeed-search-mode-map "h" (lambda ()
(interactive)
(elfeed-search-set-filter nil)))
youtube-dl
(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")
Youtube show thumbnail
(use-package dash)
(defun elfeed-entries-from-atom (url xml)
"Turn parsed Atom content into a list of elfeed-entry structs."
(let* ((feed-id url)
(protocol (url-type (url-generic-parse-url url)))
(namespace (elfeed-url-to-namespace url))
(feed (elfeed-db-get-feed feed-id))
(title (elfeed-cleanup (xml-query* (feed title *) xml)))
(author (elfeed-cleanup (xml-query* (feed author name *) xml)))
(xml-base (or (xml-query* (feed :base) xml) url))
(autotags (elfeed-feed-autotags url)))
(setf (elfeed-feed-url feed) url
(elfeed-feed-title feed) title
(elfeed-feed-author feed) author)
(cl-loop for entry in (xml-query-all* (feed entry) xml) collect
(let* ((title (or (xml-query* (title *) entry) ""))
(xml-base (elfeed-update-location
xml-base (xml-query* (:base) (list entry))))
(anylink (xml-query* (link :href) entry))
(altlink (xml-query* (link [rel "alternate"] :href) entry))
(link (elfeed--fixup-protocol
protocol
(elfeed-update-location xml-base
(or altlink anylink))))
(date (or (xml-query* (published *) entry)
(xml-query* (updated *) entry)
(xml-query* (date *) entry)
(xml-query* (modified *) entry) ; Atom 0.3
(xml-query* (issued *) entry))) ; Atom 0.3
(author-name (or (xml-query* (author name *) entry)
;; Dublin Core
(xml-query* (creator *) entry)))
(author-email (xml-query* (author email *) entry))
(author (cond ((and author-name author-email)
(format "%s <%s>" author-name author-email))
(author-name)))
(categories (xml-query-all* (category :term) entry))
(content (elfeed--atom-content entry))
(id (or (xml-query* (id *) entry) link
(elfeed-generate-id content)))
(type (or (xml-query* (content :type) entry)
(xml-query* (summary :type) entry)
""))
(tags (elfeed-normalize-tags autotags elfeed-initial-tags))
(content-type (if (string-match-p "html" type) 'html nil))
(etags (xml-query-all* (link [rel "enclosure"]) entry))
(thumb (xml-query* (group thumbnail :url) entry))
(enclosures
(cl-loop for enclosure in etags
for wrap = (list enclosure)
for href = (xml-query* (:href) wrap)
for type = (xml-query* (:type) wrap)
for length = (xml-query* (:length) wrap)
collect (list href type length)))
(db-entry (elfeed-entry--create
:title (elfeed-cleanup title)
:feed-id feed-id
:id (cons namespace (elfeed-cleanup id))
:link (elfeed-cleanup link)
:tags tags
:date (or (elfeed-float-time date) (float-time))
:content content
:enclosures enclosures
:content-type content-type
:meta `(,@(when author
(list :author author))
,@(when categories
(list :categories categories))
,@(when thumb
(list :thumbnail (elfeed-get-thumbnail thumb)))))))
(setq debug/entry db-entry)
(dolist (hook elfeed-new-entry-parse-hook)
(funcall hook :atom entry db-entry))
db-entry))))
(defun elfeed-insert-sliced-thumbnail (orig-fun entry)
(let ((thumbnail (elfeed-meta entry :thumbnail)))
(if (null thumbnail)
(funcall orig-fun entry)
(insert-sliced-image (create-image thumbnail 'imagemagick nil :height 150) nil nil 4)
(delete-backward-char 1)
(previous-line)
(previous-line)
(end-of-line)
(let* ((date (elfeed-search-format-date (elfeed-entry-date entry)))
(title (or (elfeed-meta entry :title) (elfeed-entry-title entry) ""))
(title-faces (elfeed-search--faces (elfeed-entry-tags entry)))
(feed (elfeed-entry-feed entry))
(feed-title
(when feed
(or (elfeed-meta feed :title) (elfeed-feed-title feed))))
(tags (mapcar #'symbol-name (elfeed-entry-tags entry)))
(tags-str (mapconcat
(lambda (s) (propertize s 'face 'elfeed-search-tag-face))
tags ","))
(title-width (- (window-width) 10 elfeed-search-trailing-width))
(title-column (elfeed-format-column
title (elfeed-clamp
elfeed-search-title-min-width
title-width
elfeed-search-title-max-width)
:left)))
(insert " " (propertize title-column 'face title-faces 'kbd-help title) " ")
(next-line)
(insert " " (propertize date 'face 'elfeed-search-date-face) " ")
(when feed-title
(insert (propertize feed-title 'face 'elfeed-search-feed-face) " "))
(when tags
(insert "(" tags-str ")")))
(next-line)
(end-of-line))))
(defun elfeed-insert-sliced-thumbnail (orig-fun entry)
(let ((thumbnail (elfeed-meta entry :thumbnail)))
(if (null thumbnail)
(funcall orig-fun entry)
(insert-sliced-image (create-image thumbnail 'imagemagick nil :height 150) nil nil 4)
(delete-backward-char 1)
(previous-line)
(previous-line)
(end-of-line)
(let* ((date (elfeed-search-format-date (elfeed-entry-date entry)))
(title (or (elfeed-meta entry :title) (elfeed-entry-title entry) ""))
(title-faces (elfeed-search--faces (elfeed-entry-tags entry)))
(feed (elfeed-entry-feed entry))
(feed-title
(when feed
(or (elfeed-meta feed :title) (elfeed-feed-title feed))))
(tags (mapcar #'symbol-name (elfeed-entry-tags entry)))
(tags-str (mapconcat
(lambda (s) (propertize s 'face 'elfeed-search-tag-face))
tags ","))
(title-width (- (window-width) 10 elfeed-search-trailing-width))
(title-column (elfeed-format-column
title (elfeed-clamp
elfeed-search-title-min-width
title-width
elfeed-search-title-max-width)
:left)))
(insert " " (propertize title-column 'face title-faces 'kbd-help title) " ")
(next-line)
(insert " " (propertize date 'face 'elfeed-search-date-face) " ")
(when feed-title
(insert (propertize feed-title 'face 'elfeed-search-feed-face) " "))
(when tags
(insert "(" tags-str ")")))
(next-line)
(end-of-line))))
(defun elfeed-insert-thumbnail (entry)
(let ((thumbnail (elfeed-meta entry :thumbnail)))
(if (null thumbnail)
(insert "")
(insert " ")
(insert-image (create-image thumbnail 'imagemagick nil :height 150))
(insert " "))))
(advice-add 'elfeed-search-print-entry--default :before #'elfeed-insert-thumbnail)
(defvar elfeed-link-org-capture nil)
(defun elfeed-show-insert-thumbnail ()
(let ((inhibit-read-only t)
(thumbnail (elfeed-meta elfeed-show-entry :thumbnail)))
(if (null thumbnail)
(insert "")
(insert-image (create-image thumbnail 'imagemagick nil :height 150))
(insert "\n"))
(goto-char (point-min))
(setq elfeed-link-org-capture
(format "[[%s][%s]] :%s:%s:"
(elfeed-entry-link elfeed-show-entry)
(elfeed-entry-title elfeed-show-entry)
(elfeed-meta elfeed-show-entry :author)
(string-join (mapcar #'symbol-name (elfeed-entry-tags elfeed-show-entry)) ":")))))
(advice-add 'elfeed-show-refresh--mail-style :after #'elfeed-show-insert-thumbnail)
(defun elfeed-get-thumbnail (url)
(let* ((file (--> url
(split-string it "/")
(nth 4 it)
(concat it ".jpg")))
(img-url (replace-regexp-in-string "/hqdefault.jpg$" "/mqdefault.jpg" url))
(img-folder (--> "images"
(expand-file-name it elfeed-db-directory)
(file-name-as-directory it)))
(filepath (concat img-folder file)))
(unless (file-directory-p img-folder)
(make-directory img-folder))
(unless (file-exists-p filepath)
(start-process-shell-command "wget" nil (format "wget %s -O %s" img-url filepath)))
filepath))
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")))
eshell
;; (push "watch" eshell-visual-command)
Ledger mode
(use-package ledger-mode
:mode "\\.dat\\'")
(setq ledger-reports
'(("expmonth" "%(binary) -f %(ledger-file) -M reg Expenses")
("owedmom" "%(binary) -f %(ledger-file) reg Liabilities")
("progress" "%(binary) -f %(ledger-file) reg Assets Equity Liabilities")
("cleared" "%(binary) -f %(ledger-file) cleared")
("food" "%(binary) -f %(ledger-file) --add-budget reg Assets")
(#("bal" 0 1
(idx 1))
"%(binary) -f %(ledger-file) bal")
(#("reg" 0 1
(idx 4))
"%(binary) -f %(ledger-file) reg")
(#("payee" 0 1
(idx 3))
"%(binary) -f %(ledger-file) reg @%(payee)")
(#("account" 0 1
(idx 0))
"%(binary) -f %(ledger-file) reg %(account)")))
(setq dynamic-reports
'(("budgetcal" "%(binary) -f ~/MEGA/org/entries/food.ledger --daily --add-budget reg Expenses")))
(defun ledger-dynamic-report ()
(interactive)
(let* ((ledger-reports dynamic-reports)
(report-name (ledger-report-read-name)))
(ledger-report report-name nil)))
(setq ledger-reconcile-buffer-line-format
"%(date)s %-4(code)s %-30(payee)s %-30(account)s %15(amount)s\n")
general-options
(setq user-mail-address "bensonchu457@gmail.com"
user-full-name "Benson Chu")
(setq smtpmail-smtp-server "smtp.gmail.com"
smtpmail-smtp-service 587
send-mail-function 'smtpmail-send-it
message-send-mail-function 'smtpmail-send-it)
;; (setq smtpmail-smtp-server "smtp.office365.com"
;; smtpmail-smtp-service 587
;; smtpmail-local-domain nil)
Gnus
(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
(setq user-mail-address "bensonchu457@gmail.com"
user-full-name "Benson Chu")
(setq gnus-select-method
'(nnmaildir "gmail"
(directory "~/.offlineimap_mail/personal")
(directory-files nnheader-directory-files-safe)
(get-new-mail nil)))
(setq gnus-secondary-select-methods
'((nnmaildir "work"
(directory "~/.offlineimap_mail/work")
(directory-files nnheader-directory-files-safe)
(get-new-mail nil))))
;; (setq gnus-select-method
;; '(nnimap "Local"
;; (nnimap-address "localhost")
;; (nnimap-stream network)
;; (nnimap-server-port 143)))
;; (setq gnus-select-method
;; '(nnimap "gmail"
;; (nnimap-address "imap.gmail.com")
;; (nnimap-server-port "imaps")
;; (nnimap-stream ssl)
;; (nnimap-authinfo-file "~/.emacs.d/secrets/.authinfo.gpg")))
(setq gnus-mark-article-hook nil)
(gnus-add-configuration
'(article
(horizontal 1.0
(vertical 25
(group 1.0))
(vertical 1.0
(summary 0.25 point)
(article 1.0)))))
(gnus-add-configuration
'(summary
(horizontal 1.0
(vertical 25
(group 1.0))
(vertical 1.0
(summary 1.0 point)))))
;;(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n")
(setq gnus-summary-line-format "%d %U%R%z%I%(%[%4L: %-23,23f%]%) %s\n")
notmuch
(use-package notmuch)
(set-face-attribute 'notmuch-search-unread-face nil :foreground "white")
(set-face-attribute 'notmuch-message-summary-face nil :background "steel blue" :foreground "snow")
(setq notmuch-search-oldest-first nil
notmuch-saved-searches
'((:name "inbox" :query "tag:inbox" :key "i")
(:name "inbox today" :query "date:7d.. tag:inbox" :key "t")
(:name "work" :query "tag:work" :key "w")
(:name "mailing lists" :query "tag:mlist" :key "m")
(:name "recruiting" :query "tag:recruiting" :key "r")
(:name "unread" :query "tag:unread" :key "u")
(:name "flagged" :query "tag:flagged" :key "f")
(:name "cs" :query "tag:cs" :key "c")
(:name "receipts" :query "tag:receipts" :key "R")
;; (:name "sent" :query "tag:sent" :key "s")
;; (:name "drafts" :query "tag:draft" :key "d")
(:name "all mail" :query "*" :key "a")))
(setq mail-specify-envelope-from t
message-sendmail-envelope-from 'header
mail-envelope-from 'header)
(defun my/choose-email-address-and-send ()
(interactive)
(let ((resp (completing-read "Which email? " '("bchu3@cougarnet.uh.edu" "bensonchu457@gmail.com") nil t "^")))
(setq smtpmail-smtp-server
(if (string= resp "bensonchu457@gmail.com")
"smtp.gmail.com"
"smtp.office365.com"))
(notmuch-mua-send-and-exit)))
(define-key notmuch-message-mode-map (kbd "C-c C-c") #'my/choose-email-address-and-send)
(defun my/notmuch-delete-mail ()
(interactive)
(notmuch-search-tag '("+deleted"))
(notmuch-search-next-thread))
(defun my/undelete-mail ()
(interactive)
(notmuch-search-tag '("-deleted")))
(defun my/recruiting-mail ()
(interactive)
(notmuch-search-tag '("-inbox" "+recruiting"))
(notmuch-search-next-thread))
(define-key 'notmuch-search-mode-map (kbd "d") #'my/notmuch-delete-mail)
(define-key 'notmuch-search-mode-map (kbd "u") #'my/undelete-mail)
(define-key 'notmuch-search-mode-map (kbd "f") #'my/recruiting-mail)
(define-key 'notmuch-search-mode-map (kbd "<mouse-1>") nil)
(add-to-list 'notmuch-tagging-keys
'("r" ("-inbox" "+recruiting") "Recruiting"))
mu4e
(unless (eq system-type 'windows-nt)
(require 'mu4e)
(add-to-list 'mu4e-view-actions
'("ViewInBrowser" . mu4e-action-view-in-browser) t)
;; (global-set-key (kbd "<f8>") 'mu4e)
(setq mu4e-maildir "~/.offlineimap_mail"
mu4e-sent-folder "/personal/[Gmail].Sent Mail"
mu4e-drafts-folder "/personal/[Gmail].Drafts"
mu4e-refile-folder "/personal/[Gmail].Archive")
(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)
html view firefox no copiousoutput
(mailcap-add "text/html" "/usr/bin/xdg-open %s ")
Programming
Autocompletion
(use-package company)
(setq company-idle-delay 0.2)
(add-hook 'emacs-lisp-mode-hook
'company-mode)
irony
(use-package irony
:hook ((c++-mode . irony-mode)
(c-mode . irony-mode)
(objc-mode . irony-mode)))
;; (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)
(use-package java-snippets)
(define-key yas/keymap (kbd "<backtab>") 'yas-expand)
(yas-global-mode 0)
Projectile and dumb-jump
(use-package projectile
:custom
(projectile-enable-caching t))
(use-package treemacs-projectile)
(use-package helm-projectile)
(use-package counsel-projectile)
(defun projectile-stop-project-running ()
(interactive)
(if-let (buf (get-buffer "*compilation*"))
(let ((kill-buffer-query-functions nil))
(kill-buffer buf)
(delete-window))
(message "Project is not running")))
(projectile-global-mode)
;; Deprecated?
(counsel-projectile-mode)
(ivy-set-occur 'counsel-projectile-switch-to-buffer 'ivy-switch-buffer-occur)
(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)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)
(define-key projectile-command-map (kbd "C-a") 'projectile-add-known-project)
(define-key projectile-command-map (kbd "C-r") 'projectile-remove-known-project)
(define-key projectile-command-map (kbd "C-f") 'counsel-projectile-find-file)
(define-key projectile-command-map (kbd "C-b") 'projectile-ibuffer)
(define-key projectile-command-map (kbd "C-c") 'projectile-compile-project)
(define-key projectile-command-map (kbd "C-d") 'projectile-stop-project-running)
(defun this-is-a-project (dir)
(interactive "f")
(setq projectile-project-root dir)
(set (make-local-variable 'dumb-jump-project) dir))
(define-key projectile-command-map (kbd "C-t") 'this-is-a-project)
(use-package dumb-jump)
(dumb-jump-mode)
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)))
Geiser
(use-package geiser)
(setq geiser-default-implementation 'chez)
Paredit
(use-package paredit)
Cider
(use-package clj-refactor)
(use-package cider)
(use-package clojure-mode)
YAML
(use-package yaml-mode)
show parens
(show-paren-mode t)
lsp-mode
(use-package flycheck)
(global-flycheck-mode)
(add-to-list 'display-buffer-alist
`(,(rx bos "*Flycheck errors*" eos)
(display-buffer-reuse-window
display-buffer-in-side-window)
(side . bottom)
(reusable-frames . visible)
(window-height . 0.10)))
(require 'ansi-color)
(defun colorize-compilation-buffer ()
(let ((buffer-read-only nil))
(ansi-color-apply-on-region (point-min) (point-max))))
;; (ansi-color-apply-on-region compilation-filter-start (point)))
(add-hook 'compilation-filter-hook 'colorize-compilation-buffer)
(use-package lsp-mode)
(use-package lsp-ui)
(add-hook 'java-mode-hook
'lsp)
(define-key lsp-mode-map (kbd "M-.") 'lsp-ui-peek-find-definitions)
(define-key lsp-mode-map (kbd "M-?") 'lsp-ui-peek-find-references)
(define-key lsp-mode-map (kbd "M-,") 'lsp-ui-peek-jump-backward)
(define-key lsp-mode-map (kbd "M-p") 'lsp-ui-peek-jump-forward)
(setq lsp-ui-flycheck-enable t)
(setq lsp-ui-flycheck-live-reporting t)
(use-package dap-mode
:config
(add-hook 'java-mode-hook
'dap-mode)
(add-hook 'java-mode-hook
'dap-ui-mode)
(define-key dap-mode-map (kbd "C-c h") 'dap-hydra)
(define-key dap-mode-map (kbd "C-c b") 'dap-breakpoint-toggle)
(define-key dap-mode-map (kbd "C-c d r") 'dap-java-debug)
(define-key dap-mode-map (kbd "C-c d m") 'dap-java-debug-test-class)
(define-key dap-mode-map (kbd "C-c r t") 'mvn-test))
;; (defhydra dap-hydra (:color pink :hint nil :foreign-keys run)
;; ;; "
;; ;; ^Stepping^ ^Switch^ ^Breakpoints^ ^Eval
;; ;; ^^^^^^^^-----------------------------------------------------------------------------------------
;; ;; _n_: Next _ss_: Session _bt_: Toggle _ee_: Eval
;; ;; _i_: Step in _st_: Thread _bd_: Delete _er_: Eval region
;; ;; _o_: Step out _sf_: Stack frame _ba_: Add _es_: Eval thing at point
;; ;; _c_: Continue _sl_: List locals _bc_: Set condition _eii_: Inspect
;; ;; _r_: Restart frame _sb_: List breakpoints _bh_: Set hit count _eir_: Inspect region
;; ;; _Q_: Disconnect _sS_: List sessions _bl_: Set log message _eis_: Inspect thing at point
;; ;; "
;; ("n" dap-next)
;; ("i" dap-step-in)
;; ("o" dap-step-out)
;; ("c" dap-continue)
;; ("r" dap-restart-frame)
;; ("ss" dap-switch-session)
;; ("st" dap-switch-thread)
;; ("sf" dap-switch-stack-frame)
;; ("sl" dap-ui-locals)
;; ("sb" dap-ui-breakpoints)
;; ("sS" dap-ui-sessions)
;; ("bt" dap-breakpoint-toggle)
;; ("ba" dap-breakpoint-add)
;; ("bd" dap-breakpoint-delete)
;; ("bc" dap-breakpoint-condition)
;; ("bh" dap-breakpoint-hit-condition)
;; ("bl" dap-breakpoint-log-message)
;; ("ee" dap-eval)
;; ("er" dap-eval-region)
;; ("es" dap-eval-thing-at-point)
;; ("eii" dap-ui-inspect)
;; ("eir" dap-ui-inspect-region)
;; ("eis" dap-ui-inspect-thing-at-point)
;; ("q" nil "quit" :color blue)
;; ("Q" dap-disconnect :color red))
;(use-package lsp-python)
Java
(use-package lsp-java)
(require 'dap-java)
ccls
(use-package ccls)
(require 'ccls)
Rainbow delimiters
(use-package rainbow-delimiters)
(rainbow-delimiters-mode)
(add-hook 'prog-mode-hook #'rainbow-delimiters-mode)
(add-hook 'org-mode-hook #'rainbow-delimiters-mode)
(let ((rainbow-purple "#9E1CB2")
(rainbow-blue "#1194f6")
(rainbow-green "#47B04B")
(rainbow-yellow "#FFED18")
(rainbow-orange "#E7B500")
(rainbow-red "#C90067")
(rainbow-7 "#00AA5D")
(rainbow-8 "#FE7380"))
(set-face-attribute 'rainbow-delimiters-depth-1-face t :foreground rainbow-purple)
(set-face-attribute 'rainbow-delimiters-depth-2-face t :foreground rainbow-green)
(set-face-attribute 'rainbow-delimiters-depth-3-face t :foreground rainbow-blue)
(set-face-attribute 'rainbow-delimiters-depth-4-face t :foreground rainbow-red)
(set-face-attribute 'rainbow-delimiters-depth-5-face t :foreground rainbow-yellow)
(set-face-attribute 'rainbow-delimiters-depth-6-face t :foreground rainbow-blue)
(set-face-attribute 'rainbow-delimiters-depth-7-face t :foreground rainbow-red)
(set-face-attribute 'rainbow-delimiters-depth-8-face t :foreground rainbow-8)
(set-face-attribute 'rainbow-delimiters-depth-9-face t :foreground rainbow-purple))
elisp
Macroexpand
(define-key emacs-lisp-mode-map (kbd "C-c e") 'macrostep-expand)
auto-highlight-symbol
(use-package auto-highlight-symbol)
(add-hook 'emacs-lisp-mode-hook
'auto-highlight-symbol-mode)
C#
(use-package csharp-mode)
(use-package dotnet)
(use-package omnisharp
:bind (:map omnisharp-mode-map
([remap xref-find-definitions] . omnisharp-go-to-definition)
([remap xref-find-references] . omnisharp-find-usages)))
(add-hook 'csharp-mode-hook 'omnisharp-mode)
(add-hook 'csharp-mode-hook 'company-mode)
(add-hook 'csharp-mode-hook 'flycheck-mode)
(add-hook 'csharp-mode-hook 'auto-highlight-symbol-mode)
(add-hook 'csharp-mode-hook 'dotnet-mode)
React js
(use-package rjsx-mode)
Golang
(use-package go-mode)
(add-hook 'go-mode-hook
(lambda ()
(add-hook 'before-save-hook 'gofmt-before-save)
(setq indent-tabs-mode nil)))
Elpy
(use-package elpy)
(elpy-enable)
EIN
(use-package ein)
(add-to-list 'exec-path
"/home/benson/anaconda3/bin/")
Web-mode
(use-package web-mode)
(add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.cshtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
(setq web-mode-auto-close-style 2)
Processing
(use-package processing-mode)
(setq processing-location "/usr/bin/processing-java")
Treemacs
(use-package treemacs)
Hy-mode
(use-package hy-mode)
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))
indent-guide
(use-package indent-guide)
;(indent-guide-global-mode)
rust cargo
(use-package cargo)
maven support
(use-package mvn)
multiple-cursors
(use-package multiple-cursors)
(define-prefix-command '*multiple-cursors-map*)
(define-key *multiple-cursors-map* (kbd "a") 'mc/mark-all-like-this)
(define-key *multiple-cursors-map* (kbd "A") 'mc/vertical-align)
(define-key *multiple-cursors-map* (kbd "SPC") 'mc/vertical-align-with-space)
(define-key *multiple-cursors-map* (kbd "n") 'mc/insert-numbers)
(defhydra mc-interactive (*multiple-cursors-map* "i")
"For those looping commands"
("n" mc/mark-next-like-this)
("p" mc/mark-previous-like-this)
("s" mc/skip-to-next-like-this)
("S" mc/skip-to-previous-like-this)
("q" nil))
(global-set-key (kbd "C-c m") '*multiple-cursors-map*)
Setup-dev-environment
(defun setup-devenv ()
(interactive)
(flycheck-list-errors)
(treemacs)
(dap-ui-locals)
(when (y-or-n-p "Enter lsp? ")
(lsp)))
skeletor project templates
(use-package skeletor)
(skeletor-define-template "java-maven"
:title "Java with Maven")
Spaces
(setq default-tab-width 4)
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
Erlang
(use-package erlang)
(add-to-list 'load-path
"~/.emacs.d/custom/erlang_ls/")
(setq lsp-erlang-server-install-dir "~/.emacs.d/custom/erlang_ls")
(defun my/erlang-keymap-hook ()
(local-set-key (kbd "C-c C-c") 'erlang-compile))
(add-hook 'erlang-mode-hook 'my/erlang-keymap-hook)
New
Youtube-dl
(add-to-list 'load-path "~/.emacs.d/custom/youtube-dl-emacs/")
(require 'youtube-dl)
(defun youtube-dl-song (url)
(interactive
(list (read-from-minibuffer
"URL: " (or (thing-at-point 'url)
(when interprogram-paste-function
(funcall interprogram-paste-function))))))
(async-shell-command (format "youtube-dl -x -f \"bestaudio[ext=m4a]\" \"%s\"; tageditor -s album=\"youtube-dl\" -f *.m4a" url)))
pdf-tools use isearch
(use-package pdf-tools)
(pdf-tools-install)
(define-key pdf-view-mode-map (kbd "C-s") 'isearch-forward)
(define-key pdf-view-mode-map (kbd "d") (lambda () (interactive) (pdf-view-next-line-or-next-page 8)))
(define-key pdf-view-mode-map (kbd "u") (lambda () (interactive) (pdf-view-previous-line-or-previous-page 8)))
Time to game!
(defvar my/games '("desmume" "mednaffe" "dolphin-emu" "m64py" "citra-qt" "steam " "th12"))
(defun time-to-game ()
(interactive)
(let ((selection (completing-read "What would you like to play? "
my/games)))
(launch-program selection)))
Winner Mode
(require 'winner)
(winner-mode)
Skewer Mode (web development)
(use-package js2-mode)
(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
(use-package skewer-mode)
(add-hook 'js2-mode-hook 'skewer-mode)
(add-hook 'css-mode-hook 'skewer-css-mode)
(add-hook 'html-mode-hook 'skewer-html-mode)
ediff
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
Scroll interval
(setq scroll-margin 1
hscroll-margin 2
hscroll-step 1
scroll-conservatively 101
scroll-preserve-screen-position t
mouse-wheel-scroll-amount '(3)
mouse-wheel-progressive-speed nil)
AUR PKGBUILD
(use-package pkgbuild-mode)
Eyebrowse
(use-package eyebrowse
:init (setq eyebrowse-keymap-prefix (kbd "C-c w"))
:config
(eyebrowse-mode)
(global-set-key (kbd "C->") 'eyebrowse-next-window-config)
(global-set-key (kbd "C-<") 'eyebrowse-prev-window-config))
Writing mode
(defun org-writing-mode ()
(interactive)
(setq org-bullets-bullet-list (quote (" ")))
(buffer-face-set '(:family "ETBookOT")))
re-builder specify read method
(require 're-builder)
(setq reb-re-syntax 'string)
scrollkeeper
(use-package scrollkeeper)
(global-set-key (kbd "C-v") 'scrollkeeper-down)
(global-set-key (kbd "M-v") 'scrollkeeper-up)
set-default-directory
(defun set-default-directory (dir)
(interactive "f")
(setq default-directory dir))
World time include Taiwan
;; (("America/Los_Angeles" "Seattle")
;; ("America/New_York" "New York")
;; ("Europe/London" "London")
;; ("Europe/Paris" "Paris")
;; ("Asia/Calcutta" "Bangalore")
;; ("Asia/Tokyo" "Tokyo"))
(setq display-time-world-list
'(("America/Chicago" "Houston")
("Asia/Taipei" "Taiwan")))
arch-linux
(use-package arch-packer)
Compile java run test
(defun compile-java ()
(interactive)
(let ((fname (file-name-nondirectory buffer-file-name)))
(shell-command (format "javac %s" fname))
(message (shell-command-to-string (format "java %s" (substring fname 0 (- (length fname) 5)))))))
(global-set-key (kbd "C-<f1>") 'compile-java)
ansi-term colors
(setq ansi-color-names-vector
["black" "red3" "green3" "yellow3" "DodgerBlue2" "magenta3" "cyan3" "gray90"])
expand-region
(use-package expand-region)
(global-set-key (kbd "C-'") 'er/expand-region)
wtf
(use-package wtf)
auto-save files in same directory
(setq backup-directory-alist `(("." . "~/.emacs.d/backups/")))
(setq backup-by-copying t)
csv-mode
(use-package csv-mode)
kdeconnect
(use-package kdeconnect)
(setq kdeconnect-devices "ddcc003536dcf16d")
(setq kdeconnect-active-device "ddcc003536dcf16d")
Purpose-mode
(use-package window-purpose)
(add-to-list 'purpose-user-mode-purposes '(exwm-mode . research))
(add-to-list 'purpose-user-mode-purposes '(js2-mode . dev))
(purpose-compile-user-configuration)
(purpose-mode)
erc
(use-package erc)
(use-package erc-hl-nicks)
(use-package erc-colorize)
(require 'netrc)
(erc-hl-nicks-mode)
(erc-colorize-mode)
(setq erc-user-full-name "Benson Chu")
(setq erc-kill-buffer-on-part t)
(setq erc-autojoin-channels-alist
'(("freenode.net" "#emacs" "#org-mode"
"##linux" "#compilers" "#pltclub"
"##cs" "##computerscience" "##programming" "#lisp" "##lisp"
"#sbcl" "#ecl")))
(defun get-authinfo (host port)
(let* ((netrc (netrc-parse (expand-file-name "~/.emacs.d/secrets/.authinfo.gpg")))
(hostentry (netrc-machine netrc host port)))
(when hostentry (netrc-get hostentry "password"))))
(defun freenode-connect (nick password)
(erc :server "irc.freenode.net" :port 6667
:password password :nick nick))
(defun irc-connect ()
(interactive)
(when (y-or-n-p "Connect to IRC? ")
(freenode-connect "pest-ctrl" (get-authinfo "irc.freenode.net" "6667"))))
posting sourc code
(use-package webpaste)
(setq webpaste-paste-confirmation t)
(setq webpaste-provider-priority '("ix.io"))
eosd
;; (add-to-list 'load-path
;; "~/.emacs.d/custom/eosd")
;; (require 'eosd)
helpful
(use-package helpful)
(global-set-key (kbd "C-h f") #'helpful-function)
(global-set-key (kbd "C-h v") #'helpful-variable)
(global-set-key (kbd "C-h k") #'helpful-key)
ediff snippet
(defun ediff-copy-both-to-C ()
(interactive)
(ediff-copy-diff ediff-current-difference nil 'C nil
(concat
(ediff-get-region-contents ediff-current-difference 'A ediff-control-buffer)
(ediff-get-region-contents ediff-current-difference 'B ediff-control-buffer))))
(defun add-d-to-ediff-mode-map () (define-key ediff-mode-map "d" 'ediff-copy-both-to-C))
(add-hook 'ediff-keymap-setup-hook 'add-d-to-ediff-mode-map)
leetcode
(use-package ctable)
(use-package names)
(add-to-list 'load-path
"~/.emacs.d/custom/leetcode-emacs")
(require 'leetcode)
(setq leetcode-path "~/MEGA/personal/programming_problems/Leetcode"
leetcode-language "java")
freezing time
(defvar my/frozen-time nil)
(defvar my/format-time-string-function nil)
(defun my/current-time ()
my/frozen-time)
(defun my/format-time-string (original format-string &optional time zone)
(apply original
format-string
(if time
time
my/frozen-time)
zone))
(defun my/decode-time (original &optional time zone)
(apply original
(if time
time
my/frozen-time)
zone))
;; Change and freeze time
(defun za-warudo ()
"Freeze `current-time' at the current active or inactive timestamp. If point
is not on a timestamp, the function prompts for one. If time is not specified,
either by the timstamp under point or prompt, the time defaults to the
current HH:MM of today at the selected date."
(interactive)
(let* ((org-read-date-prefer-future nil)
(time (org-read-date t 'totime nil "Input freeze time: ")))
(setq my/frozen-time (append time '(0 0)))
(advice-add #'current-time :override #'my/current-time)
(advice-add #'format-time-string :around #'my/format-time-string)
(advice-add #'decode-time :around #'my/decode-time)
(set-face-background 'fringe "firebrick2")
(message "Toki yo tomare")))
(define-key *root-map* (kbd "C-z") 'za-warudo)
;; Release changed / frozen time
(defun un-za-warudo ()
"Release the time frozen by `freeze-time'."
(interactive)
(advice-remove #'current-time #'my/current-time)
(advice-remove #'format-time-string #'my/format-time-string)
(advice-remove #'decode-time #'my/decode-time)
(setq my/frozen-time nil)
(set-face-background 'fringe nil)
(message "Soshite, toki wa ugoki dasu"))
(define-key *root-map* (kbd "C-r") 'un-za-warudo)
Ace-window
(use-package ace-window)
(defhydra window-management-hydra (*root-map* "C-w")
"Manage window splits"
("2" split-window-below)
("3" split-window-right)
("h" windmove-left)
("j" windmove-down)
("k" windmove-up)
("l" windmove-right)
("+" enlarge-window-horizontally)
("-" shrink-window-horizontally)
("M-+" enlarge-window)
("M--" shrink-window)
("x" delete-window)
("q" nil))
function to set tabwith
(defun my/TABS (num)
(interactive "p")
(setq tab-width (if (= num 1)
8
num)))
bookmark+
(add-to-list 'load-path
"~/.emacs.d/custom/bookmark-plus")
(require 'bookmark+)
Custom bookmarks location
(bookmark-load "~/.emacs.d/my-bookmarks")
(defun my/bookmark-set (&optional name no-overwrite)
(interactive (list nil current-prefix-arg))
(bookmark-set name no-overwrite)
(let* ((buffer (find-file-noselect "~/.emacs.d/my-bookmarks"))
(bookmark (car bookmark-alist))
(bookmark-name (car bookmark))
(bookmark-file (and (buffer-file-name)
(file-name-nondirectory (buffer-file-name)))))
(with-current-buffer buffer
(goto-char (point-min))
(when (not (or (save-excursion (re-search-forward bookmark-name))
(and bookmark-file
(save-excursion (re-search-forward bookmark-file)))))
(re-search-forward "(")
(insert (pp bookmark))
(save-buffer)
(kill-buffer)))))
;; (global-set-key (kbd "C-x r m") #'my/bookmark-set)
Subtitles editing
(add-to-list 'load-path "~/.emacs.d/custom/subed/subed")
(require 'subed)
;; Disable automatic movement of point by default
(add-hook 'subed-mode-hook 'subed-disable-sync-point-to-player)
;; Break lines automatically while typing
(add-hook 'subed-mode-hook 'turn-on-auto-fill)
;; Break lines at 50 characters
(add-hook 'subed-mode-hook (lambda () (setq-local fill-column 50)))
docker
(use-package docker)
(global-set-key (kbd "C-x C-d") #'docker)
compilation buffer in same window
;; (add-to-list 'display-buffer-alist
;; '("\\*compilation\\*" (display-buffer-reuse-window . display-buffer-same-window) ))
(add-to-list 'same-window-buffer-names "*compilation*")
;; (setq display-buffer-alist (remove-if (lambda (x) (string= "\\*compilation\\*" (car x))) display-buffer-alist))
compilation scroll
(setq compilation-scroll-output t)
google-it with qutebrowser
(require 'url-util)
(defun my/google-it ()
(interactive)
(let* ((resp (read-from-minibuffer "What is your query? "))
(cleaned-resp (url-hexify-string resp)))
(launch-program (format "qutebrowser \"https://google.com/search?q=%s\"" cleaned-resp))))
(define-key *root-map* (kbd "g") #'my/google-it)
256-color fix
(use-package eterm-256color)
(add-hook 'term-mode-hook #'eterm-256color-mode)
read only buffers in view-mode
(setq view-read-only t)
hyperbole
(use-package hyperbole)
;; I don't care about smart scrolling in org mode, unless I actually do
(defun my/smart-scroll-up (old)
(if (eq major-mode 'org-mode)
(org-meta-return)
(funcall old)))
(advice-add #'smart-scroll-up
:around
#'my/smart-scroll-up)
Go to work
(defvar my/working nil)
(defvar my/dev-agenda nil)
(defun toggle-working ()
(interactive)
(setq my/working (not my/working))
(cond (my/working
(define-key *firefox-map* (kbd "f") nil)
(setq my/dev-agenda (assoc "d" org-agenda-custom-commands))
(setq org-agenda-custom-commands
(delq (assoc "d" org-agenda-custom-commands)
org-agenda-custom-commands))
(message "Back to work!"))
((not my/working)
(define-key *firefox-map* (kbd "f") (quickrun-lambda "firefox" "firefox"))
(add-to-list 'org-agenda-custom-commands my/dev-agenda)
(message "Break time!"))))
(global-set-key (kbd "s-w") #'toggle-working)
magit-todos
(use-package magit-todos)
wgrep
(use-package wgrep)
Use cider's display result
(autoload 'cider--make-result-overlay "cider-overlays")
(defun endless/eval-overlay (value point)
(cider--make-result-overlay (format "%S" value)
:where point
:duration 'command)
;; Preserve the return value.
value)
(advice-add 'eval-region :around
(lambda (f beg end &rest r)
(endless/eval-overlay
(apply f beg end r)
end)))
(advice-add 'eval-last-sexp :filter-return
(lambda (r)
(endless/eval-overlay r (point))))
(advice-add 'eval-defun :filter-return
(lambda (r)
(endless/eval-overlay
r
(save-excursion
(end-of-defun)
(point)))))
centaur tabs
(use-package centaur-tabs)
solaire-mode
(use-package solaire-mode)
Hydra's don't show your faces
(add-to-list 'hydra-props-alist
'(exwm-background/window-transparency-hydra :verbosity 0))
(add-to-list 'hydra-props-alist
'(clementine-volume-hydra :verbosity 0))
tramp things
(use-package docker-tramp)
(use-package tramp-hdfs)
CASA Schedule
(defvar my/schedule "https://uofh-my.sharepoint.com/:x:/g/personal/nsingh29_cougarnet_uh_edu/ERfp7g_6FbFAsxIlV0YP1goB9iXnUcTm__kTvakvXmvcvQ?rtime=-JcPFVIj10g")
(defun my/view-casa-schedule ()
(interactive)
(funcall browse-url-browser-function my/schedule))
Credit Card Statement Macro
(fset 'credit_card_statement
[?\M-x ?o ?r ?g ?- ?m ?o ?d ?e return ?\M-x ?q backspace ?r ?e ?p ?l ?a ?c ?e ?- ?r ?e ?g ?e ?x ?p return ?^ ?\C-q tab return ? ? ? ? return ?\M-< ?\C- ?\C-f ?\C-f ?\C-f ?\C-f ?\C-c ?m ?a ?\C-w ?- ? ?\[ ? ?\] ? ?\C-e ?\C-k ?\C-c ?m ? ?\C-q tab ?\C-q tab ?\C-e ?\C-j ?y ?\C-a ?_ ?_ ?_ ?_ backspace backspace backspace backspace ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?= ?\C-p ?\C-p ?\C-k ?\C-c ?m ? ?\C-q tab ?\C-q tab ?\C-d ?\C-d return ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n ?\C-n])
Vivaldi
(defun browse-url-vivaldi (url &optional new-window)
(interactive (browse-url-interactive-arg "URL: "))
(setq url (browse-url-encode-url url))
(let* ((process-environment (browse-url-process-environment)))
(apply 'start-process
(concat "vivaldi " url) nil
"vivaldi-stable"
(list url))))
(setq browse-url-browser-function #'browse-url-firefox)
Magit Push All
(defun my/magit-push-all ()
"Push all branches."
(interactive)
(magit-run-git-async "push" "-v"
(magit-read-remote "Remote")
"--all"))
(transient-append-suffix 'magit-push "m"
'("a" "all remotes" my/magit-push-all))
;; (transient-remove-suffix 'magit-push '(1 1))
;; (transient-get-suffix 'magit-push "m")
New stuff, lost to git stupidity
(defun my/query-replace-rx (&rest _)
"Call `query-replace-regexp', reading regexp in `rx' syntax.
Automatically wraps in parens and adds `seq' to the beginning of
the form."
(interactive)
(cl-letf (((symbol-function #'query-replace-read-from) (lambda (&rest _)
(--> (read-string "rx form: ")
(concat "'(seq " it ")")
(read it)
(cadr it)
(rx-to-string it)))))
(call-interactively #'query-replace-regexp)))
Profiler Keymap
(define-prefix-command '*profiler-map*)
(define-key *profiler-map* (kbd "s") #'profiler-start)
(define-key *profiler-map* (kbd "r") #'profiler-report)
(define-key *profiler-map* (kbd "S") #'profiler-stop)
(define-key *root-map* (kbd "p") '*profiler-map*)
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")
(slime-setup '(slime-fancy slime-asdf))
new etzy
(load-file "~/.emacs.d/my-etzy.el")
Google Translate
(use-package google-translate)
Broken
Wunderlist
(use-package org-wunderlist)
(save-excursion
(let ((filename "~/.emacs.d/wunderlist.el"))
(if (not (file-exists-p filename))
(message "Wunderlist secret file missing")
(set-buffer (find-file-noselect filename))
(let ((var (eval (read (buffer-string)))))
(setq org-wunderlist-client-id (car var)
org-wunderlist-token (cadr var)))
(kill-buffer))))
(setq org-wunderlist-file "~/MEGA/org/agenda/Wunderlist.org"
org-wunderlist-dir "~/MEGA/org/agenda/org-wunderlist/")
poshint
(use-package pophint)
buffer-time-tracking fix
(use-package switch-buffer-functions)
;;(load "switch-buffer-functions-autoloads.el")
(defun my/insert-into-buffers-csv (str str2 symb str3)
(let* ((buffer (find-file-noselect "~/MEGA/org/agenda/buffer_times.csv"))
(inhibit-message t))
(with-current-buffer buffer
(goto-char (point-max))
(insert (format-time-string "%Y-%m-%d %H:%M:%S" (current-time)))
(insert "," str "," (if str2 str2 "") "," str3 "," (if symb (symbol-name symb) ""))
(insert "\n")
(save-buffer))))
(defun my/record-buffer-switch (prev cur)
(let* (obuffer-name buffer-name buffer-fname buffer-mode buffer-def-dir)
(with-current-buffer cur
(setq buffer-name (buffer-name)
buffer-fname (buffer-file-name)
buffer-mode major-mode
buffer-def-dir default-directory))
(when (buffer-live-p prev)
(with-current-buffer prev
(setq obuffer-name (buffer-name))))
(when (and (not (string= buffer-name " *Minibuf-1*"))
;; (or (not obuffer-name) (not (string= obuffer-name " *Minibuf-1*")))
)
(my/insert-into-buffers-csv buffer-name buffer-fname buffer-mode buffer-def-dir))))
;; (add-hook 'switch-buffer-functions
;; 'my/record-buffer-switch)
(defun leaving-computer ()
(interactive)
(my/insert-into-buffers-csv "Inactive" "" nil "")
(org-clock-out nil t)
(message "Computer is now inactive!"))
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)
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/")))
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"
(or (equal (org-get-todo-state) "PROJECT")
(save-restriction
(widen)
(let ((subtree-end (save-excursion (org-end-of-subtree t)))
(is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1))
has-subtask has-task)
(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)
(when (not (equal (org-get-todo-state) "DONE"))
(setq has-task t)))))
(and is-a-task (or has-task
(and has-subtask
(equal "TODO"
(org-get-todo-state)))))))))
(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 (or (equal (org-get-todo-state)
"ONE")
(not has-subtask))))))
(defun my/is-standalone-task-p ()
(and (my/is-a-task)
(not (bh/is-subproject-p))))
(defun bh/is-next-task-p ()
(and (bh/is-task-p)
(or (equal (org-get-todo-state)
"NEXT")
(and (equal (org-get-todo-state)
"TODO")
(or (org-get-scheduled-time (point))
(org-get-deadline-time (point)))))))
(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)))
(defvar memoized-stuck-function nil
"DO NOT SETQ. Use in agenda views")
(defun my/make-memoized-stuck-projects ()
(memoize (lambda (point)
(message "Hello, world!")
(my/is-stuck-project-p))))
(defun my/is-stuck-project-p ()
(let ((subtree-end (save-excursion (org-end-of-subtree t)))
has-next
has-stuck-project)
(save-restriction
(save-excursion
(while (and (or (not has-next)
(not has-stuck-project))
(outline-next-heading)
(< (point) subtree-end))
(cond ((and (bh/is-project-p)
(my/is-stuck-project-p))
(setq has-stuck-project t))
((or (bh/is-next-task-p)
(equal (org-get-todo-state) "WAIT"))
(setq has-next t))))))
(and (bh/is-project-p)
(or (not has-next)
has-stuck-project))))
(defun my/is-inactive-project-p ()
(let (has-next
has-stuck-project)
(and (bh/is-project-p)
(or (not (member (org-get-todo-state)
'("TASK" "PROJECT" "TODO")))
(org-time> (org-entry-get (point) "SCHEDULED") "<now>")))))
(defun my/is-delayed-project-p ()
(and (bh/is-project-p)
(org-entry-get (point) "SCHEDULED")
(org-time> (org-entry-get (point) "SCHEDULED") "<now>")))
(defun my/is-ignored-project ()
;; Need to finish
)
(defun my/is-active-project-p ()
;; Need to finish
)
(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)))))
(when (my/is-stuck-project-p)
next-headline))))
(defun my/show-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))))
(subtree-end (save-excursion (org-end-of-subtree t))))
(cond ((my/is-inactive-project-p)
subtree-end)
((not (my/is-stuck-project-p))
next-headline)))))
(defun my/show-inactive-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))))
(subtree-end (save-excursion (org-end-of-subtree t))))
(unless (my/is-inactive-project-p)
subtree-end))))
(defun my/show-delayed-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))))
(subtree-end (save-excursion (org-end-of-subtree t))))
(unless (my/is-delayed-project-p)
subtree-end))))
(defun bh/show-active-projects ()
"Skip trees that are not projects"
;; (bh/list-sublevels-for-projects-indented)
(let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
(unless (and (bh/is-project-p)
(not (my/is-stuck-project-p)))
next-headline)))
(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 my/only-next-projects-and-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)
(t (unless (or (bh/is-next-task-p)
(my/is-standalone-task-p))
next-headline))))))
(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/show-non-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)))