<?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: gpynes</title>
    <description>The latest articles on DEV Community by gpynes (@gpynes).</description>
    <link>https://dev.to/gpynes</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%2F117855%2F1049d4a3-c533-438a-b5a1-5ae7776623d9.jpeg</url>
      <title>DEV Community: gpynes</title>
      <link>https://dev.to/gpynes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gpynes"/>
    <language>en</language>
    <item>
      <title>Configuring Your Shell Environment</title>
      <dc:creator>gpynes</dc:creator>
      <pubDate>Tue, 18 Oct 2022 16:39:31 +0000</pubDate>
      <link>https://dev.to/gpynes/configuring-your-shell-environment-4olf</link>
      <guid>https://dev.to/gpynes/configuring-your-shell-environment-4olf</guid>
      <description>&lt;h1&gt;
  
  
  My Shell Config
&lt;/h1&gt;

&lt;p&gt;For my shell config I use a combination of tools, namely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.zsh.org/"&gt;zsh&lt;/a&gt; :(as my shell)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki"&gt;oh-my-zsh&lt;/a&gt; :(as my framework for configuring my shell)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://starship.rs/"&gt;starship&lt;/a&gt; :(as my theme for my shell)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.iterm2.com/"&gt;iterm2&lt;/a&gt; :(as my terminal for interacting with my shell)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(optional extras)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Canop/broot#broot"&gt;broot&lt;/a&gt; :(as a plugin for navigating my fs like finder within my shell)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/junegunn/fzf#-"&gt;fzf&lt;/a&gt; :(a fuzzy search tool, think grep but interactive)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.atlassian.com/git/tutorials/dotfiles"&gt;cfg&lt;/a&gt; :(a special git setup for tracking changes to your config files)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sindresorhus/quick-look-plugins#quick-look-plugins-"&gt;quick-look-plugins&lt;/a&gt; :(these let you peek into files like .js or .json using mac's quicklook feature (spacebar))&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And some zsh plugins I use: (the more &lt;code&gt;*&lt;/code&gt; next to the name the higher I recommend it)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/blob/master/plugins/aws/README.md#aws"&gt;aws&lt;/a&gt;* :(sets up &lt;code&gt;awscli&lt;/code&gt; auto complete + adds super handy profile commands)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/djui/alias-tips#alias-tips"&gt;alias-tips&lt;/a&gt;** :(let's you know when you type the long form of an alias you have)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/wting/autojump#name"&gt;autojump&lt;/a&gt;* :(use j to jump to directories containing terms. Directories must be visited first before they can be jumped to.)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TamCore/autoupdate-oh-my-zsh-plugins#autoupdate-zsh-plugin"&gt;autoupdate&lt;/a&gt;* :(automatically updates custom plugins)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/blob/master/plugins/common-aliases/common-aliases.plugin.zsh"&gt;common-aliases&lt;/a&gt; :(add tons of aliases like &lt;code&gt;la&lt;/code&gt;, &lt;code&gt;ll&lt;/code&gt; etc)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git-auto-fetch"&gt;git-auto-fetch&lt;/a&gt;* :(automatically "fetches" for new changes of directory you're in)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git-extras"&gt;git-extras&lt;/a&gt; :(adds a bunch of helpful git aliases and extra commands)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/gitfast"&gt;gitfast&lt;/a&gt; :(adds git tab completion)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git-flow"&gt;git-flow&lt;/a&gt; :(adds completion for git flow commands)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/node"&gt;node&lt;/a&gt; :(adds completion for node)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/npm"&gt;npm&lt;/a&gt;* :(adds completion for npm)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/zsh-users/zsh-autosuggestions#zsh-autosuggestions"&gt;zsh-autosuggestions&lt;/a&gt;** :(adds suggestions as you type)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/zsh-interactive-cd"&gt;zsh-interactive-cd&lt;/a&gt;* :(cd + tab to fuzzy search navigate)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/zsh-reload"&gt;zsh_reload&lt;/a&gt;* :(adds &lt;code&gt;src&lt;/code&gt; command for better full compile reload)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A full list of &lt;code&gt;oh-my-zsh&lt;/code&gt; plugins can be found &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins"&gt;here&lt;/a&gt;&lt;br&gt;
Another handy list of plugins can be found &lt;a href="https://github.com/unixorn/awesome-zsh-plugins#plugins"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;There are a few steps to install all this, but nothing too crazy it should be less than 5min if you're on a decent internet connection.&lt;br&gt;
And once installed and setup, you'll be flying at the helm of your terminal provided with tools to help you get faster along the way (alla &lt;code&gt;alias-tips&lt;/code&gt; and &lt;code&gt;zsh-autosuggestions&lt;/code&gt;)&lt;/p&gt;
&lt;h3&gt;
  
  
  Install Oh My ZSH
&lt;/h3&gt;

&lt;p&gt;For getting started, let's install oh-my-zsh&lt;/p&gt;

&lt;p&gt;This script will install the &lt;code&gt;oh-my-zsh&lt;/code&gt; framework if it's not already installed&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;# Install On-My-Zsh&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.oh-my-zsh &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--unattended&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Oh-My-Zsh already installed."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everytime when you start a shell and see a big annoying warning about insecure directories, simply run this to fix it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;compaudit | xargs sudo chmod g-w&lt;/code&gt; (may require sudo, &lt;a href="https://github.com/zsh-users/zsh-completions/issues/433#issuecomment-815872839"&gt;see why here&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Install additional plugins
&lt;/h3&gt;

&lt;p&gt;By default &lt;code&gt;oh-my-zsh&lt;/code&gt; comes preloaded with a ton of built in plugins that you can load by adding them to your &lt;code&gt;~/.zshrc&lt;/code&gt; file. However some of my favorites aren't in that list.&lt;br&gt;
This section describes how to install extra plugins, namely &lt;code&gt;alias-tips autojump autoupdate autosuggestions&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In order to install an additional plugin for &lt;code&gt;zsh&lt;/code&gt; all you have to do is install the git repo of the plugin to your &lt;code&gt;$ZSH_CUSTOM/plugins&lt;/code&gt; directory, then add the folder name to your &lt;code&gt;plugins&lt;/code&gt; list in your &lt;code&gt;~/.zshrc&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;For convenience, I've created a script below that should install the ones I'm recommending.&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;# Set ZSH_CUSTOM if it's not already (used by our PLUGINS_PATH below)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="nv"&gt;$ZSH_CUSTOM&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.oh-my-zsh/custom"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Install additional plugins to this path&lt;/span&gt;
&lt;span class="nv"&gt;PLUGINS_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/plugins"&lt;/span&gt;

&lt;span class="c"&gt;# Define function for installing plugins for use below&lt;/span&gt;
&lt;span class="k"&gt;function &lt;/span&gt;install-plugin&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;plugin_repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
    &lt;span class="nv"&gt;plugin_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Downloading Plugin: &lt;/span&gt;&lt;span class="nv"&gt;$plugin_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Using: &lt;/span&gt;&lt;span class="nv"&gt;$plugin_repo&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"To: &lt;/span&gt;&lt;span class="nv"&gt;$PLUGINS_PATH&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$plugin_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"git clone &lt;/span&gt;&lt;span class="nv"&gt;$plugin_repo&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PLUGINS_PATH&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$plugin_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    git clone &lt;span class="nv"&gt;$plugin_repo&lt;/span&gt; &lt;span class="nv"&gt;$PLUGINS_PATH&lt;/span&gt;/&lt;span class="nv"&gt;$plugin_name&lt;/span&gt;
    &lt;span class="nv"&gt;plugin_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;plugin_list&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nv"&gt;$plugin_name&lt;/span&gt;&lt;span class="s2"&gt; "&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing Plugins..."&lt;/span&gt;
install-plugin https://github.com/djui/alias-tips alias-tips
install-plugin https://github.com/wting/autojump autojump
install-plugin https://github.com/TamCore/autoupdate-oh-my-zsh-plugins autoupdate
install-plugin https://github.com/zsh-users/zsh-autosuggestions autosuggestions

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Plugins Installed. Add them by copying th following into your ~/.zshrc
    plugins=( &lt;/span&gt;&lt;span class="nv"&gt;$plugin_list&lt;/span&gt;&lt;span class="s2"&gt; )
"&lt;/span&gt;

&lt;span class="c"&gt;# For auto jump we must install it using it's own script&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PLUGINS_PATH&lt;/span&gt;&lt;span class="s2"&gt;/autojump"&lt;/span&gt;
./install.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Okay this may be a bit much at first, so let's break it down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First we're setting up an env var called &lt;code&gt;ZSH_CUSTOM&lt;/code&gt; if it's not already set. We use this to determine where the plugins should be installed to. If you have a special location you want, you can use that, otherwise we'll expect it to be in the &lt;code&gt;.oh-my-zsh&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Then we set the &lt;code&gt;PLUGINS_PATH&lt;/code&gt; directory, which again just tells us where to install the plugins.&lt;/li&gt;
&lt;li&gt;Next we setup the &lt;code&gt;install-plugin&lt;/code&gt; function that just takes a git repo (&lt;code&gt;plugin_repo&lt;/code&gt;) and a name (&lt;code&gt;plugin_name&lt;/code&gt;), then downloads the plugin repo to our &lt;code&gt;PLUGINS_PATH&lt;/code&gt; location and names it &lt;code&gt;plugin_name&lt;/code&gt;. It outputs the plugins as an array you can copy paste into your &lt;code&gt;.zshrc&lt;/code&gt; later if needed (we don't).&lt;/li&gt;
&lt;li&gt;Then we actually install the plugins &lt;code&gt;alias-tips&lt;/code&gt;, &lt;code&gt;autojump&lt;/code&gt;, &lt;code&gt;autoupdate&lt;/code&gt; and &lt;code&gt;autosuggestions&lt;/code&gt;. These are all plugins that aren't shipped with the &lt;code&gt;oh-my-zsh&lt;/code&gt; framework but are freaking sweet!&lt;/li&gt;
&lt;li&gt;For our final step we &lt;code&gt;cd&lt;/code&gt; into the autojump repo and run it's special installer to finish off it's install. (I'm actually unsure if we need to be in it's directory when running, so let me know in the comments!)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that's it! The plugins are installed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install the Starship theme
&lt;/h3&gt;

&lt;p&gt;The starship theme is a super fast theme for &lt;code&gt;zsh&lt;/code&gt; that gives you handy color-coded context in your prompt based on your current user/dir.  It's written in rust, so it's secure and blazing fast for super quick start up times.&lt;/p&gt;

&lt;p&gt;Just run this line to install it:&lt;br&gt;
&lt;code&gt;curl -fsSL https://starship.rs/install.sh | bash&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I love this theme, because it's pre-configured out of the box with great defaults, but is also really easy to customize further.&lt;br&gt;
It does wonderful things like tell you if you have git changes, what version node, docker and ruby packages are. And if you use aws, gcp or azure it nows the context of your profiles/config, super handy when switching around a bunch.&lt;/p&gt;
&lt;h3&gt;
  
  
  Install additional tools
&lt;/h3&gt;

&lt;p&gt;These tools are super helpful and require &lt;code&gt;brew&lt;/code&gt; to install (there are other ways, but brew is the easiest)&lt;/p&gt;

&lt;p&gt;(note: you can combine the installs into one command for an all in one install)&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;# zsh-syntax-highlighting leaving for last in case brew isn't installed&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;zsh-syntax-highlighting

&lt;span class="c"&gt;# Super awesome dir navigation tool&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;broot

&lt;span class="c"&gt;# Super awesome fuzzy search tool/pipe&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;fzf

&lt;span class="c"&gt;# This font is needed by the starship theme to display ligatures/icons, but first we need to tell brew where to find it&lt;/span&gt;
brew tap homebrew/cask-fonts
brew cask &lt;span class="nb"&gt;install &lt;/span&gt;font-fira-code

&lt;span class="c"&gt;# ql are quicklook plugins on mac that allow you to quickly view .json, markdown and other files without having to open them&lt;/span&gt;
brew cask &lt;span class="nb"&gt;install &lt;/span&gt;qlcolorcode qlstephen qlmarkdown quicklook-json qlimagesize quicklookase qlvideo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you want it all in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;zsh-syntax-highlighting broot fzf &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew tap homebrew/cask-fonts &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew cask &lt;span class="nb"&gt;install &lt;/span&gt;font-fira-code qlcolorcode qlstephen qlmarkdown quicklook-json qlimagesize quicklookase qlvideo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I actually don't use &lt;code&gt;fzf&lt;/code&gt; or &lt;code&gt;broot&lt;/code&gt; nearly as often as I used to. &lt;code&gt;broot&lt;/code&gt; has primarily been replaced for me with &lt;code&gt;autojump&lt;/code&gt; + &lt;code&gt;zsh-interactive-cd&lt;/code&gt; and I only use &lt;code&gt;fzf&lt;/code&gt; when I'm searching through logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configue .zshrc
&lt;/h3&gt;

&lt;p&gt;Now that everything is installed, the only thing left to do is configure your &lt;code&gt;.zshrc&lt;/code&gt; file. Copy this and overwrite your &lt;code&gt;~/.zshrc&lt;/code&gt; file. (keep your aliases if you have any, I recommend create a &lt;code&gt;.zshrc.backup&lt;/code&gt; file for your old &lt;code&gt;.zshrc&lt;/code&gt; before copying, then bring over your aliases as needed.)&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;# If you come from bash you might have to change your $PATH.&lt;/span&gt;
&lt;span class="c"&gt;# export PATH=$HOME/bin:/usr/local/bin:$PATH&lt;/span&gt;

&lt;span class="c"&gt;# Path to your oh-my-zsh installation.&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ZSH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.oh-my-zsh"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.oh-my-zsh/custom"&lt;/span&gt;

&lt;span class="c"&gt;# Set name of the theme to load --- if set to "random", it will&lt;/span&gt;
&lt;span class="c"&gt;# load a random theme each time oh-my-zsh is loaded, in which case,&lt;/span&gt;
&lt;span class="c"&gt;# to know which specific one was loaded, run: echo $RANDOM_THEME&lt;/span&gt;
&lt;span class="c"&gt;# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes&lt;/span&gt;
&lt;span class="c"&gt;# ZSH_THEME="spaceship" # I'm using starhip (see below, where it's configured)&lt;/span&gt;

&lt;span class="c"&gt;# Set list of themes to pick from when loading at random&lt;/span&gt;
&lt;span class="c"&gt;# Setting this variable when ZSH_THEME=random will cause zsh to load&lt;/span&gt;
&lt;span class="c"&gt;# a theme from this variable instead of looking in ~/.oh-my-zsh/themes/&lt;/span&gt;
&lt;span class="c"&gt;# If set to an empty array, this variable will have no effect.&lt;/span&gt;
&lt;span class="c"&gt;# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to use case-sensitive completion.&lt;/span&gt;
&lt;span class="c"&gt;# CASE_SENSITIVE="true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to use hyphen-insensitive completion.&lt;/span&gt;
&lt;span class="c"&gt;# Case-sensitive completion must be off. _ and - will be interchangeable.&lt;/span&gt;
&lt;span class="nv"&gt;HYPHEN_INSENSITIVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to disable bi-weekly auto-update checks.&lt;/span&gt;
&lt;span class="c"&gt;# DISABLE_AUTO_UPDATE="true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to automatically update without prompting.&lt;/span&gt;
&lt;span class="c"&gt;# DISABLE_UPDATE_PROMPT="true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to change how often to auto-update (in days).&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;UPDATE_ZSH_DAYS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8

&lt;span class="c"&gt;# Uncomment the following line if pasting URLs and other text is messed up.&lt;/span&gt;
&lt;span class="c"&gt;# DISABLE_MAGIC_FUNCTIONS=true&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to disable colors in ls.&lt;/span&gt;
&lt;span class="c"&gt;# DISABLE_LS_COLORS="true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to disable auto-setting terminal title.&lt;/span&gt;
&lt;span class="c"&gt;# DISABLE_AUTO_TITLE="true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to enable command auto-correction.&lt;/span&gt;
&lt;span class="nv"&gt;ENABLE_CORRECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line to display red dots whilst waiting for completion.&lt;/span&gt;
&lt;span class="nv"&gt;COMPLETION_WAITING_DOTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line if you want to disable marking untracked files&lt;/span&gt;
&lt;span class="c"&gt;# under VCS as dirty. This makes repository status check for large repositories&lt;/span&gt;
&lt;span class="c"&gt;# much, much faster.&lt;/span&gt;
&lt;span class="c"&gt;# DISABLE_UNTRACKED_FILES_DIRTY="true"&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment the following line if you want to change the command execution time&lt;/span&gt;
&lt;span class="c"&gt;# stamp shown in the history command output.&lt;/span&gt;
&lt;span class="c"&gt;# You can set one of the optional three formats:&lt;/span&gt;
&lt;span class="c"&gt;# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"&lt;/span&gt;
&lt;span class="c"&gt;# or set a custom format using the strftime function format specifications,&lt;/span&gt;
&lt;span class="c"&gt;# see 'man strftime' for details.&lt;/span&gt;
&lt;span class="nv"&gt;HIST_STAMPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"mm/dd/yyyy"&lt;/span&gt;

&lt;span class="c"&gt;# Would you like to use another custom folder than $ZSH/custom?&lt;/span&gt;
&lt;span class="c"&gt;# ZSH_CUSTOM=/path/to/new-custom-folder&lt;/span&gt;

&lt;span class="c"&gt;# Which plugins would you like to load?&lt;/span&gt;
&lt;span class="c"&gt;# Standard plugins can be found in ~/.oh-my-zsh/plugins/*&lt;/span&gt;
&lt;span class="c"&gt;# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/&lt;/span&gt;
&lt;span class="c"&gt;# Example format: plugins=(rails git textmate ruby lighthouse)&lt;/span&gt;
&lt;span class="c"&gt;# Add wisely, as too many plugins slow down shell startup.&lt;/span&gt;
&lt;span class="nv"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
    aws &lt;span class="c"&gt;# sets up `awscli` tab completion + profile changing commands&lt;/span&gt;
    alias-tips &lt;span class="c"&gt;# let's you know when you have an alias you can use&lt;/span&gt;
    autojump &lt;span class="c"&gt;# use j to jump to directories containing terms. Directories must be visited first before they can be jumped to.&lt;/span&gt;
    autoupdate &lt;span class="c"&gt;# automatically updates custom plugins&lt;/span&gt;
    common-aliases &lt;span class="c"&gt;# add tons of aliases like la ll etc&lt;/span&gt;
    git-auto-fetch &lt;span class="c"&gt;# automatically "fetches" for new changes of directory you're in&lt;/span&gt;
    git-extras &lt;span class="c"&gt;# adds a bunch of helpful git aliases and extra commands&lt;/span&gt;
    gitfast &lt;span class="c"&gt;# adds git tab completion&lt;/span&gt;
    git-flow &lt;span class="c"&gt;# adds completion for git flow commands&lt;/span&gt;
    node &lt;span class="c"&gt;# adds completion for node&lt;/span&gt;
    npm &lt;span class="c"&gt;# adds completion/aliases for npm&lt;/span&gt;
    zsh-autosuggestions &lt;span class="c"&gt;# adds suggestions as you type&lt;/span&gt;
    zsh-interactive-cd &lt;span class="c"&gt;# cd + tab to fuzzy search navigate&lt;/span&gt;
    zsh_reload &lt;span class="c"&gt;# adds `src` command for better full compile reload&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Load Oh My ZSH&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nv"&gt;$ZSH&lt;/span&gt;/oh-my-zsh.sh

&lt;span class="c"&gt;# autojump config&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.autojump/etc/profile.d/autojump.sh &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.autojump/etc/profile.d/autojump.sh

autoload &lt;span class="nt"&gt;-U&lt;/span&gt; compinit &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; compinit &lt;span class="nt"&gt;-u&lt;/span&gt;

&lt;span class="c"&gt;# FZF config&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FZF_BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.fzf
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/sbin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.fzf.zsh &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; ~/.fzf.zsh

&lt;span class="c"&gt;# zsh-syntax-highlighting&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

&lt;span class="c"&gt;# broot&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.config/broot/launcher/bash/br


&lt;span class="c"&gt;# User configuration&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;MANPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/man:&lt;/span&gt;&lt;span class="nv"&gt;$MANPATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# You may need to manually set your language environment&lt;/span&gt;
&lt;span class="c"&gt;# export LANG=en_US.UTF-8&lt;/span&gt;

&lt;span class="c"&gt;# Preferred editor for local and remote sessions&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nv"&gt;$SSH_CONNECTION&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'code'&lt;/span&gt;
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'code'&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Compilation flags&lt;/span&gt;
&lt;span class="c"&gt;# export ARCHFLAGS="-arch x86_64"&lt;/span&gt;

&lt;span class="c"&gt;# Set personal aliases, overriding those provided by oh-my-zsh libs,&lt;/span&gt;
&lt;span class="c"&gt;# plugins, and themes. Aliases can be placed here, though oh-my-zsh&lt;/span&gt;
&lt;span class="c"&gt;# users are encouraged to define aliases within the ZSH_CUSTOM folder.&lt;/span&gt;
&lt;span class="c"&gt;# For a full list of active aliases, run `alias`.&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# Example aliases&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;zshconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"code ~/.zshrc"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ohmyzsh&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"code ~/.oh-my-zsh"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;reload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"source ~/.zshrc"&lt;/span&gt;

&lt;span class="c"&gt;# My Custom Aliases change &lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;please&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sudo !!"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"cd ~/Development/tmp"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;proj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"cd ~/Projects"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;work&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"cd ~/Work"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;co.&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"code ."&lt;/span&gt;

&lt;span class="c"&gt;### CFG  Setup&lt;/span&gt;
&lt;span class="c"&gt;# Alias for the main cfg git&lt;/span&gt;
&lt;span class="c"&gt;# alias cfg='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'&lt;/span&gt;
&lt;span class="c"&gt;# export function cfg {&lt;/span&gt;
&lt;span class="c"&gt;#    /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;


&lt;span class="c"&gt;# lastly init starship theme&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;starship init zsh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  (Optional) Setup iterm2
&lt;/h3&gt;

&lt;p&gt;Install iterm2 using brew or the link I provided above. &lt;/p&gt;

&lt;h4&gt;
  
  
  Setup Font For Starship
&lt;/h4&gt;

&lt;p&gt;Then go to &lt;code&gt;Preferences &amp;gt; Profiles &amp;gt; Text &amp;gt; Non-ASCII Font&lt;/code&gt; and select &lt;code&gt;Fira Code&lt;/code&gt; as your font, this will make iterm display special icons that are used by &lt;code&gt;starship&lt;/code&gt; theme. Also be sure to select the &lt;code&gt;use ligatures&lt;/code&gt; option for extra sweet &lt;code&gt;-&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setup Natural Text Editing
&lt;/h4&gt;

&lt;p&gt;Go to &lt;code&gt;Preferences &amp;gt; Profiles &amp;gt; Keys&lt;/code&gt; The select the &lt;code&gt;Presets...&lt;/code&gt; dropdown to bring up a list of presets. Select the &lt;code&gt;Natural Text Editing&lt;/code&gt; preset to add it to your profile.&lt;br&gt;
The &lt;code&gt;Natural Text Editing&lt;/code&gt; preset gives you a more natural navigation and editing experience in the terminal. You can use things &lt;code&gt;cmd+delete&lt;/code&gt; to delete a whole line, &lt;code&gt;option+&amp;lt;-&lt;/code&gt; to move one word over at a time. This is more akin to other text editing environments on your computer.&lt;/p&gt;

&lt;p&gt;See this &lt;a href="https://stackoverflow.com/a/22312856"&gt;SO&lt;/a&gt; for more info on it.&lt;/p&gt;

&lt;h3&gt;
  
  
  (Optional) Setup .cfg git directory
&lt;/h3&gt;

&lt;p&gt;I use a special git directory I named &lt;code&gt;.cfg&lt;/code&gt; to track and manage my config files. It's amazing for making changes/updates and being able to maintain those over time and across computers.&lt;/p&gt;

&lt;p&gt;I won't go into all the details, but only list out the steps to get it configure. Follow this &lt;a href="https://www.atlassian.com/git/tutorials/dotfiles"&gt;blog&lt;/a&gt; for the details.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup the repo in your root dir
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init &lt;span class="nt"&gt;--bare&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cfg
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'&lt;/span&gt;
cfg config &lt;span class="nt"&gt;--local&lt;/span&gt; status.showUntrackedFiles no
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"alias cfg='/usr/bin/git --git-dir=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.cfg/ --work-tree=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(if you copied my &lt;code&gt;.zshrc&lt;/code&gt; you don't need the last line, just uncomment the &lt;code&gt;cfg&lt;/code&gt; aliases at the bottom, reload your zsh and you're good to go)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test it out by adding a few files to track
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cfg status
cfg add .zshrc
cfg commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add inital .zshrc config"&lt;/span&gt;
cfg add .bashrc
cfg commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add bashrc"&lt;/span&gt;
cfg remote add origin &amp;lt;insert repo url here&amp;gt;
cfg push origin master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The End!
&lt;/h2&gt;

&lt;p&gt;And that's it! That's how to configure a super awesome, fast and powerful shell in less than 15min!&lt;/p&gt;

&lt;p&gt;Get started by playing around with these commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;$ br&lt;/code&gt; &amp;gt; opens &lt;code&gt;broot&lt;/code&gt; so you can navigate directories and run commands in them quickly without all the &lt;code&gt;cd + ls&lt;/code&gt; looping mess&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;$ fzf&lt;/code&gt; &amp;gt; will immediately start searching your filesystem, with an interactive search, so you can type characters and it will search for you. This even works with &lt;code&gt;|&lt;/code&gt; so you can interactively search &lt;code&gt;logs&lt;/code&gt;, &lt;code&gt;history&lt;/code&gt;, &lt;code&gt;files&lt;/code&gt; anything!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try typing out some common &lt;code&gt;git&lt;/code&gt; commands and get &lt;code&gt;alias-tips&lt;/code&gt; to suggest faster alternatives.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should also start seeing an auto suggest when you start typing familiar commands from your &lt;code&gt;history&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's a lot more, but hopefully this gets you running in the right direction to explore and feel powerful. Enjoy!&lt;/p&gt;

</description>
      <category>shell</category>
      <category>config</category>
      <category>setup</category>
    </item>
    <item>
      <title>Home Row Arrow Keys</title>
      <dc:creator>gpynes</dc:creator>
      <pubDate>Fri, 25 Oct 2019 23:44:50 +0000</pubDate>
      <link>https://dev.to/gpynes/home-row-arrow-keys-3a0e</link>
      <guid>https://dev.to/gpynes/home-row-arrow-keys-3a0e</guid>
      <description>&lt;h2&gt;
  
  
  What are home row arrow keys?
&lt;/h2&gt;

&lt;p&gt;Home row arrow keys are a way of remapping your keyboard to make navigating around your computer faster and more efficient. In this tutorial I will be remapping my &lt;code&gt;ijkl&lt;/code&gt; keys to become my arrow keys (up, left, down, right) when I hold a specific &lt;code&gt;modifier&lt;/code&gt; key. In this case &lt;code&gt;caps_lock&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is this a good thing?
&lt;/h2&gt;

&lt;p&gt;Have you ever noticed how you actually type and move your cursor around files currently? You probably even find yourself reaching for your mouse quite frequently. Look at it carefully, you'll see you do a lot of hand context switching, moving from typing to navigating around back and forth, back and forth. I'm not sure about you, but for me at least, this context switching would cause a lot of issues and misspellings if I misplaced my hand even slightly when switching between the two modes.&lt;/p&gt;

&lt;p&gt;To be honest, I never really thought of this as a major issue as it was just one of those things you had to deal with to use a computer. That is until an old coworker turned me onto &lt;em&gt;home row arrow keys&lt;/em&gt;. He was seriously a wizard! We would pair program and his speed and efficiency moving around files, slicing/pasting text and typing were blazing fast! It was incredible! Even outside of his &lt;code&gt;ide&lt;/code&gt; he was a ninja. Opening other programs, navigating around them, especially web browsing. I was astonished.&lt;/p&gt;

&lt;p&gt;He was using a nifty mechanical keyboard and I assumed it was that but when he explained to me how he remapped his &lt;code&gt;ijkl&lt;/code&gt; keys and that was how he was able to perform such fast actions I knew I had to try this out. He told me how to do it in a few easy steps and I've since refined it a bit but it's basically the exact same setup. Huge shout out to this wiz for changing my life and reducing the translation time from thought to computer action. You've saved me countless hours over the years, my dude!&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DISCLAIMER: this is only for mac at this time, if you know how to set it up for windows or linux let me know I'm very interested!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you just want a copy of json config file click &lt;a href="https://gist.github.com/gpynes/1ec21aa683980a8b8e3a14a4d6584feb" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Download and Install Karabiner-Elements
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/tekezo/Karabiner-Elements" rel="noopener noreferrer"&gt;Karabiner Elements&lt;/a&gt; is this amazing application that gives you a great and flexible way of remapping your keyboard layout. You can either build it from the source there or download the installer &lt;a href="https://pqrs.org/osx/karabiner/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once downloaded, go ahead and install it. You may need to give it some extra privileges depending on your configuration.&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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797555%2FHomeRow%2F1_Install_Step_One.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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797555%2FHomeRow%2F1_Install_Step_One.png" alt="Install Step One"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797555%2FHomeRow%2F2_Install_Step_Two.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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797555%2FHomeRow%2F2_Install_Step_Two.png" alt="Install Step Two"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup key remappings
&lt;/h2&gt;

&lt;p&gt;We'll start by setting up a new &lt;code&gt;profile&lt;/code&gt;. Open the app:&lt;br&gt;
&lt;code&gt;cmd+spacebar&lt;/code&gt; then type &lt;code&gt;karabiner-elements&lt;/code&gt; and go to the app's &lt;code&gt;preferences&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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797797%2FHomeRow%2F3_Opening_Karabiner_Elements.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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797797%2FHomeRow%2F3_Opening_Karabiner_Elements.png" alt="Opening Karabiner Elements"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;From the menu screen select the &lt;code&gt;profiles&lt;/code&gt; tab&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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797554%2FHomeRow%2F5_Navigating_To_Profile.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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797554%2FHomeRow%2F5_Navigating_To_Profile.png" alt="Profiles Tab Selected"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a new profile and name it whatever you want.&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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797549%2FHomeRow%2F4_Creating_New_Profile.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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797549%2FHomeRow%2F4_Creating_New_Profile.png" alt="Create Profile Name"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hit &lt;code&gt;enter&lt;/code&gt; to save the name and then toggle to the new &lt;code&gt;profile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Open your &lt;code&gt;~/.config/karabiner&lt;/code&gt; directory and you should now see a &lt;code&gt;karabiner.json&lt;/code&gt; file. We will need to open and edit this file. (If it's not there, you can simply create it and copy in my config above.)&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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797555%2FHomeRow%2F6_Open_Json.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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797555%2FHomeRow%2F6_Open_Json.png" alt="Finder displaying karabiner.json location"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking through the file you should see that it contains a &lt;code&gt;profile&lt;/code&gt; section with all the profile names listed in the profiles tab.&lt;/p&gt;
&lt;h2&gt;
  
  
  Break down
&lt;/h2&gt;

&lt;p&gt;Okay so this file may be a bit confusing at first but the key things here are the &lt;code&gt;complex_modifications&lt;/code&gt; and &lt;code&gt;simple_modifications&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can think of &lt;code&gt;simple_modifications&lt;/code&gt; as basic key remappings.&lt;br&gt;
ie. change key &lt;code&gt;a&lt;/code&gt; to act as key &lt;code&gt;b&lt;/code&gt; etc.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;complex_modifications&lt;/code&gt; are macros. Combinations of keypresses that together, will perform certain actions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Simple Modification
&lt;/h3&gt;

&lt;p&gt;Let's start with the &lt;code&gt;simple_modifications&lt;/code&gt; that we need to change since that's an easy way to get more comfortable.&lt;/p&gt;

&lt;p&gt;As you can see the &lt;code&gt;simple_modifications&lt;/code&gt; is an array so let's add a new item to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"simple_modifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"caps_lock"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"left_control"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All we're saying here is that we want Karabiner to overwrite the &lt;code&gt;caps_lock&lt;/code&gt; key (&lt;code&gt;"from"&lt;/code&gt;) on our keyboard with &lt;code&gt;left_control&lt;/code&gt; (&lt;code&gt;"to"&lt;/code&gt;). (As far as I know you have to specify the control orientation and can't just do &lt;code&gt;control&lt;/code&gt; for any kind of ctrl key.)&lt;/p&gt;

&lt;p&gt;Once the file is saved. Use the profile selector to swap between &lt;code&gt;Default&lt;/code&gt; and our new profile to refresh the changes. You should now see your &lt;code&gt;caps_lock&lt;/code&gt; key now acts as your &lt;code&gt;ctrl&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;Pretty &lt;code&gt;simple&lt;/code&gt; right?&lt;/p&gt;

&lt;h3&gt;
  
  
  Complex Modification
&lt;/h3&gt;

&lt;p&gt;Alright with that out of the way let's get to the good stuff.&lt;/p&gt;

&lt;p&gt;We're interested in the the &lt;code&gt;rules&lt;/code&gt; section of the &lt;code&gt;complex_modifications&lt;/code&gt;, we can ignore the &lt;code&gt;parameters&lt;/code&gt; section for now. (But I do recommend looking that over at some point).&lt;/p&gt;

&lt;p&gt;We are going to create a new rule, you can call it whatever you like but I named mine: &lt;code&gt;Change left_ctrl+jikl to arrow keys&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can copy and paste this into the &lt;code&gt;rules&lt;/code&gt; array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Change left_ctrl+jikl to arrow keys"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"manipulators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"j"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"modifiers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"mandatory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"left_control"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"left_arrow"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"basic"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"modifiers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"mandatory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"left_control"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"down_arrow"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"basic"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"i"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"modifiers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"mandatory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"left_control"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"up_arrow"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"basic"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"l"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"modifiers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"mandatory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"left_control"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"right_arrow"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"basic"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this rule all we're saying is that for each of the &lt;code&gt;jikl&lt;/code&gt; keys if they're pressed while &lt;code&gt;left_control&lt;/code&gt; is pressed, make that key act as the corresponding arrow key. The &lt;code&gt;optional&lt;/code&gt; parameter is necessary as it will map any additional modifiers to be allowed to be passed along to our combination as well. So things like &lt;code&gt;left_control + shift + j&lt;/code&gt; will now act like &lt;code&gt;shift + left_arrow&lt;/code&gt; etc.&lt;/p&gt;

&lt;p&gt;Refresh the profile again and since we just remapped our &lt;code&gt;caps_lock&lt;/code&gt; to be &lt;code&gt;left_control&lt;/code&gt; you should now be able to navigate around your computer using &lt;code&gt;caps_lock + jikl&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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797550%2FHomeRow%2F7_Switch_Profiles.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%2Fres.cloudinary.com%2Fdmpj0puyj%2Fimage%2Fupload%2Fv1566797550%2FHomeRow%2F7_Switch_Profiles.png" alt="Switch Profiles"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it's not working for you, you can copy and paste my settings into your &lt;code&gt;karabiner.json&lt;/code&gt; file from this &lt;a href="https://gist.github.com/gpynes/1ec21aa683980a8b8e3a14a4d6584feb" rel="noopener noreferrer"&gt;link&lt;/a&gt; and then refresh to see if it works.&lt;/p&gt;

&lt;h1&gt;
  
  
  The End!
&lt;/h1&gt;

&lt;p&gt;That's it! I hope you enjoyed this and that it helps speed up your workflow as much as it has mine. If you have any questions or comments for me feel free to leave them below.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;



&lt;h1&gt;
  
  
  Extra topics
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;ctrl&lt;/code&gt; and not &lt;code&gt;fn&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Okay you may be thinking, why set &lt;code&gt;caps_lock&lt;/code&gt; as &lt;code&gt;ctrl&lt;/code&gt; and not &lt;code&gt;fn&lt;/code&gt; or something more complex so it doesn't interfere with other key combos you rely on? That is a fair point and you're more than welcome to modify the json config to your liking. The reason I stick with &lt;code&gt;ctrl&lt;/code&gt; is because Unix based OS's come with some built in navigation shortcuts automatically that utilize the &lt;code&gt;ctrl&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;Some that I use all the time are &lt;code&gt;ctrl + a&lt;/code&gt; and &lt;code&gt;ctrl + e&lt;/code&gt; for navigating to the beginning and ending of a line easily. By swapping to &lt;code&gt;ctrl&lt;/code&gt; and not something else I keep cursor navigation consistent across my entire computer, regardless of the application I'm in. (Try going to your url bar in your browser and hitting &lt;code&gt;ctrl + shift + e&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Sortcut reference - &lt;a href="https://www.computerhope.com/ushort.htm" rel="noopener noreferrer"&gt;https://www.computerhope.com/ushort.htm&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Downsides to the switch
&lt;/h2&gt;

&lt;p&gt;There are some downsides to making this switch. I don't think they're big but they are worth noting:&lt;/p&gt;

&lt;h3&gt;
  
  
  Becoming reliant on setup
&lt;/h3&gt;

&lt;p&gt;By making this swap and becoming reliant on this setup I now find it hard to use other computers. Not terribly difficult, but I definitely start YELLING pretty quickly when I first start typing on someone else's computer. I then remember to use the real arrow keys and then it just feels uncomfortable to navigate around like someone has put weights on my thoughts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reliant on third party app
&lt;/h3&gt;

&lt;p&gt;When I first made the transition &lt;code&gt;Karabiner-Elements&lt;/code&gt; wasn't around and it's predecessor &lt;code&gt;Karabiner&lt;/code&gt; wasn't as easy to setup. It also didn't play as well with OSX and when I upgraded to Sierra it stopped working completely. This sucked and I got very scared I would have to go back to my old life of slow navigation. Thankfully elements was made with the intention of being long term, but it's still something to keep in mind that I am now dependent on this 3rd party application.&lt;/p&gt;

</description>
      <category>ijkl</category>
      <category>navigation</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Ionic stupid simple.</title>
      <dc:creator>gpynes</dc:creator>
      <pubDate>Tue, 18 Jun 2019 20:23:01 +0000</pubDate>
      <link>https://dev.to/gpynes/ionic-stupid-simple-51a7</link>
      <guid>https://dev.to/gpynes/ionic-stupid-simple-51a7</guid>
      <description>&lt;h1&gt;
  
  
  Before Getting Started
&lt;/h1&gt;

&lt;p&gt;This is a quick and simple way I've found to get up and running with a hybrid application that you can build natively on your device. It's in no way the 'best' way, but damn is it simple and fast to get started. I think the future for application development is looking very exciting with all the tools that have come out recently. Also! If you've got any other really nice cross-platform setups you like that I should check out leave a comment below so I can check em out!&lt;/p&gt;

&lt;h1&gt;
  
  
  Prerequisites + Disclaimer
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;br&gt;
I will be building this on a mac and for ios I am not familiar with windows and android so not sure how well this tutorial ports over to them. If differences occur when you're trying it out I'd love hear about it and learn more about systems I'm not as familiar with!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Things you need&lt;/strong&gt;&lt;br&gt;
This tutorial requires &lt;a href="//nodejs.org"&gt;node&lt;/a&gt; and &lt;a href="https://developer.apple.com/xcode/" rel="noopener noreferrer"&gt;xcode&lt;/a&gt; installed locally on your machine.&lt;/p&gt;
&lt;h1&gt;
  
  
  Getting Started!!
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Stackblitz
&lt;/h2&gt;

&lt;p&gt;One of my favorite new tech tools right now is &lt;a href="https://stackblitz.com" rel="noopener noreferrer"&gt;stackblitz&lt;/a&gt; it's a great tool for throwing together a quick poc or sharing bugs with others. It's highly configurable and comes with the most common development environments already setup. For this tutorial I searched on stackblitz for an already made &lt;a href="https://ionicframework.com/" rel="noopener noreferrer"&gt;ionic&lt;/a&gt; project that we can play with and use for this tutorial. Click this &lt;a href="https://stackblitz.com/edit/ionic-4-shadow-dom-clarification" rel="noopener noreferrer"&gt;link&lt;/a&gt; to open the project.&lt;/p&gt;

&lt;p&gt;It should look a bit like this:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felw653t21rkxwish4pgq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felw653t21rkxwish4pgq.png" alt="stack blitz project default setup" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Make some edits
&lt;/h2&gt;

&lt;p&gt;There wasn't any actual functionality on this project, so I wanted to add come click listeners.&lt;br&gt;&lt;br&gt;
Open the &lt;code&gt;src/app/home/home.page.html&lt;/code&gt; file and replace the &lt;code&gt;&amp;lt;ion-content&amp;gt;&lt;/code&gt; tag to look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ion-content&lt;/span&gt; &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ion-button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"host-element"&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"logClick('big span')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"host-child-element"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;span&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ion-button&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"logClick('button')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;BUTTON&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"logClick('litte span')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;span&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ion-content&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then in the &lt;code&gt;src/app/home/home.page.ts&lt;/code&gt; file add this log method inside the &lt;code&gt;HomePage&lt;/code&gt; class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;logClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clicked!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stackblitz should hot reload for you so you can just go click the buttons and see the log messages like so:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aps4r51tdv8uypm3aqn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aps4r51tdv8uypm3aqn.png" alt="stackblitz project with console open showing log messages" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Getting it on a device
&lt;/h1&gt;

&lt;p&gt;Okay so we're able to edit some code in a browser and see live results in the same page, dev life is pretty sweet! But how about getting it from the browser onto an actual phone? Well that's actually fairly easy as well.&lt;/p&gt;
&lt;h2&gt;
  
  
  Download the code.
&lt;/h2&gt;

&lt;p&gt;First things first download the code by clicking the download button in the top left of the stackblitz menu.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8xp69ptb3rkgtjagh63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8xp69ptb3rkgtjagh63.png" alt="stackblitz project highlighting download button" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Once downloaded, navigate to newly downloaded project and run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i&lt;/code&gt; to install all the dependencies&lt;br&gt;
&lt;code&gt;npm i -D cordova @ionic/ng-toolkit&lt;/code&gt; to install cordova and ionic's tools to the project for building.&lt;/p&gt;

&lt;p&gt;Now just run:&lt;br&gt;
&lt;code&gt;npx ionic cordova build ios&lt;/code&gt; to build to project for ios.&lt;/p&gt;

&lt;p&gt;If You get an error that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;chunk &lt;span class="o"&gt;{&lt;/span&gt;cordova&lt;span class="o"&gt;}&lt;/span&gt; cordova.js, cordova.js.map &lt;span class="o"&gt;(&lt;/span&gt;cordova&lt;span class="o"&gt;)&lt;/span&gt; 76.3 kB  &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;main&lt;span class="o"&gt;}&lt;/span&gt; main.js, main.js.map &lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt; 653 bytes &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;polyfills&lt;span class="o"&gt;}&lt;/span&gt; polyfills.js, polyfills.js.map &lt;span class="o"&gt;(&lt;/span&gt;polyfills&lt;span class="o"&gt;)&lt;/span&gt; 92.4 kB &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;runtime&lt;span class="o"&gt;}&lt;/span&gt; runtime.js, runtime.js.map &lt;span class="o"&gt;(&lt;/span&gt;runtime&lt;span class="o"&gt;)&lt;/span&gt; 6.08 kB &lt;span class="o"&gt;[&lt;/span&gt;entry] &lt;span class="o"&gt;[&lt;/span&gt;rendered]
chunk &lt;span class="o"&gt;{&lt;/span&gt;styles&lt;span class="o"&gt;}&lt;/span&gt; styles.js, styles.js.map &lt;span class="o"&gt;(&lt;/span&gt;styles&lt;span class="o"&gt;)&lt;/span&gt; 67.2 kB &lt;span class="o"&gt;[&lt;/span&gt;initial] &lt;span class="o"&gt;[&lt;/span&gt;rendered]

ERROR &lt;span class="k"&gt;in &lt;/span&gt;node_modules/@ionic/core/dist/types/components.d.ts&lt;span class="o"&gt;(&lt;/span&gt;5565,13&lt;span class="o"&gt;)&lt;/span&gt;: error TS2320: Interface &lt;span class="s1"&gt;'HTMLIonInputElement'&lt;/span&gt; cannot simultaneously extend types &lt;span class="s1"&gt;'IonInput'&lt;/span&gt; and &lt;span class="s1"&gt;'HTMLStencilElement'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  Named property &lt;span class="s1"&gt;'focus'&lt;/span&gt; of types &lt;span class="s1"&gt;'IonInput'&lt;/span&gt; and &lt;span class="s1"&gt;'HTMLStencilElement'&lt;/span&gt; are not identical.
node_modules/@ionic/core/dist/types/components.d.ts&lt;span class="o"&gt;(&lt;/span&gt;5811,13&lt;span class="o"&gt;)&lt;/span&gt;: error TS2320: Interface &lt;span class="s1"&gt;'HTMLIonSearchbarElement'&lt;/span&gt; cannot simultaneously extend types &lt;span class="s1"&gt;'IonSearchbar'&lt;/span&gt; and &lt;span class="s1"&gt;'HTMLStencilElement'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  Named property &lt;span class="s1"&gt;'focus'&lt;/span&gt; of types &lt;span class="s1"&gt;'IonSearchbar'&lt;/span&gt; and &lt;span class="s1"&gt;'HTMLStencilElement'&lt;/span&gt; are not identical.
node_modules/@ionic/core/dist/types/components.d.ts&lt;span class="o"&gt;(&lt;/span&gt;5907,13&lt;span class="o"&gt;)&lt;/span&gt;: error TS2320: Interface &lt;span class="s1"&gt;'HTMLIonTextareaElement'&lt;/span&gt; cannot simultaneously extend types &lt;span class="s1"&gt;'IonTextarea'&lt;/span&gt; and &lt;span class="s1"&gt;'HTMLStencilElement'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  Named property &lt;span class="s1"&gt;'focus'&lt;/span&gt; of types &lt;span class="s1"&gt;'IonTextarea'&lt;/span&gt; and &lt;span class="s1"&gt;'HTMLStencilElement'&lt;/span&gt; are not identical.
node_modules/@ionic/core/dist/types/utils/overlays-interface.d.ts&lt;span class="o"&gt;(&lt;/span&gt;37,52&lt;span class="o"&gt;)&lt;/span&gt;: error TS2344: Type &lt;span class="s1"&gt;'HTMLIonModalElement'&lt;/span&gt; does not satisfy the constraint &lt;span class="s1"&gt;'Required&amp;lt;ModalOptions&amp;lt;ComponentRef&amp;gt;&amp;gt;'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  Types of property &lt;span class="s1"&gt;'componentProps'&lt;/span&gt; are incompatible.
    Type &lt;span class="s1"&gt;'unknown'&lt;/span&gt; is not assignable to &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s1"&gt;'{ [key: string]: any; }'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
