home · contact · privacy
Improve Emacs setup.
[config] / buster / home_files / user_eeepc / .emacs.d / init.el
1 ;; general layout
2 ;; ==============
3
4 ;; need no stinkin emacs help screen as start up, and no menu bar
5 (setq inhibit-startup-screen t)
6 (menu-bar-mode -1)
7
8 ;; highlight cursor line, parentheses
9 (global-hl-line-mode 1)
10 (show-paren-mode 1)
11
12 ;; show line numbers, use separator space
13 (global-linum-mode)
14 (setq linum-format "%d ")
15
16 ;; count cursor column, row in mode line
17 (setq column-number-mode t)
18
19 ;; settings to make GUI tolerable
20 (if window-system
21   (progn
22     (add-to-list 'default-frame-alist '(foreground-color . "white"))
23     (add-to-list 'default-frame-alist '(background-color . "black"))
24     (set-face-attribute 'default nil :height 80)
25     (scroll-bar-mode -1)
26     (setq visible-bell t)
27     (setq linum-format "%d")))
28
29 ;; use as default browser what XDG offers
30 (setq-default browse-url-browser-function 'browse-url-xdg-open)
31
32 ;; general keybindings
33 ;; ===================
34
35 ;; create and use a minimal global map using just the self-insert command
36 ;; bindings and a selection of some to me very common keystrokes
37 (setq minimal-map (make-sparse-keymap))
38 (substitute-key-definition 'self-insert-command 'self-insert-command
39                            minimal-map global-map)
40 (use-global-map minimal-map)
41 (global-set-key (kbd "DEL") 'backward-delete-char-untabify)
42 (global-set-key (kbd "RET") 'newline)
43 (global-set-key (kbd "TAB") 'indent-for-tab-command)
44 (global-set-key (kbd "<up>") 'previous-line)
45 (global-set-key (kbd "<down>") 'next-line)
46 (global-set-key (kbd "<left>") 'left-char)
47 (global-set-key (kbd "<right>") 'right-char)
48 (global-set-key (kbd "<prior>") 'scroll-down-command)
49 (global-set-key (kbd "<next>") 'scroll-up-command)
50 (global-set-key (kbd "M-x") 'execute-extended-command)
51 (global-set-key (kbd "C-g") 'keyboard-quit)
52 ;(global-set-key (kbd "<f3>") 'kmacro-start-macro-or-insert-counter)
53 ;(global-set-key (kbd "<f4>") 'kmacro-end-or-call-macro)
54 ;; note how to switch back to the original map: (use-global-map global-map)
55 (setq shr-map (make-sparse-keymap))  ; got annoying in elfeed-show on URLs
56
57
58 ;; minibuffer
59 ;; ==========
60
61 ;; incremental minibuffer completion
62 (icomplete-mode 1)
63
64
65
66 ;; text editing
67 ;; ============
68
69 ;; tabs are evil
70 (setq-default indent-tabs-mode nil)
71 (setq-default tab-width 4)
72 (setq indent-line-function 'insert-tab)
73
74 ;; show trailing whitespace
75 (setq-default show-trailing-whitespace 1)
76
77 ;; on save, ask whether to ensure text file's last line ends in a
78 ;; newline character
79 (setq require-final-newline 1)
80
81 ;; use dedicated directory for version-controlled, endless backups;
82 ;; never delete old versions
83 (setq make-backup-files t
84       backup-directory-alist `(("." . "~/.emacs_backups"))
85       backup-by-copying t
86       version-control t
87       delete-old-versions 1)  ;; neither t nor nil: never delete
88
89
90
91 ;; package management
92 ;; ==================
93
94 ;; where we get packages from
95 (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
96                          ("melpa-unstable" . "https://melpa.org/packages/")
97                          ("melpa-stable" . "https://stable.melpa.org/packages/")))
98
99 ;; ensure certain packages are installed (actually, we use Debian repos here)
100 ;(setq package-list '(elfeed ledger-mode))
101 ;(package-initialize)
102 ;(dolist (package package-list)
103 ;  (unless (package-installed-p package)
104 ;    (package-install package)))
105
106
107
108 ;;; window management
109 ;;; =================
110 ;
111 ;;; track window configurations to allow window config undo
112 ;(winner-mode 1)
113
114
115
116 ;; org mode
117 ;; ========
118
119 ;; unsure why, but to re-set the key map, we not only have to explicitely do it
120 ;; only after org-mode loading, but also have to explicitely overwrite the
121 ;; C-c keybinding; TODO: investigate
122 (with-eval-after-load 'org
123     (setq org-mode-map (make-sparse-keymap))
124     (define-key org-mode-map (kbd "C-c") nil)
125     (define-key org-mode-map (kbd "TAB") 'org-cycle)
126     (define-key org-mode-map (kbd "<backtab>") 'org-shifttab))
127
128 ;; basic org-capture config
129 (setq org-capture-templates
130       '(("x" "test" plain (file "~/org/notes.org") "%T: %?")))
131 (add-hook 'org-capture-mode-hook 'evil-insert-state)
132
133 ;; agenda view on startup
134 (load-library "find-lisp")
135 (setq org-agenda-files (find-lisp-find-files "~/org" "\.org$"))
136 (setq org-agenda-span 90)
137 (setq org-agenda-use-time-grid nil)
138 (add-hook 'emacs-startup-hook (lambda ()
139                                  (org-agenda-list)
140                                  (switch-to-buffer "*Org Agenda*")
141                                  (other-window 1)))
142
143 ;;; for calendar, use ISO date style
144 ;(setq calendar-date-style 'iso)
145 ;(setq diary-number-of-entries 7)
146 ;(diary)
147 ;(setq org-agenda-time-grid '((today require-timed remove-match)
148 ;                             #("----------------" 0 16 (org-heading t))
149 ;                             (0 200 400 600 800 1000 1200
150 ;                                1400 1600 1800 2000 2200)))
151
152 ;; empty org-agenda-mode keybindings
153 (add-hook 'org-agenda-mode-hook
154           (lambda ()
155             (setq org-agenda-mode-map (make-sparse-keymap))))
156 (add-hook 'org-agenda-mode-hook
157           (lambda ()
158             (use-local-map (make-sparse-keymap))))
159
160 ;; org-publish-all
161 (setq org-publish-project-alist
162       '(
163         ("website"
164          :base-directory "~/org/web/"
165          :base-extension "org"
166          :publishing-directory "~/html/"
167          :recursive t
168          :publishing-function org-html-publish-to-html
169          :headline-levels 4             ; Just the default for this project.
170          :auto-preamble t
171           )))
172
173 ;; use [ki:] syntax to hide stuff from exports
174 (defun classify-information (text backend info)
175   "Replaces '[ki:WHATEVER]' with '[klassifizierte Information]'."
176   (replace-regexp-in-string "\\[ki:[^\]]*\]" "[klassifizierte Information]" text))
177 (add-hook 'org-export-filter-plain-text-functions 'classify-information)
178
179 ;; add HTML validator link to exports
180 (setq org-html-validation-link "<a href=\"https://validator.w3.org/check?uri=referer\">Validate</a>")
181
182
183
184 ;;; plomvi mode
185 ;;; ===========
186 (load "~/public_repos/plomvi.el/plomvi.el")
187 (global-set-key (kbd "C-c") 'plomvi-activate)
188 (plomvi-global-mode 1)
189
190
191
192 ;;; Info mode
193 ;;; =========
194
195 (setq Info-mode-map (make-sparse-keymap))
196 (define-key Info-mode-map (kbd "RET") 'Info-follow-nearest-node)
197 (define-key Info-mode-map (kbd "u") 'Info-up)
198 (define-key Info-mode-map (kbd "TAB") 'Info-next-reference)
199 (define-key Info-mode-map (kbd "<backtab>") 'Info-prev-reference)
200 (define-key Info-mode-map (kbd "H") 'Info-history-back)
201 (define-key Info-mode-map (kbd "L") 'Info-history-forward)
202 (define-key Info-mode-map (kbd "I") 'Info-goto-node)
203 (define-key Info-mode-map (kbd "i") 'Info-index)
204
205 ;; help mode
206 ;; =========
207
208 (setq help-mode-map (make-sparse-keymap))
209 (define-key help-mode-map (kbd "TAB") 'forward-button)
210 (define-key help-mode-map (kbd "RET") 'help-follow)
211 (define-key help-mode-map (kbd "<backtab>") 'backward-button)
212
213 ;; elfeed
214 ;; ======
215
216 (require 'elfeed)  ; needed so we can set the font faces
217 (set-face-background 'elfeed-search-title-face "magenta")
218 (set-face-background 'elfeed-search-unread-count-face "magenta")
219 (setq elfeed-feeds
220       '("https://capsurvival.blogspot.com/feeds/posts/default"
221         "https://jungle.world/rss.xml"
222         "http://news.dieweltistgarnichtso.net/bin/index.xml"
223         "https://taz.de/!s=&ExportStatus=Intern&SuchRahmen=Online;rss/"
224         "http://www.tagesschau.de/xml/atom"))
225 (setq elfeed-search-mode-map (make-sparse-keymap))
226 (define-key elfeed-search-mode-map (kbd "RET") 'elfeed-search-show-entry)
227 (defun elfeed-search-mark-as-read() (interactive)
228   (elfeed-search-untag-all 'unread))
229 (define-key elfeed-search-mode-map (kbd "r") 'elfeed-search-mark-as-read)
230 (define-key elfeed-search-mode-map (kbd "R") 'elfeed-search-tag-all-unread)
231 (define-key elfeed-search-mode-map (kbd "f") 'elfeed-search-live-filter)
232 (define-key elfeed-search-mode-map (kbd "u") 'elfeed-update)
233 (setq elfeed-show-mode-map (make-sparse-keymap))
234 (define-key elfeed-show-mode-map (kbd "u") 'elfeed)
235 (define-key elfeed-show-mode-map (kbd "TAB") 'shr-next-link)
236 (define-key elfeed-show-mode-map (kbd "<backtab>") 'shr-previous-link)
237 (define-key elfeed-show-mode-map (kbd "a") 'elfeed-show-prev)
238 (define-key elfeed-show-mode-map (kbd "d") 'elfeed-show-next)
239 (define-key elfeed-show-mode-map (kbd "y") 'shr-copy-url)
240 (define-key elfeed-show-mode-map (kbd "RET") 'shr-browse-url)
241
242 ;; eww
243 ;; ===
244
245 (setq eww-mode-map (make-sparse-keymap))
246 (define-key eww-mode-map (kbd "TAB") 'shr-next-link)
247 (define-key eww-mode-map (kbd "<backtab>") 'shr-previous-link)
248 (define-key eww-mode-map (kbd "H") 'eww-back-url)
249 (define-key eww-mode-map (kbd "L") 'eww-forward-url)
250
251 ;; ledger
252 ;; ======
253 (setq ledger-mode-map (make-sparse-keymap))
254 (define-key ledger-mode-map (kbd "TAB") 'ledger-magic-tab)
255
256
257 ;; unset other maps so they don't disturb C-c keybinding
258 ;; =====================================================
259 ;; TODO: saner solution would be a default-activated minor mode that binds
260 ;; C-c
261 (setq conf-mode-map (make-sparse-keymap))
262 (setq sh-mode-map (make-sparse-keymap))
263 (setq python-mode-map (make-sparse-keymap))