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

Introduction

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 (http://www.nethack.org). 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 Terminal.app 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 Terminal.app 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 <http://www.macvim.org>. 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!

References

The vi man page

Vim home: http://www.wim.org

Nethack: http://www.nethack.org

"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.

 
AAPL
$501.69
Apple Inc.
+3.01
MSFT
$34.73
Microsoft Corpora
+0.24
GOOG
$897.08
Google Inc.
+15.07

MacTech Search:
Community Search:

Software Updates via MacUpdate

Apple HP Printer Drivers 2.16.1 - For OS...
Apple HP Printer Drivers includes the latest HP printing and scanning software for Mac OS X 10.6, 10.7 and 10.8. For information about supported printer models, see this page.Version 2.16.1: This... Read more
Yep 3.5.1 - Organize and manage all your...
Yep is a document organization and management tool. Like iTunes for music or iPhoto for photos, Yep lets you search and view your documents in a comfortable interface, while offering the ability to... Read more
Apple Canon Laser Printer Drivers 2.11 -...
Apple Canon Laser Printer Drivers is the latest Canon Laser printing and scanning software for Mac OS X 10.6, 10.7 and 10.8. For information about supported printer models, see this page.Version 2.11... Read more
Apple Java for Mac OS X 10.6 Update 17 -...
Apple Java for Mac OS X 10.6 delivers improved security, reliability, and compatibility by updating Java SE 6.Version Update 17: Java for Mac OS X 10.6 Update 17 delivers improved security,... Read more
Arq 3.3 - Online backup (requires Amazon...
Arq is online backup for the Mac using Amazon S3 and Amazon Glacier. It backs-up and faithfully restores all the special metadata of Mac files that other products don't, including resource forks,... Read more
Apple Java 2013-005 - For OS X 10.7 and...
Apple Java for OS X 2013-005 delivers improved security, reliability, and compatibility by updating Java SE 6 to 1.6.0_65. On systems that have not already installed Java for OS X 2012-006, this... Read more
DEVONthink Pro 2.7 - Knowledge base, inf...
Save 10% with our exclusive coupon code: MACUPDATE10 DEVONthink Pro is your essential assistant for today's world, where almost everything is digital. From shopping receipts to important research... Read more
VirtualBox 4.3.0 - x86 virtualization so...
VirtualBox is a family of powerful x86 virtualization products for enterprise as well as home use. Not only is VirtualBox an extremely feature rich, high performance product for enterprise customers... Read more
Merlin 2.9.2 - Project management softwa...
Merlin is the only native network-based collaborative Project Management solution for Mac OS X. This version offers many features propelling Merlin to the top of Mac OS X professional project... Read more
Eye Candy 7.1.0.1191 - 30 professional P...
Eye Candy renders realistic effects that are difficult or impossible to achieve in Photoshop alone, such as Fire, Chrome, and the new Lightning. Effects like Animal Fur, Smoke, and Reptile Skin are... Read more

Sorcery! Enhances the Gameplay in Latest...
Sorcery! | Read more »
PROVERBidioms Paints English Sayings in...
PROVERBidioms Paints English Sayings in a Picture for Users to Find Posted by Andrew Stevens on October 16th, 2013 [ permalink ] | Read more »
OmniFocus 2 for iPhone Review
OmniFocus 2 for iPhone Review By Carter Dotson on October 16th, 2013 Our Rating: :: OMNIPOTENTiPhone App - Designed for the iPhone, compatible with the iPad OmniFocus 2 for iPhone is a task management app for people who absolutely... | Read more »
Ingress – Google’s Augmented-Reality Gam...
Ingress – Google’s Augmented-Reality Game to Make its Way to iOS Next Year Posted by Andrew Stevens on October 16th, 2013 [ permalink ] | Read more »
CSR Classics is Full of Ridiculously Pre...
CSR Classics is Full of Ridiculously Pretty Classic Automobiles Posted by Rob Rich on October 16th, 2013 [ permalink ] | Read more »
Costume Quest Review
Costume Quest Review By Blake Grundman on October 16th, 2013 Our Rating: :: SLIGHTLY SOURUniversal App - Designed for iPhone and iPad This bite sized snack lacks the staying power to appeal beyond the haunting season.   | Read more »
Artomaton – The AI Painter is an Artific...
Artomaton – The AI Painter is an Artificial Artistic Intelligence That Paints From Photos You’ve Taken Posted by Andrew Stevens on October 16th, 2013 [ | Read more »
Hills of Glory 3D Review
Hills of Glory 3D Review By Carter Dotson on October 16th, 2013 Our Rating: :: BREACHED DEFENSEUniversal App - Designed for iPhone and iPad Hills of Glory 3D is the most aggravating kind of game: one with good ideas but sloppy... | Read more »
FitStar: Tony Gonzalez Adds New 7 Minute...
FitStar: Tony Gonzalez Adds New 7 Minute Workout Program for Those Who Are in a Hurry Posted by Andrew Stevens on October 16th, 2013 [ permalink ] | Read more »
PUMATRAC Review
PUMATRAC Review By Angela LaFollette on October 16th, 2013 Our Rating: :: INSIGHTFULiPhone App - Designed for the iPhone, compatible with the iPad PUMATRAC not only provides runners with stats, it also motivates them with insights... | Read more »

Price Scanner via MacPrices.net

Updated MacBook Price Trackers
We’ve updated our MacBook Price Trackers with the latest information on prices, bundles, and availability on MacBook Airs, MacBook Pros, and the MacBook Pros with Retina Displays from Apple’s... Read more
13-inch Retina MacBook Pros on sale for up to...
B&H Photo has the 13″ 2.5GHz Retina MacBook Pro on sale for $1399 including free shipping. Their price is $100 off MSRP. They have the 13″ 2.6GHz Retina MacBook Pro on sale for $1580 which is $... Read more
AppleCare Protection Plans on sale for up to...
B&H Photo has 3-Year AppleCare Warranties on sale for up to $105 off MSRP including free shipping plus NY sales tax only: - Mac Laptops 15″ and Above: $244 $105 off MSRP - Mac Laptops 13″ and... Read more
Apple’s 64-bit A7 Processor: One Step Closer...
PC Pro’s Darien Graham-Smith reported that Canonical founder and Ubuntu Linux creator Mark Shuttleworth believes Apple intends to follow Ubuntu’s lead and merge its desktop and mobile operating... Read more
MacBook Pro First, Followed By iPad At The En...
French site Info MacG’s Florian Innocente says he has received availability dates and order of arrival for the next MacBook Pro and the iPad from the same contact who had warned hom of the arrival of... Read more
Chart: iPad Value Decline From NextWorth
With every announcement of a new Apple device, serial upgraders begin selling off their previous models – driving down the resale value. So, with the Oct. 22 Apple announcement date approaching,... Read more
SOASTA Survey: What App Do You Check First in...
SOASTA Inc., the leader in cloud and mobile testing announced the results of its recent survey showing which mobile apps are popular with smartphone owners in major American markets. SOASTA’s survey... Read more
Apple, Samsung Reportedly Both Developing 12-...
Digitimes’ Aaron Lee and Joseph Tsai report that Apple and Samsung Electronics are said to both be planning to release 12-inch tablets, and that Apple is currently cooperating with Quanta Computer on... Read more
Apple’s 2011 MacBook Pro Lineup Suffering Fro...
Appleinsider’s Shane Cole says that owners of early-2011 15-inch and 17-inch MacBook Pros are reporting issues with those models’ discrete AMD graphics processors, which in some cases results in the... Read more
Global Notebook Shipments To Grow Less Than 3...
Digitimes Research’s Joanne Chien reports that Taiwan’s notebook shipments grew only 2.5% sequentially, and dropped 8.6% year-over-year in the third quarter despite the fact that notebook ODMs have... Read more

Jobs Board

Senior Mac / *Apple* Systems Engineer - 318...
318 Inc, a top provider of Apple solutions is seeking a new Senior Apple Systems Engineer to be based out of our Santa Monica, California location. We are a Read more
*Apple* Retail - Manager - Apple Inc. (Unite...
Job Summary Keeping an Apple Store thriving requires a diverse set of leadership skills, and as a Manager, you’re a master of them all. In the store’s fast-paced, Read more
*Apple* Solutions Consultant - Apple (United...
**Job Summary** Apple Solutions Consultant (ASC) - Retail Representatives Apple Solutions Consultants are trained by Apple on selling Apple -branded products Read more
Associate *Apple* Solutions Consultant - Ap...
**Job Summary** The Associate ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The Associate ASC's role is to Read more
*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.