<?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: Angad Sharma</title>
    <description>The latest articles on DEV Community by Angad Sharma (@l04db4l4nc3r).</description>
    <link>https://dev.to/l04db4l4nc3r</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%2F197603%2Fa4320666-6350-4843-b37e-07bcfa168f55.png</url>
      <title>DEV Community: Angad Sharma</title>
      <link>https://dev.to/l04db4l4nc3r</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/l04db4l4nc3r"/>
    <language>en</language>
    <item>
      <title>Self hosted GitHub Actions using Raspberry Pi</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Sun, 20 Dec 2020 08:36:44 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/self-hosted-github-actions-using-raspberry-pi-212m</link>
      <guid>https://dev.to/l04db4l4nc3r/self-hosted-github-actions-using-raspberry-pi-212m</guid>
      <description>&lt;p&gt;We live in a time where anyone can write code. What matters is how efficiently you write and test it and of course how you distribute it. Continuous integration has become a major part of GitOps and github actions has make it very easy to write simple configurations for CI and associate it with an event on your code repository (for example: on code release).&lt;/p&gt;

&lt;h3&gt;
  
  
  The need
&lt;/h3&gt;

&lt;p&gt;The Github Actions platform provides developers with the power to test and package their code on github's infrastructure for free. But like all free things, this also comes with a catch. You can only run your actions as per a limited quota provided by github. This forces developers to compromise their pipeline to ensure that CI builds run less often. What if I told you that your cheap credit-card sized raspberry pi can be used as a machine to run all of your github actions automatically? Well such is the power of SBCs(single board computers) in 2020.&lt;/p&gt;

&lt;p&gt;Ever since the launch of raspberry pi 4, single board computing has reached new heights, with more than &lt;a href="https://youtu.be/ZZ2ub2RZ0o8"&gt;35 million&lt;/a&gt; copies sold as per the publishing date of this article, with around 44% of the units sold to industrial customers. In light of this development, this article will be all the more relevant to a wide variety of consumers willing to run more workloads from their internal networks and self hosted comfort zones.&lt;/p&gt;

&lt;p&gt;Let us start by elaborating why you would want your github actions to run on the raspberry pi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited github actions quota&lt;/li&gt;
&lt;li&gt;No need to expose infrastructure from the internal network&lt;/li&gt;
&lt;li&gt;Low power draw&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Full and sole ownership of data&lt;/p&gt;

&lt;p&gt;If you are an enterprise user (or part of an organization that is an enterprise on github), you can pretty much configure your entire organization actions to run on self hosted solutions, but if you are an individual user, you can only do so on a per-repository level. With this information, let us get started with how to offload your github actions to your raspberry pi.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Steps to run your own actions on a raspberry pi
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Firstly you will need a raspberry pi with any linux distribution. I prefer Ubuntu server 20.04. Run a quick update and upgrade on it to set it up. Remember that you don't need to configure any kind of port forwarding since this solution will work even if you raspberry pi is not exposed on the external network. You do need an internet connection though since your pi will have to connect to the GitHub servers for this to work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the &lt;strong&gt;Actions&lt;/strong&gt; setting in your repository (remember, this is a repository level setting rather than a global one. If you are an enterprise user, you can go into your enterprise settings for the same) and press the option to add a new Self Hosted Runner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the add self hosted runner section, choose operating system as linux and architecture as ARM64 if you are using a 64 bit raspberry pi, or just ARM if you are using a 32 bit version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The add self hosted runners section gives you the necessary commands to run inside your raspberry pi to set everything up. After you have pasted those commands one by one, you are ready to starting the service in your pi that will listen or any dispatched actions and perform them internally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;./run.sh&lt;/code&gt; allows you to start listening immediately. If you want this service to run permanently in the background, you can run the following command:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./svc.sh &lt;span class="nb"&gt;install
sudo&lt;/span&gt; ./svc.sh start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Configure your actions to use this infrastructure by using the keyword self-hosted in the actions configuration for the repository for which you have set up the actions. For example:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Go Build&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;self-hosted&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Go 1.x&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-go@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;go-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.15&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check out code into the Go module directory&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Build&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;make build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Raspberry pi attracts a huge community of enthusiasts who use it for various use cases. There have been amazing projects like &lt;a href="https://turingpi.com/"&gt;the turing pi&lt;/a&gt;, which make use of the more compact &lt;a href="https://www.raspberrypi.org/products/compute-module-4/?variant=raspberry-pi-cm4001000"&gt;Compute module 4&lt;/a&gt; of the raspberry pi to provide server grade computing. Projects like these have enabled developers and system administrators to get cheap compute for self hosted workloads. Easy GitOps is just another fun yet sustainable solution to configure to your own satisfaction, whether it be for a fun project or an industrial use case.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>github</category>
      <category>devops</category>
    </item>
    <item>
      <title>InstantWM: Animations in a Window Manager!</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Thu, 08 Oct 2020 13:29:24 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/instantwm-animations-in-a-window-manager-48f4</link>
      <guid>https://dev.to/l04db4l4nc3r/instantwm-animations-in-a-window-manager-48f4</guid>
      <description>&lt;p&gt;InstantWM is a window manager to &lt;strong&gt;InstantOS&lt;/strong&gt;, which is an Arch-Linux based operating system that aims to work right out of the box and also cater to power users. It went through a lot of scrutiny and controversy in it's development process, primarily due to faulty reviews from a particular youtuber (&lt;a href="https://www.youtube.com/channel/UCVls1GmFKf6WlTraIb_IaJg" rel="noopener noreferrer"&gt;distrotube&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;The developer subsequently &lt;a href="https://youtu.be/XTjAO3yUqpQ" rel="noopener noreferrer"&gt;released a video&lt;/a&gt; with some bugs either excavated, or altogether nullified by the faulty review. When the smoke settled, people started reviewing InstantOS, but no one has really made a standalone review of &lt;strong&gt;InstantWM&lt;/strong&gt;, which is the window manager that the OS uses, and can be installed on any distribution. I feel like this window manager deserves its own "series" of reviews.&lt;/p&gt;




&lt;h3&gt;
  
  
  First Impressions
&lt;/h3&gt;

&lt;p&gt;I usually start my reviews with features and the installation procedure, but for this particular WM, I felt that a first impressions review is necessary due to the underlying controversy. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is the best and the most versatile window manager I have used in a while&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Considering I have used stable and extendible WMs such as xmonad and i3, instantWM bring a lot to the table. On first glance, it looks like a &lt;a href="https://dwm.suckless.org/" rel="noopener noreferrer"&gt;dwm&lt;/a&gt; fork. That is because it is, but only 40% of the suckless code is remaining in the instantWM repository.&lt;/p&gt;

&lt;p&gt;It's versatility comes in the fact that it is both a tiling and a floating window manager. It has a menu like &lt;a href="https://awesomewm.org/" rel="noopener noreferrer"&gt;awesome&lt;/a&gt;, and you can even use it with a mouse instead of a keyboard, which makes it suitable for newcomers as well. It's modernity is in the fact that it is both minimal and fashionable at the same time, with it's attractive window animations and compsiting effects without sacrificing any functionality.&lt;/p&gt;




