misc cleanup
[dot-emacs] / init.el
diff --git a/init.el b/init.el
index f6f68de64601216e94fa34119284dbfd3a19e5a6..85c7fb2ec81d16487769b9918e7ab812cc6a0dc2 100644 (file)
--- a/init.el
+++ b/init.el
 ;; You should have received a copy of the GNU General Public License
 ;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-
 ;; do m-x benchmark-init to see some benchmark stats
 ;;(add-to-list 'load-path "~/.emacs.d/src/benchmark-init-el/")
 ;;(require 'benchmark-init-loaddefs)
 ;;(benchmark-init/activate)
 
-
 ;;; init.el --- the start of customization
 
 ;; (toggle-debug-on-error) ;uncomment to help debug
 
 
-;; Package.el added this a long time ago. emacs 26 gives a warning that
-;; this is obsolete, but it doesn't happen automatically in batch mode,
-;; and then emacs dies on error, so it doesn't seem obsolete to me.
-
-
 ;; stop from minimizing & freezing the gui
 ;; used to freeze emacs and was really annoying,
 ;; seems its changed now. no harm in keeping this though.
 (global-unset-key (kbd "C-z"))
 
 ;; speed up init https://www.reddit.com/r/emacs/comments/3kqt6e/2_easy_little_known_steps_to_speed_up_emacs_start/
-(setq gc-cons-threshold 100000000)
+;; https://github.com/jwiegley/dot-emacs/blob/master/init.el
+(defvar file-name-handler-alist-old file-name-handler-alist)
+(setq package-enable-at-startup nil
+      file-name-handler-alist nil
+      message-log-max 16384
+      gc-cons-threshold 402653184
+      gc-cons-percentage 0.6
+      auto-window-vscroll nil)
+
+(add-hook 'after-init-hook
+          `(lambda ()
+             (setq file-name-handler-alist file-name-handler-alist-old
+                   gc-cons-threshold 800000
+                   gc-cons-percentage 0.1)
+             (garbage-collect)) t)
+
+;; 2019-6-26, 1.26s
+;; ; to profile init:
+;; ; uncomment the following block
+;; (require 'benchmark-init)
+;; (add-hook 'after-init-hook 'benchmark-init/deactivate)
+;; ; Then run:
+;; ; emacs -f benchmark-init/show-durations-tabulated
+;; ; emacs -f benchmark-init/show-durations-tree
+;; ; to catch things post-init
+;; ; emacs -f benchmark-init/deactivate
 
 
 ;; these need to be done before the hook in order to satisfy the byte compiler or batch mode
 
 ;; disabled since not used.
 ;;(add-to-list 'load-path "~/.emacs.d/src/bbdb-csv-import")
+;;(add-to-list 'load-path "~/.emacs.d/src/ghci-completion")
+;;(add-to-list 'load-path "~/.emacs.d/src/mediawiki-el")
+;;(add-to-list 'load-path "~/.emacs.d/src/spray")
 
-(add-to-list 'load-path "~/.emacs.d/src/ghci-completion")
-(add-to-list 'load-path "~/.emacs.d/src/mediawiki-el")
-(add-to-list 'load-path "~/.emacs.d/src/spray")
 (add-to-list 'load-path "~/.emacs.d/src/visible-mark")
 
 
-;; git version of gnus
-;; (add-to-list 'load-path "~/.emacs.d/src/gnus/lisp")
-(require 'info)
-(add-to-list 'Info-default-directory-list "~/.emacs.d/src/gnus/texi")
-
-;; needed for git version
-;;(add-to-list 'load-path "~/.emacs.d/src/haskell-mode")
-;;(require 'haskell-mode-autoloads)
-;;(add-to-list 'Info-default-directory-list "~/.emacs.d/src/haskell-mode")
-
-;; for using custom/upstream bbdb
-;;(require 'bbdb-loaddefs "~/.emacs.d/src/bbdb/lisp/bbdb-loaddefs.el")
-;;(setq bbdb-print-tex-path "~/.emacs.d/src/bbdb/tex")
-
-
-;; iank: dunno what this was about
-;;(add-hook 'server-visit-hook 'raise-frame)
 
 (setq init-dir (file-name-directory load-file-name))
 ;; previously, i was doing byte-recompile-directory, but
 ;; now i just have one init file
 (unless (equal (user-uid) 0) ; don't make root owned files
-  (byte-recompile-file (expand-file-name "init.el" init-dir)))
-
-;; load init in `after-init-hook' so all packages are loaded. However, disabled because
-;; there seems to be no need.
-;; todo, learn about the weird evaluation order of this hook that requires the quoting.
-;; adapted from starter-kit
-;; (add-hook 'after-init-hook
-;;           `(lambda ()
-;;              (load-file (expand-file-name "myinit.el" init-dir))
-;;              ))
-
-
-;;; Weird package bug workaround
-
-
-;; without this, when installing a package, this message happens
-;;
-;; custom-handle-keyword: Unknown keyword :group
-;;
-;; but when i lookup the function, i get the following, and if
-;; I evaluate it, the error goes away. so I think the real
-;; definition is happening somewhere else
-
-(defun custom-handle-keyword (symbol keyword value type)
-  "For customization option SYMBOL, handle KEYWORD with VALUE.
-Fourth argument TYPE is the custom option type."
-  (if purify-flag
-      (setq value (purecopy value)))
-  (cond ((eq keyword :group)
-        (custom-add-to-group value symbol type))
-       ((eq keyword :version)
-        (custom-add-version symbol value))
-       ((eq keyword :package-version)
-        (custom-add-package-version symbol value))
-       ((eq keyword :link)
-        (custom-add-link symbol value))
-       ((eq keyword :load)
-        (custom-add-load symbol value))
-       ((eq keyword :tag)
-        (put symbol 'custom-tag value))
-       ((eq keyword :set-after)
-        (custom-add-dependencies symbol value))
-       (t
-        (error "Unknown keyword %s" keyword))))
-
+  (byte-recompile-file (expand-file-name "init.el" init-dir) nil 0)
+  (when (file-exists-p "/p/c/mymu4e.el")
+    (byte-recompile-file "/p/c/mymu4e.el" nil 0))
+  )
 
 ;;; misc emacs documentation
 
@@ -211,7 +171,7 @@ Fourth argument TYPE is the custom option type."
 ;; nnfolder-generate-active-file
 
 ;; to reset things, when changing mail group. I duno all the proper way, but it works to delete
-;; ~/Mail ~/.newsrc.eld ~/.dribble (or something)
+;; ~/Mail ~/.newsrc.eld ~/.newsrc-dribble
 
 
 ;;;;; mail sources vs select methods background
@@ -242,59 +202,39 @@ Fourth argument TYPE is the custom option type."
 
 
 ;;; things that should be at the beginning
-;; todo, evaluating this manually disables debug on error instead of toggling it
-(toggle-debug-on-error) ;uncomment to help debug and catch errors
-
-;; packages installed from package manager: i pretty much prioritize repos this way: gnu, then melpa, then marmalade.
-
-;; package-activated-list:
-;; ac-dabbrev ac-haskell-process ack-and-a-half alect-themes auctex bash-completion bbdb csv-mode cyberpunk-theme dot-mode expand-region f find-file-in-project flycheck foreign-regexp ggtags ghc gnuplot-mode goto-chg haskell-mode heroku-theme highlight-indentation highlight-symbol htmlize inf-ruby info+ inkpot-theme jedi auto-complete jedi-core epc ctable concurrent key-chord leuven-theme logstash-conf magit git-commit magit-popup misc-fns mouse+ naquadah-theme nginx-mode occidental-theme org paredit pcsv php-mode pkg-info epl popup py-autopep8 python-environment deferred python-info python-mode rainbow-mode rust-mode rw-hunspell s smartparens smex smooth-scroll sr-speedbar strings swiper ivy tabulated-list tangotango-theme thingatpt+ undo-tree vimrc-mode volatile-highlights web-mode with-editor dash async ws-butler yasnippet
-
-;;;; alternate keyboards
-;; todo, figure out an easy way to disable this when using external keyboard
-(if (display-graphic-p)
-    (setq
-     enter-key (kbd "<return>")
-     s-enter-key (kbd "<S-return>")
-     c-m-enter-key (kbd "<C-M-return>")
-     m-enter (kbd "<M-return>")
-     c-enter (kbd "<C-return>"))
-  (setq
-   enter-key (kbd "C-m")
-   s-enter-key (kbd "C-8")
-   c-m-enter-key (kbd "C-M-8")
-   m-enter (kbd "M-m")
-   c-enter (kbd "C-8")))
-
-(setq tp (string= (system-name) "tp"))
-(setq x200 (string= (system-name) "x2"))
-(setq laptop-keyboard (or tp x200))
-
-;; Ubiquitous Packages which should be loaded on startup rather than
-;;   autoloaded on demand since they are likely to be used in every
-;;   session.
-(require 'saveplace)
-(require 'ffap)
-(require 'uniquify)
-(require 'ansi-color)
-(require 'recentf)
 
-;; Better to have a list of packages in here vs installed manually.
-;;   However, I install manually because sometimes there are two
-;;   versions and it is not necessarily easy to reconcile that.
-;; based on marmalage website front page.
-(require 'package)
+;; from its README.md
+(eval-when-compile
+  (require 'use-package))
+
+
+;; Ubiquitous Packages. these could go anywhere actually
+(use-package saveplace
+  :unless noninteractive
+  :config
+  (save-place-mode 1))
+(use-package ffap)
 
-;; little kit to help remove a down server
-;; (setq package-archives nil)
+;; from jwiegley
+(use-package recentf
+  :defer 10
+  :commands (recentf-mode
+             recentf-add-file
+             recentf-apply-filename-handlers)
+  :config
+  (recentf-mode 1))
+
+(setq package-archives
+      (quote
+       (("gnu" . "https://elpa.gnu.org/packages/")
+        ("MELPA" . "https://melpa.org/packages/"))))
 
 ;;(add-to-list 'package-archives
 ;;             '("marmalade" .
 ;;               "http://marmalade-repo.org/packages/"))
 
-(add-to-list 'package-archives
-             '("melpa" . "http://melpa.milkbox.net/packages/") t)
-(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
+;; down atm 2020-08-30
+;;(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
 
 
 ;; keep our init.el clean, by moving customization elisp to it's own file
@@ -302,18 +242,6 @@ Fourth argument TYPE is the custom option type."
 (load custom-file 'noerror)
 
 
-
-;;; abreviations
-;; turn on abbrev mode globally
-(setq-default abbrev-mode t)
-
-;; default abbreviation mode file is .emacs.d/abbrev_defs.
-;; add-global-abbrev, add-mode-abbrev for expansion at point
-;; if all else fails, edit the abbrev file
-
-
-
-
 ;;; auto-complete
 
 ;; auto-completion in minibuffer
@@ -330,8 +258,6 @@ Fourth argument TYPE is the custom option type."
 
 (add-to-list 'ac-modes 'org-mode 'sql-mode)
 
-(defun ac-common-setup ()
-  (add-to-list 'ac-sources 'ac-source-yasnippet))
 
 ;; for org mode completion source taken from wiki.
 ;; it did not work. no idea why. todo, investigate
@@ -350,7 +276,8 @@ Fourth argument TYPE is the custom option type."
 (define-key ac-completing-map (kbd "<down>") nil)
 (define-key ac-completing-map (kbd "<S-return>") 'ac-expand)
 (define-key ac-completing-map "\t" 'ac-complete)
-(define-key ac-completing-map (kbd "<tab>") 'ac-complete)
+;;(define-key ac-completing-map (kbd "<tab>") 'ac-complete)
+(define-key ac-completing-map (kbd "TAB") 'ac-complete)
 
 
 
@@ -395,12 +322,14 @@ Fourth argument TYPE is the custom option type."
 
 (add-hook 'shell-mode-hook
           (lambda ()
-            (define-key shell-mode-map (kbd "<tab>") 'auto-complete)))
+            ;;(define-key shell-mode-map (kbd "<tab>") 'auto-complete)
+            (define-key shell-mode-map (kbd "TAB") 'auto-complete)
+            ))
 
 
 ;;; readline complete fix
 
-;; I need this function here, where INSIDE_EMACS is replaced with RLC_INSIDE_EMACS.
+;; I need this function here, where INSIDE_EMACS is replaced with LC_INSIDE_EMACS.
 ;; ian: last update 2017-1-7. update this periodically from upstream
 ;; like when we do a major emacs update
 (defun comint-exec-1 (name buffer command switches)
@@ -419,7 +348,7 @@ Fourth argument TYPE is the custom option type."
                    (format "COLUMNS=%d" (window-width)))
            (list "TERM=emacs"
                  (format "TERMCAP=emacs:co#%d:tc=unknown:" (window-width))))
-         (list (format "RLC_INSIDE_EMACS=%s,comint" emacs-version))
+         (list (format "LC_INSIDE_EMACS=%s,comint" emacs-version))
          process-environment))
        (default-directory
          (if (file-accessible-directory-p default-directory)
@@ -447,7 +376,34 @@ Fourth argument TYPE is the custom option type."
        (set-process-coding-system proc decoding encoding))
     proc))
 
-;;; auto save & backup
+;;; auto save
+
+;; todo: patch this so i can turn it off like my-as-off-local.
+;; then try it out and see if it can replace my autosave.
+;; Or maybe with the new auto-save-visited-mode.
+;; (use-package super-save
+;;   :ensure t
+;;   :config
+;;   (setq super-save-exclude '("")
+;;         super-save-triggers
+;;         '(balance-windows
+;;           next-buffer
+;;           org-babel-execute-src-block
+;;           other-window
+;;           previous-buffer
+;;           split-window-below
+;;           split-window-horizontally
+;;           start-process-shell-command
+;;           switch-to-buffer
+;;           windmove-down
+;;           windmove-left
+;;           windmove-right
+;;           windmove-up)
+;;         )
+;;   (super-save-mode +1))
+
+
+
 (setq auto-save-timeout 1) ; idle time before auto-save.
 
 ;; main hook for my auto save
@@ -473,7 +429,7 @@ Fourth argument TYPE is the custom option type."
          ;; mu4e has a bug right now, undo breaks when saving drafts
          (not (string= (buffer-file-name) "*draft*"))
          (buffer-modified-p)
-         (not (org-src-edit-buffer-p)))
+         (not (and (boundp 'org-src-edit-buffer-p) (org-src-edit-buffer-p))))
     ;; serial is incremented on each save, so let's do a bit less of them
     (not (derived-mode-p 'dns-mode))
     (setq my-auto-save-last last)
@@ -592,44 +548,11 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 ;;         but new emacs version fixed all that, yay!.
 
 
-                                        ; not using, but here for documentation,
-                                        ; alternate way to enable and specify how long between autosaves.
-                                        ; number of input events between autosave.
-                                        ; lowest bound of functionality is actually about 15 input events
-                                        ;(setq auto-save-interval
-
-;;; bbdb
-;; based on bbdb manual
-;; also has instructions to integrate with gnus,
-
-(bbdb-initialize 'message)
-
-;; recommended by gnus,
-;; but seems like it could be good to have set for other stuff
-(setq user-full-name "Ian Kelling")
-;; general email setting? recommended by mu4e
-(setq message-kill-buffer-on-exit t)
-
-
-
-;; use d instead
-(add-hook 'bbdb-mode-hook
-          (lambda () (define-key bbdb-mode-map (kbd "C-k") nil))
-          ;; based on emacs24-starter-kit
-          (setq bbdb-offer-save 'auto
-                bbdb-notice-auto-save-file t
-                bbdb-expand-mail-aliases t
-                bbdb-canonicalize-redundant-nets-p t
-                bbdb-complete-name-allow-cycling t)
-          )
-
-;;(require 'bbdb-csv-import)
-
-;;; bookmark settings
-                                        ; save bookmarks whenever they are changed instead of just when emacs quits
-(setq bookmark-save-flag 1)
-                                        ; increase bookmark context size for better functionality
-(setq bookmark-search-size 2000)
+;; not using, but here for documentation,
+;; alternate way to enable and specify how long between autosaves.
+;; number of input events between autosave.
+;; lowest bound of functionality is actually about 15 input events
+;; (setq auto-save-interval ...)
 
 ;;; c-like settings
 ;; change last thing from gnu.
@@ -650,9 +573,6 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 ;; themes are available through ELPA.
 
 
-;; interesting light themes
-
-
 (defun override-theme (arg)
   (interactive)
   (while custom-enabled-themes
@@ -660,6 +580,8 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
   (load-theme arg t))
 (setq color-theme-is-global t)
 
+;; temporary, make night be default
+
 (defun toggle-night ()
   (interactive)
   (cond  ((equal (car custom-enabled-themes) 'naquadah)
@@ -696,8 +618,6 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 ;;(override-theme 'wombat) ; cursor not visible enough. from a wombat package, not sure which
 ;;(override-theme 'misterioso) ; cursor not visible enough
 
-
-
 ;;decent light themes
 ;;(override-theme 'alect-light) ; theres a -alt version, don't see a dif. could use this without dimming. from alect-something package
 ;;(override-theme 'occidental) ; from occidental-theme package
@@ -713,38 +633,11 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 
 
 
-;;; yasnippet
-
-;; cd ~/.emacs.d/src
-;; git clone --recursive https://github.com/capitaomorte/yasnippet
-;; touch snippets/.yas-make-groups
-
-;;   This all makes it so I can look through the default snippets
-;;   in the menu bar, but they don't show up elsewhere, because they are
-;;   mostly things I don't want.
-
-
-(require 'yasnippet)
-;; this needs to be before yas-global-mode
-(setq yas-snippet-dirs (list "~/.emacs.d/snippets"))
-(yas-global-mode 1)
-
-(setq
- yas-also-auto-indent-first-line t
- yas-choose-tables-first t
- yas-use-menu (quote full)
- ;; this sets ido-prompt as first function
- yas-prompt-functions
- '(yas-ido-prompt yas-dropdown-prompt yas-x-prompt yas-completing-prompt yas-no-prompt))
-
-;; todo, explore this option for wrapping region
-;; '(yas/wrap-around-region t))
-
 ;;; cross session settings
 
 ;; Save a list of recent files visited.
 (recentf-mode 1)
-(setq recentf-max-saved-items 200
+(setq recentf-max-saved-items 400
       recentf-max-menu-items 15)
 
 
@@ -779,7 +672,6 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 (setq ediff-split-window-function 'split-window-horizontally)
 
 
-
 ;; Things I tried which didn't work, which intuitively I think should
 ;; work better: I can open the second diff buffer in a new frame, and
 ;; close it's window in the first frame after starting ediff, but when I
@@ -804,11 +696,51 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 
 ;;(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu4e")
 ;;(add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e")
-(require 'mu4e)
+;;  (require 'mu4e)
 
 ;; (setq mu4e-headers-results-limit 2000)
 
+
+(defun my-mu4e-init ()
+  (setq mu4e-headers-fields (delq (assoc :mailing-list mu4e-headers-fields) mu4e-headers-fields))
+  ;; it's implemented in mu4e, but not in the actions list for
+  ;; some reason.
+  (add-to-list 'mu4e-view-actions
+               '("browser view" . mu4e-action-view-in-browser) t)
+
+  (add-to-list 'mu4e-headers-actions
+               '("from this sender" . mu4e-action-msgs-by-this-sender) t)
+  (add-to-list 'mu4e-view-actions
+               '("from this sender" . mu4e-action-msgs-by-this-sender) t)
+  ;; normally, you would add to this, but we want to
+  ;; modify unread messages. the first 4 are defined by default.
+  (setq mu4e-bookmarks
+        `( ,(make-mu4e-bookmark
+             :name  "Unread messages"
+             ;; old less restrictive unread, for adapting in the future:
+             ;; flag:unread AND NOT flag:trashed AND NOT maildir:/Junk AND NOT maildir:/fwfw AND NOT maildir:/log
+             :query "flag:unread maildir:/INBOX"
+             :key ?u)
+           ,(make-mu4e-bookmark
+             :name "Today's messages"
+             :query "date:today..now"
+             :key ?t)
+           ,(make-mu4e-bookmark
+             :name "Last 7 days"
+             :query "date:7d..now"
+             :key ?w)
+           ,(make-mu4e-bookmark
+             :name "Messages with images"
+             :query "mime:image/*"
+             :key ?p))
+        )
+  )
+
+(eval-after-load "mu4e" '(my-mu4e-init))
+
 (setq
+ ;; https://github.com/djcb/mu/issues/1025
+ mail-user-agent 'mu4e-user-agent
  ;; common to gnus. default sendmail-query-once asks us, then sets this via customize.
  send-mail-function (quote sendmail-send-it)
  ;; use the standard imap folders
@@ -821,7 +753,6 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
  mu4e-use-fancy-chars t
  mu4e-confirm-quit nil
  mu4e-headers-leave-behavior 'apply ;; dont ask, do whatever was marked
- mu4e-headers-fields (delq (assoc :mailing-list mu4e-headers-fields) mu4e-headers-fields)
  ;; default 500.
  mu4e-headers-results-limit 1000
  ;; tell exim to use from: as envelope from.
@@ -835,6 +766,12 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
  mu4e-cache-maildir-list t
  ;; default is 8, way too small for my big monitors
  mu4e-headers-visible-lines 50
+ message-sendmail-envelope-from 'header
+ ;; trying this out
+ ;;mu4e-view-use-gnus t
+ ;; had problems where mu4e and gnus would hang verifying signatures, gnus man
+ ;; said this should help, but it didnt work. they still got verified.
+ ;; mm-verify-option 'never
  )
 
 ;; fucks up reading unread bookmark. when that is fixed, enable it
@@ -846,7 +783,8 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 ;; mu4e-user-mail-address-list
 ;; and a function
 ;; inspired by mu4e info manual, search for mu4e-compose-pre-hook.
-(load "/p/c/mu4e.el")
+(when (file-exists-p "/p/c/mymu4e.el")
+  (load "/p/c/mymu4e.el"))
 
 (defun my-decrypt ()
   ;; use for decrypting in mu4e
@@ -860,7 +798,7 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
       )))
 (add-hook 'mu4e-view-mode-hook 'my-decrypt)
 
-(defun mu-set-from-name (regexes)
+(defun iank-set-from-name (regexes)
   "If we find an address matching regex, then set that address as the to,
 and whatever was used"
   (when mu4e-compose-parent-message
@@ -870,17 +808,25 @@ and whatever was used"
               regexes (cdr regexes)
               found (mu4e-message-contact-field-matches
                      mu4e-compose-parent-message :to re)))
-      (when found (setq user-mail-address (cdr found)
-                        user-full-name (car found)))
+      (when found
+        (setq user-full-name (car found))
+        ;; we get an error unless we do this. that is a bug. I could
+        ;; send a patch...  also a bug: setting message-from-style nil
+        ;; doesnt work in mu4e unless user-full-name is also nil.
+        (unless user-full-name
+          (setq message-from-style nil))
+        (setq user-mail-address (cdr found)
+              mail-signature nil))
       found)))
