How to configure oh-my-zsh on Windows
Published: 2021-07-03 14:40:49

There are 2 major ways to install [oh-my-zsh](https://ohmyz.sh/) in Windows: With WSL / without WSL.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p97wqn2eijigl6qtcfxq.png)

## Installation with WSL

> [WSL](https://docs.microsoft.com/en-us/windows/wsl/) (Windows Subsystem for Linux) is a Windows feature that lets developers run a GNU/Linux environment -- including most command-line tools, utilities, and applications -- directly on Windows, unmodified, without the overhead of a traditional virtual machine or dual-boot setup.

You can use the WSL2 which is faster than v1. After the installation - you can install [Ubuntu](https://ubuntu.com/) (a Linux distribution) from the [Windows app store](https://www.microsoft.com/en-us/p/ubuntu/9nblggh4msv6). Just follow the [official guide](https://docs.microsoft.com/en-us/windows/wsl/).

I tried it for a while. You get the benefit of full Linux distribution inside Windows. 
### Some things to notice

- You have 2 file systems. The subsystem files can be accessed differently via local network drive / command line. It's less convenient for me to get those files from the Linux system - instead of one single system. The paths are different.

- You use your windows apps and install some command line packages in the Linux side. Your code is stored in the Linux environment.
[VSCode](https://code.visualstudio.com/blogs/2019/09/03/wsl2) and [Webstorm](https://www.jetbrains.com/help/idea/how-to-use-wsl-development-environment-in-product.html) that are installed on your Windows can read/write your files from the Linux environment.

- Every package you want to access with your Linux system's command line - should be installed on the Linux system. So this make you install tools like git, Node.js, Yarn and global packages on the Linux side too. If you want to develop sometimes on windows and sometimes on Linux - you will get some duplications.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x6dfzsjnvotil41es94a.png)


## Why I don't use WSL2 anymore

I tried to use WSL2 for a while, but then I notice a major problem: my dev server did not notice file changes. Tools like nodemon, hot-module-replacement and fast refresh did not work. It turns out that there is a open issue:

{% github https://github.com/microsoft/WSL/issues/4739 %}

Some of those problems have workaround with polling instead of file watching. I try the polling approach with vite, but the experience was poor compared to vite regular fast refresh. This was **BLOCKER** issue for me so I removed WSL2.

## Installation without WSL2

### Install Cygwin

> Cygwin is a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows. 

This part of the post is based on [zinox9](https://dev.to/zinox9)'s excellent [post](https://dev.to/zinox9/installing-zsh-on-windows-37em)

- Download Cygwin from [it's website](https://cygwin.com/install.html) and run the installer.
- Make Sure to Let the installer install at `C:\cygwin64`
- For Download site Select Any URL , Click Add
- **STOP** at packages screen, search **wget** expand `All` under `Web` select latest version of it under `bin` of `wget` no need to select Source. Then Continue.
![Cygwin wget Screen](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5tsy6ykymjs1hs1zdvd6.png)
- Finish Installing and launch the Terminal.
We are going to use Cygwin to Install Some Packages that will help to use Linux System on Windows. We will install **apt-cyg** which will work like `apt-get` and also install many other packages too like [vim](https://www.vim.org/).
    - Run The following to download `apt-cyg` with `wget`. Note you can prompt to install `gdb`, `vim` or `dos2unix` if you want to use them or just remove them, you can install even more packages of your choice if you wish !
        ```
wget rawgit.com/transcode-open/apt-cyg/master/apt-cyg
install apt-cyg /bin
apt-cyg install zsh git gdb dos2unix openssh chere vim
```
   
- If you want your home folder to be your user's folder, you need to edit `cygwin64/etc/nsswitch.conf`. You can do this in the text editor you just downloaded, or type `explorer /etc` to open the root directory to edit the file. Add this line to the bottom: `db_home: windows`

### Setting Up oh-my-zsh
- Install oh-my-zsh from it's [website](https://ohmyz.sh/#install) or [github](https://github.com/ohmyzsh/ohmyzsh#basic-installation).
- Add plugins - 
I use 3 plugins for my dev environment:
  - git (from oh-my-zsh plugins)
  - [zsh-yarn-completions](https://github.com/chrisands/zsh-yarn-completions)
  - [zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)

So my ~/.zshrc file looks like `plugins=(git zsh-yarn-completions zsh-autosuggestions)`

I also add alias for open to the windows explorer
```
alias open=explorer.exe
```

### Integrate with terminals

#### Windows terminal

Edit your `settings.json` with the following profile:

```json
    "defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44ba}",
    "profiles": 
    {
        "defaults": {},
        "list": 
        [
            {
                "background": "#282C34",
                "commandline": "C:/cygwin64/bin/bash.exe /bin/xhere /bin/zsh",
                "cursorColor": "#FFFFFF",
                "foreground": "#DCDFE4",
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44ba}",
                "hidden": false,
                "name": "Work",
                "startingDirectory": "C://devl//work"
            },
      ]
  }
```

#### VSCode

In `settings.json` add the following settings:
```json
"terminal.integrated.shell.windows": "C:\\Cygwin64\\bin\\bash.exe",
  "terminal.integrated.shellArgs.windows": ["/bin/xhere", "/bin/zsh"],
```

#### Webstorm

Add `C:/cygwin64/bin/bash.exe /bin/xhere /bin/zsh` to Shell path setting
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zpe0arhy351k5htmtfi8.png)
 

## Conclusion

I highly recommend using oh-my-zsh in your dev environment for better auto-completions in your terminal. Because of file watching issue with WSL2, I use Cygwin to help with the zsh installation.
If you know some improvements to this setup - feel free to comment about.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wzvuw4kb9mfz3ldncdu.png)