node_modules/@ionic/core/dist/types/utils/overlays-interface.d.ts&lt;span class="o"&gt;(&lt;/span&gt;37,248&lt;span class="o"&gt;)&lt;/span&gt;: error TS2344: Type &lt;span class="s1"&gt;'HTMLIonPopoverElement'&lt;/span&gt; does not satisfy the constraint &lt;span class="s1"&gt;'Required&amp;lt;PopoverOptions&amp;lt;ComponentRef&amp;gt;&amp;gt;'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  Types of property &lt;span class="s1"&gt;'componentProps'&lt;/span&gt; are incompatible.
    Type &lt;span class="s1"&gt;'unknown'&lt;/span&gt; is not assignable to &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s1"&gt;'{ [key: string]: any; }'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;ERROR] An error occurred &lt;span class="k"&gt;while &lt;/span&gt;running subprocess ng.

        ng run app:ionic-cordova-build &lt;span class="nt"&gt;--platform&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ios exited with &lt;span class="nb"&gt;exit &lt;/span&gt;code 1.

        Re-running this &lt;span class="nb"&gt;command &lt;/span&gt;with the &lt;span class="nt"&gt;--verbose&lt;/span&gt; flag may provide more information.
Computers-MacBook-Pro:ionic-4-shadow-dom-clarification &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt; computer&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Continue directly below, other wise skip ahead to here.&lt;/p&gt;

