summaryrefslogtreecommitdiffstats
path: root/configuration.org
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--configuration.org752
1 files changed, 752 insertions, 0 deletions
diff --git a/configuration.org b/configuration.org
new file mode 100644
index 0000000..32b000a
--- /dev/null
+++ b/configuration.org
@@ -0,0 +1,752 @@
+;; Configuration for Emacs
+
+* Installation
+
+*Initial*
+
+Emacs configuration is usually done in the home directory in the
+=.emacs.d= folder. This holds true for Unix and Linux systems. For
+Windows, look it up [[https://www.gnu.org/software/emacs/manual/html_node/efaq-w32/Location-of-init-file.html][here]].
+
+=git clone git@github.com:munen/emacs.d.git ~/.emacs.d=
+
+*Dependencies*
+
+Emacs dependencies/libraries are managed via the internal [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Packages.html#Packages][package
+management system]]. To initially install packages, open
+=~/.emacs.d/init.el=, refresh your package list with =M-x
+package-refresh-contents= and install everything using =M-x
+eval-buffer=.
+* Dependency management
+** Define package repositories(archives)
+
+#+BEGIN_SRC emacs-lisp
+ (require 'package)
+
+ (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
+ ("marmalade" . "https://marmalade-repo.org/packages/")
+ ("melpa" . "https://melpa.org/packages/")
+ ("org" . "https://orgmode.org/elpa/")))
+#+END_SRC
+
+** Define packages that are to be installed
+
+List all used third-party packages. Most will be configured further
+down in this file, some are used with the default configuration.
+
+#+BEGIN_SRC emacs-lisp
+
+ (defvar my-packages '(ac-cider
+ ac-js2
+ ag
+ atomic-chrome
+ auto-complete
+ beacon
+ blacken
+ browse-kill-ring
+ cider
+ clj-refactor
+ clojure-mode
+ coffee-mode
+ counsel-jq
+ comment-tags
+ darktooth-theme
+ dired-narrow
+ diminish
+ dumb-jump
+ edit-indirect
+ editorconfig
+ elpy
+ elfeed
+ elfeed-goodies
+ enh-ruby-mode
+ erc-image
+ evil
+ evil-escape
+ evil-leader
+ evil-mc
+ evil-numbers
+ evil-surround
+ exec-path-from-shell
+ forge
+ flycheck
+ flycheck-flow
+ go-mode
+ hide-mode-line
+ ido-vertical-mode
+ impatient-mode
+ ini-mode
+ ivy counsel swiper
+ json-mode
+ js2-mode
+ js2-refactor
+ js-comint
+ ledger-mode
+ lsp-mode
+ lsp-ui
+ lsp-ivy
+ magit
+ markdown-mode
+ package-lint
+ parinfer
+ pdf-tools
+ projectile
+ py-autopep8
+ org
+ rainbow-mode
+ rjsx-mode
+ ob-restclient
+ restclient
+ robe
+ sass-mode
+ spacemacs-theme
+ spaceline
+ smex
+ synosaurus
+ tide
+ visual-fill-column
+ web-mode
+ which-key
+ writegood-mode
+ writeroom-mode
+ yaml-mode
+ zenburn-theme))
+#+END_SRC
+
+** Install packages
+#+BEGIN_SRC emacs-lisp
+ (dolist (p my-packages)
+ (unless (package-installed-p p)
+ (package-refresh-contents)
+ (package-install p))
+ (add-to-list 'package-selected-packages p))
+#+END_SRC
+* Basics
+** History
+#+BEGIN_SRC emacs-lisp
+(setq savehist-file "~/.emacs.d/savehist")
+(savehist-mode +1)
+(setq savehist-save-minibuffer-history +1)
+(setq savehist-additional-vriables
+ '(kill-ring
+ search-ring
+ regexp-search-ring))
+#+END_SRC
+** GUI
+#+BEGIN_SRC emacs-lisp
+ (scroll-bar-mode -1)
+ (tool-bar-mode -1)
+ (tooltip-mode -1)
+ (menu-bar-mode -1)
+ (add-to-list 'default-frame-alist '(font . "Hack-8"))
+#+END_SRC
+** Gnu Elpa TLS Fix
+Emacs 26.1 (for example in Debian Buster) requests the GNU Elpa repo
+with the wrong TLS version - which makes the request fail. This is a
+manual patch for older versions of Emacs. It's fixed from 26.3 and
+above upstream.
+#+BEGIN_SRC emacs-lisp
+ (if (string< emacs-version
+ "26.3")
+ (setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3"))
+#+END_SRC
+** Gargabe Collection
+
+Allow 20MB of memory (instead of 0.76MB) before calling garbage
+collection. This means GC runs less often, which speeds up some
+operations.
+
+#+BEGIN_SRC emacs-lisp
+ (setq gc-cons-threshold 20000000)
+#+END_SRC
+** Do not create backup files
+#+BEGIN_SRC emacs-lisp
+ (setq make-backup-files nil)
+#+END_SRC
+** Auto-Save in =/tmp=
+Store backups and auto-saved files in =TEMPORARY-FILE-DIRECTORY= (which
+defaults to /tmp on Unix), instead of in the same directory as the
+file.
+#+BEGIN_SRC emacs-lisp
+ (setq backup-directory-alist
+ `((".*" . ,temporary-file-directory)))
+ (setq auto-save-file-name-transforms
+ `((".*" ,temporary-file-directory t)))
+#+END_SRC
+** Always follow symlinks
+ When opening a file, always follow symlinks.
+#+BEGIN_SRC emacs-lisp
+ (setq vc-follow-symlinks t)
+#+END_SRC
+** Sentences have one space after a period
+Don't assume that sentences should have two spaces after
+periods.
+#+BEGIN_SRC emacs-lisp
+ (setq sentence-end-double-space nil)
+#+END_SRC
+** Confirm before closing Emacs
+#+BEGIN_SRC emacs-lisp
+ (setq confirm-kill-emacs 'y-or-n-p)
+#+END_SRC
+** =dired-mode=
+Ability to use =a= to visit a new directory or file in =dired= instead
+of using =RET=. =RET= works just fine, but it will create a new buffer
+for /every/ interaction whereas =a= reuses the current buffer.
+#+BEGIN_SRC emacs-lisp
+ (put 'dired-find-alternate-file 'disabled nil)
+#+END_SRC
+
+Human readable units
+#+BEGIN_SRC emacs-lisp
+ (setq-default dired-listing-switches "-alh")
+#+END_SRC
+
+On =C=, recursively copy by default
+
+#+BEGIN_SRC emacs-lisp
+(setq dired-recursive-copies 'always)
+#+END_SRC
+
+*** =dired-narrow=
+
+=dired-narrow= of the [[https://github.com/Fuco1/dired-hacks][dired-hacks]] repository allows to dynamically
+narrow a dired buffer down to contents of interest. A demo can be seen
+[[http://pragmaticemacs.com/emacs/dynamically-filter-directory-listing-with-dired-narrow/][on this blog post]].
+
+#+BEGIN_SRC emacs-lisp
+ (require 'dired)
+ (define-key dired-mode-map (kbd "/") 'dired-narrow-fuzzy)
+#+END_SRC
+
+Commands:
+
+ - =/= starts fuzzy matching
+ - Use the dired buffer as usual
+ - =g= to go back to the complete file listing
+** Ask =y/n= instead of =yes/no=
+ This is a favorable shorthand.
+#+BEGIN_SRC emacs-lisp
+ (fset 'yes-or-no-p 'y-or-n-p)
+#+END_SRC
+** Auto revert files on change
+When something changes a file, automatically refresh the
+buffer containing that file so they can't get out of sync.
+
+#+BEGIN_SRC emacs-lisp
+(global-auto-revert-mode t)
+#+END_SRC
+** Shortcut for changing font-size
+#+BEGIN_SRC emacs-lisp
+ (defun zoom-in ()
+ (interactive)
+ (let ((x (+ (face-attribute 'default :height)
+ 10)))
+ (set-face-attribute 'default nil :height x)))
+
+ (defun zoom-out ()
+ (interactive)
+ (let ((x (- (face-attribute 'default :height)
+ 10)))
+ (set-face-attribute 'default nil :height x)))
+
+ (define-key global-map (kbd "C-1") 'zoom-in)
+ (define-key global-map (kbd "C-0") 'zoom-out)
+#+END_SRC
+** Disable startup message
+
+#+BEGIN_SRC emacs-lisp
+ (setq inhibit-splash-screen t)
+ (setq inhibit-startup-message t)
+#+END_SRC
+** Display the current time
+#+BEGIN_SRC emacs-lisp
+ (display-time-mode t)
+#+END_SRC
+** Do not display GUI Toolbar
+
+#+BEGIN_SRC emacs-lisp
+ (tool-bar-mode 0)
+#+END_SRC
+** Automatic Line Breaks
+
+Do not enable automatic line breaks for all text-mode based hooks,
+because several text-modes (markdown, mails) enjoy the pain of long
+lines. So here, I only add whitelisted modes sparingly. The other
+modes have a =visual-clean= configuration which makes the text look
+nice locally, at least.
+
+#+BEGIN_SRC emacs-lisp
+ (add-hook 'org-mode-hook 'auto-fill-mode)
+#+END_SRC
+** Enable Narrow To Region
+
+Enable narrow-to-region (C-x n n / C-x n w). This is disabled by
+default to not confuse beginners.
+
+#+BEGIN_SRC emacs-lisp
+ (put 'narrow-to-region 'disabled nil)
+#+END_SRC
+** Disable scroll bars
+#+BEGIN_SRC emacs-lisp
+(scroll-bar-mode -1)
+#+END_SRC
+** Remember the cursor position of files when reopening them
+#+BEGIN_SRC emacs-lisp
+ (setq save-place-file "~/.emacs.d/saveplace")
+ (setq-default save-place t)
+ (require 'saveplace)
+#+END_SRC
+** Set $MANPATH, $PATH and exec-path from shell even when started from GUI helpers like =dmenu= or =Spotlight=
+
+#+BEGIN_SRC emacs-lisp
+
+ (exec-path-from-shell-initialize)
+
+#+END_SRC
+** =windmove=
+
+Windmove is built into Emacs. It lets you move point from window to
+window using Shift and the arrow keys. This is easier to type than
+‘C-x o’ when there are multiple windows open.
+
+#+BEGIN_SRC emacs-lisp
+
+(when (fboundp 'windmove-default-keybindings)
+ (windmove-default-keybindings))
+
+#+END_SRC
+** =winner-mode=
+
+Allows to 'undo' (and 'redo') changes in the window configuration with
+the key commands ‘C-c left’ and ‘C-c right’.
+
+#+BEGIN_SRC emacs-lisp
+ (when (fboundp 'winner-mode)
+ (winner-mode 1))
+#+END_SRC
+
+Getting from many windows to one window is easy: 'C-x 1' will do it.
+But getting back to a delicate WindowConfiguration is difficult. This
+is where Winner Mode comes in: With it, going back to a previous
+session is easy.
+** Bell
+ Do not ring the system bell, but show a visible feedback.
+#+BEGIN_SRC emacs-lisp
+(setq visible-bell t)
+#+END_SRC
+** AngeFtp
+Try to use passive mode for FTP.
+
+Note: Some firewalls might not allow standard active mode. However:
+Some FTP Servers might not allow passive mode. So if there's problems
+when connecting to an FTP, try to revert to active mode.
+#+BEGIN_SRC emacs-lisp
+(setq ange-ftp-try-passive-mode t)
+#+END_SRC
+** eww
+ When entering eww, use cursors to scroll without changing point.
+#+BEGIN_SRC emacs-lisp
+ (add-hook 'eww-mode-hook 'scroll-lock-mode)
+#+END_SRC
+** Custom-File
+#+BEGIN_SRC emacs-lisp
+(setq custom-file "~/.emacs.d/custom-settings.el")
+(load custom-file t)
+#+END_SRC
+** Add guix packages to load-path
+* Programming
+** General
+*** Auto Complete
+https://github.com/auto-complete/auto-complete
+
+Basic Configuration
+#+BEGIN_SRC emacs-lisp
+ (ac-config-default)
+#+END_SRC
+*** Tabs
+Set tab width to 2 for all buffers
+
+#+BEGIN_SRC emacs-lisp
+ (setq-default tab-width 2)
+#+END_SRC
+
+Use 2 spaces instead of a tab.
+
+#+BEGIN_SRC emacs-lisp
+ (setq-default tab-width 2 indent-tabs-mode nil)
+#+END_SRC
+
+Indentation cannot insert tabs.
+
+#+BEGIN_SRC emacs-lisp
+ (setq-default indent-tabs-mode nil)
+#+END_SRC
+
+Use 2 spaces instead of tabs for programming languages.
+
+#+BEGIN_SRC emacs-lisp
+ (setq js-indent-level 2)
+ (setq coffee-tab-width 2)
+ (setq python-indent 2)
+ (setq css-indent-offset 2)
+ (add-hook 'sh-mode-hook
+ (lambda ()
+ (setq sh-basic-offset 2
+ sh-indentation 2)))
+ (setq web-mode-markup-indent-offset 2)
+#+END_SRC
+*** Syntax Checking
+
+http://www.flycheck.org/
+
+Enable global on the fly syntax checking through =flycheck=.
+
+#+BEGIN_SRC emacs-lisp
+ (add-hook 'after-init-hook #'global-flycheck-mode)
+#+END_SRC
+*** Manage TODO/FIXME/XXX comments
+
+https://github.com/vincekd/comment-tags
+
+=comment-tags= highlights and lists comment tags such as 'TODO', 'FIXME', 'XXX'.
+
+Commands (prefixed by =C-c t=):
+
+ - =b= to list tags in current buffer (comment-tags-list-tags-buffer).
+ - =a= to list tags in all buffers (comment-tags-list-tags-buffers).
+ - =s= to jump to tag in current buffer by a word or phrase using reading-completion (comment-tags-find-tags-buffer).
+ - =n= to jump to next tag from point (comment-tags-next-tag).
+ - =p= to jump to previous tag from point (comment-tags-previous-tag).
+
+#+BEGIN_SRC emacs-lisp
+ (setq comment-tags-keymap-prefix (kbd "C-c t"))
+ (with-eval-after-load "comment-tags"
+ (setq comment-tags-keyword-faces
+ `(;; A concrete TODO with actionable steps
+ ("TODO" . ,(list :weight 'bold :foreground "#DF5427"))
+ ;; A non-concrete TODO. We only know something is broken/amiss.
+ ("FIXME" . ,(list :weight 'bold :foreground "#DF5427"))
+ ;; Works, but is a code smell (quick fix). Might break down the line.
+ ("HACK" . ,(list :weight 'bold :foreground "#DF5427"))
+ ;; Assumption that needs to be verified.
+ ("CHECK" . ,(list :weight 'bold :foreground "#CC6437"))
+ ;; Use to highlight a regular, but especially important, comment.
+ ("NOTE" . ,(list :weight 'bold :foreground "#1FDA9A"))
+ ;; Use to highlight a regular, but especially important, comment.
+ ("INFO" . ,(list :weight 'bold :foreground "#1FDA9A"))))
+ (setq comment-tags-comment-start-only t
+ comment-tags-require-colon t
+ comment-tags-case-sensitive t
+ comment-tags-show-faces t
+ comment-tags-lighter nil))
+ (add-hook 'prog-mode-hook 'comment-tags-mode)
+#+END_SRC
+*** Auto-indent with the Return key
+#+BEGIN_SRC emacs-lisp
+ (define-key global-map (kbd "RET") 'newline-and-indent)
+#+END_SRC
+*** Highlight matching parenthesis
+#+BEGIN_SRC emacs-lisp
+ (show-paren-mode t)
+#+END_SRC
+*** Delete trailing whitespace
+Delete trailing whitespace in all modes. _Except_ when editing
+Markdown, because it uses [[http://daringfireball.net/projects/markdown/syntax#p][two trailing blanks]] as a signal to create a
+line break.
+#+BEGIN_SRC emacs-lisp
+ (add-hook 'before-save-hook '(lambda()
+ (when (not (or (derived-mode-p 'markdown-mode)))
+ (delete-trailing-whitespace))))
+#+END_SRC
+*** Code Folding
+Enable code folding for programming modes.
+- =zc=: Fold
+- =za=: Unfold
+- =zR=: Unfold everything
+#+BEGIN_SRC emacs-lisp
+(add-hook 'prog-mode-hook #'hs-minor-mode)
+#+END_SRC
+*** Line numbers
+Enable =linum-mode= for programming modes. For newer versions of
+Emacs, use =display-line-numbers-mode=, because it's _much_ faster.
+
+#+BEGIN_SRC emacs-lisp
+ (add-hook 'prog-mode-hook '(lambda ()
+ (if (version<= emacs-version "26.0.50")
+ (linum-mode)
+ (display-line-numbers-mode))))
+#+END_SRC
+** Python
+*** Basics
+#+BEGIN_SRC emacs-lisp
+
+(elpy-enable)
+;;(setq elpy-rpc-python-command "~/.virtualenvs/elpy-rpc/bin/python3")
+
+(require 'py-autopep8)
+(add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save)
+
+(setq python-shell-interpreter "ptipython"
+ python-shell-interpreter-args "console --simple-prompt"
+ python-shell-prompt-detect-failure-warning nil)
+(add-to-list 'python-shell-completion-native-disabled-interpreters
+ "ptipython")
+
+(when (require 'flycheck nil t)
+ (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
+ (add-hook 'elpy-mode-hook 'flycheck-mode))
+#+END_SRC
+** Go
+*** Basics
+#+BEGIN_SRC emacs-lisp
+(require 'lsp-mode)
+(add-to-list 'auto-mode-alist '("\\.go\\'" . go-mode))
+(add-hook 'go-mode-hook 'lsp-deferred)
+(require 'go-autocomplete)
+(require 'auto-complete-config)
+(ac-config-default)
+#+END_SRC
+* org
+** General Config
+#+BEGIN_SRC emacs-lisp
+(global-set-key "\C-cl" 'org-store-link)
+(global-set-key "\C-ca" 'org-agenda)
+(global-set-key "\C-cb" 'org-iswitchb)
+(global-set-key "\C-cc" 'org-capture)
+
+(setq calendar-date-style "european")
+
+;; use fast selection
+(setq org-use-fast-todo-selection t)
+
+;; switch state without normal processing
+(setq org-treat-S-cursor-todo-selection-as-state-change nil)
+#+END_SRC
+** Agenda
+#+BEGIN_SRC emacs-lisp
+;; basic agenda stuff
+(setq org-sort-agenda-notime-is-late nil)
+(setq org-directory "~/Nextcloud/org")
+(setq org-agenda-files '("~/Nextcloud/org"))
+(setq org-default-notes-file (concat org-directory "/refile.org"))
+(setq diary-file "~/Nextcloud/org/diary")
+(setq org-agenda-include-diary t)
+(setq org-agenda-skip-deadline-if-done t)
+(setq org-reverse-note-order t)
+(setq org-sort-agenda-notime-is-late nil)
+
+(setq org-archive-location "~/Nextcloud/org/archive.org::* From %s")
+
+(setq org-refile-targets (quote ((nil :maxlevel . 9)
+ (org-agenda-files :maxlevel . 9))))
+
+(setq org-agenda-custom-commands
+ (quote (("N" "Agenda and NEXT TODOs"
+ ((agenda "")
+ (todo "NEXT")))
+ ("y" "Agenda and All TODOS"
+ ((agenda "")
+ (alltodo ""))))))
+#+END_SRC
+** Capture
+#+BEGIN_SRC emacs-lisp
+(define-key global-map "\C-cc" 'org-capture)
+(setq org-default-notes-file "~/Nextcloud/org/refile.org")
+(setq org-capture-templates
+ (quote (("t" "Todo" entry (file "~/Nextcloud/org/todo.org")
+ "* TODO %?")
+ ("j" "Journal" entry (file+datetree "~/Nextcloud/org/journal.org")
+ "* %?\nEntered on %U\n %i\n %a")
+ ("e" "Emacs Tip" entry (file+headline "~/Nextcloud/org/emacs-tips.org" "Emacs Tips")
+ "* %?\n %i\n %a"))))
+#+END_SRC
+** Tags and faces
+#+BEGIN_SRC emacs-lisp
+(setq org-todo-keywords
+ (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
+ (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
+
+(setq org-todo-keyword-faces
+ (quote (("TODO" :foreground "red" :weight bold)
+ ("NEXT" :foreground "blue" :weight bold)
+ ("DONE" :foreground "forest green" :weight bold)
+ ("WAITING" :foreground "orange" :weight bold)
+ ("HOLD" :foreground "magenta" :weight bold)
+ ("CANCELLED" :foreground "forest green" :weight bold)
+ ("MEETING" :foreground "forest green" :weight bold)
+ ("PHONE" :foreground "forest green" :weight bold))))
+
+;; tag stuff automatically dependent on a change of state
+(setq org-todo-state-tags-triggers
+ (quote (("CANCELLED" ("CANCELLED" . t))
+ ("WAITING" ("WAITING" . t))
+ ("HOLD" ("WAITING") ("HOLD" . t))
+ (done ("WAITING") ("HOLD"))
+ ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
+ ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
+ ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
+
+(setq org-priority-faces
+ '((?A . (:foreground "#CC0000" :background "#FFE3E3"))
+ (?B . (:foreground "#64992C" :background "#EBF4DD"))
+ (?C . (:foreground "#64992C" :background "#FFFFFF"))))
+
+(setq org-ellipsis "...")
+#+END_SRC
+
+
+
+;; custom commands on agenda buffer
+#+END_SRC
+* Search / Completion
+** =ido=
+
+=ido= means "Interactively Do Things". =ido= has a completion engine
+that's sensible to use everywhere. It is built-in and nice and could
+change a lot of defaults like =find-file= and switching buffers.
+
+It works well while not breaking Emacs defaults.
+
+#+BEGIN_SRC emacs-lisp
+ (ido-mode t)
+ (ido-everywhere t)
+ (setq ido-enable-flex-matching t)
+#+END_SRC
+
+** =ido-vertical-mode=
+
+https://github.com/creichert/ido-vertical-mode.el
+
+=ido-vertical-mode= makes =ido-mode= display vertically.
+
+#+BEGIN_SRC emacs-lisp
+(ido-vertical-mode 1)
+(setq ido-vertical-define-keys 'C-n-and-C-p-only)
+(setq ido-vertical-show-count t)
+#+END_SRC
+
+** Ivy/Counsel/Swiper
+
+https://github.com/abo-abo/swiper
+
+*Ivy*, a generic completion mechanism for Emacs.
+
+*Counsel*, a collection of Ivy-enhanced versions of common Emacs commands.
+
+*Swiper*, an Ivy-enhanced alternative to isearch.
+
+=Ivy= is an interactive interface for completion in Emacs. Therefore
+it overlaps in functionality with =ido=. While =Ivy= is more powerful,
+it breaks certain standard functionality. So =ido= is enabled globally
+by default and for certain tasks, =Ivy= overrides =ido=.
+
+Emacs uses completion mechanism in a variety of contexts: code, menus,
+commands, variables, functions, etc. Completion entails listing,
+sorting, filtering, previewing, and applying actions on selected
+items. When active, =ivy-mode= completes the selection process by
+narrowing available choices while previewing in the minibuffer.
+Selecting the final candidate is either through simple keyboard
+character inputs or through powerful regular expressions.
+
+*** Configuration
+
+#+BEGIN_SRC emacs-lisp
+ (setq enable-recursive-minibuffers t)
+ (global-set-key (kbd "<f6>") 'ivy-resume)
+#+END_SRC
+
+Show total amount of matches and the index of the current match
+
+#+BEGIN_SRC emacs-lisp
+(setq ivy-count-format "(%d/%d) ")
+#+END_SRC
+
+Wrap to the first result when on the last result and vice versa.
+
+#+BEGIN_SRC emacs-lisp
+(setq ivy-wrap t)
+#+END_SRC
+
+Enable =Swiper=
+
+#+BEGIN_SRC emacs-lisp
+ (global-set-key "\C-s" 'swiper)
+#+END_SRC
+
+Configure =Counsel=
+
+#+BEGIN_SRC emacs-lisp
+ (global-set-key (kbd "C-x b") 'counsel-ibuffer)
+ ;; Run `counsel-ag` against the current directory and not against the
+ ;; whole project
+ (global-set-key (kbd "C-c k") '(lambda()
+ (interactive)
+ (counsel-ag "" default-directory nil nil)))
+ (global-set-key (kbd "C-x l") 'counsel-locate)
+ (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history)
+#+END_SRC
+
+Next to counsel, there's also =smex= which is =M-x= combined with
+=ido=. =smex= has a better sorting algorithm than =Counsel= and having
+both installed means that we get the =Counsel= interface with =smex=
+sorting. Best of both worlds.
+
+By default, =counsel-M-x= starts with a =^=. More often than not, this
+will be in the way of me fuzzy matching a function. Therefore I'll
+start it with an empty string as argument.
+
+#+BEGIN_SRC emacs-lisp
+ (global-set-key (kbd "M-x") (lambda ()
+ (interactive)
+ (counsel-M-x "")))
+#+END_SRC
+
+*** Where =Ivy= doesn't work well
+
+**** Overwriting standard Emacs functionality
+
+Some basic features are overwritten when "everything" becomes an =Ivy=
+search buffer. For example:
+
+- When two =dired= buffers are open and files should be copied from
+ one to the other, one can use the =up= and =down= keys to toggle the
+ destination. When this is a search buffer, it will auto complete for
+ all local folders, instead. Since copying files is something I do
+ often, this already means I have to disable =Ivy= globally.
+
+- =Tramp= auto-completion doesn't work for me. I'm using =sudo:=, =ssh:=
+ and the likes a lot in =dired= mode. Auto completion when within
+ =Tramp= is broken for me, so I always have to type out the whole
+ connection string when =Ivy= is enabled for =dired=. Since this
+ includes missing auto-completion on remote systems and such, it's
+ another valid reason to disable =Ivy= globally.
+
+**** Disable Swiper where it is broken
+
+Ivy/Swiper cannot search in PDFs. It tries to search in the PDF source
+code. Therefore I fall back to using isearch within PDFs.
+
+#+BEGIN_SRC emacs-lisp
+ (add-hook 'pdf-view-mode-hook '(lambda()
+ (define-key pdf-view-mode-map "\C-s" 'isearch-forward)))
+#+END_SRC
+
+*** Improve other packages with ivy
+
+ Projectile completion (Default is =ido=)
+
+#+BEGIN_SRC emacs-lisp
+ (setq projectile-completion-system 'ivy)
+#+END_SRC
+
+ Mu4e "folder" and "from" completion (Default is =ido=)
+
+#+BEGIN_SRC emacs-lisp
+ (setq mu4e-completing-read-function 'ivy-completing-read)
+#+END_SRC
+
+ Synosaurus completion (Default is =ido=)
+
+#+BEGIN_SRC emacs-lisp
+ (setq synosaurus-choose-method 'ivy-read)
+#+END_SRC