<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: rsteube</title>
    <description>The latest articles on DEV Community by rsteube (@rsteube).</description>
    <link>https://dev.to/rsteube</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F790525%2F8982f219-b7fa-4c2a-a28d-dd8b69d61448.png</url>
      <title>DEV Community: rsteube</title>
      <link>https://dev.to/rsteube</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rsteube"/>
    <language>en</language>
    <item>
      <title>Puking Rainbows</title>
      <dc:creator>rsteube</dc:creator>
      <pubDate>Sat, 14 Oct 2023 02:02:41 +0000</pubDate>
      <link>https://dev.to/rsteube/puking-rainbows-1pje</link>
      <guid>https://dev.to/rsteube/puking-rainbows-1pje</guid>
      <description>&lt;p&gt;Shells support colored output. Some do so also during tab completion.&lt;/p&gt;

&lt;p&gt;It can provide extra context like whether an issue is &lt;strong&gt;open&lt;/strong&gt; (green) or &lt;strong&gt;closed&lt;/strong&gt; (red).&lt;br&gt;
Or reflect the color of labels:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fql3xvyht5mvj1ju5u13a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fql3xvyht5mvj1ju5u13a.png" alt="Image description" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is how this works and how it is done in &lt;a href="https://github.com/rsteube/carapace"&gt;carapace&lt;/a&gt;...&lt;/p&gt;
&lt;h2&gt;
  
  
  ANSI escape sequences
&lt;/h2&gt;

