aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--emacs/custom.el2
-rw-r--r--emacs/init.html202
-rw-r--r--emacs/init.org374
3 files changed, 354 insertions, 224 deletions
diff --git a/emacs/custom.el b/emacs/custom.el
index 8eed56f..432ab18 100644
--- a/emacs/custom.el
+++ b/emacs/custom.el
@@ -7,7 +7,7 @@
["#1c1c1c" "#d78787" "#b9dc92" "#ffffaf" "#87afd7" "#875f87" "#dfafdf" "#d0d0d0"])
'(custom-safe-themes
(quote
- ("5869e98ef7446c9e2283e5788c0f6e2790676bdb52e9e1e112bb74e2415733c4" "5a3f33eefbcf2a3098bafd22d7ad44358e66c3e844797e7bf9ef552a08dfeb6f" default)))
+ ("8e6f5b61626315a98a6b38acfe966800777bf6a1841aa2b812b471772cc17114" "5869e98ef7446c9e2283e5788c0f6e2790676bdb52e9e1e112bb74e2415733c4" "5a3f33eefbcf2a3098bafd22d7ad44358e66c3e844797e7bf9ef552a08dfeb6f" default)))
'(delete-selection-mode nil)
'(magit-commit-arguments (quote ("--all" "--verbose" "--signoff")))
'(magit-log-arguments (quote ("--graph" "--color" "--decorate" "-n256")))
diff --git a/emacs/init.html b/emacs/init.html
index e588ccf..10cfed1 100644
--- a/emacs/init.html
+++ b/emacs/init.html
@@ -4,7 +4,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>mssola's GNU Emacs configuration</title>
-<!-- 2017-01-29 Sun 23:05 -->
+<!-- 2017-01-30 Mon 10:37 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="generator" content="Org-mode" />
<meta name="author" content="Miquel Sabaté Solà" />
@@ -803,7 +803,12 @@ Then, for keeping up with my projects I use the Projectile + Helm combination.
<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">helm-projectile</span>
<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-rainbow-delimiters-depth-1">)</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>
@@ -1081,7 +1086,7 @@ whenever I use it, I want basic evil movement.
</div>
<p>
-That being said, I also extend <code>dired</code> with some handy tweaks.
+I also extend <code>dired</code> with some handy tweaks.
</p>
<div class="org-src-container">
@@ -1132,11 +1137,15 @@ from the <a href="https://www.djcbsoftware.nl/code/mu/mu4e/Dired.html#Dired">mu4
<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 block includes some heavy-lifting so
+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>
@@ -1158,11 +1167,6 @@ Evil extensions.
<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">Helm + Projectile shortcuts.</span>
- <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">with-eval-after-load</span> 'helm-projectile
- <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-comment-delimiter">; </span><span class="org-comment">I use the Super key in combination with j &amp; 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>
@@ -1203,8 +1207,16 @@ Evil extensions.
<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">
-<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">evil</span>
+<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">evil</span>
<span class="org-builtin">:ensure</span> t
<span class="org-builtin">:config</span>
@@ -1222,54 +1234,108 @@ Evil extensions.
<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>
- <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">evil-leader</span>
- <span class="org-builtin">:ensure</span> t
- <span class="org-builtin">:config</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>global-evil-leader-mode<span class="org-rainbow-delimiters-depth-3">)</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>evil-leader/set-leader <span class="org-string">","</span><span class="org-rainbow-delimiters-depth-3">)</span>
- <span class="org-rainbow-delimiters-depth-3">(</span><span class="org-keyword">setq</span> evil-leader/in-all-states 1<span class="org-rainbow-delimiters-depth-3">)</span>
- <span class="org-rainbow-delimiters-depth-3">(</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-4">(</span><span class="org-keyword">lambda</span> <span class="org-rainbow-delimiters-depth-5">()</span> <span class="org-rainbow-delimiters-depth-5">(</span><span class="org-keyword">interactive</span><span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-rainbow-delimiters-depth-5">(</span>split-window-right<span class="org-rainbow-delimiters-depth-5">)</span> <span class="org-rainbow-delimiters-depth-5">(</span>other-window 1<span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</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-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> <span class="org-constant">evil-surround</span>
- <span class="org-builtin">:ensure</span> t
- <span class="org-builtin">:config</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>global-evil-surround-mode 1<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
+<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>
- <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">evil-commentary</span>
- <span class="org-builtin">:ensure</span> t
- <span class="org-builtin">:config</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>evil-commentary-mode t<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
+<div class="org-src-container">
- <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">evil-args</span>
- <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>
+<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">evil-leader</span>
+ <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>
- <span class="org-comment-delimiter">;; </span><span class="org-comment">Bind evil-args text objects</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-inner-text-objects-map <span class="org-string">"a"</span> 'evil-inner-arg<span class="org-rainbow-delimiters-depth-3">)</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-outer-text-objects-map <span class="org-string">"a"</span> 'evil-outer-arg<span class="org-rainbow-delimiters-depth-3">)</span>
+<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>
- <span class="org-comment-delimiter">;; </span><span class="org-comment">Bind evil-forward/backward-args</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-normal-state-map <span class="org-string">"L"</span> 'evil-forward-arg<span class="org-rainbow-delimiters-depth-3">)</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-normal-state-map <span class="org-string">"H"</span> 'evil-backward-arg<span class="org-rainbow-delimiters-depth-3">)</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-motion-state-map <span class="org-string">"L"</span> 'evil-forward-arg<span class="org-rainbow-delimiters-depth-3">)</span>
- <span class="org-rainbow-delimiters-depth-3">(</span>define-key evil-motion-state-map <span class="org-string">"H"</span> 'evil-backward-arg<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>
+<div class="org-src-container">
- <span class="org-rainbow-delimiters-depth-2">(</span><span class="org-keyword">use-package</span> <span class="org-constant">evil-numbers</span>
- <span class="org-builtin">:ensure</span> t
- <span class="org-builtin">:config</span>
- <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-a"</span><span class="org-rainbow-delimiters-depth-4">)</span> 'evil-numbers/inc-at-pt<span class="org-rainbow-delimiters-depth-3">)</span>
- <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-c -"</span><span class="org-rainbow-delimiters-depth-4">)</span> 'evil-numbers/dec-at-pt<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 class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">evil-surround</span>
+ <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> <span class="org-constant">evil-commentary</span>
+ <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> <span class="org-constant">evil-args</span>
+ <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> <span class="org-constant">evil-numbers</span>
+ <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>
@@ -2007,7 +2073,7 @@ I'm giving ERC a chance. First of all, I'm setting up basic stuff.
</div>
<p>
-Setup desktop notifications.
+I want to have a desktop notification whenever someone mentions my name.
</p>
<div class="org-src-container">
@@ -2033,18 +2099,23 @@ Setup desktop notifications.
</div>
<p>
-Add some helper packages and update the loaded ERC modules.
+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>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>
-
-<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">erc-hl-nicks</span>
+<pre class="src src-elisp"><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">erc-hl-nicks</span>
<span class="org-builtin">:ensure</span> t<span class="org-rainbow-delimiters-depth-1">)</span>
+</pre>
+</div>
+
+<p>
+Some extra cookies: allow ERC to display images and Youtube thumbnails.
+</p>
-<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-keyword">use-package</span> <span class="org-constant">erc-yt</span>
+<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> <span class="org-constant">erc-yt</span>
<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
@@ -2059,6 +2130,17 @@ Add some helper packages and update the loaded ERC modules.
</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>
And now define a function to connect to both IRC servers.
</p>
@@ -2439,7 +2521,7 @@ along with this program. If not, see <a href="http://www.gnu.org/licenses/">&lt
</div>
<div id="postamble" class="status">
<p class="author">Author: Miquel Sabaté Solà</p>
-<p class="date">Created: 2017-01-29 Sun 23:05</p>
+<p class="date">Created: 2017-01-30 Mon 10:37</p>
<p class="creator"><a href="http://www.gnu.org/software/emacs/">Emacs</a> 25.1.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>
diff --git a/emacs/init.org b/emacs/init.org
index 36b22ab..10c8f52 100644
--- a/emacs/init.org
+++ b/emacs/init.org
@@ -425,52 +425,57 @@ Ayo silver!
Then, for keeping up with my projects I use the Projectile + Helm combination.
#+BEGIN_SRC elisp
- (use-package projectile
- :ensure t
- :config
- (projectile-mode 1)
- (setq projectile-mode-line
- '(:eval (format " %s" (projectile-project-name)))))
+(use-package projectile
+ :ensure t
+ :config
+ (projectile-mode 1)
+ (setq projectile-mode-line
+ '(:eval (format " %s" (projectile-project-name)))))
- (use-package helm
- :ensure t
- :config
- (setq projectile-completion-system 'helm)
+(use-package helm
+ :ensure t
+ :config
+ (setq projectile-completion-system 'helm)
- ; Allow the search pattern to be on the header. Taken from this Reddit thread:
- ; https://www.reddit.com/r/emacs/comments/3asbyn/new_and_very_useful_helm_feature_enter_search/
- (setq helm-echo-input-in-header-line t)
+ ; Allow the search pattern to be on the header. Taken from this Reddit thread:
+ ; https://www.reddit.com/r/emacs/comments/3asbyn/new_and_very_useful_helm_feature_enter_search/
+ (setq helm-echo-input-in-header-line t)
- (defun helm-hide-minibuffer-maybe ()
- "Hide the minibuffer if we are in a Helm session"
+ (defun helm-hide-minibuffer-maybe ()
+ "Hide the minibuffer if we are in a Helm session"
- (when (with-helm-buffer helm-echo-input-in-header-line)
- (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
- (overlay-put ov 'window (selected-window))
- (overlay-put ov 'face (let ((bg-color (face-background 'default nil)))
- `(:background ,bg-color :foreground ,bg-color)))
- (setq-local cursor-type nil))))
+ (when (with-helm-buffer helm-echo-input-in-header-line)
+ (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
+ (overlay-put ov 'window (selected-window))
+ (overlay-put ov 'face (let ((bg-color (face-background 'default nil)))
+ `(:background ,bg-color :foreground ,bg-color)))
+ (setq-local cursor-type nil))))
- (add-hook 'helm-minibuffer-set-up-hook 'helm-hide-minibuffer-maybe)
- (setq helm-split-window-in-side-p t)
+ (add-hook 'helm-minibuffer-set-up-hook 'helm-hide-minibuffer-maybe)
+ (setq helm-split-window-in-side-p t)
- ; Preview files with tab
- (define-key helm-map (kbd "<tab>") 'helm-execute-persistent-action)
+ ; Preview files with tab
+ (define-key helm-map (kbd "<tab>") 'helm-execute-persistent-action)
- ; Show available options
- (define-key helm-map (kbd "C-a") 'helm-select-action)
+ ; Show available options
+ (define-key helm-map (kbd "C-a") 'helm-select-action)
- ; Some vim-like bindings
- (define-key helm-map (kbd "C-j") 'helm-next-line)
- (define-key helm-map (kbd "C-k") 'helm-previous-line)
+ ; Some vim-like bindings
+ (define-key helm-map (kbd "C-j") 'helm-next-line)
+ (define-key helm-map (kbd "C-k") 'helm-previous-line)
- (use-package helm-ag
- :ensure t))
+ (use-package helm-ag
+ :ensure t))
- (use-package helm-projectile
- :ensure t
- :config
- (helm-projectile-on))
+(use-package helm-projectile
+ :ensure t
+ :config
+ (helm-projectile-on)
+
+ ; Define M-p as a way to quickly list all the available projects.
+ (with-eval-after-load 'evil
+ (define-key evil-normal-state-map (kbd "M-p")
+ 'helm-projectile-switch-project)))
#+END_SRC
I use @@html:<kbd>C-p</kbd>@@ as the binding for listing relevant files. This
@@ -688,7 +693,7 @@ whenever I use it, I want basic evil movement.
(kbd "w") 'evil-forward-word-begin))
#+END_SRC
-That being said, I also extend =dired= with some handy tweaks.
+I also extend =dired= with some handy tweaks.
#+BEGIN_SRC elisp
(setq directory-free-space-args "-Pkh"
@@ -728,142 +733,177 @@ from the [[https://www.djcbsoftware.nl/code/mu/mu4e/Dired.html#Dired][mu4e docum
Forgive me, [[https://stallman.org/saint.html][Father]], 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 block includes some heavy-lifting so
+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.
+First of all, let's define a function that will be called whenever Evil is loaded.
+
#+BEGIN_SRC elisp
- (defun mssola-evil ()
- "Configure evil mode."
-
- ; We can safely remap <C-u> because the counting will be handled a-la Vim.
- (define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up)
-
- ; Make window navigation easier.
- (define-key evil-normal-state-map (kbd "C-j") 'evil-window-down)
- (define-key evil-normal-state-map (kbd "C-k") 'evil-window-up)
- (define-key evil-normal-state-map (kbd "C-l") 'evil-window-right)
- (define-key evil-normal-state-map (kbd "C-h") 'evil-window-left)
-
- ; The window navigation tweaks effectively wipe out the help prefix, which
- ; is bad. Fortunately we can workaround this by providing "M-h" as the new
- ; help prefix. This prefix is only used in emacs mode to mark lines, which is
- ; something already handled by Evil.
- (define-key global-map (kbd "M-h") 'help-command)
- (fset 'help-command help-map)
-
- ; Helm + Projectile shortcuts.
- (with-eval-after-load 'helm-projectile
- (define-key evil-normal-state-map (kbd "M-p")
- 'helm-projectile-switch-project))
-
- ; I use the Super key in combination with j & k to move around i3. Let's unset
- ; M- combos for these two fellows for whenever I misstype them.
- (global-unset-key (kbd "M-j"))
- (global-unset-key (kbd "M-k"))
-
- ; both this function and the subsequent lines about [escape] are taken from
- ; @aaronbieber configuration.
- (defun minibuffer-keyboard-quit ()
- "Abort recursive edit.
- In Delete Selection mode, if the mark is active, just deactivate it;
- then it takes a second \\[keyboard-quit] to abort the minibuffer."
- (interactive)
- (if (and delete-selection-mode transient-mark-mode mark-active)
- (setq deactivate-mark t)
- (when (get-buffer "*Completions*") (delete-windows-on "*Completions*"))
- (abort-recursive-edit)))
-
- ;; Make escape quit everything, whenever possible.
- (define-key evil-normal-state-map [escape] 'keyboard-quit)
- (define-key evil-visual-state-map [escape] 'keyboard-quit)
- (define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
- (define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
- (define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
- (define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
- (define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
-
- ; I store macros on the <q> register for convenience, so I used to use the
- ; <C-q> combo to execute this macro in Vim. In Emacs though, this combo is
- ; reserved to a rather useful function, and I'd like to keep it that way. So,
- ; now the mapping is set to <C-2> (mnemonic: where the @ symbol is). Moreover,
- ; it's applied as many times as specified by the numeric prefix argument.
- (define-key evil-normal-state-map (kbd "C-2")
- (lambda (n)
- (interactive "p")
- (evil-execute-macro n "@q")))
-
- ; C-s: switch to normal mode and save the buffer. I know :)
- (define-key evil-normal-state-map (kbd "C-s") 'save-buffer)
- (define-key evil-insert-state-map (kbd "C-s")
- (lambda () (interactive) (save-buffer) (evil-force-normal-state))))
-
- (use-package evil
+(defun mssola-evil ()
+ "Configure evil mode."
+
+ ; We can safely remap <C-u> because the counting will be handled a-la Vim.
+ (define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up)
+
+ ; Make window navigation easier.
+ (define-key evil-normal-state-map (kbd "C-j") 'evil-window-down)
+ (define-key evil-normal-state-map (kbd "C-k") 'evil-window-up)
+ (define-key evil-normal-state-map (kbd "C-l") 'evil-window-right)
+ (define-key evil-normal-state-map (kbd "C-h") 'evil-window-left)
+
+ ; The window navigation tweaks effectively wipe out the help prefix, which
+ ; is bad. Fortunately we can workaround this by providing "M-h" as the new
+ ; help prefix. This prefix is only used in emacs mode to mark lines, which is
+ ; something already handled by Evil.
+ (define-key global-map (kbd "M-h") 'help-command)
+ (fset 'help-command help-map)
+
+ ; I use the Super key in combination with j & k to move around i3. Let's unset
+ ; M- combos for these two fellows for whenever I misstype them.
+ (global-unset-key (kbd "M-j"))
+ (global-unset-key (kbd "M-k"))
+
+ ; both this function and the subsequent lines about [escape] are taken from
+ ; @aaronbieber configuration.
+ (defun minibuffer-keyboard-quit ()
+ "Abort recursive edit.
+In Delete Selection mode, if the mark is active, just deactivate it;
+then it takes a second \\[keyboard-quit] to abort the minibuffer."
+ (interactive)
+ (if (and delete-selection-mode transient-mark-mode mark-active)
+ (setq deactivate-mark t)
+ (when (get-buffer "*Completions*") (delete-windows-on "*Completions*"))
+ (abort-recursive-edit)))
+
+ ;; Make escape quit everything, whenever possible.
+ (define-key evil-normal-state-map [escape] 'keyboard-quit)
+ (define-key evil-visual-state-map [escape] 'keyboard-quit)
+ (define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
+ (define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
+ (define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
+ (define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
+ (define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
+
+ ; I store macros on the <q> register for convenience, so I used to use the
+ ; <C-q> combo to execute this macro in Vim. In Emacs though, this combo is
+ ; reserved to a rather useful function, and I'd like to keep it that way. So,
+ ; now the mapping is set to <C-2> (mnemonic: where the @ symbol is). Moreover,
+ ; it's applied as many times as specified by the numeric prefix argument.
+ (define-key evil-normal-state-map (kbd "C-2")
+ (lambda (n)
+ (interactive "p")
+ (evil-execute-macro n "@q")))
+
+ ; C-s: switch to normal mode and save the buffer. I know :)
+ (define-key evil-normal-state-map (kbd "C-s") 'save-buffer)
+ (define-key evil-insert-state-map (kbd "C-s")
+ (lambda () (interactive) (save-buffer) (evil-force-normal-state))))
+#+END_SRC
+
+Now make sure that Evil is installed, and call the relevant configuration functions.
+
+#+BEGIN_SRC elisp
+(use-package evil
+ :ensure t
+ :config
+
+ (add-hook 'evil-mode-hook 'mssola-evil)
+ (evil-mode 1)
+
+ ;; C-z is unused and it's close to my beloved C-c. Since I don't want to mess
+ ;; with one of the most sacred Emacs prefixes, I'm moving to C-z.
+ (define-key key-translation-map (kbd "C-z") [escape])
+ (define-key evil-operator-state-map (kbd "C-z") 'keyboard-quit)
+ (set-quit-char "C-z")
+
+ ;; Use the proper initial evil state for the following modes.
+ (evil-set-initial-state 'help-mode 'normal)
+ (evil-set-initial-state 'debugger-mode 'normal)
+ (evil-set-initial-state 'describe-mode 'normal)
+ (evil-set-initial-state 'Buffer-menu-mode 'normal)
+#+END_SRC
+
+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
+=evil-leader= package, which brings the @@html:<kbd>leader</kbd>@@ feature from
+Vim into Evil.
+
+#+BEGIN_SRC elisp
+ (use-package evil-leader
:ensure t
:config
+ (global-evil-leader-mode)
+ (evil-leader/set-leader ",")
+ (setq evil-leader/in-all-states 1)
+ (evil-leader/set-key
+ "," 'back-to-indentation
+ "c" 'delete-window
+ "k" 'kill-buffer-and-window
+ "v" 'split-window-right
+ "V" (lambda () (interactive) (split-window-right) (other-window 1))
+ "f" 'flycheck-list-errors
+ "e" 'eval-last-sexp
+ "b" 'view-buffer
+ "o" 'browse-url-at-point))
+#+END_SRC
+
+Another handy Vim plugin that has made it into Evil is =evil-surround=, 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).
- (add-hook 'evil-mode-hook 'mssola-evil)
- (evil-mode 1)
+#+BEGIN_SRC elisp
+ (use-package evil-surround
+ :ensure t
+ :config
+ (global-evil-surround-mode 1))
+#+END_SRC
- ;; C-z is unused and it's close to my beloved C-c. Since I don't want to mess
- ;; with one of the most sacred Emacs prefixes, I'm moving to C-z.
- (define-key key-translation-map (kbd "C-z") [escape])
- (define-key evil-operator-state-map (kbd "C-z") 'keyboard-quit)
- (set-quit-char "C-z")
+Next is another Vim plugin that has been ported to Evil: =evil-commentary=. This
+package defines a new motion for comments, which is bound to
+@@html:<kbd>gc</kbd>@@. So, for example, @@html:<kbd>gcc</kbd>@@ will comment
+the current line, regardless of the programming language.
- ;; Use the proper initial evil state for the following modes.
- (evil-set-initial-state 'help-mode 'normal)
- (evil-set-initial-state 'debugger-mode 'normal)
- (evil-set-initial-state 'describe-mode 'normal)
- (evil-set-initial-state 'Buffer-menu-mode 'normal)
+#+BEGIN_SRC elisp
+ (use-package evil-commentary
+ :ensure t
+ :config
+ (evil-commentary-mode t))
+#+END_SRC
- (use-package evil-leader
- :ensure t
- :config
- (global-evil-leader-mode)
- (evil-leader/set-leader ",")
- (setq evil-leader/in-all-states 1)
- (evil-leader/set-key
- "," 'back-to-indentation
- "c" 'delete-window
- "k" 'kill-buffer-and-window
- "v" 'split-window-right
- "V" (lambda () (interactive) (split-window-right) (other-window 1))
- "f" 'flycheck-list-errors
- "e" 'eval-last-sexp
- "b" 'view-buffer
- "o" 'browse-url-at-point))
-
- (use-package evil-surround
- :ensure t
- :config
- (global-evil-surround-mode 1))
+Another cool package is =evil-args= which defines the argument text object. This
+text object can be targeted with the =a= character, and we can move backward and
+forward through arguments with @@html:<kbd>H</kbd>@@ and @@html:<kbd>L</kbd>@@
+respectively.
- (use-package evil-commentary
- :ensure t
- :config
- (evil-commentary-mode t))
+#+BEGIN_SRC elisp
+ (use-package evil-args
+ :ensure t
+ :config
+ ; Configuration taken from the documentation of evil-args.
- (use-package evil-args
- :ensure t
- :config
- ; Configuration taken from the documentation of evil-args.
+ ;; Bind evil-args text objects
+ (define-key evil-inner-text-objects-map "a" 'evil-inner-arg)
+ (define-key evil-outer-text-objects-map "a" 'evil-outer-arg)
- ;; Bind evil-args text objects
- (define-key evil-inner-text-objects-map "a" 'evil-inner-arg)
- (define-key evil-outer-text-objects-map "a" 'evil-outer-arg)
+ ;; Bind evil-forward/backward-args
+ (define-key evil-normal-state-map "L" 'evil-forward-arg)
+ (define-key evil-normal-state-map "H" 'evil-backward-arg)
+ (define-key evil-motion-state-map "L" 'evil-forward-arg)
+ (define-key evil-motion-state-map "H" 'evil-backward-arg))
+#+END_SRC
- ;; Bind evil-forward/backward-args
- (define-key evil-normal-state-map "L" 'evil-forward-arg)
- (define-key evil-normal-state-map "H" 'evil-backward-arg)
- (define-key evil-motion-state-map "L" 'evil-forward-arg)
- (define-key evil-motion-state-map "H" 'evil-backward-arg))
+Last but not least, =evil-numbers= brings a couple of bindings available to Vim
+into Evil: @@html:<kbd>C-a</kbd>@@ for increasing a number, and
+@@html:<kbd>C-c -</kbd>@@ for decreasing it (modified because
+@@html:<kbd>C-z</kbd>@@ is my escape sequence).
- (use-package evil-numbers
- :ensure t
- :config
- (define-key evil-normal-state-map (kbd "C-a") 'evil-numbers/inc-at-pt)
- (define-key evil-normal-state-map (kbd "C-c -") 'evil-numbers/dec-at-pt)))
+#+BEGIN_SRC elisp
+ (use-package evil-numbers
+ :ensure t
+ :config
+ (define-key evil-normal-state-map (kbd "C-a") 'evil-numbers/inc-at-pt)
+ (define-key evil-normal-state-map (kbd "C-c -") 'evil-numbers/dec-at-pt)))
#+END_SRC
* Magit
@@ -1450,7 +1490,7 @@ I'm giving ERC a chance. First of all, I'm setting up basic stuff.
("*.suse.de" "#suse" "#docker")))
#+END_SRC
-Setup desktop notifications.
+I want to have a desktop notification whenever someone mentions my name.
#+BEGIN_SRC elisp
(require 'notifications)
@@ -1472,15 +1512,16 @@ Setup desktop notifications.
(add-hook 'erc-text-matched-hook 'erc-global-notify))
#+END_SRC
-Add some helper packages and update the loaded ERC modules.
+Use the =erc-hl-nicks= package, so highlight support for nicknames is better.
#+BEGIN_SRC elisp
- (add-hook 'erc-connect-pre-hook
- (lambda (x) (erc-update-modules)))
-
(use-package erc-hl-nicks
:ensure t)
+#+END_SRC
+Some extra cookies: allow ERC to display images and Youtube thumbnails.
+
+#+BEGIN_SRC elisp
(use-package erc-yt
:ensure t
:init
@@ -1494,6 +1535,13 @@ Add some helper packages and update the loaded ERC modules.
(add-to-list 'erc-modules 'image)))
#+END_SRC
+At this point, we can safely update all the loaded ERC modules.
+
+#+BEGIN_SRC elisp
+ (add-hook 'erc-connect-pre-hook
+ (lambda (x) (erc-update-modules)))
+#+END_SRC
+
And now define a function to connect to both IRC servers.
#+BEGIN_SRC elisp