diff options
Diffstat (limited to '')
-rw-r--r-- | configuration.org | 752 |
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 |