Moving to Windows from Linux Pt2
Terminal (kitty-term -> Windows Terminal)
I’ve used many terminals, and kitty is by far my favorite. I like that it’s GPU rendered, can view images, and has splits and layouts. It even has a cool hints view that keeps me from reaching for the mouse.
On Windows, there’s not a ton of choice in this department. As far as I could tell there is alacritty, cmder, and Windows Terminal. From these, I picked to just use Windows Terminal because it worked the best for me. I also tried alacritty, but it was a bit hard to configure out of the box, and they are adamant about not implementing features that tmux would provide, but I’m not even sure tmux works on Windows.
Shell (fish shell -> powershell / fish on WSL2)
On Linux, I’ve been using the fish shell for many years now. I installed it because it was what was recommended when I was onboarding at Amazon and never looked back really. Unfortunately, on the other hand things are not so simple in the Windows world. When I can, I continue to use the fish shell on WSL2, but when working in Windows (because WSL2 is painfully slow on your NTFS file system), I use Powershell 1.
In order to make Powershell “livable,” I had to make quite a few adjustments. But most notably, I had to create a powershell profile using PSReadLine. There are a lot of features in there to help bring powershell to feature parity with a lot of Linux shells, but most vitally, if you’re used to fish, it allows you to get suggestions based on your command history. It’s a little bit less powerful than what you’re probably used to, but I’ve found shells without this to be completely unusable after having this for so many years.
In order to have history, you simply need to add this to your psprofile
Set-PSReadLineOption -PredictionSource History
I can’t emphasize this enough. If you only take one thing from this entire post, at least turn that on in powershell.
fasd -> zlocation
This is the application I use to navigate my file system. fasd keeps track of the “frecency” of your directories and files and provides aliases to use them conveniently in your shell. I mostly just use
z for navigation nowadays but I used to use the others quite a lot.
Now, you could continue using fasd with WSL or Msys, but I found that zlocation works basically just as well with powershell as I would ever need, so I’ve been just using that.
Bonus: How to install some irreplaceables that are not straightforward
I found a lot of guides on how to get emacs working on Windows, and a lot of people have certainly tried. After trying a lot of them for myself I found this way to be best: https://github.com/hubisan/emacs-wsl.
The tldr of that is to install Emacs on WSL2 and then use VcXsrv as your X server to have the display work on Windows. The main reason you need to do this is because Emacs functions by opening many small files, which is antithetical to how NTFS and Windows works on a pretty fundamental level. Windows is not designed to open many small files so the performance struggles significantly, making Emacs basically unusable. On my machine, my Doom Emacs setup takes ~30 seconds to open on NTFS and ~2 seconds to open on WSL2. So save yourself some time and don’t bother with trying to install the Windows version.
Bonus 2: Random tips I have for moving to Windows
I needed to normalize the path for my surfingkeys config so that it would work on Windows, Mac, and Linux at the same time. I found this repo: https://github.com/b0o/surfingkeys-conf, and decided to do it their way. Basically, they create a local server and host it on some random port. I used:
python -m http.server --bind 127.0.0.1 $PORT
to serve my settings. I was able to easily set up systemd to do this on Linux and launchd on Mac.
On Windows, I used Task Scheduler, but it was always opening a window. I searched quite a while for a decent solution, but the only thing that really worked for me was to use a hacky vbs script I found on Server Fault.
Ssh works on windows
This one I am not sure will be that useful, but you can actually use ssh on Windows. I found these instructions in the Microsoft documentation https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse. It can be a real pain to set this up on every server that you connect to though, since as far as I can tell, most connections in the windows world happen over RDP, so you have to first RDP and then set this up, but I found it to be easier to manage ssh windows than RDP windows for what it’s worth. One note on ssh though, is that it seems that passwordless login does not work with a Windows ssh server, but I only tried this superficially and would be happy to be proven wrong on that.
Unsolved: Space as the leader key for Visual Studio
After getting started using Doom Emacs, I’m basically addicted to using space as the leader key and having which-key available in my editor. AFAIK, this is impossible in Visual Studio. I’ve been just using VS code with https://vspacecode.github.io/ to actually edit code, and Visual Studio for the rest of the functionality I need. I think as I get better at figuring out what exactly Visual Studio does, I’ll be able to slowly phase it out completely.
Do let me know though, dear reader, if you know of a way to do this in Visual Studio.
Powershell is somehow also painfully slow compared to Linux shells but that’s another story. Sometimes Powershell is several times slower than Python. There’s nothing wrong with Python, but it’s not exactly known for its blazing fast speeds. ↩︎