dotemacs/init.el

476 lines
16 KiB
EmacsLisp

;; TODO - convert to use-package
;; TODO - drop cp/ prefix, use contrapunctus-, set up nameless package names
;; TODO - trying setting up xref
(eval-when-compile
(add-to-list 'load-path "~/.emacs.d/elisp-git/use-package/")
(require 'use-package))
(use-package info
:config
(info-initialize)
(add-to-list 'Info-directory-list "~/.emacs.d/info/")
(add-to-list 'Info-directory-list "~/.emacs.d/elisp-git/geiser/doc/")
:bind
(("<f1> i" . nil)
("<f1> i i" . info)
("<f1> i a" . info-apropos)
("<f1> i q" . (lambda () (interactive) (info "(emacs)")))
("<f1> i w" . (lambda () (interactive) (info "(elisp)")))
("<f1> i l" . (lambda () (interactive) (info "(lilypond-notation)")))
("<f1> i r" . (lambda () (interactive) (info "(lilypond-learning)")))
("<f1> i s" . (lambda () (interactive) (info "(stumpwm)")))
("<f1> i o" . (lambda () (interactive) (info "(org)")))
("<f1> i g" . (lambda () (interactive) (info "(guile)"))))
:bind
(:map Info-mode-map
("b" . Info-history-back)
("f" . Info-history-forward)))
(use-package time
:config
(setq display-time-next-load-average t)
(add-to-list 'display-time-world-list '("Europe/Berlin" "Berlin")))
;; (toggle-debug-on-error)
(setenv "PATH" (concat "/home/anon/bin:" (getenv "PATH")))
(setenv "EDITOR" "emacsclient")
;; what on earth is this message after every init -
;; ad-handle-definition: `tramp-read-passwd' got redefined
;; ;; (profiler-start 'cpu)
;; (toggle-debug-on-error)
;; ;; (toggle-debug-on-quit)
;; from https://github.com/jorgenschaefer/Config/blob/master/emacs.el#L796-L800
(mapc (lambda (path)
(when (file-directory-p path)
(add-to-list 'load-path path)
(dolist (dirname (directory-files path t "^[^.]"))
(when (file-directory-p dirname)
(let ((try1 (concat dirname "/elisp"))
(try2 (concat dirname "/lisp")))
(add-to-list 'load-path
(cond ((file-exists-p try1) try1)
((file-exists-p try2) try2)
(t dirname))))))))
'("~/.emacs.d/elisp-git/"
"~/.emacs.d/contrapunctus"
"~/.emacs.d/elpa/"))
(require 'dash)
(require 's)
(require 'visual-fill-column)
;; (add-to-list 'load-path "~/.emacs.d/elisp-git/yafolding.el/")
(add-to-list 'load-path "~/.emacs.d/user/")
(add-to-list 'load-path "~/.emacs.d/contrapunctus/")
(add-to-list 'load-path "~/.emacs.d/contrapunctus/fin/")
(add-to-list 'load-path "~/.emacs.d/contrapunctus/ido-mini/")
(add-to-list 'load-path "~/.emacs.d/contrapunctus/timeclock-ui/")
(load "cp")
;; (if (not (server-running-p)) (server-start))
(server-start)
;; 2017-06-09T00:24:36+0530
;; my laptop's X, W, and G keys gave up the ghost
;; temporary bindings, till my laptop keyboard is fixed
(global-set-key (kbd "<f8>") 'keyboard-quit)
(global-set-key (kbd "<f9>") 'cp/eval-sexp)
(global-set-key (kbd "M-<f9>") 'dired-jump)
(global-set-key (kbd "<f10>") 'save-buffer)
(global-set-key (kbd "M-<f10>") 'find-file)
(global-set-key (kbd "<f11>") 'ido-mini)
(global-set-key (kbd "M-<f11>") 'ibuffer)
(global-set-key (kbd "<f12>") 'smex)
(global-set-key (kbd "M-<f12>") 'text-scale-adjust)
(global-set-key (kbd "C-c C-j") 'join-line)
(global-set-key (kbd "C-c C-r") (lambda () (interactive) (revert-buffer t t)))
;;;; UTF-8 magic
;; (setq locale-coding-system 'utf-8)
;; (set-terminal-coding-system 'utf-8)
;; (set-keyboard-coding-system 'utf-8)
;; (set-selection-coding-system 'utf-8)
;; (prefer-coding-system 'utf-8)
;;;; Linewrapping
;; (defun line-trunc-set ()
;; (visual-line-mode -1)
;; ;(setq-default truncate-partial-width-windows t)
;; ;(setq-default truncate-lines t))
;; (setq truncate-partial-width-windows t)
;; (setq truncate-lines t))
;; ;; (defun line-trunc-set ()
;; ;; (interactive)
;; ;; (if (or truncate-lines
;; ;; visual-line-mode)
;; ;; (progn
;; ;; (visual-line-mode -1)
;; ;; (setq truncate-lines t))
;; ;; (progn
;; ;; (visual-line-mode 1)
;; ;; (setq truncate-lines nil))))
;; ;(add-hook 'text-mode-hook 'line-trunc-set)
;; (add-hook 'emacs-lisp-mode-hook 'line-trunc-set)
;; (add-hook 'org-mode-hook 'visual-line-mode)
;; (add-hook 'erc-mode-hook 'visual-line-mode)
;; ;(global-set-key (kbd "C-x t") 'toggle-truncate-lines)
;; 2018-07-26T19:57:29+0530
(add-hook 'markdown-mode-hook '(lambda () (visual-fill-column-mode t)))
(add-hook 'text-mode-hook '(lambda () (visual-line-mode t)))
(load "cp-md")
(defun cp/turn-on-truncate-lines ()
(setq truncate-lines 1))
(defun cp/add-to-hooks (function hooks)
(-map (lambda (hook)
(add-hook hook function))
hooks))
(defun cp/remove-from-hooks (function hooks)
(-map (lambda (hook)
(remove-hook hook function))
hooks))
(cp/add-to-hooks
'cp/turn-on-truncate-lines
'(dired-mode-hook text-mode-hook prog-mode-hook diff-mode-hook message-mode-hook))
(global-visual-line-mode -1)
(setq truncate-partial-width-windows nil
truncate-lines t)
(add-hook 'erc-mode-hook 'visual-line-mode)
(add-hook 'comint-mode-hook 'visual-line-mode)
;; commented out on 2018-03-19T14:18:34+0530
;; (add-hook 'markdown-mode-hook 'auto-fill-mode)
;; (add-hook 'text-mode-hook 'auto-fill-mode)
;; (add-hook 'paredit-mode-hook 'auto-fill-mode)
;;;; Tab settings
;; (setq default-tab-width 4)
(setq tab-width 4)
;(define-key text-mode-map (kbd "TAB") 'self-insert-command)
(setq-default indent-tabs-mode nil)
;;;; Fix scrolling
(setq scroll-conservatively 10000
scroll-preserve-screen-position t)
(setq auto-window-vscroll nil)
;;; Recenter screen on isearch matches
(add-hook 'isearch-mode-hook 'recenter)
(add-hook 'isearch-update-post-hook 'recenter)
(defadvice isearch-repeat-forward
(after isearch-repeat-forward-recenter activate) (recenter))
(defadvice isearch-repeat-backward
(after isearch-repeat-backward-recenter activate) (recenter))
(ad-activate 'isearch-repeat-forward)
(ad-activate 'isearch-repeat-backward)
(global-set-key (kbd "C-s") 'isearch-forward-regexp)
(global-set-key (kbd "C-r") 'isearch-backward-regexp)
;;;; While we're at it, let's add that to next-error as well
;;;; (this affects jumping to match from M-x grep , too)
(add-hook 'next-error-hook 'recenter)
;;;; ...and to magit-toggle-section
;;; It'd be really cool to (recenter 3) when you /open/ a section,
;;; and (recenter) when you close a section
(defadvice magit-section-toggle
(after magit-section-toggle-recenter activate) (recenter 3))
(ad-activate 'magit-section-toggle)
(defadvice magit-unstage-item
(after magit-unstage-item-move) (next-line))
(ad-activate 'magit-unstage-item)
(defadvice magit-goto-next-section
(after magit-next-section-recenter activate) (recenter 3))
(ad-activate 'magit-goto-next-section)
(defadvice magit-goto-previous-section
(after magit-previous-section-recenter activate) (recenter 3))
(ad-activate 'magit-goto-previous-section)
(defun cp-insert-timestamp ()
(interactive)
(insert (format-time-string "%FT%T%z")))
(autoload 'ag-regexp "ag" "ag" t)
(with-eval-after-load 'ag
(setq ag-highlight-search t
ag-arguments '("--smart-case" "--nogroup" "--column" "-z" "--")))
(require 'fin)
(defun cp/eval-sexp (arg)
"In emacs-lisp-mode, just run eval-defun.
In other modes - jump to first Lisp expression in current line
and eval it."
(interactive "P")
(save-excursion
(cond ((or
(equal major-mode 'emacs-lisp-mode)
(equal major-mode 'lisp-interaction-mode))
(eval-defun arg))
((re-search-line "(")
(progn
(forward-char -1)
(forward-sexp)
(eval-last-sexp arg)))
(t nil))))
(use-package nameless
:commands nameless-mode
:init
(add-hook 'emacs-lisp-mode-hook 'nameless-mode)
(add-hook 'ert-results-mode-hook 'nameless-mode)
:bind (:map emacs-lisp-mode-map
("C-c C-n" . nameless-mode)))
(cp-set-keys
:bindings
`((,(kbd "M-<f2>") compile)
(,(kbd "<f2> <f2>") imenu)
;; (,(kbd "<f2> p") grep)
(,(kbd "<f2> p") ag-regexp)
(,(kbd "<f2> o") find-grep)
(,(kbd "<f2> i") find-dired)
(,(kbd "<f2> h") proced)
(,(kbd "M-<f3>") run-chicken)
(,(kbd "M-<f4>") run-lisp)
(,(kbd "<f5> <f5>") eval-buffer)
(,(kbd "M-<f5>") ielm)
(,(kbd "<f5> i") cp-open-init)
(,(kbd "<f5> p") list-packages)
(,(kbd "<f5> v") visual-line-mode)
(,(kbd "<f5> f") cp-fcf-literally)
(,(kbd "<f5> f") fundamental-mode)
(,(kbd "<f5> t") text-mode)
(,(kbd "<f5> c") calendar)
;; (,(kbd "s-k") cp-kill-buffer)
(,(kbd "s-k") bury-buffer)
(,(kbd "C-x k") cp-kill-buffer)
(,(kbd "C-`") eshell)
(,(kbd "<f5> T") cp-insert-timestamp)
(,(kbd "<f1> l") find-library)))
(load "cp-mouse")
(with-eval-after-load 'help-mode
(cp-set-keys
:keymap help-mode-map
:bindings
`((,(kbd "b") help-go-back)
(,(kbd "f") help-go-forward))))
(setq eshell-history-size nil)
;; More convenient Unicode keys
(global-unset-key (kbd "M-["))
(cp-set-keys
:bindings
`((,(kbd "C-' a") ,(kbd "ä"))
(,(kbd "C-' A") ,(kbd "Ä"))
(,(kbd "C-' u") ,(kbd "ü"))
(,(kbd "C-' U") ,(kbd "Ü"))
(,(kbd "C-' o") ,(kbd "ö"))
(,(kbd "C-' O") ,(kbd "Ö"))
(,(kbd "C-' s") ,(kbd "ß"))
(,(kbd "C-' r") ,(kbd ""))
(,(kbd "C-' e") ,(kbd ""))
(,(kbd "C-' b") ,(kbd ""))
(,(kbd "C-' f") ,(kbd ""))
(,(kbd "C-' p") ,(kbd ""))
(,(kbd "C-' n") ,(kbd ""))
(,(kbd "C-' t") ,(kbd ""))
(,(kbd "C-' l") ,(kbd "λ"))
(,(kbd "C-' F") ,(kbd "ƒ"))
(,(kbd "C-' C-r") ,(kbd ""))))
(setq default-input-method "devanagari-itrans")
(setq backup-by-copying t
backup-directory-alist '(("." . "~/.emacs.d/saves/"))
delete-old-versions t
kept-new-versions 2
kept-old-versions 2
version-control t)
(setq browse-url-browser-function 'browse-url-xdg-open)
(require 'package)
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
(not (gnutls-available-p))))
(proto (if no-ssl "http" "https")))
;; Comment/uncomment these two lines to enable/disable MELPA and MELPA Stable as desired
(add-to-list 'package-archives (cons "melpa" (concat proto "://melpa.org/packages/")) t)
;;(add-to-list 'package-archives (cons "melpa-stable" (concat proto "://stable.melpa.org/packages/")) t)
(when (< emacs-major-version 24)
;; For important compatibility libraries like cl-lib
(add-to-list 'package-archives '("gnu" . (concat proto "://elpa.gnu.org/packages/")))))
(package-initialize)
(use-package company
:diminish company-mode
:commands global-company-mode
:init (global-company-mode))
(use-package company-emoji
:if (featurep 'company)
:config (add-to-list 'company-backends 'company-emoji))
;; (load "cp-adb")
(load "cp-editing")
;; (load "cp-evil")
(load "cp-god")
(load "cp-fm")
(load "cp-lily")
(load "cp-sfz")
(load "cp-lisp")
(load "cp-nav")
(load "cp-ui")
;; (ispell-change-dictionary "en")
(setq ispell-dictionary "en")
(use-package undo-tree
:if (not (featurep 'evil))
:diminish undo-tree-mode
:init (global-undo-tree-mode))
(with-eval-after-load 'text-mode
(define-key text-mode-map (kbd "M-p") 'org-drag-line-backward)
(define-key text-mode-map (kbd "M-n") 'org-drag-line-forward))
(load "cp-org")
(autoload 'byte-recompile-file "bytecomp" "byte-recompile-file" t)
;; (2017-12-29T13:21:57+0530
;; TODO - watch Org and MD files and recompile it if they are newer
;; than their associated HTML files (e.g. I edited the source on a
;; phone and synced it back to the laptop)
;; see (info "(elisp) File Notifications")
;; and (describe-function 'file-newer-than-file-p)
;; )
(defun cp/after-save ()
(case major-mode
('org-mode (org-html-export-to-html))
('LilyPond-mode (let ((project-dir (locate-dominating-file (buffer-file-name) "main.ly")))
(when project-dir
(cd project-dir))
(compile (car compile-history))))
('latex-mode (if (file-exists-p "Makefile")
(compile "make -k")
(compile (concat "xelatex \"" (buffer-file-name)
"\""))))
('markdown-mode (markdown-export))))
(add-hook 'after-save-hook 'cp/after-save)
(require 'ace-jump-mode)
;(define-key global-map (kbd "C-c SPC") 'ace-jump-mode)
(global-set-key (kbd "S-SPC") 'ace-jump-mode)
;; (load "cp-helm")
(load "cp-hindi")
(load "cp-irc")
(load "cp-parens")
(load "cp-playlist")
(require 'keyfreq)
(keyfreq-mode 1)
(keyfreq-autosave-mode 1)
;; ;; disabled on 2017-08-18T19:39:21+0530, no longer interested
;; (open-dribble-file (concat "~/.emacs.d/keylogs/"
;; (format-time-string "%Y%m%d-%H%M%S")
;; ".txt"))
;; 2017-10-14T15:22:56+0530 - I suspect devanagari-itrans tires the
;; left hand faster than the right - let's find out!
(add-hook
'input-method-activate-hook
(lambda ()
(open-dribble-file
(concat
"~/.emacs.d/keylogs/"
(format-time-string "%Y%m%d-%H%M%S")
"-"
current-input-method
".txt"))))
(add-hook
'input-method-deactivate-hook
(lambda () (open-dribble-file nil)))
;; (add-hook
;; 'kill-emacs-hook
;; (lambda () (shell-command (concat "cat ~/.emacs.d/keylogs/"
;; (format-time-string "%Y%m%d*")
;; " && ls"))))
(autoload 'magit-status "magit" "magit" t)
(global-set-key (kbd "<f5> m") 'magit-status)
(with-eval-after-load 'magit
(define-key magit-mode-map (kbd "C-n") 'next-line)
(define-key magit-mode-map (kbd "C-p") 'previous-line)
;; (setq magit-git-output-coding-system 'utf-8
;; magit-git-global-arguments (append magit-git-global-arguments '("-c" "i18n.logOutputEncoding=utf-8")))
)
(setq recentf-auto-cleanup 'never)
(require 'recentf)
(recentf-mode 1)
(setq recentf-max-menu-items 500
recentf-max-saved-items 1000
recentf-save-file "/home/anon/.emacs.d/recentf"
recentf-exclude '("\.html\\(\.orig\\)?$" "\.jpe?g$" "\.png$" "\.mp4$" "\.etc" "\.umstuff"))
(add-hook 'kill-emacs-hook 'recentf-cleanup)
(global-set-key (kbd "C-x C-r C-o") 'recentf-open-files)
(load "cp-ido")
(load "cp-desktop")
(require 'timeclock-list)
(require 'timeclock-report)
(add-hook 'kill-emacs-query-functions 'timeclock-query-out)
(with-eval-after-load 'stumpwm-mode
(setq stumpwm-shell-program
"~/git/stumpwm-contrib/util/stumpish/stumpish"))
(autoload 'stumpwm-mode "stumpwm-mode" "stumpwm-mode" t)
(add-to-list 'auto-mode-alist '("\\.stumpwmrc$" . stumpwm-mode))
;; I'd love to know how to automatically set some modes for some
;; specific files (i.e. by name of file). Start stumpwm-mode when I
;; open ~/.stumpwmrc, disable visual lines and enable truncate lines
;; for some files, etc...
;;;; text size change
;; nicked from wasamasa's init - https://github.com/wasamasa/dotemacs/blob/934d0b37692d62fe9af56b52accac5bcd4445ae3/init.org
(setq default-frame-alist '((font . "DejaVu Sans Mono-10.5")))
(defun my-fix-emojis (&optional frame)
(set-fontset-font "fontset-default" nil "Symbola" frame 'append))
(my-fix-emojis)
(add-hook 'after-make-frame-functions 'my-fix-emojis)
;; (set-face-attribute 'default nil :font "-outline-Bitstream Vera Sans Mono-normal-normal-normal-mono-12-*-*-*-c-*-iso8859-1")
(require 'wgrep)
;; (require 'yafolding)
;; (add-hook 'prog-mode-hook
;; (lambda () (yafolding-mode)))
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file)
(put 'downcase-region 'disabled nil)
(put 'upcase-region 'disabled nil)
(put 'set-goal-column 'disabled nil)
;; (toggle-debug-on-quit)
;; (profiler-stop)
;; (emacs-init-time)
;; (profiler-report)
(put 'scroll-left 'disabled nil)
(put 'erc-remove-text-properties-region 'disabled nil)