Do you ever feel like graphical user interfaces have gone too far?
pine for the days when your entire desktop consisted of one console
Or do you simply want luxury and productivity when you
ssh into a headless
This is Part 2 of a series of posts outlining my recipe for living comfortably in the terminal.
Part Two: Vim
I’m going to be careful not to start a holy war here. Every developer should be proficient in a text editor. It is as the knife is to the chef. I don’t have a strong opinion on which text editor developers should be proficient in, but I can at least explain why I use Vim.
Vim is powerful. Unlike most editors, you start in a mode in which keypresses
are commands, not text input. There are commands for moving the cursor
hjkl), or jumping words (
w) or paragraphs (
}) forward and backward.
Commands for cutting (
d for delete) and pasting (
p), changing (
inserting text like a normal editor (
beauty is that these commands can be strung together like a language to achieve
results. e.g. I want to cut 5 lines starting from my cursor: to cut is
act on a line is usually the command twice, so
dd, and to do something 5
times is just a numerical prefix. Put it together:
5dd. Then I could move 4
paragraphs down with
4} and paste the lines I just cut:
p. This composition
of simple commands adds up to serious timesaving as you improve.
Vim is heavily customisable, in much the same way proper text editors are. It
has the benefit of years of popularity behind it, such that there is a plugin
to do almost anything. One’s
.vimrc is a living document of settings and
plugins and all sorts, chasing the perfect setup.
Vim is omnipresent. Its predecessor
vi, created in 1976, is virtually guaranteed to come
preinstalled on every unix/linux based system ever, and these days is usually symlinked to
vim itself. It’s fully open source and cross-platform, it can be just as useful
running graphically on Windows as it can be in a linux terminal. Which brings
me on to the most relevant point to this series…
Vim is made to run in a terminal.
It can run as a typical windowed desktop program, but typing
vim example.txt into a terminal will put you straight into a
syntax-highlighted, full-featured editor that requires no mouse input and plays
nicely over slow connections.
Crash Course on Vim
I won’t attempt to replicate
vimtutor here, or repeat myself about simple
speed-editing commands as described above, but here is the bare minimum to
start comfortably with vim:
You start in Normal mode. Here every letter is a command, typing words will do unexpected things. You probably want to type words, so enter Insert mode by pressing
You can get back to Normal mode by pressing
Some commands take more than one key, these usually begin with
:wsaves (‘writes’) the file.
:w filenameis ‘Save as’.
:qcloses (‘quits’) the file.
:q!quits discarding unsaved changes.
:wqwrites and then quits!
:eopens (‘edits’) a file.
:tabeopens a file in a new tab. Very handy.
gtswitches to the next tab.
/begins a find. e.g.
:%s/hello/world/gfinds and replaces (‘substitutes’)
worldin every occurence in the file.
%here means ‘all lines’ and
gmeans ‘all occurences in a line’.
uis undo a command (including an entire instance of Insert mode).
Ctrl + ris redo, for when you have undone more than you wanted to.
Here is a basic template for a
~/.vimrc to enable useful settings:
set nocompatible "Enable vim features that weren't in vi filetype plugin indent on "Enable detection of filetypes set expandtab "Use 4 spaces instead of tab set tabstop=4 set shiftwidth=4 set softtabstop=4 set encoding=utf-8 set scrolloff=3 "Always have 3 lines above & below cursor visible set showmode "Show which mode vim is in set showcmd "Show commands as you type them set wildmenu "Show possible completions of your command set wildmode=list:longest set visualbell "Flash instead of beep set cursorline "Highlight current line set ttyfast set ruler "Show line:col numbers in status set backspace=indent,eol,start "Make backspace behave as you expect set laststatus=2 "Always show status line set relativenumber "Show relative 'distance' to a line in Normal mode set number "Show the current line no. on current line set modelines=0 "Don't run embedded macros like Office '95 syntax on "Enable syntax highlighting set ignorecase "Case-insensitive find... set smartcase "...unless the find string has an uppercase set gdefault "add /g to find by default set incsearch "find as you type after / set showmatch "Flash matching bracket when you add one set hlsearch "Highlight find results nnoremap ; : "Use ; to mean :, no more shift! set background=dark "Look pretty in a dark terminal! Remove for light terms.
When you get comfortable with the basics, check out Vundle, a way to bundle plugins (even things like colour schemes) into Vim directly from Github, vim-scripts.org or another git repository.
There is always more vim to learn. I did not know that
* in Normal mode
means ‘find the word under the cursor in this file’ until I pressed it by
accident trying to emphasise some Markdown!
Now you have a multiplexed terminal and a powerful text editor, the command
line world is your oyster.
Keep an eye out for the next post in this series on constructing your terminal paradise.