
<feed xmlns="http://www.w3.org/2005/Atom">
    <generator>Hugo -- gohugo.io</generator>
    <title>
                elisp on
            
        
        The Neo-Babbage Files</title>
        <link href="https://babbagefiles.xyz/categories/elisp/atom.xml" rel="self" type="application/atom+xml" /><link href="https://babbagefiles.xyz/categories/elisp/"/>
    <updated>2025-12-29T11:00:32+00:00</updated>
    <author>
            <name>Benjamin Slade</name>
            
                <email>slade@lambda-y.net</email>
            </author>
    <id>https://babbagefiles.xyz/categories/elisp/</id>
        
        <entry>
            <title type="html"><![CDATA[Equake: A Geas on Gnomish Smiths]]></title>
            <link href="https://babbagefiles.xyz/equake-geas-on-gnomish-smiths/"/>
            <id>https://babbagefiles.xyz/equake-geas-on-gnomish-smiths/</id>
            
                    <author>
                        <name>Benjamin Slade</name>
                    </author>
            <published>2022-06-08T10:54:00-06:00</published>
            <updated>2022-06-26T20:20:14-06:00</updated>
            
            
            <content type="html"><![CDATA[<p>A new version of <a href="https://gitlab.com/emacsomancer/equake">Equake</a>, the drop-down &ldquo;terminal emulator&rdquo; for Emacs, should be hitting Melpa shortly. This version includes a number of bug fixes, and some new features.</p>
<p><a href="https://github.com/jeffkowalski">Jeff Kowalski</a> added code for a <a href="https://gitlab.com/emacsomancer/equake/-/merge_requests/8">&ldquo;close Equake frame on loss of focus
feature&rdquo;</a> (similar to the <a href="https://github.com/lanoxx/tilda">Tilda</a> feature) and a number of bug fixes and code-cleanup.</p>
<p>Further: I&rsquo;m (half-)jokingly calling this the <strong>Geas on Gnomish Smiths</strong> release as I&rsquo;ve finally figured out how to make it behave properly under GNOME Shell Wayland.</p>
<p>To my knowledge, the only other currently working drop-down terminal
for GNOME Shell Wayland is the JavaScript GNOME extension
<a href="https://github.com/amezin/gnome-shell-extension-ddterm">ddterm</a>. Wayland (at least GNOME Shell&rsquo;s Wayland) seems very
restrictive in how non-user-initiated events can affect window
properties. E.g., it is difficult to programmatically affect window focus in GNOME Shell under Wayland. The default &ldquo;hide window&rdquo; behaviour of Equake doesn&rsquo;t work.</p>
<p>However, I did have a legacy feature where closing/hiding Equake involved destroying the frame rather than hiding it. This is somewhat complicated, as re-invoking Equake then involves creating a new frame and restoring the tabs and buffer history. This is how Equake originally worked, but it is simpler (and slightly faster) just to hide the frame on &ldquo;close&rdquo; and then unhide it on &ldquo;re-open&rdquo;, and this became the default behaviour for Equake some time ago. But I left the old code in place as another option.</p>
<p>However, various changes apparently ended up with the restoration behaviour not working quite properly. I have fixed this (more or less, see <a href="https://gitlab.com/emacsomancer/equake/-/issues/26">https://gitlab.com/emacsomancer/equake/-/issues/26</a>). With that fix in place, we can then trick GNOME Shell under Wayland into behaving properly. Rather than hiding the Equake frame on &ldquo;close&rdquo;, we destroy it and then recreate it on &ldquo;open&rdquo;. This involves quite a bit of trickery behind the scenes. Essentially, opening a new window under GNOME Shell Wayland can result in that window being placed on top of any existing windows (though to do it properly, employing a it of Elisp <code>(select-frame-set-input-focus (selected-frame))</code> seems to result in the new Emacs client frame being on top (and focussed) [this is a potentially useful trick for opening regular new Emacsclient frames as well].</p>
<p>But, the usual way that Equake frames are created internally is via
Emacs <code>make-frame</code>, which doesn&rsquo;t automatically focus the new
frame. So rather than doing this, we need to have the user call <code>emacsclient -c</code> and then transform that frame into an Equake frame. A new Equake function <code>equake--transform-existing-frame-into-equake-frame</code> takes care of this. The transformation and the old code restoring tabs and history doesn&rsquo;t quite take care of everything though as the point/cursor is left by default at the top of the frame, which is not the user-expected behaviour. So an addition bit of elisp <code>(goto-char (1- (point-max)))</code> generally moves the point/cursor to the end of the buffer where the user might expect it.</p>
<p>So I have a bit of shell script as a helper function which is what one should create a keybinding for in GNOME Shell Wayland:</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell"><span class="cp">#!/bin/sh
</span><span class="cp"></span>
<span class="nv">equakestatus</span><span class="o">=</span><span class="k">$(</span>emacsclient -n -e <span class="s1">&#39;(frame-live-p (alist-get (equake--get-monitor) equake--frame))&#39;</span><span class="k">)</span>

<span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$equakestatus</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;nil&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
    emacsclient -c -e <span class="s2">&#34;(progn (select-frame-set-input-focus (selected-frame))
</span><span class="s2">                              (equake--transform-existing-frame-into-equake-frame)
</span><span class="s2">                              (goto-char (1- (point-max))))&#34;</span>
<span class="k">else</span>
    emacsclient -n -e <span class="s1">&#39;(progn (setq equake-use-frame-hide nil)
</span><span class="s1">                              (equake-invoke))&#39;</span>
<span class="k">fi</span>
</code></pre></div><p>This checks if there is a live Equake frame; if there is, it is hidden; otherwise a new frame is created and transformed.</p>
<p>Finally, in order to be able to get the &ldquo;Always on Top&rdquo; behaviour, the new Equake frame transmutation function calls <code>(shell-command &quot;wmctrl -r :ACTIVE: -b toggle,above&quot;)</code> (so one needs <code>wmctrl</code> installed), which seems to trigger the &ldquo;Always on Top&rdquo; feature at least for Xwayland windows.</p>
<p>And, presto, change-o, voilà, we have a version of Equake which
exhibits its normal X11 behaviour in GNOME Shell Wayland.</p>
<p>(As long as Emacs is run as an Xwayland application; otherwise the
&ldquo;always on top&rdquo; behaviour doesn&rsquo;t work properly.)</p>
]]></content>
            
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/categories/emacs" term="emacs" label="emacs" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/equake" term="equake" label="equake" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/elisp" term="elisp" label="elisp" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/eshell" term="eshell" label="eshell" />
                            
                        
                    
                 
                    
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Equake: A drop-down console written in Emacs Lisp]]></title>
            <link href="https://babbagefiles.xyz/equake-elisp-console/"/>
            <id>https://babbagefiles.xyz/equake-elisp-console/</id>
            
                    <author>
                        <name>Benjamin Slade</name>
                    </author>
            <published>2019-01-03T19:06:00-07:00</published>
            <updated>2022-06-19T19:21:55-06:00</updated>
            
            
            <content type="html"><![CDATA[<p>Over the holiday break I&rsquo;ve been working on developing a Quake-style
drop-down console, dubbed Equake / <code>equake</code>. It is not yet on Melpa,
but is accessible at
<a href="https://gitlab.com/emacsomancer/equake">https://gitlab.com/emacsomancer/equake</a>.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>



<figure>
    
        
            <img src="https://gitlab.com/emacsomancer/equake/raw/master/image/equake.png"/> </figure>

<p><code>equake</code>, written fully in Emacs Lisp, is designed as a &lsquo;classic&rsquo;
drop-down console interface like <a href="https://en.wikipedia.org/wiki/Yakuake">Yakuake</a>, inspired by &lsquo;cheat&rsquo; consoles
in games like <a href="https://en.wikipedia.org/wiki/Quake_(video_game)">Quake</a>. It provides access to various &lsquo;shells&rsquo;
implemented in Emacs, including <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Interactive-Shell.html#Interactive-Shell"><code>shell</code></a> (an Emacs wrapper around the
current system shell), <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Terminal-emulator.html#Terminal-emulator"><code>term</code> and <code>ansi-term</code></a>, (both terminal
emulators, emulating VT100-style ANSI escape codes, like <code>xterm</code>
does), and <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html"><code>eshell</code></a> (a shell written entirely in Emacs Lisp). <code>equake</code>
allows for multiple &lsquo;tabs&rsquo; (which can be running different shells),
and allows tabs to be re-ordered and renamed.</p>