&lt;p&gt;Text style is set in the shell using an escape sequence like &lt;code&gt;\e[31;42m&lt;/code&gt;.&lt;br&gt;
This instructs the terminal that the text following it is &lt;strong&gt;red&lt;/strong&gt; (31) with a &lt;strong&gt;green background&lt;/strong&gt; (41).&lt;/p&gt;

&lt;p&gt;It consists of&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\e&lt;/code&gt; escape.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[&lt;/code&gt; an opening square bracket.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;31;42&lt;/code&gt; a semicolon-separated list of escape codes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;m&lt;/code&gt; the letter m.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A common approach is to restore the default style using &lt;code&gt;\e[0m&lt;/code&gt; afterwards.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;[1;2;4;35mdim bold underlined magenta&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;[0m"&lt;/span&gt; &lt;span class="c"&gt;# you might need `echo -e` for this&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i4uyzgdwmnaybz39yrq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i4uyzgdwmnaybz39yrq.png" alt="Image description" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are basic &lt;strong&gt;foreground colors&lt;/strong&gt; (30-37), &lt;strong&gt;background colors&lt;/strong&gt; (40-47),&lt;br&gt;
&lt;strong&gt;modes&lt;/strong&gt; (1-9) and &lt;strong&gt;reset&lt;/strong&gt; (0) to restore the default. &lt;strong&gt;256-colors&lt;/strong&gt;&lt;br&gt;
 and &lt;strong&gt;RGB&lt;/strong&gt; are also possible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can find a full list at &lt;a href="https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797"&gt;ANSI Escape Sequences&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Elvish
&lt;/h2&gt;

&lt;p&gt;This one is easy.&lt;/p&gt;
&lt;h3&gt;
  
  
  Styled
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://elv.sh/"&gt;Elvish&lt;/a&gt; provides an abstraction for escape sequences using a list of human-readable keywords.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;styled &lt;span class="s2"&gt;"dim bold underlined magenta"&lt;/span&gt; dim bold underlined magenta&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2kng5ool969ycp73rqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2kng5ool969ycp73rqr.png" alt="Image description" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can read more about this at &lt;a href="https://elv.sh/ref/builtin.html#styled"&gt;styled&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Complex candidate
&lt;/h3&gt;

&lt;p&gt;Adding colors to tab completion is thus pretty easy with &lt;a href="https://elv.sh/ref/edit.html#edit:complex-candidate"&gt;edit:complex-candidate&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set &lt;/span&gt;edit:completion:arg-completer[example] &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;|@args|
  edit:complex-candidate &lt;span class="nb"&gt;true&lt;/span&gt; &amp;amp;display&lt;span class="o"&gt;=(&lt;/span&gt;styled &lt;span class="nb"&gt;true &lt;/span&gt;green&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;' (true in green)'&lt;/span&gt;
  edit:complex-candidate &lt;span class="nb"&gt;false&lt;/span&gt; &amp;amp;display&lt;span class="o"&gt;=(&lt;/span&gt;styled &lt;span class="nb"&gt;false &lt;/span&gt;red&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;' (false in red)'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F901jrrblv29l0b2z023v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F901jrrblv29l0b2z023v.png" alt="Image description" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Powershell
&lt;/h2&gt;

&lt;p&gt;This one is a bit tricky.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backtick
&lt;/h3&gt;

&lt;p&gt;First of all, the escape character is different in &lt;a href="https://learn.microsoft.com/en-us/powershell/"&gt;Powershell&lt;/a&gt;.&lt;br&gt;
It uses &lt;strong&gt;backtick&lt;/strong&gt; instead of &lt;strong&gt;backslash&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[1&lt;span class="p"&gt;;&lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt;4&lt;span class="p"&gt;;&lt;/span&gt;35mdim bold underlined magenta&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[0m"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05hshexxemw2o61ywwvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05hshexxemw2o61ywwvu.png" alt="Image description" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Completion result
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.completionresult"&gt;CompletionResult&lt;/a&gt; allows escape sequences in the &lt;code&gt;ListItemText&lt;/code&gt; to add color.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Function _example_completer &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;CompletionResult]::new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;, &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[31mfalse&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[0m"&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;CompletionResultType]::ParameterValue, &lt;span class="s2"&gt;"false in red"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;CompletionResult]::new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;, &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[32mtrue&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[0m"&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;CompletionResultType]::ParameterValue, &lt;span class="s2"&gt;"true in green"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
Register-ArgumentCompleter &lt;span class="nt"&gt;-Native&lt;/span&gt; &lt;span class="nt"&gt;-CommandName&lt;/span&gt; &lt;span class="s1"&gt;'example'&lt;/span&gt; &lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;Get-Item &lt;span class="s2"&gt;"Function:_example_completer"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.ScriptBlock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t0t7ktkejrxm924bxsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8t0t7ktkejrxm924bxsc.png" alt="Image description" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default, it uses tooltips to show the descriptions.&lt;br&gt;
But the value by itself often gives no sign of what it represents.&lt;/p&gt;
&lt;h3&gt;
  
  
  ListItemText
&lt;/h3&gt;

&lt;p&gt;Luckily, we can add the description to the &lt;code&gt;ListItemText&lt;/code&gt; ourselves.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Function _example_completer &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;CompletionResult]::new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;, &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[31mfalse&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[0m (false in red)"&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;CompletionResultType]::ParameterValue, &lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;CompletionResult]::new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;, &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[32mtrue&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[0m (true in green)"&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;CompletionResultType]::ParameterValue, &lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
Register-ArgumentCompleter &lt;span class="nt"&gt;-Native&lt;/span&gt; &lt;span class="nt"&gt;-CommandName&lt;/span&gt; &lt;span class="s1"&gt;'example'&lt;/span&gt; &lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;Get-Item &lt;span class="s2"&gt;"Function:_example_completer"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.ScriptBlock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dcazlriaamoks8y2jot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dcazlriaamoks8y2jot.png" alt="Image description" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tooltip &lt;strong&gt;must not&lt;/strong&gt; be empty though, so we need to set it to a single space.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Selection
&lt;/h3&gt;

&lt;p&gt;Fix the highlighting by setting &lt;a href="https://learn.microsoft.com/en-us/powershell/module/psreadline/set-psreadlineoption#-colors"&gt;&lt;code&gt;Selection&lt;/code&gt;&lt;/a&gt; to inverse.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Set-PSReadLineOption &lt;span class="nt"&gt;-Colors&lt;/span&gt; @&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"Selection"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[7m&lt;span class="s2"&gt;" }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pawgsi88hcj73nl33ja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pawgsi88hcj73nl33ja.png" alt="Image description" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Description
&lt;/h3&gt;

&lt;p&gt;And add some finishing touches to the description.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Function _example_completer &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;CompletionResult]::new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;, &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[21&lt;span class="p"&gt;;&lt;/span&gt;22&lt;span class="p"&gt;;&lt;/span&gt;23&lt;span class="p"&gt;;&lt;/span&gt;24&lt;span class="p"&gt;;&lt;/span&gt;25&lt;span class="p"&gt;;&lt;/span&gt;29m&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[31mfalse&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[21&lt;span class="p"&gt;;&lt;/span&gt;22&lt;span class="p"&gt;;&lt;/span&gt;23&lt;span class="p"&gt;;&lt;/span&gt;24&lt;span class="p"&gt;;&lt;/span&gt;25&lt;span class="p"&gt;;&lt;/span&gt;29&lt;span class="p"&gt;;&lt;/span&gt;39&lt;span class="p"&gt;;&lt;/span&gt;49m&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[2m &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[2m&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;false &lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;red&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[21;22;23;24;25;29;39;49m&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[0m&lt;span class="s2"&gt;", [CompletionResultType]::ParameterValue, "&lt;/span&gt; &lt;span class="s2"&gt;")
    [CompletionResult]::new("&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="s2"&gt;", "&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[21;22;23;24;25;29m&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[32mtrue&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[21;22;23;24;25;29;39;49m&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[2m &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[2m(true in green)&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;e[21&lt;span class="p"&gt;;&lt;/span&gt;22&lt;span class="p"&gt;;&lt;/span&gt;23&lt;span class="p"&gt;;&lt;/span&gt;24&lt;span class="p"&gt;;&lt;/span&gt;25&lt;span class="p"&gt;;&lt;/span&gt;29&lt;span class="p"&gt;;&lt;/span&gt;39&lt;span class="p"&gt;;&lt;/span&gt;49m&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;e[0m"&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;CompletionResultType]::ParameterValue, &lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
Register-ArgumentCompleter &lt;span class="nt"&gt;-Native&lt;/span&gt; &lt;span class="nt"&gt;-CommandName&lt;/span&gt; &lt;span class="s1"&gt;'example'&lt;/span&gt; &lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;Get-Item &lt;span class="s2"&gt;"Function:_example_completer"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.ScriptBlock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1gdo32g145apfnd03ra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1gdo32g145apfnd03ra.png" alt="Image description" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Zsh
&lt;/h2&gt;

&lt;p&gt;This one is hard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arrangement
&lt;/h3&gt;

&lt;p&gt;First, let's have a look at how &lt;a href="https://www.zsh.org/"&gt;Zsh&lt;/a&gt; arranges values for tab completion.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Values &lt;strong&gt;without a description&lt;/strong&gt; are arranged side-by-side.&lt;/li&gt;
&lt;li&gt;Values &lt;strong&gt;with a description&lt;/strong&gt; have it appended in the format &lt;code&gt;-- description&lt;/code&gt;
It is also aligned with other entries.&lt;/li&gt;
&lt;li&gt;Values &lt;strong&gt;with the same description&lt;/strong&gt; are also arranged side-by-side in front of the description.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7s4xl12upvozmil4i2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7s4xl12upvozmil4i2w.png" alt="Image description" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Zstyle
&lt;/h3&gt;

&lt;p&gt;Colors are set using the &lt;a href="https://zsh.sourceforge.io/Doc/Release/Zsh-Modules.html#The-zsh_002fzutil-Module"&gt;zstyle&lt;/a&gt; &lt;code&gt;list-colors&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;${curcontext}&lt;/code&gt; we can configure it for the current context during tab completion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zstyle &lt;span class="s2"&gt;":completion:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;curcontext&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:*"&lt;/span&gt; list-colors &lt;span class="s2"&gt;"{...}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Colors
&lt;/h3&gt;

&lt;p&gt;It contains a colon-separated list of &lt;strong&gt;patterns&lt;/strong&gt; and &lt;strong&gt;formats&lt;/strong&gt;.&lt;br&gt;
Formats are the semicolon-separated escape codes from ANSI escape sequences.&lt;/p&gt;

&lt;p&gt;There is a &lt;strong&gt;simple&lt;/strong&gt; and a &lt;strong&gt;complex&lt;/strong&gt; way to specify the patterns.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;=pattern=format&lt;/code&gt; to apply one format.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;=(#b)(pattern1)(pattern2)=format0=format1=format2&lt;/code&gt; to apply many formats.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;See &lt;a href="https://stackoverflow.com/a/23568183"&gt;here&lt;/a&gt; for a good explanation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Pattern
&lt;/h3&gt;

&lt;p&gt;Given the value "true", three patterns are relevant.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;=(#b)(true)=0=32&lt;/code&gt; Set "true" to &lt;strong&gt;green&lt;/strong&gt; (32).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;=(#b)(true)([ ]## -- *)=0=32=2&lt;/code&gt; Set "true" to &lt;strong&gt;green&lt;/strong&gt; (32) and the description to &lt;strong&gt;dim&lt;/strong&gt; (2).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;=(#b)(-- *)=0=2&lt;/code&gt; Set the description to &lt;strong&gt;dim&lt;/strong&gt; for everything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Take this with a grain of salt, but there was an edge case in regards to the arrangement.&lt;br&gt;
So it's best to set both the pattern for &lt;strong&gt;with&lt;/strong&gt; and &lt;strong&gt;without&lt;/strong&gt; a description for each value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Compdef
&lt;/h3&gt;

&lt;p&gt;Putting it all together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#compdef example&lt;/span&gt;
&lt;span class="k"&gt;function &lt;/span&gt;_example_completion &lt;span class="o"&gt;{&lt;/span&gt;
  zstyle &lt;span class="s2"&gt;":completion:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;curcontext&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:*"&lt;/span&gt; list-colors &lt;span class="s2"&gt;"=(#b)(false)([ ]## -- *)=0=31=2:=(#b)(false)=0=31:=(#b)(true)([ ]## -- *)=0=32=2:=(#b)(true)=0=32:=(#b)(-- *)=0=2"&lt;/span&gt;

  &lt;span class="nv"&gt;vals&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s1"&gt;'true:true in green'&lt;/span&gt; &lt;span class="s1"&gt;'false:false in red'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  _describe &lt;span class="s1"&gt;'values'&lt;/span&gt; vals
&lt;span class="o"&gt;}&lt;/span&gt;
compquote &lt;span class="s1"&gt;''&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; _example_completion
compdef _example_completion example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohuj2eqjigr09dsflgwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohuj2eqjigr09dsflgwl.png" alt="Image description" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Carapace
&lt;/h2&gt;

&lt;p&gt;Now to how &lt;a href="https://github.com/rsteube/carapace"&gt;carapace&lt;/a&gt; simplifies the above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Style
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://pkg.go.dev/github.com/rsteube/carapace/pkg/style#pkg-variables"&gt;Styles&lt;/a&gt; are adopted from &lt;a href="https://elv.sh/"&gt;Elvish&lt;/a&gt;.&lt;br&gt;
There are colors like &lt;code&gt;style.Red&lt;/code&gt;, modes like &lt;code&gt;style.Dim&lt;/code&gt; and &lt;code&gt;style.Of&lt;/code&gt; to combine them.&lt;/p&gt;
&lt;h3&gt;
  
  
  Action
&lt;/h3&gt;

&lt;p&gt;They can be set directly with &lt;a href="https://rsteube.github.io/carapace/carapace/defaultActions/actionStyledValues.html"&gt;ActionStyledValues&lt;/a&gt; and &lt;a href="https://rsteube.github.io/carapace/carapace/defaultActions/actionStyledValuesDescribed.html"&gt;ActionStyledValuesDescribed&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;carapace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActionStyledValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;carapace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActionStyledValuesDescribed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"true in green"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"false in red"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modifier
&lt;/h3&gt;

&lt;p&gt;Or with the modifiers &lt;a href="https://rsteube.github.io/carapace/carapace/action/style.html"&gt;Style&lt;/a&gt;, &lt;a href="https://rsteube.github.io/carapace/carapace/action/styleR.html"&gt;StyleR&lt;/a&gt; and &lt;a href="https://rsteube.github.io/carapace/carapace/action/styleF.html"&gt;StyleF&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;carapace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActionValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Green&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;carapace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActionValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StyleR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Carapace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeywordNegative&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;carapace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActionValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StyleF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sc&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Green&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Red&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Style functions
&lt;/h3&gt;

&lt;p&gt;The following functions can be passed to &lt;a href="https://rsteube.github.io/carapace/carapace/action/styleF.html"&gt;StyleF&lt;/a&gt; for common highlighting tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/github.com/rsteube/carapace/pkg/style#ForPath"&gt;ForPath&lt;/a&gt; highlights paths using the &lt;code&gt;LS_COLORS&lt;/code&gt; environment variable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgtgz4dl8pjlf6jxwqhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgtgz4dl8pjlf6jxwqhr.png" alt="Image description" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/github.com/rsteube/carapace/pkg/style#ForPathExt"&gt;ForPathExt&lt;/a&gt; does the same, but by extension only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Futzbvd9z03vrrd8f3obd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Futzbvd9z03vrrd8f3obd.png" alt="Image description" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/github.com/rsteube/carapace/pkg/style#ForLogLevel"&gt;ForLogLevel&lt;/a&gt; highlights log levels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0us6vudapabcx0gq5f8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0us6vudapabcx0gq5f8.png" alt="Image description" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/github.com/rsteube/carapace/pkg/style#ForKeyword"&gt;ForKeyword&lt;/a&gt; highlights common keywords like &lt;strong&gt;true&lt;/strong&gt; and &lt;strong&gt;false&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26cbko9op1bkecyqz2lb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26cbko9op1bkecyqz2lb.png" alt="Image description" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  That's all
&lt;/h2&gt;

&lt;p&gt;Enjoy the rainbow!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdsqsw9wei1w6d1dz33f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdsqsw9wei1w6d1dz33f.png" alt="Image description" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>shell</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Go is bigger than crab!</title>
      <dc:creator>rsteube</dc:creator>
      <pubDate>Sun, 08 Oct 2023 11:08:47 +0000</pubDate>
      <link>https://dev.to/rsteube/go-is-bigger-than-crab-33kf</link>
      <guid>https://dev.to/rsteube/go-is-bigger-than-crab-33kf</guid>
      <description>&lt;p&gt;Ever wanted your custom &lt;a href="https://go.dev/blog/gopher" rel="noopener noreferrer"&gt;Gopher&lt;/a&gt; but didn't have the drawing skills?&lt;/p&gt;

&lt;p&gt;Well seems now you can generate them.&lt;br&gt;
Type the title into your favorite AI prompt to get this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8cac3hziyq9211ba1o4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8cac3hziyq9211ba1o4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well no. But it's close enough so let's dive in...&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://easydiffusion.github.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Easy Diffusion&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which is a 1-click install of &lt;a href="https://github.com/CompVis/stable-diffusion" rel="noopener noreferrer"&gt;Stable Diffusion&lt;/a&gt; with an alternative web interface.&lt;br&gt;
You can choose a different approach but this one is pretty simple and I am new to this stuff.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure you meet the hardware requirements (GPU) and have enough disk space (this is a whopping 20+GB install).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://civitai.com/models/125264?modelVersionId=136827" rel="noopener noreferrer"&gt;&lt;strong&gt;golang gopher&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This one does all the magic to ensure the generated image resembles a gopher.&lt;/p&gt;

&lt;p&gt;Place it into &lt;code&gt;EasyDiffusion/models/lora/&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://civitai.com/models/9409" rel="noopener noreferrer"&gt;&lt;strong&gt;Anything V5/Ink&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By pure chance, I used this model instead of the default one and it gave amazing results.&lt;br&gt;
If you are looking for the classic gopher style use the default (&lt;code&gt;sd-v1-5&lt;/code&gt;), but this one is more fun.&lt;/p&gt;

&lt;p&gt;Place it into &lt;code&gt;EasyDiffusion/models/stable-diffusion/&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It tends to give the gophers a bit of a teddy bear look though so experiment with the settings (e.g. increase the strength of the golang LoRa to &lt;code&gt;0.8&lt;/code&gt;). And regenerate until you get something that pleases you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://civitai.com/models/6526?modelVersionId=7657" rel="noopener noreferrer"&gt;&lt;strong&gt;Studio Ghibli Style LoRA&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This one is optional but also has some nice effects when adding it into the mix.&lt;/p&gt;

&lt;p&gt;Place it into &lt;code&gt;EasyDiffusion/models/lora/&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;See &lt;a href="https://stable-diffusion-art.com/lora/" rel="noopener noreferrer"&gt;What are LoRA models and how to use them in AUTOMATIC1111&lt;/a&gt; for the difference between LoRa and base models.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;sd (top-left)&lt;/li&gt;
&lt;li&gt;sd+gopher (top-right)&lt;/li&gt;
&lt;li&gt;anything+gopher (bottom-left)&lt;/li&gt;
&lt;li&gt;anything+gopher+ghibli (bottom-right)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F092dyrtuqcwzi5wmzwce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F092dyrtuqcwzi5wmzwce.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Settings
&lt;/h2&gt;

&lt;p&gt;Start &lt;code&gt;Easy Diffusion&lt;/code&gt; and it should open &lt;a href="http://localhost:9000/" rel="noopener noreferrer"&gt;http://localhost:9000/&lt;/a&gt; in your browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network access
&lt;/h3&gt;

&lt;p&gt;Under &lt;code&gt;Settings&lt;/code&gt; you can configure it to allow remote access.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is &lt;strong&gt;NOT SECURED&lt;/strong&gt; so best to only do this in a safe local environment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fem9nmgnbuc1tg8vshzd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fem9nmgnbuc1tg8vshzd2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Image
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Seed&lt;/strong&gt;: &lt;code&gt;Random&lt;/code&gt; for new creations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Number of Images&lt;/strong&gt;: &lt;code&gt;4&lt;/code&gt; to have some options to choose from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt;: &lt;code&gt;AnythingV5Ink_ink&lt;/code&gt; or keep the standard model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Size&lt;/strong&gt;: &lt;code&gt;512x512&lt;/code&gt; is fine for the usual gopher image as we can upscale it later but you can choose a different format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LoRa&lt;/strong&gt;: &lt;code&gt;gophers_v1 [0.5]&lt;/code&gt; and optionally &lt;code&gt;ghibli_style_offset [0.5]&lt;/code&gt; as well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output Format&lt;/strong&gt;: &lt;code&gt;png&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyldugvsci2dpb70vpzug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyldugvsci2dpb70vpzug.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Images are &lt;strong&gt;NOT STORED&lt;/strong&gt; by default and closing the browser tab causes loss of data.&lt;br&gt;
So remember to save the generated &lt;code&gt;image&lt;/code&gt; and &lt;code&gt;json&lt;/code&gt;.&lt;br&gt;
You can do this by highlighting it and clicking the corresponding button.&lt;br&gt;
Or download the full set with &lt;code&gt;Download images&lt;/code&gt; at the top.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Prompt
&lt;/h2&gt;

&lt;p&gt;In the Prompt, you can add a comma-separated list of keywords of what you want in the image.&lt;br&gt;
You can also emphasize specific keywords with brackets (e.g. &lt;code&gt;(coffee)&lt;/code&gt; or &lt;code&gt;(holding a mug)&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Be sure to add one of &lt;code&gt;golangGopher&lt;/code&gt; (recommended), &lt;code&gt;gopherArt&lt;/code&gt;, &lt;code&gt;gopherCircle&lt;/code&gt; or &lt;code&gt;gopher3d&lt;/code&gt; for the gopher model.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t1lk44wguawe5jkbk9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t1lk44wguawe5jkbk9k.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Have a look at the &lt;a href="https://stable-diffusion-art.com/prompt-guide/" rel="noopener noreferrer"&gt;Prompt Guide&lt;/a&gt; for advanced techniques.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is also the &lt;code&gt;Negative Prompt&lt;/code&gt; where you can define what you &lt;strong&gt;don't&lt;/strong&gt; want in the image.&lt;br&gt;
You may add &lt;code&gt;rust, ferris&lt;/code&gt; here, but best to leave this for later when you want to get rid of something specific.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first attempt
&lt;/h2&gt;

&lt;p&gt;Fill the prompt with &lt;code&gt;golanggopher, &amp;lt;keywords...&amp;gt;&lt;/code&gt; and hit &lt;code&gt;Make&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's what I got for &lt;code&gt;golanggopher, podcast&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xadadwnppezhnw07ts8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xadadwnppezhnw07ts8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If there is nothing of interest try again.&lt;br&gt;
But if one has a nice theme or composition don't start from zero.&lt;br&gt;
Highlight the image and click &lt;code&gt;Make Similar Images&lt;/code&gt; to use it as input.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In my case, the upper left already looks pretty nice, but there are some issues...&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing the teeth
&lt;/h2&gt;

&lt;p&gt;See how there are no teeth? This happens pretty often when they are missing or not right.&lt;br&gt;
Highlight the image and click &lt;code&gt;Use as Input&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78g77sy1oxi43u9kqd0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78g77sy1oxi43u9kqd0t.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you've done something else in the meantime you should select &lt;code&gt;Use these settings&lt;/code&gt; on the top right first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Klick &lt;code&gt;Inpaint&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdks6d96z98zta3ly35v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdks6d96z98zta3ly35v.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mask the part to regenerate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffxcgbe5dw1gf7616i09q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffxcgbe5dw1gf7616i09q.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save it, hit &lt;code&gt;Make&lt;/code&gt; and if you're lucky that fixes it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faoj5n1zy6afxkpgzfl4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faoj5n1zy6afxkpgzfl4y.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If it didn't work you can try to add &lt;code&gt;teeth&lt;/code&gt; to the prompt.&lt;br&gt;
Otherwise set the &lt;code&gt;seed&lt;/code&gt; to random and try again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Fixing the logo
&lt;/h2&gt;

&lt;p&gt;The logo looks okay, but it isn't an &lt;code&gt;O&lt;/code&gt;.&lt;br&gt;
It's pretty close though, so mask the part that doesn't fit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfzji1buy2i7jet6cjqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfzji1buy2i7jet6cjqx.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one worked on the first try.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhjs6eyspb1kkq3cjpdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhjs6eyspb1kkq3cjpdy.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Upscale
&lt;/h2&gt;

&lt;p&gt;Finally, highlight the image and click &lt;code&gt;Upscale&lt;/code&gt; for a higher resolution.&lt;br&gt;
Then highlight it again to save it with &lt;code&gt;Download Image&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcz3gmj51nezaddskp9kc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcz3gmj51nezaddskp9kc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So what about the big one above
&lt;/h2&gt;

&lt;p&gt;That is a composition of two generated images.&lt;/p&gt;

&lt;p&gt;The big one (&lt;code&gt;golanggopher, studio ghibli, totoro&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrqef1gu70nu7iwsodn1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrqef1gu70nu7iwsodn1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The small one (&lt;code&gt;golanggopher, crab&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F417wq15ccc44d4vo3wg0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F417wq15ccc44d4vo3wg0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By removing the background.&lt;/li&gt;
&lt;li&gt;Placing it over the other image.&lt;/li&gt;
&lt;li&gt;Overpainting parts of the old gopher.&lt;/li&gt;
&lt;li&gt;Importing it in &lt;code&gt;Easy Diffusion&lt;/code&gt; as &lt;code&gt;Input&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Masking the outline for inpainting.&lt;/li&gt;
&lt;li&gt;And letting it regenerate various parts a couple of iterations.&lt;/li&gt;
&lt;li&gt;It ended up as above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuueogerrkwe0c7zx39c7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuueogerrkwe0c7zx39c7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;You can find some examples at &lt;a href="https://github.com/rsteube/gopher" rel="noopener noreferrer"&gt;https://github.com/rsteube/gopher&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have fun!&lt;/p&gt;

&lt;p&gt;Oh, and &lt;a href="https://ko-fi.com/easydiffusion" rel="noopener noreferrer"&gt;give Easy Diffusion a tip&lt;/a&gt; if you like it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>go</category>
      <category>gopher</category>
      <category>mascot</category>
    </item>
    <item>
      <title>A pragmatic approach to shell completion</title>
      <dc:creator>rsteube</dc:creator>
      <pubDate>Thu, 13 Jan 2022 14:53:05 +0000</pubDate>
      <link>https://dev.to/rsteube/a-pragmatic-approach-to-shell-completion-4gp0</link>
      <guid>https://dev.to/rsteube/a-pragmatic-approach-to-shell-completion-4gp0</guid>
      <description>&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


</description>
      <category>terminal</category>
      <category>productivity</category>
      <category>shell</category>
      <category>completion</category>
    </item>
  </channel>
</rss>
