This commit is contained in:
SqrtMinusOne 2022-04-30 17:23:00 +00:00
parent 74451f1001
commit 293718b303
5 changed files with 264 additions and 7 deletions

View file

@ -522,6 +522,7 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
<li><a href="#notmuch">Notmuch</a></li>
<li><a href="#elfeed">Elfeed</a>
<ul>
<li><a href="#general-settings">General settings</a></li>
<li><a href="#some-additions">Some additions</a></li>
<li><a href="#custom-faces">Custom faces</a></li>
<li><a href="#elfeed-summary">elfeed-summary</a></li>
@ -541,6 +542,14 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
</li>
<li><a href="#ytel">ytel</a></li>
<li><a href="#eww">EWW</a></li>
<li><a href="#reader-view-and-pdfs">Reader View &amp; PDFs</a>
<ul>
<li><a href="#rdrview">rdrview</a></li>
<li><a href="#opening-stuff-in-pdf-viewer">Opening stuff in PDF viewer</a></li>
<li><a href="#rendering-elfeed-entries-as-pdfs">Rendering elfeed entries as PDFs</a></li>
<li><a href="#viewing-elfeed-entries-view-rdrview">Viewing elfeed entries view rdrview</a></li>
</ul>
</li>
<li><a href="#erc">ERC</a></li>
<li><a href="#ement-dot-el">ement.el</a></li>
<li><a href="#off--jabber"><span class="org-todo done OFF">OFF</span> (OFF) jabber</a></li>
@ -637,7 +646,9 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
</table>
<h2 id="bootstrap">Bootstrap</h2>
<p>Setting up the environment, performance tuning and a few basic settings.</p>
<h3 id="packages">Packages</h3>
<p>First things first, lexical binding.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span><span style="color:#75715e">;;; -*- lexical-binding: t -*-</span>
</span></span></code></pre></div><h3 id="packages">Packages</h3>
<h4 id="straight-dot-el">straight.el</h4>
<p>Straight.el is my Emacs package manager of choice. Its advantages &amp; disadvantages over other options are listed pretty thoroughly in the README file in the repo.</p>
<p>The following is a straight.el bootstrap script.</p>
@ -2555,7 +2566,11 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
</span></span></code></pre></div><h4 id="php">PHP</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package php-mode
</span></span><span style="display:flex;"><span> :straight <span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span> :mode <span style="color:#e6db74">&#34;\\.php\\&#39;&#34;</span>)
</span></span><span style="display:flex;"><span> :mode <span style="color:#e6db74">&#34;\\.php\\&#39;&#34;</span>
</span></span><span style="display:flex;"><span> :config
</span></span><span style="display:flex;"><span> (add-hook <span style="color:#e6db74">&#39;php-mode-hook</span> <span style="color:#a6e22e">#&#39;</span>smartparens-mode)
</span></span><span style="display:flex;"><span> (add-hook <span style="color:#e6db74">&#39;php-mode-hook</span> <span style="color:#a6e22e">#&#39;</span>lsp)
</span></span><span style="display:flex;"><span> (my/set-smartparens-indent <span style="color:#e6db74">&#39;php-mode</span>))
</span></span></code></pre></div><h3 id="latex">LaTeX</h3>
<h4 id="auctex">AUCTeX</h4>
<p>The best LaTeX editing environment I&rsquo;ve found so far.</p>
@ -4782,6 +4797,7 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;=&#34;</span> <span style="color:#e6db74">&#39;dired-narrow</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;-&#34;</span> <span style="color:#e6db74">&#39;dired-create-empty-file</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;~&#34;</span> <span style="color:#e6db74">&#39;vterm</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;M-r&#34;</span> <span style="color:#e6db74">&#39;wdired-change-to-wdired-mode</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;&lt;left&gt;&#34;</span> <span style="color:#e6db74">&#39;dired-up-directory</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;&lt;right&gt;&#34;</span> <span style="color:#e6db74">&#39;dired-find-file</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;M-&lt;return&gt;&#34;</span> <span style="color:#e6db74">&#39;dired-open-xdg</span>))
@ -5250,6 +5266,7 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
</span></span><span style="display:flex;"><span> (load-file mail-file)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">message</span> <span style="color:#e6db74">&#34;Can&#39;t load mail.el&#34;</span>))))
</span></span></code></pre></div><h4 id="elfeed">Elfeed</h4>
<h5 id="general-settings">General settings</h5>
<p><a href="https://github.com/skeeto/elfeed">elfeed</a> is an Emacs RSS client.</p>
<p>The advice there sets <code>shr-use-fonts</code> to nil while rendering HTML, so the <code>elfeed-show</code> buffer will use monospace font.</p>
<p>Using my own fork until the modifications are merged into master.</p>
@ -5326,6 +5343,9 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
</span></span><span style="display:flex;"><span>(defface elfeed-blogs-entry <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;Face for the elfeed entries with tag \&#34;blogs\&#34;&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(defface elfeed-govt-entry <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;Face for the elfeed entries with tag \&#34;blogs\&#34;&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(my/use-doom-colors
</span></span><span style="display:flex;"><span> (elfeed-search-tag-face :foreground (doom-color <span style="color:#e6db74">&#39;yellow</span>))
</span></span><span style="display:flex;"><span> (elfeed-videos-entry :foreground (doom-color <span style="color:#e6db74">&#39;red</span>))
@ -5333,13 +5353,15 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
</span></span><span style="display:flex;"><span> (elfeed-emacs-entry :foreground (doom-color <span style="color:#e6db74">&#39;magenta</span>))
</span></span><span style="display:flex;"><span> (elfeed-music-entry :foreground (doom-color <span style="color:#e6db74">&#39;green</span>))
</span></span><span style="display:flex;"><span> (elfeed-podcasts-entry :foreground (doom-color <span style="color:#e6db74">&#39;yellow</span>))
</span></span><span style="display:flex;"><span> (elfeed-blogs-entry :foreground (doom-color <span style="color:#e6db74">&#39;orange</span>)))
</span></span><span style="display:flex;"><span> (elfeed-blogs-entry :foreground (doom-color <span style="color:#e6db74">&#39;orange</span>))
</span></span><span style="display:flex;"><span> (elfeed-govt-entry :foreground (doom-color <span style="color:#e6db74">&#39;dark-cyan</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(with-eval-after-load <span style="color:#e6db74">&#39;elfeed</span>
</span></span><span style="display:flex;"><span> (setq elfeed-search-face-alist
</span></span><span style="display:flex;"><span> <span style="color:#f92672">&#39;</span>((twitter elfeed-twitter-entry)
</span></span><span style="display:flex;"><span> (podcasts elfeed-podcasts-entry)
</span></span><span style="display:flex;"><span> <span style="color:#f92672">&#39;</span>((podcasts elfeed-podcasts-entry)
</span></span><span style="display:flex;"><span> (music elfeed-music-entry)
</span></span><span style="display:flex;"><span> (gov elfeed-govt-entry)
</span></span><span style="display:flex;"><span> (twitter elfeed-twitter-entry)
</span></span><span style="display:flex;"><span> (videos elfeed-videos-entry)
</span></span><span style="display:flex;"><span> (emacs elfeed-emacs-entry)
</span></span><span style="display:flex;"><span> (blogs elfeed-blogs-entry)
@ -5364,7 +5386,9 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
<p>The default interface of elfeed is just a list of all entries, so it gets hard to navigate when there are a lot of sources with varying frequencies of posts. This is my attempt to address this issue.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package elfeed-summary
</span></span><span style="display:flex;"><span> :commands (elfeed-summary)
</span></span><span style="display:flex;"><span> :straight <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span> :straight <span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span> :config
</span></span><span style="display:flex;"><span> (setq elfeed-summary-filter-by-title <span style="color:#66d9ef">t</span>))
</span></span></code></pre></div><h5 id="elfeed-score">elfeed-score</h5>
<p><a href="https://github.com/sp1ff/elfeed-score">elfeed-score</a> is a package that implements scoring for the elfeed entries. Entries are scored by a set of rules for tags/title/content/etc and sorted by that score.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(defun my/elfeed-toggle-score-sort ()
@ -5709,6 +5733,239 @@ One thing where Emacs is particularly good is writing Lisp code, e.g. Clojure, C
</span></span><span style="display:flex;"><span> :keymaps <span style="color:#e6db74">&#39;eww-mode-map</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;+&#34;</span> <span style="color:#e6db74">&#39;text-scale-increase</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;-&#34;</span> <span style="color:#e6db74">&#39;text-scale-decrease</span>)
</span></span></code></pre></div><h4 id="reader-view-and-pdfs">Reader View &amp; PDFs</h4>
<h5 id="rdrview">rdrview</h5>
<p><a href="https://github.com/eafer/rdrview">rdrview</a> is a command-line tool that provides Firefox Reader view as a command-line tool. A Guix definition is available in <a href="https://github.com/SqrtMinusOne/channel-q">my Guix channel</a>.</p>
<p>The basic idea here is to take an arbitrary web page and convert it to PDF via pandoc.</p>
<p>So, first we need to get the <code>rdrview</code> representation of the URL:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(defun my/rdrview-get (url callback)
</span></span><span style="display:flex;"><span> (let* ((buffer (generate-new-buffer <span style="color:#e6db74">&#34;rdrview&#34;</span>))
</span></span><span style="display:flex;"><span> (proc (<span style="color:#a6e22e">start-process</span> <span style="color:#e6db74">&#34;rdrview&#34;</span> buffer <span style="color:#e6db74">&#34;rdrview&#34;</span>
</span></span><span style="display:flex;"><span> url <span style="color:#e6db74">&#34;-T&#34;</span> <span style="color:#e6db74">&#34;title,sitename,body&#34;</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;-H&#34;</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">set-process-sentinel</span>
</span></span><span style="display:flex;"><span> proc
</span></span><span style="display:flex;"><span> (lambda (process _msg)
</span></span><span style="display:flex;"><span> (let ((status (<span style="color:#a6e22e">process-status</span> process))
</span></span><span style="display:flex;"><span> (code (<span style="color:#a6e22e">process-exit-status</span> process)))
</span></span><span style="display:flex;"><span> (cond ((and (<span style="color:#a6e22e">eq</span> status <span style="color:#e6db74">&#39;exit</span>) (<span style="color:#a6e22e">=</span> code <span style="color:#ae81ff">0</span>))
</span></span><span style="display:flex;"><span> (progn
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">funcall</span> callback
</span></span><span style="display:flex;"><span> (with-current-buffer (<span style="color:#a6e22e">process-buffer</span> process)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">buffer-string</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">kill-buffer</span> (<span style="color:#a6e22e">process-buffer</span> process))) )
</span></span><span style="display:flex;"><span> ((or (and (<span style="color:#a6e22e">eq</span> status <span style="color:#e6db74">&#39;exit</span>) (<span style="color:#a6e22e">&gt;</span> code <span style="color:#ae81ff">0</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">eq</span> status <span style="color:#e6db74">&#39;signal</span>))
</span></span><span style="display:flex;"><span> (let ((err (with-current-buffer (<span style="color:#a6e22e">process-buffer</span> process)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">buffer-string</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">kill-buffer</span> (<span style="color:#a6e22e">process-buffer</span> process))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">user-error</span> <span style="color:#e6db74">&#34;Error in rdrview: %s&#34;</span> err)))))))
</span></span><span style="display:flex;"><span> proc))
</span></span></code></pre></div><p>After that, process the rdrview output. First, it outputs metadata to the resulting HTML, so this part parses the DOM and retrieves the header and the name of the site.</p>
<p>Second, for some reason the header enumeration starts with <code>&lt;h2&gt;</code>, so this also shifts headers up by one.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(defun my/rdrview-parse (dom-string)
</span></span><span style="display:flex;"><span> (let ((dom (with-temp-buffer
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> dom-string)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">libxml-parse-html-region</span> (<span style="color:#a6e22e">point-min</span>) (<span style="color:#a6e22e">point-max</span>)))))
</span></span><span style="display:flex;"><span> (let (title sitename content)
</span></span><span style="display:flex;"><span> (dolist (child (dom-children (<span style="color:#a6e22e">car</span> (dom-by-id dom <span style="color:#e6db74">&#34;readability-page-1&#34;</span>))))
</span></span><span style="display:flex;"><span> (when (<span style="color:#a6e22e">listp</span> child)
</span></span><span style="display:flex;"><span> (cond
</span></span><span style="display:flex;"><span> ((<span style="color:#a6e22e">eq</span> (<span style="color:#a6e22e">car</span> child) <span style="color:#e6db74">&#39;h1</span>)
</span></span><span style="display:flex;"><span> (setq title (dom-text child)))
</span></span><span style="display:flex;"><span> ((<span style="color:#a6e22e">eq</span> (<span style="color:#a6e22e">car</span> child) <span style="color:#e6db74">&#39;h2</span>)
</span></span><span style="display:flex;"><span> (setq sitename (dom-text child)))
</span></span><span style="display:flex;"><span> ((<span style="color:#a6e22e">eq</span> (<span style="color:#a6e22e">car</span> child) <span style="color:#e6db74">&#39;div</span>)
</span></span><span style="display:flex;"><span> (setq content child)))))
</span></span><span style="display:flex;"><span> (dom-search
</span></span><span style="display:flex;"><span> content
</span></span><span style="display:flex;"><span> (lambda (el)
</span></span><span style="display:flex;"><span> (when (<span style="color:#a6e22e">listp</span> el)
</span></span><span style="display:flex;"><span> (pcase (<span style="color:#a6e22e">car</span> el)
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">&#39;h2</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">&#39;h1</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">&#39;h3</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">&#39;h2</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">&#39;h4</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">&#39;h3</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">&#39;h5</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">&#39;h4</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">&#39;h6</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">&#39;h5</span>))))))
</span></span><span style="display:flex;"><span> <span style="color:#f92672">`</span>((title <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>title)
</span></span><span style="display:flex;"><span> (sitename <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>sitename)
</span></span><span style="display:flex;"><span> (content <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(with-temp-buffer
</span></span><span style="display:flex;"><span> (dom-print content)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">buffer-string</span>)))))))
</span></span></code></pre></div><h5 id="opening-stuff-in-pdf-viewer">Opening stuff in PDF viewer</h5>
<p>Now, we need to render the resulting HTML to a pdf. To do that, we can use <code>pandoc</code> with a <a href=".emacs.d/rdrview.tex">custom template</a>.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setq my/rdrview-template (<span style="color:#a6e22e">expand-file-name</span>
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">concat</span> user-emacs-directory <span style="color:#e6db74">&#34;rdrview.tex&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(cl-defun my/rdrview-render (content type variables callback
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">&amp;key</span> file-name overwrite)
</span></span><span style="display:flex;"><span> (unless file-name
</span></span><span style="display:flex;"><span> (setq file-name (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34;/tmp/%d.pdf&#34;</span> (<span style="color:#a6e22e">random</span> <span style="color:#ae81ff">100000000</span>))))
</span></span><span style="display:flex;"><span> (let (params
</span></span><span style="display:flex;"><span> (temp-file-name (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34;/tmp/%d.%s&#34;</span> (<span style="color:#a6e22e">random</span> <span style="color:#ae81ff">100000000</span>) type)))
</span></span><span style="display:flex;"><span> (cl-loop for (key <span style="color:#f92672">.</span> value) in variables
</span></span><span style="display:flex;"><span> when value
</span></span><span style="display:flex;"><span> do (progn
</span></span><span style="display:flex;"><span> (push <span style="color:#e6db74">&#34;--variable&#34;</span> params)
</span></span><span style="display:flex;"><span> (push (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34;%s=%s&#34;</span> key value) params)))
</span></span><span style="display:flex;"><span> (setq params (<span style="color:#a6e22e">nreverse</span> params))
</span></span><span style="display:flex;"><span> (if (and (<span style="color:#a6e22e">file-exists-p</span> file-name) (not overwrite))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">funcall</span> callback file-name)
</span></span><span style="display:flex;"><span> (with-temp-file temp-file-name
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> content))
</span></span><span style="display:flex;"><span> (let ((proc (<span style="color:#a6e22e">apply</span> <span style="color:#a6e22e">#&#39;start-process</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;pandoc&#34;</span> (<span style="color:#a6e22e">get-buffer-create</span> <span style="color:#e6db74">&#34;*Pandoc*&#34;</span>) <span style="color:#e6db74">&#34;pandoc&#34;</span>
</span></span><span style="display:flex;"><span> temp-file-name <span style="color:#e6db74">&#34;-o&#34;</span> file-name
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;--pdf-engine=xelatex&#34;</span> <span style="color:#e6db74">&#34;--template&#34;</span> my/rdrview-template
</span></span><span style="display:flex;"><span> params)))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">set-process-sentinel</span>
</span></span><span style="display:flex;"><span> proc
</span></span><span style="display:flex;"><span> (lambda (process _msg)
</span></span><span style="display:flex;"><span> (let ((status (<span style="color:#a6e22e">process-status</span> process))
</span></span><span style="display:flex;"><span> (code (<span style="color:#a6e22e">process-exit-status</span> process)))
</span></span><span style="display:flex;"><span> (cond ((and (<span style="color:#a6e22e">eq</span> status <span style="color:#e6db74">&#39;exit</span>) (<span style="color:#a6e22e">=</span> code <span style="color:#ae81ff">0</span>))
</span></span><span style="display:flex;"><span> (progn
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">message</span> <span style="color:#e6db74">&#34;Done!&#34;</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">funcall</span> callback file-name)))
</span></span><span style="display:flex;"><span> ((or (and (<span style="color:#a6e22e">eq</span> status <span style="color:#e6db74">&#39;exit</span>) (<span style="color:#a6e22e">&gt;</span> code <span style="color:#ae81ff">0</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">eq</span> status <span style="color:#e6db74">&#39;signal</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">user-error</span> <span style="color:#e6db74">&#34;Error in pandoc. Check the *Pandoc* buffer&#34;</span>))))))))))
</span></span></code></pre></div><p>And putting all of this together to get a PDF representation of an arbitrary URL.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(defun my/get-languages (url)
</span></span><span style="display:flex;"><span> (let ((main-lang <span style="color:#e6db74">&#34;english&#34;</span>)
</span></span><span style="display:flex;"><span> (other-lang <span style="color:#e6db74">&#34;russian&#34;</span>))
</span></span><span style="display:flex;"><span> (when (string-match-p (rx <span style="color:#e6db74">&#34;.ru&#34;</span>) url)
</span></span><span style="display:flex;"><span> (setq main-lang <span style="color:#e6db74">&#34;russian&#34;</span>
</span></span><span style="display:flex;"><span> other-lang <span style="color:#e6db74">&#34;english&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">list</span> main-lang other-lang)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(defun my/rdrview-open (url overwrite)
</span></span><span style="display:flex;"><span> (interactive
</span></span><span style="display:flex;"><span> (let ((url (<span style="color:#a6e22e">read-from-minibuffer</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;URL: &#34;</span>
</span></span><span style="display:flex;"><span> (if (bound-and-true-p elfeed-show-entry)
</span></span><span style="display:flex;"><span> (elfeed-entry-link elfeed-show-entry)))))
</span></span><span style="display:flex;"><span> (when (string-empty-p url)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">user-error</span> <span style="color:#e6db74">&#34;URL is empty&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">list</span> url current-prefix-arg)))
</span></span><span style="display:flex;"><span> (my/rdrview-get
</span></span><span style="display:flex;"><span> url
</span></span><span style="display:flex;"><span> (lambda (res)
</span></span><span style="display:flex;"><span> (let ((data (my/rdrview-parse res))
</span></span><span style="display:flex;"><span> (langs (my/get-languages url)))
</span></span><span style="display:flex;"><span> (my/rdrview-render
</span></span><span style="display:flex;"><span> (alist-get <span style="color:#e6db74">&#39;content</span> data)
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#39;html</span>
</span></span><span style="display:flex;"><span> <span style="color:#f92672">`</span>((title <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(alist-get <span style="color:#e6db74">&#39;title</span> data))
</span></span><span style="display:flex;"><span> (subtitle <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(alist-get <span style="color:#e6db74">&#39;sitename</span> data))
</span></span><span style="display:flex;"><span> (main-lang <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(<span style="color:#a6e22e">nth</span> <span style="color:#ae81ff">0</span> langs))
</span></span><span style="display:flex;"><span> (other-lang <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(<span style="color:#a6e22e">nth</span> <span style="color:#ae81ff">1</span> langs)))
</span></span><span style="display:flex;"><span> (lambda (file-name)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">start-process</span> <span style="color:#e6db74">&#34;xdg-open&#34;</span> <span style="color:#66d9ef">nil</span> <span style="color:#e6db74">&#34;xdg-open&#34;</span> file-name)))))))
</span></span></code></pre></div><h5 id="rendering-elfeed-entries-as-pdfs">Rendering elfeed entries as PDFs</h5>
<p>This also goes really well with elfeed, because for these RSS feeds that have a well-formed HTML part there&rsquo;s even no need to invoke <code>rdrview</code>, we can just feed the HTML to <code>pandoc</code>.</p>
<p>TODO escape title</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setq my/elfeed-pdf-dir (<span style="color:#a6e22e">expand-file-name</span> <span style="color:#e6db74">&#34;~/.elfeed/pdf/&#34;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(defun my/elfeed-open-pdf (entry overwrite)
</span></span><span style="display:flex;"><span> (interactive (<span style="color:#a6e22e">list</span> elfeed-show-entry current-prefix-arg))
</span></span><span style="display:flex;"><span> (let ((authors (<span style="color:#a6e22e">mapcar</span> (lambda (m) (<span style="color:#a6e22e">plist-get</span> m :name)) (elfeed-meta entry :authors)))
</span></span><span style="display:flex;"><span> (feed-title (elfeed-feed-title (elfeed-entry-feed entry)))
</span></span><span style="display:flex;"><span> (tags (<span style="color:#a6e22e">mapconcat</span> <span style="color:#a6e22e">#&#39;symbol-name</span> (elfeed-entry-tags entry) <span style="color:#e6db74">&#34;, &#34;</span>))
</span></span><span style="display:flex;"><span> (date (<span style="color:#a6e22e">format-time-string</span> <span style="color:#e6db74">&#34;%a, %e %b %Y&#34;</span> (seconds-to-time (elfeed-entry-date entry))))
</span></span><span style="display:flex;"><span> (content (elfeed-deref (elfeed-entry-content entry)))
</span></span><span style="display:flex;"><span> (file-name (<span style="color:#a6e22e">concat</span> my/elfeed-pdf-dir
</span></span><span style="display:flex;"><span> (elfeed-ref-id (elfeed-entry-content entry))
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;.pdf&#34;</span>))
</span></span><span style="display:flex;"><span> (main-language <span style="color:#e6db74">&#34;english&#34;</span>)
</span></span><span style="display:flex;"><span> (other-language <span style="color:#e6db74">&#34;russian&#34;</span>))
</span></span><span style="display:flex;"><span> (unless content
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">user-error</span> <span style="color:#e6db74">&#34;No content!&#34;</span>))
</span></span><span style="display:flex;"><span> (setq subtitle
</span></span><span style="display:flex;"><span> (cond
</span></span><span style="display:flex;"><span> ((seq-empty-p authors) feed-title)
</span></span><span style="display:flex;"><span> ((and (not (seq-empty-p (<span style="color:#a6e22e">car</span> authors)))
</span></span><span style="display:flex;"><span> (string-match-p (<span style="color:#a6e22e">regexp-quote</span> (<span style="color:#a6e22e">car</span> authors)) feed-title)) feed-title)
</span></span><span style="display:flex;"><span> (<span style="color:#66d9ef">t</span> (<span style="color:#a6e22e">concat</span> (string-join authors <span style="color:#e6db74">&#34;, &#34;</span>) <span style="color:#e6db74">&#34;\\\\&#34;</span> feed-title))))
</span></span><span style="display:flex;"><span> (when (<span style="color:#a6e22e">member</span> <span style="color:#e6db74">&#39;ru</span> (elfeed-entry-tags entry))
</span></span><span style="display:flex;"><span> (setq main-language <span style="color:#e6db74">&#34;russian&#34;</span>)
</span></span><span style="display:flex;"><span> (setq other-language <span style="color:#e6db74">&#34;english&#34;</span>))
</span></span><span style="display:flex;"><span> (my/rdrview-render
</span></span><span style="display:flex;"><span> (if (bound-and-true-p my/elfeed-show-rdrview-html)
</span></span><span style="display:flex;"><span> my/elfeed-show-rdrview-html
</span></span><span style="display:flex;"><span> content)
</span></span><span style="display:flex;"><span> (elfeed-entry-content-type entry)
</span></span><span style="display:flex;"><span> <span style="color:#f92672">`</span>((title <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(elfeed-entry-title entry))
</span></span><span style="display:flex;"><span> (subtitle <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>subtitle)
</span></span><span style="display:flex;"><span> (date <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>date)
</span></span><span style="display:flex;"><span> (tags <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>tags)
</span></span><span style="display:flex;"><span> (main-lang <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>main-language)
</span></span><span style="display:flex;"><span> (other-lang <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>other-language))
</span></span><span style="display:flex;"><span> (lambda (file-name)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">start-process</span> <span style="color:#e6db74">&#34;xdg-open&#34;</span> <span style="color:#66d9ef">nil</span> <span style="color:#e6db74">&#34;xdg-open&#34;</span> file-name))
</span></span><span style="display:flex;"><span> :file-name file-name
</span></span><span style="display:flex;"><span> :overwrite current-prefix-arg)))
</span></span></code></pre></div><h5 id="viewing-elfeed-entries-view-rdrview">Viewing elfeed entries view rdrview</h5>
<p>However, in some cases RSS feeds supply only a short description of the content instead of the actual content. If that&rsquo;s the case, we can use <code>rdrview</code> to replace the actual content.</p>
<p>So, the following is the corresponding modification of <code>elfeed-show-refresh--mail-style</code> function:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(defvar-local my/elfeed-show-rdrview-html <span style="color:#66d9ef">nil</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(defun my/rdrview-elfeed-show ()
</span></span><span style="display:flex;"><span> (interactive)
</span></span><span style="display:flex;"><span> (unless elfeed-show-entry
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">user-error</span> <span style="color:#e6db74">&#34;No elfeed entry in this buffer!&#34;</span>))
</span></span><span style="display:flex;"><span> (my/rdrview-get
</span></span><span style="display:flex;"><span> (elfeed-entry-link elfeed-show-entry)
</span></span><span style="display:flex;"><span> (lambda (result)
</span></span><span style="display:flex;"><span> (let* ((data (my/rdrview-parse result))
</span></span><span style="display:flex;"><span> (inhibit-read-only <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span> (title (elfeed-entry-title elfeed-show-entry))
</span></span><span style="display:flex;"><span> (date (seconds-to-time (elfeed-entry-date elfeed-show-entry)))
</span></span><span style="display:flex;"><span> (authors (elfeed-meta elfeed-show-entry :authors))
</span></span><span style="display:flex;"><span> (link (elfeed-entry-link elfeed-show-entry))
</span></span><span style="display:flex;"><span> (tags (elfeed-entry-tags elfeed-show-entry))
</span></span><span style="display:flex;"><span> (tagsstr (<span style="color:#a6e22e">mapconcat</span> <span style="color:#a6e22e">#&#39;symbol-name</span> tags <span style="color:#e6db74">&#34;, &#34;</span>))
</span></span><span style="display:flex;"><span> (nicedate (<span style="color:#a6e22e">format-time-string</span> <span style="color:#e6db74">&#34;%a, %e %b %Y %T %Z&#34;</span> date))
</span></span><span style="display:flex;"><span> (content (alist-get <span style="color:#e6db74">&#39;content</span> data))
</span></span><span style="display:flex;"><span> (feed (elfeed-entry-feed elfeed-show-entry))
</span></span><span style="display:flex;"><span> (feed-title (elfeed-feed-title feed))
</span></span><span style="display:flex;"><span> (base (and feed (elfeed-compute-base (elfeed-feed-url feed)))))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">erase-buffer</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> (<span style="color:#a6e22e">format</span> (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;Title: %s\n&#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-name</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> title <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-subject</span>)))
</span></span><span style="display:flex;"><span> (when elfeed-show-entry-author
</span></span><span style="display:flex;"><span> (dolist (author authors)
</span></span><span style="display:flex;"><span> (let ((formatted (elfeed--show-format-author author)))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span>
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">format</span> (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;Author: %s\n&#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-name</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> formatted <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-to</span>))))))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> (<span style="color:#a6e22e">format</span> (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;Date: %s\n&#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-name</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> nicedate <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-other</span>)))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> (<span style="color:#a6e22e">format</span> (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;Feed: %s\n&#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-name</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> feed-title <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-other</span>)))
</span></span><span style="display:flex;"><span> (when tags
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> (<span style="color:#a6e22e">format</span> (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;Tags: %s\n&#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-name</span>)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> tagsstr <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-other</span>))))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;Link: &#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-name</span>))
</span></span><span style="display:flex;"><span> (elfeed-insert-link link link)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> <span style="color:#e6db74">&#34;\n&#34;</span>)
</span></span><span style="display:flex;"><span> (cl-loop for enclosure in (elfeed-entry-enclosures elfeed-show-entry)
</span></span><span style="display:flex;"><span> do (<span style="color:#a6e22e">insert</span> (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;Enclosure: &#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;message-header-name</span>))
</span></span><span style="display:flex;"><span> do (elfeed-insert-link (<span style="color:#a6e22e">car</span> enclosure))
</span></span><span style="display:flex;"><span> do (<span style="color:#a6e22e">insert</span> <span style="color:#e6db74">&#34;\n&#34;</span>))
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> <span style="color:#e6db74">&#34;\n&#34;</span>)
</span></span><span style="display:flex;"><span> (if content
</span></span><span style="display:flex;"><span> (elfeed-insert-html content base)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;(empty)\n&#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;italic</span>)))
</span></span><span style="display:flex;"><span> (setq-local my/elfeed-show-rdrview-html content)
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">goto-char</span> (<span style="color:#a6e22e">point-min</span>))))))
</span></span></code></pre></div><p>Setting keybindings for elfeed:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(with-eval-after-load <span style="color:#e6db74">&#39;elfeed</span>
</span></span><span style="display:flex;"><span> (general-define-key
</span></span><span style="display:flex;"><span> :states <span style="color:#f92672">&#39;</span>(normal)
</span></span><span style="display:flex;"><span> :keymaps <span style="color:#e6db74">&#39;elfeed-show-mode-map</span>
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;gp&#34;</span> <span style="color:#a6e22e">#&#39;</span>my/rdrview-elfeed-show
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;gv&#34;</span> <span style="color:#a6e22e">#&#39;</span>my/elfeed-open-pdf))
</span></span></code></pre></div><h4 id="erc">ERC</h4>
<p>ERC is a built-it Emacs IRC client.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package erc

View file

@ -1,6 +1,6 @@
<!DOCTYPE html>
<html lang=""><head>
<meta name="generator" content="Hugo 0.97.3" />
<meta name="generator" content="Hugo 0.98.0" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB