<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ zsh - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ zsh - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 27 Jun 2026 11:23:44 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/zsh/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How Do Zsh Configuration Files Work? ]]>
                </title>
                <description>
                    <![CDATA[ Beginners often get confused when configuring Zsh shell on a Mac. Zsh shell offers four configuration files with no discernible differences. Particularly, ~/.zshrc and ~/.zprofile appear to be identical, leaving us wondering which one to use.  In thi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-do-zsh-configuration-files-work/</link>
                <guid isPermaLink="false">66ba15ffad32b828c4c5be04</guid>
                
                    <category>
                        <![CDATA[ macOS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ shell ]]>
                    </category>
                
                    <category>
                        <![CDATA[ terminal ]]>
                    </category>
                
                    <category>
                        <![CDATA[ zsh ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Kehoe ]]>
                </dc:creator>
                <pubDate>Tue, 09 Jan 2024 20:37:28 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2024/07/pexels-mike-468229-1181772.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Beginners often get confused when configuring Zsh shell on a Mac.</p>
<p>Zsh shell offers four configuration files with no discernible differences. Particularly, <code>~/.zshrc</code> and <code>~/.zprofile</code> appear to be identical, leaving us wondering which one to use. </p>
<p>In this article, you'll learn the difference and a simple guideline for your shell configuration.</p>
<h2 id="heading-why-do-you-need-configuration">Why Do you Need Configuration?</h2>
<p>For programming on a Mac, the Terminal application is an essential tool in your development environment. The Terminal is a command-line interface (CLI) that allows you to interact with the operating system and run commands. </p>
<p>The Terminal or console gives you access to the Unix command line, or shell. </p>
<p><a target="_blank" href="https://en.wikipedia.org/wiki/Z_shell">Zsh</a>, also known as Z shell, is a program that runs in the Terminal, interprets Unix commands, and interacts with the operating system. Zsh is the default shell program on MacOS.</p>
<p>Before you get started with programming on the Mac, you'll need to configure the shell. There are optional and convenient settings, such as aliases for hard-to-remember commands and a custom prompt that can display the directory you're in, among other things. </p>
<p>There are also some critical environment variables that make programs available or alter shell behavior. The <code>EDITOR</code> environment variable, for example, can set your preferred text editor. Oftentimes, when installing a programming language or software utilities, you need to set the <code>PATH</code> environment variable..</p>
<h2 id="heading-where-to-start">Where to Start</h2>
<p>Zsh configuration files are kept in the user's home directory and are named with a dot as the first character to keep them hidden by default. </p>
<p>Zsh recognizes four different configuration files in the user's home directory: <code>~/.zshenv</code>, <code>~/.zprofile</code>, <code>~/.zshrc</code>, and <code>~/.zlogin</code>. </p>
<p>This is where Zsh configuration becomes puzzling, even for experienced developers. Tutorials rarely explain the differences, especially between the <code>zprofile</code> and <code>zshrc</code> files, leaving curious developers scratching their heads and blindly following instructions.</p>
<h3 id="heading-how-is-the-shell-used">How is the Shell Used?</h3>
<p>To understand the differences among Zsh configuration files, consider various shell uses, which can be classified as interactive or non-interactive, login or non-login sessions.</p>
<ol>
<li>On macOS, each new terminal session is treated as a login shell, so opening any terminal window starts an interactive login session. Also, a system administrator who connects to a remote server via SSH initiates an interactive login session.</li>
<li>If a terminal window is already open and you run the command <code>zsh</code> to start a subshell, it will be interactive and non-login. Beginners rarely use subshells.</li>
<li>Automated shell scripts run without login or any user prompting. These are non-interactive and non-login.</li>
<li>Few people ever encounter a non-interactive login shell session. It requires starting a script with a special flag or piping output of a command into an SSH connection.</li>
</ol>
<h3 id="heading-how-do-the-configuration-files-work">How do the Configuration Files Work?</h3>
<p>These use cases necessitate different shell configurations, which explains why Zsh supports four different configuration files. Here's how the configuration files are used:</p>
<ul>
<li><code>~/.zshenv</code>: This is loaded universally for all types of shell sessions (interactive or non-interactive, login or non-login). It is the only configuration file that gets loaded for non-interactive and non-login scripts like cron jobs. However, macOS overrides this for <code>PATH</code> settings for interactive shells.</li>
<li><code>~/.zprofile</code>: Loaded for login shells (both interactive and the rare non-interactive sessions). MacOS uses this to set up the shell for any new terminal window. Subshells that start within the terminal window inherit settings but don't load <code>~/.zprofile</code> again.</li>
<li><code>~/.zshrc</code>: Loaded only for interactive shell sessions. It is loaded whenever you open a new terminal window or launch a subshell from a terminal window.</li>
<li><code>~/.zlogin</code>: Only used for login shell configurations, loaded after <code>.zprofile</code>. This is loaded whenever you open a new terminal window.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/01/zsh-diagram.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-use-each-file">How to Use Each File</h2>
<p>With that in mind, let's consider which configuration files you should use.</p>
<ul>
<li><code>~/.zshenv</code>: It is universally loaded, so you could use it to configure the shell for automated processes like cron jobs. However, it is best to explicitly set up environmental variables for automated processes in scripts and leave nothing to chance. As a beginner, you will not use this configuration file. In fact, few experienced macOS developers use it.</li>
<li><code>~/.zprofile</code>: Homebrew recommends setting the <code>PATH</code> variable here. There's a reason <code>PATH</code> should be set in  <code>~/.zprofile</code> and not the universal <code>~/.zshenv</code>file: the macOS runs a utility <code>path_helper</code> (from <code>/etc/zprofile</code>) that sets the <code>PATH</code> order before <code>~/.zprofile</code> is loaded.</li>
<li><code>~/.zshrc</code>: This is the configuration file that most developers use. Use it to set aliases and a custom prompt for the terminal window. You can also use it to set the <code>PATH</code> (which many people do) but <code>~/.zprofile</code> is preferred.</li>
<li><code>~/.zlogin</code>: This is rarely used. Only important in managing the order of initialization tasks for login shells in complex environments. It can be used to display messages or system data.</li>
</ul>
<h2 id="heading-how-to-avoid-complications">How to Avoid Complications</h2>
<p>These configurations may appear complicated. It made sense in the early days of computing to start time-consuming processes at login and not have them repeat when a new terminal was launched.</p>
<p>MacOS now launches any new terminal window as a login shell, loading both  <code>~/.zprofile</code> and <code>~/.zshrc</code> files without concern for the shell startup time. So why not use one Zsh configuration file? A bow to history, plus configuration customization for the experts.</p>
<p>The key advantage of the <code>~/.zprofile</code> file (versus  <code>~/.zshenv</code>) is that it sets environment variables such as <code>PATH</code> without override from macOS. The  <code>~/.zshrc</code> file could be used for the same but, by convention and design, is intended for customizing the look and feel of the interactive terminal.</p>
<h2 id="heading-keep-it-simple">Keep It Simple</h2>
<p>If you're looking for simple guidelines, here's the current best practice.</p>
<ul>
<li>Use <code>~/.zprofile</code> to set the <code>PATH</code> and <code>EDITOR</code> environment variables.</li>
<li>Use <code>~/.zshrc</code> for aliases and a custom prompt, tweaking the appearance and behavior of the terminal.</li>
<li>If you write automated shell scripts, check and set environment variables in the script.</li>
</ul>
<h2 id="heading-more-information">More Information</h2>
<p>I've written other guides that go into detail about the following:</p>
<ul>
<li><a target="_blank" href="https://mac.install.guide/terminal/index.html">Mac Terminal</a></li>
<li><a target="_blank" href="https://mac.install.guide/terminal/configuration.html">Shell Configuration</a></li>
<li><a target="_blank" href="https://mac.install.guide/terminal/path.html">Mac PATH</a>.</li>
</ul>
<p>If you're just getting started, you'll need to know <a target="_blank" href="https://mac.install.guide/terminal/open.html">How to Open Mac Terminal</a> and <a target="_blank" href="https://mac.install.guide/commandlinetools/index.html">Install Xcode Command Line Tools</a>.</p>
<p>Configuring the Zsh shell is a critical step in preparing your Mac development environment. With your development environment set up, you'll be prepared for any tutorial you'll find on freeCodeCamp.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Linux Shells for Beginners – Bash, Zsh, and Fish Explained ]]>
                </title>
                <description>
                    <![CDATA[ When you open up your terminal, chances are that it uses Bash as its UNIX shell environment. But other "shell" environments exist. There are other environments such as the C Shell, Korn Shell, Z Shell, and even the Fish Shell. All of these different ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/linux-shells-explained/</link>
                <guid isPermaLink="false">66ba5e1d6345dce12bfbb0e2</guid>
                
                    <category>
                        <![CDATA[ Bash ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ zsh ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Anthony Behery ]]>
                </dc:creator>
                <pubDate>Tue, 13 Dec 2022 21:55:05 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/12/pexels-oleksandr-pidvalnyi-320260.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>When you open up your terminal, chances are that it uses Bash as its UNIX shell environment. But other "shell" environments exist.</p>
<p>There are other environments such as the C Shell, Korn Shell, Z Shell, and even the Fish Shell. All of these different shell environments have their own pros and cons, and you should consider them before you choose one to use on your own system.</p>
<p>In this article, I'll go over a few popular shells along with their main features to help you pick one.</p>
<h2 id="heading-the-bash-shell">The Bash Shell</h2>
<p>The Bash Shell (or the Bourne Again Shell) is a UNIX shell and command language. It was written by Brain Fox for the GNU Project as a free software replacement for the Bourne Shell (sh). </p>
<p>Bash was first released in 1989, and for most Linux distributions it's the default Shell environment. Other distros, like Kali Linux, use the Z Shell as their default shell. </p>
<p>Bash is one of the first programs that Linus Torvalds (the creator of Linux) ported to Linux. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/cli_example.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://www.geeksforgeeks.org/introduction-linux-shell-shell-scripting/">Image Source</a></em></p>
<p>Something you should not get confused about is that Bash is also a programming language. So it's a "Shell", but you can also program behavior in Bash. For example:</p>
<pre><code class="lang-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Hello World"</span>
</code></pre>
<h3 id="heading-key-points-about-bash">Key points about Bash</h3>
<ul>
<li>Most users use Bash, since it is the default shell environment on most systems</li>
<li>Bash does not have an inline wildcard expression. A wildcard expression is when you would want to search for patterns in your Shell, similar to Regex. The three main wildcards are <code>*</code>, <code>?</code>, and <code>[]</code>.</li>
<li>You can't automatically change the directory name</li>
<li><code>#</code> is treated as a comment in scripting </li>
<li>It has <code>shopt</code> settings</li>
<li>Prompt has backslash escapes</li>
<li>User configuration settings are in <code>.bashrc</code></li>
</ul>
<h2 id="heading-the-z-shell">The Z Shell</h2>
<p>The Z Shell, or Zsh is also a UNIX shell that is very similar to Bash. You can also script and use the shell as a command interpreter. </p>
<p>Zsh is an extension of the Bourne shell with a lot of improvements. Zsh was released in 1990 by Paul Falstad, and it has some features that Bash, Korn Shell, and C Shell share. </p>
<p>macOS by default uses the Zsh Shell. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/nebirhos.jpg" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://ohmyz.sh/">Image Source</a></em></p>
<h3 id="heading-key-points-about-zsh">Key points about Zsh</h3>
<ul>
<li>Comes with autocompletion when using the terminal. So when you press <code>Tab ↹</code> in order to autocomplete whatever command you want to run, not only does it autocomplete for you but will bring down a drop-down of all the other possible files and directories:</li>
</ul>
<p><img src="https://i.ibb.co/bswYkn0/0f8c8e1a6016.gif" alt="Zsh Toggle" width="1440" height="810" loading="lazy"></p>
<ul>
<li>Supports inline wildcard expressions</li>
<li>Much more configurable than Bash</li>
<li>Supports plugins and themes. Here's a <a target="_blank" href="https://github.com/unixorn/awesome-zsh-plugins">list of plugins</a> available for Zsh.</li>
</ul>
<p>There are also frameworks built around the Z Shell. One of the most popular ones is <a target="_blank" href="https://ohmyz.sh/">Oh My Zsh</a>, which is a community driven, open-source framework for managing Zsh configuration. (I use Oh My Zsh 😄) </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/oh-my-zsh-mac.jpg" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://osxdaily.com/2021/11/15/how-install-oh-my-zsh-mac/">Image Source</a></em></p>
<p>Zsh and Oh My Zsh are similar but not the same exact things. To reiterate, Oh My Zsh is a way of managing your Zsh configurations, it is not the Shell itself. </p>
<h2 id="heading-the-fish-shell">The Fish Shell</h2>
<p>Fish is a UNIX shell environment with an emphasis on interactivity and usability. Unlike Zsh, Fish aims to give the user interactivity by default instead of trusting the user to implement their own configuration.  </p>
<p>It was created by Axel Liljencrantz in 2005. Fish is considered to be an "exotic shell" due to the fact that it does not comply to the POSIX shell standards. [[Source](https://en.wikipedia.org/wiki/Fish_(Unix_shell)]</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/fish-shell-screenshot.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://blog.sudobits.com/2015/06/05/fish-a-user-friendly-command-line-shell-for-ubuntulinux/">Image Source</a></em></p>
<h3 id="heading-key-points-about-fish">Key points about Fish</h3>
<ul>
<li>Fish has "search as you type" automatic suggestions based on your command history and the directory you are in. Similar to Bash's history search, Fish Shell's search history is <strong>always</strong> turned on. That way the user will be able to get interactive feedback when working in their terminal. </li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/fish.gif" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://taskwarrior.org/news/news.20140906/">Image Source</a></em></p>
<ul>
<li>Fish also prefers features as commands rather than syntax. This makes features visible in terms of commands with options and help texts</li>
<li>Since Fish by default comes with a lot of configurations already set, it is believed to be more beginner friendly than other <code>sh</code> options like Zsh.</li>
<li>Fish's scripting language is different than Zsh and Bash. Zsh uses more aliases whereas Fish avoids using aliases in the scripting language.</li>
</ul>
<p>If you were to just make scripts using basic commands such as, <code>cd</code>, <code>cp</code>, <code>vim</code>, <code>ssh</code>, and so on, you would not notice any difference in the way Fish and Bash's scripting languages work. </p>
<p>One of the biggest differences is when you try capturing output from a command. In Bash you may be used to this:</p>
<pre><code class="lang-bash">todays_date=$(date)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Todays date is <span class="hljs-variable">$todays_date</span>"</span>
</code></pre>
<p><img src="https://i.ibb.co/0hrF0Y3/fa71b0032fba.gif" alt="Output" width="657" height="385" loading="lazy"></p>
<pre><code>Todays <span class="hljs-built_in">Date</span> is Tue Dec <span class="hljs-number">13</span> <span class="hljs-number">15</span>:<span class="hljs-number">29</span>:<span class="hljs-number">28</span> CST <span class="hljs-number">2022</span>
</code></pre><p>Whereas in Fish, capturing output works differently. The equivalent for Fish in scripting would look like this:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">set</span> date (date)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Todays Date <span class="hljs-variable">$date</span>"</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/ezgif.com-gif-maker.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<pre><code class="lang-bash">todays date is Tue Dec 13 21:35:03 UTC 2022
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Bash, Z Shell, and Fish Shell all have their merits, along with some similarities. You can use each of them effectively in your work environment now that you know a bit more about them. </p>
<p>If you want something more configurable, you could use Zsh (or even install Oh My Zsh). If you want more of an interactive terminal experience without a lot of configuration, you could use Fish Shell. If you want the classic feel, you can just keep Bash. </p>
<p>It all really comes down to your preferences as a developer - so just choose the shell that works best for you.</p>
<p><em>Hope this helped you! Thank you for reading</em> 🐚🐚🐚</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Dotfiles – What is a Dotfile and How to Create it in Mac and Linux ]]>
                </title>
                <description>
                    <![CDATA[ Dotfiles are important files that will play an integral role in your career as a software developer. First, they can help make you more productive. But not only that - you'll be able to have that productive setup you created for youself on any machin... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/dotfiles-what-is-a-dot-file-and-how-to-create-it-in-mac-and-linux/</link>
                <guid isPermaLink="false">66b1e3f50938e6258a76bbca</guid>
                
                    <category>
                        <![CDATA[ Bash ]]>
                    </category>
                
                    <category>
                        <![CDATA[ command line ]]>
                    </category>
                
                    <category>
                        <![CDATA[ macOS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ shell script ]]>
                    </category>
                
                    <category>
                        <![CDATA[ zsh ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dionysia Lemonaki ]]>
                </dc:creator>
                <pubDate>Thu, 21 Oct 2021 19:49:01 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/10/dmitry-ratushny-xsGApcVbojU-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Dotfiles are important files that will play an integral role in your career as a software developer.</p>
<p>First, they can help make you more productive. But not only that - you'll be able to have that productive setup you created for youself on any machine.</p>
<p>This article is an introduction on how to get started with dotfiles.</p>
<p>You'll learn what they are, how to locate them on your system, and how to create a couple of simple dotfiles. In addition I'll give you some suggestions and resources on how to customise your settings and expand your knowledge.</p>
<p>Let's get started!</p>
<h2 id="heading-what-are-dotfiles">What are dotfiles?</h2>
<p>Many computer software programs store their configuration settings in plain, text-based files or directories.</p>
<p>Dotfiles are configuration files for various programs, and they help those programs manage their functionality.</p>
<p>What sets them apart from regular files and directories is their prefix. </p>
<p>Dotfiles are named that way because each file and directory starts with a dot (<code>.</code>)</p>
<p>On Unix based systems, dotfiles are hidden by the Operating System by default.</p>
<h3 id="heading-examples-of-common-dotfiles">Examples of common dotfiles</h3>
<p>Most programs store their configurations in your home directory by default.</p>
<p>Some common dotfiles that you may have heard of or used before are:</p>
<ul>
<li>If you use the Bash shell, you might have a <code>.bash_profile</code> and <code>.bashrc</code> file, both of which contain scripts that load each time you start a new terminal session and configure the shell.</li>
<li>If you use the Zsh shell, which is the new default for MacOS, you would have (or would've created) a <code>.zshrc</code> file which configures and customises the shell.</li>
<li>If you use the command line code editor Vim, you would store its configurations in a <code>.vimrc</code> file.</li>
<li>After setting up and configuring Git on your local machine, you would have a <code>.gitconfig</code> file, which would contain all your information and settings.</li>
<li>Many programs, instead of storing their configurations in your home directory, instead store them in the hidden <code>.config</code> directory (folder) on your system.</li>
</ul>
<h2 id="heading-how-to-find-dotfiles">How to Find Dotfiles</h2>
<p>In Finder, the root of your Home directory might look something like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/Screenshot-2021-10-20-at-7.11.45-PM.png" alt="Screenshot-2021-10-20-at-7.11.45-PM" width="600" height="400" loading="lazy"></p>
<p>But you've seen that computer systems have many more files stored which are hidden by default.</p>
<p>To view dotfiles in Finder, go to the root of your Home directory and hold down the keys <code>Command Shift .</code> and the same time. </p>
<p>You'll soon see a variety of dotfiles that either you created on your own or were created when you installed a piece of software.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/Screenshot-2021-10-20-at-7.12.04-PM.png" alt="Screenshot-2021-10-20-at-7.12.04-PM" width="600" height="400" loading="lazy"></p>
<p>To view dotfiles from the command line (which is where you'll use and interact with them the most), you again have to add some extra steps to your search.</p>
<p>The list command, <code>ls</code>, which lists all files and directories in the current directory, doesn't show dotfiles by default - despite the fact that they're  there.</p>
<p>First, navigate to your home directory. You can use the <code>cd</code> command to help you get there, if you're not there already.</p>
<p>Then use the <code>ls</code> command with the <code>-a</code> flag, which stands for <code>all</code>, like so:</p>
<pre><code class="lang-shell">ls -a
</code></pre>
<p>If you want to see some extra bits of information about your files, you can also use the <code>-l</code> flag, which lists files and directories in long format and includes details about the date and time they were created, their size, and so on.</p>
<pre><code class="lang-shell">ls -la
</code></pre>
<p>In the output, you'll see all files and directories – inlcuding all hidden ones – in your currect home directory.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/Screenshot-2021-10-19-at-1.37.15-PM.png" alt="Screenshot-2021-10-19-at-1.37.15-PM" width="600" height="400" loading="lazy"></p>
<p>Each file and directory that starts with a period/dot is a dotfile.</p>
<h2 id="heading-why-use-dotfiles">Why Use Dotfiles?</h2>
<p>Your dotfiles are personal to you.</p>
<p>You spend a sufficient amount of time fine-tuning your setup. You curate configurations and settings that best suit your workflow, aesthetic, and preferences. And you end up with a development environment that helps you, personally, be more productive.</p>
<p>What if after all that time you spent, you now have to switch to a new, different machine? Does that mean you have to start all over again from the beginning?</p>
<p>How would you remember the exact settings and commands you used?</p>
<p>Or what if you have a second machine and you want your set up to be exactly the same on both systems?</p>
<p>One of the main goals of developers is to automate repetitive tasks.</p>
<p>Creating a dotfile repository that is source-controlled and hosted on GitHub will save you time when you want to set up a new computer and install the exact same settings you created for your previous one.</p>
<p>That way all your settings and preferences can be reusable and consistent on other machines.</p>
<h2 id="heading-how-to-create-dotfiles">How to Create Dotfiles</h2>
<h3 id="heading-how-to-set-up-a-folder-to-hold-your-dotfiles">How to set up a folder to hold your dotfiles</h3>
<p>It's good practice to have all your dotfiles in their own folder.</p>
<p>For simplicity's sake, I'll show an example of how to create a folder at the root of your home directory. But you can add the folder wherever is more convenient for you. </p>
<p>Also, I'll be showing examples of how to create a <code>.zshrc</code> and <code>.vimrc</code> file, but similar ideas apply to any other dotfiles you create.</p>
<p>Navigate to your home directory (<code>cd</code>) and make a directory named <code>dotfiles</code> that will hold all your configuration files:</p>
<pre><code class="lang-shell">mkdir dotfiles
</code></pre>
<p>To create dotfiles, you use the <code>touch</code> command and pass the name(s) of the file(s) as the argument to the command. The filename(s) will have a preceding period.</p>
<p>To create a <code>.zshrc</code> and a <code>.vimrc</code> file in the <code>dotfiles</code> directory, do this:</p>
<pre><code class="lang-shell">touch ~/dotfiles/.zshrc  ~/dotfiles/.vimrc
</code></pre>
<p>If those files already exist on your system and you want to move them to the <code>dotfiles</code> directory, you can move them there using the <code>mv</code> command:</p>
<pre><code class="lang-shell">mv ~/.zshrc ~/dotfiles/
</code></pre>
<p>The first argument is the current path of the file – the tilde (<code>~</code>) stands for the home direcory. By default, most hidden confuguration files are located there.</p>
<p>The second argument is the path where you want to move the file to. In this case you want to move it to the the dotfiles directory that is located in the home directory.</p>
<p>You can do the same for the <code>.vimrc</code> file:</p>
<pre><code class="lang-shell">mv ~/.vimrc ~/dotfiles/
</code></pre>
<p>To view the files:</p>
<pre><code class="lang-shell">ls -a dotfiles 
.         ..     .vimrc    .zshrc
</code></pre>
<p>With those files in place you can then add all your preferred configurations there.</p>
<h3 id="heading-how-to-set-up-configurations">How to set up configurations</h3>
<p>Below are some ideas that could help you start the configurations of the dotfiles you created.</p>
<h4 id="heading-how-to-personalise-your-zsh-prompt">How to personalise your Zsh prompt</h4>
<p>After setting up the <code>.zshrc</code> file, anything added to that file will affect the customisation of your Zsh shell program.</p>
<p>Now could be the time to customise your shell prompt. This will be personal to your taste, but here are some resources to get you started:</p>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-configure-your-macos-terminal-with-zsh-like-a-pro-c0ab3f3c1156/">How to customize your zsh prompt like a pro</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/jazz-up-your-zsh-terminal-in-seven-steps-a-visual-guide-e81a8fd59a38/">Jazz up your zsh terminal in seven steps</a></li>
<li><a target="_blank" href="https://scriptingosx.com/2019/07/moving-to-zsh-06-customizing-the-zsh-prompt/">More ideas to customize the zsh prompt</a></li>
<li><a target="_blank" href="https://www.makeuseof.com/customize-zsh-prompt-macos-terminal/">How to Customize the zsh Prompt in the macOS Terminal</a></li>
</ul>
<h4 id="heading-how-to-customise-vim">How to customise Vim</h4>
<p>After creating the <code>.vimrc</code> file, you can customise the command line text editor Vim. Here are a couple of resources to help you start that process:</p>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/vimrc-configuration-guide-customize-your-vim-editor/">Vimrc Configuration Guide</a></li>
<li><a target="_blank" href="https://www.makeuseof.com/tag/5-things-need-put-vim-config-file/">How to Make Vim Look Good: 5 Vim Customization Tips</a></li>
</ul>
<h4 id="heading-what-are-aliases-and-functions">What are aliases and functions</h4>
<p>One way to improve your workflow and enhance your productivity, is to cut down the time it takes to type commands you use often. You can achieve that by creating shortcuts.</p>
<p>Aliases are shortcuts to terminal commands. They are a shorter version of a long command.</p>
<p>As a developer you'll use Git often, so it's a good idea to create Git aliases to help save time on long, repetitive Git commands. <a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-git-aliases/">Have a read on some of the most helpful ones on this freeCodeCamp article</a>.</p>
<p>Another way to save time is by simplifying processes. </p>
<p>You can combine two commands into one by creating an isolated behavior that does one specific job. You can do that by creating functions.</p>
<p>One helpful function to create is to combine the command for creating a new directory (<code>mkdir</code>) with the command to change directory (<code>cd</code>). </p>
<p>In this way, you will create a new folder and immediately change into it – all in one step.</p>
<p>The function to do so looks like this:</p>
<pre><code class="lang-shell">function mkcd() {
  mkdir -p "$@" &amp;&amp; cd "$_";
}
</code></pre>
<p>To read up on Zsh, functions have a look at <a target="_blank" href="https://scriptingosx.com/2019/07/moving-to-zsh-part-4-aliases-and-functions/">this article on Scripting OS X that covers both aliases and functions in Zsh</a>.</p>
<p>You can add both aliases and functions to your <code>.zshrc</code> file or you can create separate <code>.aliases</code> and <code>.functions</code> dotfiles.</p>
<h2 id="heading-how-to-symlink-your-dotfiles">How to Symlink your Dotfiles</h2>
<p>You may have noticed that none of the settings you added to the files in the <code>dotfiles</code> folder have any effect on your system.</p>
<p>A program's configuration files, as mentioned previously, are hidden and stored in the home directory by default. This is where the program will look for and read its settings from.</p>
<p>It's a good idea to symlink (or create a symbolic link -a pointer) the file in the <code>dotfiles</code> directory where you have stored your preferred settings alongside with other files you created, with the file in its default home directory.</p>
<p>It's like the file will be in two places at the same time!</p>
<p>The file will be in both the <code>dotfiles</code> directory and there will also be a 'copy' of it in the home directory.</p>
<p>To create a link, you use the <code>ln</code> (stands for link) command with the <code>-s</code> argument (which stands for symbolic).</p>
<p>Here's how to symlink the <code>.zshrc</code> and <code>.vimrc</code> files:</p>
<pre><code class="lang-shell">ln -s ~/dotfiles/.vimrc  ~/.vimrc
ln -s ~/dotfiles/.zshrc  ~/.zshrc
</code></pre>
<p>This will make the programs you use aware of where their configuration files are normally – back in the home directory.</p>
<pre><code class="lang-shell">ls -l ~/.zshrc 

lrwxr-xr-x  1 dionysialemonaki  staff  39 Oct 21 18:30 /Users/dionysialemonaki/.zshrc -&gt; /Users/dionysialemonaki/dotfiles/.zshrc
</code></pre>
<p>Looking at the details of the <code>.zshrc</code> file, it shows that the file located in the home directory points to the file in the dotfiles directory. The <code>-&gt;</code> indicates the symlink.</p>
<p>Symlinking all your dotfiles manually is a cumbersome process and can get tiring and repetitive quickly as you add more dotfiles to the folder.</p>
<p>To make the process easier, you can create a shell script that will automate calling <code>ln -s</code> on the dotfiles you create or use a <a target="_blank" href="http://dotfiles.github.io/utilities/">utility</a> for that job.</p>
<h2 id="heading-how-to-version-control-your-dotfiles">How to Version Control your Dotfiles</h2>
<p>Having your files under version control will help you track all the changes you make to them over time, and will also allow you to share them on GitHub.</p>
<p>Make sure to change directory into the <code>dotfiles</code> directory (<code>cd dotfiles</code>).</p>
<p>Follow these steps to organise your files in a git repository:</p>
<ol>
<li>Initialise the repository:</li>
</ol>
<pre><code class="lang-shell">git init
</code></pre>
<ol start="2">
<li>Add all the files you've created so far:</li>
</ol>
<pre><code class="lang-shell">git add .
</code></pre>
<ol start="3">
<li>Commit the changes and add a commit message:</li>
</ol>
<pre><code class="lang-shell">git commit -m "Added dotfiles"
</code></pre>
<h3 id="heading-how-to-host-your-dotfiles-on-github">How to host your dotfiles on GitHub</h3>
<p>Make sure you've signed into your GitHub account.</p>
<p>Then, create a new repository:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/Screenshot-2021-10-21-at-5.21.59-PM.png" alt="Screenshot-2021-10-21-at-5.21.59-PM" width="600" height="400" loading="lazy"></p>
<p>Give it a name add click "Create repository".</p>
<p>Next, in the command line, add:</p>
<pre><code class="lang-shell">git remote add origin url 

#where 'url',the GitHub url of the repository you previously created
#ending in .git
</code></pre>
<p>Finally,</p>
<pre><code class="lang-shell">git push -u origin main
</code></pre>
<p>And now you are able to share your dotfiles online!</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>And there you have it – you now know the basics of dotfiles! I hope you found this tutorial helpful.</p>
<p>Your dotfiles project will most likely follow you throughout your career and will grow the more you learn about dotfiles themselves. And it'll also change as you learn more about what you like and don't like regarding your workflow and development environment setting by lots of trial and error.</p>
<p>Thanks for reading!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to show your current Firebase project name on the command line prompt to prevent dangerous errors ]]>
                </title>
                <description>
                    <![CDATA[ By Thang Minh Vu When working on a project with multiple stages (development, staging, production), developers use the command firebase use to switch between projects. It’s very easy to run a command on the production environment instead of the devel... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-show-your-current-firebase-project-name-on-the-command-line-prompt-to-prevent-dangerous-1bfee6293811/</link>
                <guid isPermaLink="false">66c354bc6fcacbc9454845bf</guid>
                
                    <category>
                        <![CDATA[ Bash ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firebase ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ terminal ]]>
                    </category>
                
                    <category>
                        <![CDATA[ zsh ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 03 Dec 2018 21:36:40 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*8Yvp2a4vtkb5dWzWXh1qcQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Thang Minh Vu</p>
<p>When working on a project with multiple stages (development, staging, production), developers use the command <code>firebase use</code> to switch between projects. It’s very easy to run a command on the production environment instead of the development. This is very dangerous.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/eFjsis27Zzr7idxjQLbY6pGoFuXoJaFymGRv" alt="Image" width="800" height="304" loading="lazy">
<em>Command to switch between firebase project</em></p>
<p><strong>Note</strong>: You can always find the latest script at my <a target="_blank" href="https://github.com/ittus/firebase-prompt">GitHub repository</a>.</p>
<p>Normally, developers only work on the development project. They only switch to production in case of checking or doing a hotfix. There have been a few times when I forgot to switch back to the development project. I accidentally changed the database without thinking that it could impact the actual users.</p>
<p>Digging into the <em>firebase CLI</em>, I found that it uses <a target="_blank" href="https://github.com/yeoman/configstore">configstore</a> to manage local configuration. All config is saved in a JSON file and reads easily. I created a small script which is intended to show the firebase project name on <strong>shell prompt</strong>.</p>
<h3 id="heading-how-to-set-it-up">How to set it up</h3>
<h4 id="heading-bash">Bash</h4>
<p>Add the following script to the end of <code>~/.bash_profile</code>:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/vxqUWLsAfgLirG49oRLax03ekT7t5SfgaXYq" alt="Image" width="800" height="277" loading="lazy">
_Add script to ~/.bash<em>profile</em></p>
<p>Then run <code>source ~/.bash_profile</code> or open a new terminal window:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ziaCqfVR0i6tyepr38KBdQ8jnmcdwq7pzHNl" alt="Image" width="800" height="271" loading="lazy">
<em>Firebase project name is displayed as dev-project, stage-project and prod-project</em></p>
<h4 id="heading-iterm2-with-oh-my-zsh">iTerm2 with oh-my-zsh</h4>
<p><a target="_blank" href="https://github.com/robbyrussell/oh-my-zsh">Oh-my-zsh</a> is a popular open source framework for Zshell. I like it because it has many beautiful terminal themes and many useful plugins.</p>
<p>Here, I will make an example with the <em>agnoster</em> theme:<br>Edit <code>~/.oh-my-zsh/themes/agnoster.zsh-theme</code></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/RtXGYfMLwplrpQj-BQkXr3M9cMxpRKWuo4z4" alt="Image" width="800" height="259" loading="lazy">
<em>Script for oh-my-zsh</em></p>
<p>and then add <code>prompt_firebase</code> to <code>build_prompt</code> functions:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/uHVO625HTQdptNI1faRbYW8EZgHVpAEycvh4" alt="Image" width="700" height="894" loading="lazy">
_Change build<em>promt function</em></p>
<p>For the final step, run <code>source ~/.zshrc</code> or open a new terminal window:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/CsElxb8a3b4VSJjAqXkyFL-XrwhSXlLEIbuF" alt="Image" width="757" height="91" loading="lazy">
<em>saas-cs-deploy-taguro-5c55e is displayed as last text in terminal prompt</em></p>
<p>I hope this can help you prevent the an unexpected (and bad) situation.</p>
<p><strong>Note</strong>: You can always find the latest script at my <a target="_blank" href="https://github.com/ittus/firebase-prompt">GitHub repository</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Configure your macOs Terminal with Zsh like a Pro ]]>
                </title>
                <description>
                    <![CDATA[ By Chiamaka Ikeanyi Sometimes, using the default terminal sucks. You want to go out of the ordinary, to add life to the boring terminal and improve your productivity. Z shell (Zsh) is a Unix shell built on top of bash (the default shell for macOS) wi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-configure-your-macos-terminal-with-zsh-like-a-pro-c0ab3f3c1156/</link>
                <guid isPermaLink="false">66c350b45ced6d98e4bd334c</guid>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ terminal ]]>
                    </category>
                
                    <category>
                        <![CDATA[ zsh ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 15 Nov 2018 18:05:25 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*REqZX2_JqQjbH9Ly3QsgLg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Chiamaka Ikeanyi</p>
<p>Sometimes, using the default terminal sucks. You want to go out of the ordinary, to add life to the boring terminal and improve your productivity.</p>
<p><a target="_blank" href="https://en.wikipedia.org/wiki/Z_shell">Z shell</a> (Zsh) is a Unix shell built on top of bash (the default shell for macOS) with a large number of improvements.</p>
<p>In this walk-through, we will configure iTerm2 with ZSH and its dependencies. This is a no-brainer, and after this, you’ll ponder the reason for not discovering ZSH earlier. Well, since you’re here already, let’s kick-start this.</p>
<h3 id="heading-keynotes">Keynotes</h3>
<ul>
<li>Homebrew installation</li>
<li>iTerm2 installation</li>
<li>ZSH and Oh My ZSH installations</li>
<li>Setting up the dependencies to create a beautiful terminal</li>
</ul>
<h3 id="heading-step-1-install-homebrew">Step 1: Install Homebrew</h3>
<p><a target="_blank" href="https://brew.sh/">Homebrew</a> is a free and open-source software package management system that simplifies the installation of software on Apple’s macOS.</p>
<p>Before installing Homebrew, we need to install the CLI tools for Xcode. Open your terminal and run the command:</p>
<pre><code class="lang-bash">xcode-select —-install
</code></pre>
<p>If you get an error, run <code>xcode-select -r</code> to reset <code>xcode-select</code>.</p>
<p>Then, install Homebrew.</p>
<pre><code class="lang-bash">/usr/bin/ruby -e <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span>
</code></pre>
<h3 id="heading-step-2-install-iterm2">Step 2: Install iTerm2</h3>
<p>iTerm2 is a replacement for terminal and the successor to iTerm. Most software engineers prefer i<a target="_blank" href="https://www.iterm2.com/">Term2</a> over the default terminal that ships with macOS as a result of <a target="_blank" href="https://www.iterm2.com/features.html">its cool features</a>. You can integrate zsh into iTerm2 to increase productivity.</p>
<p>To install iTerm2, run the command:</p>
<pre><code class="lang-bash">brew cask install iterm2
</code></pre>
<h3 id="heading-step-3-install-zsh">Step 3: Install ZSH</h3>
<blockquote>
<p><em>Zsh is a shell designed for interactive use, although it is also a powerful scripting language.</em></p>
</blockquote>
<p>By default, macOs ships with zsh located in<code>/bin/zsh</code>.</p>
<p>Let’s install zsh using brew and make iTerm2 use it.</p>
<pre><code class="lang-bash">brew install zsh
</code></pre>
<h3 id="heading-step-4-install-oh-my-zsh">Step 4: Install Oh My Zsh</h3>
<blockquote>
<p>“Oh My Zsh is an open source, community-driven framework for managing your <a target="_blank" href="https://www.zsh.org/">zsh</a> configuration. It will not make you a 10x developer…but you might feel like one”</p>
<p>— Robby Russell</p>
</blockquote>
<p>It runs on Zsh to provide cool features configurable within the ~/.zhrc config file. Install <a target="_blank" href="https://github.com/robbyrussell/oh-my-zsh">Oh My Zsh</a> by running the command</p>
<pre><code>sh -c <span class="hljs-string">"$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"</span>
</code></pre><p>Check the installed version</p>
<pre><code class="lang-bash">zsh --version
</code></pre>
<p>You can upgrade it to get the latest features it offers.</p>
<pre><code class="lang-bash">upgrade_oh_my_zsh
</code></pre>
<p>Restart iTerm2 to dive into the new experience of using Zsh. Welcome to the “Oh My Zsh” world ?.</p>
<p>That’s not all. Now, we will install the dependencies to get the best out of Zsh.</p>
<h3 id="heading-step-5-change-the-default-theme">Step 5: Change the Default Theme</h3>
<p>Oh My Zsh comes bundled with a lot of themes. The default theme is robbyrussell, but you can change it to any theme of your choice. In this scenario, I changed it to agnoster, an already pre-installed theme.</p>
<p>You then need to select this theme in your <code>~/.zshrc</code>. To open the config file (.zshrc), run the command:</p>
<pre><code class="lang-bash">nano ~/.zshrc
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/czy8LqFZcWJnyNWPq8MLpU-u6r74ozW-ndAz" alt="Image" width="800" height="497" loading="lazy">
<em>Zsh theme set to agnoster</em></p>
<p>Or open the file in a text editor with</p>
<pre><code class="lang-bash">open ~/.zshrc
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/umcC5b7qtng38UbZngNRwMXq6NzwmR8SqIes" alt="Image" width="800" height="497" loading="lazy"></p>
<p>Set the zsh theme and update your changes</p>
<pre><code class="lang-bash"><span class="hljs-built_in">source</span> ~/.zhrc
</code></pre>
<h3 id="heading-using-a-custom-theme">Using a Custom Theme</h3>
<p>To install another theme not pre-installed, clone the repository into <code>custom/themes</code>directory. In this scenario, we’ll install <a target="_blank" href="https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions#option-2-install-for-oh-my-zsh">powerlevel9k</a>,</p>
<pre><code class="lang-bash">$ git <span class="hljs-built_in">clone</span> https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
</code></pre>
<p>Then, select this theme in your <code>~/.zshrc</code></p>
<pre><code class="lang-bash">ZSH_THEME=<span class="hljs-string">"powerlevel9k/powerlevel9k"</span>
</code></pre>
<p>Update your changes by running the command <code>source ~/.zshrc</code></p>
<p>Navigate to <code>iTerm2 &gt; Preferences &gt; Profiles &gt; Colors</code> if you wish to change the background color of the terminal.</p>
<p>The selected theme in this scenario requires powerline fonts. So, let’s install that.</p>
<h3 id="heading-step-6-install-fonts">Step 6: Install Fonts</h3>
<p>I will be using <a target="_blank" href="https://github.com/powerline/fonts/tree/master/Inconsolata">Inconsolata</a>. Get your preferred font out of these <a target="_blank" href="https://github.com/powerline/fonts">powerline fonts</a>. Then, download and install it.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/l-nkEZ87vggoFrm5xPNGvyNMv9hyxZc2tE1U" alt="Image" width="800" height="681" loading="lazy"></p>
<p>Or download the entire font.</p>
<pre><code class="lang-bash">git <span class="hljs-built_in">clone</span> https://github.com/powerline/fonts.git

<span class="hljs-built_in">cd</span> fonts

./install.sh
</code></pre>
<p>To change the font, navigate to <code>iTerm2 &gt; Preferences &gt; Profiles &gt; Text &gt; Change Font</code>.</p>
<p>Now, you can see Inconsolata listed as one of the fonts. Select your preferred font. For fonts that support ligatures like <a target="_blank" href="https://github.com/tonsky/FiraCode">FiraCode</a>, check the “Use ligatures” option to view your arrows and other operators in a stylish manner like ( <strong>→</strong> ).</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/flJ1CL1uDv0QoX-TK0MBgn7CVuyG0wOG388V" alt="Image" width="800" height="479" loading="lazy">
<em>Select a powerline font</em></p>
<h3 id="heading-step-7-install-color-scheme">Step 7: Install Color Scheme</h3>
<p>Let’s change the color scheme to bring out the beauty of our terminal. Navigate to <a target="_blank" href="https://github.com/mbadolato/iTerm2-Color-Schemes">iTerm2-Color-Schemes</a> and download the ZIP folder. Then, extract the downloaded folder cos what we need resides in the schemes folder.</p>
<p>Navigate to <code>iTerm2 &gt; Preferences &gt; Profile &gt; Colors &gt; Color Presets &gt; Import</code></p>
<ul>
<li>Navigate to the schemes folder and select your preferred color schemes to import them.</li>
<li>Click on a specific color scheme to activate it. In this scenario, I activated Batman which is my preferred color scheme.</li>
</ul>
<p><img src="https://cdn-media-1.freecodecamp.org/images/0NGtEWFgLWeyM4tzGVtQ4xTNNqBdnHMdZMGw" alt="Image" width="800" height="587" loading="lazy"></p>
<p>Tada! ? We’re done with the basic settings.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/tFnT1hiSKgWYMYYTNIzUfjD1Z5vIe2QnjSlI" alt="Image" width="800" height="400" loading="lazy">
<em>Batman color scheme</em></p>
<h3 id="heading-step-8-install-plugins">Step 8: Install Plugins</h3>
<p>Oh My ZSH comes preloaded with a git plugin. To add more, for instance, docker, auto-suggestion, syntax highlighting and more:</p>
<ul>
<li>Clone the Git repository</li>
</ul>
<pre><code class="lang-bash">git <span class="hljs-built_in">clone</span> https://github.com/zsh-users/zsh-docker.git <span class="hljs-variable">${ZSH_CUSTOM:-~/.oh-my-zsh/custom}</span>/plugins/zsh-docker
</code></pre>
<ul>
<li>Head over to <code>.oh-my-zsh &gt; custom &gt; plugins</code> directory to view the cloned directory. To access this, run the command <code>open ~/.oh-my-zsh</code></li>
<li>Add the plugin to the plugin section of the config file <code>~/.zshrc</code> shown below</li>
<li>Update your changes by running the command <code>source ~/.zshrc</code></li>
</ul>
<p><img src="https://cdn-media-1.freecodecamp.org/images/oK1lzMvgGrsycWUoueagV0a99eq00akzwiEW" alt="Image" width="800" height="393" loading="lazy"></p>
<h3 id="heading-step-9-add-aliases">Step 9: Add Aliases</h3>
<p>Aliases are shortcuts used to reduce the time spent on typing commands. Add aliases to commands you run in the section shown below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/VmmW4SCRGXW2cQ74o4nODyLOlNgZYeJEgOyR" alt="Image" width="800" height="497" loading="lazy">
<em>Typing <code>**dckimgs**</code> executes docker images command</em></p>
<p><strong><em>Thanks for reading</em></strong>.</p>
<p>If you know about other means of improving productivity using ZSH, you can drop them on the comment section, I will be glad to hear from you.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Jazz Up Your “ZSH” Terminal In Seven Steps — A Visual Guide ]]>
                </title>
                <description>
                    <![CDATA[ By rajaraodv In this blog I’ll cover installing ITerm2, ZSH shell, “oh my ZSH”, Themes, ITerm2 color schemes, “oh my ZSH” plugins and enable “ligature” support to help create a beautiful and powerful Terminal. If you want to just make your regular B... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/jazz-up-your-zsh-terminal-in-seven-steps-a-visual-guide-e81a8fd59a38/</link>
                <guid isPermaLink="false">66c35938f83dfae169b2bff9</guid>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ terminal ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ zsh ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 13 Mar 2018 06:42:49 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*Sk54-oKGwIS_3BRk1S4N7A.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By rajaraodv</p>
<p>In this blog I’ll cover installing ITerm2, ZSH shell, “oh my ZSH”, Themes, ITerm2 color schemes, “oh my ZSH” plugins and enable “ligature” support to help create a beautiful and powerful Terminal.</p>
<blockquote>
<p>If you want to just make your regular Bash Terminal powerful, take a look at my previous blog: “<a target="_blank" href="https://medium.com/@rajaraodv/jazz-up-your-bash-terminal-a-step-by-step-guide-with-pictures-80267554cb22">Jazz Up Your Bash Terminal</a>”. But ZSH explained in this blog is more powerful stuff.</p>
</blockquote>
<h4 id="heading-summary">Summary:</h4>
<p>We’ll be covering a lot of things. This may be confusing, so here is the summary of what we will be doing.</p>
<ol>
<li>Install ITerm2 — This is a better alternative to the default Terminal</li>
<li>Install latest ZSH shell — This is more powerful than the regular bash shell. We will switch ITerm2 to use ZSH shell.</li>
<li>Install “Oh My ZSH “— This is a CLI tool to easily configure ZSH and add themes and plugins to ZSH</li>
<li>Add two types of Themes using “Oh My ZSH” — some themes need extra steps so we will cover both</li>
<li>Install different ITerm2 Schemes — These are just color schemes for the UI</li>
<li>Add two different Plugins using “Oh My ZSH” to improve productivity</li>
<li>Enable “ligature” support so when you write an arrow <strong>=&gt;</strong>;, it appears like a real arr<strong>o</strong>w →</li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*k3akUSSgJsBjjzMkAAN9tQ.gif" alt="Image" width="800" height="450" loading="lazy"></p>
<h3 id="heading-step-1-install-iterm2">Step 1— Install ITerm2</h3>
<p>A lot of programmers like <a target="_blank" href="https://www.iterm2.com">ITerm2</a> instead of the default Terminal. It is similar to the Terminal, but has lots of features of its own. It of course can run ZSH, Bash, and other shells inside it.</p>
<p>The following video shows some of the new features of Item 2 (v3).</p>
<blockquote>
<p>For this blog we’ll use ITerm2. When I mention “Terminal”, I mean ITerm2. Although the steps are the same for both Terminal or ITerm2.</p>
</blockquote>
<h3 id="heading-step-2-change-shell-to-zsh">Step 2— Change Shell To ZSH</h3>
<p>The following video shows why ZSH is better than just a bash shell.</p>
<p><strong>Option 1 — Use Mac’s own ZSH:</strong></p>
<p>Mac comes with a ZSH out-of-the-box, so we don’t need to install it. However, sometimes it’s an older version of ZSH. Typically it’s located at /bin/zsh. To use it, all we need to do is to change shell (chsh).</p>
<ol>
<li>Open the Terminal (or ITerm2) and type the following command.</li>
</ol>
<pre><code class="lang-bash">$ chsh -s $(<span class="hljs-built_in">which</span> zsh)
</code></pre>
<ol start="2">
<li><p>Enter the password and it will change the shell, upon logout and login.</p>
</li>
<li><p><strong>Logout and re-login</strong></p>
</li>
<li><p>To test, open the Terminal and type the following, and it should say zsh.</p>
</li>
</ol>
<pre><code class="lang-bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-variable">$0</span>
zsh //should <span class="hljs-built_in">return</span> zsh
</code></pre>
<p><strong>Option 2— Install Homebrew and Install latest ZSH via Homebrew</strong></p>
<p>This option is pretty common among users, because some of the plugins only work with the latest ZSH.</p>
<p>Homebrew, simply said, is a command line installer for all sorts of software. Let’s install that first.</p>
<ol>
<li>Install Homebrew by running the following command.</li>
</ol>
<pre><code class="lang-bash">ruby -e <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span>
</code></pre>
<ol start="2">
<li>If you get Command Line Tools for Xcode error, it means you haven’t installed the CLI tools for Xcode. <em>If you don’t get the error, you can skip this step, because you already have it installed.</em></li>
</ol>
<p>XCode Developer CLI tools are used by various apps that manipulate core OSX features. So make sure to install the Xcode CLI tools by running the following command.</p>
<p><code>$ xcode-select —-install</code></p>
<blockquote>
<p>Note: The above command opens up Mac’s installer and installs the XCode Developer CLI tools. If it doesn’t work, try <code>_xcode-select -r_</code> to reset.</p>
</blockquote>
<ol start="3">
<li>Install ZSH via Homebrew</li>
</ol>
<p>Run the following command to install ZSH. It gets installed at <code>/usr/local/bin/zsh</code> PS: Mac’s default ZSH is at <code>/bin/zsh</code></p>
<pre><code class="lang-bash">brew install zsh
</code></pre>
<ol start="4">
<li>Use the Homebrew version of ZSH</li>
</ol>
<p>Run the following command. You will be prompted to enter Mac’s password.</p>
<pre><code class="lang-bash">chsh -s /usr/<span class="hljs-built_in">local</span>/bin/zsh
</code></pre>
<p><strong>5. Logout and log back in.</strong></p>
<ol start="6">
<li>Test if we are using ZSH and the correct ZSH</li>
</ol>
<pre><code class="lang-bash">$ <span class="hljs-built_in">echo</span> <span class="hljs-variable">$0</span>
zsh   //correct

$ <span class="hljs-built_in">which</span> zsh
/usr/<span class="hljs-built_in">local</span>/bin/zsh   //correct
</code></pre>
<h3 id="heading-step-3-oh-my-zsh">Step 3— “Oh My ZSH”</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*Sk54-oKGwIS_3BRk1S4N7A.png" alt="Image" width="800" height="440" loading="lazy"></p>
<p>“Oh My ZSH” is a plugin that runs on top of ZSH. It provides default config for ZSH (~/.zhrc file) and also provides themes and more features.</p>
<blockquote>
<p>From what I know, most power users who use ZSH also use “Oh My ZSH”.</p>
</blockquote>
<ol>
<li><strong>Install “Oh My ZSH”</strong></li>
</ol>
<p>Run the following command to install “oh My ZSH”.</p>
<pre><code class="lang-bash">sh -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)</span>"</span>
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*9X_r8cgGVOIwS8PiPZnS7A.png" alt="Image" width="800" height="407" loading="lazy">
<em>Oh My ZSH is installed</em></p>
<ol start="2">
<li>Close and quit ITerm2 and reopen it.</li>
</ol>
<p>It should look something like below. Notice that the prompt has changed and the theme is a bit different — That’s “Oh My ZSH” in action for you.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*8Ot5gJq4R_iCXJqlkDPGow.png" alt="Image" width="800" height="206" loading="lazy">
<em>Initial Oh My ZSH Theme</em></p>
<h3 id="heading-step-4-change-themes-and-install-fonts">Step 4— Change Themes And Install Fonts</h3>
<p>In this step, we’ll add two different “Oh My ZSH” Themes. “Oh My ZSH” comes with <a target="_blank" href="https://github.com/robbyrussell/oh-my-zsh/wiki/Themes">tons of themes</a>. <em>PS: But some Themes need extra steps like installing specific fonts and so on.</em></p>
<p>To set a Theme, simply open ~/.zshrc file (created by “Oh My ZSH”) and change the theme as shown below.</p>
<blockquote>
<p>PS: .zshrc is the config file for ZSH shell. People who don’t use “Oh My ZSH” will have to manually create this file and add any configs themselves. “Oh My ZSH” automatically creates this file if it doesn’t exist and then adds its own set of configs into this file.</p>
</blockquote>
<h4 id="heading-theme-1-lets-add-a-theme-called-avit">Theme 1 — Let’s add a Theme called “<strong>Avit”</strong></h4>
<ol>
<li>Open .zshrc</li>
</ol>
<pre><code class="lang-bash">$ open ~/.zshrc
</code></pre>
<ol start="2">
<li>Change the Theme to “Avit”</li>
</ol>
<p>You can browse all the “Oh My ZSH” Themes <a target="_blank" href="https://github.com/robbyrussell/oh-my-zsh/wiki/Themes">here</a>. To change the Theme, simply change the ZSH_THEME value in ~/.zshrc file from <strong>robbyrussell</strong> to <strong>Avit</strong>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*yzCfQpf-7oVs3SPelf1Imw.png" alt="Image" width="800" height="557" loading="lazy"></p>
<ol start="3">
<li>Update ZSH config</li>
</ol>
<p>Run the following command to update the config.</p>
<pre><code class="lang-bash">$ <span class="hljs-built_in">source</span> ~/.zshrc
</code></pre>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*jdA_I2AykgRqAKTRVSY3Eg.png" alt="Image" width="800" height="245" loading="lazy">
<em>Your command prompt in Avit Theme</em></p>
<ol start="4">
<li>Change the background color and font size</li>
</ol>
<p>Open ITerm2 &gt; Preferences &gt; Profiles &gt; Colors and change the background black color to use 20% gray as shown below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*NjFS-nVNi0O8lDSoHLUleg.png" alt="Image" width="800" height="518" loading="lazy">
<em>Use 20% Gray background</em></p>
<p>Then open Text &gt; Change Font and change the size to 14pt.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*8rl1Nc5oqqtd7RSjzo8K4w.png" alt="Image" width="800" height="441" loading="lazy">
<em>Change font to 14pt</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*CjzxD0L9jyqK0bp5zLB8lg.png" alt="Image" width="800" height="438" loading="lazy">
<em>A clean and beautiful Iterm2 with ZSH!</em></p>
<p>OK, Let’s install a different Theme that needs fonts.</p>
<h4 id="heading-theme-2-installing-agnoster-oh-my-zsh-theme">Theme 2 — Installing “agnoster” Oh My ZSH theme</h4>
<p>This is a popular theme because it emulates the <a target="_blank" href="https://powerline.readthedocs.io/en/latest/overview.html#screenshots">Powerline</a> Python app that enhances the terminal. The following picture shows how it looks. But this theme also needs us to install Powerline themes.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*vLlx2GBxwk1NAOa-eLOCyw.png" alt="Image" width="800" height="378" loading="lazy">
<em>agnoster Oh My ZSH theme</em></p>
<p><strong>1. Install <a target="_blank" href="https://github.com/powerline/fonts.git">Powerline fonts</a></strong></p>
<pre><code class="lang-bash">$ git <span class="hljs-built_in">clone</span> https://github.com/powerline/fonts.git
$ <span class="hljs-built_in">cd</span> fonts
$ ./install.sh
</code></pre>
<p><strong>2. Change the Theme to “agnoster”</strong></p>
<pre><code class="lang-bash">$ open ~/.zshrc
Set ZSH_THEME=<span class="hljs-string">"agnoster"</span> and save the file
</code></pre>
<p><strong>3. Quit ITerm2 and reopen it.</strong></p>
<p><strong>4. Set Powerline font</strong></p>
<p>You can set any Powerline patched font you like. All the fonts end with <strong><em>“for Powerline”</em></strong>.</p>
<p>Open <code>ITerm2 &gt; Preferences &gt; Profiles &gt; Text &gt; Change Font</code> and set it to something that has “for Powerline”. I’m choosing <strong><em>“Meslo LG DZ for Powerline”</em></strong> font.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*S9KIZotQcq4dNoBESM0v3w.png" alt="Image" width="800" height="534" loading="lazy">
<em><strong>Meslo LG DZ for Powerline Iterm2 font</strong></em></p>
<blockquote>
<p>Note — If you are confused about the fonts and Themes: the Themes are for “Oh My ZSH” and ZSH shell and the fonts are for the Iterm2 itself.</p>
</blockquote>
<h4 id="heading-5-all-done">5. All Done</h4>
<p>At this point your Terminal should look like below:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*vLlx2GBxwk1NAOa-eLOCyw.png" alt="Image" width="800" height="378" loading="lazy"></p>
<h3 id="heading-step-5-install-iterm2-color-schemes-iterm2-themes">Step 5 — Install iTerm2 “color schemes” (ITerm2 Themes)</h3>
<p>There are plenty of gorgeous color schemes for iTerm2. These schemes change the foreground color, background color, cursor color, and so on. You can find them at <a target="_blank" href="https://github.com/mbadolato/iTerm2-Color-Schemes">iTerm2-color-schemes</a> Github repo.</p>
<blockquote>
<p>Note: These are just color schemes of the ITerm2 UI and don’t deal with the command prompt’s look and feel like “Oh My ZSH”’s themes (other than just changing colors).</p>
</blockquote>
<p>Follow these steps to install them.</p>
<ol>
<li>Download the <a target="_blank" href="https://github.com/mbadolato/iTerm2-Color-Schemes">iTerm2-color-schemes</a> as a zip file and extract it</li>
<li>The “Schemes” folder contains all the color scheme files — they end with <code>.itermcolors</code></li>
<li>Open <code>iTerm2 &gt; Preferences &gt; Profile &gt; Colors &gt; Color Presets &gt; Import</code></li>
<li>In the import window, navigate to the “Schemes” folder (from step 2)</li>
<li>Select all the files so you can import all the color schemes at once</li>
<li>Simply select whichever color scheme you like.</li>
</ol>
<blockquote>
<p>My favorites are <strong>Batman</strong> and <strong>Argonaut</strong></p>
</blockquote>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*LHZaKiNSSp5PX0RRTS5ITw.png" alt="Image" width="800" height="354" loading="lazy">
<em>Batman Iterm2 Theme</em></p>
<p>The Argonaut color scheme looks like below:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*yFbKJQbBwNRbtU4dFM2UVA.png" alt="Image" width="800" height="352" loading="lazy">
<em>Argonaut color scheme</em></p>
<h3 id="heading-step-6-install-plugins">Step 6— Install Plugins</h3>
<p>Plugins add more functionalities to your workflow. By default “Oh My ZSH” already has the “git” plugin! and that’s why you were able to see all those Git statuses in the prompts in earlier screenshots. Let’s add another one to see how it works.</p>
<blockquote>
<p>Note: In this section, we’ll install two different plugins to show how they work.</p>
</blockquote>
<h4 id="heading-plugin-1-add-syntax-highlighting-plugin">Plugin 1 — Add Syntax Highlighting Plugin</h4>
<p>The Syntax Highlighting plugin adds beautiful colors to the commands you are typing as shown below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*f_RqoUuzWvcVhATPzr2i7A.png" alt="Image" width="800" height="386" loading="lazy"></p>
<ol>
<li>Clone the zsh-syntax-highlighting plugin’s repo and copy it to the “Oh My ZSH” plugins directory.</li>
</ol>
<pre><code class="lang-bash">git <span class="hljs-built_in">clone</span> https://github.com/zsh-users/zsh-syntax-highlighting.git <span class="hljs-variable">${ZSH_CUSTOM:-~/.oh-my-zsh/custom}</span>/plugins/zsh-syntax-highlighting
</code></pre>
<ol start="2">
<li>Activate the plugin in <code>~/.zshrc</code> by adding <code>`zsh-syntax-highlighting</code> to the Plugins section as shown below.</li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*1sGebsi0qMQMAvPLo64ARQ.png" alt="Image" width="800" height="557" loading="lazy">
<em>Add a new plugin in a new line inside plugins section</em></p>
<ol start="3">
<li>Re-read zshrc configuration</li>
</ol>
<pre><code class="lang-bash"><span class="hljs-built_in">source</span> ~/.zshrc
</code></pre>
<h4 id="heading-plugin-2-add-zsh-autosuggestion-plugin">Plugin 2 — Add ZSH-AutoSuggestion Plugin</h4>
<p>This plugin auto suggests any of the previous commands. Pretty handy! <strong>To select the completion, simply press → key.</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*ZiTrbBVUGLWe4OwRL1Ytrg.gif" alt="Image" width="800" height="347" loading="lazy"></p>
<ol>
<li>Install the plugin</li>
</ol>
<pre><code class="lang-bash">git <span class="hljs-built_in">clone</span> https://github.com/zsh-users/zsh-autosuggestions <span class="hljs-variable">$ZSH_CUSTOM</span>/plugins/zsh-autosuggestions
</code></pre>
<blockquote>
<p>PS: ZSH_CUSTOM points to ~/.oh-my-zsh/custom</p>
</blockquote>
<ol start="2">
<li>Open <code>~/.zshrc</code> and add zsh-autosuggestions</li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*pshPBacVfZgHaKdlG1cajg.png" alt="Image" width="800" height="557" loading="lazy"></p>
<h3 id="heading-step-7-use-ligature-support">Step 7 — Use Ligature Support</h3>
<p>There are various fonts that help make operators like less than, double equals, right arrow, not equals, and so on look beautiful. For example, every time you type: =&gt;, it becomes: →.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*OIpApVPLobonxDMEkaAbaA.png" alt="Image" width="800" height="604" loading="lazy"></p>
<p>To use this, we need fonts that support ligatures. We also need to enable it in ITerm2. <a target="_blank" href="https://github.com/tonsky/FiraCode">FiraCode</a> is one such font. Follow the steps to install and enable ligatures.</p>
<ol>
<li>Download the <a target="_blank" href="https://github.com/tonsky/FiraCode">FiraCode</a> repo and extract the zip file (or clone it)</li>
<li>Open the <code>dstr &gt; ttf</code> folder and double click on all the <code>*.ttf</code> files and select the “Install font” button to install each of the font variations.</li>
<li>Navigate to <code>ITerm2 | Preferences | Profiles | Text</code></li>
<li><strong>Select</strong> <code>**Use Ligatures**</code><strong>checkbox</strong></li>
<li>Click on <code>Change Font</code> and select <code>Fira Code Regular</code> font</li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*kFynRP_J2Q42WA5TGtPphA.png" alt="Image" width="800" height="441" loading="lazy"></p>
<h3 id="heading-summary-1">Summary</h3>
<p>We have covered a lot in this blog starting from installing latest ZSH via Homebrew, Oh My ZSH, Plugins, Themes, enable “ligatures” for FiraCode font.</p>
<p>?? Thank you!</p>
<h4 id="heading-if-this-was-useful-please-click-the-clap-button-down-below-a-few-times-to-show-your-support">If this was useful, please click the clap ? button down below a few times to show your support! ⬇⬇⬇ ??</h4>
<h3 id="heading-my-other-posts">My Other Posts</h3>
<p><a target="_blank" href="https://medium.com/@rajaraodv/latest"><em>https://medium.com/@rajaraodv/latest</em></a></p>
<h4 id="heading-ecmascript-2015">ECMAScript 2015+</h4>
<ol>
<li><em><a target="_blank" href="https://www.freecodecamp.org/news/check-out-these-useful-ecmascript-2015-es6-tips-and-tricks-6db105590377/">Check out these useful ECMAScript 2015 (ES6) tips and tricks</a></em></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/5-javascript-bad-parts-that-are-fixed-in-es6-c7c45d44fd81#.7e2s6cghy"><em>5 JavaScript “Bad” Parts That Are Fixed In ES6</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/is-class-in-es6-the-new-bad-part-6c4e6fe1ee65#.4hqgpj2uv"><em>Is “Class” In ES6 The New “Bad” Part?</em></a></li>
</ol>
<h4 id="heading-terminal-improvements">Terminal Improvements</h4>
<ol>
<li><em><a target="_blank" href="https://www.freecodecamp.org/news/jazz-up-your-bash-terminal-a-step-by-step-guide-with-pictures-80267554cb22/">How to Jazz Up Your Terminal — A Step By Step Guide With Pictures</a></em></li>
<li><em><a target="_blank" href="https://www.freecodecamp.org/news/jazz-up-your-zsh-terminal-in-seven-steps-a-visual-guide-e81a8fd59a38/">Jazz Up Your “ZSH” Terminal In Seven Steps — A Visual Guide</a></em></li>
</ol>
<h4 id="heading-www">WWW</h4>
<ol>
<li><em><a target="_blank" href="https://www.freecodecamp.org/news/a-fascinating-and-messy-history-of-the-web-and-javascript-video-8978dc7bda75/">A Fascinating And Messy History Of The Web And JavaScript</a></em></li>
</ol>
<h4 id="heading-virtual-dom">Virtual DOM</h4>
<ol>
<li><a target="_blank" href="https://medium.com/@rajaraodv/the-inner-workings-of-virtual-dom-666ee7ad47cf"><em>Inner Workings Of The Virtual DOM</em></a></li>
</ol>
<h4 id="heading-react-performance">React Performance</h4>
<ol>
<li><a target="_blank" href="https://medium.com/@rajaraodv/two-quick-ways-to-reduce-react-apps-size-in-production-82226605771a#.6lepbl7ae"><em>Two Quick Ways To Reduce React App’s Size In Production</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/using-preact-instead-of-react-70f40f53107c#.7fzp0lyo3"><em>Using Preact Instead Of React</em></a></li>
</ol>
<h4 id="heading-functional-programming">Functional Programming</h4>
<ol>
<li><a target="_blank" href="https://medium.com/@rajaraodv/javascript-is-turing-complete-explained-41a34287d263#.6t0b2w66p"><em>JavaScript Is Turing Complete — Explained</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/functional-programming-in-js-with-practical-examples-part-1-87c2b0dbc276#.fbgrmoa7g"><em>Functional Programming In JS — With Practical Examples (Part 1)</em></a></li>
<li><em><a target="_blank" href="https://www.freecodecamp.org/news/functional-programming-in-js-with-practical-examples-part-2-429d2e8ccc9e/">Functional Programming In JS — With Practical Examples (Part 2)</a></em></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/why-redux-needs-reducers-to-be-pure-functions-d438c58ae468#.bntrywxrf"><em>Why Redux Need Reducers To Be “Pure Functions”</em></a></li>
</ol>
<h4 id="heading-webpack">WebPack</h4>
<ol>
<li><a target="_blank" href="https://medium.com/@rajaraodv/webpack-the-confusing-parts-58712f8fcad9#.6ot6deo2b"><em>Webpack — The Confusing Parts</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/webpack-hot-module-replacement-hmr-e756a726a07#.y667mx4lg"><em>Webpack &amp; Hot Module Replacement [HMR]</em></a> <em>(under-the-hood)</em></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/webpacks-hmr-react-hot-loader-the-missing-manual-232336dc0d96#.fbb1e7ehl"><em>Webpack’s HMR And React-Hot-Loader — The Missing Manual</em></a></li>
</ol>
<h4 id="heading-draftjs">Draft.js</h4>
<ol>
<li><a target="_blank" href="https://medium.com/@rajaraodv/why-draft-js-and-why-you-should-contribute-460c4a69e6c8#.jp1tsvsqc"><em>Why Draft.js And Why You Should Contribute</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/how-draft-js-represents-rich-text-data-eeabb5f25cf2#.hh0ue85lo"><em>How Draft.js Represents Rich Text Data</em></a></li>
</ol>
<h4 id="heading-react-and-redux">React And Redux :</h4>
<ol>
<li><a target="_blank" href="https://medium.com/@rajaraodv/step-by-step-guide-to-building-react-redux-apps-using-mocks-48ca0f47f9a#.s7zsgq3u1"><em>Step by Step Guide To Building React Redux Apps</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/a-guide-for-building-a-react-redux-crud-app-7fe0b8943d0f#.g99gruhdz"><em>A Guide For Building A React Redux CRUD App</em></a> <em>(3-page app)</em></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/using-middlewares-in-react-redux-apps-f7c9652610c6#.oentrjqpj"><em>Using Middlewares In React Redux Apps</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/adding-a-robust-form-validation-to-react-redux-apps-616ca240c124#.jq013tkr1"><em>Adding A Robust Form Validation To React Redux Apps</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/securing-react-redux-apps-with-jwt-tokens-fcfe81356ea0#.xci6o9s6w"><em>Securing React Redux Apps With JWT Tokens</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/handling-transactional-emails-in-react-redux-apps-8b1134748f76#.a24nenmnt"><em>Handling Transactional Emails In React Redux Apps</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/the-anatomy-of-a-react-redux-app-759282368c5a#.7wwjs8eqo"><em>The Anatomy Of A React Redux App</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/why-redux-needs-reducers-to-be-pure-functions-d438c58ae468#.bntrywxrf"><em>Why Redux Need Reducers To Be “Pure Functions”</em></a></li>
<li><a target="_blank" href="https://medium.com/@rajaraodv/two-quick-ways-to-reduce-react-apps-size-in-production-82226605771a#.6lepbl7ae"><em>Two Quick Ways To Reduce React App’s Size In Production</em></a></li>
</ol>
<h4 id="heading-if-this-was-useful-please-click-the-clap-button-below-a-few-times-to-show-your-support">If this was useful, please click the clap ? button below a few times to show your support! ⬇⬇⬇ ??</h4>
<p>If you have questions, please feel free to ask me on Twitter: <a target="_blank" href="https://twitter.com/rajaraodv">https://twitter.com/rajaraodv</a></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
