mirror of
https://github.com/SqrtMinusOne/sqrtminusone.github.io.git
synced 2025-12-11 00:03:02 +03:00
deploy: 143e88c08d
This commit is contained in:
parent
74451f1001
commit
293718b303
5 changed files with 264 additions and 7 deletions
|
|
@ -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 & 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 & 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">"\\.php\\'"</span>)
|
||||
</span></span><span style="display:flex;"><span> :mode <span style="color:#e6db74">"\\.php\\'"</span>
|
||||
</span></span><span style="display:flex;"><span> :config
|
||||
</span></span><span style="display:flex;"><span> (add-hook <span style="color:#e6db74">'php-mode-hook</span> <span style="color:#a6e22e">#'</span>smartparens-mode)
|
||||
</span></span><span style="display:flex;"><span> (add-hook <span style="color:#e6db74">'php-mode-hook</span> <span style="color:#a6e22e">#'</span>lsp)
|
||||
</span></span><span style="display:flex;"><span> (my/set-smartparens-indent <span style="color:#e6db74">'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’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">"="</span> <span style="color:#e6db74">'dired-narrow</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"-"</span> <span style="color:#e6db74">'dired-create-empty-file</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"~"</span> <span style="color:#e6db74">'vterm</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"M-r"</span> <span style="color:#e6db74">'wdired-change-to-wdired-mode</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"<left>"</span> <span style="color:#e6db74">'dired-up-directory</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"<right>"</span> <span style="color:#e6db74">'dired-find-file</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"M-<return>"</span> <span style="color:#e6db74">'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">"Can't load mail.el"</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">"Face for the elfeed entries with tag \"blogs\""</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">"Face for the elfeed entries with tag \"blogs\""</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">'yellow</span>))
|
||||
</span></span><span style="display:flex;"><span> (elfeed-videos-entry :foreground (doom-color <span style="color:#e6db74">'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">'magenta</span>))
|
||||
</span></span><span style="display:flex;"><span> (elfeed-music-entry :foreground (doom-color <span style="color:#e6db74">'green</span>))
|
||||
</span></span><span style="display:flex;"><span> (elfeed-podcasts-entry :foreground (doom-color <span style="color:#e6db74">'yellow</span>))
|
||||
</span></span><span style="display:flex;"><span> (elfeed-blogs-entry :foreground (doom-color <span style="color:#e6db74">'orange</span>)))
|
||||
</span></span><span style="display:flex;"><span> (elfeed-blogs-entry :foreground (doom-color <span style="color:#e6db74">'orange</span>))
|
||||
</span></span><span style="display:flex;"><span> (elfeed-govt-entry :foreground (doom-color <span style="color:#e6db74">'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">'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">'</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">'</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">'eww-mode-map</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"+"</span> <span style="color:#e6db74">'text-scale-increase</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"-"</span> <span style="color:#e6db74">'text-scale-decrease</span>)
|
||||
</span></span></code></pre></div><h4 id="reader-view-and-pdfs">Reader View & 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">"rdrview"</span>))
|
||||
</span></span><span style="display:flex;"><span> (proc (<span style="color:#a6e22e">start-process</span> <span style="color:#e6db74">"rdrview"</span> buffer <span style="color:#e6db74">"rdrview"</span>
|
||||
</span></span><span style="display:flex;"><span> url <span style="color:#e6db74">"-T"</span> <span style="color:#e6db74">"title,sitename,body"</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"-H"</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">'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">'exit</span>) (<span style="color:#a6e22e">></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">'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">"Error in rdrview: %s"</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><h2></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">"readability-page-1"</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">'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">'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">'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">'h2</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">'h1</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">'h3</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">'h2</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">'h4</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">'h3</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">'h5</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">'h4</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#e6db74">'h6</span> (setf (<span style="color:#a6e22e">car</span> el) <span style="color:#e6db74">'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">"rdrview.tex"</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">&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">"/tmp/%d.pdf"</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">"/tmp/%d.%s"</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">"--variable"</span> params)
|
||||
</span></span><span style="display:flex;"><span> (push (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">"%s=%s"</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">#'start-process</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"pandoc"</span> (<span style="color:#a6e22e">get-buffer-create</span> <span style="color:#e6db74">"*Pandoc*"</span>) <span style="color:#e6db74">"pandoc"</span>
|
||||
</span></span><span style="display:flex;"><span> temp-file-name <span style="color:#e6db74">"-o"</span> file-name
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"--pdf-engine=xelatex"</span> <span style="color:#e6db74">"--template"</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">'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">"Done!"</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">'exit</span>) (<span style="color:#a6e22e">></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">'signal</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">user-error</span> <span style="color:#e6db74">"Error in pandoc. Check the *Pandoc* buffer"</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">"english"</span>)
|
||||
</span></span><span style="display:flex;"><span> (other-lang <span style="color:#e6db74">"russian"</span>))
|
||||
</span></span><span style="display:flex;"><span> (when (string-match-p (rx <span style="color:#e6db74">".ru"</span>) url)
|
||||
</span></span><span style="display:flex;"><span> (setq main-lang <span style="color:#e6db74">"russian"</span>
|
||||
</span></span><span style="display:flex;"><span> other-lang <span style="color:#e6db74">"english"</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">"URL: "</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">"URL is empty"</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">'content</span> data)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">'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">'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">'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">"xdg-open"</span> <span style="color:#66d9ef">nil</span> <span style="color:#e6db74">"xdg-open"</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’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">"~/.elfeed/pdf/"</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">#'symbol-name</span> (elfeed-entry-tags entry) <span style="color:#e6db74">", "</span>))
|
||||
</span></span><span style="display:flex;"><span> (date (<span style="color:#a6e22e">format-time-string</span> <span style="color:#e6db74">"%a, %e %b %Y"</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">".pdf"</span>))
|
||||
</span></span><span style="display:flex;"><span> (main-language <span style="color:#e6db74">"english"</span>)
|
||||
</span></span><span style="display:flex;"><span> (other-language <span style="color:#e6db74">"russian"</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">"No content!"</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">", "</span>) <span style="color:#e6db74">"\\\\"</span> feed-title))))
|
||||
</span></span><span style="display:flex;"><span> (when (<span style="color:#a6e22e">member</span> <span style="color:#e6db74">'ru</span> (elfeed-entry-tags entry))
|
||||
</span></span><span style="display:flex;"><span> (setq main-language <span style="color:#e6db74">"russian"</span>)
|
||||
</span></span><span style="display:flex;"><span> (setq other-language <span style="color:#e6db74">"english"</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">"xdg-open"</span> <span style="color:#66d9ef">nil</span> <span style="color:#e6db74">"xdg-open"</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’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">"No elfeed entry in this buffer!"</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">#'symbol-name</span> tags <span style="color:#e6db74">", "</span>))
|
||||
</span></span><span style="display:flex;"><span> (nicedate (<span style="color:#a6e22e">format-time-string</span> <span style="color:#e6db74">"%a, %e %b %Y %T %Z"</span> date))
|
||||
</span></span><span style="display:flex;"><span> (content (alist-get <span style="color:#e6db74">'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">"Title: %s\n"</span> <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'message-header-name</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> title <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'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">"Author: %s\n"</span> <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'message-header-name</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> formatted <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'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">"Date: %s\n"</span> <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'message-header-name</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> nicedate <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'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">"Feed: %s\n"</span> <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'message-header-name</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> feed-title <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'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">"Tags: %s\n"</span> <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'message-header-name</span>)
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">propertize</span> tagsstr <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'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">"Link: "</span> <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'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">"\n"</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">"Enclosure: "</span> <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'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">"\n"</span>))
|
||||
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">insert</span> <span style="color:#e6db74">"\n"</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">"(empty)\n"</span> <span style="color:#e6db74">'face</span> <span style="color:#e6db74">'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">'elfeed</span>
|
||||
</span></span><span style="display:flex;"><span> (general-define-key
|
||||
</span></span><span style="display:flex;"><span> :states <span style="color:#f92672">'</span>(normal)
|
||||
</span></span><span style="display:flex;"><span> :keymaps <span style="color:#e6db74">'elfeed-show-mode-map</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"gp"</span> <span style="color:#a6e22e">#'</span>my/rdrview-elfeed-show
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">"gv"</span> <span style="color:#a6e22e">#'</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
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
||||
|
|
|
|||
BIN
stats/all.png
BIN
stats/all.png
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 |
Loading…
Add table
Reference in a new issue