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