diff options
Diffstat (limited to 'emacs')
| -rw-r--r-- | emacs/init.html | 3010 |
1 files changed, 0 insertions, 3010 deletions
diff --git a/emacs/init.html b/emacs/init.html deleted file mode 100644 index fd9380b..0000000 --- a/emacs/init.html +++ /dev/null @@ -1,3010 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" -"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> -<head> -<title>mssola's GNU Emacs configuration</title> -<!-- 2018-02-14 Wed 13:15 --> -<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> -<meta name="generator" content="Org-mode" /> -<meta name="author" content="Miquel Sabaté Solà" /> -<style type="text/css"> - <!--/*--><![CDATA[/*><!--*/ - .title { text-align: center; } - .todo { font-family: monospace; color: red; } - .done { color: green; } - .tag { background-color: #eee; font-family: monospace; - padding: 2px; font-size: 80%; font-weight: normal; } - .timestamp { color: #bebebe; } - .timestamp-kwd { color: #5f9ea0; } - .right { margin-left: auto; margin-right: 0px; text-align: right; } - .left { margin-left: 0px; margin-right: auto; text-align: left; } - .center { margin-left: auto; margin-right: auto; text-align: center; } - .underline { text-decoration: underline; } - #postamble p, #preamble p { font-size: 90%; margin: .2em; } - p.verse { margin-left: 3%; } - pre { - border: 1px solid #ccc; - box-shadow: 3px 3px 3px #eee; - padding: 8pt; - font-family: monospace; - overflow: auto; - margin: 1.2em; - } - pre.src { - position: relative; - overflow: visible; - padding-top: 1.2em; - } - pre.src:before { - display: none; - position: absolute; - background-color: white; - top: -10px; - right: 10px; - padding: 3px; - border: 1px solid black; - } - pre.src:hover:before { display: inline;} - pre.src-sh:before { content: 'sh'; } - pre.src-bash:before { content: 'sh'; } - pre.src-emacs-lisp:before { content: 'Emacs Lisp'; } - pre.src-R:before { content: 'R'; } - pre.src-perl:before { content: 'Perl'; } - pre.src-java:before { content: 'Java'; } - pre.src-sql:before { content: 'SQL'; } - - table { border-collapse:collapse; } - caption.t-above { caption-side: top; } - caption.t-bottom { caption-side: bottom; } - td, th { vertical-align:top; } - th.right { text-align: center; } - th.left { text-align: center; } - th.center { text-align: center; } - td.right { text-align: right; } - td.left { text-align: left; } - td.center { text-align: center; } - dt { font-weight: bold; } - .footpara:nth-child(2) { display: inline; } - .footpara { display: block; } - .footdef { margin-bottom: 1em; } - .figure { padding: 1em; } - .figure p { text-align: center; } - .inlinetask { - padding: 10px; - border: 2px solid gray; - margin: 10px; - background: #ffffcc; - } - #org-div-home-and-up - { text-align: right; font-size: 70%; white-space: nowrap; } - textarea { overflow-x: auto; } - .linenr { font-size: smaller } - .code-highlighted { background-color: #ffff00; } - .org-info-js_info-navigation { border-style: none; } - #org-info-js_console-label - { font-size: 10px; font-weight: bold; white-space: nowrap; } - .org-info-js_search-highlight - { background-color: #ffff00; color: #000000; font-weight: bold; } - /*]]>*/--> -</style> -<link rel="stylesheet" href="http://jo.mssola.com/static/style.css" type="text/css" /> -<link rel="stylesheet" href="http://jo.mssola.com/static/org.css" type="text/css" /> -<script type="text/javascript"> -/* -@licstart The following is the entire license notice for the -JavaScript code in this tag. - -Copyright (C) 2012-2013 Free Software Foundation, Inc. - -The JavaScript code in this tag is free software: you can -redistribute it and/or modify it under the terms of the GNU -General Public License (GNU GPL) as published by the Free Software -Foundation, either version 3 of the License, or (at your option) -any later version. The code is distributed WITHOUT ANY WARRANTY; -without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. - -As additional permission under GNU GPL version 3 section 7, you -may distribute non-source (e.g., minimized or compacted) forms of -that code without the copy of the GNU GPL normally required by -section 4, provided you include this license notice and a URL -through which recipients can access the Corresponding Source. - - -@licend The above is the entire license notice -for the JavaScript code in this tag. -*/ -<!--/*--><![CDATA[/*><!--*/ - function CodeHighlightOn(elem, id) - { - var target = document.getElementById(id); - if(null != target) { - elem.cacheClassElem = elem.className; - elem.cacheClassTarget = target.className; - target.className = "code-highlighted"; - elem.className = "code-highlighted"; - } - } - function CodeHighlightOff(elem, id) - { - var target = document.getElementById(id); - if(elem.cacheClassElem) - elem.className = elem.cacheClassElem; - if(elem.cacheClassTarget) - target.className = elem.cacheClassTarget; - } -/*]]>*///--> -</script> -</head> -<body> -<div id="content"> -<h1 class="title">mssola's GNU Emacs configuration</h1> -<div id="table-of-contents"> -<h2>Table of Contents</h2> -<div id="text-table-of-contents"> -<ul> -<li><a href="#sec-1">Preface</a></li> -<li><a href="#sec-2">Introduction</a></li> -<li><a href="#sec-3">General</a> -<ul> -<li><a href="#sec-3-1">GUI</a></li> -<li><a href="#sec-3-2">Basic editing configuration</a></li> -<li><a href="#sec-3-3">Font and theme</a></li> -<li><a href="#sec-3-4">General global key bindings</a></li> -<li><a href="#sec-3-5">Others</a></li> -</ul> -</li> -<li><a href="#sec-4">Calendar</a></li> -<li><a href="#sec-5">General purpose defuns</a></li> -<li><a href="#sec-6">Lisp packages</a> -<ul> -<li><a href="#sec-6-1">Custom packages</a></li> -<li><a href="#sec-6-2">use-package</a></li> -</ul> -</li> -<li><a href="#sec-7">Project</a></li> -<li><a href="#sec-8">Edit</a></li> -<li><a href="#sec-9">Dired</a></li> -<li><a href="#sec-10">Evil</a></li> -<li><a href="#sec-11">Magit</a></li> -<li><a href="#sec-12">mu4e</a></li> -<li><a href="#sec-13">org</a> -<ul> -<li><a href="#sec-13-1">General settings</a></li> -<li><a href="#sec-13-2">Publishing</a></li> -<li><a href="#sec-13-3">Agenda</a></li> -<li><a href="#sec-13-4">Capture</a></li> -<li><a href="#sec-13-5">Other</a></li> -<li><a href="#sec-13-6"><span class="todo TODO">TODO</span> shortcut for making an org link, and transforming a link into a proper org link</a></li> -<li><a href="#sec-13-7"><span class="todo TODO">TODO</span> make it work with evil</a></li> -<li><a href="#sec-13-8"><span class="todo TODO">TODO</span> Proper keybindings for quick access.</a></li> -<li><a href="#sec-13-9"><span class="todo TODO">TODO</span> shortcuts for stuff like: create something urgent for today</a></li> -</ul> -</li> -<li><a href="#sec-14">IRC</a></li> -<li><a href="#sec-15">Languages</a> -<ul> -<li><a href="#sec-15-1">General</a></li> -<li><a href="#sec-15-2">Shell</a></li> -<li><a href="#sec-15-3">Lisp</a></li> -<li><a href="#sec-15-4">C and C++</a></li> -<li><a href="#sec-15-5">Ruby</a></li> -<li><a href="#sec-15-6">Go</a></li> -<li><a href="#sec-15-7">Rust</a></li> -<li><a href="#sec-15-8">Tabs vs spaces</a></li> -<li><a href="#sec-15-9">Inferior markup languages.</a></li> -<li><a href="#sec-15-10">Web-related stuff.</a></li> -<li><a href="#sec-15-11">Devops</a></li> -<li><a href="#sec-15-12">Others</a></li> -<li><a href="#sec-15-13">LaTeX</a></li> -</ul> -</li> -<li><a href="#sec-16">WoMan</a></li> -<li><a href="#sec-17">Misc</a></li> -<li><a href="#sec-18">Credits</a></li> -<li><a href="#sec-19">License</a></li> -</ul> -</div> -</div> - -<div id="outline-container-sec-1" class="outline-2"> -<h2 id="sec-1">Preface</h2> -<div class="outline-text-2" id="text-1"> -<p> -This is my attempt of getting my configuration organized with literate -programming and <code>org-babel</code>. I took the workflow I'm following from <a href="https://github.com/larstvei">@larstvei</a>. -The idea is that the <code>init.el</code> file will replace itself on the first execution -with the tangled version of this file. This first version will also be -byte-compiled. This means that all changes are to be made on the <code>init.org</code> -file <b>always</b>. The initial contents of the <code>init.el</code> are: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-comment-delimiter">;; </span><span class="org-comment">We can't tangle without org!</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">org</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Follow symlinks</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> vc-follow-symlinks t<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Open the configuration</span> -<span class="org-rainbow-delimiters-depth-1">(</span>find-file <span class="org-rainbow-delimiters-depth-2">(</span>concat user-emacs-directory <span class="org-string">"init.org"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Tangle it</span> -<span class="org-rainbow-delimiters-depth-1">(</span>org-babel-tangle<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Load it</span> -<span class="org-rainbow-delimiters-depth-1">(</span>load-file <span class="org-rainbow-delimiters-depth-2">(</span>concat user-emacs-directory <span class="org-string">"init.el"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Finally byte-compile it</span> -<span class="org-rainbow-delimiters-depth-1">(</span>byte-compile-file <span class="org-rainbow-delimiters-depth-2">(</span>concat user-emacs-directory <span class="org-string">"init.el"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -There is no reason to track the init.el file, and no reason to change this -file. In order to ensure this, make sure to apply the following command after -cloning: -</p> - -<div class="org-src-container"> - -<pre class="src src-sh">git update-index --assume-unchanged emacs/init.el -</pre> -</div> - -<p> -Moreover, in order to avoid manually tangling and compiling the <code>init.org</code> file -on each change, the following function is provided: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">tangle-init</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"If the current buffer is 'init.org' the code-blocks are</span> -<span class="org-doc"> tangled, and the tangled file is compiled. Morever, an init.html is generated."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">or</span> <span class="org-rainbow-delimiters-depth-4">(</span>equal <span class="org-rainbow-delimiters-depth-5">(</span>buffer-file-name<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>expand-file-name <span class="org-rainbow-delimiters-depth-6">(</span>concat user-emacs-directory <span class="org-string">"init.org"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>string-suffix-p <span class="org-string">"dotfiles/emacs/init.org"</span> <span class="org-rainbow-delimiters-depth-5">(</span>buffer-file-name<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">Avoid running hooks when tangling</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>prog-mode-hook nil<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>org-babel-tangle<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>org-html-export-to-html<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>byte-compile-file <span class="org-rainbow-delimiters-depth-5">(</span>concat user-emacs-directory <span class="org-string">"init.el"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'after-save-hook 'tangle-init<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-2" class="outline-2"> -<h2 id="sec-2">Introduction</h2> -<div class="outline-text-2" id="text-2"> -<p> -I'm using GNU Emacs 25, but everything should be working in GNU Emacs 24. There -are some exceptions to this (e.g. webkit support), but these cases are -individually handled. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">unless</span> <span class="org-rainbow-delimiters-depth-2">(</span>>= emacs-major-version 24<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-warning">error</span> <span class="org-string">"Don't be a cheap bastard and upgrade to at least GNU Emacs 24"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Temporarily reduce garbage collection so startup time is lower. Idea taken from -<a href="https://github.com/purcell">@purcell</a>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defconst</span> <span class="org-variable-name">mssola-initial-gc-cons-threshold</span> gc-cons-threshold - <span class="org-doc">"Initial value of `</span><span class="org-doc"><span class="org-constant">gc-cons-threshold</span></span><span class="org-doc">' at start-up time."</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> gc-cons-threshold <span class="org-rainbow-delimiters-depth-2">(</span>* 1024 1024 1024<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'after-init-hook - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> gc-cons-threshold mssola-initial-gc-cons-threshold<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -User name and email. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> user-full-name <span class="org-string">"Miquel Sabaté Solà"</span> - user-mail-address <span class="org-string">"mikisabate@gmail.com"</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-3" class="outline-2"> -<h2 id="sec-3">General</h2> -<div class="outline-text-2" id="text-3"> -</div><div id="outline-container-sec-3-1" class="outline-3"> -<h3 id="sec-3-1">GUI</h3> -<div class="outline-text-3" id="text-3-1"> -<p> -I like a minimalistic GUI. Because of this, almost all GUI elements have been -disabled or tweaked in some custom way. -</p> - -<p> -The frame title is "<login>: <path>". If we are not editing a file, then the -name of the buffer is displayed (e.g. "mssola: <b>scratch</b>"). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> frame-title-format - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-builtin">:eval</span> - <span class="org-rainbow-delimiters-depth-4">(</span>concat <span class="org-rainbow-delimiters-depth-5">(</span>user-real-login-name<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-string">": "</span> - <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-6">(</span>buffer-file-name<span class="org-rainbow-delimiters-depth-6">)</span> - <span class="org-rainbow-delimiters-depth-6">(</span>abbreviate-file-name <span class="org-rainbow-delimiters-depth-7">(</span>buffer-file-name<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span> - <span class="org-string">"%b"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Disable the menu, scroll and tool bars. At the same time, enable line and column -modes. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>menu-bar-mode -1<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-2">(</span>fboundp 'set-scroll-bar-mode<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>set-scroll-bar-mode nil<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-2">(</span>fboundp 'tool-bar-mode<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>tool-bar-mode -1<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-2">(</span>fboundp 'tooltip-mode<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>tooltip-mode 0<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>line-number-mode 1<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>column-number-mode 1<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Nice scrolling</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> scroll-margin 0 - scroll-conservatively 100000 - scroll-preserve-screen-position 1<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-3-2" class="outline-3"> -<h3 id="sec-3-2">Basic editing configuration</h3> -<div class="outline-text-3" id="text-3-2"> -<p> -Use UTF-8 <b>always</b>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>prefer-coding-system 'utf-8<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>set-default-coding-systems 'utf-8<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>set-terminal-coding-system 'utf-8<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>set-keyboard-coding-system 'utf-8<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>set-language-environment 'utf-8<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Some editing tweaks like tabs vs spaces, maximum column width, etc. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-comment-delimiter">;; </span><span class="org-comment">Emacs modes typically provide a standard means to change the indentation</span> -<span class="org-comment-delimiter">;; </span><span class="org-comment">width (e.g. c-basic-offset). Moreover, even though I prefer tabs over space,</span> -<span class="org-comment-delimiter">;; </span><span class="org-comment">for most coding conventions this is not the case (e.g. ruby). For this</span> -<span class="org-comment-delimiter">;; </span><span class="org-comment">reason, I will disable them by default and enabled them back for each</span> -<span class="org-comment-delimiter">;; </span><span class="org-comment">specific case (e.g. C). I'm also using the smart-tabs-mode package, see</span> -<span class="org-comment-delimiter">;; </span><span class="org-comment">below in the languages section.</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq-default</span> indent-tabs-mode nil<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq-default</span> tab-width 4<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Maximum 80 columns.</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq-default</span> fill-column 80<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq-default</span> auto-fill-function 'do-auto-fill<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Do not break lines</span> -<span class="org-rainbow-delimiters-depth-1">(</span>set-default 'truncate-lines t<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Delete the selection with a keypress.</span> -<span class="org-rainbow-delimiters-depth-1">(</span>delete-selection-mode t<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Remove whitespaces at the end of line</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'before-save-hook 'delete-trailing-whitespace<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Cursor</span> -<span class="org-rainbow-delimiters-depth-1">(</span>blink-cursor-mode 0<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>global-hl-line-mode -1<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>show-paren-mode 1<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-3-3" class="outline-3"> -<h3 id="sec-3-3">Font and theme</h3> -<div class="outline-text-3" id="text-3-3"> -<p> -I'm using "Droid Sans Mono" simply because I've grown used to it. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>set-frame-font <span class="org-string">"Droid Sans Mono Dotted for Powerline-10"</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-to-list 'default-frame-alist '<span class="org-rainbow-delimiters-depth-2">(</span>font . <span class="org-string">"Droid Sans Mono Dotted for Powerline-10"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">; </span><span class="org-comment">Emacs in daemon mode does not like `set-face-attribute` because this is only</span> -<span class="org-comment-delimiter">; </span><span class="org-comment">applied if there is a frame in place, which doesn't happen when starting the</span> -<span class="org-comment-delimiter">; </span><span class="org-comment">daemon. Thus, we should call that after the frame has been created (e.g. by</span> -<span class="org-comment-delimiter">; </span><span class="org-comment">emacsclient).</span> -<span class="org-comment-delimiter">; </span><span class="org-comment">See: https://lists.gnu.org/archive/html/help-gnu-emacs/2015-03/msg00016.html</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'after-make-frame-functions-hook - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> - <span class="org-rainbow-delimiters-depth-3">(</span>set-face-attribute 'default t <span class="org-builtin">:font</span> <span class="org-string">"Droid Sans Mono Dotted for Powerline-10"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -I've hacked my own theme called <a href="https://github.com/mssola/soria">soria</a>. This theme combines the vim theme -<a href="http://www.vim.org/scripts/script.php?script_id=2140">xoria256</a> with the <a href="http://opensuse.github.io/branding-guidelines/">openSUSE branding guidelines</a>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>load-theme 'soria t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -When hacking your own theme, sometimes you want to know what face is the one -that you see on the screen right now. This function from <a href="https://github.com/thblt/DotFiles">@thblt</a> allows me to -get exactly that: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-face-at-point</span> <span class="org-rainbow-delimiters-depth-2">(</span>pos<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-doc">"Writes a message with the name of the face at the current point. The POS</span> -<span class="org-doc"> argument contains the current position of the cursor."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">interactive</span> <span class="org-string">"d"</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>face <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">or</span> <span class="org-rainbow-delimiters-depth-6">(</span>get-char-property <span class="org-rainbow-delimiters-depth-7">(</span>point<span class="org-rainbow-delimiters-depth-7">)</span> 'read-face-name<span class="org-rainbow-delimiters-depth-6">)</span> - <span class="org-rainbow-delimiters-depth-6">(</span>get-char-property <span class="org-rainbow-delimiters-depth-7">(</span>point<span class="org-rainbow-delimiters-depth-7">)</span> 'face<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> face <span class="org-rainbow-delimiters-depth-4">(</span>message <span class="org-string">"Face: %s"</span> face<span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-rainbow-delimiters-depth-4">(</span>message <span class="org-string">"No face at %d"</span> pos<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"C-c f"</span><span class="org-rainbow-delimiters-depth-2">)</span> 'mssola-face-at-point<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-3-4" class="outline-3"> -<h3 id="sec-3-4">General global key bindings</h3> -<div class="outline-text-3" id="text-3-4"> -<p> -Use kill-this-buffer instead of kill-buffer. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"C-x k"</span><span class="org-rainbow-delimiters-depth-2">)</span> 'kill-this-buffer<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Disable C-z. It will later on be picked up by Evil's config as the escape -sequence. This is here to make sure that it will be disabled even if Evil -cannot be loaded due to some error. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>global-unset-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"C-z"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Disable all the Fn keys. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">dotimes</span> <span class="org-rainbow-delimiters-depth-2">(</span>i 12<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-unset-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-rainbow-delimiters-depth-4">(</span>format <span class="org-string">"<f%d>"</span> <span class="org-rainbow-delimiters-depth-5">(</span>+ i 1<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Disable overwrite-mode. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>define-key global-map <span class="org-rainbow-delimiters-depth-2">[</span><span class="org-rainbow-delimiters-depth-3">(</span>insert<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">]</span> nil<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-3-5" class="outline-3"> -<h3 id="sec-3-5">Others</h3> -<div class="outline-text-3" id="text-3-5"> -<p> -Revert buffers automatically when underlying files are changed externally. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>global-auto-revert-mode t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Follow symlinks. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> vc-follow-symlinks t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Remove the initial message from the scratch buffer. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> initial-scratch-message nil<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Never kill the scratch buffer, bury it instead. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defadvice</span> <span class="org-function-name">kill-buffer</span> <span class="org-rainbow-delimiters-depth-2">(</span>around kill-buffer-around-advice activate<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>buffer-to-kill <span class="org-rainbow-delimiters-depth-5">(</span>ad-get-arg 0<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span>equal buffer-to-kill <span class="org-string">"*scratch*"</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>bury-buffer<span class="org-rainbow-delimiters-depth-4">)</span> - ad-do-it<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defadvice</span> <span class="org-function-name">kill-this-buffer</span> <span class="org-rainbow-delimiters-depth-2">(</span>around kill-buffer-around-advice activate<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>buffer-to-kill <span class="org-rainbow-delimiters-depth-5">(</span>ad-get-arg 0<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span>equal buffer-to-kill <span class="org-string">"*scratch*"</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>bury-buffer<span class="org-rainbow-delimiters-depth-4">)</span> - ad-do-it<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -No backups -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq-default</span> make-backup-files nil<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq-default</span> auto-save-default nil<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -But at least save the list of recently open files. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">recentf</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>recentf-mode 1<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-string">"\C-x\ \C-r"</span> 'recentf-open-files<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">; </span><span class="org-comment">Save the list every 5 minutes</span> -<span class="org-rainbow-delimiters-depth-1">(</span>run-at-time nil <span class="org-rainbow-delimiters-depth-2">(</span>* 5 60<span class="org-rainbow-delimiters-depth-2">)</span> 'recentf-save-list<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -No welcome screen -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq-default</span> inhibit-startup-message t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Enable y/n answers -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>fset 'yes-or-no-p 'y-or-n-p<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Let flyspell be performant. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">flyspell-issue-message-flag</span> nil<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Save custom-variables somewhere else. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> custom-file <span class="org-rainbow-delimiters-depth-2">(</span>expand-file-name <span class="org-string">"custom.el"</span> user-emacs-directory<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-2">(</span>file-exists-p custom-file<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>load custom-file<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> -</div> - -<div id="outline-container-sec-4" class="outline-2"> -<h2 id="sec-4">Calendar</h2> -<div class="outline-text-2" id="text-4"> -<p> -We catalans start our weeks on Monday. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">calendar-week-start-day</span> 1<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Global key binding. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"M-c"</span><span class="org-rainbow-delimiters-depth-2">)</span> 'calendar<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Fix some stuff for evil mode. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> <span class="org-string">"evil"</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-set-initial-state 'calendar-mode 'normal<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">evil-define-key</span> 'normal calendar-mode-map - <span class="org-string">"j"</span> 'calendar-forward-week - <span class="org-string">"k"</span> 'calendar-backward-week - <span class="org-string">"b"</span> 'calendar-backward-day - <span class="org-string">"h"</span> 'calendar-backward-day - <span class="org-string">"l"</span> 'calendar-forward-day - <span class="org-string">"w"</span> 'calendar-forward-day - <span class="org-string">"q"</span> 'calendar-exit - <span class="org-string">"\C-h"</span> 'evil-window-left - <span class="org-string">"\C-l"</span> 'evil-window-right - <span class="org-string">"\C-j"</span> 'evil-window-down - <span class="org-string">"\C-k"</span> 'evil-window-up - <span class="org-string">"\C-n"</span> 'calendar-scroll-left-three-months - <span class="org-string">"\C-p"</span> 'calendar-scroll-right-three-months<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-5" class="outline-2"> -<h2 id="sec-5">General purpose defuns</h2> -<div class="outline-text-2" id="text-5"> -<p> -I want to read the latest news. That's why I define a function that downloads -the <code>NEWS</code> file from the git server and then opens it in a buffer. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-view-emacs-latest-news</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Allow users to fetch the latest Emacs' NEWS file."</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>url-copy-file - <span class="org-string">"http://git.savannah.gnu.org/cgit/emacs.git/plain/etc/NEWS"</span> - <span class="org-string">"/tmp/emacs-news"</span> t<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>find-file-read-only <span class="org-string">"/tmp/emacs-news"</span> t<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Sometimes I want to debug my initialization time. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">emacs-init-time</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Redefine the `</span><span class="org-doc"><span class="org-constant">emacs-init-time</span></span><span class="org-doc">' function so it is more detailed.</span> -<span class="org-doc">Idea taken from @purcell."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>init-time - <span class="org-rainbow-delimiters-depth-5">(</span>float-time <span class="org-rainbow-delimiters-depth-6">(</span>time-subtract after-init-time before-init-time<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>message <span class="org-string">"%.3fs"</span> init-time<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-6" class="outline-2"> -<h2 id="sec-6">Lisp packages</h2> -<div class="outline-text-2" id="text-6"> -</div><div id="outline-container-sec-6-1" class="outline-3"> -<h3 id="sec-6-1">Custom packages</h3> -<div class="outline-text-3" id="text-6-1"> -<p> -Compile the <code>g.el</code> script and bind it to <kbd>M-g</kbd>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>byte-compile-file <span class="org-rainbow-delimiters-depth-2">(</span>concat user-emacs-directory <span class="org-string">"lisp/g.el"</span><span class="org-rainbow-delimiters-depth-2">)</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"M-g"</span><span class="org-rainbow-delimiters-depth-2">)</span> 'g<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-6-2" class="outline-3"> -<h3 id="sec-6-2">use-package</h3> -<div class="outline-text-3" id="text-6-2"> -<p> -Initialize package. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">package</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>add-to-list 'package-archives - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"melpa"</span> . <span class="org-string">"http://melpa.milkbox.net/packages/"</span><span class="org-rainbow-delimiters-depth-2">)</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-to-list 'package-archives - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"melpa-stable"</span> . <span class="org-string">"https://stable.melpa.org/packages/"</span><span class="org-rainbow-delimiters-depth-2">)</span> t<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>package-initialize<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -I'm using use-package to handle my installed packages. I don't know if it's -the best option or what because I haven't tested all the package managers -for Emacs out there. After trying some custom functions to handle -package-install, I decided on use-package because I feel more well-organized. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">unless</span> <span class="org-rainbow-delimiters-depth-2">(</span>package-installed-p 'use-package<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>package-refresh-contents<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>package-install 'use-package<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Some <code>use-package</code> calls require <code>diminish.el</code> to be available. So, let's -require it here on the very top. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> diminish - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> -</div> - -<div id="outline-container-sec-7" class="outline-2"> -<h2 id="sec-7">Project</h2> -<div class="outline-text-2" id="text-7"> -<p> -First of all, load the silver searcher, which is a convenient and fast searcher. -Ayo silver! -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> ag - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Avoid some disagreements between ag and evil.</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">with-eval-after-load</span> 'evil - <span class="org-rainbow-delimiters-depth-3">(</span>add-hook 'ag-mode-hook - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">()</span> - <span class="org-rainbow-delimiters-depth-5">(</span>define-key ag-mode-map <span class="org-rainbow-delimiters-depth-6">(</span>kbd <span class="org-string">"n"</span><span class="org-rainbow-delimiters-depth-6">)</span> 'evil-search-next<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>define-key ag-mode-map <span class="org-rainbow-delimiters-depth-6">(</span>kbd <span class="org-string">"N"</span><span class="org-rainbow-delimiters-depth-6">)</span> 'evil-search-previous<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>define-key ag-mode-map <span class="org-rainbow-delimiters-depth-6">(</span>kbd <span class="org-string">"gg"</span><span class="org-rainbow-delimiters-depth-6">)</span> 'evil-goto-first-line<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> ag-reuse-buffers t<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> ag-reuse-window t<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Then, for keeping up with my projects I use the Projectile + Helm combination. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> projectile - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>projectile-mode 1<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> helm - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> projectile-completion-system 'helm<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Allow the search pattern to be on the header. Taken from this Reddit thread:</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">https://www.reddit.com/r/emacs/comments/3asbyn/new_and_very_useful_helm_feature_enter_search/</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> helm-echo-input-in-header-line t<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">helm-hide-minibuffer-maybe</span> <span class="org-rainbow-delimiters-depth-3">()</span> - <span class="org-doc">"Hide the minibuffer if we are in a Helm session"</span> - - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">with-helm-buffer</span> helm-echo-input-in-header-line<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-rainbow-delimiters-depth-6">(</span>ov <span class="org-rainbow-delimiters-depth-7">(</span>make-overlay <span class="org-rainbow-delimiters-depth-8">(</span>point-min<span class="org-rainbow-delimiters-depth-8">)</span> <span class="org-rainbow-delimiters-depth-8">(</span>point-max<span class="org-rainbow-delimiters-depth-8">)</span> nil nil t<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>overlay-put ov 'window <span class="org-rainbow-delimiters-depth-6">(</span>selected-window<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>overlay-put ov 'face <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-7">(</span><span class="org-rainbow-delimiters-depth-8">(</span>bg-color <span class="org-rainbow-delimiters-depth-9">(</span>face-background 'default nil<span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> - `<span class="org-rainbow-delimiters-depth-7">(</span><span class="org-builtin">:background</span> ,bg-color <span class="org-builtin">:foreground</span> ,bg-color<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">setq-local</span> cursor-type nil<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'helm-minibuffer-set-up-hook 'helm-hide-minibuffer-maybe<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> helm-split-window-inside-p t<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Preview files with tab</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key helm-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"<tab>"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'helm-execute-persistent-action<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Show available options</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key helm-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-a"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'helm-select-action<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Some vim-like bindings</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key helm-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-j"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'helm-next-line<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key helm-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-k"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'helm-previous-line<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>global-set-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"M-x"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'helm-M-x<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> helm-ag - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> helm-projectile - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>helm-projectile-on<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Define M-p as a way to quickly list all the available projects.</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">with-eval-after-load</span> 'evil - <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-4">(</span>kbd <span class="org-string">"M-p"</span><span class="org-rainbow-delimiters-depth-4">)</span> - 'helm-projectile-switch-project<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -I use <kbd>C-p</kbd> as the binding for listing relevant files. This -binding works either by using <code>helm-projectile</code> or the regular <code>helm-find</code> -function. As a final touch, this binding also works for listing channels in ERC -buffers. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-erc-helm-buffer-list</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Returns a list with the ERC buffers."</span> - <span class="org-rainbow-delimiters-depth-2">(</span>mapcar 'buffer-name <span class="org-rainbow-delimiters-depth-3">(</span>erc-buffer-list<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defconst</span> <span class="org-variable-name">mssola-helm-source-erc-channel-list</span> - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span>name . <span class="org-string">"ERC Channels"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>candidates . mssola-erc-helm-buffer-list<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>action . switch-to-buffer<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-erc-helm-switch-buffer</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Use helm to select an active ERC buffer."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>helm <span class="org-builtin">:sources</span> '<span class="org-rainbow-delimiters-depth-3">(</span>mssola-helm-source-erc-channel-list<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-builtin">:buffer</span> <span class="org-string">"*helm-erc-channels*"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-find-file</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Call the proper Helm function for finding files."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-3">(</span>string= major-mode <span class="org-string">"erc-mode"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>mssola-erc-helm-switch-buffer<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">condition-case</span> nil - <span class="org-rainbow-delimiters-depth-4">(</span>helm-projectile-find-file<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-warning">error</span> - <span class="org-rainbow-delimiters-depth-5">(</span>helm-find-files nil<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> 'evil - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-p"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'mssola-find-file<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Similarly, <code>helm-ag</code> has two functions for applying <code>ag</code> on the project. I'm -binding to <kbd>,a</kbd> a function that calls to the proper function. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-helm-ag</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Call the right ag command for helm-ag."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">condition-case</span> nil - <span class="org-rainbow-delimiters-depth-3">(</span>helm-ag-project-root<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-warning">error</span> <span class="org-rainbow-delimiters-depth-4">(</span>helm-ag<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> 'evil-leader - <span class="org-rainbow-delimiters-depth-2">(</span>evil-leader/set-key <span class="org-string">"a"</span> 'mssola-helm-ag<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-8" class="outline-2"> -<h2 id="sec-8">Edit</h2> -<div class="outline-text-2" id="text-8"> -<p> -In this section I define some useful packages for editing. First of all, one of -the coolest packages out there is <code>undo-tree</code>. It allows you to navigate through -the undo history in a tree (because GNU Emacs is cool and keeps track of undo -actions in a tree structure instead of in a stack). This package is included in -recent versions of GNU Emacs. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> 'undo-tree - <span class="org-rainbow-delimiters-depth-2">(</span>global-undo-tree-mode 1<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> undo-tree-visualizer-diff t - undo-tree-visualizer-timestamps t - undo-tree-visualizer-relative-timestamps t<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">diminish</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>diminish 'undo-tree-mode<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">with-eval-after-load</span> 'evil-leader - <span class="org-rainbow-delimiters-depth-3">(</span>evil-leader/set-key - <span class="org-string">"u"</span> 'undo-tree-visualize<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Another important package is <code>flycheck</code>, which is an on-the-fly syntax checking -extension. This works with lots of languages with proper glue code. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> let-alist - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> flycheck - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:diminish</span> - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'after-init-hook 'global-flycheck-mode<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">Only show the errors buffer if it isn't there and if I'm saving the</span> - <span class="org-comment-delimiter">;; </span><span class="org-comment">buffer.</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> flycheck-emacs-lisp-load-path 'inherit<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> flycheck-check-syntax-automatically '<span class="org-rainbow-delimiters-depth-3">(</span>mode-enabled save<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> flycheck-display-errors-function - #'flycheck-display-error-messages-unless-error-list<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -A recurring issue in speeches and presentations is that when showing something -with your editor, you have to increase/decrease the fonts. I use the -<code>default-text-scale</code> package for this. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> default-text-scale - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-set-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-+"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'default-text-scale-increase<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-set-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C--"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'default-text-scale-decrease<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Some languages use some delimiters a lot (e.g. lisp languages and -parenthesis). For this reason I'm using the <code>rainbow-delimiters</code> package, which -properly highlights each level in a different way (provided that your theme -supports it). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> rainbow-delimiters - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -I never use the mouse. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> disable-mouse - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-disable-mouse-mode<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> global-disable-mouse-mode-lighter <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Sometimes you begin typing a prefix, but then you forget the following -chord. For this reason <code>which-key</code> was created. It will show the available -commands for the current chord as a list. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> which-key - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:diminish</span> which-key-mode - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>which-key-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -For some modes it is important to count the number of words in the text. For -this, we have <code>wc-mode</code>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> wc-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Next on the list, we have <code>writeroom-mode</code>. I honestly don't use this package -that often, but it's cool to have a distraction-free screen from time to time. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> writeroom-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -The <code>expand-region</code> package is an extension that is based on a Vim one, which -expands the region of selection with a single key chord. Even if evil covers -most of my uses, it's convenient to have this tool anyways. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> expand-region - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Set C-e as the expand command (mnemonic: expand). This command will</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">supercede the evil binding for "move one line", which I never use anyways.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-set-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"\C-e"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'er/expand-region<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">with-eval-after-load</span> 'evil - <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-4">(</span>kbd <span class="org-string">"\C-e"</span><span class="org-rainbow-delimiters-depth-4">)</span> 'er/expand-region<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-visual-state-map <span class="org-rainbow-delimiters-depth-4">(</span>kbd <span class="org-string">"\C-e"</span><span class="org-rainbow-delimiters-depth-4">)</span> 'er/expand-region<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">er/add-text-mode-expansions</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"This way we can also expand the region into paragraphs & pages in text mode.</span> -<span class="org-doc">Directly taken from: https://github.com/magnars/expand-region.el."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>set <span class="org-rainbow-delimiters-depth-3">(</span>make-local-variable 'er/try-expand-list<span class="org-rainbow-delimiters-depth-3">)</span> <span class="org-rainbow-delimiters-depth-3">(</span>append - er/try-expand-list - '<span class="org-rainbow-delimiters-depth-4">(</span>mark-paragraph - mark-page<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'text-mode-hook 'er/add-text-mode-expansions<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Editing files as root is a bit of a pain because usually the root user doesn't -have the same configuration as the current one, and attempting to do so can be -messy. So, instead of that, we could advice the <code>find-file</code> function so if the -file is not writable by the current user, then GNU Emacs will ask for editing -this same file as root: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defadvice</span> <span class="org-function-name">find-file</span> <span class="org-rainbow-delimiters-depth-2">(</span>after find-file-sudo activate<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-doc">"Find file as root if necessary."</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">and</span> buffer-file-name - <span class="org-rainbow-delimiters-depth-4">(</span>not <span class="org-rainbow-delimiters-depth-5">(</span>file-writable-p buffer-file-name<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span>yes-or-no-p <span class="org-string">"Do you want to edit this file as root?"</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>find-alternate-file <span class="org-rainbow-delimiters-depth-5">(</span>concat <span class="org-string">"/sudo:root@localhost:"</span> buffer-file-name<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -<code>YASnippet</code> allows people to define shortcuts for writing some common blocks. -Moreover, it comes with a set of builtin snippets already. Since I don't -remember some of these snippets, I've mapped <kbd>, h</kbd> to -<code>yas-describe-tables</code>, which shows the available snippets in another buffer. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> yasnippet - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:diminish</span> yas-minor-mode - <span class="org-builtin">:init</span> <span class="org-rainbow-delimiters-depth-2">(</span>yas-global-mode<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>yas-global-mode 1<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">with-eval-after-load</span> 'evil-leader - <span class="org-rainbow-delimiters-depth-3">(</span>evil-leader/set-key <span class="org-string">"h"</span> 'yas-describe-tables<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -<code>bool-flip</code> is a very simple utility that toggles truthy/falsey values. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> bool-flip - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-set-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-c b"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'bool-flip-do-flip<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-9" class="outline-2"> -<h2 id="sec-9">Dired</h2> -<div class="outline-text-2" id="text-9"> -<p> -I use dired mode mainly for attaching document into emails. That being said, -whenever I use it, I want basic evil movement. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> 'evil - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">evil-add-hjkl-bindings</span> dired-mode-map 'normal - <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"w"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'evil-forward-word-begin<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -I also extend <code>dired</code> with some handy tweaks. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> directory-free-space-args <span class="org-string">"-Pkh"</span> - dired-dwim-target t - dired-omit-mode nil - dired-recursive-copies 'always - dired-recursive-deletes 'always - delete-old-versions t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -And now instruct dired mode how to attach files when using mu4e. This is taken -from the <a href="https://www.djcbsoftware.nl/code/mu/mu4e/Dired.html#Dired">mu4e documentation</a>, and it's available by typing -<kbd>C-c RET C-a</kbd>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">gnus-dired</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Make the `</span><span class="org-comment"><span class="org-constant">gnus-dired-mail-buffers</span></span><span class="org-comment">' function also work on message-mode derived</span> -<span class="org-comment-delimiter">;; </span><span class="org-comment">modes, such as mu4e-compose-mode.</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">gnus-dired-mail-buffers</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Return a list of active message buffers."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-3">(</span>buffers<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">save-current-buffer</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">dolist</span> <span class="org-rainbow-delimiters-depth-5">(</span>buffer <span class="org-rainbow-delimiters-depth-6">(</span>buffer-list t<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>set-buffer buffer<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">and</span> <span class="org-rainbow-delimiters-depth-7">(</span>derived-mode-p 'message-mode<span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>null message-sent-message-via<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">push</span> <span class="org-rainbow-delimiters-depth-7">(</span>buffer-name buffer<span class="org-rainbow-delimiters-depth-7">)</span> buffers<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>nreverse buffers<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> gnus-dired-mail-mode 'mu4e-user-agent<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-10" class="outline-2"> -<h2 id="sec-10">Evil</h2> -<div class="outline-text-2" id="text-10"> -<p> -Forgive me, <a href="https://stallman.org/saint.html">Father</a>, for I have sinned. I've been exposed to modal editing -through Vim, and that has changed how I view editing for the foreseeable future. -Because of this, I use Evil. The following blocks include some heavy-lifting so -Evil and GNU Emacs work without hitting each other, and it also includes some -Evil extensions. -</p> - -<p> -First of all, let's define a function that will be called whenever Evil is loaded. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-evil</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Configure evil mode."</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">We can safely remap <C-u> because the counting will be handled a-la Vim.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-u"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'evil-scroll-up<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Make window navigation easier.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-j"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'evil-window-down<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-k"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'evil-window-up<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-l"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'evil-window-right<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-h"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'evil-window-left<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">The window navigation tweaks effectively wipe out the help prefix, which</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">is bad. Fortunately we can workaround this by providing "M-h" as the new</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">help prefix. This prefix is only used in emacs mode to mark lines, which is</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">something already handled by Evil.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key global-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"M-h"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'help-command<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>fset 'help-command help-map<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">I use the Super key in combination with j & k to move around i3. Let's unset</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">M- combos for these two fellows for whenever I misstype them.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-unset-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"M-j"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-unset-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"M-k"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">both this function and the subsequent lines about [escape] are taken from</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">@aaronbieber configuration.</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">defun</span> <span class="org-function-name">minibuffer-keyboard-quit</span> <span class="org-rainbow-delimiters-depth-3">()</span> - <span class="org-doc">"Abort recursive edit.</span> -<span class="org-doc">In Delete Selection mode, if the mark is active, just deactivate it;</span> -<span class="org-doc">then it takes a second \\[</span><span class="org-doc"><span class="org-constant">keyboard-quit</span></span><span class="org-doc">] to abort the minibuffer."</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">and</span> delete-selection-mode transient-mark-mode mark-active<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq</span> deactivate-mark t<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-5">(</span>get-buffer <span class="org-string">"*Completions*"</span><span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-rainbow-delimiters-depth-5">(</span>delete-windows-on <span class="org-string">"*Completions*"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>abort-recursive-edit<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">Make escape quit everything, whenever possible.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">[</span>escape<span class="org-rainbow-delimiters-depth-3">]</span> 'keyboard-quit<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-visual-state-map <span class="org-rainbow-delimiters-depth-3">[</span>escape<span class="org-rainbow-delimiters-depth-3">]</span> 'keyboard-quit<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key minibuffer-local-map <span class="org-rainbow-delimiters-depth-3">[</span>escape<span class="org-rainbow-delimiters-depth-3">]</span> 'minibuffer-keyboard-quit<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key minibuffer-local-ns-map <span class="org-rainbow-delimiters-depth-3">[</span>escape<span class="org-rainbow-delimiters-depth-3">]</span> 'minibuffer-keyboard-quit<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key minibuffer-local-completion-map <span class="org-rainbow-delimiters-depth-3">[</span>escape<span class="org-rainbow-delimiters-depth-3">]</span> 'minibuffer-keyboard-quit<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key minibuffer-local-must-match-map <span class="org-rainbow-delimiters-depth-3">[</span>escape<span class="org-rainbow-delimiters-depth-3">]</span> 'minibuffer-keyboard-quit<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key minibuffer-local-isearch-map <span class="org-rainbow-delimiters-depth-3">[</span>escape<span class="org-rainbow-delimiters-depth-3">]</span> 'minibuffer-keyboard-quit<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">I store macros on the <q> register for convenience, so I used to use the</span> - <span class="org-comment-delimiter">; </span><span class="org-comment"><C-q> combo to execute this macro in Vim. In Emacs though, this combo is</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">reserved to a rather useful function, and I'd like to keep it that way. So,</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">now the mapping is set to <C-2> (mnemonic: where the @ symbol is). Moreover,</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">it's applied as many times as specified by the numeric prefix argument.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-2"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">(</span>n<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">interactive</span> <span class="org-string">"p"</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>evil-execute-macro n <span class="org-string">"@q"</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">C-s: switch to normal mode and save the buffer. I know :)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-s"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'save-buffer<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-insert-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-s"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-rainbow-delimiters-depth-4">(</span>save-buffer<span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-rainbow-delimiters-depth-4">(</span>evil-force-normal-state<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Now make sure that Evil is installed, and call the relevant configuration functions. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> evil - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'evil-mode-hook 'mssola-evil<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-mode 1<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">C-z is unused and it's close to my beloved C-c. Since I don't want to mess</span> - <span class="org-comment-delimiter">;; </span><span class="org-comment">with one of the most sacred Emacs prefixes, I'm moving to C-z.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key key-translation-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-z"</span><span class="org-rainbow-delimiters-depth-3">)</span> <span class="org-rainbow-delimiters-depth-3">[</span>escape<span class="org-rainbow-delimiters-depth-3">]</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-operator-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-z"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'keyboard-quit<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>set-quit-char <span class="org-string">"C-z"</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">Use the proper initial evil state for the following modes.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-set-initial-state 'help-mode 'normal<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-set-initial-state 'debugger-mode 'normal<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-set-initial-state 'describe-mode 'normal<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-set-initial-state 'Buffer-menu-mode 'normal<span class="org-rainbow-delimiters-depth-2">)</span> -</pre> -</div> - -<p> -If Evil was properly loaded, then make sure that the following Evil-related -packages are installed and configured as well. I start by defining the -<code>evil-leader</code> package, which brings the <kbd>leader</kbd> feature from -Vim into Evil. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> evil-leader - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-evil-leader-mode<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-leader/set-leader <span class="org-string">","</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> evil-leader/in-all-states 1<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-leader/set-key - <span class="org-string">","</span> 'back-to-indentation - <span class="org-string">"c"</span> 'delete-window - <span class="org-string">"k"</span> 'kill-buffer-and-window - <span class="org-string">"v"</span> 'split-window-right - <span class="org-string">"V"</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-rainbow-delimiters-depth-4">(</span>split-window-right<span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-rainbow-delimiters-depth-4">(</span>other-window 1<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-string">"f"</span> 'flycheck-list-errors - <span class="org-string">"e"</span> 'eval-last-sexp - <span class="org-string">"b"</span> 'view-buffer - <span class="org-string">"o"</span> 'browse-url-at-point<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Another handy Vim plugin that has made it into Evil is <code>evil-surround</code>, which -defines a new text object for surrounding characters (e.g. change a string from -having double quotes with single quotes in a single command). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> evil-surround - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-evil-surround-mode 1<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Next is another Vim plugin that has been ported to Evil: <code>evil-commentary</code>. This -package defines a new motion for comments, which is bound to -<kbd>gc</kbd>. So, for example, <kbd>gcc</kbd> will comment -the current line, regardless of the programming language. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> evil-commentary - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-commentary-mode t<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Another cool package is <code>evil-args</code> which defines the argument text object. This -text object can be targeted with the <code>a</code> character, and we can move backward and -forward through arguments with <kbd>H</kbd> and <kbd>L</kbd> -respectively. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> evil-args - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">Configuration taken from the documentation of evil-args.</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">Bind evil-args text objects</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-inner-text-objects-map <span class="org-string">"a"</span> 'evil-inner-arg<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-outer-text-objects-map <span class="org-string">"a"</span> 'evil-outer-arg<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">Bind evil-forward/backward-args</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-string">"L"</span> 'evil-forward-arg<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-string">"H"</span> 'evil-backward-arg<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-motion-state-map <span class="org-string">"L"</span> 'evil-forward-arg<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-motion-state-map <span class="org-string">"H"</span> 'evil-backward-arg<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Last but not least, <code>evil-numbers</code> brings a couple of bindings available to Vim -into Evil: <kbd>C-a</kbd> for increasing a number, and -<kbd>C-c -</kbd> for decreasing it (modified because -<kbd>C-z</kbd> is my escape sequence). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> evil-numbers - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-a"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'evil-numbers/inc-at-pt<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>define-key evil-normal-state-map <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-c -"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'evil-numbers/dec-at-pt<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-unmatched">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-11" class="outline-2"> -<h2 id="sec-11">Magit</h2> -<div class="outline-text-2" id="text-11"> -<p> -A git porcelain for GNU Emacs. Even if I'm still using the git CLI, it's -certainly useful for some common tasks (I guess that I still need some learning). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> magit - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> -</pre> -</div> - -<p> -In some cases normal mode is not the right mode (e.g. commit mode). For these -cases, set the proper default mode. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> 'evil - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'git-commit-mode-hook 'evil-insert-state<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-set-initial-state 'magit-log-edit-mode 'insert<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -When showing the status, hide the usually-redundant "branch" section and show -the rest. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'magit-section-set-visibility-hook - '<span class="org-rainbow-delimiters-depth-2">(</span>lambda <span class="org-rainbow-delimiters-depth-3">(</span>section<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span>string= <span class="org-rainbow-delimiters-depth-5">(</span>magit-section-type section<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-string">"branch"</span><span class="org-rainbow-delimiters-depth-4">)</span> - 'hide - 'show<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Set a key binding for <code>magit-log-buffer-file</code>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"C-c l"</span><span class="org-rainbow-delimiters-depth-2">)</span> 'magit-log-buffer-file<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -And repair some key bindings from Evil mode. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> 'evil-leader - <span class="org-rainbow-delimiters-depth-2">(</span>evil-leader/set-key <span class="org-string">"s"</span> 'magit-status<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> evil-magit - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">The magit + evil-magit combo messes up some chords, let's fix this.</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">evil-define-key</span> 'normal magit-mode-map - <span class="org-string">"\C-h"</span> 'evil-window-left - <span class="org-string">"\C-l"</span> 'evil-window-right - <span class="org-string">"\C-j"</span> 'evil-window-down - <span class="org-string">"\C-k"</span> 'evil-window-up - <span class="org-string">"\M-p"</span> 'helm-projectile-switch-project<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-unmatched">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-12" class="outline-2"> -<h2 id="sec-12">mu4e</h2> -<div class="outline-text-2" id="text-12"> -<p> -I use <a href="http://www.djcbsoftware.nl/code/mu/">mu</a> and <a href="http://www.djcbsoftware.nl/code/mu/mu4e.html">mu4e</a> to manage my email. The configuration for this has been taken -mainly from the documentation, plus some cool remarks on Reddit. This -configuration makes quite some assumptions. Read the <code>emacs/README.org</code> file as -provided in my <a href="https://github.com/mssola/dotfiles">dotfiles</a> project to get more details. -</p> - -<p> -I'm using an RPM that I've built on <a href="https://build.opensuse.org/package/show/home:mssola/mu">OBS</a> which installs mu4e globally. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>add-to-list 'load-path <span class="org-string">"/usr/share/emacs/site-lisp/mu4e"</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">mu4e</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">featurep</span> '<span class="org-constant">mu4e</span><span class="org-rainbow-delimiters-depth-2">)</span> -</pre> -</div> - -<p> -Diferent SMTP options that will be used for each context. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> message-send-mail-function 'smtpmail-send-it - mu4e-maildir <span class="org-rainbow-delimiters-depth-2">(</span>expand-file-name <span class="org-string">"~/.mail"</span><span class="org-rainbow-delimiters-depth-2">)</span> - starttls-use-gnutls t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -After that, I am defining some functions that will be used in various parts of -the configuration. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-smtp</span> <span class="org-rainbow-delimiters-depth-2">(</span>server port<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-doc">"Set SMTP variables depending on the given SERVER and PORT."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">smtpmail</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> smtpmail-starttls-credentials - '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>server port nil nil<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - smtpmail-auth-credentials - <span class="org-rainbow-delimiters-depth-3">(</span>expand-file-name <span class="org-string">"~/.authinfo.gpg"</span><span class="org-rainbow-delimiters-depth-3">)</span> - smtpmail-default-smtp-server server - smtpmail-smtp-server server - smtpmail-smtp-service port<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">; </span><span class="org-comment">https://www.reddit.com/r/emacs/comments/47t9ec/share_your_mu4econtext_configs/d0fsih6</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mu4e-message-maildir-matches</span> <span class="org-rainbow-delimiters-depth-2">(</span>msg rx<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-doc">"Returns true if the maildir of MSG matches the given regexp RX."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">when</span> rx - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span>listp rx<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-comment-delimiter">;; </span><span class="org-comment">if rx is a list, try each one for a match</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">or</span> <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-message-maildir-matches msg <span class="org-rainbow-delimiters-depth-6">(</span>car rx<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-message-maildir-matches msg <span class="org-rainbow-delimiters-depth-6">(</span>cdr rx<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-comment-delimiter">;; </span><span class="org-comment">not a list, check rx</span> - <span class="org-rainbow-delimiters-depth-4">(</span>string-match rx <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-message-field msg <span class="org-builtin">:maildir</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">suse-refile-folder</span> <span class="org-rainbow-delimiters-depth-2">(</span>key<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-doc">"Returns the refile folder for the given SUSE account in the KEY arg"</span> - <span class="org-rainbow-delimiters-depth-2">(</span>concat <span class="org-string">"/"</span> key <span class="org-string">"/Archives/"</span> - <span class="org-rainbow-delimiters-depth-3">(</span>format-time-string <span class="org-string">"%Y"</span> <span class="org-rainbow-delimiters-depth-4">(</span>current-time<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Now it's time to define the different contexts that I have. Defining contexts -this way is relatively new (since mu 0.9.16). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-contexts - `<span class="org-rainbow-delimiters-depth-2">(</span> - <span class="org-comment-delimiter">;; </span><span class="org-comment">GMail</span> - ,<span class="org-rainbow-delimiters-depth-3">(</span>make-mu4e-context - <span class="org-builtin">:name</span> <span class="org-string">"gmail"</span> - <span class="org-builtin">:enter-func</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">()</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-message <span class="org-string">"Switching to gmail.com"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mssola-smtp <span class="org-string">"smtp.gmail.com"</span> 587<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-builtin">:match-func</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">(</span>msg<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">when</span> msg - <span class="org-rainbow-delimiters-depth-6">(</span>mu4e-message-maildir-matches msg <span class="org-string">"^/gmail"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-builtin">:vars</span> '<span class="org-rainbow-delimiters-depth-4">(</span> - <span class="org-rainbow-delimiters-depth-5">(</span>user-mail-address . <span class="org-string">"mikisabate@gmail.com"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-reply-to-address . <span class="org-string">"mikisabate@gmail.com"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-drafts-folder . <span class="org-string">"/gmail/Drafts"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-sent-folder . <span class="org-string">"/gmail/Sent"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-refile-folder . <span class="org-string">"/gmail/All"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-trash-folder . <span class="org-string">"/gmail/Trash"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">suse.com</span> - ,<span class="org-rainbow-delimiters-depth-3">(</span>make-mu4e-context - <span class="org-builtin">:name</span> <span class="org-string">"comsuse"</span> - <span class="org-builtin">:enter-func</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">()</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-message <span class="org-string">"Switching to suse.com"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mssola-smtp <span class="org-string">"smtp.novell.com"</span> 25<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-builtin">:match-func</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">(</span>msg<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">when</span> msg - <span class="org-rainbow-delimiters-depth-6">(</span>mu4e-message-maildir-matches msg <span class="org-string">"^/susecom"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-builtin">:vars</span> `<span class="org-rainbow-delimiters-depth-4">(</span> - <span class="org-rainbow-delimiters-depth-5">(</span>user-mail-address . <span class="org-string">"msabate@suse.com"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-reply-to-address . <span class="org-string">"msabate@suse.com"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-drafts-folder . <span class="org-string">"/susecom/Drafts"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-sent-folder . <span class="org-string">"/susecom/Sent"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-refile-folder . ,<span class="org-rainbow-delimiters-depth-6">(</span>suse-refile-folder <span class="org-string">"susecom"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-trash-folder . <span class="org-string">"/susecom/Trash"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - - <span class="org-comment-delimiter">;; </span><span class="org-comment">suse.de</span> - ,<span class="org-rainbow-delimiters-depth-3">(</span>make-mu4e-context - <span class="org-builtin">:name</span> <span class="org-string">"desuse"</span> - <span class="org-builtin">:enter-func</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">()</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-message <span class="org-string">"Switching to suse.de"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mssola-smtp <span class="org-string">"imap.suse.de"</span> 587<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-builtin">:match-func</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">(</span>msg<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">when</span> msg - <span class="org-rainbow-delimiters-depth-6">(</span>mu4e-message-maildir-matches msg <span class="org-string">"^/susede"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-builtin">:vars</span> `<span class="org-rainbow-delimiters-depth-4">(</span> - <span class="org-rainbow-delimiters-depth-5">(</span>user-mail-address . <span class="org-string">"msabate@suse.de"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-reply-to-address . <span class="org-string">"msabate@suse.de"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-drafts-folder . <span class="org-string">"/susede/Drafts"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-sent-folder . <span class="org-string">"/susede/Sent"</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-refile-folder . ,<span class="org-rainbow-delimiters-depth-6">(</span>suse-refile-folder <span class="org-string">"susede"</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>mu4e-trash-folder . <span class="org-string">"/susede/Trash"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -If mu4e cannot figure things out, ask me. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-context-policy 'ask<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-compose-context-policy 'ask<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Fill the <code>mu4e-user-mail-address-list</code> variable with the contexts. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-user-mail-address-list - <span class="org-rainbow-delimiters-depth-2">(</span>delq nil - <span class="org-rainbow-delimiters-depth-3">(</span>mapcar <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">(</span>context<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-6">(</span>mu4e-context-vars context<span class="org-rainbow-delimiters-depth-6">)</span> - <span class="org-rainbow-delimiters-depth-6">(</span>cdr <span class="org-rainbow-delimiters-depth-7">(</span>assq 'user-mail-address - <span class="org-rainbow-delimiters-depth-8">(</span>mu4e-context-vars context<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - mu4e-contexts<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Setting my bookmarks -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-bookmarks - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"maildir:/gmail/inbox OR maildir:/susecom/inbox OR maildir:/susede/inbox"</span> <span class="org-string">"Inbox Folders"</span> ?n<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"maildir:/gmail/Sent OR maildir:/susecom/Sent OR maildir:/susede/Sent"</span> <span class="org-string">"Sent Folders"</span> ?s<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"flag:unread AND NOT flag:trashed"</span> <span class="org-string">"Unread messages"</span> ?u<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"date:today..now"</span> <span class="org-string">"Today's messages"</span> ?t<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -The following signature looks alright regardless of whether the client supports -format=flowed or not. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-compose-signature - <span class="org-rainbow-delimiters-depth-2">(</span>concat - <span class="org-string">"Miquel Sabaté Solà,\n"</span> - <span class="org-string">"PGP: 4096R / 1BA5 3C7A C93D CA2A CFDF DA97 96BE 8C6F D89D 6565\n"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Sign outgoing emails always. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'message-send-hook 'mml-secure-message-sign-pgpmime<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -To avoid UID clashes. See <a href="http://pragmaticemacs.com/emacs/fixing-duplicate-uid-errors-when-using-mbsync-and-mu4e/">this</a>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-change-filenames-when-moving t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Miscellaneous settings. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-html2text-command <span class="org-string">"w3m -T text/html"</span> - mu4e-attachment-dir <span class="org-string">"~/Downloads"</span> - mu4e-headers-date-format <span class="org-string">"%Y-%m-%d %H:%M"</span> - message-citation-line-format <span class="org-string">"%N @ %Y-%m-%d %H:%M %Z:\n"</span> - message-citation-line-function 'message-insert-formatted-citation-line - message-kill-buffer-on-exit t - mu4e-get-mail-command <span class="org-string">"mbsync -aqV"</span> - mu4e-update-interval 600 - mu4e-compose-dont-reply-to-self t - mu4e-compose-format-flowed t - mu4e-headers-skip-duplicates t - mu4e-headers-include-related t - mu4e-headers-auto-update t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -The headers to show in the headers list a pair of a field and its width, -with `nil' meaning 'unlimited' (better only use that for the last field. -These are the defaults: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-headers-fields - '<span class="org-rainbow-delimiters-depth-2">(</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-builtin">:date</span> . 18<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-builtin">:mailing-list</span> . 15<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-builtin">:from-or-to</span> . 20<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-builtin">:subject</span> . nil<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Show images -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> mu4e-view-show-images t - mu4e-view-image-max-width 800<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">; </span><span class="org-comment">Use imagemagick, if available</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-2">(</span>fboundp 'imagemagick-register-types<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>imagemagick-register-types<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -As of 0.9.18 and GNU Emacs 25, the <code>mu4e-action-with-xwidget</code> can be used to -render an HTML message with Webkit. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-2">(</span>>= emacs-major-version 25<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'mu4e-view-actions - '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"webkit"</span> . mu4e-action-view-with-xwidget<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Look for <code>mu4e-msg2pdf</code> in the exec path. The reason for this is that the OBS -package installs mu's <code>toys</code> into the exec path, but <code>mu4e</code> doesn't really count -on it. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span>exec <span class="org-rainbow-delimiters-depth-4">(</span>locate-file <span class="org-string">"msg2pdf"</span> exec-path exec-suffixes<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">if</span> exec - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> mu4e-msg2pdf exec<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Adding hooks for composing and viewing messages. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-compose-mode</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"My settings for message composition."</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">If we are composing an email from scratch, it's more convenient to be in</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">insert mode. Otherwise start with normal mode.</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">with-eval-after-load</span> 'evil - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> mu4e-compose-parent-message - <span class="org-rainbow-delimiters-depth-4">(</span>evil-set-initial-state 'mu4e-compose-mode 'normal<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>evil-set-initial-state 'mu4e-compose-mode 'insert<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Guess hard newlines</span> - <span class="org-rainbow-delimiters-depth-2">(</span>use-hard-newlines t 'guess<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">So it's easy to encrypt/decrypt emails.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>epa-mail-mode<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Spellz</span> - <span class="org-rainbow-delimiters-depth-2">(</span>flyspell-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'mu4e-compose-mode-hook 'mssola-compose-mode<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">; </span><span class="org-comment">I want to read messages in the format that the sender used. I'm also</span> -<span class="org-comment-delimiter">; </span><span class="org-comment">enabling epa-mail-mode, so it's easy to decrypt received emails.</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'mu4e-view-mode-hook - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> - <span class="org-rainbow-delimiters-depth-3">(</span>epa-mail-mode<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>visual-line-mode 1<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -I want desktop notifications when receiving email. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> mu4e-alert - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Notify me for unread emails from my inbox.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>mu4e-alert-set-default-style 'libnotify<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'after-init-hook #'mu4e-alert-enable-notifications<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'after-init-hook #'mu4e-alert-enable-mode-line-display<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> mu4e-alert-interesting-mail-query - <span class="org-rainbow-delimiters-depth-3">(</span>concat - <span class="org-string">"(maildir:/gmail/inbox OR maildir:/susecom/inbox OR maildir:/susede/inbox) "</span> - <span class="org-string">"AND flag:unread AND NOT flag:trashed"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> mu4e-alert-email-notification-types '<span class="org-rainbow-delimiters-depth-3">(</span>count<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">; </span><span class="org-comment">Evil mode in mu4e</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> 'evil - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> evil-mu4e - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Idea taken from evil-mu4e.el</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">defvar</span> <span class="org-variable-name">mssola-evil-mu4e-mode-map-bindings</span> - `<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>,evil-mu4e-state mu4e-headers-mode-map <span class="org-string">"\C-u"</span> evil-scroll-up<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>,evil-mu4e-state mu4e-main-mode-map <span class="org-string">"\C-u"</span> evil-scroll-up<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>,evil-mu4e-state mu4e-view-mode-map <span class="org-string">"h"</span> evil-backward-char<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">dolist</span> <span class="org-rainbow-delimiters-depth-4">(</span>binding mssola-evil-mu4e-mode-map-bindings<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">evil-define-key</span> - <span class="org-rainbow-delimiters-depth-5">(</span>nth 0 binding<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-rainbow-delimiters-depth-5">(</span>nth 1 binding<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-rainbow-delimiters-depth-5">(</span>nth 2 binding<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-rainbow-delimiters-depth-5">(</span>nth 3 binding<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -And finally define a proper shortcut. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-comment-delimiter">; </span><span class="org-comment">The trailing parenthesis closes the "(when (featurep 'mu4e)" statement from</span> -<span class="org-comment-delimiter">; </span><span class="org-comment">the very beginning.</span> -<span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"C-c m"</span><span class="org-rainbow-delimiters-depth-2">)</span> 'mu4e<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-unmatched">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-13" class="outline-2"> -<h2 id="sec-13">org</h2> -<div class="outline-text-2" id="text-13"> -<p> -<a href="http://orgmode.org/">org mode</a> is an incredible tool that keeps me organized: TODOs, notes, agenda, -etc. Moreover, it's built in GNU Emacs: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">org</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> - -<div id="outline-container-sec-13-1" class="outline-3"> -<h3 id="sec-13-1">General settings</h3> -<div class="outline-text-3" id="text-13-1"> -<p> -First of all, let me define some helper functions. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-org-skip-if-priority</span> <span class="org-rainbow-delimiters-depth-2">(</span>priority <span class="org-type">&optional</span> subtree<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-doc">"Skip an agenda item if it has a priority of PRIORITY.</span> -<span class="org-doc">PRIORITY may be one of the characters ?A, ?B, or ?C.</span> -<span class="org-doc">Skips the current entry unless SUBTREE is not nil. This function has been</span> -<span class="org-doc">copied from @aaronbieber."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>end <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">if</span> subtree <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">save-excursion</span> <span class="org-rainbow-delimiters-depth-7">(</span>org-end-of-subtree t<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">save-excursion</span> <span class="org-rainbow-delimiters-depth-7">(</span><span class="org-keyword">progn</span> <span class="org-rainbow-delimiters-depth-8">(</span>outline-next-heading<span class="org-rainbow-delimiters-depth-8">)</span> <span class="org-rainbow-delimiters-depth-8">(</span>1- <span class="org-rainbow-delimiters-depth-9">(</span>point<span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>pri-value <span class="org-rainbow-delimiters-depth-5">(</span>* 1000 <span class="org-rainbow-delimiters-depth-6">(</span>- org-lowest-priority priority<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>pri-current <span class="org-rainbow-delimiters-depth-5">(</span>org-get-priority <span class="org-rainbow-delimiters-depth-6">(</span>thing-at-point 'line t<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span>= pri-value pri-current<span class="org-rainbow-delimiters-depth-4">)</span> - end - nil<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-org-skip-if-not-closed-in-day</span> <span class="org-rainbow-delimiters-depth-2">(</span>time <span class="org-type">&optional</span> subtree<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-doc">"Skip entries that were not closed in the given TIME.</span> -<span class="org-doc">Skip the current entry unless SUBTREE is not nil, in which case skip</span> -<span class="org-doc">the entire subtree. Idea taken from @aaronbieber"</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>end <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">if</span> subtree <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">save-excursion</span> <span class="org-rainbow-delimiters-depth-7">(</span>org-end-of-subtree t<span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-keyword">save-excursion</span> <span class="org-rainbow-delimiters-depth-7">(</span><span class="org-keyword">progn</span> <span class="org-rainbow-delimiters-depth-8">(</span>outline-next-heading<span class="org-rainbow-delimiters-depth-8">)</span> <span class="org-rainbow-delimiters-depth-8">(</span>1- <span class="org-rainbow-delimiters-depth-9">(</span>point<span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>day-prefix <span class="org-rainbow-delimiters-depth-5">(</span>format-time-string <span class="org-string">"%Y-%m-%d"</span> time<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">save-excursion</span> - <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">and</span> <span class="org-rainbow-delimiters-depth-6">(</span>re-search-forward org-closed-time-regexp end t<span class="org-rainbow-delimiters-depth-6">)</span> - <span class="org-rainbow-delimiters-depth-6">(</span>string= <span class="org-rainbow-delimiters-depth-7">(</span>substring <span class="org-rainbow-delimiters-depth-8">(</span>match-string-no-properties 1<span class="org-rainbow-delimiters-depth-8">)</span> 0 10<span class="org-rainbow-delimiters-depth-7">)</span> day-prefix<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - nil - end<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Some general UI settings for org mode. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-src-tab-acts-natively t - org-confirm-babel-evaluate nil - org-edit-src-content-indentation 0<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-todo-keywords - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span>sequence <span class="org-string">"</span><span class="org-string"><span class="org-warning">TODO</span></span><span class="org-string">(t)"</span> <span class="org-string">"|"</span> <span class="org-string">"DONE(d!)"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>sequence <span class="org-string">"IDEA(i)"</span> <span class="org-string">"WORKING(w)"</span> <span class="org-string">"|"</span> <span class="org-string">"USED(u@/!)"</span> <span class="org-string">"DISCARDED(x@/!)"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-todo-keyword-faces - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"</span><span class="org-string"><span class="org-warning">TODO</span></span><span class="org-string">"</span> . org-todo<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"IDEA"</span> . font-lock-constant-face<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"WORKING"</span> . font-lock-constant-face<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"DONE"</span> . org-done<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"USED"</span> . org-done<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"DISCARDED"</span> . org-done<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Logging settings. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-log-done t<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-log-redeadline <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">quote</span> time<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-log-reschedule <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">quote</span> time<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Where org files reside. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-agenda-files '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"~/org/"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-13-2" class="outline-3"> -<h3 id="sec-13-2">Publishing</h3> -<div class="outline-text-3" id="text-13-2"> -<p> -In order to publish files into HTML, I would like to have <code>htmlize</code> installed. -This package allows org to export to HTML in a better way (e.g. allowing code -blocks to be converted into HTML as well, so we can properly colorize it). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> htmlize - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -And now let's set all the related settings. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-src-fontify-natively t - org-html-include-timestamps nil - org-html-toplevel-hlevel 2 - org-html-htmlize-output-type 'css - org-export-with-section-numbers nil - org-export-with-sub-superscripts nil - org-export-htmlize-output-type 'css<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Sometimes it's useful to export to LaTeX. That is, when you are simply writing a -quick document that will end up being converted into LaTeX and finally into PDF: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">ox-latex</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">unless</span> <span class="org-rainbow-delimiters-depth-2">(</span>boundp 'org-latex-classes<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> org-latex-classes nil<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>add-to-list 'org-latex-classes - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"article"</span> - <span class="org-string">"\\documentclass{article}"</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\section{%s}"</span> . <span class="org-string">"\\section*{%s}"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\subsection{%s}"</span> . <span class="org-string">"\\subsection*{%s}"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\subsubsection{%s}"</span> . <span class="org-string">"\\subsubsection*{%s}"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\paragraph{%s}"</span> . <span class="org-string">"\\paragraph*{%s}"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\subparagraph{%s}"</span> . <span class="org-string">"\\subparagraph*{%s}"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -You can also export org documents to man pages. In order to do so, you have to -perform this first: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">ox-man</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-13-3" class="outline-3"> -<h3 id="sec-13-3">Agenda</h3> -<div class="outline-text-3" id="text-13-3"> -<p> -Custom commands for <code>org-agenda</code>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-agenda-custom-commands - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"p"</span> <span class="org-string">"Printed agenda"</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">Daily agenda with a 2-weeks deadline warning. Tasks are</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">represented as [ ] items.</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>agenda <span class="org-string">""</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-ndays 1<span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-deadline-warning-days 14<span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-todo-keyword-format <span class="org-string">"[ ]"</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-scheduled-leaders '<span class="org-rainbow-delimiters-depth-8">(</span><span class="org-string">""</span> <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Display a "High Priority" list of tasks on top.</span> - <span class="org-rainbow-delimiters-depth-5">(</span>tags <span class="org-string">"PRIORITY=\"A\""</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-skip-function '<span class="org-rainbow-delimiters-depth-8">(</span>org-agenda-skip-entry-if 'todo 'done<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-sorting-strategy '<span class="org-rainbow-delimiters-depth-8">(</span>tag-up priority-down<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-todo-keyword-format <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-overriding-header <span class="org-string">"\nHigh priority\n--------------\n"</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - - - <span class="org-comment-delimiter">; </span><span class="org-comment">All tasks except those already listed as high priority or</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">ideas. Scheduled and deadlines are also ignored here.</span> - <span class="org-rainbow-delimiters-depth-5">(</span>alltodo <span class="org-string">""</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-skip-function '<span class="org-rainbow-delimiters-depth-8">(</span><span class="org-keyword">or</span> <span class="org-rainbow-delimiters-depth-9">(</span>mssola-org-skip-if-priority ?A<span class="org-rainbow-delimiters-depth-9">)</span> - <span class="org-rainbow-delimiters-depth-9">(</span>org-agenda-skip-entry-if 'todo '<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">"IDEA"</span> <span class="org-string">"WORKING"</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-depth-9">)</span> - <span class="org-rainbow-delimiters-depth-9">(</span>org-agenda-skip-if nil '<span class="org-rainbow-delimiters-depth-1">(</span>scheduled deadline<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-sorting-strategy '<span class="org-rainbow-delimiters-depth-8">(</span>tag-up priority-down<span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-todo-keyword-format <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-overriding-header <span class="org-string">"\nAll tasks\n----------\n"</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">List of ideas.</span> - <span class="org-rainbow-delimiters-depth-5">(</span>todo <span class="org-string">"IDEA"</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-overriding-header <span class="org-string">"\nIdeas\n------\n"</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-todo-keyword-format <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>org-agenda-compact-blocks t<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>org-agenda-remove-tags t<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">List of done items. Useful for standups, review meetings, weekly</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">reports, etc.</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"d"</span> <span class="org-string">"Done items"</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">First show the items done yesterday. Useful for standups.</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>todo <span class="org-string">"DONE"</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-overriding-header <span class="org-string">"Done yesterday\n---------------\n"</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-skip-function - '<span class="org-rainbow-delimiters-depth-8">(</span>mssola-org-skip-if-not-closed-in-day - <span class="org-rainbow-delimiters-depth-9">(</span>time-subtract <span class="org-rainbow-delimiters-depth-1">(</span>current-time<span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-rainbow-delimiters-depth-1">(</span>seconds-to-time 86400<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-todo-keyword-format <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Then show what I've done today.</span> - <span class="org-rainbow-delimiters-depth-5">(</span>todo <span class="org-string">"DONE"</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-overriding-header <span class="org-string">"\nDone today\n-----------\n"</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-skip-function - '<span class="org-rainbow-delimiters-depth-8">(</span>mssola-org-skip-if-not-closed-in-day - <span class="org-rainbow-delimiters-depth-9">(</span>current-time<span class="org-rainbow-delimiters-depth-9">)</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-todo-keyword-format <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Finally show what I've been doing in the past 15 days. Useful for</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">review meetings and weekly reports.</span> - <span class="org-rainbow-delimiters-depth-5">(</span>todo <span class="org-string">"DONE"</span> - <span class="org-rainbow-delimiters-depth-6">(</span><span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-start-day <span class="org-string">"-15d"</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-span 15<span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-start-on-weekday nil<span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-todo-keyword-format <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-scheduled-leaders '<span class="org-rainbow-delimiters-depth-8">(</span><span class="org-string">""</span> <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-8">)</span><span class="org-rainbow-delimiters-depth-7">)</span> - <span class="org-rainbow-delimiters-depth-7">(</span>org-agenda-overriding-header <span class="org-string">"\nDone during the past 15 days\n-----------------------------\n"</span><span class="org-rainbow-delimiters-depth-7">)</span><span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span>org-agenda-compact-blocks t<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>org-agenda-remove-tags t<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -The prefix for the different kinds of types being used. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-agenda-prefix-format '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span>agenda . <span class="org-string">"%t%s"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>tags . <span class="org-string">"%c:%s"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>todo . <span class="org-string">"%c:%t%s"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Set up a key binding for org-agenda. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"C-c a"</span><span class="org-rainbow-delimiters-depth-2">)</span> 'org-agenda<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-13-4" class="outline-3"> -<h3 id="sec-13-4">Capture</h3> -<div class="outline-text-3" id="text-13-4"> -<p> -Set the default notes file and the key binding. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-default-notes-file <span class="org-rainbow-delimiters-depth-2">(</span>concat org-directory <span class="org-string">"/notes.org"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>define-key global-map <span class="org-string">"\C-cc"</span> 'org-capture<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -And finally set <code>org-capture-templates</code>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> org-capture-templates - `<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"t"</span> <span class="org-string">"todo"</span> entry <span class="org-rainbow-delimiters-depth-4">(</span>file <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-string">"* </span><span class="org-string"><span class="org-warning">TODO</span></span><span class="org-string"> %?\n%U\n"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"i"</span> <span class="org-string">"idea"</span> entry <span class="org-rainbow-delimiters-depth-4">(</span>file <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-string">"* %? :IDEA:\n%U\n%a\n"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-13-5" class="outline-3"> -<h3 id="sec-13-5">Other</h3> -<div class="outline-text-3" id="text-13-5"> -<p> -Insert a <kbd></kbd> value in org mode. See this <a href="http://emacs.stackexchange.com/questions/2206/i-want-to-have-the-kbd-tags-for-my-blog-written-in-org-mode">StackExchange answer</a>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">endless/insert-key</span> <span class="org-rainbow-delimiters-depth-2">(</span>key<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-doc">"Ask for a key then insert its description.</span> -<span class="org-doc">Will work on both org-mode and any mode that accepts plain html."</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">interactive</span> <span class="org-string">"kType key sequence: "</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">let*</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>is-org-mode <span class="org-rainbow-delimiters-depth-5">(</span>derived-mode-p 'org-mode<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>tag <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">if</span> is-org-mode - <span class="org-string">"@@html:<kbd>%s</kbd>@@"</span> - <span class="org-string">"<kbd>%s</kbd>"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">if</span> <span class="org-rainbow-delimiters-depth-4">(</span>null <span class="org-rainbow-delimiters-depth-5">(</span>equal key <span class="org-string">"\r"</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>insert - <span class="org-rainbow-delimiters-depth-5">(</span>format tag <span class="org-rainbow-delimiters-depth-6">(</span>help-key-description key nil<span class="org-rainbow-delimiters-depth-6">)</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>insert <span class="org-rainbow-delimiters-depth-5">(</span>format tag <span class="org-string">""</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>forward-char <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">if</span> is-org-mode -8 -6<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>define-key org-mode-map <span class="org-string">"\C-ck"</span> #'endless/insert-key<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-13-6" class="outline-3"> -<h3 id="sec-13-6"><span class="todo TODO">TODO</span> shortcut for making an org link, and transforming a link into a proper org link</h3> -</div> -<div id="outline-container-sec-13-7" class="outline-3"> -<h3 id="sec-13-7"><span class="todo TODO">TODO</span> make it work with evil</h3> -</div> -<div id="outline-container-sec-13-8" class="outline-3"> -<h3 id="sec-13-8"><span class="todo TODO">TODO</span> Proper keybindings for quick access.</h3> -</div> - -<div id="outline-container-sec-13-9" class="outline-3"> -<h3 id="sec-13-9"><span class="todo TODO">TODO</span> shortcuts for stuff like: create something urgent for today</h3> -</div> -</div> - -<div id="outline-container-sec-14" class="outline-2"> -<h2 id="sec-14">IRC</h2> -<div class="outline-text-2" id="text-14"> -<p> -I'm using <a href="https://www.gnu.org/software/emacs/manual/html_mono/erc.html">ERC</a> for IRC. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> erc - <span class="org-builtin">:config</span> -</pre> -</div> - -<p> -First of all, let's add some basic modules. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">dolist</span> <span class="org-rainbow-delimiters-depth-2">(</span>mod '<span class="org-rainbow-delimiters-depth-3">(</span>autojoin track truncate<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'erc-modules mod<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Setting up basic stuff. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> erc-hide-list '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"PART"</span><span class="org-rainbow-delimiters-depth-2">)</span> - erc-prompt <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> <span class="org-rainbow-delimiters-depth-3">(</span>concat <span class="org-rainbow-delimiters-depth-4">(</span>buffer-name<span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-string">">"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - erc-track-exclude-types '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-string">"JOIN"</span> <span class="org-string">"NICK"</span> <span class="org-string">"PART"</span> <span class="org-string">"QUIT"</span> <span class="org-string">"MODE"</span><span class="org-rainbow-delimiters-depth-2">)</span> - erc-server-coding-system '<span class="org-rainbow-delimiters-depth-2">(</span>utf-8 . utf-8<span class="org-rainbow-delimiters-depth-2">)</span> - erc-kill-buffer-on-part t - erc-kill-queries-on-quit t - erc-kill-server-buffer-on-quit t - erc-fill-column 100 - erc-fill-prefix <span class="org-string">""</span> - erc-timestamp-format <span class="org-string">"[%H:%M] "</span> - erc-insert-timestamp-function 'erc-insert-timestamp-left - erc-insert-away-timestamp-function 'erc-insert-timestamp-left - erc-hide-timestamps nil - erc-whowas-on-nosuchnick t - erc-public-away-p nil - erc-echo-notice-always-hook '<span class="org-rainbow-delimiters-depth-2">(</span>erc-echo-notice-in-minibuffer<span class="org-rainbow-delimiters-depth-2">)</span> - erc-auto-set-away nil - erc-autoaway-message <span class="org-string">"%i seconds out..."</span> - erc-away-nickname <span class="org-string">"msabate"</span> - erc-enable-logging t - erc-query-on-unjoined-chan-privmsg t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Let's log messages whenever I receive/send them. The other option is to only do -that on <code>/quit</code> or <code>/part</code>, but it's better to be safe than sorry. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">require</span> '<span class="org-constant">erc-log</span><span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>erc-log-enable<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> erc-log-channels-directory <span class="org-string">"~/.emacs.d/erc"</span> - erc-save-buffer-on-part nil - erc-save-queries-on-quit nil - erc-log-write-after-send t - erc-log-write-after-insert t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Servers and channels to auto-join. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> erc-autojoin-channels-alist - '<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"irc.freenode.net"</span> <span class="org-string">"#gnu"</span> <span class="org-string">"#emacs"</span><span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"irc.suse.de"</span> <span class="org-string">"#suse"</span> <span class="org-string">"#docker"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Use the <code>erc-hl-nicks</code> package, so highlight support for nicknames is better. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> erc-hl-nicks - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:init</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">with-eval-after-load</span> 'erc - <span class="org-rainbow-delimiters-depth-3">(</span>add-to-list 'erc-modules 'hl-nicks<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -I want to have a desktop notification whenever someone mentions my name. For -this, I'm using the <code>erc-notifications</code> package which is built in ERC since -GNU Emacs 24.3. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> 'erc - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> erc-notifications-icon - <span class="org-rainbow-delimiters-depth-3">(</span>concat - <span class="org-string">"/usr/share/emacs/"</span> - <span class="org-rainbow-delimiters-depth-4">(</span>format <span class="org-string">"%s.%s"</span> emacs-major-version emacs-minor-version<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-string">"/etc/images/icons/hicolor/24x24/apps/emacs.png"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'erc-modules 'notifications<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -At this point, we can safely update all the loaded ERC modules. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'erc-connect-pre-hook - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">(</span>x<span class="org-rainbow-delimiters-depth-3">)</span> <span class="org-rainbow-delimiters-depth-3">(</span>erc-update-modules<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Start some modules which won't do it by default. Moreover, according to the <a href="https://www.emacswiki.org/emacs/ErcFilling">wiki</a> -<code>auto-fill-mode</code> should be disabled if I'm using <code>erc-fill-mode</code>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'erc-mode-hook - '<span class="org-rainbow-delimiters-depth-2">(</span>lambda <span class="org-rainbow-delimiters-depth-3">()</span> - <span class="org-rainbow-delimiters-depth-3">(</span>erc-track-mode t<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>auto-fill-mode -1<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>erc-log-mode 1<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>erc-autojoin-mode 1<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -And now define a function to connect to both IRC servers. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-erc</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Join pre-specified servers and channels."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>erc <span class="org-builtin">:server</span> <span class="org-string">"irc.freenode.net"</span> <span class="org-builtin">:port</span> 6667 <span class="org-builtin">:nick</span> <span class="org-string">"mssola"</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>erc-tls <span class="org-builtin">:server</span> <span class="org-string">"irc.suse.de"</span> <span class="org-builtin">:port</span> 6697 <span class="org-builtin">:nick</span> <span class="org-string">"mssola"</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span>global-set-key <span class="org-rainbow-delimiters-depth-2">(</span>kbd <span class="org-string">"C-c i"</span><span class="org-rainbow-delimiters-depth-2">)</span> 'mssola-erc<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-rainbow-delimiters-unmatched">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15" class="outline-2"> -<h2 id="sec-15">Languages</h2> -<div class="outline-text-2" id="text-15"> -</div><div id="outline-container-sec-15-1" class="outline-3"> -<h3 id="sec-15-1">General</h3> -<div class="outline-text-3" id="text-15-1"> -<p> -First of all, define a function that identifies some warning keywords -(e.g. TODO). This function can then be applied to the proper mode. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">warnings-mode-hook</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"Hook for enabling the warning face on strings with a warning prefix."</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>font-lock-add-keywords nil - '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span><span class="org-string">"</span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">(</span></span><span class="org-string"><span class="org-warning">XXX</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string"><span class="org-warning">FIXME</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string"><span class="org-warning">TODO</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string"><span class="org-warning">HACK</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">|</span></span><span class="org-string"><span class="org-warning">NOTE</span></span><span class="org-string"><span class="org-regexp-grouping-backslash">\\</span></span><span class="org-string"><span class="org-regexp-grouping-construct">)</span></span><span class="org-string">"</span> - 1 font-lock-warning-face prepend<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Text mode is not a programming language, but it's used quite often in this -context too. In this case, I want spell check and <code>wc-mode</code> activated. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'text-mode-hook - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> - <span class="org-rainbow-delimiters-depth-3">(</span>flyspell-mode 1<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>wc-mode 1<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-2" class="outline-3"> -<h3 id="sec-15-2">Shell</h3> -<div class="outline-text-3" id="text-15-2"> -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> bats-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-3" class="outline-3"> -<h3 id="sec-15-3">Lisp</h3> -<div class="outline-text-3" id="text-15-3"> -<p> -Emacs lisp needs <code>rainbow-delimiters</code>, so the amount of parenthesis is less -confusing. Moreover, I'm also enabling <code>eldoc-mode</code> and the aforementioned -<code>warnings-mode-hook</code>. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'emacs-lisp-mode-hook - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> - <span class="org-rainbow-delimiters-depth-3">(</span>eldoc-mode 1<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>warnings-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>rainbow-delimiters-mode 1<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">https://github.com/jhenahan/emacs.d/blob/master/emacs-init.org#emacs-lisp</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> mode-name <span class="org-string">"ξ"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-4" class="outline-3"> -<h3 id="sec-15-4">C and C++</h3> -<div class="outline-text-3" id="text-15-4"> -<p> -C and C++ only require the <code>warnings-mode-hook</code> function, spell checking for the -comments and the usage of tabs instead of spaces. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-comment-delimiter">; </span><span class="org-comment">Note that C-common includes languages with a similar syntax of C.</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'c-mode-common-hook 'warnings-mode-hook<span class="org-rainbow-delimiters-depth-1">)</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'c-mode-common-hook <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span><span class="org-rainbow-delimiters-depth-3">()</span> <span class="org-rainbow-delimiters-depth-3">(</span>flyspell-prog-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">C</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'c-mode-hook - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> indent-tabs-mode t<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">C++</span> -<span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'c++-mode-hook - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-3">()</span> <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> indent-tabs-mode t<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -CMake for y'all. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> cmake-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> auto-mode-alist - <span class="org-rainbow-delimiters-depth-3">(</span>append - '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">"CMakeLists\\.txt\\'"</span> . cmake-mode<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - '<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-rainbow-delimiters-depth-5">(</span><span class="org-string">"\\.cmake\\'"</span> . cmake-mode<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span> - auto-mode-alist<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> cmake-font-lock - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-3">(</span>add-hook 'cmake-mode-hook 'cmake-font-lock-activate<span class="org-rainbow-delimiters-depth-3">)</span> - <span class="org-rainbow-delimiters-depth-3">(</span>add-hook 'yaml-mode-hook 'warnings-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-5" class="outline-3"> -<h3 id="sec-15-5">Ruby</h3> -<div class="outline-text-3" id="text-15-5"> -<p> -Include warning keywords in Ruby. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span>add-hook 'ruby-mode-hook 'warnings-mode-hook<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-6" class="outline-3"> -<h3 id="sec-15-6">Go</h3> -<div class="outline-text-3" id="text-15-6"> -<p> -And now my Go configuration. This includes stuff like the usage of <code>goimports</code>, -<code>gofmt</code> on save, among many other useful things. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">defun</span> <span class="org-function-name">mssola-go-mode</span> <span class="org-rainbow-delimiters-depth-2">()</span> - <span class="org-doc">"My configuration for Go mode."</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Use goimports instead of go-fmt</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> gofmt-command <span class="org-string">"goimports"</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Call Gofmt before saving</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'before-save-hook 'gofmt-before-save<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Integration flycheck with Go</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'load-path - <span class="org-rainbow-delimiters-depth-3">(</span>concat <span class="org-rainbow-delimiters-depth-4">(</span>getenv <span class="org-string">"GOPATH"</span><span class="org-rainbow-delimiters-depth-4">)</span> <span class="org-string">"/src/github.com/dougm/goflymake"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">require</span> '<span class="org-constant">go-flycheck</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>evil-leader/set-key - <span class="org-string">"."</span> 'godef-jump-other-window<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> indent-tabs-mode t<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>flyspell-prog-mode<span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">eldoc support</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> go-eldoc - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">require</span> '<span class="org-constant">go-eldoc</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> go-add-tags - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-3">(</span>evil-leader/set-key <span class="org-string">"t"</span> 'go-add-tags<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">;; </span><span class="org-comment">Go</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> go-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:pin</span> melpa-stable - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'go-mode-hook 'warnings-mode-hook<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'go-mode-hook 'go-eldoc-setup<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'go-mode-hook 'mssola-go-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-7" class="outline-3"> -<h3 id="sec-15-7">Rust</h3> -<div class="outline-text-3" id="text-15-7"> -<p> -Install <code>rust-mode</code> and add some hooks to make it friendlier. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> rust-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'before-save-hook - #'<span class="org-rainbow-delimiters-depth-3">(</span>lambda <span class="org-rainbow-delimiters-depth-4">()</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">when</span> <span class="org-rainbow-delimiters-depth-5">(</span>eq major-mode 'rust-mode<span class="org-rainbow-delimiters-depth-5">)</span> - <span class="org-rainbow-delimiters-depth-5">(</span>rust-format-buffer<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> flycheck-rust - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-3">(</span>add-hook 'flycheck-mode-hook #'flycheck-rust-setup<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-8" class="outline-3"> -<h3 id="sec-15-8">Tabs vs spaces</h3> -<div class="outline-text-3" id="text-15-8"> -<p> -Tabs or spaces? <a href="https://www.emacswiki.org/emacs/TabsSpacesBoth">Both</a>. The <code>smart-tabs-mode</code> has the philosophy of: tabs for -indentation, spaces for alignment. This is only applied in languages where I'm -usings tabs for indentation (C, C++ and Go). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> smart-tabs-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">smart-tabs-add-language-support</span> golang go-mode-hook - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-rainbow-delimiters-depth-4">(</span>c-indent-line . c-basic-offset<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>c-indent-region . c-basic-offset<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>smart-tabs-insinuate 'c 'c++ 'golang<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-9" class="outline-3"> -<h3 id="sec-15-9">Inferior markup languages.</h3> -<div class="outline-text-3" id="text-15-9"> -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-comment-delimiter">;; </span><span class="org-comment">Markdown mode with preview mode in the browser.</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> markdown-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">This is the one that I got from openSUSE.</span> - <span class="org-rainbow-delimiters-depth-2">(</span>custom-set-variables - '<span class="org-rainbow-delimiters-depth-3">(</span>markdown-command <span class="org-string">"/usr/bin/markdown-calibre"</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">Preview mode does its things through websockets, so it's a requirement.</span> - <span class="org-comment-delimiter">; </span><span class="org-comment">After that, we can safely require it.</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> websocket - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">use-package</span> markdown-preview-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-comment-delimiter">; </span><span class="org-comment">YAML</span> -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> yaml-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'yaml-mode-hook 'warnings-mode-hook<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-10" class="outline-3"> -<h3 id="sec-15-10">Web-related stuff.</h3> -<div class="outline-text-3" id="text-15-10"> -<p> -Slim and SCSS. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> slim-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> scss-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> scss-compile-at-save nil<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'yaml-mode-hook 'warnings-mode-hook<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> coffee-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Languages specific for backend code like PHP, and <code>web-mode</code>, which provides a -bundle of features which are interesting for web-related stuff. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> php-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> web-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'auto-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.erb\\'"</span> . web-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'auto-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.jinja\\'"</span> . web-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'auto-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.html?\\'"</span> . web-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'web-mode-hook - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq</span> web-mode-markup-indent-offset 2<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq</span> web-mode-css-indent-offset 2<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq</span> web-mode-code-indent-offset 2<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'js-mode-hook - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq</span> js-indent-level 2<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>rainbow-delimiters-mode 1<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> vue-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> mmm-submode-decoration-level 0<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-comment-delimiter">; </span><span class="org-comment">React: treat it as a derived mode. Idea taken from spacemacs.</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">define-derived-mode</span> <span class="org-function-name">react-mode</span> web-mode <span class="org-string">"react"</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'auto-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.jsx\\'"</span> . react-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'auto-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"\\.react.js\\'"</span> . react-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook 'react-mode-hook - <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-4">()</span> - <span class="org-rainbow-delimiters-depth-4">(</span>yas-activate-extra-mode 'js-mode<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>web-mode-set-content-type <span class="org-string">"jsx"</span><span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span><span class="org-keyword">setq-local</span> web-mode-enable-auto-quoting nil<span class="org-rainbow-delimiters-depth-4">)</span> - <span class="org-rainbow-delimiters-depth-4">(</span>rainbow-delimiters 1<span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -The <code>json-reformat</code> package provides functions for reformatting JSON strings. It -happens from time to time that I have to read JSON output from responses, and it -can be frustrating without proper formatting. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> json-reformat - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-11" class="outline-3"> -<h3 id="sec-15-11">Devops</h3> -<div class="outline-text-3" id="text-15-11"> -<p> -Highlighting for Dockerfiles. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> dockerfile-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>add-to-list 'auto-mode-alist '<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-string">"Dockerfile\\'"</span> . dockerfile-mode<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Stuff from Hashicorp like terraform and HCL. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> terraform-mode - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>terraform-format-on-save-mode<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> - -<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> hcl-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> salt-mode - <span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-12" class="outline-3"> -<h3 id="sec-15-12">Others</h3> -<div class="outline-text-3" id="text-15-12"> -<p> -The <i>soria</i> theme has the <code>soria-purple-identifiers</code> hook. This hook instructs -the theme to use purple for identifiers instead of the default color. This is a -remnant from my Vim times, and I only apply it to some languages (random -criteria really). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">dolist</span> <span class="org-rainbow-delimiters-depth-2">(</span>lang-hook '<span class="org-rainbow-delimiters-depth-3">(</span>ruby-mode-hook - php-mode-hook - perl-mode-hook - emacs-lisp-mode-hook<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>add-hook lang-hook 'soria-purple-identifiers<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-15-13" class="outline-3"> -<h3 id="sec-15-13">LaTeX</h3> -<div class="outline-text-3" id="text-15-13"> -<p> -Let's use <a href="https://www.gnu.org/software/auctex/">Auctex</a> for LaTeX files. -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> tex - <span class="org-builtin">:ensure</span> auctex - <span class="org-builtin">:config</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> TeX-auto-save t<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq</span> TeX-parse-self t<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">setq-default</span> TeX-master nil<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> -</div> - -<div id="outline-container-sec-16" class="outline-2"> -<h2 id="sec-16">WoMan</h2> -<div class="outline-text-2" id="text-16"> -<p> -<code>WoMan</code> is a package that is included inside of GNU Emacs by default, and that -takes care of visualizing man pages. Let's properly setup Evil mode for this: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">with-eval-after-load</span> <span class="org-string">"evil"</span> - <span class="org-rainbow-delimiters-depth-2">(</span>evil-set-initial-state 'woman-mode 'normal<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">evil-define-key</span> 'normal woman-mode-map - <span class="org-string">"J"</span> 'Man-next-section - <span class="org-string">"K"</span> 'Man-previous-section - <span class="org-string">"\C-h"</span> 'evil-window-left - <span class="org-string">"\C-l"</span> 'evil-window-right - <span class="org-string">"\C-j"</span> 'evil-window-down - <span class="org-string">"\C-k"</span> 'evil-window-up - <span class="org-string">"\C-u"</span> 'evil-scroll-up<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> - -<p> -Finally, I want man pages to fill all the frame: -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">setq</span> woman-fill-frame t<span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-17" class="outline-2"> -<h2 id="sec-17">Misc</h2> -<div class="outline-text-2" id="text-17"> -<p> -Install a set of useful functions from <a href="https://github.com/bbatsov">@bbatsov</a>. The bindings are following -Emacs style instead of being more Vim-like on purpose (I don't want to put -too many things into my leader and these shortcuts look sensible to me). -</p> - -<div class="org-src-container"> - -<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> crux - <span class="org-builtin">:ensure</span> t - <span class="org-builtin">:config</span> - - <span class="org-rainbow-delimiters-depth-2">(</span>global-set-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-c d"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'crux-delete-file-and-buffer<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-set-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-c r"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'crux-rename-file-and-buffer<span class="org-rainbow-delimiters-depth-2">)</span> - <span class="org-rainbow-delimiters-depth-2">(</span>global-set-key <span class="org-rainbow-delimiters-depth-3">(</span>kbd <span class="org-string">"C-c o"</span><span class="org-rainbow-delimiters-depth-3">)</span> 'crux-open-with<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> -</pre> -</div> -</div> -</div> - -<div id="outline-container-sec-18" class="outline-2"> -<h2 id="sec-18">Credits</h2> -<div class="outline-text-2" id="text-18"> -<p> -I've built this file by simply scavenging from other people's emacs.d/dotfiles -repositories. I have taken lots of pieces from here and there, but most notably: -</p> - -<ul class="org-ul"> -<li><a href="https://github.com/ereslibre/dotfiles">@ereslibre</a> -</li> -<li><a href="https://github.com/dmacvicar/dotfiles">@dmacvicar</a> -</li> -<li><a href="https://github.com/bbatsov/emacs.d">@bbatsov</a> -</li> -<li><a href="https://github.com/aaronbieber/dotfiles">@aaronbieber</a> -</li> -<li><a href="https://github.com/purcell/emacs.d">@purcell</a> -</li> -<li><a href="https://github.com/sachac/.emacs.d">@sachac</a> (<a href="http://pages.sachachua.com/.emacs.d/Sacha.html">HTML version</a>) -</li> -<li><a href="https://github.com/larstvei/dot-emacs">@larstvei</a> -</li> -</ul> -</div> -</div> - -<div id="outline-container-sec-19" class="outline-2"> -<h2 id="sec-19">License</h2> -<div class="outline-text-2" id="text-19"> -<div class="org-src-container"> - -<pre class="src src-text">Copyright (C) 2014-2018 Miquel Sabaté Solà <a href="mailto:mikisabate%40gmail.com"><mikisabate@gmail.com></a> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <a href="http://www.gnu.org/licenses/"><http://www.gnu.org/licenses/></a>. -</pre> -</div> -</div> -</div> -</div> -<div id="postamble" class="status"> -<p class="author">Author: Miquel Sabaté Solà</p> -<p class="date">Created: 2018-02-14 Wed 13:15</p> -<p class="creator"><a href="http://www.gnu.org/software/emacs/">Emacs</a> 25.3.1 (<a href="http://orgmode.org">Org</a> mode 8.2.10)</p> -<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p> -</div> -</body> -</html> |
