TweetFollow Us on Twitter

I Heart vi

Volume Number: 22 (2006)
Issue Number: 12
Column Tag: Mac in the Shell

I Heart vi

Text editing in a shell

by Edward Marczak


It's amazing that a basic function like text editing can be so...obtuse. vi and emacs have confounded new users since they arrived on the scene. However, editing text is such an important part of any Unix or Unix—like system, that I'd be remiss if I didn't address it. This month, I'll cover basic vi — enough to make you comfortable the next time you've ssh—ed into a remote machine and need to edit a file.

Growing Up

Practically each month, this column asks you to type something into a text editor. Of course, this can be TextWrangler, SubEthaEdit or even Dreamweaver or the XCode IDE. But if you already have a shell open, or, only have the option of a shell, then an editor like vi, emacs or pico are your best options. I'm well aware of the vi/emacs debates. Emacs is truly a Swiss Army Knife of an application. Perhaps I'll cover it someday. However, for some reason, I just dug into vi more, and have stuck with it; Turns out to have been a useful choice. If you've ever needed to alter privileges for sudo users, you'll note that the 'right' way to edit the sudoers file is by using visudo — basically, a stripped down version of vi. On other Unix systems, there's typically a vipw and vigroup app. All three, by default, use vi as the editor. Also, ever notice which editor you use when editing crontabs with crontab —e? So, vi is very good to know — at least the basics.

Quick little secret before we start: traditional vi is pretty much gone, and has been supplanted with vim, VI Improved. You'll note that vi is simply a link to vim:

$ ls —ld /usr/bin/vi*
lrwxr—xr—x	1	root wheel	3	Jan	18 2006 /usr/bin/vi —> vim
lrwxr—xr—x	1	root wheel	3	Jan	18 2006 /usr/bin/view —> vim
—rwxr—xr—x	1	root wheel	2060380 	Dec	25 2005 /usr/bin/vim
lrwxr—xr—x	1	root wheel	3	Jan	18 2006 /usr/bin/vimdiff —> vim
—rwxr—xr—x	1	root wheel	1068 	Dec	25 2005 /usr/bin/vimtutor
—r—xr—xr—x	1	root wheel	34472 	Dec	25 2005 /usr/bin/vis

OS X v10.4 ships with vim v6.2. You can download the latest — version 7 — and compile it up, as it compiles and runs cleanly under OS X. However, there's no need to do that to follow this particular column.

The Tower That Ate People

If you've never used vi, we'll take it step—by—step. So, open up your favorite terminal app and get a shell. You may as well stay in your home directory, as we're not going to make too much of a mess.

To start the editor, simply type vi, and you'll be greeted with a startup screen. Unlike Word or Pages, you can't simply start typing. Well, you can, but each keystroke may not do what you expect. Those of us that go back to Mac OS 9 will remember modal dialogs. Basically, a modal dialog box stopped you from using anything else until you acknowledged it. You were put in the mode of having to deal with whatever message it presented. vi is a modal editor. You'll either be in one of three modes: normal mode, 'edit' mode, or ex command mode. What you're looking at now is normal mode: vi awaits your instruction.

Press i. Now, I should tell you here that commands in vi are case sensitive. Typically, the lowercase version means one thing, and the uppercase/shifted version negates, or is the opposite of the lower case (or, non—shift) version — this makes commands a little easier to remember. So, you've pressed i, and you now see "— INSERT —" at the bottom of the window. Great! Your first vi command. No sweat, right? Now you're in insert mode. This is pretty much what you expect. Go ahead, type. How about we all type the same thing. We'll start out easy; try this, pressing return at the end of each line, mistakes and all:

trust a few people
love all
do wrong to none

Not too terrible, right? Pressing the escape key on your keyboard will put you back in normal mode. The "— INSERT —" should disappear.

