vi

vi

vi editing a temporary, empty file. Tildes signify lines not present in the file.
Developer(s) Bill Joy
Initial release 1976, 35–36 years ago
Written in C
Operating system Unix-like
Type Text editor
License BSD License

vi ( /ˈvˈ/) is a screen-oriented text editor originally created for the Unix operating system. The portable subset of the behavior of vi and programs based on it, and the ex editor language supported within these programs, is described by (and thus standardized by) the Single Unix Specification[1] and POSIX.

The original code for vi was written by Bill Joy in 1976, as the visual mode for a line editor called ex that Joy had written with Chuck Haley.[2] Bill Joy's ex 1.1 was released as part of the first BSD Unix release in March, 1978. It was not until version 2.0 of ex, released as part of Second Berkeley Software Distribution in May, 1979 that the editor was installed under the name vi (which took users straight into ex's visual mode), and the name by which it is known today. Some current implementations of vi can trace their source code ancestry to Bill Joy; others are completely new, largely compatible reimplementations.

The name vi is derived from the shortest unambiguous abbreviation for the command visual in ex; the command in question switches the line editor ex to visual mode. The name vi is pronounced /ˈvˈ/[3][4][5] (as in the discrete English letters v and i), or, much less commonly, /ˈv/,[6] but never "six" as in the Roman numeral VI.[7]

In addition to various non-free software implementations of vi distributed with proprietary implementations of Unix, several free and open source software implementations of vi exist. A 2009 survey of Linux Journal readers found that vi was the most widely used text editor among respondents, beating gedit, the second most widely used editor by nearly a factor of two (36% to 19%).[8]

Contents

History

Creation

vi was derived from a sequence of UNIX command line editors, starting with ed, which was a line editor designed to work well on teletypes, rather than display terminals. Within AT&T, where ed originated, people seemed to be happy with an editor as basic and unfriendly as ed, George Coulouris recalls:[9]

[...] for many years, they had no suitable terminals. They carried on with TTYs and other printing terminals for a long time, and when they did buy screens for everyone, they got Tektronix 4014s. These were large storage tube displays. You can't run a screen editor on a storage-tube display as the picture can't be updated. Thus it had to fall to someone else to pioneer screen editing for Unix, and that was us initially, and we continued to do so for many years.