<figure>
    
        
            <img src="https://gitlab.com/emacsomancer/equake/raw/master/image/equake-in-kdeplasma5.gif"/> </figure>

<p>My impetus for creating <code>equake</code> was to hijack my own workflow into
using John Wiegley&rsquo;s fantastic <code>eshell</code>, an Emacs module which
&lsquo;translates &ldquo;shell-like&rdquo; syntax into Lisp in order to exercise the
kernel in the same manner as typical system shells&rsquo;, allowing for a
similar working environment even in hostile, alien OSes like <code>w32</code>.</p>
<p><code>eshell</code> is somewhat sparsely documented, but some <a href="https://www.masteringemacs.org/article/complete-guide-mastering-eshell">useful</a> <a href="http://www.howardism.org/Technical/Emacs/eshell-fun.html">resources</a>
<a href="https://dm.reddit.com/r/emacs/comments/6y3q4k/yes_eshell_is_my_main_shell/">exist</a>, including a fairly extensive <a href="https://www.youtube.com/watch?v=RhYNu6i_uY4">video overview done by Howard
Abrams</a> which I highly recommend. It has a number of great features,
either inherently or via additional Emacs packages, including features
from <a href="https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs">Plan 9</a>&lsquo;s terminal, as well as <a href="https://github.com/dieggsy/esh-autosuggest">Fish shell-like auto-suggestions</a>.</p>
<p><code>equake</code> has been successful in my personal goal of using <code>eshell</code> for
99% of my terminal work, and I am looking forward to making further
using of a shell which can handle Lisp syntax as well.</p>
<p>Most of the <code>equake</code> code is keeping track of tabs, and frames for
multi-monitor set-ups. This is trickier than it would seem at first,
especially as each screen/monitor can have it own set of tabs (this
allows me to recreate at least a part of AwesomeWM&rsquo;s
screen-independence in other environments).  In theory <code>equake</code> should
work fairly well across platforms, as it makes use of the <code>frame.el</code>,
which includes code for MacOS and Windows (but I haven&rsquo;t test either
platform). Probably more work needs to be done to get <code>equake</code> to work
properly on tiling window managers like AwesomeWM or StumpWM. But it
seems to currently work fine in KDE Plasma and Gnome Shell (both X11
and Wayland).<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>I learned a good deal about how Emacs manages frames. I originally
used Emacs&rsquo; <code>make-frame-(in)visible</code> functions to hide/show the
<code>equake</code> frames. However, the implementation of these is very
odd. Applying <code>make-frame-invisible</code> to a frame once appears to render
it invisible, but Emacs still considers it to be visible, which means
that, for instance, <code>frame-visible-p</code> will still report the frame as
being visible and, worse, functions like <code>make-frame-visible</code> and
<code>raise-frame</code> will have no effect whatsoever upon the frame in
question, because Emacs treats it as &lsquo;visible&rsquo;.  Only a second
application of <code>make-frame-invisible</code> will register the frame as
reportably invisible to Emacs. This is easily enough worked around
simply by using a &lsquo;double tap&rsquo; of <code>make-frame-invisible</code> to the
relevant frame. However, I ran into numerous other issues in the use
of <code>make-frame-(in)visible</code>, including the fact that frames set at
less than 100% width end up re-appearing in a position other than
their original position, and frames sometimes spontaneously resize
when re-appearing or being un-fullscreened. I tried for a long time to
work around these issues, but found that even trying to force the
frames into doing what I wanted them to do via applications of
<code>set-frame-position</code> was a non-starter, as application of this
function to malpositioned frames resulted in significant lag – which
defeated the purpose of using <code>make-frame-(in)visible</code> in the first
place, which was to gain a slight performance improvement over
destroying and recreating frames. In the end, using <code>destroy-frame</code>
and <code>make-frame</code> to &lsquo;hide&rsquo; and &lsquo;show&rsquo; the drop-down console ended up
being the most performent solution.</p>
<p>Destroying and recreating frames means also worrying about remembering
the last buffer used in a frame as well as the window-history for the
frame, so these also make up a decent part of the <code>equake</code> code.</p>
<p>On single-screen set-ups, <code>equake</code>, once installed, is designed to
have a <code>equake</code> console frame toggled to drop down or be rolled up by
executing a command which invokes the <code>(equake-invoke)</code> function bound
to a key like <code>F12</code> via:</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell">emacsclient -n -e <span class="s1">&#39;(equake-invoke)&#39;</span>
</code></pre></div><p>Getting <code>equake</code> to work well on multi-monitor setups ended up being
rather challenging, since Emacs doesn&rsquo;t know exactly which screen is
&lsquo;active&rsquo; unless that screen also has an active Emacs frame. The
solution, which I managed to get to be nearly as fast as the simpler
non-multi-monitor solution, is to launch &lsquo;Emacs probes&rsquo; which are used
to determine which monitor is &lsquo;active&rsquo; and are then destroyed, invoked
via:</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell">emacsclient -n -c -e <span class="s1">&#39;(equake-invoke)&#39;</span> -F <span class="s1">&#39;((title . &#34;*transient*&#34;) (alpha . (0 . 0)) (width . (text-pixels . 0)) (height . (text-pixels . 0)) (left . 0) (top . 0))&#39;</span>
</code></pre></div><p>(The title is important as it&rsquo;s the key to being able to quickly
destroy these &lsquo;Emacs-probes&rsquo;, and the other frame-settings are there
to minimise the visibility of the probe-frame during its brief
existence.)</p>
<p>If you&rsquo;re looking for a drop-down for things other than
shells/terminals, alphapapa has a similar Emacs package designed as a
general-purpose drop-down (e.g. for Org mode buffers etc.); <a href="https://github.com/alphapapa/yequake"><code>yequake</code></a>;
and a <a href="https://github.com/alphapapa/yequake/#org-capture">specialised version for org-capture</a>.</p>
<p>I hope to add a few more features to <code>equake</code>, but at this point it
seems stable and is usable for what I wanted to use it for, being a
Lisp console for a Lisp shell. Comments and suggestions are, of
course, most welcome.</p>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1" role="doc-endnote">
<p>Where installation via
<a href="https://framagit.org/steckerhalter/quelpa-use-package"><code>quelpa-use-package</code></a> is described. This method is nearly as easy using
the plain <code>use-package</code> package to pull from Melpa. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Another part of the impetus for <code>equake</code> is wanting
to increase my machines&rsquo; &lsquo;Lisp quotient&rsquo; after moving a number of
machines from AwesomeWM to KDE Plasma, rather than to StumpWM as I had
originally planned. Of course, I could replace Kwin with StumpWM, and
I plan to experiment with this, but I rather like some the eye-candy
Kwin provides. <a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</section>
]]></content>
            
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/categories/emacs" term="emacs" label="emacs" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/equake" term="equake" label="equake" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/elisp" term="elisp" label="elisp" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/eshell" term="eshell" label="eshell" />
                            
                        
                    
                 
                    
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Grab word etymologies in Emacs]]></title>
            <link href="https://babbagefiles.xyz/emacs_etymologies/"/>
            <id>https://babbagefiles.xyz/emacs_etymologies/</id>
            
                    <author>
                        <name>Benjamin Slade</name>
                    </author>
            <published>2018-08-26T21:49:00-06:00</published>
            <updated>2018-08-26T21:50:27-06:00</updated>
            
            
            <content type="html"><![CDATA[<p>On Xah Lee&rsquo;s <a href="http://ergoemacs.org/emacs/blog.html">blog</a> I noticed an entry on linking to word etymologies
from Emacs (2018-08-16: &ldquo;emacs, create link of word etymology&rdquo;). What
his function does is create a html link to the <a href="http://www.etymonline.com">Etymonline.com</a> page on
the currently selected word.</p>
<p>But I thought: it would be great to have a quick way of pulling up
etymological information within Emacs itself. So, with a little help
from <a href="http://links.twibright.com">Links</a> (i.e. you&rsquo;ll need to have Links installed), here is a first
attempt at such a function:</p>
<div class="highlight"><pre class="chroma"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="p">(</span><span class="nb">defun</span> <span class="nv">slade/etymonbuf</span> <span class="p">()</span>
  <span class="s">&#34;Look up word etymology notes from http://www.etymonline.com. Requires [[http://links.twibright.com/][links] to be installed.&#34;</span>
  <span class="p">(</span><span class="nb">interactive</span><span class="p">)</span>
  <span class="p">(</span><span class="nb">let</span> <span class="p">(</span><span class="nv">$p1</span> <span class="nv">$p2</span> <span class="nv">$input</span> <span class="nv">$result</span><span class="p">)</span>    <span class="c1">;; lifted from Xah Lee&#39;s 2018-08-16: &#34;emacs, create link of word etymology&#34;</span>
    <span class="p">(</span><span class="nb">if</span> <span class="p">(</span><span class="nv">use-region-p</span><span class="p">)</span>
	<span class="p">(</span><span class="nb">progn</span> <span class="p">(</span><span class="nb">setq</span> <span class="nv">$p1</span> <span class="p">(</span><span class="nf">region-beginning</span><span class="p">))</span>
	       <span class="p">(</span><span class="nb">setq</span> <span class="nv">$p2</span> <span class="p">(</span><span class="nf">region-end</span><span class="p">)))</span>
      <span class="p">(</span><span class="nb">progn</span> <span class="p">(</span><span class="nb">setq</span> <span class="nv">$p1</span> <span class="p">(</span><span class="nf">line-beginning-position</span><span class="p">))</span>
	     <span class="p">(</span><span class="nb">setq</span> <span class="nv">$p2</span> <span class="p">(</span><span class="nf">line-end-position</span><span class="p">))))</span>
    <span class="p">(</span><span class="nb">setq</span> <span class="nv">$input</span> <span class="p">(</span><span class="nf">buffer-substring-no-properties</span> <span class="nv">$p1</span> <span class="nv">$p2</span><span class="p">))</span> <span class="c1">;;</span>
    <span class="p">(</span><span class="nv">generate-new-buffer</span> <span class="nv">$input</span><span class="p">)</span>  <span class="c1">; generate new buffer titled with entry word</span>
    <span class="p">(</span><span class="nv">switch-to-buffer</span> <span class="p">(</span><span class="nv">last-buffer</span><span class="p">))</span> <span class="c1">; switch to that new buffer</span>
    <span class="p">(</span><span class="nf">insert</span> <span class="p">(</span><span class="nv">shell-command-to-string</span> <span class="p">(</span><span class="nf">concat</span> <span class="s">&#34;links -dump http://www.etymonline.com/word/&#34;</span> <span class="nv">$input</span><span class="p">)))</span> <span class="c1">; dump text via links from etymonline</span>
    <span class="p">(</span><span class="nf">goto-char</span> <span class="p">(</span><span class="nf">point-min</span><span class="p">))</span> <span class="c1">; go to beginning</span>
    <span class="p">(</span><span class="nb">if</span> <span class="p">(</span><span class="nf">re-search-forward</span> <span class="s">&#34;Error 404 (Not Found)&#34;</span> <span class="no">nil</span> <span class="no">t</span><span class="p">)</span>   <span class="c1">; for non-word or words with no etymonline entry</span>
	<span class="p">(</span><span class="nv">slade/word-not-found</span><span class="p">)</span>   <span class="c1">; if 404, kill buffer and display minibuffer message</span>
      <span class="p">(</span><span class="nv">slade/trim-etymonbuf</span><span class="p">))))</span>  <span class="c1">; otherwise trim off unneeded text from header and footer</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">slade/trim-etymonbuf</span> <span class="p">()</span>
  <span class="s">&#34;Trim off unneeded text from top and bottom.&#34;</span>
  <span class="p">(</span><span class="nf">goto-char</span> <span class="p">(</span><span class="nf">point-min</span><span class="p">))</span>		<span class="c1">; goto beginning of buffer</span>
  <span class="p">(</span><span class="nf">search-forward</span> <span class="s">&#34;[\s\s]&#34;</span><span class="p">)</span> 		<span class="c1">; the text output of links always delivers text with a &#34;[  ]&#34; right before the text we want</span>
  <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">begdel</span> <span class="p">(</span><span class="nf">point</span><span class="p">)))</span>
    <span class="p">(</span><span class="nf">delete-region</span> <span class="mi">1</span> <span class="nv">begdel</span><span class="p">))</span>		<span class="c1">; delete from beginning of buffer until &#34;[  ]&#34;</span>
  <span class="p">(</span><span class="nf">goto-char</span> <span class="p">(</span><span class="nf">point-max</span><span class="p">))</span>  		<span class="c1">; goto end of buffer</span>
  <span class="p">(</span><span class="nv">search-backward-regexp</span> <span class="s">&#34;Share[[:space:]]*Share on FacebookShare&#34;</span><span class="p">)</span>   <span class="c1">; the unneeded text at the bottom starts with a &#34;Share&#34; section</span>
  <span class="p">(</span><span class="nb">let</span> <span class="p">((</span><span class="nv">enddel</span> <span class="p">(</span><span class="nf">point</span><span class="p">)))</span>
    <span class="p">(</span><span class="nf">delete-region</span> <span class="p">(</span><span class="nf">point-max</span><span class="p">)</span> <span class="nv">enddel</span><span class="p">))</span>	<span class="c1">; delete from end of buffer until Share section</span>
  <span class="p">(</span><span class="nf">goto-char</span> <span class="p">(</span><span class="nf">point-min</span><span class="p">)))</span>		<span class="c1">; move point back to beginning</span>

<span class="p">(</span><span class="nb">defun</span> <span class="nv">slade/word-not-found</span> <span class="p">()</span>
  <span class="s">&#34;Delete buffer and display minibuffer message.&#34;</span>
  <span class="p">(</span><span class="nf">kill-buffer</span><span class="p">)</span>
  <span class="p">(</span><span class="nf">message</span> <span class="s">&#34;Sorry, word not found.&#34;</span><span class="p">))</span>
</code></pre></div><p>After <code>eval</code>'ing the above, one day, if you have an idle fancy to know
the etymology of a word, you can select it and call <code>slade/etymonbuf</code>
and have a quick peek at what Etymonline has to say.  Here&rsquo;s what you
get if you try this on &ldquo;lisp&rdquo;:</p>
<div class="highlight"><pre class="chroma"><code class="language-text" data-lang="text">                                lisp (n.)

&#34;act or habit of lisping,&#34; 1620s, from lisp (v.).

lisp (v.)

sometimes lipse, late 14c. alteration of wlisp, from late Old English
awlyspian &#34;to lisp, to pronounce &#39;s&#39; and &#39;z&#39; imperfectly,&#34; from wlisp
(adj.) &#34;lisping,&#34; which is probably imitative (compare Middle Dutch, Old
High German lispen, Danish læspe, Swedish läspa). General sense &#34;speak
imperfectly or childishly&#34; is from 17c. Transitive sense from 1610s.
Related: Lisped; lisping. Suggestive of effeminacy from 14c.
</code></pre></div><p>Probably not the lisp you were looking for, but interesting none the
less.</p>
<p>Of course it would be nice to retain italics and not to have to depend
on an external application, so there&rsquo;s more that can be done.</p>
]]></content>
            
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/categories/emacs" term="emacs" label="emacs" />
                             
                                <category scheme="https://babbagefiles.xyz/categories/elisp" term="elisp" label="elisp" />
                            
                        
                    
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="https://babbagefiles.xyz/tags/etymology" term="etymology" label="etymology" />
                            
                        
                    
                
            
        </entry>
    
</feed>
