<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>sglavoie.com – Tag: Web</title><link>https://www.sglavoie.com/tags/web/</link><description>Posts and writings by Sébastien Lavoie. Customization setups and articles on productivity for developers who like minimalism.</description><language>en</language><atom:link href="https://www.sglavoie.com/tags/web/feed.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sun, 12 May 2019 22:50:00 -0500</lastBuildDate><item><title>Suckless: Minimalist Tools That Work Great</title><link>https://www.sglavoie.com/posts/suckless-minimalist-tools-that-work-great/</link><description>I have been using a few different tools from suckless.org for a while and I must say that once everything is configured properly, they are a joy to use. Some tools, like dmenu and slock, seem simple on the surface, but they allow to simplify your workflow by quite a bit. Another one, st, is a truly fantastic and lightweight terminal!</description><content:encoded>&lt;hr&gt;
&lt;h2 id="what-are-suckless-tools"&gt;What are Suckless tools?&lt;/h2&gt;
&lt;p&gt;From the &lt;a href="https://suckless.org/"&gt;official website&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;Home of &lt;a href="https://dwm.suckless.org/"&gt;dwm&lt;/a&gt;,
&lt;a href="https://tools.suckless.org/dmenu"&gt;dmenu&lt;/a&gt; and other quality software
with a focus on simplicity, clarity, and frugality.&lt;/p&gt;