Coulouris considered the cryptic commands of ed to be only suitable for "immortals", and thus in February, 1976, he enhanced ed (using Ken Thompson's ed source as a starting point) to make em (the "editor for mortals"[10]) while acting as a lecturer at Queen Mary College.[9] The em editor was designed for display terminals and was a single-line-at-a-time visual editor. It was one of the first programs on Unix to make heavy use of "raw terminal input mode", in which the running program, rather than the terminal device driver, handled all keystrokes. When Coulouris visited UC Berkeley in the summer of 1976, he brought a DECtape containing em, and showed the editor to various people. Some people considered this new kind of editor to be a potential resource hog, but others, including Bill Joy were impressed.[9]

Inspired by em, and by their own tweaks to ed,[2] Bill Joy and Chuck Haley, both graduate students at UC Berkeley, took code from em to make en,[2][11] and then "extended" en to create ex version 0.1.[2] After Haley's departure, Bruce Englar encouraged Joy to redesign the editor,[12] which he did June through October 1977 adding a full-screen visual mode to ex.[13]

Many of the ideas in ex's visual mode (a.k.a. vi) were taken from other software that existed at the time. According to Bill Joy,[2] inspiration for vi's visual mode came from the Bravo editor, which was a bimodal editor. In an interview about vi's origins, Joy said:[2]

A lot of the ideas for the screen editing mode were stolen from a Bravo manual I surreptitiously looked at and copied. Dot is really the double-escape from Bravo, the redo command. Most of the stuff was stolen. There were some things stolen from ed—we got a manual page for the Toronto version of ed, which I think Rob Pike had something to do with. We took some of the regular expression extensions out of that.

Joy used a Lear Siegler ADM3A terminal. On this terminal, the Escape key was at the location now occupied by the Tab key on the widely-used IBM PC keyboard (on the left side of the alphabetic part of the keyboard, one row above the middle row). This made it a convenient choice for switching vi modes. Also, the keys h,j,k,l served double duty as cursor movement keys and were inscribed with arrows, which is why vi uses them in that way. The ADM3A had no other cursor keys. Joy explained that the terse, single character commands and the ability to type ahead of the display were a result of the slow 300 baud modem he used when developing the software and that he wanted to be productive when the screen was painting slower than he could think.[11]

Distribution

Joy was responsible for creating the first BSD Unix release in March, 1978, and included ex 1.1 (dated February 1, 1978)[14] in the distribution, thereby exposing his editor to an audience beyond UC Berkeley.[15] From that release of BSD Unix onwards, the only editors that came with the Unix system were ed and ex. In a 1984 interview, Joy attributed much of the success of vi to the fact that it was bundled for free, whereas other editors, such as Emacs could cost hundreds of dollars.[2]

Eventually it was observed that most ex users were spending all their time in visual mode, and thus in ex 2.0 (released as part of Second Berkeley Software Distribution in May, 1979), Joy created vi as a hard link to ex,[16] such that when invoked as vi, ex would automatically start up in its visual mode. Thus, vi is not the evolution of ex, vi is ex.

Joy described ex 2.0 (vi) as a very large program, barely able to fit in the memory of a PDP-11/70,[17] thus although vi may be regarded as a small, lightweight, program today, it was not seen that way early in its history. By version 3.1, shipped with 3BSD in December 1979, the full version of vi was no longer able to fit in the memory of a PDP-11.[17]

Joy continued to be lead developer for vi until version 2.7 in June, 1979,[12][18] and made occasional contributions to vi's development until at least version 3.5 in August, 1980.[18] In discussing the origins of vi and why he discontinued development, Joy said:[2]

I wish we hadn't used all the keys on the keyboard. I think one of the interesting things is that vi is really a mode-based editor. I think as mode-based editors go, it's pretty good. One of the good things about EMACS, though, is its programmability and the modelessness. Those are two ideas which never occurred to me. I also wasn't very good at optimizing code when I wrote vi. I think the redisplay module of the editor is almost intractable. It does a really good job for what it does, but when you're writing programs as you're learning... That's why I stopped working on it. What actually happened was that I was in the process of adding multiwindows to vi when we installed our VAX, which would have been in December of '78. We didn't have any backups and the tape drive broke. I continued to work even without being able to do backups. And then the source code got scrunched and I didn't have a complete listing. I had almost rewritten all of the display code for windows, and that was when I gave up. After that, I went back to the previous version and just documented the code, finished the manual and closed it off. If that scrunch had not happened, vi would have multiple windows, and I might have put in some programmability—but I don't know. The fundamental problem with vi is that it doesn't have a mouse and therefore you've got all these commands. In some sense, its backwards from the kind of thing you'd get from a mouse-oriented thing. I think multiple levels of undo would be wonderful, too. But fundamentally, vi is still ed inside. You can't really fool it. Its like one of those pinatas—things that have candy inside but has layer after layer of paper mache on top. It doesn't really have a unified concept. I think if I were going to go back—I wouldn't go back, but start over again.

In 1979,[2] Mark Horton took on responsibility for vi. Horton added support for arrow and function keys, macros, and improved performance by replacing termcap with terminfo.[12][19]

Ports and clones

Up to version 3.7 of vi, created in October, 1981,[18] UC Berkeley was the development home for vi, but with Bill Joy's departure in early 1982, to join Sun Microsystems, and AT&T's UNIX System V (January, 1983) adopting vi,[20] changes to the vi codebase happened more slowly and in a more dispersed and mutually incompatible ways. At UC Berkeley, changes were made but the version number was never updated beyond 3.7. Commercial Unix vendors, such as Sun, HP, DEC, and IBM each received copies of the vi source, and their operating systems, Solaris, HP-UX, Tru64, and AIX, today continue to maintain versions of vi directly descended from the 3.7 release, but with added features, such as adjustable key mappings, encryption, and wide character support.

While commercial vendors could work with Bill Joy's codebase (and continue to use it today), many people could not. Because Joy had begun with Ken Thompson's ed editor, ex and vi were derivative works and could not be distributed except to people who had an AT&T source license. People looking for a free Unix-style editor would have to look elsewhere. By 1985, a version of Emacs (MicroEMACS) was available for a variety of platforms, but it was not until June, 1987 that Stevie (ST editor for VI enthusiasts), a limited vi clone appeared.[21][22] In early January, 1990, Steve Kirkendall posted a new clone of vi, Elvis, to the Usenet newsgroup comp.os.minix, aiming for a more complete and more faithful clone of vi than Stevie. It quickly attracted considerable interest in a number of enthusiast communities.[23][24] Andrew Tanenbaum quickly asked the community to decide one of these two editors to be the vi clone in Minix;[24] Elvis was chosen, and remains the vi clone for Minix today.

In 1989 Lynne Jolitz and William Jolitz began porting BSD Unix to run on 386 class processors, but to create a free distribution they needed to avoid any AT&T-contaminated code, including Joy's vi. To fill the void left by removing vi, their 1992 386BSD distribution adopted Elvis as its vi replacement. 386BSD's descendants, FreeBSD and NetBSD followed suit. But at UC Berkeley, Keith Bostic wanted a "bug for bug compatible" replacement for Joy's vi for BSD 4.4 Lite. Using Kirkendall's Elvis (version 1.8) as a starting point, Bostic created nvi, releasing it in Spring of 1994.[25] When FreeBSD and NetBSD resynchronized the 4.4-Lite2 codebase, they too switched over to Bostic's nvi, which they continue to use today.[25]

Despite the existence of vi clones with enhanced featuresets, sometime before June, 2000,[26] Gunnar Ritter ported Joy's vi codebase (taken from 2.11BSD, February, 1992) to modern Unix-based operating systems, such as Linux and FreeBSD. Initially, his work was technically illegal to distribute without an AT&T source license, but, in January, 2002, those licensing rules were relaxed,[27] allowing legal distribution as an open-source project. Ritter continued to make small enhancements to the vi codebase similar to those done by commercial Unix vendors still using Joy's codebase, including changes required by the POSIX.2 standard for vi. His work is available as Traditional Vi, and runs today on a variety of systems.

But although Joy's vi was now once again available for BSD Unix, it arrived after the various BSD flavors had committed themselves to nvi, which provides a number of enhancements over traditional vi, and drops some of its legacy features (such as open mode for editing one line at a time). It is in some sense, a strange inversion that BSD Unix, where Joy's vi codebase began, no longer uses it, and the AT&T-derived Unixes, which in the early days lacked Joy's editor, are the ones that now use and maintain modified versions of his code.

Impact

Over the years since its creation, vi became the de facto standard Unix editor and a nearly undisputed hacker favorite outside of MIT until the rise of Emacs after about 1984. The Single UNIX Specification specifies vi, so every conforming system must have it.

vi is still widely used by users of the Unix family of operating systems. About half the respondents in a 1991 USENET poll preferred vi.[5] In 1999, Tim O'Reilly, founder of the eponymous computer book publishing company, stated that his company sold more copies of its vi book than its emacs book.[28]

Interface

vi is a modal editor: it operates in either insert mode (where typed text becomes part of the document) or normal mode (where keystrokes are interpreted as commands that control the edit session). For example, typing <kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">i</kbd> while in normal mode switches the editor to insert mode, but typing <kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">i</kbd> again at this point places an "i" character in the document. From insert mode, pressing the escape key switches the editor back to normal mode. A perceived advantage of vi's separation of text entry and command modes is that both text editing and command operations can be performed without requiring the removal of the user's hands from the home row. As non-modal editors usually have to reserve all keys with letters and symbols for the printing of characters, any special commands for actions other than adding text to the buffer must be assigned to keys which do not produce characters, such as function keys, or combinations of modifier keys such as <kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">Ctrl</kbd>, and <kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">Alt</kbd> with regular keys. Vi has the advantage that most ordinary keys are connected to some kind of command for positioning, altering text, searching and so forth, either singly or in key combinations. Many commands can be touch typed without the use of <kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;"> Shift</kbd>,<kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">Ctrl</kbd> or <kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">Alt</kbd>. Other types of editors generally require the user to move their hands from the home row when touch typing:

For instance, replacing a word is <kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">c</kbd><kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">w</kbd>replacement text<kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">Escape</kbd> which is a combination of two independent commands (change and word-motion) together with a transition into and out of insert mode. Text between the cursor position and the end of the word is overwritten by the replacement text. The operation can be repeated at some other location by typing <kbd class="keyboard-key" style="border: 1px solid; border-color: #ddd #bbb #bbb #ddd; border-bottom-width: 2px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #f9f9f9; padding: 1px 3px; font-family: inherit; font-size: 0.85em; white-space: nowrap;">.</kbd>, the effect being that the word starting that location will be replaced with the same replacement text.

Contemporary derivatives and clones

Compared to most of its many clones, the original vi is a rather small program (~120 KB code on i386) just with its extremely powerful editing interface, but lacking fancy features like multiple undo, multiple screens or syntax highlighting. In other words, it is a typical Unix program that does exactly what it should and nothing more.

See also

References

  1. ^ The Open Group (1997). ""vi — screen-oriented (visual) display editor", Single Unix Specification, Version 2". http://opengroup.org/onlinepubs/007908799/xcu/vi.html. Retrieved 2009-01-25 
  2. ^ a b c d e f g h i Interview with Bill Joy, Unix Review, August 1984
  3. ^ Raymond, Eric S. (4 October 2003). The Art of UNIX Programming. Addison-Wesley Professional. ISBN 0131429019. http://www.catb.org/~esr/writings/taoup/html/ch15s02.html#vi_literacy. "15.2.1:...is pronounced /vee eye/ (not /vie/ and definitely not /siks/!)." 
  4. ^ Bolsky, M. I. (1984). The vi User's Handbook. AT&T Bell Laboratories. ISBN 0-139-41733-8. 
  5. ^ a b Raymond, Eric S; Guy L. Steele, Eric S. Raymond (1996). (ed.). ed. The New Hacker's Dictionary (3rd ed.). MIT Press. ISBN 0-262-68092-0. 
  6. ^ Gross, Christian (2005). Open Source for Windows Administrators. Charles River Media. pp. 55. ISBN 1-584-50347-5. 
  7. ^ Thomer M Gil. "Vi Lovers Home Page". http://thomer.com/vi/vi.html. Retrieved 2009-01-24 
  8. ^ Gray, James (1 June 2009). Readers' Choice Awards 2009. Linux Journal. http://www.linuxjournal.com/article/10451. Retrieved 2010-01-22 
  9. ^ a b c A Quarter Century of UNIX, by Peter H. Salus, Addison-Wesley 1994, pages 139-142. (excerpt available online)
  10. ^ Source code for em; February, 1976
  11. ^ a b Vance, Ashlee (September 11, 2003). "Bill Joy's greatest gift to man – the vi editor". The Register. http://www.theregister.co.uk/2003/09/11/bill_joys_greatest_gift/. Retrieved 2008-12-05. 
  12. ^ a b c Joy, Bill (roff source). ex Reference Manual. 4.4 BSD (encumbered, not Lite). CSRG, UC Berkeley. http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/src/usr.bin/ex/USD.doc/ex/ex.rm  (see Acknowlegments section at end of file)
  13. ^ See dates in copyright headers, ex 1.1 source code
  14. ^ version.c, ex 1.1 source code
  15. ^ READ_ME from the first Berkeley Software Distribution (formatted version)
  16. ^ makefile, ex 2.0 source code
  17. ^ a b READ_ME, ex 2.0 source code
  18. ^ a b c Change log for vi, versions 2.1-3.7
  19. ^ Joy, Bill (roff source). vi Reference Manual. 4.4 BSD (encumbered, not Lite). CSRG, UC Berkeley. http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/src/usr.bin/ex/USD.doc/vi/vi.in  (see Acknowlegments section at end of file)
  20. ^ Kenneth H. Rosen; Douglas A. Host, Rachel Klee (2006). UNIX: the complete reference. McGraw-Hill Osborne Media. p. 10. ISBN 978-0072263367. http://books.google.com/books?id=2Et--84HIkwC&lpg=PA10&dq=%2Bvi%20bell%20labs%20system%20v%201983&pg=PA10#v=onepage&q&f=false. Retrieved 7 December 2010. 
  21. ^ Thompson, Tim (2000-03-26). "Stevie". http://nosuch.com/tjt/stevie/. Retrieved 2010-12-29. 
  22. ^ Tim Thompson (1987-06-28). "A mini-vi for the ST". comp.sys.atari.st. (Web link). Retrieved 2010-12-29. 
  23. ^ Usenet, various newsgroups (comp.editors, comp.sys.*, comp.os.*), 1990
  24. ^ a b Steve Kirkendall (1990-04-20). "A new clone of vi is coming soon: ELVIS". comp.editors. (Web link). Retrieved 2010-12-29.  (discusses January comp.os.minix posting, and design goals)
  25. ^ a b c Robbins, Arnold; Hannah, Elbert; Lamb, Linda (2008). "Chapter 16: nvi: New vi". Learning the vi and vim editors (7th ed.). O'Reilly Media, Inc.. pp. 307–308. ISBN 059652983X. http://books.google.com/books?id=Eb8J3BONVxAC&pg=PA307. Retrieved 2010-12-29. 
  26. ^ Changes file, from Traditional Vi by Gunnar Ritter
  27. ^ Caldera License for 32-bit 32V UNIX and 16 bit UNIX Versions 1, 2, 3, 4, 5, 6, 7
  28. ^ "Ask Tim Archive". O'Reilly. June 21, 1999. http://www.oreilly.com/pub/a/oreilly/ask_tim/1999/unix_editor.html. 
  29. ^ http://ex-vi.cvs.sourceforge.net/
  30. ^ "Traditional ex/vi". FreshMeat.net. http://freshmeat.net/projects/vi. Retrieved 2010-12-31. 
  31. ^ "editors/2bsd-vi". FreshPorts.org. http://www.freshports.org/editors/2bsd-vi/. Retrieved 2010-12-31. 
  32. ^ "Portfile for ex-vi". MacPorts.org. http://trac.macports.org/browser/trunk/dports/editors/ex-vi/Portfile. Retrieved 2010-12-31. 
  33. ^ "ex-vi package". OpenPKG Foundation e.V.. http://www.openpkg.org/product/packages/?package=ex-vi. Retrieved 2010-12-31. 
  34. ^ "Vim documentation: options". vim.net/sourceforge.net. http://vimdoc.sourceforge.net/htmldoc/options.html#'compatible'. Retrieved January 30, 2009. 
  35. ^ "Vim documentation: starting". vim.net/sourceforge.net. http://vimdoc.sourceforge.net/htmldoc/starting.html#compatible-default. Retrieved January 30, 2009. 
  36. ^ Verdoolaege, Sven. "Development versions of nvi". http://www.kotnet.org/~skimo/nvi/devel/. Retrieved 2011-01-01. 
  37. ^ Bostic, Keith. "Berkeley Vi Editor Home Page". https://sites.google.com/a/bostic.com/keithbostic/nvi. Retrieved 2011-01-01. 

Further reading

External links