My Mac Desktop 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 My Fish Setup 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 My Vim Setup 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 Texpad 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. 1Password as my password manager. Anki for memorising French vocabulary. FreeMind for mindmapping. DaisyDisk for checking how much storage space I have left. Excel for keeping track of things, like TV shows I’ve watched. Color Picker for finding the hex code of random colours. Additionally, I use Time Machine to backup my files onto an external hard drive and Dropbox so I can access them across the cloud. I use the Mac package manager brew to install commmand line tools, and an extension to brew, called brew cask, for installing GUI apps. World Wide Web Pinboard in Firefox My primary web browser is Firefox. It used to be Chrome, but I find recent versions of Firefox are faster. To keep track of bookmarks, I use Pinboard. At first, I was skeptical about paying for a bookmarking service, but my bookmarks list had become an awful mess, so something had to be done. Pinboard helps me organise my bookmarks with tags. It also allows tags themselves to be grouped into what are called bundles. I pay for the archival version, so it archives all my bookmarks in case they ever go offline, and lets me do full-text search on them. I have bookmarklets in Firefox, so I can add anything interesting that I find to Pinboard. Since I do a lot of web development, I also keep Chrome and Safari installed, so I can check how webpages display in them.