emacs/var/elfeed/db/data/b6/b69dad57c1626e0a6389d04842631c1702ced7bf
2022-01-03 12:49:32 -06:00

55 lines
5.9 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<p>If you are using the same configuration on multiple systems theres a chance that your preferred font is not available on some of them. Thats why its a good idea to check whether some font is around prior to trying to use it. Fortunately, thats trivial with Emacs Lisp:</p>
<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">cond</span>
<span class="p">((</span><span class="nv">find-font</span> <span class="p">(</span><span class="nv">font-spec</span> <span class="ss">:name</span> <span class="s">"Cascadia Code"</span><span class="p">))</span>
<span class="p">(</span><span class="nv">set-frame-font</span> <span class="s">"Cascadia Code-12"</span><span class="p">))</span>
<span class="p">((</span><span class="nv">find-font</span> <span class="p">(</span><span class="nv">font-spec</span> <span class="ss">:name</span> <span class="s">"Menlo"</span><span class="p">))</span>
<span class="p">(</span><span class="nv">set-frame-font</span> <span class="s">"Menlo-12"</span><span class="p">))</span>
<span class="p">((</span><span class="nv">find-font</span> <span class="p">(</span><span class="nv">font-spec</span> <span class="ss">:name</span> <span class="s">"DejaVu Sans Mono"</span><span class="p">))</span>
<span class="p">(</span><span class="nv">set-frame-font</span> <span class="s">"DejaVu Sans Mono-12"</span><span class="p">))</span>
<span class="p">((</span><span class="nv">find-font</span> <span class="p">(</span><span class="nv">font-spec</span> <span class="ss">:name</span> <span class="s">"Inconsolata"</span><span class="p">))</span>
<span class="p">(</span><span class="nv">set-frame-font</span> <span class="s">"Inconsolata-12"</span><span class="p">)))</span>
</code></pre></div></div>
<p>Basically <code class="language-plaintext highlighter-rouge">font-spec</code> creates a font spec from whatever parameters are passed to it
and <code class="language-plaintext highlighter-rouge">find-font</code> will look for a font matching the font spec in question. For our
purposes all we need to do is use the <code class="language-plaintext highlighter-rouge">:name</code> parameter for <code class="language-plaintext highlighter-rouge">font-spec</code>.</p>
<p>In this list I have (great) fonts that are available by default on Windows,
macOS and Linux, so wherever I run my config its certainly going to find a
decent font out-of-the-box. And because Im not doing any checks like <code class="language-plaintext highlighter-rouge">(eq system-type
'gnu/linux)</code>, if I have installed my favorite font manually Ill end up using
it, regardless of the operating system in question.</p>
<p>We can make the font-selection code prettier, but thats not the point
today. All I want for you is to learn how useful the functions <code class="language-plaintext highlighter-rouge">find-font</code> and
<code class="language-plaintext highlighter-rouge">font-spec</code> are when youre building a truly portable Emacs configuration.
Probably the most important simplification we can do at this point is extracting a <code class="language-plaintext highlighter-rouge">fond-available-p</code> helper function:</p>
<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">font-available-p</span> <span class="p">(</span><span class="nv">font-name</span><span class="p">)</span>
<span class="p">(</span><span class="nv">find-font</span> <span class="p">(</span><span class="nv">font-spec</span> <span class="ss">:name</span> <span class="nv">font-name</span><span class="p">)))</span>
<span class="p">(</span><span class="nb">cond</span>
<span class="p">((</span><span class="nv">font-available-p</span> <span class="s">"Cascadia Code"</span><span class="p">)</span>
<span class="p">(</span><span class="nv">set-frame-font</span> <span class="s">"Cascadia Code-12"</span><span class="p">))</span>
<span class="p">((</span><span class="nv">font-available-p</span> <span class="s">"Menlo"</span><span class="p">)</span>
<span class="p">(</span><span class="nv">set-frame-font</span> <span class="s">"Menlo-12"</span><span class="p">))</span>
<span class="p">((</span><span class="nv">font-available-p</span> <span class="s">"DejaVu Sans Mono"</span><span class="p">)</span>
<span class="p">(</span><span class="nv">set-frame-font</span> <span class="s">"DejaVu Sans Mono-12"</span><span class="p">))</span>
<span class="p">((</span><span class="nv">font-available-p</span> <span class="s">"Inconsolata"</span><span class="p">)</span>
<span class="p">(</span><span class="nv">set-frame-font</span> <span class="s">"Inconsolata-12"</span><span class="p">)))</span>
</code></pre></div></div>
<p>By the way, thats not the only way to check if a font is available in
Emacs. Alternatively we can use something like this:</p>
<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">member</span> <span class="s">"Cascadia Code"</span> <span class="p">(</span><span class="nv">font-family-list</span><span class="p">))</span>
<span class="p">(</span><span class="nb">defun</span> <span class="nv">font-available-p</span> <span class="p">(</span><span class="nv">font-name</span><span class="p">)</span>
<span class="p">(</span><span class="nb">member</span> <span class="nv">font-name</span> <span class="p">(</span><span class="nv">font-family-list</span><span class="p">)))</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">font-family-list</code> returns a list of all the font families that are available,
so its easy to simply check if some font is in this list. Ill leave it to you to decide which approach is easier/better.</p>
<p>Thats all I have for you today. Keep hacking!</p>