.emacs.d/init.el

668 lines
19 KiB
EmacsLisp
Raw Normal View History

;;; init.el --- tastytea's Emacs init file.
2019-03-22 09:41:57 +01:00
;;; Time-stamp: <2019-03-22 09:32:48 CET>
2019-03-19 00:12:11 +01:00
;;; Commentary:
;;; I am using this file with Emacs 26, but most of it will probably work with
;;; Emacs 24 and above.
2019-03-19 00:12:11 +01:00
;;; Code:
2019-03-19 01:43:28 +01:00
;;;;;;;;;;;;;;;;;;;; Packages ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2019-03-19 00:12:11 +01:00
(require 'package)
;; (add-to-list 'package-archives
2019-03-19 08:04:53 +01:00
;; '("melpa-stable" . "https://stable.melpa.org/packages/") t)
2019-03-19 00:12:11 +01:00
(add-to-list 'package-archives
2019-03-19 08:04:53 +01:00
'("melpa" . "https://melpa.org/packages/") t)
2019-03-19 00:12:11 +01:00
(package-initialize)
2019-03-22 09:03:23 +01:00
;; Add path for custom packages.
2019-03-19 00:12:11 +01:00
(add-to-list 'load-path "~/.emacs.d/custom-packages/")
2019-03-22 09:03:23 +01:00
;; Install use-package if necessary.
2019-03-19 00:12:11 +01:00
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
(eval-when-compile
(require 'use-package))
2019-03-22 09:03:23 +01:00
;; Always install packages if they are not present.
2019-03-19 00:12:11 +01:00
(require 'use-package-ensure)
(setq use-package-always-ensure t)
;; autocompile files as needed.
(use-package auto-compile
:init
2019-03-22 09:03:23 +01:00
;; Use uncompiled file if it is newer than the compiled one.
(setq load-prefer-newer t)
:config
(auto-compile-on-load-mode))
2019-03-22 09:03:23 +01:00
;; ;; Benchmark for startup-file.
2019-03-19 00:12:11 +01:00
;; (use-package benchmark-init
;; :config
;; ;; To disable collection of benchmark data after init is done.
;; (add-hook 'after-init-hook 'benchmark-init/deactivate))
2019-03-22 09:03:23 +01:00
;; Update packages if at least 7 days have passed.
2019-03-19 00:12:11 +01:00
(use-package auto-package-update
2019-03-22 09:03:23 +01:00
:custom
(auto-package-update-delete-old-versions t)
(auto-package-update-interval 7)
(auto-package-update-hide-results nil)
2019-03-19 00:12:11 +01:00
:config
(auto-package-update-maybe))
2019-03-19 01:43:28 +01:00
;;;;;;;;;;;;;;;;;;;; Global variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2019-03-22 09:03:23 +01:00
;; Determine if we run on a slow computer.
2019-03-19 00:12:11 +01:00
(defvar slow-computer nil)
(if (member (system-name) '("steuerbeamter" "azimuth" "localhost"))
(setq slow-computer t)) ; localhost is schnibble
2019-03-19 02:18:58 +01:00
;;;;;;;;;;;;;;;;;;;; Configure some essential things ;;;;;;;;;;;;;;;;;;;;;;;;;;;
2019-03-22 09:03:23 +01:00
;; Set garbage collection threshold to 100 MiB (or 20 MiB) to speed up init.
;; It is reset at the end of the file.
(if slow-computer
(setq gc-cons-threshold (* 20 1024 1024))
(setq gc-cons-threshold (* 100 1024 1024)))
2019-03-22 09:03:23 +01:00
;; Accelerate startup by not printing so much.
2019-03-19 01:43:28 +01:00
(setf inhibit-startup-screen t
inhibit-startup-echo-area-message t
inhibit-startup-message t)
2019-03-22 09:03:23 +01:00
;; Just type y/n instead of yes/no when prompted.
2019-03-19 00:12:11 +01:00
(defalias 'yes-or-no-p 'y-or-n-p)
2019-03-22 09:03:23 +01:00
;; Hide toolbar.
2019-03-19 00:12:11 +01:00
(tool-bar-mode -1)
2019-03-22 09:03:23 +01:00
;; Save cursor position.
(use-package saveplace
:config
(save-place-mode t))
2019-03-19 00:12:11 +01:00
2019-03-22 09:03:23 +01:00
;; Delete selection when you start to write.
2019-03-19 00:12:11 +01:00
(delete-selection-mode t)
2019-03-22 09:03:23 +01:00
;; Save minibuffer history.
2019-03-19 00:12:11 +01:00
(savehist-mode t)
2019-03-22 09:03:23 +01:00
;; Save backups in ~/.emacs.d/ and keep more versions.
2019-03-19 00:12:11 +01:00
(setq backup-directory-alist
`(("." . ,(concat user-emacs-directory "backups"))))
(setq delete-old-versions t
kept-new-versions 6
2019-03-19 01:43:28 +01:00
;; kept-old-versions 2
2019-03-19 00:12:11 +01:00
version-control t)
2019-03-22 09:03:23 +01:00
;; Set some personal information.
(setq user-full-name "tastytea"
user-mail-address "tastytea@tastytea.de")
2019-03-19 23:24:39 +01:00
;; kill-region (cut) and kill-ring-save (copy) act on the current line if no
2019-03-22 09:03:23 +01:00
;; text is visually selected.
;; https://www.emacswiki.org/emacs/WholeLineOrRegion
(put 'kill-ring-save 'interactive-form
'(interactive
(if (use-region-p)
(list (region-beginning) (region-end))
(list (line-beginning-position) (line-beginning-position 2)))))
(put 'kill-region 'interactive-form
'(interactive
(if (use-region-p)
(list (region-beginning) (region-end))
(list (line-beginning-position) (line-beginning-position 2)))))
2019-03-22 09:03:23 +01:00
;; Banish customizations to another file.
(setq custom-file (concat user-emacs-directory "custom.el"))
2019-03-22 09:03:23 +01:00
;; Scroll 1 line at a time.
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1)))
2019-03-22 01:00:14 +01:00
2019-03-22 09:03:23 +01:00
;; Scroll before cursor has reached top/bottom.
(use-package smooth-scrolling
:config
(smooth-scrolling-mode 1))
;; Paste text where the cursor is, not where the mouse is.
(setq mouse-yank-at-point t)
2019-03-22 09:03:23 +01:00
;; Put scrollbar to the right side.
2019-03-22 02:59:35 +01:00
(if (display-graphic-p)
(set-scroll-bar-mode 'right))
2019-03-19 00:12:11 +01:00
;;;;;;;;;;;;;;;;;;;; Keybindings ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package bind-key
:config
(bind-keys
2019-03-22 09:03:23 +01:00
;; Scroll in other window.
("S-<prior>" . scroll-other-window-down)
("S-<next>" . scroll-other-window)
;; Switch window
("C-<tab>" . other-window)
2019-03-22 09:03:23 +01:00
;; Reduce whitespace around cursor to 0 or 1, according to context.
("C-<delete>" . fixup-whitespace)
2019-03-22 09:03:23 +01:00
;; Scroll without moving the cursor.
("M-<down>" . scroll-up-line)
("M-<up>" . scroll-down-line)))
2019-03-19 00:12:11 +01:00
2019-03-22 01:57:44 +01:00
;;;;;;;;;;;;;;;;;;;; Programming / C++ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2019-03-22 00:40:07 +01:00
(use-package rtags
:unless slow-computer
:if (executable-find "llvm-config")
:if (executable-find "clang++")
:config
(unless (and (rtags-executable-find "rc") (rtags-executable-find "rdm"))
(progn
(message "RTags is not installed!")
(rtags-install)))
(rtags-enable-standard-keybindings)
2019-03-22 09:03:23 +01:00
:bind
(:map c-mode-base-map
("M-." . rtags-find-symbol-at-point)
("M-," . rtags-find-references-at-point)
("M-?" . rtags-display-summary))
2019-03-22 00:40:07 +01:00
:hook
(c++-mode . (rtags-start-process-unless-running))
(c-mode . (rtags-start-process-unless-running))
(kill-emacs . rtags-quit-rdm))
2019-03-19 00:12:11 +01:00
(use-package flycheck-rtags
:after (flycheck rtags)
2019-03-21 11:29:28 +01:00
:demand t
2019-03-19 00:12:11 +01:00
:config
2019-03-22 09:03:23 +01:00
;; ensure that we use only rtags checking.
2019-03-19 00:12:11 +01:00
;; https://github.com/Andersbakken/rtags#optional-1
2019-03-22 09:03:23 +01:00
(defun my/setup-flycheck-rtags ()
2019-03-19 00:12:11 +01:00
(flycheck-select-checker 'rtags)
2019-03-22 09:03:23 +01:00
(setq-local flycheck-highlighting-mode nil)) ; Can't disable RTags overlay.
2019-03-19 00:12:11 +01:00
:hook
2019-03-22 09:03:23 +01:00
(c-mode-hook . #'my/setup-flycheck-rtags)
(c++-mode-hook . #'my/setup-flycheck-rtags))
2019-03-19 00:12:11 +01:00
(use-package company-rtags
:after (company rtags)
2019-03-22 09:03:23 +01:00
:custom
(rtags-completions-enabled t)
2019-03-19 00:12:11 +01:00
:config
;; (setq rtags-autostart-diagnostics t)
;; (rtags-diagnostics)
(push 'company-rtags company-backends))
2019-03-22 09:03:23 +01:00
;; cmake integration.
2019-03-22 01:57:44 +01:00
(use-package cmake-ide
:unless slow-computer
2019-03-22 09:03:23 +01:00
:custom
(cmake-ide-build-dir "build")
2019-03-22 01:57:44 +01:00
:config
(cmake-ide-setup))
2019-03-19 01:34:36 +01:00
;;;;;;;;;;;;;;;;;;;; Programming / other ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2019-03-22 09:03:23 +01:00
;; Online documentation mode.
(use-package eldoc
:hook
(prog-mode . turn-on-eldoc-mode))
2019-03-22 09:03:23 +01:00
;; Syntax checking with many plugins.
2019-03-22 00:40:07 +01:00
(use-package flycheck
:unless slow-computer
:config
(global-flycheck-mode))
2019-03-19 01:34:36 +01:00
2019-03-22 09:03:23 +01:00
;; Autocompletion mode with many plugins.
2019-03-22 00:40:07 +01:00
(use-package company
:unless slow-computer
:hook
(after-init . global-company-mode))
2019-03-19 01:34:36 +01:00
2019-03-22 09:03:23 +01:00
;; Fuzzy autocompletion for company.
2019-03-19 00:12:11 +01:00
(use-package company-flx
:after company
:config
(company-flx-mode +1))
2019-03-19 01:34:36 +01:00
;; Indentation
(setq-default indent-tabs-mode nil
tab-width 4)
(setq c-default-style "linux"
c-basic-offset 4)
2019-03-22 09:03:23 +01:00
;; Automatic project management.
2019-03-22 00:40:07 +01:00
(use-package projectile
:unless slow-computer
:after neotree
:config
(projectile-mode +1)
(setq projectile-switch-project-action 'neotree-projectile-action
projectile-project-compilation-dir "build"
projectile-project-configure-cmd
"cmake -DCMAKE_BUILD_TYPE=Debug
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G 'Unix Makefiles' .."
2019-03-22 00:40:07 +01:00
projectile-project-compilation-cmd "cmake --build .")
2019-03-22 09:03:23 +01:00
(defun my/projectile-kill-buffers-and-change-tabbar-grouping ()
2019-03-22 00:40:07 +01:00
"Kill project buffers and change tabbar-ruler grouping to user-buffers."
(interactive)
(projectile-kill-buffers)
(tabbar-ruler-group-user-buffers))
:bind
("C-c p" . 'projectile-command-map)
(:map projectile-command-map
2019-03-22 09:03:23 +01:00
("k" . 'my/projectile-kill-buffers-and-change-tabbar-grouping)))
2019-03-19 00:12:11 +01:00
2019-03-22 09:03:23 +01:00
;; GUI for gdb and other debuggers.
2019-03-19 00:12:11 +01:00
(use-package realgud
:config
2019-03-22 09:03:23 +01:00
(defun my/load-realgud ()
2019-03-19 00:12:11 +01:00
(load-library "realgud"))
:hook
2019-03-22 09:03:23 +01:00
(c++-mode . my/load-realgud)
(c-mode . my/load-realgud))
2019-03-19 00:12:11 +01:00
;; Highlight TODO, FIXME, NOTE and so on.
2019-03-19 01:34:36 +01:00
(use-package hl-todo
:hook
(prog-mode . hl-todo-mode))
2019-03-19 01:34:36 +01:00
2019-03-22 09:03:23 +01:00
;; Better commenting.
2019-03-19 01:34:36 +01:00
(use-package smart-comment
:bind
2019-03-20 09:54:12 +01:00
("C-x c" . smart-comment))
2019-03-19 01:34:36 +01:00
2019-03-22 09:03:23 +01:00
;; Toggle betweeen beginning/end of line and beginning/end of code.
(use-package mwim
:bind
("<home>" . mwim-beginning-of-line-or-code)
("<end>" . mwim-end-of-line-or-code))
2019-03-19 01:34:36 +01:00
2019-03-22 09:03:23 +01:00
;; Auto-type closing brackets.
2019-03-19 01:43:28 +01:00
(electric-pair-mode t)
2019-03-22 09:03:23 +01:00
;; Fold code.
(use-package fold-dwim
:bind
("<f7>" . fold-dwim-toggle)
2019-03-21 11:29:28 +01:00
("C-x t" . fold-dwim-toggle)
:hook
(prog-mode . hs-minor-mode))
2019-03-22 09:03:23 +01:00
;; Highlight indentation levels.
2019-03-21 11:29:28 +01:00
(use-package highlight-indent-guides
2019-03-22 09:03:23 +01:00
:custom
(highlight-indent-guides-method 'character)
(highlight-indent-guides-responsive 'top)
2019-03-21 11:29:28 +01:00
:hook
(prog-mode . highlight-indent-guides-mode))
2019-03-22 09:03:23 +01:00
;; Tries to find structures and jumps to them.
(use-package imenu-anywhere
:after ido-completing-read+
:bind
("M-i" . imenu-anywhere))
;;;;;;;;;;;;;;;;;;;; Appearance ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2019-03-22 09:03:23 +01:00
;; Icons (required by doom).
(use-package all-the-icons
:config
(unless (file-exists-p "~/.local/share/fonts/all-the-icons.ttf")
(all-the-icons-install-fonts t)))
2019-03-22 09:03:23 +01:00
;; Themes for doom-modeline.
2019-03-22 00:40:07 +01:00
(use-package doom-themes
:unless slow-computer
:after (all-the-icons neotree)
2019-03-22 09:03:23 +01:00
:custom
(doom-neotree-file-icons 'icons)
2019-03-22 00:40:07 +01:00
:config
(load-theme 'doom-molokai t)
2019-03-22 09:03:23 +01:00
(doom-themes-neotree-config))
2019-03-22 09:03:23 +01:00
;; Neat modeline.
(use-package doom-modeline
:after all-the-icons
2019-03-22 01:57:44 +01:00
:init
2019-03-22 09:03:23 +01:00
(column-number-mode t) ; Show column numbers in modeline.
:config
(setq doom-modeline-minor-modes t)
2019-03-22 09:03:23 +01:00
:hook
(after-init . doom-modeline-mode))
2019-03-22 09:03:23 +01:00
;; Miscellaneous visual improvements.
(set-face-font 'default "Source Code Pro")
2019-03-22 09:03:23 +01:00
(global-hl-line-mode t) ; Highlight current line.
(size-indication-mode) ; Buffer size display in the modeline.
(show-paren-mode t) ; Visualize matching parens.
;; Show line numbers on the left of the buffer.
(use-package display-line-numbers
:if (>= emacs-major-version 26)
:config
(global-display-line-numbers-mode))
2019-03-22 09:41:57 +01:00
;; Colored man pages
(use-package man
:defer t
:custom-face
(Man-overstrike ((t (:inherit font-lock-type-face :bold t))))
(Man-underline ((t (:inherit font-lock-keyword-face :underline t)))))
2019-03-19 00:12:11 +01:00
;;;;;;;;;;;;;;;;;;;; Misc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2019-03-22 09:03:23 +01:00
;; Show directory tree in a window.
2019-03-19 00:12:11 +01:00
(use-package neotree
:demand t
2019-03-20 07:16:58 +01:00
:after all-the-icons
:custom
(neo-smart-open t)
(neo-show-updir-line t) ; Disabled by doom-themes?
(neo-window-width 30)
2019-03-19 00:12:11 +01:00
:bind
("<f8>" . neotree-toggle))
2019-03-22 09:03:23 +01:00
;; Git integration.
2019-03-19 00:12:11 +01:00
(use-package magit
2019-03-22 01:00:14 +01:00
:unless slow-computer
:init
(use-package git-commit)
:config
2019-03-22 09:03:23 +01:00
(defun my/magit-kill-buffers (arg)
"Restore window configuration and kill all Magit buffers."
(interactive)
(let ((buffers (magit-mode-get-buffers)))
(magit-restore-window-configuration)
(mapc #'kill-buffer buffers)))
2019-03-19 00:12:11 +01:00
:bind
("C-x g" . magit-status)
("C-x M-g" . magit-dispatch)
;; (:map magit-status-mode-map
;; ("q" . my-magit-kill-buffers))
:custom
;; What's better, mapping q or binding the function here?
2019-03-22 09:03:23 +01:00
(magit-bury-buffer-function 'my/magit-kill-buffers))
2019-03-19 00:12:11 +01:00
;; Draw line in column 80
(use-package fill-column-indicator
:after company
:config
2019-03-22 09:03:23 +01:00
;; ;; TODO: Find out why I can't put this in :init or :config.
;; (define-globalized-minor-mode global-fci-mode fci-mode
;; (lambda () (fci-mode t)))
;; (global-fci-mode t)
2019-03-22 09:03:23 +01:00
;; Fix bug with fci + company.
(defun my/on-off-fci-before-company(command)
(when (string= "show" command)
(turn-off-fci-mode))
(when (string= "hide" command)
(turn-on-fci-mode)))
2019-03-22 09:03:23 +01:00
(advice-add 'company-call-frontends :before #'my/on-off-fci-before-company)
:hook
(prog-mode . fci-mode)
(text-mode . fci-mode)
:custom
(fci-rule-column 80))
2019-03-19 00:12:11 +01:00
2019-03-22 09:03:23 +01:00
;; Interactive substring matching.
2019-03-19 08:24:13 +01:00
(use-package ido
2019-03-21 11:29:28 +01:00
:defer 1
2019-03-19 08:24:13 +01:00
:config
(ido-mode t)
(ido-everywhere t))
2019-03-22 09:03:23 +01:00
;; Flexible matching for ido.
2019-03-19 00:12:11 +01:00
(use-package flx-ido
:after ido
2019-03-22 09:03:23 +01:00
:custom
2019-03-22 09:41:57 +01:00
(ido-enable-flex-matching t)
(ido-ignore-extensions t) ; Ignore extension like ~ and .o.
(ido-use-virtual-buffers t) ; Keep history of recently opened buffers.
2019-03-19 00:12:11 +01:00
:config
2019-03-22 09:41:57 +01:00
(flx-ido-mode t))
2019-03-19 23:24:39 +01:00
2019-03-22 09:03:23 +01:00
;; Replaces stock emacs completion with ido completion wherever it is possible.
(use-package ido-completing-read+
2019-03-22 00:40:07 +01:00
:unless slow-computer
:after ido
:config
(ido-ubiquitous-mode t))
2019-03-22 09:03:23 +01:00
;; Advanced tab bar.
2019-03-22 00:40:07 +01:00
(use-package tabbar-ruler
:unless slow-computer
:after projectile
:init
(setq tabbar-ruler-global-tabbar t)
:config
2019-03-22 09:03:23 +01:00
;; (tabbar-ruler-group-by-projectile-project) ; Group by projectile.
;; (tabbar-ruler-group-buffer-groups) ; Group by file type.
(tabbar-ruler-group-user-buffers) ; Group by frame.
;; (mode-icons-mode 0) ; Disable modeline symbols.
2019-03-22 00:40:07 +01:00
;; I have to define these 2 times, don't know why.
(set-face-attribute 'tabbar-selected nil
2019-03-20 07:16:58 +01:00
:background "gray11"
:foreground "light gray"
2019-03-19 08:04:53 +01:00
:family "Sans Serif"
2019-03-22 00:40:07 +01:00
:bold t)
(set-face-attribute 'tabbar-unselected nil
:background "gray18"
:foreground "dark gray"
:family "Sans Serif"
:italic t)
2019-03-22 09:03:23 +01:00
(add-hook 'projectile-after-switch-project-hook ; Does not work under :hook.
2019-03-22 00:40:07 +01:00
'tabbar-ruler-group-by-projectile-project)
:bind
("C-<prior>" . 'tabbar-ruler-tabbar-backward-tab)
("C-<next>" . 'tabbar-ruler-tabbar-forward-tab)
:custom-face
;; I Have to define these 2 times, don't know why.
(tabbar-selected (nil
:background "gray11"
:foreground "light gray"
:family "Sans Serif"
:bold t))
(tabbar-unselected (nil
:background "gray18"
:foreground "dark gray"
:family "Sans Serif"
:italic t)))
2019-03-19 00:12:11 +01:00
2019-03-22 09:03:23 +01:00
;; Visualize whitespace.
2019-03-19 00:12:11 +01:00
(use-package whitespace
:config
2019-03-22 09:03:23 +01:00
(delete 'newline-mark whitespace-style) ; Don't paint $ at eol.
(delete 'lines whitespace-style) ; Don't paint lines red if too long.
2019-03-22 09:03:23 +01:00
;; Don't show dots in company menu.
(defun my/on-off-whitespace-before-company(command)
(when (string= "show" command)
(whitespace-mode -1))
(when (string= "hide" command)
(whitespace-mode t)))
(advice-add 'company-call-frontends
2019-03-22 09:03:23 +01:00
:before #'my/on-off-whitespace-before-company)
2019-03-19 00:12:11 +01:00
:bind
("C-x w" . 'whitespace-mode)
:hook
(prog-mode . whitespace-mode)
:custom-face
(whitespace-space ((nil :foreground "gray18"))))
2019-03-19 00:12:11 +01:00
2019-03-22 09:03:23 +01:00
;; Spell checking.
2019-03-19 00:12:11 +01:00
(use-package flyspell
2019-03-22 09:03:23 +01:00
:unless slow-computer
:custom
(ispell-dictionary "english")
2019-03-19 00:12:11 +01:00
:config
2019-03-22 09:03:23 +01:00
(defun my/toggle-flyspell ()
"Toggle flyspell-mode and run flyspell-buffer after activating."
2019-03-19 00:12:11 +01:00
(interactive)
(if (bound-and-true-p flyspell-mode)
(flyspell-mode 0)
(flyspell-mode)
(flyspell-buffer)))
:bind
2019-03-22 09:03:23 +01:00
("<f6>" . my/toggle-flyspell)
2019-03-19 00:12:11 +01:00
:hook
2019-03-22 09:03:23 +01:00
;; Spellcheck comments.
2019-03-19 00:12:11 +01:00
(c++-mode . flyspell-prog-mode)
(c-mode . flyspell-prog-mode))
2019-03-22 09:03:23 +01:00
;; Multiple cursors.
2019-03-19 00:12:11 +01:00
(use-package multiple-cursors
:init
(global-unset-key (kbd "M-<down-mouse-1>"))
:bind
2019-03-20 09:54:12 +01:00
("C-x M-m" . mc/edit-lines)
2019-03-19 00:12:11 +01:00
("M-<mouse-1>" . mc/add-cursor-on-click))
2019-03-22 09:03:23 +01:00
;; If 2 files have the same name, append directory name after the filename.
(use-package uniquify
:defer 1
:ensure nil ; Included in emacs
:custom
(uniquify-after-kill-buffer-p t)
(uniquify-buffer-name-style 'post-forward)
(uniquify-strip-common-suffix t))
2019-03-22 09:03:23 +01:00
;; Delete old buffers.
2019-03-22 01:57:44 +01:00
;; https://www.emacswiki.org/emacs/CleanBufferList
(use-package midnight
:init
2019-03-22 09:03:23 +01:00
(setq midnight-delay 0) ; 0 seconds after "midnight"
:custom
(clean-buffer-list-delay-general 1) ; Clean normal bufs after 1d.
(clean-buffer-list-delay-special (* 30 60)) ; Clean special bufs after 30m.
2019-03-22 01:57:44 +01:00
:config
2019-03-22 09:03:23 +01:00
(setq clean-buffer-list-kill-regexps ; Add these to special buffers.
2019-03-22 01:57:44 +01:00
(nconc clean-buffer-list-kill-regexps
'("\\`magit-?.*:"
"\\.log\\'")))
2019-03-22 09:03:23 +01:00
(setq midnight-period (* 1 60 60)) ; Clean every 1 hours.
2019-03-22 01:57:44 +01:00
(midnight-mode t))
;; The string Time-stamp: <> in the first 8 lines of the file will be updated
;; with the current timestamp.
(use-package time-stamp
2019-03-22 09:03:23 +01:00
:custom
(time-stamp-format "%:y-%02m-%02d %02H:%02M:%02S %Z")
2019-03-22 01:57:44 +01:00
:hook
(before-save . time-stamp))
2019-03-22 09:03:23 +01:00
;; Edit multiple regions in the same way simultaneously.
(use-package iedit
:bind
("C-;" . iedit-mode))
(use-package easy-hugo
:custom
(easy-hugo-basedir "~/Projekte/www/blog.tastytea.de/")
(easy-hugo-url "https://blog.tastytea.de")
(easy-hugo-previewtime "300")
(easy-hugo-postdir "content/posts")
(easy-hugo-default-ext ".adoc")
:bind
("C-c h" . easy-hugo)
:mode
;; The mode is not turned on?
("\\`'\\*Easy-hugo\\*\\'" . easy-hugo-mode))
2019-03-22 09:03:23 +01:00
;; Automatically insert text in new files.
(use-package autoinsert
:init
;; I only use it in here for now
(use-package yasnippet)
(defun my/autoinsert-yas-expand()
"Replace text in yasnippet template."
(yas-minor-mode t)
(yas-expand-snippet (buffer-string) (point-min) (point-max)))
:config
(add-to-list 'auto-insert-alist
'(("\\.\\(cpp\\|cc\\|cxx\\|c\\+\\+\\)\\'" . "C++ program") .
["cpp" my/autoinsert-yas-expand]))
(add-to-list 'auto-insert-alist
'(("\\.\\(hpp\\|hh\\|hxx\\|h\\+\\+\\)\\'" . "C++ header") .
["hpp" my/autoinsert-yas-expand]))
:custom
(auto-insert-directory (concat user-emacs-directory "auto-insert"))
2019-03-22 09:03:23 +01:00
(auto-insert-query nil) ; Don't ask before inserting.
:hook
(find-file . auto-insert))
2019-03-19 00:12:11 +01:00
;;;;;;;;;;;;;;;;;;;; File formats ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package adoc-mode
:mode
(("\\.adoc" . adoc-mode))
:hook
(adoc-mode . visual-line-mode))
2019-03-19 00:12:11 +01:00
(use-package markdown-mode
2019-03-22 09:03:23 +01:00
:custom
(markdown-command "markdown2")
:mode
(("README\\.md\\'" . gfm-mode)
("\\.md\\'" . markdown-mode)
("\\.markdown\\'" . markdown-mode))
:hook
(markdown-mode . visual-line-mode)
)
2019-03-19 00:12:11 +01:00
(use-package crontab-mode
:mode
(("/cron\\.d/" . crontab-mode))
("\\`'/etc/crontab\\'" . crontab-mode))
2019-03-19 00:12:11 +01:00
2019-03-19 00:28:35 +01:00
(use-package nginx-mode
:defer t)
(use-package company-nginx
:after nginx-mode
:hook
(nginx-mode . company-nginx-keywords))
2019-03-19 00:28:35 +01:00
2019-03-19 00:12:11 +01:00
;;;;;;;;;;;;;;;;;;;; Server / Remote editing ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2019-03-22 09:03:23 +01:00
;; Edit remote files.
2019-03-22 00:40:07 +01:00
(use-package tramp
:unless slow-computer
:defer 1
:config
2019-03-22 09:03:23 +01:00
;; ssh is faster than scp and supports ports.
2019-03-22 00:40:07 +01:00
(setq tramp-default-method "ssh")
2019-03-22 09:03:23 +01:00
;; Add verification code support.
2019-03-22 00:40:07 +01:00
(customize-set-variable
'tramp-password-prompt-regexp
(concat
"^.*"
(regexp-opt
'("passphrase" "Passphrase"
"password" "Password"
"Verification code")
t)
".*:\0? *"))
2019-03-22 09:03:23 +01:00
;; Respect remote PATH.
2019-03-22 00:40:07 +01:00
(add-to-list 'tramp-remote-path 'tramp-own-remote-path))
2019-03-19 00:12:11 +01:00
;; Run server if:
2019-03-22 09:03:23 +01:00
;; - Our EUID is not 0,
;; - We are not logged in via SSH,
;; - It is not already running.
2019-03-19 00:12:11 +01:00
(unless (equal (user-real-uid) 0)
(unless (getenv "SSH_CONNECTION")
(use-package server
2019-03-21 11:29:28 +01:00
:defer 1
2019-03-19 00:12:11 +01:00
:init
(setq server-use-tcp t
server-port 51313
2019-03-22 09:03:23 +01:00
server-auth-key ; 64 chars, saved in ~/.emacs.d/server/server.
2019-03-19 00:12:11 +01:00
"phahw2ohVoh0oopheish7IVie9desh8aequeenei3uo8wahShe%thuadaeNa4ieh")
:config
(unless (server-running-p)
(server-start))
)))
2019-03-22 09:03:23 +01:00
;; Set garbage collection threshold to original value.
(setq gc-cons-threshold (car (get 'gc-cons-threshold 'standard-value)))
2019-03-19 00:55:01 +01:00
(provide 'init)
2019-03-22 09:03:23 +01:00
;;; init.el ends here.