diff options
| author | Miquel Sabaté Solà <msabate@suse.com> | 2017-01-31 15:31:19 +0100 |
|---|---|---|
| committer | Miquel Sabaté Solà <msabate@suse.com> | 2017-01-31 15:31:19 +0100 |
| commit | 29d6092d4800f551e69054913e2f15ffb089af1b (patch) | |
| tree | ea1ff19a1dafa3ee4776ca01c31c65e8229a5a19 /emacs | |
| parent | d69d16ec10ef22f11eeee74cf7617bc6abfac81f (diff) | |
| download | dotfiles-29d6092d4800f551e69054913e2f15ffb089af1b.tar.gz dotfiles-29d6092d4800f551e69054913e2f15ffb089af1b.zip | |
emacs: be more verbose on the explanation behind Evil mode
Signed-off-by: Miquel Sabaté Solà <msabate@suse.com>
Diffstat (limited to 'emacs')
| -rw-r--r-- | emacs/custom.el | 2 | ||||
| -rw-r--r-- | emacs/init.html | 202 | ||||
| -rw-r--r-- | emacs/init.org | 374 |
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 & 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/">< </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 |
