Tools to achieve a 10x developer workflow on Windows
Tags: productivity, workflow, windows
Published: 2023-11-08 01:17:17

This article is based off of my [.dotfiles repo](https://github.com/andresestrella/.dotfiles) and makes references to files inside of it. To go to linked notes read the article on [my site](https://andresestrella.tech/brain/writings/10x-developer-workflow-on-windows/)

# Overview
If you plan on being a software developer or similar job for a long time, chances are you will spend a lot of your life using a computer. So why not learn to use a computer as efficiently as possible and hopefully get more done in less time.

On most tasks, using a mouse is slower than if you were to use a keyboard shortcut. First, you have to move your hand off the keyboard onto your mouse and then move around and click the UI to complete your task. 

By going mouseless, you subscribe to the idea that the effort of learning a bunch of shortcuts and configuring your system (which could take a lot of time depending on how deep you get into it) is worth it for the small amount of time you save every time you use a shortcut, and that this small amount of time turns into a significant amount in the span of years. In my non-scientific personal experience, I would say pressing a shortcut saves me about ~2 seconds on average.

Going mouseless also makes writing code more fun. At first, it makes coding feel like a puzzle game where you are trying to find the quickest way to write and edit your code and once the shortcuts are in your muscle memory, you'll be using your computer at speeds you could have never imagined, and you'll feel like a [wizard](https://www.youtube.com/shorts/cOgw1qFuJAA). Which leads to the last reason and truly the end goal: 

Makes you superior to others.
![r/vim - WHAT GIVES PEOPLE FEELINGS OF POWER MONEY STATUS USING VIM|400](https://preview.redd.it/sqipd5d2jc461.png?width=960&crop=smart&auto=webp&s=bb4c0d55da5f62003c589aed724d4cc70f491a33)

## Why Windows?
If you go deeper into developer experience, you would know that the best place to be is Linux, so why do I stay over at Windows? 

The reason for me is native support for productive software (mainly Ableton) and games (although I don't play as much nowadays). I know I could dual boot operating systems or run compatibility layers like wine. But I haven't gone through the trouble of researching how to set everything up, and I have a good enough computer to not care about all the resources Windows hogs up. 

# Setting up
**First**, clone my [dotfiles repo](https://github.com/andresestrella/.dotfiles). I recommend cloning it in `~/.dotfiles`, but you can place it wherever.

**Second**, install all the packages and programming languages.
For this I use [WingetUI](https://github.com/marticliment/WingetUI), an amazing GUI for finding and managing packages from all sorts of windows package managers. 
Edit `WingetUI-Packages.json` by deleting the packages you don't want, then import the file into WingetUI and install the packages. 

> [!TIP]
> Read why you should use a package managers [[Package managers|here]]

**Third**, run the `powershell_installs.ps1` script that installs a couple of PowerShell modules that enhance the experience of using the command line. 

**Finally**, run the `setup_configs.ps1` script that removes the configs found in the default config directories of all the tools and replaces them with a hyperlink to the configs found in this repo. 

The idea is that you have all your configs in a centralized repo where you can edit them in one place. I shouldn't mention that you should back things up if you have configs of your own in those directories before running this. Make sure to read the script and see what it does.

That's it! Let's talk about all the tools and other files inside the repo.

# Tools 
## PowerShell
`Microsoft.PowerShell_profile.ps1` is the config file for PowerShell and does the following:
- Initializes [oh-my-posh](https://ohmyposh.dev/) and sets a prompt theme
- Imports the terminal icons module
- imports [Z location](https://github.com/vors/ZLocation): for accessing your most used directories fast
- sets up [PSReadLine](https://github.com/PowerShell/PSReadLine): command autocompletion and many other features.
- Sets up [PSFzf](https://github.com/kelleyma49/PSFzf): PowerShell wrapper for fzf, for fuzzy finding files and directories
- sets up keybindings
- maps bash command names to PowerShell equivalents. For example, it maps the `which` bash command keyword to `Get-Command $name | Select-Object -ExpandProperty Definition`
This last one a work in progress and I still need to look up if there are any projects that do this already.

If you find PowerShell startup gets slower than you would like, I would recommend commenting out or uninstalling oh-my-posh and terminal icons.

The terminal emulator I use is [Windows Terminal](https://github.com/microsoft/terminal)

## Window Manager
If you aren't familiar with tiling window managers like i3 from the Linux world, they basically organize your screen into non-overlapping frames, instead of letting windows float and stack on top of each other like we have grown accustomed to.

With floating windows, when you have a lot of programs open things can get messy quickly and Alt+Tabbing through them gets tedious. Tiling window managers take all the inconvenience away. And of course, everything is controlled with keybindings. A tiling window manager is an essential part of the puzzle for getting rid of your mouse.

The two biggest tiling window manager projects for Windows are [komorebi](https://github.com/LGUG2Z/komorebi) and [GlazeWM](https://github.com/glazerdesktop/GlazeWM). Komorebi is probably faster and more resource efficient since it is written in Rust, but I stick with Glaze for now since it has a cool status bar built in I like.

![demo](https://github.com/glazerdesktop/GlazeWM/assets/34844898/58167ca8-3064-4c5f-a82e-51bd3cd8830b)

<p align="center"><i>Showcase from the  <a href="https://github.com/glazerdesktop/GlazeWM">GlazeWM</a> docs</i></p>

### Running window manager at startup
These window managers don't have a setting you can turn on to run at startup, so to archive that I did the following:

Open task scheduler -> create task -> set settings -> press OK

For the settings, you'll want to set: 
- name 
- `run whether user is logged on or not` and `run with highest privileges` is probably a good idea to enable.
- Configure for: Windows 10 
- for triggers add one AT LOG ON (at startup trigger won't work)
- add a new action to `start a program`. You'll have to find the executable in your system.
- In Conditions, disable `start the task only if the computer is on AC power`.
- In Settings disable `stop the task if it runs longer than _`

## Browser 
For the browser, install a vim keybindings extension like VimiumFF, Vimiumc, Tridactyl  or SurfingKeys. They should all work fine. This is one of the easiest thing to add to your workflow out of everything in this article and the one you will feel the benefits of the fastest. See a [demo](https://www.youtube.com/watch?v=HKyUQZBZRK8)

You can check out what other [[browser extensions]] I recommend for Firefox, most of them are available on Chrome as well.

## Power Toys
This is a cool collection of software Microsoft has released for free. The features I use the most are:

- Quick accents: convenient shortcut for accenting letters (no more Alt + 3-digit number you have to remember)
- Text extractor: lets you select a portion of your screen and extract the text on it. I use this for grabbing text off off images, and I might or might not have used this feature on an online testing platform that doesn't let you select and copy text.
- File locksmith: for the times you try to delete a file and windows won't let you because a process is using that file. This lets you find and kill the processes easily.
- Keyboard manager: for remapping keys and shortcuts. I make shortcuts for controlling the volume, closing windows, opening certain apps and remapping the arrow keys to something where I don't have to leave the home row.

## Flow launcher and Everything search
The Spotlight feature in macOS is great; you can find any file and folder in your system, launch apps and the design is clean.

In contrast, ever tried searching for a file at the root of your C:/ drive in Windows File Explorer and had to wait 5 minutes for the results? yeah, me too... I found out there are ways to make the search much faster after some minor configuring, but still I find that the experience isn't the best. So I use [Everything](https://www.voidtools.com/), which indexes your file system once, and then you can instantly find any file/directory in your system. It also has advanced searching features like filters and regex patterns. You might want to take a little time in setting a list of directories to ignore because it searches through your entire file system.

After you install Everything, you might find that having to launch the app every time you want to search for something quickly is a bit inconvenient. To get the same experience as Spotlight I use [Flow Launcher](https://www.flowlauncher.com/) which has Everything support built in and has a lot of community plugins that let you do things like launching steam games, searching and playing songs on Spotify, searching obsidian notes, asking ChatGPT something and many more.

One of my favorite features is when searching for a file/directory and pressing `Shift+Enter` very useful options show up. See the [FlowLauncher homepage](https://www.flowlauncher.com/) to see demos.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w2aeujp8lhf3n034rpov.png)



Power Toys also has a very similar launcher that has many features, but I stick with Flow because of the community plugins I mentioned before.

## Neovim
`nvim\` is my personal Neovim config folder.  

Neovim has been the most important program for improving my productivity when writing code. My config is highly personalized, and going through all the features would require me to write a whole separate guide. 

I would suggest to start getting into vim by first trying out popular vim keybinding plugins available on your favorite code editor and get used to those first.  Then, if you want to dive deeper into the power of Neovim, try out popular configs like [LazyVim](https://www.lazyvim.org/), [LunarVim](https://www.lunarvim.org/), [NvChad](https://nvchad.com/)... Taking Neovim from a mere text editor to a full-featured IDE with features like intellisense, debugging, testing, etc... on your own takes quite a lot of work and configuration.  

However, I don't regret having configured Neovim on my own. For one, all the keybindings (which there are MANY to learn) have stuck in my brain fairly quickly since I was the one setting each one of them. And second, it has given me a deep confidence and understanding of dev tooling.  

Before taking on the task of having a Neovim config I am happy with, some features inside editors/IDEs (and even of tooling outside of that like linters, formatters, language servers and debuggers) felt mysterious to me, or I had no knowledge of. After, I am confident and feel like I know every nook and cranny inside a code editor and have gained massive knowledge about how dev tooling works.  

Having said all this, for most people the tradeoff frankly isn't worth it and an editor like VS Code is more than good enough. If you take anything out of this section is at least learn and use vim keybindings, you won't regret it. 

## Note taking
Note taking has been a huge part of my productivity. I organize a big part of my life with notes: thoughts, projects, to-do lists, books I read, courses and tutorials I watch, information about people... pretty much anything I wouldn't want to forget.

For note-taking I use Obsidian with vim keybindings. Obsidian is great because it has so many features and plugins that extend its functionality to anything you can imagine. 

Very importantly, your notes will stand the test of time since your notes are stored in simple Markdown format. You can store and host the files yourself or host in any cloud storage provider. You don't have to rely on a company to host your very important notes that are in a weird format that make it hard to migrate to other note-taking apps in the future. Also, I can access my notes on my phone by syncing them and using the Obsidian mobile app. 

For more information on building a personal knowledge base that allows you to quickly find information, do research on "building a second brain" and "Zettlekasten" or similar note-taking methods.

# Miscellaneous
`change_background.bat` is a script that changes the desktop background to a randomly chosen image from a specified directory. 

Checkout my [[Shortcuts MOC|keybindings]]. You can copy them or use them as inspiration for your own keybindings.

See a list of more dev tools that can improve your workflow [[Dev Tools list|here]]