Now, I didn't get the quote quite right. Let's fix it. Apple has nicely mapped most keys sanely; they do what you expect. This includes the arrow keys. However, this may not be the case on all systems, so, if you'd like to get used to the vim way, I'll show you now. This will also help your Nethack skills ( k is cursor up, j is cursor down, while h moves the cursor left, and l moves it right. Perhaps not the easiest to remember. Different people have different ways to remember this, but, I simply suggest a Post—it note and some practice. Why these keys? Vim and vi strive to be efficient editors. I love to use vi as I never have to take my hands off of the keyboard, nor stray too far from the home row. That's efficiency. If you're 100% Mac—dedicated, though, the arrow keys will suit you just fine, too. Digression aside, please move the cursor to the first character, the 't' in 'trust'.

Well, if that's the beginning of a sentence, it should be uppercase. There's two ways to tackle this, and we'll start with the easier of the two. With the cursor on the 't', press ~ (tilde). This toggles the character under the cursor between upper and lower—case, and then advances the cursor. Ah, but wait, that's not the correct beginning of that quote! With your cursor on that line, type dd, which will delete the line and place it in the yank buffer. Now, press p which pastes the contents of the yank buffer on the line following.

Now, our capital letter leads the second sentence, which naturally isn't right. Twiddle it back using the tilde key (~). Cursor up and onto the 'l' in 'love', and we'll replace it with an uppercase version — this time, though we'll do just that: replace. Type r, followed by 'L'. r will replace one character. So, when you typed the 'L', you simply replaced what was there. Time for the correct punctuation.

With the cursor still on the first line, type A, for 'append to end of line' (make sure it's capital A!). Your cursor will jump to the end of the line and you'll enter insert mode — look for the "— INSERT —" message in the status line. Type a comma, and press escape to get back into normal mode.

Cursor down to the second line, and then right to the 'p' in 'people'. Delete, one character at a time using the x command, the word 'people', but leave the space after 'few'. Replace the space with a comma, using r, followed by a comma. At this point, you should have:

Love all, 
trust a few,
do wrong to none

...with your cursor on the comma after 'few'. Cursor down to the third line and type $ — jump to the end of the current line. Press a (the letter 'a') — append after the cursor — and type a '.' (period). (Those of you paying attention will realize that this could have been done in one step with capital A...but how else was I to stick in the $ command to jump to the end of a line?) Press escape to go back to normal mode.

Cursor up to the first line and press J (capital J). This will join this line with the one following. Do it again, and you'll end up with one single line:

Love all, trust a few, do wrong to none.

And Through The Wire

So, now you have the very basics of editing with vi. I mentioned that vi begat vim, but I didn't yet tell you that ex begat vi. The foundation of certain commands are ex commands. You enter ex command mode, by typing a colon (":"). You'll see a colon appear on the status line, and the cursor will jump down to immediately follow it. Type w ws.txt. 'w' is for 'write', and will write the file 'ws.txt'.

If you need to take a break, you can type :q to quit. Re—enter vi while loading the file like this: vi ws.txt.

We've looked at three ways to get into insert mode so far: 'i', for insert in place, 'a' for append at the cursor and 'A', which appends at the end of the current line. Here's one more: o. This opens a new line beneath the current line. Try it now.

Don't forget! vi inherits all of the integration that using brings OS X users. The best is drag—and—drop. While in insert mode, you can pick up a text or .clipping file and drop it on the terminal. The contents will insert at the cursor.

Figure 1: Dragging a .clipping file to while editing in vi

Try it now, while you're still in insert mode!

At this point, I encourage you to quit vi — :q — and type vimtutor. It's an interactive vi tutorial that takes about 15—20 minutes. Good, basic practice and tips.

More Than This

vimtutor does a good job of covering the basics. Let me wrap up with some of my favorites that neither I or vimtutor have introduced you to.

:shell — this ex command lets you escape to a shell, do your work, and then when you exit, you'll find yourself right where you left off. Now, certainly, this function has lost some value in the days of multi—window machines, but sometimes, it's really handy. It let's you get a lay of the land, and then pick up right from where you left off.

vimtutor shows you how to run an external shell command, but at times, there's even something more useful: running a command and inserting its output at the cursor. To preface this, you can read in a file using the r ex command. You can even read in the file you're working on. Try it now with :r ws.txt. You'll see the contents of the file — as it is on disk — appear inserted into your file after your cursor. Similarly, you can read in the output of a shell command with r !. Insert all of the users from Directory Services into your file with:

:r !dscl localhost list /Search/Users

This comes in very handy. Instead of running a command, redirecting output to a file and then editing that file, you can do it in one step in vi.

vimtutor also shows you how to search using the / normal command. If you didn't run through vimtutor, do it now. Really. Here's two things they didn't get into fully. Load up vimtutor, as it provides ample text for us (quit your current session with :q, and then type vimtutor at the shell prompt). Put the cursor on the first occurrence of the word "commands". You should see several of them. Press * (asterisk). vi automatically starts searching on that word, and jumps to the next occurrence. You can jump between occurrences with n and N. n jumping to the next (forward) occurrence, and N jumping backward.

Anyone familiar with sed will feel right at home with vim's search and replace function. vimtutor showed you searching with /. Search and replace is accomplished with :% s/old/new/g. The "%" represents the entire file. Without it, you're only searching the current line. Additionally the "/g" means global, and without that flag, only the first occurrence on each line would be replaced. You can also use the c flag to have vi ask for a confirmation. Go to the top of the file and try this:

:% s/commands/friends/gc

All occurrences of "commands" will be changed to "friends" and you'll be asked for confirmation of each change. You may notice that this substitution works surprisingly well!

Finally, one option I use quite often: changing line endings. Since a file is just a stream of bytes, the computer needs some way to recognize when humans want to see a new line. Unfortunately, the three major platforms all decided on different ways. Unix and Unix—like systems use a line—feed character (LF), ascii 0x0A. DOS uses both a new line (NL, or carriage return CR) and line feed. When DOS sees CRLF, ascii 0x0D 0x0A, it knows to show us humans a new line. Finally, Mac systems traditionally have used a new line only. The current state of line endings under OS X is a bit of a mish—mash. Most GUI apps still use CR, where most (if not all) shell apps use LF.

Many times, you'll receive a DOS line—ending—formatted file that should have Unix line endings. vi handles this with aplomb. Use :set ff=unix and then write the file with :w. Done! Go the other way with :set ff=dos. Sometimes this shows up as ^M (ctrl—M) characters — that's the extra CR character. Just change the file type and write it out.

Don't Give Up

vi is a craftsman's tool. Like any tool, it requires a little work and practice to learn in depth, or to make second nature. I hope next time that you're into a remote system and need to edit a file, or for some reason are forced to use vi, that you'll be confident in your usage. In the spirit of self exploration, take a look at all of the settings that can be changed to tailor vi to your style by trying :set all.

Be aware that there is a GUI version of vim available at <>. It may not be a GUI app the way you think of one, but it is integrated with the Aqua environment. Frankly, though, I never really saw the point in X11 or GUI versions of vi or emacs. In those environments, you'll have access to a shell, so why not use it as intended?

Media of the month: Up, by Peter Gabriel. A masterpiece. Seriously. If, for some reason, that doesn't do it for you, just take some time to put on some headphones (real cans, not those iPod things), lay down, and really listen to some music.

See everyone next month at MacWorld, I hope! I'm presenting two sessions, and will be hanging around the MacTech booth, so please make sure you stop by and say hello!


The vi man page

Vim home:


"All's Well That Ends Well," William Shakespeare

Ed Marczak owns and operates Radiotope, a technology consulting practice with a focus on business process enhancement, network and system integration, and, more generally, all things Mac.


Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

See All

How to get started with Prisma
If there's one thing people like to do more than taking pictures with their smartphones, it's tinkering with those photos in some way. Numerous apps have sprung up over the last several years that allow you to use filters and special effects to... | Read more »
6 Pokemon GO updates you can expect, acc...
Pokemon GO had a scheduled appearance at this year's San Diego Comic-Con for a while, but it was only relatively close to the show that it was upgraded to a spot in Hall H. That's the biggest venue at SDCC, one usually reserved for the largest... | Read more »
How to evolve Eevee in Pokemon GO
By now, almost everyone should be hip to how to evolve Pokemon in Pokemon GO (and if not, there's a guide for that). Just gather enough candy of the appropriate type, feed them all to the Pokemon, and evolution happens. It's a miracle that would... | Read more »
CSR Racing 2: Guide to all game modes
It might not seem like there are all that many ways to go fast in a straight line, but CSR Racing 2 begs to differ. [Read more] | Read more »
Bulb Boy (Games)
Bulb Boy 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Multi-award winning 2D point & click horror adventure about a boy with a glowing head. | Read more »
5 top free emoji keyboard apps
If we're not at peak emoji yet as a society, it feels like we definitely should be. The emoji concept has gone far beyond what anyone in Japan could have envisioned when the people there unleashed it on an unsuspecting world, but the West has... | Read more »
How to unlock more characters in Disney...
One of the big charms of Disney Emoji Blitz is seeing a wide variety of beloved Disney and Pixar characters transformed into smiling emojis. Even someone like the sneaky Randall from Monsters Inc., who probably never cracked a smile on film, is... | Read more »
Cubway (Games)
Cubway 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Cubway is a journey with an abstract story of lifecycle of rebirth, called Samsara. Guide the cube through the long way full of dangers... | Read more »
Colorcube (Games)
Colorcube 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Turn pieces and blend colours in this minimal yet visually stunning puzzler.Over 200 handcrafted and challenging levels. Features... | Read more »
Doodle God Griddlers (Games)
Doodle God Griddlers 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: | Read more »

Price Scanner via

13-inch 1.6GHz/128GB MacBook Air on sale for...
Amazon has the 13″ 1.6GHz/128GB MacBook Air on sale for $200 off MSRP for a limited time. Shipping is free: - 13″ 1.6GHz/128GB MacBook Air (sku MMGF2LL/A): $799.99 $200 off MSRP Their price is the... Read more
13-inch 1.6GHz/256GB MacBook Air on sale for...
Amazon has the 13″ 1.6GHz/256GB MacBook Air on sale for $200 off MSRP for a limited time. Shipping is free: - 13″ 1.6GHz/256GB MacBook Air (sku MMGG2LL/A): $999.99 $200 off MSRP Their price is the... Read more
Free iOS Business App notably* Helps Service...
PayStudio Inc. has introduced their new business app notably* 1.0, developed for iPhone and iPod touch. notably* was specifically developed to help service and trade professionals go digital and... Read more
27-inch iMacs on sale for $200 off MSRP
Amazon has 27″ iMacs on sale for $200 off MSRP including free shipping: - 27″ 3.3GHz iMac 5K: $2099 $200 off MSRP - 27″ 3.2GHz/1TB Fusion iMac 5K: $1799.99 $200 off MSRP - 27″ 3.2GHz/1TB HD iMac 5K... Read more
Mac Pros on sale for $200 off MSRP
B&H Photo has Mac Pros on sale for $200 off MSRP. Shipping is free, and B&H charges sales tax in NY only: - 3.7GHz 4-core Mac Pro: $2799, $200 off MSRP - 3.5GHz 6-core Mac Pro: $3799, $200... Read more
Save up to $600 with Apple refurbished Mac Pr...
Apple has Certified Refurbished Mac Pros available for up to $600 off the cost of new models. An Apple one-year warranty is included with each Mac Pro, and shipping is free. The following... Read more
Apple price trackers, updated continuously
Scan our Apple Price Trackers for the latest information on sales, bundles, and availability on systems from Apple’s authorized internet/catalog resellers. We update the trackers continuously: - 15″... Read more
13-inch 2.5GHz MacBook Pro (Apple refurbished...
Apple has Certified Refurbished 13″ 2.5GHz MacBook Pros available for $829, or $270 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 13″ 2.5GHz MacBook Pros... Read more
21-inch iMacs on sale for up to $120 off MSRP
B&H Photo has 21″ iMacs on sale for up to $120 off MSRP including free shipping plus NY sales tax only: - 21″ 3.1GHz iMac 4K: $1379 $120 off MSRP - 21″ 2.8GHz iMac: $1199.99 $100 off MSRP - 21″ 1... Read more
Charitybuzz Set to Auction Unique Apple-1 Com...
Offering an opportunity to own the computer that sparked a revolution, on Monday, July 25, leading online charity auction platform Charitybuzz will auction what is claimed to be the world’s most... Read more

Jobs Board

*Apple* Retail - Multiple Positions, Willow...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Evangelist - JAMF Software (United S...
The Apple Evangelist is responsible for building and cultivating strategic relationships with Apple 's small and mid-market business development field teams. This Read more
*Apple* Solutions Consultant - APPLE (United...
Job Summary As an Apple Solutions Consultant, you'll be the link between our future customers and our products. You'll showcase your entrepreneurial spirit as you Read more
*Apple* Professional Learning Specialist - A...
Job Summary The Apple Professional Learning Specialist is a full-time position for one year with Apple in the Phoenix, AZ area. This position requires a high Read more
*Apple* Picker - Apple Hill Orchard (United...
Apple Hill Orchard, Co. Rte. 21,Whitehall, NY 9/7/16-10/228/16. Pick fresh market or processing apples Productivity of 60 boxes and 80 boxes processing fruit per Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.