&lt;/blockquote&gt;&lt;p&gt;There are also other incredible pieces of software that are worth
mentioning, including &lt;a href="https://st.suckless.org/"&gt;st&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here, I will only go over the tools I use frequently, but keep in mind
that everything from Suckless&amp;hellip; Sucks less.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="st--simple-terminal"&gt;st — Simple Terminal&lt;/h2&gt;
&lt;p&gt;I did not know what to expect from this terminal and I found it delivers what I need! Configuring it is quite different than other terminals like &lt;a href="https://konsole.kde.org/"&gt;Konsole&lt;/a&gt; or &lt;a href="https://help.gnome.org/users/gnome-terminal/stable/"&gt;GNOME Terminal&lt;/a&gt;: you just edit a text file and compile the software before you can even use it. It may seem tedious at first, but compiling such a small piece of software is very fast and it needs to be done on seldom occasions when you may want to adjust a setting.&lt;/p&gt;
&lt;p&gt;I have experienced rendering issues when scaling the text with other terminals (including Konsole), where some weird flickering would happen at certain font sizes. &lt;a href="https://st.suckless.org/"&gt;Simple Terminal&lt;/a&gt; just works without hassle. It doesn&amp;rsquo;t have much bells and whistles out of the box, but it can be &lt;em&gt;patched&lt;/em&gt; to extend its functionality if you know what you are doing. I don&amp;rsquo;t, so my compiled version remains pretty basic although I must say I like the simplicity of it very much.&lt;/p&gt;
&lt;h3 id="configuration"&gt;Configuration&lt;/h3&gt;
&lt;p&gt;I didn&amp;rsquo;t have to adapt the configuration file very much. I ended up changing mainly the following lines:&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-block__bar" data-pagefind-ignore&gt;
 &lt;span class="code-block__lang"&gt;cpp&lt;/span&gt;
 &lt;button class="code-block__wrap" type="button" aria-pressed="false" hidden&gt;Wrap&lt;/button&gt;
 
 &lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Consolas:pixelsize=18:antialias=true:autohint=true&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;shell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/bin/zsh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* Terminal colors (16 first used in escape sequence) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;colorname&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/* 8 normal colors */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#1c1c1c&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* black */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#ff005b&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* red */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#70e502&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* green */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#fcdd11&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* yellow */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#00a0ea&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* blue */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#bd1efc&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* magenta */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#14ecfc&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* cyan */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#ededed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* white */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/* 8 bright colors */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#666666&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* black */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#ff00a0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* red */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#5dff00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* green */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#ff9f00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* yellow */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#71a9fc&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* blue */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#d571fc&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* magenta */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#6cf2fc&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* cyan */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#fcfcfc&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* white */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/* special colors */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#0a0500&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* background */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;257&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#e0e0e0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* foreground */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Default colors (colorname index)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * foreground, background, cursor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;defaultfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;257&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;defaultbg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;defaultcs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;257&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;defaultrcs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Colors used, when the specific fg == defaultfg. So in reverse mode this
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * will reverse too. Another logic would only make the simple feature too
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * complex.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;defaultitalic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;defaultunderline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Default shape of cursor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * 2: Block (&amp;#34;█&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * 4: Underline (&amp;#34;_&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * 6: Bar (&amp;#34;|&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * 7: Snowman (&amp;#34;☃&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cursorshape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Default columns and rows numbers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="dmenu"&gt;dmenu&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://tools.suckless.org/dmenu/"&gt;dmenu&lt;/a&gt; can be configured in the same way as Simple Terminal by editing a text file and compiling the software. I like to use many keyboard shortcuts, but I find that for launching applications I don&amp;rsquo;t use that often or to launch custom Bash or Python scripts on the fly, nothing beats the simplicity of &lt;strong&gt;dmenu&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="configuration-1"&gt;Configuration&lt;/h3&gt;
&lt;p&gt;This one is very easy to configure and doesn&amp;rsquo;t really require any attention at all besides defining where you want it to appear on the screen and what colors you prefer. Here are some smalls changes I made to the configuration in &lt;code&gt;config.h&lt;/code&gt; before compiling it:&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;div class="code-block__bar" data-pagefind-ignore&gt;
 &lt;span class="code-block__lang"&gt;cpp&lt;/span&gt;
 &lt;button class="code-block__wrap" type="button" aria-pressed="false" hidden&gt;Wrap&lt;/button&gt;
 
 &lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;topbar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/* -b option; if 0, dmenu appears at bottom */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* -fn option overrides fonts[0]; default X11 font or font set */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="s"&gt;&amp;#34;Consolas:size=12&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/* -p option; prompt to the left of input field */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SchemeLast&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="cm"&gt;/* fg bg */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SchemeNorm&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#D8D8D8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#000000&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SchemeSel&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#000000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#ff7400&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SchemeOut&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#000000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#00ffff&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* -l option; if nonzero, dmenu uses vertical list with given number of lines */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Characters not considered part of a word while deleting words
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * for example: &amp;#34; /?\&amp;#34;&amp;amp;[]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;worddelimiters&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="slock"&gt;slock&lt;/h2&gt;
&lt;p&gt;What can be said about slock? It just works and never gets in your way. Set it and really forget it. From the official page:&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;This is the simplest X screen locker we are aware of.&lt;/p&gt;

&lt;/blockquote&gt;&lt;p&gt;Again, its simplicity is charming and nothing really needs to be changed in &lt;code&gt;config.h&lt;/code&gt; apart from colors and setting the correct username and group name to lock and unlock the screen.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This was a lighting fast overview of some of the tools I now use on a daily basis. Suckless tools caught my attention and kept it! They offer other specialized software like a web browser, a tool for presentation from the terminal, IRC client and others&amp;hellip; but the ones described here are really those which I now can&amp;rsquo;t live without.&lt;/p&gt;
&lt;p&gt;I was originally inspired to seek out those tools thanks to &lt;a href="https://lukesmith.xyz/"&gt;Luke Smith&lt;/a&gt;, a &lt;a href="https://www.youtube.com/channel/UC2eYFnH61tmytImy1mTYvhA"&gt;fantastic YouTuber&lt;/a&gt;.&lt;/p&gt;</content:encoded><dc:creator>Sébastien Lavoie</dc:creator><pubDate>Sun, 12 May 2019 22:50:00 -0500</pubDate><guid isPermaLink="false">https://www.sglavoie.com/posts/suckless-minimalist-tools-that-work-great/</guid><category>tools</category><category>productivity</category><category>software</category><category>web</category></item><item><title>Dispose of Spam with Disposable Emails And More!</title><link>https://www.sglavoie.com/posts/dispose-of-spam-with-disposable-emails-and-more/</link><description>Have you ever received spam to your email address? Unless you are extremely lucky or are actually disconnected from the Internet and thus most probably not reading this, chances are you might have had an offer or two to receive gold from a Nigerian prince in the past. Before those princes and princesses generously start giving away their cryptocurrency in the near future in exchange for a trip to Western Union, get prepared and hide away your precious address!</description><content:encoded>&lt;hr&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;If your privacy matters to you even just a little, read on, if you dare.
There are easy solutions you can apply right now to filter those fools
out of your digital life.&lt;/p&gt;
&lt;h2 id="why-should-i-care"&gt;Why should I care?&lt;/h2&gt;
&lt;p&gt;Once your main email address is exposed to attacks because it was
leaked in a data breach or your data was somehow sold to a third-party
service, it is a hard and time-consuming process to try to unsubscribe
to everything or apply filters to automatically delete most of the
bad stuff coming in. Many websites won&amp;rsquo;t respect your privacy and
will go ahead and share your email, which can eventually have a
snowball effect and you end up getting more emails than there are trees
available to print them. As with printing emails, you must agree this
is totally irresponsible and should be punished by law
.&lt;/p&gt;
&lt;p&gt;Because attackers can often retrieve your complete name from your
email address (either because you signed up for a service sharing your
information from another provider or it&amp;rsquo;s easy to associate it with you
on social media, for example), they can craft advanced phishing emails
or create content that&amp;rsquo;s magically relevant to you thanks to social
engineering and if you don&amp;rsquo;t look close enough, you can fall into their
trap.&lt;/p&gt;
&lt;p&gt;Then suddenly, because you opened an attachment or went into the
&lt;strong&gt;dark&lt;/strong&gt; corners of the Web unbeknownst to you, your laptop fan is
spinning all the time at full speed or you get a colorful pop-up telling
you that all your files have been encrypted and a ransom, along with
only unrecognizable files on your system, convincingly dictates what
your destiny looks like. At this point, &lt;em&gt;you are doomed&lt;/em&gt;, unless you
actually take pleasure in formatting your computer once in a while for
the shear joy of it.&lt;/p&gt;
&lt;p&gt;So what shall we do about it?&lt;/p&gt;
&lt;h2 id="solution-1-use-a-temporary-email"&gt;Solution #1: Use a temporary email&lt;/h2&gt;
&lt;p&gt;This one is quick and easy. You can use a variety of services,
including &lt;a href="https://www.tempmailaddress.com/"&gt;Temp Mail Address&lt;/a&gt;,
&lt;a href="https://temp-mail.org/"&gt;Temp Mail&lt;/a&gt; and
&lt;a href="https://www.throwawaymail.com/"&gt;ThrowAwayMail&lt;/a&gt; to name a few. Those
are all free services and allow you to get access to a temporary email
address and its associated inbox.&lt;/p&gt;
&lt;p&gt;Perfect for all those cases when you want to receive a freebie or have
access to a specific page that asks for an email and a &lt;em&gt;real&lt;/em&gt; name. You
simply give a fake but working email address and you&amp;rsquo;re good to go.
Don&amp;rsquo;t even set it and forget it.&lt;/p&gt;
&lt;h2 id="solution-2-use-a-more-controlled-approach"&gt;Solution #2: Use a more controlled approach&lt;/h2&gt;
&lt;p&gt;There is one particular service that I have been using for almost
a decade now that eats your spam away on demand. That service is
appropriately called &lt;a href="https://www.spamgourmet.com"&gt;Spamgourmet&lt;/a&gt;. Does it
work? Here are my personal stats:&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;Your message stats: 805 forwarded, 14,191 eaten. You have 245 spamgourmet address(es).&lt;/p&gt;

&lt;/blockquote&gt;&lt;h2 id="does-it-really-work"&gt;Does it really work?&lt;/h2&gt;
&lt;p&gt;Oh yes! From the above stats, you can see that from a total of
&lt;strong&gt;14,996&lt;/strong&gt; messages being sent to me, I have not received almost &lt;strong&gt;95%&lt;/strong&gt;
of it thanks to Spamgourmet working on auto-pilot all the time&amp;hellip; And
it&amp;rsquo;s important to mention that &lt;strong&gt;the other 5%, I actually wanted to
receive it&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-does-it-work"&gt;How does it work?&lt;/h2&gt;
&lt;p&gt;You can create as many email addresses as you require to login to most
websites that you do not intend to use regularly and create a label
&lt;code&gt;Filtered mail&lt;/code&gt; in your inbox or something similar that matches anything
sent to &lt;code&gt;*@spamgourmet.com&lt;/code&gt;. You can create addresses on the fly without
ever needing to log into your Spamgourmet account and set how many
emails can be sent to a specific address all at once.&lt;/p&gt;
&lt;p&gt;With very few extra steps, you can manage your email addresses on
Spamgourmet, remove the ones you don&amp;rsquo;t want anymore, reset how many
emails can be received (increase/decrease that number), etc. You can
find out exactly how it works on the main page of Spamgourmet.&lt;/p&gt;
&lt;h2 id="why-consider-this-approach-instead-of-solution-1"&gt;Why consider this approach instead of solution #1?&lt;/h2&gt;
&lt;p&gt;This approach has the advantage that you can know exactly where your
spam is coming from and exactly when, as your email may be used quite a
long time after your original registration with a service to spam you.
If you have created an account on, say, &lt;code&gt;clouds.com&lt;/code&gt; with your special
email &lt;em&gt;created on the fly without ever needing to go to Spamgourmet&lt;/em&gt;,
let&amp;rsquo;s say it&amp;rsquo;s &lt;code&gt;clouds.my_username@spamgourmet.com&lt;/code&gt;, if you receive
spammy content sent to that address six months later, don&amp;rsquo;t look too
hard: you know who did it.&lt;/p&gt;
&lt;p&gt;Not only you know this, but you can keep on using this made up email
for as long as you wish. Need to be in touch with a person who
doesn&amp;rsquo;t fall into any of the categories &lt;code&gt;['friend', 'acquaintance', 'work', 'intimate', 'trustworthy']&lt;/code&gt;?
No worries, instantly claim &lt;code&gt;something.my_username@spamgourmet.com&lt;/code&gt; and
that&amp;rsquo;s the email you give that person. Since it doesn&amp;rsquo;t expire and you
have full control over how many more emails you can receive at that
address at any time, it can simplify a few exchanges where you don&amp;rsquo;t
really want to share your real email, not even to the Nigerian Prince.
This way, you can even receive attachments just as normal!&lt;/p&gt;
&lt;p&gt;You can even go as far as having trusted senders (from whom you can
receive as many emails as you define) and &lt;strong&gt;send mail from your custom
Spamgourmet emails, including with attachments&lt;/strong&gt;! For this, you can
visit Spamgourmet and generate an email of your choice that will be
sending to a specific address email. You will simply send the email to
this specially generated address from your email account and voilà!
The person on the other end will have a hard time figuring out your
real address, except if you added it in your signature.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.sglavoie.com/images/posts/0012_dispose-of-spam/spamgourmet_getting_through.png"&gt;&lt;img src="https://www.sglavoie.com/images/posts/0012_dispose-of-spam/spamgourmet_getting_through.png" alt="spamgourmet_getting_through" class="max-size-img-post"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="solution-3-using-filters"&gt;Solution #3: Using filters&lt;/h2&gt;
&lt;p&gt;Gmail is one email service that allows you to create filters as you
wish: let&amp;rsquo;s take advantage of that. What you could do is delete only
messages that match exactly the groups of terms you never want to read
as to not exclude important emails. To create one filter for all of
them, you can use the field &lt;code&gt;has words&lt;/code&gt; and enter something like the
following in the case of GDPR policy updates:&lt;/p&gt;
&lt;div class="code-block code-block--wrap"&gt;
 &lt;div class="code-block__bar" data-pagefind-ignore&gt;
 &lt;button class="code-block__wrap" type="button" aria-pressed="false" hidden&gt;Wrap&lt;/button&gt;
 
 &lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;Privacy Policy Update&amp;#34; OR &amp;#34;GDPR&amp;#34; OR &amp;#34;General Data protection regulation&amp;#34; OR &amp;#34;Updates to our terms of use&amp;#34; OR &amp;#34;Updates to our privacy&amp;#34; OR &amp;#34;updating our privacy&amp;#34; OR &amp;#34;updated our privacy&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you know more specifically how the words you are looking for appear,
you can check for turns of phrases such as &lt;code&gt;Updates to X's Privacy Policy&lt;/code&gt; and manage them with the keyword &lt;code&gt;AROUND &amp;lt;number&amp;gt;&lt;/code&gt;, where
&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; is how many words can be around what you are searching:&lt;/p&gt;
&lt;div class="code-block code-block--wrap"&gt;
 &lt;div class="code-block__bar" data-pagefind-ignore&gt;
 &lt;button class="code-block__wrap" type="button" aria-pressed="false" hidden&gt;Wrap&lt;/button&gt;
 
 &lt;/div&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;privacy policy&amp;#34; AROUND 3 update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This will look anywhere in the subject or in the content of the email
and find the word &lt;code&gt;update&lt;/code&gt; as well as &lt;code&gt;updates&lt;/code&gt; near the match &lt;code&gt;privacy policy&lt;/code&gt;. If you are interested in looking for the word &lt;code&gt;update&lt;/code&gt; but not
&lt;code&gt;updates&lt;/code&gt;, you can specify an exact match with the &lt;code&gt;+&lt;/code&gt; sign right in
front of it: &lt;code&gt;+update&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;Note: If you go too broad with the chosen keywords, you may not be able to reply to everything you would like to&amp;hellip;&lt;/sub&gt;&lt;/p&gt;
&lt;p&gt;A next step could be to filter potentially important emails with more
keywords but instead of deleting them, you can select a few options for
your filter such as &lt;strong&gt;Skip the Inbox&lt;/strong&gt; (Archive it), &lt;strong&gt;Mark as read&lt;/strong&gt;,
&lt;strong&gt;Apply the label&lt;/strong&gt; and &lt;strong&gt;Never mark it as important&lt;/strong&gt;. That way, you
still have access to all those emails and you can review them separately
and quickly at your convenience.&lt;/p&gt;
&lt;p&gt;For a list of available search operators, you can refer to
this &lt;a href="https://support.google.com/mail/answer/7190?hl=en&amp;amp;topic=1668965&amp;amp;ctx=topic"&gt;Gmail help page — Search operators you can use with Gmail&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="solution-4-use-the--symbol-in-your-email"&gt;Solution #4: Use the &lt;code&gt;+&lt;/code&gt; symbol in your email&lt;/h2&gt;
&lt;p&gt;Gmail lets you add a &lt;code&gt;+&lt;/code&gt; symbol in your email address. For
example, you can set up your &lt;code&gt;ServiceNameHere&lt;/code&gt; email to be
&lt;code&gt;username+ServiceNameHere@gmail.com&lt;/code&gt;. That way, you know where your spam
may be coming from, but it is always more effective to just use a unique
address with the above service or even forward emails from another Gmail
account so you never have to give away your main email. By doing this,
you can then set up filters for individual services. This doesn&amp;rsquo;t work
for all websites as sometimes the &lt;code&gt;+&lt;/code&gt; symbol isn&amp;rsquo;t allowed. In that
scenario, there is another way&amp;hellip;&lt;/p&gt;
&lt;h2 id="solution-5-forward-secondary-emails-to-your-main-email"&gt;Solution #5: Forward secondary emails to your main email&lt;/h2&gt;
&lt;p&gt;This is pretty straightforward and even though you initially have to do
more work to set things up, this can work very well for various reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You get 15GB on each Gmail account. This can be useful, as long as you don&amp;rsquo;t abuse it and get banned for life without the possibility of ever communicating through email ever again in your lifetime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can apply custom filters such as &lt;code&gt;send to trash&lt;/code&gt; for each secondary account before forwarding what&amp;rsquo;s left to your main account. You can then apply a filter in your main account to visually get a hint of where the email is coming from, like a label &lt;code&gt;my.second.email@gmail.com&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can stop forwarding emails at any moment if you decide. You will have to log into your secondary account and click a few buttons there, but it&amp;rsquo;s easy, almost painless and you shouldn&amp;rsquo;t have to repeat the process so often that it gets boring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can even set up your main account so that you are able to send messages from your main account as if it were coming from any of your secondary accounts. No more account switching: you get something sent to &lt;code&gt;my.second.email@gmail.com&lt;/code&gt; in your main account and you can have it set up so that when you reply to that email, it is automatically sent from that secondary email instead of the main one.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope you found something useful in this rambling about spam.
I don&amp;rsquo;t like spam myself, so if you have any tips or tricks you
would like to share with me to help in this quest for freedom,
please reach out to me at my email shared in plain text at
&lt;a href="mailto:sebastien39571@gmail.com"&gt;&lt;a href="mailto:sebastien39571@gmail.com"&gt;sebastien39571@gmail.com&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;</content:encoded><dc:creator>Sébastien Lavoie</dc:creator><pubDate>Wed, 03 Apr 2019 20:08:00 -0600</pubDate><guid isPermaLink="false">https://www.sglavoie.com/posts/dispose-of-spam-with-disposable-emails-and-more/</guid><category>tips-and-tricks</category><category>productivity</category><category>web</category></item><item><title>Surfing with qutebrowser — a Keyboard-Driven Web Browser</title><link>https://www.sglavoie.com/posts/surfing-with-qutebrowser-a-keyboard-driven-web-browser/</link><description>I recently started using this software as my main web browser and, as a Vim (Neovim) user, I must say I am finding the adventure quite compelling!</description><content:encoded>&lt;hr&gt;
&lt;h2 id="what-is-qutebrowser"&gt;What is qutebrowser?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://qutebrowser.org/"&gt;qutebrowser&lt;/a&gt; is a web browser that makes
great use of &lt;strong&gt;Vim&lt;/strong&gt; commands to navigate. From its website:&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;qutebrowser is a keyboard-focused browser with a minimal GUI. It’s
based on Python and PyQt5 and free software, licensed under the GPL.
It was inspired by other browsers/addons like dwb and
Vimperator/Pentadactyl.&lt;/p&gt;

&lt;/blockquote&gt;&lt;hr&gt;
&lt;h3 id="why-use-it"&gt;Why use it?&lt;/h3&gt;
&lt;h4 id="perfect-companion-to-any-vim-user"&gt;Perfect companion to any Vim user&lt;/h4&gt;
&lt;p&gt;The first notable feature of &lt;strong&gt;qutebrowser&lt;/strong&gt; is obviously how well
the use of keyboard shortcuts is integrated with the experience of
using the software (there is a useful key binding cheatsheet on the
&lt;a href="https://qutebrowser.org/"&gt;homepage&lt;/a&gt;). Search bindings (&lt;code&gt;/&lt;/code&gt;, &lt;code&gt;n&lt;/code&gt;/&lt;code&gt;N&lt;/code&gt;,
&lt;code&gt;?&lt;/code&gt;), visual mode (&lt;code&gt;v&lt;/code&gt;), tabs (&lt;code&gt;gt&lt;/code&gt;, &lt;code&gt;T&lt;/code&gt;), copy (&lt;code&gt;yy&lt;/code&gt;), open URLs
(&lt;code&gt;o&lt;/code&gt;/&lt;code&gt;O&lt;/code&gt;), &lt;code&gt;J&lt;/code&gt; and &lt;code&gt;K&lt;/code&gt; for switching tabs, etc. Many key bindings will
look familiar to Vim users.&lt;/p&gt;
&lt;p&gt;It even features a &lt;em&gt;command mode&lt;/em&gt;, accessible by typing &lt;code&gt;:&lt;/code&gt;, just like
with Vim. Settings can be set from there directly, help can be accessed
by typing &lt;code&gt;:help [command/setting]&lt;/code&gt;, the configuration file can be
customized on the fly, the position and size of tabs can be set in many
ways, history and settings page can be accessed and navigated through
like any other page (&lt;code&gt;hjkl&lt;/code&gt;, &lt;code&gt;Ctrl + d&lt;/code&gt;, &lt;code&gt;Ctrl + u&lt;/code&gt;, &lt;code&gt;gg&lt;/code&gt;, &lt;code&gt;G&lt;/code&gt;), etc.&lt;/p&gt;
&lt;p&gt;Even though it is based on Python which is a &amp;ldquo;&lt;em&gt;slow&lt;/em&gt;&amp;rdquo; language, most of
the libraries and the web engine rely on C++ and the end result is a
fast and powerful browser that&amp;rsquo;s totally customizable&amp;hellip; Not unlike Vim.&lt;/p&gt;
&lt;h4 id="minimal-interface--more-space"&gt;Minimal interface ⇒ more space&lt;/h4&gt;
&lt;p&gt;Until I upgrade my laptop to a larger screen (≥ 17 inches), my
current setup with its 15 diagonal inches benefits tremendously
from configuring all applications to use pixels as efficiently as
possible — which is why I now use exclusively [i3 as a window
manager](/posts/2019/01/08/using-i3-as-a-window-manager-for-increased-pr
oductivity/).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;qutebrowser&lt;/strong&gt; doesn&amp;rsquo;t even have a menu bar. By default, it only
displays a small tab bar at the top (which can be moved to another
side or removed) and a thin status bar at the bottom to see the URL,
the current position in the page expressed in percentage, the number
assigned to the current tab, etc. There is also a fullscreen mode
available like in most other web browsers with the key &lt;code&gt;F11&lt;/code&gt;, which will
remove any window decoration and leave you in a (possibly) productive
mode.&lt;/p&gt;
&lt;h4 id="history-bookmarks-and-quickmarks"&gt;History, bookmarks and quickmarks&lt;/h4&gt;
&lt;p&gt;The history page (&lt;code&gt;:history&lt;/code&gt;), while being minimal like all the rest,
loads extremely fast and is a joy to navigate. The bookmarks page (&lt;code&gt;Sb&lt;/code&gt;)
is equally simple yet useful. The way I like to open a bookmark is in
a new tab by typing &lt;code&gt;gB&lt;/code&gt; (&lt;strong&gt;g&lt;/strong&gt;o &lt;strong&gt;b&lt;/strong&gt;ookmark as a mnemonic. Note that
usually all uppercase letters open or do some action in a new space,
such as a window or a tab).&lt;/p&gt;
&lt;p&gt;Where &lt;strong&gt;qutebrowser&lt;/strong&gt; shines in my opinion is with quickmarks. This is
a simple but genius way to find what you are looking for: you type &lt;code&gt;b&lt;/code&gt;
(or &lt;code&gt;B&lt;/code&gt; for new tab) to open a list of pages that are defined with a
keyword, you type that keyword (or can type anything to search for a
page), move around with arrow keys if necessary to select a page, type
&lt;code&gt;Enter&lt;/code&gt; and there you go. As far as I know, Google Chrome doesn&amp;rsquo;t offer
the equivalent (only keywords for search engines). Firefox allows to add
keywords for any bookmark that you have, but there is no good way to
search around for keywords, define them quickly, remove them quickly,
etc. &lt;strong&gt;qutebrowser&lt;/strong&gt; comes with a set of commands that serve just this
purpose (&lt;code&gt;:quickmark-add&lt;/code&gt;, &lt;code&gt;quickmark-del&lt;/code&gt;, etc.), apart from adding
them very quickly by typing &lt;code&gt;m&lt;/code&gt; for quickmarks and &lt;code&gt;M&lt;/code&gt; for bookmarks.&lt;/p&gt;
&lt;h4 id="hinting-system"&gt;Hinting system&lt;/h4&gt;
&lt;p&gt;You may have tried extensions for other web browsers such as Vimium,
Vimperator, or Vimium-FF that let you navigate with Vim shortcuts. They
usually use the letter &lt;code&gt;f&lt;/code&gt; for &lt;strong&gt;f&lt;/strong&gt;ollowing links. Some text appear on
the screen for each visible link and you type the letters that match the
link you want to see. The best way to get how it works is just to try it
out, really.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.sglavoie.com/images/posts/0007_surfing-with-qutebrowser/qutebrowser_hints.png"&gt;&lt;img src="https://www.sglavoie.com/images/posts/0007_surfing-with-qutebrowser/qutebrowser_hints.png" alt="qutebrowser-hints" class="max-size-img-post"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Well, &lt;strong&gt;qutebrowser&lt;/strong&gt; takes those features and make them even greater!
There is, for example, a &lt;em&gt;rapid hinting mode&lt;/em&gt; you can access by typing
&lt;code&gt;f&lt;/code&gt; followed by &lt;code&gt;Ctrl + r&lt;/code&gt; and it will open links in the background
for as long as you type any matching &lt;em&gt;hint&lt;/em&gt; provided as a letter or
combination of two letters when there are many visible links on the
page. This is especially useful when doing some research to avoid
breaking the rhythm on the current reading while preparing more
resources to be available.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="whats-the-best-place-to-start-learning-about-it"&gt;What&amp;rsquo;s the best place to start learning about it?&lt;/h3&gt;
&lt;p&gt;The &lt;a href="https://qutebrowser.org/doc/help/"&gt;help page&lt;/a&gt; on the website
contains all the information you really need. I did stumble upon the
following resources, which I would recommend to read in order of
appearance:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://qutebrowser.org/doc/quickstart.html"&gt;Quickstart Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[Key bindings
cheatsheet](&lt;a href="https://raw.githubusercontent.com/qutebrowser/qutebrowser/ma"&gt;https://raw.githubusercontent.com/qutebrowser/qutebrowser/ma&lt;/a&gt;
ster/doc/img/cheatsheet-big.png).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qutebrowser.org/doc/faq.html"&gt;FAQ&lt;/a&gt;, which is interesting
but not indispensable. It did help me take a step forward in trying out
&lt;strong&gt;qutebrowser&lt;/strong&gt; though.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Open inside qutebrowser&lt;/em&gt;: &lt;a href="qute://help/settings.html#bindings.default"&gt;default
keybindings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Open inside qutebrowser&lt;/em&gt;: &lt;a href="qute://settings/"&gt;settings page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qutebrowser.org/doc/help/commands.html"&gt;List of commands&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;qutebrowser&lt;/strong&gt; has been around for a while and is very stable. It is
ideal for any Vim user and is a great option for anyone interested in
efficiency and/or in trying out alternatives. Because I am very fond
of relying on the keyboard as much as possible and because I love to
program in Python, I have grown to like this web browser very quickly.
This is clearly a tool designed for a specific type of user in mind and
who knows, you might be one of those.&lt;/p&gt;</content:encoded><dc:creator>Sébastien Lavoie</dc:creator><pubDate>Mon, 11 Feb 2019 14:46:00 -0600</pubDate><guid isPermaLink="false">https://www.sglavoie.com/posts/surfing-with-qutebrowser-a-keyboard-driven-web-browser/</guid><category>tools</category><category>productivity</category><category>software</category><category>web</category></item></channel></rss>