<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>escape on
A Scripter's Notes</title><link>https://scripter.co/categories/escape/</link><description>Recent content in escape
on A Scripter's Notes</description><language>en-us</language><managingEditor>kaushal.modi@gmail.com (Kaushal Modi)</managingEditor><webMaster>kaushal.modi@gmail.com (Kaushal Modi)</webMaster><lastBuildDate>Wed, 22 Apr 2026 08:24:58 -0400</lastBuildDate><generator>Hugo -- gohugo.io</generator><docs>https://validator.w3.org/feed/docs/rss2.html</docs><atom:link href="https://scripter.co/categories/escape/index.xml" rel="self" type="application/rss+xml"/><item><title>Save a macro as a function in emacs</title><link>https://scripter.co/save-a-macro-as-a-function-in-emacs/</link><description>&lt;p>I am in the process of converting traditional verilog test benches to
SystemVerilog UVM test benches. As per the UVM methodology, it is recommended to
use &lt;code> `uvm_info&lt;/code> instead of &lt;code>$display&lt;/code> statements so that the &lt;code>info&lt;/code> statement
encodes a &lt;em>Message ID&lt;/em> and &lt;em>Message Verbosity&lt;/em> along with the message required
to be printed.&lt;/p>
&lt;p>&lt;em>I won&amp;rsquo;t go in more detail about UVM and verilog as this post is about how I can
save a macro that I use very frequently into an elisp function.&lt;/em>&lt;/p>
&lt;hr>
&lt;ul>
&lt;li>Regex Search Expression&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>\$display(\(.*?\));\(.*\)
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>Replace Expression&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>`uvm_info(&amp;#34;REPLACE_THIS_GENERIC_ID&amp;#34;, $sformatf(\1), UVM_MEDIUM) \2
&lt;/code>&lt;/pre>&lt;hr>
&lt;p>As it can be seen that it very time consuming if I need to type these search and
replace expressions every time (even if I use the &lt;code>M-n&lt;/code> and &lt;code>M-p&lt;/code> key bindings
during the &lt;code>query-replace-regexp&lt;/code>).&lt;/p>
&lt;p>So the solution is to save the search-replace operation into a macro and then
save that macro as an elisp function.&lt;/p>
&lt;ol>
&lt;li>Select the region you want to do the search-replace.&lt;/li>
&lt;li>Start recording macro &lt;code>start-kbd-macro&lt;/code>. &lt;em>I have bound this to &lt;code>C-F4&lt;/code>.&lt;/em>&lt;/li>
&lt;li>Do the above search-replace and use &lt;code>!&lt;/code> to force search-replace in the whole region.&lt;/li>
&lt;li>Stop recording macro &lt;code>kmacro-end-or-call-macro&lt;/code>. &lt;em>I have bound this to &lt;code>F4&lt;/code>.&lt;/em>&lt;/li>
&lt;li>Do &lt;code>M-x kmacro-name-last-macro&lt;/code> and give the macro a descriptive name. You will then be able to call that macro again by doing &lt;code>M-x&lt;/code> and the macro name you picked. For this example, I named the macro &lt;code>uvm-convert-display-to-uvm_info&lt;/code>.&lt;/li>
&lt;li>Now save this macro as a function to a file that you load during your emacs initialization&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>. To do that do &lt;code>M-x insert-kbd-macro&lt;/code> and select your named macro to be inserted there.&lt;/li>
&lt;li>Now save that file and your named macro will be loaded in all of your future emacs sessions.&lt;/li>
&lt;/ol>
&lt;p>The inserted &lt;code>uvm-convert-display-to-uvm_info&lt;/code> function definition looks like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-elisp" data-lang="elisp">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nf">fset&lt;/span> &lt;span class="ss">&amp;#39;uvm-convert-display-to-uvm_info&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nb">lambda&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kp">&amp;amp;optional&lt;/span> &lt;span class="nv">arg&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="s">&amp;#34;Keyboard macro.&amp;#34;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">interactive&lt;/span> &lt;span class="s">&amp;#34;p&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">kmacro-exec-ring-item&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">quote&lt;/span> &lt;span class="p">([&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="mi">113&lt;/span> &lt;span class="mi">92&lt;/span> &lt;span class="mi">36&lt;/span> &lt;span class="mi">100&lt;/span> &lt;span class="mi">105&lt;/span> &lt;span class="mi">115&lt;/span> &lt;span class="mi">112&lt;/span> &lt;span class="mi">108&lt;/span> &lt;span class="mi">97&lt;/span> &lt;span class="mi">121&lt;/span> &lt;span class="mi">40&lt;/span> &lt;span class="mi">92&lt;/span> &lt;span class="mi">40&lt;/span> &lt;span class="mi">46&lt;/span> &lt;span class="mi">42&lt;/span> &lt;span class="mi">63&lt;/span> &lt;span class="mi">92&lt;/span> &lt;span class="mi">41&lt;/span> &lt;span class="mi">41&lt;/span> &lt;span class="mi">59&lt;/span> &lt;span class="mi">92&lt;/span> &lt;span class="mi">40&lt;/span> &lt;span class="mi">46&lt;/span> &lt;span class="mi">42&lt;/span> &lt;span class="mi">92&lt;/span> &lt;span class="mi">41&lt;/span> &lt;span class="nb">return&lt;/span> &lt;span class="mi">96&lt;/span> &lt;span class="mi">117&lt;/span> &lt;span class="mi">118&lt;/span> &lt;span class="mi">109&lt;/span> &lt;span class="mi">95&lt;/span> &lt;span class="mi">105&lt;/span> &lt;span class="mi">110&lt;/span> &lt;span class="mi">102&lt;/span> &lt;span class="mi">111&lt;/span> &lt;span class="mi">40&lt;/span> &lt;span class="mi">34&lt;/span> &lt;span class="mi">82&lt;/span> &lt;span class="mi">69&lt;/span> &lt;span class="mi">80&lt;/span> &lt;span class="mi">76&lt;/span> &lt;span class="mi">65&lt;/span> &lt;span class="mi">67&lt;/span> &lt;span class="mi">69&lt;/span> &lt;span class="mi">95&lt;/span> &lt;span class="mi">84&lt;/span> &lt;span class="mi">72&lt;/span> &lt;span class="mi">73&lt;/span> &lt;span class="mi">83&lt;/span> &lt;span class="mi">95&lt;/span> &lt;span class="mi">71&lt;/span> &lt;span class="mi">69&lt;/span> &lt;span class="mi">78&lt;/span> &lt;span class="mi">69&lt;/span> &lt;span class="mi">82&lt;/span> &lt;span class="mi">73&lt;/span> &lt;span class="mi">67&lt;/span> &lt;span class="mi">95&lt;/span> &lt;span class="mi">73&lt;/span> &lt;span class="mi">68&lt;/span> &lt;span class="mi">34&lt;/span> &lt;span class="mi">44&lt;/span> &lt;span class="mi">32&lt;/span> &lt;span class="mi">36&lt;/span> &lt;span class="mi">115&lt;/span> &lt;span class="mi">102&lt;/span> &lt;span class="mi">111&lt;/span> &lt;span class="mi">114&lt;/span> &lt;span class="mi">109&lt;/span> &lt;span class="mi">97&lt;/span> &lt;span class="mi">116&lt;/span> &lt;span class="mi">102&lt;/span> &lt;span class="mi">40&lt;/span> &lt;span class="mi">92&lt;/span> &lt;span class="mi">49&lt;/span> &lt;span class="mi">41&lt;/span> &lt;span class="mi">44&lt;/span> &lt;span class="mi">32&lt;/span> &lt;span class="mi">85&lt;/span> &lt;span class="mi">86&lt;/span> &lt;span class="mi">77&lt;/span> &lt;span class="mi">95&lt;/span> &lt;span class="mi">77&lt;/span> &lt;span class="mi">69&lt;/span> &lt;span class="mi">68&lt;/span> &lt;span class="mi">73&lt;/span> &lt;span class="mi">85&lt;/span> &lt;span class="mi">77&lt;/span> &lt;span class="mi">41&lt;/span> &lt;span class="mi">32&lt;/span> &lt;span class="mi">92&lt;/span> &lt;span class="mi">50&lt;/span> &lt;span class="nb">return&lt;/span> &lt;span class="mi">33&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="s">&amp;#34;%d&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="nv">arg&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now I can simply &lt;code>M-x uvm-convert-display-to-uvm_info&lt;/code> the next time I need to replace those &lt;code>$display&lt;/code>s with &lt;code> `uvm_info&lt;/code>s.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>I save my verilog related macros to my &lt;a href="https://github.com/kaushalmodi/.emacs.d/blob/master/setup-files/setup-verilog.el">&lt;em>setup-verilog-mode.el&lt;/em>&lt;/a>.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description><category domain="https://scripter.co/categories/emacs">emacs</category><category domain="https://scripter.co/categories/macro">macro</category><category domain="https://scripter.co/categories/verilog">verilog</category><category domain="https://scripter.co/categories/uvm">uvm</category><category domain="https://scripter.co/categories/escape">escape</category><category domain="https://scripter.co/categories/backtick">backtick</category><category domain="https://scripter.co/categories/markdown"> markdown</category><guid>https://scripter.co/save-a-macro-as-a-function-in-emacs/</guid><pubDate>Sun, 27 Jul 2014 15:50:47 -0400</pubDate></item><item><title>Search/replace groups using sed</title><link>https://scripter.co/search-replace-groups-using-sed/</link><description>&lt;p>This is the most common way of my sed usage:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> Good morning &lt;span class="p">|&lt;/span> sed &lt;span class="s1">&amp;#39;s/\(.*\s\+\).*/\1evening/g&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Here are brief notes on that ..&lt;/p>
&lt;p>The above script changes &lt;code>Good morning&lt;/code> to &lt;code>Good evening&lt;/code>.
Note that the following characters needed the escape character &lt;code>\&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>Brackets to create regex groups: &lt;code>\(&lt;/code> &lt;code>\)&lt;/code>&lt;/li>
&lt;li>Plus sign to match one or more times: &lt;code>\+&lt;/code>&lt;/li>
&lt;li>Note that the &lt;code>.&lt;/code> and &lt;code>*&lt;/code> characters don&amp;rsquo;t need escaping.&lt;/li>
&lt;/ul></description><category domain="https://scripter.co/categories/sed">sed</category><category domain="https://scripter.co/categories/regex">regex</category><category domain="https://scripter.co/categories/escape">escape</category><category domain="https://scripter.co/categories/search">search</category><category domain="https://scripter.co/categories/replace">replace</category><guid>https://scripter.co/search-replace-groups-using-sed/</guid><pubDate>Wed, 16 Apr 2014 14:16:42 -0400</pubDate></item></channel></rss>