&lt;p&gt;Add &lt;code&gt;// @ts-ignode&lt;/code&gt; above each of these lines:&lt;br&gt;
&lt;code&gt;node_modules/@ionic/core/dist/types/component.d.ts:5565&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;node_modules/@ionic/core/dist/types/component.d.ts:5811&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;node_modules/@ionic/core/dist/types/component.d.ts:5907&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;node_modules/@ionic/core/dist/types/utils/overlays-interface.d.ts:37&lt;/code&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note that when you add each &lt;code&gt;// @ts-ignore&lt;/code&gt; it will add to the line count for each error below it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To look something like this:&lt;br&gt;
&lt;code&gt;component.d.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
 &lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
  &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;HTMLIonInputElement&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Components&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IonInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HTMLStencilElement&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
  &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;HTMLIonSearchbarElement&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Components&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IonSearchbar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HTMLStencilElement&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
  &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;HTMLIonTextareaElement&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Components&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IonTextarea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HTMLStencilElement&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;overlays-interface.d.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;HTMLOverlaysElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Conforms&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLIonModalElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ModalOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Conforms&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLIonToastElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ToastOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Conforms&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLIonActionSheetElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ActionSheetOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Conforms&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLIonAlertElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AlertOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Conforms&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLIonPopoverElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PopoverOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Conforms&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLIonPickerElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PickerOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Conforms&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLIonLoadingElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;LoadingOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With those type errors out of the way, run the build again:&lt;br&gt;
&lt;code&gt;npx ionic cordova build ios&lt;/code&gt;&lt;br&gt;
And you should be good to go.&lt;/p&gt;
&lt;h2&gt;
  
  
  Running it!
&lt;/h2&gt;

&lt;p&gt;Sweet! So the project has been installed and built now let's run it on the simulator. Open the project in xcode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open platforms/ios/MyApp.xcodeproj/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click the play button once the project is ready and you should see the app build and run on the ios simulator.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcza9p9l84ouub8wh1pe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcza9p9l84ouub8wh1pe.png" alt="xcode project with arrow pointing to run button" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you tap the buttons you should see the logs in the debug console inside xcode.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Done!!
&lt;/h1&gt;

&lt;p&gt;Well sort of. That wasn't very difficult or requirement-heavy application, but the idea behind developing an app with hot-reloading online and then building it natively on a device so easily gets me hyped! The feedback-time during development feels so much faster to me. I hope you enjoyed and learned something from this and if you have any questions or better yet suggestions on things I could learn or improve on leave it in the comments below. Happy coding!&lt;/p&gt;

</description>
      <category>ionic</category>
      <category>stackblitz</category>
    </item>
  </channel>
</rss>