&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;InstantWM is no joke. It is feature rich without sacrificing on functionality and usability. Some of its main features include.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patchless configuration (you don't have to manually patch things into the config)&lt;/li&gt;
&lt;li&gt;Modern window transition animations without sacrificing on speed&lt;/li&gt;
&lt;li&gt;Full multimedia and multimonitor support out of the box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instantutils&lt;/strong&gt; offers a rich set of utilities for support&lt;/li&gt;
&lt;li&gt;Hybrid window manager (floating + tiling)&lt;/li&gt;
&lt;li&gt;Tag system reminiscent of dwm, with tag pinning support as well&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;If you are coming from a &lt;em&gt;dwm&lt;/em&gt; background, you can simply skip this section. &lt;/p&gt;

&lt;p&gt;You need to clone the instantWM repository and build it from source. This is the same way dwm works. Even the configuration is done in the code itself, and needs to recompile after every change.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

git clone &lt;span class="nt"&gt;--depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 https://github.com/instantOS/instantWM.git
&lt;span class="nb"&gt;cd &lt;/span&gt;instantWM
./build.sh


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;These commands will generate a binary. You can then logout of your current DE or WM and login to instantWW, either using a &lt;a href="https://dev.to/l04db4l4nc3r/the-linux-desktop-deep-dive-1jh3#display-manager"&gt;display manager&lt;/a&gt;, or through changing your &lt;code&gt;~/.xinitrc&lt;/code&gt; to say the following:&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;exec &lt;/span&gt;instantwm


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Before logging into instantWM, you can download the &lt;strong&gt;instantutils&lt;/strong&gt;, which are available in the linux source repositories. We will touch on what these utilities do later on.&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;# instantutils is available in the AUR&lt;/span&gt;
yay &lt;span class="nt"&gt;-S&lt;/span&gt; instantutils


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;InstantWM uses the &lt;a href="https://st.suckless.org/" rel="noopener noreferrer"&gt;st&lt;/a&gt; terminal by default, so make sure you either have an st build or you change the configuration (&lt;code&gt;termcmd&lt;/code&gt;) to point to another terminal.&lt;/p&gt;


&lt;h3&gt;
  
  
  Tiling Modes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://instantos.io/youtube/layouts#rundown-of-all-layouts" rel="noopener noreferrer"&gt;The official web page&lt;/a&gt; has a rundown of all instantWM layouts. Some high utility ones are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grid Layout&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This layout arranges windows in a grid of equally sized windows.&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%2Fi%2Fdj23c0z4x8qo7m1qe69c.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%2Fi%2Fdj23c0z4x8qo7m1qe69c.png" alt="Grid Layout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centered Master&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of m favourite layouts, centered master is a layout where the window at the center is the master and all other windows pop up on the left and right hand sides.&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%2Fi%2F6nr5wljsibvp84fpqgfj.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%2Fi%2F6nr5wljsibvp84fpqgfj.png" alt="Centered Master"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Horizontal Stack Layouts - 1 and 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are your traditional tiling modes but tiling is done either horizontally or vertically.&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%2Fi%2Fhiheo2vnmaunwtaaceas.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%2Fi%2Fhiheo2vnmaunwtaaceas.png" alt="TTT"&gt;&lt;/a&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%2Fi%2Fdzkz9uiyn94rwcl4qwz0.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%2Fi%2Fdzkz9uiyn94rwcl4qwz0.png" alt="==="&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This layout stacks windows in a way that each window is visible and is unchanged from its size in the previous layout.&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%2Fi%2Fb30fdkh5pyfne7vcuwik.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%2Fi%2Fb30fdkh5pyfne7vcuwik.png" alt="Overview Layout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Half Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The master area is tiled normally, but the stack works like the monocle layout with all windows layered on top of each other.&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%2Fi%2Fej43e6mmkw8pdnp0c0dh.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%2Fi%2Fej43e6mmkw8pdnp0c0dh.png" alt="Half Stack"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other layouts are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Floating&lt;/li&gt;
&lt;li&gt;Monocle&lt;/li&gt;
&lt;li&gt;Tiling Layout (Master and Stack)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Overlay Windows
&lt;/h3&gt;

&lt;p&gt;Have you ever played games where you get an overlay console when you press the tilde button, where you can enter commands? You can do the same thing to your windows in instantWM. &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%2Fi%2Fr6ej5ro40sdgfhty8mds.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%2Fi%2Fr6ej5ro40sdgfhty8mds.png" alt="Overlay"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;super&lt;/code&gt; + &lt;code&gt;control&lt;/code&gt; + &lt;code&gt;w&lt;/code&gt; overlays your current window on top of the other windows and essentially locks it in place so it cannot be accidentaly removed. You can then press the same keybinding to undo the action. This gives you a lot of power when you are developing as well as looking at documentation, or a manpage. You can &lt;a href="https://youtu.be/T40cfbBVBQw" rel="noopener noreferrer"&gt;checkout available overlay animations&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;InstantWM can be configured the same way you configure &lt;em&gt;dwm&lt;/em&gt;. If you haven't read my blog on how to configure dwm, you can give it a read here:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/l04db4l4nc3r" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F197603%2Fa4320666-6350-4843-b37e-07bcfa168f55.png" alt="l04db4l4nc3r"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/l04db4l4nc3r/dwm-the-suckless-window-manager-1ji" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Dwm: The Suckless Window Manager&lt;/h2&gt;
      &lt;h3&gt;Angad Sharma ・ Apr 7 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#linux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ubuntu&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;Or you can directly go into the &lt;a href="https://dev.to/l04db4l4nc3r/dwm-the-suckless-window-manager-1ji#configuration-and-patching"&gt;configuration section&lt;/a&gt;, to checkout how to tweak instantWM to your liking. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: A key difference between InstantWM and dwm configuration is that instantWM does not have a patch and diff system like dwm, and additional has a &lt;code&gt;build.sh&lt;/code&gt; script that you can run everytime you change a configuration.&lt;/p&gt;




&lt;h3&gt;
  
  
  Multiple Monitor Support
&lt;/h3&gt;

&lt;p&gt;I do not write about multiple monitor support a lot when I am doing my window manager reviews since the WMs that support this feature usually require &lt;code&gt;xrandr&lt;/code&gt; commands to be run in order to set the display, but instantWM comes with an amazing utility for the same.&lt;/p&gt;

&lt;p&gt;The moment you plug your external display in, an instantmenu pops up, asking if you want to mirror or extend your display out to the secondary display. This is a great feature that I hope more window managers incorporate.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/cH2b7rz6xNU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You can easily switch between monitors and send current windows to the secondary display without leaving your keyboard, as shown in the video above.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;InstantWM and its instantutils can be easily downloaded and configured for any system and you don't necessarily have to have instantOS for the best experience. People in the WM community are used to using minimal and lightweight WMs which often compromise on aesthetics. It is great to see a window manager with a modern user experience that is still minimal enough to be installed and used on low power machines.&lt;/p&gt;

&lt;p&gt;As of now (when this article was written), instantWM is still in beta and actively looking for contributors. I am glad to see that the developer is also building towards ARM and 32 bit support. I can recommend this window manager to beginners as well as power users due to its outstanding versatility.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Judgement Rubric&lt;/th&gt;
&lt;th&gt;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity of use&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity of Configuration&lt;/td&gt;
&lt;td&gt;❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve (lesser is better)&lt;/td&gt;
&lt;td&gt;❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fun&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>linux</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Self Hosting to the Xtreme | Server on Mobile?!</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Wed, 30 Sep 2020 18:05:37 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/self-hosting-to-the-xtreme-server-on-mobile-33b</link>
      <guid>https://dev.to/l04db4l4nc3r/self-hosting-to-the-xtreme-server-on-mobile-33b</guid>
      <description>&lt;p&gt;How I got a server to run on Android without rooting it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/gdg-vit/self-hosting-to-the-xtreme-server-on-mobile-2b205d9bd84d?source=rss-14899f3695b2------2"&gt;Continue reading on DSC VIT Vellore »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>go</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Got Tired of Being Un-Informed | Not Anymore</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Thu, 02 Jul 2020 16:13:24 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/i-got-tired-of-being-un-informed-not-anymore-3aeg</link>
      <guid>https://dev.to/l04db4l4nc3r/i-got-tired-of-being-un-informed-not-anymore-3aeg</guid>
      <description>&lt;p&gt;How I started reading more than 100 articles a week!&lt;/p&gt;

&lt;p&gt;Food for thought: How many times have you wished you could read more? And how many times have you felt disheartened by the fact that you are not reading enough? Well you would feel good to know that it is NOT you who is entirely to blame.&lt;/p&gt;

&lt;p&gt;The internet has become a mess of different sources of information and all of them seem relevant, if not legitimate, primarily due to the fact that in this age of misinformation, a lot of us have evolved with an inherent radar for detecting bullsh*t. Still nowadays there are too many sources of legitimate information too, and it keeps on getting outdated and updated.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Then there is the talk of &lt;strong&gt;Embracing the Apotheosis of Apps_._&lt;/strong&gt; With each one claiming to bring new content to the table and each one aggravating imposter syndrome.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gWnZ1rzA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A_7hHxlOWJgdR91Lp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gWnZ1rzA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A_7hHxlOWJgdR91Lp" alt="" width="880" height="583"&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@healing_photographer?utm_source=medium&amp;amp;utm_medium=referral"&gt;Aarón Blanco Tejedor&lt;/a&gt; on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am a developer by profession. So naturally I love to stay up to date on my GitHub feed. But then I also manage an organization so I need to be updated on that front too. Then I keep on getting notifications of subreddits that I follow, along with daily and weekly newsletters of a plethora of blogs being spammed in my mailbox. Moreover, platforms like DEV and Medium swarm you with an array of meaningful information to churn. I become swarmed! And for the longest of time, this demotivated me. Even though I had a lot of meaningful content at a touch of a button.&lt;/p&gt;

&lt;p&gt;In this blog I am going to talk about how I optimized my workflow by organizing information. Subsequently, I am also going to answer the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to get into a habit of reading more&lt;/li&gt;
&lt;li&gt;How to &lt;em&gt;stay&lt;/em&gt; true to your habit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Bringing Everything to one place
&lt;/h3&gt;

&lt;p&gt;Ditch the so-called &lt;em&gt;apotheosis of apps.&lt;/em&gt; Ditch your Firefox bookmarks, delete your news apps, unsubscribe to all mailing lists. You don’t need them. THEY need you. They are the ones monetizing your data, which is costlier than oil these days. They are the ones earning from your suffering. If you are waking up in the morning and opening fifteen apps for checking your feed on different social media, then you are doing something wrong.&lt;/p&gt;

&lt;p&gt;You can see where this is headed. Rest assured this blog is not an introduction to RSS. If you want that, &lt;a href="https://en.wikipedia.org/wiki/RSS"&gt;go here&lt;/a&gt;. RSS feeds (or atom feeds), allow you to subscribe to your own feed and view it from special apps called &lt;em&gt;RSS Readers.&lt;/em&gt; Almost every blogging and social media platform has an RSS feed. Just look for this sign:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6MK9n8Kh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/128/1%2ASSgD6uBB2cZhcdj1lkGlcA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6MK9n8Kh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/128/1%2ASSgD6uBB2cZhcdj1lkGlcA.png" alt="" width="128" height="128"&gt;&lt;/a&gt;RSS icon (look for this in every website)&lt;/p&gt;

&lt;p&gt;The benefit of RSS is that now you only have one application that you need to open, which is your RSS feed reader. You can then get all of your latest news, blogs and feed directly into it. I use newsboat, which is a terminal based RSS reader:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vKqj9yFq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ato-nAA2-FZyWENlmfJkVGA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vKqj9yFq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ato-nAA2-FZyWENlmfJkVGA.png" alt="" width="880" height="564"&gt;&lt;/a&gt;&lt;em&gt;newsboat&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can see that I have my GitHub, Reddit feeds along with so much more. Having this much variety of information would have otherwise required me to have all of the associated web pages bookmarked or their applications installed. This saves a LOT of time. Whenever I start my day anew, I just stir some coffee and go through my RSS feed to get all caught up with everything going around which is relevant to me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Know How to Podcast
&lt;/h3&gt;

&lt;p&gt;Having all of the relevant information in one place means having your favourite podcasts as well. They might require you to open the webpage to listen to them. But you can integrate everything in your reader (at least an advanced reader such as newsboat).&lt;/p&gt;

&lt;p&gt;The way I have configured my workflow is that whenever there is a podcast I like to listen to, I just press a &lt;em&gt;macro&lt;/em&gt; which I have configured in newsboat, and it automatically plays that podcast in my favourite audio/video player. This saves me the time it takes to open up a browser and press controls that are alien to me, at least when compared to my favourite video player.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Take Notes
&lt;/h3&gt;

&lt;p&gt;If you really like something and want to remember it, then what will you do? Surely &lt;strong&gt;you won’t take hand written notes&lt;/strong&gt; on it, especially when everything is written in a concise form anyway. At least I know I won’t. Then it is time to integrate your note distribution application with your RSS reader.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nttrFZN3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A0uamBudX9y9MkCwA6q1tVw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nttrFZN3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A0uamBudX9y9MkCwA6q1tVw.gif" alt="" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now if your reader isn’t advanced enough then you can simply save the URL of the particular post you like. I like to integrate &lt;em&gt;Joplin&lt;/em&gt; with my newsboat RSS reader. So, with just a press of a &lt;em&gt;macro,&lt;/em&gt; I can save any blog/podcast I like (in markdown of course) and sync it across devices (yes, Joplin even has a mobile application).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Choose the Right Font
&lt;/h3&gt;

&lt;p&gt;Studies such as &lt;a href="https://dl.acm.org/doi/pdf/10.1145/274644.274658"&gt;&lt;em&gt;A study of fonts Designed for Screen Display&lt;/em&gt;&lt;/a&gt; claim that human performance in terms of both reading and productivity when working with a screen is affected greatly by the font used. Times New Roman is a great font for writing research papers and journals, but it was made with print in format rather than screen. Fonts like Georgia (serif) and Verdana (sans serif) are a good fit for screens. In the aforementioned research, subjective perception of fonts favoured Georgia, the serif font and participants found it easier to read on the screen than Times New Roman and ended up performing better in the case of the former.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zF9YIpRy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/791/1%2AHOAqY0wZZI6w8diVytnRgA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zF9YIpRy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/791/1%2AHOAqY0wZZI6w8diVytnRgA.png" alt="" width="791" height="342"&gt;&lt;/a&gt;JetBrainsMonoExtraBold font&lt;/p&gt;

&lt;p&gt;I, personally, am a huge fan of the &lt;em&gt;Nerd Fonts,&lt;/em&gt; especially monospaced fonts. Some of my choices include &lt;strong&gt;JetBrainsMono&lt;/strong&gt; and &lt;strong&gt;SauceCodePro,&lt;/strong&gt; and their respective bold variants. The photo you see above is an example of the &lt;em&gt;JetBrainsMonoExtraBold Nerd Font.&lt;/em&gt; Notice how relaxing it is to read. Each and every character is distinguishable from the other and it makes skimming an overall pleasure. I like to use a keyboard with my laptop, so usually I am an extra few inch away from the screen, which makes this font perfect for me as I don’t have to strain my eyes or squint while reading. Note that it is about how comfortable you get, so check out a couple of fonts and decide which one suits your best. It will change your life.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Dark or Light Theme?
&lt;/h3&gt;

&lt;p&gt;Now I am a programmer, so you might be thinking you already know what the answer to this question is. The fact of the matter is that although my IDEs and GTK applications are dark themed, but my Joplin app uses the solarized light theme. This is because usually note making or reading is the thing I do in the morning, when my house is flooded with light.&lt;/p&gt;

&lt;p&gt;Using dark theme when your background is full of light can actually be bad for your eyes. So, make the choice between using dark at “certain times” of the day, or stick to one or two apps that are always light themed. If you are a vampire and light burns you then you can go for a more solarized theme like I have in the photo above. It is soothing to the eyes without harming them in the long run when being used in a brightly lit environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Prioritize Through Visibility
&lt;/h3&gt;

&lt;p&gt;Okay so you got your feed reader and note application set up. But what will make you even more productive is you can prioritize certain textual information more than the others. For example, the title of a blog should be the first thing you see, and should be catchy to the eyes. &lt;em&gt;Red&lt;/em&gt; is my preferred colour of choice. Although red stings the eyes a bit (more so than other colours), but it is complemented by the fact that we only read the title for a few seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R3K-m_v5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AUZIoxOSVYM-DExp6zBlSig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R3K-m_v5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AUZIoxOSVYM-DExp6zBlSig.png" alt="" width="880" height="495"&gt;&lt;/a&gt;JetBrainsMono Nerd Font with text prioritized through visibility&lt;/p&gt;

&lt;p&gt;The body of the document is where the fun begins. It is the part which requires most of your attention, after the title, so it should be catchy to the eyes. But it is the part which you read the most, so it is also supposed to be soothing. I prefer a green body. All of the other metadata like the author and data, are not very important to me so I give them a blue colour on a dark background. Note that these colours depend on the background of your choice to. So, sort out step 5 then take a look at optimizing visibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Variety Variety Varaiety
&lt;/h3&gt;

&lt;p&gt;One bad thing that I have seen a lot of specialists do is that they try to stick to reading content which is relevant to only their stream. This lack of variety leads to a feeling of repetition and might be a reason for your rut. Moreover, doing this regularly limits your perspective and you find it increasingly difficult to have a professional talk to people who are not part of your specialization. Everyone loves listening to romantic music from time to time. But imagine listening to ONLY romantic music!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Spice up your reading time with variety. Don’t let an essential brain-workout bore you. If you can’t eat pizza every day for the rest of your life, then why should you do the same thing with reading?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ensure variety in what you read. This allows you to stay up to date with more than one fields and allows you to connect to people who are not in yours. In addition to a bunch of programming feeds, I also have some feeds related to comedy/humor, as well as about people and politics, and I am an avid reader about mental health too. Hackernews is one of my favourite feeds. Primarily because it offers a variety of blogs/news which somehow connect to my field.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Tell People About It
&lt;/h3&gt;

&lt;p&gt;Make a public commitment. Tell people about your workflow and what you are trying to achieve. And moreover, share what you have learnt with other people. Don’t be selfish or competitive, after all, knowledge is a source which multiplies the more you spread it.&lt;/p&gt;

&lt;p&gt;Start small. Find a person and tell them at least one interesting thing that you read every day. Whether it is a fact, a joke, or some interesting blog about how Deno is the next Node.js. It doesn’t matter. The source must be textual. This ensures instant gratification and gives you a reason to carry on until you have successfully incubated the bookworm in you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closing Note
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Take a day, take two days, take a week. You will never form a habit if you don’t find joy in doing it. Find what works for you and make it your workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/L04DB4L4NC3R/DEC/tree/master/config/newsboat"&gt;L04DB4L4NC3R/DEC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/gdg-vit/the-podcast-ical-journey-since-2004-87c2955cb206"&gt;The Podcast-ical Journey: Since 2004&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This Article was originally published &lt;a href="https://medium.com/gdg-vit/editor-almighty-79807100f10c"&gt;on Medium&lt;/a&gt; under &lt;a href="https://dscvit.com/"&gt;Developer Student Clubs VIT, Powered By Google Developers&lt;/a&gt;. &lt;a href="https://medium.com/gdg-vit"&gt;Follow us&lt;/a&gt; on Medium.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>My Mom Uses ArchLinux</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Thu, 25 Jun 2020 09:07:54 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/my-mom-uses-archlinux-cf1</link>
      <guid>https://dev.to/l04db4l4nc3r/my-mom-uses-archlinux-cf1</guid>
      <description>&lt;p&gt;It is almost impossible to install and operate Arch Linux without prior linux knowledge. So why does my mom use it?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/gdg-vit/my-mom-uses-archlinux-e678f29b0df7?source=rss----7ebddf9721d---4"&gt;Check out my latest article for DSC VIT »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>family</category>
      <category>technology</category>
      <category>linux</category>
    </item>
    <item>
      <title>XMonad: Hackability, At a Cost</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Mon, 15 Jun 2020 14:13:12 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/xmonad-hackability-at-a-cost-390a</link>
      <guid>https://dev.to/l04db4l4nc3r/xmonad-hackability-at-a-cost-390a</guid>
      <description>&lt;p&gt;I started using Xmonad a month ago. Usually I live in a Window Manager for a week or so before writing a post about it but took my sweet time with this particular &lt;em&gt;WM&lt;/em&gt;, primarily because XMonad has so much to it that even a month of usage doesn't give me enough credibility to do it justice in my posts. Still I will make sure that a beginner can understand how to use it, and most importantly, &lt;strong&gt;whether to use&lt;/strong&gt; it.&lt;/p&gt;

&lt;p&gt;If you don't have time to read through the whole thing and want to Keep your confirmation bias at its peak check out some of the cool things you can do with XMonad&lt;/p&gt;




&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Suckless in nature and has configuration written in the haskell programming language.&lt;/li&gt;
&lt;li&gt;Reload and recompile on the fly.&lt;/li&gt;
&lt;li&gt;Dynamic tiling window manager with the ability to add additional layouts yourself.&lt;/li&gt;
&lt;li&gt;Custom run menu.&lt;/li&gt;
&lt;li&gt;Tags and multi-monitor support.&lt;/li&gt;
&lt;li&gt;Lightweight, no-bloat, and blazing fast&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;XMonad has different ways to install on different linux distributions. The main thing to note is that it has a core library (called &lt;code&gt;xmonad&lt;/code&gt;) and a community library for additional feature support (called &lt;code&gt;xmonad-contrib&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Installation can be done from source (using haskell cabal) or through the distro repositories. For example, in Arch Linux you can run the following to install XMonad:&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;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; xmonad xmonad-contrib


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The installation is different for ubuntu/debian based systems. I suggest you &lt;a href="https://xmonad.org/download.html" rel="noopener noreferrer"&gt;read the documentation&lt;/a&gt; for the same.&lt;/p&gt;

&lt;p&gt;Note that XMonad itself is minimal but it requires the whole haskell ecosystem to be downloaded on your machine, including the bloated &lt;code&gt;ghc&lt;/code&gt; haskell compiler and it might install &lt;a href="https://www.haskell.org/cabal/" rel="noopener noreferrer"&gt;cabal&lt;/a&gt; too, based on the type of installation you opt for. Generally you can build from source, use cabal, or use the distro repositories to name a few.&lt;/p&gt;

&lt;p&gt;To start xmonad write the following in your &lt;code&gt;~/.xinitrc&lt;/code&gt; and restart your system.&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;exec &lt;/span&gt;xmonad


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Once you do so, you will be greeted with a black screen, and nothing else. You won't even know if you have logged in or not unless you press a right keybinding to spawn a window. You can press &lt;code&gt;mod + shift + enter&lt;/code&gt; to spawn the terminal, where &lt;code&gt;mod&lt;/code&gt; is the modifier key (windows key by default).&lt;/p&gt;




&lt;h2&gt;
  
  
  How to approach configuration
&lt;/h2&gt;

&lt;p&gt;XMonad is not like i3 or dwm where you have a pre-populated configuration file which you can edit to your heart's content. The best way to approach it is to look at other people's configuration files. The alternative would be to learn haskell from scratch, look at the step by step guide and learn how to create a configuration of your own. While it is a fun and well documented strategy, it is a long one. If you want a fast result then you can use and edit what other people have spent months configuring. And no, it does not make you a pirate, in fact it is what the XMonad developers suggest on their &lt;a href="https://wiki.haskell.org/Xmonad/Config_archive/John_Goerzen's_Configuration" rel="noopener noreferrer"&gt;official guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let us take a look at a minimal configuration. Your config should reside in the following path: &lt;code&gt;~/.xmonad/xmonad.hs&lt;/code&gt;. You can recompile and reload your WM in real-time using the &lt;code&gt;mod + q&lt;/code&gt; keybinding. &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;


&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;XMonad&lt;/span&gt;
&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Data.Monoid&lt;/span&gt;
&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;System.Exit&lt;/span&gt;
&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="k"&gt;qualified&lt;/span&gt; &lt;span class="nn"&gt;XMonad.StackSet&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;
&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="k"&gt;qualified&lt;/span&gt; &lt;span class="nn"&gt;Data.Map&lt;/span&gt;        &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;

&lt;span class="n"&gt;myTerminal&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"alacritty"&lt;/span&gt;
&lt;span class="n"&gt;myFocusFollowsMouse&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt;
&lt;span class="n"&gt;myFocusFollowsMouse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;myBorderWidth&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;myModMask&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mod1Mask&lt;/span&gt;
&lt;span class="c1"&gt;-- The default number of workspaces (virtual screens) and their names.&lt;/span&gt;
&lt;span class="n"&gt;myWorkspaces&lt;/span&gt;    &lt;span class="o"&gt;=&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;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"9"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;myNormalBorderColor&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"#dddddd"&lt;/span&gt;
&lt;span class="n"&gt;myFocusedBorderColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"#ff0000"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Even though you might not be familiar with the haskell programming language, still the configuration is quite readable. &lt;code&gt;mod1Mask&lt;/code&gt; is your standard windows key. If you are like me and prefer to use Alt as a modifier then you can use the &lt;code&gt;mod4Mask&lt;/code&gt; key. &lt;code&gt;--&lt;/code&gt; is for comments in haskell. I have added my configuration in the references. Changing keybinding is fairly simple:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;

  &lt;span class="c1"&gt;-- launch dmenu&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;modm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="n"&gt;xK_p&lt;/span&gt;     &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;spawn&lt;/span&gt; &lt;span class="s"&gt;"exe=`dmenu_path | dmenu` &amp;amp;&amp;amp; eval &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;exec $exe&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;-- close focused window&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;modm&lt;/span&gt; &lt;span class="o"&gt;.|.&lt;/span&gt; &lt;span class="n"&gt;shiftMask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xK_c&lt;/span&gt;     &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;kill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

     &lt;span class="c1"&gt;-- Rotate through the available layout algorithms&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;modm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="n"&gt;xK_space&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;sendMessage&lt;/span&gt; &lt;span class="kt"&gt;NextLayout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;-- Move focus to the next window&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;modm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="n"&gt;xK_Tab&lt;/span&gt;   &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;windows&lt;/span&gt; &lt;span class="kt"&gt;W&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focusDown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The first part in the parenthesis defines the key combination, where &lt;code&gt;modm&lt;/code&gt; is your modifier key. If you want more than one modifier with a minor key then you can use the &lt;code&gt;.|.&lt;/code&gt; syntax like I have used to close the focused window. All of these functions are well documented in the step by step guide if you want to learn about them more.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Custom Layouts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you take a look at the end of the xmonad.hs file, there is a configuration map:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;

&lt;span class="n"&gt;defaults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;defaultConfig&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;terminal&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myTerminal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;focusFollowsMouse&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myFocusFollowsMouse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;borderWidth&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myBorderWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;modMask&lt;/span&gt;            &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myModMask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;workspaces&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myWorkspaces&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;normalBorderColor&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myNormalBorderColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;focusedBorderColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myFocusedBorderColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;-- key bindings&lt;/span&gt;
        &lt;span class="n"&gt;keys&lt;/span&gt;               &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myKeys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;mouseBindings&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myMouseBindings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;-- hooks, layouts&lt;/span&gt;
        &lt;span class="n"&gt;layoutHook&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;manageHook&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myManageHook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;handleEventHook&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myEventHook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;logHook&lt;/span&gt;            &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myLogHook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;startupHook&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myStartupHook&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This config map is very powerful because you can add custom functions in it for handing some of the basic functionality of XMonad. For example, you can add your custom keymaps, logs, startup applications, mouse bindings, terminal etc. You can even add your custom layout in XMonad, which by default features with the master and stack layout variants. The &lt;code&gt;myLayout&lt;/code&gt; is a layout map we have defined earlier in the file:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;

&lt;span class="n"&gt;myLayout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tiled&lt;/span&gt; &lt;span class="o"&gt;|||&lt;/span&gt; &lt;span class="kt"&gt;Mirror&lt;/span&gt; &lt;span class="n"&gt;tiled&lt;/span&gt; &lt;span class="o"&gt;|||&lt;/span&gt; &lt;span class="kt"&gt;Full&lt;/span&gt;
  &lt;span class="kr"&gt;where&lt;/span&gt;
    &lt;span class="c1"&gt;-- default tiling algorithm partitions the screen into two panes&lt;/span&gt;
    &lt;span class="n"&gt;tiled&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Tall&lt;/span&gt; &lt;span class="n"&gt;nmaster&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt;

    &lt;span class="c1"&gt;-- The default number of windows in the master pane&lt;/span&gt;
    &lt;span class="n"&gt;nmaster&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="c1"&gt;-- Default proportion of screen occupied by master pane&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

    &lt;span class="c1"&gt;-- Percent of screen to increment by when resizing panes&lt;/span&gt;
    &lt;span class="n"&gt;delta&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can create custom modes of your own. Want a layout where 3/4th screen is horizontal and the rest is verticaly split? You can do that easily by following the xmonad documentation. With the help of distrotube, which I have linked in the description, I have some awesome layouts in my copy of the configuration file. Here are some of my favourites:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tall Layout&lt;/strong&gt;&lt;br&gt;
This is the traditional master and stack layout that is very popular in all window managers. The new window comes on the left and all older windows are stacked onto the right hand side of the screen.&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%2Fi%2Fxn528z81f6hz1ztm0tr6.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%2Fi%2Fxn528z81f6hz1ztm0tr6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grid Layout&lt;/strong&gt;&lt;br&gt;
Each and every window is given the same amount of space on the screen. This results in a grid formation of spawnables.&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%2Fi%2Font7ecau7ppu886i41wd.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%2Fi%2Font7ecau7ppu886i41wd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One Big Layout&lt;/strong&gt;&lt;br&gt;
This is a custom layout where 4 windows are allowed in tiling mode. After the 4th window, all subsequent windows keep stacking up on the last window. It gives more focus to the top left corner of the screen. It is perfect for a Dev + Ops operation where you might need 2 additional smaller windows for monitoring logs while you develop and deploy using the other two.&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%2Fi%2Ftev7hao3051x9j9a1yir.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%2Fi%2Ftev7hao3051x9j9a1yir.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Space Layout&lt;/strong&gt;&lt;br&gt;
This layout is exactly lke the One Big layout, but it adds additonal spaces between windows for a more aesthetically pleasing look. Perfect for r/unixporn.&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%2Fi%2F4f3fqsdvj9qbhwwsjo95.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%2Fi%2F4f3fqsdvj9qbhwwsjo95.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  XMobar, the hackable status bar
&lt;/h2&gt;

&lt;p&gt;Being suckless also means pluggability. Although XMonad does not impose any restrictions on using any status bars like dzen2, polybar or conky, but if you are going through the pain of learning and installng a WM that uses haskell, might as well use a status bar that goes along with it. XMobar is exactly what you want:&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;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; xmobar


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You essentially need to write an xmobar script which you can then call from your &lt;code&gt;xmonad.hs&lt;/code&gt; like the following:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;

&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;XMonad.Hooks.DynamicLog&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dynamicLogWithPP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;defaultPP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;xmobarPP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;xmobarColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;shorten&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;PP&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="c1"&gt;-- the following line can be used to include xmobar in xmonad&lt;/span&gt;
&lt;span class="n"&gt;xmproc0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;spawnPipe&lt;/span&gt; &lt;span class="s"&gt;"xmobar -x 0 ~/.config/xmobar/xmobarrc0"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The language is very straightforward but might feel intimidating at first. For example, &lt;a href="https://github.com/L04DB4L4NC3R/DEC/blob/master/config/xmobar/xmobarrc0" rel="noopener noreferrer"&gt;here&lt;/a&gt; are the contents of my xmobarrc.&lt;/p&gt;

&lt;p&gt;Notice that you can even define custom fonts and colours for each and every section of your status bar. I have it configured so that it shows me my CPU, memory and hard disk usage, along with my upload and download speeds, battery, date-time and my workspaces.&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%2Fi%2Fmu9pb03fe98ulboph051.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%2Fi%2Fmu9pb03fe98ulboph051.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Some cool things you can do with XMonad
&lt;/h2&gt;

&lt;p&gt;Here is a list of what xmonad can do (at least what all I have discovered so far).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom Layout Definition&lt;/strong&gt;. You can decide how windows are drawn  on the screen and come up with your own layouts, like this hilarious space layout:&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%2Fi%2F4f3fqsdvj9qbhwwsjo95.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%2Fi%2F4f3fqsdvj9qbhwwsjo95.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open Applications Grid&lt;/strong&gt;. You can switch between all the applications you have open no matter which workspace they are on, using a grid that is spawned on screen:&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%2Fi%2Fwlaygc3wmwgth6n6241d.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%2Fi%2Fwlaygc3wmwgth6n6241d.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application Spawn Grid&lt;/strong&gt;. You can define a grid to spawn that can be used to open any applications that you want, using the vim-key selection:&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%2Fi%2Fod0yf5slb7mq111gtp0s.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%2Fi%2Fod0yf5slb7mq111gtp0s.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Promote Master&lt;/strong&gt;. In a master and stack layout, you can promote a window to be your master. You can also demote the same. It is ideal when you want to shift focus without swapping the windows entirely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Move a window to every workspace&lt;/strong&gt;. You can copy a particular window to each and every workspace. The window will still remain in the first one but its copies will be made across every workspace. It is ideal if you are screen recording and want your front camera window to be on every workspace. You can also kill all other copies except the first one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom window rules&lt;/strong&gt;. Want your Gimp to always spawn in floating mode? Or your browser to always be on the third workspace. You can do that using managed hooks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Different Prompts&lt;/strong&gt;. You don't need to use dmenu as a run prompt. XMonad has a built in run prompt. In fact it has many other prompts, namely manpage prompt, ssh prompt among others. You can even create your own custom prompt for one liner command line outputs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Key Sub-Maps&lt;/strong&gt;. Running out of keybindings? You can have custom key maps. For example, for opening custom prompts, you can assign &lt;code&gt;Mod + p&lt;/code&gt; to prompts and subsequently press the &lt;code&gt;m&lt;/code&gt; button for the manpage prompt or &lt;code&gt;r&lt;/code&gt; for the run prompt. So the whole command will end up being &lt;code&gt;Mod + p + r&lt;/code&gt; for the run prompt and &lt;code&gt;Mod + p + m&lt;/code&gt; for the manpage prompt.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  At what cost?
&lt;/h2&gt;

&lt;p&gt;Time! Time is the only thing you need to understand this beast and extend it to your liking. Although you can copy someone else's config, and there is nothing wrong with that, in fact it is a great way to start with XMonad, but learning the basics and being able to create your own config from scratch is an experience altogether. You don't need to be a haskell god for using it, but any functionality you want can be looked up in the awesome haskell wiki called &lt;a href=""&gt;hackage&lt;/a&gt;. It has syntactical queues and useful examples to build a config of your dreams. &lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;While XMonad is a very difficult window manager to configure in the beginning, especially if you are doing it from scratch, it is one of the most hackable, fast and reliable window managers that I have ever used. This &lt;em&gt;WM&lt;/em&gt; is very old but there is a reason it is so popular even now. Some might argue that it is more suckless than dwm itself, and I agree, but it is certainly harder to setup than dwm due to the fact that you might end up writing (or copy pasting) a lot of code in a language you are likely not familiar with.&lt;/p&gt;

&lt;p&gt;With that being said, I think I will use xmonad for another month or so before I make the next window manager hop!&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Judgement Rubric&lt;/th&gt;
&lt;th&gt;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity of use&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity of Configuration&lt;/td&gt;
&lt;td&gt;❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve (lesser is better)&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fun&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/L04DB4L4NC3R/DEC/tree/master/.xmonad" rel="noopener noreferrer"&gt;My XMonad Config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/dwt1/dotfiles/-/tree/master/.xmonad" rel="noopener noreferrer"&gt;Derek Taylor's XMonad Config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://distrotube.com/" rel="noopener noreferrer"&gt;Distrotube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/L04DB4L4NC3R/DEC" rel="noopener noreferrer"&gt;My Dotfiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Editor Almighty</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Fri, 12 Jun 2020 12:06:35 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/editor-almighty-2de6</link>
      <guid>https://dev.to/l04db4l4nc3r/editor-almighty-2de6</guid>
      <description>&lt;p&gt;How my search for the perfect text editor took me to SpaceVim&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What compels people to migrate from their comfort zone? Is it boredom, monotony, or the bland impracticality of their ever so inertial state. I call it an itch, just waiting to be scratched.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This ever so inexplicable itch is what became the driving force behind my rather opinionated journey across editors.&lt;/p&gt;

&lt;p&gt;One thing to clear right off the bat is that this blog, in no way, declares the superiority of one editor over the other, it merely explains which editor boosted &lt;em&gt;my&lt;/em&gt; productivity. Feel free to form your own opinion after reading this post. Without further ado, let us get started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hhndqWHD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A6jrTd4O_RZZrsNax" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hhndqWHD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A6jrTd4O_RZZrsNax" alt="" width="880" height="396"&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@sergeytrofimov?utm_source=medium&amp;amp;utm_medium=referral"&gt;Serghei Trofimov&lt;/a&gt; on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;What I started off with&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;I started my development journey, like most people do, with a minimal and easy to use a text editor called &lt;a href="https://atom.io/"&gt;Atom&lt;/a&gt;. I soon learnt that &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt; (Visual Studio Code) was all of the buzzes, and I caught that fad pretty early on. Subsequently, I was amazed at the wide array of extensions that VSCode had to offer. From VCS to advanced debugging tools, and more.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why I decided to drop VSCode
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I had to depend on the mouse for navigation to an extent, even with vim bindings.&lt;/li&gt;
&lt;li&gt;There was no real feeling of personal satisfaction when everything was handed over in a plate (personal choice).&lt;/li&gt;
&lt;li&gt;I wanted something fast(er) and cheaper on my memory.&lt;/li&gt;
&lt;li&gt;I did a lot of development on remote servers, which didn’t have VSCode at that time (now we have &lt;a href="https://github.com/VSCodium/vscodium"&gt;VSCodium,&lt;/a&gt; which I still don’t prefer).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Journey to the centre of vim
&lt;/h4&gt;

&lt;p&gt;During the same time, I got interested in DevOps, and so felt a natural pull towards terminal-based editors. Emacs felt too intimidating, so the natural course took me to vim.&lt;/p&gt;

&lt;p&gt;I was amazed at the world of opportunities that vim created for me, from granular customization to fast versatility, I couldn’t get enough of setting up my own .vimrc. Now at the same time, I had my semester finals (which obviously didn't go too well).&lt;/p&gt;

&lt;p&gt;As my exams ended (along with a part of me), I figured out my perfect build. It included some popular plugins like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JF9VupGj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/225/1%2AsSxN3_F2fXSxY30_0mJ-vg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JF9VupGj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/225/1%2AsSxN3_F2fXSxY30_0mJ-vg.png" alt="" width="225" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/fatih/vim-go.git"&gt;vim-go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kien/ctrlp.vim.git"&gt;ctrlp.vim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tpope/vim-fugitive.git"&gt;vim-fugitive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/scrooloose/nerdtree.git"&gt;nerdtree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ycm-core/YouCompleteMe.git"&gt;YouCompleteMe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tpope/vim-pathogen.git"&gt;pathogen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the following terminal tools (yes, I shifted to zsh):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XCKVl8cX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/337/1%2AVWNcnaDGBZGas0LYqvvnKQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XCKVl8cX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/337/1%2AVWNcnaDGBZGas0LYqvvnKQ.png" alt="" width="337" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/robbyrussell/oh-my-zsh.git"&gt;Oh my zsh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.systutorials.com/docs/linux/man/5-terminator_config/"&gt;terminator config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins"&gt;zsh plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/robbyrussell/oh-my-zsh/wiki/Themes"&gt;shell themes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So my environment started looking visually verbose, which is just the way I prefer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SV4r_ckY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/880/1%2AwTqHwvjDN0pc6aow5tebsQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SV4r_ckY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/880/1%2AwTqHwvjDN0pc6aow5tebsQ.png" alt="" width="880" height="495"&gt;&lt;/a&gt;&lt;em&gt;Terminator split panes with CLI tools&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Scaling the learning curve
&lt;/h4&gt;

&lt;p&gt;I had the perfect setup I wanted, especially for development and operations. It was fast, highly customizable, and intuitive. But there was still something missing. I still hadn’t memorized the vim shortcuts and had a lot of trouble staying away from the mouse while working. Trouble in paradise!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hQce7NIE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AnAgkP6Cw7gxAadY4" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hQce7NIE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AnAgkP6Cw7gxAadY4" alt="" width="880" height="586"&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@officestock?utm_source=medium&amp;amp;utm_medium=referral"&gt;Sebastian Herrmann&lt;/a&gt; on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During this time, I would occasionally switch between VSCode and vim in order to boost productivity, although it was doing more harm than good. I followed the following guidelines which helped me be 2X more productive in vim that I ever was in VSCode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Restrict yourself&lt;/strong&gt; : Unplug your mouse, close all other editors, and no matter how slow you type, keep grinding. I was a back-end intern at &lt;a href="https://atlan.com/"&gt;Atlan&lt;/a&gt; during this time and I didn’t even install any other editor on my work computer other than vim itself. The first week was tough, but I soon got the hang of it and subsequently became quite productive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand rather than memorize&lt;/strong&gt; : In vim, all of the key bindings have a reason to be there. Understand the meaning of the commands that you are typing in. Vim will soon sound like a poem to you. For example: w means &lt;em&gt;word&lt;/em&gt; in vim and c means &lt;em&gt;change&lt;/em&gt;. Doing a c + i + w over a word in vim essentially means change in word.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do what works for you&lt;/strong&gt; : Do you want to change the key bindings? Sure, go ahead! Want to change the fonts, tab/spaces? Knock yourself out! Want to change how tiling works in vim? The world is your oyster! In the end, it is about productivity above all else. Never be afraid to seek help from others. Vim has a great community and you can learn a lot by simply watching the vim conference screen-casts on YouTube.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Shortcomings of vim
&lt;/h4&gt;

&lt;p&gt;Fast forward a few months and I was using vim bindings everywhere, even in my &lt;a href="https://vimium.github.io/"&gt;browsers&lt;/a&gt;! Vim showed me how typing can actually be poetic, even though you might be writing something as mundane as skeletal HTML. It had some shortcomings though:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Built Synchronous:&lt;/strong&gt; Vim (before 8.0) was built to be synchronous, which started causing a lot of problems after adding a plethora of plugins. Loading times would take seconds, even with vim v8+(might not sound like it, but actually that is very slow for an editor)!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of out-of-the-box plugins:&lt;/strong&gt; There are some plugins that you got to have. For instance, &lt;a href="https://github.com/ycm-core/YouCompleteMe"&gt;YouCompleteMe&lt;/a&gt; is a plugin for code auto-completion and &lt;a href="https://github.com/preservim/nerdtree"&gt;nerdtree&lt;/a&gt; is a plugin for viewing a file directory structure in vim. These are some of the extensions that should come in-built, due to the nature of their utility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirement of explicit plugin managers:&lt;/strong&gt; Plugin managers like &lt;a href="https://github.com/tpope/vim-pathogen"&gt;pathogen&lt;/a&gt;, &lt;a href="https://github.com/VundleVim/Vundle.vim"&gt;vundle&lt;/a&gt; or &lt;a href="https://github.com/junegunn/vim-plug"&gt;plug&lt;/a&gt; are required for installing and configuring extensions in vim. This causes a lot of hassle when you are using one particular plugin but an extension only supports the other.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  SpaceVim to the rescue!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://spacevim.org/"&gt;SpaceVim&lt;/a&gt; is a community-driven &lt;em&gt;vim distribution.&lt;/em&gt; What this essentially means is that it is a set of vim configurations which add an abstraction over vim. The following are the salient features of SpaceVim which attracted me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Super easy installation:&lt;/strong&gt; Installing SpaceVim involves running just a single command on your terminal. You get instant gratification. Fair warning though, your existing vim configurations are going to be overwritten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asynchronous plugin manager:&lt;/strong&gt; SpaceVim has a &lt;a href="https://github.com/neovim/neovim"&gt;neovim&lt;/a&gt; inspired plugin system. It only loads the most essential plugins during the initial runtime cycle and defers the loading of the rest of the plugins. This &lt;em&gt;lazy-loading&lt;/em&gt; of plugins creates a seamless typing experience for the user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oeNT8gyR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/961/1%2AkD4lZRkcUjW9tm3Q3C_NwQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oeNT8gyR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/961/1%2AkD4lZRkcUjW9tm3Q3C_NwQ.png" alt="" width="880" height="950"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layer based plugin system:&lt;/strong&gt; SpaceVim installs plugins in layers. Each layer defines a set of plugins, grouped together to offer maximum functionality to the user, per download. Each and every plugin inside a particular layer, as well as in different layers, is downloaded asynchronously by the SpaceVim &lt;em&gt;PlugManager.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A plethora of off-the-shelf features:&lt;/strong&gt; SpaceVim comes loaded with a ton of features right of the box. From asynchronous grep on the fly, to fancy TODO managers. It brings a lot to the table in order to add value to the users’ typing experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--354a6CFM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AUS5IJBiRmZ1HaR2MbUcnCg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--354a6CFM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AUS5IJBiRmZ1HaR2MbUcnCg.png" alt="" width="880" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spacebar oriented:&lt;/strong&gt; As the name ever so discretely suggests, SpaceVim is big on using spaces as a macro for invoking a lot of in-built functionality. This is a fresh change from vim, where the spacebar has virtually no functionality in normal mode, even though it is the easiest key to hit on the keyboard, due to both its size and its stature. And no, SpaceVim has nothing to do with outer space.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over 78 language packs supported:&lt;/strong&gt; Language packs are layers (set of plugins) which offer a lot of functionality for development in a particular language. For example, a lang#go layer will offer functionality for go development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bYthcWWc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlwKNGzLaiRY4_rJFR0Bhrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bYthcWWc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlwKNGzLaiRY4_rJFR0Bhrw.png" alt="" width="880" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All of these can be installed by simple adding the following lines to your &lt;strong&gt;~/.SpaceVim.d/init.toml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[layers]]
name = "lang#go"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;SpaceVim is not the endgame. Nothing is. The aim is to keep on finding, and mastering whatever boosts productivity.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Efficiency is doing something which has already been done before, better.&lt;/p&gt;

&lt;p&gt;YOU are the most important resource when it comes to productivity. So choose the editor which boosts YOUR productivity. After all, no one knows better than you :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  References
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spacevim.org/"&gt;Home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vim/vim"&gt;vim/vim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/L04DB4L4NC3R/DEC"&gt;L04DB4L4NC3R/DEC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This Article was originally published &lt;a href="https://medium.com/gdg-vit/editor-almighty-79807100f10c"&gt;on Medium&lt;/a&gt; under &lt;a href="https://dscvit.com/"&gt;Developer Student Clubs VIT, Powered By Google Developers&lt;/a&gt;. &lt;a href="https://medium.com/gdg-vit"&gt;Follow us&lt;/a&gt; on Medium.&lt;/p&gt;

</description>
      <category>vim</category>
    </item>
    <item>
      <title>Vim to the rescue: PDF Preview</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Mon, 01 Jun 2020 12:07:33 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/vim-to-the-rescue-pdf-preview-2e10</link>
      <guid>https://dev.to/l04db4l4nc3r/vim-to-the-rescue-pdf-preview-2e10</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Some time ago, I was writing my resume. People suggested writing it in &lt;a href="https://www.latex-project.org/get/" rel="noopener noreferrer"&gt;LaTeX&lt;/a&gt;. So I started reading up on it. Then I stumbled upon a tool called &lt;a href="https://www.gnu.org/software/groff/" rel="noopener noreferrer"&gt;groff&lt;/a&gt; and found it much easier, faster and less bloat than LaTeX. &lt;/p&gt;

&lt;p&gt;Both of these tools are used to write documents that can be converted into PDFs. I wanted a solution in vim so that I could live preview these PDFs as I was writing them. So I decided to make a vim plugin that does so:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/L04DB4L4NC3R" rel="noopener noreferrer"&gt;
        L04DB4L4NC3R
      &lt;/a&gt; / &lt;a href="https://github.com/L04DB4L4NC3R/texgroff.vim" rel="noopener noreferrer"&gt;
        texgroff.vim
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A plugin to open groff output pdf in preview
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;texgroff.vim&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A plugin to open groff/latex/markdown live pdf preview&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Requirements&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;groff&lt;/strong&gt; with the &lt;code&gt;groff_ms&lt;/code&gt; macro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pandoc&lt;/strong&gt; for markdown and latex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;zathura&lt;/strong&gt; pdf viewer&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installation&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Without vim package management system&lt;/code&gt;: Copy the main.vim file to your &lt;code&gt;.vim/autoload&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Pathogen&lt;/code&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/L04DB4L4NC3R/texgroff.vim &lt;span class="pl-k"&gt;~&lt;/span&gt;/.vim/bundle/texgroff.vim&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Keybindings&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Leader&lt;/th&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;td&gt;Open live PDF Preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;q&lt;/td&gt;
&lt;td&gt;Compile groff(.ms)/latex(.tex)/markdown(.md)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Demonstration&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://youtu.be/s4gVmJafKf0" rel="nofollow noopener noreferrer"&gt;View the demo on Youtube&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Made with ❤️ by Angad Sharma&lt;/p&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/L04DB4L4NC3R/texgroff.vim" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;It supports LaTeX, groff, as well as markdown.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we are going to use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zathura&lt;/strong&gt;: It is a very minimalist PDF reader for vim users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groff&lt;/strong&gt;: The GNU document parser. It is installed by default on most linux systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pandoc&lt;/strong&gt;: It is the general purpose document conversion tool. See my blog on pandoc:&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/l04db4l4nc3r" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F197603%2Fa4320666-6350-4843-b37e-07bcfa168f55.png" alt="l04db4l4nc3r"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/l04db4l4nc3r/presentable-dev-posts-with-pandoc-56pc" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Presentable DEV posts with Pandoc&lt;/h2&gt;
      &lt;h3&gt;Angad Sharma ・ Apr 21 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#todayilearned&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#todayisearched&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;All of these tools are already available in most official linux repositories and can be downloaded using your vanilla packet manager:&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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;groff pandoc zathura


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;On Arch based distros, &lt;code&gt;zathura-pdf-poppler&lt;/code&gt; needs to be downloaded in addition. &lt;/p&gt;




&lt;h2&gt;
  
  
  What we want
&lt;/h2&gt;

&lt;p&gt;We want that the &lt;code&gt;\ + q&lt;/code&gt; keybinding to compile the document we are working on into a PDF and the &lt;code&gt;\ + p&lt;/code&gt; keybinding to preview the PDF in zathura after compiling it.&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;# Compiling Markdown to PDF:&lt;/span&gt;
pandoc curr.md &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /tmp/op.pdf

&lt;span class="c"&gt;# Compiling LaTeX to PDF: &lt;/span&gt;
pandoc &lt;span class="nt"&gt;-f&lt;/span&gt; latex &lt;span class="nt"&gt;-t&lt;/span&gt; latex curr.tex &lt;span class="nt"&gt;-o&lt;/span&gt; /tmp/op.pdf

&lt;span class="c"&gt;# Compiling Groff (ms macro) to PDF:&lt;/span&gt;
groff &lt;span class="nt"&gt;-ms&lt;/span&gt; curr.ms &lt;span class="nt"&gt;-T&lt;/span&gt; pdf &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/op.pdf


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  Getting to the vim script
&lt;/h2&gt;

&lt;p&gt;The following code divides the process into 2 functions, namely &lt;code&gt;Compile&lt;/code&gt; and &lt;code&gt;Preview&lt;/code&gt;. The former checks our current file type and applies the appropriate compilation command to it. The latter opens up the output PDF in zathura. Add the following code in your &lt;strong&gt;~/.vimrc&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;

&lt;span class="k"&gt;let&lt;/span&gt; mapleader&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"\\"&lt;/span&gt;

&lt;span class="c"&gt;" Call compile&lt;/span&gt;
&lt;span class="c"&gt;" Open the PDF from /tmp/&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; Preview&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; Compile&lt;span class="p"&gt;()&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"! zathura /tmp/op.pdf &amp;amp;"&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;

&lt;span class="c"&gt;" [1] Get the extension of the file&lt;/span&gt;
&lt;span class="c"&gt;" [2] Apply appropriate compilation command&lt;/span&gt;
&lt;span class="c"&gt;" [3] Save PDF as /tmp/op.pdf&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; Compile&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; extension &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%:e'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; extension &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"ms"&lt;/span&gt;
                &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"! groff -ms % -T pdf &amp;gt; /tmp/op.pdf"&lt;/span&gt;
        &lt;span class="k"&gt;elseif&lt;/span&gt; extension &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"tex"&lt;/span&gt;
                &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"! pandoc -f latex -t latex % -o /tmp/op.pdf"&lt;/span&gt;
        &lt;span class="k"&gt;elseif&lt;/span&gt; extension &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"md"&lt;/span&gt;
                &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"! pandoc % -s -o /tmp/op.pdf"&lt;/span&gt;
        &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;

&lt;span class="c"&gt;" map \ + p to preview&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;p&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; Preview&lt;span class="p"&gt;()&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;" map \ + q to compile&lt;/span&gt;
&lt;span class="nb"&gt;noremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;leader&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;q&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;call&lt;/span&gt; Compile&lt;span class="p"&gt;()&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;When we press preview, our zathura instance opens up. Now the best thing about zathura is that it watches the opened file. So after you press preview for the very first time, you don't have to press it again. Simply compile to view the changes in the PDF. Here is what our extension looks like:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/s4gVmJafKf0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>vim</category>
      <category>todayilearned</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Vim to the rescue: Subduing the Shell</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Tue, 26 May 2020 15:21:08 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/vim-to-the-rescue-subduing-the-shell-2500</link>
      <guid>https://dev.to/l04db4l4nc3r/vim-to-the-rescue-subduing-the-shell-2500</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;How many times have you ran a command on your terminal and copy pasted its output to vim? Maybe you want to include some terminal output data, or maybe you want to create an issue on github by editing it in vim first. &lt;/p&gt;

&lt;p&gt;In this blog we will be learning how to get the output of shell commands in your current vim buffer. &lt;/p&gt;

&lt;p&gt;For reference, here is what we are going to achieve:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/euwcDjaBOxI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the output of a script
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You can take the output of any shell script and paste it after your cursor position by using the following command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="c"&gt;" . means current line&lt;/span&gt;
&lt;span class="p"&gt;:.!&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;shell_command&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Additionally you can take your cursor to the position where the command output ends:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;r&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;shell_command&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The best part about this is that you can use the text inside your vim buffer and pass it through the command line. For example if your current buffer contains something like this:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My cow says:

cowsay "Hello, World"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can go over to the cowsay command and press the following keys to get the output right in your buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="c"&gt;" passes the current line through a shell&lt;/span&gt;
&lt;span class="p"&gt;:.!&lt;/span&gt;$SHELL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will get an output like 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%2Fi%2Fom9i6q9xkz9is80tm1yz.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%2Fi%2Fom9i6q9xkz9is80tm1yz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not only this, you can take the text from any line and paste its output:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="c"&gt;" takes the text in the 5th line as input&lt;/span&gt;
&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;$SHELL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mapping the madness
&lt;/h2&gt;

&lt;p&gt;I have mapped &lt;code&gt;&amp;lt;Shift&amp;gt; + q&lt;/code&gt; to the &lt;code&gt;.!$SHELL&lt;/code&gt; command. So pressing the keybinding instantaneously returns the output of the current line when ran through a shell.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="nb"&gt;noremap&lt;/span&gt; Q &lt;span class="p"&gt;!!&lt;/span&gt;$SHELL&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>vim</category>
      <category>todayilearned</category>
      <category>productivity</category>
      <category>linux</category>
    </item>
    <item>
      <title>Monsterwm: 700 lines of pure beast</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Thu, 21 May 2020 04:07:59 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/monsterwm-700-lines-of-pure-beast-hl4</link>
      <guid>https://dev.to/l04db4l4nc3r/monsterwm-700-lines-of-pure-beast-hl4</guid>
      <description>&lt;p&gt;Monsterwm is a dynamic tiling window manager forked from &lt;strong&gt;dminimalwm&lt;/strong&gt;, which was inspired by dwm. It has a lot of similarities with dwm and feels like home for people who have used suckless tools. Read my blog on dwm to get additional insight on this particular &lt;em&gt;WM&lt;/em&gt;, but you don't &lt;em&gt;need&lt;/em&gt; to do so to understand this window manager:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/l04db4l4nc3r" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F197603%2Fa4320666-6350-4843-b37e-07bcfa168f55.png" alt="l04db4l4nc3r"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/l04db4l4nc3r/dwm-the-suckless-window-manager-1ji" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Dwm: The Suckless Window Manager&lt;/h2&gt;
      &lt;h3&gt;Angad Sharma ・ Apr 7 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#linux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ubuntu&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Monsterwm aims to keep its codebase under 700 SLOC (source lines of code), as compared to dwm's 2000 SLOC limit. It does so by removing the status bar altogether. It believes that the status bar should not be the responsibility of a window manager. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Features&lt;/li&gt;
&lt;li&gt;Setting up&lt;/li&gt;
&lt;li&gt;Layouts&lt;/li&gt;
&lt;li&gt;
Configuration and patching 

&lt;ul&gt;
&lt;li&gt;The monsterwm source&lt;/li&gt;
&lt;li&gt;Changing keybindings&lt;/li&gt;
&lt;li&gt;Installing patches&lt;/li&gt;
&lt;li&gt;Setting up a status bar&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Verdict&lt;/li&gt;

&lt;li&gt;References&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Monsterwm is only a single binary, and its source code is intended to never exceed 700 SLOC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Customization is done by editing the source code, which is very easy to understand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is extremely fast and packed with bare essentials. Additional layouts and functionalities can be added by patching, as is the suckless anti-bloat philosophy. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It does not ship with a status bar, but outputs information about the desktop which external panels (like conky, dzen etc) can use. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Setting Up
&lt;/h3&gt;

&lt;p&gt;Execute the following commands to get started with monsterwm:&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;# clone the source repository&lt;/span&gt;
git clone https://github.com/c00kiemon5ter/monsterwm.git

&lt;span class="c"&gt;# enter the directory&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;monsterwm

&lt;span class="c"&gt;# run a clean installation&lt;/span&gt;
make clean &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now simply add the following line in your &lt;code&gt;~/.xinitrc&lt;/code&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;exec &lt;/span&gt;monsterwm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that you are all set, logout and log back in again. Once you do, you will see a blank screen. &lt;/p&gt;




&lt;h3&gt;
  
  
  Layouts
&lt;/h3&gt;

&lt;p&gt;To spin up a terminal in monsterwm, just press the following: &lt;code&gt;&amp;lt;Alt&amp;gt; + &amp;lt;shift&amp;gt; + &amp;lt;Enter&amp;gt;&lt;/code&gt;. If it doesn't work then checkout the changing keybindings section where I talk about remapping the key bindings and customizing which terminal should open up. &lt;/p&gt;

&lt;p&gt;If you keep on opening terminals up then you will notice that the focus shifts to the newest terminal in the stack. A stack is a LIFO (last in first out) data structure. Monsterwm makes sure that the most attention goes to the recently opened program. &lt;/p&gt;

&lt;p&gt;Monsterwm has the following layouts by default:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Common tiling mode&lt;/strong&gt;: It is like the master and stack layout in dwm. The master comes on the left hand side. The focus is shifted to the newest spawn by default:&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%2Fi%2Fcxmelyl9kebsh3c5i23w.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%2Fi%2Fcxmelyl9kebsh3c5i23w.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bottom stack (bstack) tiling mode&lt;/strong&gt;: Here, the newly spawned windows are stacked in the bottom:&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%2Fi%2Fl448xy0fhqyh7rm1ju6c.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%2Fi%2Fl448xy0fhqyh7rm1ju6c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grid tiling mode&lt;/strong&gt;: In grid mode, each window is given an equal amount of space and thus windows tile themselves like a grid:&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%2Fi%2Fum5tl0p2rk90ypsz98pv.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%2Fi%2Fum5tl0p2rk90ypsz98pv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Floating mode&lt;/strong&gt;: In addition to tiling modes, windows can also be made to float over each other: &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%2Fi%2Fl7dupghmt6rdpa81v5km.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%2Fi%2Fl7dupghmt6rdpa81v5km.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In addition to these modes, monsterwm also has a monocle or fullscreen mode. Additional modes  (like fibionacci mode) can be added by patching, which we will se in the upcoming section. &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Configuration and Patching
&lt;/h3&gt;

&lt;p&gt;Configuring and patching monsterwm might be difficult for beginners. The source code configuration file is similar to dwm, so if you have used dwm, then monsterwm will be even easier. &lt;/p&gt;




&lt;h4&gt;
  
  
  The Monsterwm Source
&lt;/h4&gt;

&lt;p&gt;Using your terminal, go to whichever folder you have cloned monsterwm in and type &lt;code&gt;ls&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You may notice the configuration files in the directory.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;config.h&lt;/code&gt; and &lt;code&gt;config.def.h&lt;/code&gt; are the files that you will need to edit when you are configuring monsterwm.&lt;/p&gt;

&lt;p&gt;Open the Makefile and edit clean recipe to add the following line of code in it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm config.h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will make sure that whenever you are configuring a patch, you won't have to make changes in both &lt;code&gt;config.h&lt;/code&gt; as well as &lt;code&gt;config.def.h&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%2Fi%2F9tliwavtmbrcebp5x81n.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%2Fi%2F9tliwavtmbrcebp5x81n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now whenever you make a change in the &lt;code&gt;config.def.h&lt;/code&gt;, simply run &lt;code&gt;make clean install&lt;/code&gt; for re-building monsterwm from scratch. Then logout and log back in again for the changes to take effect. Monsterwm requires its source to be rebuilt every time there is a configuration change, which is exactly like dwm.&lt;/p&gt;




&lt;h4&gt;
  
  
  Changing Keybindings
&lt;/h4&gt;

&lt;p&gt;Open the &lt;code&gt;config.def.h&lt;/code&gt; in vim.&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%2Fi%2Fut7p8x07amc81dks4x6t.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%2Fi%2Fut7p8x07amc81dks4x6t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Key_key&lt;/code&gt; array stores all of the keybindings. The modifier key ( by default) is named &lt;code&gt;MODKEY&lt;/code&gt;. Shift is called &lt;code&gt;ShiftMask&lt;/code&gt;. All other keys are prefixed by &lt;code&gt;XK_&lt;/code&gt;. For example, if I am talking about the "i" key then I will write &lt;code&gt;XK_i&lt;/code&gt;. If I am talking about  then I will write &lt;code&gt;XK_Return&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Now let us look at line 3, where the keybinding for opening up a terminal is defined. By default, this line is the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* modifier            key       function        argument */
MODKEY|ShiftMask     XK_Return    spawn         {.v = termcmd}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It means that for &lt;code&gt;spawning&lt;/code&gt; a terminal, you would have to hit &lt;code&gt;&amp;lt;Alt&amp;gt; + &amp;lt;Shift&amp;gt; + &amp;lt;Enter&amp;gt;&lt;/code&gt;. You can already see in the screenshot above, that I have removed &lt;code&gt;ShiftMask&lt;/code&gt; from this line. So for opening up the terminal I simply do &lt;code&gt;&amp;lt;Alt&amp;gt; + &amp;lt;Enter&amp;gt;&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;In this way, by changing the modifier or keys, you can define custom keybindings. You can even add lines here to define some of your own keybindings. &lt;/p&gt;

&lt;p&gt;Now for the changes to take effect, simply compile the code again by running the following commands, log back in, and you are good to go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make clean install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Installing patches
&lt;/h4&gt;

&lt;p&gt;Some extensions to monsterwm are supported in the form of patches. Easiest way to apply a patch, is to git merge that branch. Here is a list of patches for monsterwm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/centerwindow" rel="noopener noreferrer"&gt;centerwindow&lt;/a&gt;   : center new floating windows on the screen and  center any window with a shortcut&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/fibonacci" rel="noopener noreferrer"&gt;fibonacci&lt;/a&gt;      : adds fibonacci layout mode&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/initlayouts" rel="noopener noreferrer"&gt;initlayouts&lt;/a&gt;    : define initial layouts for every desktop&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/monocleborders" rel="noopener noreferrer"&gt;monocleborders&lt;/a&gt; : adds borders to the monocle layout&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/nmaster" rel="noopener noreferrer"&gt;nmaster&lt;/a&gt;        : adds nmaster layout - multiple master windows for BSTACK and TILE layouts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/rectangle" rel="noopener noreferrer"&gt;rectangle&lt;/a&gt;      : draws only a rectangle when moving/resizing windows to keep resources low (ie through an ssh forwarded session)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/showhide" rel="noopener noreferrer"&gt;showhide&lt;/a&gt;       : adds a function to show and hide all windows on all desktops&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/uselessgaps" rel="noopener noreferrer"&gt;uselessgaps&lt;/a&gt;    : adds gaps around every window on screen&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/warpcursor" rel="noopener noreferrer"&gt;warpcursor&lt;/a&gt;     : cursors follows and is placed in the center of the current window&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/c00kiemon5ter/monsterwm/tree/windowtitles" rel="noopener noreferrer"&gt;windowtitles&lt;/a&gt;   : along with the rest desktop info, output the title of the current window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let us install the &lt;strong&gt;fibonacci&lt;/strong&gt; layout. For doing so, simply run the following commands in the source repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge origin/fibonacci
make clean &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After doing so, simply restart the window manager. Look in the config.def.h for the changes added (as well as the keybinding). Activating this patch will make your windows spawn like a spiral:&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%2Fi%2Fk25ofxw8wzalwqwpxyyg.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%2Fi%2Fk25ofxw8wzalwqwpxyyg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Setting up a status bar
&lt;/h4&gt;

&lt;p&gt;Monsterwm does not support a status bar but allocates (by default) 18 pixel on the top part of the screen for a custom status bar. This allocation is of course customizable. Whenever we run &lt;strong&gt;monsterwm&lt;/strong&gt;, it outputs the workspace information as a stream. This stream can then be piped and the output can be shown to a terminal. In the following case, I am outputting the monsterwm to a temporary file. Let us name this file &lt;strong&gt;startup.monsterwm&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="c"&gt;#!/bin/bash&lt;/span&gt;

monsterwm &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/monsterwm.fifo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my &lt;code&gt;.xinitrc&lt;/code&gt;, I will add the following, instead of executing monsterwm directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exec startup.monsterwm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when my monsterwm is up and running, let us switch workspaces and see the terminal output by &lt;code&gt;catting&lt;/code&gt; the file in which we are piping our output:&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%2Fi%2F94gedxgloeik3gni4c0m.gif" 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%2Fi%2F94gedxgloeik3gni4c0m.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see that it outputs real time information such as which monitor is being used, as well as how many windows are open per desktop. We can use this output as an input to dzen to show a status bar like 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%2Fi%2F5p86km1unfg4m7tgp2de.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%2Fi%2F5p86km1unfg4m7tgp2de.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://gist.github.com/c00kiemon5ter/1905427" rel="noopener noreferrer"&gt;these gists&lt;/a&gt; for some ready made scripts for setting up status bars. Copy any script you like to a file, and exec that in your &lt;code&gt;.xinitrc&lt;/code&gt;. &lt;/p&gt;




&lt;h3&gt;
  
  
  Verdict
&lt;/h3&gt;

&lt;p&gt;For those of you who thought dwm was minimal, monsterwm goes one step ahead to ensure a separation of concern between a window manager and its status bar, stripping down a lot of code in the process. It is one of the most lightweight and fast window managers. &lt;/p&gt;

&lt;p&gt;Monsterwm is difficult to configure than your traditional window manager (like awesome or i3). But its patches are stable and do not break with monsterwm versions (ahem ahem dwm). Documentation can come from multiple sources since its configuration is almost exactly like dwm.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Judgement Rubric&lt;/th&gt;
&lt;th&gt;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity of use&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity of Configuration&lt;/td&gt;
&lt;td&gt;❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve (lesser is better)&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fun&lt;/td&gt;
&lt;td&gt;❤️ ❤️ ❤️ ❤️ ❤️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/l04db4l4nc3r/what-is-suckless-all-about-4hp"&gt;Suckless Philosophy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/c00kiemon5ter/monsterwm" rel="noopener noreferrer"&gt;Official Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/L04DB4L4NC3R/monsterwm-config" rel="noopener noreferrer"&gt;My configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>What is the stupidest thing you have done at work?</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Sun, 17 May 2020 17:12:52 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/what-is-the-stupidest-thing-you-have-done-at-work-4k5h</link>
      <guid>https://dev.to/l04db4l4nc3r/what-is-the-stupidest-thing-you-have-done-at-work-4k5h</guid>
      <description>&lt;p&gt;This one time, I pushed some code to my branch and later on I saw that I had pushed the &lt;code&gt;.env&lt;/code&gt; branch with a lot of secrets on the repo. I panicked. Even more so by seeing that the &lt;code&gt;.env&lt;/code&gt; file was in all of my commits for that branch. I started looking for git commands that can be used to completely erase the existence of a file from the whole commit history and found a very obsure and VERY long command which for the life of me I can't find again. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dVKake1c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xd6yijtlwmzhst9hn0ml.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dVKake1c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xd6yijtlwmzhst9hn0ml.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyways, after a copy paste later, I had created a duplicate commit for each of my commit in the tree. Each pair consisted of one commit that had the &lt;code&gt;.env&lt;/code&gt; file and one that didn't. My 50 commits became 100 commits and my project lead was of course furious and curious as to why I had pushed 50 more commits at once. I explained the whole situation to him. &lt;/p&gt;

&lt;p&gt;Turns out they themselves had pushed the &lt;code&gt;.env&lt;/code&gt; file on the master branch and all of the credentials inside it were of the development cluster. When I asked why it is so, they said that the repository is private anyway 🤷. &lt;/p&gt;

&lt;p&gt;Feel free to share your stupid work story :)&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Medium Blogs on DEV</title>
      <dc:creator>Angad Sharma</dc:creator>
      <pubDate>Thu, 14 May 2020 11:17:11 +0000</pubDate>
      <link>https://dev.to/l04db4l4nc3r/medium-blogs-on-dev-2e6a</link>
      <guid>https://dev.to/l04db4l4nc3r/medium-blogs-on-dev-2e6a</guid>
      <description>&lt;p&gt;I was doing some digging and checking out varius RSS feeds and figured out that you can actually link your Medium articles to DEV! So whenever you publish something on Medium, the article is automatically added to your DEV dashboard as a draft. This can be done with other RSS providers also (not just medium). To enable this feature simply go to your DEV settings, to this page:&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%2Fi%2F1gve5b7pjow8erznslcq.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%2Fi%2F1gve5b7pjow8erznslcq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expect to see some of my popular medium articles on DEV in the coming few days :)&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>writing</category>
    </item>
  </channel>
</rss>
