« Back to Blog

Using Command Line on Mac

By Ryan Veazey
Oct 27, 2017

Advice for new Mac Users (Part 2) - The Terminal

This is the second part in a series about configuring and using a Mac. Whereas the first post focused on more generally applicable advice, this one will focus more on the command-line environment.

Note: I will be using the same keyboard shortcut conventions I introduced in the previous blog, such as to mean the control (or ctrl) key.

Terminal

Configuration

While the Mac terminal is very good, its default settings profile is not. Go to settings (⌘,). Under the Select Pro for New window with profile and, under the Profiles tab, select Pro and click Default. From now on, new Terminal windows should use the Pro theme which has a more traditional light-on-dark theme with a slight translucency. All of these settings can be configured, but Pro is a much better place to start, as most command-line tools assume a similar theme.

Under Profiles/Window and Tab, you can configure titles to help you better identify them at a glance. Settings include values like working directory, process name, and profile name.

The Shell section has an option for When the shell exits: which I would suggest setting to Close if the shell exited cleanly. This generally means that if you caused the process to quit, the tab or window will simply disappear, but if some failure caused it to end, it will remain so you can diagnose the problem. The default behavior leaves all windows open. You can also specify a list of processes to ignore when deciding if it should warn you about closing an active terminal session.

The Advanced section includes configuration for the bell, which has a fair number of settings, and the terminal type (which should usually be set to xterm-256color).

If you find that your key presses are not sending what you’d expect to the terminal, check the Keyboard settings under the Profiles tab. The actual configuration you’ll need may depend on which shell and/or program you’re using, as well as configuration in your shell, but here you can “fix” issues like the Home and End keys not working as you’d expect. If you need to customize this, it’s probably best to do a web search for the specific function you’re trying to configure, as there are quite a few variations.

There is also a setting under General to open new tabs in the same directory as the current terminal, which I would suggest enabling.

Terminal Keyboard “Shortcuts”

The system-wide shortcuts (mentioned in the previous post) still work in the Terminal app, such as ⌃N for new window, ⌃Tab for new tab, and ⌃{ and ⌃} to switch left or right through open tabs.

The following aren’t Mac-specific, but good to know nonetheless. These assume a Bash shell, but many may work for other shells as well.

Config Files

Depending on your shell (and your login method), several files are sourced when you start a terminal session. These are used to configure all kinds of things about your session. If you’re using Bash (the default), you’ll probably want to be editing ~/.profile

My suggested additions to ~/.profile:

export EDITOR=vim
export CLICOLOR=1
export LSCOLORS=GxFxCxDxBxegedabagaced

This should set the default editor to Vim (if you absolutely don’t want to use Vim, you may want to change this, but I’d suggest learning). It also sets some variables which should give you nicely formatted output for ls so you can, for example, easily distinguish folders or executable files.

Shells

Bash

If you’re asking about a shell, you know bash. It’s ubiquitous, and it’s already the default shell. If you’re new to the command line, stick with this, as it’ll be the most commonly assumed environment when looking for help.

Zsh

Z shell (zsh) is a shell that is similar to Bash but with some additional features. Some very powerful customizations and themes can be added easily via Oh My Zsh. Some of these present very helpful prompts with all kinds of information about. For example, the prompt I use writes the current directory on the right side of the line, with some information about the git branch before the prompt on the left.

A list of plugins can be found here. Many of these include deep tab-completion logic for programs such as git, docker, and various tools for different programming languages.

Vim

Vim is an improved (hence the name) version of the venerable vi editor. It is a very powerful text editor that I highly suggest becoming at least moderately comfortable using. Many of the conventions are shared with other programs, including less, ex, and sed, and there are a great number of plugins and configurations which can make it as good or better than an IDE for many use cases.

A lot of developer working in languages like Python, Ruby, or Node.js use Vim. You’ll want to make sure and do some basic configuration for things like tab width and syntax highlighting, but there’s a large number of plugins which can provide everything from linting to autocompletion suggestions

That being said, vi (and Vim) has a reputation for being very difficult to learn. This is primarily due to one unusual but very important feature of Vim - it is modal, which is to say that it has different modes. The two main ones are the (default) normal mode, and the insert mode. In insert mode, keystrokes will insert text, but command mode can do things like deleting, appending, repeating, changing, substituting ranges of text all with a few quick keystrokes. One of the tricks to learning normal mode is to think of manipulating text via an action and a direction, such as “delete 4 words”, “yank (copy) 3 lines”, or “change inner quotes”. Macros can be quickly recorded and replayed to rather simply do things as complicated as finding all HTML elements of a certain type and deleting the first two tags inside them, something considerably harder to do in many other editors.

There are many great resources on how to use Vim that can be found with a quick web search, but the most important one is how to quit: Make sure you are in normal mode (Which you’ll know by the absence of a line at the bottom specifying a different mode such as –INSERT–) by pressing Esc or ⌃C, and then type :q for quit. If you have changed the file, it will either require you to first write the file, which can be done at the same time by typing :wq for “write and quit” or :q! for “quit and discard any changes.” Help can also be found in-app by typing :help in normal mode.

Vim configuration

Configuring Vim can be a daunting task since there is no normal settings screen. To change config, you’ll want to edit (or create) the file ~/.vimrc.

My suggested starting place for configuring vim is this

set nocompatible
set number
syntax on
set ai
set tabstop=2
set shiftwidth=2
set expandtab
set backspace=indent,eol,start
set wildmenu
set showmatch
filetype plugin indent on

This will set some basic features such as syntax highlighting and auto-indentation based on filetype, show line numbers on the left, and give a more friendly tab-completion prompt.

Plugins

There have been several plugin systems pop up in recent years for Vim, but the good news is the plugins themselves aren’t proprietary to them, so you don’t have to worry about not being able to use a specific plugin with your plugin manager. The most popular manager as of this writing appears to be vim-plug. A great list of plugins can be found here.

Package Manager

As I suggested in a previous article, use brew.

Included programming languages

Macs come with Python, Ruby, PHP, and Perl installed by default, so a lot of functionality can be assumed out of the box. However, there are times when you may want to install packages for these languages without have root access, or to use different versions of them. Many of these languages have projects aimed at easily managing these, such as RVM (Ruby Version Manager), which can help you try out new versions of Ruby without modifying the system version.

Next Steps

The next blog post in this series will give suggestions for which programs (some built-in, some third-party) to use for specific use cases.