55 lines
5.9 KiB
Plaintext
55 lines
5.9 KiB
Plaintext
<p>If you are using the same configuration on multiple systems there’s a chance that your preferred font is not available on some of them. That’s why it’s a good idea to check whether some font is around prior to trying to use it. Fortunately, that’s 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 it’s certainly going to find a
|
||
decent font out-of-the-box. And because I’m 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 I’ll end up using
|
||
it, regardless of the operating system in question.</p>
|
||
|
||
<p>We can make the font-selection code prettier, but that’s 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 you’re 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, that’s 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 it’s easy to simply check if some font is in this list. I’ll leave it to you to decide which approach is easier/better.</p>
|
||
|
||
<p>That’s all I have for you today. Keep hacking!</p> |