17 KiB
emacs init file
- Look at tangling at
- Some remarks and comments
- Files and dirs
- Themes
- Global settings
- Main packages
- Leftovers
TODO Look at tangling at
[http://thewanderingcoder.com/2015/02/literate-emacs-configuration/]
although I'd rather do something like a local variable evaluation such as
Or makefile approach [https://emacs.stackexchange.com/questions/27126/is-it-possible-to-org-bable-tangle-an-org-file-from-the-command-line]
See also [http://orgmode.org/manual/Extracting-source-code.html#Extracting-source-code]
Some remarks and comments
setq vs setq-default
Some variables are buffer-local, others are not; for non buffer-local variables the two commands are equivalent; for the buffer-local variables, setq acts on the current buffer, whereas setq-default sets the default value of the variable for buffers that do not have a local value.
:source: [https://stackoverflow.com/a/18173666]
Why not package.el
it is convenient, but it is not git-based; borg.el is promising, but it is
way complicated; I can do everything by hand as soon as it is neatly
org-anized
Files and dirs
Move Customize to a separate file
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file 'noerror)
Add relevant dirs to load path [This is somewhat undesirable; I should uniformize the path-loading business at some point…]
(let ((default-directory "~/.emacs.d/"))
(normal-top-level-add-subdirs-to-load-path)
(normal-top-level-add-to-load-path '("fringe-helper.el"
"multiple-cursors.el"
"expand-region.el"
"dash.el")))
Put autosave files (ie #foo#) and backup files (ie foo~) in ~/.emacs.d/. create the autosave dir if necessary, since emacs won't.
(make-directory "~/.emacs.d/autosaves/" t)
(make-directory "~/.emacs.d/backup/" t)
Themes
Use (my clone of) the solarized theme
(add-to-list 'custom-theme-load-path "/home/jacopods/.emacs.d/emacs-color-theme-solarized")
(load-theme 'solarized t)
Use patched terminus font (this overrides the settings in Customize, but I never could it to work otherwise). See the special treatment later on for dealing with bold weight. To avoid flickering one should also set the font in .Xresources
(set-face-font 'default "-xos4-hackminus-medium-r-normal--20-200-72-72-c-100-ISO10646-1")
Global settings
Cosmetics
Prefer a minimal appearance: no menu, toolbar or scroll-bars; no splash screens or messages
(menu-bar-mode -1)
(tool-bar-mode 0)
(scroll-bar-mode -1)
(setq inhibit-startup-screen t
inhibit-startup-message t)
a blinking cursor keeps the gpu awake; add global hl-line mode to more easily spot the cursor
(blink-cursor-mode 0)
(set-default 'cursor-type 'box)
(global-hl-line-mode t)
Set frame title
(setq frame-title-format
'((buffer-file-name "%f"
(dired-directory dired-directory "%b")) " · emacs"));; · " (:eval (kde-current-activity-name)))) ;; "%S"))
Themed tooltips
(setq x-gtk-use-system-tooltips nil)
Set Fill-column to 78, which happens to be good for third-tiled frames
and it also is a reasonable standard (almost 80)
(setq default-fill-column 78)
Mouseless
Disable mouse interaction with emacs
(setq mouse-autoselect-window nil)
(mouse-wheel-mode -1)
(setq mouse-yank-at-point nil)
(setq focus-follows-mouse nil)
TODO Find out what of the above is necessary given the disable-mouse mode below
Use the disable-mouse package by Steve Purcell available at
[https://github.com/purcell/disable-mouse]
(require 'disable-mouse)
(global-disable-mouse-mode)
Window behavior
Prevent compilation window eating up other windows
(setq compilation-scroll-output t
compilation-window-height 12)
Prevent any automatic splitting to split vertically
(setq split-width-threshold nil)
Scrolling
Scrolling setup
(setq redisplay-dont-pause t
scroll-margin 3
scroll-step 1
scroll-conservatively 10000
scroll-preserve-screen-position 1)
TODO find out what this was actually meant to do
(setq-default display-buffer-reuse-frames t)
Modeline
(setq-default mode-line-modified '(:eval (if (buffer-modified-p) "●" "·"))) ;still needs some improvements,
;does not report Readonly state
(setq-default mode-line-remote '(:eval (let ((s (format-mode-line "%@")))
(cond
((equal s "-") "·") ((equal s "@") "@") (t s)))))
(defvar wilder-buffer-vc-mode-line
'("%b" (vc-mode (:propertize
;; Strip the backend name from the VC status information
(:eval (let* ((backend (downcase (symbol-name (vc-backend (buffer-file-name)))))
(branch (substring vc-mode (+ (length backend) 2)))
(s (substring vc-mode (+ (length backend) 1) (+ (length backend) 2)))
(status (cond ((equal s "-") "") ((equal s ":") "!") (t s))))
(concat "·" branch status)))
face font-lock-comment-face))))
(put 'wilder-buffer-vc-mode-line 'risky-local-variable t)
(defvar wilder-position
'("[%p,%I] " ))
(put 'wilder-position 'risky-local-variable t)
(setq-default mode-line-format
'("%e"
mode-line-front-space
mode-line-mule-info
mode-line-client
mode-line-modified
mode-line-remote
mode-line-frame-identification
wilder-buffer-vc-mode-line " "
wilder-position " "
mode-line-modes
mode-line-misc-info
mode-line-end-spaces))
Mark handling
No transient mark is more flexible
(transient-mark-mode 0)
But of course we need to see the mark
(require 'visible-mark)
(visible-mark-mode t)
(global-visible-mark-mode t)
The following are some convenient bindings; notice that on my layout F13 and F14 are obtained by tapping the left and right shift respectively
(global-set-key (kbd "<f13>") 'set-mark-command)
(global-set-key (kbd "<f14>") 'set-mark-command)
(defun jump-to-mark ()
"Jumps to the local mark, respecting the `mark-ring' order.
This is the same as using \\[set-mark-command] with the prefix argument."
(interactive)
(set-mark-command 1))
(global-set-key (kbd "<M-f13>") 'jump-to-mark)
(global-set-key (kbd "<M-f14>") 'jump-to-mark)
(defun just-activate-mark ()
(interactive)
(activate-mark))
(global-set-key (kbd "<S-f13>") 'just-activate-mark)
(global-set-key (kbd "<S-f14>") 'just-activate-mark)
Global bindings
Remove some supremely annoying bindings
(global-unset-key (kbd "C-z"))
(global-unset-key (kbd "C-x f"))
(global-unset-key (kbd "<M-f4>")) ; rly?
Change {up,down}-list
(global-unset-key (kbd "C-M-u"))
(global-unset-key (kbd "C-M-d"))
(global-set-key (kbd "C-M-i") 'down-list) ;; -i stands for /in/
(global-set-key (kbd "C-M-o") 'up-list) ;; -o stands for /out/
Add some opinionated bindings
(global-set-key (kbd "C-M-d") 'kill-sexp)
(global-set-key (kbd "C-M-<backspace>") 'backward-kill-sexp)
(global-set-key (kbd "C-x k") 'kill-this-buffer)
(global-set-key (kbd "C-S-v") 'scroll-down-command)
Smart beginning-of-line
This is a relatively smart way to go back to the beginning of the line
(defun smart-line-beginning ()
"Move point to the beginning of text on the current line; if that
is already the current position of point, then move it to the
beginning of the line."
(interactive)
(let ((pt (point)))
(beginning-of-line-text)
(when (eq pt (point))
(beginning-of-line))))
(global-set-key (kbd "C-a") 'smart-line-beginning)
Whitespace
Trailing whitespace is evil; get rid of it
(setq-default show-trailing-whitespace t)
(add-hook 'before-save-hook 'delete-trailing-whitespace)
Define what is whitespace during a search
(setq search-whitespace-regexp "[ \t\r\n]+")
Tabs are evil; get rid of them
(setq c-basic-offset 4)
(setq tab-width 4)
(setq indent-tabs-mode nil)
TODO Have a look at ws-trim.el
It is conf'ble to avoid removing whitespace from lines that were not modified; sounds like a good idea for git [ftp://ftp.lysator.liu.se/pub/emacs/ws-trim.el]
Show matching parens
Use mic-paren for paren-highlighting
; (setq show-paren-mode t)
(require 'mic-paren)
(paren-activate)
TODO find out if there are better options out there
Abbrevs
Set up abbrevs
(setq-default abbrev-mode t)
(read-abbrev-file "~/.abbrev_defs")
(setq save-abbrevs t)
Spellcheck
Use flyspell
(add-hook 'text-mode-hook 'flyspell-mode)
(setq flyspell-use-meta-tab nil)
Fringe treatment
TODO try linum-relative
(require 'linum-relative)
(linum-relative-mode 1)
Add line numbers globally
(global-linum-mode 1)
Highlight also the linum in the fringe
(require 'hlinum)
(hlinum-activate)
Add marker for current line in the fringe (see [https://github.com/kyanagi/fringe-current-line])
;; (require 'fringe-current-line)
;; (global-fringe-current-line-mode 1)
;; (setq fcl-fringe-bitmap 'right-triangle)
Turn on echo mode
Display unfinished commands in the echo area after the specified delay.
(setq echo-keystrokes 0.10)
Disable completion buffer
Remove the completion buffer as soon as we get out of the minibuffer
(add-hook 'minibuffer-exit-hook
'(lambda ()
(let ((buffer "*Completions*"))
(and (get-buffer buffer)
(kill-buffer buffer))) ))
Auto save on compile
(setq compilation-ask-about-save nil)
Main packages
Magit
Set main binding
(global-set-key (kbd "C-x C-g") 'magit-status)
smart-tab
This package is a gem: it allows to make tab work dwim
(require 'smart-tab)
(global-smart-tab-mode 1)
Outshine
(require 'outshine)
(add-hook 'outline-minor-mode-hook 'outshine-hook-function)
(setq outshine-use-speed-commands t)
(defvar outline-minor-mode-prefix "\M-#")
(eval-after-load 'outshine '(define-key outline-minor-mode-map (kbd "C-M-i") nil))
;; (add-hook 'sh-mode-hook 'outline-minor-mode)
helm
(require 'helm-config)
(helm-mode 1)
(global-set-key (kbd "M-x") 'helm-M-x)
(global-set-key (kbd "C-x C-f") 'helm-find-files)
(global-set-key (kbd "C-x b") 'helm-mini)
(global-set-key (kbd "C-x C-b") 'helm-mini)
(global-set-key (kbd "M-y") 'helm-show-kill-ring)
(define-key helm-map (kbd "C-h") nil)
(define-key helm-find-files-map (kbd "C-h") nil)
(define-key helm-find-files-map (kbd "C-<backspace>") nil)
multiple-cursors
(require 'multiple-cursors)
(define-key mc/keymap (kbd "<return>") nil)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)
(global-set-key (kbd "<C-c f13>") 'mc/mark-pop)
(global-set-key (kbd "<C-c f14>") 'mc/mark-pop)
avy
(global-set-key (kbd "C-c SPC") 'avy-goto-word-or-subword-1)
(global-set-key (kbd "M-s") 'avy-goto-word-or-subword-1)
(global-set-key (kbd "M-g M-g") 'avy-goto-line)
(global-set-key (kbd "M-g g") 'avy-goto-line)
Atomic chrome
;;(require 'atomic-chrome)
;;(atomic-chrome-start-server)
Leftovers
;; * include other files
(load "init-latex.el")
(load "init-org.el")
(load "init-c++.el")
(load "init-elisp.el")
(load "init-kde-integration.el")
;; KDE stuff
(load "qml-mode.el" nil t t)
(add-to-list 'auto-mode-alist '("\\.qml\\'" . qml-mode))
DONE find out how kde-emacs makes “make” actually work
I need to keep this up until I realize what I need to make “make” work Please notice that kde-emacs forces the menu to show;
;; (require 'kde-emacs)
;; (menu-bar-mode -1)
Leftovers
;; * load expand-region
(require 'expand-region)
(global-set-key (kbd "C-=") 'er/expand-region)
;; * construct emacs-session so with session-id
(defun emacs-session-filename (session-id)
"Construct a filename to save the session in based on SESSION-ID.
If the directory ~/.emacs.d exists, we make a filename in there, otherwise
a file in the home directory."
(let ((basename (concat "sessions/session." session-id))
(emacs-dir user-emacs-directory))
(expand-file-name (if (file-directory-p emacs-dir)
(concat emacs-dir basename)
(concat "~/.emacs-" basename)))))
;; * Time stamps
;; write
;; Time-stamp: <>
;; in your file and save it to see time stamps at work.
;; Other time stamp format: "%a %b %e, %Y %l:%M %p"
(add-hook 'write-file-hooks 'time-stamp)
(setq time-stamp-active t)
(setq time-stamp-format "%:a %02d %:b %:y, %02H:%02M:%02S, %u")
(setq european-calendar-style 't)
;; first day of the week is monday instead of sunday:
(setq calendar--week--start--day 1)
;; * toorg
(require 'highlight-sexps)
(require 'package)
(add-to-list 'package-archives
'("melpa-stable" . "http://stable.melpa.org/packages/") t)
;; (eval-after-load 'tramp '(setenv "SHELL" "/bin/bash"))
;; Use system proxy
(setq url-proxy-services '(("http" . "127.0.0.1:8118")))
(defun flash-hline ()
(let ((fg (face-foreground 'default))
(bg (face-background 'hl-line)))
(set-face-background 'hl-line fg)
(run-with-timer
0.1 nil (lambda ()
(set-face-background 'hl-line "#303030") ))))
(global-set-key (kbd "<f15>") 'flash-hline)
;;; Stefan Monnier <foo at acm.org>. It is the opposite of fill-paragraph
(defun unfill-paragraph (&optional region)
"Takes a multi-line paragraph and makes it into a single line of text."
(interactive (progn (barf-if-buffer-read-only) '(t)))
(let ((fill-column (point-max))
;; This would override `fill-column' if it's an integer.
(emacs-lisp-docstring-fill-column t))
(fill-paragraph nil region)))
(defun select-frame-on-current-activity ()
(select-frame-on-activity (kde-current-activity))
)
;; * start server named after kde activity name
(setq server-name (kde-current-activity-name))
;; mmh
;; (set-face-font 'default "-xos4-hackminus-medium-r-normal--20-200-72-72-c-100-ISO10646-1") ;
;; Why is the above needed down here?
;;
;; Because it sets the face for packages that have loaded in the meantime;
;; it does not wark perfectly as some packages are still to be loaded
;; (most notably magit)
(mapc
(lambda (face)
(set-face-attribute face nil :weight 'normal)
(set-face-attribute face nil :slant 'normal))
(face-list))
(server-start)