4 min read

Terminal Workflow

Recently I have made several changes to my terminal workflow, and I feel that it would be useful to document them so that I may analyze any changes that occur in the future.

Windows Environment

I perform most of my activities within a windows environment. I use Cmder as my terminal interface. I have several utilities placed within the Bin folder, allowing access to them without cluttering my PATH. I have the Git for Windows version which gives access to what is essentially the CoreUtils package. My keyboard is equipped with 18 macro keys that can switch depending on the currently running application. I use the top 6 of these macro keys to switch to Putty terminal sessions, each connecting to a different server or user on a machine. For example, my G1 key will launch a Putty instance with the macVM session. Cmder allows for software such as Putty to be embedded within itself, leading to a fairly seamless transition between a local console and a remote console. Locally I will use the windows command line as a shell, as with the CoreUtils I don’t see the need to install another shell.

To edit sundry files, I will use VSCode, equipped with myriad extensions to help with autocompletion and other command utilities. I like VSCode’s ability to access the console from within it, as it allows for fast reloading and recompiling. For a more heavy-duty development environment, I will use Visual Studio 2019 equipped with JetBrains’s Resharper. Csharp is the language that I am most comfortable programming in, and the combination of VSCode and Visual Studio 2019 allow me to use it for smaller scripting needs as well.

Linux Development / Server Deployment

My Csharp affinity has continued with my Linux adventures. I will typically build an application as a Docker package on Windows and deploy this package onto a docker instance on a VPS. I use DigitalOcean for my VPS needs, as well as NameCheap for domain names.

For smaller applications I will use an extension within VSCode that allows me to connect to a remote SSH server and use it as a workspace folder. This allows me to use a development environment that I am familiar with. I prefer to use these Server deployments as minimally as possible, as the dotNetCore allows me to write code that will run in multiple environements.

I will typically host using an Ubuntu VPS, simply because it is the one autoselected by DigitalOcean on a new droplet spinup. I have no affinity with any linux distribution, this is simply the most convinient to create. As stated previously, because my applications will be run within a docker instance, it does not matter what platform I use to host it.

MacOS Environment

Recently I have had the need to develop within a MacOS environment. Originally I planned on using an old 2011 mac that was laying around for this purpose, however this device could not be upgraded to the latest version of OSX. Instead, I have turned that machine into an HTPC and have created a virtual machine on my computer to be used as a development environment. Surprisingly, this works extremely well. By allocating only four gigabytes of ram to the virtual machine, I am able to run many applications without any noticible lag-time at all. I will typically close the visualization of the virtual machine in VMWare and either SSH into the machine or VNC into the machine. For some reason, using VNC to connect to the machine has better apparent performance that simply using the built in display. When I connect with SSH I use the Fish shell. Although it is not POSIX compliant, I have found that it is quite comfortable to use.

For an editor I have begun using Neovim. When I am doing iOS or MacOS development, it is preferable to edit my files on the Mac machine itself rather than connecting. Because of this fact, and in consideration of the lag time involved, I decided that I needed to use a command line editor. I chose Neovim because it is feature-filled, without being overbearing like emacs. I use several language completion servers with Neovim to have autocomplete comparable to VSCode.