3b85459c0b7094b23d0a0632b9ae9a89611e710c
[emacs.git] / .emacs.d / config / emacs.org
1 #+TITLE: emacs.org - Ganneffs emacs configuration
2 #+DESCRIPTION: My current Emacs configuration
3 #+KEYWORDS: org-mode Emacs configuration
4 #+STARTUP: align fold nodlcheck hidestars oddeven lognotestate
5 #+SETUPFILE: ~/.emacs.d/elisp/org-templates/level-0.org
6 #+LATEX_CMD: xelatex
7
8 * Basic config
9 ** General functions
10 :PROPERTIES:
11 :ID: b6e6cf73-9802-4a7b-bd65-fdb6f9745319
12 :END:
13 The following functions are used throughout my config, and so I load
14 them first.
15 *** safe-load
16 safe-load does not break emacs initialization, should a file be
17 unreadable while emacs boots up.
18 #+BEGIN_SRC emacs-lisp :tangle yes
19 (defvar safe-load-error-list ""
20 "*List of files that reported errors when loaded via safe-load")
21
22 (defun safe-load (file &optional noerror nomessage nosuffix)
23 "Load a file. If error on load, report back, wait for
24 a key stroke then continue on"
25 (interactive "f")
26 (condition-case nil (load file noerror nomessage nosuffix)
27 (error
28 (progn
29 (setq safe-load-error-list (concat safe-load-error-list " " file))
30 (message "****** [Return to continue] Error loading %s" safe-load-error-list )
31 (sleep-for 1)
32 nil))))
33
34 (defun safe-load-check ()
35 "Check for any previous safe-load loading errors. (safe-load.el)"
36 (interactive)
37 (if (string-equal safe-load-error-list "") ()
38 (message (concat "****** error loading: " safe-load-error-list))))
39 #+END_SRC
40 *** Local autoloads
41 I have some stuff put away in my local dir. I don't want to load it all
42 at startup time, so it is using the autoload feature. For that to work
43 load the loaddefs, so autoload knows where to grab stuff
44 #+BEGIN_SRC emacs-lisp :tangle yes
45 (safe-load (concat jj-elisp-dir "/tiny/loaddefs.el"))
46 (safe-load (concat jj-elisp-local-dir "/loaddefs.el"))
47 #+END_SRC
48 *** Keep *scratch* around
49 Always ensure to have a scratch buffer around.
50 #+BEGIN_SRC emacs-lisp :tangle yes
51 (with-current-buffer (get-buffer-create "*scratch*")
52 (lisp-interaction-mode)
53 (make-local-variable 'kill-buffer-query-functions)
54 (add-hook 'kill-buffer-query-functions 'kill-scratch-buffer))
55 #+END_SRC
56 *** add-auto-mode
57 Handier way to add modes to auto-mode-alist
58 #+BEGIN_SRC emacs-lisp :tangle yes
59 (defun add-auto-mode (mode &rest patterns)
60 "Add entries to `auto-mode-alist' to use `MODE' for all given file `PATTERNS'."
61 (dolist (pattern patterns)
62 (add-to-list 'auto-mode-alist (cons pattern mode))))
63 #+END_SRC
64 *** config helpers use-package/bind-key
65 Helpers for the config
66 https://github.com/jwiegley/use-package
67 #+BEGIN_SRC emacs-lisp :tangle yes
68 (require 'use-package)
69 (require 'bind-key)
70 #+END_SRC
71 *** hook-into-modes
72 [2014-05-20 Tue 22:36]
73 #+BEGIN_SRC emacs-lisp :tangle yes
74 (defmacro hook-into-modes (func modes)
75 `(dolist (mode-hook ,modes)
76 (add-hook mode-hook ,func)))
77 #+END_SRC
78
79 *** elpa
80 The Emacs Lisp Package Archive contains things I want.
81 #+BEGIN_SRC emacs-lisp :tangle yes
82 (when (> emacs-major-version 23)
83 (require 'package)
84 (setq package-user-dir (expand-file-name "elpa" jj-elisp-dir))
85 (dolist (source '(("melpa" . "http://melpa.milkbox.net/packages/")
86 ("melpa-stable" . "http://melpa-stable.milkbox.net/packages/")
87 ("marmalade" . "http://marmalade-repo.org/packages/")
88 ("elpy" . "http://jorgenschaefer.github.io/packages/")
89 ("elpa" . "http://tromey.com/elpa/")))
90 (add-to-list 'package-archives source t))
91 (package-initialize))
92 #+END_SRC
93
94 ** Path settings
95 *** Load path
96 We need to define the load-path. As I have lots of things I add
97 locally, its getting a few entries. I disliked the repeated
98 /add-to-list/ lines, so I now just take all subdirectories of
99 jj-elisp-dir and add them.
100
101 Additionally I also ensure that files in there are recompiled, when
102 neccessary.
103 #+BEGIN_SRC emacs-lisp :tangle yes
104 (dolist
105 (project (directory-files jj-elisp-dir t "\\w+"))
106 (when (file-directory-p project)
107 (if (string= project "emacs23")
108 (when (version< emacs-version "24")
109 (add-to-list 'load-path project))
110 (add-to-list 'load-path project))
111 ;(byte-recompile-directory project 0)
112 ))
113 #+END_SRC
114
115 *** Info path
116 Help emacs to find the info files
117 #+BEGIN_SRC emacs-lisp :tangle no
118 (setq Info-directory-list '("~/emacs/info"
119 "/usr/local/share/info/"
120 "/usr/local/info/"
121 "/usr/local/gnu/info/"
122 "/usr/local/gnu/lib/info/"
123 "/usr/local/gnu/lib/emacs/info/"
124 "/usr/local/emacs/info/"
125 "/usr/local/lib/info/"
126 "/usr/local/lib/emacs/info/"
127 "/usr/share/info/emacs-23"
128 "/usr/share/info/"
129 "/usr/share/info/"))
130 (setq Info-default-directory-list
131 (cons "~/emacs/info" Info-default-directory-list))
132 #+END_SRC
133
134 ** Interface related
135 *** General stuff
136 :PROPERTIES:
137 :ID: 0a1560d9-7e55-47ab-be52-b3a8b8eea4aa
138 :END:
139 I dislike the startup message
140 #+BEGIN_SRC emacs-lisp :tangle yes
141 (setq inhibit-splash-screen t)
142 (setq inhibit-startup-message t)
143 #+END_SRC
144
145 Usually I want the lines to break at 72 characters.
146 #+BEGIN_SRC emacs-lisp :tangle yes
147 (setq fill-column 72)
148 #+END_SRC
149
150 And it is nice to have a final newline in files.
151 (Now off, ethan-wspace is doing it better).
152 #+BEGIN_SRC emacs-lisp :tangle yes
153 (setq require-final-newline nil)
154 (setq mode-require-final-newline nil)
155 #+END_SRC
156
157 After I typed 300 characters or took a break for more than a minute it
158 would be nice of emacs to save whatever I am on in one of its auto-save
159 backups. See [[info:emacs#Auto%20Save%20Control][info:emacs#Auto Save Control]] for more details.
160 #+BEGIN_SRC emacs-lisp :tangle yes
161 (setq auto-save-interval 300)
162 (setq auto-save-timeout 60)
163 #+END_SRC
164
165 Set my full name and my default mail address - for whatever wants to use
166 it later. Also, I am using gnus.
167 #+BEGIN_SRC emacs-lisp :tangle yes
168 (setq user-full-name "Joerg Jaspert")
169 (setq user-mail-address "joerg@ganneff.de")
170 (setq mail-user-agent (quote gnus-user-agent))
171 #+END_SRC
172
173 My default mail server. Well, simply a localhost, I have a forwarder that
174 puts mail off the right way, no need for emacs to have any further
175 knowledge here.
176 #+BEGIN_SRC emacs-lisp :tangle yes
177 (setq smtpmail-default-smtp-server "localhost")
178 (setq smtpmail-smtp-server "localhost")
179 #+END_SRC
180
181 Enable automatic handling of compressed files.
182 #+BEGIN_SRC emacs-lisp :tangle yes
183 (auto-compression-mode 1)
184 #+END_SRC
185
186 Emacs forbids a certain set of commands, as they can be very confusing
187 for new users. Enable them.
188 #+BEGIN_SRC emacs-lisp :tangle yes
189 (put 'narrow-to-region 'disabled nil)
190 (put 'narrow-to-page 'disabled nil)
191 (put 'narrow-to-defun 'disabled nil)
192 (put 'upcase-region 'disabled nil)
193 (put 'downcase-region 'disabled nil)
194 #+END_SRC
195
196 *** Look / Theme
197 I've tried various different fonts and while I like the Terminus font
198 most for my shells, in Emacs Inconsolata clearly wins.
199 #+BEGIN_SRC emacs-lisp :tangle yes
200 (set-frame-font "Inconsolata-14")
201 #+END_SRC
202
203 I always use dark backgrounds, so tell Emacs about it. No need to
204 guess around.
205 #+BEGIN_SRC emacs-lisp :tangle yes
206 (setq-default frame-background-mode jj-color-style)
207 #+END_SRC
208
209 And I always liked dark backgrounds with colors setup for them. So I
210 switched through multiple themes doing it in emacs too, but never
211 entirely liked it. Until I found solarized, which is now not only my
212 emacs theme, but also for most of my other software too, especially my
213 shell. Consistent look is great.
214 #+BEGIN_SRC emacs-lisp :tangle no
215 (if (or (> emacs-major-version 23) (boundp 'custom-theme-load-path))
216 (progn
217 (defun jj-init-theme ()
218 (interactive)
219 (if (eq jj-color-style 'dark )(load-theme 'solarized-dark t)
220 (load-theme 'solarized-light t))
221 (set-face-attribute 'org-date nil :underline nil)
222 (message "Initializing theme solarized-dark")
223 )
224 (add-to-list 'custom-theme-load-path jj-theme-dir)
225 (add-hook 'after-init-hook 'jj-init-theme)
226 )
227 (add-to-list 'load-path (expand-file-name "emacs-color-theme-solarized" jj-elisp-dir))
228 (require 'color-theme-solarized)
229 (color-theme-solarized-dark)
230 )
231 #+END_SRC
232 #+BEGIN_SRC emacs-lisp :tangle yes
233 (use-package solarized
234 :load-path "elisp/emacs-color-theme-solarized"
235 :init
236 (progn
237 (defun jj-init-theme ()
238 (interactive)
239 (if (eq jj-color-style 'dark )(load-theme 'solarized-dark t)
240 (load-theme 'solarized-light t))
241 (set-face-attribute 'org-date nil :underline nil)
242 (message "Initializing theme solarized-dark")
243 )
244 (add-to-list 'custom-theme-load-path jj-theme-dir)
245 (add-hook 'after-init-hook 'jj-init-theme)
246 (jj-init-theme)))
247 #+END_SRC
248
249 Make the fringe (gutter) smaller, the argument is a width in pixels (the default is 8)
250 #+BEGIN_SRC emacs-lisp :tangle yes
251 (if (fboundp 'fringe-mode)
252 (fringe-mode 8))
253 #+END_SRC
254
255 A bit more spacing between buffer lines
256 #+BEGIN_SRC emacs-lisp :tangle yes
257 (setq-default line-spacing 0.1)
258 #+END_SRC
259 *** Cursor changes
260 [2013-04-21 So 20:54]
261 I do not want my cursor to blink.
262 #+BEGIN_SRC emacs-lisp :tangle yes
263 (blink-cursor-mode -1)
264 #+END_SRC
265 *** Menu, Tool and Scrollbar
266 I don't want to see the menu-bar, tool-bar or scrollbar.
267 #+BEGIN_SRC emacs-lisp :tangle yes
268 (when window-system
269 (dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode))
270 (when (fboundp mode) (funcall mode -1))))
271 #+END_SRC
272 **** When using emacs in daemon mode
273 Emacs has a very nice mode where it detaches itself and runs as daemon -
274 and you can just open /frames/ (windows) from it by using [[http://www.emacswiki.org/emacs/EmacsClient][Emacs
275 Client]]. It's fast, it's nice, it's convinient.
276
277 Except that Emacs behaves stupid when you do that and ignores your
278 menu/tool/scrollbar settings. Sucks.
279
280 For them to work even then, we have to do two things.
281 1. We have to set the frame alist. We simple set both,
282 =initial-frame-alist= and =default-frame-alist= to the same value here.
283 #+BEGIN_SRC emacs-lisp :tangle yes
284 (setq initial-frame-alist '(
285 (horizontal-scroll-bars . nil)
286 (vertical-scroll-bars . nil)
287 (menu-bar-lines . 0)
288 ))
289 (setq default-frame-alist (copy-alist initial-frame-alist))
290 #+END_SRC
291 2. We have to disable the toolbar using the customize interface, so you
292 can find that in the [[id:0102208d-fdf6-4928-9e40-7e341bd3aa3a][Customized variables]] section.
293
294 *** Hilight current line in buffer
295 As it says, it does a hilight of the current line.
296 #+BEGIN_SRC emacs-lisp :tangle yes
297 (global-hl-line-mode +1)
298 #+END_SRC
299 *** Allow recursive minibuffers
300 This allows (additional) minibuffer commands while in the minibuffer.
301 #+BEGIN_SRC emacs-lisp :tangle yes
302 (setq enable-recursive-minibuffers 't)
303 #+END_SRC
304
305 *** Modeline related changes
306 I want to see line and column numbers, so turn them on.
307 Size indication lets me know how far I am in a buffer.
308
309 And modeline-posn is great. It will hilight the column number in the
310 modeline in red as soon as you are over the defined limit.
311
312 #+BEGIN_SRC emacs-lisp :tangle yes
313 (line-number-mode 1)
314 (column-number-mode 1)
315 (size-indication-mode 1)
316 (display-time-mode 1)
317 (setq display-time-day-and-date nil)
318 (setq display-time-default-load-average nil)
319 (setq display-time-24hr-format t)
320 (setq modelinepos-column-limit 72)
321
322 (use-package modeline-posn
323 :ensure modeline-posn
324 :config
325 (progn
326 (set-face-foreground 'modelinepos-column-warning "grey20")
327 (set-face-background 'modelinepos-column-warning "red")
328 (setq modelinepos-column-limit 72))
329 )
330 #+END_SRC
331
332 **** diminish
333 [2013-04-22 Mon 11:27]
334 The modeline is easily cluttered up with stuff I don't really need to
335 see. So lets hide those. There are two ways, one of them uses diminish
336 to get entirely rid of some modes, the other is a function taken from
337 "Mastering Emacs" which replaces the modes text with an own (set of)
338 character(s).
339 #+BEGIN_SRC emacs-lisp :tangle yes
340 (require 'diminish)
341 (diminish 'auto-fill-function)
342 (defvar mode-line-cleaner-alist
343 `((auto-complete-mode . " α")
344 (yas-minor-mode . " y")
345 (paredit-mode . " π")
346 (eldoc-mode . "")
347 (abbrev-mode . "")
348 ;; Major modes
349 (lisp-interaction-mode . "λ")
350 (hi-lock-mode . "")
351 (python-mode . "Py")
352 (emacs-lisp-mode . "EL")
353 (org-mode . "Ω")
354 (org-indent-mode . "")
355 (sh-mode . " Σ")
356 (nxhtml-mode . "nx")
357 (subword-mode . ""))
358
359 "Alist for `clean-mode-line'.
360
361 When you add a new element to the alist, keep in mind that you
362 must pass the correct minor/major mode symbol and a string you
363 want to use in the modeline *in lieu of* the original.
364
365 Want some symbols? Go:
366
367 ;ςερτζθιοπασδφγηξκλυχψωβνμ
368 :ΣΕΡΤΖΘΙΟΠΑΣΔΦΓΗΞΚΛΥΧΨΩΒΝΜ
369 @ł€¶ŧ←↓→øþ¨~æſðđŋħ̣ĸł˝^`|»«¢„“”µ·…
370 ☃⌕☥
371 ")
372
373 (add-hook 'after-change-major-mode-hook 'clean-mode-line)
374
375 #+END_SRC
376 Unfortunately icicles breaks this with the way it adds/removes itself,
377 so take it our for now...
378
379 *** Default mode
380 Back when I started with text-mode. But nowadays I want default mode to
381 be org-mode - it is just so much better to use. And does sensible things
382 with many README files out there, and various other "crap" you get to
383 read in emacs.
384 #+BEGIN_SRC emacs-lisp :tangle yes
385 (setq major-mode 'org-mode)
386 (setq initial-major-mode 'org-mode)
387 #+END_SRC
388
389 *** Shell
390 [2013-04-23 Tue 16:43]
391 Shell. zsh in my case.
392 #+BEGIN_SRC emacs-lisp :tangle yes
393 (setq shell-file-name "zsh")
394 (setq shell-command-switch "-c")
395 (setq explicit-shell-file-name shell-file-name)
396 (setenv "SHELL" shell-file-name)
397 (setq explicit-sh-args '("-login" "-i"))
398 (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
399 (setq comint-scroll-to-bottom-on-input t) ; always insert at the bottom
400 (setq comint-scroll-to-bottom-on-output t) ; always add output at the bottom
401 (setq comint-scroll-show-maximum-output t) ; scroll to show max possible output
402 (setq comint-completion-autolist t) ; show completion list when ambiguous
403 (setq comint-input-ignoredups t) ; no duplicates in command history
404 (setq comint-completion-addsuffix t) ; insert space/slash after file completion
405 #+END_SRC
406
407 *** Emacs shell
408 Basic settings for emacs integrated shell
409 #+BEGIN_SRC emacs-lisp :tangle yes
410 (use-package eshell
411 :defer t
412 :init
413 (progn
414 (defun eshell-initialize ()
415 (defun eshell-spawn-external-command (beg end)
416 "Parse and expand any history references in current input."
417 (save-excursion
418 (goto-char end)
419 (when (looking-back "&!" beg)
420 (delete-region (match-beginning 0) (match-end 0))
421 (goto-char beg)
422 (insert "spawn "))))
423 (add-hook 'eshell-expand-input-functions 'eshell-spawn-external-command)
424 (eval-after-load "em-unix"
425 '(progn
426 (unintern 'eshell/su)
427 (unintern 'eshell/sudo))))
428 (add-hook 'eshell-first-time-mode-hook 'eshell-initialize)
429
430 )
431 :config
432 (progn
433 (require 'em-cmpl)
434 (require 'em-prompt)
435 (require 'em-term)
436 (use-package f
437 :ensure f)
438 (setq eshell-cmpl-cycle-completions nil
439 eshell-save-history-on-exit t
440 eshell-cmpl-dir-ignore "\\`\\(\\.\\.?\\|CVS\\|\\.svn\\|\\.git\\)/\\'")
441 (setenv "PAGER" "cat")
442 (setq eshell-visual-commands
443 '("less" "tmux" "htop" "top" "bash" "zsh" "tail"))
444 (setq eshell-visual-subcommands
445 '(("git" "log" "l" "diff" "show")))
446
447 (add-to-list 'eshell-command-completions-alist
448 '("gunzip" "gz\\'"))
449 (add-to-list 'eshell-command-completions-alist
450 '("tar" "\\(\\.tar|\\.tgz\\|\\.tar\\.gz\\)\\'"))
451
452 ;(set-face-attribute 'eshell-prompt nil :foreground "turquoise1")
453 (add-hook 'eshell-mode-hook ;; for some reason this needs to be a hook
454 '(lambda () (define-key eshell-mode-map "\C-a" 'eshell-bol)))
455 (add-hook 'eshell-preoutput-filter-functions
456 'ansi-color-filter-apply)
457 ;; Prompt with a bit of help from http://www.emacswiki.org/emacs/EshellPrompt
458
459 (defmacro with-face (str &rest properties)
460 `(propertize ,str 'face (list ,@properties)))
461
462 (defun eshell/abbr-pwd ()
463 (let ((home (getenv "HOME"))
464 (path (eshell/pwd)))
465 (cond
466 ((string-equal home path) "~")
467 ((f-ancestor-of? home path) (concat "~/" (f-relative path home)))
468 (path))))
469
470 (defun eshell/my-prompt ()
471 (let ((header-bg "#161616"))
472 (concat
473 (with-face user-login-name :foreground "cyan")
474 (with-face (concat "@" hostname) :foreground "white")
475 " "
476 (with-face (eshell/abbr-pwd) :foreground "#009900")
477 (if (= (user-uid) 0)
478 (with-face "#" :foreground "red")
479 (with-face "$" :foreground "#69b7f0"))
480 " ")))
481
482 (setq eshell-prompt-function 'eshell/my-prompt)
483 (setq eshell-highlight-prompt nil)
484 (setq eshell-prompt-regexp "^[^#$\n]+[#$] ")))
485 #+END_SRC
486
487 *** Isearch related
488 Incremental search is great, but annoyingly you need to type whatever
489 you want. If you want to search for just the next (or previous)
490 occurence of what is at your cursor position use the following.
491 *C-x* will insert the current word while *M-up* and *M-down* will just
492 jump to the next/previous occurence of it.
493 #+BEGIN_SRC emacs-lisp :tangle yes
494 (bind-key "C-x" 'sacha/isearch-yank-current-word isearch-mode-map)
495 (bind-key* "<M-up>" 'sacha/search-word-backward)
496 (bind-key* "<M-down>" 'sacha/search-word-forward)
497 #+END_SRC
498
499 *** Frame configuration
500 I want to see the buffername and its size, not the host I am on in my
501 frame title.
502 #+BEGIN_SRC emacs-lisp :tangle yes
503 (setq frame-title-format "%b (%i)")
504 #+END_SRC
505
506 *** Protect some buffers
507 I don't want some buffers to be killed, **scratch** for example.
508 In the past I had a long function that just recreated them, but the
509 =keep-buffers= package is easier.
510 #+BEGIN_SRC emacs-lisp :tangle yes
511 (use-package keep-buffers
512 :init
513 (progn
514 (keep-buffers-mode 1)
515 (push '("\\`*scratch" . erase) keep-buffers-protected-alist)
516 (push '("\\`*Org Agenda" . nil) keep-buffers-protected-alist)
517 (push '("\\`*Group" . nil) keep-buffers-protected-alist)
518 ))
519 #+END_SRC
520
521 *** yes-or-no-p
522 Emas usually wants you to type /yes/ or /no/ fully. What a mess, I am
523 lazy.
524 #+BEGIN_SRC emacs-lisp :tangle yes
525 (defalias 'yes-or-no-p 'y-or-n-p)
526 #+END_SRC
527
528 *** Language/i18n stuff
529 In this day and age, UTF-8 is the way to go.
530 #+BEGIN_SRC emacs-lisp :tangle yes
531 (set-language-environment 'utf-8)
532 (set-default-coding-systems 'utf-8)
533 (set-terminal-coding-system 'utf-8)
534 (set-keyboard-coding-system 'utf-8)
535 (set-clipboard-coding-system 'utf-8)
536 (prefer-coding-system 'utf-8)
537 (set-charset-priority 'unicode)
538 (setq default-process-coding-system '(utf-8-unix . utf-8-unix))
539 #+END_SRC
540
541 *** Hilight matching parentheses
542 While I do have the nifty shortcut to jump to the other parentheses,
543 hilighting them makes it obvious where they are.
544 #+BEGIN_SRC emacs-lisp :tangle yes
545 (unless
546 (use-package mic-paren
547 :init
548 (paren-activate))
549
550 (use-package paren
551 :init
552 (progn
553 (show-paren-mode +1)
554 (setq show-paren-style 'parenthesis)
555 )
556 )
557 )
558 #+END_SRC
559 *** Kill other buffers
560 While many editors allow you to close "all the other files, not the one
561 you are in", emacs doesn't have this... Except, now it will.
562 (Update 30.05.2014: Not used ever, deactivated)
563 #+BEGIN_SRC emacs-lisp :tangle no
564 (bind-key "C-c k" 'prelude-kill-other-buffers)
565 #+END_SRC
566 *** Scrolling
567 Default scrolling behaviour in emacs is a bit annoying, who wants to
568 jump half-windows?
569 #+BEGIN_SRC emacs-lisp :tangle yes
570 (setq scroll-margin 0)
571 (setq scroll-conservatively 100000)
572 (setq scroll-up-aggressively 0.0)
573 (setq scroll-down-aggressively 0.0)
574 (setq scroll-preserve-screen-position t)
575 #+END_SRC
576
577 *** Copy/Paste with X
578 [2013-04-09 Di 23:31]
579 The default how emacs handles cutting/pasting with the primary selection
580 changed in emacs24. I am used to the old way, so get it back.
581 #+BEGIN_SRC emacs-lisp :tangle yes
582 (setq x-select-enable-primary t)
583 (setq x-select-enable-clipboard t ;; copy-paste should work ...
584 interprogram-paste-function ;; ...with...
585 'x-cut-buffer-or-selection-value) ;; ...other X clients
586
587 #+END_SRC
588
589 *** Global keyboard changes not directly related to a mode
590 Disable /suspend_frame/ function, I dislike it.
591 #+BEGIN_SRC emacs-lisp :tangle yes
592 (unbind-key "C-z")
593 (unbind-key "C-x C-z")
594 #+END_SRC
595
596 Default of *C-k* is to kill from the point to the end of line. If
597 'kill-whole-line' (see [[id:0a1560d9-7e55-47ab-be52-b3a8b8eea4aa][the kill-whole-line part in "General stuff"]]) is
598 set, including newline. But to kill the entire line, one still needs a
599 *C-a* in front of it. So I change it, by defining a function to do just this for
600 me. Lazyness++.
601 #+BEGIN_SRC emacs-lisp :tangle yes
602 (defun kill-entire-line ()
603 "Kill this entire line (including newline), regardless of where point is within the line."
604 (interactive)
605 (beginning-of-line)
606 (kill-line)
607 (back-to-indentation))
608
609 (unbind-key "C-z")
610 (bind-key* "C-k" 'kill-entire-line)
611 (global-set-key [remap kill-whole-line] 'kill-entire-line)
612 #+END_SRC
613
614 And the same is true when I'm in org-mode, which has an own kill function...
615 (the keybinding happens later, after org-mode is loaded fully)
616 #+BEGIN_SRC emacs-lisp :tangle yes
617 (defun jj-org-kill-line (&optional arg)
618 "Kill the entire line, regardless of where point is within the line, org-mode-version"
619 (interactive "P")
620 (beginning-of-line)
621 (org-kill-line arg)
622 (back-to-indentation)
623 )
624 #+END_SRC
625
626 I really hate tabs, so I don't want any indentation to try using them.
627 And in case a project really needs them, I can change it just for that
628 file/project, but luckily none of those I work in is as broken.
629 #+BEGIN_SRC emacs-lisp :tangle yes
630 (setq-default indent-tabs-mode nil)
631 #+END_SRC
632
633 Make the % key jump to the matching {}[]() if on another, like vi, see [[id:b6e6cf73-9802-4a7b-bd65-fdb6f9745319][the function]]
634 #+BEGIN_SRC emacs-lisp :tangle yes
635 (bind-key* "M-5" 'match-paren)
636 #+END_SRC
637
638 Instead of the default "mark-defun" I want a more readline-like setting.
639 #+BEGIN_SRC emacs-lisp :tangle yes
640 (bind-key "C-M-h" 'backward-kill-word)
641 #+END_SRC
642
643 Align whatever with a regexp.
644 #+BEGIN_SRC emacs-lisp :tangle yes
645 (bind-key "C-x \\" 'align-regexp)
646 #+END_SRC
647
648 Font size changes
649 #+BEGIN_SRC emacs-lisp :tangle yes
650 (bind-key "C-+" 'text-scale-increase)
651 (bind-key "C--" 'text-scale-decrease)
652 #+END_SRC
653
654 Regexes are too useful, so use the regex search by default.
655 #+begin_src emacs-lisp
656 (bind-key "C-s" 'isearch-forward-regexp)
657 (bind-key "C-r" 'isearch-backward-regexp)
658 (bind-key "C-M-s" 'isearch-forward)
659 (bind-key "C-M-r" 'isearch-backward)
660 #+end_src
661
662 Rgrep is infinitely useful in multi-file projects.
663 #+begin_src emacs-lisp
664 (bind-key "C-x C-g" 'rgrep)
665 #+end_src
666
667 Easy way to move a line up - or down. Simpler than dealing with C-x C-t
668 AKA transpose lines.
669 #+BEGIN_SRC emacs-lisp :tangle yes
670 (bind-key "<M-S-up>" 'move-line-up)
671 (bind-key "<M-S-down>" 'move-line-down)
672 #+END_SRC
673
674 "Pull" lines up, join them
675 #+BEGIN_SRC emacs-lisp :tangle yes
676 (defun join-line-or-lines-in-region ()
677 "Join this line or the lines in the selected region.
678 Joins single lines in reverse order to the default, ie. pulls the next one up."
679 (interactive)
680 (cond ((region-active-p)
681 (let ((min (line-number-at-pos (region-beginning))))
682 (goto-char (region-end))
683 (while (> (line-number-at-pos) min)
684 (join-line ))))
685 (t (let ((current-prefix-arg '(4)))
686 (call-interactively 'join-line)))))
687 (bind-key "M-j" 'join-line-or-lines-in-region)
688 #+END_SRC
689
690 When I press Enter I almost always want to go to the right indentation on the next line.
691 #+BEGIN_SRC emacs-lisp :tangle yes
692 (bind-key "RET" 'newline-and-indent)
693 #+END_SRC
694
695 Easier undo, and i don't need suspend-frame
696 #+BEGIN_SRC emacs-lisp :tangle yes
697 (bind-key "C-z" 'undo)
698 #+END_SRC
699
700 Window switching, go backwards. (C-x o goes to the next window)
701 #+BEGIN_SRC emacs-lisp :tangle yes
702 (bind-key "C-x O" (lambda ()
703 (interactive)
704 (other-window -1)))
705 #+END_SRC
706
707 Edit file as root
708 #+BEGIN_SRC emacs-lisp :tangle yes
709 (bind-key "C-x C-r" 'prelude-sudo-edit)
710 #+END_SRC
711
712 M-space is bound to just-one-space, which is great for programming. What
713 it does is remove all spaces around the cursor, except for one. But to
714 be really useful, it also should include newlines. It doesn’t do this by
715 default. Rather, you have to call it with a negative argument. Sure
716 not, bad Emacs.
717 #+BEGIN_SRC emacs-lisp :tangle yes
718 (bind-key "M-SPC" 'just-one-space-with-newline)
719 #+END_SRC
720
721 Count which commands I use how often.
722 #+BEGIN_SRC emacs-lisp :tangle yes
723 (use-package keyfreq
724 :ensure keyfreq
725 :init
726 (progn
727 (setq keyfreq-file (expand-file-name "keyfreq" jj-cache-dir))
728 (setq keyfreq-file-lock (expand-file-name "keyfreq.lock" jj-cache-dir))
729 (keyfreq-mode 1)
730 (keyfreq-autosave-mode 1)))
731 #+END_SRC
732
733 Duplicate current line
734 #+BEGIN_SRC emacs-lisp :tangle yes
735 (defun duplicate-line ()
736 "Insert a copy of the current line after the current line."
737 (interactive)
738 (save-excursion
739 (let ((line-text (buffer-substring-no-properties
740 (line-beginning-position)
741 (line-end-position))))
742 (move-end-of-line 1)
743 (newline)
744 (insert line-text))))
745
746 (bind-key "C-c p" 'duplicate-line)
747 #+END_SRC
748
749 Smarter move to the beginning of the line. That is, it first moves to
750 the beginning of the line - and on second keypress it goes to the
751 first character on line.
752 #+BEGIN_SRC emacs-lisp :tangle yes
753 (defun smarter-move-beginning-of-line (arg)
754 "Move point back to indentation of beginning of line.
755
756 Move point to the first non-whitespace character on this line.
757 If point is already there, move to the beginning of the line.
758 Effectively toggle between the first non-whitespace character and
759 the beginning of the line.
760
761 If ARG is not nil or 1, move forward ARG - 1 lines first. If
762 point reaches the beginning or end of the buffer, stop there."
763 (interactive "^p")
764 (setq arg (or arg 1))
765
766 ;; Move lines first
767 (when (/= arg 1)
768 (let ((line-move-visual nil))
769 (forward-line (1- arg))))
770
771 (let ((orig-point (point)))
772 (back-to-indentation)
773 (when (= orig-point (point))
774 (move-beginning-of-line 1))))
775
776 ;; remap C-a to `smarter-move-beginning-of-line'
777 (global-set-key [remap move-beginning-of-line]
778 'smarter-move-beginning-of-line)
779
780 #+END_SRC
781
782 Easily copy characters from the previous nonblank line, starting just
783 above point. With a prefix argument, only copy ARG characters (never
784 past EOL), no argument copies rest of line.
785 #+BEGIN_SRC emacs-lisp :tangle yes
786 (require 'misc)
787 (bind-key "H-y" 'copy-from-above-command)
788 #+END_SRC
789
790 Open a new X Terminal pointing to the directory of the current
791 buffers path.
792 #+BEGIN_SRC emacs-lisp :tangle yes
793 (bind-key "H-t" 'jj-open-shell)
794 #+END_SRC
795
796 Align code
797 #+BEGIN_SRC emacs-lisp :tangle yes
798 (bind-key "H-a" 'align-code)
799 #+END_SRC
800
801 Insert date
802 #+BEGIN_SRC emacs-lisp :tangle yes
803 (bind-key "C-c d" 'insert-date)
804 #+END_SRC
805
806 Another key for indenting
807 #+BEGIN_SRC emacs-lisp :tangle yes
808 (bind-key "H-i" 'indent-region)
809 #+END_SRC
810
811 Clean all whitespace stuff
812 #+BEGIN_SRC emacs-lisp :tangle yes
813 (bind-key "H-w" 'whitespace-cleanup)
814 #+END_SRC
815
816 Comment/Uncomment
817 #+BEGIN_SRC emacs-lisp :tangle yes
818 (bind-key "H-c" 'comment-dwim)
819 #+END_SRC
820
821 Show keystrokes in progress
822 #+BEGIN_SRC emacs-lisp :tangle yes
823 (setq echo-keystrokes 0.1)
824 #+END_SRC
825 **** Overwrite mode
826 Usually you can press the *Ins*ert key, to get into overwrite mode. I
827 don't like that, have broken much with it and so just forbid it by
828 disabling that.
829 #+BEGIN_SRC emacs-lisp :tangle yes
830 (unbind-key "<insert>")
831 (unbind-key "<kp-insert>")
832 #+END_SRC
833
834 *** Easily navigate sillyCased words
835 #+BEGIN_SRC emacs-lisp :tangle yes
836 (global-subword-mode 1)
837 #+END_SRC
838 *** Delete file of current buffer, then kill buffer
839 [2014-06-14 Sat 23:03]
840 #+BEGIN_SRC emacs-lisp :tangle yes
841 (defun delete-current-buffer-file ()
842 "Removes file connected to current buffer and kills buffer."
843 (interactive)
844 (let ((filename (buffer-file-name))
845 (buffer (current-buffer))
846 (name (buffer-name)))
847 (if (not (and filename (file-exists-p filename)))
848 (ido-kill-buffer)
849 (when (yes-or-no-p "Are you sure you want to remove this file? ")
850 (delete-file filename)
851 (kill-buffer buffer)
852 (message "File '%s' successfully removed" filename)))))
853
854 (global-set-key (kbd "C-x C-k") 'delete-current-buffer-file)
855 #+END_SRC
856 *** Rename file of current buffer
857 [2014-06-14 Sat 23:04]
858 #+BEGIN_SRC emacs-lisp :tangle yes
859 (defun rename-current-buffer-file ()
860 "Renames current buffer and file it is visiting."
861 (interactive)
862 (let ((name (buffer-name))
863 (filename (buffer-file-name)))
864 (if (not (and filename (file-exists-p filename)))
865 (error "Buffer '%s' is not visiting a file!" name)
866 (let ((new-name (read-file-name "New name: " filename)))
867 (if (get-buffer new-name)
868 (error "A buffer named '%s' already exists!" new-name)
869 (rename-file filename new-name 1)
870 (rename-buffer new-name)
871 (set-visited-file-name new-name)
872 (set-buffer-modified-p nil)
873 (message "File '%s' successfully renamed to '%s'"
874 name (file-name-nondirectory new-name)))))))
875
876 (global-set-key (kbd "C-x C-S-r") 'rename-current-buffer-file)
877 #+END_SRC
878 *** Quickly find emacs lisp sources
879 [2014-06-22 Sun 23:05]
880 #+BEGIN_SRC emacs-lisp :tangle yes
881 (bind-key "C-l" 'find-library 'help-command)
882 (bind-key "C-f" 'find-function 'help-command)
883 (bind-key "C-k" 'find-function-on-key 'help-command)
884 (bind-key "C-v" 'find-variable 'help-command)
885 #+END_SRC
886 ** Miscellaneous stuff
887
888 Searches and matches should ignore case.
889 #+BEGIN_SRC emacs-lisp :tangle yes
890 (setq-default case-fold-search t)
891 #+END_SRC
892
893 Which buffers to get rid off at midnight.
894 #+BEGIN_SRC emacs-lisp :tangle yes
895 (setq clean-buffer-list-kill-buffer-names (quote ("*Help*" "*Apropos*"
896 "*Man " "*Buffer List*"
897 "*Compile-Log*"
898 "*info*" "*vc*"
899 "*vc-diff*" "*diff*"
900 "*Customize"
901 "*tramp/" "*debug "
902 "*magit" "*Calendar")))
903 #+END_SRC
904
905 Don't display a cursor in non-selected windows.
906 #+BEGIN_SRC emacs-lisp :tangle yes
907 (setq-default cursor-in-non-selected-windows nil)
908 #+END_SRC
909
910 What should be displayed in the mode-line for files with those types
911 of line endings.
912 #+BEGIN_SRC emacs-lisp :tangle yes
913 (setq eol-mnemonic-dos "(DOS)")
914 (setq eol-mnemonic-mac "(Mac)")
915 #+END_SRC
916
917 Much larger threshold for garbage collection prevents it to run too often.
918 #+BEGIN_SRC emacs-lisp :tangle yes
919 (setq gc-cons-threshold 48000000)
920 #+END_SRC
921
922 #+BEGIN_SRC emacs-lisp :tangle yes
923 (setq max-lisp-eval-depth 1000)
924 (setq max-specpdl-size 3000)
925 #+END_SRC
926
927 Unfill paragraph
928 From https://raw.github.com/qdot/conf_emacs/master/emacs_conf.org
929 #+BEGIN_SRC emacs-lisp :tangle yes
930 (defun unfill-paragraph ()
931 "Takes a multi-line paragraph and makes it into a single line of text."
932 (interactive)
933 (let ((fill-column (point-max)))
934 (fill-paragraph nil)))
935 (bind-key "H-u" 'unfill-paragraph)
936 #+END_SRC
937
938 #+BEGIN_SRC emacs-lisp :tangle yes
939 (setq-default indicate-empty-lines t)
940 (setq sentence-end-double-space nil)
941 #+END_SRC
942
943 Hilight annotations in comments, like FIXME/TODO/...
944 #+BEGIN_SRC emacs-lisp :tangle yes
945 (add-hook 'prog-mode-hook 'font-lock-comment-annotations)
946 #+END_SRC
947
948 *** Browser
949 #+BEGIN_SRC emacs-lisp :tangle yes
950 (setq browse-url-browser-function (quote browse-url-generic))
951 (setq browse-url-generic-program "/usr/bin/x-www-browser")
952 #+END_SRC
953
954 *** When saving a script - make it executable
955 #+BEGIN_SRC emacs-lisp :tangle yes
956 (add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
957 #+END_SRC
958
959 *** Emacs Server
960 #+BEGIN_SRC emacs-lisp :tangle yes
961 (use-package server
962 :init
963 (progn
964 (add-hook 'after-init-hook 'server-start)))
965 #+END_SRC
966
967 ** Customized variables
968 [2013-05-02 Thu 22:14]
969 The following contains a set of variables i may reasonably want to
970 change on other systems - which don't affect the init file loading
971 process. So I *can* use the customization interface for it...
972 #+BEGIN_SRC emacs-lisp :tangle yes
973 (defgroup ganneff nil
974 "Modify ganneffs settings"
975 :group 'environment)
976
977 (defgroup ganneff-org-mode nil
978 "Ganneffs org-mode settings"
979 :tag "Ganneffs org-mode settings"
980 :group 'ganneff
981 :link '(custom-group-link "ganneff"))
982
983 (defcustom bh/organization-task-id "d0db0d3c-f22e-42ff-a654-69524ff7cc91"
984 "ID of the organization task."
985 :tag "Organization Task ID"
986 :type 'string
987 :group 'ganneff-org-mode)
988
989 (defcustom org-my-archive-expiry-days 2
990 "The number of days after which a completed task should be auto-archived.
991 This can be 0 for immediate, or a floating point value."
992 :tag "Archive expiry days"
993 :type 'float
994 :group 'ganneff-org-mode)
995 #+END_SRC
996
997
998 ** Compatibility
999 [2013-05-21 Tue 23:22]
1000 Restore removed var alias, used by ruby-electric-brace and others
1001 #+BEGIN_SRC emacs-lisp :tangle yes
1002 (unless (boundp 'last-command-char)
1003 (defvaralias 'last-command-char 'last-command-event))
1004 #+END_SRC
1005 * Customized variables
1006 :PROPERTIES:
1007 :ID: 0102208d-fdf6-4928-9e40-7e341bd3aa3a
1008 :END:
1009 Of course I want to be able to use the customize interface, and some
1010 things can only be set via it (or so they say). I usually prefer to put
1011 things I keep for a long while into statements somewhere else, not just
1012 custom-set here, but we need it anyways.
1013
1014 #+BEGIN_SRC emacs-lisp :tangle yes
1015 (setq custom-file jj-custom-file)
1016 (safe-load custom-file)
1017 #+END_SRC
1018
1019 The source of this is:
1020 #+INCLUDE: "~/.emacs.d/config/customized.el" src emacs-lisp
1021
1022
1023 * Extra modes and their configuration
1024 ** abbrev
1025 A defined abbrev is a word which expands, if you insert it, into some
1026 different text. Abbrevs are defined by the user to expand in specific
1027 ways.
1028 #+BEGIN_SRC emacs-lisp :tangle yes
1029 (use-package abbrev
1030 :commands abbrev-mode
1031 :diminish abbrev-mode
1032 :idle
1033 (hook-into-modes #'abbrev-mode '(text-mode-hook))
1034 :config
1035 (progn
1036 (setq save-abbrevs 'silently)
1037 (setq abbrev-file-name (expand-file-name "abbrev_defs" jj-cache-dir))
1038 (if (file-exists-p abbrev-file-name)
1039 (quietly-read-abbrev-file))
1040
1041 (add-hook 'expand-load-hook
1042 (lambda ()
1043 (add-hook 'expand-expand-hook 'indent-according-to-mode)
1044 (add-hook 'expand-jump-hook 'indent-according-to-mode)))))
1045 #+END_SRC
1046 ** ace-jump-mode
1047 [2013-04-28 So 11:26]
1048 Quickly move around in buffers.
1049 #+BEGIN_SRC emacs-lisp :tangle yes
1050 (use-package ace-jump-mode
1051 :ensure ace-jump-mode
1052 :commands ace-jump-mode
1053 :bind ("H-SPC" . ace-jump-mode))
1054 #+END_SRC
1055 ** ace-window
1056 [2013-04-21 So 20:27]
1057 Use H-w to switch windows
1058 #+BEGIN_SRC emacs-lisp :tangle yes
1059 (use-package ace-window
1060 :ensure ace-window
1061 :commands ace-window
1062 :bind ("H-w" . ace-window))
1063 #+END_SRC
1064 ** anzu
1065 [2014-06-01 Sun 23:02]
1066 #+BEGIN_SRC emacs-lisp :tangle yes
1067 (use-package anzu
1068 :ensure anzu
1069 :diminish anzu-mode
1070 :init
1071 (progn
1072 (global-anzu-mode 1))
1073 :config
1074 (progn
1075 (setq anzu-search-threshold 1000)
1076 (set-face-attribute 'anzu-mode-line nil :foreground "yellow" :weight 'bold)))
1077 #+END_SRC
1078 ** ascii
1079 [2014-05-21 Wed 00:33]
1080 #+BEGIN_SRC emacs-lisp :tangle yes
1081 (use-package ascii
1082 :commands (ascii-on ascii-display ascii-toggle)
1083 :init
1084 (progn
1085 (defun ascii-toggle ()
1086 (interactive)
1087 (if ascii-display
1088 (ascii-off)
1089 (ascii-on)))
1090
1091 (bind-key "C-c e A" 'ascii-toggle)))
1092 #+END_SRC
1093 ** auctex
1094 #+BEGIN_SRC emacs-lisp :tangle yes
1095 (setq auto-mode-alist (cons '("\\.tex\\'" . latex-mode) auto-mode-alist))
1096 (setq TeX-auto-save t)
1097 (setq TeX-parse-self t)
1098 (setq TeX-PDF-mode t)
1099 #+END_SRC
1100 ** auto-complete mode
1101 [2013-04-27 Sa 16:33]
1102 And aren't we all lazy? I definitely am, and I like my emacs doing as
1103 much possible work for me as it can.
1104 So here, auto-complete-mode, which lets emacs do this, based on what I
1105 already had typed.
1106 #+BEGIN_SRC emacs-lisp :tangle yes
1107 (use-package auto-complete-config
1108 :ensure auto-complete
1109 :init
1110 (progn
1111 (use-package pos-tip
1112 :ensure t)
1113 (ac-config-default)
1114 )
1115 :config
1116 (progn
1117 ;; hook AC into completion-at-point
1118 (defun sanityinc/auto-complete-at-point ()
1119 (when (and (not (minibufferp))
1120 (fboundp 'auto-complete-mode)
1121 auto-complete-mode)
1122 (auto-complete)))
1123 (defun set-auto-complete-as-completion-at-point-function ()
1124 (add-to-list 'completion-at-point-functions 'sanityinc/auto-complete-at-point))
1125 ;; Exclude very large buffers from dabbrev
1126 (defun sanityinc/dabbrev-friend-buffer (other-buffer)
1127 (< (buffer-size other-buffer) (* 1 1024 1024)))
1128
1129 ;; custom keybindings to use tab, enter and up and down arrows
1130 (bind-key "\t" 'ac-expand ac-complete-mode-map)
1131 (bind-key "\r" 'ac-complete ac-complete-mode-map)
1132 (bind-key "M-n" 'ac-next ac-complete-mode-map)
1133 (bind-key "M-p" 'ac-previous ac-complete-mode-map)
1134 (bind-key "C-s" 'ac-isearch ac-completing-map)
1135 (bind-key "M-TAB" 'auto-complete ac-mode-map)
1136
1137 (setq ac-comphist-file (expand-file-name "ac-comphist.dat" jj-cache-dir))
1138 (setq ac-use-comphist t)
1139 (setq ac-expand-on-auto-complete nil)
1140 (setq ac-dwim t)
1141 (setq ac-auto-start 3)
1142 (setq ac-delay 0.3)
1143 (setq ac-menu-height 15)
1144 (setq ac-quick-help-delay 0.5)
1145 (setq ac-use-fuzzy t)
1146
1147 (ac-flyspell-workaround)
1148
1149 ;; use 't when auto-complete is disabled
1150 (setq tab-always-indent 'complete)
1151 (add-to-list 'completion-styles 'initials t)
1152
1153 ;; Use space and punctuation to accept the current the most likely completion.
1154 (setq auto-completion-syntax-alist (quote (global accept . word)))
1155 ;; Avoid completion for short trivial words.
1156 (setq auto-completion-min-chars (quote (global . 3)))
1157 (setq completion-use-dynamic t)
1158
1159 (add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
1160
1161 ;; Exclude very large buffers from dabbrev
1162 (setq dabbrev-friend-buffer-function 'sanityinc/dabbrev-friend-buffer)
1163
1164 (use-package ac-dabbrev
1165 :ensure t)
1166
1167 (set-default 'ac-sources
1168 '(ac-source-imenu
1169 ac-source-dictionary
1170 ac-source-words-in-buffer
1171 ac-source-words-in-same-mode-buffers
1172 ; ac-source-words-in-all-buffer
1173 ac-source-dabbrev))
1174
1175 (dolist (mode '(magit-log-edit-mode log-edit-mode org-mode text-mode haml-mode
1176 sass-mode yaml-mode csv-mode espresso-mode haskell-mode
1177 html-mode nxml-mode sh-mode smarty-mode clojure-mode
1178 lisp-mode textile-mode markdown-mode tuareg-mode python-mode
1179 js3-mode css-mode less-css-mode sql-mode ielm-mode))
1180 (add-to-list 'ac-modes mode))
1181
1182 (add-hook 'latex-mode-hook 'auto-complete-mode)
1183 (add-hook 'LaTeX-mode-hook 'auto-complete-mode)
1184 (add-hook 'prog-mode-hook 'auto-complete-mode)
1185 (add-hook 'org-mode-hook 'auto-complete-mode)))
1186
1187 #+END_SRC
1188
1189 ** auto-revert
1190 When files change outside emacs for whatever reason I want emacs to deal
1191 with it. Not to have to revert buffers myself
1192 #+BEGIN_SRC emacs-lisp :tangle yes
1193 (use-package autorevert
1194 :commands auto-revert-mode
1195 :diminish auto-revert-mode
1196 :init
1197 (progn
1198 (setq global-auto-revert-mode t)
1199 (setq global-auto-revert-non-file-buffers t)
1200 (global-auto-revert-mode)))
1201 #+END_SRC
1202
1203 ** backups
1204 Emacs should keep backup copies of files I edit, but I do not want them
1205 to clutter up the filesystem everywhere. So I put them into one defined
1206 place, backup-directory, which even contains my username (for systems
1207 where =temporary-file-directory= is not inside my home).
1208 #+BEGIN_SRC emacs-lisp :tangle yes
1209 (use-package backups-mode
1210 :load-path "elisp/backups-mode"
1211 :bind (("\C-cv" . save-version)
1212 ("\C-cb" . list-backups)
1213 ("\C-ck" . kill-buffer-prompt)
1214 ("\C-cw" . backup-walker-start))
1215 :init
1216 (progn
1217 (setq backup-directory jj-backup-directory)
1218 ;(setq tramp-backup-directory (concat jj-backup-directory "/tramp"))
1219 ;(if (not (file-exists-p tramp-backup-directory))
1220 ; (make-directory tramp-backup-directory))
1221 ;(setq tramp-backup-directory-alist `((".*" . ,tramp-backup-directory)))
1222 (setq backup-directory-alist `(("." . ,jj-backup-directory)))
1223 (setq auto-save-list-file-prefix (concat jj-backup-directory ".auto-saves-"))
1224 (setq auto-save-file-name-transforms `((".*" ,jj-backup-directory t)))
1225
1226 (setq version-control t) ;; Use version numbers for backups
1227 (setq kept-new-versions 10) ;; Number of newest versions to keep
1228 (setq kept-old-versions 2) ;; Number of oldest versions to keep
1229 (setq delete-old-versions t) ;; Ask to delete excess backup versions?
1230 (setq backup-by-copying t)
1231 (setq backup-by-copying-when-linked t) ;; Copy linked files, don't rename.
1232 (setq make-backup-files t)
1233
1234 (defadvice kill-buffer (around kill-buffer)
1235 "Always save before killing a file buffer"
1236 (when (and (buffer-modified-p)
1237 (buffer-file-name)
1238 (file-exists-p (buffer-file-name)))
1239 (save-buffer))
1240 ad-do-it)
1241 (ad-activate 'kill-buffer)
1242
1243 (defadvice save-buffers-kill-emacs (around save-buffers-kill-emacs)
1244 "Always save before killing emacs"
1245 (save-some-buffers t)
1246 ad-do-it)
1247 (ad-activate 'save-buffers-kill-emacs)
1248
1249 (defun kill-buffer-prompt ()
1250 "Allows one to kill a buffer without saving it.
1251 This is necessary since once you start backups-mode all file based buffers
1252 are saved automatically when they are killed"
1253 (interactive)
1254 (if (and (buffer-modified-p) (buffer-file-name) (file-exists-p (buffer-file-name)) (y-or-n-p "Save buffer?"))
1255 (save-buffer)
1256 (set-buffer-modified-p nil))
1257 (kill-buffer))
1258
1259 (setq backup-enable-predicate
1260 (lambda (name)
1261 (and (normal-backup-enable-predicate name)
1262 (not
1263 (let ((method (file-remote-p name 'method)))
1264 (when (stringp method)
1265 (member method '("su" "sudo"))))))))))
1266
1267 #+END_SRC
1268 ** calendar
1269 [2014-06-10 Tue 22:20]
1270 #+BEGIN_SRC emacs-lisp :tangle yes
1271 (use-package cal
1272 :commands (cal/insert)
1273 :bind ("C-c c" . cal/insert))
1274 #+END_SRC
1275
1276 Weeks start on Monday, not sunday.
1277 #+BEGIN_SRC emacs-lisp :tangle yes
1278 (setq calendar-week-start-day 1)
1279 #+END_SRC
1280
1281 Display ISO week numbers in Calendar Mode
1282 #+BEGIN_SRC emacs-lisp :tangle yes
1283 (copy-face font-lock-constant-face 'calendar-iso-week-face)
1284 (set-face-attribute 'calendar-iso-week-face nil
1285 :height 0.7)
1286 (setq calendar-intermonth-text
1287 '(propertize
1288 (format "%2d"
1289 (car
1290 (calendar-iso-from-absolute
1291 (calendar-absolute-from-gregorian (list month day year)))))
1292 'font-lock-face 'calendar-iso-week-face))
1293 (copy-face 'default 'calendar-iso-week-header-face)
1294 (set-face-attribute 'calendar-iso-week-header-face nil
1295 :height 0.7)
1296 (setq calendar-intermonth-header
1297 (propertize "Wk" ; or e.g. "KW" in Germany
1298 'font-lock-face 'calendar-iso-week-header-face))
1299 #+END_SRC
1300
1301 ** crontab-mode
1302 [2013-05-21 Tue 23:18]
1303 #+BEGIN_SRC emacs-lisp :tangle yes
1304 (use-package crontab-mode
1305 :ensure crontab-mode
1306 :commands crontab-mode
1307 :mode ("\\.?cron\\(tab\\)?\\'" . crontab-mode))
1308 #+END_SRC
1309
1310 ** css
1311 web-mode takes over, see [[*web-mode][web-mode]]
1312 #+BEGIN_SRC emacs-lisp :tangle no
1313 (use-package css-mode
1314 :mode ("\\.css\\'" . css-mode)
1315 :defer t
1316 :config
1317 (progn
1318 ;;; CSS flymake
1319 (use-package flymake-css
1320 :ensure flymake-css
1321 :config
1322 (progn
1323 (defun maybe-flymake-css-load ()
1324 "Activate flymake-css as necessary, but not in derived modes."
1325 (when (eq major-mode 'css-mode)
1326 (flymake-css-load)))
1327 (add-hook 'css-mode-hook 'maybe-flymake-css-load)))
1328 ;;; Auto-complete CSS keywords
1329 (eval-after-load 'auto-complete
1330 '(progn
1331 (dolist (hook '(css-mode-hook sass-mode-hook scss-mode-hook))
1332 (add-hook hook 'ac-css-mode-setup))))))
1333 #+END_SRC
1334
1335 ** cua
1336 I know that this lets it look "more like windows", but I don't much care
1337 about its paste/copy/cut keybindings, the really nice part is the great
1338 support for rectangular regions, which I started to use a lot since I
1339 know this mode. The normal keybindings for those are just to useless.
1340 #+BEGIN_SRC emacs-lisp :tangle yes
1341 (cua-mode t)
1342 (setq cua-enable-cua-keys (quote shift))
1343 #+END_SRC
1344
1345 Luckily cua-mode easily supports this, with the following line I just
1346 get the CUA selection and rectangle stuff, not the keybindings. Yes,
1347 even though the above =cua-enable-cua-keys= setting would only enable
1348 them if the selection is done when the region was marked with a shifted
1349 movement keys.
1350 #+BEGIN_SRC emacs-lisp :tangle yes
1351 (cua-selection-mode t)
1352 #+END_SRC
1353
1354 ** Debian related
1355 #+BEGIN_SRC emacs-lisp :tangle yes
1356 (require 'dpkg-dev-el-loaddefs nil 'noerror)
1357 (require 'debian-el-loaddefs nil 'noerror)
1358
1359 (setq debian-changelog-full-name "Joerg Jaspert")
1360 (setq debian-changelog-mailing-address "joerg@debian.org")
1361 #+END_SRC
1362
1363 ** diff-mode
1364 #+BEGIN_SRC emacs-lisp :tangle yes
1365 (use-package diff-mode
1366 :commands diff-mode
1367 :mode (("\\.diff" . diff-mode))
1368 :config
1369 (use-package diff-mode-))
1370 #+END_SRC
1371
1372
1373 ** dired & co
1374 I like dired and work a lot with it, but it tends to leave lots of
1375 windows around.
1376 dired-single to the rescue.
1377 #+BEGIN_SRC emacs-lisp :tangle yes
1378 (use-package dired
1379 :commands (dired dired-other-window dired-other-frame dired-noselect
1380 dired-mode dired-jump)
1381 :init
1382 (progn)
1383 :config
1384 (progn
1385 (setq dired-auto-revert-buffer (quote dired-directory-changed-p))
1386 (setq dired-dwim-target t)
1387 (setq dired-listing-switches "-alh")
1388 (setq dired-recursive-copies (quote top))
1389 (setq dired-recursive-deletes (quote top))
1390
1391 (defvar mark-files-cache (make-hash-table :test #'equal))
1392
1393 (defun mark-similar-versions (name)
1394 (let ((pat name))
1395 (if (string-match "^\\(.+?\\)-[0-9._-]+$" pat)
1396 (setq pat (match-string 1 pat)))
1397 (or (gethash pat mark-files-cache)
1398 (ignore (puthash pat t mark-files-cache)))))
1399
1400 (defun dired-mark-similar-version ()
1401 (interactive)
1402 (setq mark-files-cache (make-hash-table :test #'equal))
1403 (dired-mark-sexp '(mark-similar-versions name)))
1404
1405 (use-package dired+
1406 :ensure dired+
1407 :init
1408 :pre-load (setq diredp-hide-details-initially-flag nil))
1409
1410 (use-package dired-single
1411 :ensure dired-single
1412 :init
1413 (progn
1414 (bind-key "<return>" 'dired-single-buffer dired-mode-map)
1415 (bind-key "<mouse-1>" 'dired-single-buffer-mouse dired-mode-map)
1416 (bind-key "^"
1417 (function
1418 (lambda nil (interactive) (dired-single-buffer ".."))) dired-mode-map )))
1419
1420 (use-package wdired
1421 :ensure wdired
1422 :init
1423 (progn
1424 (setq wdired-allow-to-change-permissions t)
1425 (bind-key "r" 'wdired-change-to-wdired-mode dired-mode-map)))
1426
1427 (use-package gnus-dired
1428 :commands (gnus-dired-attach gnus-dired-mode)
1429 :init
1430 (progn
1431 ;;(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
1432 (bind-key "a" 'gnus-dired-attach dired-mode-map)))
1433
1434 (defun dired-package-initialize ()
1435 (unless (featurep 'runner)
1436 (use-package dired-x)
1437 (use-package runner
1438 :ensure runner)
1439
1440 (bind-key "M-!" 'async-shell-command dired-mode-map)
1441 (unbind-key "M-s f" dired-mode-map)
1442
1443 (defadvice dired-omit-startup (after diminish-dired-omit activate)
1444 "Make sure to remove \"Omit\" from the modeline."
1445 (diminish 'dired-omit-mode) dired-mode-map)
1446
1447 ;; Omit files that Git would ignore
1448 (defun dired-omit-regexp ()
1449 (let ((file (expand-file-name ".git"))
1450 parent-dir)
1451 (while (and (not (file-exists-p file))
1452 (progn
1453 (setq parent-dir
1454 (file-name-directory
1455 (directory-file-name
1456 (file-name-directory file))))
1457 ;; Give up if we are already at the root dir.
1458 (not (string= (file-name-directory file)
1459 parent-dir))))
1460 ;; Move up to the parent dir and try again.
1461 (setq file (expand-file-name ".git" parent-dir)))
1462 ;; If we found a change log in a parent, use that.
1463 (if (file-exists-p file)
1464 (let ((regexp (funcall dired-omit-regexp-orig))
1465 (omitted-files
1466 (shell-command-to-string "git clean -d -x -n")))
1467 (if (= 0 (length omitted-files))
1468 regexp
1469 (concat
1470 regexp
1471 (if (> (length regexp) 0)
1472 "\\|" "")
1473 "\\("
1474 (mapconcat
1475 #'(lambda (str)
1476 (concat
1477 "^"
1478 (regexp-quote
1479 (substring str 13
1480 (if (= ?/ (aref str (1- (length str))))
1481 (1- (length str))
1482 nil)))
1483 "$"))
1484 (split-string omitted-files "\n" t)
1485 "\\|")
1486 "\\)")))
1487 (funcall dired-omit-regexp-orig))))))
1488
1489 (add-hook 'dired-mode-hook 'dired-package-initialize)
1490
1491 (defun dired-double-jump (first-dir second-dir)
1492 (interactive
1493 (list (read-directory-name "First directory: "
1494 (expand-file-name "~")
1495 nil nil "/Downloads/")
1496 (read-directory-name "Second directory: "
1497 (expand-file-name "~")
1498 nil nil "/")))
1499 (dired first-dir)
1500 (dired-other-window second-dir))
1501 (bind-key "C-c J" 'dired-double-jump)
1502
1503 (defun dired-back-to-top ()
1504 (interactive)
1505 (beginning-of-buffer)
1506 (dired-next-line 4))
1507
1508 (define-key dired-mode-map
1509 (vector 'remap 'beginning-of-buffer) 'dired-back-to-top)
1510
1511 (defun dired-jump-to-bottom ()
1512 (interactive)
1513 (end-of-buffer)
1514 (dired-next-line -1))
1515
1516 (define-key dired-mode-map
1517 (vector 'remap 'end-of-buffer) 'dired-jump-to-bottom)))
1518
1519 #+END_SRC
1520 ** discover-my-major
1521 [2014-06-01 Sun 23:32]
1522 Discover key bindings and their meaning for the current Emacs major mode.
1523 #+BEGIN_SRC emacs-lisp :tangle yes
1524 (use-package discover-my-major
1525 :ensure discover-my-major
1526 :bind ("C-h C-m" . discover-my-major))
1527 #+END_SRC
1528 ** easypg
1529 EasyPG is a GnuPG interface for Emacs.
1530 Bookmark: [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
1531 #+BEGIN_SRC emacs-lisp :tangle yes
1532 (use-package epa-file
1533 :config
1534 (progn
1535 (epa-file-enable)
1536 ;; I took the following from [[http://www.emacswiki.org/emacs/EasyPG][EmacsWiki: Easy PG]]
1537 (defadvice epg--start (around advice-epg-disable-agent disable)
1538 "Don't allow epg--start to use gpg-agent in plain text
1539 terminals . "
1540 (if (display-graphic-p)
1541 ad-do-it
1542 (let ((agent (getenv "GPG_AGENT_INFO")))
1543 (setenv "GPG_AGENT_INFO" nil) ; give us a usable text password prompt
1544 ad-do-it
1545 (setenv "GPG_AGENT_INFO" agent))))
1546 (ad-enable-advice 'epg--start 'around 'advice-epg-disable-agent)
1547 (ad-activate 'epg--start)
1548 ))
1549 #+END_SRC
1550 ** ediff
1551 [2013-04-21 So 20:36]
1552 ediff - don't start another frame
1553 #+BEGIN_SRC emacs-lisp :tangle yes
1554 (use-package ediff
1555 :pre-init
1556 (progn
1557 (defvar ctl-period-equals-map)
1558 (define-prefix-command 'ctl-period-equals-map)
1559 (bind-key "C-. =" 'ctl-period-equals-map)
1560
1561 (bind-key "C-. = c" 'compare-windows)) ; not an ediff command, but it fits
1562
1563 :bind (("C-. = b" . ediff-buffers)
1564 ("C-. = B" . ediff-buffers3)
1565 ("C-. = =" . ediff-files)
1566 ("C-. = f" . ediff-files)
1567 ("C-. = F" . ediff-files3)
1568 ("C-. = r" . ediff-revision)
1569 ("C-. = p" . ediff-patch-file)
1570 ("C-. = P" . ediff-patch-buffer)
1571 ("C-. = l" . ediff-regions-linewise)
1572 ("C-. = w" . ediff-regions-wordwise)))
1573 #+END_SRC
1574 ** emms
1575 EMMS is the Emacs Multimedia System.
1576 #+BEGIN_SRC emacs-lisp :tangle no
1577 (require 'emms-source-file)
1578 (require 'emms-source-playlist)
1579 (require 'emms-info)
1580 (require 'emms-cache)
1581 (require 'emms-playlist-mode)
1582 (require 'emms-playing-time)
1583 (require 'emms-player-mpd)
1584 (require 'emms-playlist-sort)
1585 (require 'emms-mark)
1586 (require 'emms-browser)
1587 (require 'emms-lyrics)
1588 (require 'emms-last-played)
1589 (require 'emms-score)
1590 (require 'emms-tag-editor)
1591 (require 'emms-history)
1592 (require 'emms-i18n)
1593
1594 (setq emms-playlist-default-major-mode 'emms-playlist-mode)
1595 (add-to-list 'emms-track-initialize-functions 'emms-info-initialize-track)
1596 (emms-playing-time 1)
1597 (emms-lyrics 1)
1598 (add-hook 'emms-player-started-hook 'emms-last-played-update-current)
1599 ;(add-hook 'emms-player-started-hook 'emms-player-mpd-sync-from-emms)
1600 (emms-score 1)
1601 (when (fboundp 'emms-cache) ; work around compiler warning
1602 (emms-cache 1))
1603 (setq emms-score-default-score 3)
1604
1605 (defun emms-mpd-init ()
1606 "Connect Emms to mpd."
1607 (interactive)
1608 (emms-player-mpd-connect))
1609
1610 ;; players
1611 (require 'emms-player-mpd)
1612 (setq emms-player-mpd-server-name "localhost")
1613 (setq emms-player-mpd-server-port "6600")
1614 (add-to-list 'emms-info-functions 'emms-info-mpd)
1615 (add-to-list 'emms-player-list 'emms-player-mpd)
1616 (setq emms-volume-change-function 'emms-volume-mpd-change)
1617 (setq emms-player-mpd-sync-playlist t)
1618
1619 (setq emms-source-file-default-directory "/var/lib/mpd/music")
1620 (setq emms-player-mpd-music-directory "/var/lib/mpd/music")
1621 (setq emms-info-auto-update t)
1622 (setq emms-lyrics-scroll-p t)
1623 (setq emms-lyrics-display-on-minibuffer t)
1624 (setq emms-lyrics-display-on-modeline nil)
1625 (setq emms-lyrics-dir "~/.emacs.d/var/lyrics")
1626
1627 (setq emms-last-played-format-alist
1628 '(((emms-last-played-seconds-today) . "%H:%M")
1629 (604800 . "%a %H:%M") ; this week
1630 ((emms-last-played-seconds-month) . "%d.%m.%Y")
1631 ((emms-last-played-seconds-year) . "%d.%m.%Y")
1632 (t . "Never played")))
1633
1634 ;; Playlist format
1635 (defun my-describe (track)
1636 (let* ((empty "...")
1637 (name (emms-track-name track))
1638 (type (emms-track-type track))
1639 (short-name (file-name-nondirectory name))
1640 (play-count (or (emms-track-get track 'play-count) 0))
1641 (last-played (or (emms-track-get track 'last-played) '(0 0 0)))
1642 (artist (or (emms-track-get track 'info-artist) empty))
1643 (year (emms-track-get track 'info-year))
1644 (playing-time (or (emms-track-get track 'info-playing-time) 0))
1645 (min (/ playing-time 60))
1646 (sec (% playing-time 60))
1647 (album (or (emms-track-get track 'info-album) empty))
1648 (tracknumber (emms-track-get track 'info-tracknumber))
1649 (short-name (file-name-sans-extension
1650 (file-name-nondirectory name)))
1651 (title (or (emms-track-get track 'info-title) short-name))
1652 (rating (emms-score-get-score name))
1653 (rate-char ?☭)
1654 )
1655 (format "%12s %20s (%.4s) [%-20s] - %2s. %-30s | %2d %s"
1656 (emms-last-played-format-date last-played)
1657 artist
1658 year
1659 album
1660 (if (and tracknumber ; tracknumber
1661 (not (zerop (string-to-number tracknumber))))
1662 (format "%02d" (string-to-number tracknumber))
1663 "")
1664 title
1665 play-count
1666 (make-string rating rate-char)))
1667 )
1668
1669 (setq emms-track-description-function 'my-describe)
1670
1671 ;; (global-set-key (kbd "C-<f9> t") 'emms-play-directory-tree)
1672 ;; (global-set-key (kbd "H-<f9> e") 'emms-play-file)
1673 (global-set-key (kbd "H-<f9> <f9>") 'emms-mpd-init)
1674 (global-set-key (kbd "H-<f9> d") 'emms-play-dired)
1675 (global-set-key (kbd "H-<f9> x") 'emms-start)
1676 (global-set-key (kbd "H-<f9> v") 'emms-stop)
1677 (global-set-key (kbd "H-<f9> n") 'emms-next)
1678 (global-set-key (kbd "H-<f9> p") 'emms-previous)
1679 (global-set-key (kbd "H-<f9> o") 'emms-show)
1680 (global-set-key (kbd "H-<f9> h") 'emms-shuffle)
1681 (global-set-key (kbd "H-<f9> SPC") 'emms-pause)
1682 (global-set-key (kbd "H-<f9> a") 'emms-add-directory-tree)
1683 (global-set-key (kbd "H-<f9> b") 'emms-smart-browse)
1684 (global-set-key (kbd "H-<f9> l") 'emms-playlist-mode-go)
1685
1686 (global-set-key (kbd "H-<f9> r") 'emms-toggle-repeat-track)
1687 (global-set-key (kbd "H-<f9> R") 'emms-toggle-repeat-playlist)
1688 (global-set-key (kbd "H-<f9> m") 'emms-lyrics-toggle-display-on-minibuffer)
1689 (global-set-key (kbd "H-<f9> M") 'emms-lyrics-toggle-display-on-modeline)
1690
1691 (global-set-key (kbd "H-<f9> <left>") (lambda () (interactive) (emms-seek -10)))
1692 (global-set-key (kbd "H-<f9> <right>") (lambda () (interactive) (emms-seek +10)))
1693 (global-set-key (kbd "H-<f9> <down>") (lambda () (interactive) (emms-seek -60)))
1694 (global-set-key (kbd "H-<f9> <up>") (lambda () (interactive) (emms-seek +60)))
1695
1696 (global-set-key (kbd "H-<f9> s u") 'emms-score-up-playing)
1697 (global-set-key (kbd "H-<f9> s d") 'emms-score-down-playing)
1698 (global-set-key (kbd "H-<f9> s o") 'emms-score-show-playing)
1699 (global-set-key (kbd "H-<f9> s s") 'emms-score-set-playing)
1700
1701 (define-key emms-playlist-mode-map "u" 'emms-score-up-playing)
1702 (define-key emms-playlist-mode-map "d" 'emms-score-down-playing)
1703 (define-key emms-playlist-mode-map "o" 'emms-score-show-playing)
1704 (define-key emms-playlist-mode-map "s" 'emms-score-set-playing)
1705 (define-key emms-playlist-mode-map "r" 'emms-mpd-init)
1706 (define-key emms-playlist-mode-map "N" 'emms-playlist-new)
1707
1708 (define-key emms-playlist-mode-map "x" 'emms-start)
1709 (define-key emms-playlist-mode-map "v" 'emms-stop)
1710 (define-key emms-playlist-mode-map "n" 'emms-next)
1711 (define-key emms-playlist-mode-map "p" 'emms-previous)
1712
1713 (setq emms-playlist-buffer-name "*EMMS Playlist*"
1714 emms-playlist-mode-open-playlists t)
1715
1716 ;; Faces
1717 (if (window-system)
1718 ((lambda ()
1719 (set-face-attribute
1720 'emms-browser-artist-face nil
1721 :family "Arno Pro")
1722 )
1723 ))
1724
1725 (setq emms-player-mpd-supported-regexp
1726 (or (emms-player-mpd-get-supported-regexp)
1727 (concat "\\`http://\\|"
1728 (emms-player-simple-regexp
1729 "m3u" "ogg" "flac" "mp3" "wav" "mod" "au" "aiff"))))
1730 (emms-player-set emms-player-mpd 'regex emms-player-mpd-supported-regexp)
1731
1732 #+END_SRC
1733 ** ethan-wspace
1734 [2014-06-01 Sun 15:00]
1735 Proper whitespace handling
1736 #+BEGIN_SRC emacs-lisp :tangle yes
1737 (use-package ethan-wspace
1738 :ensure ethan-wspace
1739 :diminish (ethan-wspace-mode . "ew")
1740 :init
1741 (global-ethan-wspace-mode 1))
1742 #+END_SRC
1743
1744 ** expand-region
1745 [2014-06-01 Sun 15:16]
1746 #+BEGIN_SRC emacs-lisp :tangle yes
1747 (use-package expand-region
1748 :ensure expand-region
1749 :bind ("C-M-+" . er/expand-region))
1750 #+END_SRC
1751 ** filladapt
1752 [2013-05-02 Thu 00:04]
1753 Filladapt by KyleJones enhances Emacs’ fill functions by guessing a
1754 fill prefix, such as a comment sequence in program code, and handling
1755 bullet points like “1.” or “*”.
1756 #+BEGIN_SRC emacs-lisp :tangle yes
1757 (use-package filladapt
1758 :diminish filladapt-mode
1759 :init
1760 (setq-default filladapt-mode t))
1761 #+END_SRC
1762 ** flycheck
1763 [2013-04-28 So 22:21]
1764 Flycheck is a on-the-fly syntax checking tool, supposedly better than Flymake.
1765 As the one time I tried Flymake i wasn't happy, thats easy to
1766 understand for me.
1767 #+BEGIN_SRC emacs-lisp :tangle yes
1768 (use-package flycheck
1769 :ensure flycheck
1770 :diminish flycheck-mode
1771 :bind (("M-n" . next-error)
1772 ("M-p" . previous-error))
1773 :init
1774 (progn
1775 (add-hook 'find-file-hook
1776 (lambda ()
1777 (when (not (equal 'emacs-lisp-mode major-mode))
1778 (flycheck-mode)))))
1779 :config
1780 (progn
1781 (use-package flycheck-color-mode-line
1782 :ensure flycheck-color-mode-line)
1783 (setq flycheck-highlighting-mode nil)
1784 (add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode)
1785 ))
1786 #+END_SRC
1787 ** font-lock
1788 Obviously emacs can do syntax hilighting. For more things than you ever
1789 heard about.
1790 And I want to have it everywhere.
1791 #+BEGIN_SRC emacs-lisp :tangle yes
1792 (use-package font-lock
1793 :init
1794 (progn
1795 (global-font-lock-mode 1)
1796 (setq font-lock-maximum-decoration t)))
1797 #+END_SRC
1798 ** git commit mode
1799 #+BEGIN_SRC emacs-lisp :tangle yes
1800 (use-package git-commit-mode
1801 :ensure git-commit-mode
1802 :commands git-commit-mode
1803 :mode ("COMMIT_EDITMSG" . git-commit-mode))
1804 #+END_SRC
1805
1806 ** git rebase mode
1807 #+BEGIN_SRC emacs-lisp :tangle yes
1808 (use-package git-rebase-mode
1809 :ensure git-rebase-mode
1810 :commands git-rebase-mode
1811 :mode ("git-rebase-todo" . git-rebase-mode))
1812 #+END_SRC
1813 ** git-gutter+
1814 [2014-05-21 Wed 22:56]
1815 #+BEGIN_SRC emacs-lisp :tangle yes
1816 (use-package git-gutter+
1817 :ensure git-gutter+
1818 :diminish git-gutter+-mode
1819 :bind (("C-x n" . git-gutter+-next-hunk)
1820 ("C-x p" . git-gutter+-previous-hunk)
1821 ("C-x v =" . git-gutter+-show-hunk)
1822 ("C-x r" . git-gutter+-revert-hunks)
1823 ("C-x s" . git-gutter+-stage-hunks)
1824 ("C-x c" . git-gutter+-commit)
1825 )
1826 :init
1827 (progn
1828 (setq git-gutter+-disabled-modes '(org-mode))
1829 (global-git-gutter+-mode 1))
1830 :config
1831 (progn
1832 (use-package git-gutter-fringe+
1833 :ensure git-gutter-fringe+
1834 :config
1835 (progn
1836 (setq git-gutter-fr+-side 'right-fringe)
1837 ;(git-gutter-fr+-minimal)
1838 ))))
1839
1840 #+END_SRC
1841 ** git timemachine
1842 [2014-07-23 Mi 12:57]
1843 Browse historic versions of a file with p (previous) and n (next).
1844 #+BEGIN_SRC emacs-lisp :tangle yes
1845 (use-package git-timemachine
1846 :ensure git-timemachine)
1847 #+END_SRC
1848 ** gnus
1849 Most of my gnus config is in an own file, [[file:gnus.org][gnus.org]], here I only have
1850 what I want every emacs to know.
1851 #+BEGIN_SRC emacs-lisp :tangle yes
1852 (bind-key "C-c g" 'gnus) ; Start gnus with M-n
1853 (after 'gnus
1854 (jj-init-theme)
1855 )
1856 #+END_SRC
1857 ** guide-key
1858 [2014-06-11 Wed 22:27]
1859 guide-key.el displays the available key bindings automatically and
1860 dynamically.
1861
1862 For whatever reason I like this more than icicles <backtab> completion
1863 for this.
1864 #+BEGIN_SRC emacs-lisp :tangle yes
1865 (use-package guide-key
1866 :ensure guide-key
1867 :diminish guide-key-mode
1868 :init
1869 (progn
1870 (setq guide-key/guide-key-sequence '("C-x" "C-c"))
1871 (guide-key-mode 1)
1872 (setq guide-key/recursive-key-sequence-flag t)
1873 (setq guide-key/popup-window-position 'bottom)
1874 (setq guide-key/idle-delay 0.5)))
1875
1876 #+END_SRC
1877
1878 ** highlight mode
1879 [2014-05-21 Wed 23:51]
1880 #+BEGIN_SRC emacs-lisp :tangle yes
1881 (use-package hi-lock
1882 :bind (("M-o l" . highlight-lines-matching-regexp)
1883 ("M-o r" . highlight-regexp)
1884 ("M-o w" . highlight-phrase)))
1885
1886 (use-package hilit-chg
1887 :bind ("M-o C" . highlight-changes-mode))
1888
1889 #+END_SRC
1890 ** hippie-exp
1891 Crazy way of completion. It looks at the word before point and then
1892 tries to expand it in various ways.
1893 #+BEGIN_SRC emacs-lisp :tangle yes
1894 (use-package hippie-exp
1895 :bind ("M-/" . hippie-expand)
1896 :config
1897 (progn
1898 (setq hippie-expand-try-functions-list '(try-expand-dabbrev
1899 try-expand-dabbrev-all-buffers
1900 try-expand-dabbrev-from-kill
1901 try-complete-file-name-partially
1902 try-complete-file-name
1903 try-expand-all-abbrevs try-expand-list
1904 try-expand-line
1905 try-complete-lisp-symbol-partially
1906 try-complete-lisp-symbol))))
1907 #+END_SRC
1908 ** html-helper
1909 Replaced by web-mode [[*web-mode][web-mode]]
1910 #+BEGIN_SRC emacs-lisp :tangle no
1911 (autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)
1912 (add-auto-mode 'html-helper-mode "\\.html$")
1913 (add-auto-mode 'html-helper-mode "\\.asp$")
1914 (add-auto-mode 'html-helper-mode "\\.phtml$")
1915 (add-auto-mode 'html-helper-mode "\\.(jsp|tmpl)\\'")
1916 (defalias 'html-mode 'html-helper-mode)
1917 #+END_SRC
1918
1919 ** ibuffer
1920 [2014-05-21 Wed 23:54]
1921 #+BEGIN_SRC emacs-lisp :tangle yes
1922 (use-package ibuffer
1923 :defer t
1924 :bind (("C-h h" . ibuffer)
1925 ("C-x C-b" . ibuffer)
1926 ("<XF86WebCam>" . ibuffer)
1927 )
1928 :commands (ibuffer)
1929 :init
1930 (progn
1931 (use-package ibuffer-vc
1932 :ensure t
1933 :commands
1934 (ibuffer-vc-set-filter-groups-by-vc-root
1935 ibuffer-vc-generate-filter-groups-by-vc-root))
1936 (use-package ibuffer-tramp
1937 :ensure t
1938 :commands (ibuffer-tramp-generate-filter-groups-by-tramp-connection
1939 ibuffer-tramp-set-filter-groups-by-tramp-connection))
1940 ;; Switching to ibuffer puts the cursor on the most recent buffer
1941 (defadvice ibuffer (around ibuffer-point-to-most-recent activate)
1942 "Open ibuffer with cursor pointed to most recent buffer name"
1943 (let ((recent-buffer-name (buffer-name)))
1944 ad-do-it
1945 (ibuffer-update nil t)
1946 (unless (string= recent-buffer-name "*Ibuffer*")
1947 (ibuffer-jump-to-buffer recent-buffer-name)))))
1948 :config
1949 (progn
1950 (defvar my-ibufffer-separator " • ")
1951 (setq ibuffer-filter-group-name-face 'variable-pitch
1952 ibuffer-use-header-line t
1953 ibuffer-old-time 12)
1954 (unbind-key "M-o" ibuffer-mode-map)
1955 (bind-key "s" 'isearch-forward-regexp ibuffer-mode-map)
1956 (bind-key "." 'ibuffer-invert-sorting ibuffer-mode-map)
1957
1958 (defun ibuffer-magit-status ()
1959 (interactive)
1960 (--when-let (get-buffer "*Ibuffer*")
1961 (with-current-buffer it
1962 (let* ((selected-buffer (ibuffer-current-buffer))
1963 (buffer-path (with-current-buffer
1964 selected-buffer
1965 (or (buffer-file-name)
1966 list-buffers-directory
1967 default-directory)))
1968 (default-directory
1969 (if (file-regular-p buffer-path)
1970 (file-name-directory buffer-path)
1971 buffer-path)))
1972 (magit-status default-directory)))))
1973 (bind-key "i" 'ibuffer-magit-status ibuffer-mode-map)
1974 (bind-key "G" 'ibuffer-magit-status ibuffer-mode-map)
1975
1976 (setq ibuffer-directory-abbrev-alist
1977 (-uniq
1978 (-flatten
1979 (--map
1980 (list
1981 (cons (f-slash (f-expand (cdr it))) my-ibufffer-separator)
1982 (cons (f-slash (f-canonical (cdr it))) (concat (car it) my-ibufffer-separator)))
1983 '(
1984 ("dak" . "/develop/dak/")
1985 ("org" . "~/org/")
1986 ("config" . "~/.emacs.d/config/")
1987 ("tmp" . "~/tmp/")
1988 ("systmp" . "/tmp/")
1989 ("puppet" . "~/git/puppet")
1990 ("git" . "~/git/")
1991 )))))
1992
1993 (use-package ibuffer-git
1994 :ensure t)
1995 (use-package ibuffer-vc
1996 :ensure t)
1997
1998 (define-ibuffer-column size-h
1999 (:name "Size" :inline t)
2000 (cond
2001 ((> (buffer-size) 1000)
2002 (format "%7.1fk" (/ (buffer-size) 1000.0)))
2003 ((> (buffer-size) 1000000)
2004 (format "%7.1fM" (/ (buffer-size) 1000000.0)))
2005 (t
2006 (format "%8d" (buffer-size)))))
2007
2008 (use-package ibuf-ext)
2009 (define-ibuffer-filter filename2
2010 "Toggle current view to buffers with filename matching QUALIFIER."
2011 (:description "filename2"
2012 :reader (read-from-minibuffer "Filter by filename (regexp): "))
2013 ;; (ibuffer-awhen (buffer-local-value 'buffer-file-name buf)
2014 (ibuffer-awhen (with-current-buffer buf
2015 (or buffer-file-name
2016 default-directory))
2017 (string-match qualifier it)))
2018
2019 (defvar ibuffer-magit-filter-groups nil)
2020 (defun ibuffer-magit-define-filter-groups ()
2021 (when (and (not ibuffer-magit-filter-groups)
2022 (boundp 'magit-repo-dirs))
2023 (setq ibuffer-magit-filter-groups
2024 (--map (list
2025 (concat "git:: "
2026 (file-name-nondirectory (directory-file-name it)))
2027 `(filename2 . ,it))
2028 (mapcar 'cdr (magit-list-repos magit-repo-dirs))))))
2029
2030 (defun ibuffer-set-filter-groups-by-root ()
2031 (interactive)
2032 ;; (ibuffer-projectile-define-filter-groups)
2033 ;; (ibuffer-magit-define-filter-groups)
2034 (setq ibuffer-filter-groups
2035 (-concat
2036 ;; ibuffer-projectile-filter-groups
2037 ibuffer-magit-filter-groups
2038
2039 '(("MORE"
2040 (or (mode . magit-log-edit-mode)
2041 (name . "^\\*\\(traad-server\\|httpd\\|epc con.*\\|tramp/.*\\|Completions\\)\\*$")
2042 (name . "^\\*Pymacs\\*$")
2043 (name . "^\\*helm.*\\*")
2044 (name . "^\\*Compile-log\\*$")
2045 (name . "^\\*Ido Completions\\*$")
2046 (name . "^\\*magit-\\(process\\)\\*$")
2047 (name . "^ "))))
2048 '(("EMACS"
2049 (or
2050 (name . "^\\*scratch")
2051 (name . "^\\*Messages")
2052 (name . "^\\*Help")
2053 )))
2054 (ibuffer-vc-generate-filter-groups-by-vc-root)
2055 (ibuffer-tramp-generate-filter-groups-by-tramp-connection))))
2056
2057 (defun toggle-ibuffer-filter-groups ()
2058 "DOCSTRING"
2059 (interactive)
2060 (let ((ibuf (get-buffer "*Ibuffer*")))
2061 (when ibuf
2062 (with-current-buffer ibuf
2063 (let ((selected-buffer (ibuffer-current-buffer)))
2064 (if (not ibuffer-filter-groups)
2065 (ibuffer-set-filter-groups-by-root)
2066 (setq ibuffer-filter-groups nil))
2067 (pop-to-buffer ibuf)
2068 (ibuffer-update nil t)
2069 (ibuffer-jump-to-buffer (buffer-name selected-buffer )))))))
2070
2071 (bind-key "h" 'toggle-ibuffer-filter-groups ibuffer-mode-map)
2072
2073 (setq ibuffer-default-sorting-mode 'recency
2074 ibuffer-eliding-string "…"
2075 ibuffer-compile-formats t
2076 ibuffer-git-column-length 6
2077 ibuffer-show-empty-filter-groups nil
2078 ibuffer-default-directory "~/"
2079 )
2080 (setq ibuffer-formats '((mark vc-status-mini
2081 " "
2082 (git-status 8 8 :left)
2083 " "
2084 read-only modified
2085 " "
2086 (name 18 18 :left :elide)
2087 " "
2088 (size-h 9 -1 :right)
2089 " "
2090 (mode 16 16 :left :elide)
2091 " " filename-and-process)
2092 (mark " "
2093 (git-status 8 8 :left)
2094 " "
2095 (name 16 -1)
2096 " " filename)
2097 ))
2098
2099 (setq ibuffer-saved-filter-groups
2100 (quote (("flat")
2101 ("default"
2102 ("dired" (mode . dired-mode))
2103 ("perl" (mode . cperl-mode))
2104 ("puppet" (or
2105 (mode . puppet-mode)
2106 (mode . yaml-mode)))
2107 ("ruby" (mode . ruby-mode))
2108 ("emacs" (or
2109 (name . "^\\*scratch\\*$")
2110 (name . "^\\*Compile-log\\*$")
2111 (name . "^\\*Completions\\*$")
2112 (name . "^\\*Messages\\*$")
2113 (name . "^\\*Backtrace\\*$")
2114 (name . "^\\*Packages*\\*$")
2115 (name . "^\\*Help*\\*$")
2116 ))
2117 ("gnus" (or
2118 (mode . message-mode)
2119 (mode . bbdb-mode)
2120 (mode . mail-mode)
2121 (mode . gnus-group-mode)
2122 (mode . gnus-summary-mode)
2123 (mode . gnus-article-mode)
2124 (name . "^\\.bbdb$")
2125 (name . "^\\.newsrc-dribble")))
2126 ("org" (or
2127 (filename . ".*/org/.*")
2128 (mode . org-agenda-mode)
2129 (name . "^diary$")))
2130 ("other" (or
2131 (mode . magit-log-edit-mode)
2132 (name . "^\\*magit-\\(process\\|commit\\)\\*$"))))
2133 ("categorized"
2134 ;; -------------------------------------------------
2135 ;; programming languages #1
2136 ("code" (or
2137 (mode . emacs-lisp-mode)
2138 (mode . python-mode)
2139 (mode . ruby-mode)
2140 (mode . coffee-mode)
2141 (mode . js-mode)
2142 (mode . js2-mode)
2143 (mode . actionscript-mode)
2144 (mode . java-mode)
2145 (mode . sh-mode)
2146 (mode . haskell-mode)
2147 (mode . html-mode)
2148 (mode . web-mode)
2149 (mode . haml-mode)
2150 (mode . nxml-mode)
2151 (mode . css-mode)))
2152 ;; -------------------------------------------------
2153 ;; configuration/data files
2154 ("conf" (or
2155 (mode . json-mode)
2156 (mode . yaml-mode)
2157 (mode . conf-mode)))
2158 ;; -------------------------------------------------
2159 ;; text/notetaking/org
2160 ("org agenda" (mode . org-agenda-mode))
2161 ("org" (or
2162 (mode . org-mode)
2163 (name . "^\\*Calendar\\*$")
2164 (name . "^diary$")))
2165 ("text misc" (or
2166 (mode . text-mode)
2167 (mode . rst-mode)
2168 (mode . markdown-mode)))
2169 ;; -------------------------------------------------
2170 ;; media
2171 ("media" (or
2172 (mode . image-mode)))
2173 ;; -------------------------------------------------
2174 ;; misc
2175 ("w3m" (mode . w3m-mode))
2176 ("scm" (or
2177 (mode . magit-status-mode)
2178 (mode . magit-log-mode)
2179 (mode . vc-annotate-mode)))
2180 ("dired" (mode . dired-mode))
2181 ("help" (or
2182 (mode . Info-mode)
2183 (mode . help-mode)
2184 (mode . Man-mode)
2185 (name . "^\\*Personal Keybindings\\*$")))
2186 ;; -------------------------------------------------
2187 ;; *buffer* buffers
2188 ("MORE" (or (mode . magit-log-edit-mode)
2189 (name . "^\\*\\(traad-server\\|httpd\\|epc con.*\\|tramp/.*\\|Completions\\)\\*$")
2190 (name . "^\\*Pymacs\\*$")
2191 (name . "^\\*Compile-log\\*$")
2192 (name . "^\\*Completions\\*$")
2193 (name . "^\\*magit-\\(process\\|commit\\)\\*$")
2194 (name . "^ ")))
2195 ("*buffer*" (name . "\\*.*\\*"))))))
2196
2197 (add-hook 'ibuffer-mode-hook
2198 (lambda ()
2199 (ibuffer-auto-mode 1)
2200 (ibuffer-switch-to-saved-filter-groups "default")))
2201
2202 ;; Unless you turn this variable on you will be prompted every time
2203 ;; you want to delete a buffer, even unmodified ones, which is way
2204 ;; too cautious for most people. You’ll still be prompted for
2205 ;; confirmation when deleting modified buffers after the option has
2206 ;; been turned off.
2207 (setq ibuffer-expert t)
2208
2209 ))
2210 #+END_SRC
2211 ** icicles
2212 [[http://article.gmane.org/gmane.emacs.orgmode/4574/match%3Dicicles]["In case you never heard of it, Icicles is to ‘TAB’ completion what
2213 ‘TAB’ completion is to typing things manually every time.”]]
2214 #+BEGIN_SRC emacs-lisp :tangle yes
2215 (use-package icicles
2216 :load-path "elisp/icicle/"
2217 :init
2218 (icy-mode 1))
2219 #+END_SRC
2220 ** icomplete
2221 Incremental mini-buffer completion preview: Type in the minibuffer,
2222 list of matching commands is echoed
2223 #+BEGIN_SRC emacs-lisp :tangle yes
2224 (icomplete-mode 99)
2225 #+END_SRC
2226 ** iedit
2227 [2014-05-26 Mon 22:49]
2228 #+BEGIN_SRC emacs-lisp :tangle yes
2229 (use-package iedit
2230 :ensure iedit
2231 :commands (iedit-mode)
2232 :defer t
2233 :bind (("C-;" . iedit-mode)
2234 ("C-," . iedit-mode-toggle-on-function))
2235 )
2236
2237 #+END_SRC
2238 ** info stuff
2239 [2014-05-20 Tue 23:35]
2240 #+BEGIN_SRC emacs-lisp :tangle yes
2241 (use-package info
2242 :bind ("C-h C-i" . info-lookup-symbol)
2243
2244 :config
2245 (progn
2246 ;; (defadvice info-setup (after load-info+ activate)
2247 ;; (use-package info+))
2248
2249 (defadvice Info-exit (after remove-info-window activate)
2250 "When info mode is quit, remove the window."
2251 (if (> (length (window-list)) 1)
2252 (delete-window)))))
2253
2254 (use-package info-look
2255 :commands info-lookup-add-help)
2256 #+END_SRC
2257 ** linum (line number)
2258 Various modes should have line numbers in front of each line.
2259
2260 But then there are some where it would just be deadly - like org-mode,
2261 gnus, so we have a list of modes where we don't want to see it.
2262 #+BEGIN_SRC emacs-lisp :tangle yes
2263 (use-package linum
2264 :diminish linum-mode
2265 :config
2266 (progn
2267 (setq linum-format "%3d ")
2268 (setq linum-mode-inhibit-modes-list '(org-mode
2269 eshell-mode
2270 shell-mode
2271 gnus-group-mode
2272 gnus-summary-mode
2273 gnus-article-mode))
2274
2275 (defadvice linum-on (around linum-on-inhibit-for-modes)
2276 "Stop the load of linum-mode for some major modes."
2277 (unless (member major-mode linum-mode-inhibit-modes-list)
2278 ad-do-it))
2279
2280 (ad-activate 'linum-on)
2281 (use-package linum-relative
2282 :ensure linum-relative
2283 :bind ("C-c r" . linum-relative-toggle))
2284 )
2285 :init
2286 (global-linum-mode 1))
2287 #+END_SRC
2288
2289 ** lisp editing stuff
2290 [2013-04-21 So 21:00]
2291 I'm not doing much of it, except for my emacs and gnus configs, but
2292 then I like it nice too...
2293 #+BEGIN_SRC emacs-lisp :tangle yes
2294 (bind-key "TAB" 'lisp-complete-symbol read-expression-map)
2295
2296 (defun remove-elc-on-save ()
2297 "If you're saving an elisp file, likely the .elc is no longer valid."
2298 (make-local-variable 'after-save-hook)
2299 (add-hook 'after-save-hook
2300 (lambda ()
2301 (if (file-exists-p (concat buffer-file-name "c"))
2302 (delete-file (concat buffer-file-name "c"))))))
2303
2304 (add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
2305 (add-hook 'emacs-lisp-mode-hook 'remove-elc-on-save)
2306
2307 (use-package paredit
2308 :ensure paredit
2309 :diminish paredit-mode " π")
2310
2311 (setq lisp-coding-hook 'lisp-coding-defaults)
2312 (setq interactive-lisp-coding-hook 'interactive-lisp-coding-defaults)
2313
2314 (setq prelude-emacs-lisp-mode-hook 'prelude-emacs-lisp-mode-defaults)
2315 (add-hook 'emacs-lisp-mode-hook (lambda ()
2316 (run-hooks 'prelude-emacs-lisp-mode-hook)))
2317
2318 (bind-key "M-." 'find-function-at-point emacs-lisp-mode-map)
2319
2320 (after "elisp-slime-nav"
2321 '(diminish 'elisp-slime-nav-mode))
2322 (after "rainbow-mode"
2323 '(diminish 'rainbow-mode))
2324 (after "eldoc"
2325 '(diminish 'eldoc-mode))
2326 #+END_SRC
2327
2328 ** magit
2329 [2013-04-21 So 20:48]
2330 magit is a mode for interacting with git.
2331 #+BEGIN_SRC emacs-lisp :tangle yes
2332 (use-package magit
2333 :ensure magit
2334 :commands (magit-log magit-run-gitk magit-run-git-gui magit-status
2335 magit-git-repo-p magit-list-repos)
2336 :defer t
2337 :bind (("C-x g" . magit-status)
2338 ("C-x G" . magit-status-with-prefix))
2339 :init
2340 (progn
2341 (setq magit-commit-signoff t
2342 magit-repo-dirs '("~/git"
2343 "/develop/vcs/"
2344 "/develop/Debian/"
2345 )
2346 magit-repo-dirs-depth 4
2347 magit-log-auto-more t)
2348 (use-package magit-blame
2349 :commands magit-blame-mode)
2350
2351 (use-package magit-svn
2352 :ensure magit-svn
2353 :commands (magit-svn-mode
2354 turn-on-magit-svn))
2355
2356 (add-hook 'magit-mode-hook 'hl-line-mode)
2357 (defun magit-status-with-prefix ()
2358 (interactive)
2359 (let ((current-prefix-arg '(4)))
2360 (call-interactively 'magit-status)))
2361 )
2362 :config
2363 (progn
2364 (setenv "GIT_PAGER" "")
2365
2366 (unbind-key "M-h" magit-mode-map)
2367 (unbind-key "M-s" magit-mode-map)
2368
2369 (use-package magit-find-file
2370 :ensure magit-find-file
2371 :commands (magit-find-file-completing-read)
2372 :defer t
2373 :init
2374 (progn
2375 (bind-key "C-x C-f" 'magit-find-file-completing-read magit-mode-map)))
2376
2377 (add-hook 'magit-log-edit-mode-hook
2378 #'(lambda ()
2379 (set-fill-column 72)
2380 (flyspell-mode)))
2381
2382 (defadvice magit-status (around magit-fullscreen activate)
2383 (window-configuration-to-register :magit-fullscreen)
2384 ad-do-it
2385 (delete-other-windows))
2386
2387 (defun magit-quit-session ()
2388 "Restores the previous window configuration and kills the magit buffer"
2389 (interactive)
2390 (kill-buffer)
2391 (jump-to-register :magit-fullscreen))
2392
2393 (bind-key "q" 'magit-quit-session magit-status-mode-map)
2394 ))
2395 #+END_SRC
2396 ** markdown-mode
2397 [2014-05-20 Tue 23:04]
2398 #+BEGIN_SRC emacs-lisp :tangle yes
2399 (use-package markdown-mode
2400 :mode (("\\.md\\'" . markdown-mode)
2401 ("\\.mdwn\\'" . markdown-mode))
2402 :defer t)
2403 #+END_SRC
2404 ** message
2405 #+BEGIN_SRC emacs-lisp :tangle yes
2406 (require 'message)
2407 (setq message-kill-buffer-on-exit t)
2408 #+END_SRC
2409 ** mingus
2410 [[https://github.com/pft/mingus][Mingus]] is a nice interface to mpd, the Music Player Daemon.
2411
2412 I want to access it from anywhere using =F6=.
2413 #+BEGIN_SRC emacs-lisp :tangle yes
2414 (use-package mingus-stays-home
2415 :bind ( "<f6>" . mingus)
2416 :defer t
2417 :config
2418 (progn
2419 (setq mingus-dired-add-keys t)
2420 (setq mingus-mode-always-modeline nil)
2421 (setq mingus-mode-line-show-elapsed-percentage nil)
2422 (setq mingus-mode-line-show-volume nil)
2423 (setq mingus-mpd-config-file "/etc/mpd.conf")
2424 (setq mingus-mpd-playlist-dir "/var/lib/mpd/playlists")
2425 (setq mingus-mpd-root "/share/music/")))
2426 #+END_SRC
2427
2428 ** miniedit
2429 Edit minibuffer in a full (text-mode) buffer by pressing *M-C-e*.
2430 #+BEGIN_SRC emacs-lisp :tangle yes
2431 (use-package miniedit
2432 :ensure miniedit
2433 :config
2434 (progn
2435 (bind-key "M-C-e" 'miniedit minibuffer-local-map)
2436 (bind-key "M-C-e" 'miniedit minibuffer-local-ns-map)
2437 (bind-key "M-C-e" 'miniedit minibuffer-local-completion-map)
2438 (bind-key "M-C-e" 'miniedit minibuffer-local-must-match-map)
2439 ))
2440 #+END_SRC
2441
2442
2443 ** mmm-mode
2444 [2013-05-21 Tue 23:39]
2445 MMM Mode is a minor mode for Emacs that allows Multiple Major Modes to
2446 coexist in one buffer.
2447 #+BEGIN_SRC emacs-lisp :tangle yes
2448 (use-package mmm-auto
2449 :ensure mmm-mode
2450 :init
2451 (progn
2452 (setq mmm-global-mode 'buffers-with-submode-classes)
2453 (setq mmm-submode-decoration-level 2)
2454 (eval-after-load 'mmm-vars
2455 '(progn
2456 (mmm-add-group
2457 'html-css
2458 '((css-cdata
2459 :submode css-mode
2460 :face mmm-code-submode-face
2461 :front "<style[^>]*>[ \t\n]*\\(//\\)?<!\\[CDATA\\[[ \t]*\n?"
2462 :back "[ \t]*\\(//\\)?]]>[ \t\n]*</style>"
2463 :insert ((?j js-tag nil @ "<style type=\"text/css\">"
2464 @ "\n" _ "\n" @ "</script>" @)))
2465 (css
2466 :submode css-mode
2467 :face mmm-code-submode-face
2468 :front "<style[^>]*>[ \t]*\n?"
2469 :back "[ \t]*</style>"
2470 :insert ((?j js-tag nil @ "<style type=\"text/css\">"
2471 @ "\n" _ "\n" @ "</style>" @)))
2472 (css-inline
2473 :submode css-mode
2474 :face mmm-code-submode-face
2475 :front "style=\""
2476 :back "\"")))
2477 (dolist (mode (list 'html-mode 'nxml-mode))
2478 (mmm-add-mode-ext-class mode "\\.r?html\\(\\.erb\\)?\\'" 'html-css))
2479 (mmm-add-mode-ext-class 'html-mode "\\.php\\'" 'html-php)
2480 ))))
2481 #+END_SRC
2482
2483 ** mo-git-blame
2484 This is [[https://github.com/mbunkus/mo-git-blame][mo-git-blame -- An interactive, iterative 'git blame' mode for
2485 Emacs]].
2486
2487 #+BEGIN_SRC emacs-lisp :tangle yes
2488 (use-package mo-git-blame
2489 :ensure mo-git-blame
2490 :commands (mo-git-blame-current
2491 mo-git-blame-file)
2492 :config
2493 (progn
2494 (setq mo-git-blame-blame-window-width 25)))
2495 #+END_SRC
2496
2497 ** multiple cursors
2498 [2013-04-08 Mon 23:57]
2499 Use multiple cursors mode. See [[http://emacsrocks.com/e13.html][Emacs Rocks! multiple cursors]] and
2500 [[https://github.com/emacsmirror/multiple-cursors][emacsmirror/multiple-cursors · GitHub]]
2501 #+BEGIN_SRC emacs-lisp :tangle yes
2502 (use-package multiple-cursors
2503 :ensure multiple-cursors
2504 :defer t
2505 :commands (mc/remove-fake-cursors
2506 mc/create-fake-cursor-at-point
2507 mc/pop-state-from-overlay
2508 mc/maybe-multiple-cursors-mode)
2509 :bind (("C-S-c C-S-c" . mc/edit-lines)
2510 ("C->" . mc/mark-next-like-this)
2511 ("C-<" . mc/mark-previous-like-this)
2512 ("C-c C-<" . mc/mark-all-like-this)
2513 ("C-c i" . mc/insert-numbers))
2514 :config
2515 (progn
2516 (bind-key "a" 'mc/mark-all-like-this region-bindings-mode-map)
2517 (bind-key "p" 'mc/mark-previous-like-this region-bindings-mode-map)
2518 (bind-key "n" 'mc/mark-next-like-this region-bindings-mode-map)
2519 (bind-key "l" 'mc/edit-lines region-bindings-mode-map)
2520 (bind-key "m" 'mc/mark-more-like-this-extended region-bindings-mode-map)
2521 (setq mc/list-file (expand-file-name "mc-cache.el" jj-cache-dir))))
2522 #+END_SRC
2523 ** neotree
2524 [2014-08-27 Wed 17:15]
2525 A emacs tree plugin
2526 #+BEGIN_SRC emacs-lisp :tangle yes
2527 (use-package neotree
2528 :ensure neotree
2529 :defer t
2530 :bind (("<f8>" . neotree-toggle))
2531 :commands (neotree-find
2532 neotree-toggle
2533 neotree)
2534 :init
2535 (progn
2536 (setq neo-smart-open t)))
2537 #+END_SRC
2538 ** nxml
2539 [2013-05-22 Wed 22:02]
2540 nxml-mode is a major mode for editing XML.
2541 #+BEGIN_SRC emacs-lisp :tangle yes
2542 (add-auto-mode
2543 'nxml-mode
2544 (concat "\\."
2545 (regexp-opt
2546 '("xml" "xsd" "sch" "rng" "xslt" "svg" "rss"
2547 "gpx" "tcx"))
2548 "\\'"))
2549 (setq magic-mode-alist (cons '("<\\?xml " . nxml-mode) magic-mode-alist))
2550 (fset 'xml-mode 'nxml-mode)
2551 (setq nxml-slash-auto-complete-flag t)
2552
2553 ;; See: http://sinewalker.wordpress.com/2008/06/26/pretty-printing-xml-with-emacs-nxml-mode/
2554 (defun pp-xml-region (begin end)
2555 "Pretty format XML markup in region. The function inserts
2556 linebreaks to separate tags that have nothing but whitespace
2557 between them. It then indents the markup by using nxml's
2558 indentation rules."
2559 (interactive "r")
2560 (save-excursion
2561 (nxml-mode)
2562 (goto-char begin)
2563 (while (search-forward-regexp "\>[ \\t]*\<" nil t)
2564 (backward-char) (insert "\n"))
2565 (indent-region begin end)))
2566
2567 ;;----------------------------------------------------------------------------
2568 ;; Integration with tidy for html + xml
2569 ;;----------------------------------------------------------------------------
2570 ;; tidy is autoloaded
2571 (eval-after-load 'tidy
2572 '(progn
2573 (add-hook 'nxml-mode-hook (lambda () (tidy-build-menu nxml-mode-map)))
2574 (add-hook 'html-mode-hook (lambda () (tidy-build-menu html-mode-map)))
2575 ))
2576
2577 #+END_SRC
2578 ** org :FIXME:
2579 *** General settings
2580 [2013-04-28 So 17:06]
2581
2582 I use org-mode a lot and, having my config for this based on [[*Bernt%20Hansen][the config of Bernt Hansen]],
2583 it is quite extensive. Nevertheless, it starts out small, loading it.
2584 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2585 (require 'org)
2586 #+END_SRC
2587
2588 My browsers (Conkeror, Iceweasel) can store links in org-mode. For
2589 that we need org-protocol.
2590 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2591 (require 'org-protocol)
2592 #+END_SRC
2593
2594 *** Agenda
2595
2596 My current =org-agenda-files= variable only includes a set of
2597 directories.
2598 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2599 (setq org-agenda-files (quote ("~/org/"
2600 "~/org/debian"
2601 "~/org/debconf"
2602 "~/org/spi"
2603 "~/org/nsb"
2604 )))
2605 (setq org-default-notes-file "~/org/notes.org")
2606 #+END_SRC
2607 =org-mode= manages the =org-agenda-files= variable automatically using
2608 =C-c [= and =C-c ]= to add and remove files respectively. However,
2609 this replaces my directory list with a list of explicit filenames
2610 instead and is not what I want. If this occurs then adding a new org
2611 file to any of the above directories will not contribute to my agenda
2612 and I will probably miss something important.
2613
2614 I have disabled the =C-c [= and =C-c ]= keys in =org-mode-hook= to
2615 prevent messing up my list of directories in the =org-agenda-files=
2616 variable. I just add and remove directories manually here. Changing
2617 the list of directories in =org-agenda-files= happens very rarely
2618 since new files in existing directories are automatically picked up.
2619
2620 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2621 ;; Keep tasks with dates on the global todo lists
2622 (setq org-agenda-todo-ignore-with-date nil)
2623
2624 ;; Keep tasks with deadlines on the global todo lists
2625 (setq org-agenda-todo-ignore-deadlines nil)
2626
2627 ;; Keep tasks with scheduled dates on the global todo lists
2628 (setq org-agenda-todo-ignore-scheduled nil)
2629
2630 ;; Keep tasks with timestamps on the global todo lists
2631 (setq org-agenda-todo-ignore-timestamp nil)
2632
2633 ;; Remove completed deadline tasks from the agenda view
2634 (setq org-agenda-skip-deadline-if-done t)
2635
2636 ;; Remove completed scheduled tasks from the agenda view
2637 (setq org-agenda-skip-scheduled-if-done t)
2638
2639 ;; Remove completed items from search results
2640 (setq org-agenda-skip-timestamp-if-done t)
2641
2642 ;; Include agenda archive files when searching for things
2643 (setq org-agenda-text-search-extra-files (quote (agenda-archives)))
2644
2645 ;; Show all future entries for repeating tasks
2646 (setq org-agenda-repeating-timestamp-show-all t)
2647
2648 ;; Show all agenda dates - even if they are empty
2649 (setq org-agenda-show-all-dates t)
2650
2651 ;; Sorting order for tasks on the agenda
2652 (setq org-agenda-sorting-strategy
2653 (quote ((agenda habit-down time-up user-defined-up priority-down effort-up category-keep)
2654 (todo category-up priority-down effort-up)
2655 (tags category-up priority-down effort-up)
2656 (search category-up))))
2657
2658 ;; Start the weekly agenda on Monday
2659 (setq org-agenda-start-on-weekday 1)
2660
2661 ;; Enable display of the time grid so we can see the marker for the current time
2662 (setq org-agenda-time-grid (quote ((daily today remove-match)
2663 #("----------------" 0 16 (org-heading t))
2664 (0800 1000 1200 1400 1500 1700 1900 2100))))
2665
2666 ;; Display tags farther right
2667 (setq org-agenda-tags-column -102)
2668
2669 ; position the habit graph on the agenda to the right of the default
2670 (setq org-habit-graph-column 50)
2671
2672 ; turn habits back on
2673 (run-at-time "06:00" 86400 '(lambda () (setq org-habit-show-habits t)))
2674
2675 ;;
2676 ;; Agenda sorting functions
2677 ;;
2678 (setq org-agenda-cmp-user-defined 'bh/agenda-sort)
2679
2680
2681 (setq org-deadline-warning-days 30)
2682
2683 ;; Always hilight the current agenda line
2684 (add-hook 'org-agenda-mode-hook
2685 '(lambda () (hl-line-mode 1))
2686 'append)
2687 #+END_SRC
2688
2689 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2690 (setq org-agenda-persistent-filter t)
2691 (add-hook 'org-agenda-mode-hook
2692 '(lambda () (org-defkey org-agenda-mode-map "W" 'bh/widen))
2693 'append)
2694
2695 (add-hook 'org-agenda-mode-hook
2696 '(lambda () (org-defkey org-agenda-mode-map "F" 'bh/restrict-to-file-or-follow))
2697 'append)
2698
2699 (add-hook 'org-agenda-mode-hook
2700 '(lambda () (org-defkey org-agenda-mode-map "N" 'bh/narrow-to-subtree))
2701 'append)
2702
2703 (add-hook 'org-agenda-mode-hook
2704 '(lambda () (org-defkey org-agenda-mode-map "U" 'bh/narrow-up-one-level))
2705 'append)
2706
2707 (add-hook 'org-agenda-mode-hook
2708 '(lambda () (org-defkey org-agenda-mode-map "P" 'bh/narrow-to-project))
2709 'append)
2710
2711 ; Rebuild the reminders everytime the agenda is displayed
2712 (add-hook 'org-finalize-agenda-hook 'bh/org-agenda-to-appt 'append)
2713
2714 ;(if (file-exists-p "~/org/refile.org")
2715 ; (add-hook 'after-init-hook 'bh/org-agenda-to-appt))
2716
2717 ; Activate appointments so we get notifications
2718 (appt-activate t)
2719
2720 (setq org-agenda-log-mode-items (quote (closed clock state)))
2721 (if (> emacs-major-version 23)
2722 (setq org-agenda-span 3)
2723 (setq org-agenda-ndays 3))
2724
2725 (setq org-agenda-show-all-dates t)
2726 (setq org-agenda-start-on-weekday nil)
2727 (setq org-deadline-warning-days 14)
2728
2729 #+END_SRC
2730 *** Global keybindings.
2731 Start off by defining a series of keybindings.
2732
2733 Well, first we remove =C-c [= and =C-c ]=, as all agenda directories are
2734 setup manually, not by org-mode. Also turn off =C-c ;=, which
2735 comments headlines - a function never used.
2736 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2737 (add-hook 'org-mode-hook
2738 (lambda ()
2739 (org-defkey org-mode-map "\C-c[" 'undefined)
2740 (org-defkey org-mode-map "\C-c]" 'undefined)
2741 (org-defkey org-mode-map "\C-c;" 'undefined))
2742 'append)
2743 #+END_SRC
2744
2745 And now a largish set of keybindings...
2746 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2747 (bind-key "C-c l" 'org-store-link)
2748 (bind-key "C-c a" 'org-agenda)
2749 ;(bind-key "C-c b" 'org-iswitchb)
2750 (define-key mode-specific-map [?a] 'org-agenda)
2751
2752 (bind-key "<f12>" 'org-agenda)
2753 (bind-key "<f5>" 'bh/org-todo)
2754 (bind-key "<S-f5>" 'bh/widen)
2755 (bind-key "<f7>" 'bh/set-truncate-lines)
2756 ;(bind-key "<f8>" 'org-cycle-agenda-files)
2757
2758 (bind-key "<f9> <f9>" 'bh/show-org-agenda)
2759 (bind-key "<f9> b" 'bbdb)
2760 (bind-key "<f9> c" 'calendar)
2761 (bind-key "<f9> f" 'boxquote-insert-file)
2762 (bind-key "<f9> h" 'bh/hide-other)
2763 (bind-key "<f9> n" 'org-narrow-to-subtree)
2764 (bind-key "<f9> w" 'widen)
2765 (bind-key "<f9> u" 'bh/narrow-up-one-level)
2766 (bind-key "<f9> I" 'bh/punch-in)
2767 (bind-key "<f9> O" 'bh/punch-out)
2768 (bind-key "<f9> H" 'jj/punch-in-hw)
2769 (bind-key "<f9> W" 'jj/punch-out-hw)
2770 (bind-key "<f9> o" 'bh/make-org-scratch)
2771 (bind-key "<f9> p" 'bh/phone-call)
2772 (bind-key "<f9> r" 'boxquote-region)
2773 (bind-key "<f9> s" 'bh/switch-to-scratch)
2774 (bind-key "<f9> t" 'bh/insert-inactive-timestamp)
2775 (bind-key "<f9> T" 'tabify)
2776 (bind-key "<f9> U" 'untabify)
2777 (bind-key "<f9> v" 'visible-mode)
2778 (bind-key "<f9> SPC" 'bh/clock-in-last-task)
2779 (bind-key "C-<f9>" 'previous-buffer)
2780 (bind-key "C-<f10>" 'next-buffer)
2781 (bind-key "M-<f9>" 'org-toggle-inline-images)
2782 ;(bind-key "C-x n r" 'narrow-to-region)
2783 (bind-key "<f11>" 'org-clock-goto)
2784 (bind-key "C-<f11>" 'org-clock-in)
2785 (bind-key "C-M-r" 'org-capture)
2786 (bind-key "C-c r" 'org-capture)
2787 (bind-key "C-S-<f12>" 'bh/save-then-publish)
2788 (bind-key "C-k" 'jj-org-kill-line org-mode-map)
2789
2790 #+END_SRC
2791
2792 *** Tasks, States, Todo fun
2793
2794 First we define the global todo keywords.
2795 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2796 (setq org-todo-keywords
2797 (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d@/!)")
2798 (sequence "WAITING(w@/!)" "HOLD(h@/!)" "DELEGATED(g@/!)" "|" "CANCELLED(c@/!)" "PHONE"))))
2799
2800 (setq org-todo-keyword-faces
2801 (quote (("TODO" :foreground "red" :weight bold)
2802 ("NEXT" :foreground "light blue" :weight bold)
2803 ("DONE" :foreground "forest green" :weight bold)
2804 ("WAITING" :foreground "orange" :weight bold)
2805 ("HOLD" :foreground "orange" :weight bold)
2806 ("DELEGATED" :foreground "yellow" :weight bold)
2807 ("CANCELLED" :foreground "dark green" :weight bold)
2808 ("PHONE" :foreground "dark green" :weight bold))))
2809 #+END_SRC
2810
2811 **** Fast Todo Selection
2812 Fast todo selection allows changing from any task todo state to any
2813 other state directly by selecting the appropriate key from the fast
2814 todo selection key menu.
2815 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2816 (setq org-use-fast-todo-selection t)
2817 #+END_SRC
2818 Changing a task state is done with =C-c C-t KEY=
2819
2820 where =KEY= is the appropriate fast todo state selection key as defined in =org-todo-keywords=.
2821
2822 The setting
2823 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2824 (setq org-treat-S-cursor-todo-selection-as-state-change nil)
2825 #+END_SRC
2826 allows changing todo states with S-left and S-right skipping all of
2827 the normal processing when entering or leaving a todo state. This
2828 cycles through the todo states but skips setting timestamps and
2829 entering notes which is very convenient when all you want to do is fix
2830 up the status of an entry.
2831
2832 **** Todo State Triggers
2833 I have a few triggers that automatically assign tags to tasks based on
2834 state changes. If a task moves to =CANCELLED= state then it gets a
2835 =CANCELLED= tag. Moving a =CANCELLED= task back to =TODO= removes the
2836 =CANCELLED= tag. These are used for filtering tasks in agenda views
2837 which I'll talk about later.
2838
2839 The triggers break down to the following rules:
2840
2841 - Moving a task to =CANCELLED= adds a =CANCELLED= tag
2842 - Moving a task to =WAITING= adds a =WAITING= tag
2843 - Moving a task to =HOLD= adds a =WAITING= tag
2844 - Moving a task to a done state removes a =WAITING= tag
2845 - Moving a task to =TODO= removes =WAITING= and =CANCELLED= tags
2846 - Moving a task to =NEXT= removes a =WAITING= tag
2847 - Moving a task to =DONE= removes =WAITING= and =CANCELLED= tags
2848
2849 The tags are used to filter tasks in the agenda views conveniently.
2850 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2851 (setq org-todo-state-tags-triggers
2852 (quote (("CANCELLED" ("CANCELLED" . t))
2853 ("WAITING" ("WAITING" . t))
2854 ("HOLD" ("WAITING" . t) ("HOLD" . t))
2855 (done ("WAITING") ("HOLD"))
2856 ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
2857 ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
2858 ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
2859 #+END_SRC
2860
2861 *** Capturing new tasks
2862 Org capture replaces the old remember mode.
2863 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2864 (setq org-directory "~/org")
2865 (setq org-default-notes-file "~/org/refile.org")
2866
2867 ;; Capture templates for: TODO tasks, Notes, appointments, phone calls, and org-protocol
2868 ;; see http://orgmode.org/manual/Template-elements.html
2869 (setq org-capture-templates
2870 (quote (("t" "todo" entry (file "~/org/refile.org")
2871 "* TODO %?\nAdded: %U\n"
2872 :clock-in t :clock-resume t)
2873 ("l" "linktodo" entry (file "~/org/refile.org")
2874 "* TODO %?\nAdded: %U\n%a\n"
2875 :clock-in t :clock-resume t)
2876 ("r" "respond" entry (file "~/org/refile.org")
2877 "* TODO Respond to %:from on %:subject\nSCHEDULED: %t\nAdded: %U\n%a\n"
2878 :clock-in t :clock-resume t :immediate-finish t)
2879 ("n" "note" entry (file "~/org/refile.org")
2880 "* %? :NOTE:\nAdded: %U\n%a\n"
2881 :clock-in t :clock-resume t)
2882 ("d" "Delegated" entry (file "~/org/refile.org")
2883 "* DELEGATED %?\nAdded: %U\n%a\n"
2884 :clock-in t :clock-resume t)
2885 ("j" "Journal" entry (file+datetree "~/org/diary.org")
2886 "* %?\nAdded: %U\n"
2887 :clock-in t :clock-resume t)
2888 ("w" "org-protocol" entry (file "~/org/refile.org")
2889 "* TODO Review %c\nAdded: %U\n"
2890 :immediate-finish t)
2891 ("p" "Phone call" entry (file "~/org/refile.org")
2892 "* PHONE %? :PHONE:\nAdded: %U"
2893 :clock-in t :clock-resume t)
2894 ("x" "Bookmark link" entry (file "~/org/refile.org")
2895 "* Bookmark: %c\n%i\nAdded: %U\n"
2896 :immediate-finish t)
2897 ("h" "Habit" entry (file "~/org/refile.org")
2898 "* NEXT %?\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\nAdded: %U\nSCHEDULED: %(format-time-string \"<%Y-%m-%d %a .+1d/3d>\")\n")
2899 )))
2900 #+END_SRC
2901
2902 Capture mode now handles automatically clocking in and out of a
2903 capture task. This all works out of the box now without special hooks.
2904 When I start a capture mode task the task is clocked in as specified
2905 by =:clock-in t= and when the task is filed with =C-c C-c= the clock
2906 resumes on the original clocking task.
2907
2908 The quick clocking in and out of capture mode tasks (often it takes
2909 less than a minute to capture some new task details) can leave
2910 empty clock drawers in my tasks which aren't really useful.
2911 The following prevents this.
2912 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2913 (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
2914 #+END_SRC
2915
2916 *** Refiling
2917 All my newly captured entries end up in =refile.org= and want to be
2918 moved over to the right place. The following is the setup for it.
2919 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2920 ; Targets include this file and any file contributing to the agenda - up to 9 levels deep
2921 (setq org-refile-targets (quote ((nil :maxlevel . 9)
2922 (org-agenda-files :maxlevel . 9))))
2923
2924 ; Use full outline paths for refile targets - we file directly with IDO
2925 (setq org-refile-use-outline-path t)
2926
2927 ; Targets complete directly with IDO
2928 (setq org-outline-path-complete-in-steps nil)
2929
2930 ; Allow refile to create parent tasks with confirmation
2931 (setq org-refile-allow-creating-parent-nodes (quote confirm))
2932
2933 ; Use IDO for both buffer and file completion and ido-everywhere to t
2934 (setq org-completion-use-ido t)
2935 (setq org-completion-use-iswitchb nil)
2936 :; Use IDO for both buffer and file completion and ido-everywhere to t
2937 ;(setq ido-everywhere t)
2938 ;(setq ido-max-directory-size 100000)
2939 ;(ido-mode (quote both))
2940 ; Use the current window when visiting files and buffers with ido
2941 (setq ido-default-file-method 'selected-window)
2942 (setq ido-default-buffer-method 'selected-window)
2943
2944 ;;;; Refile settings
2945 (setq org-refile-target-verify-function 'bh/verify-refile-target)
2946 #+END_SRC
2947
2948 *** Custom agenda
2949 Agenda view is the central place for org-mode interaction...
2950 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
2951 ;; Do not dim blocked tasks
2952 (setq org-agenda-dim-blocked-tasks nil)
2953 ;; Compact the block agenda view
2954 (setq org-agenda-compact-blocks t)
2955
2956 ;; Custom agenda command definitions
2957 (setq org-agenda-custom-commands
2958 (quote (("N" "Notes" tags "NOTE"
2959 ((org-agenda-overriding-header "Notes")
2960 (org-tags-match-list-sublevels t)))
2961 ("h" "Habits" tags-todo "STYLE=\"habit\""
2962 ((org-agenda-overriding-header "Habits")
2963 (org-agenda-sorting-strategy
2964 '(todo-state-down effort-up category-keep))))
2965 (" " "Agenda"
2966 ((agenda "" nil)
2967 (tags "REFILE"
2968 ((org-agenda-overriding-header "Tasks to Refile")
2969 (org-tags-match-list-sublevels nil)))
2970 (tags-todo "-HOLD-CANCELLED/!"
2971 ((org-agenda-overriding-header "Projects")
2972 (org-agenda-skip-function 'bh/skip-non-projects)
2973 (org-agenda-sorting-strategy
2974 '(category-keep))))
2975 (tags-todo "-CANCELLED/!"
2976 ((org-agenda-overriding-header "Stuck Projects")
2977 (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
2978 (tags-todo "-WAITING-CANCELLED/!NEXT"
2979 ((org-agenda-overriding-header "Next Tasks")
2980 (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
2981 (org-agenda-todo-ignore-scheduled t)
2982 (org-agenda-todo-ignore-deadlines t)
2983 (org-agenda-todo-ignore-with-date t)
2984 (org-tags-match-list-sublevels t)
2985 (org-agenda-sorting-strategy
2986 '(todo-state-down effort-up category-keep))))
2987 (tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
2988 ((org-agenda-overriding-header "Tasks")
2989 (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
2990 (org-agenda-todo-ignore-scheduled t)
2991 (org-agenda-todo-ignore-deadlines t)
2992 (org-agenda-todo-ignore-with-date t)
2993 (org-agenda-sorting-strategy
2994 '(category-keep))))
2995 (tags-todo "-CANCELLED+WAITING/!"
2996 ((org-agenda-overriding-header "Waiting and Postponed Tasks")
2997 (org-agenda-skip-function 'bh/skip-stuck-projects)
2998 (org-tags-match-list-sublevels nil)
2999 (org-agenda-todo-ignore-scheduled 'future)
3000 (org-agenda-todo-ignore-deadlines 'future)))
3001 (tags "-REFILE/"
3002 ((org-agenda-overriding-header "Tasks to Archive")
3003 (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
3004 (org-tags-match-list-sublevels nil))))
3005 nil)
3006 ("r" "Tasks to Refile" tags "REFILE"
3007 ((org-agenda-overriding-header "Tasks to Refile")
3008 (org-tags-match-list-sublevels nil)))
3009 ("#" "Stuck Projects" tags-todo "-CANCELLED/!"
3010 ((org-agenda-overriding-header "Stuck Projects")
3011 (org-agenda-skip-function 'bh/skip-non-stuck-projects)))
3012 ("n" "Next Tasks" tags-todo "-WAITING-CANCELLED/!NEXT"
3013 ((org-agenda-overriding-header "Next Tasks")
3014 (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
3015 (org-agenda-todo-ignore-scheduled t)
3016 (org-agenda-todo-ignore-deadlines t)
3017 (org-agenda-todo-ignore-with-date t)
3018 (org-tags-match-list-sublevels t)
3019 (org-agenda-sorting-strategy
3020 '(todo-state-down effort-up category-keep))))
3021 ("R" "Tasks" tags-todo "-REFILE-CANCELLED/!-HOLD-WAITING"
3022 ((org-agenda-overriding-header "Tasks")
3023 (org-agenda-skip-function 'bh/skip-project-tasks-maybe)
3024 (org-agenda-sorting-strategy
3025 '(category-keep))))
3026 ("p" "Projects" tags-todo "-HOLD-CANCELLED/!"
3027 ((org-agenda-overriding-header "Projects")
3028 (org-agenda-skip-function 'bh/skip-non-projects)
3029 (org-agenda-sorting-strategy
3030 '(category-keep))))
3031 ("w" "Waiting Tasks" tags-todo "-CANCELLED+WAITING/!"
3032 ((org-agenda-overriding-header "Waiting and Postponed tasks"))
3033 (org-tags-match-list-sublevels nil))
3034 ("A" "Tasks to Archive" tags "-REFILE/"
3035 ((org-agenda-overriding-header "Tasks to Archive")
3036 (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
3037 (org-tags-match-list-sublevels nil))))))
3038
3039 ; Overwrite the current window with the agenda
3040 (setq org-agenda-window-setup 'current-window)
3041
3042 #+END_SRC
3043
3044 *** Time
3045 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3046 ;;
3047 ;; Resume clocking task when emacs is restarted
3048 (org-clock-persistence-insinuate)
3049 ;;
3050 ;; Show lot sof clocking history so it's easy to pick items off the C-F11 list
3051 (setq org-clock-history-length 36)
3052 ;; Resume clocking task on clock-in if the clock is open
3053 (setq org-clock-in-resume t)
3054 ;; Change tasks to NEXT when clocking in
3055 (setq org-clock-in-switch-to-state 'bh/clock-in-to-next)
3056 ;; Separate drawers for clocking and logs
3057 (setq org-drawers (quote ("PROPERTIES" "LOGBOOK")))
3058 ;; Save clock data and state changes and notes in the LOGBOOK drawer
3059 (setq org-clock-into-drawer t)
3060 ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration
3061 (setq org-clock-out-remove-zero-time-clocks t)
3062 ;; Clock out when moving task to a done state
3063 (setq org-clock-out-when-done (quote ("DONE" "WAITING" "DELEGATED" "CANCELLED")))
3064 ;; Save the running clock and all clock history when exiting Emacs, load it on startup
3065 (setq org-clock-persist t)
3066 ;; Do not prompt to resume an active clock
3067 (setq org-clock-persist-query-resume nil)
3068 ;; Enable auto clock resolution for finding open clocks
3069 (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
3070 ;; Include current clocking task in clock reports
3071 (setq org-clock-report-include-clocking-task t)
3072
3073 ; use discrete minute intervals (no rounding) increments
3074 (setq org-time-stamp-rounding-minutes (quote (1 1)))
3075
3076 (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
3077
3078 (setq bh/keep-clock-running nil)
3079
3080 (setq org-agenda-clock-consistency-checks
3081 (quote (:max-duration "4:00"
3082 :min-duration 0
3083 :max-gap 0
3084 :gap-ok-around ("4:00"))))
3085
3086 #+END_SRC
3087
3088 **** Setting a default clock task
3089 Per default the =** Organization= task in my tasks.org file receives
3090 misc clock time. This is the task I clock in on when I punch in at the
3091 start of my work day with =F9-I=. Punching-in anywhere clocks in this
3092 Organization task as the default task.
3093
3094 If I want to change the default clocking task I just visit the
3095 new task in any org buffer and clock it in with =C-u C-u C-c C-x
3096 C-i=. Now this new task that collects miscellaneous clock
3097 minutes when the clock would normally stop.
3098
3099 You can quickly clock in the default clocking task with =C-u C-c
3100 C-x C-i d=. Another option is to repeatedly clock out so the
3101 clock moves up the project tree until you clock out the
3102 top-level task and the clock moves to the default task.
3103
3104 **** Reporting
3105 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3106 ;; Agenda clock report parameters
3107 (setq org-agenda-clockreport-parameter-plist
3108 (quote (:link t :maxlevel 5 :fileskip0 t :compact t :narrow 80)))
3109
3110 ;; Agenda log mode items to display (closed and state changes by default)
3111 (setq org-agenda-log-mode-items (quote (closed state)))
3112 #+END_SRC
3113 **** Task estimates, column view
3114 Setup column view globally with the following headlines
3115 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3116 ; Set default column view headings: Task Effort Clock_Summary
3117 (setq org-columns-default-format "%80ITEM(Task) %10Effort(Effort){:} %10CLOCKSUM")
3118 #+END_SRC
3119 Setup the estimate for effort values.
3120 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3121 ; global Effort estimate values
3122 ; global STYLE property values for completion
3123 (setq org-global-properties (quote (("Effort_ALL" . "0:15 0:30 0:45 1:00 2:00 3:00 4:00 5:00 6:00 0:00")
3124 ("STYLE_ALL" . "habit"))))
3125 #+END_SRC
3126
3127 *** Tags
3128 Tags are mostly used for filtering inside the agenda.
3129 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3130 ; Tags with fast selection keys
3131 (setq org-tag-alist (quote ((:startgroup)
3132 ("@errand" . ?e)
3133 ("@office" . ?o)
3134 ("@home" . ?H)
3135 (:endgroup)
3136 ("PHONE" . ?p)
3137 ("WAITING" . ?w)
3138 ("HOLD" . ?h)
3139 ("PERSONAL" . ?P)
3140 ("WORK" . ?W)
3141 ("ORG" . ?O)
3142 ("PRIVATE" . ?N)
3143 ("crypt" . ?E)
3144 ("MARK" . ?M)
3145 ("NOTE" . ?n)
3146 ("CANCELLED" . ?c)
3147 ("FLAGGED" . ??))))
3148
3149 ; Allow setting single tags without the menu
3150 (setq org-fast-tag-selection-single-key (quote expert))
3151
3152 ; For tag searches ignore tasks with scheduled and deadline dates
3153 (setq org-agenda-tags-todo-honor-ignore-options t)
3154 #+END_SRC
3155
3156 *** Archiving
3157 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3158 (setq org-archive-mark-done nil)
3159 (setq org-archive-location "%s_archive::* Archived Tasks")
3160 #+END_SRC
3161
3162 *** org-babel
3163 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3164 (setq org-ditaa-jar-path "~/java/ditaa0_6b.jar")
3165 (setq org-plantuml-jar-path "~/java/plantuml.jar")
3166
3167 (add-hook 'org-babel-after-execute-hook 'bh/display-inline-images 'append)
3168
3169 ; Make babel results blocks lowercase
3170 (setq org-babel-results-keyword "results")
3171
3172 (org-babel-do-load-languages
3173 (quote org-babel-load-languages)
3174 (quote ((emacs-lisp . t)
3175 (awk . t)
3176 (css . t)
3177 (makefile . t)
3178 (perl . t)
3179 (ruby . t)
3180 (dot . t)
3181 (ditaa . t)
3182 (R . t)
3183 (python . t)
3184 (ruby . t)
3185 (gnuplot . t)
3186 (clojure . t)
3187 (sh . t)
3188 (ledger . t)
3189 (org . t)
3190 (plantuml . t)
3191 (latex . t))))
3192
3193 ; Do not prompt to confirm evaluation
3194 ; This may be dangerous - make sure you understand the consequences
3195 ; of setting this -- see the docstring for details
3196 (setq org-confirm-babel-evaluate nil)
3197
3198 ; Use fundamental mode when editing plantuml blocks with C-c '
3199 (add-to-list 'org-src-lang-modes (quote ("plantuml" . fundamental)))
3200 #+END_SRC
3201
3202 #+BEGIN_SRC emacs-lisp :tangle yes
3203 ;; Don't have images visible on startup, breaks on console
3204 (setq org-startup-with-inline-images nil)
3205 #+END_SRC
3206
3207 #+BEGIN_SRC emacs-lisp :tangle yes
3208 (add-to-list 'org-structure-template-alist
3209 '("n" "#+BEGIN_COMMENT\n?\n#+END_COMMENT"
3210 "<comment>\n?\n</comment>"))
3211 #+END_SRC
3212 **** ditaa, graphviz, etc
3213 Those are all nice tools. Look at
3214 http://doc.norang.ca/org-mode.html#playingwithditaa for a nice intro
3215 to them.
3216
3217 *** Publishing and exporting
3218
3219
3220 Org-mode can export to a variety of publishing formats including (but not limited to)
3221
3222 - ASCII
3223 (plain text - but not the original org-mode file)
3224 - HTML
3225 - LaTeX
3226 - Docbook
3227 which enables getting to lots of other formats like ODF, XML, etc
3228 - PDF
3229 via LaTeX or Docbook
3230 - iCal
3231
3232 A new exporter created by Nicolas Goaziou was introduced in org 8.0.
3233
3234 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3235 ;; Explicitly load required exporters
3236 (require 'ox-html)
3237 (require 'ox-latex)
3238 (require 'ox-ascii)
3239 ;; FIXME, check the following two
3240 ;(require 'ox-icalendar)
3241 ;(require 'ox-odt)
3242
3243 ; experimenting with docbook exports - not finished
3244 (setq org-export-docbook-xsl-fo-proc-command "fop %s %s")
3245 (setq org-export-docbook-xslt-proc-command "xsltproc --output %s /usr/share/xml/docbook/stylesheet/nwalsh/fo/docbook.xsl %s")
3246
3247 ;; define categories that should be excluded
3248 (setq org-export-exclude-category (list "google" "google"))
3249 (setq org-icalendar-use-scheduled '(todo-start event-if-todo))
3250
3251 ; define how the date strings look
3252 (setq org-export-date-timestamp-format "%Y-%m-%d")
3253 ; Inline images in HTML instead of producting links to the image
3254 (setq org-html-inline-images t)
3255 ; Do not use sub or superscripts - I currently don't need this functionality in my documents
3256 (setq org-export-with-sub-superscripts nil)
3257
3258 (setq org-html-head-extra (concat
3259 "<link rel=\"stylesheet\" href=\"http://ganneff.de/stylesheet.css\" type=\"text/css\" />\n"
3260 ))
3261 (setq org-html-head-include-default-style nil)
3262 ; Do not generate internal css formatting for HTML exports
3263 (setq org-export-htmlize-output-type (quote css))
3264 ; Export with LaTeX fragments
3265 (setq org-export-with-LaTeX-fragments t)
3266 ; Increase default number of headings to export
3267 (setq org-export-headline-levels 6)
3268
3269
3270 (setq org-publish-project-alist
3271 '(
3272 ("config-notes"
3273 :base-directory "~/.emacs.d/"
3274 :base-extension "org"
3275 :exclude "elisp"
3276 :publishing-directory "/develop/www/emacs"
3277 :recursive t
3278 :publishing-function org-html-publish-to-html
3279 :headline-levels 4 ; Just the default for this project.
3280 :auto-preamble t
3281 :auto-sitemap t
3282 :makeindex t
3283 )
3284 ("config-static"
3285 :base-directory "~/.emacs.d/"
3286 :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
3287 :publishing-directory "/develop/www/emacs"
3288 :exclude "elisp\\|elpa\\|elpa.off\\|auto-save-list\\|cache\\|eshell\\|image-dired\\|themes\\|url"
3289 :recursive t
3290 :publishing-function org-publish-attachment
3291 )
3292 ("inherit-org-info-js"
3293 :base-directory "/develop/vcs/org-info-js/"
3294 :recursive t
3295 :base-extension "js"
3296 :publishing-directory "/develop/www/"
3297 :publishing-function org-publish-attachment
3298 )
3299 ("config" :components ("inherit-org-info-js" "config-notes" "config-static")
3300 )
3301 )
3302 )
3303
3304 (setq org-export-with-timestamps nil)
3305 #+END_SRC
3306
3307 **** Latex export
3308
3309 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3310 (setq org-latex-to-pdf-process
3311 '("xelatex -interaction nonstopmode %f"
3312 "xelatex -interaction nonstopmode %f")) ;; for multiple passes
3313 (setq org-export-latex-listings 'minted)
3314 (setq org-latex-listings t)
3315
3316 ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
3317 ;; but adapted to use latexmk 4.20 or higher.
3318 (defun my-auto-tex-cmd ()
3319 "When exporting from .org with latex, automatically run latex,
3320 pdflatex, or xelatex as appropriate, using latexmk."
3321 (let ((texcmd)))
3322 ;; default command: oldstyle latex via dvi
3323 (setq texcmd "latexmk -dvi -pdfps -quiet %f")
3324 ;; pdflatex -> .pdf
3325 (if (string-match "LATEX_CMD: pdflatex" (buffer-string))
3326 (setq texcmd "latexmk -pdf -quiet %f"))
3327 ;; xelatex -> .pdf
3328 (if (string-match "LATEX_CMD: xelatex" (buffer-string))
3329 (setq texcmd "latexmk -pdflatex='xelatex -shell-escape' -pdf -quiet %f"))
3330 ;; LaTeX compilation command
3331 (setq org-latex-to-pdf-process (list texcmd)))
3332
3333 (add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-cmd)
3334
3335 ;; Specify default packages to be included in every tex file, whether pdflatex or xelatex
3336 (setq org-export-latex-packages-alist
3337 '(("" "graphicx" t)
3338 ("" "longtable" nil)
3339 ("" "float" nil)
3340 ("" "minted" nil)
3341 ))
3342
3343 (defun my-auto-tex-parameters ()
3344 "Automatically select the tex packages to include."
3345 ;; default packages for ordinary latex or pdflatex export
3346 (setq org-export-latex-default-packages-alist
3347 '(("AUTO" "inputenc" t)
3348 ("T1" "fontenc" t)
3349 ("" "fixltx2e" nil)
3350 ("" "wrapfig" nil)
3351 ("" "soul" t)
3352 ("" "textcomp" t)
3353 ("" "marvosym" t)
3354 ("" "wasysym" t)
3355 ("" "latexsym" t)
3356 ("" "amssymb" t)
3357 ("" "hyperref" nil)))
3358
3359 ;; Packages to include when xelatex is used
3360 (if (string-match "LATEX_CMD: xelatex" (buffer-string))
3361 (setq org-export-latex-default-packages-alist
3362 '(("" "fontspec" t)
3363 ("" "xunicode" t)
3364 ("" "url" t)
3365 ("" "rotating" t)
3366 ("german" "babel" t)
3367 ("babel" "csquotes" t)
3368 ("" "soul" t)
3369 ("xetex" "hyperref" nil)
3370 )))
3371
3372 (if (string-match "#+LATEX_CMD: xelatex" (buffer-string))
3373 (setq org-export-latex-classes
3374 (cons '("scrartcl"
3375 "\\documentclass[11pt,DIV=13,oneside]{scrartcl}"
3376 ("\\section{%s}" . "\\section*{%s}")
3377 ("\\subsection{%s}" . "\\subsection*{%s}")
3378 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
3379 ("\\paragraph{%s}" . "\\paragraph*{%s}")
3380 ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
3381 org-export-latex-classes))))
3382
3383 (add-hook 'org-export-latex-after-initial-vars-hook 'my-auto-tex-parameters)
3384 #+END_SRC
3385
3386 *** Prevent editing invisible text
3387 The following setting prevents accidentally editing hidden text when
3388 the point is inside a folded region. This can happen if you are in
3389 the body of a heading and globally fold the org-file with =S-TAB=
3390
3391 I find invisible edits (and undo's) hard to deal with so now I can't
3392 edit invisible text. =C-c C-r= (org-reveal) will display where the
3393 point is if it is buried in invisible text to allow editing again.
3394
3395 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3396 (setq org-catch-invisible-edits 'error)
3397 #+END_SRC
3398
3399 *** Whatever
3400 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3401 ;; disable the default org-mode stuck projects agenda view
3402 (setq org-stuck-projects (quote ("" nil nil "")))
3403
3404 ; force showing the next headline.
3405 (setq org-show-entry-below (quote ((default))))
3406
3407 (setq org-show-following-heading t)
3408 (setq org-show-hierarchy-above t)
3409 (setq org-show-siblings (quote ((default))))
3410
3411 (setq org-special-ctrl-a/e t)
3412 (setq org-special-ctrl-k t)
3413 (setq org-yank-adjusted-subtrees t)
3414
3415 (setq org-table-export-default-format "orgtbl-to-csv")
3416
3417 #+END_SRC
3418
3419 The following setting adds alphabetical lists like
3420 ,a. item one
3421 ,b. item two
3422
3423 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3424 (if (> emacs-major-version 23)
3425 (setq org-list-allow-alphabetical t)
3426 (setq org-alphabetical-lists t))
3427 #+END_SRC
3428
3429 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3430 (setq org-remove-highlights-with-change nil)
3431
3432 (setq org-list-demote-modify-bullet (quote (("+" . "-")
3433 ("*" . "-")
3434 ("1." . "-")
3435 ("1)" . "-"))))
3436
3437
3438
3439 (add-hook 'org-insert-heading-hook 'bh/insert-heading-inactive-timestamp 'append)
3440
3441
3442 ; If we leave Emacs running overnight - reset the appointments one minute after midnight
3443 (run-at-time "24:01" nil 'bh/org-agenda-to-appt)
3444
3445 #+END_SRC
3446
3447
3448 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3449 ;; Enable abbrev-mode
3450 (add-hook 'org-mode-hook (lambda () (abbrev-mode 1)))
3451 (setq org-startup-indented t)
3452 (setq org-startup-folded t)
3453 (setq org-cycle-separator-lines 0)
3454 #+END_SRC
3455
3456 I find extra blank lines in lists and headings a bit of a nuisance.
3457 To get a body after a list you need to include a blank line between
3458 the list entry and the body -- and indent the body appropriately.
3459 Most of my lists have no body detail so I like the look of collapsed
3460 lists with no blank lines better.
3461
3462 The following setting prevents creating blank lines before headings
3463 but allows list items to adapt to existing blank lines around the items:
3464 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3465 (setq org-blank-before-new-entry (quote ((heading)
3466 (plain-list-item . auto))))
3467 #+END_SRC
3468
3469 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3470 (setq org-reverse-note-order nil)
3471 (setq org-default-notes-file "~/notes.org")
3472 #+END_SRC
3473
3474 Enforce task blocking. Tasks can't go done when there is any subtask
3475 still open. Unless they have a property of =NOBLOCKING: t=
3476 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3477 (setq org-enforce-todo-checkbox-dependencies t)
3478 (setq org-enforce-todo-dependencies t)
3479 #+END_SRC
3480
3481 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3482 (setq org-fast-tag-selection-single-key (quote expert))
3483 (setq org-footnote-auto-adjust t)
3484 (setq org-hide-block-startup t)
3485 (setq org-icalendar-alarm-time 15)
3486 (setq org-icalendar-combined-description "Ganneffs Org-mode calendar entries")
3487 (setq org-icalendar-combined-name "\"Ganneffs OrgMode\"")
3488 (setq org-icalendar-honor-noexport-tag t)
3489 (setq org-icalendar-include-bbdb-anniversaries nil)
3490 (setq org-icalendar-include-body 200)
3491 (setq org-icalendar-include-todo nil)
3492 (setq org-icalendar-store-UID t)
3493 (setq org-icalendar-timezone "Europe/Berlin")
3494 (setq org-insert-mode-line-in-empty-file t)
3495 (setq org-log-done (quote note))
3496 (setq org-log-into-drawer t)
3497 (setq org-log-state-notes-insert-after-drawers nil)
3498 (setq org-log-reschedule (quote time))
3499 (setq org-log-states-order-reversed t)
3500 (setq org-mobile-agendas (quote all))
3501 (setq org-mobile-directory "/scpx:joerg@garibaldi.ganneff.de:/srv/www2.ganneff.de/htdocs/org/")
3502 (setq org-mobile-inbox-for-pull "~/org/refile.org")
3503 (setq org-remember-store-without-prompt t)
3504 (setq org-return-follows-link t)
3505 (setq org-reverse-note-order t)
3506
3507 ; regularly save our org-mode buffers
3508 (run-at-time "00:59" 3600 'org-save-all-org-buffers)
3509
3510 (setq org-log-done t)
3511
3512 (setq org-enable-priority-commands t)
3513 (setq org-default-priority ?E)
3514 (setq org-lowest-priority ?E)
3515
3516
3517 #+END_SRC
3518
3519 Speed commands enable single-letter commands in Org-mode files when
3520 the point is at the beginning of a headline, or at the beginning of a
3521 code block.
3522
3523 See the `=org-speed-commands-default=' variable for a list of the keys
3524 and commands enabled at the beginning of headlines. All code blocks
3525 are available at the beginning of a code block, the following key
3526 sequence =C-c C-v h= (bound to `=org-babel-describe-bindings=') will
3527 display a list of the code blocks commands and their related keys.
3528
3529 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3530 (setq org-use-speed-commands t)
3531 (setq org-speed-commands-user (quote (("0" . ignore)
3532 ("1" . ignore)
3533 ("2" . ignore)
3534 ("3" . ignore)
3535 ("4" . ignore)
3536 ("5" . ignore)
3537 ("6" . ignore)
3538 ("7" . ignore)
3539 ("8" . ignore)
3540 ("9" . ignore)
3541
3542 ("a" . ignore)
3543 ("d" . ignore)
3544 ("h" . bh/hide-other)
3545 ("i" progn
3546 (forward-char 1)
3547 (call-interactively 'org-insert-heading-respect-content))
3548 ("k" . org-kill-note-or-show-branches)
3549 ("l" . ignore)
3550 ("m" . ignore)
3551 ("q" . bh/show-org-agenda)
3552 ("r" . ignore)
3553 ("s" . org-save-all-org-buffers)
3554 ("w" . org-refile)
3555 ("x" . ignore)
3556 ("y" . ignore)
3557 ("z" . org-add-note)
3558
3559 ("A" . ignore)
3560 ("B" . ignore)
3561 ("E" . ignore)
3562 ("F" . bh/restrict-to-file-or-follow)
3563 ("G" . ignore)
3564 ("H" . ignore)
3565 ("J" . org-clock-goto)
3566 ("K" . ignore)
3567 ("L" . ignore)
3568 ("M" . ignore)
3569 ("N" . bh/narrow-to-org-subtree)
3570 ("P" . bh/narrow-to-org-project)
3571 ("Q" . ignore)
3572 ("R" . ignore)
3573 ("S" . ignore)
3574 ("T" . bh/org-todo)
3575 ("U" . bh/narrow-up-one-org-level)
3576 ("V" . ignore)
3577 ("W" . bh/widen)
3578 ("X" . ignore)
3579 ("Y" . ignore)
3580 ("Z" . ignore))))
3581
3582 (add-hook 'org-agenda-mode-hook
3583 (lambda ()
3584 (define-key org-agenda-mode-map "q" 'bury-buffer))
3585 'append)
3586
3587 (defvar bh/current-view-project nil)
3588 (add-hook 'org-agenda-mode-hook
3589 '(lambda () (org-defkey org-agenda-mode-map "V" 'bh/view-next-project))
3590 'append)
3591 #+END_SRC
3592
3593 The following displays the contents of code blocks in Org-mode files
3594 using the major-mode of the code. It also changes the behavior of
3595 =TAB= to as if it were used in the appropriate major mode. This means
3596 that reading and editing code form inside of your Org-mode files is
3597 much more like reading and editing of code using its major mode.
3598
3599 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3600 (setq org-src-fontify-natively t)
3601 (setq org-src-tab-acts-natively t)
3602 #+END_SRC
3603
3604 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3605 (setq org-src-preserve-indentation nil)
3606 (setq org-edit-src-content-indentation 0)
3607 #+END_SRC
3608
3609
3610 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3611 (setq org-attach-directory "~/org/data/")
3612 #+END_SRC
3613 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3614 (setq org-agenda-sticky t)
3615 #+END_SRC
3616
3617 **** Checklist handling
3618 [2013-05-11 Sat 22:15]
3619
3620 #+BEGIN_SRC emacs-lisp :tangle yes :tangle yes
3621 (require 'org-checklist)
3622 #+END_SRC
3623
3624 ** perl / cperl
3625 I like /cperl-mode/ a bit more than the default /perl-mode/, so set it
3626 up here to be used.
3627 #+BEGIN_SRC emacs-lisp :tangle yes
3628 (use-package cperl-mode
3629 :commands cperl-mode
3630 :init
3631 (progn
3632 (defalias 'perl-mode 'cperl-mode)
3633 (add-auto-mode 'cperl-mode "\\.\\([pP][Llm]\\|al\\)\\'")
3634 (add-auto-mode 'pod-mode "\\.pod$")
3635 (add-auto-mode 'tt-mode "\\.tt$")
3636 (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
3637 (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
3638 (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
3639 )
3640 :config
3641 (progn
3642 (setq cperl-invalid-face nil
3643 cperl-close-paren-offset -4
3644 cperl-continued-statement-offset 0
3645 cperl-indent-level 4
3646 cperl-indent-parens-as-block t
3647 cperl-hairy t
3648 cperl-electric-keywords t
3649 cperl-electric-lbrace-space t
3650 cperl-electric-parens nil
3651 cperl-highlight-variables-indiscriminately t
3652 cperl-imenu-addback t
3653 cperl-invalid-face (quote underline)
3654 cperl-lazy-help-time 5
3655 cperl-scan-files-regexp "\\.\\([pP][Llm]\\|xs\\|cgi\\)$"
3656 cperl-syntaxify-by-font-lock t
3657 cperl-use-syntax-table-text-property-for-tags t)
3658
3659 ;; And have cperl mode give ElDoc a useful string
3660 (defun my-cperl-eldoc-documentation-function ()
3661 "Return meaningful doc string for `eldoc-mode'."
3662 (car
3663 (let ((cperl-message-on-help-error nil))
3664 (cperl-get-help))))
3665 (add-hook 'cperl-mode-hook
3666 (lambda ()
3667 (set (make-local-variable 'eldoc-documentation-function)
3668 'my-cperl-eldoc-documentation-function)
3669 (eldoc-mode))))
3670 )
3671 #+END_SRC
3672 ** puppet
3673 [2014-05-22 Thu 00:05]
3674 #+BEGIN_SRC emacs-lisp :tangle yes
3675 (use-package puppet-mode
3676 :mode ("\\.pp\\'" . puppet-mode)
3677 :config
3678 (use-package puppet-ext
3679 :init
3680 (progn
3681 (bind-key "C-x ?" 'puppet-set-anchor puppet-mode-map)
3682 (bind-key "C-c C-r" 'puppet-create-require puppet-mode-map)
3683 (defun my-puppet-mode-hook ()
3684 (setq require-final-newline nil))
3685 (add-hook 'puppet-mode-hook 'my-puppet-mode-hook))))
3686 #+END_SRC
3687
3688 ** python
3689 Use elpy for the emacs python fun, but dont let it initialize all the
3690 various variables. Elpy author may like them, but I'm not him...
3691 #+BEGIN_SRC emacs-lisp :tangle yes
3692 (use-package elpy
3693 :defer t
3694 :mode ("\.py" . python-mode)
3695 :init
3696 (progn
3697 (safe-load (concat jj-elisp-dir "/elpy/elpy-autoloads.el"))
3698 )
3699 :config
3700 (progn
3701
3702 (use-package nose
3703 :ensure nose
3704 :commands (nosetests-all nosetests-module nosetests-one
3705 nosetests-failed nosetests-pdb-all
3706 nosetests-pdb-module nosetests-pdb-one)
3707 )
3708
3709 (use-package pyvenv
3710 :ensure pyvenv
3711 :commands (pyvenv-activate pyvenv-deactivate pyvenv-mode pyvenv-restart-python)
3712 )
3713
3714 (use-package idomenu
3715 :ensure idomenu
3716 :commands (idomenu)
3717 :defer t)
3718
3719 (use-package highlight-indentation
3720 :ensure t
3721 :commands (highlight-indentation-mode))
3722
3723 (use-package find-file-in-project
3724 :ensure t
3725 :commands (find-file-in-project ffip-project-files ffip ))
3726
3727 (use-package fuzzy
3728 :ensure t)
3729
3730 ;; Local variables in `python-mode'. This is not removed when Elpy
3731 ;; is disabled, which can cause some confusion.
3732 (add-hook 'python-mode-hook 'elpy-initialize-local-variables)
3733
3734 (defun my-python-mode-hook ()
3735 (setq require-final-newline nil)
3736 (setq mode-require-final-newline))
3737 (add-hook 'python-mode-hook 'my-python-mode-hook)
3738
3739 ;; Flymake support using flake8, including warning faces.
3740 (when (and (executable-find "flake8")
3741 (not (executable-find python-check-command)))
3742 (setq python-check-command "flake8"))
3743
3744 ;; `flymake-no-changes-timeout': The original value of 0.5 is too
3745 ;; short for Python code, as that will result in the current line to
3746 ;; be highlighted most of the time, and that's annoying. This value
3747 ;; might be on the long side, but at least it does not, in general,
3748 ;; interfere with normal interaction.
3749 (setq flymake-no-changes-timeout 60)
3750
3751 ;; `flymake-start-syntax-check-on-newline': This should be nil for
3752 ;; Python, as;; most lines with a colon at the end will mean the next
3753 ;; line is always highlighted as error, which is not helpful and
3754 ;; mostly annoying.
3755 (setq flymake-start-syntax-check-on-newline nil)
3756
3757 ;; `ac-auto-show-menu': Short timeout because the menu is great.
3758 (setq ac-auto-show-menu 0.4)
3759
3760 ;; `ac-quick-help-delay': I'd like to show the menu right with the
3761 ;; completions, but this value should be greater than
3762 ;; `ac-auto-show-menu' to show help for the first entry as well.
3763 (setq ac-quick-help-delay 0.5)
3764
3765 ;; `yas-trigger-key': TAB, as is the default, conflicts with the
3766 ;; autocompletion. We also need to tell yasnippet about the new
3767 ;; binding. This is a bad interface to set the trigger key. Stop
3768 ;; doing this.
3769 (let ((old (when (boundp 'yas-trigger-key)
3770 yas-trigger-key)))
3771 (setq yas-trigger-key "C-c C-i")
3772 (when (fboundp 'yas--trigger-key-reload)
3773 (yas--trigger-key-reload old)))
3774
3775 ;; yas-snippet-dirs can be a string for a single directory. Make
3776 ;; sure it's a list in that case so we can add our own entry.
3777 (when (not (listp yas-snippet-dirs))
3778 (setq yas-snippet-dirs (list yas-snippet-dirs)))
3779 (add-to-list 'yas-snippet-dirs
3780 (concat (file-name-directory (locate-library "elpy"))
3781 "snippets/")
3782 t)
3783
3784 ;; Now load yasnippets.
3785 (yas-reload-all)
3786 (elpy-enable t)
3787 (elpy-use-ipython)))
3788
3789 #+END_SRC
3790
3791 Below is old setup
3792 #+BEGIN_SRC emacs-lisp :tangle no
3793 (autoload 'python-mode "python-mode" "Python Mode." t)
3794 (add-auto-mode 'python-mode "\\.py\\'")
3795 (add-auto-mode 'python-mode "\\.py$")
3796 (add-auto-mode 'python-mode "SConstruct\\'")
3797 (add-auto-mode 'python-mode "SConscript\\'")
3798 (add-to-list 'interpreter-mode-alist '("python" . python-mode))
3799
3800 (after 'python-mode
3801 (set-variable 'py-indent-offset 4)
3802 (set-variable 'py-smart-indentation nil)
3803 (set-variable 'indent-tabs-mode nil)
3804 (define-key python-mode-map "\C-m" 'newline-and-indent)
3805 (turn-on-eldoc-mode)
3806 (defun python-auto-fill-comments-only ()
3807 (auto-fill-mode 1)
3808 (set (make-local-variable 'fill-nobreak-predicate)
3809 (lambda ()
3810 (not (python-in-string/comment)))))
3811 (add-hook 'python-mode-hook
3812 (lambda ()
3813 (python-auto-fill-comments-only)))
3814 ;; pymacs
3815 (autoload 'pymacs-apply "pymacs")
3816 (autoload 'pymacs-call "pymacs")
3817 (autoload 'pymacs-eval "pymacs" nil t)
3818 (autoload 'pymacs-exec "pymacs" nil t)
3819 (autoload 'pymacs-load "pymacs" nil t))
3820 #+END_SRC
3821
3822 If an =ipython= executable is on the path, then assume that IPython is
3823 the preferred method python evaluation.
3824 #+BEGIN_SRC emacs-lisp :tangle no
3825 (when (executable-find "ipython")
3826 (require 'ipython)
3827 (setq org-babel-python-mode 'python-mode))
3828
3829 (setq python-shell-interpreter "ipython")
3830 (setq python-shell-interpreter-args "")
3831 (setq python-shell-prompt-regexp "In \\[[0-9]+\\]: ")
3832 (setq python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: ")
3833 (setq python-shell-completion-setup-code
3834 "from IPython.core.completerlib import module_completion")
3835 (setq python-shell-completion-module-string-code
3836 "';'.join(module_completion('''%s'''))\n")
3837 (setq python-shell-completion-string-code
3838 "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
3839 #+END_SRC
3840 ** rainbow-delimiters
3841 [2013-04-09 Di 23:38]
3842 [[http://www.emacswiki.org/emacs/RainbowDelimiters][EmacsWiki: Rainbow Delimiters]] is a “rainbow parentheses”-like mode
3843 which highlights parens, brackets, and braces according to their
3844 depth. Each successive level is highlighted a different color. This
3845 makes it easy to spot matching delimiters, orient yourself in the code,
3846 and tell which statements are at the same depth.
3847 #+BEGIN_SRC emacs-lisp :tangle yes
3848 (use-package rainbow-delimiters
3849 :ensure rainbow-delimiters
3850 :init
3851 (global-rainbow-delimiters-mode))
3852 #+END_SRC
3853 ** rainbow-mode
3854 #+BEGIN_SRC emacs-lisp :tangle yes
3855 (use-package rainbow-mode
3856 :ensure rainbow-mode
3857 :diminish rainbow-mode)
3858 #+END_SRC
3859
3860 ** re-builder
3861 Saner regex syntax
3862 #+BEGIN_SRC emacs-lisp :tangle yes
3863 (use-package re-builder
3864 :command re-builder
3865 :defer t
3866 :config
3867 (setq reb-re-syntax 'string))
3868 #+END_SRC
3869 ** recentf
3870 [2014-05-19 Mo 22:56]
3871 Recentf is a minor mode that builds a list of recently opened
3872 files. This list is is automatically saved across Emacs sessions.
3873 #+BEGIN_SRC emacs-lisp :tangle yes
3874 (use-package recentf
3875 :if (not noninteractive)
3876 :bind ("C-x C-r" . recentf-open-files)
3877 :init
3878 (progn
3879 (recentf-mode 1)
3880 (setq recentf-max-menu-items 25)
3881 (setq recentf-save-file (expand-file-name ".recentf" jj-cache-dir))
3882
3883 (defun recentf-add-dired-directory ()
3884 (if (and dired-directory
3885 (file-directory-p dired-directory)
3886 (not (string= "/" dired-directory)))
3887 (let ((last-idx (1- (length dired-directory))))
3888 (recentf-add-file
3889 (if (= ?/ (aref dired-directory last-idx))
3890 (substring dired-directory 0 last-idx)
3891 dired-directory)))))
3892
3893 (add-hook 'dired-mode-hook 'recentf-add-dired-directory)))
3894 #+END_SRC
3895 ** Region bindings mode
3896 [2013-05-01 Wed 22:51]
3897 This mode allows to have keybindings that are only alive when the
3898 region is active. Helpful for things that only do any useful action
3899 then, like for example the [[*multiple%20cursors][multiple cursors]] mode I load later.
3900 #+BEGIN_SRC emacs-lisp :tangle yes
3901 (use-package region-bindings-mode
3902 :ensure region-bindings-mode
3903 :init
3904 (region-bindings-mode-enable))
3905 #+END_SRC
3906 ** ruby
3907 [2013-05-22 Wed 22:33]
3908 Programming in ruby...
3909
3910 *** Auto-modes
3911 #+BEGIN_SRC emacs-lisp :tangle yes
3912 (add-auto-mode 'ruby-mode
3913 "Rakefile\\'" "\\.rake\\'" "\.rxml\\'"
3914 "\\.rjs\\'" ".irbrc\\'" "\.builder\\'" "\\.ru\\'"
3915 "\\.gemspec\\'" "Gemfile\\'" "Kirkfile\\'")
3916 #+END_SRC
3917
3918 *** Config
3919 #+BEGIN_SRC emacs-lisp :tangle yes
3920 (use-package ruby-mode
3921 :mode ("\\.rb\\'" . ruby-mode)
3922 :interpreter ("ruby" . ruby-mode)
3923 :defer t
3924 :config
3925 (progn
3926 (use-package yari
3927 :init
3928 (progn
3929 (defvar yari-helm-source-ri-pages
3930 '((name . "RI documentation")
3931 (candidates . (lambda () (yari-ruby-obarray)))
3932 (action ("Show with Yari" . yari))
3933 (candidate-number-limit . 300)
3934 (requires-pattern . 2)
3935 "Source for completing RI documentation."))
3936
3937 (defun helm-yari (&optional rehash)
3938 (interactive (list current-prefix-arg))
3939 (when current-prefix-arg (yari-ruby-obarray rehash))
3940 (helm 'yari-helm-source-ri-pages (yari-symbol-at-point)))))
3941
3942 (defun my-ruby-smart-return ()
3943 (interactive)
3944 (when (memq (char-after) '(?\| ?\" ?\'))
3945 (forward-char))
3946 (call-interactively 'newline-and-indent))
3947
3948 (use-package ruby-hash-syntax
3949 :ensure ruby-hash-syntax)
3950
3951 (use-package inf-ruby
3952 :ensure inf-ruby
3953 :commands inf-ruby-minor-mode
3954 :init
3955 (progn
3956 (add-hook 'ruby-mode-hook 'inf-ruby-minor-mode)
3957 (bind-key "<return>" 'my-ruby-smart-return ruby-mode-map)
3958 ;(bind-key "<tab>" 'indent-for-tab-command ruby-mode-map)
3959
3960
3961 (set (make-local-variable 'yas-fallback-behavior)
3962 '(apply ruby-indent-command . nil))
3963 (bind-key "<tab>" 'yas-expand-from-trigger-key ruby-mode-map)))
3964
3965 ;; Stupidly the non-bundled ruby-mode isn't a derived mode of
3966 ;; prog-mode: we run the latter's hooks anyway in that case.
3967 (add-hook 'ruby-mode-hook
3968 (lambda ()
3969 (unless (derived-mode-p 'prog-mode)
3970 (run-hooks 'prog-mode-hook))))
3971 ))
3972 #+END_SRC
3973 ** sessions :FIXME:
3974 [2013-05-22 Wed 22:40]
3975 Save and restore the desktop
3976 #+BEGIN_SRC emacs-lisp :tangle yes
3977 (setq desktop-path (list jj-cache-dir))
3978 (desktop-save-mode 1)
3979 (defadvice desktop-read (around trace-desktop-errors activate)
3980 (let ((debug-on-error t))
3981 ad-do-it))
3982
3983 ;;----------------------------------------------------------------------------
3984 ;; Restore histories and registers after saving
3985 ;;----------------------------------------------------------------------------
3986 (use-package session
3987 :if (not noninteractive)
3988 :load-path "site-lisp/session/lisp/"
3989 :init
3990 (progn
3991 (setq session-save-file (expand-file-name "session" jj-cache-dir))
3992 (setq desktop-globals-to-save
3993 (append '((extended-command-history . 30)
3994 (file-name-history . 100)
3995 (grep-history . 30)
3996 (compile-history . 30)
3997 (minibuffer-history . 50)
3998 (query-replace-history . 60)
3999 (read-expression-history . 60)
4000 (regexp-history . 60)
4001 (regexp-search-ring . 20)
4002 (search-ring . 20)
4003 (comint-input-ring . 50)
4004 (shell-command-history . 50)
4005 kill-ring
4006 desktop-missing-file-warning
4007 tags-file-name
4008 register-alist)))
4009
4010 (session-initialize)
4011
4012 (defun remove-session-use-package-from-settings ()
4013 (when (string= (file-name-nondirectory (buffer-file-name)) "settings.el")
4014 (save-excursion
4015 (goto-char (point-min))
4016 (when (re-search-forward "^ '(session-use-package " nil t)
4017 (delete-region (line-beginning-position)
4018 (1+ (line-end-position)))))))
4019
4020 (add-hook 'before-save-hook 'remove-session-use-package-from-settings)
4021
4022 ;; expanded folded secitons as required
4023 (defun le::maybe-reveal ()
4024 (when (and (or (memq major-mode '(org-mode outline-mode))
4025 (and (boundp 'outline-minor-mode)
4026 outline-minor-mode))
4027 (outline-invisible-p))
4028 (if (eq major-mode 'org-mode)
4029 (org-reveal)
4030 (show-subtree))))
4031
4032 (add-hook 'session-after-jump-to-last-change-hook
4033 'le::maybe-reveal)
4034
4035 (defun save-information ()
4036 (with-temp-message "Saving Emacs information..."
4037 (recentf-cleanup)
4038
4039 (loop for func in kill-emacs-hook
4040 unless (memq func '(exit-gnus-on-exit server-force-stop))
4041 do (funcall func))
4042
4043 (unless (or noninteractive
4044 (eq 'listen (process-status server-process)))
4045 (server-start))))
4046
4047 (run-with-idle-timer 300 t 'save-information)
4048
4049 (if window-system
4050 (add-hook 'after-init-hook 'session-initialize t))))
4051
4052 #+END_SRC
4053 *** savehist
4054 [2013-04-21 So 20:25]
4055 Save a bit of history
4056 #+BEGIN_SRC emacs-lisp tangle no
4057 (require 'savehist)
4058 (setq savehist-additional-variables
4059 '(search ring regexp-search-ring kill-ring compile-history))
4060 ;; save every minute
4061 (setq savehist-autosave-interval 60)
4062 (setq savehist-file (expand-file-name "savehist" jj-cache-dir))
4063 (savehist-mode +1)
4064 #+END_SRC
4065
4066 *** saveplace
4067 Store at which point I have been in files.
4068 #+BEGIN_SRC emacs-lisp :tangle yes
4069 (setq-default save-place t)
4070 (require 'saveplace)
4071 (setq save-place-file (expand-file-name "saved-places" jj-cache-dir))
4072 #+END_SRC
4073 ** simple-httpd
4074 [2014-06-10 Tue 22:05]
4075 #+BEGIN_SRC emacs-lisp :tangle yes
4076 (use-package simple-httpd
4077 :ensure simple-httpd
4078 :commands (httpd-start httpd-stop)
4079 :config
4080 (progn
4081 (setq httpd-root "/srv/www")
4082 )
4083 )
4084 #+END_SRC
4085 ** sh
4086 Settings for shell scripts
4087 #+BEGIN_SRC emacs-lisp :tangle yes
4088 (use-package sh-script
4089 :defer t
4090 :config
4091 (progn
4092 (defvar sh-script-initialized nil)
4093 (defun initialize-sh-script ()
4094 (unless sh-script-initialized
4095 (setq sh-script-initialized t)
4096 (setq sh-indent-comment t)
4097 (info-lookup-add-help :mode 'shell-script-mode
4098 :regexp ".*"
4099 :doc-spec
4100 '(("(bash)Index")))))
4101
4102 (add-hook 'shell-mode-hook 'initialize-sh-script)))
4103 #+END_SRC
4104 ** sh-toggle
4105 #+BEGIN_SRC emacs-lisp :tangle yes
4106 (use-package sh-toggle
4107 :bind ("C-. C-z" . shell-toggle))
4108 #+END_SRC
4109 ** timestamp
4110 By default, Emacs can update the time stamp for the following two
4111 formats if one exists in the first 8 lines of the file.
4112 - Time-stamp: <>
4113 - Time-stamp: " "
4114 #+BEGIN_SRC emacs-lisp :tangle yes
4115 (use-package time-stamp
4116 :commands time-stamp
4117 :init
4118 (progn
4119 (add-hook 'write-file-hooks 'time-stamp)
4120 (setq time-stamp-active t))
4121 :config
4122 (progn
4123 (setq time-stamp-format "%02H:%02M:%02S (%z) - %02d.%02m.%:y from %u (%U) on %s")
4124 (setq time-stamp-old-format-warn nil)
4125 (setq time-stamp-time-zone nil)))
4126 #+END_SRC
4127
4128 ** tiny-tools
4129 We configure only a bit of the tiny-tools to load when I should need
4130 them. I don't need much actually, but these things are nice to have.
4131
4132 #+BEGIN_SRC emacs-lisp :tangle yes
4133 (autoload 'turn-on-tinyperl-mode "tinyperl" "" t)
4134 (add-hook 'perl-mode-hook 'turn-on-tinyperl-mode)
4135 (add-hook 'cperl-mode-hook 'turn-on-tinyperl-mode)
4136
4137 (autoload 'tinycomment-indent-for-comment "tinycomment" "" t)
4138 (autoload 'tinyeat-forward-preserve "tinyeat" "" t)
4139 (autoload 'tinyeat-backward-preserve "tinyeat" "" t)
4140 (autoload 'tinyeat-kill-line-backward "tinyeat" "" t)
4141 #+END_SRC
4142 *** Keyboard changes for tiny-tools
4143 #+BEGIN_SRC emacs-lisp :tangle yes
4144 (bind-key "\M-;" 'tinycomment-indent-for-comment)
4145 (bind-key "ESC C-k" 'tinyeat-kill-line-backward)
4146 (bind-key "ESC d" 'tinyeat-forward-preserve)
4147 (bind-key "<M-backspace>" 'tinyeat-backward-preserve)
4148 (bind-key "<S-backspace>" 'tinyeat-delete-whole-word)
4149 #+END_SRC
4150 ** tramp
4151 Transparent Remote (file) Access, Multiple Protocol, remote file editing.
4152 #+BEGIN_SRC emacs-lisp :tangle yes
4153 (use-package tramp
4154 :defer t
4155 :config
4156 (progn
4157 (setq tramp-persistency-file-name (expand-file-name "tramp" jj-cache-dir))
4158 (setq shell-prompt-pattern "^[^a-zA-Z].*[#$%>] *")
4159 (add-to-list 'tramp-default-method-alist '("\\`localhost\\'" "\\`root\\'" "su"))
4160 (setq tramp-debug-buffer nil)
4161 (setq tramp-default-method "sshx")
4162 (tramp-set-completion-function "ssh"
4163 '((tramp-parse-sconfig "/etc/ssh_config")
4164 (tramp-parse-sconfig "~/.ssh/config")))
4165 (setq tramp-verbose 5)
4166 ))
4167 #+END_SRC
4168
4169 ** transient mark
4170 For some reason I prefer this mode more than the way without. I want to
4171 see the marked region.
4172 #+BEGIN_SRC emacs-lisp :tangle yes
4173 (transient-mark-mode 1)
4174 (make-variable-buffer-local 'transient-mark-mode)
4175 (put 'transient-mark-mode 'permanent-local t)
4176 (setq-default transient-mark-mode t)
4177 #+END_SRC
4178 ** undo-tree
4179 [2013-04-21 So 11:07]
4180 Emacs undo is pretty powerful - but can also be confusing. There are
4181 tons of modes available to change it, even downgrade it to the very
4182 crappy ways one usually knows from other systems which lose
4183 information. undo-tree is different - it helps keeping you sane while
4184 keeping the full power of emacs undo/redo.
4185 #+BEGIN_SRC emacs-lisp :tangle yes
4186 (use-package undo-tree
4187 :ensure undo-tree
4188 :init
4189 (global-undo-tree-mode)
4190 :diminish undo-tree-mode)
4191 #+END_SRC
4192
4193 Additionally I would like to keep the region active should I undo
4194 while I have one.
4195
4196 #+BEGIN_SRC emacs-lisp :tangle yes
4197 ;; Keep region when undoing in region
4198 (defadvice undo-tree-undo (around keep-region activate)
4199 (if (use-region-p)
4200 (let ((m (set-marker (make-marker) (mark)))
4201 (p (set-marker (make-marker) (point))))
4202 ad-do-it
4203 (goto-char p)
4204 (set-mark m)
4205 (set-marker p nil)
4206 (set-marker m nil))
4207 ad-do-it))
4208 #+END_SRC
4209 ** uniquify
4210 Always have unique buffernames. See [[http://www.gnu.org/software/emacs/manual/html_node/emacs/Uniquify.html][Uniquify - GNU Emacs Manual]]
4211 #+BEGIN_SRC emacs-lisp :tangle yes
4212 (use-package uniquify
4213 :init
4214 (progn
4215 (setq uniquify-buffer-name-style 'post-forward)
4216 (setq uniquify-after-kill-buffer-p t)
4217 (setq uniquify-ignore-buffers-re "^\\*")))
4218 #+END_SRC
4219
4220 ** url
4221 url contains code to parse and handle URLs - who would have thought? I
4222 set it to send Accept-language header and tell it to not send email,
4223 operating system or location info.
4224 #+BEGIN_SRC emacs-lisp :tangle yes
4225 (setq url-mime-language-string "de,en")
4226 (setq url-privacy-level (quote (email os lastloc)))
4227 #+END_SRC
4228 ** visual-regexp
4229 [2014-06-01 Sun 21:38]
4230 visual-regexp for Emacs is like replace-regexp, but with live visual
4231 feedback directly in the buffer
4232 #+BEGIN_SRC emacs-lisp :tangle yes
4233 (use-package visual-regexp
4234 :ensure visual-regexp
4235 :bind (("C-M-%" . vr/replace)
4236 ("M-%" . vr/query-replace)
4237 ("C-c m" . vr/mc-mark))
4238 :defer t)
4239 #+END_SRC
4240 ** volatile highlights
4241 [2013-04-21 So 20:31]
4242 VolatileHighlights highlights changes to the buffer caused by commands
4243 such as ‘undo’, ‘yank’/’yank-pop’, etc. The highlight disappears at the
4244 next command. The highlighting gives useful visual feedback for what
4245 your operation actually changed in the buffer.
4246 #+BEGIN_SRC emacs-lisp :tangle yes
4247 (use-package volatile-highlights
4248 :ensure volatile-highlights
4249 :init
4250 (volatile-highlights-mode t)
4251 :diminish volatile-highlights-mode)
4252 #+END_SRC
4253 ** writegood
4254 This highlights some /weaselwords/, a mode to /aid in finding common
4255 writing problems/...
4256 [2013-04-27 Sa 23:29]
4257 #+BEGIN_SRC emacs-lisp :tangle no
4258 (use-package writegood-mode
4259 :ensure writegood-mode
4260 :defer t
4261 :init
4262 (bind-key "C-c g" 'writegood-mode))
4263 #+END_SRC
4264 ** web-mode
4265 [2014-06-01 Sun 22:48]
4266 #+BEGIN_SRC emacs-lisp :tangle yes
4267 (use-package web-mode
4268 :ensure web-mode
4269 :mode (("\\.phtml\\'" . web-mode)
4270 ("\\.tpl\\.php\\'" . web-mode)
4271 ("\\.jsp\\'" . web-mode)
4272 ("\\.as[cp]x\\'" . web-mode)
4273 ("\\.erb\\'" . web-mode)
4274 ("\\.mustache\\'" . web-mode)
4275 ("\\.html\\'" . web-mode)
4276 ("\\.css\\'" . web-mode)
4277 ("\\.djhtml\\'" . web-mode))
4278 :init
4279 (progn
4280 (add-hook 'web-mode-hook
4281 (lambda ()
4282 (setq web-mode-markup-indent-offset 2)
4283 (setq web-mode-css-indent-offset 2)
4284 (setq web-mode-code-indent-offset 2)
4285 (setq web-mode-enable-css-colorization t)
4286 (setq web-mode-enable-comment-keywords t)
4287 (setq web-mode-enable-current-element-highlight t))))
4288 :config
4289 (progn
4290 (use-package impatient-mode
4291 :ensure impatient-mode))
4292 )
4293
4294 #+END_SRC
4295 ** yafolding
4296 Yet another folding extension for the Emacs editor. Unlike many
4297 others, this one works by just using the existing indentation of the
4298 file, so basically works in every halfway structured file.
4299 #+BEGIN_SRC emacs-lisp :tangle yes
4300 (use-package yafolding
4301 :bind (("C-#" . yafolding)
4302 ("C-c C-f" . yafolding-toggle-all-by-current-level))
4303 :commands (yafolding yafolding-toggle-all-by-current-level)
4304 )
4305 #+END_SRC
4306 ** yaml-mode
4307 [2013-04-28 So 01:13]
4308 YAML is a nice format for data, which is both, human and machine
4309 readable/editable without getting a big headache.
4310 #+BEGIN_SRC emacs-lisp :tangle yes
4311 (use-package yaml-mode
4312 :ensure yaml-mode
4313
4314 :mode ("\\.ya?ml\\'" . yaml-mode)
4315 :config
4316 (bind-key "C-m" 'newline-and-indent yaml-mode-map ))
4317 #+END_SRC
4318
4319 ** yasnippet
4320 [2013-04-27 Sa 23:16]
4321 Yasnippet is a template system. Type an abbreviation, expand it into
4322 whatever the snippet holds.
4323 #+BEGIN_SRC emacs-lisp :tangle yes
4324 (setq yas-snippet-dirs (expand-file-name "yasnippet/snippets" jj-elisp-dir))
4325 (use-package yasnippet
4326 :ensure yasnippet
4327 :init
4328 (progn
4329 (yas-global-mode 1)
4330 ;; Integrate hippie-expand with ya-snippet
4331 (add-to-list 'hippie-expand-try-functions-list
4332 'yas-hippie-try-expand)
4333 ))
4334 #+END_SRC
4335 * Thats it
4336 And thats it for this file, control passes "back" to [[file:../initjj.org][initjj.org/el]]
4337 which then may load more files.