# The Tools I Use

Published on the

Every developer has their favourite tools. In this post, I will talk about mine. I use a 13-inch MacBook Pro as my primary machine, running macOS High Sierra. Appearence-wise, I have dark mode enabled and my desktop background is from DeviantArt. I also use the computers in Imperial’s Computing Lab, which run Ubuntu, with the Gnome desktop environment.

## Terminal

On my Mac, I use the terminal emulator iTerm2 and on lab machines I use the default Gnome terminal. Both are configured with the solarised dark colour scheme and the font Menlo.

On my Mac I use the shell fish, in conjuction with oh-my-fish. The best thing about fish is autosuggestions. In the past, I would often misspell command names or file names. As the name autosuggestions implies, fish will look at your command history, the available commands and the files accessible to suggest commands. To add to that, fish also has syntax highlighting. So commands that can’t be found or files that don’t exist are highlighted red.

The main disadvantage to fish is a lack of compatibility with bash, the most commonly used shell. For instance, using !node to run the last command beginning with node doesn’t work. But this is a relatively minor thing. And if I ever do need bash, I can just type in bash to open it. oh-my-fish comes with a bunch of themes built-in and I use the agnoster theme, which looks great with the solarised dark colour scheme.

## Vim

Vim is my go-to text editor. The reason for this is I like its concept of modal editing. Since as a programmer I spend a lot of time navigating code, not just inserting text, it makes a lot of sense to me. I also like Vim because vim or vi is installed on almost any (non-Windows) system, and this is very convenient when all you have is a command-line interface, e.g. when you’re sshing into a remote system. I use Plug as my Vim plugin manager. I’ve tried alternatives, but those require you to clone repositories for plugins manually. This sounds simple, but since I have a master “dotfiles” repository containing my Vim configuration, this would mean I have to use git submodules.

I use vim-colors-solarized, to match iTerm’s colour scheme. In addition, I use lightline, which gives me a bar at the moment, telling me useful information, such as which mode I’m in and the filename. If I want to edit multiple files, I will typically use Vim’s buffer feature. This lets you open files with :e filename, and go through them with :bp and :bn. Usually, I will have at most two buffers open at any one time. Vim calls the buffer that was open before the buffer currently open, the alternate buffer, and lets you easily switch to that buffer with Ctrl-6. This means if I only have two files open, switching between them is incredibly easy.

I also have vim-commentary installed. This allows me to easily comment sections of code, with gc + <MOTION>, e.g. gc5\$ for the next five lines. It has support for many languages. To provide autocompletion for C, I use YouCompleteMe. This is a bit of effort to setup, but during my C group project, I found that it was well worth the effort.

## SSH

I often have to remotely access the machines in Imperial’s computing labs. The labs have shell machines, specifically designed for remote access. But these aren’t suited for resource-intensive processes, so they also provide direct access to desktop computers. To access the shell machines, I have a ~/.ssh/config file, so I can type in ssh doc, rather than ssh shell1.doc.ic.ac.uk. In addition I use wildcard rules, so I can avoid doing this with individual machines, e.g. ssh point46 rather than ssh point46.doc.ic.ac.uk. These rules also specify my username and, of course, I use an SSH key so I never have to type in my password.

I find tmux works great combined with ssh. It provides you with tabs and panes, as well as session management. I typically have two panes open, one with vim and another where I can test out whatever I’m working on. Session management means you can “detach” from a tmux session, without the processes that are running inside halting. In other words, they are still running in the background. This means I can reattach to the same session, and everything will be exactly as I left it. This is useful if I am working on machine point46 during the daytime at labs, and I want to continue where I left on, when I ssh from my bedroom.

## Other Editors

For Haskell and C, I use Vim in the terminal, but for Java I use Intellij IDEA which has an excellent plugin that provides Vim keybindings. I think Java’s such a verbose language, it would be impossible to manage without an IDE. Previously, I used Eclipse, but I prefer Intellij. Intellij does so many little things like creating getter and setter methods for you, I can’t imagine not using it. It also has great support for Git, and an integrated terminal. It is possible to get YouCompleteMe working with Java so using Vim to code Java becomes bearable, but I think that I’d still prefer Intellij, especially with such great support for Vim keybindings.

I also use Visual Studio Code ocassionally. Usually, I do this when working on web projects and editing Markdown files. Much like Intellij, it has an integrated terminal and support for Git. The support for Git isn’t as great as what’s in Intellij, but it’s still pretty good. I’ve tried the plugin for providing Vim keybindings, but unfortunately I didn’t find it good enough to use. Hopefully that will change in the future.

## Notes

I write all my notes for my degree in LaTeX and to do that I use the editor Texpad. It costs about £20, but in my opinion it is well worth it. Many people think LaTeX is too difficult to write notes in, but for me it’s just a case of knowing the commands. I usually find myself using the same commands over and over again, so now that I’ve got them memorised, I can write notes very quickly. I store my notes in a Git repository, which I push to a private GitHub repository for safe keeping.

## Mac Applications

Here are a list of Mac apps, I use:

• Slack and Telegram for communicating.
• Spotify for music.
I use the Mac package manager brew to install commmand line tools, and an extension to brew, called brew cask, for installing GUI apps.