configfiles/emacs/.emacs.d/init.el
2017-10-12 20:19:26 +02:00

557 lines
16 KiB
EmacsLisp

(package-initialize)
(require 'package)
;; Nope function
(defun nope ()
(interactive)
(message "Nope!"))
;; Quote
(setq initial-scratch-message
(concat ";; Simplicity and elegance are unpopular because\n"
";; they require hard work and discipline to achieve\n"
";; and education to be appreciated.\n"
";;\n"
";; - Dijkstra\n\n"))
;; Set frame title
(setq frame-title-format "[%m] %f")
;; Default frame size
(setq initial-frame-alist
'(
(width . 110)
(height . 40)
))
;; Use cperl-mode instead of perl-mode
(defalias 'perl-mode 'cperl-mode)
;; Disable use of abbrev in cperl-mode (what the heck...)
(add-hook 'cperl-mode-hook
(lambda () (setq-local local-abbrev-table nil)))
(defun silence ()
(interactive))
;; Disable backup
(setq make-backup-files nil)
(push '("melpa" . "http://melpa.milkbox.net/packages/") package-archives)
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(ansi-color-faces-vector
[default default default italic underline success warning error])
'(ansi-color-names-vector
["#242424" "#e5786d" "#95e454" "#cae682" "#8ac6f2" "#333366" "#ccaa8f" "#f6f3e8"])
'(blink-cursor-mode nil)
'(cperl-close-paren-offset -2)
'(cperl-electric-parens nil)
'(cperl-electric-parens-mark nil)
'(cperl-indent-level 2)
'(cperl-indent-parens-as-block t)
'(cperl-under-as-char t)
'(custom-enabled-themes (quote (heroku)))
'(custom-safe-themes
(quote
("4f2ede02b3324c2f788f4e0bad77f7ebc1874eff7971d2a2c9b9724a50fb3f65" default)))
'(dired-listing-switches "-lh")
'(inhibit-startup-screen t)
'(package-selected-packages
(quote
(company delight evil-org org-bullets counsel powerline-evil powerline origami projectile terminal-here shell-pop swiper neotree centered-cursor-mode ivy heroku-theme auto-complete use-package yasnippet evil-surround org evil-magit magit makefile-runner evil))))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(company-preview ((t (:foreground "black"))))
'(company-preview-common ((t (:inherit company-preview))))
'(company-preview-search ((t (:inherit company-preview))))
'(company-scrollbar-bg ((t (:background "dim gray"))))
'(company-scrollbar-fg ((t (:background "gray"))))
'(company-template-field ((t (:foreground "dark orange"))))
'(company-tooltip ((t (:background "dim gray" :foreground "black"))))
'(company-tooltip-annotation ((t (:foreground "gray19"))))
'(company-tooltip-common ((t (:inherit company-preview))))
'(company-tooltip-selection ((t (:background "dark gray"))))
'(ivy-current-match ((t (:foreground "gold"))))
'(minibuffer-prompt ((t (:foreground "dark orange" :weight bold))))
'(neo-dir-link-face ((t (:foreground "#fce94f"))))
'(neo-expand-btn-face ((t (:foreground "#ffe070"))))
'(neo-root-dir-face ((t (:foreground "#fff3c6" :weight bold))))
'(org-ellipsis ((t (:foreground "LightGoldenrod"))))
'(powerline-active1 ((t (:inherit mode-line))))
'(powerline-active2 ((t (:inherit mode-line))))
'(powerline-evil-emacs-face ((t (:inherit powerline-evil-base-face :background "gray30" :foreground "white"))))
'(powerline-evil-insert-face ((t (:inherit powerline-evil-base-face :background "forest green"))))
'(powerline-evil-motion-face ((t (:inherit powerline-evil-base-face :background "white" :foreground "black"))))
'(powerline-evil-normal-face ((t (:inherit powerline-evil-base-face :background "white" :foreground "grey22"))))
'(powerline-evil-replace-face ((t (:inherit powerline-evil-base-face :background "dark red")))))
;; Disable unnecessary UI
(scroll-bar-mode -1)
(tool-bar-mode -1)
(menu-bar-mode -1)
;; ensure repo cache is up1date
(or (file-exists-p package-user-dir)
(package-refresh-contents))
;; Install use-package
(defun ensure-package-installed (package)
"Ensure packages are installed"
(if (package-installed-p package)
nil
(progn
(package-refresh-contents)
(package-install package))))
(ensure-package-installed 'use-package)
;; *.tex files are Latex-Files
(add-to-list 'auto-mode-alist '("\\.tex\\'" . latex-mode))
;; Extra Latex keybindings
(defun my/latex-keybindings ()
(define-key latex-mode-map (kbd "<f9>") 'recompile))
(add-hook 'latex-mode-hook 'my/latex-keybindings)
;; show parens
(show-paren-mode t)
;; highlight line
(global-hl-line-mode)
;; No tabs - tabs are evil
(setq indent-tabs-mode nil)
;; No trailing whitespaces - those are even evileler
(setq show-trailing-whitespace t)
(use-package delight
:ensure t
:demand t)
(use-package let-alist
:ensure t
:demand t)
;; powerline
(use-package powerline
:ensure t
:demand t)
(use-package powerline-evil
:ensure t
:demand t
:config
(powerline-evil-vim-color-theme))
;; theme
(use-package heroku-theme
:ensure t)
;; Org-mode
(use-package org
:ensure t
:config
(setq org-directory "~/org")
(setq org-agenda-files "~/org/agenda")
(global-set-key (kbd "<f12>") 'org-agenda)
(setq org-todo-keywords '((sequence "TODO" "WORKING" "BLOCKED" "REVIEW" "|" "ABANDONED" "DONE")))
(setq org-todo-keyword-faces
'(("TODO" . "firebrick2")
("WORKING" . "yellow")
("BLOCKED" . "orange red")
("REVIEW" . "dodger blue")
("ABANDONED" . "slate blue")
("DONE" . "green3")))
(setq org-ellipsis "")
(dolist (face '(org-level-1
org-level-2
org-level-3
org-level-4
org-level-5))
(set-face-attribute face nil :weight 'semi-bold :height 1.0))
(dolist (kv '(("t" . "TODO")
("w" . "WORKING")
("b" . "BLOCKED")
("r" . "REVIEW")
("a" . "ABANDONED")
("d" . "DONE")))
(define-key org-mode-map (kbd (concat "C-c t " (car kv))) `(lambda () (interactive) (org-todo ,(cdr kv)))))
(add-hook 'org-mode-hook
(lambda ()
(linum-mode 0)
(setq-local line-spacing 0.2)
(setq-local fill-column 80)
(auto-fill-mode 1))))
;; Org Bullets
(use-package org-bullets
:demand t
:ensure t
:config
(add-hook 'org-mode-hook
(lambda () (org-bullets-mode 1))))
;; Evil-mode
(defun my/evil-go-back ()
(interactive)
(evil--jump-backward 1))
(defun my/evil-go-forward ()
(interactive)
(evil--jump-forward 1))
(defun my/kill-current-buffer ()
(interactive)
(kill-buffer (current-buffer)))
(use-package evil
:ensure t
:demand t
:config
(evil-mode 1)
(setq evil-ex-substitute-global t)
(define-key evil-normal-state-map "/" 'swiper)
(evil-ex-define-cmd "q" 'my/kill-current-buffer)
(define-key evil-normal-state-map "gb" 'my/evil-go-back)
(define-key evil-normal-state-map "gn" 'my/evil-go-forward)
(define-key evil-motion-state-map [down-mouse-1] 'silence)
(define-key evil-motion-state-map [mouse-1] 'silence)
(setq-default evil-cross-lines t))
(use-package evil-org
:ensure t
:demand t
:config
(add-hook 'org-mode-hook 'evil-org-mode)
(add-hook 'evil-org-mode-hook
(lambda ()
(evil-org-set-key-theme '(navigation insert shift todo heading)))))
(use-package evil-surround
:ensure t
:demand t
:config
(global-evil-surround-mode t))
(use-package projectile
:ensure t
:demand t
:delight '(:eval (concat " Project[" (projectile-project-name) "]"))
:config
(projectile-global-mode t)
(setq projectile-completion-system 'ivy))
;; Company mode
(use-package company
:ensure t
:demand t
:config
(global-company-mode)
(setq company-global-modes '(not git-commit-mode))
(setq company-minimum-prefix-length 2)
(setq company-idle-delay 0.5))
;; Auto-Complete
;;(use-package auto-complete
;; :ensure t
;; :demand t
;; :delight
;; :disabled
;; :config
;; (require 'auto-complete-config)
;; (setq ac-ignore-case nil)
;; (setq ac-sources '(ac-source-filename
;; ac-source-functions
;; ac-source-yasnippet
;; ac-source-variables
;; ac-source-symbols
;; ac-source-features
;; ac-source-words-in-all-buffer
;; ac-source-dictionary))
;; (global-auto-complete-mode))
;; folding
(use-package origami
:ensure t
:demand t
:config (progn
(setq origami-show-fold-header t)
(define-key evil-normal-state-map "z" 'origami-toggle-node)
(global-origami-mode)))
;; ivy
(defun my/save-imenu-jump (item)
"WIP: Tells evil-jump to save position before jumping via imenu (or counsel-imenu)"
(evil--jumps-push))
(use-package ivy
:ensure t
:demand t
:delight
:config
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq ivy-count-format "(%d/%d) ")
(advice-add 'imenu :before 'my/save-imenu-jump)
(define-key ivy-minibuffer-map (kbd "<C-return>") 'ivy-immediate-done)
(set-face-attribute 'ivy-current-match nil :foreground "gold"))
(use-package counsel
:ensure t
:demand t
:config
(global-set-key (kbd "C-c l") 'counsel-locate)
(global-set-key (kbd "C-c m") 'counsel-imenu)
(global-set-key (kbd "C-c _") 'counsel-git-grep))
;; Quickly open external terminal
(use-package terminal-here
:ensure t
:demand t
:config
(global-set-key (kbd "C-x t") #'terminal-here-launch))
;; swiper
(use-package swiper
:ensure t
:bind ("C-s" . swiper))
;; Neotree
(use-package neotree
:ensure t
:bind ("C-x n" . neotree-show)
:config
(setq neo-theme 'ascii)
(evil-define-key 'normal neotree-mode-map (kbd "+") 'neotree-create-node)
(evil-define-key 'normal neotree-mode-map (kbd "g") 'neotree-refresh)
(evil-define-key 'normal neotree-mode-map (kbd "d") 'neotree-delete-node)
(evil-define-key 'normal neotree-mode-map (kbd "c") 'neotree-rename-node)
(evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter)
(evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter)
(evil-define-key 'normal neotree-mode-map (kbd "q") 'neotree-hide)
(evil-define-key 'normal neotree-mode-map (kbd "DEL") 'neotree-select-up-node))
;; Cursor centered
(use-package centered-cursor-mode
:ensure t
:demand t
:disabled
:config (global-centered-cursor-mode))
;; Yasnippet
(use-package yasnippet
:ensure t
:demand t
:delight yas-minor-mode
:config (yas-global-mode 1))
;; avy - Disabled because it makes emacs laggy :(
(use-package avy
:ensure t
:demand t
:bind ("C-c f" . avy-goto-line)
:disabled
:config
(setq avy-keys '(?w ?a ?s ?d ?q ?e))
(dolist (face avy-lead-faces)
(set-face-attribute face nil :background "gray28" :foreground "light blue" :weight 'bold)))
;; Magit
(use-package magit
:ensure t
:bind ("C-x g" . magit-status)
:config
(evil-set-initial-state 'git-commit-mode 'insert))
;; Undo-Tree
(use-package undo-tree
:delight)
;; Easy terminal
(setq my/default-shell (or (executable-find "zsh") (executable-find "bash")))
;;(use-package shell-pop
;; :ensure t
;; :bind ("C-x t" . shell-pop)
;; :config
;; (setq-default shell-pop-term-shell my/default-shell))
;; tabbing (doesn't really work yet)
(setq-default tab-width 4)
(setq-default LateX-indent-level 4)
(add-hook 'latex-mode-hook
(lambda () (setq indent-tabs-mode t)))
;; Activate line numbers
(global-linum-mode t)
;; compilation buffer
; Set buffer scrolling
(setq compilation-scroll-output 'first-error)
(setq compilation-window-height 10)
;(defun my/compilation-bury-buffer-without-error (buffer string)
; (cond ((string-match "finished" string)
; (message "Build maybe successful: closing window.")
; (run-with-timer 3 nil
; 'delete-window
; (get-buffer-window buffer t)))
; (t (message "Compilation exited abnormaly: %s" string))))
;
;(setq compilation-finish-function 'my/compilation-bury-buffer-without-error)
;(defun my/setup-compilation-window ()
; (when (not (get-buffer-window "*compilation*"))
; (save-selected-window
; (save-excursion
; (let* ((w (split-window-vertically))
; (h (window-height w)))
; (select-window w)
; (switch-to-buffer "*compilation*")
; (shrink-window (- h compilation-window-height)))))))
;(add-hook 'compilation-mode-hook 'my/setup-compilation-window)
;; Window movement
; Old keys
(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <left>") 'windmove-left)
(global-set-key (kbd "C-x <right>") 'windmove-right)
; New keys
; (global-set-key (kbd "<M-up>") 'windmove-up)
; (global-set-key (kbd "<M-down>") 'windmove-down)
; (global-set-key (kbd "<M-left>") 'windmove-left)
; (global-set-key (kbd "<M-right>") 'windmove-right)
; Whitespace mode toggle
(global-set-key (kbd "C-c C-l") 'whitespace-mode)
(defun cycle-window ()
"cycles windows"
(interactive)
(select-window (next-window)))
(global-set-key (kbd "<C-tab>") 'cycle-window)
;; Exit prompt
;; (defun foreach (alist func)
;; (while alist
;; (progn
;; (funcall func (car alist))
;; (setq alist (cdr alist)))))
(defun check-for-open-buffers ()
(interactive)
(or (dolist
(buffer (buffer-list))
(cond
((string-match "^\\*.*\\*$" (buffer-name buffer))
nil)
((null (buffer-modified-p buffer))
nil)
(t
(yes-or-no-p (format "Buffer %s is open. Exit anyway?" (buffer-name buffer))))))))
;; Latex german
(quail-define-package "latex-german" "UTF-8" "LaGe" t
"Transforms umlauts to the better latex notation.
ä -> \"a
ö -> \"o
ü -> \"u
Ä -> \"A
Ö -> \"O
Ü -> \"U
ß -> \"s"
nil t nil nil nil nil nil nil nil nil t)
(quail-define-rules
("ä" ["\"a"])
("ö" ["\"o"])
("ü" ["\"u"])
("Ä" ["\"A"])
("Ö" ["\"O"])
("Ü" ["\"U"])
("ß" ["\"s"])
)
(add-hook 'latex-mode-hook (lambda ()
(set-input-method "latex-german")
(local-set-key "\"" 'self-insert-command)))
;; Treat _ as part of word in some modes
(defun treat-underscore ()
(modify-syntax-entry ?_ "w"))
(add-hook 'prog-mode-hook 'treat-underscore)
;; Split windows horizontally preferred
(setq split-height-threshold 6)
(setq split-width-threshold 20)
;; Overlay windows (What does it do?)
(add-to-list 'display-buffer-alist
'("*Apropos*" display-buffer-same-window))
(add-to-list 'display-buffer-alist
'("*Help*" display-buffer-in-side-window))
(add-to-list 'display-buffer-alist
'("*evil-jumps*" display-buffer-in-side-window))
(add-to-list 'display-buffer-alist
'("*compilation*" (display-buffer-reuse-window display-buffer-in-side-window) (side . bottom) (size . 0.2)))
;; Change all prompts to y or n
(fset 'yes-or-no-p 'y-or-n-p)
;; Insert date time, german format
(defun datetime-german ()
(interactive)
(insert (format-time-string "%d.%m.%Y %H:%M")))
;; Insert time, german format
(defun time-german ()
(interactive)
(insert (format-time-string "%H:%M")))
(global-set-key (kbd "C-c C-d") 'time-german)
(defun fefe ()
(interactive)
(eww "https://blog.fefe.de"))
;; Comment fun
;(defun extend-comment ()
; (interactive)
; (if (looking-back "//" (line-beginning-position))
; (progn
; (newline-and-indent)
; (insert "Hallo Welt"))
; (newline-and-indent)))
;; Show in binary and decimal
;(defun hex-popup ()
; (interactive)
; (let (hexStr p1 p2)
; (save-excursion
; (search-backward-regexp "[^0-9A-Fa-f]" nil t)
; (forward-char)
; (setq p1 (point))
; (search-forward-regexp "[^0-9A-Fa-f]" nil t)
; (backward-char)
; (setq p2 (point)))
; (setq hexStr (buffer-substring-no-properties p1 p2))
; (message "The hex number is: '%s' '%d' '%d'" hexStr p1 p2)))
;; Load local emacs settings
(let ((local-config (concat user-emacs-directory "init.local")))
(when (file-exists-p (concat local-config ".el"))
(load local-config)))