-(defun mu-set-from (regexes)
+(defun iank-set-from (regexes)
   "If we find an address matching regex, then set that address as the to,
 and Ian Kelling as the name"
   (when mu4e-compose-parent-message
     (let ((found nil))
       (while (and regexes (not found))
         (setq re (car regexes)
-              regexes (cdr regexes)
+              sig (cadr regexes)
+              regexes (cddr regexes)
               found (cdr (mu4e-message-contact-field-matches
                           mu4e-compose-parent-message :to re))))
       (when found (setq user-mail-address found
@@ -888,16 +834,6 @@ and Ian Kelling as the name"
       found)))
 
 
-(defun my-mu4e-to-fsf ()
-  "inspired by mu4e info manual, search for mu4e-compose-pre-hook."
-  (cond
-   ((mu-set-from '("iank@fsf.org"
-                   "iank@gnu.org")))
-   ((setq user-mail-address "iank@fsf.org"
-          user-full-name "Ian Kelling"))))
-
-
-;; on first run   mkdir -p /nocow/user/.mufsf; mu index --maildir=/nocow/user/fsfmd
 (defun mu-exit-wait ()
   (interactive)
   ;; taken from the mu source
@@ -910,69 +846,18 @@ and Ian Kelling as the name"
 
 (defun fsf-mu4e ()
   (interactive)
-  (unless (equal mu4e-maildir "/nocow/user/fsfmd") (mu-exit-wait))
+  (my-mu4e-commmon)
   (setq
-   ;; fsf monitor is smaller
-   mu4e-headers-visible-lines 15
-   mu4e-maildir "/nocow/user/fsfmd"
-   mu4e-refile-folder "/Spam"
-   mu4e-index-lazy-check nil
-   mu4e-get-mail-command "true"
    user-mail-address "iank@fsf.org"
+   iank-user-mail-address user-mail-address
    ;; WARNING: be careful editing this, there needs to be a space after --, and my editor
    ;; and git will automatically remove it unless i manually disable it.
-   mail-signature "
-
---
-Ian Kelling | Senior Systems Administrator, Free Software Foundation
-GPG Key: B125 F60B 7B28 7FF6 A2B7  DF8F 170A F0E2 9542 95DF
-https://fsf.org | https://gnu.org
-"
-
-   mu4e-user-mail-address-list '("iank@fsf.org"
-                                 "iank@gnu.org")
-   mu4e-maildir-shortcuts
-   '( ("/INBOX"     . ?i)
-      ("/sysadmin" . ?a)
-      ("/sec"  . ?x)
-      ("/rtcc"  . ?c)
-      ("/Drafts"     . ?d)
-      ("/Sent"     . ?s)
-      )
+   mail-signature fsf-sig
    ) ;; end setq
-  (call-process "/a/exe/lnf" nil nil nil "-T" "/nocow/user/.mufsf" (concat (getenv "HOME") "/.mu"))
-  (add-hook 'mu4e-compose-pre-hook 'my-mu4e-to-fsf)
-  (remove-hook 'mu4e-compose-pre-hook 'my-mu4e-to)
-  (mu4e)) ;; end defun fsf-mu4e
-
-
-;; it's implemented in mu4e, but not in the actions list for
-;; some reason.
-(add-to-list 'mu4e-view-actions
-             '("browser view" . mu4e-action-view-in-browser) t)
-
-;; normally, you would add to this, but we want to
-;; modify unread messages. the first 4 are defined by default.
-(setq mu4e-bookmarks
-      `( ,(make-mu4e-bookmark
-           :name  "Unread messages"
-           ;; old less restrictive unread, for adapting in the future:
-           ;; flag:unread AND NOT flag:trashed AND NOT maildir:/Junk AND NOT maildir:/fwfw AND NOT maildir:/log
-           :query "flag:unread maildir:/INBOX"
-           :key ?u)
-         ,(make-mu4e-bookmark
-           :name "Today's messages"
-           :query "date:today..now"
-           :key ?t)
-         ,(make-mu4e-bookmark
-           :name "Last 7 days"
-           :query "date:7d..now"
-           :key ?w)
-         ,(make-mu4e-bookmark
-           :name "Messages with images"
-           :query "mime:image/*"
-           :key ?p))
-      )
+  (add-hook 'mu4e-compose-pre-hook 'my-mu4e-to)
+  (mu4e))
+
+
 
 
 (defun mu4e-action-msgs-by-this-sender (msg)
@@ -983,207 +868,17 @@ https://fsf.org | https://gnu.org
     ;; from is structured like: (("Anacron" . "root@x2.lan"))
     (mu4e-headers-search (concat "f:" (cdar from)))))
 
-(add-to-list 'mu4e-headers-actions
-             '("from this sender" . mu4e-action-msgs-by-this-sender) t)
-(add-to-list 'mu4e-view-actions
-             '("from this sender" . mu4e-action-msgs-by-this-sender) t)
 
 
 ;;; elisp settings
-                                        ; when manually evaluating lisp, go into debugger on error
+;; when manually evaluating lisp, go into debugger on error
 (setq eval-expression-debug-on-error t)
-                                        ;reminder of useful var: debug-on-error
-
-
-;;; haskell
-
-;; useful comint-shell mode commands. If not prefaced with *, it means it is not in the haskell custom repl
-;; *todo: setup haskell c-t toggle arrow keys
-;; tab completion
-;; C-q insert prev arg
-;; C-( history search
-;; c-m-left/right move to next/prev prompts
-;; *c-enter, multi-line input
-;; *s-delete, send input across windows. (i can implement this)
-;; *c-m-l clear screen
-;; *haskell-process-interrupt, c-cc terminate job (i can implement this maybe)
-
-;; nice bash/readline functions missing in comint:
-;; yank-nth-arg
-;; operate-get-next
-;; menu-complete
-
-;; usefull comint commands:
-;; c-cl : list historic command in temp buffer
-;; C-c C-o comint-delete-output
-;; comint-restore-input, todo: put this on a randomish c-c key
-
-
-
-;; todo:
-;; checkout haskell repl functions:
-;; c-cv haskell-check, hlint
-;; C-M-q           prog-indent-sexp
-;; c-c.  haskell-mode-format-imports
-;; C-c M-/         haskell-doc-check-active
-;; haskell-process-generate-tags
-;; haskell-process-cabal-build
-;; haskell-cabal-command.. or something
-;; haskell-process-restart
-;; C-h v haskell-process-log
-;; C-h v haskell-process-show-debug-tips
-
-;; various not immediately useful functions:
-;; haskell-process-add-dependency
-;; haskell-process-touch-buffer
-;; haskell-process-cd
-;; haskell-process-unignore
-;; haskell-process-reload-devel-main
-
-
-;; rebind
-;; home: C-a             haskell-interactive-mode-beginning
-;; c-return: C-j             haskell-interactive-mode-newline-indent
-;; up/down: <C-down>        haskell-interactive-mode-history-next
-
-;; todo haskell mode better binds for:
-;; 'haskell-process-load-file
-;; 'haskell-process-do-type
-;; 'haskell-process-do-info
-;; 'inferior-haskell-send-decl
-
-
-;; commands which don't work in haskell-interactive-mode(hi) vs inferior-haskell-mode(ih, default)
-;; functions not in hi:
-;; inferior-haskell-find-definition, use tags instead
-;; inferior-haskell-find-haddock, todo, test if this works
-
-;; redefined ih to hi
-;; switch-to-haskell -> 'haskell-interactive-switch
-;; haskell-process-load-file -> inferior-haskell-load-file
-;; haskell-process-do-type -> inferior-haskell-type
-;; switch-to-haskell -> haskell-interactive-switch
-;; inferior-haskell-load-file -> 'haskell-process-load-file
-
-
-;; haskell-mode installation from source, based on its readme
-;; in the git directory,
-;; make all
-
 
 
-
-;; remove default option to not link the file
-(setq haskell-compile-command "ghc -Wall -ferror-spans -fforce-recomp %s")
-(add-hook 'haskell-indentation-mode-hook
-          (lambda ()
-            (define-key haskell-indentation-mode-map [?\C-d] nil)
-            (define-key haskell-indentation-mode-map
-              (kbd "<deletechar>")
-              'haskell-indentation-delete-char)))
-
-;;copied from haskell-mode docs in order to use the new, better, nondefault
-;;interactive mode.
-(eval-after-load "haskell-mode"
-  '(progn
-     (define-key haskell-mode-map (kbd "C-x C-d") nil)
-     (define-key haskell-mode-map (kbd "C-c C-z") 'haskell-interactive-switch)
-     (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-file)
-     (define-key haskell-mode-map (kbd "C-c C-b") 'haskell-interactive-switch)
-     (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type)
-     (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info)
-     (define-key haskell-mode-map (kbd "C-c M-.") nil)
-     (define-key haskell-mode-map (kbd "C-c C-d") nil)))
-
-;; ghc-mod install http://www.mew.org/~kazu/proj/ghc-mod/en/emacs.html
-;; todo, try this out
-;; (autoload 'ghc-init "ghc" nil t)
-;;(add-hook 'haskell-mode-hook (lambda () (ghc-init) (flymake-mode)))
-
-
-
-;; from the package readme for ghci-completion
-(require 'ghci-completion)
-(add-hook 'inferior-haskell-mode-hook 'turn-on-ghci-completion)
-
-
-;; disable some rebinds. they are set to appropriate keys in the keybinds section
-(eval-after-load "haskell-mode"
-  '(progn
-     (define-key haskell-mode-map (kbd "C-a") 'nil)
-     (define-key haskell-mode-map (kbd "C-j") 'nil)))
-
 (eval-after-load "python-mode"
   '(progn
      (define-key python-mode-map (kbd "C-j") nil)))
 
-(defun pretty-lambdas-haskell ()
-  (font-lock-add-keywords
-   nil `((,(concat "(?\\(" (regexp-quote "\\") "\\)")
-          (0 (progn (compose-region (match-beginning 1) (match-end 1)
-                                    ,(make-char 'greek-iso8859-7 107))
-                    nil))))))
-;; from haskell-mode manual
-(add-hook 'haskell-mode-hook 'turn-on-haskell-decl-scan)
-(when (window-system)
-  (add-hook 'haskell-mode-hook 'pretty-lambdas-haskell))
-
-;; added from haskell-mode website install instructions
-                                        ;(load "/usr/share/emacs/site-lisp/haskell-mode/haskell-site-file")
-(add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
-;;the three indentation modules are mutually exclusive - add at most one. Trying out the "most advanced"
-(add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
-;;(add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
-;;(add-hook 'haskell-mode-hook 'turn-on-haskell-simple-indent)
-
-
-;; todo, set this to some other key
-;;    (local-set-key (kbd "C-e") 'my-haskell-load-and-run)
-
-(defun my-haskell-load-and-run ()
-  "Loads and runs the current Haskell file."
-  (interactive)
-  (let ((start-buffer (current-buffer)))
-    (inferior-haskell-load-and-run inferior-haskell-run-command)
-    (sleep-for 0 100)
-    (end-of-buffer)
-    (pop-to-buffer start-buffer)))
-
-;; show haskell function in mode line
-;; todo, this broke after updating emacs
-;;(eval-after-load "which-func"
-;;  '(add-to-list 'which-func-modes 'haskell-mode))
-
-
-
-(add-hook 'interactive-haskell-mode-hook 'ac-haskell-process-setup)
-(add-hook 'haskell-interactive-mode-hook 'ac-haskell-process-setup)
-(eval-after-load "auto-complete"
-  '(add-to-list 'ac-modes 'haskell-interactive-mode))
-
-(add-hook 'haskell-mode-hook
-          (lambda () (define-key haskell-mode-map (kbd "C-(")
-                       (lambda () (interactive)
-                         (basic-save-buffer)
-                         (haskell-compile)
-                         (run-with-timer .3 nil 'repeat-shell)))))
-(add-hook 'haskell-cabal-mode-hook
-          (lambda () (define-key haskell-cabal-mode-map (kbd "C-(") 'haskell-compile)))
-
-
-
-(add-hook 'haskell-interactive-mode-hook
-          (lambda ()
-            (define-key haskell-interactive-mode-map "\r" nil)
-            (define-key haskell-interactive-mode-map (kbd "<return>") 'haskell-interactive-mode-return)))
-(add-hook 'haskell-indentation-mode-hook (lambda () (define-key haskell-indentation-mode-map "\r" nil)))
-
-
-
-(add-hook 'haskell-interactive-mode-hook
-          (lambda ()
-            (define-key haskell-interactive-mode-map (kbd "<C-M-return>") 'haskell-interactive-mode-newline-indent)))
-
 ;;; isearch
 (setq
  isearch-allow-scroll t
@@ -1261,11 +956,7 @@ https://fsf.org | https://gnu.org
     (isearch-yank-symbol partialp)))
 
 
-
-                                        ; lets look through emacs starter kit before we throw this out.
-
-
-                                        ;   automatically wrap to the top of the buffer when isearch fails
+;;   automatically wrap to the top of the buffer when isearch fails
 (defadvice isearch-search (after isearch-no-fail activate)
   (unless isearch-success
     (ad-disable-advice 'isearch-search 'after 'isearch-no-fail)
@@ -1321,43 +1012,15 @@ https://fsf.org | https://gnu.org
   (turn-on-eldoc-mode))
 (add-hook 'ielm-mode-hook 'ielm-mode-defaults)
 
-;;; mediawiki
-
-(eval-after-load "mediawiki"
-  '(progn
-     (remove-hook 'outline-minor-mode-hook 'mediawiki-outline-magic-keys)
-     (add-hook 'mediawiki-mode-hook
-               (lambda () (define-key mediawiki-mode-map (kbd "C-(") 'mediawiki-save-reload)))
-
-     ;; mediawiki mode has a bug that it will claim an edit conflict unless you reload after saving.
-     ;; I also like to save with no edit summary for previewing on my local mw instance
-     (defun mediawiki-save-reload ()
-       (interactive)
-       (and (mediawiki-save "") (mediawiki-reload)))))
 ;;; modes with little configuration needed
-;; busted:
-;;(require 'csv-mode)
-;;(add-to-list 'auto-mode-alist '("\\.[Cc][Ss][Vv]\\'" . csv-mode))
-
-(require 'outshine)
-(add-hook 'outline-minor-mode-hook 'outshine-mode)
-(add-hook 'emacs-lisp-mode-hook 'outline-minor-mode)
-(add-hook 'sh-mode-hook 'outline-minor-mode)
-
-
 
-(setq org-caldav-url "https://cal.iankelling.org"
-      org-caldav-calendar-id "ian"
-      org-caldav-inbox "/p/cal.org")
-;;(org-caldav-sync)
-
-
-;;(require 'dtrt-indent)
-;;(setq dtrt-indent-mode t)
+;; disabled temporarily
+;;(add-hook 'outline-minor-mode-hook 'outshine-mode)
 
 (setq css-indent-offset 2)
 
-(load-file "/a/h/iank-mod.el")
+(when (file-exists-p "/a/h/iank-mod.el")
+  (load-file "/a/h/iank-mod.el"))
 
 ;; from when i was running my own patches
 ;;(add-to-list 'load-path "/a/opt/ws-butler")
@@ -1397,69 +1060,18 @@ https://fsf.org | https://gnu.org
   (setq-local prev-auto-revert-max (point-max)))
 
 
-;; gnu global
-(require 'ggtags)
-(add-hook 'c-mode-common-hook
-          (lambda () (ggtags-mode 1)
-            (setq c-label-minimum-indentation 0)))
-
-;; specific to my unusual keybind setup, you may want to
-;; pick different keys
-(define-key ggtags-mode-map (kbd "C-M-o") 'ggtags-find-tag-dwim)
-(define-key ggtags-mode-map (kbd "C-M-m") 'ggtags-grep)
-
-(defun gtags-update-single(filename)
-  "Update Gtags database for changes in a single file"
-  (interactive)
-  (start-process "update-gtags" "update-gtags" "bash" "-c" (concat "cd " ggtags-project-root " ; gtags --single-update " filename )))
-
-(defun gtags-update-current-file()
-  (interactive)
-  (let ((rel-filename (replace-regexp-in-string
-                       ggtags-project-root "."
-                       (buffer-file-name (current-buffer)))))
-    (gtags-update-single rel-filename)))
-
-(defun gtags-update-hook()
-  "Update GTAGS file incrementally upon saving a file"
-  (when (and ggtags-mode ggtags-project-root)
-    (gtags-update-current-file)))
-
-(add-hook 'after-save-hook 'gtags-update-hook)
-
-;; i'd like to make some elisp which modifies a keymap to remove
-;; all binds which don't match a predicate.
-;; I tried setting a keymap to a new keymap,
-;; but that didn't register as functional.
-;; so I'd need to modify the list in place.
-
-(require 'magit)
-
-
-;; colorize hex colors: use rainbow mode
-
-
 ;; message mode prompted me on first message.
 ;; a function which describes options then sets this
 ;; the other options were to use smtp directly or pass to another mail client
 ;; here we use the standard sendmail interface, which I use postfix for
 (setq send-mail-function (quote sendmail-send-it))
 
-(require 'spray)
-(global-set-key (kbd "C-M-w") 'spray-mode)
-;; remember, h/l = move. f/s = faster/slower, space = pause, all others quit
-
 ;; delete active selection with self-insert commands
 (delete-selection-mode t)
 
 ;; Transparently open compressed files
 (auto-compression-mode t)
 
-;; Highlight matching parenthesesq when the pointq is on them.
-;; not needed since smart paren mode?
-;;  (show-paren-mode 1)
-
-
 ;; not documented, but looking at the source, I find this
 ;; stops me from being asked what command on every C-c-c
 ;; when doing a latex document.
@@ -1469,41 +1081,19 @@ https://fsf.org | https://gnu.org
 (require 'dot-mode)
 (add-hook 'find-file-hooks 'dot-mode-on)
 
-
 ;; clean up obsolete buffers automatically at midnight
 (require 'midnight)
 
-
-;; disabled because it takes 400ms on startup
-;; ;; emacs regexes are too limited.
-;; (require 'foreign-regexp)
-;; ;; perl is most powerful, but javascript is pretty close and
-;; ;; I'd rather know javascript stuff than perl
-;; (custom-set-variables
-;;  '(foreign-regexp/regexp-type 'javascript) ;; Choose by your preference.
-;;  '(reb-re-syntax 'foreign-regexp)) ;; Tell re-builder to use foreign regexp.
-;; ;; it would be nice to add documentation to do this for more commands to that package
-;; ;; disabled because it's too slow. but I'd still m-x it for advanced replacements
-;; ;;(define-key global-map [remap isearch-forward-regexp] 'foreign-regexp/isearch-forward)
-
-
 ;; saner regex syntax
 (require 're-builder)
 (setq reb-re-syntax 'string)
 
 
-;; use shift + arrow keys to switch between visible buffers
-;; todo, set these keys to something else
-(require 'windmove)
-(windmove-default-keybindings)
-
-
 ;; show the name of the current function definition in the modeline
-(require 'which-func)
+;;(require 'which-func)
 (setq which-func-modes t)
 (which-function-mode 1)
 
-
 ;; enable winner-mode to manage window configurations
 (winner-mode +1)
 
@@ -1546,24 +1136,14 @@ https://fsf.org | https://gnu.org
 (temp-buffer-resize-mode 1)
 
 
-(require 'info+)
-;; based on suggestions in info+.el, I also installed  misc-fns, strings, and thingatpt+
-;; remove some bad keybinds from info+
-(define-key Info-mode-map [mouse-4]         nil)
-(define-key Info-mode-map [mouse-5]         nil)
-
+(defun my-info-init()
+  (require 'info+)
+  ;; based on suggestions in info+.el, I also installed  misc-fns, strings, and thingatpt+
+  ;; remove some bad keybinds from info+
+  (define-key Info-mode-map [mouse-4]         nil)
+  (define-key Info-mode-map [mouse-5]         nil))
 
-(require 'smooth-scroll)
-;; long gnus summary buffers lags too much with this,
-;; but I like it enough to leave it enabled by default
-;; and crank up the step size to be faster
-;; and it doesn't have a way to enable it only for certain modes etc.
-;; todo sometime, make it work for certain modes only
-(smooth-scroll-mode t)
-;; its too slow with the default of 2
-(setq smooth-scroll/vscroll-step-size 7)
-;; sublimity doesn't work as good going fast by default
-;; smooth-scrolling.el, does not do smooth scrolling. its about cursor location
+(add-hook 'info-mode-hook 'my-info-init)
 
 
 (setq sh-here-document-word "'EOF'")
@@ -1571,26 +1151,35 @@ https://fsf.org | https://gnu.org
 (setq tramp-default-method "ssh")
 ;;; misc general settings
 
+;; from tramp manual, use the same ssh controlmaster. I was having problems with
+;; tramp prompting me for a username and pass.
+(customize-set-variable 'tramp-use-ssh-controlmaster-options nil)
+
+(setq
+ auto-revert-interval 2
+ ;; fix eof end of file newline
+ mode-require-final-newline t
+ require-final-newline t
+ auto-revert-verbose nil
+ auto-revert-remote-files t
+ ;; save bookmarks whenever they are changed instead of just when emacs quits
+ bookmark-save-flag 1
+ ;; increase bookmark context size for better functionality
+ bookmark-search-size 2000
+ ;; https://www.emacswiki.org/emacs/FillParagraph
+ ;; make list items start paragraphs.
+ paragraph-start "\f\\|[ \t]*$\\|[ \t]*[-+*] "
+ sh-basic-offset 2
+ vc-follow-symlinks t
+ )
+
 (ivy-mode 1)
 (add-hook 'text-mode-hook (lambda () (auto-fill-mode t)))
 (setq counsel-find-file-at-point t)
 
-;; easier to read with just spaces as separator
-(setf (nth 2 ido-decorations) "   ")
-
-
-;; https://www.emacswiki.org/emacs/FillParagraph
-;; make list items start paragraphs.
-(setq paragraph-start "\f\\|[ \t]*$\\|[ \t]*[-+*] ")
-
-(setq sh-basic-offset 2)
-(setq vc-follow-symlinks t)
-
-;; give us a shell to start instead of scratch
-;;(setq initial-buffer-choice (lambda () (new-shell)))
-
-;; disable this nasty function, as I always use a gui
-(defun suspend-frame() (interactive))
+(eval-after-load "ido"
+  ;; easier to read with just spaces as separator
+  (quote (setf (nth 2 ido-decorations) "   ")))
 
 ;; Seed the random-number generator
 (random t)
@@ -1598,6 +1187,14 @@ https://fsf.org | https://gnu.org
 ;; easier to remember than keybinds
 (defalias 'scrypt 'mml-secure-message-encrypt-pgpmime)
 (defalias 'sign 'mml-secure-message-sign-pgpmime)
+;; otherwise we get error on sending:
+;; mml-secure-epg-sign: Couldn’t find any signer names; try setting `mml-secure-smime-sign-with-sender'.
+;; i dunno why sign+encrypt doesnt cause this, seems kinda dumb,
+;;
+(setq mml-secure-openpgp-sign-with-sender t)
+;; i dun use smime, the smime signing fails complaining it doesnt have
+;; my key. todo: learn about smime
+(setq mml-secure-smime-sign-with-sender t)
 (defun encrypt ()
   (interactive)
   (mml-secure-message-encrypt-pgpmime 'dontsign))
@@ -1656,6 +1253,18 @@ https://fsf.org | https://gnu.org
               imenu-auto-rescan t
               indicate-empty-lines t) ; mark end of buffer
 
+(require 'smooth-scroll)
+;; long gnus summary buffers lags too much with this,
+;; but I like it enough to leave it enabled by default
+;; and crank up the step size to be faster
+;; and it doesn't have a way to enable it only for certain modes etc.
+;; todo sometime, make it work for certain modes only
+(smooth-scroll-mode t)
+;; its too slow with the default of 2
+(setq smooth-scroll/vscroll-step-size 6)
+;; sublimity doesn't work as good going fast by default
+;; smooth-scrolling.el, does not do smooth scrolling. its about cursor location
+
 
 (blink-cursor-mode '(-4))
 (menu-bar-mode -1)
@@ -1683,7 +1292,6 @@ https://fsf.org | https://gnu.org
       inhibit-startup-message t
       inhibit-startup-echo-area-message t
       inhibit-startup-screen t
-      compilation-read-command nil ;; just don't compile with unsafe file local vars
       kill-buffer-query-functions (remq 'process-kill-buffer-query-function
                                         kill-buffer-query-functions))
 
@@ -1819,10 +1427,10 @@ Go to the next directory based on where the cursor is."
 ;; make window title be the buffer name
 (setq frame-title-format "%b")
 
-                                        ; -----------------------------
-                                        ; fixing up the mode line
-                                        ; modified from mastering emacs blog
-                                        ; ----------------------------
+;; -----------------------------
+;; fixing up the mode line
+;; modified from mastering emacs blog
+;; ----------------------------
 
 (defvar mode-line-cleaner-alist
   `((auto-complete-mode . "")
@@ -1836,6 +1444,7 @@ Go to the next directory based on where the cursor is."
     (dot-mode . "")
     (yas-global-mode . "")
     (yas-minor-mode . "")
+    (undo-tree-mode . "")
     (volatile-highlights-mode . "")
     (highlight-symbol-mode . "")
     ;; Major modes
@@ -1867,8 +1476,8 @@ Go to the next directory based on where the cursor is."
                                         ;  (add-hook 'after-change-major-mode-hook 'clean-mode-line)
 
 
-  ;;; alias the new `flymake-report-status-slim' to
-  ;;; `flymake-report-status'
+;; alias the new `flymake-report-status-slim' to
+;; `flymake-report-status'
 (defalias 'flymake-report-status 'flymake-report-status-slim)
 (defun flymake-report-status-slim (e-w &optional status)
   "Show \"slim\" flymake status in mode line."
@@ -1905,14 +1514,6 @@ Go to the next directory based on where the cursor is."
          (y (cdr pos)))
     (set-mouse-position (selected-frame) x y)))
 
-;;;; keybinds for wow mouse
-
-(global-set-key (kbd "<mouse-6>") 'move-mouse-to-point)
-(global-set-key (kbd "<kp-left>") 'indent-region)
-(global-set-key (kbd "<kp-begin>") 'mark-defun)
-(global-set-key (kbd "<kp-right>") 'ibuffer)
-(global-set-key (kbd "<kp-prior>") 'delete-horizontal-space)
-
 ;;; org mode
 
 ;; todo work on org-cycle-emulate-tab
@@ -1958,6 +1559,8 @@ Go to the next directory based on where the cursor is."
       org-extend-today-until 0
       org-startup-truncated nil
       org-clock-persist t
+      org-use-sub-superscripts "{}"
+      org-export-with-sub-superscripts nil
       org-clock-mode-line-total 'today
       ;; global STYLE property values for completion
       org-global-properties (quote (("STYLE_ALL" . "habit")))
@@ -1965,12 +1568,8 @@ Go to the next directory based on where the cursor is."
       org-completion-use-ido t
       org-catch-invisible-edits 'smart)
 
-;; non universally recommended settings
 (setq
- org-default-notes-file (concat org-directory "/a/t.org")
- org-agenda-files (quote ("/a/t.org"))
- org-mobile-directory "/p/org-mobile"
- org-mobile-inbox-for-pull "/p/from-mobile.org"
+ org-default-notes-file "/a/t.org"
  org-directory "/p")
 
 ;; modeilne populated from (org-clock-get-clocked-time)
@@ -1978,17 +1577,15 @@ Go to the next directory based on where the cursor is."
 ;; which is populated by a function which starts from (org-clock-get-sum-start)
 ;;
 
-(org-clock-persistence-insinuate)
-
+(eval-after-load "org"
+  '(org-clock-persistence-insinuate))
 
 (defun time-to-org-day (time)
   (round (time-to-number-of-days
           (time-subtract time (list 0 (* 3600 org-extend-today-until) 0)))))
 
-
 (defun my-org-confirm-babel-evaluate (lang body)
   (not (or (string= (buffer-file-name) "/a/t.org")
-           (string= (buffer-file-name) "/home/iank/.emacs.d/my-init.org")
            )))
 (setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate)
 
@@ -1998,22 +1595,6 @@ Go to the next directory based on where the cursor is."
   ;; '(4) is the argument passed by universal prefix
   (org-time-stamp (if arg arg '(4)) t))
 
-(defun ian-org-work-time ()
-  (interactive)
-  (save-excursion
-    (set-buffer "t.org")
-    (goto-char (org-find-entry-with-id "ian-identifier-1"))
-    (org-clock-in)))
-
-(defun ian-org-idle-time ()
-  (interactive)
-  (save-excursion
-    (goto-char (org-find-entry-with-id "ian-identifier-2"))
-    (set-buffer "t.org")
-    (org-clock-in)))
-
-
-
 ;; based on http://stackoverflow.com/questions/3758139/variable-pitch-for-org-mode-fixed-pitch-for-tables
 ;; keywords: proportional font, monospace
 
@@ -2026,14 +1607,16 @@ Go to the next directory based on where the cursor is."
   (variable-pitch-mode 0))
 (add-hook 'yaml-mode-hook 'variable-pitch-off)
 
+(eval-after-load "org" '(my-org-face-init))
 
-(set-face-attribute 'org-table nil :family (face-attribute 'fixed-pitch :family))
-(set-face-attribute 'org-code nil :family (face-attribute 'fixed-pitch :family))
-(set-face-attribute 'org-formula nil :family (face-attribute 'fixed-pitch :family))
-(set-face-attribute 'org-link nil :family (face-attribute 'fixed-pitch :family))
-(set-face-attribute 'org-block nil :family (face-attribute 'fixed-pitch :family))
-(set-face-attribute 'org-date nil :family (face-attribute 'fixed-pitch :family))
-
+(defun my-org-face-init()
+  (set-face-attribute 'org-table nil :family (face-attribute 'fixed-pitch :family))
+  (set-face-attribute 'org-code nil :family (face-attribute 'fixed-pitch :family))
+  (set-face-attribute 'org-formula nil :family (face-attribute 'fixed-pitch :family))
+  (set-face-attribute 'org-link nil :family (face-attribute 'fixed-pitch :family))
+  (set-face-attribute 'org-block nil :family (face-attribute 'fixed-pitch :family))
+  (set-face-attribute 'org-date nil :family (face-attribute 'fixed-pitch :family))
+  )
 
 (defun remove-org-binds ()
   (define-key org-mode-map (kbd "<M-return>") nil)
@@ -2069,7 +1652,8 @@ Go to the next directory based on where the cursor is."
 (defun prog-mode-defaults ()
   "Default coding hook, useful with any programming language."
   ;; so that I can do completion before the dialog pops up
-  (local-set-key (kbd "<tab>") 'auto-complete)
+  ;;(local-set-key (kbd "<tab>") 'auto-complete)
+  (local-set-key (kbd "TAB") 'auto-complete)
   ;; todo, this is causing error message on loading file, prolly not working
   ;;(flycheck-mode +1)
   (setq ac-sources (delq 'ac-source-dictionary ac-sources))
@@ -2092,7 +1676,6 @@ Go to the next directory based on where the cursor is."
 (add-hook 'prog-mode-hook 'flyspell-prog-mode)
 
 
-
 ;;; yank auto-indent
 ;; automatically indenting yanked text if in programming-modes
 (defvar yank-indent-modes
@@ -2134,6 +1717,12 @@ indent yanked text (with prefix arg don't indent)."
 
 
 ;;; shell mode
+
+
+;;  # eval: (outline-minor-mode)
+;; # outline-regexp: "\\( *\\)# [*]\\{1,8\\} "
+
+
 ;; avoid stupid git crap like "warning, terminal not fully functional"
 (setenv "PAGER" "cat")
 ;; don't store successive duplicates in comint command history
@@ -2189,10 +1778,10 @@ indent yanked text (with prefix arg don't indent)."
 ;; when opening a pair, and then inserting a newline, push the closing pair to another newline
 (sp-pair "{" nil :post-handlers
          '(:add ((lambda (id action context)
-                   (gp/sp/pair-on-newline-and-indent id action context)) (kbd "<return>"))))
+                   (gp/sp/pair-on-newline-and-indent id action context)) (kbd "RET"))))
 (sp-pair "[" nil :post-handlers
          '(:add ((lambda (id action context)
-                   (gp/sp/pair-on-newline-and-indent id action context)) (kbd "<return>"))))
+                   (gp/sp/pair-on-newline-and-indent id action context)) (kbd "RET"))))
 
 
 ;; in my version, this is not a pairing.
@@ -2207,7 +1796,9 @@ indent yanked text (with prefix arg don't indent)."
 
 ;; todo, testout these mode specific settings from graphene.
 ;; Ruby-specific pairs and handlers
-(require 'smartparens-ruby)
+
+(eval-after-load "ruby"
+  '(require 'smartparens-ruby))
 
 ;; Markdown
 (sp-local-pair '(markdown-mode gfm-mode) "*" "*"
@@ -2218,13 +1809,8 @@ indent yanked text (with prefix arg don't indent)."
 (sp-local-pair 'html-mode "\"" nil :unless '(:rem sp-point-after-word-p))
 
 
-;;; smex
-;;  todo; check out smex-show-unbound-commands shows frequently used commands that have no key bindings.
-                                        ; these must be before smex-initialize
-(setq
- smex-save-file "~/.emacs.d/.smex-items")
 
-(smex-initialize)
+
 ;;; spell correction
 (setq
  ispell-program-name "hunspell"
@@ -2287,15 +1873,22 @@ indent yanked text (with prefix arg don't indent)."
 ;; if I could define overlay faces to use inverse foreground color
 
 
-;;; zrc
-(require 'znc)
+;;; znc
+
 (setq erc-fill-prefix "")
 (defun chirp()
   (interactive)
   (setq vol 50)
-  (when (string= (system-name) "tp") (setq vol 40))
-  (start-process-shell-command "ignoreme" nil (format "mpv --no-terminal --vo=null --volume=%d /a/bin/data/bird.mp3" vol)))
+  (when (string= (system-name) "kd") (setq vol 80))
+  ;; speed is there so i can adjust and make it go slow so it plays long enough to adjust in pavucontrol
+  (start-process-shell-command "ignoreme" nil (format "mpv --speed=1 --no-terminal --vo=null --volume=%d /a/bin/data/bird.mp3" vol)))
 ;; from https://www.emacswiki.org/emacs/ErcSound
+(defun chirp-slow()
+  (interactive)
+  (setq vol 50)
+  (when (string= (system-name) "tp") (setq vol 80))
+  ;; speed is there so i can adjust and make it go slow so it plays long enough to adjust in pavucontrol
+  (start-process-shell-command "ignoreme" nil (format "mpv --speed=.2 --no-terminal --vo=null --volume=%d /a/bin/data/bird.mp3" vol)))
 
 (defun erc-my-privmsg-sound (proc parsed)
   (let* ((tgt (car (erc-response.command-args parsed)))
@@ -2313,12 +1906,17 @@ indent yanked text (with prefix arg don't indent)."
     (chirp)))
 (add-hook 'erc-text-matched-hook 'erc-sound-if-not-server)
 
-(erc-track-mode 1)
+(eval-after-load "erc"
+  '(erc-track-mode 1))
 (setq
  ;; consider invisible frames to be unseen. seems like an obvious default
  erc-track-visibility 'visible
  ;; switch to buffer where i've been mentioned, etc instead of oldest
- erc-track-switch-direction 'importance)
+ erc-track-switch-direction 'importance
+ ;; defaults minus fill. todo: modify the list instead of specifying it explicitly in case the defaults change
+ erc-modules
+ '(autojoin button completion irccontrols list match menu move-to-prompt netsplit networks noncommands readonly ring stamp track)
+ )
 
 
 ;;; named commands
@@ -2343,8 +1941,12 @@ indent yanked text (with prefix arg don't indent)."
 ;; worth the benefit of only having one concept in my mind.
 (dolist
     (r `(
-         (?i (file . ,"~/.emacs.d/my-init.org"))
+         (?i (file . ,"~/.emacs.d/init.el"))
+         (?o (file . ,"/a/work.org"))
          (?t (file . ,"/a/t.org"))
+         (?s (file . ,"/usr/share/doc/exim4-base/spec.txt.gz"))
+         (?w (file . ,"/p/w.org"))
+         (?k (file . ,"/a/bin/ds/Arduino/Model01-Firmware/Model01-Firmware.ino"))
          (?x (file . ,"/a/x.txt"))
          ))
   (set-register (car r) (cadr r)))
@@ -2353,9 +1955,32 @@ indent yanked text (with prefix arg don't indent)."
       undo-limit 500000000 ; undo history limit
       undo-strong-limit 600000000) ; undo history limit plus some extra
 
+
+;;; undo tree mode
+
+;; note, this has weird errors when it was before recentf-mode
+
+;; more resilient undo-tree-history if we have its location set up front.
+(setq undo-tree-history-directory-alist '(("." . "~/.undo-tree-history")))
+
+
+;; todo, send patch undo-tree-visualize should scroll with the scroll key, instead of just pgup pgdn (aka next/prior)
+(global-undo-tree-mode)
+;; disabled due to bug, something like unknown entry in undo tree canary
+;; (setq undo-tree-auto-save-history t)
+(setq undo-outer-limit 100000000 ; per undo command
+      undo-limit 500000000 ; undo history limit
+      undo-strong-limit 600000000) ; undo history limit plus some extra
+;; Undo in region just happens accidentally, and throws me off
+(setq undo-tree-enable-undo-in-region nil)
+
 ;;; keybinds
 
 ;;;; misc
+
+(define-prefix-command 'terminal-key-map)
+(global-set-key (kbd "\e[") 'terminal-key-map)
+
 (global-set-key (kbd "C-x C-b") 'ibuffer)
 
 
@@ -2388,13 +2013,13 @@ indent yanked text (with prefix arg don't indent)."
 
 ;;;; single/special keys
 ;;;;; tab - isearch
-(define-key isearch-mode-map (kbd "<tab>") 'isearch-query-replace)
+;; todo: this doesnt work. needs <tab>, which doesnt work in terminal. fix that.
+(define-key isearch-mode-map (kbd "TAB") 'isearch-query-replace)
 
 ;;;;; f12 - isearch-forward
 ;; explained in http://stackoverflow.com/questions/7411920/how-to-bind-search-and-search-repeat-to-c-f-in-emacs
 (global-set-key (kbd "<kp-add>") 'isearch-forward)
 (global-set-key (kbd "<f12>") 'isearch-forward)
-(define-key isearch-mode-map "\t" nil)
 (define-key isearch-mode-map (kbd "<kp-add>") 'isearch-repeat-forward)
 (define-key isearch-mode-map (kbd "<f12>") 'isearch-repeat-forward)
 ;; get rid of the standard completion binding, always use auto-complete
@@ -2442,7 +2067,10 @@ indent yanked text (with prefix arg don't indent)."
 (global-set-key (kbd "<home>") 'back-to-indentation-or-beginning)
 
 ;;;;; s-tab - indent-buffer
+;; graphical
 (global-set-key (kbd "<S-iso-lefttab>") 'indent-buffer)
+;; terminal
+(global-set-key (kbd "<backtab>") 'indent-buffer)
 ;;;;; s-delete - send-shell
 
 (global-set-key (kbd "<S-delete>") 'send-shell)
@@ -2626,11 +2254,12 @@ modes like org-mode which have their own yank function."
 ;; stop splitting windows verticallly when I open a buffer or shell
 (setq split-height-threshold nil)
 
-;;;;; s-left arrow - shell
-(global-set-key (kbd "<S-left>") 'shell-wrap)
-(add-hook 'org-mode-hook
-          (lambda ()
-            (define-key org-mode-map (kbd "<S-left>") nil)))
+;;;;; s-left arrow - ---
+;; cant be used in terminal
+;; When I had a binding, i did this so org-mode wouldnt clobber it
+;; (add-hook 'org-mode-hook
+;;           (lambda ()
+;;             (define-key org-mode-map (kbd "<S-left>") nil)))
 
 ;;;;; s-right arrow - keyboard-yank-primary
 (defun keyboard-yank-primary ()
@@ -2643,7 +2272,7 @@ modes like org-mode which have their own yank function."
           (lambda ()
             (define-key org-mode-map (kbd "<S-right>") nil)))
 ;;;;; esc
-                                        ; todo, test out if this can be used
+;; todo, test out if this can be used
 ;;;;; return - new line
 
 ;; todo, this doesn't set the keybind for the help minibuffer
@@ -2664,7 +2293,7 @@ modes like org-mode which have their own yank function."
 (add-hook 'comint-mode-hook
           (lambda ()
             (define-key comint-mode-map "\r" nil)
-            (define-key comint-mode-map (kbd "<return>") 'comint-send-input)))
+            (define-key comint-mode-map (kbd "RET") 'comint-send-input)))
 
 (add-hook 'comint-mode-hook
           (lambda ()
@@ -2676,7 +2305,7 @@ modes like org-mode which have their own yank function."
 ;; kp-enter is shift return in terminal
 (global-set-key (kbd "<kp-enter>") 'flyspell-auto-correct-previous-word)
 
-;;;;; s-down arrow - my-contract-region
+;;;;; s-up arrow - my-contract-region
 (global-set-key (kbd "<S-up>") 'my-contract-region)
 ;;;;; c-up/down move 8 lines
 
@@ -2735,16 +2364,6 @@ modes like org-mode which have their own yank function."
 
 ;;;; left primary
 
-;;;;; C-2 copy-symbol
-
-(global-unset-key (kbd "C-2"))
-(defun copy-symbol (&optional arg)
-  "Copy symbol at point into kill-ring"
-  (interactive "P")
-  (kill-new (thing-at-point 'symbol)))
-
-(global-set-key (kbd "C-2") 'copy-symbol)
-
 ;;;;; M-2 shell-cd-to-file
 
 
@@ -2758,13 +2377,18 @@ modes like org-mode which have their own yank function."
       (message "%s" "shell-cd-to-file: buffer has no file name"))))
 (global-set-key (kbd "M-2") 'shell-cd-to-file)
 
-;;;;; C-M-2 ---
-                                        ; todo. whats going on here?
+;;;;; C-M-2 copy-symbol
 (global-unset-key (kbd "C-M-2"))
+(defun copy-symbol (&optional arg)
+  "Copy symbol at point into kill-ring"
+  (interactive "P")
+  (kill-new (thing-at-point 'symbol)))
 
-;;;;; C-3 dot-mode-execute
+(global-set-key (kbd "C-M-2") 'copy-symbol)
 
-(global-set-key (kbd "C-3") 'dot-mode-execute)
+;;;;; M-3 dot-mode-execute
+
+(global-set-key (kbd "M-3") 'dot-mode-execute)
 
 ;;;;; C-M-3 recenter-top-bottom
 
@@ -2779,19 +2403,18 @@ modes like org-mode which have their own yank function."
 (add-hook 'comint-mode-hook
           (lambda () (define-key comint-mode-map (kbd "C-q") 'comint-insert-previous-argument)))
 
-;;;;; M-q org-archive-to-archive-sibling
-
-(global-set-key (kbd "M-q") 'org-archive-to-archive-sibling)
-
+;;;;; M-q ?? unused
 ;;;;; C-M-q quoted-insert
 
 (global-set-key (kbd "C-M-q") 'quoted-insert)
 
-;;;;; C-w ---
-;; in terminal, it's ctrl-backspace, duplicate keybind.
-;;;;; M-w org-clock-in
+;;;;; C-w counsel-find-file
+
+(global-set-key (kbd "C-w") 'counsel-find-file)
+
+;;;;; M-w shell
 
-(global-set-key (kbd "M-w") 'org-clock-in)
+(global-set-key (kbd "M-w") 'shell-wrap)
 
 ;;;;; C-e copy-line
 
@@ -2820,9 +2443,7 @@ modes like org-mode which have their own yank function."
 
 (global-set-key (kbd "C-e") 'copy-line)
 
-;;;;; M-e org-clock-in-last
-
-(global-set-key (kbd "M-e") 'org-clock-in-last)
+;;;;; M-e ?? unused
 
 ;;;;; C-r isearch-backward
 
@@ -2831,10 +2452,7 @@ modes like org-mode which have their own yank function."
           (lambda ()
             (define-key comint-mode-map (kbd "C-r") 'comint-history-isearch-backward-regexp)))
 
-;;;;; M-r org-clock-out
-
-(global-set-key (kbd "M-r") 'org-clock-out)
-
+;;;;; M-r ?? unused
 ;;;;; C-a copy buffer
 
 (defun copy-all ()
@@ -2844,55 +2462,60 @@ modes like org-mode which have their own yank function."
 (global-set-key (kbd "C-a") 'copy-all)
 
 ;;;;; C-s - c-x prefix
-  ; prefix key binds.
-  ; good info http://www.masteringemacs.org/articles/2011/02/08/mastering-key-bindings-emacs/
-  ; rebinding the prefix keys are tricky. apparently, some modes ignore any redefinition of a prefix key and use it explicitly,
-  ; so you have to dig into their key maps and redo things.
-  ; There are 2 simpler alternatives which have their own downsides.
-  ; One is cua mode, which I do not like because it smashes 2 keybinds onto 1 and limits what you can do.
-  ; The other is keyboard-translate, which translates the key presses before anything else.
-  ; The downside is that it translates them when you aren't using them as a prefix.
-  ; Since the swaps I'm using are all very accessible, the only downside is some mental jugling when reading docs etc about these keybinds.
-
-  ; I've seen this as an another suggestion, it was a total fail. The prefix command took over both keys.
-  ; (define-key key-translation-map [f12] "\C-c")
-  ; (define-key key-translation-map "\C-c" [left])
-
-
-  ;idea to remove the hook later since it is only needed at startup.
-  ; did not work however, and there is not a real need to fix it, so I did not investigate
-  ;(defun removeSwapHook ()
-  ;  (remove-hook 'buffer-list-update-hook 'myKeySwap)
-  ;  (remove-hook 'change-major-mode-hook 'removeSwapHook))
-  ;(add-hook 'change-major-mode-hook 'removeSwapHook)
-
-
-  ; went through almost all the relevant standard hooks,
-  ; this overcomes a known bug that (keyboard-translate) does not get applied when running emacs daemon
-  (add-hook 'buffer-list-update-hook (lambda () (interactive)
-                                       (keyboard-translate ?\C-x ?\C-s)
-                                       (keyboard-translate ?\C-s ?\C-x)
-                                       (keyboard-translate ?\C-c ?\C-d)
-                                       (keyboard-translate ?\C-d ?\C-c)))
-
-
-
-  ; these all don't work
-  ; don't know why this doesn't error but reversing the keys does
-  ;(keyboard-translate ?\t ?\M-\t)
-  ;(keyboard-translate [M-tab] [tab])
-  ; from what i can tell, it wants to use a keyboard-translate-table,
-  ; which is a char table, which is a vector indexed by chars,
-  ; and mod+tab is not a char (it has too many bits), it is an integer
-  ; it actually says it can hold vectors or strings, but that it is obsolete to do so
-  ;(characterp ?\M-a)
-  ;(characterp ?\C-a)
+;; prefix key binds.
+;; good info http://www.masteringemacs.org/articles/2011/02/08/mastering-key-bindings-emacs/
+;; rebinding the prefix keys are tricky. apparently, some modes ignore any redefinition of a prefix key and use it explicitly,
+;; so you have to dig into their key maps and redo things.
+;; There are 2 simpler alternatives which have their own downsides.
+;; One is cua mode, which I do not like because it smashes 2 keybinds onto 1 and limits what you can do.
+;; The other is keyboard-translate, which translates the key presses before anything else.
+;; The downside is that it translates them when you aren't using them as a prefix.
+;; Since the swaps I'm using are all very accessible, the only downside is some mental jugling when reading docs etc about these keybinds.
+
+;; I've seen this as an another suggestion, it was a total fail. The prefix command took over both keys.
+;; (define-key key-translation-map [f12] "\C-c")
+;; (define-key key-translation-map "\C-c" [left])
+
+
+;;idea to remove the hook later since it is only needed at startup.
+;; did not work however, and there is not a real need to fix it, so I did not investigate
+;;(defun removeSwapHook ()
+;;  (remove-hook 'buffer-list-update-hook 'myKeySwap)
+;;  (remove-hook 'change-major-mode-hook 'removeSwapHook))
+;;(add-hook 'change-major-mode-hook 'removeSwapHook)
+
+
+;; went through almost all the relevant standard hooks,
+;; this overcomes a known bug that (keyboard-translate) does not get applied when running emacs daemon
+(add-hook 'buffer-list-update-hook (lambda () (interactive)
+                                     (keyboard-translate ?\C-x ?\C-s)
+                                     (keyboard-translate ?\C-s ?\C-x)
+                                     (keyboard-translate ?\C-c ?\C-d)
+                                     (keyboard-translate ?\C-d ?\C-c)))
+
+
+
+;; these all don't work
+;; don't know why this doesn't error but reversing the keys does
+;;(keyboard-translate ?\t ?\M-\t)
+;;(keyboard-translate [M-tab] [tab])
+;; from what i can tell, it wants to use a keyboard-translate-table,
+;; which is a char table, which is a vector indexed by chars,
+;; and mod+tab is not a char (it has too many bits), it is an integer
+;; it actually says it can hold vectors or strings, but that it is obsolete to do so
+;;(characterp ?\M-a)
+;;(characterp ?\C-a)
 
 ;;;;; C-M-s - split-window-vertically
 
 (global-set-key (kbd "C-M-s") 'split-window-vertically)
 
 ;;;;; C-d - C-c prefix
+
+;;;;; M-d - run
+
+(global-set-key (kbd "M-d") 'run)
+
 ;;;;; C-M-d - swap buffer across windows
 ;; from http://www.emacswiki.org/emacs/TransposeWindows
 
@@ -2922,7 +2545,7 @@ modes like org-mode which have their own yank function."
 
 (global-set-key (kbd "C-M-d") 'swap-buffers-in-windows)
 
-;;;;; C-f] - kill-whole-line
+;;;;; C-f - kill-whole-line
 
 (global-set-key (kbd "C-f") 'kill-whole-line-wrapper)
 (defun kill-whole-line-wrapper (&optional arg)
@@ -2951,10 +2574,7 @@ modes like org-mode which have their own yank function."
             (define-key org-mode-map (kbd "C-M-f") 'org-kill-line)))
 
 (global-set-key (kbd "C-M-f") 'kill-line)
-;;;;; C-g - cancel / other window
-
-(global-set-key (kbd "C-g") 'other-window)
-
+;;;;; C-g - keyboard-quit
 ;;;;; M-g - abort-recursive-edit
 
 (global-set-key (kbd "M-g") 'abort-recursive-edit)
@@ -2964,16 +2584,27 @@ modes like org-mode which have their own yank function."
 (global-set-key (kbd "C-M-g") 'mu4e)
 
 ;;;;; C-z - undo-only
-
-(global-set-key (kbd "C-z") 'undo-only)
+(global-set-key (kbd "C-z") 'undo-tree-undo)
+;;;;; C-M-z - suspend-frame
+(global-set-key (kbd "C-M-z") 'suspend-frame)
+;; this is never good in a gui
+(when (window-system)
+  (defun suspend-frame() (interactive)))
 
 ;;;;; C-x - kill-region
 
 (global-set-key (kbd "C-s") 'kill-region)
 
-;;;;; M-x - smex
+;;;;; M-x - counsel-m-x
+
+
+;;  todo; check out smex-show-unbound-commands shows frequently used commands that have no key bindings.
+;; this must be before smex-initialize
+(setq
+ smex-save-file "~/.emacs.d/.smex-items")
 
-(global-set-key (kbd "M-x") 'smex)
+;; this uses smex
+(global-set-key (kbd "M-x") 'counsel-M-x)
 
 ;;;;; C-M-x - cut-to-register
 
@@ -3003,9 +2634,9 @@ modes like org-mode which have their own yank function."
             (define-key c-mode-base-map (kbd "<deletechar>") 'c-electric-delete-forward)))
 
 
-;;;;; M-c - org-capture
+;;;;; M-c - delete-other-windows
 
-(define-key global-map "\M-c" 'org-capture)
+(define-key global-map "\M-c" 'delete-other-windows)
 
 ;;;;; C-M-c - copy-to-register
 
@@ -3042,9 +2673,9 @@ modes like org-mode which have their own yank function."
 
 (global-set-key (kbd "C-M-v") 'yank-pop)
 
-;;;;; C-b - delete-other-windows
+;;;;; C-b - other-window
 
-(global-set-key (kbd "C-b") 'delete-other-windows)
+(global-set-key (kbd "C-b") 'other-window)
 
 ;;;;; M-b - isearch-backward-current-symbol
 
@@ -3103,10 +2734,13 @@ modes like org-mode which have their own yank function."
 ;;;;; C-right-arrow - forward-symbol
 ;;;;; C-M-right-arrow - org-shiftdown
 (add-hook 'org-mode-hook
-(lambda () (define-key org-mode-map (kbd "C-M-)") 'org-shiftdown)))
+          (lambda () (define-key org-mode-map (kbd "C-M-)") 'org-shiftdown)))
 
 ;;;;; C-backspace - backward-kill-symbol
 
+(define-key terminal-key-map (kbd "4b") 'backward-kill-symbol) ;c-backspace in my konsole
+
+;; c-w is duplicate in terminal
 (global-set-key (kbd "<C-backspace>") 'backward-kill-symbol)
 (add-hook 'comint-mode-hook
           (lambda ()
@@ -3120,17 +2754,9 @@ modes like org-mode which have their own yank function."
 (global-set-key (kbd "<C-M-backspace>") 'backward-kill-sexp)
 
 ;;;; right primary
-;;;;; C-* - split-window-horizontally
-
-(global-set-key (kbd "C-*") 'split-window-horizontally)
-
-;;;;; C-M-* - calc-dispatch
-
-(global-set-key (kbd "C-M-*") 'calc-dispatch)
-
-;;;;; C-9 - delete-window-or-exit
+;;;;; M-8 - delete-window-or-exit
 
-(global-set-key (kbd "C-9") 'delete-window-or-exit)
+(global-set-key (kbd "M-8") 'delete-window-or-exit)
 
 (defun delete-window-or-exit ()
   "Delete window or exit emacs."
@@ -3140,6 +2766,12 @@ modes like org-mode which have their own yank function."
           (progn (basic-save-buffer) (delete-frame))
         (save-buffers-kill-terminal t))))
 
+;;;;; C-* - split-window-horizontally
+(global-set-key (kbd "C-*") 'split-window-horizontally)
+;;;;; C-M-* - calc-dispatch
+
+(global-set-key (kbd "C-M-*") 'calc-dispatch)
+
 ;;;;; M-9 - kill-buffer
 
 (defun kill-buffer-no-ido ()
@@ -3157,297 +2789,283 @@ modes like org-mode which have their own yank function."
 ;;  save & kill buffer if it was opened externally via emacsclient
 
 
-  (defun server-edit-save ()
-    (interactive)
-    (save-buffer)
-    (server-edit))
-  (global-set-key (kbd "C-M-9") 'server-edit-save)
+(defun server-edit-save ()
+  (interactive)
+  (save-buffer)
+  (server-edit))
+(global-set-key (kbd "C-M-9") 'server-edit-save)
 
 ;;;;; C-u - universal-argument
 ;;;;; C-M-u - search-keybind
 
-  (global-set-key (kbd "C-M-u") 'search-keybind)
+(global-set-key (kbd "C-M-u") 'search-keybind)
 
-  (defun search-keybind (regexp &optional nlines)
-    (interactive (occur-read-primary-args))
-    (save-excursion
-      (describe-bindings)
-      (set-buffer "*Help*")
-      (occur regexp)
-      (delete-windows-on "*Help*")
-      ))
+(defun search-keybind (regexp &optional nlines)
+  (interactive (occur-read-primary-args))
+  (save-excursion
+    (describe-bindings)
+    (set-buffer "*Help*")
+    (occur regexp)
+    (delete-windows-on "*Help*")
+    ))
+
+;;;;; C-i -
+;; todo: try making use
+;; this is the key in terminal
+;;M-[ 4 d is undefined
+
+;; previously had this for enhancing graphical keybinds,
+;; but afaik its no help since i want terminal to work
+;; the same.
+;;  (define-key input-decode-map [?\C-i] [C-i])
 
-;;;;; C-i - -----
 ;;;;; C-M-i - query-replace-regexp
 
-  (global-set-key (kbd "C-M-i") 'query-replace-regexp)
-  (add-hook 'flyspell-mode-hook
-            (lambda () (define-key flyspell-mode-map (kbd "C-M-i") nil)))
-  (add-hook 'text-mode-hook
-            (lambda () (define-key text-mode-map (kbd "C-M-i") nil)))
+(global-set-key (kbd "C-M-i") 'query-replace-regexp)
+(add-hook 'flyspell-mode-hook
+          (lambda () (define-key flyspell-mode-map (kbd "C-M-i") nil)))
+(add-hook 'text-mode-hook
+          (lambda () (define-key text-mode-map (kbd "C-M-i") nil)))
 
 
 ;;;;; C-o - occur
 
-  (global-set-key (kbd "C-o") 'occur)
+(global-set-key (kbd "C-o") 'occur)
 
 ;;;;; C-M-o - counsel-imenu
 
-  (global-set-key (kbd "C-M-o") 'counsel-imenu)
+(global-set-key (kbd "C-M-o") 'counsel-imenu)
 
 ;;;;; C-p - move-mouse-to-point
 
-  (global-set-key (kbd "C-p") 'move-mouse-to-point)
+(global-set-key (kbd "C-p") 'move-mouse-to-point)
 
 ;;;;; C-M-p - delete-horizontal-space
 
-  (global-set-key (kbd "C-M-p") 'delete-horizontal-space)
+(global-set-key (kbd "C-M-p") 'delete-horizontal-space)
 
 ;;;;; C-j - pop-to-mark
 
-  (defun my-pop-to-mark-command ()
-    "Jump to mark, and pop a new position for mark off the ring.
+(defun my-pop-to-mark-command ()
+  "Jump to mark, and pop a new position for mark off the ring.
                      \(Does not affect global mark ring\)."
-    (interactive)
-    (pop-to-mark-command)
-    (if (and (derived-mode-p 'org-mode) (outline-invisible-p))
-        (org-show-context 'mark-goto)))
-
-  (global-set-key (kbd "C-j") 'my-pop-to-mark-command)
-  (define-key ido-common-completion-map (kbd "C-j") 'ido-select-text)
-  (add-hook 'ido-setup-hook
-            (lambda () (define-key ido-common-completion-map (kbd "C-j") 'ido-select-text)))
-  (add-hook 'lisp-interaction-mode-hook
-            (lambda ()
-              (define-key lisp-interaction-mode-map (kbd "C-j") nil)))
+  (interactive)
+  (pop-to-mark-command)
+  (if (and (derived-mode-p 'org-mode) (outline-invisible-p))
+      (org-show-context 'mark-goto)))
+
+(global-set-key (kbd "C-j") 'my-pop-to-mark-command)
+(add-hook 'ido-setup-hook
+          (lambda ()
+            (define-key ido-common-completion-map (kbd "C-j") 'ido-select-text)
+            ))
+(add-hook 'lisp-interaction-mode-hook
+          (lambda ()
+            (define-key lisp-interaction-mode-map (kbd "C-j") nil)))
 
 
 ;;;;; M-j - previous-error
 
-  (global-set-key (kbd "M-j") 'previous-error)
+(global-set-key (kbd "M-j") 'previous-error)
 
 ;;;;; C-M-j - register prefix
 
-  (define-key global-map (kbd "C-M-j") ctl-x-r-map)
-  (define-key ctl-x-r-map "m" 'kmacro-to-register)
+(define-key global-map (kbd "C-M-j") ctl-x-r-map)
+(define-key ctl-x-r-map "m" 'kmacro-to-register)
 
 
 ;;;;; C-k - jump-to-register
 
 
-  (global-set-key (kbd "C-k") 'jump-to-register)
+(global-set-key (kbd "C-k") 'jump-to-register)
 
 ;;;;; M-k - next-error
 
-  (global-set-key (kbd "M-k") 'next-error)
+(global-set-key (kbd "M-k") 'next-error)
 
 ;;;;; C-M-k - man
 
-  (global-set-key (kbd "C-M-k") 'man)
+(global-set-key (kbd "C-M-k") 'man)
 
 ;;;;; C-l - ivy-switch-buffer
 
-  (global-set-key (kbd "C-l") 'ivy-switch-buffer)
+(global-set-key (kbd "C-l") 'ivy-switch-buffer)
 
 ;;;;; C-M-l - move cursor top bottom mid, comint clear screen
 
-  (global-set-key (kbd "C-M-l") 'move-to-window-line-top-bottom)
+(global-set-key (kbd "C-M-l") 'move-to-window-line-top-bottom)
 
 ;;;;; C-; - used in flyspell, not sure what for, otherwise unbound
 ;;;;; M-; - comment-dwim
 ;;;;; C-M-; - comment-current-line-dwim
 
-  (defun comment-current-line-dwim ()
-    "Comment or uncomment the current line."
-    (interactive)
-    (save-excursion
-      (push-mark (beginning-of-line) t t)
-      (end-of-line)
-      (comment-dwim nil))
-    (move-beginning-of-line 2))
-  (global-set-key (kbd "C-M-;") 'comment-current-line-dwim)
-
+(defun comment-current-line-dwim ()
+  "Comment or uncomment the current line."
+  (interactive)
+  (save-excursion
+    (push-mark (beginning-of-line) t t)
+    (end-of-line)
+    (comment-dwim nil))
+  (move-beginning-of-line 2))
+(global-set-key (kbd "C-M-;") 'comment-current-line-dwim)
+
+;;;;; C-m - ---
+;; terminal/console needs this. otherwise, we could do this
+;; to make C-m be a valid key in graphical mode.
+;;  (define-key input-decode-map [?\C-m] [C-m])
 ;;;;; C-M-m - recursive grep
 
-  (define-key global-map (kbd "C-M-m") 'rgrep)
+(define-key global-map (kbd "C-M-m") 'rgrep)
 
-;;;;; C-, - ounsel-find-file
+;;;;; C-, - ---
+;; not recognized by terminal, can't get konsole keydef file to recognize comma,
+;; todo: dig into konsole sources, or try newer version than t8
 
-  (global-set-key (kbd "C-,") 'counsel-find-file)
-  (add-hook 'flyspell-mode-hook
-            (lambda () (define-key flyspell-mode-map (kbd "C-,") nil)))
+(add-hook 'flyspell-mode-hook
+          (lambda () (define-key flyspell-mode-map (kbd "C-,") nil)))
 
 ;;;;; C-M-, - ind-file-in-project
 
-  (global-set-key (kbd "C-M-,") 'find-file-in-project)
+(global-set-key (kbd "C-M-,") 'find-file-in-project)
 
 ;;;;; C-. - find recent file
-;;  Taken from starter kit.
-
-  (defun recentf-ido-find-file ()
-    "Find a recent file using Ido."
-    (interactive)
-    (let* ((file-assoc-list
-            (mapcar (lambda (x)
-                      (cons (file-name-nondirectory x)
-                            x))
-                    recentf-list))
-           (filename-list
-            (remove-duplicates (mapcar #'car file-assoc-list)
-                               :test #'string=))
-           (filename (ido-completing-read "Choose recent file: "
-                                          filename-list
-                                          nil
-                                          t)))
-      (when filename
-        (find-file (cdr (assoc filename
-                               file-assoc-list))))))
-
-  (add-hook 'flyspell-mode-hook
-            (lambda () (define-key flyspell-mode-map (kbd "C-.") nil)))
-  (define-key dot-mode-map (kbd "C-.") nil)
-  (global-set-key (kbd "C-.") 'recentf-ido-find-file)
-  (add-hook 'php-mode-hook
-            (lambda () (define-key php-mode-map (kbd "C-.") nil)))
+
+(add-hook 'flyspell-mode-hook
+          (lambda () (define-key flyspell-mode-map (kbd "C-.") nil)))
+(define-key dot-mode-map (kbd "C-.") nil)
+(define-key terminal-key-map (kbd "4c") 'counsel-recentf)
+(global-set-key (kbd "C-.") 'counsel-recentf)
+(add-hook 'php-mode-hook
+          (lambda () (define-key php-mode-map (kbd "C-.") nil)))
 
 ;;;;; C-M-. - -
 
-  (define-key dot-mode-map (kbd "C-M-.") nil)
-  ;;  (global-set-key (kbd "C-M-.") 'execute-extended-command)
+(define-key dot-mode-map (kbd "C-M-.") nil)
+;;  (global-set-key (kbd "C-M-.") 'execute-extended-command)
 
 ;;;;; C-/ - join lines
 
-  (defun vim-style-join-line ()
-    (interactive)
-    (join-line '(4)))
-  (global-set-key (kbd "C-/") 'vim-style-join-line)
+(defun vim-style-join-line ()
+  (interactive)
+  (join-line '(4)))
+(global-set-key (kbd "C-/") 'vim-style-join-line)
+(define-key undo-tree-map (kbd "C-/") nil)
 
 ;;;;; C-M-/ - copy-buffer-file-name
 
-  ;; haven't bound this atm, todo, maybe someday?
-  (defun copy-variable (variable)
-    (interactive
-     (let ((v (variable-at-point))
-          (enable-recursive-minibuffers t)
-          val)
-       (setq val (completing-read (if (symbolp v)
-                                     (format
-                                      "Describe variable (default %s): " v)
-                                   "Describe variable: ")
-                                 obarray
-                                 (lambda (vv)
-                                    (or (get vv 'variable-documentation)
-                                        (and (boundp vv) (not (keywordp vv)))))
-                                 t nil nil
-                                 (if (symbolp v) (symbol-name v))))
-       (list (if (equal val "")
-                v (intern val)))))
-    (kill-new (symbol-value variable)))
-
-  (defun copy-buffer-file-name ()
-    (interactive)
-    (let ((name (cond
-                 ((derived-mode-p 'mu4e-view-mode) (mu4e-message-field-at-point :path))
-                 (t buffer-file-name))
-                ))
-      (kill-new name)
-      (message name)))
-
-
-  (global-set-key (kbd "C-M-/") 'copy-buffer-file-name)
+;; haven't bound this atm, todo, maybe someday?
+(defun copy-variable (variable)
+  (interactive
+   (let ((v (variable-at-point))
+        (enable-recursive-minibuffers t)
+        val)
+     (setq val (completing-read (if (symbolp v)
+                                   (format
+                                    "Describe variable (default %s): " v)
+                                 "Describe variable: ")
+                               obarray
+                               (lambda (vv)
+                                  (or (get vv 'variable-documentation)
+                                      (and (boundp vv) (not (keywordp vv)))))
+                               t nil nil
+                               (if (symbolp v) (symbol-name v))))
+     (list (if (equal val "")
+              v (intern val)))))
+  (kill-new (symbol-value variable)))
+
+(defun copy-buffer-file-name ()
+  (interactive)
+  (let ((name (cond
+               ((derived-mode-p 'mu4e-view-mode) (mu4e-message-field-at-point :path))
+               (t buffer-file-name))
+              ))
+    (kill-new name)
+    (message name)))
 
 
+(global-set-key (kbd "C-M-/") 'copy-buffer-file-name)
 
-;;;;; C-8 - calc-embedded-word
 
-  (global-set-key (kbd "C-8") 'calc-embedded-word)
 
 ;;;;; C-up-arrow - org prev headline
 
-  ;; disabled just because i don't want to accidentally hit it
-  (define-key global-map "\C-_" nil)
-  (global-set-key (kbd "<C-_>") 'beginning-of-defun)
+;; disabled just because i don't want to accidentally hit it
+(define-key global-map "\C-_" nil)
+(global-set-key (kbd "<C-_>") 'beginning-of-defun)
 
-  (add-hook 'org-mode-hook
-            (lambda ()
-              (define-key org-mode-map (kbd "\C-_") 'outline-previous-visible-heading)))
+(add-hook 'org-mode-hook
+          (lambda ()
+            (define-key org-mode-map (kbd "\C-_") 'outline-previous-visible-heading)))
 
 
 
 
 ;;;;; C-S-up-arrow - winner undo
 
-  (global-set-key (kbd "<C-S-_>") 'winner-undo)
+(global-set-key (kbd "<C-S-_>") 'winner-undo)
 
 ;;;;; C-down-arrow - org next headline
 
-  (global-set-key (kbd "<C-kp-enter>") 'end-of-defun)
+(global-set-key (kbd "<C-kp-enter>") 'end-of-defun)
 
-  (add-hook 'org-mode-hook
-            (lambda ()
-              (define-key org-mode-map (kbd "<C-kp-enter>") 'outline-next-visible-heading)))
+(add-hook 'org-mode-hook
+          (lambda ()
+            (define-key org-mode-map (kbd "<C-kp-enter>") 'outline-next-visible-heading)))
 
 
 
 
 ;;;;; C-M-down-arrow - toggle-mark-activation
 
-  (defun toggle-mark-activation ()
-    (interactive)
-    (if mark-active
-        (deactivate-mark t)
-      (activate-mark)))
+(defun toggle-mark-activation ()
+  (interactive)
+  (if mark-active
+      (deactivate-mark t)
+    (activate-mark)))
 
-  (global-set-key (kbd "<C-M-kp-enter>") 'toggle-mark-activation)
+(global-set-key (kbd "<C-M-kp-enter>") 'toggle-mark-activation)
 
 ;;;;; C-S-down-arrow  winner redo
 
-  (global-set-key (kbd "<C-S-kp-enter>") 'winner-redo)
+(global-set-key (kbd "<C-S-kp-enter>") 'winner-redo)
 
 
 ;;;;; C-S-down-arrow - m-x for major mode
 
-  (global-set-key (kbd "<C-S-kp-enter>") 'smex-major-mode-commands)
+;; todo, update this for ivy
+(global-set-key (kbd "<C-S-kp-enter>") 'smex-major-mode-commands)
 
 ;;;;; C-lbracket - ----
 ;;;;; C-M-lbracket - scroll-right
 
-  (global-set-key (kbd "C-M-[") 'scroll-right)
+(global-set-key (kbd "C-M-[") 'scroll-right)
 
 ;;;;; C-rbracket - fill-paragraph
 
-  (global-set-key (kbd "C-]") 'fill-paragraph)
+(global-set-key (kbd "C-]") 'fill-paragraph)
 
 ;;;;; C-M-rbracket - scroll-left
 
-  (global-set-key (kbd "C-M-]") 'scroll-left)
+(global-set-key (kbd "C-M-]") 'scroll-left)
 
 ;;;;; C-return - newline-anywhere
 
-  (defun newline-anywhere ()
-    "Add a newline from anywhere in the line."
-    (interactive)
-    (end-of-line)
-    (newline-and-indent))
-  (global-set-key (kbd "<C-return>") 'newline-anywhere)
+(defun newline-anywhere ()
+  "Add a newline from anywhere in the line."
+  (interactive)
+  (end-of-line)
+  (newline-and-indent))
+;; todo use alternate keybind make this work for terminal
+(global-set-key (kbd "<C-return>") 'newline-anywhere)
 
 
 ;;;;; M-return - plain newline
 
-  (defun plain-newline ()
-    (interactive)
-    (insert "\n"))
-  (global-set-key (kbd "<M-return>") 'plain-newline)
-
-
-;;;;; C-M-return - newline-anywhere-previous
-(defun newline-anywhere-previous ()
-  "Add a newline from anywhere in the line."
+(defun plain-newline ()
   (interactive)
-  (forward-line -1)
-  (end-of-line)
-  (newline-and-indent))
-(global-set-key (kbd "<C-M-return>") 'newline-anywhere-previous)
+  (insert "\n"))
+(global-set-key (kbd "M-RET") 'plain-newline)
+
 
 ;;;;; C-space - org-edit-special
 
@@ -3526,9 +3144,9 @@ modes like org-mode which have their own yank function."
 ;;;;; C-home - start of buffer
 ;;;;; C-end - end of buffer
 ;;;; right secondary
-;;;;; C-6 - save-buffers-kill-emacs
+;;;;; C-^ - save-buffers-kill-emacs
 
-(global-set-key (kbd "C-6") 'save-buffers-kill-emacs)
+(global-set-key (kbd "C-^") 'save-buffers-kill-emacs)
 
 ;;;;; C-M-6 - insert-small-copyright
 
@@ -3536,18 +3154,22 @@ modes like org-mode which have their own yank function."
   (interactive)
   (beginning-of-line)
   (let ((beg (point)))
-    (insert "Copyright (C) 2017 Ian Kelling\nThis program is under GPL v. 3 or later, see <http://www.gnu.org/licenses/>")
+    (insert "Copyright (C) 2019 Ian Kelling\nThis program is under GPL v. 3 or later, see <http://www.gnu.org/licenses/>")
     (comment-region beg (point))))
 
 (global-set-key (kbd "C-M-6") 'insert-small-copyright)
 
+;;;;; M-7 - calc-embedded-word
+
+(global-set-key (kbd "M-7") 'calc-embedded-word)
+
 ;;;;; C-M-7 - insert-full-copyright
 
 (defun insert-full-copyright ()
   (interactive)
   (beginning-of-line)
   (let ((beg (point)))
-    (insert "Copyright (C) 2017 Ian Kelling\n")
+    (insert "Copyright (C) 2019 Ian Kelling\n")
     (insert "\n")
     (insert "This program is free software: you can redistribute it and/or modify\n")
     (insert "it under the terms of the GNU General Public License as published by\n")
@@ -3599,7 +3221,7 @@ modes like org-mode which have their own yank function."
 ;;;;; C-M-- - org-edit-src-exit
 ;;;;; C-y - undo
 
-(global-set-key (kbd "C-y") 'undo)
+(global-set-key (kbd "C-y") 'undo-tree-redo)
 (add-hook 'org-mode-hook
           (lambda () (define-key org-mode-map (kbd "C-y") nil)))
 
@@ -3640,3 +3262,9 @@ modes like org-mode which have their own yank function."
 ;;;;; C-escape - find-tag
 
 (global-set-key (kbd "<C-escape>") 'find-tag)
+
+
+;; Local Variables:
+;; eval: (outline-minor-mode)
+;; outline-regexp: "\\( *\\);;;\\{1,8\\} "
+;; End: