You are on page 1of 797

Draft Not for publication

Draft 0.1

Not for widespread publication

The Vim
Tutorial and
Reference
By Steve Oualline

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 1

Draft Not for publication

Draft 0.1

Not for widespread publication

Table of Contents
Introduction.............................................................................................. 26
Chapter 1:Basic Editing............................................................................28
Chapter 2:Editing a Little Faster..............................................................42
Chapter 3:Searching.................................................................................59
Chapter 4:Text Blocks and Multiple Files.................................................69
Chapter 5:Windows and Tabs....................................................................83
Chapter 6:Basic Visual Mode....................................................................99
Chapter 7:Commands for Programmers.................................................110
Chapter 8:Basic Abbreviations, Keyboard Mapping, and Initialization
Files......................................................................................................... 147
Chapter 9:Basic Command-Mode Commands.........................................158
Chapter 10:Basic GUI Usage...................................................................167
Chapter 11:Dealing with Text Files........................................................173
Chapter 12:Automatic Completion.........................................................190
Chapter 13:Autocommands.....................................................................200
Chapter 14:File Recovery and Command-Line Arguments.....................208
Chapter 15:Miscellaneous Commands....................................................223
Chapter 16:Cookbook..............................................................................229
Chapter 17:Topics Not Covered..............................................................244
Chapter 18:Complete Basic Editing........................................................257
Chapter 19:Advanced Searching Using Regular Expressions.................286
Chapter 20:Advanced Text Blocks and Multiple Files............................304
Chapter 21:All About Windows, Tabs, and Sessions...............................331
Chapter 22:Advanced Visual Mode.........................................................347
Chapter 23:Advanced Commands for Programmers...............................359
Chapter 24:All About Abbreviations and Keyboard Mapping.................413
Chapter 25:Complete Command-Mode (:) Commands...........................421
Chapter 26:Advanced GUI Commands....................................................446
Chapter 27:Expressions and Functions..................................................480
Chapter 28:Customizing the Editor........................................................527
Chapter 29:Language-Dependent Syntax Options..................................557
Chapter 30:How to Write a Syntax File...................................................580
Appendix A: Installing Vim.....................................................................592
Appendix B: The <> Key Names.............................................................599
Appendix C: Normal-Mode Commands...................................................602
Appendix D: Command-Mode Commands...............................................627
Appendix E: Visual-Mode Commands.....................................................727
Appendix F: Insert Mode Commands......................................................731
Appendix G: Option List..........................................................................735
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 2

Draft Not for publication

Draft 0.1

Not for widespread publication

Appendix H: Vim License Agreement......................................................763


Appendix I: Basic Vim Quick Reference.................................................765
Appendix J: Vim Quick Reference...........................................................766
7

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 3

Draft Not for publication

Draft 0.1

Not for widespread publication

Detail Table of Contents


Introduction.......................................................................................................26
Copyright and License Information...............................................................26
Part I Tutorial........................................................................................... 27
Chapter 1:Basic Editing.....................................................................................28
Before You Start............................................................................................28
Running Vim for the First Time.....................................................................29
The vim Command.....................................................................................29
Modes.........................................................................................................30
Editing for the First Time..............................................................................30
Inserting Text.............................................................................................30
Getting Out of Trouble...............................................................................31
Moving Around...........................................................................................31
Aliases........................................................................................................32
Deleting Characters.......................................................................................33
Undo and Redo...............................................................................................34
Getting Out.................................................................................................35
Discarding Changes...................................................................................35
Other editing Commands...............................................................................35
Inserting Characters at the End of a Line.................................................36
Deleting a Line...........................................................................................36
Opening Up New Lines..............................................................................37
Help................................................................................................................37
Help Language...........................................................................................40
Other Ways to Get Help.............................................................................40
Using a Count to Edit Faster.........................................................................41
The Vim Tutorial............................................................................................41
Summary........................................................................................................41
Chapter 2:Editing a Little Faster......................................................................42
Word Movement.............................................................................................42
Moving to the Start or End of a Line.............................................................43
Searching Along a Single Line.......................................................................44
Moving to a Specific Line..............................................................................45
Telling Where You Are in a File.....................................................................46
Where Am I?...............................................................................................47
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 4

Draft Not for publication

Draft 0.1

Not for widespread publication

Scrolling Up and Down..................................................................................48


Deleting Text..................................................................................................49
Deleting Text Without Visual Mode...........................................................49
Where to Put the Count (3dw or d3w).......................................................50
Visual vs. Normal Mode Delete..................................................................51
Changing Text................................................................................................51
The . Command..............................................................................................53
Joining Lines .................................................................................................53
Replacing Characters....................................................................................54
Changing Case...............................................................................................55
Keyboard Macros...........................................................................................55
Digraphs.........................................................................................................57
Chapter 3:Searching..........................................................................................59
Simple Searches............................................................................................59
Search History...............................................................................................60
History Window..........................................................................................60
Searching Options..........................................................................................61
Highlighting...............................................................................................61
Incremental Searches................................................................................62
Searching Backward..................................................................................64
Reverse Search History..............................................................................64
Changing Direction........................................................................................64
Basic Regular Expressions.............................................................................65
The Beginning (^) and End ($) of a Line...................................................65
Match Any Single Character (.)..................................................................67
Matching Special Characters.....................................................................67
Regular Expression Summary....................................................................68
Chapter 4:Text Blocks and Multiple Files.........................................................69
Cut, Paste, and Copy......................................................................................69
Character Twiddling......................................................................................70
More on "Putting"......................................................................................71
Moving Large Blocks of Text.........................................................................71
Marks.............................................................................................................72
Where Are the Marks?...............................................................................73
Yanking..........................................................................................................74
Normal Mode Yanking...............................................................................74
Yanking Lines.............................................................................................76
Filtering.........................................................................................................76
Normal Mode Filtering...............................................................................76
Editing Another File.......................................................................................77
The :view Command.......................................................................................77
Dealing with Multiple Files............................................................................78
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 5

Draft Not for publication

Draft 0.1

Not for widespread publication

Which File Am I On?......................................................................................79


Going Back a File.......................................................................................80
Editing the First or Last File......................................................................80
Editing Two Files.......................................................................................81
Matching........................................................................................................81
Chapter 5:Windows and Tabs............................................................................83
Opening a New Window.................................................................................83
Vertical Windows.......................................................................................84
Opening Another Window with Another File.............................................86
Quick Split..................................................................................................86
Controlling Window Size............................................................................87
Split Summary............................................................................................87
The :new Command.......................................................................................88
Split and View................................................................................................88
Changing Window Size..................................................................................88
Buffers............................................................................................................90
Selecting a Buffer.......................................................................................92
Buffer Types...................................................................................................94
Buffer Options................................................................................................94
Basic Tabbed Editing.....................................................................................96
Selecting a tab...........................................................................................97
Finding Files with Tabs..............................................................................98
Editing Multiple Files From the Command Line...........................................98
Chapter 6:Basic Visual Mode............................................................................99
Entering Visual Mode....................................................................................99
The Three Visual Modes..............................................................................100
Leaving Visual Mode....................................................................................101
Editing with Visual Mode.............................................................................102
Deleting Text in Visual Mode...................................................................102
Yanking Text.............................................................................................103
Switching Modes..........................................................................................103
Changing Text..........................................................................................103
Joining Lines.............................................................................................103
Commands for Programmers.......................................................................104
Keyword Lookup......................................................................................104
Visual Block Mode.......................................................................................105
Inserting Text...............................................................................................105
Changing Text..............................................................................................106
Replacing.....................................................................................................108
Shifting.........................................................................................................108
Visual Block Help.....................................................................................109

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 6

Draft Not for publication

Draft 0.1

Not for widespread publication

Chapter 7:Commands for Programmers..........................................................110


Syntax Coloring............................................................................................110
Syntax Coloring Problems........................................................................111
Matching Pairs.............................................................................................112
Shift Commands...........................................................................................114
Automatic Indentation.................................................................................115
C Indentation............................................................................................115
Smartindent.............................................................................................117
Autoindent................................................................................................117
The = Command..........................................................................................118
Diff Mode.....................................................................................................119
Folding.........................................................................................................121
Locating Items in a Program.......................................................................124
Instant Word Searches Including #include Files ([CTRL-I, ]CTRL-I)......125
Jumping to a Variable Definition (gd, gD)................................................125
Jump to Macro Definition ([CTRL-D, ]CTRL-D)........................................126
Displaying Macro Definitions ([d, ]d, [D, ]D)...........................................126
Shifting a Block of Text Enclosed in {}.......................................................128
Indenting a Block Using Visual Mode..........................................................129
Finding the man Pages................................................................................129
Tags..............................................................................................................130
Help and Tags..........................................................................................133
Windows and Tags...................................................................................133
Finding a Procedure When You Only Know Part of the Name.................134
Shorthand Commands..............................................................................136
The Care and Feeding of Makefiles.............................................................136
Sorting a List of Files...............................................................................137
Sorting a List in Visual Mode...................................................................139
Making the Program....................................................................................140
The :make command................................................................................140
The 'errorfile' Option................................................................................143
Searching for a Given String.......................................................................144
Vim and outside edits..................................................................................145
Other Interesting Commands......................................................................146
Chapter 8:Basic Abbreviations, Keyboard Mapping, and Initialization Files..147
Abbreviations...............................................................................................147
Listing Your Abbreviations.......................................................................148
Mapping.......................................................................................................148
Listing Your Mappings.................................................................................149
Fixing the Way Delete Works......................................................................150
Controlling What the Backspace Key Does..................................................150
Saving Your Setting.....................................................................................151
My .vimrc File..............................................................................................154
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 7

Draft Not for publication

Draft 0.1

Not for widespread publication

Script Files...................................................................................................156
Chapter 9:Basic Command-Mode Commands.................................................158
Entering Command-Line Mode....................................................................158
The Print Command.....................................................................................159
Ranges......................................................................................................159
Marks.......................................................................................................160
Visual-Mode Range Specification.............................................................161
Substitute Command...................................................................................161
How to Change Last, First to First, Last..................................................163
Reading and Writing Files...........................................................................164
Saving the file under a new name...............................................................164
The :shell Command....................................................................................164
Printing the file............................................................................................165
Chapter 10:Basic GUI Usage...........................................................................167
Starting Vim in GUI Mode...........................................................................167
Mouse Usage................................................................................................168
X Mouse Behavior ...................................................................................169
Microsoft Windows Mouse Behavior........................................................169
Special Mouse Usage...............................................................................169
Tear-Off Menus............................................................................................170
Toolbar.........................................................................................................171
Showing the cursor......................................................................................172
Chapter 11:Dealing with Text Files.................................................................173
Automatic Text Wrapping............................................................................173
Text Formatting Commands........................................................................175
Justifying Text..............................................................................................177
Fine-Tuning the Formatting.........................................................................177
The joinspaces Option..............................................................................177
The formatoptions Option........................................................................178
Formatting and numbered list.................................................................181
Using an External Formatting Program......................................................181
Basic Spelling..............................................................................................181
Finding Spelling Errors............................................................................183
Spelling Language....................................................................................183
Word Lists................................................................................................183
Mulitple word lists...................................................................................184
File Formats.................................................................................................185
Changing How the Last Line Ends..............................................................186
Troff-Related Movement..............................................................................186
Section Moving............................................................................................188
Defining Sections.....................................................................................188
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 8

Draft Not for publication

Draft 0.1

Not for widespread publication

Encrypting with rot13..................................................................................189


Chapter 12:Automatic Completion..................................................................190
Automatic Completion.................................................................................190
How Vim Searches for Words......................................................................191
Searching Forward......................................................................................191
Automatic Completion Details.....................................................................191
Automatic Completion Details.....................................................................192
The Include Path .....................................................................................192
Specifying a Dictionary ...........................................................................192
Controlling What Is Searched For...............................................................193
Tag Search...............................................................................................195
Finding Filenames....................................................................................197
Line Mode................................................................................................198
Dictionary and Thesaurus........................................................................198
Guessing...................................................................................................198
User and Omni completion.......................................................................199
Adjusting the Screen................................................................................199
Chapter 13:Autocommands.............................................................................200
Basic Autocommands...................................................................................200
Groups..........................................................................................................201
Events..........................................................................................................202
File Patterns.................................................................................................205
Nesting.........................................................................................................205
Listing Autocommands................................................................................206
Removing Commands..................................................................................207
Ignoring Events............................................................................................207
Chapter 14:File Recovery and Command-Line Arguments.............................208
Command-Line Arguments..........................................................................208
Encryption....................................................................................................209
Switching Between Encrypted and Unencrypted Modes ........................210
Limits on Encryption ...............................................................................210
Executing Vim in a Script or Batch File......................................................211
Additional Command-Line Arguments.........................................................211
Foreign Languages......................................................................................213
Backup Files.................................................................................................214
Skipping the backup................................................................................215
Controlling How the File Is Written............................................................215
Basic File Recovery......................................................................................216
Recovering from the Command Line...........................................................218
Advanced Swap File Management...........................................................219
Controlling When the Swap File Is Written.............................................219
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 9

Draft Not for publication

Draft 0.1

Not for widespread publication

Controlling Where the Swap File Is Written............................................220


Advanced File Writing.................................................................................220
Saving Your Work........................................................................................221
The :recover Command................................................................................221
MS-DOS Filenames..................................................................................222
readonly and modified Options....................................................................222
Chapter 15:Miscellaneous Commands............................................................223
Printing the Character.................................................................................223
Going to a Specific Character in the File....................................................223
Screen Redraw.............................................................................................224
Sleep............................................................................................................224
Terminal Control..........................................................................................224
Suspending the Editor.................................................................................224
General Help................................................................................................224
Other Help Commands.............................................................................225
Nvi Compatibility Commands..................................................................225
Window Size.................................................................................................225
Executing commands without changing things...........................................225
Signs............................................................................................................225
Viewing the Introduction Screen.................................................................227
Open Mode...................................................................................................228
Chapter 16:Cookbook......................................................................................229
Character Twiddling....................................................................................229
Replacing One Word with Another Using One Command...........................229
Interactively Replacing One Word with Another.........................................230
Alternate Method.....................................................................................231
Moving Text.................................................................................................231
Copying a Block of Text from One File to Another......................................232
Method 1: Two Windows with Traditional Vi-Style Commands...............232
Method 2: Two Windows Using Visual Mode...........................................233
Method 3: Two Different Vim Programs..................................................233
Sorting a Section.........................................................................................234
Sorting the old Vi way:.............................................................................235
Finding a Procedure in a C Program...........................................................236
Drawing Comment Boxes.............................................................................237
Reading a UNIX man Page..........................................................................238
Trimming the Blanks off an End-of-Line......................................................239
Oops, I Left the File Write-Protected...........................................................239
Changing Last, First to First Last................................................................239
How to Edit All the Files that Contain a Given Word..................................242
Finding All Occurrences of a Word Using the Built-in Search Commands. 242

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 10

Draft Not for publication

Draft 0.1

Not for widespread publication

Chapter 17:Topics Not Covered......................................................................244


Interfaces to Other Applications..................................................................244
Cscope......................................................................................................244
MzScheme................................................................................................245
Netbeans..................................................................................................246
OLE...........................................................................................................246
Perl...........................................................................................................246
Python......................................................................................................247
Python Interface Command Reference....................................................247
Ruby.........................................................................................................247
Sniff+.......................................................................................................247
Sun Visual WorkShop...............................................................................248
Tcl.............................................................................................................248
Foreign Languages......................................................................................249
Input Method............................................................................................251
Arabic.......................................................................................................251
Chinese.....................................................................................................252
Farsi ........................................................................................................252
Hebrew.....................................................................................................253
Japanese...................................................................................................254
Korean......................................................................................................254
Binary Files..................................................................................................254
Modeless (Almost) Editing...........................................................................255
Operating System File Modes......................................................................255
Part II Reference.....................................................................................256
Chapter 18:Complete Basic Editing................................................................257
Word Movement...........................................................................................257
Move to the End of a Word......................................................................257
Defining What a Word Is..........................................................................258
Special Characters for the iskeyword Option..........................................259
Other Types of Words..............................................................................260
There Are "words," and Then There Are "WORDS".................................260
Beginning of a Line......................................................................................261
Repeating Single-Character Searches.........................................................261
Moving Lines Up and Down.........................................................................262
Cursor-Movement Commands.....................................................................262
Jumping Around...........................................................................................263
Using the Change List..............................................................................264
Controlling Some Commands......................................................................264
Where Am I, in Detail...................................................................................265
Scrolling Up.................................................................................................266
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 11

Draft Not for publication

Draft 0.1

Not for widespread publication

Scrolling Up Summary.............................................................................267
Scrolling Down.............................................................................................268
Define How Much to Scroll..........................................................................268
Adjusting the View.......................................................................................269
Delete to the End of the Line.......................................................................271
The C Command...........................................................................................272
The s Command...........................................................................................272
The S Command...........................................................................................272
Deleting Text................................................................................................273
Insert Text at the Beginning or End of the Line..........................................274
Arithmetic....................................................................................................274
Joining Lines with Spaces............................................................................275
Replace Mode..............................................................................................275
Virtual Editing..............................................................................................276
Replace Mode...........................................................................................278
Digraphs.......................................................................................................278
Changing Case.............................................................................................279
Other Case-Changing Commands................................................................280
Advanced Undo............................................................................................280
Undo Time Machine.................................................................................280
Undo Level...............................................................................................281
Change Sets and Branching.....................................................................281
Getting Out..................................................................................................284
Chapter 19:Advanced Searching Using Regular Expressions.........................286
Searching Options........................................................................................286
Case Sensitivity .......................................................................................286
Wrapping..................................................................................................288
Turning Off Search Wrapping .................................................................289
Interrupting Searches..................................................................................289
Instant Word Searches................................................................................289
Search Offsets..............................................................................................290
Specifying Offsets....................................................................................292
Complete Regular Expressions....................................................................293
Beginning (\<) and End (\>) of a Word....................................................293
Modifiers and Grouping...........................................................................294
Special Atoms...........................................................................................295
Character Ranges.....................................................................................296
Character Classes....................................................................................297
Repeat Modifiers......................................................................................297
Repeating as Little as Possible................................................................297
Grouping ( \(\) )........................................................................................298
The Or Operator (\|).................................................................................298
Putting It All Together.............................................................................299
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 12

Draft Not for publication

Draft 0.1

Not for widespread publication

The 'magic' Option...................................................................................299


Offset Specification Reference....................................................................300
Regular Expressions Reference...................................................................300
Simple Atoms...........................................................................................300
Range Atoms............................................................................................300
Character Classes....................................................................................301
Patterns (Used for Substitutions)............................................................301
Special Character Atoms..........................................................................301
Modifiers..................................................................................................302
Chapter 20:Advanced Text Blocks and Multiple Files.....................................304
Additional Put Commands...........................................................................304
Special Marks..............................................................................................305
Manipulating Marks.................................................................................306
Multiple Registers........................................................................................306
Appending Text............................................................................................308
Special Registers.........................................................................................308
The Black Hole Register (_).....................................................................310
The Expression Register (=)....................................................................310
The Clipboard Register (*).......................................................................311
How to Edit All the Files That Contain a Given Word.................................311
Editing a Specific File..................................................................................312
Changing the File List..................................................................................312
The +cmd Argument....................................................................................312
Defining the file list (arguments).................................................................313
Local and Global argument Lists.............................................................314
Global Marks................................................................................................315
Advanced Text Entry....................................................................................317
Movement.................................................................................................317
Inserting Text...........................................................................................317
Inserting a Register.................................................................................319
Leaving Insert Mode................................................................................319
The .viminfo File..........................................................................................320
Dealing with Long Lines..............................................................................322
Wrapping..................................................................................................327
Spelling Dictionaries....................................................................................328
Dumping dictionaries...............................................................................329
Customizing the spelling system..............................................................329
Chapter 21:All About Windows, Tabs, and Sessions.......................................331
Moving Between Windows...........................................................................331
Moving Windows Up and Down...................................................................332
Performing Operations on All Windows.......................................................334
Other Window Commands...........................................................................335
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 13

Draft Not for publication

Draft 0.1

Not for widespread publication

Editing the Alternate File............................................................................336


Split Search..................................................................................................337
Shorthand Commands..................................................................................337
Other Window Commands...........................................................................338
Advanced Buffers.........................................................................................338
Adding a Buffer........................................................................................338
Deleting a Buffer......................................................................................339
Unloading a Buffer...................................................................................339
Opening a Window for Each Buffer.........................................................339
Windowing Options......................................................................................340
Controling a split......................................................................................341
Tabs..............................................................................................................342
Executing a command for all tabs............................................................342
Other tab commands................................................................................342
Customzing tabs.......................................................................................343
Tabs without the GUI...............................................................................344
Sessions.......................................................................................................344
Specifying What Is Saved in a Session....................................................345
Views............................................................................................................346
Chapter 22:Advanced Visual Mode.................................................................347
Visual Mode and Registers..........................................................................347
The $ Command...........................................................................................347
Repeating a Visual Selection.......................................................................348
Selecting Objects.........................................................................................349
Moving to the Other End of a Selection......................................................351
Case Changes...............................................................................................353
Joining Lines................................................................................................353
Formatting a Block......................................................................................354
The Encode (g?) Command..........................................................................354
The Colon (:) Commands..............................................................................355
Pipe (!) Command........................................................................................355
Select Mode.................................................................................................356
Deleting the Selection..............................................................................357
Replacing Text.........................................................................................357
Switching Modes......................................................................................358
Avoiding Automatic Reselection..................................................................358
Chapter 23:Advanced Commands for Programmers.......................................359
Removing an Automatic Indentation...........................................................360
Inserting Indent...........................................................................................361
Inserting Registers......................................................................................361
To Tab or Not to Tab....................................................................................363
Spaces and Tabs.......................................................................................364
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 14

Draft Not for publication

Draft 0.1

Not for widespread publication

Smart Tabs...............................................................................................364
Using a Different Tab Stop......................................................................366
No Tabs....................................................................................................366
The 'copyindent' and 'preserveindent' Options........................................367
The :retab Command................................................................................367
Modelines.................................................................................................368
Shift Details.................................................................................................368
Specifying a Formatting Program...............................................................369
Formatting Comments.................................................................................369
Defining a Comment....................................................................................370
Customizing the C Indentation....................................................................372
The 'cinoptions' Options...........................................................................373
The 'cinwords' Option..............................................................................379
Advanced Diff Mode.....................................................................................379
Moving from difference to difference......................................................380
Moving Differences Around.....................................................................380
Customizing Diff.......................................................................................380
Comparing Two Files The Old Fashioned Way............................................381
Advanced Folding........................................................................................383
Additional fold commands........................................................................385
Toggling folds...........................................................................................385
Enabling and disabling folding................................................................386
Moving around folds................................................................................386
Executing a command for all folds...........................................................386
Customizing folds.....................................................................................386
Controlling what opens and closes folds..................................................387
Fold Methods ..........................................................................................387
The Preview Window...................................................................................388
Match Options..............................................................................................390
Showing Matches.........................................................................................390
Finding Unmatched Characters...................................................................390
Method Location..........................................................................................391
Movement....................................................................................................391
Comment Moves.......................................................................................392
Dealing with Multiple Directories................................................................392
The include Path .....................................................................................395
Checking the Path....................................................................................395
Defining a Definition................................................................................397
Locating include Files..............................................................................398
Multiple Error Lists.....................................................................................398
Manipulating the quick fix list.....................................................................399
Local error lists........................................................................................400
Customizing the :make Command...............................................................402
The Error Format.....................................................................................402
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 15

Draft Not for publication

Draft 0.1

Not for widespread publication

The 'switchbuf' Option.............................................................................406


Customizing :grep........................................................................................406
Defining How a Tag Search Is Done............................................................407
Customizing the Syntax Highlighting..........................................................407
Black-and-White Terminals......................................................................408
Color Terminals........................................................................................408
GUI Definition..........................................................................................409
Combining Definitions..............................................................................410
Syntax Elements.......................................................................................410
Color Chart...............................................................................................411
The 'syntax' Option......................................................................................412
Chapter 24:All About Abbreviations and Keyboard Mapping.........................413
Removing an Abbreviation...........................................................................413
Abbreviations for Certain Modes.............................................................414
Listing Abbreviations...............................................................................414
Forcing Abbreviation Completion................................................................415
Mapping and Modes....................................................................................415
Other :map Commands............................................................................416
Undoing a Mapping..................................................................................417
Clearing Out a Map..................................................................................417
Listing the Mappings...............................................................................418
Recursive Mapping..................................................................................419
Remapping Abbreviations............................................................................419
Language Dependent Mappings..............................................................419
The usual suite of commands applies. :map Mode Table.......................419
Chapter 25:Complete Command-Mode (:) Commands....................................421
Advanced Command Entry..........................................................................421
Editing Commands.......................................................................................421
Other Ways to Specify Ranges.................................................................423
Deleting with a Count..............................................................................424
Copy and Move............................................................................................424
Inserting Text...............................................................................................426
Printing with Line Numbers........................................................................427
Printing with list Enabled............................................................................427
Print the Text and Then Some.....................................................................428
Substitute.....................................................................................................428
Substitute flags........................................................................................431
Making g the Default...................................................................................431
Global Changes............................................................................................432
Commands for Programs.............................................................................432
Include File Searches...............................................................................432
Jumping to Macro Definitions..................................................................433
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 16

Draft Not for publication

Draft 0.1

Not for widespread publication

Split the Window and Go to a Macro Definition......................................434


Listing the Macros...................................................................................434
Listing the First Definition.......................................................................434
Override Option (!)...................................................................................434
Directory Manipulation................................................................................435
Current File..................................................................................................436
Advanced :write Commands........................................................................437
Updating Files..............................................................................................438
Reading Files...............................................................................................438
Register Execution.......................................................................................438
Simple Edits.................................................................................................439
Shifting.....................................................................................................439
Changing Text..........................................................................................439
Entering Insert Mode...............................................................................439
Joining Lines.............................................................................................439
Yanking Text.............................................................................................439
Putting Text..............................................................................................439
Undo/Redo................................................................................................440
Marks.......................................................................................................440
Miscellaneous Commands............................................................................440
The :preserve Command..........................................................................440
The Shell Commands................................................................................440
Shell Configuration..................................................................................441
Command History....................................................................................441
Setting the Number of Remembered Commands....................................443
Viewing Previous Error Messages...........................................................443
Redirecting the Output............................................................................443
Executing a :normal Command................................................................444
Getting Out..................................................................................................444
Write and Quit.............................................................................................444
Advanced Hardcopy.....................................................................................445
Chapter 26:Advanced GUI Commands............................................................446
Switching to the GUI Mode.........................................................................446
Window Size and Position............................................................................446
Microsoft Windows Size and Position Command-Line Specification.......448
Moving the Window.................................................................................448
Window Size.............................................................................................448
The :winsize Command............................................................................448
The 'guioptions'............................................................................................449
Changing the Toolbar...............................................................................454
Customizing the Icon...............................................................................455
Mouse Customization...................................................................................457
Mouse Focus............................................................................................457
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 17

Draft Not for publication

Draft 0.1

Not for widespread publication

The 'mousemodel' Option.........................................................................457


Mouse Configuration................................................................................458
Mouse Mapping........................................................................................458
Double-Click Time....................................................................................459
Hiding the Mouse Cursor.........................................................................459
Select Mode.................................................................................................459
Custom Menus.............................................................................................460
Special Menu Names...............................................................................462
Limiting the Maximum Number of Generated Items...............................462
Toolbar Icons............................................................................................462
Toolbar Tips.............................................................................................464
Listing Menu Mappings...........................................................................464
Executing a Menu Item............................................................................466
No Remapping Menus..............................................................................466
Removing Menu Items.............................................................................466
Tearing Off a Menu..................................................................................467
Translating A Menu..................................................................................467
Special GUI Commands...............................................................................468
The File Browsers....................................................................................468
Finding a String.......................................................................................470
Replace Dialog Box..................................................................................470
Finding Help.............................................................................................471
Confirmation............................................................................................471
Browsing the Options...............................................................................472
Using the Clipboard.....................................................................................474
Coloring.......................................................................................................475
Selecting the Font........................................................................................475
Customizing Select Mode............................................................................476
Mouse Usage in Insert Mode.......................................................................476
Microsoft Windows - Specific Commands....................................................476
Changing the Appearance of the Cursor.....................................................476
Line spacing.................................................................................................478
X Windows System - Specific Commands....................................................479
Selecting the Connection with :shell Commands........................................479
MS-DOS-Specific Commands.......................................................................479
Chapter 27:Expressions and Functions...........................................................480
Basic Variables and Expressions.................................................................480
Special Variable Names...........................................................................481
Constants.................................................................................................482
Expressions..............................................................................................483
Deleting a Variable ..................................................................................485
Locking and unlocking a variable............................................................485
Locking Arrays and Dictionaries..............................................................486
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 18

Draft Not for publication

Draft 0.1

Not for widespread publication

Entering Commands....................................................................................486
How to Experiment..................................................................................487
The :echo Statement....................................................................................487
Echoing in Color.......................................................................................488
Printing error messages using :echoerr......................................................488
Echoing message.........................................................................................488
Control Statements......................................................................................489
The :if Statement......................................................................................489
Looping.....................................................................................................490
The :for Loop............................................................................................490
The :execute Command............................................................................491
Exceptions....................................................................................................491
Defining Your Own Function.......................................................................492
Using a Function......................................................................................494
Function Options......................................................................................494
Listing Functions......................................................................................495
Deleting a Function..................................................................................495
Running Functions in a Sandbox.................................................................496
Debugging a Function..................................................................................496
Other debugging commands....................................................................499
Redrawing the screen..............................................................................500
Profiling a function......................................................................................500
Other Profile Commands..........................................................................502
Deleting Profile Items..............................................................................502
User-Defined Commands.............................................................................502
The Operator Function................................................................................504
Built-In Functions........................................................................................505
Obsolete Functions......................................................................................525
Plugins and other scripts.............................................................................525
Chapter 28:Customizing the Editor.................................................................527
Setting..........................................................................................................527
Boolean Options.......................................................................................527
Numeric Options......................................................................................528
String-Related Commands.......................................................................529
Another Set Command.................................................................................530
Other :set Arguments...............................................................................530
Chaining Commands................................................................................531
Automatically Setting Options in a File...................................................531
Local .vimrc Files.........................................................................................532
Customizing Keyboard Usage......................................................................533
Microsoft Windows...................................................................................533
Customizing Keyboard Mappings............................................................534
Confirmation................................................................................................535
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 19

Draft Not for publication

Draft 0.1

Not for widespread publication

Customizing Messages.................................................................................535
Showing the Mode.......................................................................................536
Showing Partial Commands.........................................................................536
Short Messages............................................................................................537
The 'terse' Option.........................................................................................538
The "File Modified" Warning.......................................................................538
Error Bells....................................................................................................538
Status Line Format......................................................................................539
Rulers...........................................................................................................542
Reporting Changes......................................................................................542
Help Window Height....................................................................................543
Preview Window Height..............................................................................543
Defining How 'list' Mode Works..................................................................543
Changing the line number size....................................................................544
Changing the Highlighting..........................................................................544
The 'more' Option........................................................................................546
Number Format...........................................................................................546
Restoring the Screen...................................................................................546
Pasting Text.................................................................................................546
Wildcards.....................................................................................................547
Customizing Behavior of the Screen Movement Commands.......................551
File Writing Options.....................................................................................551
Memory Options...........................................................................................551
Function Execution Options.........................................................................551
Terminal Options.........................................................................................551
Terminal Name.........................................................................................552
Lazy Redraw.............................................................................................552
Internal Termcap......................................................................................552
Fast Terminals..........................................................................................552
Mouse Usage Inside a Terminal...............................................................552
How Much to Scroll..................................................................................552
Some More Obscure Options.......................................................................553
Compatibility............................................................................................553
Weirdinvert..............................................................................................554
Debugging................................................................................................554
Production....................................................................................................555
Keyboard Mapping.......................................................................................555
Encoding......................................................................................................555
Macintosh Silliness......................................................................................556
Obsolete Options..........................................................................................556
Legacy Options............................................................................................556
Chapter 29:Language-Dependent Syntax Options..........................................557
Abel..............................................................................................................557
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 20

Draft Not for publication

Draft 0.1

Not for widespread publication

Ada...............................................................................................................557
Ant................................................................................................................558
Apache.........................................................................................................558
Assembly Language.....................................................................................559
ASP...............................................................................................................560
BaaN............................................................................................................560
Basic.............................................................................................................560
C and C++...................................................................................................560
Doxygen....................................................................................................562
CH................................................................................................................563
Chill..............................................................................................................563
Changelog....................................................................................................563
COBOL.........................................................................................................563
Cold Fusion..................................................................................................563
CSH / TCSH.................................................................................................564
CYNLIB........................................................................................................564
CWEB...........................................................................................................564
Desktop .......................................................................................................564
Dircolors......................................................................................................564
DocBook.......................................................................................................564
DosBatch......................................................................................................565
Doxygen.......................................................................................................565
DTD..............................................................................................................565
Eiffel.............................................................................................................565
ERLANG.......................................................................................................566
FlexWiki.......................................................................................................566
Form.............................................................................................................566
Fortran.........................................................................................................566
FVWM..........................................................................................................567
Haskell.........................................................................................................567
HTML...........................................................................................................567
Inform..........................................................................................................568
IDL (Interface Definition Language)............................................................568
Java..............................................................................................................568
Lace..............................................................................................................569
Lex...............................................................................................................570
Lisp .............................................................................................................570
Lite...............................................................................................................570
LPC...............................................................................................................570
LUA..............................................................................................................570
Mail..............................................................................................................571
Make............................................................................................................571
Maple...........................................................................................................571
Mathematica................................................................................................571
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 21

Draft Not for publication

Draft 0.1

Not for widespread publication

Moo..............................................................................................................572
MSQL...........................................................................................................572
NCF .............................................................................................................572
Nroff.............................................................................................................572
OCAML.........................................................................................................572
Papp.............................................................................................................573
Pascal...........................................................................................................573
Perl...............................................................................................................573
Php3/ Php4...................................................................................................574
PlainTex.......................................................................................................574
PPWizard......................................................................................................575
Phtml............................................................................................................575
PostScript.....................................................................................................575
Printcap and Termcap..................................................................................575
Progress.......................................................................................................575
Python..........................................................................................................576
Quake...........................................................................................................576
ReadLine......................................................................................................576
Rexx.............................................................................................................576
Ruby.............................................................................................................576
Scheme.........................................................................................................577
SDL..............................................................................................................577
Sed...............................................................................................................577
SGML...........................................................................................................577
Shell.............................................................................................................577
Speedup.......................................................................................................578
TCsh.............................................................................................................578
TeX...............................................................................................................578
TinyFugue....................................................................................................578
Vim...............................................................................................................578
XF86Config..................................................................................................579
Xml...............................................................................................................579
Chapter 30:How to Write a Syntax File...........................................................580
Basic Syntax Commands..............................................................................580
Defining Matches.........................................................................................581
Defining Regions..........................................................................................581
Nested Regions............................................................................................582
Multiple Group Options...............................................................................583
Transparent Matches...............................................................................584
Other Matches.............................................................................................585
Match Groups..............................................................................................585
Match Offsets...............................................................................................586
Clusters........................................................................................................586
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 22

Draft Not for publication

Draft 0.1

Not for widespread publication

Including Other Syntax Files.......................................................................587


Listing Syntax Groups..................................................................................588
Synchronization...........................................................................................588
Adding Your Syntax File to the System.......................................................590
Option Summary..........................................................................................590
Appendix A: Installing Vim..............................................................................592
UNIX............................................................................................................592
Unpacking the sources.............................................................................592
Running configure....................................................................................592
Dealing with common installation problems............................................595
Installation for Each UNIX User..............................................................596
Installing on Microsoft Windows.................................................................597
Common Installation Problems and Questions............................................597
I Do Not Have Root Privileges. How Do I Install Vim? (UNIX)................597
The Colors Are Not Right on My Screen. (UNIX)....................................597
I Am Using RedHat Linux. Can I Use the Vim That Comes with the
System?....................................................................................................598
How Do I Turn Syntax Coloring On? (All)................................................598
What Is a Good vimrc File to Use? (All)...................................................598
Appendix B: The <> Key Names.....................................................................599
The Function Keys.......................................................................................599
Line Endings................................................................................................599
Editing Keys.................................................................................................599
Arrow Keys...................................................................................................599
Keypad Keys.................................................................................................599
VT100 Special Keys.....................................................................................599
Printable Characters....................................................................................600
Other Keys...................................................................................................600
Termcap Entries..........................................................................................600
Mouse Actions..............................................................................................600
Modifiers......................................................................................................600
Mouse Modifiers..........................................................................................600
Appendix C: Normal-Mode Commands...........................................................602
Motion Commands.......................................................................................625
Appendix D: Command-Mode Commands.......................................................627
:map Mode Table.........................................................................................725
Modes.......................................................................................................725
Appendix E: Visual-Mode Commands..............................................................727
Visual Block Commands...............................................................................729
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 23

Draft Not for publication

Draft 0.1

Not for widespread publication

Starting Select Mode...................................................................................729


Select Mode Commands..............................................................................729
Appendix F: Insert Mode Commands..............................................................731
Appendix G: Option List...................................................................................735
- A -...............................................................................................................735
- B -...............................................................................................................736
- C -...............................................................................................................737
- D -...............................................................................................................739
- E -...............................................................................................................740
- F-................................................................................................................741
- G -...............................................................................................................743
- H -..............................................................................................................744
- I -................................................................................................................744
- J -................................................................................................................746
- K -...............................................................................................................746
- L -...............................................................................................................746
- M -..............................................................................................................747
- N -..............................................................................................................749
- O - ..............................................................................................................749
- P -...............................................................................................................750
- Q -...............................................................................................................751
- R -...............................................................................................................751
- S -...............................................................................................................752
- T -...............................................................................................................756
- U -..............................................................................................................759
- V -...............................................................................................................759
- W -..............................................................................................................760
Appendix H: Vim License Agreement..............................................................763
Author's Note...............................................................................................764
Appendix I: Basic Vim Quick Reference..........................................................765
Appendix J: Vim Quick Reference....................................................................766
Minimum Command Set. Learn This First..................................................766
Editing Commands...................................................................................766
Getting Out...............................................................................................766
Note: On Linux and Unix you must enable the Vim command set..........766
Vertical Movement / Scrolling.....................................................................767
Screen Location.......................................................................................768
Screen Redrawing....................................................................................769
Virtual movement.....................................................................................770
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 24

Draft Not for publication

Draft 0.1

Not for widespread publication

Commands for English Text.........................................................................771


Text Movement.........................................................................................771
Horizontal Movement..................................................................................772
Changing text...............................................................................................774
Windows.......................................................................................................777
Others.......................................................................................................779
Multiple Files...............................................................................................781
Searching.....................................................................................................782
Search Pattern Reference............................................................................783
Simple atoms............................................................................................783
Character Classes....................................................................................783
Modifiers..................................................................................................784
Grouping and Repeats..............................................................................784
Sets of Characters....................................................................................784
Anchors....................................................................................................785
Repeats and Wildcards.............................................................................785
Choices.....................................................................................................786
Zero Width Conditionals..........................................................................786
For programmers.........................................................................................787
Program searches........................................................................................788
Text selection...............................................................................................790
Display options.............................................................................................792
Diff mode......................................................................................................793
Folding.........................................................................................................794
Misc commands...........................................................................................795

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 25

Draft Not for publication


9

Draft 0.1

Not for widespread publication

Introduction

10
11
12
13
14

I'm not sure this book is a labor of love or a love of labor. It certainly is the
longest book I've written. When I first started using Vim I noticed that there
were a few commands that Vim had that it's the old Vi editor didn't have. So I
decided to write a book which would serve as documentation to this wonderful
editor.

15
16
17
18

As part of my preparation I checked existing books for the Vi editor. They


were about 150-200 pages long, so I figured that my book would turn out about
250-300 pages. Turns out that Vim has a lot more features than expected and as
you can see the book is over 800 pages.

19
20
21
22

The goal of this book is to provide a tutorial to show the reader how to use
the power of Vim to solve common problems. Also the book attempts to show
you visually the operation of very major command and option, and to fully
document the rest.

23
24
25
26

Unfortunately, I've had to impose some limits on the book. This book does
not cover editing in any language but English mostly due to the fact that English
is the only language I know. Also it does not cover the interfaces to external
tools which I do not posses.

27
28

Copyright and License Information

29
30
31

This book makes use of material from The Vim (Vim Improved) Book
published by Newriders and copyright 2001 which was published under the
Open Publication License. (http://www.opencontent.org/openpub/).

32
33
34
35

This book is copyrighted by Steve Oualline and published under the same
license. Basically what license states is that you can use the material in this book
for your own use as long as you give credit to the sources (this book and the
orginal Vim (Vi Improved) Book.)

36
37

A downloadable version of this book is available from the author's web site
(http://www.oualline.org.)

38
39

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 26

Draft Not for publication

40

41

Draft 0.1

Not for widespread publication

Part I
Tutorial

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 27

Draft Not for publication

Draft 0.1

Not for widespread publication

42

Chapter 1: Basic Editing

43
44
45
46
47
48

The Vim editor is on of the most powerful text editors around. It is also
extremely efficient, enabling the user to edit files with a minimum of keystrokes.
This power and functionality comes at a cost, however: when getting started,
users face a steep learning curve. This chapter teaches you the basic set of 10
Vim commands you need to get started editing. In this chapter, you learn the
following:

49

The four basic movement commands

50

How to insert and delete text

51

How to get help (very important)

52

Exiting the editor

53
54

After you get these commands down pat, you can learn the more advanced
editing commands.

55

Before You Start

56
57
58
59

If you have not installed Vim, you need to read Appendix A: Installing Vim
and install the editor. (If Vim came with your Linux system, read Appendix A:
Installing Vim because you may not get the full editor by default.)

60

If you are running on UNIX or Linux, execute the following command:

61

$ touch ~/.vimrc

62
63
64
65
66

By creating a ~/.vimrc, you tell Vim that you want to use it in Vim mode. If
this file is not present, Vim runs in Vi-compatibility mode and you lose access to
many of the advanced Vim features. (Most Linux distributions now come with
system initialization files that turn on Vim's advanced features. However, you
can't count on this.)

67
68

You also can enable the advanced features from within Vim at any time
with this command:

69

:set nocompatible

70

You can also use the command:

71

:set nocp
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 28

Draft Not for publication


72
73
74
75

Draft 0.1

Not for widespread publication

Note: Both these commands have an implied <enter> at the end. Also the
'compatible' option like most Vim options has a long form ('compatible')
and a short form ('cp'). For clarity the long form is used in the examples in
this book.

76
77

If you are running on Microsoft Windows, the installation process creates


the Microsoft Windows version of this file, _vimrc, for you.

78

Running Vim for the First Time

79

To start Vim, enter this command:

80

$ gvim file.txt

81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

Note that the $ is the default UNIX command prompt. Your prompt might
differ. If you are running Microsoft Windows, open an MS-DOS prompt window
and enter this command:
C:> gvim file.txt
(Again, your prompt may differ.) In either case, Vim starts editing a file
called file.txt. Because this is a new file, you get a blank window. Figure 1-1
shows what your screen will look like. The tilde (~) lines indicate lines not in the
file. In other words, when Vim runs out of file to display, it displays tilde lines.
At the bottom of a screen, a message line indicates the file is named file.txt and
shows that you are creating a new file. The message information is temporary
and other information overwrites it when you type the first character.
~
~
~
~
~
"file.txt" [New File]

99

Figure 1-1: Initial Vim window.

100

The vim Command

101
102
103
104
105
106

The gvim command causes the editor to create a new window for editing.
If you use the command vim, the editing occurs inside your command window.
In other words, if you are running inside an xterm, the editor uses your xterm
window. If you are using an MS-DOS command prompt window under Microsoft
Windows, the editing occurs inside the window. Figure 1-2 shows a typical MSDOS command prompt window.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 29

Draft Not for publication

107

Draft 0.1

Not for widespread publication

Figure 1-2:Editing with the vim command in an MS-DOS window.

108

Modes

109
110
111
112
113

The Vim editor is a modal editor. That means that the editor behaves
differently, depending on which mode you are in. If the bottom of the screen
displays the filename or is blank, you are in normal mode. If you are in insert
mode, the indicator displays --INSERT--; and if you are in visual mode, the
indicator shows --VISUAL--.

114

Editing for the First Time

115
116
117
118

The next few sections show you how to edit your first file. During this
process, you learn the basic commands that you have to know to use Vim. At the
end of this lesson, you will know how to edit--not fast, not efficiently, but enough
to get the job done.

119

Inserting Text

120
121
122

To enter text, you need to be in insert mode. Type i, and notice that the
lower left of the screen changes to --INSERT-- (meaning that you are in insert
mode).
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 30

Draft Not for publication


123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143

Draft 0.1

Not for widespread publication

Now type some text. It will be inserted into the file. Do not worry if you
make mistakes; you can correct them later. Enter the following programmer's
limerick:
A very intelligent turtle
Found programming UNIX a hurdle
The system, you see,
Ran as slow as did he,
And that's not saying much for the turtle.
After you have finished inserting, press the <Esc> key. The --INSERT-indicator goes away and you return to normal mode. (The indicator for this
mode is a blank indicator.) Your screen should now look something like Figure
1-3.
A very intelligent turtle
Found programming UNIX a hurdle
The system, you see,
Ran as slow as did he,
And that's not saying much for the turtle.
~
~
~
~

144

Figure 1-3: Screen after the text has been inserted.

145

Getting Out of Trouble

146
147
148
149

One of the problems for Vim novices is mode confusion, which is caused by
forgetting which mode you are in or by accidentally typing a command that
switches modes. To get back to normal mode, no matter what mode you are in,
press the <Esc> key.

150

Moving Around

151
152
153
154
155
156
157

After you return to normal mode, you can move around by using these
keys: h (left), j (down), k (up), and l (right). At first, it may appear that these
commands were chosen at random. After all, who ever heard of using l for
right? But actually, there is a very good reason for these choices: Moving the
cursor is the most common thing you do in an editor, and these keys are on the
home row of your right hand. In other words, these commands are placed where
you can type them the fastest.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 31

Draft Not for publication

Draft 0.1

Not for widespread publication

158
159
160
161
162
163

Note You can also move the cursor by using the arrow keys. If you do,
however, you greatly slow down your editing--because to press the arrow
keys, you must move your hand from the text keys to the arrow keys.
Considering that you might be doing it hundreds of times an hour, this can
take a significant amount of time. If you want to edit efficiently, use h, j, k,
and l.

164
165
166

Also, there are keyboards which do not have arrow keys, or which locate
them in unusual places; therefore, knowing the use of these keys helps in
those situations.

167
168

One way to remember these commands is that h is on the left, l is on the


right, j is a hook down, and k points up. Another good way to remember the

j
169
170
171
172

commands is to copy this information on a Post-It Note and put it on the edge of
your monitor until you get used to these commands. (A quick reference for
novices can be found in Appendix I: Basic Vim Quick Reference.)
Is there some way of doing the reference above automatically?

173

Aliases

174
175
176

The alias for the h command include <Left>, <BS>, CTRL-H and CTRL-K.
The aliases for j are <Down>, <NL>, CTRL-J, and CTRL-N. For k we have <Up>
and CTRL-P. Finally for l we can also use <Right> and <Space>.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 32

Draft Not for publication

Draft 0.1

Not for widespread publication

177

Deleting Characters

178
179
180
181
182
183
184

To delete a character, move the cursor over it and type x. (This is a


throwback to the old days of the typewriter, when you deleted things by typing
xxxx over them.) Move the cursor to the beginning of the first line, for example,
and type xxxxxxx (seven x's) to delete the first seven characters on the line.
Figure 1-4 shows the result. To enter a correction, type iA young <Esc>. This
begins an insert (the i), inserts the words A young, and then exits insert mode
(the final <Esc>). Figure 1-5 shows the results.

185
186
187
188
189
190
191
192
193
194

intelligent turtle
Found programming UNIX a hurdle
The system, you see,
Ran as slow as did he,
And that's not saying much for the turtle.
~
~
~
~
Figure 1-4: Screen after delete (xxxxxxx).

195
196
197
198
199
200
201
202
203

A young intelligent turtle


Found programming UNIX a hurdle
The system, you see,
Ran as slow as did he,
And that's not saying much for the turtle.
~
~
~
~

204

Figure 1-5: Note Result of the insert.

205
206
207
208
209
210
211
212
213

Note: Vim is a text editor. By default, it does not wrap text. If you type
past the edge of the screen, the line will appear to wrap, but what you
really have is a long line wrapped so that Vim can display it. If you want
multiple lines you must end each line by pressing the <Enter> key. If you
don't and just keep typing when you reach the right margin, all you will do
is insert a very long line into the editor. You will not automatically go to
the next line. To do so, you need to press the <Enter> key. (This is the
default mode of operation. You can configure the Vim editor to word wrap,
however, as discussed in Chapter 11: Dealing with Text Files)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 33

Draft Not for publication

Draft 0.1

Not for widespread publication

214

Undo and Redo

215
216
217
218

Suppose you delete too much. Well, you could type it in again, but an
easier way exists. The u command undoes the last edit. Take a look at this in
action. Move the cursor to the A in the first line. Now type xxxxxxx to delete
A young. The result is as follows:

219
220
221

intelligent turtle
Type u to undo the last delete. That delete removed the g, so the undo
restores the character.

222

g intelligent turtle

223

The next u command restores the next-to-last character deleted:

224

ng intelligent turtle

225

The next u command gives you the u, and so on:

226
227
228
229
230

ung intelligent turtle


oung intelligent turtle
young intelligent turtle
young intelligent turtle
A young intelligent turtle

231
232
233
234
235
236
237

If you undo too many times, you can press CTRL-R (redo) to reverse the
preceding command. In other words, it undoes the undo. To see this in action,
press CTRL-R twice. The character A and the space after it disappear.
young intelligent turtle
There's a special version of the undo command, the U (undo line) command.
The undo line command undoes all the changes made on the last line that was
edited. Typing this command twice cancels the preceding U.

238
239

Note: If you are an old Vi user, note that the multilevel undo of Vim differs
significantly from the single level available to a Vi user.

240
241
242

Note: Throughout this book we assume that you have turned off Vi
compatibility. See the first section of this chapter for more information. If
compatibility is turned on the u command provides one level of undo.

243
244

Lets see how the U command works. We'll start with the line:

245

A very intelligent turtle

246

Type xxxxx to delete very<space>.

247

A intelligent turtle
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 34

Draft Not for publication

Draft 0.1

Not for widespread publication

248

Move over to the t in turtle and delete turtle with the command xxxxx.

249

A intelligent

250

Restore line with the U command.

251

A very intelligent turtle

252

Second U undoes the preceding U.

253

A intelligent

254

Getting Out

255
256
257
258
259

To exit, use the ZZ command. This command writes the file (if modified)
and exits. Unlike many other editors, Vim does not automatically make a backup
file. If you type ZZ, your changes are committed and there's no turning back.
(You can configure the Vim editor to produce backup files, as discussed in
Chapter 14: File Recovery and Command-Line Arguments)

260

Discarding Changes

261
262
263
264
265
266
267
268
269
270

Sometimes you will make a set of changes and suddenly realize you were better
off before you started. Don't worry; Vim has a "quit-and-throw-things-away"
command. It is :q!. For those of you interested in the details, the three parts of
this command are the colon (:), which enters command mode; the q command,
which tells the editor to quit; and the override command modifier (!). The
override command modifier is needed because Vim is reluctant to throw away
changes. Because this is a command mode command, you need to type <Enter>
to finish it. (All command mode commands have <Enter> at the end. This is not
shown in the text.) If you were to just type :q, Vim would display an error
message and refuse to exit:

271
272
273
274
275
276
277
278

No write since last change (use ! to override)


By specifying the override, you are in effect telling Vim, "I know that what
I'm doing looks stupid, but I'm a big boy and really want to do this."
Note: The :q command can also be written as :quit. From on when we
have a command with more than one spelling we will show the alternate
spellings in parenthesis after the first mention of the command. For
example: To quit use the :q (:quit) command. I say again use :q to get
out.

279

Other editing Commands

280
281

Now that you have gone through a few simple commands, it is time to
move on to some slightly more complex operations.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 35

Draft Not for publication

Draft 0.1

Not for widespread publication

282

Inserting Characters at the End of a Line

283
284
285
286

The i command inserts a character before the character under the cursor.
That works fine; but what happens if you want to add stuff to the end of the line?
For that you need to insert text after the cursor. This is done with the a (append)
command.

287

For example, to change the line

288

and that's not saying much for the turtle.

289

to

290

and that's not saying much for the turtle!!!

291
292
293
294
295
296

move the cursor over to the dot at the end of the line. Then type x to delete
the period. The cursor is now positioned at the end of the line on the e in turtle:
and that's not saying much for the turtle
Now type a!!!<Esc> to append three exclamation points after the e in
turtle:
and that's not saying much for the turtle!!!

297

Deleting a Line

298
299
300
301

To delete a line, use the dd command, which deletes the line on which the
cursor is positioned. To delete the middle line of this example, for instance,
position the cursor anywhere on the line The system, you see, as shown in
Figure 1-6. Now type dd. Figure 1-7 shows the results.

302
303
304
305
306
307
308
309

A very intelligent turtle


Found programming UNIX a hurdle
The system, you see,
Ran as slow as did he,
And that's not saying much for the turtle!!!
~
~
~

310

Figure 1-6: Screen before dd command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 36

Draft Not for publication


311
312
313
314
315
316
317
318

Draft 0.1

Not for widespread publication

A very intelligent turtle


Found programming UNIX a hurdle
Ran as slow as did he,
And that's not saying much for the turtle!!!
~
~
~
~

319

Figure 1-7 Screen after dd command.

320

Opening Up New Lines

321
322

To add a new line, use the o (lower case)command to open up a new line
below the cursor. The editor is then placed in insert mode.

323
324
325
326
327

Suppose, for example, that you want to add a line to the sample text just
below the third line. Start by leaving the cursor on the Ran as slow. . . line,
as seen in Figure 1-7. Now type o to open up a new line. Enter the text for the
line and then press <Esc> to end insert mode. Figure 1-8 shows the results. If
you want to open a line above the cursor, use the O (uppercase) command.

328
329
330
331
332
333
334
335
336

A very intelligent turtle


Found programming UNIX a hurdle
Ran as slow as did he,
And that's not saying much for the turtle!!!
~
~
~
-- INSERT --

337

Figure 1-8: Screen after using the o command.

338

Help

339
340

Finally, there's one more important command, the :help (:h, <F1>, <Help>)
command. To get help, enter the following:

341
342
343

:help
(Remember the implied <Enter> for command-mode commands.) This
displays a general help window, as seen in Figure 1-9.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 37

Draft Not for publication


344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366

367

*help.txt*

Draft 0.1

For Vim version 6.3.

Not for widespread publication

Last change: 2004 May 04

VIM - main help file


Move around:
Close this window:
Get out of Vim:
Jump to a subject:
With the mouse:
Jump back:
Get specific help:

Use
"j"
Use
Use

k
the cursor keys, or "h" to go left,
h
l
to go down, "k" to go up, "l" to go right.
j
":q<Enter>".
":qa!<Enter>" (careful, all changes are lost!).

Position the cursor on a tag between |bars| and hit CTRL-].


":set mouse=a" to enable the mouse (in xterm or GUI).
Double-click the left mouse button on a tag between |bars|.
Type CTRL-T or CTRL-O (repeat to go further back).
It is possible to go directly to whatever you want help
on, by giving an argument to the ":help" command |:help|.
It is possible to further specify the context:
*help-context*
WHAT
PREPEND
EXAMPLE
~
Normal mode commands
(nothing)
:help x

help.txt [help][RO]
[No File] [+]

Figure 1-9: Help screen.

368
369
370
371
372

If you don't supply a subject, :help displays the general help window. The
creators of Vim did something very clever (or very lazy) with the help system.
They made the help window a normal editing window. You can use all the
normal Vim commands to move through the help information. Therefore h, k, j,
and l move left, up, down, right, and so on.

373
374

To get out of the help system, use the same command you use to get out of
the editor: ZZ.

375
376
377
378
379
380
381

As you read the help text, you will notice some text enclosed in vertical
bars (for example, |:help|). If you are using the GUI this text is colored cyan.1
This indicates a hyperlink. If you position the cursor anywhere between the bars
and press CTRL-] (jump to tag), the help system takes you to the indicated
subject. (For reasons not discussed here, the Vim terminology for a hyperlink is
tag. So CTRL-] jumps to the location of the tag given by the word under the
cursor.)

1 It's still enclosed in vertical bars but they are colored white, the same color as the background
which makes them very hard to see.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 38

Draft Not for publication


382
383
384
385
386
387

Draft 0.1

Not for widespread publication

After a few jumps, you might want to go back. CTRL-T (pop tag) takes you
back to the preceding screen. Or in Vim terms, it "pops a tag off the tag stack."
At the top of this screen, there is the notation *help.txt*. This is used by the
help system to define a tag (hyperlink destination). Chapter 7: Commands for
Programmers explains tags in detail. To get help on a given subject, use the
following command:

388

:help subject

389

To get help on the x command, for example, enter the following:

390

:help x

391

To find out how to delete text, use this command:

392

:help deleting

393

To get a complete index of what is available, use the following command:

394

:help index

395
396
397
398
399
400
401
402
403
404

When you need to get help for a control character command (for example,
CTRL-A), you need to spell it with the prefix CTRL-.
:help CTRL-A
The Vim editor has many different modes. By default, the help system
displays the normal-mode commands. For example, the following command
displays help for the normal-mode CTRL-H command:
:help CTRL-H
To identify other modes, use a mode prefix. If you want the help for the
insert-mode version of this command, prefix the key with i_.This gives you the
following command:

405

:help i_CTRL-H

406

The table below lists several other mode prefixes.

407
408
409
410
411
412
413
414
415

When you start the Vim editor, you can use several command-line options.
These all begin with a dash (-).To find what the -t command-line option does, for
example, use the command
:help -t
The Vim editor has a number of options that enable you to configure and
customize the editor. If you want help for an option, you need to enclose it in
single quotation marks. To find out what the number option does, for example,
use the following command:
:help 'number'
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 39

Draft Not for publication


416

Draft 0.1

Not for widespread publication

The following table summarizes the special prefixes.


What

Prefix

Example

Normal-mode commands

(nothing)

:help x

Control Character

CTRL-

:help CTRL-u

Visual-mode commands

v_

:help v_d

Insert-mode commands

i_

:help i_<Esc>

ex-mode commands

:help :quit

Command-line edit

c_

:help c_<Del>

Vim command arguments -

:help -r

Options

:help 'nowrap'

' (both ends)

417
418
419

Special keys are enclosed in angle brackets. To find help on the up-arrow
key, for instance, use this command:

420

:help <Up>

421

Appendix B: The <> Key Names provides a complete list of the key names.

422

Help Language

423
424
425
426

By default Vim will set the language for the help file to the current
language of your system. (From the locale settings.) If you wish to use another
language, use the 'helplang' ('hlg') option. This option contains a series of
languages to search for help text.

427
428
429
430

Note: Vim always searches English as a last resort.


So to search for help in German, Italian, and then English use the
command:
:set helplang=de,it

431

Other Ways to Get Help

432
433
434

You can get to the help screen by pressing the <F1> key. This displays the
general help screen, and you can navigate from there. If your keyboard has a
<Help> key, you can use it as well.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 40

Draft Not for publication

Draft 0.1

Not for widespread publication

435

Using a Count to Edit Faster

436
437
438
439
440
441
442

Suppose you want to move up nine lines. You can type kkkkkkkkk or you
can enter the command 9k. In fact, you can precede almost all the movement
commands with a number. Earlier in this chapter, for instance, you added three
exclamation points to the end of a line by typing a!!!<Esc>. Another way to do
this is to use the command 3a!<Esc>. The count of 3 tells the a command to
insert what follows (!) three times. Similarly, to delete three characters, use the
command 3x.

443

The Vim Tutorial

444
445
446

The UNIX version of the Vim editor comes with an interactive tutorial.
Lesson 1 covers many of the commands described in this chapter. To invoke the
tutorial on UNIX, use the following command:

447
448
449
450
451

$ vimtutor
The tutorial starts by explaining the movement commands so that you can
move through the tutorial. After that it gradually introduces more complex
commands. If you are on a non-Unix system, execute the command
:help tutor

452
453

for information on how to get the Vim tutorial working on your system (it
isn't difficult) .

454

Summary

455
456
457
458

You now know enough to edit with Vim. Not well or fast, but you can edit.
Take some time to practice with these commands before moving on to the next
chapter. After you absorb these commands, you can move on to the more
advanced commands that enable you to edit faster and easier.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 41

Draft Not for publication

Draft 0.1

Not for widespread publication

459

Chapter 2: Editing a Little Faster

460
461
462

The basic commands covered in Chapter 1: Basic Editing enable you to edit
text. This chapter covers some additional commands that enable you to edit
more efficiently. These commands include the following:

463

Additional movement commands

464

Quick searches along a single line

465

Additional delete and change commands

466

The repeat command

467

Keyboard macros (how to record and play back commands)

468

Digraphs

469
470
471
472

One of the things I noticed as I wrote this chapter is the amazing number
of different ways you can move through a file. Although I have been using Vi and
now Vim as my main editor for the past 15 years, I have never bothered to learn
all of them. I get by with the 10% I like.

473
474

There are lots of different ways of doing things in Vim. This chapter
discusses one useful selection of all the possible commands.

475

Word Movement

476
477
478
479
480

Let's start with movement. To move the cursor forward one word, use the w
command. The b command moves backward one word. Like most Vim
commands, you can use a numeric prefix to move past multiple words. For
example, 4b moves back four words. Figure 2-1 shows how these commands
work.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 42

Draft Not for publication

w w

Draft 0.1

2w

Not for widespread publication

3w

Now is the time for all good men to come to


4b
481

Figure 2-1: Word movement.

482

Moving to the Start or End of a Line

483
484
485

The $ command moves the cursor to the end of a line. Actually, a bunch of
keys map to the "end-of-line" command. The Vim names for these keys are $,
<End>, and <kEnd>. (The <kEnd> key is Vim's name for the keypad End key.)

486
487
488
489

The $ command takes a numeric argument as well. If present, it causes


the editor to move to the end of the next line. For example, 1$ moves you to the
end of the first line (the one you're on), 2$ to the end of the next line, and so on.
Figure 2-2 illustrates how this command works.

$
ACHTUNG1 ALLES LOOKENSPEEPERS!
Das computermachine ist nicht fuer gefingerpoken
und mittengrabben. Ist easy schnappen der
springenwerk, blowenfusen und poppencorken mit
spitzensparken. Ist nicht fuer gewerken bei das
dumpkopfen. Das rubbernecken sichtseeren keepen
das cotten-pickenen hans in das pockets muss;
relaxen und watchen das blinkenlichten.
490

2$
3$
4$

Figure 2-2 The $ command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 43

Draft Not for publication


491
492
493
494
495

Draft 0.1

Not for widespread publication

The ^ command moves to the first nonblank character of the line. The
<Home> or <kHome> key moves to the first character of the line, as seen in Figure
2-3. (The 0 [zero] command does the same thing.) Like every other command
previously discussed, these commands (except 0 [zero]) can take a numeric
argument. They do not do anything with it, but you can specify it if you want to.

496

ACHTUNG1 ALLES LOOKENSPEEPERS! command

^
<Home>
<kHome>
497

Figure 2-3: The ^ and <Home> commands.

498

Searching Along a Single Line

499
500
501
502

Moving is the most common editing activity you do. One of the most useful
movement commands is the single-character search command. The command fx
(forward search) searches the line for the single character x. Suppose, for
example, that you are at the beginning of the following line:

503
504
505
506
507
508
509
510
511
512

To err is human. To really foul up you need a computer.


Suppose you want to go to the h of human. Just execute the command fh
and the cursor will be positioned over the h:
To err is human. To really foul up you need a computer.
To go to the end of the word really, use the command fy. You can
specify a count; therefore, you can space forward five words by using the
command 5f<Space>. Note: this only moves five space characters, not five
words. If there are multiple spaces between words, this will not move five
words!
To err is human. To really foul up you need a computer.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 44

Draft Not for publication


513
514

Draft 0.1

Not for widespread publication

The F command searches to the left. Figure 2-4 shows the effect of the f
and F commands.

515

fi

fl

2fo

3fe

To err is human, To really foul up you need a computer.

2Fa
516
517
518
519

Fy

Figure 2-4: Operation of the f and F commands


The tx (search `til) command works like the fx command, except it stops
one character before the indicated character. The backward version of this
command is Tx. Figure 2-5 shows how these commands work.

520

ti

3te

2to

tl

To err is human, To really foul up you need a computer.

2Ta

Ty

521

Figure 2-5:Operations of the f and F commands.

522
523
524
525
526

Sometimes you will start a search, only to realize that you have typed the
wrong command. You type f to search backward, for example, only to realize
that you really meant F. To abort a search, press <Esc> as the search key. So
f<Esc> is an aborted forward search. (Note: <Esc> cancels most operations, not
just searches.)

527

Moving to a Specific Line

528
529

If you are a C or C++ programmer, you are familiar with error messages
such as the following:

530

prog.c:3: 'j' undeclared (first use in this function)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 45

Draft Not for publication

Draft 0.1

Not for widespread publication

531
532

This tells you that you might want to fix something on line 3. So how do
you find line 3?

533
534
535
536
537
538
539
540

One way is to do a 9999k to go to the top of the file and a 2j to go down


two lines. It is not a good way, but it works. A much better way of doing things
is to use the G command. With an argument, this command positions you at the
given line number. For example, 3G puts you on line 3. (Likewise, use the 1G
command to go to the top of the file rather than 9999k.) With no argument, it
positions you at the end of the file. (For a better way of going through a
compiler's error list, see Chapter 7: Commands for Programmers, for information
on the :make and :clist related commands.)

541
542
543

Another way to move through the file is with the % command. The 50%
command moves you through the file, 25% a quarter, 90% ninety percent, etc. (%
by itself finds the matching {} which is a different command.)

544

Telling Where You Are in a File

545
546
547

How do you really know where you are in a file? You can do so in several
ways. The first is to turn on line numbering with the following command (see
Figure 2-6):

548

:set number

549

This causes line numbers to appear at the beginning of each line.

550
551
552
553
554
555
556
557
558
559
560
561
562

1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188

Ode to a maintenance programmer


===============================
Once more I travel that lone dark road
into someone else's impossible code
Through "if" and "switch" and "do" and "while"
that twist and turn for mile and mile
Clever code full of traps and tricks
and you must discover how it ticks
And then I emerge to ask anew,
"What the heck does this program do?"
****

563

Figure 2-6: Window with numbering turned on.

564
565

Note: These line numbers are for your information only; they are not
written into the file when you exit.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 46

Draft Not for publication


566
567
568
569

Draft 0.1

The Vim editor is highly configurable and has a huge number of options.
You can use the :set command in many different ways, which are described in
Chapter 28: Customizing the Editor. The 'number' option is a boolean option,
meaning that it can be on or off. To turn it on, use this command:

570

:set number

571

To turn it off, use this command:

572

:set nonumber

573
574
575
576
577
578
579
580
581
582
583
584
585
586
587

Not for widespread publication

The numbers disappear from your screen. Figure 2-7 shows what happens
we you do a :set nonumber.
Ode to a maintenance programmer
===============================
Once more I travel that lone dark road
into someone else's impossible code
Through "if" and "switch" and "do" and "while"
that twist and turn for mile and mile
Clever code full of traps and tricks
and you must discover how it ticks
And then I emerge to ask anew,
"What the heck does this program do?"
****

588

Figure 2-7 Results of :set nonumber.

589

Where Am I?

590
591

The CTRL-G command displays a status line that indicates where you are in
the file. For example:

592

"c2.txt" [Modified] line 81 of 153 --52%-- col 1

593
594
595
596
597

This indicates that you are editing a file called c2.txt, and that it has been
modified since the editing started. The cursor is positioned on line 81 out of a
total of 153, or about 52% of the way through the file. The cursor is currently
sitting in column 1.

598
599
600
601

Sometimes you will see a split column number (for example, col 2-9).This
indicates that the cursor is positioned on character 2. But because character
one is a tab, the screen column is 9. Figure 2-8 shows the results of a typical
CTRL-G command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 47

Draft Not for publication


602
603
604
605
606
607
608
609
610
611
612
613
614
615

Draft 0.1

Not for widespread publication

to open up the packing crate and find


the manual. (What did they think we were
reading anyway?)
(Head)Dumb programmer stories
Ode to a maintenance programmer
Once more I travel that lone dark road
into someone else's impossible code
Through "if" and "switch" and "do" and "while"
that twist and turn for mile and mile
"j.txt" [Modified] line 186 of 119--16%--col 2-9

616

Figure 2-8 The CTRL-G command.

617

Scrolling Up and Down

618
619
620
621
622

The CTRL-U command scrolls up half a screen of text. (Up in this case is
backward in the file; the text moves down on the screen. Don't worry if you have
a little trouble remembering which end is up. Most programmers have the same
problem.) The CTRL-D command scrolls you down half a screen. Figure 2-9
shows how these two commands work.

CTRL-U
A dozen, a gross, and a score,
Plus three times the square root of four,
Divided by seven,
Plus five time eleven,
Equals nine squared plus zero, no more.
---I really hate this damned machine

623

A dozen, a gross, and a score,


Plus three times the square root of four,
Divided by seven,
Plus five time eleven,
Equals nine squared plus zero, no more.
----

101 blocks of crud on the disk! ...


----A dozen, a gross, and a score,
Plus three times the square root of four,
Divided by seven,
Plus five time eleven,
Equals nine squared plus zero, no more.

Equals nine squared plus zero, no more.


---I really hate this damned machine
I wish that they would sell it.
It never does quite what I want
But only what I tell it.

I really hate this damned machine

CTRL-D
624

Figure 2-9: Results of the CTRL-U and CTRL-D commands.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 48

Draft Not for publication

Draft 0.1

Not for widespread publication

625

Deleting Text

626
627
628
629
630
631
632

As you learned in Chapter 1: Basic Editing, the dd command deletes a line.


But suppose you want to delete part of a line, say a word. The way to do that is
to start visual mode with the v command. You can now highlight the text you
want to delete with the cursor movement commands. We want to delete a word,
so we pass over it with the w command. Unfortunately this leaves us with the
cursor positioned on the first character of the next word. We don't want to
delete that so we backup with the left (h) command.

633
634

Finally we need to tell Vim what to do with the text, so we enter the d
command to delete it. Figure 2-10 shows the steps we used:

635
636
637
638
639
640
641

This is a test

Type v to start visual.

This is a test

Move over word with w.


Backup one character with h

This a test.

Press d to delete

642

Figure 2-10: Visual mode and delete

643
644

Note: To get help about what the delete (d) command does in visual mode
use the command:

645

:help v_d

646
647

As we will see in future sections the visual mode gives you a very powerful
way of dealing with large blocks of text.

648

Deleting Text Without Visual Mode

649
650
651
652

It is possible to delete sections of text without using the visual mode. The
advantage of doing things non-visually is that you save a single keystroke. The
disadvantage is that you really have to know what you are doing as there is no
visual feedback to show you what's going on.

653
654
655
656
657

To delete a word in normal mode you use the command dw. You may
recognize the w command as the move word command. In fact, the d command
may be followed by any motion command, and it deletes from the current
location to the place where the cursor winds up. (Therefore, we say the syntax
of the d command is dmotion.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 49

Draft Not for publication


658
659
660

Draft 0.1

Not for widespread publication

The 3w command, for example, moves the cursor over three words. The
d3w command deletes three words, as seen in Figure 2-11. (You can write it as
d3w or 3dw; both versions work the same.)

To err is human, to really fowl up you need a computer


3dw
To err is human, to realyou need a computer
662
663
664
665

Figure 2-11: The d3w command.


The $ command moves to the end of a line. The d$ command deletes from
the cursor to the end of the line, as seen in Figure 2-12. A shortcut for this is the
D command.

To err is human, to realyou need a computer


d$

To err is human, to real

667

($ - Go to the end of the line)

Figure 2-12: The d$ command.

668

Where to Put the Count (3dw or d3w)

669
670
671
672
673

The commands 3dw and d3w delete three words. If you want to get really
picky about things, the first command, 3dw, deletes one word three times; the
command d3w deletes three words once. This is a difference without a
distinction. You can actually put in two counts, however (for example, 3d2w).
This command deletes two words, repeated three times, for a total of six words.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 50

Draft Not for publication

Draft 0.1

Not for widespread publication

674

Visual vs. Normal Mode Delete

675
676
677

The visual method of deleting things lets you see exactly what you are
going to delete before you delete it. You can also make adjustments before you
delete the text. This makes things much easier for large complex deletes.

678
679
680
681
682
683
684

On the other hand, the normal mode delete provides no feedback. You
type d and a motion command and hope you did the right thing. (If you didn't
there's always the undo command.) The advantage of the normal mode method
of doing things is that it's quicker for small amounts of text, especially when you
know where the motion command is going to send the cursor. In other words if
you have to delete three words, d3w is probably what you want to use. But if
you have to delete 57 words (maybe 57 you're not sure) the v<move>d is better.

685

Changing Text

686
687
688
689

The c command changes text. It acts just like the d command, except it
leaves you in insert mode. For example, if you go into visual mode (v) highlight a
word (w) and then press c, the word will disappear and you'll be left in insert
mode.

690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705

In the example in Figure 2-13 we change boss to idiot:


The boss said ...
The boss said ...

The said ....


The idiot said ...
Figure 2-13: The visual c command.
The normal mode version of the c command acts like the d command
except that it leaves you in insert mode. For example, cw changes a word. Or
more specifically, it deletes a word and then puts you in insert mode. Figure 214 illustrates how this command works.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 51

Draft Not for publication


706
707
708
709
710
711

Draft 0.1

Not for widespread publication

There is a saying that for every problem there is an answer that's simple,
clear, and wrong. That is the case with the example used here for the cw
command. The cmotion command works just like the dmotion command, with
one exception: the cw and dw commands. Whereas cw deletes the text up to the
space following the word (and then enters insert mode), the dw command deletes
the word and the space following it.

To err is human, To really foul up you need a computer.

a word (w)
Change Word:

screw

To err is human, To really screw up you need a computer.

cwscrew <Esc>
c Change
w Word (the motion)
screw<blank> (text)
<Esc> - End insert
712

Figure 2-14: How cw works.

713
714
715

The cc command works on the entire line. That is, it deletes the line and
then goes into insert mode. In other words, cc works on the current line just like
dd. Likewise, c$ or C change from the cursor to the end of the line.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 52

Draft Not for publication

Draft 0.1

Not for widespread publication

716

The . Command

717
718
719
720
721
722
723
724

The . command is one of the most simple yet powerful commands in Vim.
It repeats the last delete or change command. For instance, suppose you are
editing an HTML file and want to delete all the <B> tags. You position the cursor
on the first < and delete the <B> with the command df>. You then go to the < of
the next </B> and kill it using the . command. The . command executes the
last change command (in this case, df>). To delete another tag, position the
cursor on the < and press the . command. Figure 2-15 illustrates how this can
work.
1. Start here
2. f< --find "<" of <B>
3. df>-- delete to ">"

5. f< --find "<" of "</B>"


6. . --repeat last change (df>)

<P>
To <B>generate</B> a table of contents
all the C <B>program</B> files in your
current working directory, use the
<B>command</B>:
<PRE>
$<B> ctags *.c</B>
</PRE>
7. j -- Next line
8. ^ -- Start of line
9. f< --find "<" of "<B>"
10. . --repeat last change (df>)
11. f< --find "<" of </B>
912 . --repeat last change (df>)
725

Figure 2-15 Using the . command.

726

Joining Lines

727
728
729
730
731

To join a set of lines in visual mode, start visual mode (v) highlight the lines
you wish to join, and press J. All the highlighted lines will be put together in
one big line. A space is placed between the pieces that are joined as seen in
Figure 2-16. (If there is no space it is added. If there is one space, it is
preserved. If there are multiple spaces, they are turned into on.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 53

Draft Not for publication


Now is
the time
for all
good men

Draft 0.1

Not for widespread publication

Now is the time for all good men

732

Figure 2-16 Visual J command.

733
734
735

In normal mode, the J command joins the current line with the next one. ,
as illustrated by Figure 2-17. If a count is specified, then count lines are joined
(minimum of two).

736

This is
a test

This is a test

This is
a test
with
many
line

3J

This is a test with


many
lines

737

Figure 2-17: The J command.

738

Replacing Characters

739
740
741
742
743

The r{char} command replaces the character under the cursor with
{char}. Figure 2-18 shows how you can use the r command to replace a z with
an s. The r command can be preceded with a count, indicating the number of
characters to be replaced. In Figure 2-19, we go to the beginning of line (the ^
command) and execute 5ra to replace the first five characters with a.

744
745
746
747

This iz a test.
rs
This is a test.
Figure 2-18: The replace (r) command.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 54

Draft Not for publication

Draft 0.1

Not for widespread publication

748
749

This is a test.

750

5ra

751

aaaaais a test.

752

Figure 2-19: Replace (r) command with count.


Note: The r command treats <Enter> in a special way. No matter how big
the count is, only one <Enter> is inserted. Therefore, 5ra inserts five a
characters, whereas 5r<Enter> replaces five characters with one <Enter>.

753
754
755
756
757
758

Be careful where you place the count. The 5rx command replaces five
characters with the character x, whereas r5x replaces the character under the
cursor with 5 (r5) and then deletes a character (x).

759

Changing Case

760
761
762

The ~ command changes a character's case. It changes uppercase to


lowercase and vice versa. If a count is specified, the count characters are
changed. Figure 2-20 contains examples.

763
764
765
766
767
768
769

now is the time. . . .


.

now is the time . .

6~
Now is the time. . . .
.

770

NOW IS the time . .

Figure 2-20: Use of the ~ command.

771

Keyboard Macros

772
773
774
775
776
777
778

The . command repeats the preceding change. But what if you want to do
something more complex than a single change? That's where the keyboard
macros come in. The q{character} command records keystrokes into the
register named character. (The character must be between a and z.) To finish
recording, just type a q command. You can now execute the macro by typing the
@{character} command. (This can be preceded by a count, which will cause the
macro to be executed that number of times.)

779
780

Take a look at how to use these commands in practice. You have a list of
filenames that look like this:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 55

Draft Not for publication


781
782
783
784
785

Not for widespread publication

stdio.h
fcntl.h
unistd.h
stdlib.h
And what you want is the following:

786
787
788
789
790
791

Draft 0.1

#include
#include
#include
#include

"stdio.h"
"fcntl.h "
"unistd.h"
"stdlib.h"

You start by moving to the first character of the first line. Next you execute
the following commands:
Command

Description

qa

Start recording a macro in register a

Go to beginning of the line

i#include <Esc>

Insert the text #include

Go to the end of line

a<Esc>

Append the character after the cursor.

Go to the next line

Quit recording

792
793
794
795
796

Now that you have done the work once, you can repeat the change by
typing the command @a. Alternatively, because you have three lines to go, you
can change them using the command 3@a. Figure 2-21 shows how to define and
then execute a macro.
stdio.h
fcntl.h
unistd.h
stdlib.h

Start

#include "stdio.h"
fcntl.h
unistd.h
stdlib.h

qa - Record into register a


^ -Go to the geginning of a line
i#include <Esc> - Insert text
$ Go to the end of the line
a"<Esc> - Insert more text
j - Go to the next line
q - Stop macro

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 56

Draft Not for publication

Draft 0.1

Not for widespread publication

#include "stdio.h"
#include "fcntl.h"
unistd.h
stdlib.h

@a - Execute macro "a"

#include
#include
#include
#include

2@a - Execute macro "a" twice

"stdio.h"
"fcntl.h"
"unistd.h"
"stdlib.h"

797

Figure 2-21: Keyboard Macros

798

Digraphs

799
800
801
802

Some characters are not on the keyboard--for example, the copyright


character (). To type these letters in Vim, you use digraphs, where two
characters represent one. To enter a , for example, you type CTRL-KcO (Capital
letter O). To find out what digraphs are available, use the following command:

803

:digraphs

804

Note: :dig is the same as :digraphs

805
806
807
808
809
810

The Vim editor will display the digraph-mapping table, as seen in Figure 222. This shows, for example, that the digraph you get by typing CTRL-KCt is the
character ().This is character number 162.
Warning: The digraphs are set up assuming that you have a standard
ISO-646 character set. Although this is an international standard, your
particular display or printing system might not use it.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 57

Draft Not for publication


811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834

835

:digraphs
NU ^@ 10
BL ^G
7
SO ^N 14
NK ^U 21
FS ^\ 28
At @
64
!! | 124
NH ~C 131
VS ~J 138
P1 ~Q 145
SS ~X 152
AC ~_ 159
BB 166
-- - 173
'' 180
>> 187
A> 194
E' 201
D- 208
*X 215
TH 222
aa 229
-- More --

SH
BS
SI
SY
GS
<(
!)
IN
PD
P2
GC
NS
SE
Rg
My
14
A?
E>
N?
O/
ss
ae

^A
^H
^O
^V
^]
[
}
~D
~K
~R
~Y
|

1
8
15
22
29
91
125
132
139
146
153
160
167
174
181
188
195
202
209
216
223
230

SX
HT
DL
EB
RS
//
'?
NL
PU
TS
SC
!I
':
'm
PI
12
A:
E:
O!
U!
a!
c,

^B
^I
^P
^W
^^
\
~
~E
~L
~S
~Z

Draft 0.1
2
9
16
23
30
92
126
133
140
147
154
161
168
175
182
189
196
203
210
217
224
231

EX
LF
D1
CN
US
)>
DT
SA
RI
CC
CI
Ct
Co
DG
.M
34
AA
I!
O'
U'
a'
e!

^C
^@
^Q
^X
^_
]
^?
~F
~M
~T
~[

3
10
17
24
31
93
127
134
141
148
155
162
169
176
183
190
197
204
211
218
225
232

ET
VT
D2
EM
SP
'>
PA
ES
S2
MW
ST
Pd
-a
+',
?I
AE
I'
O>
U>
a>
e'

Not for widespread publication


^D
^K
^R
^Y
^
~@
~G
~N
~U
~\

4
11
18
25
32
94
128
135
142
149
156
163
170
177
184
191
198
205
212
219
226
233

EQ
FF
D3
SB
Nb
'!
HO
HS
S3
SG
OC
Cu
<<
2S
1S
A!
C,
I>
O?
U:
a?
e>

^E
^L
^S
^Z
#
`
~A
~H
~O
~V
~]

5
12
19
26
35
96
129
136
143
150
157
164
171
178
185
192
199
206
213
220
227
234

AK
CR
D4
EC
DO
(!
BH
HJ
DC
EG
PM
Ye
NO
3S
-o
A'
E!
I:
O:
Y'
a:
e:

^F
^M
^T
^[
$
{
~B
~I
~P
~W
~^

6
13
20
27
36
123
130
137
144
151
158
165
172
179
186
193
200
207
214
221
228
235

Figure 2-22: Digraph-mapping table.

836

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 58

Draft Not for publication

Draft 0.1

Not for widespread publication

837

Chapter 3: Searching

838
839
840
841

This chapter introduces you to the various Vim search commands. The
basic search commands in Vim are rather simple, which means that you can get
started with searching fairly easily. In this chapter, you learn about the
following:

842

Simple forward searches

843

Search options

844

Incremental searches

845

Changing directions

846

Basic regular expressions

847

Simple Searches

848
849
850
851

To search for a string, use the /string command. To find the word
include, for example, use the command /include. An <Enter> is implied at the
end of this command. (Any time the cursor jumps to the bottom of the screen
and you type something, you must end it with <Enter>.)

852
853
854

Note:The characters .*[]^%/\?~$ have special meaning. If you want to use


them in a search you must put a \ in front of them. Example: to find $10
use the search command /\$10

855
856

In this example, we searched for include (/include). The cursor now


moves to the i of include, as seen in Figure 3-1.

857
858
859
860
861
862
863
864
865
866
867
868

869

870

/********************************************************
* cd-speed
*
* Report the speed of a cd-rom
*
*
(Also works on hard drives and other
*
*
devices)
*
*
*
* Usage:
*
* cd-speed <device>
*
*
*
********************************************************/
#include <iostream.h>
#include <iomanip.h>
/include

Figure 3-1: Searching for include.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 59

Draft Not for publication


871
872
873
874
875
876
877
878
879
880
881
882
883
884

885

Draft 0.1

Not for widespread publication

To find the next include, use the command /<Enter>.The cursor now
moves to the next occurrence of the string, as shown by Figure 3-2.
/********************************************************
* cd-speed
*
* Report the speed of a cd-rom
*
*
(Also works on hard drives and other
*
*
devices)
*
*
*
* Usage:
*
* cd-speed <device>
*
*
*
********************************************************/
#include <iostream.h>
#include <iomanip.h>
/include

886

Figure 3-2: Search again, forward (/<Enter>).

887
888

Another way to find the next match is with the n command. This command
does the same thing as /<Enter>, but does it with one less keystroke.

889
890
891

Both the /<Enter> and n commands can have a count specified. If there is
a count, the command searches for the count number of matches from the
current location.

892

Search History

893
894

The search command has a history feature. Suppose, for example, that you
do three searches:

895
896
897

/one
/two
/three

898
899
900

Now let's start searching by typing a simple / without pressing <Enter>. If


you press <Up>,Vim puts /three on the prompt line. Pressing <Enter> at this
point searches for three.

901
902
903
904

If you do not press <Enter>, but press <Up> instead, Vim changes the
prompt to /two. Another <Up> command moves you to /one. In other words,
after you do a number of searches, you can use the <Up> and <Down> keys to
select one of your recent searches.

905

History Window

906
907

If you execute the command q/, Vim will open up a search history window.
See Figure 3-3.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 60

Draft Not for publication


908
909
910
911
912
913
914
915
916

~
~
~
[No Name] [+]
/one
/two
/three
command-line
/

917

Draft 0.1

Not for widespread publication

1,2

51,0-1

All

Bot

Figure 3-3: Search History Window

918
919
920
921

Most of the normal editing commands work within this window. When you
find the search you want (or create it in the editor), press <Enter> to execute the
search. If you wish to abort the search and return to command mode, use the ZZ
or :q commands.

922
923

If you wish to abort everything :qall will close both the search history
window and everything else.

924

Searching Options

925
926

Many different options control the way you perform a search. This section
discusses a few of them.

927

Highlighting

928
929

The following command causes Vim to highlight any strings found


matching the search pattern:

930
931
932
933

:set hlsearch
If you turn on this option and then search for include, for example, all the
include strings are highlighted, as seen in Figure 3-4. To turn off search
highlighting, use this command:

934

:set nohlsearch

935

To clear the current highlighting, use the following command:

936

:nohlsearch

937
938

Search highlighting is now turned off; matched text will not be highlighted.
However, the highlighting will return when you use a search command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 61

Draft Not for publication


939
940
941
942
943
944
945
946
947
948
949
950

Draft 0.1

Not for widespread publication

*
devices)
*
*
*
* Usage:
*
*
cd-speed <device>
*
*
*
********************************************************/
#include <iostream.h>
#include <iomanip.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>

951

Figure 3-4 The 'hlsearch' option.

952

Incremental Searches

953
954
955

By default, Vim uses the traditional search method: You specify the string,
and then Vim performs the search. When you use the following command, the
editor performs incremental searches:

956

:set incsearch

957
958

The editor starts searching as soon as you type the first character of the
string. Each additional character further refines the search.

959
960
961
962

Suppose, for example, that you want to search for ioctl.h, but this time
you want to use an incremental search. First, you turn on incremental
searching. Next, you start the search by typing the /i command. Figure 3-5
shows how the editor searches for the first i and positions the cursor on it.

963
964
965
966
967
968
969
970
971
972
973
974
975

*
devices)
*
*
*
* Usage:
*
*
cd-speed <device>
*
*
*
********************************************************/
#include <iostream.h>
#include <iomanip.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
Figure 3-5: Results after /i.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 62

Draft Not for publication


976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993

Draft 0.1

Not for widespread publication

You continue the search by typing an o. Your search now is /io, so the
editor finds the first io, as seen in Figure 3-6. This is still not the place you
want, so you add a c to the search, resulting in the /ioc command. The Vim
editor advances, as illustrated in Figure 3-7, to the first match of ioc. This is
what you want to find, so you press <Enter>, and you're there.
*
devices)
*
*
*
* Usage:
*
*
cd-speed <device>
*
*
*
********************************************************/
#include <iostream.h>
#include <iomanip.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
Figure 3-6: Incremental search after /io.

994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007

*
devices)
*
*
*
* Usage:
*
*
cd-speed <device>
*
*
*
********************************************************/
#include <iostream.h>
#include <iomanip.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
Figure 3-7: Incremental search after /ioc.

1008

To turn off incremental searches, use the following command:

1009

:set noincsearch

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 63

Draft Not for publication

Draft 0.1

Not for widespread publication

1010

Searching Backward

1011
1012
1013
1014
1015

The reverse search command (?) searches backward. The n command


repeats the last search. If a reverse search was the last one used, the n
command searches in the reverse direction. If the last search was a forward
search, the n command searches forward. Figure 3-8 shows how the ? and n
commands can work together.
(wrap)

1016
1017
1018
1019
1020
1021
1022
1023
1024

#include <sys/fcntl.h>
#include <sys/time.h>
#include <errno.h>
// Read at most 10MB
const unsigned int MAX_READ = (10 * 1024 * 1
// Size of a buffer
const unsigned int BUF_SIZE = (62 * 1024);
// Buffer to be written
static unsigned char buffer [BUF_SIZE];

Start

?unsigned
n
n

1025

Figure 3-8: ? and n commands.

1026

Reverse Search History

1027
1028
1029

Like forward search (?) you can use the <Up> and <Down> keys to go
through the search history. You can also open a search history for reverse
searches with the command q?.

1030

Changing Direction

1031
1032
1033
1034
1035

Suppose you start a forward search for unsigned using the /unsigned
command. You can turn around and search in the reverse direction by using the
? Command. The n command repeats the search in the same direction. The N
command reverses the direction on the search and repeats it. To make things a
little clearer, line numbering has been turned on using the following command:

1036

:set number

1037

In this example, we use the following search commands:


Command

Meaning

Result

/unsigned

Meaning Forward search for unsigned.

Line 24

Repeat search in the same (forward) direction.

Line 26

Search again.

Line 29

Reverse search

Line 26

Change search direction (reverse -> forward) and

Line 29

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 64

Draft Not for publication


Command

Draft 0.1

Not for widespread publication

Meaning

Result

repeat search.
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055

Figure 3-9 shows the /unsigned command used to perform a search. The n
command was used twice to go the next occurrences of the string. Then we
reversed course with a ? command (which always goes backward.) Finally, we
reverse course again with the N command. Figure 3-9 shows this tortured path.

/unsigned
n
n
?
N

19 #include <sys/fcntl.h>
20 #include <sys/time.h>
21 #include <errno.h>
22
23 // Read at most 10MB
24 const unsigned int MAX_READ = 10
25 // Size of a buffer
26 const unsigned int BUF_SIZE = 62
27
28 // Buffer to be written
29 static unsigned char buffer[BUF_SIZE];
:set number

Figure 3-9: Different kinds of search commands.

1056

Basic Regular Expressions

1057
1058
1059
1060
1061
1062

The Vim editor uses regular expressions to specify what to search for.
Regular expressions are an extremely powerful and compact way to specify a
search pattern. Unfortunately, this power comes at a price because regular
expressions are a bit tricky to specify. Let's start with the simple stuff. In a
regular expression, the normal letters match themselves. So the regular
expression Steve will match Steve.

1063

The Beginning (^) and End ($) of a Line

1064
1065
1066
1067

The ^ character matches the beginning of a line. (It is no coincidence that


this is also the command to move to the beginning of the line.) The expression
include matches the word include anywhere on the line. But the expression
^include matches the word include only if it is at the beginning of a line.

1068
1069
1070

The $ character matches the end of a line. Therefore, was$ finds the word
was only if it is at the end of a line. Figure 3-10, for example, shows a search for
the pattern the with highlighting enabled.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 65

Draft Not for publication

Draft 0.1

Not for widespread publication

1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081

<Hl> Dumb user tricks


At one university the computer center was experience
trouble with a new type of computer terminal. Seems
that the professors loved to put papers on top of
the equipment, covering the ventilation holes. Many
terminals broke down because they became so hot that
the solder holding one of the chips melted and the
chip fell out.
The student technicians were used to this problem. One
day a technician took the back off a terminal
/the

1082

Figure 3-10: Searching for the.

1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100

Next you see what happens when searching for the regular expression
^the. The results, as seen in Figure 3-11, show that only two occurrences, both
of which begin lines, are highlighted. Finally a search for the$. As you can see
from Figure 3-12, only one the ends a line. If you want to search for a line
consisting of just the word the, use the regular expression ^the$. To search for
empty lines, use the regular expression ^$.
<Hl> Dumb user tricks
At one university the computer center was experience
trouble with a new type of computer terminal. Seems
that the professors loved to put papers on top of
the equipment, covering the ventilation holes. Many
terminals broke down because they became so hot that
the solder holding one of the chips melted and the
chip fell out.
The student technicians were used to this problem. One
day a technician took the back off a terminal
/^the
Figure 3-11: Searching for ^the.

1101

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 66

Draft Not for publication


1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113

Draft 0.1

Not for widespread publication

<Hl> Dumb user tricks


At one university the computer center was experience
trouble with a new type of computer terminal. Seems
that the professors loved to put papers on top of
the equipment, covering the ventilation holes. Many
terminals broke down because they became so hot that
the solder holding one of the chips melted and the
chip fell out.
The student technicians were used to this problem. One
day a technician took the back off a terminal
/the$
Figure 3-12: Searching for the$.

1114

Match Any Single Character (.)

1115
1116
1117
1118

The character . matches any single character. For example, the


expression c.m matches a string whose first character is a c, whose second
character is anything, and whose third character is m. Figure 3-13 shows that
the pattern matched the com of computer and the cam of became.

1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130

<Hl> Dumb user tricks


At one university the computer center was experience
trouble with a new type of computer terminal. Seems
that the professors loved to put papers on top of
the equipment, covering the ventilation holes. Many
terminals broke down because they became so hot that
the solder holding one of the chips melted and the
chip fell out.
The student technicians were used to this problem. One
day a technician took the back off a terminal
/c.m
Figure 3-13: Special character ..

1131

Matching Special Characters

1132
1133
1134

Most symbols have a special meaning inside a regular expression. To


match these special symbols, you need to precede them with a backslash (\). To
find the] , for example, use the string the\].

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 67

Draft Not for publication


1135

Draft 0.1

Not for widespread publication

Regular Expression Summary


Note: The following list assumes that the 'magic' option is on (the
default). (See The 'magic' Option on page 299 for information on this
option.)

1136
1137
1138

Character

Meaning

The literal character x

Start of line

End of line

A single character

\x

Turns off the special meaning of many characters, gives special


meaning to a few others

1139

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 68

Draft Not for publication

Draft 0.1

Not for widespread publication

1140

Chapter 4: Text Blocks and Multiple Files

1141
1142
1143

This chapter shows you how to deal with larger text blocks. This includes
the commands that enable you to define a large text block as well as perform cut,
paste, and copy operations.

1144
1145
1146
1147

With most editors, you can just cut and paste. However, the Vim editor has
the concept of a register. This enables you to hold data for multiple cut, copy, or
paste operations. Most other editors are limited to a single cut/paste clipboard.
With the Vim registers you get more than 26 clipboards.

1148
1149
1150

One of the strengths of UNIX is the number of text manipulation


commands it provides. This chapter shows you how to use the filter command to
take advantage of this power to use UNIX filters to edit text from within Vim.

1151
1152
1153

Up until now, you have worked with single files in this book. You will now
start using multiple files. This will enable you to perform the same edits on a
series of files, and to cut and paste between files.

1154

This chapter discusses the following topics:

1155

Simple cut-and-paste operations (in Vim terms, delete and put)

1156

Marking locations within the text

1157

Copying text into a register using the yank commands

1158

Filtering text Editing multiple files

1159

Cut, Paste, and Copy

1160
1161
1162

When you delete something with the d, x, or another command, the text is
saved. You can paste it back by using the p command. (The Vim name for this is
a put, but everyone else calls it paste).

1163
1164
1165
1166
1167

Take a look at how this works. First you will delete an entire line by
putting the cursor on the line you want to delete and pressing dd. Now you move
the cursor to where you want to place the line and use the p (put) command. The
line is inserted on the line following the cursor. Figure 4-1 shows the operation
of these commands.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 69

Draft Not for publication


Line 1
Line 2
Line 3

1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182

Draft 0.1
dd

Deletes line

Not for widespread publication

Line 1
Line 3

p
puts
(pastes)
line after
cursor

Line 1
Line 3
Line 2

Figure 4-1: Deleting (cutting) and putting (pasting).


Because you deleted an entire line, the p command placed the text on the
line after the cursor. If you delete part of a line (a word with the dw command,
for instance), the p command puts it just after the character under the cursor
(see Figure 4-2).
We will delete the word in the middle.
dw (delete the word and the space after it)
We will the word in the middle.
p (text is put (pasted) after cursor)
We will tdelete he word in the middle.

1183

Figure 4-2: Deleting a word and putting back again.

1184

Character Twiddling

1185
1186
1187
1188

Frequently when you are typing, your fingers get ahead of your brain. The
result is a typo such as teh for the. The Vim editor makes it easy to correct such
problems. Just put the cursor on the e of teh and execute the command xp.
Figure 4-3 illustrates this command. This works as follows:
x

Deletes the character e and places it in a register.

Puts the text after the cursor, which is on the h.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 70

Draft Not for publication


1189
1190
1191
1192
1193
1194
1195
1196
1197
1198

Draft 0.1

Not for widespread publication

teh
x delete character
th
p paste character after cursor
the

1199

Figure 4-3: Character twiddling with xp.

1200

More on "Putting"

1201
1202
1203
1204
1205

You can execute the p command multiple times. Each time, it inserts
another copy of the text into the file. The p command places the text after the
cursor. The P command places the text before the cursor. A {count} can be
used with both commands and, if specified, the text will be inserted {count}
times.

1206

Moving Large Blocks of Text

1207
1208

Let's say you wish to move 57 line block of text from one place to another.
One solution is to perform the following commands:

1209

1. Put the cursor on the first line of the block

1210

2. Type 57dd to delete the block.

1211

3. Move the line just before where you want to insert the block.

1212

4. Execute p to put the block on the line after the one the cursor is on.

1213
1214
1215

This works great if you know the exact number of lines you wish to move.
However for me, any text block larger than three lines confuses me. This
method of moving text is impractical for such large text blocks.

1216
1217
1218

Fortunately we have visual mode. We can start line visual mode with the V
(upper case) command. This is like the simple visual mode (v) we've used before,
only it works only on entire lines.

1219
1220

So to move a block using line visual mode, we execute the following


commands:

1221

1. Put the cursor on the first line of the block.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 71

Draft Not for publication

Draft 0.1

Not for widespread publication

1222

2. Start line visual mode with the V command.

1223

3. Put the cursor on the last line of the block.

1224

4. Delete the text with the d command (visual delete).

1225

5. Move the line just before where you want to insert the block.

1226

6. Execute p to put the block on the line after the one the cursor is on.

1227
1228
1229

Figure 4-4 shows how this works. The major advantage of moving text
using this method is that you don't have to count and you can tell exactly what
text is going to be moved before you move it.

1230
Line
Line
Line
Line
Line
1231

1
2V
3 Visual
4 Line
5

Line
Line
Line
Line
Line

1 j Line 1
Line 1 j Line 1 p
d
2 Down Line 4 Delete Line 4 Down Line 4 Put
3 One Line 5
Line 5 Line Line 5
4
Line 2
5
Line 3

Figure 4-4: Moving a block of text visually.

1232

Marks

1233
1234
1235

The Vim editor enables you to place marks in your text. The command ma
marks the place under the cursor as mark a. You can place 26 marks (a through
z) in your text. (You can use a number of other special marks as well.)

1236
1237

To go to a mark, use the command `{mark}, where {mark} is the mark


letter (and ` is the backtick or open single-quote character).

1238
1239
1240

The command '{mark} (single quotation mark, or apostrophe) moves you


to the beginning of the line containing the mark. This differs from the `{mark}
command, which moves you to the marked line and column.

1241
1242

The `{mark} command can be very useful when deleting a long series of
lines. To delete a long series of lines, follow these steps:

1243

1. Move the cursor to the beginning of the text you want to delete.

1244

2. Mark it using the command ma. (This marks it with mark a.)

1245
1246

3. Go to the end of the text to be removed. Delete to mark a using the


command d'a. (Entire lines will be deleted since 'a is a line type move.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 72

Draft Not for publication


1247
1248

Draft 0.1

Not for widespread publication

Note:There is nothing special about using the a mark. Any mark from a to
z may be used.

1249
1250
1251

There is nothing special about doing the beginning first followed by the
end. You could just as easily have marked the end, moved the cursor to the
beginning, and deleted to the mark.

1252
1253
1254

One nice thing about marks is that they stay with the text even if the text
moves (because you inserted or deleted text above the mark. Of course, if you
delete the text containing the mark, the mark disappears.

1255

Where Are the Marks?

1256

To list all the marks, use the following command:

1257

:marks

1258

Figure 4-5 shows the typical results of such a command.

1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277

* the data from an input


* (.c) file.
*/
struct in_file_struct {
:marks
mark line col file/text

67
0 *^I^I^I into the "bad" list^I^I*
a
1
0 #undef USE_CC^I/* Use Sun's CC com
b
8
1 * Usage:^I^I^I^I^I^I*
c
14
1 *^I^I^I (default = proto_db)^I^I
d
25
1 *^Iquote^I^I^I^I^I^I*
"
1
0 #undef USE_CC^I/* Use Sun's CC com
[
128 42 * in_file_struct -- structure that
]
129 12 * the data from an input
Press RETURN or enter command to continue
Figure 4-5: :marks.
The display shows the location of the marks a through d as well as the
special marks: `, ", [, and ]. Marks a through d are located at lines 1, 8, 14, and
25 in the file.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 73

Draft Not for publication


1278

Draft 0.1

Not for widespread publication

The special marks are as follows:


Mark

Description

Location in this example

'

The last place the cursor was at.

Line 67 of the current file

The position of the cursor when we last


left this buffer. Since we have only been
editing this file, it defaults to the first
character.

Line 1 (the default)

The start of the last insert

Line 128

The end of the insert

Line 129

1279
1280

To view specific marks, use this command:

1281

:marks args

1282

Replace args with the characters representing the marks you want to view.

1283

Yanking

1284
1285
1286
1287

For years, I used a simple method for copying a block of text from one
place to another. I deleted it using the d command, restored the deleted text
with the p command, and then went to where I wanted the copy and used the p
to put it into the text.

1288
1289

There is a better way. The y command "yanks" text into a register (without
removing it from the file). (Every other editor calls this a copy.)

1290
1291

To yank visually you start visual mode with v, highlight the text you wish to yank
and yank it with y. Figure 4-6 shows how this works.
To error is human.
To really foul up you
need a computer.
To keep things fouled up
you need government.

1292

Default register:
To really foul up you
need a computer.
y moves text into
the default register To keep things fouled up
Figure 4-6: Yanking text.

1293

Normal Mode Yanking

1294
1295
1296

The general form of the normal mode y command is y{motion}. It works


just like the delete (d) command except the text is not deleted. And the
shorthand yy yanks the current line into the buffer.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 74

Draft Not for publication


1297
1298
1299
1300
1301

Draft 0.1

Not for widespread publication

Take a look at how you can use the yank (y) command along with the mark
command (m) to duplicate a block of text. First go to the top of the text to be
copied and mark it with ma. Then go to the bottom and do a y'a (yank to mark
a). Now go to where the copied text is to be inserted and put it there using the p
command. Figure 4-7 shows these commands in action.

1302

Line
Line
Line
Line
Line
Line
Line
~
~
~
~
~

1
2 (ma line)
3
4 (y'a done here)
5
6
7
2) Go to line 4

1) Place mark a (ma)

3) Yank to mark a (y'a)

Line
Line
Line
Line
Line
Line
Line
~
~
~
~
~

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 2
Line 3
Line 4
Line 7
~
~
3 more

1
2 (ma line)
3
4 (y'a done here)
5
6
7

4) Move to line 6

1303

Line 1
Line 2 (ma line)
Line 3
Line 4 (y'a done here)
Line 5
Line 6
Line 7
~
~
~
~
~
3 lines yanked

(ma line)
(y'a done here)

(ma line)
(y'a done here)

lines

5) Put text in using


the p command

Figure 4-7: Yank (copy) and put (paste).


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 75

Draft Not for publication

Draft 0.1

Not for widespread publication

1304

Yanking Lines

1305
1306
1307

The Y command yanks a single line. If preceded by a count, it yanks that


number of lines into the register. You might have expected Y to yank until the
end of the line, like D and C, but it really yanks the whole line.

1308

Filtering

1309
1310
1311
1312

The visual ! command takes a block of text and filters it through another
program. In other words, it runs the system command represented by command,
giving it the block of text represented by motion as input. The output of this
command then replaces the selected block.

1313
1314
1315
1316

Because this summarizes badly if you are unfamiliar with UNIX filters, take
a look at an example. The sort command sorts a file. If you execute the
following command, the unsorted file input.txt will be sorted and written to
output.txt. (This works on both UNIX and Microsoft Windows.)

1317

$ sort <input.txt >output.txt

1318
1319

Now do the same thing in Vim. You want to sort lines 1 through 10 of a file.
First start visual mode (v) and highlight the first 10 lines. Then press !.

1320
1321
1322

In anticipation of the filtering, the cursor drops to the bottom of the screen
and a ! prompt displays. You can now type in the name of the filter program, in
this case sort. Therefore, your full command is as follows:

1323

!sort<Enter>

1324
1325

The result is that the sort program is run on the first 10 lines. The output
of the program replaces these lines.

1326

Normal Mode Filtering

1327
1328
1329
1330

Like normal mode delete (d) and normal mode yank (y), the filter command
has a normal mode version as well. The command !{motion} processes the
block of text starting at the current line and going to whatever line {motion}
takes you through a filter.

1331
1332
1333
1334

The !! command runs the current line through a filter. (I have found this a
good way to get the output of system commands into a file.) I'm editing a
readme.txt file, for example, and want to include in it a list of the files in the
current directory. I position the cursor on a blank line and type the following:

1335

!!ls

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 76

Draft Not for publication


1336
1337
1338

Draft 0.1

Not for widespread publication

This puts the output of the ls command into my file. (Microsoft Windows
users would use dir.) Another trick is to time stamp a change. To get the
current date time (on UNIX), I use the following command:

1339

!!date

1340

This proves extremely useful for change histories and such.

1341
1342

Note: Using !! like this is technically not filtering because commands like
ls and date don't read standard input.

1343

Editing Another File

1344
1345
1346

Suppose that you have finished editing one file and want to edit another
file. The simple way to switch to the other file is to exit Vim and start it up again
on the other file. Another way to do so is to execute the following command:

1347

:e file

1348

Note: :e is an abbreviation for :edit.

1349
1350
1351
1352
1353
1354

This command automatically closes the current file and opens the new one.
If the current file has unsaved changes, however, Vim displays a warning
message and aborts the command:
No write since last change (use ! to override)
At this point, you have a number of options. You can write the file using
this command:

1355

:write

1356

Note: :w may be used instead of :write.

1357
1358
1359

Or you can force Vim to discard your changes and edit the new file using
the force (!) option, as follows:
:e! file

1360
1361

To edit a new,unnamed buffer use the :enew (:ene) command. It works


just like :edit only the new buffer is unnamed.

1362

The :view Command

1363
1364

The following command works just like the :vi command, except the new
file is opened in read-only mode:

1365

:view file

1366

Note: :vie may be used instead of :view.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 77

Draft Not for publication

Draft 0.1

Not for widespread publication

1367
1368
1369
1370
1371

If you attempt to change a read-only file, you receive a warning. You can
still make the changes; you just can't save them. When you attempt to save a
changed read-only file, Vim issues an error message and refuses to save the file.
(You can force the write with the :write! command, as described later in this
chapter.)

1372

Dealing with Multiple Files

1373
1374
1375
1376

So far the examples in this book have dealt with commands that edit a
single file. This section introduces you to some commands that can edit multiple
files. Consider the initial Vim command, for example. You can specify multiple
files on the command line, as follows:

1377
1378
1379
1380
1381
1382
1383
1384

$ gvim one.c two.c three.c


This command starts Vim and tells it that you will be editing three files. By
default, Vim displays just the first file (see Figure 4-8).
/* File one.c */
~
~
~
~

1385
1386
1387
1388
1389
1390
1391
1392
1393

Figure 4-8: Editing the first of multiple files.


To edit the next file, you need to change files using the :next command
(:n). Figure 4-10 shows the results.
/* File two.c */
~
~
~
~
"two.c" 1L, 17C

1394
1395
1396
1397
1398
1399
1400
1401
1402

Figure 4-9: :next.


Note that if you have unsaved changes in the current file and you try to do
a :next, you will get a warning message and the :next will not work. You can
solve this problem in many different ways. The first is to save the file using the
following command:
:write
In other words, you can perform a :write followed by a :next. The Vim
editor has a shorthand command for this. The following command performs both
operations:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 78

Draft Not for publication

Draft 0.1

1403

:wnext

1404

Note: :wn is the same as :wnext.

1405
1406
1407
1408
1409
1410
1411

Not for widespread publication

Or, you can force Vim to go the next file using the force (!) option. If you
use the following command and your current file has changes, you will lose those
changes:
:next!
Finally, there is the 'autowrite' ('aw') option. If this option is set, Vim
will not issue any No write... Instead, it just writes the file for you and goes
on. To turn this option on, use the following command:

1412

:set autowrite

1413

To turn it off, use this command:

1414
1415
1416
1417

:set noautowrite
You can continue to go through the file list using the following command until
you reach the last file:
:next

1418
1419

Also, the :next command can take a repeat count. For example, if you
execute the command

1420

:2 next

1421

(or :2next), Vim acts like you issued a :next twice.

1422
1423
1424

Note: Some commands like :quit will fail if any open file has been
modified. The 'autowrite' option only works for the current file. If you want
something that works on all files you need the 'autowriteall' ('awa') option.

1425

Which File Am I On?

1426
1427
1428

Suppose you are editing a number of files and want to see which one you
are on. The following command displays the list of the files currently being
edited:

1429
1430
1431

:args
The one that you are working on now is enclosed in square brackets.
Figure 4-10 shows the output of the command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 79

Draft Not for publication


1432
1433
1434
1435
1436
1437

Draft 0.1

Not for widespread publication

/* File two.c */
~
~
~
~
one.c [two.c] three.c

1438

Figure 4-10: Output of :args

1439
1440

This figure shows three files being edited: one.c, two.c, and three.c. The
file currently being editing is two.c.

1441

Going Back a File

1442
1443

To go back a file, you can execute any of the following commands (all are
equivalent):

1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454

:previous
:prev
:Next
:N
These commands act just like the :next command, except that they go
backward rather than forward. If you want to write the current file and go to the
previous one, use any of the following commands:
:wprevious
:wp
:wNext
:wN

1455

Editing the First or Last File

1456
1457

To start editing from the first file, no matter which file you are on, execute
the following command:

1458
1459
1460

:first
(You can also use the commands :rewind, :rew, and :fir to do the same
thing.)

1461

To edit the last file, use this command:

1462

:last

1463

Note: :la is the same as :last.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 80

Draft Not for publication


1464

Draft 0.1

Not for widespread publication

Editing Two Files

1465

Suppose that you edit two files by starting Vim with the following:

1466

$ gvim one.c two.c

1467
1468
1469

You edit a little on the first file, and then go to the next file with the
following:
:wnext

1470
1471
1472

At this point, the previous file, one.c, is considered the alternate file. This
has special significance in Vim. For example, a special text register (#) contains
the name of this file.

1473
1474
1475
1476

By pressing CTRL-^, you can switch editing from the current file to the
alternate file. Therefore, if you are editing two.c and press CTRL-^, you will
switch to one.c (two.c becoming the alternate file). Pressing CTRL-^ one more
time switches you back.

1477

Suppose that you are editing a bunch of files, as follows:

1478

$ gvim one.c two.c three.c

1479
1480

1481
1482
1483
1484
1485

The command [count]CTRL-^ goes to the count file on the command line.
The following list shows the results of several TRL-^ commands:
1 CTRL-^

one.c

2 CTRL-^

two.c

3 CTRL-^

three.c

CTRL-^

two.c (previous file)

Note When you first start editing (file one.c) and press CTRL-^, you will get
an error message: No alternate file. Remember the alternate file is the
last file you just edited before this one (in this editing session). Because
one.c is the only file edited, there is no previous file and therefore the error
message.

1486

Matching

1487
1488
1489
1490

Though not exactly a search command, the :match (:maxx) command can
be very useful in finding test. It causes all text that matches a given pattern to
be highlighted on the screen. For example, to highlight all the word TODO
with the Error syntax highlighting, use the command:

1491

:match Error /TOOD/

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 81

Draft Not for publication


1492
1493

Draft 0.1

Not for widespread publication

To find out what highlighting names are available use the :highlight (:hi)
command:

1494

:highlight

1495

To clear the match from the screen, use the command:

1496

:match none

1497
1498
1499

There are can be three matches active at one time. These are set by the
:match, :2match, and :3match commands. If some text is matched by more than
one command, the lowest one wins.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 82

Draft Not for publication

Draft 0.1

Not for widespread publication

1500

Chapter 5: Windows and Tabs

1501
1502
1503
1504
1505

So far you have been using a single window. In this chapter, you split the
screen into multiple windows and edit more than one file simultaneously. This
chapter also discusses the use of editing buffers. A buffer is a copy of a file that
you edit along with the setting and marks that go with it. The topics discussed in
this chapter include the following:

1506

How to open a new window

1507

Window selection

1508

Editing two files at once

1509

Controlling the size of a window

1510

Basic buffer usage

1511

Basic Tabs

1512

Opening a New Window

1513

The easiest way to open a new window is to use the following command:

1514

:split

1515

(:sp may be used instead of :split)

1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527

This command splits the screen into two windows (and leaves the cursor in
the top one), as seen in Figure 5-1.
/* File one.c */
~
~
one.c
/* File one.c */
~
one.c
Figure 5-1: Splitting a window.
Both are editing the same file, so you can view two different parts of a file
simultaneously.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 83

Draft Not for publication

Draft 0.1

Not for widespread publication

1528
1529
1530

If you are at the bottom window, the CTRL-Ww command moves the cursor
to the top window (alternate command: CTRL-W CTRL-W). If you are at the top
window, the editor jumps to the bottom one on the screen.

1531
1532
1533
1534
1535

To change windows, use CTRL-Wj (CTRL-W CTRL-J, CTRL-W<Down>) to go


down a window and CTRL-Wk (CTRL-W CTRL-K, CTRL-W<Up>)to go up a window
(see Figure 5-2). Or if you are using Vim with a mouse, you can just click in the
window you want. (CTRL-W CTRL-J is an alternate for CTRL-Wj and CTRL-W
CTRL-K is an alternate for CTRL-Wk)

1536
1537
1538
1539
1540
1541
1542

/* File one.c */
CTRL-Ww ~
~
one.c
/* File one.c */
~
one.c
CTRL-Ww
Figure 5-2: Window navigation.

1543
1544

To close a window, use ZZ or the following command:

1545

:q

1546

CTRL-Wc, :close, :clo and :quit do the same thing.

CTRL-Wj

CTRL-Wk

1547
1548
1549

Usually you would expect CTRL-W CTRL-C also to close a window. It would
if all the CTRL-W commands were consistent. Because CTRL-C cancels any
pending operation, however, CTRL-W CTRL-C does nothing.

1550

Vertical Windows

1551
1552
1553

The :split (:sp) commands divides the screen horizontally. To divide the
screen vertically use the :vsplit (:vs) command. Figure 5-3 shows the result of
this operation:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 84

Draft Not for publication


1554
1555
1556
1557
1558
1559
1560
1561
1562
1563

/* one.c */
~
~
~
~
~
~
one.c

Draft 0.1

Not for widespread publication

|/* one.c */
|
|~
|~
|~
|~
|~
|~
one.c

1564

Figure 5-3: Result of the :vsplit command.

1565
1566

It should be noted anything that the :split command can do, the :vsplit
command can do vertically.

1567
1568
1569
1570
1571
1572

To move from the left window to the right use the CTRL-Wl
(CTRL-W CTRL-L, CTRL-W<Right>) command. To go from the right to left use the
CTRL-Wh (CTRL-W CTRL-H, CTRL-W<Left>) command. The CTRL-Ww
(CTRL-W CTRL-W) command moves you to to the next window to the right,
wrapping to the leftmost window if there is no window to the right. Figure 5-4
shows how these commands work:

1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588

CTRL-W h
CTRL-W l

/* one.c */
~
~
~
~
~
~
one.c

|/* one.c */
|
|~
|~
|~
|~
|~
|~
one.c
CTRL-W w

1589
1590
1591

CTRL-W w
Figure 5-4: Result of the :vsplit command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 85

Draft Not for publication

Draft 0.1

Not for widespread publication

1592

Opening Another Window with Another File

1593
1594

The following command opens a second window and starts editing the
given file:

1595
1596
1597
1598

:split file
Figure 5-5 shows what happens when you start editing one.c and then
execute the following command
:split two.c

1599
1600
1601
1602
1603
1604
1605
1606

/* File two.c */
~
~
two.c
/* File one.c */
~
one.c

1607
1608
1609
1610
1611

Figure 5-5: Results of :split two.c.


The :split (:sp) command can also execute an initial command using the
+command convention. Figure 5-6 shows what happens when you are editing
one.c and execute the following command:
:split +/printf three.c

1612
1613
1614
1615
1616
1617
1618
1619

printf("%2d squared is %3d\n", i, i*i);


}
three.c
/* File one.c */
~
one.c

1620

Figure 5-6: Result of :split with a + command

1621

Quick Split

1622
1623

The command CTRL-Wn (CTRL-W CTRL-N, :new) splits a window and starts
editing a new file.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 86

Draft Not for publication

Draft 0.1

Not for widespread publication

1624

Controlling Window Size

1625
1626
1627

The :split (:sp) command can take a number argument. If specified,


this will be the number of lines in the new window. For example, the following
opens a new window three lines high and starts editing the file alpha.c:

1628
1629
1630

:3 split alpha.c
A space appears here for clarity. You could have just as easily write the
following:

1631

:3split alpha.c

1632

Figure 5-7 shows the results.

1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649

/* This is alpha.c */
~
~
alpha.c
/* File alpha.c */
~
~
~
~
~
~
~
~
~
"alpha.c" 1L, 22C
Figure 5-7: :3split.
Split Summary

1650

The general form of the :split (:sp) command is as follows:

1651

:count split +command file

1652
count
+command
file

The size of the new window in lines. (Default is to split the


current window into two equal sizes.)
An initial command.
The name of the file to edit. (Default is the current file.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 87

Draft Not for publication

Draft 0.1

Not for widespread publication

1653

The :new Command

1654
1655
1656

The :new command works just like the :split command except that the
:split command splits the current window and displays the current file in both
windows while :new opens a window containing a new, empty file.

1657
1658

The following command splits the current window and starts a new file in
the other window:

1659

:new

1660

The :vnew (:vne) does the same thing vertically.

1661

Split and View

1662
1663
1664

The :sview (:sv) command acts like a combination of :split and :view.
This command proves useful if you want to look at, but not edit, a file in another
window.

1665
1666
1667
1668

There is no :vsview command. However if you wish to split the window


vertically and edit a file you can use the :vertical :sview (:vert :sview)
command. The :vertical command tells Vim to perform the command that
follows splitting the window vertically instead of horizontally.

1669

Changing Window Size

1670
1671
1672
1673

Changing window size when you are using gvim is easy. To change the
size of a window, use the mouse to drag the separator up or down (see Figure 58). If you are using the terminal version of Vim, you need to type in some
commands.

1674

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 88

Draft Not for publication

Draft 0.1

/* File two.c */
~
~
~
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
int main ()
{
i = 57;
three.c

Not for widespread publication

/* File two.c */
~
~
~
~
~
~
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c

Grab the bar with the mouse

1675

Drag it to here

Figure 5-8: Adjusting the window size.

1676
1677
1678
1679

The command count CTRL-W+ increases the window size by count (default
= 1). Similarly count CTRL-W- decreases the window's size by count (default =
1). The command CTRL-W= makes all the windows the same size (or as close as
possible).

1680
1681
1682

The command count CTRL-W_ (CTRL-W CTRL-_) makes the current window
count lines high. If no count is specified, the window is increased to its maximum
size.

1683
1684
1685
1686
1687

The :resize (:res) command can be used to change the height of the
window from the command line. The argument to this command can be an
simple number (i.e. 24) in which case the window is set to that size. If the
argument begins with a plus or minus, (i.e. +5, -7), then the window in increased
or decreased in size.

1688
1689

If no argument is given to the :resize command, the window is enlarged


to it's maximum height.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 89

Draft Not for publication

Draft 0.1

Not for widespread publication

1690

Buffers

1691
1692
1693
1694
1695

The Vim editor uses the term buffer to describe a file being edited.
Actually, a buffer is a copy of the file that you edit. When you finish changing the
buffer and exit, the contents of the buffer are written to the file. Buffers not only
contain file contents, but also all the marks, settings, and other stuff that go with
it.

1696
1697

Normally it is pretty easy to tell what buffers you have: If it has a window
on the screen, it is a buffer; if it is not on the screen, it is not a buffer.

1698
1699
1700
1701

Now for a new concept thrown into the mix, that of the hidden buffer.
Suppose you are editing a file named one.c and you need to do some work on
two.c. You split the screen and create two windows, one for each file. But you do
not like split-screen mode; you want to see one file at a time.

1702
1703
1704

One solution is to make the window for two.c as big as possible. This
works, but there still is an annoying little bit of one.c showing. Another solution
is to close the one.c window, but then you lose all the changes for that file.

1705
1706
1707
1708
1709

The Vim editor has another solution for you: the :hide (:hid) command.
This causes the current buffer to become "hidden."This causes it to disappear
from the screen. But Vim still knows that you are editing this buffer, so it keeps
all the settings, marks, and other stuff around. Actually, a buffer can have three
states:

1710

Active

Appears onscreen.

1711

Hidden

A file is being edited, but does not appear onscreen.

1712
1713

Inactive

The file is not being edited, but keep the information about it
anyway.

1714
1715
1716
1717
1718
1719

The inactive state takes a little explaining. When you edit another file, the
content of the current file is no longer needed, so Vim discards it. But
information about marks in the file and some other things are still useful and are
remembered along with the name of the file. Also, a file that was included in the
command with which you started Vim, but was not edited, will also be an inactive
buffer.

1720

To find a list of buffers, use the following command:

1721

:buffers

1722

(:buffers can also be written as :ls, :files.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 90

Draft Not for publication


1723
1724
1725

Inactive buffer.

1727

Buffer is hidden.

1728

% Current buffer.

1729

# Alternate buffer.

1730

+ File has been modified.

1746

Not for widespread publication

Figure 5-9 shows the results of this command. The first column is the
buffer number. The second is a series of flags indicating the state of the buffer.
The third is the name of the file associated with the buffer. The state flags are:

1726

1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745

Draft 0.1

~
~
~
~
~
~
two.c
:buffers
1 #h
"one.c"
line 1
2%
"two.c"
line 1
3 "three.c"
line 1
4 "four.c"
line 0
5 "help.txt"
line 1
6 "editing.txt"
line 234
Press RETURN or enter command to continue
Figure 5-9: :buffers.

1747

In this case, you see six buffers:

1748
1749
1750

1. The next to last file you were working on, also known as the alternate
file (# flag).This buffer has been hidden (h flag).You were editing file one.c
and left the cursor on line 1.

1751
1752
1753
1754
1755
1756

2. The active buffer (% flag).This is the file you are editing.


3. An inactive buffer. You want to edit three.c, but you have made no
changes to it.
4. Another file on the argument list that has not been edited.
5. When you executed a :help command, the Vim editor opened two
files. The first one of these is called help.txt.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 91

Draft Not for publication


1757
1758

Draft 0.1

Not for widespread publication

6. This is another help file called editing.txt.


Selecting a Buffer

1759

You can select which buffer to use by executing the following command:

1760

:buffer number

1761

(:b is the abbreviation for :buffer.)

1762
1763

The number parameter is the buffer number. If you do not know the
number of the buffer, but you do know the filename, you can use this command:

1764

:buffer file

1765

Figure 5-10 shows the results of a typical :buffer command.

1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780

/* File three.c */
#include <stdio.h>
int i;
int main()
{
for (i = 1; i <= 10; ++i)
{
printf("%2d squared is %3d\n", i,
i*i);
}
return (0);
}
~
~
three.c

1781

Figure 5-10: :3buffer or :buffer three.c.

1782

The following command splits the window and starts editing the buffer:

1783

:sbuffer number

1784

(:sb is the abbreviation for :sbuffer.)

1785
1786

If a number is specified, the new window will contain that buffer number. If
no number is present, the current buffer is used.

1787

To split the window vertically use the command:

1788

:vertical sbuffer number

1789
1790

This also takes a filename as an argument. If you are editing the file
three.c and execute the following command
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 92

Draft Not for publication

Draft 0.1

1791

:sbuffer one.c

1792

You get the results seen in Figure 5-11.

1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806

/* File one.c */
~
~
~
~
~
one.c
/* File three.c */
#include <stdio.h>
int i;
int main()
{
for (i = 1; i <= 10; ++i)
"three.c" line 1 of 1 100% col 1 ((2) of 3)

1807
1808

Not for widespread publication

Figure 5-11: Result of :sbuffer.


93Other buffer-related commands include the following:
:bnext

Go to the next buffer. (Also known as :bn.)

:count bnext

Go to the next buffer count times.

:count sbnext

Shorthand for :split followed by :count bnext.


(Also known as :sbn.)

:count bprevious

Go to previous buffer. If a count is specified, go to


the count previous buffer. (Also known as :bp,
:bNext, :bn.)

:count sbprevious

Shorthand for :split and :bprevious. (Also


known as :sbp, :sbNext, :sbn.)

:blast

Go to the last buffer in the list. (Also known as :bl.)

:sblast

Shorthand for :split and :blast. (Same as :sbl.)

:brewind

Go to the first buffer in the list. (Same as :bf,


:bfirst, :br.)

:sbrewind

Shorthand for :split and :brewind. (Same as


:sbf, :sbfirst, :sbr.)

:bmodified count.

Go to count modified buffer on the list. (Same as


:bm.)

:sbmodified count

Shorthand for :split and :bmodified. (Same as


:sbm.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 93

Draft Not for publication

Draft 0.1

Not for widespread publication

1809

Buffer Types

1810
1811
1812

There are many different special buffers you'll encounter in the Vim editor.
To keep track of them Vim uses the 'buftype' ('bt') option. It can contain the
following values:
<emtpy>

Normal buffer

acwrite

A buffer which will always be written with an :autocmd.

help

Help window

nofile

A buffer that is not associated with a file and will not be written.

nowrite

This buffer will not be written.

quickfix A quickfix list.


1813
1814

Buffer Options

1815
1816
1817
1818
1819

Usually when the last window of a file is closed, the buffer associated with
the file becomes inactive. If the option 'hidden' ('hid') is set, files that leave
the screen do not become inactive; instead they automatically become hidden.
Therefore if you want to keep the contents of all your old buffers around while
editing, use the following command

1820

:set hidden

1821
1822

Note: The :hide command always hides the current file no matter what
the 'hidden' option is set to.

1823
1824

The 'buflisted' ('bl') command tell Vim if a buffer is to be listed in


the :buffers or :ls command.

1825
1826
1827

The 'bufhidden' ('bh') can be used to fine tune when a buffer appears
and hides. (Do not use this option unless you know what you are doing.) The
values for this option are:
<empty> The value of the 'hidden' option is used to decide whether or not to
hide the buffer.
delete

Delete the buffer as if a :bdelete were performed on it. (Use caution


unsaved changes can easily be discarded.)

hide

Hide, but do not unload the buffer. (As if 'hidden' where set.)

unload

Unload the buffer. (Warning: Unsaved changes can easily be


discarded.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 94

Draft Not for publication


wipe

Draft 0.1

Not for widespread publication

Wipeout the buffer as if the :bwipeout command were executed.


(Again, unsaved changes can easily be discarded.)

1828
1829
1830
1831
1832

Normally, the split/buffer related commands split the current window. If the
'switchbuf' ('swb') option is set to useopen and there is a window displaying
the buffer you want to display already on the screen, the Vim will just make that
window the current one instead of performing the split (see Figure 5-12).
$ gvim t.c Makefile
:snext
int main()
{
i = 5;
printf("Hello World/n");
return (0);
t.c
t: t.c
gcc t.c
~
~
~
Makefile

:set switchbuf="" {
:sbrewind

i = 5;
printf("Hello World/n");

t.c
i = 5;
printf("Hello World/n");
t.c
t: t.c
gcc t.c
~
~
Makefile

:set switchfbuf=useopen
:sbrewind
#include <stdio.h>
int main()
{
i = 5;
printf("Hello World/n");
t.c
t: t.c
gcc t.c
~
~
~
Makefile

1833
1834
1835
1836

Figure 5-12: The 'switchbuf' option.


Note the 'switchbuf' option is a list of the values: (nothing),split,
useopen and usetab. For a description of the split argument see Chapter 23:
Advanced Commands for Programmers.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 95

Draft Not for publication

Draft 0.1

Not for widespread publication

1837

Basic Tabbed Editing

1838
1839

The :tabnew (:tabe, :tabedit) command opens up a new tab. Figure 513 shows the result:

1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854

Figure 5-13: The :tabnew /tmp/tmp.txt command.


You can click on each tab to make that tab the current tab. If you wish to
edit a specific file use the command:
:tabedit {file-name}
In general the :tab command will cause any command that would open a
new window to open a new tab instead. For example:
:tab :split test.txt
Tabs may be closed by the :quit (:q) command. Or you can write the file
and close the tab with ZZ. The :tabclose (:tabc) command acts just like :quit.
However, if you give :tabclose a numeric argument, that tab is close. For
example to close the second tab, use the command:
:tabclose 2
The :tabonly (:tabo) command closes all the other tabs. This will fail if
closing a tab would result in data loss, unless the override (!) is specified.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 96

Draft Not for publication

Draft 0.1

Not for widespread publication

1855

Selecting a tab

1856
1857
1858

To make a particular tab the current one, click on it. Or you can use the
Vim command :tabnext (:tabn) to go to the next tab. This command wraps so if
you're on the last tab, you'll wind up on the first one.

1859
1860

If you specify a {count} as an argument to :tabnext, Vim will go to that


tab. For example, to go to the third tab:

1861

:tabnext 3

1862
1863

The gt (<C-PageDown>) command goes to the next tab. When a [count] is


specified such as 3gt, Vim goes to the specified tab.

1864
1865

The :tabprevous (:tabp, :tabNext,:tabN) command works like :tabnext


only in the other direction. Similarly gT (<C-PageUp>) is like gt on to the left.

1866
1867

Finally :tabfirst (:tabf, :tabrewind, :tabr) goes the first tab and
:tablast (:tabl) goes to the last one.

1868

Figure 5-14 shows the tab commands in action.

1869
1870

:tablast

:tabfirst

:
tabnext

:tabprevious

1872

Figure 5-14: Tab navigation

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 97

Draft Not for publication

Draft 0.1

Not for widespread publication

1873

Finding Files with Tabs

1874
1875
1876
1877
1878

The CTRL-Wgf command opens a new tab and starts to edit the file who's
name is under the cursor. Vim will search for the file using the same algorithm
as it uses for the :find command. The CTRL-WgF command does the same thing,
only it goes a step farther. It not only starts editing the file in a new tab, but
jumps to the line number following the file name.

1879
1880

The :tabfind (:tabf) command performs a similar function. It's actually a


shorthand for :tabnew, :find.

1881

Editing Multiple Files From the Command Line

1882
1883
1884

There are lots of different ways of editing multiple files. One way is to edit
them one at a time as discussed in Chapter 4: Text Blocks and Multiple Files.
Another is to edit them all at the same time.

1885

To edit each file in it's own window use the command:

1886

$ gvim -o file1 file2 file3 ...

1887
1888

You can limit the number of windows opened by Vim by giving -o a


numeric arguments.

1889

$ gvim -o3 file1 file2 file3 file4

1890

Note: If you have more windows that files, some windows will be empty.

1891
1892
1893
1894

The -p command does the same thing except that it opens each file in it's
own tab. Like -o you can give it a numeric argument. Unlike -o there is an
option ('tabpagemax' aka 'tpm') which limits the number of tabs opened this
way.

1895

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 98

Draft Not for publication

Draft 0.1

Not for widespread publication

1896

Chapter 6: Basic Visual Mode

1897
1898
1899
1900
1901
1902
1903

One feature that sets Vim apart from its predecessor is something called
visual mode. This mode gives you the ability to highlight a block of text and then
execute a command on it. You can highlight a block of text, for example, and
then delete it with a d command. The nice thing about visual mode is that, unlike
other Vim commands where you operate blindly, with visual mode you can see
what text is going to be affected before you make a change. In this chapter, you
learn about the following:

1904

How to start visual mode

1905

Visual yanking

1906

Using visual mode to change text

1907

Visual commands for programmers

1908

Visual block mode

1909

Entering Visual Mode

1910
1911
1912
1913
1914

To enter visual mode, type the v command. Now when you move the
cursor, the text from the start position to the current cursor location is
highlighted (see Figure 6-1). After the text has been highlighted, you can do
something with it. For example, the d command deletes it. Figure 6-2 shows the
results.

1915
1916v start
1917visual mode
1918
1919
1920
1921
Move cursor
1922
to here
1923
1924
1925
1926

#include <stdio.h>
int i;
int main()
{
for (i = 1; i <= 10; ++i)
{
printf("%2d squared is %3d\n", i, i*i);
}
return (0);
three.c
-- VISUAL -Figure 6-1: Visual mode.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 99

Draft Not for publication


1927
1928d delete
1929highlighted
1930
text
1931
1932
1933
1934
1935
1936
1937

Draft 0.1

Not for widespread publication

#include <stdio.h>
int i;
int main()
{
for (i = 1; i <= 10; ++i)
return (0);
~
~
~
three.c
3 fewer lines

1938

Figure 6-2: Visual delete.

1939
1940

Note: Although the normal commands x, d, and <Del> do different things,


in visual mode, they all delete the highlighted text.

1941

The Three Visual Modes

1942
1943
1944
1945
1946

There are actually three different visual modes. The v (lower case v )
command starts a character-by character visual mode. All the characters from
the start to the cursor are highlighted. Figure 6-3 shows this mode in action.
The V (upper case V) command starts linewise visual mode. You can highlight
only full lines in this mode (see Figure 6-4).

1947
Visual start
(Cursor is here
1948
when v is
1949
pressed.)
1950
1951
1952
Visual end
1953
(Cursor is moved
1954
to here)
1955
1956

Oh woe to Mertle the turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.
~
~
[No File] [+]
-- VISUAL -Figure 6-3: v (visual mode).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 100

Draft Not for publication


1957
Visual start
(Cursor is here
1958
when V is
1959
pressed.)
1960
1961
1962
Visual end
1963
(Cursor is moved
1964
to here)
1965

Draft 0.1

Not for widespread publication

Oh woe to Mertle the turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.
~
~
[No File] [+]
-- VISUAL LINE--

1966

Figure 6-4: V (line visual mode).

1967
1968

Note: To get help on the commands that operate in visual mode, use the
prefix v_. Therefore

1969

:help v_d

1970

describes what the d command does in visual mode.

1971
1972
1973

To highlight a rectangle on the screen, use CTRL-V as shown in Figure 6-5.


This mode is extremely useful if you want to work with tables. You can highlight
a column and delete it using the d command.

1974
Visual start
(Cursor is here
1975
when CTRL-V is
1976
pressed.)
1977
1978
1979
Visual end
1980
(Cursor is moved
1981
to here)
1982
1983

Oh woe to Mertle the turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.
~
~
[No File] [+]
-- VISUAL BLOCK-Figure 6-5: CTRL-V (block visual mode).

1984

Leaving Visual Mode

1985
1986
1987

Normally, you leave visual mode by typing a visual-mode command, such


as d to delete the highlighted text. But you can also cancel visual mode by
pressing the <Esc> key.

1988
1989
1990
1991
1992

Remember, you can always type <Esc> to get back to normal mode so you
know where you are. Some people find <Esc> a little annoying because it beeps if
you type it twice. The first <Esc> goes from visual mode to normal mode. The
second <Esc> in normal mode is an error and generates the beep. (The
command CTRL-C will do the same thing as well.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 101

Draft Not for publication

Draft 0.1

Not for widespread publication

1993
1994
1995

If you want to make sure that you are in normal mode and do not want to
generate a beep, use the CTRL-\CTRL-N command. This acts just like <Esc> but
without the noise.

1996

Editing with Visual Mode

1997
1998
1999

Editing with visual mode is simple. Select the text using the visual
commands just discussed, and then type an editing command. This section
shows you how to perform simple edits using a visual selection.

2000

Deleting Text in Visual Mode

2001
2002
2003

The d command deletes the highlighted text, as shown in Figure 6-6. The D
command deletes the highlighted lines, even if only part of a line is highlighted
(see Figure 6-7). (X does the same thing.)
Line 1
Line 2
Line 3
Line 4
Line 5.
~
~
~
~
lines.txt
-- VSUAL --

2004

Figure 6-6: Deleting text in visual mode.


Line 1
Line 2
Line 3
Line 4
Line 5.
~
~
~
~
lines.txt
-- VSUAL --

2005

d - deletes the
highlighted text

Line 1
2
Line 3
Line 4
Line 5.
~
~
~
~
lines.txt [+]

D - deletes the
highlighted lines

Line 1
Line 3
Line 4
Line 5.
~
~
~
~
~
lines.txt [+]

Figure 6-7: The visual D command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 102

Draft Not for publication

Draft 0.1

Not for widespread publication

2006

Yanking Text

2007
2008
2009

The y command places the highlighted text into a register. The linewise
version of this command, Y, places each line of the highlighted text into a
register.

2010

Switching Modes

2011
2012

Suppose you are in character mode (started by v) and you realize you want
to be in block mode. You can switch to block mode by just pressing CTRL-V.

2013
2014
2015
2016

In fact, you can switch visual modes at any time by just selecting the new
mode. To cancel visual mode, press the <Esc> key; or you can switch to the
mode you are already in. (In other words, if you use v to start visual mode, you
can use another v to exit it.)

2017

Changing Text

2018
2019

The c command deletes the highlighted text and starts insert mode. The C
does the same thing, but it works only on whole lines.

2020
2021

Note: r and s do the same thing as c in visual mode. The same thing goes
for R and S and the C command.

2022

Joining Lines

2023
2024
2025
2026

The J command joins all the highlighted lines into one long line. Spaces
are used to separate the lines. If you want to join the lines without adding
spaces, use the gJ command. Figure 6-8 shows how the J and the gJ commands
work.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 103

Draft Not for publication


Line 1
Line 2
Line 3
Line 4
~
~
~
~
~
lines.txt
-- VISUAL --

Draft 0.1

Line 1
Line 2 Line 3
Line 4
~
~
~
~
~
~
lines.txt [+]

gJ

2027

Not for widespread publication

Line 1
Line 2Line 3
Line 4
~
~
~
~
~
~
lines.txt [+]

Figure 6-8: The visual J and gJ command.

2028
2029

Commands for Programmers

2030
2031

The > command indents the selected lines by one "shift width." (The
amount of white space can be set with the 'shiftwidth' option.)

2032
2033
2034
2035
2036

The < does the process in reverse. (Note that these commands have a
different meaning when using visual block mode.) The = command indents the
text the proper amount according to what Vim thinks is the proper information
for your program. The CTRL-] command will jump to definition of the function
highlighted.

2037

Keyword Lookup

2038
2039
2040

The K command is designed to look up the selected text using the man
command. (Linux and UNIX only.) It works just like the normal-mode K
command except that it uses the highlighted text as the keyword.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 104

Draft Not for publication

Draft 0.1

Not for widespread publication

2041

Visual Block Mode

2042
2043
2044

Some commands work a little differently in visual block mode. Visual block
mode is started by pressing CTRL-V and is used to define a rectangle on the
screen.

2045

Inserting Text

2046
2047

The command Istring<Esc> inserts the text on each line starting at the
left side of the visual block, as seen in Figure 6-9.

2048
2049
2050
2051
2052

You start by pressing CTRL-V to enter visual block mode. Now you define
your block. Next you type I to enter insert mode followed by the text to insert.
As you type, the text appears on the first line. After you press <Esc> to end the
insert, the text will magically be inserted in the rest of the lines contained in the
visual selection. Figure 6-9 shows how this process works.
Do alpha.c
Do one.c
Do four.c
Do three.c
Do two.c
~
~
~
test.txt [+]
-- VISUAL BLOCK --

Do file alpha.c
Do one.c
Do four.c
Do three.c
Do two.c
~
~
~
test.txt [+]
-- INSERT --

Define the block


CTRL-Vjjjj

Enter the text by


typing I<Space>file

Do file alpha.c
Do file one.c
Do file four.c
Do file three.c
Do file two.c
~
~
~
test.txt [+]
-- VISUAL BLOCK -Press <Esc> to end the
insert.
2053

Figure 6-9: Inserting text in visual block mode.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 105

Draft Not for publication


2054
2055
2056
2057

Draft 0.1

Not for widespread publication

If the block spans short lines that do not extend into the block, the text is
not inserted in that line. Figure 6-10 illustrates what happens to short lines. If
the string contains a newline, the I acts just like a normal-mode insert (i)
command and affects only the first line of the block.
This is a long line
short
This is a long line
~
~
~
test.txt [+]
-- VISUAL BLOCK --

This is a very long line


short
This is a very long line
~
~
~
test.txt [+]

Select a block.
Notice that the short line is
not part of the selection.

Insert "very" in the line.


Notice that "Short" is
unchanged.

2058

Figure 6-10: Inserting with short lines.

2059

Changing Text

2060
2061
2062
2063
2064
2065

The visual block c command deletes the block and then throws you into
insert mode to enable you to type in a string. The string will be inserted on each
line in the block (see Figure 6-11). The c command works only if you enter less
than one line of new text. If you enter something that contains a newline, only
the first line is changed. (In other words, visual block c acts just normal-mode c
if the text contains more than one line.)

2066

This is a long line


short
This is a long line
~
~
~
test.txt [+]
-- VISUAL BLOCK --

This is a -- LONG -- line


short
This is a -- LONG -- line
~
~
~
test.txt [+]

Define the block to be


changed.

Change the text to --LONG--.


The command is
c--LONG--<Esc>

Figure 6-11: Block visual c command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 106

Draft Not for publication

Draft 0.1

Not for widespread publication

2067
2068
2069

Note: The string will not be inserted on lines that do not extend into the
block. Therefore if the block includes some short lines, the string will not
be inserted in the short lines.

2070
2071
2072
2073
2074

The C command deletes text from the left edge of the block to the end of
line. It then puts you in insert mode so that you can type in a string, which is
added to the end of each line (see Figure 6-12). Again, short lines that do not
reach into the block are excluded. (R and S act just like the C command except
they replace the text with what's insert instead of replacing multiple lines.)

2075
2076
2077
2078

This is a long line


short
This is a long line
~
~
~
test.txt [+]
-- VISUAL BLOCK --

This is changed
short
This is changed
~
~
~
test.txt [+]

Define the block.

Change to the end of line:


The command is
Cchanged<Esc>

Figure 6-12: Block visual C with short lines.


The visual block A throws Vim into insert mode to enable you to input a
string. The string is appended to the block (see Figure 6-13). If there are short
lines in the block, spaces are added to pad the line and then string is appended.
This is a long line
short
This is a long line
~
~
~
test.txt [+]
-- VISUAL BLOCK -Define the block

2079
2080
2081
2082
2083

This is a very laaaaong line


short
aaaa
This is a very laaaaong line
~
~
~
test.txt [+]
Append some text with the
command Aaaaa<ESC>

Figure 6-13: Block visual A command.


You can define a right edge of a visual block in two ways. If you use just
motion keys, the right edge is the edge of the highlighted area. If you use the $
key to extend the visual block to the end of line, the inserted text will add the
text to the end of each line (see Figure 6-14).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 107

Draft Not for publication

Draft 0.1

Not for widespread publication

This is a long line


short
This is a long line
~
~
~
test.txt [+]
-- VISUAL BLOCK --

This is a very long lineXXX


shortXXX
This is a very long lineXXX
~
~
~
test.txt [+]

Define the visual block by


using the command
CTRL-V$jj.
The $ moves the cursor to
the end of the line

Add "XXX" to the end of each line


with the AXXX<Esc> command.

2084

Figure 6-14: Block visual $ and A commands.

2085

Replacing

2086
2087
2088

The rchar command applies all the selected characters with a single
character (see Figure 6-15). Short lines that do not extend into the block are not
affected.
This is a long line
short
This is a long line
~
~
~
test.txt [+]
-- VISUAL BLOCK --

This is a very xxxx line


short
This is a very xxxx line
~
~
~
test.txt [+]

Define the block

The rx command replace all


characters in the block with x

2089

Figure 6-15: Block visual-mode r command.

2090

Shifting

2091
2092
2093
2094
2095
2096

The command > shifts the text to the right one shift width, opening
whitespace. The starting point for this shift is the left side of the visual block
(see Figure 6-16). The < command removes one shift width of whitespace at the
left side of the block (see Figure 6-17). This command is limited by the amount
of text that is there; so if there is less than a shift width of whitespace available,
it removes what it can.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 108

Draft Not for publication


2097
2098
2099
2100
2101

Draft 0.1

Not for widespread publication

Oh woe to Mertle the turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.

2102
2103
2104
2105
2106
2107

Oh woe t
who foun
Th
wa
And that

2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123

o Mertle the turtle


d web surffing quite a hurtle.
e system you see
s slower than he.
's not saying much for the turtle.

Figure 6-16: Block visual-mode > command.


aaa BBBBBBBBBBB
aaa BBBBBBBBBBB
aaa
BBBBBBBBBBB
aaa
BBBBBBBBBBB
aaa
BBBBBBBBBBB
aaa
BBBBBBBBBBB
-- VISUAL BLOCK -aaa
aaa
aaa
aaa
aaa
aaa

BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBB

2124

Figure 6-17: Block visual < command.

2125

Visual Block Help

2126
2127
2128

Getting help for the commands that use visual block mode differs a little
from other commands. You need to prefix the command with v_b_.To get help on
the visual block r command, for example, type the following:

2129

:help v_b_r

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 109

Draft Not for publication

Draft 0.1

Not for widespread publication

2130

Chapter 7: Commands for Programmers

2131
2132
2133

The Vim editor contains a large number of commands to make life easier
for programming. For example, Vim contains a number of commands to help you
obtain correct indentation, match parentheses, and jump around in source files.

2134
2135
2136
2137

One of the best features of Vim as far as a programmer is concerned are


the commands that enable you to build a program from within Vim and then go
through the error list and edit the files that caused trouble. In this chapter, you
learn about the following:

2138

Syntax coloring

2139

Automatic indentation

2140

Indentation commands

2141

Commands to navigate through the source code

2142

Getting information through the man command.

2143

The use of tags to go up and down a call stack

2144

Making programs with the :make command

2145

File searching with :vimgrep

2146

Syntax Coloring

2147

The following command turns on syntax coloring.

2148

:syntax on

2149

(:syntax on can be abbreviated :sy on.)

2150
2151
2152
2153
2154
2155

That means that things such as keywords, strings, comments, and other
syntax elements will have different colors. (If you have a black-and-white
terminal, they will have different attributes such as bold, underline, blink, and so
on.) You can customize the colors used for syntax highlighting as well as the
highlighting method itself.
To turn off syntax highlighting use the :syntax off (:sy off) command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 110

Draft Not for publication

Draft 0.1

Not for widespread publication

2156

Syntax Coloring Problems

2157
2158
2159

Most of the time syntax coloring works just fine. But sometimes it can be a
little tricky to set up. The following sections take a look at some common
problems and solutions.

2160

Colors Look Bad When I Use Vim (UNIX only)

2161
2162
2163
2164
2165
2166
2167

Ever try and read light yellow text on a white background? It is very hard
to do. If you see this on your screen, you have a problem. The Vim editor has
two sets of syntax colors. One is used when the background is light, and the
other when the background is dark. When Vim starts, it tries to guess whether
your terminal has a light or dark background and sets the option 'background'
to light or dark. It then decides which set of colors to use based on this option.
Be aware, however, that the editor can guess wrong.

2168
2169

To find out the value of the 'background' option, use the following
command:

2170

:set background?

2171
2172

If Vim's guess is not correct, you can change it using a command such as
this:

2173

:set background=light

2174

You must use this command before executing the command:

2175

:syntax on

2176

I Turned on Syntax Colors, but All I Get Is Black and White (UNIX)

2177
2178
2179
2180
2181
2182

A common problem affects the xterm program used on many UNIX


systems. The problem is that although the xterm program understands colors,
the terminal description for xterm frequently omits colors. This cripples syntax
coloring. To correct this problem, you need to set your terminal type to the color
version. On many versions of Linux this is xterm-color, and on Solaris this is
xtermc.

2183
2184

To fix this problem you need to know what shell (command process) you
are using. If you use csh, put the following in your $HOME/.cshrc file:

2185

if ($term == xterm) set term = xterm-color

2186

For bash put the following in your $HOME/.bashrc file:

2187

if [ $TERM = xterm]; then export TERM=xterm-color; fi

2188

Other systems and other shells require different changes.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 111

Draft Not for publication

Draft 0.1

Not for widespread publication

2189

I'm Editing a C File with a Non-Standard Extension. How Do I Tell Vim About It?

2190
2191
2192

The Vim editor uses a file's extension to determine the file type. For
example, files that end in .c or .h are considered C files. But what if you are
editing a C header file named settings.inc?

2193
2194
2195
2196

Because this is a non-standard extension, Vim will not know what to do


with it. So how do you tell Vim that this is a C file? The answer is to use the
option 'filetype'. This tells Vim which type of syntax highlighting to use. With
a C file, you use the following command:

2197
2198
2199
2200
2201

:set filetype=c
Now Vim knows that this file is a C file and will highlight the text
appropriately. If you want to make this setting automatically, look in the help
files with this command:
:help new-filetype

2202

Running the Color Test

2203
2204
2205
2206

If you are still having trouble with colors, run the Vim color test. This is a
short Vim program that displays all the colors on the screen so that you can
verify the correctness of the Vim colors. The color test can be started with these
two commands:

2207
2208

:edit $VIMRUNTIME/syntax/colortest.vim
:source %

2209

Matching Pairs

2210
2211
2212

The % command is designed to match pairs of (), {}, or []. Place the cursor
on one, type % and you will jump to the other. Figure 7-1 shows how the %
command works.

2213

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 112

Draft Not for publication

Draft 0.1

Not for widespread publication

find matching
2214
void foo ()
%
()
2215
{
find matching/* Check the conditions */
2216
{}
2217
if (a | | b | | c)
2218
{
2219
printf ("Alpha\n");
2220
%
2221
if (d | | e)
2222
{
%
2223
printf ("Beta");
2224
}
2225
}
2226
else
2227
{
2228
printf ("Gamma\n");
2229
}
2230
}
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248

Figure 7-1: % command.


The2% command will also match the ends of C comments (see Figure 7-2).
(For you non-C programmers, these begin with /* and end with */.)

%
/* A comment */

/*
* A multi-line comment.
*/
Figure 7-2: % and comments.

Also the % command will match #ifdef with the corresponding #endif.
(Same goes for #ifndef and #if.) For #if, #else, and #endif sets, the %
command will jump from the #if to the #else, and then to the #endif and back
to the #if. Figure 7-3 shows how % works with preprocesser directives.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 113

Draft Not for publication


2249
2250
2251
2252
2253
2254
2255
2256
2257

Not for widespread publication

#ifndef SIZE
#define SIZE 100
#endif /* SIZE */

%
%

Draft 0.1

#ifdef UNIX
#define EOL "\n";
#else /* UNIX */
#define EOL "\r\n";
#endif /* UNIX */

2258

Figure 7-3:% and the #if/#else/#endif.

2259
2260

Note: The Vim editor is smart about matching pairs of operators. It knows
about strings, and {} or [] will be ignored inside a string.

2261

Shift Commands

2262
2263
2264

The Vim editor has lots of commands that help the programmer indent his
program correctly. The first ones discussed here merely shift the text to the left
(114114<<) or the right (>>).

2265
2266

The left shift command (<<) shifts the current line one shift width to the
left. The right shift command (>>) does the same in the other direction.

2267
2268
2269
2270

But what is a shift width? By default, it is 8. However, studies have shown


that an indentation of 4 spaces for each level of logic is the most readable. So a
shift width of 4 would be much nicer. To change the size of the shift width, use
the following command:

2271

:set shiftwidth=4

2272

Figure 7-4 shows how the shift width option affects the >> command.

2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283

printf ( "Hello world! \n") ;

:set shiftwidth = 8
>>

printf ( "Hello world! \n") ;

printf ( "Hello world! \n") ;


:set shiftwidth = 4
>>
printf ( "Hello world! \n");
Figure 7-4: 'shiftwidth' and >>.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 114

Draft Not for publication

Draft 0.1

Not for widespread publication

2284
2285
2286

The << command shifts a single line. As usual you can prefix this command
with a count; for example, 5<< shifts 5 lines. The command <motion shifts each
line from the current cursor location to where motion carries you.

2287
2288

You can also highlight a set of lines in visual mode (v command) and then
shift them with < or >.

2289

Automatic Indentation

2290
2291

The Vim editor has a variety of automatic indentation options. The major
indentation modes are the following:

2292

cindent

This works for C-style programs (C, C++, Java, and so


on).When this style of indentation is enabled, the Vim editor
automatically indents your program according to a
"standard" C style.

smartindent

In this mode, Vim indents each line the same amount as the
preceding one, adding an extra level of indentation if the line
contains a left curly brace ({) and removing a indentation
level if the line contains a right curly brace (}). An extra
indent is also added for any of the keywords specified by the
'cinwords' option.

autoindent

New lines are indented the same as the previous line.

The next few sections explore these indentation modes in detail.

2293

C Indentation

2294
2295
2296
2297

The Vim editor knows something about how C, C++, Java, and other
structured language programs should be indented and can do a pretty good job
of indenting things properly for you. To enable C-style indentation, just execute
the following command:

2298
2299
2300
2301

:set cindent
With this option enabled, when you type something such as if (x), the
next line will automatically be indented an additional level. Figure 7-5 illustrates
how 'cindent' works.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 115

Draft Not for publication


2302
2303
2304
2305
2306
2307
2308

Automatic indent
Automatic Unindent
Automatic Indent
Automatic Unindent

2309
2310
2311

Draft 0.1

Not for widespread publication

if (flag)
do_the_work( );
if (other_flag) {
do_file ( ) ;
process_file();
}
Figure 7-5: cindent.

When you type something in curly braces ({}), the text will be indented at
the start and unindented at the end.

2312
2313
2314

Note: One side effect of automatic indentation is that it helps you catch
errors in your code early. I have frequently entered a } to finish a
procedure, only to find that the automatic indentation put it in column 4.

2315

This told me that I had accidentally left out a } somewhere in my text.

2316
2317
2318
2319

Different people have different styles of indentation. By default Vim does a


pretty good job of indenting in a way that 90% of programmers do. There are
still people out there with different styles, however; so if you want to, you can
customize the indentation style through the use of several options.

2320
2321
2322

You don't want to switch on the 'cindent' option manually every time you
edit a C file. This is how you make it work automatically: Put the following lines
in your .vimrc (UNIX) or _vimrc (Windows) file:

2323
2324

:filetype on
:autocmd FileType c,cpp :set cindent

2325
2326

(:filetype can be abbreviated :filet. :autocmd may be abbreviated


:au.)

2327
2328
2329

The first command (:filetype on) turns on Vim's file type detection logic.
The second, performs the command :set cindent if the file type detected is c
or cpp. (This includes C, C++, and header files.)

2330
2331
2332

You can use an autocommand to set the 'filetype' as well. There is a


special command :setfiletype (:setf) which sets the 'filetype' only if it has
not already been set by another :autocmd. For example:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 116

Draft Not for publication


2333
2334
2335
2336

:autocmd BufRead
:autocmd BufRead
Any other file
:autocmd BufRead

Draft 0.1

Not for widespread publication

*.cpp :set filetype=c


*.html :set filetype=html
types, set to text
* :setfiletype text

2337

Smartindent

2338
2339
2340
2341

The 'cindent' mode is not the only indent mode available to Vim users.
There is also the 'smartindent' mode. In this mode, an extra level of
indentation is added for each { and removed for each }. An extra level of
indentation will also be added for any of the words in the 'cinwords' option.

2342
2343
2344

Lines that begin with # are treated specially. If a line starts with #, all
indentation is removed. This is done so that preprocesser directives will all start
in column 1.The indentation is restored for the next line.

2345
2346

Note 'smartindent' is not as smart as 'cindent', but smarter than


'autoindent'.

2347

Autoindent

2348
2349
2350
2351
2352

Structured languages such as a Pascal, Perl, and Python use indentation to


help the programmer figure out what the program is doing. When writing these
programs, most of the time you want the next line indented at the same level as
the preceding one. To help you do this, the Vim editor has an 'autoindent'
option. When on, it causes lines to be automatically indented.

2353
2354
2355

Suppose, for example, that you have 'autoindent' off


(:set noautoident). To type the following text, you must type four spaces in
front of each printf:

2356
2357
2358
2359
2360
2361
2362
2363
2364
2365

if (true) {
printf("It is true\n");
printf("It is really true\n");
}
The character indicates a typed space.
If you have set the 'autoindent' option using the :set autoindent
command, the Vim editor automatically indents the second printf by four spaces
(to line up with the preceding line). Figure 7-6 illustrates the operation of the
'autoindent' option. Type four spaces for indent; with 'autoindent' set, the
following lines are automatically indented.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 117

Draft Not for publication


2366
2367autoindent
2368
2369

2375
2376
2377
2378
2379
2380

Not for widespread publication

if (true) {
printf("It is true\n");
printf("It is really true\n");
}

2370
2371
2372
2373
2374

Draft 0.1

Figure 7-6: 'autioindent'


That is nice, but when you get ready to enter the } line, the Vim editor also
indents four spaces. That is not good because you want the } to line up with the
if statement. While in insert mode, the CTRL-D command will cause Vim to back
up one shift width (see Figure 7-7). CTRL-D moves the } back one shift width.
if (true) {
printf("It is true\n");
printf("It is really true\n");
}

CTRL-D

2381

Figure 7-7: CTRL-D

2382

The = Command

2383
2384
2385
2386

The =motion command indents the selected text using Vim's internal
formatting program. If you want to indent a block of text, for example, you can
use the = command to do it. The motion in this case is the % (go to matching {})
command. Figure 7-8 shows the results.

2387
2388
2389
2390
2391
2392
2393

{
if (strcmp
return (1)
if (strcmp
return (1)
return (0)
}

(arg, option1) == 0)
;
(arg, option2) == 0)
;
;

2394

1) Position cursor on the first "{"

2395

2) Execute the command =%.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 118

Draft Not for publication


2396
2397
2398
2399
2400
2401
2402

if (strcmp
return
if (strcmp
return
return (0)

(arg, option1) == 0)
(1) ;
(arg, option2) ==0)
(1) ;
;

}
Figure 7-8: The = command.
Another way of doing this is to use the visual mode = command. For
example, to indent all the code inside a set of {} (including the {}), execute the
following commands:

2407

1. Position the cursor on the starting {.

2408

2. Start visual mode with v.

2409

3. Go to the other } with the % command.

2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424

Not for widespread publication

2403
2404
2405
2406

Draft 0.1

{
if (strcmp
return (1)
if (strcmp
return (1)
return (0)
}

(arg, option1) == 0)
;
(arg, option2) == 0)
;
;

4. Press = to indent the text.


{
if (strcmp
return
if (strcmp
return
return (0)

(arg, option1) == 0)
(1) ;
(arg, option2) ==0)
(1) ;
;

2425

Figure 7-9: The visual = command.

2426

Diff Mode

2427
2428
2429

Vim has a diff mode which displays the differences between two or more
files side by side. For example, let's take a look at the difference between two
different version of a program. To do this we execute the command:

2430

$ gvimdiff dlt-status.cpp.bad dlt-status.cpp.works

2431

Figure 7-10 shows the results:


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 119

Draft Not for publication

2433
2434
2435

Draft 0.1

Not for widespread publication

Figure 7-10: Results of gvimdiff


The first 29 lines are the same in both files so Vim has put in a fold hiding
them from you. The line:

2436

static int raw;

2437
2438
2439

is different between the two files. Not only is the line highlighted, but the
actual different (and extra i) is highlighted in a different color. You can also
easily see where a line was added in the first file as well.

2440
2441
2442

The nice thing about doing this in Vim is that you can edit both files. To
move from one window to another use the window left (CTRL-W h) or window
right (CTRL-W l) commands.

2443
2444
2445
2446

You can also easily move differences from one file to another. To move a
change from the current file to the other one, use the dp (diff put) command. To
move a change from the other file to the one you are editing now, use the do (diff
obtain) command.2
2

dg was already taken as it is the beginning of a d{motion} command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 120

Draft Not for publication


2447

Folding

2448
2449

7-11.

2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461

Draft 0.1

Not for widespread publication

Suppose you are looking at some badly written code such as that in Figure
if (condition) {
// ... 1200 lines of code
} else {
return (ERROR);
}
Figure 7-11: Bad code
If you look at the code normally, this is all you're going to see:
if (condition) {
// Junky code
// Junky code
// Junky code
// Junky code

line
line
line
line

1
2
3
4

2462
2463
2464

Now if you scroll down, and down, and down, and down, you'll finally get
the to the else clause. As you see figuring out the structure of such code is
difficult.

2465
2466

The Vim fold feature helps you see the structure of this style of code. Let's
see how to use this feature. To do this we execute the following steps:

2467

1. Put the cursor on the first line of junk code

2468

2. Press V to start visual line mode.

2469

3. Put the cursor on the "{" on the previous (if) line.

2470

4. Press % to go to the matching "}".

2471

5. Go up one line with the j command.

2472

6. Create a fold with the zf command

2473
2474
2475
2476
2477
2478
2479

Figure 7-12 displays the result:


#if (x) {
+--1200 lines: Junk code line 1----------------} else {
return (ERROR);
}
Figure 7-12: Screen after folding
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 121

Draft Not for publication

Draft 0.1

Not for widespread publication

2480
2481
2482

This makes it easy to see the structure of the program. If you want to see
what's in the fold that you just created, position the cursor on the fold and
execute the command zo (Fold Open).

2483
2484
2485

Note: Power users can do the same thing by positioning the cursor on the
"{" and entering zfi{. (This is the zf{motion} command with the inner { select
command: i{.)

2486
2487

So far we've been creating folds manually. This assumes that the
'foldmethod' ('fdm') is set to manual, the default.

2488
2489

We can also define folds based on indentation. Figure 7-13 shows some
unfolded code.

2490

2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502

if (a) {
if (b) {
if (d) {
if (e) {
if (f) {
do_something();
}
}
}
}
}
Figure 7-13: Unfolded text

2503

Now let's set the 'foldmethod' to indent.

2504

:set foldmethod=indent

2505

Suddenly all our code is folded. (See Figure 7-14.)

2506
2507
2508
2509
2510
2511

if (a) {
+-- 9 lines: if (b) {-------------------------}
Figure 7-14: Indent Level Folding
Now let's put the cursor on the fold and do a zo. One level of indention is
displayed. (See Figure 7-15.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 122

Draft Not for publication


2512
2513
2514
2515
2516
2517

Draft 0.1

Not for widespread publication

if (a) {
if (b) {
+--- 7 lines: if (d) {------------------------}
}
Figure 7-15: One level of indent unfolded

2518
2519

If we do another zo, another level of indentation is opened up. The zc


command closes one level of folding.

2520
2521
2522

The zo and zc commands open and close folds manually. In other words
this commands override what Vim would normally do. To reset the folding to the
defaults (no overrides) with the command zX.

2523
2524
2525

Sometimes a folding will cause the line the cursor is on to disappear. If


this happens the zv command opens just enough folds to make the line the
cursor is on visible.

2526
2527
2528
2529

So far we've been opening and closing folds manually. The 'foldlevel'
('fdl') option controls how many level of indents cause Vim to fold. For
example, if you set the 'foldlevel' to 3 anything indented three or more
'shiftwidth' ('sw') indentations is folded.

2530
2531
2532
2533
2534

You can use the :set command to adjust the 'foldlevel' but this is
cumbersome. Instead you can use the zm (fold more) command to reduce the
'foldlevel' increasing the amount of text folded. The zr (fold reduce)
increases the 'foldlevel', reducing the amount of text folded. Figure 7-16
shows how this works.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 123

Draft Not for publication

Draft 0.1

Not for widespread publication

2535
2536

Somewhere
off to the right
there's no
folding

zR

2537
2538
2539
2540

2541

zr

zr

if (a) {
if (a) {
if (a) {
+-- 9 lines: if (b) {
if (b) {
if (b) {
}
+-- 7 lines: if (d) {
if (d) {
}
+-- 5 lines: if (e) {
}
}
}
}
zm
zm

2542
zM

2543
2544

Figure 7-16: Increasing and decreasing the folding

2545
2546

Finally to totally get rid of folding use the zR command. To fold things to
the max use the zM command.

2547
2548
2549
2550
2551
2552

C and C++ are problem languages in that they have these nasty preprocessor directives that don't following the normal indenting rules. To handle
these types of lines the 'foldignore' ('fdi') is used. It tells Vim that any lines
that begin with a certain character are not to be considered for computing the
indentation of a line. Instead these lines inherit their indentation level from the
lines above or below.

2553
2554
2555

Initially when you start editing the 'foldlevel' is set to 1. If you want to
have it start at a different value, set the 'foldlevelstart' ('fdls') to whatever
you want the initial value to be.

2556

Locating Items in a Program

2557
2558

Programmers made the Vim editor, so it has a lot of commands that can be
used to navigate through a program. These include the following:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 124

Draft Not for publication

Draft 0.1

Not for widespread publication

CTRL-I, ]CTRL-I

Search for a word under the cursor in the current file


and any brought in by #include directives.

gd, gD

Search for the definition of a variable.

]CTRL-D, [CTRL-D

Jump to a macro definition.

]d, [d, ]D, [D

Display macro definitions.

2559
2560

Instant Word Searches Including #include Files ([CTRL-I, ]CTRL-I)

2561
2562
2563

The [CTRL-I command jumps to the word under the cursor. The search
starts at the beginning of the file and also searches files brought in by #include
directives. The ]CTRL-I does the same thing, starting at the cursor location.

2564

Jumping to a Variable Definition (gd, gD)

2565
2566
2567
2568
2569

The gd command searches for the local declaration of the variable under
the cursor (see Figure 7-17).This search is not perfect because Vim has a limited
understanding of C and C++ syntax. In particular, it goes to the wrong place
when you ask for the local declaration of a global variable. Most of the time,
however, it does a pretty good job.

2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582

int global_var;
int main()
{
int local_var;

gd
Moves cursor to here.
'hlsearch' is on

global_var = local_var = 5;
printf("%d %d", global_var, local_var);
return (0);
}
Figure 7-17: The gd command.
The gD command searches for the global definition of the variable under
the cursor(see Figure 7-18). Again, this search is not perfect, but most of the
time it does the right thing.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 125

Draft Not for publication


2583
2584
2585
2586
2587
2588
2589
2590
2591
2592

Draft 0.1

int global_var;
int main()
{
int local_var;

Not for widespread publication


gD
Moves cursor to here.
'hlsearch' is on

global_var = local_var = 5;
printf("%d %d", global_var, local_var);
return (0);
}
Figure 7-18: The gD command.

2593

Jump to Macro Definition ([CTRL-D, ]CTRL-D)

2594
2595
2596
2597
2598

The [CTRL-D command searches for the first definition of the macro whose
name is under the cursor. The ]CTRL-D command searches for the next
definition of the macro. These commands search not only the file you are
editing, but also all files that are #included from this file. Figure 7-19 shows the
[CTRL-D and ]CTRL-D commands.

2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614

#include <stdio.h>
[CTRL-D
#define SIZE 10
int i = EOF ;
int main ( )
{
for (i = 1; i <= SIZE; ++i)
{
printf( "%2d squared is %3d\d", i,
i*i)
;
}
return (0) ;
]CTRL-D
}
#undef SIZE
#define SIZE 20
Figure 7-19: [CTRL-D and ]CTRL-D.

2615

Displaying Macro Definitions ([d, ]d, [D, ]D)

2616
2617
2618
2619

The [d command displays the first definition of the macro whose name is
under the cursor. The ]d command does the same thing only it starts looking
from the current cursor position and finds the next definition. Figure 7-20 shows
the result of [d.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 126

Draft Not for publication


2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657

Draft 0.1

Not for widespread publication

#include <stdio.h>
#define SIZE 10
[d
int i = EOF;
int main()
{
for (i = 1; i <= SIZE; ++i)
{
printf("%2d squared is %3d\n", i,
i*i);
}
return (0);
}
#undef SIZE
#define SIZE 20
Figure 7-20: [d command.
Again, #include files are searched as well as the current one.
The ]D and [D commands list all the definitions of a macro. The difference
between the two is that [D starts the list with the first definition, whereas ]D
starts the list with the first definition after the cursor. Figure 7-21 shows the
results of a [D command.
int main()
{
for (i = 1; i <= SIZE; ++i)
{
printf("%2d squared is %3d\n", i, i*i);
}
return (0);
}
#undef SIZE
#define SIZE 20
~
~
~
test.c
1:
2 #define SIZE 10
2:
13 #define SIZE 20
Press RETURN or enter command to continue
Figure 7-21: [D command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 127

Draft Not for publication

Draft 0.1

Not for widespread publication

2658

Shifting a Block of Text Enclosed in {}

2659
2660
2661
2662

Suppose that you want to indent the text encoded in {} one level. Position
the cursor on the first (or last) {. Execute the command >%. This shifts the text
right to where the motion takes you. In this case, % takes you to the matching
{}. Figure 7-22shows how these commands work.

int flag;
int main ()
{
if (flag)
Scope
{
of
printf ("Flag set/n");
%
do_it () ;
}
return (0) ;
}

>%

2663
2664
2665

Figure 7-22:Shifting a block of text.


Unfortunately this shifts the {} in addition to the text. Suppose you just
want to shift what is in the {}. Then you need to do the following:

2666

1. Position the cursor on the first {.

2667

2. Execute the command >i{.

2668
2669
2670

int flag;
int main ()
{
if (flag)
{
printf ("Flag set/n");
do_it () ;
}
return (0) ;
}

This shift right command (>) shifts the selected text to the right one shift width.
In this case, the selection command that follows is i{, which is the "inner {}
block" command. Figure 7-23 shows the execution of these commands.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 128

Draft Not for publication

>i{

Scope
of
i{

2671
2672
2673

int flag;
int main ()
{
if (flag)
{
printf ("Flag set/n");
do_it () ;
}
return (0) ;
}

Draft 0.1

Not for widespread publication

int flag;
int main ()
{
if (flag)
{
printf ("Flag set/n");
do_it () ;
}
return (0) ;
}

Figure 7-23: Shifting a block of text (better method).

Indenting a Block Using Visual Mode


To indent a block using visual mode, follow these steps:

2674

1. Position the cursor on the left or right curly brace.

2675

2. Start visual mode with the v command.

2676

3. Select the inner {} block with the command i}.

2677

4. Indent the text with >.

2678

Finding the man Pages

2679
2680
2681

The K command runs a UNIX man command using the word under the
cursor as a subject. If you position the cursor on the word open and press K, for
example, the man page for open will display.

2682
2683

On Microsoft Windows, the K command does the equivalent of performing a


:help (:h, <Help>, <F1>) on the word under the cursor.

2684
2685

You can also use the visual K command to do the same thing. The format of
the man command is as follows:

2686

$ man [section] subject

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 129

Draft Not for publication

Draft 0.1

Not for widespread publication

2687
2688
2689
2690
2691

The K command gets the subject from the word under the cursor. But what
if you need to select the section number? It is simple; the K command takes a
count argument. If specified, this is used as the section number. Therefore, if
you position the K over the word mkdir and execute the 2K, you will get the
mkdir(2) page.

2692
2693
2694
2695
2696
2697

You can customize the Error: Reference source not foundK command. It
runs the program specified by the 'keywordprg' ('kp') option. By default, on
UNIX this is man. Solaris has a non-standard man command. Sections must be
specified with the -s switch. So the 'keywordprg' option defaults to man -s on
Solaris. The Vim editor is smart enough to know that if no section is specified,
that it must drop the -s.

2698
2699
2700
2701

On Microsoft Windows, there is no man command, so 'keywordprg'


defaults to nothing ("").This tells Vim to use the internal :help command to
handle the K command. Finally, the definition of what the K command considers
a word is defined by the 'iskeyword' ('isk') option.

2702

Tags

2703
2704
2705
2706
2707

The Vim editor can locate function definitions in C and C++ programs.
This proves extremely useful when you are trying to understand a program. The
location of function definitions (called tags in Vim terminology) is stored in a
table of contents file generated by the program ctags.3 To generate the table of
contents file, which is named tags, use the following command:

2708
2709
2710
2711
2712
2713
2714
2715

$ ctags *.c
Now when you are in Vim and you want to go to a function definition, you
can jump to it by using the following command:
:tag function
This command will find the function even if it is another file. The CTRL-]
command jumps to the tag of the word that is under the cursor. (g<LeftMouse>
and <C-LeftMouse> are equivalent to CTRL-].) This makes it easy to explore a
tangle of C code.

3 You may need to install Exuberant ctags from http://ctags.sourceforge.net/ if you system does
not have it already.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 130

Draft Not for publication


2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728

Draft 0.1

Not for widespread publication

Suppose, for example, that you are in the function write_block. You can
see that it calls write_line. But what does write_line do? By putting the
cursor on the call to write_line and typing CTRL-], you jump to the definition of
this function (see Figure 7-24). The write_line function calls write_char. You
need to figure out what it does. So you position the cursor over the call to
write_char and press CTRL-]. Now you are at the definition of write_char (see
Figure 7-25).
void write_block(char line_set[])
{
int i;
for (i = 0; i < N_LINES; ++i)
write_line(line_set[i]);
}

2729
2730

CTRL-] goes to the definition of write_line (switching files if needed).

2731

The command :tag write_line does the same thing

2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750

void write_line(char line[])


{
int i;
for (i = 0; line[0] != '\0')
write_char(line[i]);
}
~
"write_line.c" 6L,
Figure 7-24: Tag jumping with CTRL-].
void write_char(char ch)
{
CTRL-] with cursor on
write_raw(ch);
write_char gets us here
}
~
"write_char.c" 4L, 48C
Figure 7-25: Jumping to the write_char tag.
The :tags command shows the list of the tags that you have traversed
through (see Figure 7-26).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 131

Draft Not for publication


2751
2752
2753
2754
2755
2756
2757
2758

Draft 0.1

Not for widespread publication

~
:tags
# TO tag
FROM line
1
1 write_block
1
2
1 write_line
5
3
1 write_char
5
>
Press RETURN or enter command to continue

2759

in file/text
write_block.c
write_block.c
write_line.c

Figure 7-26: The :tags command.

2760
2761
2762

Now to go back. The CTRL-T command goes the preceding tag. (The
commands g<RightMouse> and <C-RightMouse> do the same thing.) This
command takes a count argument that indicates how many tags to jump back.

2763
2764

So, you have gone forward, and now back. Let's go forward again. The
following command goes to the next tag on the list:

2765
2766
2767

:tag
You can prefix it with a count and jump forward that many tags. For
example:

2768

:3tag

2769

Figure 7-27 illustrates the various types of tag navigation.

:tag write_block
CTRL-] (on write_line)

write_block

write_char

write_line

CTRL-T

:2tag
2CTRL-T

CTRL-] (on write_char)

:tag

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 132

Draft Not for publication


2771

Draft 0.1

Not for widespread publication

Figure 7-27: Tag navigation.

2772

Help and Tags

2773
2774
2775

The help system makes extensive use of tags. To execute a "hyperlink


jump," you press CTRL-] (jump to tag).You can return to a preceding subject
with CTRL-T (jump to preceding tag) and so on.

2776

Windows and Tags

2777
2778
2779
2780
2781

The :tag command replaces the current window with the one containing
the new function. But suppose you want to see not only the old function but also
the new one? You can split the window using the :split command followed by
the :tag command. But Vim has a shorthand command that is shorthand for both
commands:

2782

:stag name

2783

Figure 7-28 shows how this command works.


void write_block(
char line_set[]
)
{
int i;
for (i = 0; i < N_LINES;
write_line(line_set[i]);
}

void write_char(char ch)


{
write_raw(ch);
write_char.c
for (i = 0; i < N_LINES; ++i)
write_line(line_set[i]);
write_block.c
"write_char.c" 4L,

2784

:stag write_char

2785

Figure 7-28: The :stag command.

2786
2787
2788
2789

The CTRL-W] command splits the current window and jumps to the tag
under the cursor in the upper window (see Figure 7-29). (CTRL-W CTRL-] works
as well.) If a count is specified, the new window will be count lines high.
void write_block(
char line_set[]
)
{
int i;
for (i = 0; i < N_LINES;
write_line(line_set[i]);
}

void write_line(char line[])


{
int i;
write_line.c
for (i = 0; i < N_LINES; ++i)
write_line(line_set[i]);
write_block.c
"write_char.c" 4L,

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 133

Draft Not for publication


2790

Draft 0.1

Not for widespread publication

Figure 7-29: CTRL-W].

2791

Finding a Procedure When You Only Know Part of the Name

2792
2793
2794
2795
2796
2797

Suppose you "sort of " know the name of the procedure you want to find?
This is a common problem for Microsoft Windows programmers because of the
extremely inconsistent naming convention of the procedures in the Windows API.
UNIX programmers fare no better. The convention is consistent; the only
problem is that UNIX likes to leave letters out of system call names (for example,
creat).

2798
2799
2800
2801
2802

You can use the :tag command to find a procedure by name, or it can
search for a regular expression. If a procedure name begins with /, the :tag
command assumes that the name is a regular expression. If you want to find a
procedure named "something write something," for example, you can use the
following command:

2803
2804
2805
2806
2807
2808
2809

:tag /write
This finds all the procedures with the word write in their names and
positions the cursor on the first one. If you want to find all procedures that
begin with read, you need to use the following command:
:tag /^read
If you are not sure whether the procedure is DoFile, do_file, or Do_File,
you can use this command:

2810

:tag /DoFile\|do_file\|Do_File

2811

or

2812

:tag /[Dd]o_\=[Ff]ile

2813
2814
2815
2816
2817

These commands can return multiple matches. You can get a list of the
tags with the following command:
:tselect name
(:tselect may be abbreviated as :ts.) Figure 7-30 shows the results of a
typical :tselect command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 134

Draft Not for publication


2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828

Not for widespread publication

~
# pri kind tag
file
> 1 F C f write_char
write_char.c
void write_char(char ch)
2 F f write_block
write_block.c
void write_block(char line_set[])
3 F f write_line
write_line.c
void write_line(char line[])
4 F f write_raw
write_raw.c
void write_raw(char ch)
Enter nr of choice (<CR> to abort):

2829
2830
2831

Draft 0.1

Figure 7-30: :tselect command.


The first column is the number of the tag. The second column is the
Priority column. This contains a combination of three letters.

2832

Full match (if missing, a case-ignored match)

2833

Static tag (if missing, a global tag)

2834

Tag in the current file

2835
2836
2837

The last line of the :tselect command gives you a prompt that enables
you to enter the number of the tag you want. Or you can just press Enter (<CR>
in Vim terminology) to leave things alone.

2838
2839
2840
2841
2842

The g] command does a :tselect on the identifier under the cursor. The
:tjump command (a.k.a. :tj) works just like the :tselect command, except if
the selection results in only one item, it is automatically selected. The gCTRL-]
command does a :tjump on the word under the cursor. A number of other
related commands relate to this tag selection set, including the following:
:[count] tnext
:[count] tn

Go to the next tag

:[count] tprevious
:[count] tp

Go to the previous tag

:[count] tNext
:[count] tN
:[count]
:[count]
:[count]
:[count]

trewind
tr
tfirst
tf

:[count] tlast
:[count] tl

Go to the first tag

Go to the last tag

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 135

Draft Not for publication


2843
2844

Draft 0.1

Not for widespread publication

Figure 7-31 shows how to use these commands to navigate between


matching tags of a :tag or :tselect command.

2845
:tag /write
:tnext

:tnext

write_block

write_char

write_line

:tprevious
:tnext

:trewind

:tlast

2846

Figure 7-31: Tag navigation.

2847
2848

Shorthand Commands

2849
2850
2851

The command :stselect (:sts) does the same thing as :tselect, except
that it splits the window first. The :stjump does the same thing as a :split and
a :tjump.

2852

The Care and Feeding of Makefiles

2853
2854
2855
2856
2857

The UNIX make command is designed to manage the compilation and


building of programs. The commands to make are stored in a file called
Makefile. The format of this file, although simple, is a little tricky to work with.
In the following file, for example, the first command works, whereas the second
contains an error:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 136

Draft Not for publication


2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871

Not for widespread publication

alpha.o: alpha.c
gcc -c alpha.c
beta.o: beta.c
gcc -c beta.c
You may have a little difficulty seeing the problem from this listing. The
problem is that the indent for the first command is a tab, whereas the indent on
the second one uses eight spaces. This difference is impossible to see on screen;
so how do you tell the difference between the two versions? The following
command puts Vim in list mode:
:set list
In this mode, tabs show up as ^I. Also the editor displays $ at the end of
each line (so you can check for trailing spaces). Therefore, if you use the
following command

2872

:set list

2873

your example looks like this:

2874
2875
2876
2877
2878

Draft 0.1

alpha.o: alpha.c$
^Igcc -c alpha.c$
$
beta.o: beta.c$
gcc -c beta.c$

2879
2880

From this it is easy to see which line contains the spaces and which has a
tab. (You can customize list mode by using the 'listchars' ('lcs') option.)

2881
2882
2883
2884

If the 'expandtab' option is set, when you type a tab, Vim inserts spaces.
This is not good if you are editing a Makefile. To insert a real tab, no matter
what the options are, type in CTRL-V<Tab> in insert mode. The CTRL-V tells Vim
not to mess with the following character.

2885
2886
2887
2888
2889

Note: If you have syntax coloring turned on, the Vim editor will highlight
lines that begin with spaces in red, whereas lines that start with <Tab>
display normally.
Sorting a List of Files
Frequently in a Makefile, you will see a list of files:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 137

Draft Not for publication


2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904

Draft 0.1

SOURCES = \
time.cpp
set_ix.cpp
rio_io.cpp
arm.cpp
app.cpp
amem.cpp
als.cpp
aformat.cpp \
adump.cpp
rio.cpp
progress.cpp
add.cpp
acp.cpp
rio_glob.cpp

Not for widespread publication

\
\
\
\
\
\
\
\
\
\
\
\

2905
2906

To sort this list, execute the following:

2907

1. Position the cursor on the start of the list.

2908

2. Mark this location as a by using the command ma.

2909

3. Go to the bottom of the list.

2910
2911

4. Run the block through the external program sort using the command
!'a sort.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 138

Draft Not for publication


2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929

SOURCES = \
acp.cpp
add.cpp
adump.cpp
aformat.cpp \
als.cpp
amem.cpp
app.cpp
arm.cpp
progress.cpp
rio_glob.cpp
rio_io.cpp
rio.cpp
set_ix.cpp
time.cpp

Not for widespread publication

\
\
\
\
\
\
\
\
\
\
\
\

All the lines, except the last one, must end with a backslash (\). Sorting
can disrupt this pattern. Make sure that the backslashes are in order after a
sort. Figure 7-32 shows how you might need to fix the source list.
SOURCES = \
acp.cpp
add.cpp
adump.cpp
aformat.cpp
als.cpp
amem.cpp
app.cpp
arm.cpp
progress.cpp
rio.cpp
rio_glob.cpp
rio_io.cpp
set_ix.cpp
time.cpp

2930

Draft 0.1

\
\
\
\
\
\
\
\
\
\
\
\
\

SOURCES = \
acp.cpp
\
add.cpp
\
adump.cpp
\
aformat.cpp
\
als.cpp
\
amem.cpp
\
app.cpp
\
arm.cpp
\
progress.cpp \
rio.cpp
\
Fix
rio_glob.cpp \
rio_io.cpp
\
set_ix.cpp
\
Fix
time.cpp

Figure 7-32: Fixing the source list.

2931

Sorting a List in Visual Mode

2932
2933

To sort a list using visual mode, you need to execute the following
commands:

2934

1. Move to the top of the text to be sorted.

2935

2. Start line visual mode with the command V.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 139

Draft Not for publication

Draft 0.1

Not for widespread publication

2936

3. Move to the bottom of the text to be sorted.

2937
2938
2939

4. Execute the command !sort. The ! tells Vim to pipe the selected text
through a command. The command in this case is sort. (This command
has an implied <Enter> at the end.)

2940

Making the Program

2941
2942
2943
2944
2945

The Vim editor has a set of commands it calls the quick-fix mode. These
commands enable you to compile a program from within Vim and then go
through the errors generated fixing them (hopefully). You can then recompile
and fix any new errors that are found until finally your program compiles without
error.

2946

The :make command

2947
2948

The :make (:mak) command runs the program make (supplying it with any
argument you give) and captures the results:

2949

:make [arguments]

2950
2951

If errors were generated, they are captured and the editor positions you
where the first error occurred.

2952
2953
2954

Take a look at a typical :make session. (Typical :make sessions generate far
more errors and fewer stupid ones.) Figure 7-33 shows the results. From this
you can see that you have errors in two files, main.c and sub.c.

2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971

:!make | & tee /tmp/vim215953.err


gcc g Wall o prog main.c sub.c
main.c: In function `main':
main.c:6: too many arguments to function `do_sub'
main.c: At top level:
main.c:10: parse error before `}'
sub.c: In function `sub':
sub.c:3: `j' undeclared (first use in this function)
sub.c:3: (Each undeclared identifier is reported only once
sub.c:3: for each function it appears in.)
sub.c:4: parse error before `}'
sub.c:4: warning: control reaches end of non-void function
make: *** [prog] Error 1
2 returned
"main.c" 11L, 111C
(3 of 12): too many arguments to function `do_sub'
Press RETURN or enter command to continue

2972

Figure 7-33: :make output.

2973
2974

When you press Enter (what Vim calls Return), you see the results shown
in Figure 7-34.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 140

Draft Not for publication


2975
2976
2977
2978
2979
2980
2981
2982
2983
2984

2990

Not for widespread publication

int main()
{
int i=3;
do_sub("foo");
++i;
return (0);
}
}
~
(3 of 12): too many arguments to function do_sub

2985
2986
2987
2988
2989

Draft 0.1

Figure 7-34: The first error.


The editor has moved you to the first error. This is line 6 of main.c. You
did not need to specify the file or the line number, Vim knew where to go
automatically. The following command goes to where the next error occurs (see
Figure 7-35):
:cnext

2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001

int main()
{
int 1=3;
do_sub("foo");
++i;
return (0);
}
}
~
(5 of 12): parse error before `}

3002

Figure 7-35: :cnext.

3003
3004
3005
3006

Note: If you are a Visual-C++ user, the make program supplied by


Microsoft is called nmake. You might need to customize Vim using the
'makeprg' option so that it uses this program rather than the default make
(as discussed later in this chapter##where##).

3007
3008
3009

The command :cprevious or :cNext goes to the previous error. Similarly,


the command :clast goes to the last error and :crewind goes to the first. The
:cnfile goes to first error message for the next file (see Figure 7-36).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 141

Draft Not for publication


3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020

Figure 7-36: :cnfile command


If you forget what the current error is, you can display it using the
following command:

3024

:cc

3025

To see a list of errors, use the commands:

3026

:copen

3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039

Not for widespread publication

int sub(int i)
{
return (i * j)
}
~
~
~
~
~
~
(7 of 12): `j' undeclared (first use in this function)

3021
3022
3023

Draft 0.1

This command opens a new window showing all the errors as shown in
Figure 7-37.
int sub(int i)
{
return (i * j)
}
~
~
~
~
~
~
(7 of 12): `j' undeclared (first use in this function)

3040

Figure 7-37: :copen command

3041
3042

To see a list of errors, execute the command:

3043

:clist

3044

Figure 7-38 shows the output of a :clist command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 142

Draft Not for publication


3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055

Figure 7-38: :clist command


If you want to list only a subset of the errors, you can give :clist a range
of errors to list. For example:

3059

:clist 3,5 (List errors 3 through 5)

3060

:clist ,5

3061

:clist 5,

3062
3063

Not for widespread publication

~
~
:clist
3 main.c:6: too many arguments to function `do_sub'
5 main.c:10: parse error before `}'
7 sub.c:3: `j' undeclared (first use in this function)
8 sub.c:3: (Each undeclared identifier is reported only once
9 sub.c:3: for each function it appears in.)
10 sub.c:4: parse error before `}'
11 sub.c:4: warning: control reaches end of non-void function
Press RETURN or enter command to continue

3056
3057
3058

Draft 0.1

(List errors 1-5)


(List errors 5 to the end)

The Vim editor suppresses all informational messages. If you want


everything, use the following command:

3064

:clist!

3065

The override option (!) tells Vim to not suppress anything.

3066
3067
3068
3069

If you have already run make and generated your own error file, you can
tell Vim about it by using the :cfile error-file command. Where error-file
is the name of the output of the make command or compiler. If the error-file is
not specified, the file specified by the 'errorfile' option is used.

3070
3071

Finally the following command exits Vim like :quit but exits with an error
status (exit code=1):

3072

:cquit

3073
3074

This is useful if you are using Vim in an integrated development


environment and a normal exit would cause a recompilation.

3075

The 'errorfile' Option

3076
3077
3078
3079

The 'errorfile' option (also 'ef') defines the default filename used for
the :clist command (:cl) as well as the -q command-line option. (This file is
not used for the :make command's output.) If you want to define your default
error file, use the following command:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 143

Draft Not for publication


3080

Draft 0.1

Not for widespread publication

:set errorfile=error.list

3081

Searching for a Given String

3082
3083

The :vimgrep (:vi) command searches files for a given regular expression.
To find all occurrences of the word hack, for example, you use this command:

3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098

:vimgrep /hack/ /usr/src/linux**/*.c


This command searches for the regular expression hack through all the
files that match the wildcard *.c in the directory /usr/src/linux and all directories
below it (**). Figure 7-39 shows the results.
/* A hack. Not moving message rate limiting to adev->xxx
* (it's only a debug message after all) */
static int rate_limit = 0;
if (rate_limit++ < 3)
log(L_IOCTL, "Please report in case toggling the power "
"LED doesn't work for your card!\n");
if (enable)
write_reg16(adev, IO_ACX_GPIO_OUT,
read_reg16(adev, IO_ACX_GPIO_OUT) & ~gpio_pled);
(1 of 481): /* A hack. Not moving message rate limiting t
2677,7-14

3099
3100
3101
3102
3103
3104
3105
3106
3107
3108

63%

Figure 7-39: :vimgrep output.


Note: The :vimgrep command knows nothing about C syntax, so it will
find hack even it occurs inside a string or comment.
You can use the :cnext (:cn), :cprevious (:cp, :cNext, :cN) , and :cc
commands to page through the list of matches. Also :crewind (:crew,
:cfirst, :cf) goes to the first match and :clast (:cl) to the last. Finally, the
following command goes to the first match in the next file:
:cnfile
The :copen (:cope) command opens a new window containing all the items
found as seen in Figure 7-40.

3109

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 144

Draft Not for publication


3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133

Draft 0.1

Not for widespread publication

acxpci_l_power_led(acx_device_t *adev, int enable)


{
u16 gpio_pled = IS_ACX111(adev) ? 0x0040 : 0x0800;
/* A hack. Not moving message rate limiting to adev->xxx
* (it's only a debug message after all) */
static int rate_limit = 0;
if (rate_limit++ < 3)
3rdparty/acx/pci.c [RO]
2677,7-14
63%
3rdparty/acx/pci.c|2677 col 7| /* A hack. Not moving message rate limiting to
adev->xxx
3rdparty/at76c503a/at76_usb.c|5410 col 27| /* jal: this is a dirty hack needed by
Tim in ad-hoc mode */
3rdparty/at76c503a/at76_usb.c|5560 col 12| /* Magic hack for Novell IPX-in-802.3
packets */
3rdparty/ipw3945/ipw3945.c|11004 col 4| /* hack this function to show different
aspects of received frames,
3rdparty/ipw3945/ipw3945.c|11149 col 21| *
but you can hack it to show more, if
you'd liketo. */
3rdparty/ndiswrapper/ntoskernel.c|1778 col 57| * related to ACPI: "_SM_" and
"_DMI_". This may be the hack they do
[Quickfix List]
1,1
Top
:cc

3134

Figure 7-40: Result of :copen

3135
3136
3137

You can move up and down this list using the normal movement
commands. When you a item you are interested in, you can press <Enter> and
Vim will jump to that location.

3138

Vim and outside edits

3139
3140
3141

When I'm programming Java, I like to use the Eclipse IDE. One nice
feature of this program is that it does a good job of suggesting fixes for simple
errors in your code.

3142
3143
3144
3145

Let's suppose you've written a Java program with Vim and wish to see if it
compiles. You write it out using the :w command and load it in Eclipse. Being a
typical programmer, the file needs some fixing, so you let Eclipse fix it. After
saving the file, the one in the Vim editor is out of date.

3146
3147
3148
3149

Vim will detect this and ask if you wish to load the file. If you answer yes,
it will read in the new file and let you continue editing. Eclipse will do the same
thing, so the two editors (Vim and Eclipse's internal editor) work well together as
long as you remember to save the changes after each edit.

3150
3151

Vim also has a option: 'autoread' ('ar') which will cause the editor to
automatically read a file when a change is detected.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 145

Draft Not for publication

Draft 0.1

Not for widespread publication

3152

Other Interesting Commands

3153
3154
3155
3156
3157

The Vim editor can use different options for different types of files through
the use of the :autocmd command. See Chapter 13: Autocommands for more
information. You can also customize your options on a per-file basis by putting
something called a modeline in each file. The Vim editor scans your file looking
for these lines and sets things up based on their content.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 146

Draft Not for publication

Draft 0.1

Not for widespread publication

3159

Chapter 8: Basic Abbreviations, Keyboard Mapping,


and Initialization Files

3160
3161

tasks.

3162
3163
3164
3165
3166
3167
3168

One of these is abbreviation, which enables you to type in part of a word


and let Vim type the rest. Another is the ability to remap the keyboard. You can
easily redefine a key to be a whole set of commands. After you design your
customizations, you can save them to an initialization file that will automatically
be read the next time you start Vim. This chapter discusses the most common
and useful subset of these commands. For a more complete reference, see
Chapter 24: All About Abbreviations and Keyboard Mapping. "

3169

Abbreviations

3170
3171
3172
3173
3174

An abbreviation is a short word that takes the place of a long one. For
example, ad stands for advertisement. The Vim editor enables you to type in an
abbreviation and then will automatically expand it for you. To tell Vim to expand
the abbreviation ad into advertisement every time you type it, use the following
command:

3158

The Vim editor has some features that enable you to automate repetitive

3175

:abbreviate ad advertisement

3176

(:abbreviate can be abbreviated as :ab.)

3177
3178

Now, when you type ad, the whole word advertisement will be inserted into
the text.
What is Typed

Result

I saw the a

I saw the a

I saw the ad

I saw the ad

I saw the ad<space> I saw the advertisement<space>


3179
3180

It is possible to define an abbreviation that results in multiple words. For


example, to define JB as Jack Benny, use the following command:

3181

:abbreviate JB Jack Benny

3182

As a programmer, I use two rather unusual abbreviations:

3183
3184

:abbreviate #b /****************************************
:abbreviate #e <space>****************************************/

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 147

Draft Not for publication

Draft 0.1

Not for widespread publication

3185
3186
3187
3188
3189
3190
3191
3192

These are used for creating boxed comments. The comment starts with #b,
which draws the top line. I then put in the text and use #e to draw the bottom
line. The number of stars (*) in the abbreviations is designed so that the right
side is aligned to a tab stop. One other thing to notice is that the #e abbreviation
begins with a space. In other words, the first two characters are space-star.
Usually Vim ignores spaces between the abbreviation and the expansion. To
avoid that problem, I spell space as seven characters: "<", "s", "p", "a", "c", "e",
">".

3193

Listing Your Abbreviations

3194
3195

The command :abbreviate (:ab) lists all your current abbreviations.


Figure 8-1 shows a typical execution of this command.

3196
3197
3198
3199
3200
3201
3202
3203
3204

~
~
! #j
Jack Benny Show
! #l
/*------------------------------------------------------*/
! #e
********************************************************/
! #b
/********************************************************/
! #i
#include
! #d
#define
Press RETURN or enter command to continue

3205
3206
3207
3208

Figure 8-1: :abbreviate.


Note: The abbreviation is not expanded until after you finish the word by
typing a space, tab, or other whitespace. That is so that a word such as
addition won't get expanded to advertisementdition.

3209

Mapping

3210
3211
3212
3213
3214

Mapping enables you to bind a set of Vim commands to a single key.


Suppose, for example, that you need to surround certain words with curly
braces. In other words, you need to change a word such as amount into
{amount}. With the :map command, you can configure Vim so that the F5 key
does this job. The command is as follows:

3215

:map <F5> i{<Esc>ea}<Esc>

3216

Let's break this down:


<F5>

The F5 function key. This is the trigger key that causes the
command to be executed as the key is pressed. (In this
example, the trigger is a single key; it can be any string.)

i{<ESC>

Insert the { character. Note that we end with the <Esc> key.

Move to the end of the word.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 148

Draft Not for publication


A}<Esc>

Draft 0.1

Not for widespread publication

Append the } to the word.

3217
3218

After you execute the :map command, all you have to do to put {} around a
word is to put the cursor on the first character and press F5.

3219
3220

Note: When entering this command, you can enter <F5> by pressing the F5
key or by entering the characters <, F, 5, and >.

3221
3222
3223
3224
3225

Either way works. However, you must enter <Esc> as characters. That is
because the <Esc> key tells Vim to abort the command. Another way of
entering an <Esc> key is to type CTRL-V followed by the <Esc> key. (The
CTRL-V tells Vim to treat the <Esc> as a literal character instead of acting
on it.)

3226
3227
3228

Warning: The :map command can remap the Vim commands. If the trigger
string is the same as a normal Vim command, the :map will supersede the
command in Vim.

3229

Listing Your Mappings

3230
3231

The :map command (with no arguments) lists out all your current mappings
(see Figure 8-2).

3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247

~
~
~
<F5>
i {<Esc>ea}<Esc>
<xHome>
<Home>
<xEnd>
<End>
<S-xF4>
<S-F4>
<S-xF3>
<S-F3>
<S-xF2>
<S-F2>
<S-xF1>
<S-F1>
<xF4>
<F4>
<xF3>
<F3>
<xF2>
<F2>
<xF1>
<F1>
Press RETURN or enter command to continue
Figure 8-2: :map command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 149

Draft Not for publication

Draft 0.1

Not for widespread publication

3248

Fixing the Way Delete Works

3249
3250
3251
3252
3253

On most terminals, the Backspace key acts like a backspace character and
the Delete key sends a delete character. Some systems try to be helpful by
remapping the keyboard and mapping the Backspace key to Delete. If you find
that your keyboard has the Backspace and Delete keys backward, you can use
the following command to swap them:

3254

:fixdel

3255

(:fixdel can be abbreviated as :fix)

3256
3257

It does this by modifying the internal Vim definitions for backspace (t_kb)
and delete (t_kD). This command affects only the Vim keyboard mappings.

3258
3259
3260
3261

Your operating system may have its own keyboard mapping tables. For
example, Linux users can change their keyboard mapping by using the loadkeys
command. For further information, Linux users should check out the online
documentation for loadkeys.

3262
3263
3264

The X Window system also has a keyboard mapping table. If you want to
change this table, you need to check out the xmodmap command. Check the X
Window system documentation for details on how to use this command.

3265

Controlling What the Backspace Key Does

3266
3267
3268

The 'backspace' option controls how the <Backspace> key works in insert
mode. For example, the following command tells Vim to allow backspacing over
autoindents:

3269

:set backspace=indent

3270

The following command enables you to backspace over the end of lines:

3271

:set backspace=eol

3272
3273
3274
3275
3276
3277
3278
3279
3280

In other words, with this option set, if you are positioned on the first
column and press <Backspace>, the current line will be joined with the preceding
one. The following command enables you to backspace over the start of an
insert:
:set backspace=start
In other words, you can erase more text than you entered during a single
insert command. You can combine these options, separated by commas. For
example:
:set backspace=indent,eol,start
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 150

Draft Not for publication


3281
3282

Draft 0.1

Not for widespread publication

Earlier versions of Vim (5.4 and prior) use the following option values.
These still work but are deprecated.

3283

"" (No special backspace operations allowed)

3284

"indent,eol"

3285

"indent,eol,start"

3286

Saving Your Setting

3287
3288
3289

After performing all your :map, :abbreviate, and :set commands, it would
be nice if you could save them and use them again. The command :mkvimrc
(:mkv) writes all your settings to a file. The format of this command is as follows:

3290
3291
3292

:mkvimrc file
Where file is the name of the file to which you want to write the settings.
You can read this file by using the following command:

3293

:source file

3294

(:source can be abbreviated as :so.)

3295
3296
3297
3298

During startup, the Vim editor looks for an initialization file. If it is found, it
is automatically executed. (Only the first file found is read.) The initialization
files are as follows:
UNIX

3299

$HOME/.vimrc

3300

$HOME/_vimrc

3301

$HOME/.exrc

3302

$HOME/_exrc

3303

MS-DOS

3304

$HOME/_vimrc

3305

$HOME/.vimrc

3306

$VIM/_vimrc

3307

$VIM/.vimrc

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 151

Draft Not for publication


3308

$HOME/_exrc

3309

$HOME/.exrc

3310

$VIM/_exrc

3311

$VIM/.exrc

3312
3313
3314
3315
3316
3317
3318

Draft 0.1

Not for widespread publication

When you are running the GUI version, some other files are also read. The
gvimrc file is found in the same location as the vimrc files mentioned in the list.
The $VIMRUNTIME/menu.vim is read too. One way you can find out which
initialization files are read is to use the :version (:ve) command:
:version
In the middle of all the junk it lists out is a list of the initialization files (see
Figure 8-3).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 152

Draft Not for publication


3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373

Draft 0.1

Not for widespread publication

:version
:version
VIM - Vi IMproved 7.1 (2007 May 12, compiled Sep 7 2007 17:07:14)
Included patches: 1-87
Compiled by Anssi Hannula <anssi@mandriva.org>
Huge version with GTK2-GNOME GUI. Features included (+) or not (-):
+arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent
+clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
+cryptv +cscope
+cursorshape +dialog_con_gui +diff +digraphs +dnd -ebcdic +emacs_tags +eval
+ex_extra +extra_search +farsi +file_in_path +find_in_path +folding -footer
+fork() +gettext
-hangul_input +iconv +insert_expand +jumplist +keymap +langmap +libcall +linebreak
+lispindent +listcmds +localmap +menu +mksession +modify_fname +mouse +mouseshape
+mouse_dec
-mouse_gpm -mouse_jsbterm +mouse_netterm +mouse_xterm +multi_byte +multi_lang
-mzscheme +netbeans_intg -osfiletype +path_extra +perl +postscript +printer
+profile +python
+quickfix +reltime +rightleft -ruby +scrollbind +signs +smartindent -sniff
+statusline -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white +tcl
+terminfo
+termresponse +textobjects +title +toolbar +user_commands +vertsplit +virtualedit
+visual +visualextra +viminfo +vreplace +wildignore +wildmenu +windows
+writebackup +X11
-xfontset +xim +xsmp_interact +xterm_clipboard -xterm_save
system vimrc file: "/etc/vim/vimrc"
user vimrc file: "$HOME/.vimrc"
user exrc file: "$HOME/.exrc"
system gvimrc file: "/etc/vim/gvimrc"
user gvimrc file: "$HOME/.gvimrc"
system menu file: "$VIMRUNTIME/menu.vim"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0
-I/usr/include/cairo -I/usr/include/pan
go-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/freetype2 -I/usr/include/libpng12
-DORBIT2=1 -pthread
-I/usr/include/libgnomeui-2.0 -I/usr/include/l
ibart-2.0 -I/usr/include/gconf/2 -I/usr/include/gnome-keyring-1
-I/usr/include/libgnome-2.0 -I/usr/include/libbonoboui-2.0
-I/usr/include/libgnomecanvas-2.0 -I/usr/include/gtk2.0 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include
-I/usr/include/orbit-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/libbonobo-2.0 -I/u
sr/include/bonobo-activation-2.0 -I/usr/include/libxml2 -I/usr/include/pango-1.0
-I/usr/include/freetype2 -I/usr/include/gail-1.0 -I/usr/lib/gtk-2.0/include
-I/usr/include/atk1.0 -I/usr/include/cairo -I/usr/include/libpng12
-O2 -g -pipe -Wp,D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -fexceptions
-fomit-frame-pointer -march=i
586 -mtune=generic -fasynchronous-unwind-tables
-I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm
-I/usr/lib/perl5/5.8.8/i386-linux/CORE
-I/usr/include/python2.5 -pthread -I/usr/include -D_REENTRANT=1 -D_THREAD_SAFE=1
-D_LARGEFILE64_SOURCE=1

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 153

Draft Not for publication


3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388

3389

Draft 0.1

Not for widespread publication

Linking: gcc
-Wl,-E -Wl,-rpath,/usr/lib/perl5/5.8.8/i386-linux/CORE
-L/usr/local/lib -o vim
-lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0
-lpangocairo-1.0 -lpang
o-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0
-lgnomeui-2 -lbonoboui-2
-lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation
-lart_lgpl_2 -lgt
k-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lpango-1.0
-lcairo -lgconf-2 -lgmodule-2.0 -lORBit-2 -lgthread-2.0 -lrt -lgobject-2.0 -lglib2.0
-lXt -lt
ermcap -lacl -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.8.8/i386-linux/CORE
-L/usr/local/lib /usr/lib/perl5/5.8.8/i386-linux/auto/DynaLoader/DynaLoader.a
-L/usr/lib/perl5/5.8.8/i386-l
inux/CORE -lperl -lutil -lc -L/usr/lib/python2.5/config -lpython2.5 -lutil
-Xlinker -export-dynamic -L/usr/lib -ltcl8.5 -lieee -lm
Press ENTER or type command to continue

Figure 8-3: Locating the initialization files with :version.

3390
3391
3392
3393
3394

As part of the initialization process, Vim checks the value of the


'loadplugins' ('lpl') option. If it is set, any available plug-ins are loaded. (A
plug-in a special script that's automatically loaded at initialization time. See the
section Plugins and other scripts in Chapter 27: Expressions and Functions for
more details.)

3395
3396
3397
3398
3399
3400
3401

One other initialization file has not yet been discussed: .exrc. The old Vi
editor used this file for initialization. This is only read if Vim cannot find any
other initialization file. Because the old Vi program does not understand many of
the Vim commands, you will probably want to put everything in the .vimrc file.
The :mkexrc (:mk) command writes the mappings to the .exrc file. If you want to
use all the power of Vim, however, you must use the :mkvimrc command
instead.

3402

My .vimrc File

3403

My .vimrc file contains the following:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 154

Draft Not for publication


3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436

Draft 0.1

Not for widespread publication

:syntax on
:autocmd FileType * set formatoptions=tcql
\ nocindent comments&
:autocmd FileType c,cpp set formatoptions=croql
\ cindent comments=sr:/*,mb:*,ex:*/,://
:set autoindent
:set autowrite
:ab #d #define
:ab #i #include
:ab #b /****************************************
:ab #e <Space>****************************************/
:ab #l /*-------------------------------------------- */
:ab #j Jack Benny Show
:set shiftwidth=4
:set hlsearch
:set incsearch
:set textwidth=70
The file starts with a command to turn syntax coloring on:
:syntax on
The next thing is an autocommand executed every time a file type is
determined (on file load). In this case, set the formatting options to tcql, which
means autowrap text (t), autowrap comments (c), allow gq to format things (q),
and do not break long lines in insert mode (l). I also turn off C-style indenting
(nocindent) and set the 'comments' option to the default (comments&):
:autocmd FileType * set formatoptions=tcql
\ nocindent comments&
If a C or C++ file is loaded, the following autocommand is executed. It
defines some additional format options, namely adding the comment header for
new lines (r) and new lines opened with an O command (o). It also turns on C
indentation and defines the 'comments' option for C- and C++-style comments.
Because this autocommand comes after the one for all files, it is executed second
(but only for C and C++ files). Because it is executed second, its settings
override any set by a previous autocommand:

3437
3438

:autocmd FileType c,cpp set formatoptions=croql


\ cindent comments=sr:/*,mb:*,ex:*/,://

3439
3440
3441
3442

The next options turn on automatic indentation (indent each line the same
as the preceding one) and autowriting (write files when needed). Note that
because the autocommands execute when the file type is determined, any
settings they have override these:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 155

Draft Not for publication


3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460

Draft 0.1

Not for widespread publication

:set autoindent
:set autowrite
What follows is a set of abbreviations useful to programmers and a
collector of old Jack Benny radio shows:
:ab
:ab
:ab
:ab
:ab
:ab

#d
#i
#b
#e
#l
#j

#define
#include
/****************************************
<Space>****************************************/
/*----------------------------------------------*/
Jack Benny Show

The indentation size is set to 4, a value that studies have shown is best for
programming:
:set shiftwidth=4
The next two options turn on fancy searching:
:set hlsearch
:set incsearch
When working with text, I like a 70-column page:
:set textwidth=70

3461

Script Files

3462
3463

To read a file containing Vim commands (and to execute the commands),


use the :source (:so) command:

3464

:source my-file.vim

3465
3466
3467
3468

A special version of this command is the :runtime (:ru) command. This


searches the 'runtimepath' ('rtp') for the file. If the file is not present it
reports an error. (This is so you can find and load scripts that are part of the
Vim runtime.)

3469
3470

To see what files have already been loaded, use the :scriptnames (:scr)
command. Figure 8-4 shows the results.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 156

Draft Not for publication


3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487

Draft 0.1

Not for widespread publication

1: /home/sdo/.vimrc
2: /usr/local/share/vim/vim71/syntax/syntax.vim
3: /usr/local/share/vim/vim71/syntax/synload.vim
4: /usr/local/share/vim/vim71/syntax/syncolor.vim
5: /usr/local/share/vim/vim71/filetype.vim
6: /home/sdo/.vim/plugin/getscriptPlugin.vim
7: /usr/local/share/vim/vim71/plugin/getscriptPlugin.vim
8: /usr/local/share/vim/vim71/plugin/gzip.vim
9: /usr/local/share/vim/vim71/plugin/matchparen.vim
10: /usr/local/share/vim/vim71/plugin/netrwPlugin.vim
11: /usr/local/share/vim/vim71/plugin/rrhelper.vim
12: /usr/local/share/vim/vim71/plugin/spellfile.vim
13: /usr/local/share/vim/vim71/plugin/tarPlugin.vim
14: /usr/local/share/vim/vim71/plugin/tohtml.vim
15: /usr/local/share/vim/vim71/plugin/vimballPlugin.vim
16: /usr/local/share/vim/vim71/plugin/zipPlugin.vim
Press ENTER or type command to continue

3488

Figure 8-4: Output of :scriptnames

3489
3490
3491

Scripts which deal with non-English languages are a little tricky to read.
To help with the internationalization of Vim, the :scriptencoding (:scripte)
command lets you tell Vim what encoding to use for a script.

3492
3493
3494

For example, Vim comes with a script that provides Chinese menu
translations, $VIMRUNTIME/langmenu_chinese_gb.936.vim. The beginning of
this script includes the line:

3495
3496
3497
3498

:scriptencoding cp936
To return the encoding to the default use the :scriptencoding command
with no parameters:
:scriptencoding

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 157

Draft Not for publication

Draft 0.1

Not for widespread publication

3499

Chapter 9: Basic Command-Mode Commands

3500
3501
3502
3503

The Vim editor is based on an older editor called Vi. The Vi editor was
based on a command-line editor called ex. The ex editor was made before screenoriented editors were popular. It was designed for the old printing terminals
that were standard at that time.

3504
3505
3506
3507
3508
3509
3510

Even though it was line oriented, the ex editor was an extremely versatile
and efficient editor. It is still very useful today. Even with Vim's tremendous
command set, a few things are still better done with ex-style commands. So the
people who created Vim give you access to all the ex commands through the use
of command-line mode. Any command that begins with a colon(:) is considered
an ex-style command. This chapter shows how ex-mode commands are
structured and also discusses the most useful ones, including the following:

3511

Printing text lines

3512

Substitution

3513

Shell (command prompt) escapes

3514

Entering Command-Line Mode

3515
3516
3517
3518
3519

If you want to execute a single command-line-mode command, just type a


colon (:) followed by the command. For example, the command :set number is
actually a command-mode command. This command tells Vim to turn on the
'number' option and display line numbers on the screen. (:set can be
abbreviated as :se and 'number' can be abbreviated as 'nu'.)

3520
3521
3522

A discussion of command-mode commands makes more sense with line


numbering turned on. Therefore, the first command-mode command you enter
for this chapter is as follows:

3523

:set number

3524
3525
3526

After this command has been executed, the editor returns to normal mode.
Switch to command-line mode by executing the command gQ. To switch back to
normal mode (visual mode), use the :visual (:vi) command.

3527
3528
3529
3530

You will get a colon (:) prompt at the beginning of each line when you are
in Ex mode. This can be turned off by turning off the 'prompt' option. Also the
Q command4 will also enter Ex mode, but will not give you command line editing
capability.
4 Some distributions of Linux come with a system vimrc file which maps

vim-all-good.odt (28. Sep. 2007) The Vim Book

Q to gq (format text).
Page 158

Draft Not for publication

Draft 0.1

Not for widespread publication

3531

The Print Command

3532
3533

The :print command (short form :p) prints out the specified lines.
Without arguments, it just prints the current line:

3534
3535

:print 1
1 At one university the computer center was

3536

Ranges

3537
3538
3539

The :print command can be made to print a range of lines. A simple


range can be something like 1,5.This specifies lines 1 through 5. To print these
lines, use the following command:

3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561

:1,5 print
1 At one university the computer center was
2 experiencing trouble with a new type of
3 terminal. Seems that the professors loved to
4 put papers on top of the equipment, covering
5 the ventilation holes. Many terminals broke
Strictly speaking, you do not have put a space between the 5 and the
print, but it does make the example look nicer. If you want to print only line 5,
you can use this command:
:5 print
5 the ventilation holes. Many terminals broke
You can use a number of special line numbers. For example, the line
number $ is the last line in the file. So to print the whole file, use the following
command:
:1,$ print
1 At one university the computer center was
...
36 Notice:
37
38 If your computer catches fire, please turn it
39 off and notify computing services.
The % range is shorthand for the entire file (1,$). For example:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 159

Draft Not for publication


3562
3563
3564
3565
3566
3567
3568

Draft 0.1

Not for widespread publication

:1% print
1 At one university the computer center was
...
36 Notice:
37
38 If your computer catches fire, please turn it
39 off and notify computing services.

3569

The line number dot (.) is the current line. For example:

3570
3571

:. print
39 off and notify computing services.

3572
3573

You can also specify lines by their content. The line number /pattern/
specifies the next line containing the pattern.

3574
3575

Let's move up to the top with :1 print, and then print the lines from the
current line (.) to the first line containing the word trouble:

3576
3577
3578
3579
3580
3581
3582
3583

:1 print
1 At one university the computer center
was :.,/trouble/print
1 At one university the computer center was
2 experiencing trouble with a new type of
Similarly, ?pattern? specifies the first previous line with pattern in it. In
the following example, we first move to the end of the file with :39 print and
then print the last line with the word Notice in it to the end of the file:

3584
3585
3586
3587
3588
3589
3590

:39 print
39 off and notify computing services. :?
Notice:?,39 print
36 Notice:
37
38 If your computer catches fire, please turn it
39 off and notify computing services.

3591

Marks

3592
3593

Marks can be placed with the normal-mode m command. For example, the
ma command marks the current location with mark a.

3594
3595
3596
3597

You can use marks to specify a line for command-mode commands. The
line number 'a specifies the line with mark a is to be used. Start in normal mode,
for example, and move to the first line of the file. This is marked with a using the
command ma. You then move to line 3 and use the command mz to mark line as z.

3598

The command
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 160

Draft Not for publication

Draft 0.1

3599

:'a, `z print

3600

is the same as the following command:

3601

:1,3 print

Not for widespread publication

3602

Visual-Mode Range Specification

3603
3604
3605
3606

You can run a command-mode command on a visual selection. The first


step is to enter visual mode and select the lines you want. Then enter the
command-mode command to execute. Figure 9-1 shows that the first three lines
of the text have been selected.

3607
3608
3609
3610
3611
3612
3613

1
2
3
4
5
6
--

At one university the computer center was


experience trouble with a new type of computer
terminal. Seems that the professors loved to
put papers on top of the equipment, covering
the ventilation holes. Many terminals broke
down because they became so hot that the solder
VISUAL --

3614
3615
3616
3617
3618
3619
3620
3621
3622

Figure 9-1: Visual-mode selection.


Next, enter the :print command to print these lines. The minute you
press :, Vim goes to the bottom of the screen and displays the following:
:'<,'>
The special mark < is the top line of the visual selection and the mark > is
the bottom. Thus, Vim is telling you that it will run the command on the visual
selection. Because < is on line 1, and > is on line 3, a :print at this point prints
lines 1 to 3.The full command, as it appears onscreen, looks like this:
:`<,`>print

3623

Substitute Command

3624
3625

The :substitute command enables you to perform string replacements on


a whole range of lines. The general form of this command is as follows:

3626

:range substitute /from/to/ flags

3627

(Spaces were added for readability.)

3628
3629
3630
3631

This command changes the from string to the to string. For example, you
can change all occurrences of Professor to Teacher with the following
command:
:% substitute /Professor/Teacher/

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 161

Draft Not for publication


3632
3633
3634
3635
3636

By default, the :substitute command changes only the first occurrence on


each line. For example, the preceding command changes the line
Professor Smith criticized Professor Johnson today.
to

3639
3640
3641

Not for widespread publication

Note: The :substitute command is almost never spelled out completely.


Most of the time, people use the abbreviated version :s. (The long version
is used here for clarity.)

3637
3638

Draft 0.1

Teacher Smith criticized Professor Johnson today.


If you want to change every occurrence on the line, you need to add the g
(global) flag. The command

3642

:% substitute /Professor/Teacher/g

3643

results in

3644

Teacher Smith criticized Teacher Johnson today.

3645
3646
3647
3648

Other flags include p (print), which causes the :substitute command to


print out each line it changes. The c (confirm) flag tells the :substitute to ask
you for confirmation before it performs each substitution. When you enter the
following

3649
3650
3651

:1,$ substitute /Professor/Teacher/c


the Vim editor displays the text it is about to change and displays the
following prompt:

3652
3653

Professor: You mean it's not supposed to do that?


replace with Teacher (y/n/a/q/^E/^Y)?

3654

At this point, you must enter one of the following answers:

3655

Make this replacement.

3656

Skip this replacement.

3657

Replace all remaining occurrences without confirmation.

3658

Quit. Don't make any more changes.

3659

CTRL-E

Scroll one line up.

3660

CTRL-Y

Scroll one line down.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 162

Draft Not for publication

Draft 0.1

Not for widespread publication

3661

How to Change Last, First to First, Last

3662
3663

Suppose you have a file containing a list of names in the form last, first,
and you want to change it to first, last. How do you do it?

3664
3665
3666

You can use the :substitute command to do it in one operation. The


command you need is shown in Figure 9-2. The to string takes the first name (\2)
and last name (\1) and puts them in order.

3667
3668

Note: This command uses regular expressions which are covered in detail
in Chapter 19: Advanced Searching Using Regular Expressions.

3669
3670
First line (1) to last line ($)
(The range % does the same thing)
:s (:substitute) command
Substitute from
Substitute to

:1,$s/([^,]*), (.*)$/\2 \1/


Put enclosed in \1

Put enclosed in \2

:1,$s/([^,]*), (.*)$/\2 \1/


String in \1 (last name)
Anything except comma ([^,])
Zero or more times (*)
Literally comma, space (, )

String in \2 (first name)


End of line ($)
Any character (.)
Zero or more times (*)

3672

Figure 9-2: Changing last, first to first, last.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 163

Draft Not for publication

Draft 0.1

Not for widespread publication

3673

Reading and Writing Files

3674
3675
3676
3677

The :read filename command (short form :r) reads in a file and inserts it
after the current line. The :write command (short form :w) writes out the file.
This is a way of saving your work. You can write a different file (prog.c.new, for
example) by giving :write a filename as an argument:

3678

:write prog.c.new

3679
3680

Warning: If you exit using the emergency abort command :q!, the file
reverts to the last written version.

3681
3682
3683
3684
3685
3686
3687
3688

The :write command usually does not overwrite an existing file. The
force (!) option causes it to ignore this protection and to destroy any existing
file. The :write command proves extremely useful when it comes to exporting
portions of a large file to a smaller one--for example, if you have a collection of
jokes and want to write one out to a file to send to a friend. To export a single
joke, first highlight it in visual mode. Then use the following command to write it
out to the file joke.txt:
:'<,'> write joke.txt

3689

Saving the file under a new name

3690
3691
3692

The :saveas (:sav) command saves the current file under a new name.
Unlike the :write command, it also changes the name of the file being edited so
future writes will send their output to the new file.

3693

The :shell Command

3694
3695

The :shell command takes you to the command prompt. You can return
to Vim by executing the exit command. For example:

3696
3697
3698
3699
3700
3701
3702
3703
3704
3705

:shell
$ date
Mon Jan 17 18:55:45 PST 2000
$ exit
-- vim window appears -In this example, we are on UNIX, so we get the UNIX prompt ($). If we
were using the UNIX version of gvim, Vim would start a shell in the GUI window.
On MS-DOS, the Vim command acts just like UNIX when a :shell command is
executed. If you are using the GUI, however, the :shell command causes an
MS-DOS prompt window to appear.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 164

Draft Not for publication

Draft 0.1

Not for widespread publication

3706

Printing the file

3707
3708
3709

The :[range]hardcopy (:ha) command prints the file to a printer. On


Linux and UNIX this sends the file to the default printer (unless you customize
the command, see the section Advanced Hardcopy in Chapter .)

3710
3711
3712

On Microsoft Windows, the command brings up a windows print dialog that


lets you select the printer. If you wish to skip this dialog and print to the default
printer, use the override (!) option:

3713
3714
3715

:hardcopy!
The 'printoptions' ('popt') option controls how the file is printed. The
options available are:
bottom:{size}
collate:{y|n}
duplex:{off|long|short}
formfeed:{y|n}
header:{count}

jobsplit:{y|n}
left:{size}
number:{y|n}
paper:{paper-size}

portrait:{y|n}
right:{size}
syntax:{y|n}

top:{size}
wrap:{y|n}
3716
3717

bottom margin (default = 5pc)


Turns on collation. (Default = y)
Sets duplex printing (default = long).
If set a formfeed character starts a new page.
(Default = n).
Number of lines to reserve for the header. If this
number is 0, no header is printed. If it is one or
more, a line of text (defined by the 'printheader'
option) is printed, followed by any additional blank
lines needed to make up the count.
Do each copy as a separate print job. (Default = n}
Left margin (Default = 10pc)
Turn on or of line numbers. (Default = n)
Paper size. (Default = A4) The possible sizes are:
10x14, A3, A4, A5, B4, B5, executive, folio, ledger,
legal, letter, quarto, statement , and tabloid.
If set to y to portrait printing. Otherwise do
landscape. (Default = y)
Right margin. (Default = 5pc)
If y, turn on syntax highlighting. If n, turn it off. If a
(default), turn it on if the printer appears to have the
ability to do color or greyscale output.
Top margin. (Default = 5pc)
Wrap long lines. (Default=y)

The {size} parameter for the margins is of the form {number}{unit}


where {unit} is :

3718

in Inches

3719

mm Millimeters
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 165

Draft Not for publication


3720

Draft 0.1

Not for widespread publication

pc Percentage of the media

3721

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 166

Draft Not for publication

Draft 0.1

Not for widespread publication

3722

Chapter 10: Basic GUI Usage

3723
3724
3725
3726

The Vim editor works well inside a windowing environment. This graphical
user interface (GUI) provides you with not only all of Vim's keyboard commands,
but also a number of menus and other options. This chapter shows you how to
start Vim in GUI mode and how to make use of the special GUI features.

3727

Starting Vim in GUI Mode

3728

To start Vim in windowing mode, use the following command:

3729

$ gvim file

3730
3731
3732
3733

3734

This command starts up a Vim window and begins to edit file. The actual
appearance of the screen depends on which operating system you are using. On
UNIX it also depends on which X Window system toolkit (Motif, Athena, GTK)
you have. Figure 10-1 and 10-2 show some of the various types of GUIs.

Figure 10-1: UNIX with the GTK toolkit.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 167

Draft Not for publication

3736

Draft 0.1

Not for widespread publication

Figure 10-2: Microsoft Windows.

3737
3738

If you have a choice of UNIX GUIs to choose from, it is recommended that


you use the GTK version.

3739

Mouse Usage

3740
3741
3742
3743
3744
3745

Standards are wonderful. In Microsoft Windows, you can use the mouse to
select text in a standard manner. The X Window system also has a standard
system for using the mouse. Unfortunately, these two standards are not the
same. Fortunately, you can customize Vim. You can make the behavior of the
mouse look like an X Window system mouse or a Microsoft Windows mouse. The
following command makes the mouse behave like an X Window mouse:

3746

:behave xterm

3747

(:behave can be abbreviated as :be.)

3748
3749
3750
3751
3752
3753
3754

The following command makes the mouse look like a Microsoft Windows
mouse:
:behave mswin
The default behavior of the mouse on UNIX systems is xterm. The default
behavior on a Microsoft Windows system is selected during the installation
process. In addition to controlling the behavior of the mouse, the :behave
command affects the following options:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 168

3755
3756

3757
3758

Draft Not for publication

Draft 0.1

Option

Setting For
:behave xterm

Not for widespread publication


Setting For
:behave mswin

'selectmode'

mouse,key

(empty)

'mousemodel'

popup

extend

'keymodel'

startsel,stopsel

(empty)

'selection'

exclusive

inclusive

X Mouse Behavior
When xterm behavior is enabled, the mouse behavior is as follows:
<LeftMouse>

Move the cursor.

Drag with <Left Mouse>

Select text in visual mode.

<RightMouse>

Extend select from cursor location to the


location of the mouse.

<MiddleMouse>

Paste selected text into the buffer at the


mouse location.

Microsoft Windows Mouse Behavior


When mswin behavior is enabled, the mouse behavior is as follows:
<LeftMouse>

Move the cursor.

Drag with <LeftMouse>

Select text in select mode.

<S-LeftMouse>

Extend selection to the cursor location.

<RightMouse>

Display pop-up menu.

<MiddleMouse>

Paste the text on the system Clipboard into


file.

3759

Special Mouse Usage

3760
3761

You can issue a number of other special commands for the mouse,
including the following
<S-LeftMouse>

Search forward for the next occurrence


of the word under the cursor.

<S-RightMouse>

Search backward for the preceding


occurrence of the word under the
cursor.

<C-LeftMouse>

Jump to the tag whose name is under

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 169

Draft Not for publication

Draft 0.1

Not for widespread publication

the cursor.
<C-RightMouse>
3762
3763

Jump to the preceding tag in the stack.

Note: If you execute a command that requires a motion, such as dmotion,


you can use the left mouse button for the motion.

3764

Tear-Off Menus

3765
3766
3767
3768

The menus in Vim (all GUI versions except Athena) have an interesting
feature: "tearoff " menus. If you select the first menu item (the dotted lines), you
can drag the menu to another location on the screen. Figure 10-3 shows how to
tear off a menu.

Drag to
tear off

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 170

Draft Not for publication


3770

Draft 0.1

Not for widespread publication

Figure 10-3: Tear-off menus.

3771
3772

When torn off, the menu remains as its own window until you close it using
the normal window close command.

3773

Toolbar

3774
3775

A toolbar appears in the GTK and MS-Windows versions of the GUI. It looks
something like Figure 10-4. The icons perform the following functions:

3776

3778

Figure 10-4: Toolbar.


Open. Brings up a File Open dialog box.
Save. Saves the current file.
Save All. Save all the open files in all windows and buffers.
Print. Print to system printer.
Undo.
Redo.
Cut. (Actually "delete.")
Copy. (Actually "yank.")
Paste.
Search. Brings up a dialog box so that you can enter a
pattern.
Find Next.
Find Previous.
Replace. Brings up a Search-and-Replace dialog box.
Make Session. Brings up a dialog box so that you can enter
the name of a session file to write to.
Load Session. Brings up a dialog box so that you can select
the session file to load.
Script. Brings up a dialog box so that you can select a script
to run.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 171

Draft Not for publication

Draft 0.1

Not for widespread publication

Make. Performs a :make.


Shell. Does a :shell.
Make Tags. Does a :!ctags -R . command.
Tag. Jumps to the definition of the tag under the cursor.
Help. Brings up the general help screen.
Help Search. Brings up a dialog box so that you can enter a
help topic to be displayed. This button is slightly misnamed
because it does not do a general search of the help
documents, but only looks for tags.
3779

Showing the cursor

3780
3781

If you set the 'cursorcolumn' ('cuc') option, Vim will highlight the
column the cursor is in. Figure 10-5 shows the result:

3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795

Now is the time


for all
good men to come
to the aide of their party.
Figure 10-5: 'cursorcolumn' option
The 'cursorline' ('cul') option highlights the line the cursor is on.
(Warning: This command uses a different highlighting than 'cursorcolumn' and
by default, does not highlight the background.)
Figure 10-6 shows an example:
Now is the time
for all
good men to come
to the aide of their party.
Figure 10-6: 'cursorcolumn' option

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 172

Draft Not for publication

Draft 0.1

Not for widespread publication

3796

Chapter 11: Dealing with Text Files

3797
3798
3799
3800

Despite the proliferation of word processing tools such as Microsoft Word,


OpenOffice, and such, people still use plain-text files for documentation because
this type of file is the most easily read. In this chapter, you learn about the
following:

3801

Automatic text wrapping

3802

Text formatting command

3803

Text formatting options

3804

Basic Spell Checking

3805

Dealing with different file formats

3806

Troff-related commands

3807

The rot13 algorithm

3808

Automatic Text Wrapping

3809
3810
3811
3812
3813
3814

The Vim editor has a number of functions that make dealing with text
easier. By default, the editor does not perform automatic line breaks. In other
words, you have to press <Enter> yourself. This is extremely useful when you
are writing programs where you want to decide where the line ends. It is not so
good when you are creating documentation and do not want to have to worry
about where to break the lines.

3815
3816
3817

If you set the 'textwidth' ('tw')option, Vim automatically inserts line


breaks. Suppose, for example, that you want a very narrow column of only 30
characters. You need to execute the following command:

3818

:set textwidth=30

3819

Now you start typing (ruler added):

3820
3821
3822
3823
3824

1
2
3
12345678901234567890123456789012345
I taught programming for a while
The word while makes the line longer than the 30-character limit. When
Vim sees this, it inserts a line break and you get the following:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 173

Draft Not for publication


3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842

Draft 0.1

1
2
3
12345678901234567890123456789012345
I taught programming for a
while
Continuing on, you can type in the rest of the paragraph:
1
2
3
12345678901234567890123456789012345
I taught programming for a
while. One time, I was stopped
by the Fort Worth police
because my homework was too
hard. True story.
You do not have to type newlines; Vim puts them in automatically. You can
specify when to break the line in two different ways. The following option tells
Vim to break the line 30 characters from the left side of the screen:
:set textwidth=30
If you use the following option, you tell Vim to break the lines so that you
have margin characters from the right side of the screen.:

3843

:set wrapmargin=margin

3844

('wm' is short for 'wrapmargin'.)

3845
3846

Not for widespread publication

Therefore, if you have a screen that is 80 characters wide, the following


commands do the same thing:

3847
3848

:set wrapmargin=10
:set textwidth=70

3849

Note: The 'textwidth' option overrules 'wrapmargin'.

3850
3851
3852
3853

The Vim editor is not a word processor. In a word processor, if you delete
something at the beginning of the paragraph, the line breaks are reworked. In
Vim they are not; so if you delete some words from the first line, all you get is a
short line:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 174

Draft Not for publication


3854
3855
3856
3857
3858
3859
3860
3861
3862
3863

Draft 0.1

Not for widespread publication

1
2
3
12345678901234567890123456789012345
I taught for a
while. One time, I was stopped
by the Fort Worth police
because my homework was too
hard. True story.
This does not look good; so how do you get the paragraph into shape?
There are several ways. The first is to select the paragraph as part of a visual
selection:

3864
3865
3866
3867
3868

I taught for a
while. One time, I was stopped
by the Fort Worth police
because my homework was too
hard. True story.

3869

Then you execute the gq command to format the paragraph.

3870
3871
3872
3873
3874

I taught for a while. One


time, I was stopped by the
Fort Worth police because my
homework was too hard. True
story.

3875
3876
3877

Another way to format a paragraph is to use the gqmotion command.


Therefore to format 5 lines, you use the command gq4j. (The 4j tells gq to
format this line and the next 4 -- 5 lines total.)

3878
3879
3880
3881

The move forward paragraph command (})also proves useful in such cases.
To format a paragraph, for example, position the cursor on the first line of the
paragraph and use the command gq}. It is much easier to use this command than
to count the lines.

3882
3883
3884

The command gqip formats the current paragraph. (The gq formats the
selected text and the ip selects the "inner paragraph.") This is easier than gq}
because you don't have to put the cursor on the beginning of a paragraph.

3885
3886

Finally, to format a line, use the gqgq command. You can shorten this to
gqq.

3887

Text Formatting Commands

3888

To center a range of lines, use the following command:

3889

:range center width

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 175

Draft Not for publication


3890
3891
3892

Draft 0.1

Not for widespread publication

(:ce can be used for :center.)


If a width is not specified, it defaults to the value of 'textwidth'. (If
'textwidth' is 0, the default is 80.) For example:

3893

:1,5 center 30

3894

results in the following:

3895
3896
3897
3898
3899

I taught for a while. One


time, I was stopped by the
Fort Worth police because my
homework was too hard. True
story.

3900

Similarly, the command :right (:ri) right-justifies the text. So,

3901

:1,5 right 30

3902

results in the following:

3903
3904
3905
3906
3907

I taught for a while. One


time, I was stopped by the
Fort Worth police because my
homework was too hard. True
story.

3908

Finally there is the :left (:le) command:

3909

:range left margin

3910
3911
3912
3913

Unlike :center and :right, however, the argument to :left is not the
length of the line. Instead it is the left margin. If this is 0, the text will be put
against the left side of the screen. If it is 5, the text will be indented 5 spaces.
For example, these commands

3914
3915

:1 left 5
:2,5 left 0

3916

result in the following:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 176

Draft Not for publication


3917
3918
3919
3920
3921

Draft 0.1

Not for widespread publication

I taught for a while. One


time, I was stopped by the
Fort Worth police because my
homework was too hard. True
story.

3922

Justifying Text

3923
3924
3925

The Vim editor has no built-in way of justifying text. However, there is a
neat macro package that does the job. To use this package, execute the
following command:

3926

:source $VIMRUNTIME/macros/justify.vim

3927
3928

This macro file defines a new visual command _j.To justify a block of text,
highlight the text in visual mode and then execute _j.

3929

Fine-Tuning the Formatting

3930

A number of options enable you to fine-tune and customize your spaces.

3931

The joinspaces Option

3932
3933
3934
3935

The J command joins two lines putting in one space to separate them. If
the 'joinspaces' option is set, when the first line ends with a punctuation mark
(period, question mark, or exclamation point), two spaces are added. Input the
following (= represents a space):

3936
3937

This=is=a=test.
Second=line.

3938

When the 'joinspaces' option is turned off with the following command

3939

:set nojoinspaces

3940

the result of a J on the first line is as follows:

3941

This=is=a=test.=Second=line .

3942

If the option is set using this command

3943

:set joinspaces

3944

the result is as follows:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 177

Draft Not for publication


3945

Draft 0.1

Not for widespread publication

This=is=a=test.==Second=line .

3946

The formatoptions Option

3947
3948
3949
3950

The option 'formatoptions' ('fo') controls how Vim performs automatic


wrapping. The Vim editor is smart about comments and does a proper job of
formatting them. With 'formatoptions' you can control both how text and
comments are wrapped. The format of this option is as follows:

3951
3952
3953

:set formatoptions=characters
where characters is a set of formatting flags. The following list identifies
the formatting flags.
t

Automatically wrap text.

Automatically wrap comments.

Insert the comment leader automatically.

Insert comment leader in a comment when a new line is inserted.

Insert comment leader in a comment when a new line is created


using the O and o command.

Allow gq to format comments.

Format based on the indent of the second line, not the first. Do oldstyle Vi text wrapping.Wrap only on blanks that you enter.

Wrap only on blanks you type, but only if they occur before
'textwidth'.

Do not break line in insert mode. Only let gq break the lines.

3954
3955

Take a look at how these flags affect the formatting.

3956

The t flag must be on for normal text to be wrapped.

3957
3958
3959
3960
3961
3962
3963
3964

The c flag must be on for comments to be wrapped. Therefore, setting the


'formatoptions' option using the following command is good for programming:
:set formatoptions=c
Long lines inside a comment are automatically wrapped. Long lines of code
(Vim calls them text) are not wrapped. Actually you want to set this option:
:set formatoptions=cq
This tells Vim to not only wrap comments, but also to reformat comments
as part of a gq command.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 178

Draft Not for publication


3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982

Draft 0.1

Not for widespread publication

Vim is smart about comments. When it wraps a line in the middle of a Cstyle comment, it automatically adds the comment header in front of the line.
Suppose, for example, that you enter the following command:
/* This is a test of a long line.
This line is longer than the 'textwidth', so it wraps. Because it is in a
comment, Vim automatically puts in an asterisk (*). Therefore, although you
typed everything on one line, the result is as follows:
/* This is a test of a long
* line.
But suppose you actually type <Enter>? By default, Vim does not insert
the asterisk. This means that if you type a two-line comment, you get the
following:
/* Line 1
Line 2
If you put an r flag in the 'formatoptions', however, Vim automatically
supplies the comment leader (*) when you press Return:
/* Line 1
* Line 2

3983
3984

If you want to have this done for the O and o commands, you need to put in
the o flag as well.

3985
3986
3987
3988

The 2 option tells Vim to format based on the second line of the text rather
than the first. For example, the original example text is displayed in Figure 11-1.
If you do not have the 2 flag in the 'formatoptions' and you reformat the
paragraph with gq}, you get the results shown in Figure 11-2.

3989
3990
3991
3992
3993
3994
3995
3996
3997
3998

The first Centronics Printer manual had a whole


chapter devoted to how to open up the packing
crate and find the manual. (What did they think we
were reading anyway?)
~
~
~
~
~
Figure 11-1: The original text.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 179

Draft Not for publication


3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010

Draft 0.1

Not for widespread publication

The first Centronics Printer manual


had a whole chapter devoted to how
to open up the packing crate and
find the manual. (What did they
think we were reading anyway?)
~
~
~
~
Figure 11-2: Formatted text (no 2 flag).
If you go back to the original paragraph, however, set the 2 flag with the
following

4011

:set formatoptions += 2

4012

and reformat using gq}, you will get the results shown in Figure 11-3.

4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024

The first Centronics Printer manual


had a whole chapter devoted to how to
open up the packing crate and find the
manual. (What did they think we were
reading anyway?)
~
~
~
~
Figure 11-3: Formatted text (2 set).
The v flag character controls where a line will be split. Suppose that you
have the following line:

4025

This is a test of the very long line wrapping

4026
4027

Now add the word logic to the end of the sentence. Without the v flag,
the result is as follows:

4028
4029
4030
4031
4032
4033
4034
4035

This is a test of the very


long line wrapping logic.
With v in 'formatoptions', you get the following:
This is a test of the very long line wrapping
logic.
Even though the existing line is much longer than 'textwidth', with v set,
Vim will not break the line in the existing text. Instead it breaks only things in
the text you add.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 180

Draft Not for publication


4036
4037
4038
4039
4040
4041
4042
4043

Draft 0.1

Not for widespread publication

If the l character is present in the 'formatoptions', Vim will break only


the line if the space you type is less than the 'textwidth'. If you add the word
logic to the preceding example, you get the following:
This is a test of the very long line wrapping logic.
If you were to type this line from scratch, however, you would get the
following:
This is a test of the very
long line wrapping logic.

4044

Formatting and numbered list

4045
4046
4047
4048
4049
4050

Vim will attempt to recognize numbered lists and properly format them. In
order to tell what a number list looks like, it is matched against the string in the
'formatlistpat' ('flp') option. By default this is: ^\s*\d\+[\]:.)}\t ]\s*
which translates to beginning of line (^), any number of spaces (\s*), one or
more digits (\d\+), any one of the characters: ]:.)}, <tab> or <space>, followed
by a bunch of spaces (\s*).

4051

Using an External Formatting Program

4052
4053
4054
4055

By default, Vim uses its internal formatting logic to format the text. If you
want, however, you can run an external program to do the job. On UNIX, the
standard program fmt does a good job of doing the work. If you want to use this
command for the gq work, set the following option:

4056

:set formatprg=fmt

4057

('fp' is short for 'formatprg')

4058
4059
4060

You can also use the 'formatexpr' ('fex') option to define an expression
which will tell Vim how to format a paragraph. If both 'formatexpr' and
'formatprg' are set, 'formatexpr' will be used.

4061
4062
4063
4064

Even without this option, however, you can always use the filter (!)
command to format text. To run a paragraph through the program fmt, for
example, use the command !}fmt. The ! starts a filter command, the } tells Vim
to filter a paragraph, and the rest (fmt) is the name of the command to use.

4065

Basic Spelling

4066
4067
4068

Vim can spell check your text on the fly. Words that are not spelled
correctly will be highlighted. By default this feature is turned off, to turn it on,
set the 'spell' option:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 181

Draft Not for publication


4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098

Draft 0.1

Not for widespread publication

:set spell
Figure 11-4 shows an editing session with lots of misspelled words and
spell checking enabled. (In this example we use underline to indicate a
misspelled word. The Vim GUI actually uses a read squiggly line which is
impossible to reproduce in a black and white book.)
A church hhad just bought ttheir first
computer and were learning how to uuse it.
The church secretary ddecided to set uppp
a form letter to be used in a ffuneral
service. Where tthe person's name was to
be she put in tthe word "<name>". When a
funeral occurred she would change this
word to tthe actual name of tthe departed.
Figure 11-4: Editing with spelling errors highlighted
Now that you can see which words are bad, it would be nice to get them
corrected. To get a list of suggested fixes for the bad word, position the cursor
on a misspelled word and enter the command z=. Figure 11-5 shows the result.
Change "hhad" to:
1 "had"
2 "head"
3 "shad"
4 "Had"
5 "hand"
6 "hard"
7 "Head"
8 "Chad"
Type number (<Enter> cancels):
Figure 11-5: Result of the z= command
To change the word, just enter the number of the replacement (in this
example 1). If you don't want to change anything, just press <Enter>.

4099
4100

Note: The change you make is stored in the . (dot) command so you can
repeat it as needed.

4101
4102
4103

If you are like me and you make the same spelling mistakes over and over
again the same way, you'll want to fix all the spelling errors like one. (I must
remember that beleive is spelled believe.)

4104
4105

To do enter the :spellrepall (:spellr) command. It repeats the last z=


change for all every similar word in your file.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 182

Draft Not for publication

Draft 0.1

Not for widespread publication

4106

Finding Spelling Errors

4107
4108
4109

To find the next misspelled word use the ]s command. The ]S does the
same thing, only it does not stop on rare words or words that come from another
region.

4110
4111
4112

Both the ]s and ]S commands start from the current cursor location for
their searches. If you want to start from the beginning of the file use the [s and
[S commands.

4113

Spelling Language

4114
4115
4116
4117
4118

Unfortunately everyone in the world does not speak the same language. If
you need to change the language Vim uses for spell checking, set the
'spelllang' ('spl') option. This option takes a comma separated list of
dictionaries to use for spell checking. If a spellfile for that language is not
available, Vim will ask if you want to download it. For example:

4119
4120
4121
4122
4123
4124

:set spelllang=de
not found in 'runtimepath': "spell/de.latin1.spl"
not found in 'runtimepath': "spell/de.ascii.spl"
Cannot find spell file for "de" in
Do you want me to try downloading it?
(Y)es, [N]o:

4125
4126

Note: Automatic downloading is not enabled if you don't have the ability to
write into the directory containing the spelling files ($RUNTIME/spell).

4127
4128
4129

TheLimitsofAutomatedSpellChecking
Canyouspotthespellingerrorinthefollowingword?Answeronpage189.

CAT

4130
4131

Word Lists

4132
4133
4134

Vim lets you create your own word list to augment the built-in dictionary.
To really use this feature you need to first set the 'spellfile' ('spf') option.
The name of this file must end in .add. For example:

4135
4136
4137
4138
4139

:set spellfile=my_words.add
Now suppose you find that you have a perfectly good word in your
document but it's not in the dictionary. To add it to your local word list, put the
cursor on the word and enter the command zg. The word will be added to your
local word list.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 183

Draft Not for publication

Draft 0.1

Not for widespread publication

4140
4141
4142
4143

You may notice that two files are created: my_words.add and
my_words.add.spl. The second file is a compiled version of the first. In fact Vim
compiles all it's dictionaries for speed. In this case my_words.add.spl is compiled
automatically.

4144
4145
4146
4147

Vim not only keeps track of good words, but bad words as well. For
example, if your file contains the words "ain't" and you consider that an
abomination, then you can put in the bad word list by positioning the cursor on
the word and entering the command zw.

4148
4149

As with zg, the word marked by zw goes into the spell file. However it is
flagged as a badly spelled word.

4150
4151
4152

If you accidentally put a bad word on the good list, the zug command
removes the from the list. The zuw command does the same thing only it
removes a word that flagged as wrong.

4153
4154
4155

Vim also maintains a internal word list. This list is stored in memory and
goes away after each editing session. To add a word to the internal good list,
enter the command zG. For bad words, use the command zW.

4156

And of course the zuG and zuW remove words from the internal list.

4157
4158
4159
4160

The spelling commands (zg, zG, zw, zW, zug, zuG, zuw, zuW) have their own
command mode versions.
The following table shows these various commands

4161
Command
zg
zG
zw
zW
zug
zuG

Command Mode Version


:spellgood {word} :spellg {word}
:spellgood! {word} :spellg! {word}
:spellwrong {word} :spellw {word}
:spellwrong! {word} :spellw! {word}
:spellundo {word} :spellu {word}
:spellundo! {word} :spellu! {word}

4162
4163

Mulitple word lists

4164
4165

Vim allows you to use multiple word lists for spelling. The 'spellfile'
option actually takes a comma separated list of word files.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 184

Draft Not for publication


4166
4167
4168
4169
4170
4171

Draft 0.1

Not for widespread publication

:set spellfile=global.add,local.add
Each of the word commands (zg, zw, zug, zuG, :spellgood, :spellwrong,
:spellundo) takes a numeric argument. For example, the zg command adds the
word under the cursor to the first word file. The command 2zg will add it to the
second file (local.add). The commend :2spellgood {word} will do the same
thing.

4172

The :spellinfo (:spelli) command lists the dictionary files being used.

4173
4174
4175
4176

:spellinfo
file: /usr/local/share/vim/vim71/spell/en.latin1.spl
Press ENTER or type command to continue

4177

File Formats

4178
4179
4180
4181
4182
4183

Back in the early days, the old Teletype machines took two character times
to do a newline. If you sent a character to the machine while it was moving the
carriage back to the first position, it tried to print it on-the-fly, leaving a smudge
in the middle of the page. The solution was to make the newline two characters:
<Return> to move the carriage to column 1, and <Line Feed> to move the paper
up.

4184
4185
4186
4187
4188

When computers came out, storage was expensive. Some people decided
that they did not need two characters for end-of-line. The UNIX people decided
they could use <Line Feed> only for end-of-line. The Apple people standardized
on <Return>. The MS-DOS (and Microsoft Windows) folks decided to keep the
old <Return><Line Feed>.

4189
4190
4191

This means that if you try to move a file from one system to another, you
have line problems. The Vim editor automatically recognizes the different file
formats and handles things properly behind your back.

4192
4193
4194
4195

Note: If you are an old Vi user and tried to edit an MS-DOS format file, you
would have found that each line ended with a ^M character. (^M is
<Return>.) Fortunately, Vim handles UNIX, MS-DOS and Apple file
formats automatically.

4196
4197
4198

The option 'fileformats' ('ffs') contains the various formats that will be
tried when a new file is edited. The following option, for example, tells Vim to
try UNIX format first and MS-DOS format second:

4199

:set fileformats=unix,dos

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 185

Draft Not for publication


4200
4201
4202
4203
4204
4205
4206

Draft 0.1

Not for widespread publication

The detected file format is stored in the 'fileformat' ('ff') option. To


see which format you have, execute the following command:
:set fileformat?
You can use the 'fileformat' option to convert from one file format to
another. Suppose, for example, that you have an MS-DOS file named readme.txt
that you want to convert to UNIX format. Start by editing the MS-DOS format
file:

4207

$ vim README.TXT

4208

Now change the file format to UNIX:

4209

:set fileformat=unix

4210

When the file is written, it will be in UNIX format.

4211

Changing How the Last Line Ends

4212
4213
4214
4215
4216
4217
4218

The Vim editor assumes that your file is made up of lines. This means that
Vim assumes that the last line in the file ends in an <EOL> character.
Sometimes you will encounter a strange file that contains an incomplete line.
When Vim encounters this type of file, it sets the 'noendofline' ('noeol')
option. (If your file ends in a complete line, the 'endofline' ('eol') option is
set.) If you want to change whether or not your file ends in an <EOL>, use the
command

4219

:set endofline

4220

(Last line ends in <EOL>.) or

4221

:set noendofline

4222
4223

(Last line does not have an <EOL>.) This option only works when the
'binary' option is set.

4224

Troff-Related Movement

4225
4226

A number of commands enable you to move through text. The ) command


moves forward one sentence. The ( command does the same thing backward.

4227
4228

The } command moves forward one paragraph, and { moves one


paragraph backward. Figure 11-6 shows how these commands work.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 186

Draft Not for publication


4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246

Draft 0.1

Not for widespread publication

.B rgview
.SH DESCRIPTION
.B Vim
is a text editor that is upwards compatible to Vi.
It can be used to edit any ASCII text.
It is especially useful for editing
programs.
.PP
There are a lot of enhancements above Vi: multi level
multi windows and buffers, syntax hightlighting, command
editing, filename completion, on-line help, visual select
See ":help vi_diff.txt" for a summary of the difference
.B Vim
and Vi.
.PP
While running
.B Vim
Figure 11-6: } command.

4247
4248
4249
4250

At one time the troff program was the standard UNIX word processor. It
takes as input a text file with processing directives in it and formats the text.
Although troff is rarely used these days, the Vim editor still contains an option
for dealing with this formatter.

4251
4252
4253

The troff program uses macros to tell it what to do. Some of these macros
start paragraphs. In the following example, for instance, the macro .LP starts
each paragraph:

4254
4255
4256

Because troff uses lots of different macro packages, Vim needs to know
which macros start a paragraph. The 'paragraphs' ('para') option does this.
The format of this option is as follows:

4257

:set paragraphs="macromacromacro..."

4258

Each macro is the two-character name of a troff macro. For example:

4259

:set paragraphs="P<Space>LP"

4260
4261

tells Vim that the macros .P and .LP start a paragraph. (Note that you use
P<Space> to indicate the .P macro.)

4262

By default, the 'paragraphs' option is as follows:

4263

:set paragraphs=IPLPPPQPP LIpplpipbp

4264

This means that the following macros

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 187

Draft Not for publication

Draft 0.1

Not for widespread publication

4265

.IP

.LP

.pp

.lp

4266

.PP

.ip

.QP

.bp

4267

.P

.LI

4268

start a new paragraph.

4269

Section Moving

4270
4271
4272
4273
4274

The [[ and [] commands move a section backward. A section is defined


by any text separated by a page break character (CTRL-L). The reason there are
two movement commands is that these commands also move to the beginning
and end of procedures. (Chapter 7: Commands for Programmers contains
information on programming commands.)

4275
4276

The ]] and ][ commands perform the forward movements as seen in


Figure 11-7.

4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290

]]
]]

This is page 1
^L
This is page 2
Another paragraph
^L
This is page 3
with a two line paragarph
And another one
~
~
~
~
~
~

4291

Figure 11-7: The ]] command.

4292

Defining Sections

4293
4294
4295

You can also define a section using troff macros. The 'sections'
('sect')option acts much like the 'paragraph' option, except that it defines the
macros that separate sections rather than paragraphs. The default is:

4296

:set sections=SHNHH HUnhsh

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 188

Draft Not for publication

Draft 0.1

Not for widespread publication

4297

Encrypting with rot13

4298
4299
4300
4301
4302

If you want to encrypt a block of text with the rot13 algorithm, use the g?
motion command. The rot13 encryption is an extremely weak encryption scheme
designed to obscure text. It is frequently used in news posting for potentially
offensive material. Naturally g?g? or g?? encrypts the current line. You can
decrypt the rot13 encryption by encrypting the text twice.

4303
4304
4305
4306
4307
4308

Answertothequestiononquestiononpage183.
Thewordisdog.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 189

Draft Not for publication

Draft 0.1

Not for widespread publication

4309

Chapter 12: Automatic Completion

4310
4311
4312
4313
4314

The Vim editor can automatically complete words on insertion. This is


where you type the first part of a word, press CTRL-P, and Vim guesses at the
rest. How it decides what to use for completion is both simple and flexible. This
chapter covers every aspect of this function. This chapter discusses the
following:

4315

Automatic completion

4316

How to customize the automatic completion feature

4317

How to use different types of completions

4318

Automatic Completion

4319
4320
4321

When you are entering text, Vim can assist you to complete words.
Suppose, for example, that you are creating a C program and want to type in the
following:

4322

total = ch_array[0] + ch_array[1] + ch_array[2];

4323

You start by entering the following:

4324

total = ch_array[0] + ch_

4325
4326
4327
4328
4329
4330

At this point, you tell Vim to complete the word using the command
CTRL-P. This command tells Vim to search for a word to complete. In this case,
it is the word ch_array. So typing CTRL-P gives you the following:
total = ch_array[0] + ch_array
After a little more typing, you get this:
total = ch_array[0] + ch_array[1] +

4331
4332
4333

If you now type CTRL-P again, Vim will search again for a word that
completes the word before the cursor. (In this case, it is "".) The first word that
matches is ch_array.

4334
4335

Typing CTRL-P again gives you the next word that matches (in this case,
total).

4336
4337

A third CTRL-P causes the editor to run out of words, so it returns to the
original entry: "".

4338

A fourth CTRL-P causes the editor to start over again with ch_array.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 190

Draft Not for publication

Draft 0.1

Not for widespread publication

4339

How Vim Searches for Words

4340
4341

The Vim editor goes through a lot of effort to find words to complete. By
default, it uses the following search algorithm:

4342

1. Current file

4343

2. Files in other windows

4344

3. Other files in the loaded (hidden) buffers

4345

4. Files in unloaded buffers

4346

5. The current "tags" list

4347

6. All files #included by the current file

4348
4349

You can customize the search order. (This is described in the section
Automatic Completion Details below.)

4350

Searching Forward

4351
4352
4353

When you type CTRL-P, Vim searches backward for a word to complete.
The CTRL-N command searches forward. Other than the direction, it acts just
like the CTRL-P command.

4354

Automatic Completion Details

4355
4356

The 'ignorecase' ('ic') option tells the editor to try all words regardless
of case:

4357

:set ignorecase

4358
4359
4360

Therefore, if you have the option on, when you try to complete the string
ins, Vim will consider INSERT, Inside, and instep, all as candidates (assuming
that they appear in the text).

4361
4362
4363

When you match words in this way, the completed word takes on the case
of the matched word. Therefore, the completion list for ins is as follows: instep
Inside, INSERT.

4364
4365
4366

What if you want to match INSERT, but put the word insert (lowercase) in
your text. You must tell Vim to infer the case of the new word from what is
typed, not what is matched. You can set the option 'infercase' ('inf'),

4367

:set infercase
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 191

Draft Not for publication


4368

Draft 0.1

Not for widespread publication

Then the match list is as follows: instep inside insert

4369

Automatic Completion Details

4370
4371
4372
4373

For the most part, the Vim editor does the right thing when it comes to
automatic completion. At times, however, you might want to fine-tune your
completions. The 'complete' ('cpt') option controls where Vim searches for
words. The form of this option is as follows:

4374
4375
4376

:set complete=key,key,key,...
key is a key letter (and possible argument). The possible key values are as
follows:
.

Current file.

Files in loaded buffers, not in a window.

Definitions in the current file and in files included by a #include


directive.

Files included by the current file through the use of a #include


directive.

The file defined by the 'dictionary' option (discussed later in


this chapter).

kfile

The file named file .

The "tags" file. (The ] character can be used as well.)

Unloaded buffers.

Files in other windows.

4377
4378

The Include Path

4379
4380
4381

Vim uses the 'path' ('pa') option to tell it where to look for files that were
included in the current file. (Note that the 'path' option also is used for other
commands such as :find.)

4382

Specifying a Dictionary

4383
4384

The 'dictionary' ('dict') option defines a file to be searched when you


press CTRL-P and CTRL-N to match words. The format of this command is:

4385

:set dictionary=file,file,...

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 192

Draft Not for publication


4386
4387
4388

Draft 0.1

Not for widespread publication

To use on Linux, for example, the dictionary file is in /usr/dict/words.


Therefore, to add this file to the list of dictionaries searched for, use the
following command:

4389

:set dictionary=/usr/dict/words

4390

If you have a local list of words, you can search this too:

4391

:set dictionary=/home/oualline/words,/usr/doc/words

4392
4393

You can also specify a dictionary by putting the file after the k (key). For
example:

4394

:set complete=k/usr/oualline/words

4395

You can use the k flag multiple times, each with a different file:

4396

:set complete=k/usr/dict/words,k/usr/share/words

4397
4398

A dictionary file is simply a list of words to check for CTRL-X CTRL-K. The
one restriction is that no line can be longer than 510 characters.

4399
4400
4401
4402
4403

The words used for a thesaurus search are specified by 'thesaurus'


('tsr') option are used. The files are a little different that the dictionary files.
Each line contains a bunch of words which have similar meanings. When Vim
finds a word in the thesaurus it then lists all the similar words as possible
completion candidates.

4404

Controlling What Is Searched For

4405
4406
4407
4408

CTRL-P and CTRL-N enable you to perform a wide variety of searches. What
if you want to restrict yourself to just one type of search, however? For that you
use the CTRL-X command. When you type CTRL-X, you enter the CTRL-X
submode. You can then fine tune your search using one of the commands:
CTRL-]

Tags

CTRL-D

Macro definitions

CTRL-F

Filenames

CTRL-K

Dictionary

CTRL-I

Current files and #included files

CTRL-L

Whole lines

CTRL-N

Same as CTRL-N without the CTRL-X (find next match)

CTRL-O

Use omni completion by calling the function name in the


'omnifun' option.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 193

Draft Not for publication

4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434

Draft 0.1

Not for widespread publication

CTRL-P

Same as CTRL-P without the CTRL-X (find previous match)

CTRL-T

Thesaurus

CTRL-U

Perform user defined completing by calling the function


defined by the 'completfunc' option.

Use the spelling system to find the given word.

The CTRL-X CTRL-D command searches for a #define macro definition. It


will search included files as well. After typing this command, you can type
CTRL-N to search for the next definition and CTRL-P for the previous. Take a look
at how this works on the following test file.
File include.h
#define MAX(x, y) ((x) < (y) ? (y) : (x))
#define MIN(x, y) ((x) < (y) ? (x) : (y))
int sum(int i1, int i2) {
return(i1+i2);
}
File main.c
#include "include.h"
#define MORE "/usr/ucb/more"
You can start by editing main.c. If you type CTRL-X, you enter CTRL-X
mode. The editor now displays a mini-prompt at the bottom of the screen (see
Figure 12-1).
#include "include.h"
#define MORE "/usr/ucb/more"
~
~
~
-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)
Figure 12-1: CTRL-X mode.
Suppose that you want to look for a macro definition. You would now type
CTRL-D. The screen displays the fact that there are three matches, and then
displays a new menu (see Figure 12-2).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 194

Draft Not for publication


4435
4436
4437
4438
4439
4440
4441
4442
4443
4444

Draft 0.1

Not for widespread publication

#include "include.h"
#define MORE "/usr/ucb/more"
MAX
MAX include.h
MIN include.h
MORE
~
~
~
-- Definition completion (^D/^N/^P) --

4445

Figure 12-2: CTRL-X CTRL-D.

4446
4447
4448

At this point, CTRL-N searches for the next match (and CTRL-P searches for
the previous one). The CTRL-D key acts just like CTRL-P. Using these keys, you
can cycle through the list of definitions until you find the one that you want.

4449

Tag Search

4450
4451
4452
4453

The CTRL-X CTRL-] command searches for the next tag. A tag is a C/C++
function definition. The program ctags generates a list of C/C++ function
definitions (tags) and stores them in the tags file. We have generated our tags
file using the following command:

4454
4455
4456

$ ctags *.c *.h


Now when we enter CTRL-X CTRL-] in insert mode, we get what is shown
in Figure 12-3

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 195

Draft Not for publication


4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474

4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496

Not for widespread publication

#include "include.h"
#define MORE "/usr/ucb/more"
MORE
MORE
!_TAG_FILE_FORMAT
!_TAG_FILE_SORTED
!_TAG_PROGRAM_AUTHOR
!_TAG_PROGRAM_NAME
!_TAG_PROGRAM_URL
!_TAG_PROGRAM_VERSION
MAX
MIN
sum
~
~
~
-- Tag completion (^]/^N/^P) --

4475
4476

Draft 0.1

Figure 12-3: CTRL-X CTRL-].


The result of typing CTRL-P a couple of times is shown in Figure 12-4.
#include "include.h"
#define MORE "/usr/ucb/more"
MAX
MORE
!_TAG_FILE_FORMAT
!_TAG_FILE_SORTED
!_TAG_PROGRAM_AUTHOR
!_TAG_PROGRAM_NAME
!_TAG_PROGRAM_URL
!_TAG_PROGRAM_VERSION
MAX
MIN
sum
~
~
~
-- Tag completion (^]/^N/^P) -Figure 12-4: Finding previous completions.
By default, the Vim editor just displays the name alone. If you execute the
following command, the entire tag (the function prototype) displays:

4497

:set showfulltag

4498

('sft' is the short form of 'showfulltag')


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 196

Draft Not for publication


4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523

Not for widespread publication

If you repeat your matching commands with this option enabled, you get
the results shown in Figure 12-5.
#include "include.h"
#define MORE "/usr/ucb/more"
int sum(int i1, int i2)
MORE
MORE
!_TAG_FILE_FORMAT
xtended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED
=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR
hiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME
!_TAG_PROGRAM_URL
fficial site/
!_TAG_PROGRAM_VERSION
MAX
MIN
sum
int sum(int i1, int i2) {
~
~
~
-- Tag completion (^]/^N/^P)--

4524
4525

Draft 0.1

Figure 12-5: The results.


@@ TODO: Investigate why the junk in the previous screen.

4526

Finding Filenames

4527
4528
4529
4530

If you use the CTRL-X CTRL-F command, the Vim editor will match a
filename. It scans the current directory for files and displays each one that
matches the word in front of the cursor. Suppose, for example, that you have the
following files in the current directory:

4531

main.c

sub_count.c

sub_done.c

4532

Now enter insert mode and start typing:

vim-all-good.odt (28. Sep. 2007) The Vim Book

sub_exit.c

Page 197

Draft Not for publication


4533
4534
4535
4536
4537
4538

Draft 0.1

Not for widespread publication

The exit code is in the file sub


At this point, you enter the command CTRL-X CTRL-F. The editor now
completes the current word sub by looking at the files in the current directory.
The first match is sub_count.c. This is not the one you want, so you match the
next file by typing CTRL-N. This match is sub_done.c. Typing CTRL-N again takes
you to sub_exit.c.

4539

The result:

4540

The exit code is in the file sub_exit.c

4541

Line Mode

4542
4543
4544
4545

All the commands discussed so far work on words only. The CTRL-X CTRLL command works on lines. If you enter CTRL-X CTRL-L in the example, for
instance, you get the results shown in Figure 12-6. You can now use CTRL-N and
CTRL-P to go up and down lines.

4546
4547
4548
4549
4550
4551
4552
4553

#include "include.h"
#define MORE "/usr/ucb/more"
#define MORE "/usr/ucb/more"
#include "include.h"
#define MORE "/usr/ucb/more" ~
~
~
-- Whole line completion (^L/^N/^P)--

4554
4555

Figure 12-6: CTRL-X CTRL-L.


Dictionary and Thesaurus

4556
4557

word.

4558
4559

The CTRL-X CTRL-T command does the same thing except that the word
files specified by 'thesaurus' ('tsr') option are used.

4560

Guessing

4561
4562

The CTRL-X CTRL-V command guesses what type of word is before the
cursor and performs the approbate completion.

4563

The command CTRL-X CTRL-K searches the dictionary files for the given

@@ How does it guess.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 198

Draft Not for publication

Draft 0.1

Not for widespread publication

4564

User and Omni completion

4565
4566
4567

The CTRL-X CTRL-U command calls the function defined by the


'completefunc' ('cfu') option. The command CTRL-X CTRL-O does the same
thing only the function specified by the 'omnifunc' ('ofu') is called.

4568
4569

Writing a completing function is a advanced specialized task that's beyond


the scope of the book.

4570

@@ Maybe add this topic to the book

4571

Adjusting the Screen

4572
4573
4574

There are two more CTRL-X commands which surprisingly don't do


completion. After typing CTRL-X, you can move the screen up and down a little.
The CTRL-Y command scrolls down, whereas the CTRL-E scrolls up.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 199

Draft Not for publication

Draft 0.1

Not for widespread publication

4575

Chapter 13: Autocommands

4576
4577
4578
4579
4580
4581
4582
4583

One of the nice attributes of the Vim editor is its flexibility. One of the
features that makes it so flexible is the autocommand. An autocommand is a
command executed automatically in response to some event, such as a file being
read or written or a buffer change. Through the use of autocommands, for
example, you can train Vim to edit compressed files. (You define an
autocommand that uncompresses the file on read and another one to compress
the file on write. See the file $VIMRUNTIME/vimrc_example.vim in your Vim
installation.)

4584

In this chapter, you learn about the following:

4585

Basic autocommands

4586

Autocommand groups

4587

Listing and removing autocommands

4588

Basic Autocommands

4589
4590

Suppose you want to put a date stamp on the end of a file every time it is
written. One way you could do this is to define a function:

4591
4592
4593
4594

:function DateInsert()
:
$read !date " Insert the date at the
:
" end ($) of the file.
:endfunction

4595
4596

Now when you want to write the file all you have to do is to call this
function:

4597

:call DateInsert()

4598

Then you write the file.

4599

That may be a little difficult, so you can map this to a key:

4600

:map <F12> :call DateInsert()<CR> \| :write<CR>

4601
4602

This makes things "easy" because now you just have to press <F12> every
time you want to write the file.

4603
4604
4605

If you forget, however, and use the normal Vim file writing commands, you
screw things up. It would be nice if you could do things automatically. That is
where autocommands come in.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 200

Draft Not for publication

Draft 0.1

Not for widespread publication

4606

The command

4607

:autocmd FileWritePre * :call DateInsert()

4608
4609
4610
4611
4612
4613
4614
4615
4616

causes the command :call DateInsert() to be executed for all files (*)
just before writing the file (FileWritePre).
(:autocmd can be abbreviated as :au.)
You do not need to put in a :write command because this autocommand is
executed just before each :write. In other words, with this command enabled,
when you do a :write, Vim checks for any FileWritePre autocommands and
executes them, and then it performs the :write. The general form of the
:autocmd command is as follows:
:autocmd group events file_pattern nested command

4617
4618
4619
4620
4621
4622

The group name is optional. It is used in managing and calling the


commands (more on this later). The events parameter is a list of events (comma
separated) that trigger the command. (A complete list of events appears later in
this chapter.) The file_pattern is a filename (including wildcards). The nested
flag allows for nesting of autocommands, and finally, the command is the
command to be executed.

4623

Groups

4624
4625
4626

The :augroup (:aug) command starts the definition of a group of


autocommands. The group name is just a convenient way to refer to the set of
autocommands. For example:

4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640

:augroup cprograms
:
autocmd FileReadPost *.c :set cindent
:
autocmd FileReadPost *.cpp :set cindent
:augroup END
Because the :autocmd definitions are inside the scope :augroup, they are
put in the cprograms group. The commands in this group are executed after
reading a file that ends in .c or .cpp. If you want to add another command to this
group for headers, you can use the :augroup command or just include a group
name in your specification:
:autocmd cprograms FileReadPost *.h :set cindent
Now suppose you are editing a file called sam.cx that you would like
treated as a C program. You can tell Vim to go through all the cprograms
autogroup commands and execute the ones that match *.c for the FileReadPost
event. The command to do this is:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 201

Draft Not for publication

Draft 0.1

Not for widespread publication

4641

:doautocmd cprograms FileReadPost foo.c

4642

(:doautocmd can be abbrviated :do.)

4643

The general form of the :doautocmd command is this:

4644

:doautocmd group event file_name

4645
4646
4647
4648

This executes the autocommand group pretending that the current file is
file_name rather than the current one. If the group is omitted, all groups are
used and if file_name is left off, the current filename is used. The event must be
specified and is the event that Vim pretends has just happened.

4649
4650

The following command does the same thing as :doautocmd except it


executes once for each buffer:

4651

:doautoall group event file_name

4652

(Abbreviation :doautoa.)

4653
4654
4655

Note: Do not use this to trigger autocommands that switch buffers, create
buffers, or delete them. In other words, when using this command, leave
the buffers alone.

4656
4657

Events
You can use the following events to trigger an autocommand:
Triggered when editing a
file that does not exist.

BufNewFile
BufReadPost

Triggered before
(BifReadPre) / after
(BufReadPost) reading a
buffer.

BufRead

Alias for BufReadPost.

BufFilePre

BufFilePost

Before / after changing


the name of a buffer with
the :file (:f) command.

FileReadPre

FileReadPost

Before / after reading a


file with the :read
command. For
FileReadPost, the marks
'[ and '] will be the
beginning and end of the
text read in.

BufReadPre

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 202

Draft Not for publication


FilterReadPre

Draft 0.1
FilterReadPost

Not for widespread publication


Before / after reading a
file with a filter
command.

FileType

When the 'filetype'


option is set.

Syntax

When the syntax option is


set.

StdinReadPre

StdReadPost

Before / after reading


from the standard input.
(The editor must have
been started as vim -.)

BufWritePre

BufWritePost

Before / after writing the


entire buffer to a file.
Alias for BufWritePre.

BufWrite
FileWritePre

FileWritePost

Before / after writing part


of a buffer to a file.

FileAppendPre

FileAppendPost

Before / after appending


to a file.

FilterWritePre

FilterWritePost

Before / after writing a


file for a filter command.
This is triggered when
Vim runs a shell
command and then
notices that the
modification time of the
file has changed.

FileChangedShell

FocusGained

FocusLost

CursorHold

vim-all-good.odt (28. Sep. 2007) The Vim Book

Triggered when Vim gets


or loses input focus. This
means that Vim is
running in GUI mode and
becomes the current
window or something else
becomes the current
window.
Occurs after the user
pauses typing for more
than the timeout specified
by the 'updatetime'
option.
Page 203

Draft Not for publication


BufEnter

Draft 0.1
BufLeave

When a buffer is entered


or left.
Triggered just before a
buffer is unloaded.

BufUnload

4658

Not for widespread publication

BufCreate

BufDelete

Just after a buffer is


created or just before it is
deleted.

WinEnter

WinLeave

Going into or out of a


window.

GuiEnter

The GUI just started.

VimEnter

The Vim editor just


started and the
initialization files have
been read.

VimLeavePre

The Vim editor is exiting,


but has not written the
.viminfo file.

VimLeave

The Vim editor is exiting,


and the .viminfo file has
been written.

FileEncoding

The 'fileencoding'
option has just been set.

TermChanged

The term option changed.

User

Not a real event, but used


as a fake event for use
with :doautocmd.

When writing a file, Vim triggers only one pair of the following events:

4659

BufWritePre

BufWritePost

4660

FilterWritePre

FilterWritePost

4661

FileAppendPre

FileAppendPost

4662

FileWritePre

FileWritePost

4663
4664

When reading a file, one of the following set of events will be triggered:
BufNewFile

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 204

Draft Not for publication

Draft 0.1

Not for widespread publication

4665

BufReadPre

4666

FilterReadPre

FilterReadPost

4667

FileReadPre

FileReadPost

BufReadPost

4668

File Patterns

4669
4670

The filename pattern matching uses the UNIX standard system. The
following list identifies the special characters in the file matching patterns.
*

Match any characters, any length

Match any single character

Separates alternate patterns such as: one,two,three which


matches the string one, two, or three.

\?

The question mark (?).

\,

The comma (,).

[abc]

Match one of the given characters.

[^abc]

Match any character except the given character.

{string}

The first time this occurs, match string and set \1 to the
value of string. Thus {text}\1 and texttext match the
same thing. The second {} will set \2, the third \3 and so
on.

{one,two}

Match one or two and set \x to the value of what was


matched.

\character

Treat character as a search pattern character. For


example, a\+ matches a, aa, aaa, and so on.

4671

Nesting

4672
4673
4674
4675
4676
4677
4678
4679

Generally, commands executed as the result of an autocommand event will


not trigger any new events. For example, suppose you define a :autocmd which
responds to the Syntax event by reading a file. You also have a :autocmd
defined for the event FileReadPre. So a Syntax event is triggered, this causes a
file read which would normally trigger a FileReadPre event. Except because
you are already in a :autocmd and events do not next, the second event is
ignored. However, if you include the keyword nested, then events within events
will trigger a :autocmd. For example:

4680

:autocmd FileChangedShell *.c nested e!

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 205

Draft Not for publication


4681

Draft 0.1

Not for widespread publication

Listing Autocommands

4682

The following command lists all the autocommands:

4683

:autocmd

4684

For example:

4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700

:autocmd
--- Auto-Commands -filetype BufEnter
*.xpm if getline(1) =~ "XPM2"|set ft=xpm2|endif
*.xpm2 set ft=xpm2
...
FileType
*
set formatoptions=tcql nocindent comments&
c
set formatoptions=croql cindent
...
filetype StdinReadPost
* if !did_filetype()|so scripts.vim|endif
Syntax
OFF syn clear
abc so $VIMRUNTIME/syntax/abc.vim
(Listing truncated.)

4701
4702
4703
4704

From this, you can see a number of commands under the group filetype.
These command are triggered by the BufEnter and StdinReadPost events.
There are also a couple of commands with no group name triggered by the
FileType event. If you want a subset of all the commands, try the following:

4705
4706
4707
4708
4709
4710

:autocmd group event pattern


If group is specified, only the commands for that group are listed. Event
can be one of the previously defined events or * for all events. The pattern
specifies an optional file matching pattern. Only the commands that match are
listed.
For example:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 206

Draft Not for publication


4711
4712
4713
4714

Draft 0.1

Not for widespread publication

:autocmd filetype BufEnter *.xpm


--- Auto-Commands -filetype BufEnter
*.xpm if getline(1) =~ "XPM2"|set ft=xpm2|endif

4715

Removing Commands

4716
4717
4718

The command :autocmd! removes autocommands. The matching rules


are the same for listing commands, so the following removes all the
autocommands:

4719

:autocmd!

4720

To remove the commands for a specific group, execute this command:

4721

:autocmd! group

4722

You can also specify events and patterns for the group, as follows:

4723

:autocmd! group event pattern

4724
4725
4726

Again, event can be * to match all events. You can use the :autocmd!
command to remove existing commands and define a new one in one command.
The syntax for this is as follows:

4727

:autocmd! group event pattern nested command

4728

This is the equivalent of the following:

4729
4730

:autocmd! group event pattern


:autocmd group event pattern nested command

4731

Ignoring Events

4732
4733
4734

At times, you will not want to trigger an autocommand .The eventignore


option contains a list of events that will be totally ignored. For example, the
following causes all Window Enter and Leave events to ignored:

4735

:set eventignore=WinEnter,WinLeave

4736

('eventignore' can be abbreviated as 'ie')

4737

To ignore all events, use the following command:

4738

:set eventignore=all

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 207

Draft Not for publication

Draft 0.1

Not for widespread publication

4740

Chapter 14: File Recovery and Command-Line


Arguments

4741
4742
4743

The Vim editor is designed to survive system crashes with minimum losses of
data. This chapter discusses how to use Vim's crash recovery procedures. In
this chapter, you learn about the following:

4739

4744

Command-line arguments for file recovery

4745

Encryption

4746

Batch files and scripts

4747

Additional command-line arguments

4748

Backup file options

4749

How to do file recovery

4750

Advanced swap file management

4751

Command-Line Arguments

4752
4753
4754

There are several useful command-line arguments. The most useful is


--help, which displays a short help screen listing all the command-line arguments:

4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767

4768
4769

$ vim --help
VIM - Vi IMproved 7.0 (2006 May 7, compiled Jun 27 2006 19:50:12)
usage:
or:
or:
or:

vim
vim
vim
vim

[arguments]
[arguments]
[arguments]
[arguments]

Arguments:
--g
-f or --nofork
-- lots more help --

[file ..]
-t tag
-q [errorfile]

edit
read
edit
edit

specified file(s)
text from stdin
file where tag is defined
file with first error

Only file names after this


Run using GUI (like "gvim")
Foreground: Don't fork when starting GUI

To find out which version of Vim you have as well as to list the compilation
options, use the following command:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 208

Draft Not for publication


4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787

4788
4789

Draft 0.1

Not for widespread publication

$ vim version
VIM - Vi IMproved 7.0 (2006 May 7, compiled Jun 27 2006 19:50:12)
Compiled by oualline@www.oualline.com
Normal version with GTK2 GUI. Features included (+) or not (-):
-arabic +autocmd +balloon_eval +browse +builtin_terms +byte_offset +cindent
+clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
-- more compile options -+wildignore +wildmenu +windows +writebackup +X11 -xfontset +xim +xsmp_interact
+xterm_clipboard -xterm_save
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
user exrc file: "$HOME/.exrc"
system gvimrc file: "$VIM/gvimrc"
user gvimrc file: "$HOME/.gvimrc"
system menu file: "$VIMRUNTIME/menu.vim"
fall-back for $VIM: "/usr/local/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -DXTHREADS
-- long command --

To view a file, you can "edit" it in read-only mode by using the -R


command:

4790

$ vim -R file.txt

4791

On most systems, the following command does the same thing:

4792

$ view file.txt

4793
4794

This actually starts editing the file with the 'modifiable' ('ma') option
turned off. You can turn on this option if you want to change the file.

4795

Encryption

4796
4797

The -x argument tells Vim to encrypt the file. For example, create a file
that contains something you want to keep secret:

4798
4799
4800
4801

$ vim -x secret.txt
The editor now prompts you for a key used for encrypting and decrypting
the file:
Enter encryption key:

4802
4803

You can now edit this file normally and put in all your secrets. When you
finish editing the file and tell Vim to exit, the file is encrypted and written.

4804
4805

If you try to print this file using the cat or type commands, all you get is
garbage.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 209

Draft Not for publication

Draft 0.1

Not for widespread publication

4806

Switching Between Encrypted and Unencrypted Modes

4807
4808

The option 'key' contains your encryption key. If you set this option to
the empty string (""), you turn off encryption:

4809

:set key=

4810

If you set this to a password, you turn on encryption. For example:

4811

:set key=secret (Not a good idea!)

4812
4813

Setting the encryption key this way is not a good idea because the
password appears in the clear. Anyone shoulder surfing can read your password.

4814
4815
4816

To avoid this problem, the :X command was created. It asks you for an
encryption key and sets the key option to whatever you type in. (Note that the
password will not be echoed. Instead * is printed for each character entered.)

4817
4818

:X
Enter encryption key:

4819

Limits on Encryption

4820
4821
4822
4823
4824

The encryption algorithm used by Vim is weak. It is good enough to keep


out the casual prowler, but not good enough keep out a cryptology expert with
lots of time on his hands. Also you should be aware that the swap file is not
encrypted; so while you are editing, people with superuser privileges can read
the unencrypted text from this file.

4825
4826
4827
4828

One way to avoid letting people read your swap file is to avoid using one. If
the -n argument is supplied on the command line, no swap file is used (instead,
Vim puts everything in memory). For example, to edit the encrypted file file.txt
and to avoid swap file problems use the following command:

4829

$ vim -x -n file.txt

4830

Note: If you use the -n argument, file recovery is impossible.

4831
4832
4833
4834
4835
4836

Also while the file is in memory, it is in plain text. Anyone with privileges
can look in the editor's memory and discover the contents of the file. If you use a
.viminfo file, be aware that the contents of text registers are written out in the
clear as well. If you really want to secure the contents of a file, edit it only on a
portable computer not connected to a network, use good encryption tools, and
keep the computer locked up in a big safe when not in use.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 210

Draft Not for publication

Draft 0.1

Not for widespread publication

4837

Executing Vim in a Script or Batch File

4838
4839
4840

Suppose you have a lot of files in which you need to change the string
--person-- to Jones. How do you do that? One way is to do a lot of typing. The
other is to write a shell script or batch file to do the work.

4841
4842
4843
4844
4845

The Vim editor does a superb job as a screen-oriented editor when started
in normal mode. For batch processing, however, it does not lend itself to
creating clear, commented command files; so here you will use ex mode instead.
This mode gives you a nice command-line interface that makes it easy to put into
a batch file.

4846

The ex mode commands you need are as follows:

4847
4848
4849

:%s/--person--/Jones/g
:write
:quit

4850
4851

You put these commands in the file change.vim. Now to run the editor in
batch mode, use this command:

4852

$ vim -es file.txt <change.vim

4853
4854
4855
4856

This runs the Vim editor in ex mode (-e flag) on the file file.txt and reads
from the file change.vim. The -s flag tells Vim to operate in silent mode. In
other words, do not keep outputting the : prompt, or any other prompt for that
matter.

4857

Additional Command-Line Arguments

4858
4859
4860

A number of command-line arguments are designed to control the behavior


of the editor. For example, you may want to restrict what you can do in Vim.
The arguments to support this are as follows:

4861
4862

-R

Open the file for read-only.

-m

Modifications are not allowed. This argument is more of a


recommendation than a restriction because all it does is set the
'nowrite' option. It does not prevent you from setting the
'write' option and modifying the file.

-Z

Restricted mode. This prevents the user from using :shell or


other commands to run an external shell. It does not prevent the
user from trying to edit another file using the :vi file command.

The other arguments enable you to choose which initialization files you
read:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 211

Draft Not for publication

4863
4864
4865

Not for widespread publication

-u file

Use file rather than .vimrc for initialization. If the


filename is NONE, no initialization file is used.

-U file

Use file rather than .gvimrc for initialization. If the


filename is NONE, no initialization file is used.

-i file

Use file rather than the .viminfo file.

In UNIX, the Vim editor is actually one file with several different names
(links). The editor starts in different modes, depending on with which name it is
started. The names include the following:
vim

Start Vim in console mode. (Edits inside the current window.)

gvim

Start Vim in GUI mode. (The editor creates its own window for
editing.)

ex

Start in ex mode. (Some systems link this to the system


command ex.)

view

4866

Draft 0.1

Start in normal mode, read-only.

gview

Start in GUI mode, read-only.

rvim

Start in console mode, restricted.

rview

Start in console mode, read-only, restricted.

rgvim

Start in GUI mode, restricted.

rgview

Start in GUI mode, read-only, restricted.

vi

Linux and other similar systems. Alias for vim.

You can use command-line arguments to set the initial mode as well:
-g Start Vim in GUI mode (same as using the command gvim).
-v Start Vim in visual mode (same as using the command vim).
-e Start Vim in ex mode (same as using the command ex on most
systems).

4867
4868

You can use a number of command-line arguments to debug and test,


including the following:
-V number

Display extra messages letting you know what is going


inside the editor. The higher the number, the more
output you get. This is used for debugging your Vim
scripts.

-f

Foreground. Do not start a GUI in the background. This


proves useful when gvim is run for another program that
wants to wait until the program finishes. It is also

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 212

Draft Not for publication

Draft 0.1

Not for widespread publication

extremely useful for debugging.

4869
4870

4871

-w script

Write all characters entered by the user into the script


file. If the script file already exists, it is appended to.

-W script

Like -w, but overwrite any existing data.

-s script

Play back a script recorded with -w.

-T terminal

Set the terminal type. On UNIX, this overrides the value


of the $TERM environment variable. (Of course, if the
$TERM environment is wrong, lots of other programs will
be screwed up as well.)

You also have compatibility arguments. These are of use only if you really
want Vim to act like Vi.
-N

Non-compatible mode. This argument makes Vim act like Vim


rather than Vi. This argument is set by default when a .vimrc
file is present.

-C

Compatible. This turns off many of the Vim special features


and makes the editor look as much like Vi as possible.

-l

Lisp mode. This mode is an obsolete holdover from the old Vi


days. It sets the 'lisp' and 'showmatch' ('sm') options. The
Vim file-type-related commands do a much better job of
handling Lisp programs, and they do it automatically.

Finally, you have a few arguments that cannot be classified any other way:
-d device
-b

Amiga only. Open the given device for editing.


Binary mode. Sets the options noexpandtab, textwidth=0,
nomodeline, and systems)..

4872

Foreign Languages

4873
4874
4875
4876
4877

The Vim editor can handle a variety of languages. Unfortunately, to edit


these languages, you do not only need a Vim editor with the language features
compiled in, but you also need special fonts and other operating system support.
This means that unfortunately foreign language support is beyond the scope of
this book.

4878

But the command-line arguments for the foreign languages are as follows:
-F
-H

Farsi
Hebrew

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 213

Draft Not for publication

Draft 0.1

Not for widespread publication

4879

Backup Files

4880
4881

Usually Vim does not produce a backup file. If you want to have one, all
you need to do is execute the following command:

4882

:set backup

4883

('bk' is the short name for 'backup'.)

4884
4885
4886
4887

The name of the backup file is the original file with a "~" added to the end.
If your file is named data.txt, for example, the backup file name is data.txt~. If
you do not like the fact that the backup files end with ~, you can change the
extensions by using the following:

4888

:set backupext=string

4889

('bex' is the short name for 'backupext'.)

4890

If 'backupext' is .bak, data.txt is backed up to data.txt.bak.

4891
4892
4893
4894
4895
4896

The Vim editor goes you one better when it comes to the backup file. If you
set the 'patchmode' ('pm') option, Vim backs up the file being edited to a file
with the same name, but with the 'patchmode' string appended to it. This will
be done only if the file does not exist. For example, suppose you execute this
command:
:set patchmode=.org

4897
4898
4899
4900
4901

Now you edit the existing file data.txt for the first time. When you exit Vim
checks to see whether the file data.txt.org exists. It does not, so the old file is
saved under that name. The next time you edit, the file does exist; so the backup
is written to data.txt~.The file data.txt.org is not used from now on. Instead, all
backups will go to data.txt~ .

4902
4903
4904

Usually Vim puts the backup file in the same directory as the file itself.
You can change this with the 'backupdir' ('bdir') option. For example, the
following causes all backup files to be put in the ~/tmp directory:

4905

:set backupdir=~/tmp/

4906
4907
4908

This can create problems if you edit files of the same name in different
directories. That is because their backup files will all go to the ~/tmp directory
and the name collision will cause the old backup files to disappear.

4909
4910
4911

The 'backupdir' option can actually take a series of directories, separated


by comma. The editor puts the backup file in the first directory where a backup
file can be created.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 214

Draft Not for publication

Draft 0.1

Not for widespread publication

4912

Skipping the backup

4913
4914
4915
4916

For some directories it is not useful to write a backup file. For example
you don't really need to backup temporary files in /tmp. The list of such files is
defined by the 'backupskip' ('bks') option. It is a list of strings. Any file
matching any one of these strings will not be backed up.

4917

Controlling How the File Is Written

4918

Generally when Vim writes a file, the following operations are performed:

4919
4920
4921
4922

1. Vim checks to see whether the file has been changed outside of Vim.
For example, someone could have overwritten the file with a new one. If
this happens, a warning is issued and the editor asks if you want to
continue.

4923
4924

2. If the 'writebackup' ('wb') or 'backup' option is set, any old


backup file is removed. The current file is then copied to the backup file.

4925

3. The buffer is written out to the file.

4926
4927

4. If the 'patchmode' option is set and no patch file exists, the backup
file is renamed to become the patch file.

4928
4929

5. If the 'backup' option is not set, and 'writebackup' is set, remove


the backup file.

4930
4931
4932

The reason that Vim overwrites the existing file is to preserve any hard
links that you might have on a UNIX system. On non-UNIX systems the backup
is created by renaming the original file instead of making a copy.

4933
4934
4935

Note: If you set the 'nobackup' and 'nowritebackup' options, Vim just
overwrites the existing file. This can cause loss of data if the disk fills up
during the file update.

4936
4937
4938
4939
4940

By default, the 'writebackup' option is set. This means that the system
Vim uses to write a file makes it very difficult to lose data. By using this
method, there is no chance you will lose your file if the disk fills up. You may not
be able to write out the new version of the file, but at least you do not lose the
old one.

4941
4942

There are two ways to create a backup file. The one discussed above is
triggered when 'backupcopy' ('bkc') is set to no. The backup method is:

4943

1. Write out the data to a temporary file.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 215

Draft Not for publication

Draft 0.1

4944

2. Delete old backup.

4945

3. Rename current --> backup

4946

4. Rename temp -> current

Not for widespread publication

4947
4948
4949

There are a number of subtitle problems with this system. First any hard
links that pointed to the original file, now point to the backup. Second if the
original file was owned by someone else, it is now owned by you.

4950
4951

To avoid these problems (and create others) you can set 'backupcopy' to
yes. If this happens the Vim creates the backup file using the following steps:

4952

1. Copy current -> backup

4953

2. Truncate current

4954

3. Write out all data to current.

4955
4956

Because the file is not deleted or renamed, all the links and permissions
remain. However, it does take time to copy the original file to the backup.

4957
4958

The 'backupcopy' option has a third value: auto. When set to auto Vim
will figure out the most efficient way of creating the backup and then use it.

4959

Basic File Recovery

4960
4961

Suppose that you want to edit a file called sample.txt. You start Vim with
the following command:

4962

$ gvim sample.txt

4963
4964

The editor now creates a swap file to temporarily hold the changes you
make until you write the file. When you finish editing, the swap file is deleted.

4965
4966
4967

If the editor is aborted during mid-edit, however, it does not get a chance
to delete the swap file. This means that if you are in the middle of Vim sessions
and your system locks, forcing a reboot, the swap file will not be deleted.

4968
4969
4970
4971

When Vim first starts editing a file, it checks for a swap file. If it finds one,
that means that either another editing session is in progress or another editing
session was started and the editor got aborted. Therefore, Vim issues a warning
(see Figure 14-1), and gives you a chance to decide what to do.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 216

Draft Not for publication


4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996

Figure 14-1: File in use warning.


At this point, you have a number options:
Open Read-Only

Edit anyway

Recover

Quit
Delete
4999
5000

Not for widespread publication

~
~
~
~
~
ATTENTION
Found a swap file by the name ".sample.txt.swp"
dated: Thu Feb 17 22:44:00 2000
owned by: sdo
file name: /tmp/sample.txt
modified: no
host name: www.oualline.com
user name: sdo
process ID: 8449 (still running)
While opening file "sample.txt"
dates: Thu Feb 17 22:45:33 2000
(1) Another program may be editing the same file.
If this is the case, be careful not to end up with two
different instances of the same file when making changes.
Quit, or continue with caution.
(2) An edit session for this file crashed.
If this is the case, use ":recover" or "vim r sample.txt"
to recover the changes (see ":help recovery)".
If you did this already, delete the swap file ".sample.txt.swp"
to avoid this message.

4997
4998

Draft 0.1

This option causes Vim to open the file read-only. You


should choose this option if you want to look at the file
and there is another editing session still running.
A.K.A. Damn the torpedoes, full steam ahead. If you
select this option, you can edit the file. Do not choose
this option unless you really know what you are doing.
Note that if you have two or more edit sessions running
on a single file, the last session to write the file wins.
If you were editing the file and the editor got aborted
due to a system crash or some other reason, choose this
option. It examines the swap file for changes and
attempts to restart your session from where you left off.
It usually comes close, but examine your file carefully
because the last few edits may have disappeared.
Do not edit this file.
Delete the swap file. (Appears if no one else is using
the swap file.)

After selecting one of these options, you can edit normally. Be careful if
you choose Recover, because all your changes may not have been saved.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 217

Draft Not for publication

Draft 0.1

Not for widespread publication

5001

Recovering from the Command Line

5002
5003
5004
5005

If you know the name of the file you were editing when your editing session
was aborted, you can start Vim in recovery mode using the -r argument. If you
were editing the file commands.c when you were rudely interrupted, for
example, you can recover with the following command:

5006

$ vim -r commands.c

5007

If you want to get a list of recoverable editor sessions, use this command:

5008

$ vim -r

5009
5010

This causes Vim to check for swap files in the current directory and the
standard temporary directories. For example:

5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026

$ vim -r
Swap files found:
In current directory:
-- none In directory ~/tmp:
-- none In directory /var/tmp:
-- none -In directory /tmp:
1. .script.txt.swp
dated: Fri Feb 18 19:48:46 2000
owned by: sdo
file name: /tmp/script.txt
modified: no
host name: www.oualline.com
user name: sdo
process ID: 26473 (still running)

5027
5028
5029
5030
5031

In this example, you see that there is a swap file for the file /tmp/script.txt.
The process number of the editor that created the swap file is 26473.The process
is still running, so you probably do not want to try to edit or recover the file
using this edit session. You probably want to find the window for process 26473
and use it instead.

5032
5033

Several options and other commands affect file recovery. See the snext
section for more information.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 218

Draft Not for publication

Draft 0.1

Not for widespread publication

5034

Advanced Swap File Management

5035
5036
5037
5038
5039

The Vim editor goes to a great deal of trouble not to overwrite any old
swap files. The first time a file is edited, the swap file name is .file.txt.swp. If
the editor is aborted and you start editing again, the next swap file is called
.file.txt.swo, and then .file.txt.swn, and so on. You can tell Vim to recover using a
specific swap file by specifying the name of the swap file with the command:

5040
5041
5042

$ vim -r file.txt.swo
To find out the name of the swap file you are currently using, execute the
following command:

5043

:swapname

5044

(;swapname can be abbreviated as :sw.)

5045

This displays the name of the swap file.

5046

Controlling When the Swap File Is Written

5047
5048
5049
5050

Usually the swap file is written every 4 seconds or when you type 200
characters. These values are determined by the 'updatecount' ('uc') and
'updatetime' ('ut') options. To change the amount of time Vim waits before
writing the swap file to 23 seconds, for example, use the following command:

5051

:set updatetime=23000

5052

Note: The 'updatetime' is specified in milliseconds.

5053
5054
5055
5056
5057
5058
5059

To change the number of characters you have to type before Vim writes
stuff to the swap file to 400, for instance, use this command:
:set updatecount=400
If you change the 'updatecount' to 0, the swap file will not be written.
However, the decision whether to write a swap file is better controlled by the
'swapfile' option. If you have this option set, a swap file will be created (the
default):

5060

:set swapfile

5061

If you do not want a swap file, use the following command:

5062

:set noswapfile

5063

('swf' is the short name for 'swapfile'.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 219

Draft Not for publication

Draft 0.1

Not for widespread publication

5064
5065
5066

This option can be set/reset for each edited file. If you edit a huge file and
don't care about recovery, set 'noswapfile'. If you edit a file in another
window, it will still use a swap file.

5067
5068
5069
5070
5071

On most operating systems, when you "write" a file, the data usually goes
into a memory buffer and is actually written to the disk when the operating
system "thinks" it is appropriate. This usually takes only a few seconds. If you
want to make sure that the data gets to disk, however, you want to use the
following command:

5072

:set swapsync

5073

('sws' is the short name for 'swapsync')

5074
5075
5076
5077

This command tells Vim to perform a sync operation after each writing of
the swap file to force the data onto the disk. The 'swapsync' option can be
empty, fsync, or sync, depending on what system call you want to do the
writing.

5078

Controlling Where the Swap File Is Written

5079
5080
5081

Generally, Vim writes the swap file in the same directory as the file itself.
You can change this by using the 'directory' ('dir') option. For example, the
following tells Vim to put all swap files in /tmp:

5082

:set directory=/tmp (Not a good idea)

5083
5084

This is not a good idea because if you try to edit the file readme.txt in two
different directories at the same time, you encounter a swap file collision.

5085
5086
5087
5088
5089

You can set the 'directory' option to a list of directories separated by a


comma (,). It is highly recommended that you use a period (.) as the first item it
this list. The swap file will be written to the first directory in the list in which
Vim can write the file. For example, the following tells Vim to write the swap file
in the current directory, and then to try /tmp:

5090

:set directory=.,/tmp

5091

Advanced File Writing

5092
5093
5094
5095
5096

Normally when Vim writes a file, it just writes a file. If the 'fsync' ('fs')
option is on, it will write a file, then do an fsync() system call to make sure it gets
written to disk. This helps protect you against loss of data when there's a power
outage. However on some laptops it will cause the disk to spin up thus draining
the battery.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 220

Draft Not for publication

Draft 0.1

Not for widespread publication

5097

Saving Your Work

5098
5099
5100

Suppose you have made a bunch of changes and you want to make sure
they stick around even if Vim or the operating system crashes. One way to save
your changes is to use the following command to write out the file:

5101

:write

5102

(:w does the same thing.)

5103
5104

However, this command overwrites your existing file with all your changes.
The following is a related command:

5105

:preserve

5106

(:preserve can be written as :pre.)

5107
5108
5109
5110
5111
5112

This command writes all the edits to the swap file. The original file
remains unchanged and will not be changed until you do a :write or exit with
ZZ. If the system crashes, you can use the swap file to recover all your edits.
Note that after a :preserve, you can recover even if the original file is lost.
Without this command, you need both the original file and the swap file to
recover.

5113

The :recover Command

5114

The following command tries to recover the file named file.txt:

5115

:recover file.txt

5116

(:rec is the short form of :recover.)

5117

It is just like this command:

5118

$ vim -r file.txt

5119
5120

If the file you are trying to recover is currently being edited this command
fails. If no filename is specified, it defaults to the file in the current buffer.

5121
5122

If you want to discard any changes you have made to the file and attempt
to recover, use the following command:

5123

:recover! file.txt

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 221

Draft Not for publication

Draft 0.1

Not for widespread publication

5124

MS-DOS Filenames

5125
5126
5127
5128
5129

If you are on an MS-DOS or Windows 3.1 machine, you are stuck with very
limited filenames. The Vim editor detects this and limits the swap filename to
something that can be used on this type of machine. Whereas the normal swap
file for foo.txt is .foo.txt.swp, for example, if you are in short name mode, it is
foo_txt.swp.

5130
5131
5132
5133
5134
5135

You can set the 'shortname' option to force Vim to use this convention.
This is useful if have a Linux or other system and are editing files on an MS-DOS
partition. In this case, the operating system (Linux) supports long filenames,
but the actual disk you are working on (MS-DOS format) does not. Therefore,
you need to tell Vim to use the short swap names by giving it the following
command:

5136

:set shortname

5137
5138

This option is not available for the MS-DOS version of Vim because it
would be always on. Instead, it is used when you are cross-platform editing.

5139

readonly and modified Options

5140
5141
5142

The 'modified' ('mod') flag is set if the buffer has been modified. You
probably do not want to set this option yourself because it is handled
automatically. You can use the value of this option in macros, however.

5143
5144
5145
5146

The 'readonly' ('ro') flag is also set automatically if the file is read-only.
In only one circumstance should you reset this: when you are using a source
control system that normally leaves files in read-only mode. You want to edit the
file, so you start Vim.

5147
5148
5149
5150
5151
5152

The editor warns you that the file is read-only and sets the 'readonly'
option. At this point, you realize that you forgot to tell the source control system
that you want to edit the file. So you use :shell (:sh) to go to the command
prompt and execute the commands needed to tell the system that you want to
edit the file. The RCS system uses the co -l command to do this, for example; the
SCCS system uses sccs edit.

5153
5154

After getting permission to edit the file, you use the exit command to
return to

5155
5156

Vim, where you execute the following command to mark the file as
editable:

5157

:set noreadonly

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 222

Draft Not for publication

Draft 0.1

Not for widespread publication

5158

Chapter 15: Miscellaneous Commands

5159
5160

This chapter discusses all the commands that do not quite fit in any other
chapter. In this chapter, you learn about the following:

5161

Getting character number information

5162

How to go to a specific byte in the file

5163

Redrawing the screen

5164

Sleeping

5165

Terminal control

5166

Suspending the editor

5167

Reshowing the introduction screen

5168

Printing the Character

5169
5170

The command :ascii (:as) or ga prints the number of the character under
the cursor. The output looks like this:

5171

<*> 42, Hex 2a, Octal 052

5172
5173
5174

If editing a multibyte (Japanese or Chinese for example) file, and the


character under the cursor is a double-byte character, the output shows both
bytes.

5175

Going to a Specific Character in the File

5176
5177
5178

The countgo command goes to byte number count of the file. The
command g CTRL-G displays the current byte number of a file (along with the
current line, column, and other information).

5179
5180

The command :goto offset (:go) also positions the cursor to a given byte
location within the file.

5181
5182
5183
5184

The gg command acts much like the G command. It goes to the line
specified by its count. For example, 5gg goes to line 5.The difference between gg
and G is that if no count is specified, gg goes to the first line and G goes to the
last.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 223

Draft Not for publication

Draft 0.1

Not for widespread publication

5185

Screen Redraw

5186
5187
5188
5189

The CTRL-L command redraws the screen. This proves useful when you
are on a terminal and some system message or other text screws up your screen.
With the advent of the dedicated GUI, the need for this command is greatly
diminished.

5190

Sleep

5191
5192
5193

The :sleep time (:sl) command does nothing for the specified number of
seconds. If time ends in m, it is specified in milliseconds. This command proves
useful when you want to pause during the execution of a macro.

5194

The countgs command also sleeps for count seconds.

5195

Terminal Control

5196
5197
5198

On most terminals, the CTRL-S command stops output. To restart it again,


you type CTRL-Q. These commands are not part of Vim; to avoid keyboard
conflicts, however, they are not used by any Vim commands.

5199
5200

You should not try to use these commands in a :map command because
your terminal might interpret them and they might never get to Vim.

5201

Suspending the Editor

5202
5203
5204
5205

If you are on UNIX in terminal mode, you can suspend the editor with the
normal mode command CTRL-Z. To continue editing, use the shell command fg.
This works only on shells that have job control. The :suspend command does
the same thing.

5206
5207

Note: CTRL-Z in insert mode inserts the character CTRL-Z; it does not
suspend the editor.

5208

General Help

5209
5210

The :help, :h, <F1> and <Help> commands all display the general help
screen.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 224

Draft Not for publication

Draft 0.1

Not for widespread publication

5211

Other Help Commands

5212
5213
5214
5215

The :helpgrep (:helpg) command does a :vimgrep on the help files and
lets you go through the results with :cc, :cn, :cp, and the other :vimgrep
related commands. The :lhelpgrep (:lh) command does the same thing only
using the local version of the :vimgrep command,

5216
5217

The :helptags (:helpt) command generates a help tags files for all the
files in a given directory. This is useful only if you are writing help files.

5218

Nvi Compatibility Commands

5219
5220
5221
5222
5223

For Nvi compatibility some additional commands have been added. The
:exusage (:exu) command displays help on the command mode commands (aka
the Ex commands.) The :viuslage (:viu) command displays help on the normal
mode commands. Both these commands do not work as well as :help but were
included for compability.

5224

Window Size

5225
5226
5227

The z height <CR> command resizes the current window to height. If


there is only one window open, Vim will display only height lines. (The rest will
be blank.) This is useful for slow terminals.

5228

Executing commands without changing things

5229
5230

The :keepalt (:keepa) command executes a command without chainging


the fname of the alternate file. For example:

5231

:keepalt :next

5232

Edits the next file but does not make the current one the alternate file.

5233
5234

The :keepjumps (:keepj) command executes a command without


changing the marks that are normally changed by a jump.

5235

Signs

5236
5237
5238

A sign is small marker on the left side of the screen. The sign feature is
designed to help Vim work with visual debuggers or IDEs. It gives the IDE the
ability to show things like breakpoints and other annotations.

5239
5240

Before you can use a sign, it must be defined. In this example we are
defining a sign named Here that uses the text => to point to a location.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 225

Draft Not for publication

Draft 0.1

5241
5242

:sign Here icon=here.xpm text==>


\
linehl=Search texthl=DiffChange

5243

(:sign can be abbreviated :sig.)

5244

The parameters to this command are:

Not for widespread publication

5245
5246
5247

icon

The name of the icon to use (if an icon can be


displayed.) This only works for the GTK and Motif
versions of the GUI.

5248

text

The text to display.

5249
5250

linehl

Highlight to use for the line on which the sign has


been placed.

5251

texthl

Highlight for the sign text.

5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265

(See the section Customizing the Syntax Highlighting in Chapter


23: Advanced Commands for Programmers for information on
highlighting.)
Now that we've defined a sign, we can put it somewhere. In this case we
are going to put it on line 3 of the file test.txt.
:sign place 1 line=3 name=Here file=test.txt
The 1 is the sign id number. The line is the line on which to place the
sign. The last parameters is the name of the file.
Line
..Line
=>Line
Line
Line

1
2
3
4
5
Figure 15-1: Sign placement

5266

A sign can be placed by file name or by buffer number. For example:

5267

:sign place 1 line=3 name=Here buffer=1

5268
5269
5270
5271
5272

If a sign is already in place you can change the name of the sign with the
command:
:sign place 1 name=There file=test.txt
This changes the sign from Here to There. (Assuming of course we have
done a :sign define on There.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 226

Draft Not for publication

Draft 0.1

Not for widespread publication

5273

Again we can use a buffer instead of a file name:

5274

:sign place 1 name=There buffer=1

5275
5276

To remove a sing, use the :sign unplace command. This can take a file
name or buffer number as an argument.

5277
5278
5279

:sign unplace 1 file=test.txt


:sign unplace 1 buffer=1
:sign unplace 1

5280

The last form removes all the signs for that id for all buffers.

5281

To remove the sign at the cursor location, use the command:

5282

:sign unplace

5283

Finally to remove all the sign, the command is:

5284

:sign unplace *

5285
5286

You can move to a sign within a given buffer or file with the :sign jump
command:

5287
5288

:sign jump 1 file=test.txt


:sign jump 1 buffer=1

5289

To find out what signs are defined, use the :sign list command.

5290

:sign list

5291

To limit results to a single sign, just specify it on the command line:

5292

:sign line Here

5293

To find out where the signs are located use the command:

5294

:sign list

5295
5296
5297
5298

You can limit yourself to a single buffer or file, by specifying them on the
command line:
:sign list file=test.txt
:sign list buffer=1

5299

Viewing the Introduction Screen

5300
5301
5302

If you start Vim without a filename, you will see an introductory flash
screen. This screen disappears when you type the first character. If you want to
see it again, issue the following command:

5303

:intro

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 227

Draft Not for publication


5304

Draft 0.1

Not for widespread publication

(:int does the same thing.)

5305

Open Mode

5306
5307
5308
5309

The Vim editor has all the capabilities of the Vi editor except one: open
mode. This mode is Vi's way of coping with terminals it does not understand. It
is difficult to get into this mode, difficult to use it, and the fact that Vim does not
have it is no great loss.

5310
5311

Vim does have a command to enter open mode, but when you issue the
command

5312

:open

5313

all you get is an error message.

5314

(:o will also not get you into open mode.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 228

Draft Not for publication

Draft 0.1

Not for widespread publication

5315

Chapter 16: Cookbook

5316
5317

This chapter presents a cookbook full of short recipes for doing some
common (and not so common) Vim editing. The "recipes" include the following:

5318

Character twiddling

5319

Replacing one word with another using one command

5320

Interactively replacing one word with another

5321

Moving text

5322

Copying a block of text from one file to another

5323

Sorting a section

5324

Finding a procedure in a C program

5325

Drawing comment boxes

5326

Reading a UNIX man page

5327

Trimming the blanks off an end-of-line

5328

Oops, I left the file write-protected

5329

Changing Last, First to First Last

5330

5331

How to edit all the files containing a given word


Finding all occurrences of a word

5332

Character Twiddling

5333
5334
5335
5336
5337

If you type fast, your fingers can easily get ahead of your mind. Frequently
people transpose characters. For example, the word the comes out teh. To
swap two characters (for example, e with h), put the cursor on the e and type xp.
The x command deletes a character (the e), and the p pastes it after the cursor
(which is now placed over the h).

5338

Replacing One Word with Another Using One Command

5339
5340

Suppose you want to make all idiots into managers. Execute the following
command:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 229

Draft Not for publication


5341

Draft 0.1

Not for widespread publication

:1,$s/idiots/managers/g

5342
5343
5344
5345

The colon (:) indicates that you are going to execute an ex type command.
All ex commands begin with range of line numbers on which the command
operates. In this case, the whole document is chosen, from line 1 to the last line
($).The shorthand for 1,$ is simply % as shown previously.

5346
5347
5348
5349
5350

The :s (abbreviation for :substitute) command performs a substitution.


The old text follows enclosed in slashes (/idiots/). The replacement text comes
next, also delimited by the slashes (/managers/). The g flag tells the editor that
this is a global change and so if the word idiots appears more than once on a
line, to change them all.

5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363

TheVirginWhat!?
Achurchjustboughtitsfirstcomputerandwaslearninghowtouseit.Thechurch
secretarydecidedtosetupaformlettertobeusedinafuneralservice.Wherethe
person'snamewastobe,sheputintheword<name>.Whenafuneraloccurred,she
wouldchangethiswordtotheactualnameofthedeparted.
Oneday,thereweretwofunerals,firstforaladynamedMary,andthenlateronefor
someonenamedEdna.Sothesecretaryusedglobalreplacetochange<name>toMary.
Sofar,sogood.
Next,shegeneratedtheserviceforthesecondfuneralbychangingthewordMaryto
Edna.Thatwasamistake
Imaginetheminister'ssurprisewhenhestartedreadingthepartcontainingthe
Apostles'Creedandsaw,
"BornoftheVirginEdna."

5364

Interactively Replacing One Word with Another

5365
5366

Suppose you want to replace every occurrence of the word idiot with the
word manager, but you want the chance to review each change before you do it.

5367

To do so, follow these steps:

5368

1. Use 1G to go to the top of the document.

5369

2. Execute /idiot to find the first occurrence of the word idiot.

5370
5371

3. Issue the command cwmanager<Esc>. Change the word (cw) to


manager.

5372

4. Use the n command to repeat the last search (find the next idiot).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 230

Draft Not for publication

Draft 0.1

Not for widespread publication

5373
5374

5. Execute the . (dot) command to repeat the last edit (change one word
to manager). If you do not want to change the word, skip this step.

5375
5376

6. Repeat steps 4 and 5 until you have replaced all occurrences of


idiot to manager.

5377

Alternate Method

5378

Execute the following command:

5379

:%s/idiot/manager/cg

5380
5381
5382
5383
5384

This starts an ex-mode command :substitute (abbreviated :s).The % tells


Vim to apply this command to every line in the file. You change idiot to
manager. The c flag tells :substitute to get confirmation before each change.
The g flag tells the command to change all occurrences on the line. (The default
is to change just the first occurrence.)

5385

Moving Text

5386
5387

Suppose you want to move a bunch of paragraphs from the top of the
document to the bottom.

5388

To do so, follow these steps:

5389

1. Move the cursor to the top of the paragraph you want to move.

5390

2. Use ma to place a mark named a at this location.

5391

3. Move the cursor to the bottom of the paragraph to be moved.

5392
5393

4. Execute d'a to delete to mark a. This puts the deleted text in a


register.

5394
5395

5. Move the cursor to the line where the text is to go. The paragraph
will be placed after this one.

5396
5397

6. Use the p command to paste the text below the cursor.


Another method consists of the following steps:

5398

1. Select the first line as in the previous list; make it mark a.

5399

2. Move to the bottom of the paragraph (use the } command). Mark b.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 231

Draft Not for publication

Draft 0.1

Not for widespread publication

5400
5401

3. Move to the line above where you want to put the text, and type the
command:

5402

:'a,'b move .

5403

(:m is short for :move.)

5404

Copying a Block of Text from One File to Another

5405
5406
5407
5408
5409
5410
5411
5412

The old Vi editor did not handle multiple files very well. Fortunately, Vim
does a superb job of dealing with more than one file. There are lots of different
ways to copy text from one to another. If you are used to the traditional Vi-style
commands, you can use a method based around that style. On the other hand,
Vim has a very nice visual mode. You can use it as well. Finally, Vim can make
use of the system Clipboard to move text from one Vim program to another. All
these methods work, and work well. Which one you should use is a matter of
taste.

5413

Method 1: Two Windows with Traditional Vi-Style Commands

5414

To copy a block of text between files, follow these steps:

5415

1. Edit the first file.

5416
5417

2. Execute :split second_file to go to the second file. This opens


another window and starts editing the second file in it.

5418
5419

3. Use CTRL-W p to go to the "previous" window, the one with the


original file.

5420

4. Go to the top line to be copied.

5421

5. Mark this line as mark a by using the ma command.

5422

6. Go to the bottom line to be copied

5423
5424
5425

7. Execute y'a to yank (copy in Microsoft parlance) the text from the
current cursor location to mark a ('a) into the default register.
8. Use CTRL-W p to go to the file that will receive the text.

5426
5427

9. Go to the line where the insert is to occur. The text will be placed
before this line.

5428
5429

10. Issue the P command to put (paste in Microsoft terminology) the text
in the default register above the current line.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 232

Draft Not for publication


5430
5431

Draft 0.1

Method 2: Two Windows Using Visual Mode


To copy a block of text between files, follow these steps:

5432

1. Edit the first file.

5433

2. Execute :split to edit the second file.

5434
5435

Not for widespread publication

3. Use CTRL-W p to go to the "previous" window, the one with the


original file.

5436

4. Go to the start of the text to be copied.

5437

5. Issue the V command to start visual mode.

5438
5439

6. Go to the end of the text to be copied. The selected text will be


highlighted.

5440
5441

7. Execute y to yank (Copy in Microsoft parlance) the text into the


default register.

5442

8. Use CTRL-W p to go to the file that will receive the text.

5443
5444

9. Go to the line where the insert is to occur. The text will be placed
before this line.

5445
5446

10. Issue the P command to put (paste in Microsoft terminology) the text
in the default register above the current line.

5447

Method 3: Two Different Vim Programs

5448
5449

In this method, you start up two Vim programs and copy text from one to
another. You do this by using the system Clipboard register ("*).

5450
5451
5452
5453

1. Edit the first file.


2. Start another Vim program to edit the second file. (If you are using
Linux or UNIX, the second editor can be started on another machine.
However, both programs must use the same X Windows display.)

5454

3. Go to the window with the first file in it.

5455

4. Go to the start of the text to be copied.

5456

5. Issue the V command to start visual mode.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 233

Draft Not for publication

Draft 0.1

Not for widespread publication

5457
5458

6. Go to the end of the text to be copied. The selected text will be


highlighted.

5459
5460

7. Use the "*y command to yank (copy in Microsoft parlance) the text
into the system Clipboard register ("*).

5461
5462

8. Change to the other editing command. (Make that editor your active
window.)

5463
5464

9. Go to the line where the insert is to occur. The text will be placed
before this line.

5465
5466

10. Issue the command "*P to put (paste in Microsoft terminology) the
text in the system Clipboard register ("*) above the current line.

5467
5468
5469
5470
5471
5472

Note: This method enables you to not only move text between two Vim
applications, but also to "yank" and "put" between Vim and other
applications as well. For example, you can select text in an xterm window
using the mouse and paste it into a Vim editing using "*P. Or you can copy
text into the system register in a Vim session and paste it into a Microsoft
Word document using the Edit, Paste commands.

5473
5474
5475

Or if you're editing a book about Vim using OpenOffice, you can yank the
text using *P and paste it into a figure inside your book using the middle
mouse button.

5476

Sorting a Section

5477
5478

Frequently you will be editing a file with a list of names in it (for example,
a list of object files that make up a program). For example:

5479
5480
5481
5482
5483
5484
5485
5486
5487
5488

version.o
pch.o
getopt.o
util.o
getopt1.o
inp.o
patch.o
backupfile.o
This list would be nice in alphabetic order (or at least ASCII order). To do
this using Vim commands execute the following:

5489

1. Move the cursor to the first line to be sorted.

5490

2. Issue the v command to enter visual mode.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 234

Draft Not for publication


5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525

Draft 0.1

Not for widespread publication

3. Move to the bottom of the text to be sorted. The text will be


highlighted.
4. Execute the :sort command.
Warning: In actual practice, what you see in most Makefiles (files used by
UNIX to control compilation) looks more like this:
OBJS = \
version.o
\
pch.o
\
getopt.o
\
util.o
\
getopt1.o
\
inp.o
\
patch.o
\
backupfile.o
Notice that the backslash (\) is used to indicate a continuation line. After
sorting this looks like the following:
OBJS = \
backupfile.o
getopt.o
\
getopt1.o
\
inp.o
\
patch.o
\
pch.o
\
util.o
\
version.o
\
The names are in order, but the backslashes are wrong. Do not forget to
fix them using normal editing before continuing:
OBJS = \
backupfile.o \
getopt.o
\
getopt1.o
\
inp.o
\
patch.o
\
pch.o
\
util.o

(added)

(removed)

5526

Sorting the old Vi way:

5527
5528

In this method we avoid using Vim's internal :sort command and instead
use an external command. This system also avoids visual mode.

5529

1. Move the cursor to the first line to be sorted.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 235

Draft Not for publication

Draft 0.1

Not for widespread publication

5530

2. Use the command ma to mark the first line as mark a.

5531

3. Move to the bottom of the text to be sorted.

5532
5533
5534
5535

4. Execute the !'asort command. The ! command tells Vim to run the
text through a command. The 'a tells the editor that the text to be worked
on starts at the current line and ends at mark a. The command that the text
is to go through is sort.

5536

The result looks like this:

5537
5538
5539
5540
5541
5542
5543
5544

backupfile.o
getopt.o
getopt1.o
inp.o
patch.o
pch.o
util.o
version.o

5545
5546

Finding a Procedure in a C Program

5547
5548

The Vim program was designed by programmers for programmers. You


can use it to locate procedures within a set of C or C++ program files.

5549
5550
5551

First, however, you must generate a table of contents file called a tags file.
(This file has been given the obvious name tags.) The ctags command generates
this table of contents file.

5552
5553

To generate a table of contents of all the C program files in your current


working directory, use the following command:

5554

$ ctags *.c *.h

5555

For C++, use this command:

5556

$ ctags *.cpp *.h

5557
5558

If you use an extension other than .cpp for your C++ files, use it rather
than .cpp.

5559
5560
5561
5562

After this file has been generated, you tell Vim that you want to edit a
procedure and it will find the file containing that procedure and position you
there. If you want to edit the procedure write_file, for example, use the
following command:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 236

Draft Not for publication


5563

Draft 0.1

Not for widespread publication

$ gvim -t write_file

5564
5565

Now suppose as you are looking at the write_file procedure that it calls
setup_data and you need to look at that procedure.

5566
5567
5568

To jump to that function, position the cursor at the beginning of the word
setup_data and press CTRL-]. This tells Vim to jump to the definition of this
procedure. This repositioning occurs even if Vim has to change files to do so.

5569
5570

Note: If you have edited the current file and not saved it, Vim will issue a
warning and ignore the CTRL-]command.

5571
5572
5573
5574

There are a number of tag-related commands enable you to jump


forward/backward through tags, split the windows and put the called procedure
in the other window, find inexact tags, and many more things. These can be
found in Chapter ##.

5575

Drawing Comment Boxes

5576
5577

I like to put a big comment box at the top of each of my procedures. For
example:

5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588

/*******************************************************
* Program -- Solve it -- Solves the worlds problems. *
* All of them. At once. This will be a great
*
* program when I finish it.
*
*******************************************************/
Drawing these boxes like this is tedious at best. But Vim has a useful
feature called abbreviations that makes things easier . First, you need to create a
Vim initialization file called ~/.vimrc. The ~/.vimrc file must contain the
following lines:
:ab #b /***************************************
:ab #e <Space>****************************************/

5589
5590
5591
5592

These commands define a set of Vim abbreviations. Abbreviations were


discussed in Chapter 8: Basic Abbreviations, Keyboard Mapping, and
Initialization Files. To create a comment box, enter #b<Enter>. The screen looks
like this:

5593

/************************************************

5594
5595
5596

Enter the comments, including the beginning and ending * characters.


Finally, end the comment by typing #e<Enter>.This causes the ending comment
to be entered.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 237

Draft Not for publication

Draft 0.1

Not for widespread publication

5597
5598
5599
5600
5601

Another (better) option is to use an external program like boxes (see http://
www.vim.org), which generates all kinds of ASCII art boxes and can be
customized. Here, one might visually select the text and then issue the
command :'<,'> !boxes -r ,which would remove an existing box and put a new
box around the text.

5602
5603
5604

Note: This page was written in Vim. So how did we enter the #b and #e?
Easy, we typed in #bb and then deleted a character. (We could not enter #b
or it would have been expanded.) The actual command was i#bb<Esc>x.

5605
5606

Another good tool for this sort of thing is tal, which lines up the final
character (the *, here) so it looks nice.

5607

Reading a UNIX man Page

5608
5609
5610
5611
5612

You can use the Vim editor to browse through text files. One of the most
useful sets of files to browse through is the man pages. Unfortunately, man
pages try to simulate formatting by underlining characters using a sequence
such as _<BS>x for x. This make viewing of the man page in Vim difficult. If you
try to read a man page directly, you will see something like this:

5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625

N^HNA^HAM^HME^HE
date - print or set the system date and time
To get rid of these characters, use the standard UNIX command ul -i. This
is a formatting program that removes the hard-to-read control characters. The
result looks like this:
NAME
!!!!
date - print or set the system date and time
Now all that is needed is to put three commands together: the man
command to get the manual page, the ul -i command to fix the formatting, and
vim to read the page. The resulting command is as follows:

5626

$ man date | ul -i | vim -

5627

Another technique is to use Vim on the raw page and then execute:

5628

:%s/.\b//g

5629
5630

This will remove all characters followed by the backspace (\b), rendering
the file readable.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 238

Draft Not for publication

Draft 0.1

Not for widespread publication

5631

Trimming the Blanks off an End-of-Line

5632
5633
5634

Some people find spaces and tabs at the end of a line useless, wasteful, and
ugly. To remove whitespace at the end of every line, execute the following
command:

5635

:%s/ \s*$/ /

5636
5637
5638

The colon (:) tells Vim to enter command mode. All command-mode
commands start with a line range; in this case, the special range % is used, which
represents the entire file.

5639
5640
5641

The first set of slashes encloses the "from text." The text is "any
whitespace" (\s), repeated zero or more times (*), followed by "end-of-line"
($).The result is that this pattern matches all trailing whitespace.

5642
5643

The matching text is to be replaced by the text in the next set of slashes.
This text is nothing, so the spaces and tabs are effectively removed.

5644

Oops, I Left the File Write-Protected

5645
5646
5647
5648
5649

Suppose you are editing a file and you have made a lot of changes. This is
a very important file and to preserve it from any casual changes, you writeprotected it, even against yourself. The Vim editor enables you to edit a writeprotected file with little or no warning. The only trouble is that when you try to
exit using ZZ you get the following error:

5650

file.txt File is read-only

5651

and Vim does not exit.

5652
5653
5654

So what can you do? You do not want to throw away all those changes, but
you need to get out of Vim so that you can turn on write permission. Use the
command :w! to force the writing of the file.

5655
5656

Another option: Use the :w otherfilename command to save your work in


a different file so you can fix the file permissions if that is what is required.

5657

Changing Last, First to First Last

5658
5659
5660

You have a list of names in the following form:


Last, First
How do you change them to

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 239

Draft Not for publication


5661

Draft 0.1

Not for widespread publication

First Last

5662

You can do so with one command:

5663

:1,$s/\([^,]*\), \(.*$\)/\2 \1/

5664

The colon (:) tells Vim that this is an ex-style command.

5665
5666

The line range for this command is the whole file, as indicated by the range
1,$.

5667
5668

The s (abbreviations for :substitute) tells Vim to perform a string


substitution.

5669
5670
5671
5672
5673

The old text is a complex regular expression. The \( . . . \) delimiters


are used to inform the editor that the text that matches the regular expression
inside the parentheses is to be remembered for later use. The text in the first \(
. . . \) is assigned to \1 in the replacement text. The second set of text inside
\( . . . \) is assigned \2, and so on.

5674
5675
5676
5677

In this case, the first regular expression is any bunch of characters that
does not include a comma. The [^,] means anything but a comma, and the *
means a bunch (zero or more characters). Note:This means that all leading
spaces will also be matched, which may not be what is desired.

5678

The second expression matches anything ( .*) up to the end-of-line: ($).

5679
5680
5681

The result of this substitution is that the first word on the line is assigned
to \1 and the second to \2.These values are used in the end of the command to
reverse the words.

5682
5683

Figure 16-1 example shows the relationship between the \( \) enclosed


strings and the \1, \2 markers.

5684
5685

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 240

Draft Not for publication

Draft 0.1

Not for widespread publication

Line range (1 first, $ -- last)


(% also works)
s Substitute command
From text

To Text

:1,$s/\([^,]*\) , \(.*$\) /\2 \1/

5687

Figure 16-1: Regular expression explained

5688
5689

Match anything but comma Any Character Repeated 0 or more times The
end of the line

5690
5691

Figure 16-2 breaks out the various parts of the regular expressions used in
this illustration:

5692

:l,$s/\([^,]*\), \(.*$\)/\2 \1/

5693
1
$
s
/ <from> / <to> /
\(....\)
[^,]
*
\)
,
\(...\)
\2
\1

First line of the range


Last line of the range
:substitute command
From and to text for substitution
Put contents into \1
Anything except (^) comma
Repeat previous zero or more times
End of \1
Literal comma and space
Put contents in \2
To text, contents of second \(..\)
To text, contents of first \( ...)\)

5694
5695

Figure 16-2: Substitute command to switch words

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 241

Draft Not for publication

Draft 0.1

Not for widespread publication

5696

How to Edit All the Files that Contain a Given Word

5697
5698
5699
5700

If you are a UNIX user, you can use a combination of Vim and grep to edit
all the files that contain a given word. This is extremely useful if you are
working on a program and want to view or edit all the files that contain a
specified variable.

5701
5702

For example, suppose you want to edit all the C program files that contain
the word frame_counter. To do this you use the command:

5703

$ vim `grep -l 'frame_counter' *.c`

5704
5705
5706
5707
5708
5709

Let's look at this command in detail. The grep command searches through
a set of files for a given word. Because the -l option is specified, the command
will only list the files containing the word and not print the line itself. The word
it is searching for is frame_counter. Actually, this can be any regular
expression. (Note:What grep uses for regular expressions is not as complete or
complex as what Vim uses.)

5710
5711
5712

The entire command is enclosed in backticks (`).This tells the UNIX shell
to run this command and pretend that the results were typed on the command
line.

5713
5714
5715

So what happens is that the grep command is run and produces a list of
files, these files are put on the Vim command line. This results in Vim editing the
file list that is the output of grep.

5716
5717

You can then use the commands :n and :rewind to browse through the
files.

5718
5719
5720

Why show this here? This is a feature of the UNIX shell (such as 'bash'),
and isn't part of Vim's repertoire. The way to accomplish something similar
within Vim, and which works on Win32 as well is:

5721

:args `grep -l 'frame_counter' *.c`

5722
5723

which will set the argument list, in other words, the files "on the command
line."

5724
5725

Finding All Occurrences of a Word Using the Built-in Search


Commands

5726
5727
5728

The Vim editor has a built-in grep command that you can use to search a
set of files for a given string. If you want to find all occurrences of error_string
in all C program files, for example, enter the following command:

5729

:vimgrep error_string *.c


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 242

Draft Not for publication

Draft 0.1

Not for widespread publication

5730
5731

This causes Vim to search for a string (error_string) in all the specified
files (*.c).

5732
5733

The editor will now open the first file where a match is found and position
the file on the first matching line.

5734
5735

To go to the next matching line (no matter what file), use the :cnext
command. To go to the previous match, use the :cprev command.

5736

## discuss ** and other file patterns here

5737

## reference advanced grep

5738

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 243

Draft Not for publication

Draft 0.1

Not for widespread publication

5739

Chapter 17: Topics Not Covered

5740
5741
5742
5743

The Vim editor has a tremendously rich set of features. Unfortunately, a


few areas are beyond the scope of this book, and therefore are not covered here.
These include support for commercial applications that I do not have access to
and foreign languages.

5744
5745

This chapter briefly describes the commands omitted from the rest of the
book.

5746

Interfaces to Other Applications

5747
5748
5749
5750

The Vim editor is designed to interface with many common commercial


packages as well as a few Open Source packages. Because I do not have these
packages installed, I could not examine and test these commands. Some brief
documentation appears here.

5751

Cscope

5752
5753
5754
5755
5756

The cscope command is designed to examine a set of C or C++ programs


and produce a database containing information about the location of functions
and variables in the programs. You can then use the Cscope program to query
this database to locate where an identifier is defined or used. Cscope is available
from http://cscope.sourceforge.net.

5757

For full information use the following command:

5758

:help cscope

5759

Cscope-Related Command Reference

:cs arguments
:cscope argument

Handle various activities associated


with the Cscope program.

:scs arguments
:scscope argument

Split the window then handle various


activities associated with the Cscope
program.

:lcs arguments
:lcscope argument

Handle various activities associated


with the Cscope program, but use the
local list instead of the quick fix list.

:cst procedure
:cstag procedure

Go to the tag in the CScope database


named procedure.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 244

Draft Not for publication

Draft 0.1

Not for widespread publication

:set csprg=program
:set cscopeprg=program

Define the name of the Cscope


program (Default=cscope).

:set
:set
:set
:set

cst
cscopetag
nocst
nocscopetag

If set, this option causes the


commands that do tag navigation
(:tags, CTRL-], and so on) to use the
Cscope database rather than tags.

:set
:set
:set
:set

csqf
cscopequickfix
nocsqf
nocscopequickfix

If set, use the quickfix window for


Cscspe output.

:set csto=flag
:set cscopetagorder=flag

Define the search order for the


CScope tag-searching commands. If
flag is 0, the default, search the
CScope database, followed by tags. If
flag is 1, search tags first.

:set
:set
:set
:set

If set, output error messages occur


when Vim looks for a CScope database
and fails to find it. This proves useful
when debugging initialization files
that try to load a set of databases
(default=nocscopeverbose).

csverb
cscopeverbose
nocsverb
nocscopeverbose

:set cspc=number
:set csopepathcomp=number

Sets the number of path components


to use for Cscope file specifications.
(Default = 0.)

5760

MzScheme

5761
5762

The MzScheme interface enables you use PLT Scheme scripts from within
Vim. For information use the command:

5763
5764

:help mzscheme
MzScheme Interface Command Reference

:[range]mz statement
:[range]mzscheme statement

Execute a single MzScheme statement.

:[range]mz <<pattern
:[range]mzscheme <<pattern

Execute the following lines as


MzScheme statements until a line
consisting of only pattern is seen.

:[range]mzf file
:[range]mzfile file

Execute the MzScheme script


contained in the given file.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 245

Draft Not for publication


:set mzquantum={value}
:set mzq={value}

Draft 0.1

Not for widespread publication

Sets the polling interval to {value}


milliseconds.

5765

Netbeans

5766
5767
5768

Netbeans is a Java IDE developed by Sun. It's available from


http://www.netbeans.org. There is a add on to Netbeans called Viex which lets
you use Vim as an external editor. See http://viex.sourceforge.net/.

5769
5770
5771
5772

Netbeans use the -nb command line parameter to start Vim and provide
Vim with information concerning the connection between the two programs.
One of the communications systems involves Vim sending hot keys back to
Netbeans through the :nbkey (:nbk) command.

5773
5774

Since all this communication is handled internally normal user will not
have to worry about the -nb command line parameter or the :nbkey command.

5775

OLE

5776
5777
5778
5779
5780
5781

The OLE system is a method by which programs running under Microsoft


Windows can communicate with each other. The Vim editor can act as an OLE
server. This means that you can write Microsoft Windows programs that
interface to it. For those of you who know how to write Visual Basic or other
Microsoft-based applications, you can find more information by using the
command:

5782

:help ole-interface

5783

Perl

5784
5785
5786
5787

The Perl interface enables you to execute perl command from Vim and also
gives the Perl programs an interface that they can use to access some of Vim's
functions. For a complete description of what is available, execute the following
command:

5788
5789

:help perl
Perl Interface Command Reference

:pe command
:perl command

Execute a single perl command.

:pe <<pattern
:perl <<pattern

Execute the following lines as perl commands


until a line consisting of only pattern is seen.

:{range}perld command
:{range}perldo command

Execute a perl command on a range of lines.


The perl variable $_ is set to each line in

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 246

Draft Not for publication

Draft 0.1

Not for widespread publication

range.
5790

Python

5791
5792
5793

The Python interface enables you to execute Python statements and


programs from within Vim. Like Perl, the Python interface provides you with lots
of functions and objects that enable you to access parts of the Vim editor.

5794

For complete help, execute the following:

5795

:help python

5796

Python Interface Command Reference


:{range}py statement
:{range}python statement

Execute a single Python statement.

5797

Ruby

5798
5799

Ruby is yet another scripting language you can use with Vim. For a
complete description of what is available, execute the following command:

5800
5801

:help ruby
Ruby Interface Command Reference

:rub command
:ruby command

Execute a single Ruby command.

:rub <<pattern
:ruby <<pattern

Execute the following lines as Ruby


commands until a line consisting of only
pattern is seen.

:{range}rubyd command
:{range}rubydo command

Execute a Ruby command on a range of lines.


The Ruby variable $_ is set to each line in
range.

:{range}rubyf file
:{range}rubyfile file

Execute the Ruby program contained in file.

5802

Sniff+

5803
5804
5805

Sniff+ is a commercial programming environment. The Vim editor enables


you to interface with this program. To get complete help on using this
programming tool, execute the following command:

5806

:help sniff
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 247

Draft Not for publication


5807

Draft 0.1

Not for widespread publication

Sniff+ Interface Command Reference

:sni command
:sniff command

Perform a command using the interface to Sniff+. If


no command is present, list out information on the
current connection.

5808

Sun Visual WorkShop

5809
5810
5811
5812

Visual WorkShop is an IDE which has the ability to specify an external


editor. Vim supports the Sun Visual WorkShop interface with a number of
commands and options. These have been designed to be as general as possible
to support other IDE and debugging systems.

5813
5814

For more information use the command:


:help sniff

5815

Sun Visual WorkShop reference

5816
:ws verb
:wsverb verb

Send verb to the workshop. (If you are Visual


WorkShop expert this will make sense to you.
Otherwise not.)

Option 'balloondealy' The time in ms that a cursor must hover over a


word before a help balloon appears.
('bdlay')
Option 'balloneval'
('beval')

If set, enables balloon help.

Option 'ballonexpr'
('bexpr')

Expression to use to figure out what balloon help


to display.

5817
5818

Tcl

5819
5820
5821

Tcl is another scripting language. As usual, Vim provides you with a way
to execute Tcl scripts as well as an interface for accessing parts of Vim from
within Tcl. For full information, use the following command:

5822
5823

:help tcl
Tcl Interface Command Reference

:tc command
:tcl command

Execute a single Tcl command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 248

Draft Not for publication

Draft 0.1

Not for widespread publication

:{range}tcld command Execute a Tcl command once for each line in the
:{range}tcldo command range. The variable line is set to the contents of
the line.
:tclf file
:tclfile file

Execute the Tcl script in the given file.

5824

Foreign Languages

5825
5826
5827
5828
5829
5830

The Vim editor can handle many different types of foreign languages.
Unfortunately, the author cannot. Here is a very short listing of the commands
available to you for editing in other languages. For complete information, you
need to consult the Vim documentation and as well as the documentation that
came with your computer system. Although Vim contains many languagespecific options, a few are fairly generic.
Toggle between left-to-right and
right-to-left modes.

<F8>
:set
:set
:set
:set

rl
rightleft
norl
norightleft

When set, indicates that the file is


displayed right to left rather than
left to right (default=norightleft).

:set rlc=search
:set rightleftcmd=search

Allow right to left input for the


given mode. The only legal mode is
search which is also the default.

:set
:set
:set
:set

ari
allowrevins
noari
noallowrevins

When set, let CTRL-_ toggle the


revins option. This enables you to
input languages that run from right
to left rather than left to right.

:set
:set
:set
:set

ri
revins
nori
norevins

When set, insert mode works right


to left rather than left to right. The
CTRL-_ command toggles this option
if the option allowrevins is set.

:set gfs=f1,f2
:set guifontset=f1,f2

Define a font f1 for English and


another f2 for a foreign language.
This works only if Vim was compiled
with the 'fontset' enabled and
only applies on UNIX systems.

:set gfw=f1,f2
:set guifontwide=f1,f2

Specifies a list of fonts to use for


double wide characters.
When is this used?

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 249

Draft Not for publication

Draft 0.1

Not for widespread publication

:set lmap=ch1ch2,ch1ch2
:set langmap=ch1ch2,ch1ch2

Define a keyboard mapping for a


foreign language.

:set ambiwidth=size
:set ambw=size

Set the with of ambiguous


characters when using a double
byte encoding such as some east
Asian fonts. See the Vim reference
document or just play around with
the setting until things look right.
Possible values: single or double.

:set bomb
:set nobomb

If set Vim checks for a beginning of


file (BOM) marker which tells it how
the file is encoded. This marker will
also be placed at the beginning of
the file when it is written.

:set casemap=internal,keepascii
:set cmp=internal,keepascii

Defines the upper and lower case


mappings for sorting and other
operations. If set to internal, an
internal mapping function is used.
If keepascii is present, the ASCII
characters (0x00 0x7F) use the
ASCII mapping.

:set charconvert=function
:set ccv=function

Define a function to be used for


converting one character set to
another. If no function is specified
the internal function iconv() is
used.

:set
:set
:set
:set

If set, the terminal is bidirectional.

termbidi
notermbidi
tbidi
notbidi

:set termencoding={encoding}
:set tenc={encoding}

Set the terminal encoding.

5831
5832
5833

Some languages combine characters. For example, Hebrew combines


constants and vowels into one character. When editing such languages, the
'delcombine' ('delco') option controls how deletes works on such characters.

5834
5835
5836

If this option is set, then delete (x) will delete each part of the combination
on it's own. If the option is off ('nodelcobine') then delete removes the entire
character.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 250

Draft Not for publication


5837

Draft 0.1

Not for widespread publication

Input Method

5838

The following options control the current input method works with Vim.
keymap
The name of the current keyboard mapping.
kmp
imactivekey Tells Vim what the input mode activation key is. The option
imak
is of the form {modifier}-{key} where the modifier is zero
or more of:
S Shift key
L Lock key
C Control key
1 Mod1 key
2 Mod2 key
3 Mod3 key
4 Mod4 key
5 Mod5 key
imcmdline When this option is set, Vim will always use the input
imc
method to enter or edit a command mode command.
imdisable If set, the input method is never used.
imd
iminsert
Tell Vim when to turn the language dependent input
imi
mapping (See :lmap page 420). The possible values are
0 :lmap is off and input method is off
1 :lmap is on and input method is off
2 :lmap is off and input method is on
imsearch
Like 'iminsert', only for searching, not insert.
ims
maxcombine The maximum number of combining characters for display.
mco

5839
5840

Arabic

5841
5842

Arabic is a complex flowing script language which requires special settings


to get right.
:set
:set
:set
:set
:set

Option
arabic
arab
noarabic
noarab
arabicshape

Meaning
Sets other options to make Arabic
editing possible.
When set make the visual character

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 251

Draft Not for publication

Draft 0.1

Not for widespread publication

corrections needed to do Arabic

:set arshape
:set noarabicshape
:set noarshape
5843
5844

Chinese

5845
5846
5847
5848
5849
5850

Written Chinese is a beautiful pictographic language where one character


can convey a world of meaning. Unfortunately typing that one character can be
extremely difficult given the limits of a computer keyboard. Chinese can be
written left to right, right to left, or up to down. The Vim editor supports right to
left and left to right. It also supports both traditional Chinese characters as well
as simplified Chinese.

5851
5852

Note: The Vim documentation does not contain help on the subject of
Chinese input. That is operating system dependent.

5853

Chinese-Related Command Reference

:set fe=encoding
:set fileencoding=encoding

Set the file encoding to be used for


this file. For the Chinese language,
this can be taiwan for the traditional
Chinese character set or prc for
simplified Chinese.

5854

Farsi

5855
5856
5857

The Farsi language is supported, although you must explicitly enable Farsi
when you compile the editor. It is not enabled by default. To edit in a Farsi file,
start Vim in Farsi mode by using the -F option.

5858

For example:

5859

$ vim -F file.txt

5860
5861
5862
5863

You can get complete information on Farsi editing by executing the


following command:
:help farsi
Farsi-Related Command Reference

:set
:set
:set
:set

fk
fkmap
nofk
nofkmap

If set, this option tells Vim that you are using a


Farsi keyboard (default=nofkmap).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 252

Draft Not for publication


:set
:set
:set
:set

akm
altkeymap
noakm
noaltkeymap

Draft 0.1

Not for widespread publication

When 'altkeymap' is set, the alternate keyboard


mapping is Farsi. If noaltkeymap is set, the default
alternate keyboard mapping is Hebrew
(default=noaltkeymap).

CTRL-_

Toggle between Farsi and normal mode (insertmode command).

<F9>

Toggles the encoding between ISIR-3342 standard


and Vim extended ISIR-3342 (supported only in
right-to-left mode).

5864

Hebrew

5865
5866

Hebrew is another language that goes right to left. To start editing a


Hebrew file, use the following command:

5867

$ vim -H file.txt

5868

To get help editing in this language, execute the following command:

5869

:help hebrew

5870

Hebrew-Related Command Reference

:set
:set
:set
:set

hk
hkmap
nohk
nohkmap

Turn on (or off) the Hebrew keyboard mapping


(default='nohkmap').

:set
:set
:set
:set

hkp
hkmapp
nohkp
nohkmapp

When set, this option tells Vim that you are using
a phonetic Hebrew keyboard, or a standard
English keyboard (default='nohkmapp').

:set al=number
:set aleph=number

Define the numeric value of the first character in


the Hebrew alphabet. The value used depends on
how your system encodes the Hebrew characters.
(Default: Microsoft DOS: 128. Other systems:
224)

CTRL-_

Toggle between reverse insert and normal insert


modes. Hebrew is usually inserted in reverse, like
Farsi .

:set
:set
:set
:set

If 'altkeymap' is set, the alternate keyboard


mapping is Farsi. If 'noaltkeymap' is set, the
default alternate keyboard mapping is Hebrew
(default='noaltkeymap').

akm
altkeymap
noakm
noaltkeymap

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 253

Draft Not for publication

Draft 0.1

Not for widespread publication

5871

Japanese

5872
5873

Japanese-encoded files are supported. Unfortunately there is no specific


online help for Japanese.

5874

Japanese-Related Command Reference

:set fe=japan
:set fileencoding=japan

Tells Vim that the current file is encoded


using the Japanese character set.

5875

Korean

5876
5877
5878

To edit in Korean, you need to tell Vim about your keyboard and where
your fonts reside. You can obtain information on how to do this by executing the
following command:

5879
5880

:help hangul
Korean-Related Command Reference

:set fe=korea
:set fileencoding=korea

Tells Vim that the current file is encoded


using the Korean character set.

5881

Binary Files

5882
5883
5884

Editing binary files using a text editor is tricky at best and suicidal at
worst. If you have the right combination of expertise and desperation, you can
use Vim to edit binary files.
:set
:set
:set
:set

bin
binary
nobin
nobinary

If set, then set things up for editing a binary


file.

5885
5886
5887
5888
5889
5890

Note: I realize that some people out there need to edit a binary file and
that you know what you are doing. For those of you in that situation, Vim is
an excellent editor. Fortunately for those who need to, Vim comes with a
great utility, xxd which allows one to edit binary files almost painlessly.
See the online docs for more information:

5891

:help xxd

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 254

Draft Not for publication

Draft 0.1

Not for widespread publication

5892

Modeless (Almost) Editing

5893
5894
5895
5896

If you enable the 'insertmode' option, insert mode is the default. If you
want to switch to normal, use the CTRL-O command to execute a normal-mode
command. This option is for people who do not like modes and are willing to
deal with the confusing setting it generates.
:set
:set
:set
:set

im
insertmode
noim
noinsertmode

CTRL-L

Make insert mode the default.

Leave insert mode if 'insertmode' is set.

5897

Operating System File Modes

5898
5899
5900

Some operating systems keep file type information around on the file. The
two operating systems covered in this book do not have this feature. If the OS
does determine the file type, the result will be saved in the 'osfiletype' option.
:set osf=type
:set osfiletype=type

This is set to the file type detected by an OS


capable of doing so.

:set st=type
:set shelltype=type

Define the shell type for an Amiga.

5901

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 255

Draft Not for publication

5902

5903

Draft 0.1

Not for widespread publication

Part II
Reference

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 256

Draft Not for publication

Draft 0.1

Not for widespread publication

5904

Chapter 18: Complete Basic Editing

5905
5906
5907
5908

In Chapter 2: Editing a Little Faster, you were introduced to some of the


basic editing commands. You can do 90% of most common edits with these
commands. If you want to know everything about basic editing, however, read
this chapter.

5909
5910
5911
5912
5913
5914

Chapter 2, for example, discussed the w command to move forward one


word. This chapter devotes a page to discussing in detail how to define exactly
what a word is. Chapter 2 described how to use two commands (CTRL-D and
CTRL-U) to move screen up and down through the text. There are actually six
commands to do this, with options, and that does not include the other dozen or
so positioning commands. This chapter discusses the complete command list.

5915
5916
5917

Generally you will not use all the commands in this chapter. Instead you
will pick out a nice subset you like and use them. Chapter 2 presented one
subset. If you prefer to pick your own, however, read this chapter and have fun.

5918

Word Movement

5919
5920
5921
5922

The Vim editor has many different commands to enable you move to the
beginning or end of words. But you can also customize the definition of a word
through the use of some of the Vim options. The following sections explore in
depth the word movement commands.

5923

Move to the End of a Word

5924
5925
5926

The w command moves forward one word. You actually wind up on the
beginning of the next word. The e command moves forward one word, but leaves
you on the end of the word.

5927
5928

The ge command moves backward to the end of the preceding word. Figure
18-1 shows how the various word-movement commands work.

5929

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 257

Draft Not for publication

Draft 0.1

Not for widespread publication

Profanity is the one language


that all programmers understand

ge
5931
5932
5933

ge

Figure 18-1: Word movement commands.


Defining What a Word Is
So what is a word, anyway? There are two answers to this question:

5934
5935

1. The Vim editor does a good job of defining a sane answer to this
question. (Skip to the next section.)

5936

2. If you want to know the details, read the rest of this section.

5937
5938
5939
5940

Your first answer to "What is a word?" might be the easy answer: It is a


series of letters. However, a C programmer might consider something like
size56 to be word. Therefore, another answer might be to use the C identifier
definition: the letters, digits, and the underscore.

5941
5942
5943

But LISP programmers can use the dash (-) in a variable name. They
consider the word total-size a single word. C programmers consider it two
words. So how do you resolve this conflict?

5944
5945
5946

The Vim solution is to create an option that defines what is in a word and
what is not. The following command defines the characters that belong in a
word:

5947

:set iskeyword=specification

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 258

Draft Not for publication

Draft 0.1

Not for widespread publication

5948

Note: You can abbreviate the 'iskeyword' option as 'isk'.

5949

To see what the current value of this option is, use this command:

5950

:set iskeyword?

5951

The following represents a typical value:

5952

iskeyword=@,48-57,_,192-255

5953
5954

This is all the letters (@), the digits (ASCII characters numbered 48-57 or
0-9), the underscore (_) and the international letters (192-255, through Y).

5955
5956

The specification consists of characters separated by commas. If you want


the word characters to be exclusively vowels, for instance, use this command:

5957
5958
5959
5960
5961
5962
5963
5964

:set iskeyword=a,e,i,o,u
You can specify a range of characters by using a dash. To specify all the
lowercase letters, for example, issue the following command:
:set iskeyword=a-z
For characters that cannot be specified directly (such as comma and dash),
you can use a decimal number. If you want a word to be the lowercase letters
and the dash (character #45), use the following command:
:set iskeyword=a-z,45

5965
5966
5967

The @ character represents all characters where the C function isalpha()


returns true. (This might vary, depending on the setting of the C locale, and also
depending on the C compiler and OS you are using to build Vim!)

5968
5969

To exclude a character or set of character, precede it with a circumflex (^).


The following command defines a word as all the letters except lowercase q:

5970

:set iskeyword=@,^q

5971

The @ character is represented by @-@.

5972

Special Characters for the iskeyword Option


a
a-z
45
@
@-@
^x
^a-c

Character a.
Character range (all characters from a to z).
Character number 45 (in this case, -).
All letters (as defined by isalpha()).
The character @.
Exclude the character x.
Exclude the characters in the range a through c.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 259

Draft Not for publication

Draft 0.1

Not for widespread publication

5973

Other Types of Words

5974
5975

The 'iskeyword' option controls what is and is not a keyword. Other types
of characters are controlled by similar options, including the following:

5976

'isfname'

5977

'isident'

5978

'isprint'

Filenames. (Abbreviation 'isf'.)


Identifiers. (Abbreviation 'isi'.)
Printing characters. (Abbreviation 'isf'.)

5979
5980
5981

The 'isfname' option is used for commands such as the gf command,


which edits the file whose name is under the cursor. (See Chapter 23: Advanced
Commands for Programmers, for more information on this command.)

5982
5983
5984

The 'isident' option is used for commands such as [d, which searches for
the definition of a macro whose identifier is under the cursor. (See Chapter 7:
Commands for Programmers, for information on this command.)

5985
5986
5987
5988
5989

The 'isprint' option defines which characters can be displayed literally


on the screen. Careful: If you get this wrong the display will be messed up. This
is also used by the special search pattern \p, which stands for a printable
character. (See Chapter 19: Advanced Searching Using Regular Expressions, for
information on search patterns.)

5990

There Are "words," and Then There Are "WORDS"

5991
5992
5993
5994

So now you know what words are, right? Well, the Vim editor also has
commands that affect WORDS. These two terms, WORDS and words, represent
two different things. (Only a programmer could think up terms that differ only by
case.)

5995
5996
5997

The term word means a string of characters defined by the 'iskeyword'


option. The term WORD means any sequence of non-whitespace characters.
Therefore

5998
5999
6000
6001

that-all
is three words(that, -, and all), but it is one WORD. The W command
moves forward WORDS and the B command moves backward WORDS. The
complete list of WORD-related commands is as follows:
[count]<C-Left>
[count] B
Move count WORDS backward.
[count] E
Move count WORDS forward to the end of the WORD.
[count] gE
Move count WORDS backward to the end of the WORD.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 260

Draft Not for publication

Draft 0.1

Not for widespread publication

[count]<C-Right>
[count] W
Move count WORDS forward.
6002
6003

Note: <C-Left> is the same as CTRL<LEFT>. See Appendix B: The <> Key
Names for a list of <> key names.

6004

Beginning of a Line

6005
6006
6007

The ^ command moves you to the first non-blank character on the line. If
you want to go to the beginning of the line, use the 0 command. Figure 18-2
shows these commands.

6008
6009
6010
6011
6012
6013
6014
6015

completed = true

6016

Figure 18-2: ^ and 0 commands.

6017

Repeating Single-Character Searches

6018
6019
6020

The fx command searches for the first x after the cursor on the current
line. To repeat this search, use the ; command. As usual, this command can
take an argument that is the number of times to repeat the search.

6021
6022
6023

The ; command continues the search in the same direction as the last f or
F command. If you want to reverse the direction of the search, use the ,
command. Figure 18-3 shows several typical searches.

6024

fe

To err is human to really fowl up you need a computer

,
6025

Figure 18-3: Repeat single-character search.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 261

Draft Not for publication

Draft 0.1

Not for widespread publication

6026

Moving Lines Up and Down

6027
6028

The - command moves up to the first non-blank character on the preceding


line. If an argument is specified, the cursor moves up that many lines.

6029
6030
6031

The + (<Cr>, <Enter>, CTRL-M) command moves down to the beginning of


the next line. If an argument is specified, the cursor moves down that number of
lines. Figure 18-4 shows these commands.

6032
6033
6034
36035
6036
- (minus)
6037
6038
6039
6040
+
6041
6042
6043
6044
6045
6046

ATTENTION
This room is fullfilled mit special electronische
equippment. Fingergrabbing and pressing the
cnoeppkes from the computers is allowed for die
experts only! So all the "lefhanders" stay away
and do not disturben the brainstorming von here
working intelligencies. Otherwise you will be out
thrown and kicked anderswhere! Also: please keep
still and only watchen astaunished the
blinkenlights.

2+
Figure 18-4: The + and - commands.

6047
6048
6049

The _ command moves to the first non-blank character of the line. If a


count is specified, it moves the first character of the count-1 line below the
cursor.

6050

Cursor-Movement Commands

6051
6052
6053
6054

Several commands enable you to move to different parts of the screen.


The H command moves to the top of the screen. If a count is specified, the cursor
will be positioned to the count line from the top. Therefore, 1H moves to the top
line, 2H the second line, and so on.

6055
6056

The L command is just like H except that the end of the screen is used
rather than the start.

6057
6058

The M command moves to the middle of the screen. Figure 18-5


summarizes the cursor-positioning commands.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 262

Draft Not for publication


6059
6060
6061
6062
6063
6064
6065
6066
6067
6068

Line
Line
Line
Line
Line
Line
Line
Line
Line
Line

Draft 0.1
H
2H
3H

40
41
42
43
44
45
46
47
48
49

6069

Not for widespread publication

M
3L
2L
L
Figure 18-5: Cursor-positioning commands.

6070

Jumping Around

6071
6072
6073

The Vim editor keeps track of where you have been and enables you to go
back to previous locations. Suppose, for example, that you are editing a file and
execute the following commands:

6074

1G

Go to line 1

6075

10G

Go to line 10

6076

20G

Go to line 20

6077

Now, you execute this command:

6078

:jumps

6079

(The short version is :ju.)

6080

You get the following:

6081
6082
6083
6084

jump line col file/text


2
1
0
Dumb User Stories
1 10
0
ventilation holes. Many terminals
>

6085
6086
6087

From this you see that you have recorded as jump 1, line 10, column 0, the
"ventilation holes" line. Jump 2 is at line 1, column, the "Dumb User Stories"
line.

6088
6089
6090
6091

Line 20 is not recorded in the jump list yet, because you are on it. The
jump list records only things after you jump off of them. The > points to the
current item in the list; in this case, it points to the blank line at the end
indicating an unrecorded location.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 263

Draft Not for publication

Draft 0.1

Not for widespread publication

6092
6093
6094

Now that you know what the jump list is, you can use it. The CTRL-O
command jumps back one line. Executing this command takes you back to line
10. The jump list now looks like this:

6095
6096
6097
6098

jump line col file/text


2 1
0
Dumb User Stories
> 0 10
0
ventilation holes. Many terminals
0 20
0

6099
6100
6101

The > has moved up one line. If you use the CTRL-O command again, you
move to line 1. The CTRL-I or <TAB> command moves you to the next jump in
the list. Thus you have the following:
1G
10G
20G
CTRL-O
CTRL-O
<TAB>

Go to line 1.
Go to line 10.
Go to line 20.
Jump to previous location (line 10).
Jump to previous location (line 1).
Jump to next location (line 10).

6102
6103

Using these commands, you can quickly navigate through a series of


jumping off points throughout your file.

6104

Using the Change List

6105
6106
6107
6108

Error: Reference source not foundThe jump list keeps track of where the
cursor has been. The change list does something similar but only records the
location of the cursor when a change is made. The does the same thing, only it's
limited to cursor locations where something changed.

6109
6110
6111

To go to the previous change, use the command g;. This can be proceeded
with a count to go back multiple changes. To go to the next change, use the
command [count]g, (g<comma>).

6112

To get a list of changes use the command :changes.

6113

Controlling Some Commands

6114
6115
6116
6117

Normally Vim stops any left or right movement at the beginning or end of
the line. The 'whichwrap' ('ww')option controls which characters are allowed to
go past the end and in which modes. The possible values for this option are as
follows:
Character
b
s
h

Command
Mode(s)
<BS>
Normal and visual
<Space>
Normal and visual
h
Normal and visual

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 264

Draft Not for publication


Character
l
<
>
~
[
]
6118

Not for widespread publication

Mode(s)
Normal and visual
Normal and visual
Normal and visual
Normal
Insert and replace
Insert and replace

Figure 18-6 shows how 'whichwrap' affects cursor movement.

'whichwrap' no b
6119
<bs> stops here
6120
6121
6122
6123 'whichwrap'
6124 with b

6125

Command
l
<Left>
<Right>
~
<Left>
<Right>

Draft 0.1

<bs> wraps

Carelessly planned projects take three time


longer to complete than expected. Carefully
planned projects take four times longer to
complete than expected, mostly because the
planners expect their planning to reduce the
time it takes.
Figure 18-6: Effects of the 'whichwrap' option.

6126

Where Am I, in Detail

6127
6128
6129
6130

The CTRL-G command displays summary information at the bottom of the


screen telling you where you are in the file (see Chapter 2: Editing a Little
Faster). However, you can get more detailed information if you ask. The basic
CTRL-G output looks like this:

6131

6132
6133
6134
6135

6136
6137
6138

6139
6140
6141

6142
6143

"c02.txt" [Modified] line 81 of 153 --52%-- col 1

To get more information, give CTRL-G a count. The bigger the count, the
more detailed information you get. The 1CTRL-G command gives you the full
path of the file, for example:
"/usr/c02.txt" [Modified] line 81 of 153 --52%-- col 1

The 2CTRL-G command lists a buffer number as well. (You can read more
on buffers in Chapter 5: Windows and Tabs)
buf 1: "/usr/c02.txt" [Modified] line 81 of 153 --52%-- col 1

The gCTRL-G command displays another type of status information


indicating the position of the cursor in terms of column, line, and character:
Col 1 of 0; Line 106 of 183; Char 3464 of 4418

If you are interested in having the current cursor location displayed all the
time, check out the 'ruler' ('ru') option in Chapter 28: Customizing the Editor.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 265

Draft Not for publication

Draft 0.1

Not for widespread publication

6144

Scrolling Up

6145
6146

As discussed in Chapter 2: Editing a Little Faster, the CTRL-U command


scrolls up half a screen.

6147
6148
6149

To be precise, the CTRL-U command scrolls up the number of lines


specified by the 'scroll' option. You can explicitly set this option with a :set
command:

6150
6151
6152
6153
6154
6155

:set scroll=10
You can also change the value of this option by giving an argument to the
CTRL-U command. For example, 2CTRL-U changes the scroll size to 2 and moves
up 2 lines. All subsequent CTRL-U commands will only go up 2 lines at a time,
until the scroll size is changed. Figure 18-7 shows the operation of the CTRL-U
command.
line
line
line
line
line
line
line
line
line
line

31
32
33
34
35
36
37
38
39
40

line 26
CTRL-U
(Up 1//2 screen line 27
line 28
line 29
line 30
in this case
line 31
5 lines)
line 32
line 33
line 34
line 35

line 24
2CTRL-U
(Set window=2 line 25
go up 2 lines) line 26
line 27
line 28
line 29
line 30
line 31
line 32
line 33

6156

Figure 18-7: The CTRL-U command.

6157
6158
6159

To scroll the window up one line at a time, use the CTRL-Y command. This
command can be multiplied by an argument. For example, 5CTRL-Y scrolls up 5
lines (see Figure 18-8).
line
line
line
line
line
line
line
line
line
line

6160

20
21
22
23
24
25
26
27
28
29

CTRL-Y

line
line
line
line
line
line
line
line
line
line

19
20
21
22
23
24
25
26
27
28

5CTRL-Y

line
line
line
line
line
line
line
line
line
line

14
15
16
17
18
19
20
21
22
23

Figure 18-8: The CTRL-Y command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 266

Draft Not for publication


6161
6162

Draft 0.1

Not for widespread publication

The CTRL-B command scrolls up an entire screen at a time (see Figure 189).
line
line
line
line
line
line
line
line
line
line

6163

40
41
42
43
44
45
46
47
48
49

CTRL-B
(Down one
screen)

line
line
line
line
line
line
line
line
lin3
line

32
33
34
35
36
37
38
39
40
41

Figure 18-9: The CTRL-B command.

6164
6165

You can specify this command as <PageUp> or <S-Up>. (<S-Up> is the Vim
notation for the Shift+up-arrow key.)

6166
6167
6168

Actually the CTRL-B command scrolls up the number of lines specified by


the 'window' ('wi') option. By default, this is an entire screen. So by change
the value of this option you can customize the command.

6169

Scrolling Up Summary

6170
6171

Figure 18-10 illustrates the various scrolling commands. Commands move


the top line to the indicated location.

6172
6173

Commands will scroll the screen making the indicated line the top line.
CTRL-Y
2CTRL-Y
CTRL-U
CTRL-B

line
line
line
line
line
line
line
line
line
line

40
41
42
43
44
45
46
47
48
49

6174
6175

Figure 18-10: Scrolling commands.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 267

Draft Not for publication

Draft 0.1

Not for widespread publication

6176

Scrolling Down

6177
6178

There are similar commands for moving down as well, including the
following:

6179

CTRL-D

Move down. The amount is controlled by the 'scroll' option.

6180

CTRL-E

Move down one line.

6181

CTRL-F

Move down one screen of data (also <PageDown> or <S-Down>).

6182

Figure 18-11 summarizes the scrolling commands.


CTRL-B (screen)

Line
Line
Line
Line
CTRL-U ( screen)
Line
Line
Line
2CTRL-Y (2 lines)
Line
Line
CTRL-Y (one line) Line

40
41
42
43
44
45
46
47
48
49

CTRL-E (one line)


2CTRL-E (two lines)

CTRL-D ( screen)
CTRL-F (full screen)

6183

Figure 18-11: More scrolling commands.

6184
6185
6186

Both CTRL-B and CTRL-F scroll a full screen by default. You can adjust the
amount of scrolling by setting the 'window' ('wi') option to the number of lines
you want to scroll.

6187

Define How Much to Scroll

6188
6189
6190
6191

When you move the cursor off the top or bottom, the window scrolls. The
amount of the scrolling is controlled by the 'scrolljump' ('sj') option. By
default this is a single line; if you want more scrolling, however, you can increase
this to a jump of 5, as follows:

6192
6193
6194
6195
6196
6197
6198

:set scrolljump=5
The 'sidescroll' ('ss') option does the same thing, except in the
horizontal direction. Usually the cursor must reach the top or bottom line of the
screen for scrolling to occur. If you want to add a little padding to this margin,
you can set the 'scrolloff' ('so') option. To make sure that there are at least
3 lines above or below the cursor, use the following command:
:set scrolloff=3

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 268

Draft Not for publication

Draft 0.1

Not for widespread publication

6199
6200

The option 'sidescrolloff' ('siso') does the same thing only


horizontally.

6201

Adjusting the View

6202
6203
6204
6205

Suppose you want a given line at the top of the screen. You can use the
CTRL-E (up one line) and CTRL-Y (down one line) commands until you get the
proper line at the top. Or you can position the cursor on the line and type the
command z<Enter>. Figure 18-12 shows how this command changes the screen.
Enjoys work, but she likes
the beach more.
She found a good way
To combine work and
play:
She sells C shells
by the seashore.
*****
A very intelligent turtle
Found programming UNIX a
hurdle
The system, you see,
Ran as slow as did he,
And that's not saying
much for the turtle.
*****

*****

z<Enter>

A very intelligent turtle


Found programming UNIX a
hurdle
The system, you see,
Ran as slow as did he,
And that's not saying
much for the turtle.
*****
Albert Einstein, when asked
to describe radio, replied:
"You see, wire telegraph is
a kind of a very, very long
cat. You pull his tail in
New York and his head is
meowing in Los Angeles.
Do you understand this?

6206

Figure 18-12: The z<Enter> command.

6207
6208
6209

If you supply an argument to this command, it will use that line rather than
the current one. z<Enter> positions the current line at the top of the screen, for
instance, whereas 88z<Enter> positions line 88 at the top.

6210
6211
6212
6213
6214

The z<Enter> command not only positions the line at the top of the screen,
it also moves the cursor to the first non-blank character on the line. If you want
to leave the cursor where it is on the line, use the command zt. (If you change
the current line by giving the command an argument, Vim will try to keep the
cursor in the same column.) Figure 18-13 shows the zt command.
Enjoys work, but she likes
the beach more.
She found a good way

A very intelligent turtle


Found programming UNIX a
hurdle

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 269

Draft Not for publication

Draft 0.1

To combine work and


play:
She sells C shells
by the seashore.

Not for widespread publication


The system, you see,
Ran as slow as did he,
And that's not saying
much for the turtle.

zt

*****
A very intelligent turtle
Found programming UNIX a
hurdle
The system, you see,
Ran as slow as did he,
And that's not saying
much for the turtle.

*****
Albert Einstein, when asked
to describe radio, replied:
"You see, wire telegraph is
a kind of a very, very long
cat. You pull his tail in
New York and his head is
meowing in Los Angeles.
Do you understand this?

6215

Figure 18-13: The zt command.

6216
6217
6218

If you want to position a line to the end of the screen, use the zb or zcommand. The z- positions the cursor on the first non-blank column, whereas zb
leaves it alone. Figure 18-14 shows the effects of these commands.
the beach more.
She found a good way
To combine work and
play:
She sells C shells
by the seashore.
*****
A very intelligent turtle
Found programming UNIX a
zt
hurdle
The system, you see,
Ran as slow as did he,
zAnd that's not saying
much for the turtle.

Equals nine squared


plus zero, no more.
*****
A UNIX sales lady, Lenore,
Enjoys work, but she likes
the beach more.
She found a good way
To combine work and
play:
She sells C shells
by the seashore.
*****
A very intelligent turtle

6219

Figure 18-14: The zb and z- commands.

6220
6221
6222

Finally, the zz and z. commands position the line at the center of the
window. The zz command leaves the cursor in its current column, and z. moves
it to the first nonblank column. Figure 18-15 shows what these commands do.
Equals nine squared
vim-all-good.odt (28. Sep. 2007) The Vim Book

She found a good way


Page 270

Draft Not for publication

Draft 0.1

plus zero, no more.

To combine work and play:


She sells C shells
by the seashore.

*****
A UNIX sales lady, Lenore,
Enjoys work, but she likes
the beach more.
She found a good way
To combine work and
play:
She sells C shells
by the seashore.

*****
z.
z(dot)

zz

A very intelligent turtle


Found programming UNIX a hurdle
The system, you see,
Ran as slow as did he,
And that's not saying
much for the turtle.

*****

*****

A very intelligent turtle


6223

Not for widespread publication

Albert Einstein, when asked

Figure 18-15: The z. and zz commands.

6224

Delete to the End of the Line

6225
6226
6227

The D command deletes to the end of the line. If preceded by a count, it


deletes to the end of the line and count-1 more lines. (The D command is
shorthand for d$.) See Figure 18-16for some examples of this command.

6228
6229

3D

6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240

this room is fullfilled mit special electronische


equippment. fingergrabbing and pressing the
cnoeppkes from the computers is allowed for die
experts only! so all the "lefhanders" stay away
and do not disturben the brainstorming von here
working intelligencies. otherwise you will be out
thrown and kicked anderswhere! also: please keep
still and only watchen astaunished the
blinkenlights.

6241

Figure 18-16: The D command.

Attention

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 271

Draft Not for publication

Draft 0.1

Not for widespread publication

6242

The C Command

6243
6244
6245
6246

The C command deletes text from the cursor to the end of the line and then
puts the editor in insert mode. If a count is specified, it deletes an additional
count-1 lines. In other words, the command works like the D command, except
that it puts you in insert mode.

6247

The s Command

6248
6249
6250

The s (substitute) command deletes a single character and puts the editor
in insert mode. If preceded by a count, then count characters are deleted.
Figure 18-17 illustrates this command.

6251
6252
6253
6254
6255
6256
6257
6258
6259

Profanity is the q language that all programmers know.


sone<esc>
4sunderstand<esc>
Profanity is the one language that all programmers understand.

6260

Figure 18-17: The s command.

6261

The S Command

6262
6263
6264
6265
6266

The S command deletes the current line and puts the editor in insert mode.
If a count is specified, it deletes count lines. This differs from the C command in
that the C command deletes from the current location to the end of the line,
whereas the S command always works on the entire line. Figure 18-18 illustrates
the use of the S command.
Text affected by C

6267

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 272

Draft Not for publication


6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280

Draft 0.1

Not for widespread publication

Over the years system installers have


developed many different ways to string
cables above false ceilings. One of the 2C
more innovative is the "small dog"
method. One person takes a small dog,
S (Even if the
ties a string to its collar and puts the
cursor is in the
dog in the ceiling. The owner then goes
to the spot where they want the cable to middle of the line)
come out and calls the dog. Dog runs to
2S
owner. The attach a cable to the string,
pull it through, and the cable is
installed.

6281

Figure 18-18: The S command.

6282
6283

Deleting Text

6284
6285
6286

The [count] x command deletes characters starting with the one under
the cursor moving right. The X command deletes characters to the left of the
cursor. Figure 18-19 shows how these two commands work.

6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301

1 is equal to 2 for sufficiently large values of 1.


3x
1 is equal to 2 for suffintly large values of 1.

1 is equal to 2 for sufficiently large values of 1.


3X
1 is equal to 2 for suciently large values of 1.

6302
6303

Figure 18-19: The x and X commands.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 273

Draft Not for publication

Draft 0.1

Not for widespread publication

6304

Insert Text at the Beginning or End of the Line

6305
6306
6307
6308
6309
6310

The I command inserts text like the i command does. The only difference
is that the I command inserts starting at the beginning of the line. (In this case,
"beginning" means at the first non-blank character.) To insert at the first
character of the line (space or not), use the gI command. The A command
appends text like the a command, except the text is appended to the end of the
line.

6311

Arithmetic

6312
6313
6314
6315

The Vim editor can perform simple arithmetic on the text. The CTRL-A
command increments the number under the cursor. If an argument is specified,
that number is added to the number under the cursor. Figure 18-20 shows how
various types of numbers are incremented.

6316
6317
6318
6319
6320

123

0177
CTRL-A

124

0x1E
CTRL-A

0200

6321

123
CTRL-A

0x1F

5CTRL-A
128

Figure 18-20: Incrementing.

6322
6323
6324
6325

If a number begins with a leading 0, it is considered an octal number.


Therefore, when you increment the octal number 0177, you get 0200. If a
number begins with 0x or 0X, it is considered a hexadecimal number. That
explains 0x1E to 0x1F.

6326
6327

The Vim editor is smart about number formats, so it will properly


increment decimal, hexadecimal, and octal.

6328
6329
6330

The CTRL-X command works just like the CTRL-A command, except the
number is decremented; or if an argument is present, the number is subtracted
from the number. Figure 18-21 shows how to decrement numbers.

6331
6332
6333
6334
6335
6336

124

0177
CTRL-X

123

0x1E
CTRL-X

0176

123
CTRL-X

0x1D

3CTRL-X
120

Figure 18-21: Decrementing.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 274

Draft Not for publication


6337
6338
6339
6340

Draft 0.1

Not for widespread publication

By default, Vim recognizes the octal and hexadecimal numbers. Which


formats are recognized is controlled by the 'nrformats' ('nf') option. If you
want to recognize just decimal numbers, for instance, execute the following
command:

6341

:set nrformats=""

6342

If you want to recognize octal and decimal numbers, use this command:

6343

:set nrformats=octal

6344
6345

Note: Decimal is always recognized. Unlike hexadecimal and octal, there


is no way to turn off decimal recognition.

6346

The default recognizes decimal, hexadecimal, and octal:

6347

:set nrformats=octal,hex

6348
6349

The Vim editor can do more sophisticated calculations. See Chpater 27:
Expressions and Functions for information on the "= register.

6350

Joining Lines with Spaces

6351
6352
6353
6354
6355

The J command joins the current line with the next one. A space is added
to the end of the first line to separate the two pieces that are joined. But
suppose you do not want the spaces. Then you use the gJ command to join lines
without spaces (see Figure 18-22). It works just like the J command, except that
no space is inserted between the joined parts.
This is a
test
This is a
test

6356
6357
6358

gJ

This is a test

This is atest

Figure 18-22: The gJ command.


Note: If the first line ends with some trailing spaces, the gJ command will
not remove them.

6359

Replace Mode

6360
6361
6362

The R command causes Vim to enter replace mode. In this mode, each
character you type replaces the one under the cursor. This continues until you
type <Esc>. Figure 18-23 contains a short example.

6363
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 275

Draft Not for publication


6364
6365
6366
6367
6368

6372
6373
6374
6375
6376

Not for widespread publication

This is a test.
Rmess<Esc>
This is a mess.

6369
6370
6371

Draft 0.1

Figure 18-23: The R command.


If a count is specified, the command will be repeated count times (see
Figure 18-24).
This is a test.
3Rmess<Esc>
This is a messmessmess.

6377

Figure 18-24: R command with a count.

6378
6379
6380

You may have noticed that this command replaced 12 characters on a line
with only 5 left on it. The R command automatically extends the line if it runs out
of characters to replace.

6381

Virtual Editing

6382
6383
6384

Normally Vim treats tab as a single character. This means when you move
the cursor across a line containing the cursor will jump from one position to
the other as it moves across the tab. Figure 18-25 shows how this works.

6385
6386
6387
6388
6389

X<Tab>
l
X<tab>

6390
6391
6392
6393
6394
6395
6396
6397
6398
6399

This is a test
Cursor jumps

This is a test
Figure 18-25: Normal cursor movement

You can enable virtual mode by setting the 'virtualedit' ('ve') option to
all. Now when you move you left you move one character left on the screen. In
other words, the cursor does not jump. See Figure 18-26.)
X<Tab>
l
X<tab>

This is a test
Cursor does not jump

This is a test
Figure 18-26: Normal cursor movement

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 276

Draft Not for publication

Draft 0.1

Not for widespread publication

6400
6401
6402

Virtual editing also lets you move the cursor past the end of line. This
makes thing because the $ command moves to the end of line, and in some cases
the $ command could move the cursor to the left!.

6403
6404
6405
6406

One of the problems with replace in normal (non-virtual) mode is where


you have a <Tab> in the text. If you are sitting on a <Tab> and execute the
command rx, the <Tab> will be replaced by x. This can shift your line around
(see Figure 18-27).

6407
6408
6409
6410
6411
6412
6413
6414

<Tab>

rx

xThis is a test

6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425

Figure 18-27: Simple non-virtual replace.


With virtual editing Vim is smart enough to figure out how to replace a
single character in screen space, preserving the spacing.
<Tab>

x<Tab>

This is a test
Figure 18-28: Virtual replacement.

The 'virtualedit' option is actually a comma separated list of values


telling Vim which modes to edit virtually. The possible value are:
all
block
insert
onemore

6429
6430
6431
6432

This is a test

grx (Virtual mode)

6426
6427
6428

This is a test

All modes
Block visual editing mode
Insert mode
Allow the cursor to move only one character past the end of
line.

When 'virtualedit' include the all value, then normal cursor movement
commands move as if <tabs> were spaces. You can also move past the end of
the physical line. Inserts can occur anywhere, Vim will add spaces as need to
make the file match what you've put on the screen.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 277

Draft Not for publication


6433
6434
6435
6436
6437

Draft 0.1

Not for widespread publication

The block keyword tells Vim to allow virtual movement in block visual
mode. All other modes will act normally. If you wish to do virtual editing in
insert mode, you need the insert keyword. These options can be combined if
you want both modes:
:set virtualedit=block,insert

6438
6439
6440
6441

Finally there is the onemore keyword. If this is not set, you move the
cursor to the right as far as you want to. There is no limit. However, if the
onemore keyword is present, right movement is limited to character past the end
of line.

6442

Replace Mode

6443
6444
6445
6446
6447
6448

If you use the virtual replace command, gr{character}, you replace the
"virtual character" under the cursor (see Figure 18-28) regardless of the state of
the 'virtualedit' option. If the real character under the cursor is part of a tab,
only the space representing the tab jumped over is replaced. The gR command
enters virtual replace mode. Each character you type will replace one character
in screen space until you finish things off with <Esc>.

6449
6450

The :startgreplace (:startg) command does the same thing as the gR


command. If the override (!) option is present, the command actls like $gR.

6451

Digraphs

6452
6453
6454

As learned in Chapter 2: Editing a Little Faster, executing CTRL-K


character1 character2 inserts a digraph. You can define your own digraphs by
using the following command:

6455

:digraphs character1 character2 number

6456

(:dig for short.)

6457
6458
6459
6460

This tells Vim that when you type CTRL-K character1 character2 that
you should insert the character whose character number is number. If you are
entering a lot of digraphs, you can turn on the 'digraph' option by using this
command:

6461

:set digraph

6462

(The option can be abbreviated as 'dig')

6463
6464

This means that you can now enter digraphs by using the convention
character1<BS>character2. (<BS> is the backspace character.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 278

Draft Not for publication


6465
6466
6467
6468
6469
6470

Draft 0.1

Not for widespread publication

This mode has its drawbacks, however. The digraph C<BS>o is the
copyright character (). If you type x but want to type y, you can correct your
mistake by typing x (oops), <BS>, and y. If you do that with C and o, however, it
does not erase the C and put in the o; instead, it inserts .
Therefore, you need to type C (oops), <BS>, o (darn, appeared), <BS>, and
o.

6471

To turn off digraph mode, use the following command:

6472

:set nodigraph

6473

Changing Case

6474
6475
6476

The ~ command changes a character's case. The behavior of the ~


command depends on the value of the 'tildeop' ('top') option. With the option
unset, the command behaves normally:

6477
6478
6479
6480
6481
6482

:set notildeop
If you set the following option, however, the syntax of the command
changes to ~motion:
:set tildeop
For example the command ~fq changes the case of all the characters up to
and including the first q on the line. Figure 18-29 shows some examples.
now is the time. . . .

now is the time. . . .

3~l

~fm

NOW is the time. . . .


6483
6484
6485
6486

NOW IS THE TIMe. . . .


Figure 18-29: ~motion commands.

Error: Reference source not foundThe g~motion command changes the


case of the indicated characters. It is just like the ~motion command except that
it does not depend on the 'tildeop' option. Figure 18-30 shows some examples.
now is the time. . . .

now is the time. . . .

3g~l

~gfm

NOW is the time. . . .


6487

NOW IS THE TIMe. . . .


Figure 18-30: The g~ command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 279

Draft Not for publication


6488
6489

Draft 0.1

Not for widespread publication

A special version of this command, g~~ or g~g~, changes the case of the
entire line (see Figure 18-31).
now is the time. . . .
g~~
NOW IS THE TIME. . . .

6490

Figure 18-31: The g~~ command.

6491

Other Case-Changing Commands

6492
6493
6494

The gU{motion} command makes the text from the cursor to motion all
uppercase. The command gUU or gUgU works on a single line. If count is
specified, count lines are changed.

6495
6496

The gumotion, guu, and gugu act just like their gU counterparts, except that
they make the text lowercase. Figure 18-320 illustrates these commands.

6497
This is Mixed Case line.

g~~

tHIS IS mIXED cASE LINE.

This is Mixed Case line.

gUU

THIS IS MIXED CASE LINE.

6498
6499

Figure 18-32: Case-changing commands.

6500

Advanced Undo

6501
6502

Vim has an advanced undo system that lets you forget about your mistakes
in a lot of different ways.

6503

Undo Time Machine

6504
6505
6506

Let's say that you are working on a program starting at 9:00 in the
morning. You try something new and make lots of changes to your program
implementing the brand new methodology that your friend just told you about.

6507
6508
6509

About 10:00 you figure out that what you just did was total garbage and
won't work. But you've made all those changes. How many times do you have to
press u (undo) to get back to the 9:00 state?

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 280

Draft Not for publication


6510
6511
6512

Draft 0.1

Not for widespread publication

The answer is none. All you have to do is to tell the Vim you want the file
you had an hour ago. This is done with the :earlier (:ea) command.
:earlier 1h

6513
6514
6515

Time for the :earlier command can be specified as a number of seconds (s),
minutes (m), or hours (h). If no unit is specified it is the number of change sets
(see below for the definition of this term.)

6516
6517

Of course if you realize that you went back to far, you can always go
forward with the :later (:lat) command.

6518

Undo Level

6519
6520
6521

You can execute only so many undo commands. This limit is set by the
'undolevels' ('ul') option. To set this limit to 5,000 changes, use the following
command:

6522

:set undolevels=5000

6523

Change Sets and Branching

6524
6525

To understand undo branching, we'll start with an example. Figure 18-33


shows the original file:

6526
6527
6528
6529
6530
6531
6532
6533

Change
Change
Change
Change
Change
Change

A
B
C
D
E
F
Figure 18-33: Original file

We now execute the following commands:

6534

1. Create the file, save it, and exit Vim and start a new editing session.

6535

2. Move to the "A" line, delete the word "Change"

6536

3. Move to the "B" line, delete the word "Change"

6537

4. Move to the "C" line, delete the word "Change"

6538

5. Move to the "D" line, delete the word "Change"

6539

6. Undo change #5 with the u command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 281

Draft Not for publication

Draft 0.1

Not for widespread publication

6540

7. Undo change #4 with the u command.

6541

8. Move to the "E" line, delete the word "Change"

6542

9. Move to the "F" line, delete the word "Change"

6543
6544
6545
6546
6547
6548
6549

The resulting file appears in Figure 18-34.


A
B
Change C
Change D
E
F

6550
6551

Figure 18-34: Edited File


The change tree for this editing session appears in Figure 18-35.

6552

Change A

Change set 4

Change set 6

Change B
Change C

Change E

Change D

Change F

6553

Figure 18-35: Change tree

6554

We can now list the change sets with the :undolist (:undol) command.

6555
6556
6557
6558
6559

:undolist
number changes
4
4
6
4
Press ENTER or

time
12 seconds ago
6 seconds ago
type command to continue

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 282

Draft Not for publication


6560
6561
6562

Draft 0.1

Not for widespread publication

This listing shows our two change sets. Right now we are at the bottom of
change set number 4. Pressing undo (u) four times causes each of the changes
(F, E, B, A) to be undone. Pressing redo (CTRL-R) four times redoes the changes.

6563

Now let's switch to change set number 4 with the :undo (:u) command:

6564

:undo 4

6565
6566
6567
6568
6569
6570
6571
6572

All of a sudden the file changes to the state it was in after we completed
the last step of change set 4 (Change D). Figure 18-36 shows the result:
A
B
C
D
Change E
Change F

6573

Figure 18-36: Result of :undo 4

6574
6575

Now the undo (u) command goes up and down the changes in change set
number 4. (Changes D, C, B, A.)

6576
6577

Lets switch to the second change set (:undo 6). The screen should look
like Figure 18-37.

6578
6579
6580
6581
6582
6583
6584
6585

A
B
Change C
Change D
E
F
~
0 changes; before #6 17:16:44

6586
6587
6588
6589
6590
6591
6592
6593
6594
6595

Figure 18-37: Screen after :undo 6


Now lets undo a change using the g- command. The first g- undoes change
F. See Figure 18-38.
A
B
Change C
Change D
E
Change F
Figure 18-38: Screen after first g-

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 283

Draft Not for publication


6596
6597
6598
6599
6600
6601
6602
6603

6608

Not for widespread publication

The next g- undoes change E, but moves over to a new part of the change
tree and redoes changes C and D. See Figure 18-39.
A
B
C
D
Change E
Change F

6604
6605
6606
6607

Draft 0.1

Figure 18-39: File after second g-.


Pressing g- again undoes Change D. So we are now going up the undo
stack for change #4. The g+ command goes down the change stack and redoes
each change in a similar manner.
Figure 18-40 shows changes traversed by the g- command.

Change A

Change B
Change C

Change E

Change D

Change F

6609

Figure 18-40 g- change path.

6610
6611
6612
6613

The :undojoin (:undoj) command tells Vim to make all further changes
part of the same undo block. This undo block ends when the user executes the
next command. This command is useful for scripts and functions that want all
their commands to be part of the same undo block.

6614

Getting Out

6615
6616

The ZQ command is an alias for the :q! or :quit! Command. The


command exits and discards all changes.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 284

Draft Not for publication


6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634

Draft 0.1

Not for widespread publication

The :write command writes out the file. The :quit command exits. You
can use a shorthand for these commands:
:wq
This command can take a filename as an argument. In this case, the edit
buffer will be written to the file and then Vim will exit. To save your work under
a new filename and exit, for instance, use the following command:
:wq count.c.new
This command will fail with an error message if the file count.c.new exists
and is read-only. If you want Vim to overwrite the file, use the override option
(!):
:wq! count.c.new
Finally, you can give the :wq command a line-range argument. (See
Chapter 25: Complete Command-Mode (:) Commands for more on ranges.) If a
line range is present, only those lines are written to the file. To write out only
the first 10 lines of a file and exit, for example, execute the following command:
:1,10wq count.c.new
The :xit (:x) command acts much like the :wq command except that it only
writes the file if the buffer has been modified.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 285

Draft Not for publication

Draft 0.1

Not for widespread publication

6636

Chapter 19: Advanced Searching Using Regular


Expressions

6637
6638

Vim has a powerful search engine that enables you to perform many
different types of searches. In this chapter, you learn about the following:

6635

6639

Turning on and off case sensitivity

6640

Search options

6641

Instant word searching

6642

How to specify a search offset

6643

A full description of regular expressions

6644

Searching Options

6645
6646
6647

This section describes some of the more sophisticated options that you can
use to fine-tune your search. The 'hlsearch' ('hls') option has been turned on
to show you how these options affect the searching.

6648

Case Sensitivity

6649
6650
6651
6652
6653

By default, Vim's searches are case sensitive. Therefore, include, INCLUDE,


and Include are three different words and a search will match only one of them.
The following example searched for include. Notice that INCLUDE, Include and
iNCLude are not highlighted. Figure 19-1 shows the result of an /include
command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 286

Draft Not for publication


6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670

6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695

Not for widespread publication

# */
#ifdef HAVE_CONFIG_H
# include "auto/config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#INCLUDE <FCNTL.H>
#INCLUDE <SYS/TYPES.H>
#INCLUDE <NETDB.H>
#include <netinet/in.h>
#include <errno.h>
#include <sys/socket.h>
#ifdef HAVE_LIBGEN_H
# include <libgen.h>
#endif
/include

6671
6672
6673

Draft 0.1

Figure 19-1: Case-sensitive search.


Now let's turn on the 'ignorecase' option by entering the following
command:
:set ignorecase
Now when you search for include, you will get all four flavors of the word
as (see Figure 19-2).
# */
#ifdef HAVE_CONFIG_H
# include "auto/config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#INCLUDE <FCNTL.H>
#INCLUDE <SYS/TYPES.H>
#INCLUDE <NETDB.H>
#include <netinet/in.h>
#include <errno.h>
#include <sys/socket.h>
#ifdef HAVE_LIBGEN_H
# include <libgen.h>
#endif
/include
Figure 19-2: Non-case-sensitive search.
To turn on case sensitivity, use this command:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 287

Draft Not for publication


6696

Draft 0.1

Not for widespread publication

:set noignorecase

6697
6698

(Technically what you are doing is turning off case insensitivity, but it
tortures the English language too much to say it this way.)

6699
6700
6701
6702

If you have 'ignorecase' set, word matches word, WORD, and Word. It also
means that WORD will match the same thing. If you set the following two options,
any search string typed in lowercase is searched, ignoring the case of the search
string:

6703
6704

:set ignorecase
:set smartcase

6705

('scs' is the abbreviation for 'smartcase'.)

6706
6707

If you have a string with at least one uppercase character, however, the
search becomes case sensitive. Thus you have the following matches:

6708

String

Matches

6709

word

word,Word,WORD, worD

6710

Word

Word

6711

WORD

WORD

6712

WorD

WorD

6713

Wrapping

6714
6715
6716
6717

By default, a forward search starts searching for the given string starting
at the current cursor location. It then proceeds to the end of the file. If it does
not find the string by that time, it starts from the beginning and searches from
the start of the file to the cursor location. Figure 19-3 shows how this works.

6718
6719
6720
1) Start
6721
6722
2) /unisgned
6723
6724
3) n
6725
6726
6727
4) n
6728

1
2
3
4
5
6
7
8
9
10

// Read at most 10MB


const. unsigned int MAX_READ=(10*1024*1024)
// Size of a buffer
const unsigned int BUF_SIZE = (62 * 1024);
// Buffer to be written
static unsigned char buffer[BUF_SIZE];
Figure 19-3: Wrapping.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 288

Draft Not for publication

Draft 0.1

Not for widespread publication

6729
6730
6731
6732

This example starts by searching for unsigned. The first search goes to
line 6. The next search moves to line 9. When trying to search again, you reach
the end of the file without finding the word. At this point, the search wraps back
to line 1 and the search continues. The result is that you are now on line 3.

6733

Turning Off Search Wrapping

6734

To turn off search wrapping, use the following command:

6735

:set nowrapscan

6736

('ws' is the abbreviation for 'wrapescan')

6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750

Now when the search hits the end of the file, an error message displays
(see Figure 19-4).
1
2
3
4
5
6
7
8
9
10

// Read at most 10MB


const. unsigned int MAX_READ = (10 * 1024 *1024
// Size of a buffer
const unsigned int BUF_SIZE = (62 * 1024);
// Buffer to be written
static unsigned char buffer[BUF_SIZE];

E385: search hit BOTTOM without match for: unsigned

6751

Figure 19-4: 'nowrapscan'.

6752

To go back to normal wrapping searches, use the following command:

6753

:set wrapscan

6754

Interrupting Searches

6755
6756
6757
6758

If you are in the middle of a long search and want to stop it, you can type
CTRL-C on a UNIX system or CTRL-BREAK on Microsoft Windows. On most
systems, unless you are editing a very large file, searches are almost
instantaneous.

6759

Instant Word Searches

6760
6761
6762

The * command searches for the word under the cursor. For example,
position the cursor on the first const. Pressing * moves the cursor to the next
occurrence of the word, specifically line 26. Figure 19-5 shows the results.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 289

Draft Not for publication


6763
6764
6765
6766
6767
6768
6769
6770*
6771
6772
6773

19
20
21
22
23
24
25
26
27
28
29

Draft 0.1

Not for widespread publication

#include <sys/fcntl.h>
#include <sys/time.h>
#include <errno.h>
// Read at most 10MB
const unsigned int MAX_READ =(10*1024*1024);
// Size of a buffer
const unsigned int BUF_SIZE = (62 *1024);
// Buffer to be written
static unsigned char buffer[BUF_SIZE];

6774

Figure 19-5: * command.

6775
6776

The # or command does an instant word search in the backward


direction.

6777
6778

These commands work on whole words only. In other words, if you are on
const and conduct a * search, you will not match constant.

6779
6780
6781
6782

The g* command performs an instant word search, but does not restrict
the results to whole words. So whereas * will not match constant, the g*
command will match it. The g# (g) command does the same thing in the reverse
direction.

6783

Search Offsets

6784
6785
6786
6787

By default, the search command leaves the cursor positioned on the


beginning of the pattern. You can tell Vim to leave it some other place by
specifying an offset. For the forward search command (/), the offset is specified
by appending a slash (/) and the offset, as follows:

6788
6789
6790

/const/2
This command searches for the pattern const and then moves to the
beginning of the second line past the pattern. Figure 19-6 shows how this works.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 290

Draft Not for publication


6791
6792
/const/4
6793
6794
Find const
6795
6796
Go down 4
6797
lines
6798
6799
6800
6801
6802

19
20
21
22
23
24
25
26
27
28
29

Draft 0.1

Not for widespread publication

#include <sys/fcntl.h>
#include <sys/time.h>
#include <errno.h>
// Read at most 10MB
const unsigned int MAX_READ =(10*1024*1024);
// Size of a buffer
const unsigned int BUF_SIZE = (62 *1024);
// Buffer to be written
static unsigned char buffer[BUF_SIZE];
Figure 19-6: Search offsets.

6803
6804
6805

If the offset is a simple number, the cursor will be placed at the beginning
of the offset line from the match. The offset number can be positive or negative.
If it is positive, the cursor moves down that many lines; if negative, it moves up.

6806
6807
6808
6809
6810

If the offset begins with b and a number, the cursor moves to the beginning
of the pattern, and then travels the "number" of characters. If the number is
positive, the cursor moves forward, if negative, backward. The command
/const/b2 moves the cursor to the beginning of the match, for instance, and
then two characters to the right (see Figure 19-7).

6811
6812
6813
6814

const unsigned int BUF_SIZE = (62 * 1024);

6815

Figure 19-7: /const/b2

6816
6817
6818
6819
6820
6821

/const

/b2 (Two characters past beginning)

Note: The b offset is a synonym for s. Therefore, you can use b (begin),
and s (start) for the first character of the match.
The e offset indicates an offset from the end of the match. Without a
number it moves the cursor onto the last character of the match. The command
/const/e puts the cursor on the t of const. Again, a positive number moves the
cursor to the right, a negative number moves it to the left (see Figure 19-8).

6822
6823
6824

const unsigned int BUF_SIZE = (62 * 1024);

6825

/const

6826

/e3 (Two characters after end)


Figure 19-8: /const/e-3

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 291

Draft Not for publication

Draft 0.1

Not for widespread publication

6827
6828

Finally, there is the null offset. This is the empty string. This cancels the
preceding offset.

6829

Specifying Offsets

6830
6831

To specify an offset on a forward search (/ command), append /offset to


the command, as follows:

6832
6833
6834

/const/e+2
If you want to repeat the preceding search with a different offset, just
leave out the pattern and specify the new offset:

6835

//5

6836

To cancel an offset, just specify an empty offset.

6837

//

6838

For example:
/const/e+2 / //
/
//

6839
6840

Search moves to the end of the pattern, and then to


the right two characters.
Repeats last search, with the preceding offset.
Repeats the last search with no offset. (Cursor will
be placed on the first character of the pattern.)

To specify an offset for a reverse search (? command), append ?offset to


the command, as follows:

6841

?const?b5

6842

To repeat with the same pattern and a new offset, use the following:

6843

??-2

6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854

To remove the offset and repeat the search with the preceding pattern, use
the following:
??
One thing to remember when using search offsets, the search always starts
from the current cursor position. This can get you into trouble if you use a
command such as this:
/const/-2
This command searches for const and then moves up two lines. If you
then repeat the search with the n command, it goes down two lines, finds the
const you just found, and then moves the cursor back up two lines for the offset.
The result is that no matter how many times you type n, you go nowhere.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 292

Draft Not for publication

Draft 0.1

Not for widespread publication

6855

Complete Regular Expressions

6856
6857
6858
6859
6860
6861

The search logic of Vim uses regular expressions. You saw some simple
ones in Chapter 3: Searching but this chapter goes into them in extreme detail.
Regular expressions enable you to search for more than simple strings. By
specifying a regular expression in your search command, you can search for a
character pattern, such as all words that begin with t and end in ing (regular
expression = \<t[^ ]*ing\>).

6862
6863
6864
6865

However, the power of regular expressions comes with a price. Regular


expressions are quite cryptic and terse. It may take some time for you to get
used to all the ins and outs of this powerful tool. While learning regular
expressions, you should execute the following command:

6866

:set hlsearch

6867
6868
6869

This causes Vim to highlight the text you matched with your last search.
Therefore, when you search for a regular expression, you can tell what you really
matched (as opposed to what you thought you matched).

6870
6871
6872
6873
6874

A regular expression consists of a series of atoms. An atom is the smallest


matching unit in a regular expression. Atoms can be things like a single
character, such as a (which matches the letter a), or a special character, such as
$ (which matches the end of the line). Other atoms, such as \< (word start, see
the following section), consist of multiple characters.

6875

Beginning (\<) and End (\>) of a Word

6876
6877
6878
6879
6880
6881

The atom \< matches the beginning of a word. The atom \> matches the
end of a word. For example, a search for the expression for finds all
occurrences of for, even those in other words, such as Californian and
Unfortunately. Figure 19-9 shows the results of this search. If you use the
regular expression \<for\>, however, you match only the actual word for. Figure
19-10 contains the results of this refined search.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 293

Draft Not for publication


6882
6883
6884
6885
6886
6887
6888
6889
6890
6891

Not for widespread publication

Calls and letters to the company failed to correct


this problem. Finally the fellow just gave up and
wrote a check for $0.00 and the bills ceased.
A Californian who loved sailing went down and applied
for a personalized license plate. He filled in his
three choices as 1)SAIL 2)SAILING and 3)NONE. He got
a new plate labeled "NONE."
Unfortunately, when the police write out a ticket
/for

6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902

Draft 0.1

Figure 19-9: Search for for.


Calls and letters to the company failed to correct
this problem. Finally the fellow just gave up and
wrote a check for $0.00 and the bills ceased.
A Californian who loved sailing went down and applied
for a personalized license plate. He filled in his
three choices as 1)SAIL 2)SAILING and 3)NONE. He got
a new plate labeled "NONE."
Unfortunately, when the police write out a ticket
/\<for\>

6903

Figure 19-10: Search for \<for\>.

6904

Modifiers and Grouping

6905
6906
6907
6908

The modifier * is used to indicate that an atom is to be matched 0 or more


times. The match is "greedy." In other words, the editor will try to match as
much as possible. Thus, the regular expression te* matches te, tee, teee, and so
on.

6909
6910

The expression te* also matches the string t. Why? Because e* can match
a zero length string of e's. And t is the letter t followed by zero e's.

6911
6912
6913
6914
6915
6916
6917

Figure 19-11 shows the results of the search for te*.


This is a test.
te tee teee teee
Figure 19-11: Search for te*.
The \+ modifier indicates that the atom is to be matched one or more
times. Therefore, te\+ matches te, tee, and teee, but not t. (te\+ is the same
as tee*.). Figure 19-12 illustrates what is matched for the search /te\+.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 294

Draft Not for publication


6918
6919

6925
6926

Not for widespread publication

This is a test.
te tee teee teee

6920
6921
6922
6923
6924

Draft 0.1

Figure 19-12: Search for te\+.


Finally, there is the \= modifier. It causes the preceding atom to be
matched zero or one time. This means that te\= matches t and te, but not tee.
(Although it will match the first two characters of tee.) Figure 19-13 shows a
typical search.
This is a test.
te tee teee teee

6927

Figure 19-13: Search for te\=.

6928

Special Atoms

6929
6930
6931

A number of special escaped characters match a range of characters. For


example, the \a atom matches any letter, and the \d option matches any digit.
The regular expression \a\a\a matches any three letters.

6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946

Now try a search for any four digits. Figure 19-14 displays the results.
19
20
21
22
23
24
25
26
27
28
29

#include <sys/fcntl.h>
#include <sys/time.h>
#include <errno.h>
// Read at most 10MB
const unsigned int MAX_READ=(10*1024*1024);
// Size of a buffer
const unsigned int BUF_SIZE = (62 * 1024);
// Buffer to be written
static unsigned char buffer[BUF_SIZE];
Figure 19-14: Search for \d\d\d\d.

Now try a search for any three letters followed by an underscore. Figure
19-15 displays the results.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 295

Draft Not for publication


6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957

19
20
21
22
23
24
25
26
27
28
29

Draft 0.1

Not for widespread publication

#include <sys/fcntl.h>
#include <sys/time.h>
#include <errno.h>
// Read at most 10MB
const unsigned int MAX_READ=(10*1024*1024);
// Size of a buffer
const unsigned int BUF_SIZE = (62 * 1024);
// Buffer to be written
static unsigned char buffer[BUF_SIZE];

6958

Figure 19-15: Search for \a\a\a_.

6959

Character Ranges

6960
6961
6962
6963
6964

The \a atom matches all the letters (uppercase and lowercase). But
suppose you want to match only the vowels. The range operator enables you to
match one of a series of characters. For example, the range [aeiou] matches a
single lowercase vowel. The string t[aeiou]n matches tan, ten, tin, ton and
tun.

6965
6966
6967

You can specify a range of characters inside the brackets ([]) by using a
dash. For example, the pattern [0-9], matches the characters 0 through 9. (That
is 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.)

6968
6969

You can combine ranges with other characters. For example, [0-9aeiou]
matches any digit or lowercase vowel.

6970
6971
6972

The ^ character indicates a set of characters that match everything except


the indicated characters. To match anything except a vowel, for example, you
can specify [^aeioAEIOU].

6973
6974

Note: To match special characters such as *, -, ^, [, and other special


characters you need to escape them. (e.g. /\*\-\^\[ matches *-^[.)

6975
6976
6977
6978
6979
6980

However, in certain circumstances, Vim can figure out that you don't want
a special character to be special. For example, ^ at the beginning of an
expression matches the beginning of line. A ^ in the middle of the
expression matches ^. So 2\^4 and 2^4 match the same thing. But rather
try remember them all, all you need to remember is that if you escape
always you will rarely go wrong.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 296

Draft Not for publication

Draft 0.1

Not for widespread publication

6981

Character Classes

6982
6983
6984
6985

Suppose you want to specify all the uppercase letters. One way to do this
is to use the expression [A-Z]. Another way is to use one of the predefined
character classes. The class [:upper:] matches the uppercase characters.
Therefore, you can write [A-Z] as [[:upper:]].

6986
6987

You can write the entire alphabet, upper- and lowercase, [[:upper:]
[:lower:]]. There are a large number of different character classes.

6988
6989
6990

Note: You cannot use the special atoms like \a and \d in a range. For
example, [\a\d] matches the characters \, a, \, and d. It does not match
the letters (\a) and digits (\d).

6991

Repeat Modifiers

6992
6993

You can specify how many times an atom is to be repeated. The general
form of a repeat is as follows:

6994

\{minimum, maximum}

6995
6996
6997

For example, the regular expression a\{3,5} will match 3 to 5 a's. (that is,
aaa, aaaa, or aaaaa.) By default, the Vim editor tries to match as much as
possible. So a\{3,5} will match as many a's as it can (up to 5).

6998
6999
7000
7001

The minimum can be omitted, in which case it defaults to zero. Therefore,


a\{,5} matches 0-5 repeats of the letter. The maximum can be omitted as well,
in which case it defaults to infinity. So a\{3,} matches at least 3 a's, but will
match as many a's as you have got on the line.

7002
7003

If only one number is specified, the atom must match exactly that number
of times. Therefore, a\{5} matches 5 a's, exactly.

7004

Repeating as Little as Possible

7005
7006

If you put a minus sign (-) before any of the numbers, the Vim editor tries
to match as little as possible.

7007
7008
7009

Therefore, a\{-3,5} will match 3 to 5 a's, as little as possible. Actually if


this expression is by itself, it will always match just three a's. That is because
even if you have the word aaaaa, the editor will match as little as possible.

7010
7011

The specification a\{-3,} matches 3 or more a's, as little as possible. The


expression a\{-,5} matches 0-5 letters.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 297

Draft Not for publication

Draft 0.1

Not for widespread publication

7012
7013
7014
7015

The expression a\{-} matches 0 to infinity number of characters, as little


as possible. Note that this pattern by itself will always match zero characters.
It only makes sense when there is something after it. For example: [a-z]\{-}x
will match cx in cxcx. Using [a-z]*x would have matched the whole cxcx.

7016
7017
7018

Finally, the specification a\{-5} matches exactly 5 a's, as little as possible.


Because as little as possible is exactly 5, the expression a\{-5} acts just like a\
{5}.

7019

Grouping ( \(\) )

7020
7021
7022

You can specify a group by enclosing it in a \( and \). For example, the
expression a*b matches b, ab, aab, aaab, and so on. The expression a\(XY\)*b
matches ab, aXYb, aXYXYb, aXYXYXYb, and so on.

7023
7024
7025
7026
7027

When you define a group using \(\), the first enclosed string is assigned
to the atom \1. To match the string the the, for instance, use the regular
expression \(the\) \1. To find repeated words, you can get a bit more general
and use the expression \(\<\a\+\>\) \1. Figure 19-16 breaks this into its
components.

7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039

Put matching text in \1

\(\<\a\+\>\) \1
Match beginning of a word
Match a single letter
Repeat 1 or more times
Ending of a word
Match space
Match what was in the first \ (... \ )

7040
7041

Figure 19-16: The repeat (\1) expression.


The first group is assigned to \1, the second to \2, and so on.

7042

The Or Operator (\|)

7043
7044

The \| operator enables you to specify two or more possible matches. The
regular expression foo\|bar matches foo or bar. For example, the search

7045

/procedure\|function

7046

searches for either procedure or function.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 298

Draft Not for publication

Draft 0.1

Not for widespread publication

7047

Putting It All Together

7048
7049
7050

Let's create a regular expression to match California license plate


numbers. A sample license plate looks like 1MGU103. The pattern is one digit,
three uppercase letters, and three digits. There are several ways of doing this.

7051
7052
7053

Start by specifying the digit as [0-9], now add the uppercase letter: [0-9]
[A-Z]. There are three of them, so you get [0-9][A-Z]\{3}. Finally, you add
the three digits on the end, resulting in [0-9][A-Z]\{3}[0-9]\{3}.

7054
7055

Another way to do this is to recognize that \d represents any digit and \u


any uppercase character. The result is \d\u\{3}\d\{3}.

7056
7057
7058

The experts tell us that this form is faster than using the [] form. If you
are editing a file where this speed up makes a difference, however, your file
might be too big.

7059

You can accomplish this without repeats as well: \d\u\u\u\d\d\d.

7060
7061

Finally, you can use the character classes, yielding [[:digit:]]


[[:upper:]]\{3][[:digit:]]\{3}.

7062
7063
7064

All four of these expressions work. Which version should you use?
Whichever one you can remember. You should remember this old adage: The
simple way you can remember is much faster than the fancy way you can't.

7065

The 'magic' Option

7066
7067
7068
7069

The expressions discussed so far assume that the 'magic' option is on.
When this option is turned off, many of the symbols used in regular expressions
lose their magic powers. They only get them back when escaped. Specifically, if
you execute the command

7070

:set nomagic

7071
7072
7073

the *, ., [, and ] characters are not treated as special characters. If you


want to use the * for "0 or more repeats," you need to escape it: \*. You should
keep the 'magic' option on (the default) for portability and macro files.

7074
7075
7076

Using \m in a regular expression tells Vim to treat all the following text as
if 'magic' were set. The special sequence \M tells Vim to treat the string as if
'nomagic' were set.

7077
7078
7079

The string \v turns very magic mode which makes almost every
character magic. To turn this off use \V. The following table summarizes these
items.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 299

Draft Not for publication


'magic'
\m
$
.
*
\(\)
\|
\a
\\
\.
{

\v
$
.
*
()
|
\a
\\
\.
\{

Draft 0.1

'nomagic'
\M
\V
$
\$
\.
\.
\*
\*
\(\)
\(\)
\|
\|
\a
\a
\\
\\
.
.
{
{

Not for widespread publication

matches end-of-line
matches any character
any number of the previous atom
grouping into an atom
separating alternatives
alphabetic character
literal backslash
literal dot
literal '{'

7080
7081

Offset Specification Reference


[num]
+[num]
-[num]
e
e[num]
b
s
b[num]
s[num]

7082
7083

Down [num] lines. Cursor is placed at the beginning of the


line.
Up [num] lines. Cursor is placed at the beginning of the line.
End of the match.
End of the match, the move [num]. If [num] is positive, move
right, negative, move left.
Start of the match.
Start of the match, then move [num]. If [num] is positive,
move right; negative, move left.

Regular Expressions Reference


The following table assumes that the 'magic' option is on (the default).
Simple Atoms
x
^
$
.
\<
\>

The literal character x.


Start of line.
End of line.
A single character.
Start of a word.
End of word.

Range Atoms
[abc]
[^abc]

Match either a, b, or c.
Match anything except a, b, or c.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 300

Draft Not for publication


[a-z]
[a-zA-Z]

Draft 0.1

Not for widespread publication

Match all characters from a through z.


Match all characters from a through z and A through
Z.

Character Classes
[:alnum:]
[:alpha:]
[:ascii:]
[:backspace:]
[:blank:]
[:cntrl:]
[:digit:]
[:escape : ]
[:graph:]
[:lower:]
[:print:]
[:punct:]
[:return:]
[:space:]
[:tab:]
[:upper:]
[:xdigit:]

Match all letters and digits.


Match letters.
Match all ASCII characters.
Match the backspace character (<BS>).
Match the space and tab characters.
Match all control characters.
Match digits.
Matches the escape character (<Esc>).
Match the printable characters, excluding space.
Match lowercase letters.
Match printable characters, including space.
Match the punctuation characters.
Matches the end-of-line (carriage return, <Enter>,
<CR>, <NL>).
Match all whitespace characters.
Match the tab character (<Tab>).
Match the uppercase letters.
Match hexadecimal digits.

Patterns (Used for Substitutions)


\(pattern\)

\1

\2
\9

Mark the pattern for later use. The first set of \(\)
marks a subexpression as \1, the second \2, and so
on.
Match the same string that was matched by the first
subexpression in \( and \). For example: \([az]\).\1 matches ata, ehe, tot, and so forth.
Like \1, but uses second subexpression.
Like \1, but uses ninth subexpression.

Special Character Atoms


\a
\A
\b
\d
\D
\e

Alphabetic character (A-Za-z).


Non-alphabetic character (any character except A-Zaz).
<BS>.
Digit
Non-digit.
<Esc>.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 301

Draft Not for publication


\f
\F
\h
\H
\i
\I
\k
\K
\l
\L
\o
\O
\p
\P
\r
\s
\S
\t
\u
\U
\w
\W
\x
\X
\~

Draft 0.1

Not for widespread publication

Any filename character as defined by the 'isfname'


option.
Any filename character, but does not include the
digits.
Head of word character (A-Za-z_).
Non-head of word character (any character except AZa-z_).
Any identifier character as defined by the 'isident'
option.
Any identifier character, but does not include the
digits.
Any keyword character as defined by the 'iskeyword'
option.
Any keyword character, but does not include the
digits.
Lowercase character (a-z).
Non-lowercase character (any character except a-z).
Octal digit (0-7).
Non-octal digit.
Any printable character as defined by the 'isprint'
option.
Any printable character, but does not include the
digits.
<CR>.
Whitespace (<Space> and <Tab>).
Non-whitespace character. (Any character except
<Space> and <Tab>).
<Tab>.
Uppercase character (A-Z).
Non-uppercase character (any character except A-Z).
Word character (0-9A-Za-z_).
Non-word character (any character except 0-9A-Zaz_).
Hexadecimal digit (0-9 a-f A-F).
Non-hexadecimal digit.
Matches the last given substitute string.

Modifiers
*
\+
\=

Match the previous atom 0 or more times. As much as


possible.
Match the previous atom 1 or more times. As much as
possible.
Match the previous atom 0 or 1 times

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 302

Draft Not for publication


\{}
\{n}
\{-n}
\{n,m}
\{n,}
\{,m}
\{-n,m}
\{-n,}
\{-,m}
\{-}
str1\|str2

Draft 0.1

Not for widespread publication

Match the previous atom 0 or more times. (Same as


the * modifier.)
Match the previous
Match the previous
Match the previous
Match the previous
Match the previous
as possible.
Match the previous
little as possible.
Match the previous
little as possible.
Match the previous
little as possible.
Match str1 or str2.

atom
atom
atom
atom
atom

n times.
n to m times.
n or more times.
from 0 to m times.
n to m times. Match as little

atom at least n times. Match as


atom up to m times. Match as
atom 0 or more times. Match as

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 303

Draft Not for publication

Draft 0.1

Not for widespread publication

7084

Chapter 20: Advanced Text Blocks and Multiple Files

7085
7086
7087
7088

The Vim editor has lots of different ways of doing things. Chapter 4: Text
Blocks and Multiple Files presented a representative subset of the commands
dealing with text blocks and multiple files and described them. It is entirely
possible for you to edit efficiently using only those commands.

7089
7090
7091

This chapter shows you all the other ways of doing things. If you find that
you do not like the limitations of the commands in Chapter 4, read this one; you
should find a way to get around your annoyances.

7092
7093
7094
7095

For example, you learned how to yank and put (cut and paste) using a
single register to hold the text. That is fine if you are dealing with a single block
of text. If you want to deal with more, however, check out how to use multiple
registers later in this chapter.

7096

This chapter covers the following:

7097

Different ways to yank and put

7098

How to use special registers

7099

How to edit all the files containing a specific string

7100

Advanced commands for multiple files

7101

Global marks

7102

Advanced insert-mode commands

7103

How to save and restore your setting by using a VIMINFO file

7104

Dealing with files that contain lines longer than the screen width

7105

Additional Put Commands

7106
7107
7108
7109
7110

When inserting lines, p and P commands move the cursor the first nonblank character on the line. The gp command works just like the p command,
except that the cursor is left just after at the end of the new text. The gP
command does the same things for the P command. Figure 20-1 shows the
effects of these commands.

7111

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 304

Draft Not for publication

Draft 0.1

Line
Line
Line
LLine
Line

Not for widespread publication

1
2 (yank line)
3
4 (put line)
5

P (upper case)

p (lower case)
Line
Line
Line
Line
L
Line
Line

1
2 (yank line)
3
4 (put line)
2 (yank line)
5

Line
Line
Line
Line
LLine
Line

1
2 (yank line)
3
2 (yank line)
4 (put line)
5

gP

gp
Line
Line
Line
Line
Line
L
Line

1
2 (yank line)
3
4 (put line)
2 (yank line)
5

7113

Line
Line
Line
Line
Line
Line
L

1
2 (yank line)
3
2 (yank line)
4 (put line)
5

Figure 20-1: Paste (put) commands.

7114

Special Marks

7115
7116
7117
7118

Vim has a number of special built-in marks. The first one is the single
quotation (') mark. It marks the location of the cursor before the latest jump. In
other words, it is your previous location (excluding minor moves such as up/down
and so on). Other special marks include the following:

7119

The beginning of the last inserted text

7120

The end of the last inserted text

7121

"

The last place the cursor was resting when you left the file

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 305

Draft Not for publication

Draft 0.1

Not for widespread publication

7122

Manipulating Marks

7123
7124

The :delmarks (:delm) command deletes all the marks. If you wish to
delete a specific set of marks, specify them as an argument to :delmarks.

7125
7126

The :lockmarks (:loc) command locks the location of the marks while a
command is being executed. For example:

7127

:lockmarks :%! sort

7128
7129

The :lockmarks command assumes that the command does not change
the numbers of lines in the file.

7130
7131
7132

The :keepmarks (:ke) does the same thing except that if the file gets
shorter any marks that are located past the end of the file are deleted. This only
works for filter (:!) commands.

7133

Multiple Registers

7134
7135
7136
7137
7138

So far, you have performed all your yanks and deletes without specifying
which register to use. If no register is specified, the unnamed register is used.
The characters that denote this register are two double quotation marks ("").
The first double quote denotes a register; the second double quote is the name of
the register. (Therefore, for example, "a means use register a.)

7139
7140
7141
7142

You can specify which register the deleted or yanked text is to go into by
using a register specification before the command. The format of a register
specification is "register, where register is one of the lowercase letters. (This
gives you 26 registers to play around with.)

7143
7144
7145

Therefore, whereas yy puts the current line into the unnamed register, the
command "ayy places the line in the a register, as seen in Figure 20-2. (The text
also goes into the unnamed register at the same time.)
Line
Line
Line
Line

1
2
3 (yy here)
4 ("ayy here)

unamed register "= "Line 3 (yy here)

register a = "Line 4 ("ayy here)

7146

Figure 20-2: Using the a register for yank and put.

7147

Unnamed Register

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 306

Draft Not for publication

Draft 0.1

Not for widespread publication

7148
7149
7150
7151
7152

It seems a bit silly to name the unnamed register, "The Unnamed


Register," because this gives it a name. The name is a misnomer, because
the unnamed register is named "The Unnamed Register." So, in fact, the
unnamed register has a name even though it calls itself "The Unnamed
Register."

7153
7154
7155

Persons understanding the preceding paragraph have demonstrated


aptitude for writing programs and are urged to enroll in their nearest
engineering college.

7156
7157

To get an idea of what the registers contain, execute the following


command:

7158

:registers

7159

(:reg is the abbreviation for :registers.)

7160

Figure 20-3 shows the results of this command.

7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184

:registers
--- Registers --"" Line 3 (yy here)^J
"0 Line 3 (yy here)^J
"1 We will tdelete he word in the middle
"2 /* File for bad names */^J
"3 Line 2^J
"4 To err is human -- ^J to really scre
"5 ^J
"6 ^J
"7
to really screw up, you need a com
"a Line 4 ("ayy here)^J
" to be yy'ed)
". "ayy here)
": registers
"% test.txt
"# tmp.txt
Press RETURN or enter command to continue
Figure 20-3: :registers command.
This illustration shows that the unnamed register (") contains Line 3 (yy
here).
The a register contains Line 4 ("ayy here).
The alphabetic registers are the normal ones used for yanking and pasting
text. Other, special registers are described in the following sections.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 307

Draft Not for publication


7185
7186
7187
7188

Draft 0.1

Not for widespread publication

You can display the contents of specific registers by giving them as an


argument to the :registers command. For example, the following command
displays the contents of registers a and x:
:registers ax

7189

Appending Text

7190
7191
7192
7193
7194

When you use a command such as "ayy, you replace the text in the register
with the current line. When you use the uppercase version of a register, say
"Ayy, you append the text to what is already in the register (see Figure 20-4).
Note that the result is two lines, "Line 3" and "Line 2". (The ^J in the register
indicates end of line.)

7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205

Line
Line
Line
Line
~
~
~
~
~
~
~

1
2 ("Ayy here)
3 ("ayy here)
4
1) ayy
Yank line into
register a

7206

2) Ayy
Append the line on to
register a

Figure 20-4: Appending text to a register.

7207

Special Registers

7208
7209

Vim has a number of special registers. The first is the unnamed register,
whose name is double quote (").

7210
7211

Others include the registers 1 through 9. Register 1 contains the last text
you deleted; register 2 the next to last, and so on.

7212
7213
7214
7215
7216
7217

(Back in the bad old days of Vi, these registers were a lifesaver. You see,
Vi had only one level of undo. So if you deleted three lines by executing dd three
times, you were out of luck if you wanted to undo the delete using the u
command. Fortunately, the three lines were stored in registers 1, 2, and 3, so
you could put them back with "1P"2P"3P. You can also use the command "1P..
("1P and two dots).

7218

Other special registers include the following:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 308

Draft Not for publication


Register
0

Draft 0.1

Description
The last yanked text

vim-all-good.odt (28. Sep. 2007) The Vim Book

Not for widespread publication


Writeable
Yes

Page 309

Draft Not for publication


Register
.
%
#
/
:
_
=
*

Draft 0.1

Not for widespread publication

Description
The last small delete
The last inserted text
The name of the current file
The name of the alternate file
The last search string
The last ":" command
The black hole (more on this later)
An expression (see next page)
The text selected with the mouse

Writeable
No
No
No
No
No
No
Yes
No
Yes

7219

The Black Hole Register (_)

7220
7221
7222
7223
7224
7225

Placing text into the black hole register causes it to disappear. You can
also "put" the black hole register, but this is pretty much useless because the
black hole register always contains nothing. The black hole register is useful
when you want to delete text without having it go into the 1 through 9 registers.
For example, dd deletes a line and stores it in 1. The command "_dd deletes a
line and leaves 1 alone.

7226

The Expression Register (=)

7227
7228
7229
7230
7231
7232

The expression register (=) is designed so that you can enter expressions
into text. When you enter a command beginning with an expression register
specification, the Vim editor displays the prompt = at the end of the screen. This
gives you an opportunity to type in an expression such as 38*56, and you can
then put the result into the text with the p command. For example
"=38*56<Enter>p gives you 2128. Figure 20-5 shows this register in action.

7233

The width is 38.


The height is 56.
So the area is
~
~
~
=38*56

Enter the text, press <Esc> to


enter normal mode.

The width is 38.


The height is 56.
So the area is 2128
~
~
~

The p command pastes the answer


in after the cursor.

Execute "= to start expression mode.


The cursor jumps to here.

Figure 20-5: The expression register.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 310

Draft Not for publication

Draft 0.1

Not for widespread publication

7234
7235
7236
7237

An expression can contain all the usual arithmetic operators (*, +, -, /, and
so on) as well as a ton of specialized Vim functions and operators. If you are
doing more than simple arithmetic, you will want to check the full expression
documentation.

7238
7239
7240

You can specify the value of an environment variable, for example, by using
the expression $NAME (for instance, $HOME). You can determine the value of a
Vim variable by just specifying the variable (LineSize, for instance).

7241

The Clipboard Register (*)

7242
7243
7244
7245

The clipboard register (*) enables you to read and write data to the system
clipboard. This can be the X selection (UNIX) or the Microsoft Windows
Clipboard. This enables you to cut and paste text between the Vim editor and
other applications.

7246

How to Edit All the Files That Contain a Given Word

7247
7248
7249
7250

If you are a UNIX user, you can use a combination of Vim and grep to edit
all the files that contain a given word. This proves extremely useful if you are
working on a program and want to view or edit all the files that contain a
specified variable.

7251
7252

Suppose, for example, that you want to edit all the C program files that
contain the word frame_counter. To do this, you use the following command:

7253

$ vim `grep -l 'frame_counter' *.c`

7254
7255
7256
7257
7258
7259

Consider this command in detail. The grep command searches through a


set of files for a given word. Because the -l option is specified, the command
will list only the files containing the word and not print the line itself. The word
it is searching for is frame_counter. Actually, this can be any regular
expression. (Note that what grep uses for regular expressions is not as complete
or complex as what Vim uses.)

7260
7261
7262
7263
7264

The entire command is enclosed in backticks (`). This tells the UNIX shell
to run this command and pretend that the results were typed on the command
line. So what happens is that the grep command is run and produces a list of
files; these files are put on the Vim command line. This results in Vim editing the
file list that is the output of grep.

7265
7266
7267
7268

You might be asking, "Why show this here?" This is a feature of the UNIX
shell (for example, bash), and is not part of Vim's repertoire. The way to
accomplish something similar within Vim, and which works on Win32 as well, is
as follows:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 311

Draft Not for publication


7269

Draft 0.1

Not for widespread publication

:args `grep l 'frame_counter' *.c`

7270
7271

(:ar is the short form of this command and you can use :next `cmd` and
:n `cmd` as well.)

7272
7273

This command sets the argument list (for example, the files "on the
command line," as it were).

7274

Note: The Vim command :vimgrep can perform a similar function.

7275

Editing a Specific File

7276
7277

To edit a specific file in this list (file 2, for instance), you need the following
command:

7278

:argument 2

7279

(:argument can be abbreviated as :argu.)

7280
7281

This command enables you to specify a file by its position in the argument
list. Suppose, for instance, that you start Vim with this command:

7282

$ gvim one.c two.c three.c four.c five.c six.c seven.c

7283

The following command causes you to be thrown into the file four.c.

7284

:argument 4

7285

Changing the File List

7286
7287
7288

The file list is initially set to the list of files you specify on the command
line. You can change this list by specifying a new list to the :args command. For
example:

7289
7290
7291
7292
7293

:args alpha.c beta.c gamma.c


After executing this command, you start editing alpha.c; the next file is
beta.c and so on. (The previous file list is lost.)
Note: The :next file-list and :n file-list commands will do the
same thing.

7294

The +cmd Argument

7295
7296
7297
7298

Suppose that you want to start editing a file at line 97. You can start Vim
and execute a 97G, or you can tell Vim to start editing with the cursor on line 97.
You can do this by using the option +linenumber on the command line. For
example:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 312

Draft Not for publication


7299
7300
7301
7302
7303
7304
7305
7306

Draft 0.1

$ gvim +97 file.c


You can also use the +cmd to search for a string by using +/string on the
command line. To start editing a file with the cursor positioned on the first line
containing #include, for instance, use this command:
$ gvim +/#include file.c
Finally, you can put any command-mode command after the plus sign (+).
You can specify the +cmd argument in a number of commands. For example, the
general form of the :vi (:visual) command is as follows:

7307

:vi [+cmd] {file}

7308

These other commands can take a +cmd:

7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326

:next [+cmd]
:n [+cmd]
:wnext [+cmd]
:wn [+cmd]
:previous [+cmd]
:prev [+cmd]
:Next [+cmd]
:N [+cmd]
:wprevious [+cmd]
:wp [+cmd]
:wNext [+cmd]
:wN [+cmd]
:rewind [+cmd]
:rew [+cmd]
:last [+cmd]
:la [+cmd]
:first [+cmd]
:fir [+cmd]

7327

Not for widespread publication

Defining the file list (arguments)

7328

To set the list of files being edited use the :args command:

7329

:args {++opt} [+cmd] {file-list}

7330
7331

The {++opt} argument lets you specify some options to be used for each
file. These include:
Option
++bad={value}

Meaning
If {value} is a single character, replace all bad
characters with that character. The keyword drop
causes the bad characters to be dropped. A value of

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 313

Draft Not for publication

++bin
++binary
++edit

Draft 0.1

Not for widespread publication

keeps retains the bad characters.


Turns on the 'binary' option.
This only works for :read commands. It specifies that
the options for the file be the same as the file being
currently edited.
Specify the file encoding.

++enc={encoding}
++encoding={encoding}
+ff={format}
Specify the file format.
++fileformat={format}
++nobin
Turn off the 'binary' option.
++nobinary
7332
7333
7334
7335

If you wish to just add files to the argument list (and keep the existing files,
use the :argadd (:arga) command. The general form of this command is:
:[count] argadd {file}

7336
7337

If a [count] is given the file is added after the [count] argument. If no


count is present, it is added to the end.

7338
7339

Suppose you want to edit the file you've just added. The :argedit (:arge)
command is a combination of :argadd and :edit.

7340
7341
7342
7343

To delete arguments from the argument list use the :argdelete (:argd)
command. It take an file name pattern as an argument, which means you can
use wildcards. For example, if you wish to remove all the C header files from an
argument list use the command:

7344
7345
7346
7347
7348

:argdelete *.h
You can also delete arguments by position. Simply supply the :argdelete
command with a range. For example, to delete the second and third arguments,
use the command:
:2,3argdelete

7349

Local and Global argument Lists

7350
7351
7352
7353

So far we've been using one argument list. Vim actually supports two
different types of argument lists. The global argument list is the default for all
windows. However a window can switch over and use a local argument list if it
wants to.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 314

Draft Not for publication


7354
7355
7356
7357
7358
7359

Draft 0.1

Not for widespread publication

The :arglocal (:argl) command switches to the local argument list. If


the window doesn't have one yet, the global one is copied. The :argglobal
(:argg) command switches back to the global list. You can also use the
:arglocal and :argglobal commands to set the file list just like the :args
command. (The :args command works on the current set of arguments, while
:arglocal and :argglobal work on a specific list.)

7360

The :drop (:dr) also sets the argument list. The form of this command is:

7361

:drop {file} [file] [file] ...

7362
7363
7364
7365

Not only does it set the argument list, but it starts editing the first file. If a
the file is already being displayed in a window it will go to it. Otherwise it switch
the current window to the file. But if the file in the window hash changes in it
and can not be abandoned then it will split the window and to go the first file.

7366
7367

Basically the command is designed for interfacing with an interactive


debugger and does the right thing when the debugger needs to switch files.

7368

Global Marks

7369
7370
7371
7372

The marks a-z are local to the file. In other words, you can place a mark a
in file one.c and another mark a in file two.c. These marks are separate and
have nothing to do with each other. If you execute a go-to-mark command, such
as 'a, you will jump within that file to the given mark.

7373
7374

The uppercase marks (A-Z) differ. They are global. They mark not only the
location within the file, but also the file itself.

7375
7376
7377
7378

Take a look at an example. You are editing the file one.c and place the
mark A in it. You then go on to edit file two.c. When you execute the jump-tomark-A command ('A), the Vim editor will switch you from file two.c to file one.c
and position the cursor on the mark.

7379
7380

For example, you are editing a bunch of C files named alpha.c, beta.c, and
gamma.c. You execute the following commands:

7381

1. /#include

7382

2. mi

Find the first #include (in alpha.c).


Mark it with the mark i.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 315

Draft Not for publication


7383
7384
mi
7385
7386
(mark location
7387
with id i)
7388

Draft 0.1

Not for widespread publication

/* alpha.c */
#include <stdio.h>
int alph(void)
{
printf("In alpha\n");
}

7389

3. :next

Go to file beta.c.

7390

4. n

Find the first #include.

7391

5. mi

Mark it with the mark i.

7392

6. /magic_function

Find the magic function.

7393

7. mF

Mark it with the mark F.

7394
7395
7396
7397
7398
7399
7400

mi
mF

/* beta.c */
#include <stdio.h>
int magic_function(void)
{
printf("In beta\n");
}
"beta.c" 8L, 88C

7401

8. :next

7402

9. /#include

7403

10.mi

7404
7405
7406
7407
7408
7409
7410

mi

Go to file gamma.c.
Find the first #include.
Mark it with the mark i.

/* gamma.c */
#include <stdio.h>
int gamma(void)
{
printf("In gamma\n");
}
"gamma.c" 8L, 81C

7411
7412
7413

After executing these commands, you have three local marks, all named i.
If you execute the command 'i, you jump to the mark in your buffer. The mark F
is global because it is uppercase.

7414
7415
7416

Currently you are in file gamma.c. When you execute the command to go
to mark F ('F), you switch files to beta.c. Now you use the following command to
go to alpha.c.

7417

:rewind

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 316

Draft Not for publication

Draft 0.1

Not for widespread publication

7418
7419
7420

Place the F mark there using the mF command. Because this is a global
mark (you can put it in only one place), the mark named F in the file beta.c
disappears.

7421

Advanced Text Entry

7422
7423
7424
7425

When you are entering text in insert mode, you can execute a number of
different commands. For example, the <BS> command erases the character just
before the cursor. CTRL-U erases the entire line (or at least the part you just
inserted). CTRL-W deletes the word before the cursor.

7426

Movement

7427
7428
7429
7430
7431
7432

Even though you are in insert mode, you can still move the cursor. You
cannot do this with the traditional Vim keys h, j, k, and l, because these would
just be inserted. But you can use the arrow keys <Left>, <Right>, <Up>, and
<Down>. If you hold down the Control key, you can move forward and backward
words. In other words, execute <C-Left> to go backward one word, and <CRight> forward.

7433
7434
7435

The <Home> command moves the cursor to the beginning of a line, and
<End> moves to the end. The key <C-Home> moves to the beginning of the file,
and <C-End> moves to the end.

7436
7437

The <PageUp> moves one screen backward, and <PageDown> a screen


forward.

7438

Inserting Text

7439
7440
7441

If you type CTRL-A, the editor inserts the text you typed the last time you
were in insert mode. Assume, for example, that you have a file that begins with
the following:

7442
7443

"file.h"
/* Main program begins */

7444

You edit this file by inserting #include at the beginning of the first line:

7445
7446

#include "file.h"
/* Main program begins */

7447
7448
7449
7450

You go down to the beginning of the next line using the commands j^. You
now start to insert a new line that contains a new include line. So you type
iCTRL-A. The result is as follows:
#include "file.h"
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 317

Draft Not for publication


7451
7452
7453

Draft 0.1

Not for widespread publication

#include /* Main program begins */


The #include was inserted because CTRL-A inserts the contents of the
previous insert. Now you type "main.h"<Enter> to finish the line:

7454
7455
7456

#include "file.h"
#include "main.h"
/* Main program begins */

7457

The CTRL-@ command does a CTRL-A and then exits insert mode.

7458
7459
7460
7461
7462
7463

The CTRL-V command is used to quote the next character. In other words,
any special meaning the character has, it will be ignored. For example, CTRLV<Esc> inserts an escape. You can also use the command CTRL-Vdigits to insert
the character number digits. For example, the character number 64 is @. So
CTRL-V64 inserts @. The CTRL-Vdigits uses "decimal" digits by default, but you
can also insert the hex digits.

7464

For example,

7465

CTRL-V123

7466

and

7467

CTRL-Vx7b

7468

both insert the { character.

7469
7470

The CTRL-Y command inserts the character above the cursor. This is useful
when you are duplicating a previous line.

7471
7472

One of my favorite tricks is to use ASCII art to explain complex things such
as regular expressions. For example:

7473
7474
7475
7476
7477

[0-9]*[a -z]*
||||||||||||+---- Repeat 0 or more times
|||||||+++++----- Any lower case letter
|||||+---------- Repeat 0 or more times ++++
+----------- Any digit

7478
7479

Take a look at how you can use CTRL-Y to create this file. You start by
entering the first two lines:

7480
7481

[0-9]*[a-z]*
|||||||||||+---- Repeat 0 or more times

7482
7483
7484

Now you type CTRL-Y six times. This copies the | from the previous line
down six times:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 318

Draft Not for publication

Draft 0.1

Not for widespread publication

7485
7486
7487

[0-9]*[a-z]*
|||||||||||+---- Repeat 0 or more times
||||||

7488

Now all you have to do is enter the rest of the comments.

7489
7490

The CTRL-E command acts like CTRL-Y except it inserts the character
below the cursor.

7491

Inserting a Register

7492
7493
7494
7495
7496

The command CTRL-Rregister inserts the text in the register. If it


contains characters such as <BS> or other special characters, they are
interpreted as if they had been typed from the keyboard. If you do not want this
to happen (you really want the <BS> to be inserted in the text), use the command
CTRL-R CTRL-R register.

7497

First you enter the following line:

7498

All men^H^H^Hpeople are created equal

7499
7500

Note: To enter the backspace characters (which show up as ^H), you need
to type CTRL-V<BS> or CTRL-V CTRL-H.

7501

Now you dump this into register a with the command "ayy.

7502
7503
7504
7505

Next you enter insert mode and use CTRL-Ra to put the text into the file.
The result is as follows:
All men^H^H^Hpeople are created equal (original line)
All people are created equal
(CTRL-Ra line)

7506
7507

Notice that Vim put the contents in as if you had typed them. In other
words, the <BS> character (^H) deletes the previous character.

7508
7509

Now if you want to put the contents of the register in the file without
interpretation, you could use CTRL-R CTRL-R a. This results in the following:

7510
7511
7512

All men^H^H^Hpeople are created equal (original line)


All people are created equal
(CTRL-Ra line)
All men^H^H^Hpeople are created equal (CTRL-R CTRL-R a)

7513

Leaving Insert Mode

7514
7515
7516

The command CTRL-\ CTRL-N ends insert mode and goes to normal mode.
In other words, it acts like <Esc>. The only advantage this has over <Esc> is that
it works in all modes.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 319

Draft Not for publication

Draft 0.1

Not for widespread publication

7517
7518
7519
7520

Finally, CTRL-O executes a single normal-mode command and goes back to


insert mode. If you are in insert mode, for instance, and type CTRL-Odw, the Vim
editor goes into normal mode, deletes a word (dw), and then returns to insert
mode.

7521

The .viminfo File

7522
7523
7524

The problem with global marks is that they disappear when you exit Vim.
It would be nice if they stuck around. The .viminfo file is designed to store
information on marks as well as the following:

7525

Command-line history

7526

Search-string history

7527

Input-line history

7528

Registers

7529

Marks

7530

Buffer list

7531

Global variables

7532
7533
7534

The trick is that you have to enable it. This is done through the following
command:
:set viminfo={string}

7535
7536

The {string} specifies what to save. (The 'viminfo' option can be


abbreviated as 'vi'.)

7537
7538

The syntax of this string is an option character followed by an argument.


The option/argument pairs are separated by commas.

7539

Let's take a look at how you can build up your own 'viminfo' string.

7540
7541
7542

First, the ' (single quote) option is used to specify how many files for which
you save local marks (a-z). Pick a nice round number for this option (1000, for
instance). Your 'viminfo' option now looks like this:

7543
7544
7545
7546

:set viminfo='1000
The f option controls whether global marks (A-Z 0-9) are stored. If this
option is 0, none are stored. If it is 1 or you do not specify an f option, the
marks are stored. You want this feature, so now you have this:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 320

Draft Not for publication


7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557

Draft 0.1

Not for widespread publication

:set viminfo='1000,f1
The r option tells Vim about removable media. Marks for files on
removable media are not stored. The idea here is that jump to mark is a difficult
command to execute if the file is on a floppy disk that you have left in your top
desk drawer at home. You can specify the r option multiple times; therefore, if
you are on a Microsoft Windows system, you can tell Vim that floppy disks A and
B are removable with the r option:
:set viminfo='1000,f1,rA:,rB:
UNIX has no standard naming convention for floppy disks. On my system,
however, the floppy disk is named /mnt/floppy; therefore, to exclude it, I use this
option:

7558

:set viminfo='1000,f1,r/mnt/floppy

7559

Note: There is a 50-character limit on the names of the removable media.

7560
7561
7562
7563

The " option (which must be escaped (\") to let Vim know it's not a
comment) controls how many lines are saved for each of the registers. By
default, all the lines are saved. If 0, nothing is saved. You like the default, so you
will not be adding a \" specification to the 'viminfo' line.

7564
7565

The : option controls the number of lines of : history to save. 100 is


enough for us:

7566

:set viminfo='1000,f1,r/mnt/floppy,:100,

7567

The / option defines the size of the search history. Again 100 is plenty:

7568

:set viminfo='1000,f1,r/mnt/floppy,:100,/100

7569
7570

Note that Vim will never store more lines than it remembered. This is set
with the 'history' ('hi') option.

7571
7572
7573
7574
7575

Generally, when Vim starts, if you have the 'hlsearch' ('hi') option set,
the editor highlights the previous search string (left over from the previous
editing sessions). To turn off this feature, put the h flag in your 'viminfo'
option list. (Or you can just start Vim, see the highlighting, and decide you do not
like it and execute a :nohlsearch (:noh).)

7576
7577
7578
7579

The '@' option controls the number of items to save in the input-line
history. (The input history records anything you type as result of an input
function call.) For this example, let this default to the size of the input-line
history.

7580
7581

If the '%' option is present, save and restore the buffer list. The buffer list
is restored only if you do not specify a file to edit on the command line:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 321

Draft Not for publication


7582
7583
7584
7585
7586
7587

Draft 0.1

Not for widespread publication

:set viminfo='1000,f1,r/mnt/floppy,:100,/100,%
The ! option saves and restores global variables. (These are variables
whose names are all uppercase.)
:set viminfo='1000,f1,r/mnt/floppy,:100,/100,%,!
Finally, the n option specifies the name of the 'viminfo' file. By default,
this is $HOME/.viminfo on UNIX. On Microsoft Windows, the file is as follows:

7588

$HOME\_viminfo

if $HOME is set

7589

$VIM\_viminfo

if $VIM is set otherwise

7590

C:\_viminfo

7591
7592
7593
7594
7595
7596
7597
7598

The 'n' option must be the last option parameter. Because we like the
default filename, we leave this option off. Therefore, the full 'viminfo' line is
this:
:set viminfo='1000,f1,r/mnt/floppy,:100,/100,%,!
You can put this command and other initializations into a .vimrc
initialization file. The .viminfo file is automatically written when the editor exits,
and read upon initialization. But you may want to write and read it explicitly.
The following command writes the .viminfo file:

7599

:wviminfo[!] [file]

7600

(:wv is the short version of this command.)

7601
7602

If a file is specified, the information is written to that file. Similarly, you


can read the .viminfo file using this command:

7603

:rviminfo [file]

7604

(:rv for short.)

7605
7606
7607
7608
7609

This reads all the settings from file. If any settings conflict with currently
existing settings, however, the file settings will not be used. If you want the
information in the .viminfo file to override the current settings, use the following
command:
:rviminfo! [file]

7610

Dealing with Long Lines

7611
7612
7613

Sometimes you will be editing a file that is wider than the number of
columns in the window. When that occurs, Vim wraps the lines so that
everything fits on the screen (see Figure 20-6).
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 322

Draft Not for publication

wrapping

7614
7615
7616
7617
7618
7619
7620
7621
7622
7623

Draft 0.1

Not for widespread publication

A programmer once worked on a form letter genera


tion program
for a bank. They wanted to send out a special, p
ersonalized
letter to their richest 1000 customers. Unfortun
ately for the
programmer, he didn't adequately debug his code.
Even worse,
the bank didn't check the first batch of form le
tters.

7624

Figure 20-6: Text wrapping.

7625
7626
7627

If you set the 'nowrap' option, each line in the file shows up as one line on
the screen. Then the ends of the long lines disappear off the screen to the right
(see Figure 20-7).

7628
7629
7630
7631
7632
7633

A programmer once worked on a form letter genera


for a bank. They wanted to send out a special, p
letter to their richest 1000 customers. Unfortun
programmer, he didn't adequately debug his code.
Even worse,
the bank didn't check the first batch of form le

7634
7635
7636

Figure 20-7: :set nowrap.


By default, Vim does not display a horizontal scrollbar on the GUI. If you
want to enable one, as shown in Figure 20-8, use the following command:

7637

:set guioptions+=b

7638

('guioptions' can be abbreviated as 'go'.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 323

Draft Not for publication

Draft 0.1

Not for widespread publication

7639

7640
7641
7642
7643

Figure 20-8: Horizontal scrollbar.


This window can be scrolled horizontally. All you have to do is position the
cursor on a long line and move to the right using the l or $ command. Figure
20-9 shows what happens when you do a little horizontal scrolling.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 324

Draft Not for publication

7645
7646
7647
7648
7649

Not for widespread publication

Figure 20-9: Horizontal scrolling.


The ^ command moves to the first non-blank character of the line. The g^
command moves to the first non-blank character on the screen. If there is text
to the left of the window, it is ignored.
There are a number of similar g-type commands:
Command
^
<Home>
0
<End>
$

7650

Draft 0.1

Command
g^
g<Home>
g0
g<End>
g$
gm

Meaning (When nowrap Set)


Leftmost non-blank character on the screen.
Leftmost character on the screen.
Rightmost character on the screen.
Move to the middle of the screen

Figure 20-10 shows how these commands work.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 325

Draft Not for publication


7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661

Draft 0.1

Not for widespread publication

A programmer once worked on a form letter generation program


for a bank. They wanted to send out a special, personalized
letter to their richest 1000 customers. Unfortunately for the
programmer, he didn't adequately debug his code. Even worse,
the bank didn't check the first batch of form letters.
The result: the wealthiest 1000 customers all got a letter
that began, "Dear Rich Bastard."

g^
^

7662

g$
gm

Figure 20-10: Line-movement commands.

7663

The [count]| command goes to the count column on the screen.

7664
7665

The [count]zh command scrolls the screen count characters left while the
zl command does the same thing to the right.

7666
7667

The zL command scrolls half a screen to the left and the zR command
scrolls half screen to the right.

7668
7669

The j or <Down> command moves down a line. These commands move


down lines in the file. Take a look at Figure 20-11.

7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680

j
j
j

A programmer once worked on a form letter genera


tion program
for a bank. They wanted to send out a special, p
ersonalized
letter to their richest 1000 customers. Unfortun
ately for the
programmer, he didn't adequately debug his code.
Even worse,
the bank didn't check the first batch of form le
tters.
Figure 20-11: The j (down) command.

7681
7682
7683
7684

In this case, line 3 has wrapped. Now you start with the cursor on line 2.
Executing a j command moves you to the beginning of line 3. Another j and you
are down to the beginning of line 4. Note that although you have moved down a
line in text space, you have moved down two lines in screen space.

7685
7686
7687
7688
7689

Typing a gj or g<Down> command moves one line down in screen space.


Therefore, if you start at the beginning of line 3 and type gj, you wind up one
line down in screen space (see Figure 20-12). This is halfway between line 3 and
line 4. (In file space, you are on the middle of line 3.) The gk and g<Up>
commands do the same thing going up.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 326

Draft Not for publication


7690 gj
7691
7692 gj
7693 gj
7694
7695
7696
7697
7698
7699

Draft 0.1

Not for widespread publication

A programmer once worked on a form letter genera


tion program
for a bank. They wanted to send out a special, p
ersonalized
letter to their richest 1000 customers. Unfortun
ately for the
programmer, he didn't adequately debug his code.
Even worse,
the bank didn't check the first batch of form le
tters.

7700

Figure 20-12: The gj (down screen line) command.

7701

Wrapping

7702
7703
7704
7705

By default, the Vim editor wraps long lines. It does this by putting as
much of the line as possible on the first screen line, and then to breaking it, and
putting the rest on the next line. You can to turn this off by setting the following
option:

7706
7707
7708
7709
7710
7711

:set nowrap
With this option set, long lines just disappear off the right side of the
screen. When you move the cursor along them, the screen scrolls horizontally
and you can see what you are doing. You can customize wrapping by setting
some Vim options. First of all, you can tell Vim to break lines at nice places by
setting the option:

7712
7713

:set linebreak
:set lbr

7714

Figure 20-13 shows how this option affects the screen.

or

A programmer once worked on a form


letter generation program
for a bank. They wanted to send ou
t a special, personalized
letter to their richest 1000 custo
mers. Unfortunately for the
programmer, he didn't adequately d
ebug his code. Even worse,
the bank didn't check the first ba
tch of form letters.

7715

A programmer once worked on a


form letter generation program
for a bank. They wanted to send
out a special, personalized
letter to their richest 1000
customers. Unfortunately for the
programmer, he didn't adequately
debug his code. Even worse,
the bank didn't check the first
batch of form letters.

:set linebreak

:set nolinebreak

7716
7717

Figure 20-13: The 'linebreak' option.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 327

Draft Not for publication


7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733

Draft 0.1

Not for widespread publication

But what defines a "nice" place on the line. The answer is the characters
in the 'breakat' ('brk') option. By default, these are ^ I ! @ * - +
_ ; : , . / ?. Now suppose you do not want to break words with _ in them.
You need to remove _ from the list of 'breakat' characters, so you execute the
following command:
:set breakat -=_
Usually when lines are broken, nothing is put at the beginning of the
continuation lines. You can change this, however, by defining the 'showbreak'
('sbr') option. For example:
:set showbreak="---->"
Finally, there is the question of what to do if you need to break a line at the
end of the screen. You have two choices: First, you can refuse to display half of a
line. The Vim editor will display an @ at the bottom of the screen to indicate
"there is a long line here that we cannot fit it on the screen. Second, you can
display half the line. The Vim default is method one. If you want to use method
two, execute this command:

7734

:set display=lastline

7735

('dy' is short for 'display'.)

7736

Spelling Dictionaries

7737
7738
7739

Vim lets you create word lists in a variety of formats. The simplest is a
straight word list. To turn a word list into a dictionary it needs to be compiled.
This is done using the :mkspell (:mksp) command.

7740

The general form of this command is:

7741

:mkspell {out-file} {in-file}

7742
7743
7744
7745

There are a lot of rules concerning the name of the output file. First if the
name ends in .spl, the {out-file} name is the actual name of the output file. If
it does not, then it is the base name to be used. Vim will add the current
encoding to the name as well as the extension .spl.

7746
7747

The :mkspell command takes an option (-ascii) which tells it to skip all
non-ASCII characters.

7748
7749
7750

Vim accepts word lists in a variety of formats. One of the more common
dictionary layouts is the MySpell format. One source for dictionary files is
http://lingucomponent.openoffice.org/spell_dic.html

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 328

Draft Not for publication

Draft 0.1

Not for widespread publication

7751
7752
7753
7754
7755

Vim supports both simple word lists, and a very complex word lists. The
latter specify things language and region, as well as indicating word parts
(prefixes, suffixes), rare words, and misspelled words. Since this feature is of
interest only to the handful users who will actually make word lists, a full
description has been omitted.

7756
7757
7758
7759

The :mkspell command can take multiple input files and produce a single
word list. The naming of the input files must follow the convention
{name}_{encoding}. The following command creates a English language
dictionary for three regions.

7760

:mkspell en en_US en_CA en_AU

7761
7762

Finally if no output name is specified, the :mkspell command will produce


one based on the input name.

7763
7764
7765
7766
7767
7768

Dictionary construction can be fine tuned through the 'mkspellmem'


('msm') option. This option consists of three memory limits. The first tells
:mkspell how much memory to use before starting compression, the second
specifies the amount of memory that can be allocated before another
compression is done and the last is the upper limit on memory. When memory
reaches this limit aggressive (and time consuming) compression is started.

7769

Dumping dictionaries

7770
7771
7772

If you need to see a list of the words in the current dictionary use the
:spelldump (:spelld) command. This opens a new window with the list of
words in it.

7773
7774
7775
7776

What's the format of this list? It is not documented.


If you use the override (!) option on this command, the words along with a
word count is dumped.
Documentation does not match results.

7777

Customizing the spelling system

7778
7779
7780

The 'spellcapcheck' ('spc') option is used by Vim to tell when a sentence


ends. It contains a regular expression that is executed to detect periods and
other sentence ending text for the spelling system's capitalization check.

7781
7782
7783

The 'spellsuggest' ('sps') is a option which contains information that


tells Vim how to find suggested corrections for a word. It is a set of keywords
separated by commas. The list of keywords includes:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 329

Draft Not for publication

Draft 0.1

Not for widespread publication

7784
7785

best

Use the suggesting generator named best. This


is the generator that works best for English.

7786
7787
7788
7789
7790

double

This suggestion generator first tries the best


method, then depending on the results, then tries
the fast method and mixes the results. It can be
somewhat slow and not as good as the other
methods.

7791
7792

fast

This suggestion generator checks for dropped,


added, or moved letters. (In other words typos.)

7793

{number}

Maximum number of suggestions to generate.

7794
7795
7796

file:{filename} Specify a suggestion file. Each line in the file


contains a misspelled word a slash and the correct
version.

7797

expr:{expression}

7798
7799
7800

Evaluate the {expression} to get a list of


suggestions an their scores. (Note: Lower scores
are better.)

7801
7802

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 330

Draft Not for publication

Draft 0.1

Not for widespread publication

7803

Chapter 21: All About Windows, Tabs, and Sessions

7804
7805
7806
7807

In Chapter 5: Windows and Tabs you learned the basic commands for using
windows. But there are a lot more window-related commands. This chapter
discusses many different commands for selecting and arranging windows. You
will also learn how to customize the appearance of the windows.

7808
7809
7810

Finally, this chapter discusses session files. These files enable you to save
and restore all your editing and window settings so that you can return to editing
where you left off.

7811

The topics covered in this chapter include the following:

7812

Moving between windows Moving windows up and down

7813

Performing operations on all windows

7814

Editing the "alternate" file

7815

Split searches

7816

Shorthand operators

7817

Advanced buffer commands

7818

Session files

7819

Moving Between Windows

7820
7821
7822

As previously discussed, CTRL-Wj (CTRL-W CTRL-J, CTRL-W<Down>) goes to


the window below and CTRL-Wk (CTRL-W CTRL-K, CRL-W<Up>) goes to the
window above. The following commands also change windows.
CTRL-Wt
Go to the top window.
CTRL-W CTRL-T
CTRL-Wb
Go to the bottom window.
CTRL-W CTRL-B
CTRL-Wp
Go to the window you were in before you switched to this
CTRL-W CTRL-P one. (Go to the preceding window.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 331

Draft Not for publication


7823
7824
CTRL-Ww
7825
1CTRL-WW
7826
CTRL-Wt
7827
7828
2CTRL-Ww
7829
2CTRL-WW
7830
7831
7832
3CTRL-Ww
7833
3CTRL-WW
7834
CTRL-Wb
7835
7836

Draft 0.1

Not for widespread publication

/* File one.c */
~
~
~
one.c
/* File two.c */
~
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c

7837

Figure 21-1: Window selection commands.


[count]CTRL-Ww
Go down a window. If at the bottom, wrap. If
[count]CTRL-W CTRL-W count is specified, go to the window number
count.
countCTRL-WW
Go up a window. If at the top, wrap. If count is
specified, go to the window number count.

7838
7839
7840
7841
7842
7843
7844 CTRL-Ww
7845
7846
7847
7848
7849
7850
7851
7852 CTRL-Ww
7853

/* File one.c */
~
~
~
one.c
/* File two.c */
~
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c

CTRL-WW
CTRL-WW

CTRL-WW

Figure 21-2: More window selection commands.

7854

Moving Windows Up and Down

7855
7856

The CTRL-Wr (CTRL-W CTRL-R) command rotates the windows downward


(see Figure 21-3).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 332

Draft Not for publication


7857
7858

Draft 0.1

Not for widespread publication

The CTRL-Wr command takes a count argument, which is the number of


times to perform the rotate down.
/* File one.c */
~
~
one.c
/* File two.c */
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c
/* This file four.c *
/
~
four.c

CTRL-Wr

/* This file four.c *


/
~
four.c
/* File one.c */
~
~
one.c
/* File two.c */
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c

7859

Figure 21-3: Rotating a window down.

7860

The CTRL-WR command rotates the windows upward (see Figure 21-4).
/* File one.c */
~
~
one.c
/* File two.c */
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c
/* This file four.c *
/
~
four.c

CTRL-WR

/* File two.c */
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c
/* This file four.c *
/
~
four.c
/* File one.c */
~
~
one.c

7861

Figure 21-4: Rotating a window up.

7862
7863
7864
7865

The CTRL-Wx (CTRL-W CTRL-X) command exchanges the current window


with the next one (see Figure 21-5). If the current window is the bottom window,
there is no next window, so it exchanges the current window with the previous
one.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 333

Draft Not for publication


/* File one.c */
~
~
one.c
/* File two.c */
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c
/* This file four.c *
/
~
four.c
7866

Draft 0.1

CTRL-Wx

Not for widespread publication


/* File two.c */
~
~
two.c
/* File one.c */
~
~
one.c
/* File three.c */
#include <stdio.h>
int i;
three.c
/* This file four.c *
/
~
four.c

Figure 21-5: Exchanging a window.

7867

Performing Operations on All Windows

7868
7869
7870

The :write (:w) command writes out the current file. If you want to write
all the files that have been modified (including hidden buffers), use the following
command:

7871

:wall

7872

(:wa is the short form of :wall.)

7873
7874
7875

The quit command :quit (:q, CTRL-Wq, CTRL-W CTRL-Q) closes the
current window. (If this is the last window for a file, the file is closed.) If you
have multiple windows up, you can quit them all using this command:

7876

:qall

7877

(:qa is the short form of :qall.)

7878
7879
7880
7881
7882
7883
7884

If some of the files have been modified, and the changes have not been
saved, the :qall command fails. If you want to abandon the changes you have
made, use the force option (!), which gives you this command:
:qall!
(Use this with caution because you can easily discard work you wanted to
keep.) If you want to perform a combination of :wall and :qall, use this
command:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 334

Draft Not for publication

Draft 0.1

Not for widespread publication

7885

:wqall

7886

(The aliases for :wqall are :wqa, :xa, :xall.)

7887

Other Window Commands

7888
7889
7890

The CTRL-Wo (CTRL-W CTRL-O, :on, :only) command makes the current
window the only one on the screen. As Figure 21-6 shows, all the other windows
are closed. (The system pretends that you did a :quit in each of them.)
/* File one.c */
~
~
one.c
/* File two.c */
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c
/* This file four.c *
/
~
four.c

CTRL-Wo

/* File one.c */
~
~
~
~
~
~
~
~
~
~
~
~
~
~
one.c

7891

Figure 21-6: The CTRL-Wo command.

7892
7893
7894

If you have specified multiple files on the command line or through the filelist command, the :all (:al, :sall, :sal) command opens up a window for each
file (see Figure 21-7).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 335

Draft Not for publication

Draft 0.1

/* File one.c */
~
~
~
~
~
~
~
~
~
~
~
~
~
~
one.c
7895
7896
7897

:all

A variation of the :all command opens a new window for each hidden
buffer:
:unhide

7899

(Alternate formats :unh, :sunhide, :su.)

7903

/* File one.c */
~
~
one.c
/* File two.c */
~
~
two.c
/* File three.c */
#include <stdio.h>
int i;
three.c
/* This file four.c *
/
~
four.c

Figure 21-7: :all.

7898

7900
7901
7902

Not for widespread publication

This command can take an argument that limits the number of windows
that can be opened at one time. To unhide all the buffers but put no more than
five windows on screen, for example, use the following command:
:unhide 5

7904

Editing the Alternate File

7905
7906

You can split the window and edit the alternate file with the command
CTRL-W CTRL-^ (CTRL-W^). Figure 21-8 shows the results.
/* File three.c */
#include <stdio.h>
int i;
int main()
{
for(i = 1; i <= 10; ++i)
{
"three.c" 11L, 160C

CTRL-_

/* File two.c */
~
~
~
~
~
~
"two.c" 1L, 17C
/* File two.c */

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 336

Draft Not for publication

Draft 0.1

CTRL-W
CTRL-_

7907

Not for widespread publication


~
~
"two.c" 1L, 17C
/* File three.c */
#include <stdio.h>
int i;
"three.c" 11L, 160C

Figure 21-8: CTRL-W CTRL-^.

7908

Split Search

7909
7910
7911

The CTRL-W CTRL-I command splits the window, and then searches for the
first occurrence of the word under the cursor. This search goes through not only
the current file, but also any #include files.

7912
7913

If you position the cursor on the printf on Hello World and press
CTRL-W CTRL-I, you get a screen that looks like Figure 21-9.

7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928

extern int fprintf(...);


/* Write formatted output to stdout. */
extern int printf (...);
/* Write formatted output to S. */
extern int sprintf (...)
/usr/include/stdio.h [RO]
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return (0);
}
/tmp/hello.c
Figure 21-9: The CTRL-W CTRL-I command.

7929

Shorthand Commands

7930
7931

The Vim editor contains some shorthand commands that do the work of
multiple commands, including the following:
:{count}snext
:{count}sn
:{count}sprevious
:{count}spr
:{count}sNext

:split followed by :countnext


:split followed by :countprevious
:split followed by :countNext

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 337

Draft Not for publication


:{count}sN
:srewind
:sre
:sfirst
:sf
:slast
:sl
:sargument
:sa
CTRL-W CTRL-D
CTRL-Wd
CTRL-W CTRL-F
CTRL-Wf
CTRL-Wg]

Draft 0.1

Not for widespread publication

:split followed by :rewind

:split followed by :last


:split followed by :argument
:split followed by ]CTRL-D
:split followed by a :find
:split followed a CTRL-]

7932
7933

One nice thing about these commands is that they do not open a new
window if they fail.

7934

Other Window Commands

7935
7936

The :wincmd (:winc) command executes a command as you typed CTRL-W.


Not that useful interactively but very nice when you are writing scripts.

7937
7938
7939

The :windo (:wind) command will execute a command for each open
window. For example, to change vim to Vim in all the windows use the
command:

7940
7941
7942

:windo :%s/vim/Vim/g

Advanced Buffers
The following sections discuss adding, deleting, and unloading buffers.

7943

Adding a Buffer

7944
7945

The Vim editor maintains a list of buffers. Usually you put a file on the list
by editing it. But you can explicitly add it with the following command:

7946

:badd file

7947
7948

(This is a bad command. Let me rephrase that. The abbreviated version of


this command is :bad.)

7949
7950

The named file is merely added to the list of buffers. The editing process
will not start until you switch to the buffer. This command accepts an argument:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 338

Draft Not for publication


7951

Draft 0.1

Not for widespread publication

:badd +lnum file

7952
7953

When you open a window for the buffer, the cursor will be positioned on
line lnum.

7954

Deleting a Buffer

7955

The

7956

:bdelete

7957

command deletes a buffer. (:bd is the short form.)

7958

You can specify the buffer by name:

7959

:bdelete file.c

7960

or by number:

7961
7962

:bdelete 3
:3 bdelete

7963

You can also delete a whole range of buffers, as follows:

7964

:1,3 bdelete

7965

If you use the override (!) option, any changes to the buffer are discarded:

7966

:bdelete! file.c

7967

Unloading a Buffer

7968
7969
7970
7971

The command :bunload (:bun) unloads a buffer. The buffer is unloaded


from memory and all windows for this buffer are closed. However, the file
remains listed in the buffer list. The :bunload command uses the same syntax as
the :bdelete.

7972
7973
7974

The :bwipeout (:bw) command unloads the file and causes Vim to forget
everything it knew about it. This command takes the same syntax as :bdelete
and should not be used unless you know what you are doing.

7975

Opening a Window for Each Buffer

7976

The :ball (:ba, :sball, :sba) command opens a window for each buffer.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 339

Draft Not for publication

Draft 0.1

Not for widespread publication

7977

Windowing Options

7978
7979

The 'laststatus' ('ls') option controls whether the last window has a
status line. (See Figure 21-10.) The three values of this option are as follows:
0
1
2

The last window never has a status line.


If there is only one window on the screen, do not display the status line. If
there are two or more, however, display a status line for the last window.
(default).
Always display a status line even if there is only one window on screen.

7980

7981

laststatus = 0
/* File one.c */
~
~
~
~
~
One file

laststatus = 1
/* File one.c */
~
~
~
~
~
One file

laststatus = 2
/* File one.c */
~
~
~
~
one.c
One file

/* File one.c */
~
one.c
/* File two.c */
~
~
Two Files

/* File one.c */
~
one.c
/* File two.c */
~
two.c
Two Files

/* File one.c */
~
one.c
/* File two.c */
~
two.c
Two Files

Figure 21-10: 'laststatus' option.

7982
7983
7984
7985

The 'winheight' ('wh') option sets the minimum number of lines for a
window. This is not a hard limit; if things get too crowded, Vim will make
smaller windows. The 'winwidth' ('wiw') option does the same thing, only for
width.

7986
7987
7988

The 'winminheight' ('wmh') option is the absolute minimum height of a


window that's not the current window. The 'winminwidht' ('wmw') does the
same thing for the width of a window.

7989
7990
7991

When the 'equalalways' ('ea') option is enabled (the default), Vim will
always split the screen into equal-size windows. When off, splits can result in
windows of different sizes. Figure 21-11 shows the effect of this option.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 340

Draft Not for publication

Draft 0.1

Not for widespread publication

gvim one.c
:split
:split
/* File one.c */
~
~
~
~
one.c
/* File one.c */
~
~
~
~
one.c
/* File one.c */
~
~
~
~
one.c
:split

/* File one.c */
~
~
~
one.c
/* File one.c */
~
~o
one.c
/* File one.c */
~
~
~
~
~
~
~
one.c
:split

:set equalalways

:set noequalalways

7992
7993

Figure 21-11: 'equalalways' option.

7994
7995
7996
7997

By default 'equalalways' works for horizontal and vertical splits. If you


want this option to affect only horizontal windows set the 'eadirection' ( 'ead')
option to hor. If you want only vertical windows to be affected set the
'eadirection' option to ver. The default (both) affects both directions.

7998
7999
8000

If you split horizontally, and the 'equalalways' option is set, any window
with the 'winfixheight' ('wfh') option set will not change size. For vertical
splits the 'winfexwidth' ('wfw') option keeps the size constant.

8001

Controling a split

8002
8003
8004

Generally a :split command opens a window above the current window.


The 'splitbelow' ('sb') option causes a new window to appear below the
current one.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 341

Draft Not for publication

Draft 0.1

Not for widespread publication

8005
8006

A :vsplit command opens a window to the left of the current one. The
'splightright' ('spr') option causes new to open to the right.

8007
8008
8009

The :aboveleft (:abo, :leftabove, :lefta) command causes any


command that splits a window to open the window above the current one or to
the left regardless of the value of any options.

8010
8011

The :rightbelow (:rightb, :belowright, :bel) command does the same


thing except the window will appear below or to the right of the current one.

8012
8013
8014
8015

The :topleft (:to) command will open a window at the top of the screen
for horizontal splitting commands. The window will go across the entire screen.
For vertical splitting commands, the window will occupy the entire left of the
screen.

8016
8017

The :botright (:bo) command acts in a similar manner except the winow
will occupy the entire bottom or right of the screen.

8018

Tabs

8019
8020

In this section we'll take a look at how to execute one command for
multiple tabs as well as how to customize the tab system.

8021

Executing a command for all tabs

8022
8023
8024

The :tabdo (:tabd) command executes a given command for every tab.
For example, to change the word "idiot" to "politician" for every tab, use the
command:

8025
8026

:tabdo :s/idiot/politician/
Other tab commands

8027

The :tabs command lists the tabs and the files being edited in them.

8028

For example:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 342

Draft Not for publication


8029
8030
8031
8032
8033
8034
8035

Draft 0.1

Not for widespread publication

:tabs
Tab page 1
> + spell.add
Tab page 2
new.txt
tabpage.txt
Press ENTER or type command to continue

8036
8037

The :tabmove (:tabm) command moves the current tab to just after the
given tab.

8038
8039

For example Figure 21-12 shows what happens when we have the tab
third.txt open and execute the command:

8040

:tabmove 1

8041

8042

Figure 21-12: Result of :tabmove 1

8043

Customzing tabs

8044
8045
8046

The 'guitablabel' ('gtl') contains a string that defines the format of the
label for each tab. The format is the same as the 'statusline' option
described on page 539.

8047
8048

The 'guitabtooltip' ('gtt') option is used to define a tooltip for each


tab.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 343

Draft Not for publication


8049

Draft 0.1

Not for widespread publication

Both 'guitablabel' and 'guttabtooltip' are evaluated once per tab.

8050

Tabs without the GUI

8051
8052
8053

Tabs are still available if you are using console (non-GUI) mode. They
don't look as nice and you can't click to move from tab to tab, but you do have
tabs. (However, you may wish to consider using windows instead.)

8054
8055

The 'showtabline' ('stal') tells Vim when to show the tab line. This
option has the following values

8056

0 -- Never show the tab line

8057

1 -- Show the tab line only when required

8058

2 -- Always show the tab line

8059
8060
8061
8062

The 'tabline' ('tal') option defines the tabline to be displayed. Unlike


'guitablabel' this option needs to define the entire tab line. For those of you
really interested in this level of customization, there is an example of how to do
this in the :help tabs help page.

8063

Sessions

8064
8065
8066

Suppose you are editing along, and it is the end of the day. You want to
quit work and pick up where you left off the next day. You can do this by saving
your editing session and restoring it the next day.

8067
8068
8069
8070

A Vim session contains all the information about what you are editing. This
includes things such as the file list, windows, and other information. (Exactly
what is controlled by the 'sessionoptions' ('ssop') option is described later in
the section "Specifying What Is Saved in a Session.")

8071

The following command creates a session file:

8072

:mksession file

8073

(:mks is short for :mksession.)

8074

For example:

8075

:mksession vimbook.vim

8076

Later if you want to restore this session, you can use this command:

8077

:source vimbook.vim

8078

(:so is short for :source.)


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 344

Draft Not for publication


8079
8080
8081

Draft 0.1

Not for widespread publication

If you want to start Vim and restore a specific session, you can use the
following command:
$ vim -c ":source vimbook.vim"

8082
8083

(This tells Vim to execute a specific command on startup (-c). The


command is :source vimbook.vim, which loads the session vimbook.vim.)

8084

Specifying What Is Saved in a Session

8085
8086
8087

The 'sessionoption' option controls what is saved in a session file. It is a


string of keywords separated by commas. For example, the default
'sessionoptions' setting is as follows:

8088

:set sessionoptions=buffers,winsize,options,help,blank

8089

The various keywords are


buffers
globals
help
blank
options
winpos
resize
winsize
slash

unix

Saves all buffers. This includes the ones on the screen as well
as the hidden and unloaded buffers.
Saves the global variables that start with an uppercase letter
and contain at least one lowercase letter.
The help window.
Any blank windows on the screen.
All options and keyboard mapping.
Position of the GUI Vim window.
Size of the screen.
Window sizes (where possible).
Replace backslashes in filenames with forward slashes. This
option is useful if you share session files between UNIX and
Microsoft Windows. (You should set UNIX as well.)
Write out the file using the UNIX end-of-line format. This
makes the session portable between UNIX and Microsoft
Windows.

8090
8091
8092

Note: If you enable both the slash and unix options, the session files are
written out in a format designed for UNIX. The Microsoft Windows version
of Vim is smart enough to read these files.

8093
8094
8095

Unfortunately, the UNIX version of Vim is not smart enough to read


Microsoft Windows format session files. Therefore, if you want to have
portable sessions, you need to force Vim to use the UNIX format.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 345

Draft Not for publication

Draft 0.1

Not for widespread publication

8096

Views

8097
8098
8099

Let's say you've got a lot of windows and tabs open. You've gone to a lot of
trouble to make things look just right. Each window is just in the right place,
and the options have been finely tuned to make things just perfect.

8100
8101

Things are great as long as you stay within Vim. But once Vim exists, all
these settings are lost.

8102
8103
8104

That's where the :mkview (:mkvie) command comes in. It creates a script
that restores all your windows and settings to their current values. (It's not
perfect, but it does a pretty good job.)

8105

To save you view use the command:

8106

:mkview view.vim

8107
8108

(If the override (!) option is present, :mkview will overwrite an existing
file.)

8109

The script is called view.vim. You can load it with the command:

8110

:source view.vim

8111
8112
8113

You can also :mkview without a file name. In this case the file is stored in
the directory specified by the 'viewdir' ('vdir') option. If a number is used as
an argument, then a numbered view is stored in this directory.

8114
8115

In any case, these views can be loaded by using the :loadview (:lo)
command.

8116
8117

The 'viewoptions' ('vop') option controls what's stored in the view. It is


a comma separated list of keywords:
Keyword
Meaing
cursor Save the cursor position
folds
Save the current state of the folds
options Save the current options including the ones local to the buffer or
window.
slash
Save file names with backslashed (\) replaced by forward slashes (/).
unix
Save in UNIX file format.

8118

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 346

Draft Not for publication

Draft 0.1

Not for widespread publication

8119

Chapter 22: Advanced Visual Mode

8120
8121
8122
8123

In Chapter 6: Basic Visual Mode you learned how to perform visual


commands. Now you can take a look at many of the other visual-related
commands. Many of these commands have a limited audience; but read on, that
audience may include you. In this chapter, you learn about the following:

8124

Using visual mode with text registers

8125

Using the $ selection command

8126

Reselecting text

8127

Additional highlighting commands

8128

Miscellaneous editing commands

8129

Select mode

8130

Visual Mode and Registers

8131
8132
8133
8134
8135

Chapter 4: Text Blocks and Multiple Files showed you how to use the yank,
put, and delete commands with registers. You can do similar things with the
visual-mode commands. To delete a block of text, for instance, highlight in visual
mode and then use the d (<Del>, x) command. To delete the text into a register,
use the command "{register}d.

8136
8137
8138

To yank the text into a register, use the y command. The D and the Y
commands act like their lowercase counterparts, except they work on entire
lines, whereas d and y work on just the highlighted section.

8139

The $ Command

8140
8141
8142
8143
8144
8145

In block visual mode, the $ command causes the selection to be extended


to the end of all the lines in the selection. Moving the cursor up or down
extends the select text to the end of the line. This extension occurs even if the
new lines are longer than the current ones. Figure 22-1 shows what happens
when you don't use the $ command, and Figure 22-2 shows what happens when
this command is used.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 347

Draft Not for publication


8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165

Start

Draft 0.1

Not for widespread publication

Cursor movement
A very intelligent turtle
1) l to move right
Found programming UNIX a hurdle
2) j to move down
The system, you see,
Ran as slow as did he,
And that's not saying much for the turtle.
***
-- VISUAL BLOCK -Figure 22-1: Block visual mode without $ command.
A very intelligent turtle
Found programming UNIX a hurdle
The system, you see,
Ran as slow as did he,
And that's not saying much for the turtle.

$ to move
to end of line

***
-- VISUAL BLOCK -Figure 22-2: Block visual mode with the $ command.

8166

Repeating a Visual Selection

8167
8168
8169
8170

The gv command repeats the preceding visual mode selection. If you are
already in visual mode, it selects the preceding selection. Repeated gv
commands toggle between the current and preceding selection. Figure 22-3
shows the effects of these commands. The steps are as follows:

8171

1. First visual selection.

8172

2. Finished with visual.

8173

3. gv reselects the old visual.

8174

4. Define new visual.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 348

Draft Not for publication


First visual
selection
Line 1
Line 2
Line 3
Line 4
Line 5.
~
~
~
~
lines.txt
--VISUAL--

Draft 0.1

Finished with
the selection
Line 1
Line 2
Line 3
Line 4
Line 5.
~
~
~
~
lines.txt

Not for widespread publication

gv reselect
the old visual
Line 1
Line 2
Line 3
Line 4
Line 5.
~
~
~
~
lines.txt
--VISUAL--

Define new
visual
Line 1
Line 2
Line 3
Line 4
Line 5.
~
~
~
~
lines.txt
--VISUAL--

8175
8176

reselect

gv goes to
previous visual

8177
8178
gv goes to
new visual if done twicel

8179
8180
8181

Figure 22-3: The gv command.

8182

Selecting Objects

8183
8184

A number of commands in visual mode are designed to help you highlight


the text you want.

8185
8186
8187
8188

The aw command, for example, highlights the next word. Actually it


highlights not only the word, but also the white space after it. At first this may
seem a bit useless. After all, the w command moves you forward one word, so
why not just use it?

8189
8190
8191
8192
8193

That is because when you perform a selection, the text selected is from the
old cursor location to the new one inclusive. Now if you use the w command to
move, the result is that the cursor is placed on the first character of the next
word. Therefore if you delete the text, you not only get the words you selected,
but the first character of the next word.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 349

Draft Not for publication

Draft 0.1

Not for widespread publication

8194
8195
8196

The aw command leaves the cursor positioned just before the first
character of the next word. In other words, it selects the word and the spaces
beyond it, but not the next word.

8197
8198
8199

Another reason to use aw rather than w is that aw selects the whole word,
no matter which part of the word the cursor is on, whereas w just selects from
the current location to the end of the word.

8200
8201

If you want to just select the word, and nothing but the word, use the iw
(inner word) command. Figure 22-4 shows how iw and aw work.

8202
8203

This is a test

8204

8205
8206

This is a test
aw

8207
8208
8209
8210

This is a test
iw

8211
8212

Figure 22-4: iw and aw commands.


You can use the following commands to select text:
{count}aw
{count}iw
{count}aW
{count}iW
{count}as
{count}is
{count}ap
{count}ip
{count}a(
{count}a)
{count}ab
{count}i(
{count}i)
{count}ia
{count}a<
{count}a>

Select a word and the space after it.


Select a word only (inner word).
Select a WORD and the space after it.
Select inner WORD (the word only)
Select a sentence (and spaces after it.)
Select the sentence only.
Select a paragraph and the following space.
Select a paragraph only.
From within text enclosed in (), select the text up to and
including the ().
Like a(, except the () characters are not selected.
Select matching <> pair, include the <>.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 350

Draft Not for publication


{count}i<
{count}i>
{count}a[
{count}a]
{count}i[
{count}i]
{count}a{
{count}a}
{count}i{
{count}i}
{count}a
{count}i
{count}a'
{count}i'
{count}a`
{count}i`
{count}at
{count}it

Draft 0.1

Not for widespread publication

Select matching <> pair, excluding the <>.


Select matching [] pair, including the [].
Select matching [] pair, excluding the [].
Select matching {} pair, including the {}.
Select matching {} pair, excluding the {}.
Select enclosing , including the .
Select enclosing , excluding the .
Select enclosing '', including the ''.
Select enclosing '', excluding the ''.
Select enclosing ``, including the ``.
Select enclosing ``, excluding the ``.
Select the enclosing XML tag block ( <foo> ... </foo>)
including the tags.
Select the enclosing XML tag block ( <foo> ... </foo>)
excluding the tags.

8213
8214
8215
8216
8217
8218

for (i = 0; i < 100; ++1)

for (i = 0; i < 100; ++1)

a(

i(
Figure 22-5: a( and i( commands.

8219

8220

Moving to the Other End of a Selection

8221
8222
8223

The o command moves the cursor to the other end of a selection (see
Figure 22-6). You can then move back to the other end (where you came from)
with another o.

8224

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 351

Draft Not for publication


8225
8226
8227
8228
8229
8230
8231o
8232Go to
8233other end
8234
8235
8236
8237

ACHTUNG! ALLES LOOKENSPEEPERS!


Das computermachine ist nicht fuer
gefingerpoken und mittengrabben. Ist easy
schnappen der springenwerk, blowenfusen und
poppencorken mit spitzensparken. Ist nicht
fuer gewerken bei das dumpkopfen. Das
rubbernecken sichtseeren keepen das
cotten-pickenen hans in das pockets muss;
relaxen und watchen das blinkenlichten.
Figure 22-6: The o command.

The O command moves the cursor to the other corner of the selection in
block visual mode (see Figure 22-7). In other words, the O command moves to
the other end of the selection on the same line.

8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
O
8257
Other
8258
side
8259
8260
8261

Not for widespread publication

Found near the computer room of an American


company:

8238
8239
8240
8241

Draft 0.1

The last sign in pseudo-German has made its


way around the world. It even made its way to
Germany where they translated it into
pseudo-English.
ATTENTION
This room is fullfilled mit special
electronische equippment. Fingergrabbing and
pressing the cnoeppkes from the computers is
allowed for die experts only! So all the
"lefthanders" stay away and do not disturben
the brainstorming von here working
intelligencies. Otherwise you will be out
thrown and kicked anderswhere! Also: please
keep still and only watchen astaunished the
blinkenlights.
-- VISUAL BLOCK -Figure 22-7: The O command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 352

Draft Not for publication

Draft 0.1

Not for widespread publication

8262

Case Changes

8263
8264
8265
8266

The ~ command inverts the case of the selection. The U command makes
the text uppercase and the u command turns the text into lowercase. Figure 228 illustrates how the various case-changing commands work. The figures show
initial selection, ~, U, and u, respectively.
Line 1
Line 2
Line 3
Line 4
Line 5.
~
~
~
~
lines.txt
--VISUAL--

Line 1
lINE 2
lIne 3
Line 4
Line 5.
~
~
~
~
lines.txt

Line 1
LINE 2
LINE 3
Line 4
Line 5.
~
~
~
~
lines.txt

Initial
Selection

Line 1
line 2
line 3
Line 4
Line 5.
~
~
~
~
lines.txt
--VISUAL-u

8267
8268

Figure 22-8: Case-changing commands.

8269

Joining Lines

8270
8271
8272
8273

The J command joins all the highlighted lines into one long line. Spaces
are used to separate the lines. If you want to join the lines without adding
spaces, use the gJ command. Figure 22-9 shows how the J and gJ commands
work.
Line 1
Line 2
Line 3
Line 4
~
~
~
~
~
lines.txt
-- VISUAL --

Line 1
Line 2 Line 3
Line 4
~
~
~
~
~
~
lines.txt [+]

gJ

Line 1

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 353

Draft Not for publication

Draft 0.1

Not for widespread publication

Line 2Line 3
Line 4
~
~
~
~
~
~
lines.txt [+]
8274
8275
8276

Figure 22-9: J and gJ commands.

Formatting a Block

8277

8278

The gq command formats the text (see Figure 22-10).


Select lines

Oh woe to Mertle the turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.
~
poem.txt
-- VISUAL --

gq

Oh woe to Mertle the turtle who found web


surfing quite a hurtle. The system you
see was slower than he. And that's not
saying much for the turtle.
~
~
poem.txt
-- VISUAL -Figure 22-10: The gq command.

8279

The Encode (g?) Command

8280
8281
8282

?The g? command encodes or decodes the highlighted text using the rot13
encoding. (This primitive encoding scheme is frequently used to obscure
potentially offensive Usenet news postings.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 354

Draft Not for publication


8283
8284
8285

Draft 0.1

Not for widespread publication

With rot13, if you encode something twice, you decode it. Therefore if the
text is encoded, g? decodes it. If it is in plain text, g? encodes it. Figure 22-11
shows how this encryption works.
This is some text to be
obscured by rot13.
~
test.txt [+]
-- VISUAL --

8286

g?
Encodes text
Repeat to decode

Guvf vf fbzr grkg gb or


bofpherq ol ebg13.
~
test.txt [+]

Figure 22-11: The g? command.

8287

The Colon (:) Commands

8288
8289
8290

The : command starts a command-mode command with a range already


specified. If you want to write a block to a file, for example, select the text using
visual mode, and then execute the following command:

8291

:write block.txt

8292

This writes the text to the file block.txt.

8293

Note: The : command only works on whole lines.

8294

Pipe (!) Command

8295
8296
8297

The ! command pipes a region of text through an external program. For


example, the !sort pipes the selection through the UNIX sort program. Figure
22-12 shows the visual ! command used to sort a range of lines.
one.c
three.c
alpha.c
two.c
four.c
~
~
~
test.txt [+]
-- VISUAL --

one.c
three.c
alpha.c
two.c
four.c
~
~
~
test.txt [+]
:<,>!sort

alpha.c
four.c
one.c
three.c
two.c
~
~
~
test.txt [+]

Define the
selection

!sort
Pipe text through
external
command
sort.

Result after
sorting.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 355

Draft Not for publication


8298

Draft 0.1

Not for widespread publication

Figure 22-12: The ! (pipe) command.

8299
8300

Note: The ! command always works on lines even if you are in character
visual mode or visual block mode.

8301

Select Mode

8302
8303
8304
8305

Select mode is yet another visual mode that allows for quick deletion or
replacement of the selected text. The way you use select mode is simple. You
highlight the text and then type <BS> to delete it. Or you can highlight the text,
and then replace it by just typing the replacement.

8306
8307
8308
8309
8310
8311

How does select mode compare with visual mode? With visual mode, you
highlight the text and then perform an operation. In other words, you need to
end the visual mode operation with a command. With select mode, the
commands are limited to <BS> (for delete) and printable characters (for
replacement). This makes things faster because you do not need to enter a
command, but it is much more limited than visual mode.

8312
8313
8314

(CTRL-H is equivalent to <BS>.)


You can choose from three select-mode flavors. The commands to start the
various flavors of the select mode are as follows:
gh
gH
gCTRL-H

Start characterwise selection.


Start linewise selection.
Start block selection.

8315
8316
8317
8318

Moving the cursor in select mode is a little more difficult than moving it in
normal visual mode because if you type any printable character, you delete the
selected text and start inserting. Therefore, to select text, you must use the
arrow, CTRL, and function keys.

8319
8320

You can also use the mouse to select text if you set the 'selectmode'
('slm') option to mouse, as follows:

8321

:set selectmode=mouse

8322
8323

(Without this option, the mouse performs a visual selection rather than a
select-mode selection.)

8324
8325

You can also use the 'selectmode' option to let the shifted cursor keys
enter select mode.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 356

Draft Not for publication

Draft 0.1

Not for widespread publication

8326

Deleting the Selection

8327
8328

The backspace command (<BS> or CTRL-H) deletes the selected text (see
Figure 22-13).

8329
8330
8331
8332
8333
8334

Oh woe to Mertle the turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.
-- SELECT --

8335
8336

gh (start select), then <Right><Right> to highlight the.

8337

<bs> deletes text

8338
8339
8340
8341
8342
8343
8344

Oh woe to Mertle turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.

8345

Figure 22-13: Deleting text in select mode.

8346

Replacing Text

8347
8348

Typing any printable character causes the selected text to be deleted and
throws Vim into insert mode (see Figure 22-14).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 357

Draft Not for publication


8349
8350
8351
8352
8353
8354

Draft 0.1

Not for widespread publication

Oh woe to Mertle the turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.
-- SELECT --

8355
8356

gh (start select), then select Mertle.

8357

Sam replaces text

8358
8359
8360
8361
8362
8363
8364
8365

Oh woe to Sam the turtle


who found web surfing quite a hurtle.
The system you see
was slower than he.
And that's not saying much for the turtle.
Figure 22-14: Replacing text in select mode.

8366

Switching Modes

8367
8368
8369

The CTRL-O command switches from selection mode to visual mode for one
command. The CTRL-G command switches to visual mode without returning. To
switch from visual mode to select mode, use the CTRL-G command.

8370

Avoiding Automatic Reselection

8371
8372
8373
8374
8375

Usually when you select text, the text remains selected. Even if you
execute a command, the selection remains. The gV command causes the
selection to disappear after the command is executed. This proves extremely
useful for macros that make a selection, do something with it, and then want it to
disappear.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 358

Draft Not for publication

Draft 0.1

Not for widespread publication

8376

Chapter 23: Advanced Commands for Programmers

8377
8378

The Vim editor was written by programmers who wanted a good text
editor.

8379
8380

Because of that, Vim includes a lot of commands you can use to customize
and enhance it to make editing programs easier.

8381
8382
8383
8384
8385

Consider, for example, the problem of the <Tab> character. You can deal
with this character in many different ways. You can set the tab stops to the
indentation size, leave them at the default eight characters, or eliminate them
altogether (force everyone to use spaces). The Vim editor supports all these
types of editing. This chapter shows you how to use each of them.

8386
8387

Previously, you saw how to turn on C indent mode. This chapter describes,
in detail, how to customize this mode.

8388
8389
8390

You have learned how to turn syntax highlighting on as well. This chapter
takes you a step further, showing you how to customize it. This chapter discusses
the following:

8391

Removing autoindents

8392

Inserting registers and indent

8393

Indentation program options

8394

Tabbing options

8395

Customizing C indentation

8396

Comparing two files

8397

Using the preview window

8398

Matching options

8399

Additional motion commands for programmers

8400

Commands for editing files in other directories

8401

Advanced :make options

8402

Customizing the syntax highlighting

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 359

Draft Not for publication

Draft 0.1

Not for widespread publication

8403

Removing an Automatic Indentation

8404
8405
8406
8407
8408

Suppose you are editing a program. You have 'autoindent' ('ai') set and
are currently indenting in about three levels. You now want to put in a comment
block. This is a big block, and you want to put it in column 1, so you need to
undo all the automatic indents. One way to this is to type CTRL-D a number of
times.

8409
8410
8411
8412
8413

Or you can use 0CTRL-D. The 0CTRL-D command in insert mode removes all
the automatic indentation and puts the cursor in column 1. (Note that when you
type the 0, it appears on the screen--at this point, Vim thinks you are trying to
insert a 0 into the text. When you type in the CTRL-D, it realizes you are
executing a 0CTRL-D command and the 0 disappears.)

8414
8415

When you use 0CTRL-D, the cursor returns to column 1 (see Figure 23-1).
The next line also starts in column 1 (normal 'autoindent' behavior).

8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433

0CTRL-D
un-indents
this line
This line is not
automatically
indented

if (flag) {
go to skip_it;
{
do something();
/* This is the start of comment block */
/* This is the second line of the block */
Figure 23-1: The 0CTRL-D command.

Suppose, however, that you are typing in a label or an #ifdef directive and
want to go to column 1 for one line only. In this case, you want the ^CTRL-D
command. This places you in column 1 for the current line only. When you enter
the next line, the indent is automatically restored (see Figure 23-2).
^CTRL-D
un-indents
this line
Automatically
indented

if (flag) {
go to skip_it;
}
#ifdef FLAG
if (flag2) {

Figure 23-2: The ^CTRL-D command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 360

Draft Not for publication

Draft 0.1

Not for widespread publication

8434

Inserting Indent

8435
8436
8437
8438
8439

The CTRL-T command is like a <Tab>, except that it inserts an indent the
size of the 'shiftwidth' option. If you use a 'shiftwidth' ('sw') of 4, for
instance, pressing <Tab> moves you to the next 8-column boundary (a 'tabstop'
('ts'), assuming that you have the default setting of 'tabstop=8'). But pressing
CTRL-T moves us you to the next 4-column boundary.

8440
8441
8442

The CTRL-T and CTRL-D commands work at any point on the line (not just
the beginning). Therefore, you can type some text and then use CTRL-T and
CTRL-D to adjust the indentation.

8443

Inserting Registers

8444
8445
8446
8447

Generally when you use CTRL-R to insert the contents of a register, the
contents are autoindented. If you do not want this to happen, use the command
CTRL-R CTRL-O register. On the other hand, if you want to insert a register and
have Vim "do the right thing," use the CTRL-R CTRL-P register command.

8448
8449

Take a look at how this works. Assume that you are editing a file that
contains the following:

8450
8451
8452
8453
8454
8455

1 int main()
2 {
3
if (x)
4
{
5
y();
6
}

8456

The following settings have been made:

8457
8458
8459

:set number
:set cindent
:set shiftwidth=4

8460
8461
8462
8463
8464
8465
8466
8467
8468
8469

You start on line 3 and do a V to enter line visual mode. Going down to line
6, you highlight the entire if block. You dump this in register a with the
command "ay. Next you add two lines at the end to start another if. Your text
now looks like this:
1 int main()
2 {
3
if (x)
4
{
5
y();
6
}

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 361

Draft Not for publication


8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
8503
8504

7
8

Draft 0.1

Not for widespread publication

if (z)
{

Register a contains the following:


if (x)
{
y();
}
Next you go into insert mode and insert the contents of register a using the
command CTRL-R a. The result is ugly:
if (x)
{
y();
}
So what happened? Register a contains indented lines. But Vim has
indenting turned on. Because you inserted the register indent and all, you
wound up with double indentation. That was not what you wanted. Go back to
where you were (CTRL-Ou, undo) and execute a CTRL-R CTRL-O a. The result is
as follows:
1 int main()
2 {
3
if (x)
4
{
5
y();
6
}
7
if (z)
8
{
9
if (x)
10
{
11
y();
12
}
This is better. You do not have the double indents. Trouble is, you still do
not have the right indent. The problem is that Vim kept the old indent from the
original text. Because this line is under the if (z) statement, however, it should
be indented an extra level. So you go back and try CTRL-R CTRL-P a.
The result is as follows:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 362

Draft Not for publication


8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516

Draft 0.1

Not for widespread publication

1 int main()
2 {
3
if (x)
4
{
5
y();
6
}
7
if (z)
8
{
9
if (x)
10
{
11
y();
12
}

8517
8518

Now Vim correctly indented the text by recalculating the indent of each
line as it was put in.

8519
8520
8521
8522
8523

In normal mode, the "{register}p command inserts the text in the


specified register into the buffer. The "{register}]p (]<MiddleMouse>)
command does the same thing, except each line has its indent adjusted.
Similarly, the "{register}]P command acts like the "{register}P command
with indent adjustment.

8524

To Tab or Not to Tab

8525
8526
8527
8528
8529
8530

Back in the early days, B.C. (before computers), there existed a


communication device called a Teletype. Some models of Teletype could do tabs.
Unfortunately, tab stops were set at every eight spaces. When computers came
along, their first consoles were Teletypes. Later, when more modern devices
(such as video screens) replaced Teletypes, the old tab size of eight spaces was
kept for backward compatibility.

8531
8532
8533
8534

This decision has caused programmers no end of trouble. Studies have


shown that the most readable indentation size is four spaces. Tab stops are
normally eight spaces. How do we reconcile these two facts? People have
chosen several ways. The three main ones are:

8535
8536
8537

1. Use a combination of spaces and tabs in your program to enter code.


If you need an indentation of 12, for example, use a tab (8) and four spaces
(4).

8538
8539
8540

2. Tell the machine that tab stops are only 4 spaces and use tabs
everywhere. (This is one solution I personally frown upon, because I do not
use the special setting and the text appears to be over-indented.)

8541
8542

3. Throw up your hands and say that tabs are the work of the devil and
always use spaces.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 363

Draft Not for publication


8543

Draft 0.1

Not for widespread publication

The Vim editor, thank goodness, supports all three methods.

8544

Spaces and Tabs

8545
8546
8547
8548
8549
8550
8551

If you are using a combination of tabs and spaces, you just edit normally.
The Vim defaults do a fine job of handling things. But you can make life a little
easier by setting the 'softtabstop' ('sts') option. This option tells Vim to
make the Tab key look and feel as if tabs were set at the value of 'softtabstop',
but use a combination of tabs and spaces to fake things (see Figure 23-3). After
you execute the following command, every time you press the Tab key the cursor
moves to the next 4-column boundary:

8552
8553
8554
8555

:set softtabstop=4
The first time you press it, however, you get 4 spaces inserted in your text.
The second time, Vim takes out the 4 spaces and puts in a tab (thus taking you to
column 8).

8556
What Was Typed

Result

<Tab>X
<Tab><Tab>X
<Tab><Tab><Tab>X
<Tab>X<Tab><Tab>X
<Tab>X<Tab><Tab><Tab>X

111111111122222222223
123456789012345678901234567890
....X
X
....X
....X
....X
....X
X

Dots represent spaces


Arrows represent tabs
8557
8558

Figure 23-3: Soft tabs.

8559

Smart Tabs

8560
8561
8562

Another related option is the 'smarttab' ('sta') option. With this option
on (:set smarttab), tabs inserted at the beginning of a line are treated like soft
tabs. The tab size used in this case is defined by the 'shiftwidth' option.

8563
8564
8565

But tabs inserted elsewhere in the text act just like normal tabs. Note that
you must have soft tabs off (:set softtabstop=0) for this option to work. Figure
23-4 shows sample results.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 364

Draft Not for publication


8566
8567
8568

Draft 0.1

Not for widespread publication

Smart indenting is a combination of soft tabs and normal tabs. When you
execute the following command, Vim treats tabs at the beginning of a line
differently:

8569

:set smarttab

8570

Suppose, for example, that you have the following settings:

8571
8572
8573

:set shiftwidth=4
:set tabstop=8
:set smarttab

8574
8575
8576
8577

Tab stops are every eight spaces and the indentation size is four spaces.
When you type <Tab> at the beginning of a line, the cursor will move over the
indentation size (four spaces). Doing a double <Tab> moves over two indention
sizes (eight spaces [4*2]).

8578
What Was Typed

Result

<Tab>X
<Tab><Tab>X
<Tab><Tab><Tab>X
<Tab>X<Tab><Tab>X
<Tab>X<Tab><Tab><Tab>X

111111111122222222223
123456789012345678901234567890
....X
X
X
....X
X
....X
X

Dots represent spaces


Arrows represent tabs
8579
8580
8581
8582

Figure 23-4: Smart tabs.


The following table shows you what happens if you type certain things at
the beginning of the line.
What's types
<Tab>
<Tab><Tab>
<Tab><Tab><Tab>
<Tab><Tab><Tab><Tab>

What's Inserted
Four spaces
One tab
One tab, four spaces
Two tabs

8583
8584
8585

When you type <Tab> anywhere else in the line, however, it acts like a
normal tab.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 365

Draft Not for publication


8586

Draft 0.1

Not for widespread publication

Using a Different Tab Stop

8587

The following command changes the size of the tab stop to 4:

8588

:set tabstop=4

8589

('ts' is the short form of 'tabstop'.)

8590
8591

You can actually change it to be any value you want. Figure 23-5 shows
what happens when 'tabstop' is set to 4.

8592
What Was Typed

Result

<Tab>X
<Tab><Tab>X
<Tab><Tab><Tab>X
<Tab>X<Tab><Tab>X
<Tab>X<Tab><Tab><Tab>X

111111111122222222223
123456789012345678901234567890
X
X
X
X
X
X
X

Dots represent spaces


Arrows represent tabs
8593
8594

Figure 23-5: tabstop set at 4.

8595
8596
8597
8598
8599

Note: Just because you change it in Vim does not mean that it will change
in your terminal window, that your printing program will not still use eightcharacter tab stops, or that other editors will use the new setting.
Therefore, your type and print commands might require special options to
handle things.

8600

No Tabs

8601
8602
8603
8604
8605

If you want absolutely no tabs in your file, you can set the 'expandtab'
('et') option. When this option is set, the <Tab> key inserts a series of spaces.
(Note that setting 'expandtab' does not affect any existing tabs. In other words,
any tabs in the document remain tabs. If you want to convert tabs to spaces, use
the :retab (:ret) command, which is explained later.)

8606
8607
8608

Note: If you really want to insert a tab when this option is on, type CTRLV<Tab>. The CTRL-V command tells Vim that you really want to insert this
<Tab> as a tab and not a bunch of spaces.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 366

Draft Not for publication


8609

Draft 0.1

Not for widespread publication

The 'copyindent' and 'preserveindent' Options

8610
8611
8612
8613
8614

If the 'preserveindent' ('pi') is set then then Vim will attempt keep
whatever indent structure you already have. (As much as possible.) For
example, if you 16 wide indent consists of 8 spaces and one <tab>, Vim will keep
what you've got. Without this option it will use two tabs.

8615
8616

If the 'copyindent' ('ci') option is set, when a new line is opened, Vim
will attempt to copy the indentation from the previous line.

8617

The :retab Command

8618
8619
8620

The :retab command transforms text with tab stops at one setting to tab
stops with another. You can use it to turn tabs into a series of spaces as well, or
a series of spaces into tabs.

8621
8622
8623
8624
8625

For example, suppose that you have a file that was created with tab stops
of 4 (:set tabstop=4). This is a non-standard setting, and you want to change
things so that the tab stops are 8 spaces. (You want the text to look the same,
just with different tab stops.) To change the tap stop in the file from 4 to 8, first
execute the command

8626

:set tabstop=4

8627

The text should appear on the screen correctly. Now execute the command

8628

:%retab 8

8629
8630

This changes the tab stops to 8. The text will appear unmodified, because
Vim has changed the white space to match the new value of 'tabstop'.

8631
8632
8633
8634

For another example, suppose that you are required to produce files with
no tabs in them. First, you set the 'expandtab' option. This causes the <Tab>
key to insert spaces on any new text you type. But the old text still has tabs in it.
To replace these tabs with spaces, execute the command

8635
8636
8637
8638

:%retab
Because you didn't specify a new tabstop, the current value of 'tabstop' is
used. But because the option 'expandtab' is set, all tabs will be replaced with
spaces.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 367

Draft Not for publication

Draft 0.1

Not for widespread publication

8639

Modelines

8640
8641
8642
8643
8644

One of the problems with all these tabbing options is that people use them.
Therefore, if you work with files created by three different people, you can easily
have to work with many different tab settings. One solution to this problem is to
put a comment at the beginning or end of the file telling the reader what tab
stops to use.

8645
8646
8647
8648
8649
8650
8651
8652

For example:
/* vim:tabstop=8:expandtab:shiftwidth=8 */
When you see this line, you can establish the appropriate Vim settings, if
you want to. But Vim is a smart editor. It knows about comments like this and
will configure the settings for you. A few restrictions apply. The comment must
be formatted in this manner and it must appear in the first or last five lines of the
program (unless you change the setting of 'modelines' ).
This type of comment is called a modeline.

8653

Shift Details

8654
8655
8656
8657

Suppose that you are typing with a shift width of 4 and you enter a line
with 3 spaces in front of it. What should the >> command do? Should it add 4
spaces in front of the line or move it to the nearest shift width. The answer
depends on the value of the 'shiftround' ('sr') option.

8658
8659

Usually this option is not set, so >> puts in 4 spaces. If you execute the
following command, >> moves the indent to the next shift-width boundary:

8660

:set shiftround

8661

Figure 23-6 shows how this works.


With "noshiftround">>moves
the text over 4 spaces

123456789012345678
size = 20
size = 20
8 spaces

With "shiftround">>moves
the text to the next "shiftwidth"
boundary. (In this case, column 8.)

123456789012345678
size = 20
size = 20
3 spaces
Column 8

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 368

Draft Not for publication


8662

Draft 0.1

Not for widespread publication

Figure 23-6: The 'shiftround' option.

8663

Specifying a Formatting Program

8664
8665
8666
8667
8668

You can define the program Vim uses when executing the = command, by
setting the 'equalprg' option. If this option is not set (and you are not editing a
lisp program), the Vim editor uses its own built-in indentation program that
indents C or C++ programs. If you want to use the GNU indent program
(available from www.gnu.org), for instance, execute this command:

8669

:set equalprg=/usr/local/bin/indent

8670
8671

Formatting Comments

8672
8673

One of the great things about Vim is that it understands comments. You
can ask Vim to format a comment and it will do the right thing.

8674
8675
8676
8677
8678
8679

Suppose, for example, that you have the following comment:


/*
* This is a test.
* Of the text formatting.
*/
You then ask Vim to format it using the following commands:

8680

1. Position the cursor to the start of the comment.

8681

2. Press v to start visual mode.

8682

3. Go to the end of the comment with the % command.

8683

4. Format the visual block with the command gq. The result is:

8684
8685
8686
8687
8688
8689
8690

/*
* This is a test. Of the text formatting.
*/
Note that Vim properly handled the beginning of each line.
(For deciding what is and is not a comment, Vim uses the 'comments'
('com') option, described in the following section.)
The gq{motion} command accomplishes the same thing.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 369

Draft Not for publication

Draft 0.1

Not for widespread publication

8691

Defining a Comment

8692
8693

The 'comments' option defines what is a comment. This option is a series


of flag:string pairs.

8694

The possible flags are as follows:


b
f
l

n
r
x

8695

Blank must follow. This means the character begins a comment only
if followed by a blank or other whitespace.
Only the first line has the comment string. Do not repeat the string
on the next line, but preserve indentation.
When used on part of a three-piece comment, make sure that the
middle lines up with the beginning or end. This must be used with
either the s or e flag.
Indicates a nested comment.
Same as l, only right-justify.
Tells Vim that a three-part comment can be ended by typing just the
last character under the following circumstances:
1. You have already typed in the beginning of the comment.
2. The comment has a middle.
3. The first character of the end string is the first character on
the line.

For three-part comments, the following flags apply:


s
m
e
number

8696
8697
8698
8699
8700

Start of three-piece comment.


Middle of a three-piece comment.
End of a three-piece comment.
Add the number of spaces (can be negative) to the
indentation of a middle part of a three-part comment.

A C comment starts with /*, has a middle of *, and ends with */, as
follows:
/*
* This is a comment
*/

8701

This results in the 'comments' option specification of

8702

set comments=s1:/*,mb:*,ex:*/

8703
8704
8705

The s1 indicates that this is the start of a three-part comment (s) and the
other lines in the command need to be indented an extra space (1). The
comment starts with the string /*.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 370

Draft Not for publication

Draft 0.1

Not for widespread publication

8706
8707
8708

The middle of the comment is defined by the mb:* part. The m indicates a
middle piece, and the b says that a blank must follow anything that is inserted.
The text that begins the comment is *.

8709
8710
8711

The ending is specified by ex:*/. The e indicates the end, and the x
indicates that you have only to type the last character of the ending to finish the
comment. The end delimiter is */.

8712
8713

Take a look at how this definition works. First, you need to set the
following option :

8714

:set formatoptions=qro

8715

371('fo' is the short version of 'formatoptions'.)

8716
8717

The following options prove useful for formatting text (see Chapter 11:
Dealing with Text Files for complete details):
q
r
o

8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733

Allow formatting of comments using gq.


Automatically insert the middle of a comment after pressing
<Enter>.
Automatically insert the middle of a comment when a line inside a
comment is opened with an O or o command.

Now start typing in comments. You start with a line containing the
comment header, /*, as follows:
/*
When you type <Enter>, because r is in the format options, you get the
following:
/*
*
The Vim editor automatically inserted the * surrounded by a space on each
side to make the comment look good. Now enter a comment and a new line:
/*
* This is an example
*
Now you need to end the comment. But Vim has already typed a space
after the asterisk. How can you enter */? The answer is that Vim is smart and
will end the comment properly if you just type /. The cursor moves back, the
slash is inserted, and you get the following:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 371

Draft Not for publication


8734
8735
8736

Draft 0.1

Not for widespread publication

/*
* This is an example
*/

8737
8738
8739

You can use a number of different formatting commands to format text or


comments. For more information on these, see Chapter 11: Dealing with Text
Files and Chapter 20: Advanced Text Blocks and Multiple Files.

8740

Customizing the C Indentation

8741

The C indentation process is controlled by the following options:


cinkeys
cink
cinoptions
cino
cinwords
cinw

8742
8743
8744

Defines how much to indent


Defines the C and C++ keywords

The 'cinkeys' option defines which keys cause a change to indentation.


The option is actually a set of type-char key-char pairs. The type-chars are as
follows:
!

*
0

8745

Defines the keys that trigger an indent event

The following key is not inserted. This proves useful when you want
to define a key that just causes the line to be re-indented. By default,
CTRL-F is defined to effect re-indentation.
The line will be re-indented before the key is inserted.
The key causes an indentation change only if it is the first character
typed on the line. (This does not mean that it is the first character on
the line, because the line can be autoindented. It specifies the first
typed character only.)

The key-chars are as follows:


<name>
^X
o
O
e
:
<^>, <<>, <>>,
<o>, <e>, <O>

8746

The named key. See Appendix B: The <> Key Names


for a list of names.
Control character (that is, CTRL-X).
Tells Vim to indent the line when you use an o
command to open a new line.
Line o, but for the O command.
Re-indent the line when you type the final e in else.
Re-indent the line when you type a colon after a label
or case statement.
The literal character inside the angle brackets.

The default value for this the 'cinkeys' option is as follows:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 372

Draft Not for publication

Draft 0.1

Not for widespread publication

8747

:set cinkeys=0{,0},:,0#,!^F,o,O,e

8748

Figure 23-7 shows how the 'cinkeys' option works.

8749
0{ - { is the first
8750
character typed on the
8751
line
8752
8753
0} - } is the first
8754
character typed on the
8755
line
8756
8757
0# - # is the first
8758
character entered
8759
on the line
8760
8761

e - Second "e" of
"else"

if (x)
{
do_it();
}
else
{

: - Colon anywhere
on the line

goto_here:
do_other();
}
#define DONE 1
Figure 23-7: The 'cinkeys' option.

8762

The 'cinoptions' Options

8763
8764
8765
8766
8767
8768
8769
8770

The 'cinoptions' option controls how much Vim indents each line. This
option consists of a series of key indent pairs. The key is a single letter that
controls what part of the program is affected (see the following table and Error:
Reference source not found and Error: Reference source not found). The indent
tells the program how much indentation to use. This can be a number of spaces
(for example, 8), or a negative number of spaces (-8). It can also be a multiple of
the 'shiftwidth' option that is specified as s. For example, 1s is a shift width,
0.5s is half a shift width, and -1s un-indents a shift width.

8771
Key
>
e

n
f
{
}

Default
Description
s
Normal shift used for indents not covered by another
letter.
0
Extra indent added to lines following a line with a curly
brace that ends a line (or more technically, one that does
not begin a line).
0
Extra indent added to single lines not inside curly braces
after an if, while, and so on.
0
Extra indent added to a function body. Includes the
outermost {} that define the function.
0
Spaces to be added to opening {.
0
Spaces to be added to closing }.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 373

Draft Not for publication


Key
^

:
=
l
b
g
h
p
t
i
+
c
C

/
(

u
U
w

W
m

Draft 0.1

Not for widespread publication

Default
Description
0
Spaces to be added to text inside a set of {} that start in
column 1. For example, a value of -1s causes the body of
a function to be pushed one shift width to the left.
s
Amount to indent a case inside a switch statement.
s
Extra indent for statements after the case statement.
0
If set to something other than zero, then align the code for
a case with the end of the case.
0
Make the break statement match the preceding case
inside a switch. (Please don't do this.)
s
Indentation for C++ protection keywords (public, private,
protected).
s
Indentation for statements that follow a protection
keyword.
s
Shift for K&R-style parameters.
s
Indent the type declaration for a function if it is on a
separate line.
s
Indent for the initializers of a C++ class.
s
Indent for continuation lines (the 2-n lines of a statement).
3
Indent the middle of a multiline comment (if no middle * is
present).
0
When non-zero indent lines as specified by the c option
even if there is text in the comment which would cause a
different indentation.
0
Indent comments lines this amount extra.
2s
Indent for a line in the middle of an expression. Actually,
the indent for a line that breaks in the middle of a set of
().
s
Indent for a line that breaks in the middle of a nested set
of () (like (, but one level deeper).
0
When non-zero do not ignore u or ( inside a set of ().
0
If non-zero and using (0 or
If non-zero and using u0 or
If non-zero and using U0 and the unmatched ( is the first
non-blank character on the line then
Align the line with the first non-blank character after the
(.
Basically, don't try to understand this, do some
experimentation to see what looks nice.
0
Inside an unmatched ( with (0 or u0, the amount to
indent.
0
If non-zero then align up the line with the ending ) with
the starting (.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 374

Draft Not for publication

M
j
)
*

Key

Default
0
0
20
30

8772
8773
8774

Draft 0.1

Not for widespread publication

Description
When set a closing ) aligns with the previous line.
Indent Java anonymous classes correctly.
Specify the number of lines to search for closing ().
Specify the number of lines to search for unclosed
comment.
If non-zero recognize Perl comments.

The following examples show what happens with various indent options.
These examples assume a 'shiftwidth' of 4. (Note dot represents space.)
cindentopt=
if (flag)
{
....do_it();
}

cindentopt=>2
if (flag)
{
..do_it();
}

cindentopt=>s2
if (flag)
{
........do_it();
}

cindentopt=
if (flag) {
....do_it();
}
else
{
....do_other();
}

cindentopt=e2
if (flag) {
..do_it();
}
else
{
....do_other();
}

cindentopt=es2
if (flag) {
........do_it();
}
else
{
....do_other();
}

cindentopt=
if (flag)
....do_it();

cindentopt=n2
if (flag)
..do_it();

cindentopt=ns2
if (flag)
........do_it();

cindentopt=
void do_it()
{

cindentopt=f2
void do_it()
..{

cindentopt=fs2
void do_it()
........{

cindentopt=
if (flag)
{

cindentopt={2
if (flag)
..{

cindentopt={s2
if (flag)
........{

cindentopt=
int foo()
{
....do_it();
}

cindentopt=^2
int foo()
{
......do_it();
}

cindentopt=^s2
if (flag)
{
............do_it();
}

cindentopt=:0

cindentopt=:2

cindentopt=:s2

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 375

Draft Not for publication

Draft 0.1

Not for widespread publication

switch (x)
{
....case 'x':
........break;
}

switch (x)
{
..case 'x':
......break;
}

switch (x)
{
........case 'x':
............break;
}

cindentopt=
case 1:
....flag = true;

cindentopt==2
case 1:
..flag = true;

cindentopt==s2
case 1:
........flag = true;

cindentopt=
switch (x) {
....case a:
........foo();
........break;
case b: {
}
}

cindentopt=l1
switch (x) {
....case a:
........foo();
........break;
....case b: {
foo(); ........foo();
break; ........break;
....}
}

cindentopt=
switch (x) {
....case a:
........foo();
........break;
}

cindentopt=b1
switch (x) {
....case a:
........foo();
....break;
}

cindentopt=
class foo {
....public:
........int i;
}

cindentopt=g2
class foo {
..public:
......int i;
}

cindentopt=gs2
class foo {
........public:
............int i;
}

cindentopt=
class foo {
....public:
........int i;
}

cindentopt=h2
class foo {
....public:
......int i;
}

cindentopt=hs2
class foo {
....public:
............int i;
}

cindentopt=
int foo(a,b)
....int a;
....int b;

cindentopt=p2
int foo(a,b)
..int a;
..int b;

cindentopt=ps2
int foo(a,b)
........int a;
........int b;

cindentopt=

cindentopt=t2

cindentopt=ts2

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 376

Draft Not for publication

Draft 0.1

Not for widespread publication

....int
foo(a,b)

..int
foo(a,b)

........int
foo(a,b)

cindentopt=
class foo:
....public class b

cindentopt=i2
class foo:
..public class b

cindentopt=is2
class foo:
........public class b

cindentopt=
a = b + c +
....d;

cindentopt=+2
a = b + c +
..d;

cindentopt=+s2
a = b + c +
......d;

cindentopt=
/*
...test
*/

cindentopt=c2
/*
..test
*/

cindentopt=cs2
/*
.......test
*/

cindentopt=
/*****
..test
*****/

cindentopt=C1,c2
/*****
..test
*****/

cindentopt=C1,cs2
/*****
.......test
*****/

cindentopt=
do_it();
/* Did it */

cindentopt=/2
do_it();
../* Did it */

cindentopt=/s2
do_it();
......../* Did it */

cindentopt=
a = (b +
........c)
c = ((c + d
.....) * (
.........e + f)
....)

cindentopt=(2
a = (b +
..c)
c = ((c + d
.....) * (
...e + f)
..)

cindentopt=(s2
a = (b +
........c)
c = ((c + d
.....) * (
.........e + f)
....)

cindentopt=
a = (b
........+ (c +
............d + e
..........))

cindentopt=u2
a = (b
........+ (c +
..........d + e
..........))

cindentopt=us2
a = (b
........+ (c +
................d + e
..........))

cindentopt=
a = (b +
........(c +
.........d + e
........))

cindentopt=U1,(2
a = (b +
..( c +
......d + e
..))

cindentopt=U1,(2s
a = (b +
........( c +
............d + e
........))

cindentopt=

cindentopt=w1,(2

cindentopt=w1,(2s

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 377

Draft Not for publication

Draft 0.1

Not for widespread publication

a = (b +
........(c +
.........d + e
........))

a = (b +
..( c +
...d + e
..))

a = (b +
........( c +
.........d + e
........))

cindentopt=(0
func(
.....arg1,
.....arg2);
another_func(arg1,
.............arg2);

cindentopt=W2,(0
func(
..arg1,
..arg2);
another_func(arg1,
.............arg2);

cindentopt=W2s,(0
func(
........arg1,
........arg2);
another_func(arg1,
.............arg2);

cindentopt=
a = (b +
....) * (d +
........) * e +
....( f + ( g *
............h) + i)

cindentopt=m1
a = (b +
) * (d +
) * e +
( f + ( g *
........h) + i)

cindentopt=
if ( a || (
............b && c
..........) ||
........d
...)

cindentopt=M1
if ( a || (
............b && c
............) ||
........d
........)

8775
8776
cindentopt=
addListener(new EventListener() {
........public void eventHandler(Event e) {
........process(e);
........}
........});
cindentopt=j1
addListener(new EventListener() {
....public void eventHandler(Event e) {
........process(e);
....}
});

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 378

Draft Not for publication

Draft 0.1

Not for widespread publication

8777

The 'cinwords' Option

8778
8779
8780

The 'cinwords' option defines what words cause the next C statement to
be indented one level in the Smartindent and cindent mode. The default value of
this option is as follows:

8781

:set cinwords=if,else,while,do,for,switch

8782

Advanced Diff Mode

8783
8784
8785

Vim's diff mode is simple to use, yet very powerful. You can also do a great
deal of customization with the editor. There are a number of ways you can start
diff mode besides using the gvimdiff command from the command line.

8786
8787
8788
8789

The first is :diffsplit {filename} (:diffs). This splits the window and
does a diff between the current file and new file you just specified. By default
this splits the window horizontally so you may want to execute the following
command to split things vertically:

8790
8791
8792
8793
8794

:vertical diffsplit {file-name}


The other way is to execute the command :diffthis (:difft). This makes
the current file part of the set of files who's differences are being displayed.
Naturally you have to execute this command for more than one file for the diffs
to appear.

8795

Next we have the :diffpatch (:diffp) command:

8796

:vertical diffpatch {patch-file}

8797
8798
8799

This runs the patch5 program on the selected file, and opens a new window
with the results. Thus you can see what applying a patch to a file is going to do
to you.

8800
8801
8802
8803

Vim knows how to run the standard GNU patch program, but if you have a
different one you can set the 'patchexpr' ('pex') to be anything you want.
When that :diffpatch command is run, Vim will evaluate this option to perform
the patch.

8804
8805
8806
8807

Vim attempts to be very good about making sure that the difference display
is keep up to date even when you change a file. However, it's not perfect. If
things get a little confused, you can always tell Vim to redo the difference
highlighting with the :diffupdate (:dif) command.

5 The patch program is a standard Linux and UNIX tool. A version for Microsoft Windows is
found in the Cygwin package.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 379

Draft Not for publication

Draft 0.1

Not for widespread publication

8808
8809
8810

Finally to take a window out of the difference set, use the :diffoff
command. The command :diffoff! performs this operation for all windows in
the current tab page.

8811

Moving from difference to difference

8812
8813
8814

The ]c command jumps forward to the next change. A [count] can be


given to jump forward multiple changes. The [c command does the same thing
only backwards.

8815

Moving Differences Around

8816
8817
8818
8819

As we've already discussed do obtains a difference from the other window,


and dp puts the current difference to the other window. The :diffget (:diffg)
and :diffput (:diffpu) commands do the same thing only they give you a little
more control

8820
8821
8822

First of all they take a range argument. All differences within that range
will be moved. For example, to take all the differences in the first 100 lines from
the current file and put them in the other file use the command:

8823

:1,100 diffput

8824
8825
8826
8827

The other advantage of :diffget and :diffput is that they take an


argument which specifies which buffer is to be considered the other file. This
can be a buffer number, or enough of a file name so that Vim can identify the
buffer.

8828
8829
8830

For example, suppose we are doing a multi-way diff between the file
main.c, main.c.v1, main.c.v2, main.c.v3. We are currently ediing main.c and
want to grab the diff from main.c.v2. For that we use the command:

8831

:diffget v2

8832

Customizing Diff

8833
8834

The 'diff' option tells Vim whether or not this file is part of the diff set. If
this option is set, the the file is part of the set, if not set (nodiff) then it is not.

8835
8836
8837

The option 'diffexpr' ('dex') contains the expression that's evaluated to


perform the diff. The variables v:fname_in, v:fname_new, v:fname_out and
should diff v:fname_in and v:fname_new and store the results in v:fname_out.

8838
8839

The 'diffopt' ('dip') option let's customize difference mode. The values
for this option include:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 380

Draft Not for publication

Draft 0.1

Not for widespread publication

Option

Meaning
Display filler lines when lines are added or deleted to keep
things aligned.
context:{number}
Display {number} lines of context around a difference.
icase
Ignore case differences
iwhite
Ignore whitespace differences
horizontal
By default split the windows horizontally in diff mode.
vertical
By default split the windows vertically in diff mode.
foldcolumn:{column} Set the number of columns to use for the folding indicator.
filler

8840
8841

Comparing Two Files The Old Fashioned Way

8842
8843
8844
8845

Suppose you want to compare two files that differ by a just a few edits and
for some reason diff mode does not appeal to you. You can do this, start by
opening two windows, one for each edit. Next, execute the following command in
each window:

8846

:set scrollbind

8847

('scb' is short for 'scrollbind'.)

8848
8849
8850
8851
8852
8853

Now when one window scrolls, so does the other. Figure 23-8
demonstrates how this command works. (Go down to line 14 in the first window;
the second window scrolls.) As you scroll through both windows, you might
encounter a place where you must move one window without moving the other.
To do so, all you have to do is execute the following command in the window you
want to move:

8854

:set noscrollbind

8855

After moving the text, then synchronize scrolling, by executing:

8856

:set scrollbind

8857

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 381

Draft Not for publication

Draft 0.1

Not for widespread publication

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Line 11
/tmp/l1.txt
Line 1
:set scrollbind
Line 2
(in bottom window) Line 3 Changed line
Line 4
Line 5
Move cursor to line Line 6
Line 7
14 in the top.
Line 8
Line 9
Bottom window
Line 10
scrolls as well.
/tmp/l2.txt
:set scrollbind
(in top window)

Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Line 11
Line 12
Line 13
Line 14
/tmp/l1.txt
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Line 11
Line 12
Line 13
/tmp/l2.txt

8858
8859
8860
8861

Figure 23-8: 'scrollbind'.


The 'scrollopt' ('sbo') option controls how 'scrollbind' works. It is a
set of the following keywords:
ver
hor
jump

Vertical scrolling
Horizontal scrolling
When switching between windows, make sure the offsets are
0.

8862

Finally, the following command synchronizes the two windows:

8863

:syncbind

8864

(:sync for short.)

8865
8866
8867
8868

Suppose, for example, that you have been looking at two versions of a file,
moving both around. To look at some things, you turned off 'scrollbind'. Now
the files point at two different places. You want to go back to synchronized
scrolling.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 382

Draft Not for publication


8869
8870
8871

Draft 0.1

Not for widespread publication

You could synchronize the windows by going to each and moving it to the
right location; you let Vim do the work. In this case, you set 'scrollbind' in
both windows and then execute the following:

8872

:syncbind

8873

Vim then synchronizes the two files.

8874

Advanced Folding

8875
8876
8877
8878
8879

There are actually a number of different ways that you can cause folding to
happen in your text. We've already discussed the manual mode where you
manually decide to open and close folds. In Chapter 7: Commands for
Programmers we also discussed the indent method where the indent level
controls what's folded.

8880
8881
8882

You can also put special markers in your text that tell Vim where to start
and stop a fold. To make this work you need to set 'foldmethod' ('fdm') to
marker.

8883
8884
8885

The 'foldmarker' ('fmr') option consists of two strings, the first starts a
fold, the second ends it. By default the value of this option is {{{,}}}. Let's
take a look at a typical text

8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896

{{{
This will be folded
}}}
This is normal
{{{
Another fold (to be hidden
}}}
Vim will display this text as
+-- 3 lines: ---------------------------------This is normal
+-- 3 lines: ----------------------------------

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 383

Draft Not for publication


8897
8898
8899
8900
8901
8902
8903
8904
8905
8906

Draft 0.1

Not for widespread publication

You can put a number after the marker to indicate the fold level. For
example:
{{{1
Folded at level 1
{{{2
Folded at level 2
}}}2
Folded at level 1
}}}1
Not folded.

8907
8908

Note: An end marker ends all folds at that level and higher. So if you
forget the }}}2, the }}}1 will close the fold.

8909
8910
8911
8912

When in marker mode, the visual command zf command not only creates
the fold, it adds the marker to the end of line. In Figure 23-9 we first highlight
three lines in visual mode then fold them with zf. (Power users can use
zf{motion} to do the same thing.)

8913
8914
8915
8916
8917

A normal line
Fold me
Fold me
Fold me
Normal again

8918

zf

8919
8920
8921
8922

A normal line
+-- 3 lines: Fold me--------------------------A normal line

8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933

zo to open the fold


A normal line
Fold me{{{
Fold me
Fold me}}}
Normal again
Figure 23-9: Creating a fold with zf
The commentstring' ('cms') option can be used to tell Vim to put the
markers inside a comment. This option is a string with a %s in side which tells
Vim where the comment should go. For example:
:set commentstring=\ Comment:%s

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 384

Draft Not for publication


8934
8935
8936
8937
8938
8939
8940

8943
8944
8945
8946
8947

Not for widespread publication

We can see the results of a zf with the 'commenstring' set in Figure 2310.
A normal line
Fold me Comment:{{{
Fold me
Fold me Comment:}}}
Normal again

8941
8942

Draft 0.1

Figure 23-10: zf with 'commentstring' set.


Similarly the zd command will delete the markers.
Additional fold commands
The [count]zF command will create a fold for [count] lines.
The :fold (:fo) command will fold a range of lines. For example to fold
the first 10 lines of a file use the command:
:1,10 fold

8948
8949

The zd command deletes a fold, but will not delete nested folds. The zD
command deletes all folds recursively for the fold under the cursor.

8950
8951

If you want to see all the text that in the window, the zE command will
open all the folds visible on the screen when you execute this command.

8952
8953

The zo command opens a single fold. The zO command opens all the folds
under the cursor.

8954
8955
8956

A fold can also be opened with the :foldopen (:foldo) command. All folds
within the line range specified are opened one level. If the override (!) option is
used, all levels are opened.

8957
8958

The zc command closes one level of fold around where the cursor is
located. The zC command closes them all.

8959
8960
8961

A fold can also be closed with the :foldclose (:foldc) command. All
folds within the line range specified are closed one level. If the override (!)
option is used, all levels are closed.

8962

Toggling folds

8963
8964
8965

So zo opens a fold and zc closes. The za command will open a fold if it's
closed and close it if it's open. This works on one level of folding. To toggle all
the levels at once, use the zA command.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 385

Draft Not for publication

Draft 0.1

Not for widespread publication

8966

Enabling and disabling folding

8967
8968
8969

The 'foldenable' ('fen') option enables folding. If it is turned off


('nofoldenable') no folding can be done. The zn command turns this option off,
zN turns it on, and zi (fold invert) toggles it.

8970

Moving around folds

8971
8972
8973
8974
8975

You can use the normal movement commands to go up and down the
screen. If you want to jump from fold to fold, use the [z command to move to
the start of the current fold (obviously the fold must be open). The ]z command
moves to the end of the fold. The zj command moves down to the start of the
next fold and zk moves up to the end of the previous one.

8976

Executing a command for all folds

8977
8978
8979

The :folddoopen (:foldd) [fold do open] command executes a single


command for every open fold. For example, to comment out a all sections of
code except the stuff in a closed fold execute the command:

8980

:% folddoopen s/^/\/\//

8981
8982
8983

Note that in this command we use a range (%) to tell the command to work
on the entire file. If we wanted to just affect the lines in a closed fold we would
use the command :folddoclosed (:folddoc).

8984

Customizing folds

8985
8986

The 'foldtext' ('fdt') option controls how the text for a fold is displayed.
The following variables are set during the execution of this function:

8987

v:foldstart

First line folded (this fold)

8988

v:foldend

Last line folded (this fold)

8989
8990

v:folddashes

String to be put at the beginning of each fold (you


can set this)

8991

v:foldlevel

The folding level

8992
8993

The 'foldcolumn' ('fdc') option tells Vim what column to display the fold
information in. It's value must be between 0 and 12.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 386

Draft Not for publication

Draft 0.1

Not for widespread publication

8994
8995
8996

The 'foldminlines' ('fml') option controls the minimum number of lines


that can be folded. If a fold is smaller that 'foldminlines' it will not be
displayed.

8997
8998

The 'foldnestmax' ('fdn') option controls the maximum nesting level of


the folds.

8999

Controlling what opens and closes folds

9000
9001

The 'foldopen' ('fdo') option is a set of keywords that define when a


command will open a fold. It can be any set of the following keywords:
Keyword
all
block
hor
insert
jump
mark
percent
quickfix
search
tag
undo

Meaning
Any command
Any block movement command such as (, {, [[, or [{.
Any horizontal movements such as l, w, or fx.
Any command that starts an insert.
Any command that performs a major jump such as G or gg.
Jumping to a mark.
The % command
Any quick fix command such as :cc or :cn.
Any search such as /, ?, or n.
Jumping to a tag with a CTRL-] or :tag command.
The undo or redo command.

9002
9003
9004
9005

The 'foldclose' ('fcl') option tells Vim when to automatically close a


fold. It can be set to empty in which case any folds that are automatically
opened are never closed, or to any in which case, all folds where are opened
automatically are closed when the cursor leaves the fold.

9006

Fold Methods

9007
9008

There are many different ways folds can be created. This is controlled by
the 'foldmethod' ('fdm') options.

9009

The methods are:

9010
9011
9012
9013

diff

Folds are created as part of diff operation. (See the


section Diff Mode in Chapter 8: Basic
Abbreviations, Keyboard Mapping, and
Initialization Files.)

9014

expr

Folds are controlled by an expression.

9015

indent

Folds are controlled by indentation level.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 387

Draft Not for publication

Draft 0.1

Not for widespread publication

9016

manual

Folds are created manually.

9017

marker

Markers in the text tell Vim where to fold things.

9018
9019

syntax

The syntax highlighting rules tell Vim where to


make the folds.

9020
9021
9022
9023
9024
9025

When the 'foldmethod' is set to syntax, then any syntax elements which
have the fold option on them are folded. For example in the C language to fold
all the stuff between #if 0 and #endif, Vim uses the following syntax rule:
:syn region cCppOut
\
start="^\s*\(%:\|#\)\s*if\s\+0\+\>"
\ end=".\@=\|$" contains=cCppOut2 fold

9026
9027
9028

When 'foldmethod' is set to expr then the expression in the 'foldexpr'


('fde') is evaluated to get the fold level. Creating such a function is a
challenging bit of Vim programming and is beyond the scope of this book.

9029

The Preview Window

9030
9031
9032
9033

Suppose you are going through a program and find a function call that you
do not understand. You could do a CTRL-] on the identifier and jump to the
location represented by the tag. But there is a problem with this. The current
file disappears because the file with the function definition replaces it.

9034
9035
9036

A solution to this is to use a special window called the "preview" window.


By executing the following command, you open a preview window and display
the function definition:

9037

:ptag function

9038

(:pt is the short form of this command.)

9039
9040
9041
9042
9043
9044

(If you already have a preview window up, it is switched to the definition of
the function.) Figure 23-11 shows a typical example. Assume that you have just
executed the following command:
:ptag copy_p_data
After you have finished with the preview window, execute the following
command:

9045

:pclose

9046

(:pc, CTRL-W CTRL-Z, CTRL-Wz accomplish the same thing.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 388

Draft Not for publication


9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062

Not for widespread publication

assert((*the_data->n_data_ptr) <1000);
return (result);
}
/* Create data from a db data record */
void copy_p_data(
struct p_data *the_data,
const datum db_data
){
the_data->n_data_ptr = (int*)&the_data->raw_data[0];
set_datum(the_data, db_data);
}
/mnt/sabina/sdo/tools/local/proto/p_data.c [Preview]
copy_p_data(&cur_entry, cur_value);
pq.c

9063
9064
9065

Draft 0.1

Figure 23-11: :ptag example.


A whole set of commands is designed to manipulate the file in the preview
window. The commands are as follows:
:pedit [!] [++opt] [+cmd] {file}
:ped [!] [++opt] [+cmd] {file}
:ppop
:pp
:ptselect identifier
:pts identifier
:ptjump identifier
:ptj identifier
:[count] ptnext
:[count] ptn
:[count] ptprevious
:[count] ptp
:[count] ptNext
:[count] ptN
:[count] ptrewind
:[count] ptr
:[count] ptfirst
:[count] ptf
:ptlast
:ptl
CTRL-W}
CTRL-Wg}
CTRL-W CTRL-G }

Open a preview window and do an


:edit (:e) command in it.
Do a :pop command in the preview
window.
Open a preview window and do a
:tselect.
Open a preview window and do a
:tjump.
Do a :[count] tnext in the preview
window.
Do a :[count] tprevious in the
preview window.
Do a :[count] trewind in the
preview window.
Do a :tlast in the preview window.
Do a :ptag on the word under the
cursor.
Do a :ptjump on the word under the
cursor.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 389

Draft Not for publication

Draft 0.1

Not for widespread publication

9066
9067

Vim also sets the option 'previewwindow' ('pvw') to indicate that the
window is the preview window.

9068

Match Options

9069
9070

The 'matchpairs' ('mps') option controls what characters are matched by


the % command. The default value of this option is as follows:

9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081

:set matchpairs = (:),{:},[:]


This tells Vim to match pairs of (), [], and {}. To match <> (useful if you
are editing HTML documents), for example, use the following command:
:set matchpairs=<:>
This matches just <> pairs. If you want to match <> in addition to the other
characters, you need this command:
:set matchpairs=(:),{:},[:],<:>
This is a little long and awkward to type. The += flavor of the :set
command adds characters to an option. Therefore, to add <> to the match list,
use the following command:
:set matchpairs+=<:>

9082

Showing Matches

9083
9084
9085

If you execute the following command, when you enter any type of bracket
( (, ), [, ], {, }), Vim will cause the cursor to jump to the matching bracket
briefly when entering:

9086

:set showmatch

9087

('showmatch' can be abbreviated as 'sm')

9088
9089
9090

Generally this jump lasts only for a half second, but you can change it with
the 'matchtime' ('mat') option. If you want to make it 1.5 seconds, for
instance, use the following command:

9091

:set matchtime=15

9092

The value of this option is 1/10 second.

9093

Finding Unmatched Characters

9094
9095
9096

The [{ command finds the previous unmatched { (see Figure 23-12). The ]
{ command finds the next unmatched {. Also, [} finds the next unmatched },
whereas ]} finds the previous unmatched }.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 390

Draft Not for publication


9097
9098
9099
9100
9101
9102
9103

int main()
{
if (flag) {
do_part2();
do_part1();
return (0) ;
}

9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116

Draft 0.1

Not for widespread publication

[{

Figure 23-12: The [{ command.


The ]) command finds the next unmatched ). The [( finds the previous
unmatched (. The command [# finds the previous unmatched #if or #else (see
Figure 23-13). The command ]# finds the next unmatched conditional.
#ifdef FOO
#
define SIZE 1
#else /* FOO */
#
ifdef BAR
#
define SIZE 20
#
else /* BAR */
#
define SIZE 30
#
define WIDTH 10
#endif

[#

9117

Figure 23-13: The [# command.

9118
9119
9120

These commands are not that reliable because matching by mechanical


means is impossible. It is possible to tell that you have three { and two }, but
Vim can only guess at which { is missing a }.

9121

Method Location

9122

The following commands move to the beginning or end of a Java method:


[m
[M
]m
]M

Search
Search
Search
Search

backward for the start of a method.


backward for the end of a method.
forward for the start of a method.
forward for the end of a method.

9123

Movement

9124
9125
9126
9127

Several movement commands are designed to help programmers navigate


through their text. The first set finds the characters { and } in column 1. (This
usually indicates the start of a procedure, structure, or class definition.) The
four curly brace-related movement commands are as follows:
count [[

Move backward to the preceding { in column 1.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 391

Draft Not for publication

9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140

Not for widespread publication

Move backward to the preceding } in column 1.


Move forward to the next { in column 1.
Move forward to the next } in column 1.

count []
count ]]
count ][
9128

Draft 0.1

Figure 23-14 shows how these commands work.


int sub1 (void)
{
return (1);
}
int sub2 (void)
{
return (2);
}
int sub3 (void)
{
return (3);
}

[]
[[
Cursor starts here
][
]]

9141

Figure 23-14: Curly brace movement commands.

9142

Comment Moves

9143
9144
9145
9146

The commands [/ and [* move you backward to the start of the first C
comment it can find. The commands ]/ and ]* move you forward to the end of
the next C comment it can find. Figure 23-15 illustrates some simple comment
motions.

9147
9148
9149
9150
9151
9152
9153
9154
9155

[/
Cursor starts here
]/

/*
* Comment.
*/
int a;
int b;
/*
* Comment.
*/
Figure 23-15: Comment motions.

9156

Dealing with Multiple Directories

9157
9158
9159
9160
9161
9162

As programming projects grow larger and larger, you might find it


convenient to organize things in different directories. Take a look at a small
project. You have a main directory that contains main.c and main.h. The other
directory is lib and it contains lib.c and lib.h. (This naming has no imagination,
but it does make a good example.) Figure 23-16 shows this example
organization.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 392

Draft Not for publication

Draft 0.1

Not for widespread publication

9163

prog

main.c
main.h

9165
9166
9167
9168

lib.c
lib.h

Figure 23-16: File layout.


You start editing in the directory main. The first thing you need to do is
tell Vim about your new directory. You use the :set ^= (:se ^=) command to
put the directory at the top of the search path with the following command:

9169

:set path ^= ../lib

9170

('path' can be abbreviated 'pa'.)

9171

Suppose you are editing the file main.c. The file looks like this:

9172
9173
9174
9175
9176
9177
9178
9179
9180

#include "main.h"
#include "lib.h"
int main(int argc, char *argv[])
Now you need to check out a subroutine declaration in lib.h. One way of
going to that file is to execute the following command:
:vi ../lib/lib.h
This assumes you know where lib.h resides. But there is a better way.
First, you position the cursor over the filename in the following line:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 393

Draft Not for publication


9181

Draft 0.1

Not for widespread publication

#include "lib.h"

9182
9183
9184
9185

Now you execute the command gf. The Vim editor tries to edit the
filename which is under the cursor. The editor searches for the file in each
directory in the path variable. In this case it will find the file even though it lives
in another directory.

9186
9187
9188

Suppose, however, that you want to edit the file lib.c. This name does not
appear in the text, so you cannot use the gf command. Instead, you execute the
following command:

9189

:find lib.c

9190

(:fi is the diminutive form of :find.6)

9191
9192
9193

This acts just like the :vi command, except the editor searches for the file
along the path. The following command does the same thing, but it splits the
window and then does a :find :

9194

:sfind lib.c

9195

(:sf is the abbreviation for :sfind.)

9196
9197
9198
9199

The gf command acts like a :find command but use the word under the
cursor as the name of the file to edit. If there is more than one file along the
'path' that matches the given file name, then you can select which one Vim
edits by giving the gf command a count.

9200
9201
9202

In other words if you position the cursor on the name param.h and execute
the command 2gf, Vim will edit the second param.h file it finds looking through
the directories specified by the 'path' option.

9203
9204

The ]f and [f command are older, depreciated versions of the gf


command.

9205
9206
9207

The Java language is a little funny. The syntax of the import directive is
designed to decouple the name of the imported class from the file system. So the
directive:

9208
9209
9210
9211
9212
9213

import com.steve.database;
actually refers to the file com/steve/database.java. To handle this Vim uses
two options. The first 'includeexpr' ('inex') defines an expression that Vim
uses to translate names in the text to file names. The second 'suffixesadd'
('sua') defines the suffixes to add to a name in the text to convert it to a file
name for the gf command.
6 I'm sorry but with all these abbreviations, I'm running out of ways to describe them.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 394

Draft Not for publication

Draft 0.1

Not for widespread publication

9214

The include Path

9215
9216

2The 'path' ('pa') option is used by Vim to tell it where to look for files that
were included in the current file. The format of this option is as follows:

9217

:set path=directory,directory,...

9218

The parameter directory is a directory to search. For example:

9219

:set path=/usr/include,/usr/X11R6/include

9220

You can use wildcards (*) in any directory of the path specification:

9221

:set path=/usr/include,/usr/include/*

9222

There are a number of special directories:

9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238

Match an entire tree. For example:

**

:set path=/usr/include/**
This command searches /usr/include and all its subdirectories.
The following path specification searches the files in any
directory that starts with /home/oualline/progs and ends with
include:
:set path=/home/oualline/progs/**/include ""
<empty>
The empty string indicates the current directory. (For example,
the middle directory of the trio first,, last.)
. (dot)
The directory in which the file being edited resides.
For example, the following command tells Vim to search /usr/include and
all it is subdirectories, the directory in which the file resides (.), and the current
directory (,,).
:set path=/usr/include/**,.,,

9239

Checking the Path

9240
9241

To make sure that you can find all the #include files, you can execute the
following command:

9242

:checkpath

9243

(:che for short.)


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 395

Draft Not for publication


9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279

Draft 0.1

Not for widespread publication

This command works not only on the #include directives in the file you are
editing, but also on any files that they #include and so on. The result is that all
#include files are checked.
Figure 23-17 shows how this command works.
In this case, a number of files include the files stddef.h and stdarg.h. But
Vim cannot find these files. If you want to tell Vim to search the Linux-specific
include directory, you can execute the following command:
:set path+=/usr/include/linux
get_rel_name(&cur_entry, i),
get_full_name(&cur_entry, i));
}
if (gdbm_errno != 0) {
-- Included files not found in path -/usr/include/stdio.h <stddef.h>
<stdarg.h>
/usr/include/bits/types.h -<stddef.h>
/usr/include/libio.h -/usr/include/_G_config.h -<stddef.h>
<stdarg.h>
/usr/include/bits/stdio-lock.h -/usr/include/pthread.h -/usr/include/sched.h -/usr/include/time.h -<stddef.h>
/usr/include/stdlib.h -<stddef.h>
/usr/include/sys/types.h -<stddef.h>
/usr/include/alloca.h -<stddef.h>
/usr/include/string.h -<stddef.h>
Press RETURN or enter command to continue

9280

Figure 23-17: The :checkpath command.

9281

Now do another:

9282

:checkpath

9283

Figure 23-18 shows the results.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 396

Draft Not for publication


9284
9285
9286
9287
9288
9289
9290
9291

Figure 23-18: :checkpath with all files found.


This command lists only the files that cannot be found. If you want to list
all #include files, use this command:

9295

:checkpath!

9296

Figure 23-19shows the results.

9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318

Not for widespread publication

for (i = 0; i < *cur_entry.n_data_ptr; i++) {


printf("\t%d %s (%s)\n",
(int)get_flags(&cur_entry, i),
get_rel_name(&cur_entry, i),
get_full_name(&cur_entry, i));
}
if (gdbm_errno != 0) {
All included files were found

9292
9293
9294

Draft 0.1

Included files in path


<stdio.h>
/usr/include/stdio.h >
<features.h>
/usr/include/features.h >
<sys/cdefs.h>
/usr/include/sys/cdefs.h >
<features.h> (Already listed)
<gnu/stubs.h>
<stddef.h>
<stdarg.h>
<bits/types.h>
/usr/include/bits/types.h >
<features.h> (Already listed)
<stddef.h> (Already listed)
<bits/pthreadtypes.h>
/usr/include/bits/pthreadtypes.h >
<bits/sched.h>
<libio.h>
/usr/include/libio.h >
More
Figure 23-19: The :checkpath! command.

9319

Defining a Definition

9320
9321
9322
9323

The Vim editor knows about C and C++ macro definitions. But what about
other languages? The option 'define' ('def') contains the regular expression
that Vim uses when it looks for a definition. To have Vim look for macros that
start with the string function, for instance, use the following command:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 397

Draft Not for publication


9324

Draft 0.1

Not for widespread publication

:set define=function

9325

Locating include Files

9326
9327
9328

The 'include' ('inc') option defines what an include directive looks like.
This option is used for the ]CTRL-I, [CTRL-I, ]d, and [d searches that look
through #include'd files.

9329
9330
9331
9332
9333

In Java you specify packages. The package names happen to look a lot like
file names except that the slashes (/) have been changed to dots (.). In order to
make transformation from Java package to actual file path, Vim uses the value of
the 'includeexpr' ('inex') to change the name in the program to a name that
the file system understands.

9334
9335

This option is used for the :checkpath command as well. Like the
'define' option, the value of this option is a regular expression.

9336
9337

The [i command searches for the first occurrence of the word under the
cursor. Text inside comments is ignored.

9338
9339

The ]i command searches for the next occurrence of the word under the
cursor. Again, text inside comments is ignored.

9340
9341
9342

The [I command lists all the lines which contain the keyword under the
cursor. (Comments ignored.) The ]I command does the same thing starting at
the current cursor location.

9343

Multiple Error Lists

9344
9345
9346

The :make (:mak) command generates an error list. The Vim editor
remembers the results of your preceding 10 :make , :grep, :gr, :vimgrep or
:vim commands. To go to a previous error list, use the following command:

9347

:colder

9348

(or :col.)

9349

To go to a newer one, use this command:

9350

:cnewer

9351

(or :cnew.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 398

Draft Not for publication

Draft 0.1

Not for widespread publication

9352

Manipulating the quick fix list

9353
9354

The :cfile (:cf) command takes a file and loads it into the quick fix list.
For example:

9355

:cfile error-list.log

9356
9357

The :caddfile (:caddf) does the same thing only the file is added to the
quick fix list.

9358
9359

There are a whole lot of other commands that change the contents of the
quick fix list. These are:
Command

Add or
Replace

Jump or
No Jump

Description

:cfile {file}
:cf {file}

Replace

Jump

Replace error list with file.

:cgetfile {file}
:cg {file}

Replace

No Jump

Replace error list with file.

:caddfile {file}
:caddf {file}

Adds

No Jump

Add file to error list.

:cbuffer {buffer}
:cb {buffer}

Replace

Jump

Replace error list with buffer.

No Jump

Replace error list with buffer.

:cgetbuffer {buffer} Replace


:cgetb {buffer}
:caddbuffer {file}
:cad {biffer}

Adds

No Jump

Add buffer to error list.

:cexpr {expr}
:cex {expr}

Replace

Jump

Replace error list with the


expression.

:cgetexpr {expr}
:cgetx {expr}

Replace

No Jump

Replace error list with


expression.

:cadexpr {expr}
:cadde {expr}

Adds

No Jump

Add the expression to error


list.

9360

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 399

Draft Not for publication

Draft 0.1

Not for widespread publication

9361

Local error lists

9362
9363
9364
9365
9366

Vim actually maintains two different types of lists. So far we've been using
the error list which is the same no matter what the current buffer is. There is
also a local list which is local to a buffer. The two are very similar and all of the
error list commands have local list equivalents. The following tables lists the
various commands.

9367
Error
List
Command

Location
List
Command

Description

:cc

:ll

Display current error.

:cn
:cnext

:lne
:lnext

Display next error.

:cN
:cNext
:cp
:cprevious

:lN
:lNext
:lp
:lprevious

Display previous error.

:cnf
:cnfile

:lnf
:lnfile

Display first error in the next file.

:cNf
:cNfile
:cpf
:cpfile

:lNf
:lNfile
:lpf
:lpfile

Display last error in the previous file.

:cr
:crewind
:cfir
:cfirst

:lr
:lrewind
:lfir
:lfirst

Display the first error.

:cla
:clast

:lla
:llast

Display the last error.

:cf
:cfile

:lf
:lfile

Read errors from a file. Jump to first.

:cg
:cgetfile

:lg
:lgetfile

Read errors from a file. No jump.

:caddf
:caddfile

:laddf
:laddfile

Add lines from a file to the error list

:cb
:cbuffer

:lb
:lbuffer

Read errors from a buffer. Jump to first

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 400

Draft Not for publication

Draft 0.1

Not for widespread publication

:lgetb
:cgetb
:cgetbuffer :lgetbuffer

Read errors from a buffer. No jump.

:laddb
:cad
:caddbuffer :laddbuffer

Add lines from a buffer to the error list.

:cex
:cexpr

:lex
:lexpr

Create error list from expression. Jump to first

:cgete
:cgetexpr

:lgete
:lgetexpr

Create error list from expression. No jump.

:cadde
:caddexpr

:lad
:laddexpr

Add expression to the error list.

:cl
:clist

:lli
:llist

List errors

:cope
:copen

:lop
:lopen

Open a window containing the error list

:ccl
:cclose

:lcl
:lclose

Close the error list window

:cw
:cwindow

:lw
:lwindow

Open the quick fix window if needed.

:col
:colder

:lol
:lolder

Go to older error list

:cnew
:cnewer

:lnew
:lnewer

Go to newer error list

:mak
:make

:lmak
:lmake

Run the make program and capture the results.

:vim
:vimgrep

:lv
:lvimgrep

Generate results using the internal grep

:vimgrepa : :
Add grep results to the list
vimgrepadd lvimgrepa
:lvimgrepadd
:gr
:grep

:lgr
:lgrep

Run the external grep comamnd and capture the


results

:grepa
:grepadd

:lgrepa
:lgrepadd

Run the external grep command and add the result


to the quick fix list

:tag
:ta

:ltag
:lt

Jump to a given tag.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 401

Draft Not for publication

Draft 0.1

Not for widespread publication

9368

Customizing the :make Command

9369
9370
9371

The name of the program to run when the :make command is executed is
defined by the 'makeprg' ('mp') option. Usually this is set to make, but Visual
C++ users should set this to nmake by executing the following command:

9372
9373
9374
9375
9376
9377

:set makeprg=nmake
The :make command redirects the output of make to an error file. The
name of this file is controlled by the 'makeef' ('mef') option. If this option
contains the characters ##, the ## will be replaced by a unique number. The
default value for this option depends on the operating system you are on. The
defaults are as follows: Amiga UNIX : Microsoft Windows and others
Amiga
UNIX, Linux, FreeBSD
Microsoft Windows and others

9378
9379
9380

t:vim##.Err
/tmp/vim##.err
vim##.err

You can include special Vim keywords in the command specification. The %
character expands to the name of the current file. So if you execute the
command

9381

:set makeprg=make\ %

9382

and you do a

9383

:make

9384

it executes the following command:

9385
9386
9387

$ make file.c
The parameter file.c is the name of the file you are editing. This is not too
useful, so you will refine

9388

the command a little and use the :r (root) modifier:

9389

:set makeprg=make\ %:r.o

9390

Now if you are editing file.c, the command executed is as follows:

9391

$ make file.o

9392

The Error Format

9393
9394
9395

The option 'errorformat' ('efm') controls how Vim parses the error file
so that it knows the filename and line number where the error occurred. The
format of this option is as follows:

9396

:set errorformat=string,string,string

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 402

Draft Not for publication


9397
9398
9399

9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417

9418
9419
9420

Filename
Line number
Column
Error type (a single character)
Error number
Error message
Matches the remainder of the line
Matches (and skips) any scanf conversion specified by char.
The character %

When compiling a program, you might traverse several directories. The


GNU make program prints a message when it enters and leaves a directory. A
sample make log looks like this:
make[1]: Entering directory '/usr/src/linux-2.2.12'
make -C kernel fastdep
make[2]: Entering directory '/usr/src/linux-2.2.12/kernel'
/usr/src/linux/scripts/mkdep sysctl.c time.c > .depend
make[2]: Leaving directory '/usr/src/linux-2.2.12/kernel'
make -C drivers fastdep
make[2]: Entering directory '/usr/src/linux-2.2.12/drivers'
/usr/src/linux/scripts/mkdep > .depend
make[3]: Entering directory '/usr/src/linux-2.2.12/drivers'
make -C block fastdep
make[4]: Entering directory '/usr/src/linux-2.2.12/drivers/block'
/usr/src/linux/scripts/mkdep xd.c xd.h xor.c z2ram.c > .depend
make _sfdep_paride _FASTDEP_ALL_SUB_DIRS=" paride"
make[5]: Leaving directory '/usr/src/linux-2.2.12/drivers/block'
make[4]: Leaving directory '/usr/src/linux-2.2.12/drivers/'

To get the filename right Vim needs to be aware of this change. The
following error format specifications are used to tell Vim about directory
changes:
%D
%X

9421
9422

Not for widespread publication

The string is a typical error message with the special character % used to
indicate special operations (much like the standard C function scanf). The
special characters are as follows:
%f
%l
%c
%t
%n
%m
%r
%*char
%%

9400
9401
9402

Draft 0.1

Specifies a message printed on entering a directory. The %f in this


string indicates the directory entered.
Specifies the leave directory message. The %f in this string specifies
the directory that make is done with.

Some compilers, such as the GNU GCC compiler, output very verbose error
messages. The GCC error message for an undeclared variable is as follows:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 403

Draft Not for publication

Draft 0.1

Not for widespread publication

9423
9424
9425
9426

tmp.c: In function 'main':


tmp.c:3: 'i' undeclared (first use in this function)
tmp.c:3: (Each undeclared identifier is reported only once
tmp.c:3: for each function it appears in.)

9427
9428
9429
9430

If you use the default Vim 'errorformat' settings, this results in three
error messages. This is really annoying. Fortunately, the Vim editor recognizes
multiline error messages. The format codes for multiline error messages are as
follows:
%A
%E
%W
%C
%Z
%G
%O
%P
%Q

9431

Start of a multiline message (unspecified type)


Start of a multiline error message
Start of a multiline warning message
Continuation of a multiline message
End of a multiline message
Global; useful only in conjunction with + or Single-line file message: overread the matched part
Single-line file message: push file %f onto the stack
Single-line file message: pop the last file from stack

A + or - can precede any of the letters. These signify the following


%-letter
%+letter

9432
9433
9434

Do not include the matching line in any output.


Include the whole matching line in the %m error string.

Therefore, to define a format for your multiline error message, you begin
by defining the start message. This matches the following:
tmp.c:3: 'i' undeclared (first use in this function)

9435

The error message specification is:

9436

%E%f:%l:\ %m\ undeclared\ (first\ use\ in\ this\ function)

9437

Note the use of \ to tell Vim that the space is part of the string.

9438
9439
9440

Now you have a problem. If you use this definition, the %m will match just
'i'. You want a longer error message. So you use + to make Vim put the entire
line in the message:

9441

%+E%f:%l:\ %m\ undeclared\ (first\ use\ in\ this\ function)

9442

The middle matches this:

9443

tmp.c:3: (Each undeclared identifier is reported only once

9444

This translates into the error string:

9445

%-C%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once

9446
9447

Note the use of the - modifier to keep this message out of the list of
messages.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 404

Draft Not for publication


9448
9449

Draft 0.1

Not for widespread publication

The end of the error is as follows:


tmp.c:3: for each function it appears in.)

9450

which results in the string:

9451

%-Z%f:%l:\ for\ each\ function\ it\ appears\ in.)

9452

So you add these three lines to the error format:

9453
9454
9455

%+E%f:%l:\ '%*\k*'\ undeclared\ (first\ use\ in\ this\ function),


%-C%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,
%-Z%f:%l:\ for\ each\ function\ it\ appears\ in.)

9456
9457
9458
9459

Now this works, but there is a slight problem. When the GNU compiler
encounters the second undefined variable, it does not output the three-line
message. Instead, it outputs just the first line. (It figures you have already seen
the stuff in parenthesis, so why output it again.)

9460
9461
9462

Unfortunately, your error specification tries to match all three lines.


Therefore, you need a different approach. The solution is to globally tell Vim to
forget about the second two lines:

9463
9464
9465
9466

%-G%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once


%-G%f:%l:\ for\ each\ function\ it\ appears\ in.)

Now all you have to do is to add this option to your .vimrc file. You can just
add them on to the 'errorformat' option by using the following command:

9467
9468
9469
9470

" This will not work


:set errorformat+=
\%-G%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,
\%-G%f:%l:\ for\ each\ function\ it\ appears\ in.)

9471
9472
9473

Note that in Vim, continuation lines start with a backslash (\). Also, you
have added a comma at the end of the first error message to separate it from the
second.

9474
9475
9476
9477
9478

There is only one problem with this technique: It doesn't work. The
problem is that Vim goes through the list of strings in 'errorformat' in order,
stopping on the first one that matches. We are appending our messages to the
existing list of messages, and the error string for the GNU compiler (%f:%l:%m)
is defined before us.

9479
9480
9481

It is matched first, and therefore you never get to your two new error
messages. You need to put the more specific matches (your two new messages)
at the beginning. This is accomplished with the following command:

9482
9483
9484

" This will work


:set errorformat ^=
\%-G%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 405

Draft Not for publication


9485

Draft 0.1

Not for widespread publication

\%-G%f:%l:\ for\ each\ function\ it\ appears\ in.)

9486
9487

list.

Remember, the :set ^= command adds the string to the beginning of the

9488

The 'switchbuf' Option

9489
9490
9491
9492
9493
9494

Normally when you do a :make and errors occur,Vim will display the
offending file in the current window. If you set the 'switchbuf' ('swb') option
to split, then the editor will split the current window displaying the bad file in
the new window. Note the 'switchbuf' option can have the values: ''(nothing),
'split,useopen' and 'split,useopen'." For a description of the useopen
argument see Chapter 5: Windows and Tabs.
# Makefile
INC=-I/usr/include/scsi
all: dlt-status
dlt-status: dlt-status.cpp
g++ $(INC) -Wall -g
-o dlt-status
dlt-status.cpp

const int EX_LOG_SENSE = 0x4D;


switchbuf= static int raw = 0;
static int raw = 0;
static int fd;
enum page_code {
P_SUPPORTED = 0x00,
/* Get supported pages */
const int EX_LOG_SENSE = 0x4D;

switchbuf=split

static int raw = 0;


static int raw = 0;
static int fd;
dlt-status.cpp
# Makefile
INC=-I/usr/include/scsi
all: dlt-status
Makefile

9495

Figure 23-20: The 'switchbuf' option.

9496

Customizing :grep

9497
9498
9499

The :grep (:gr) command runs the program specified by the 'grepprg'
('gp') option. This option contains the command line to use. The # and %
characters will be expanded to be the names of the current and alternate file.

9500
9501
9502
9503

Also the string $* will be replaced by any arguments to the :grep


command. Note that on UNIX, the 'grepprg' defaults to grep -n. On Microsoft
Windows, it defaults to findstr/s. The capabilities of these two programs differ
vastly.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 406

Draft Not for publication

Draft 0.1

Not for widespread publication

9504
9505

The :grep command uses the 'grepformat' option to tell Vim how to parse
the output of grep. (It uses the same format as the 'errorformat' option.)

9506

Defining How a Tag Search Is Done

9507
9508
9509

Usually Vim does a binary search for a given tag name. This makes things
quick if the tag file is sorted. Otherwise, a linear search is performed. To force
a linear search, use this command:

9510

:set notagbsearch

9511

(The sort form of the 'tagbsearch' option is 'tagb'.)

9512

The 'notagbsearch' option is useful if your tag file is not sorted.

9513
9514
9515

Some systems limit the number of characters you can have in a function
name. If you want this limit to be reflected in Vim, you can set the 'taglength'
('tl') option to the maximum length of your function names.

9516
9517

You specify the name of the tags file with the 'tags' ('tag') option. This
can be made to point to a file in another directory. For example:

9518

:set tags+=/home/oualline/tools/vim/tags

9519
9520
9521

But this causes a little confusion. Did you start in the current directory
and tell ctags to put the tag file in the directory /home/oualline/tools/vim or did
you execute the ctags command in this directory?

9522
9523

The Vim editor solves this problem with yet another option. If you set the
following, all tags are relative to the directory that contains the tag file:

9524

:set tagrelative

9525
9526

otherwise, they are relative to the current directory. ('tr' is short for
'tagrelative'.)

9527
9528

With the 'tagstack' option set, the :tag and :tjump commands build a
tag stack. Otherwise, no stack is kept.

9529

Customizing the Syntax Highlighting

9530
9531

The Vim editor enables you to customize the colors used for syntax
hightlighting. The Vim editor recognizes three different types of terminals:
term
cterm

A normal black-and-white terminal (no color)


Color terminal, such as xterm or the Microsoft Windows MSDOS window.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 407

Draft Not for publication


gui
9532

Draft 0.1

Not for widespread publication

A window created by gvim

Black-and-White Terminals

9533

To change the highlighting for a normal terminal, use this command:

9534

:highlight group-name term=attribute

9535

(:hi for short.)

9536
9537
9538
9539

The group-name is the name of the syntax group to be highlighted. This is


the name of a syntax-matching rule set used by Vim to tell what part of the
program to highlight. A list of the standard group names can be found later in
this section.

9540
9541

The attribute is a terminal attribute. The terminal attributes for a normal


black-and white terminal are as follows:

9542

bold

9543

underline

9544

You can combine attributes by separating them with commas, as follows:

9545

:highlight Keyword term=reverse,bold

9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557

italic
reverse (also standout called inverse)

Suppose, however, that you have a terminal that has very unusual terminal
codes. You can define your own attributes with the start and stop highlight
options. These define a string to be sent to start the color and one to stop it. For
example:
:highlight Keyword start=<Esc>X stop=<Esc>Y
With this definition, when Vim displays keywords (for example, if, it will
output <Esc>Xif<Esc>Y). If you are familiar with the terminal definition files
used on UNIX (called termcap or terminfo files), you can use terminal codes.
The termcap entry us defines the underline start code, for example, and ue is the
exit underline-mode string. To specify these in a highlight entry, you use the
following command:
:highlight Keyword start=t_us stop=t_ue

9558

Color Terminals

9559
9560

The color entries are defined by the cterm settings. You can set them
using cterm=attribute just like a normal term entry.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 408

Draft Not for publication

Draft 0.1

Not for widespread publication

9561
9562
9563

But there are additional options for a color terminal. The setting
ctermfg=colornumber defines the foreground color number. The
ctermbg=colornumber defines the background .

9564
9565

Color names are recognized as well as color numbers. The following tells
Vim to display comments in red on blue, underlined:

9566

:highlight Comment cterm=underline ctermfg=red ctermbg=blue

9567

(Incidentally, this looks really ugly.)

9568

GUI Definition

9569
9570
9571
9572
9573

The GUI terminal uses the option gui=attribute to display the attributes
of a syntax element in the GUI window. The options guifg and guibg define the
colors. These colors can be named. If the name contains a space, the color
name should be enclosed in single quotation marks. To keep things portable, the
Vim people suggest you limit your color names to the following.
Black
DarkBlue
DarkMagenta
LightBlue
LightMagenta
Orange
SlateBlue

Blue
DarkCyan
DarkRed
LightCyan
LightRed
Purple
Violet

Brown
DarkGray
Gray
LightGray
LightYellow
Red
White

Cyan
DarkGreen
Green
LightGreen
Magenta
SeaGreen
Yellow

9574
9575
9576
9577
9578
9579

You can define the color as well by using the standard X11 color numbers.
(This works on all systems, regardless of whether you are using X11.) These are
of the form #rrggbb, where rr is the amount of red, gg is the amount of green,
and bb is the amount of blue. (These three numbers are in hexadecimal.) Under
Microsoft Windows, the following colors are available:
Black
Cyan
DarkGray
DarkRed
LightCyan
LightMagenta
Red
Sys_3DHighlight
Sys_3DShadow
Sys_AppWorkspace
Sys_BTNHighlight
Sys_BTNText

Blue
DarkBlue
DarkGreen
Green
LightGray
LightRed
Sys_3DDKShadow
Sys_3DHilight
Sys_ActiveBorder
Sys_Background
Sys_BTNHilight
Sys_CaptionText

vim-all-good.odt (28. Sep. 2007) The Vim Book

Brown
DarkCyan
DarkMagenta
LightBlue
LightGreen
Magenta
Sys_3DFace
Sys_3DLight
Sys_ActiveCaption
Sys_BTNFace
Sys_BTNShadow
Sys_Desktop
Page 409

Draft Not for publication


Sys_GrayText
Sys_InactiveBorder
Sys_InfoBK
Sys_MenuText
Sys_WindowFrame
Yellow
9580
9581

Draft 0.1

Not for widespread publication

Sys_Highlight
Sys_InactiveCaption
Sys_InfoText
Sys_ScrollBar
Sys_WindowText

Sys_HighlightText
Sys_InactiveCaptionText
Sys_Menu
Sys_Window
White

You can use the font=x-font as well to define which font to use. This is
not for the faint of heart, because X11 font names are complex. For example:

9582
9583

:highlight Comment font=


\font=-misc-fixed-bold-r-normal--14-130-75-75-c-70-iso8859-1

9584

Microsoft Windows fonts can be used as well:

9585

:highlight Comment font=courier_helv:h12

9586

Combining Definitions

9587
9588

You can define colors for multiple terminals in a single highlight command.
For example:

9589

:highlight Error term=reverse cterm=bold ctermfg=7 ctermbg=1

9590

Syntax Elements

9591
9592

The syntax elements are defined by the macros in $VIMRUNTIME/syntax.


To make things easier, however, the following names are generally used.

Boolean
Constant
Error
Identifier
Macro
PreProc
SpecialComment
Structure
Typedef
9593
9594

Character
Debug
Exception
Include
Number
Repeat
Statement
Tag

Comment
Define
Float
Keyword
Operator
Special
StorageClass
Todo

Conditional
Delimiter
Function
Label
PreCondit
SpecialChar
String
Type

In addition to these syntax elements, Vim defines the following for the
various things it generates:
Cursor
Directory
ErrorMsg
IncSearch
Mode Msg

The character under the cursor.


Directory names (and other special names in listings).
Error messages displayed on the bottom line.
The result of an incremental search.
The mode shown in the lower-left corner (for example,
--INSERT--).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 410

Draft Not for publication


MoreMsg

NonText

Question
SpecialKey

StatusLine
StatusLineNC
Title
Visual
VisualNOS
WarningMsg
WildMe nu
LineNr
Normal
Search
User1 through
User9
Menu
Scrollbar

Draft 0.1

Not for widespread publication

The prompt displayed if Vim is displaying a long


message at the bottom of the screen and must display
more.
The Vim editor displays ~ for lines past the end of the
file. It also uses @ to indicate a line that will not fit on
the screen. (See Chapter 20: Advanced Text Blocks and
Multiple Files.) This syntax element defines what color
to use for these elements.
When Vim asks a question.
The :map command lists keyboard mapping. This
defines the highlight to use for the special keys, such as
<Esc>, displayed.
The status line of current window.
Status lines of the other windows.
Titles for output from :set all, :autocmd, and so on.
This color is used to highlight the visual block.
Visual-mode selection when Vim is "Not Owning the
Selection." This works only on X Windows Systems.
Warning messages displayed on the last line of the
window.
Current match in 'wildmenu' completion.
Line number for :number and :# commands, and when
the 'number' option is set.
Normal text.
The results of the last search when the 'hlsearch'
option is enabled.
The 'statusline' option enables you to customize the
status line. You can use up to nine different highlights
on this line, as defined by these names.
Menu color for the GUI.
Scrollbar color for the GUI

9595

Color Chart

9596
9597
9598

If you want to see what the various colors look like on your terminal, you
can use Vim's color chart. To access this chart, either pull down the Syntax|
Color test menu (gvim) or follow these steps:

9599
9600

1. Edit the file $VIMRUNTIME/syntax/colortest.vim. Your directories


might be different if you install Vim in a different place.

9601
9602

2. Execute a :source (:so) command to read in the test:


:source %

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 411

Draft Not for publication


9603
9604
9605
9608

9609
9610

9611
9612

9613
9614

9615
9616
9617
9618
9619
9620
9621
9622
9623
9624
9625
9626
9627
9628

9629

Not for widespread publication

3. Browse the color list (in the third column). Figure 23-21 shows the
results. Unfortunately, this book is in black and white, but you can
imagine what it would look like in color.

9606

9607

Draft 0.1

"
"
"
"
"
"
"
"
"
"
"
"

lightred
lightgreen
lightyellow
lightblue
lightmagenta
lightcyan

grey_on_black
lightred_on_white
lightred_on_black
lightgreen_on_white
lightgreen_on_black
lightyellow_on_white
lightyellow_on_black
lightblue_on_white
lightblue_on_black
lightmagenta_on_white
lightmagenta_on_black
lightcyan_on_white
lightcyan_on_black

black_on_grey
white_on_lightred
black_on_lightred
white_on_lightgreen
black_on_lightgreen
white_on_lightyellow
black_on_lightyellow
white_on_lightblue
black_on_lightblue
white_on_lightmagenta
black_on_lightmagenta
white_on_lightcyan
black_on_lightcyan

" Open this file in a window if it isn't edited yet.


" Use the current window if it's empty.
if expand('%:p') != expand('<sfile>:p')
if &mod || line('$') != 1 || getline(1) != ''
exe "new " . expand('<sfile>')
else
exe "edit " . expand('<sfile>')
endif
endif
:source %

9630

Figure 23-21: Color test.

9631

The 'syntax' Option

9632
9633
9634

The 'syntax' ('syn') option contains the name of the current language
used for syntax highlighting. You can turn syntax highlighting off by entering
the command:

9635

:set syntax=off

9636

To turn it back on, use this command:

9637

:set syntax=on

9638
9639

Note: The on and off value for the 'syntax' option have special meaning,
they are not the name of programming languages, yet.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 412

Draft Not for publication

Draft 0.1

Not for widespread publication

9641

Chapter 24: All About Abbreviations and Keyboard


Mapping

9642
9643
9644
9645
9646
9647

In Chapter 8: Basic Abbreviations, Keyboard Mapping, and Initialization


Files you learned about abbreviations and keyboard mappings, but that
discussion focuses on only the most useful subset of the commands. This chapter
examines things in complete detail. These commands have a lot of different
variations, and this chapter covers them all. In this chapter, you learn about the
following:

9640

9648

How to remove an abbreviation

9649

Creation of mode-specific abbreviations

9650

Listing abbreviations

9651

How to force abbreviation completion in insert mode

9652

Mode-specific mappings

9653

Clearing and listing mappings

9654

Other mapping options

9655

Removing an Abbreviation

9656
9657

To remove an abbreviation, use the command :unabbreviate (:una).


Suppose you have the following abbreviation, for example:

9658

:abbreviate @a fresh

9659

(The abbreviation of :abbreviate is :ab.)

9660

You can remove it with this command:

9661

:unabbreviate @a

9662

To clear out all the abbreviations, use the following command:

9663

:abclear

9664

(You can use :abc as well.)

9665
9666
9667
9668

Note: One problem with this command is that the abbreviation @a is


expanded on the command line. Vim is smart, however, and it will
recognize that fresh is really @a expanded and will remove the
abbreviation for @a.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 413

Draft Not for publication

Draft 0.1

Not for widespread publication

9669

Abbreviations for Certain Modes

9670
9671
9672
9673

The :abbreviate command defines abbreviations that work for both insert
mode and command-line mode. If you type the abbreviation @a in the text, for
example, it will expand to fresh. Likewise, if you put it in a command-mode (:)
command, it will also expand .

9674

Normal mode

i@ a< ESC>

Inserts fresh

9675

Command mode

:s/xx/@a/

Executes :s/xx/fresh/

9676
9677

If you want to define an abbreviation that works only in insert mode, you
need the :iabbrev (:ia) command:

9678
9679
9680
9681
9682

:iabberv @a fresh
This means that in command mode, @a is just @a. The :noremap (:no)
version of this command is :inoreabbrev (:inorea). To unabbreviate an insertmode abbreviation, use the command :iunabbreviate (:inua). To clear out all
the insert abbreviations, use the following command:

9683

:iabclear

9684

(Or you can shorten this to :iabc.)

9685
9686
9687
9688
9689

If you want an abbreviation defined just for command mode, use the
:cabbreviate (:ca) command. The :noremap version of this command is
:cnoreabbrev (:cnorea). To remove a definition, use the :cunabbreviate
(:cuna) command; and to clear out the entire abbreviation list, use the command
:cabclear (:cabc).

9690

Listing Abbreviations

9691
9692

You can list all abbreviations by using the :abbreviate (:ab) command
with no arguments (see Figure 24-1).

9693
9694
9695
9696
9697
9698
9699

~
~
~
c r
:rewind
i ab
abbreviate
! h
Help
Press RETURN or enter command to continue

9700

Figure 24-1: :abbreviate output.

9701
9702

The first column contains a flag indicating the abbreviation type. The flags
are:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 414

Draft Not for publication


9703

9704

9705

Draft 0.1

Not for widespread publication

Command mode
Insert mode
Both

9706

Forcing Abbreviation Completion

9707
9708

In insert mode, the command CTRL-] causes Vim to insert the current
abbreviation.

9709
9710
9711

The command CTRL-C causes Vim to exit insert mode. The difference
between CTRL-C and <Esc> is that CTRL-C does not check for an abbreviation
before entering normal mode.

9712

Mapping and Modes

9713
9714
9715
9716

The :map command enables you to define mappings limited to certain


modes. Suppose, for example, that you want to use the <F5> key to yank the
current visual-mode select into register v. You can define the following
command:

9717
9718
9719
9720

:map <F5> "vy


This maps the <F5> key for normal, visual, and operator-pending modes.
But you want this mapping to be valid only for visual mode. To do that, use a
special version of the mapping command:

9721

:vmap <F5> "vy

9722

(Or :vm for short.)

9723
9724
9725

The "v" flavor of the :map command tells Vim that this mapping is valid
only for visual mode. Table 24-1 lists seven different flavors of the :map
command.

9726

Table 24.1 :map Commands


Command Normal Visual Operator Insert Command Select
Pending
Line
Mode
:map

:nmap
:nm

:vmap
:vm

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 415

Draft Not for publication

Draft 0.1

Not for widespread publication

Command Normal Visual Operator Insert Command Select


Pending
Line
Mode
:omap
:om

:map!

:imap
:im

:cmap
:cm

:smap
9727
9728
9729
9730
9731
9732
9733
9734
9735

Note: Operator-pending mode is the mode that occurs when you enter a
command such as d that expects a motion to follow. (For example, dw
deletes a word. The w is entered in operator-pending mode.)
Now suppose that you want to define <F7> so that the command d<F7>
deletes the C program block (text enclosed in curly braces, {}). Similarly y<F7>
would yank the program block into the unnamed register. Therefore, what you
need to do is to define <F7> to select the current program block. You can do this
with the following command:
:omap <F7> a{

9736
9737
9738
9739
9740

This causes <F7> to perform a select block (a{) in operator-pending mode.


With this mapping in place, when you press the d of d<F7>, you enter operatorpending mode. Pressing <F7> executes the command a{ in operator-pending
mode, selecting the block. Because you are performing a d command, the block
is deleted.

9741

Other :map Commands

9742

A number of commands relate to mapping. The first is this:

9743

:map lhs rhs

9744
9745
9746

This adds the mapping of lhs to rhs. Therefore, pressing lhs results in the
execution of rhs. The :map command allows remapping of rhs. The command
:noremap (:no) however, does not

9747

:noremap lhs rhs

9748

For example:

9749
9750

:map ^A dd
:map ^B ^A
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 416

Draft Not for publication


9751
9752
9753
9754

Draft 0.1

Not for widespread publication

This causes Vim to delete a line when you type CTRL-A. It also causes the
CTRL-B command to do the same thing as CTRL-A that is, delete a line. Note:
When entering the control characters, you must "quote" them with CTRL-V. In
other words, you must type

9755

:map CTRL-V CTRL-A dd

9756

to get:

9757

:map ^A dd

9758

Suppose you use the following :noremap command:

9759
9760

:map ^A dd
:noremap ^B ^A

9761
9762
9763

When you type CTRL-B, you execute a normal CTRL-A (not mapped) CTRL-A
command. Therefore, CTRL-B will now increment the value of the number under
the cursor.

9764

Undoing a Mapping

9765
9766

The :unmap (:unm) command removes a mapping. To cause a mapped


CTRL-A command to revert to the default, use the following command:

9767
9768
9769
9770

:unmap ^A
This also proves useful if you want to map a command for a limited set of
modes. To define a command that exists in only normal and visual modes, but
not operator pending mode, for example, use the following commands:

9771
9772

:map ^A 3w
:ounmap ^A

9773

(:ou can be used for :ounmap.)

9774
9775

The first command maps the CTRL-A to 3w in normal, visual, and operatorpending modes. The second removes it from the operating-pending mode map.

9776

Clearing Out a Map

9777

The command :mapclear (:mapc) removes all mapping:

9778

:mapclear

9779
9780

Be careful with this one because it also removes any default mappings you
might have.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 417

Draft Not for publication


9781
9782
9783

Not for widespread publication

Listing the Mappings


The :map command with no arguments lists out the mappings (see Figure
24-2).

9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797

~
~
~
<xHome>
<xEnd>
<SxF4>
<SxF3>
<SxF2>
<SxF1>
<xF4>
<xF3>
<xF2>
<xF1>
Press RETURN or enter

9798

<Home>
<End>
<SF4>
<SF3>
<SF2>
<SF1>
<F4>
<F3>
<F2>
<F1>
command to continue

Figure 24-2: Output of :map command.

9799
9800
9801

Draft 0.1

## need example with something in the first column


The first column lists flags indicating the modes for which the mapping is
valid.

9802

Character

Mode

9803

<Space>

Normal, visual, and operator-pending

9804

Normal

9805

Visual

9806

Operator-pending

9807

Insert and command line

9808

Insert

9809

Command line

9810
9811
9812

The second column indicates the various lhs of any mappings. The third
column is the value of the rhs of the mapping. If the rhs begins with an asterisk
(*),the rhs cannot be remapped.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 418

Draft Not for publication

Draft 0.1

Not for widespread publication

9813
9814
9815
9816

The :map command lists all the mappings for normal, visual, and operatorpending modes. The :map! command lists all the mappings for insert and
command-line mode. The :imap, :vmap, :omap, :nmap, and :cmap commands list
only the mappings for the given modes.

9817

Recursive Mapping

9818
9819

By default, Vim allows recursive command mapping. To turn off this


feature clear the 'remap' with the command:

9820

:set noremap

9821

This may break some scripts. Using :noremap will avoid this problem.

9822

Remapping Abbreviations

9823
9824

Abbreviations can cause problems with mappings. Consider the following


settings, for example:

9825
9826

:abbreviate @a ad
:imap ad adder

9827
9828

Now when you type @a, the string ad is inserted. Because ad is mapped in
insert mode to the string adder, the word adder is inserted in the text.

9829
9830
9831

If you use the command :noreabbrev (:norea), however, you tell Vim to
avoid this problem. Abbreviations created with this command are not candidates
for mapping.

9832
9833
9834
9835

One of the problems with the :abbreviate command is that the


abbreviations on the right side are expanded when the abbreviations are defined.
There is a clumsy way of avoiding this: Type an extra character before the word,
type the word, then go back and delete the extra character.

9836

Language Dependent Mappings

9837
9838
9839
9840

The :lmap (:lm) command defines a mapping that's to be used in language


dependent mode. This mode is encountered when you are entering text in
command mode, insert mode, and search patterns that is not an actual Vim
command, but text or arguments to that command.

9841

The usual suite of commands applies. :map Mode Table

9842
9843

The following chart shows the commands and the various modes they are
associated with:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 419

Draft Not for publication

Draft 0.1

Not for widespread publication

9844
Mode

Commands

:map
Normal, Visual
Operator Pending

:
:
:
noremap : unmap : mapclear :
no
unm
mapc

Normal

:nmap :
:nunmap :nmapclear
:nm
nnremap : :nun
:nmapc
nn

Visual
Select

:vmap :vnoremap :vunmap :vmapclear


:vm
:vn
:vu
:vmapc

Visual

:xmap :xnoremap :xunmap :xmapclear


:xm
:xn
:xu
:xmapc

Operator
Pending

:omap :onoremap :ounmap :omapclear


:om
:ono
:ou
:omapc

Insert
Command Line

:map! :noremap! :unmap! :mapclear!


:no!
:unm!
:mapc!

Insert

:imap :inoremap :iunmap :imapclear


:im
:ino
:iu
:imapc

Command
Line

:cmap :cnoremap :cunmap :cmapclear


:cm
:cno
:cu
:cmapc

Language
Depedent

:lmap :lnoremap :lunmap :lmapclear


:lm
:ln
:lu
:lmapc

Select

:smap :snoremap :sunmap :smapclear


:sno
:sun
:smapc

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 420

Draft Not for publication

Draft 0.1

Not for widespread publication

9845

Chapter 25: Complete Command-Mode (:) Commands

9846
9847
9848
9849

Although the Vim editor is superb when it comes to doing things visually,
sometimes you need to use command mode. For example, command-mode
commands are much easier to use in scripts. Also, a number of other specialized
commands are found only in command mode.

9850
9851

Being expert in the command-mode means that you are a Vim power user
with the ability to execute a number of amazing high-speed editing commands.

9852

Advanced Command Entry

9853
9854
9855

Command mode maintains a history of the command mode command


you've entered. You can browse this history by going to command mode (:) and
using the <Up> and <Down> keys.

9856
9857
9858
9859

You can also open the command mode history window with the q: or
CTRL-F command. This window lets you use the up (j) and down (k) commands
to select a command. You can edit this command using the normal Vim
commands, then execute it by pressing <Enter>.

9860
9861
9862

Actually, the key (CTRL-F) which opens the command history window is
configurable by setting the option 'cedit'. The default just happens to be
CTRL-F.

9863
9864

The number of lines that appear for the command window is controlled by
the value of the 'cmdwinheight' ('cwh') option.

9865

Editing Commands

9866
9867

The :delete (:d) command deletes a range of lines. To delete lines 1


through 5 (inclusive), for example, use the following command:

9868

:1,5 delete

9869

The general form of the :delete command is as follows:

9870

:[range] delete [register] [count]

9871
9872
9873
9874

The register parameter specifies the text register in which to place the
deleted text. This is one of the named registers (a-z). If you use the uppercase
version of the name (A-Z), the text is appended to what is already in the register.
If this parameter is not specified, the unnamed register is used.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 421

Draft Not for publication

Draft 0.1

Not for widespread publication

9875
9876

The count parameter specifies the number of lines to delete (more on this
later in this section).

9877
9878

The range parameter specifies the lines to use. Consider the following
example (spaces added for readability):

9879

:1, 3 delete

9880

Figure 25-1 shows the results of this command.

9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897
9898

1
2
3
4
5

A UNIX sales lady, Lenore,


Enjoys work, but she likes the beach more.
She found a good way
To combine work and play:
She sells C shells by the seashore.

:1,3 delete
1 To combine work and play:
2 She sells C shells by the seashor
~
~
~
~
3 fewer lines
Figure 25-1: :1,3 delete.
You have learned how to use search patterns for line specification. For
example, the following command deletes starting from the first line with hello to
the first line that contains goodbye.
:/hello/,/goodbye/ delete

9899
9900

Note: If goodbye comes before hello, the line range will be backwards, and
the command will not work.

9901
9902
9903
9904

You can refine the search string specification by adding an offset. For
example, /hello/+1 specifies the line one line after the line with the word hello
in it. Therefore, the following command results in the screen shown in Figure
25-2.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 422

Draft Not for publication


9905
9906
9907
9908
9909
9910
9911

~
~
~
: /beach/+1, /seashore/-1 delete
Figure 25-2: Results of :/beach/+1, /seashore/-1 delete.
You can also use special shorthand operators for patterns, as follows:
Search forward for the last pattern used.
Search backward for the last pattern used.
Search forward for the pattern last used as substitute pattern.

\/
\?
\&
9914
9915

Not for widespread publication

1 A UNIX sales lady, Lenore,


2 Enjoys work, but she likes the beach more.
3 She sells C shells by the seashore.

9912
9913

Draft 0.1

You can also chain patterns. The following command, for example, finds
the string first and then searches for the string second.

9916

/first//second/

9917

Figure 25-3 shows the result of the command:

9918

:/found//work/ delete

9919
9920
9921
9922
9923
9924
9925
9926

1
2
3
4

~
~
:/found//work/ delete

9927
9928
9929
9930

A UNIX sales lady, Lenore,


Enjoys work, but she likes the beach more.
She found a good way
She sells C shells by the seashore.

Figure 25-3: :/found//work/delete.


You can also specify a line number on which to start. To start the search at
line 7, for instance, use the following command-line specification:
7/first/

9931

Other Ways to Specify Ranges

9932
9933
9934
9935
9936

If you execute a : command with no count (as most users generally do), the
Vim editor puts you into command mode and enables you to specify the range. If
you give the command a count(5:, for example), the range is count lines
(including the current one). The actual specification of this arrangement is that
if you include a count, your line range is as follows:

9937

:.,count - 1
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 423

Draft Not for publication


9938
9939
9940

Draft 0.1

Not for widespread publication

In the example original file, for instance, if you move to the top line and
then execute the following command, you get the results shown in Figure 25-4:
:3delete

9941
9942
9943
9944
9945
9946
9947
9948

1 To combine work and play:


2 She sells C shells by the seashore.
~
~
~
~
3 fewer lines

9949
9950

Figure 25-4: 3:delete.


Deleting with a Count

9951

Another form of the delete command is as follows:

9952

:line delete count

9953
9954
9955
9956

In this case, the :delete command goes to line (default = the current line)
and then deletes count lines. If you execute the following command on the
original example file, for instance, you get the results shown in Figure 25-5:
:3 delete 2

9957
9958
9959
9960
9961
9962
9963
9964

1 A UNIX sales lady, Lenore,


2 Enjoys work, but she likes the beach more.
3 She sells C shells by the seashore.
~
~
~
:3 delete 2

9965

Figure 25-5: :3 delete 2.

9966
9967

Note: You can specify a line range for this type of command, but the first
line is ignored and the second one is used.

9968

Copy and Move

9969
9970

The :copy (:co, :t) command copies a set of lines from one point to
another. The general form of the copy command is as follows:

9971

:[range] copy address


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 424

Draft Not for publication


9972
9973
9974

Draft 0.1

Not for widespread publication

If not specified, range defaults to the current line. This command copies
the line in range to the line specified after address. Consider the following
command, for example:

9975

:1,3 copy 4

9976

Executed on the original joke, you get the results shown in Figure 25-6.

9977
9978
9979
9980
9981
9982
9983
9984
9985
9986

1
2
3
4
5
6
7
8

A UNIX sales lady, Lenore,


Enjoys work, but she likes the beach more.
She found a good way
To combine work and play:
A UNIX sales lady, Lenore,
Enjoys work, but she likes the beach more.
She found a good way
She sells C shells by the seashore.

~
3 more lines

9987
9988
9989
9990
9991

Figure 25-6: :1,3 copy 4.


The :move command is much like the :copy command, except the lines are
moved rather than copied. The following command results in what is shown in
Figure 25-7:
:1,3 move 4

9992
9993
9994
9995
9996
9997
9998
9999
10000
10001
10002
10003

1
2
3
4
5

To combine work and play:


A UNIX sales lady, Lenore,
Enjoys work, but she likes the beach more.
She found a good way
She sells C shells by the seashore.

~
~
~
~
3 lines moved
Figure 25-7: :1,3 move 4.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 425

Draft Not for publication

Draft 0.1

Not for widespread publication

10004

Inserting Text

10005
10006
10007
10008
10009
10010

Suppose that you want to insert a bunch of lines and for some reason you
want to use command mode. You need to go to the line above where you want
the new text to appear. In other words, you want the text to be inserted after the
current line. Now start the insert by executing the :append (:a) command. Type
the lines that you want to add and finish by typing a line that consists of just a
period (.). The following example illustrates the :append command.

10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
10025
10026

:% print
A UNIX sales lady, Lenore,
Enjoys work, but she likes the beach more.
She found a good way
To combine work and play:
She sells C shells by the seashore.
:1 append
This line is appended.
.
:% print
A UNIX sales lady, Lenore,
This line is appended.
Enjoys work, but she likes the beach more.
She found a good way
To combine work and play:
She sells C shells by the seashore.

10027

The general form of the :append command is as follows:

10028

:[line] append

10029

The line is the line after which to insert the new text.

10030

The :insert command also inserts text. It has a similar form:

10031

:[line] insert

10032
10033

It works just like :append except that :append inserts after and :insert
inserts before the current line.

10034
10035
10036
10037
10038

The :stopinsert (:stopi) command stops insert mode as if you had typed
<ESC>. But this command is a little hard to enter manually, since you must stop
insert mode before you can type it in. It is useful however in :autocmd
declarations. For example, if you want to exit insert mode when you enter a
buffer, use the command:

10039

:autocmd BufEnter * :stopinsert

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 426

Draft Not for publication

Draft 0.1

Not for widespread publication

10040
10041
10042

The :startreplace (:startr) command starts a replace just as if you had


typed an R. If the override (!) option is present, replacement begins at the end
of line as if you typed $R.

10043

Printing with Line Numbers

10044
10045
10046

You do not have to turn on the number option to print the text with line
numbers. The :# (:number, :nu) command accomplishes the same thing as
:print but includes line numbers:

10047
10048
10049
10050

:1 print
A UNIX sales lady, Lenore,
:1 #
1 A UNIX sales lady, Lenore,

10051

Printing with list Enabled

10052
10053

The 'list' option causes invisible characters to be visible. The :list (:l)
command lists the specified lines, assuming that this option is on:

10054

:1,5 list

10055

The following example shows the difference between :print and :list:

10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069
10070
10071
10072
10073
10074
10075
10076
10077
10078

:100,111 print
open_db(void)
{
if (proto_db == NULL) {
proto_db = gdbm_open(proto_db_name, 512, GDBM_READER ,
0666, NULL);
if (proto_db == NULL) {
fprintf(stderr, "Error: Could not open database %s\n",
proto_db_name);
exit (8);
}
}
}
:100,111 list
open_db(void)$
{$
if (proto_db == NULL) {$
^Iproto_db = gdbm_open(proto_db_name, 512, GDBM_READER, $
^I^I^I^I0666, NULL);$
^Iif (proto_db == NULL) {$
^I
fprintf(stderr, "Error: Could not open database %s\n",
$
^I
^I^I proto_db_name);$
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 427

Draft Not for publication


10079
10080
10081
10082

^I
^I}$

Draft 0.1

Not for widespread publication

exit (8);$
}$

}$

10083

Print the Text and Then Some

10084
10085
10086

The :z command prints a range of lines (the current one being the default)
and the lines surrounding them. For example, the following command prints line
100 and then a screen full of data:

10087
10088
10089
10090
10091
10092

:100 z
The :z command takes a count of the number of extra lines to list. For
example, the following command lists line 100 and three additional lines:
:100 z 3
The :z command can be followed by a code indicating how much to
display. The following table lists the codes:
Code
+
^
.
=

10093

Listing Start
Current line
One screen back
Two screens back
One-half screen back
One-half screen back

Listing End
One screen forward
Current line
One screen back
One-half screen forward
One-half screen forward

New Current Line


One screen forward
Current line
One screen back
One-half screen forward
Current line

Substitute

10094

The format of the basic substitute command is as follows:

10095

:[range] s /from/to/[flags] [count]

10096

(You can use :substitute for :s, but in practice this is almost never done.)

10097
10098
10099

Note: This example uses a slash (/) to separate the patterns. Actually you
can use almost any character that does not appear in the patterns. The
following, for example, is perfectly valid:

10100

:s +from+to+

10101
10102

This can prove extremely useful when you are dealing with patterns that
contain slashes, such as filenames:

10103
10104
10105

:1,$ s +/home/user+/apps/product+
Delimiters can be any character except letters, digits, backslash, double
quote, or vertical bar.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 428

Draft Not for publication

Draft 0.1

Not for widespread publication

10106
10107
10108
10109
10110
10111

The Vim editor uses a special set of magic characters to represent special
things. For example, star (*) stands for "repeat 0 or more times." If you set the
'nomagic' option, however, the magic meanings of some of these characters are
turned off. (For a complete list of the magic characters and how the 'nomagic'
option affects them, see Chapter 19: Advanced Searching Using Regular
Expressions.)

10112
10113
10114

The :smagic (:sm) command performs a substitute but assumes that the
'magic' option is set during the command. For example, start in command
mode with a one-line file. You start by printing the entire file:

10115
10116
10117
10118
10119
10120
10121

:%print
Test aaa* aa* a*
Now set the 'magic' option and perform a substitution. The p flag tells the
editor to print the line it changed:
:set magic
:1 s /a*/b/p
bTest aaa* aa* a*

10122
10123
10124

This command made only one change at the beginning of the line. So why
did it change Test to bTest when there is no a around? The answer is that the
magic character star (*) matches zero or more times. Test begins with zero a's.

10125
10126
10127

But why did it make only one change? Because the :substitute command
changes only the first occurrence unless the g flag is present. Now undo the
change and try again:

10128
10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139

:undo
:1 s /a*/b/pg
bTbebsbtb b*b b*b b*b
This time you got what you wanted. Now try it again with the 'nomagic'
option set:
:undo
:set nomagic
:1 s /a*/b/pg
Test aab ab b
Without 'magic', a star (*) is just a star. It is substituted directly. The
:smagic command forces magic on the star (*) and other characters while the
substitution is being made, resulting in the following:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 429

Draft Not for publication


10140
10141
10142
10143

The :snomagic (:sno) forces 'magic' off.


:undo
:set magic
:1 snomagic /a*/b/pg
Test aab ab b
The & command repeats the substitution. This enables you to keep your
old from and to strings, but also to supply a different range or flags. The general
form of this command is:

10151

:[range]& [flags] [count]

10152

For example:

10153
10154
10155
10156
10157
10158
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172

Not for widespread publication

:undo
:1 smagic /a*/b/pg
bTbebsbtb b*b b*b b*b

10144
10145
10146
10147
10148
10149
10150

Draft 0.1

:1 s /a\+/b/p
Test b* aa* a*
The command changes the first occurrence of from on the line. You want
the entire line, so you repeat the substitution with the g option:
:&g
Of course, this does not print (because the new flags--in this case g-replaces the flags and you did not specify p or, more specifically, pg). Take a
look at the result:
:1 print
Test b* b* b*
This is what you wanted.
The :& command and the :substitute command with no from or to
specified acts the same. The normal-mode & command repeats the last
:substitute command. If you were to execute the following command, for
instance, you would change the first manager on line 5 to an idiot:
:5 s /manager/idiot/
Now if you enter normal mode (through the :vi command) and execute an
& command, the next manager on this line would change as well. If you were to
move down to another line and execute an & command, you would change that
line as well. If you give & a count, it will work on that many lines.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 430

Draft Not for publication


10173
10174
10175

Draft 0.1

The :~ command acts just like the &r command, except that it uses as from
the last search pattern (used for a / or ? search) rather than the last
:substitute from string.

10176

The general form of this command is:

10177

:[range]~ [flags] [count]

10178
10179

Not for widespread publication

Substitute flags
The flags or the :substitute and other similar command are:

10180

Print the line number and line after substitution.

10181
10182

&

Use the previous flags again. This must be the first


flag in the list.

10183

Confirm each substitution.

10184

Do not output an error message if no text matches.

10185
10186

Replace every occurrence on the line instead of just


the first one.

10187

Ignore case.

10188

Do not ignore case even if the options tell you to.

10189

Print the line in 'list' mode after substitution.

10190
10191

Don't actually do the work, just report the number


of changes that would be made if you did.

10192

Print the line after substitution.

10193
10194

If the search pattern is empty, use the previous


one.

10195

Making g the Default

10196
10197
10198

Generally the :substitute command changes only the first occurrence of the
word unless you use the 'g' option. To make the 'g' option the default set the
'gdefault' ('gd') option.

10199

:set gdefault

10200

Note:This can break some scripts you may use.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 431

Draft Not for publication

Draft 0.1

Not for widespread publication

10201

Global Changes

10202
10203
10204
10205

The command-mode commands covered so far have one limitation: They


work only on a contiguous set of lines. Suppose, however, that you want to
change just the lines that contain a certain pattern. In such a case, you need the
:global (:g) command.

10206

The general form of this command is:

10207

:[range] global /pattern/ command

10208
10209

This tells Vim to perform the given command on all lines that contain the
pattern in the specified range.

10210
10211

To print all the lines within a file that contain the word Professor, for
instance, use the following command:

10212
10213
10214
10215
10216

:% global /Professor/ print


Professor: Yes.
Professor: You mean it's not supposed to do
Professor: Well there was no Computer Center
Professors of mathematics will prove the

10217
10218

The :global! (:g!) command applies the command to all the lines that do
not match the given pattern, as will the :vglobal command.

10219

Commands for Programs

10220

The following sections describe some commands for programs.

10221

Include File Searches

10222
10223
10224
10225

The :ijump (:ij) command searches for the given pattern and jumps to the
first occurrence of the word in the given range. It searches not only the current
file, but all files brought in by #include directives. The general form of this
command is as follows:

10226
10227
10228
10229

:[range] ijump [count] [/]pattern[/]


If a count is given, jump to the count occurrence of the pattern. If the
pattern is enclosed in slashes it must be whole word. With slashes it is a regular
expression. Consider the file hello.c, for example:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 432

Draft Not for publication


10230
10231
10232
10233
10234

Draft 0.1

Not for widespread publication

#include <stdio.h>
int main() {
printf("Hello World\n");
return (0);
}

10235

The following command goes to the first line that contains define EOF:

10236

:ijump /define\s*EOF/

10237
10238

In this case, it is in the include file stdio.h. The :ilist (:il) command
acts like :ijump, except it lists the lines instead of jumping to them:

10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250

:ilist EOF
/usr/include/libio.h
1: 84 #ifndef EOF
2: 85 # define EOF (-1)
3: 327 && __underflow (_fp) == EOF ? EOF \
/usr/include/stdio.h
4: 83 #ifndef EOF
5: 84 # define EOF (-1)
6: 408 null term.), or -1 on error or EOF. */
/usr/include/bits/stdio.h
7: 138 if (__c == EOF) \
8: 157 if ((*__ptr++, __stream) == EOF) \

10251
10252
10253
10254
10255

The :isearch (:is) command is like :ilist, except that the first
occurrence is listed:
:isearch EOF
#ifndef EOF
Finally, the command :isplit (:isp) works like a :split and a :ijump.

10256

Jumping to Macro Definitions

10257
10258
10259

You learned how to use the command [CTRL-D to jump to the definition of
the macro under the cursor. The :djump (:dj) command accomplishes the
same thing for the macro named name:

10260

:djump name

10261

To jump to the macro MAX, for example, use this command:

10262

:djump MAX

10263
10264
10265

You do not have to know the full name of the macro to find its definition. If
you know only part of a name, you can perform a search for a partial string by
enclosing the name in slashes, as follows:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 433

Draft Not for publication


10266
10267
10268
10269
10270

Draft 0.1

Not for widespread publication

:djump /MAX/
This command finds the first definition of the macro with the word MAX in
it. You can give the :djump command a range argument that restricts the search
to the given range:
:50,100 djump /MAX/

10271
10272

This command finds the first definition of any macro containing the word
MAX in lines 50 through 100.

10273
10274
10275

If you do not want the first definition, but the second, you can add a count
to the command. To find the second definition of MAX, for instance, use this
command:

10276
10277

:djump 2 MAX
Split the Window and Go to a Macro Definition

10278

The :dsplit (:dsp) command is shorthand for :split and :djump:

10279

:[range] dsplit [count] [/]pattern[/]

10280

Listing the Macros

10281
10282
10283

The :dlist (:dl) command works just like :djump, except that instead of
moving to the macro definition, the command just lists all the definitions that
match:

10284
10285
10286
10287
10288

:dlist EOF
/usr/include/libio.h
1: 85 # define EOF (-1)
/usr/include/stdio.h
2: 84 # define EOF (-1)

10289

Listing the First Definition

10290
10291

The :dsearch (:ds) command works just like :dlist, except that it
displays only the first definition:

10292
10293

:dsearch EOF
# define EOF (-1)

10294

Override Option (!)

10295
10296
10297

The :ilist, :ijump, :djump, :dlist, and :dsearch commands take an


override option (!). If the ! is present, definitions within comments are found as
well.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 434

Draft Not for publication


10298

Draft 0.1

Not for widespread publication

Directory Manipulation

10299

To change the current working directory, use the following command:

10300

:cd dir

10301

(Also known as :chdir, :chd.)

10302
10303
10304

This command acts just like the system cd command. On UNIX, it changes
the current working directory to the given directory. If no directory is specified,
it goes to the user's home directory.

10305
10306
10307

On Microsoft Windows, it goes to the indicated directory. If no directory is


specified, it prints the current working directory. The following command
changes the directory to the previous path:

10308

:cd -

10309
10310

In other words, it does a cd to the last directory you used as the current
working directory.

10311
10312

To find out which directory Vim is currently using, use the :pwd (:pw)
command:

10313

:pwd

10314

Start deep in the directory tree, for instance:

10315
10316
10317
10318
10319
10320

:pwd
/mnt/sabina/sdo/writing/book/vim/book/11
You are working on a UNIX system, so go to your $HOME directory:
:cd
:pwd
/home/sdo

10321

Jump into another directory:

10322
10323
10324

:cd tmp
:pwd
/home/sdo/tmp

10325
10326
10327
10328
10329

Return to the previous directory:


:cd :pwd
/home/sdo
Return to the previous directory before this one:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 435

Draft Not for publication


10330
10331
10332

Draft 0.1

Not for widespread publication

:cd :pwd
/home/sdo/tmp

10333
10334
10335

The :cd command is global. In other words, the current directory is


changed for everyone. If you want to change it for just a single window use the
:lcd (:lc, :lchdir, :lch) command.

10336
10337

The 'cdpath' ('cd') option can be used to give Vim a set of directories to
search when doing a :cd. For example, if you enter the command:

10338
10339

:set cdpath=/usr/src,/new/src,,
:cd tools

10340

Then Vim will attempt to go to the first directory it finds in the list:

10341
10342
10343

/usr/src/tools
/usr/new/tools
./tools

10344
10345

Note: The current directory is just the empty string: ,,


(<comma><comma>).

10346
10347
10348

Also if enable the 'auctochdir' ('acd') option then the directory will
automatically change when you change files to the directory of the file you are
currently editing.

10349

Current File

10350

The :file (:f) command prints out the current file and line information:

10351

:file

10352
10353
10354

If you want to change the name of what Vim thinks is the filename, use this
command:
:file name

10355
10356

Suppose, for example, that you start editing a file called complete.txt. You
get this file just right, so you write it out using the :write (:w) command.

10357
10358

Now you want to shorten the file and write it out as summary.txt. So now
you execute this command:

10359

:file summary.txt

10360

Now when you continue to edit, any changes are saved to summary.txt.

10361

Take a look at how this works. You start by editing the file star.txt.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 436

Draft Not for publication


10362
10363
10364
10365

Draft 0.1

Not for widespread publication

:file
"star.txt" line 1 of 1 --100%-- col 1
The :write command with no arguments writes the file to the current
filename (in this case, star.txt).

10366
10367

:write
"star.txt" 1 line, 18 characters written

10368
10369

Now you want to change the filename to new.txt. The editor tells you that
this is a new filename.

10370
10371

:file new.txt
"new.txt" [Not edited] line 1 of 1 -100%- col 1

10372
10373

The :write command is used to write the file. In this case, the current
filename differs; it is new.txt.

10374
10375

:write
"new/txt" [New File] 1 line, 18 chars written

10376

The following command prints the current line number:

10377

:=

10378

For example:

10379
10380

:=
line 1

10381

Advanced :write Commands

10382
10383
10384

The :write command writes the buffer (or a selected range of lines) to a
file. It has some additional options. The following command, for example,
appends the contents of the file you are editing to the file named collect.txt:

10385
10386
10387
10388
10389
10390
10391
10392

:write >> collect.txt


If the collect.txt file does not exist, this command aborts with an error
message. If you want to "append" to the file even if does not exist, use the force
(!) option:
:write! >> collect.txt
The :write command can not only write to a file, but it can also be used to
pipe the file to another program. On Linux or UNIX, for instance, you can send
the file to a printer by using the following command:

10393

:write !lpr

10394
10395

Warning: The following two commands are different; the difference being
only the spacing:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 437

Draft Not for publication

Draft 0.1

Not for widespread publication

10396
10397

:write! lpr
:write !lpr

10398
10399

The first writes to the file named lpr with the force option in place. The
second sends the output to the command lpr.

10400

Updating Files

10401
10402

The :update (:up) command acts just like the :write command, with one
exception: If the buffer is not modified, the command does nothing.

10403

Reading Files

10404
10405

The :read (:r) command reads in a file. The general form of this command
is as follows:

10406

:[line] read file

10407
10408
10409

The preceding command reads the file in and inserts it just after line. If no
file is specified, the current file is used. If no line is supplied, the current line is
used.

10410
10411
10412

Like :write, the :read command can use a command rather than a file. To
read the output of a command and insert it after the current line, use the
following command:

10413

:[line] read !command

10414

Register Execution

10415
10416
10417

Chapter 2: Editing a Little Faster showed you how to record macros in


registers. If you want to use these macros in command mode, you can execute
the contents of a register with the command :@ (:*).

10418
10419
10420
10421

:[line]@register
This command moves the cursor to the specified line, and then executes
the register. This means that the following command executes the previous
command line:

10422

:@:

10423

To execute the previous :@register command, use this command:

10424

:[line]@@

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 438

Draft Not for publication


10425
10426

Draft 0.1

Not for widespread publication

Simple Edits
The following sections describe simple edits.

10427

Shifting

10428
10429
10430

The :> command shifts lines to the right. The :< command shifts lines to
the left. The following command, for example, shifts lines 5 through 10 to the
right:

10431

:5, 10 >

10432

Changing Text

10433
10434

The :change (:c) command acts just like the :delete command, except
that it performs an :insert as well.

10435

Entering Insert Mode

10436
10437

The :startinsert (:star) command starts insert mode as if you were in


normal mode and were to press i.

10438

Joining Lines

10439
10440
10441

The :join (:j) command joins a bunch of lines (specified by the range
parameter) together into one line. Spaces are added to separate the lines. If you
do not want the added spaces, use the :join! command.

10442

Yanking Text

10443

The :yank (:y) command yanks the specified lines into the register:

10444

:[range] yank [register]

10445

If no register is specified, the unnamed register is used.

10446

Putting Text

10447
10448
10449

The :put command puts the contents of a register after the indicated line.
To dump the contents of register a after line 5, for example, use the following
command:

10450

:5put a

10451

If you want to put the text before the line, use this command:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 439

Draft Not for publication


10452

Draft 0.1

Not for widespread publication

:5put! a

10453

Undo/Redo

10454
10455

The :undo (:u) command undoes a change just like the u command does.
The :redo command redoes a change like CTRL-R does.

10456

Marks

10457

To mark the beginning of the line, use the :mark (:ma) command.

10458

:mark register

10459
10460
10461

command. If a line is specified, that line will be marked. The :k command


does the same thing, with the exception that you don't have to put a space in
front of the register name.

10462

The following two commands are equivalent:

10463
10464

:100 mark x
:100 kx

10465

Miscellaneous Commands

10466
10467

The following sections describe some miscellaneous commands you can


use.

10468

The :preserve Command

10469
10470
10471
10472
10473

The :preserve (:pre) command writes out the entire file to the "swap" file.
This makes it possible to recover a crashed editing session without the original
file. (If you do not use this command, you need both the swap file and the
original to perform recovery.) See Chapter 14: File Recovery and Command-Line
Arguments, for information on recovering crashed sessions.

10474

The Shell Commands

10475
10476

To execute a single shell command, use the following Vim command (where
cmd is the system command to execute):

10477

:!cmd

10478

To find the current date, for instance, use this command:

10479

:!date

10480

The following command repeats the last shell command you executed:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 440

Draft Not for publication


10481
10482
10483
10484

Draft 0.1

Not for widespread publication

:!!
Finally, the following command suspends Vim and goes to the command
prompt:
:shell

10485
10486

You can now enter as many system commands as you want. After you have
finished, you can return to Vim with the exit command.

10487

Shell Configuration

10488

The following several options control the actual execution of a command.


'shell'
'sh'
'shellcmdflag'
'shcf'
'shellquote'
'shq'
'shellxquote'
'sxq'
'shellpipe'
'sp'
'shellredir'
'srr'
'shellslash'
'ssl'
'quoteescape'
'qe'
'shelltmp'
'stmp'

The name of the shell (command processor).


Flag that comes after the shell.
The quote characters around the command.
The quote characters for the command and the
redirection.
String to make a pipe.
String to redirect the output.
Use forward slashes in filenames (MS-DOS only).
Defines the character to use for quoting the escape
(/) character.
Use temporary files if set. Otherwise use pipes.

10489

Command History

10490
10491

The :history (:his) command prints out the current command-mode


command history:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 441

Draft Not for publication


10492
10493
10494
10495
10496
10497
10498
10499
10500

10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522

Draft 0.1

Not for widespread publication

:history
# cmd history
2 1 print
3 5
4 7 print
5 . print
>
6 history
The Vim editor maintains a set of histories for various commands. A code
identifies each of these:
Code
c
s
e
i

History
cmd
search
expr
input

all

Type
:
Command-line history (command-mode commands)
/
Search strings (See Chapter 3: Searching)
=
Expression register history
@
Input line history (data typed in response to an
:input operator)
All histories

Therefore, to get a list of all the various history buffers, use the :history
all command:
:history all
# cmd history
2 1 print
35
4 7 print
5 . print
6 history
>
7 history all
# search history
1 human
2 uni
3 comp
4 Seem
>
5 \<At\>
# expr history
1 55
2 2*88
>
3 5+99
# input history
Press Return or enter command to continue

10523

The general form of the :history command is as follows:

10524

:history code first , last

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 442

Draft Not for publication


10525
10526
10527
10528
10529

Draft 0.1

Not for widespread publication

If no first and last are specified, the whole history is listed. The first
parameter defaults to the first entry in the history, and the last defaults to the
last. Negative numbers indicate an offset from the end of the history. For
example, -2 indicates the next-to-last history entry. The following command, for
example, list history entries 1 through 5 for command-mode commands:

10530

:history c 1,5

10531

And, this next command lists the last 5 search strings:

10532

:history s -5,

10533

Setting the Number of Remembered Commands

10534
10535
10536

The 'history' ('hi') option controls how may commands to remember for
command mode (: mode) commands. To increase the number of commands to
remember (to 50, for instance), use this command:

10537

:set history=50

10538

Viewing Previous Error Messages

10539
10540
10541

The Vim editor keeps track of the last few error and information messages
displayed on the last line of the screen. To view the message history, use the
:messages (:mes) command:

10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552

:messages
"../joke.txt" 6092 lines, 174700 characters
Entering Ex mode. Type "visual" to go to Normal
mode.
search hit BOTTOM, continuing at TOP
Not an editor command: xxxxx
search hit BOTTOM, continuing at TOP
search hit BOTTOM, continuing at TOP
Pattern not found: badbad
Not an editor command: :^H
Invalid address

10553

Redirecting the Output

10554
10555

The :redir (:redi) command causes all output messages to be copied to


the file as well as to appear on the screen:

10556

:redir > file

10557

To end the copying, execute the following command:

10558

:redir END

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 443

Draft Not for publication

Draft 0.1

Not for widespread publication

10559
10560

This command proves useful for saving debugging information or messages


for inclusion in a book.

10561
10562

You can also use the :redir command to append to a file by using this
command:

10563

:redir >> file

10564

Executing a :normal Command

10565
10566
10567

The :normal (:norm) command executes a normal-mode command. The


following command, for instance, changes the word where the cursor is located
to the word DONE:

10568

:normal cwDONE<Esc>

10569
10570
10571
10572
10573

The group of commands is treated as one for the purposes of undo/redo.


The command should be a complete command. If you leave Vim hanging
(suppose that you executed a command cwDone, for instance), the display will not
update until the command is complete. If you specify the '!' option, mappings
will not be done on the command.

10574

Getting Out

10575
10576

The :exit (:exi, :xit, :x) command writes the current file and closes the
window:

10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587

:exit
When the last window is closed, the editor stops. If the override flag (!) is
given, an attempt will be made to write the file even if it is marked read-only.
You can also specify a filename on the command line. The data will be written to
this file before exiting. The following command, for example, saves the current
file in save-it.txt and exits.
:exit save-it.txt
If you want to save only a portion of the file, you can specify a range of
lines to write. To save only the first 100 lines of a file and exit, for example, use
this command:
:1,100 exit save-it.txt

10588

Write and Quit

10589
10590

The following command does the same thing that :exit does, except it
always writes the file:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 444

Draft Not for publication

Draft 0.1

Not for widespread publication

10591

:range wq! file

10592

The :exit command writes only if the file has been changed.

10593

Advanced Hardcopy

10594
10595

The :hardcopy (:ha) command will print the file to the line printer. You
can also send the printed output to a file with the command:

10596

:[range]hardcopy[!] > file

10597
10598
10599

Warning: The command always overwrites the file without warning. The
override option (!) is used only to automatically select the default printer when
using Microsoft Windows.

10600
10601
10602

On Linux and UNIX the output file is written in Postscript format. On


Microsoft Windows, it's written in the printer's native format using the print to
file feature of Microsoft Windows.

10603
10604
10605

Normally the file is printed to the default printer. To change the name of
the printer, set the 'printerdev' ('pdev') option. For example, to go to the
printer named Fred, execute the command:

10606

:set printerdev=Fred

10607
10608

The 'printfont' ('pfn') tells the printer what font to use. The actual font
name is the same as for the 'guifont' option. (See page 475.)

10609
10610
10611

The 'encoding' ('enc') option Vim what encoding to use for the text in
the file. If you wish to use a different encoding for printing set the
'printencoding' ('penc') option.

10612
10613
10614
10615

If you are printing CJK (Korean), the 'printmbfont' ('pmbfn') option


controls what fonts are used for printing. Also the 'printmbcharset' ('pmbcs')
option controls the character set to be used. Unfortunately the Korean language
is beyond the scope of this book.

10616
10617
10618

The format of the header is controlled by the 'printheader' ('pheader')


expression. The format of this option is exactly the same as that of the
'statusline' option (see page 475).

10619
10620
10621

Finally the 'printexpr' ('pexpr') option sets the expression to use for
printing. The expression is passed in the variables v:fname_in as the file to be
printed. This file must be deleted by the expression.

10622
10623

Also the variable v:cmdarg contains any arguments to the :hardcopy


command.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 445

Draft Not for publication

Draft 0.1

Not for widespread publication

10624

Chapter 26: Advanced GUI Commands

10625
10626

The Vim editor is highly configurable. This chapter shows you how to
customize the GUI. Among other things, you can configure the following in Vim:

10627

The size and location of the window

10628

The display of menus and toolbars

10629

How the mouse is used

10630

The commands in the menu

10631

The buttons on the toolbar

10632

The items in the pop-up menu

10633
10634

The remainder of this chapter introduces you to the commands that enable
you to customize all these features.

10635

Switching to the GUI Mode

10636
10637

Suppose you are editing in a terminal window and want to switch to the
GUI mode. To do so, use the :gui (:gu, :gvim, :gv) command:

10638

:gui

10639

Window Size and Position

10640
10641
10642
10643
10644

When you first start gvim (GUI Vim), the window is positioned by the
windowing system. The size of the window on UNIX is set to the size of the
terminal window that started the editor. In other words, if you have a 2480
xterm window and start gvim, you get a 2480 editing window. If you have a
larger window, say 50132, you get a 50132 editing window.

10645
10646

On UNIX you can tell gvim to start at a given location and size by using the
-geometry flag. The general format of this option is as follows:

10647
10648
10649
10650

-geometry {width}x{height}-{x_offset}+{y_offset}
The width and height options specify the width and height of the window
(in characters). The x-offset and y-offset tell the X Windows System where to put
the window.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 446

Draft Not for publication

Draft 0.1

Not for widespread publication

10651
10652
10653
10654

The x-offset specifies the number of pixels between the left side of the
screen and the right side of the window. If the x-offset specification is negative,
it specifies the distance between the left edge of the editor and the right side of
the screen.

10655
10656

Similarly, the y-offset specifies the top margin, or if negative, the bottom
margin.

10657
10658
10659
10660

Thus, the -geometry +0+0 option puts the window in the upper-left corner,
whereas -geometry -0-0 specifies the lower-right corner. The width and height
parameters specify how big the editing window is to be in lines and columns. To
have a 24-by-80 editing window, for example, use the option -geometry 80x24.

10661

Figure 26-1 shows how these options work.

10662

y offset

Height

x offset

width

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 447

Draft Not for publication


10664

Draft 0.1

Not for widespread publication

Figure 26-1: -geometry option.

10665

Microsoft Windows Size and Position Command-Line Specification

10666
10667
10668
10669

The Microsoft Windows version of gvim starts with an editing window of


8025. The gvim editor uses the standard Microsoft Windows command-line
option to specify an initial size and position. Because Microsoft Windows does
not have a standard option for this value, gvim does not have one either.

10670

Moving the Window

10671
10672

The :winpos (:winp) command displays the current location (in pixels) of
the upper-left corner of the window:

10673

:winpos

10674

If you want to move the window, you can use this command:

10675

:winpos X Y

10676
10677
10678
10679

To position the screen 30 pixels down and 20 pixels over from the left, for
instance, use the following command:
:winpos 20 30
Window Size

10680

The following command displays the number of lines in the editing window:

10681

:set lines?

10682

To change this number, use this command:

10683

:set lines=lines

10684

Lines is the number of lines you want in the new editing window.

10685
10686
10687

To change the number of columns on the screen, use the 'columns' ('co')
option:
:set columns=columns

10688

The :winsize Command

10689
10690
10691

Older versions of Vim used a :winsize (:wi) command. This command is


deprecated because the :set lines and :set columns commands have
superseded it.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 448

Draft Not for publication

Draft 0.1

Not for widespread publication

10692

The 'guioptions'

10693
10694

You can control a number of GUI-based features with the 'guioptions'


('go') option. The general form this command is as follows:

10695

:set guioptions=options

10696

Options is a set of letters, one per option.

10697

The following options are defined:

10698
10699
10700
10701
10702
10703

Autoselect

When set, if you select text in the visual mode, Vim


tries to put the selected text on the system's global
clipboard. This means that you can select text in
one Vim session and paste it in another using the
"*p command. Without this option you must use
the "*y command to copy data to the clipboard.

10704
10705
10706
10707
10708
10709

It also means that the selected text has been put on


the global clipboard and is available to other
applications. On UNIX, for example, this means
that you can select text in visual mode, and then
paste it into an xterm window using the middle
mouse button.

10710
10711
10712
10713
10714
10715

If you are using Microsoft Windows, any text


selected in visual mode is automatically placed on
the clipboard. (Just as the Copy ^C menu item does
in most other applications.) This means that you
can select the text in Vim and paste it into a
Microsoft Word document.

10716
10717
10718
10719
10720
10721
10722
10723
10724

Foreground

On UNIX, the gvim command executes a fork()


command so that the editor can run in the
background. Setting this flag prevents this, which
is useful if you are writing a script that needs to
run the gvim command to let the user edit a file,
and that needs to wait until the editing is done.
(The -f command-line option accomplishes the
same thing.) The f flag also proves useful if you
are trying to debug the program.

10725
10726

Note: You must set this in the initialization file (because by the time you
can set it from the edit window, it is too late).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 449

Draft Not for publication


10727
10728
10729
10730
10731
10732
10733

Icon

Draft 0.1

If set, gvim displays an attractive icon when the


editor is minimized if you are using a window
manager which displays programs on the
background.. If not present, the program just
displays the name of the file being edited with no
icon, (see Figure 26-2). (Note: This works only on
certain types of window managers.)

:set guiopt+=i
10734
10735

Not for widespread publication

:set guiopt-=i

Figure 26-2: i option


m

Menu

10736

Display menu bar (see Figure 26-3)

m Option

10737

10738

no m Option

10739
10740
10741
10742
10743

Figure 26-3: m option.


M

No menu

If this option is present during initialization, the


system menu definition file
$VIMRUNTIME/menu.vim is not read in.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 450

Draft Not for publication

Draft 0.1

Not for widespread publication

10744
10745

Note: This option must be set in the .vimrc file. (By the time .gvimrc is
read, it is too late.)

10746
10747
10748

Gray

Turn menu items that cannot be used gray. If not


present, these items are removed from the menu
(see Figure 26-4).

Grey

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 451

Draft Not for publication

Draft 0.1

Not for widespread publication

Removed

10751

Figure 26-4: g option.

10752

Tear off

Enable tear off menus.

10753

Toolbar

Include toolbar (see Figure 26-5)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 452

Draft Not for publication


10756

Draft 0.1

Not for widespread publication

Figure 26-5: T option

10757

Right scrollbar

Put a scrollbar on the right (see Figure 26-6).

10758

Left scrollbar

Put a scrollbar on the left (see Figure 26-6).

10759

Bottom scrollbar Put a scrollbar on the bottom (see Figure 26-6).

10760

b option

l option

10762
10763
10764
10765

10767

r option

Figure 26-6: Scrollbars.


v

Vertical dialog boxes


Use vertical alignment for dialog boxes (see Figure
26-7).

Figure 26-7: v option.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 453

Draft Not for publication


10768

Draft 0.1

Not for widespread publication

Pointer callback fix

10769
10770
10771
10772

This option is designed to fix some problems that


might occur with some X11 window managers. It
causes the program to use pointer callbacks. You
must set this in the .gvimrc file.

10773

Changing the Toolbar

10774
10775

The 'toolbar' ('tb') option controls the appearance of the toolbar. It is a


set of values:

10776

icon

Display toolbar icons

10777

text

Display text

10778

tooltips

10779

The default displays ToolTips and icons:

10780

:set toolbar=icons,tooltips

10781

Figure 26-8 shows how this option affects the screen.

When the cursor hovers over an icon, display a ToolTip.

Save all files

10783

:set toolbar=icons,tooltips

10785

:set toolbar=icons,text,tooltips
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 454

Draft Not for publication

Draft 0.1

Not for widespread publication

10786
10787

:set toolbar=text,tooltips

10788

10790

Figure 26-8: The 'toolbar' option.

10791
10792

Note: To turn off the toolbar, you cannot set this option to the empty
string. Instead use the following command:

10793

:set guioptions -= T

10794
10795
10796

You can also customize the size of the icons using the 'toolbariconsize'
('tbis') option. (This only works if you are using the GTK+2 gui.) The value of
this option are tiny, small, medium, and large.

10797

Customizing the Icon

10798
10799
10800

If you are editing in a terminal window, some terminals enable you to


change the title of their window and their icon. If you want Vim to try to change
the title to the name of the file being edited, set this option:

10801
10802
10803
10804

:set title
Sometimes the name of the file with its full path name is longer than the
room you have for the title. You can change the amount of space used for the
filename with the following command:

10805

:set titlelen=85

10806

In this case, the title text can consume 85% of the title bar. For example:

10807

:set titlelen=45

10808

Figure 26-9 shows how 'titlelen' can affect the display.

10809

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 455

Draft Not for publication

10811
10812
10813
10814
10815
10816
10817
10818

Draft 0.1

Not for widespread publication

Figure 26-9: 'titlelen' option.


If you do not like what Vim selects for your title, you can change it by
setting the following:
:set titlestring=Hello\ World!
When you exit Vim, it tries to restore the old title. If it cannot restore it
(because it is impossible to remember it), the editor sets the title to the string
specified by the 'titleold' option. For example:
:set titleold=vim\ was\ here!

10819
10820
10821

When the window is iconified, the icon option tells Vim whether to attempt
to put the name of the file in the icon title. If this option is set, Vim attempts to
change the icon text.

10822
10823

If you do not like the Vim default, you can set the 'iconstring' option and
that text will be used for the icon string.

10824
10825
10826

The 'icon' option, if set causes the string under the icon to contain the
name of the file being edited (or the value of 'iconstring' if set). If the option is
turned off, the icons just have the generic title Vim.

10827
10828

This only works with certain types of window managers which do not
include the major Linux desktops KDE and Gnome.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 456

Draft Not for publication

Draft 0.1

Not for widespread publication

10829

Mouse Customization

10830
10831
10832
10833

The Vim editor is one of the few UNIX text editors that is mouse-aware.
That means you can use the mouse for a variety of editing operations. You can
customize the utility of the mouse by using the options discussed in the following
sections.

10834

Mouse Focus

10835
10836
10837
10838
10839

Generally when you want to move from one Vim editing window to another,
you must use one of the window change commands such as CTRL-Wj or CTRL-Wk
or click the mouse inside that window. If you set the 'mousefocuse' ('mousef')
option, the current Vim editing window is the one where the mouse pointer is
located:

10840

:set mousefocus

10841
10842
10843
10844
10845

Note: This option affects only the windows within a Vim session. If you are
using the X Windows System, the selection of the current window (X Client
window) is handled by the window manager. On Microsoft Windows, the
current window selection is handled by Microsoft Windows, which always
forces you to use "click to type."

10846

The 'mousemodel' Option

10847
10848
10849

The 'mousemodel' ('mousem') option defines what the mouse does. There
are three possible modes: extend, popup, and popup_setpos. To set the mouse
model, use the following command:

10850

:set mousemodel=mode

10851
10852

In all modes, the left mouse button moves the cursor, and dragging the
cursor using the left button selects the text.

10853
10854

In extend mode, the right mouse button extends the text and the middle
button pastes it in. This behavior is similar to the way an xterm uses the mouse.

10855
10856
10857

In popup mode, the right mouse button causes a small pop-up menu to
appear. This behavior is similar to what you find in most Microsoft Windows
applications.

10858
10859
10860

The popup_setpos mode is exactly like popup mode, except when you press
the right mouse button, the text cursor is moved to the location of the mouse
pointer, and then the pop-up menu appears.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 457

Draft Not for publication


10861
10862

Draft 0.1

Not for widespread publication

The following table illustrates how 'mousemodel' affects the mouse


buttons.
Mouse

extend

popup

popup_setpos

Left

Place cursor

Place cursor

Place cursor

Drag-left

Select text

Select text

Select text

Shift-left

Search word

Extend selection

Extend selection

Right

Extend selection

Pop-up menu

Move cursor, and


then pop-up menu

Drag-right

Extend selection

Middle

Paste

Paste

Paste

10863

Mouse Configuration

10864
10865

The 'mouse' option enables the mouse for certain modes. The possible
modes are as follows:

10866

Normal

10867

Visual

10868

Insert

10869

Command-line

10870

All modes when in a help file except "hit-return"

10871

All modes except the "hit-return"

10872

"more-prompt" and "hit-return" prompt

10873

Mouse Mapping

10874
10875
10876
10877
10878
10879
10880

The left mouse button (<LeftMouse>) moves the text cursor to where the
mouse pointer is located. The <RightMouse> command causes Vim to enter
visual mode. The area between the text cursor and the mouse pointer is
selected. The <MiddleMouse> acts like the P command and performs a put to
insert in the unnamed register in the file. If you precede the mouse click with a
register specification (such as "a, for instance), the contents of that register are
inserted.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 458

Draft Not for publication

Draft 0.1

Not for widespread publication

10881
10882
10883
10884

If you have a wheel on your mouse, the up-wheel (<MouseUp>) moves three
lines up. Similarly, a down-wheel movement (<MouseDown>) moves three lines
down. If you press Shift, the screen moves a page. In other words, <S-MouseUp>
goes up a page and <S-MouseDown> goes down a page.

10885

Double-Click Time

10886
10887

The 'mousetime' ('mouset') option defines the maximum time between


the two presses of a double-click. The format of this command is as follows:

10888

:set mousetime=time

10889

Time is the time in milliseconds. By default, this is half a second (500ms).

10890

Hiding the Mouse Cursor

10891
10892
10893
10894

When you are editing with the GUI, you have a text cursor and a mouse
pointer to deal with. If that is too confusing, you can tell Vim to turn off the
mouse pointer when not in use. To enable this feature, set the 'mousehide'
('mh') option:

10895

:set mousehide

10896
10897

When you start typing, the mouse pointer disappears. It reappears when
you move the mouse.

10898

Select Mode

10899
10900
10901

The 'selectmode' ('slm') option defines when the editor starts select
mode instead of visual mode. The following three events can trigger select
mode:

10902

mouse

Moving the mouse (see 'mousemodel', discussed earlier)

10903

key

Using some special keys

10904

cmd

The v, V, or CTRL-V command

10905

The general form of the command is as follows:

10906

:set selectmode=mode

10907

Mode is a comma-separated list of possible select events (mouse, key, cmd).

10908
10909
10910

The 'keymodel' ('km') option allows the keys <Left>, <Right>, <Up>,
<Down>, <End>, <Home>, <PageUp>, and <PageDown> to do special things. If you set
this option as follows, Shift+key starts a selection: The
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 459

Draft Not for publication


10911
10912
10913

Draft 0.1

Not for widespread publication

:set keymodel=startsel
If the option is set as follows, an unshifted key results in the section being
stopped:

10914

:set keymodel=stopsel

10915

You can combine these options as well, as follows:

10916

:set keymodel=startsel,stopsel

10917
10918
10919
10920
10921
10922
10923
10924
10925
10926
10927
10928
10929

Custom Menus
The menus that Vim uses are defined in the file $VIMRUNTIME/menu.vim.
If you want to write your own menus, you might first want to look through
that file. To define a menu item, use the :menu (:me) command. The basic form
of this command is as follows:
:menu menu-item command-string
(This command is very similar to the :map command.) The menu-item
describes where on the menu to put the item. A typical menu-item is File.Save,
which represents the item Save under the menu File. The ampersand character
(&) is used to indicate an accelerator. In the gvim editor, for instance, you can
use Alt-F to select File and S to select save. Therefore, the menu-item looks
like &File.&Save. The actual definition of the File.Save menu item is as follows:
:menu 10.340 &File.&Save<Tab>:w :confirm w<CR>

10930
10931
10932
10933

The number 10.340 is called the priority number. It is used by the editor
to decide where it places the menu item. The first number (10) indicates the
position on the menu bar. Lower numbered menus are positioned to the left,
higher numbers to the right.

10934
10935

The second number (340) determines the location of the item within the
pulldown menu. Lower numbers go on top, higher number on the bottom.

10936
10937
10938
10939
10940

Figure 26-10 diagrams the priorities of the current menu items. The menuitem in this example is &File.&Save<Tab>:w. This brings up an important point:
menu-item must be one string. If you want to put spaces or tabs in the name,
you either use the <> notation (<space>, <tab>, for instance) or use the
backslash (\) escape.

10941
10942
10943
10944

:menu 10.305 &File.&Do\ It :exit<CR>


In this example, the name of the menu item contains a space (Do It) and
the command is :exit<CR>. Finally, you can define menu items that exist for only
certain modes. The general form of the menu command is as follows:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 460

Draft Not for publication


10945
10946
10947

Not for widespread publication

:mode menu priority menu-item command-string


10

20

40

10949
10950

Draft 0.1

50

60

70

9999

Figure 26-10: Menu item priorities.


The mode parameter is one of the following:
Character
a
n
v
x
o
i
c

Mode
Normal, visual, and
335operator-pending
Normal
Visual / Select
Visual
Operator-pending. (:omenu, :ome)
Insert
Command line 405

10951
425
vim-all-good.odt (28. Sep. 2007) The Vim Book

310
320
330
340
350
360
370
380
400
410
420
430
440
Page
440461
440
450
470

Draft Not for publication


10952
10953

Draft 0.1

Not for widespread publication

Special Menu Names


There are some special menu names. These are
ToolBar
PopUp

The toolbar (the icons under the menu)


The pop-up window that appears when you press the right
mouse button in the edit window in certain modes

10954

Limiting the Maximum Number of Generated Items

10955
10956
10957

Some menus like the Buffers menu contain a dynamically generated list.
In the case of the Buffers menu it's a list of buffers. The 'menuitems' ('mis')
option controls how many items can be generated.

10958

Toolbar Icons

10959
10960
10961
10962

The toolbar uses icons rather than text to represent the command. The
name of the icon is taken from the name of the menu item. For example, the
menu-item named ToolBar. New causes the New icon to appear on the toolbar.
The Vim editor has 28 built-in icons. The following table lists these.

10963
10964

Each icon has two names. The New icon, for instance, can be specified as
ToolBar.New or ToolBar.builtin00.

10965
10966
10967
10968

The editor looks for a file in the $VIMRUNTIME/pximaps directory for the
icon, then will search its internal list of icons. The name of the icon file is
NAME.BMP on Microsoft Windows and tb_{name}.xpm on UNIX. On Microsoft
Windows, the icon may be any size. On UNIX, it must be 2020 pixels.

10969
Icon

Name
New

Alternative Name
builtin00

Open

builtin01

Save

builtin02

Undo

builtin03

Redo

builtin04

Cut

builtin05

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 462

Draft Not for publication


Icon

Draft 0.1

Name
Copy

Alternative Name
builtin06

Paste

builtin07

Print

builtin08

Help

builtin09

Find

builtin10

SaveAll

builtin11

SaveSesn

builtin12

NewSesn

builtin13

LoadSesn

builtin14

RunScript

builtin15

Replace

builtin16

WinClose

builtin17

WinMax

builtin18

WinMin

builtin1

WinSplit

builtin20

Shell

builtin21

FindPrev

builtin22

FindNext

builtin23

FindHelp

builtin24

Make

builtin25

TagJump

builtin26

vim-all-good.odt (28. Sep. 2007) The Vim Book

Not for widespread publication

Page 463

Draft Not for publication


Icon

Name
RunCtags

Draft 0.1

Not for widespread publication

Alternative Name
builtin27

10970

Toolbar Tips

10971
10972

The toolbar can display a "tip" when the cursor is placed over an icon. To
define the tip, issue the :tmenu (:tm) command:

10973
10974
10975
10976

:tmenu menu-item tip


For example, the following command causes the tip Open file to display
when the cursor rests over the Open icon (see Figure 26-11):
:tmenu ToolBar.Open Open file

10977
10978

Figure 26-11: ToolTip.


Listing Menu Mappings

10979

The following command lists all the menu mappings:

10980

:menu

10981

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 464

Draft Not for publication


10982
10983
10984
10985
10986
10987
10988
10989
10990
10991
10992
10993
10994
10995
10996
10997
10998
10999

11000
11001
11002
11003
11004
11005

:menu
---- Menus
1 ToolBar
10 Open
n*
v*
s*
o*
20 Save
n*s
v*s
C-\><C-G>
s*s
C-\><C-G>
o*s

Draft 0.1

Not for widespread publication

---

:browse confirm e<CR>


<C-C>:browse confirm e<CR><C-\><C-G>
<C-C>:browse confirm e<CR><C-\><C-G>
<C-C>:browse confirm e<CR><C-\><C-G>
:if expand("%") == ""|browse confirm w|else|confirm w|endif<CR>
<C-C>:if expand("%") == ""|browse confirm w|else|confirm w|endif<CR><
<C-C>:if expand("%") == ""|browse confirm w|else|confirm w|endif<CR><
<C-C>:if expand("%") == ""|browse confirm w|else|confirm w|endif<CR><

... lots of other lines ...

The problem with the :menu command is that you get 51 screens of data.
That is a lot. To get just the menu items for a specific top-level menu, use the
following command:
:menu menu
For example, the following command lists only the menu items for the File
menu:

11006

:menu File

11007

The next command lists the items for just the File.Save menu:

11008

:menu File.Save

11009
11010
11011
11012
11013
11014
11015
11016
11017
11018
11019

11020
11021
11022

:menu File.Save
--- Menus --340 &Save^I:w
n*s :if expand("%") == ""|browse confirm w|else|confirm w|endif<CR>
v*s <C-C>:if expand("%") == ""|browse confirm w|else|confirm w|endif<CR><C\><C-G>
s*s <C-C>:if expand("%") == ""|browse confirm w|else|confirm w|endif<CR><C\><C-G>
o*s <C-C>:if expand("%") == ""|browse confirm w|else|confirm w|endif<CR><C\><C-G>

The letters at the beginning of each line denote the mode in which the
command applies. They correspond to the letters used for the mode parameter
described earlier.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 465

Draft Not for publication

Draft 0.1

Not for widespread publication

11023

Executing a Menu Item

11024
11025

The :emenu (:en) command executes the menu-item as if the user had
selected the command from the menu:

11026

:emenu menu-item

11027

No Remapping Menus

11028
11029
11030

The :menu command defines a menu item. If you want to define an item
and make sure that no mapping is done on the right side, use the :noremenu
(:noreme) command.

11031

Like other mapping commands this has several forms depending on mode:

11032
Command

Normal

Visual

Operator
Pending

Insert

Command
Line

:noremenu

:nnoremenu
:nnoreme

:noremenu!

:inoremenu
:inoreme

:vnoremenu
:vnoreme
:onoremenu
:onoreme

:cnoremenu
:cm

11033
11034
11035

Removing Menu Items

11036

The following command removes an item from the menu:

11037

:mode unmenu menu-item

11038
11039

If you use an asterisk (*) for the menu-item, the entire menu is erased. To
remove a ToolTip, use the :tunmenu (:tu) command:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 466

Draft Not for publication


11040

Draft 0.1

Not for widespread publication

:tunmenu menu-item

11041

Tearing Off a Menu

11042
11043

You can tear off a menu by using the dotted tear-off line on the GUI.
Another way to do this is to execute the :tearoff (:te) command:

11044

:tearoff menu-name

11045

Translating A Menu

11046
11047
11048

The base language of all built-in menus is English. If you want to add a
translation to your own language, use the :menutranslate (:menut) command.
For example:

11049

:menutranslate Open Abierto

11050
11051

Now when you have Open as an item in a menu, Abierto will be


displayed instead.

11052
11053
11054

You'll find a whole lot of menu translation files in the $VIMRUTIME/lang


directory. Depending on the setting of v:lang, a file in this directory called
menu_{v_lang}.vim will be loaded.

11055
11056

If you want to have your own translations properly loaded into Vim you
need to execute the following commands in order:

11057
11058
11059
11060
11061
11062

:source $VIMRUNTIME/delmenu.vim
:menutranslate {English} {Other}
: ... more :menutranslate commands
:source $VIMRUNTIME/menu.vim

11063
11064
11065

The actual translation that's used for the menu is controlled by the
'languagemenu' ('lm') option. Set this to your local language if you need to
understand the menus.

11066
11067

To clear the current set of menu translations, use the :menutranlate


clear command.

11068

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 467

Draft Not for publication

Draft 0.1

Not for widespread publication

11069

Special GUI Commands

11070
11071
11072

The Vim editor has many commands designed for use in GUI-based menus.
These commands are all based around various dialog boxes (such as the file
browser connected with the File.Open menu).

11073

The File Browsers

11074
11075
11076

The :browse (:bro) command opens up a file browser and then executes a
command on the file selected. For example, the following command opens a file
browser and enables the user to select a file (see Figure 26-12):

11077

:browse edit

11078

The editor then performs an :edit file command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 468

Draft Not for publication

11080

Draft 0.1

Not for widespread publication

Figure 26-12: File browser.

11081

The general form of the :browse command is as follows:

11082

:browse command [directory]

11083
11084

The command is any editor command that takes a filename as an argument.


Commands such as :read, :write, and :edit fall into this category.

11085
11086

The [directory] parameter, if present, determines the directory in which


the browser starts.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 469

Draft Not for publication


11087
11088
11089

Draft 0.1

Not for widespread publication

If the [directory] parameter is not present, the directory for the browser
is selected according to the 'browsedir' ('bsdir') option. This option can have
one of three values:

11090

last

11091

buffer

Use the same directory as the current buffer.

11092

current

Always use the current directory.

11093
11094
11095

Use the last directory browsed (default).

Therefore, if you always want to start in the current directory, put the
following command in your initialization file:
:set browsedir=current

11096

Finding a String

11097
11098

The :promtfind (:pro) command displays a search dialog box (see Figure
26-13):

11099

:promptfind [string]

11100

11102

Figure 26-13: :promptfind dialog box.

11103
11104
11105

If a string is specified, the string is used as the initial value of the Find
What field. When the user presses the Find Next button, the Vim editor searches
for the given string.

11106

Replace Dialog Box

11107
11108

There is a similar dialog box for the replace command. The :promptrepl
(:promptr) command displays a Replace dialog box (see Figure 26-14):

11109

:promptrepl [string]

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 470

Draft Not for publication

Draft 0.1

Not for widespread publication

11110

11112
11113

Figure 26-14: :promptrepl dialog box.


If a string parameter is present, it is used for the Find What parameter.

11114

Finding Help

11115
11116

The :helpfind (:helpf) command brings up a dialog box that enables you
to type in a subject that will be used to search the help system:

11117

:helpfind

11118

Confirmation

11119
11120
11121
11122
11123

The :confirm (:conf) command executes a command such as :quit that


has the potential for destroying data. If the execution of the command would
destroy data, a confirmation dialog box displays. For example, the following
command on a modified buffer results in the dialog box displayed in Figure 2615:

11124
11125

:confirm :quit

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 471

Draft Not for publication

Draft 0.1

Not for widespread publication

11126

11128

Figure 26-15: Confirmation dialog box.

11129
11130
11131

Note: This command works for the terminal version of Vim as well, but the
Confirmation dialog box does not look as nice. This is illustrated in Figure
26-16.

11132
11133
11134
11135
11136
11137

This is a test

:confirm :q
Save changes to "Untitled"?
[Y]es, (N)o, (C)ancel:

11138

Figure 26-16: Confirmation without a GUI.

11139

Browsing the Options

11140
11141

The :browse set (:bro set, :opt, :options) command opens a window
that enables you to browse through the options:

11142

:browse set

11143

Figure 26-17 shows the screen.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 472

Draft Not for publication


11144
11145
11146
11147
11148
11149
11150
11151
11152
11153
11154
11155
11156
11157
11158
11159

"
"
"
"
"
"
"

1 important
2 moving around, searching and patterns
3 tags
option-window
~
[No Name]
"option-window" [New File]

Figure 26-17: :browse set.


This window gives you access to all the options. The beginning is a short
table of contents, starting with the following:

11163
11164
11165
11166
11167
11168
11169
11170
11171
11172
11173
11174
11175
11176
11177
11178
11179
11180
11181
11182
11183
11184
11185

11186

Not for widespread publication

Each "set" line shows the current value of an option (on the left).
Hit <CR> on a "set" line to execute it.
A boolean option will be toggled.
For other options you can edit the value.
Hit <CR> on a help line to open a help window on this option.
Hit <CR> on an index line to jump there.
Hit <Space> on a "set" line to refresh it.

11160
11161
11162

Draft 0.1

1 important
2 moving around, searching and patterns
You can use the cursor commands to position the cursor on one of the
items and press <CR> to get a list of the options for this section. If you were to
move the cursor down to the first entry (important) and press <CR>, for instance,
you would get Figure 26-18.
1 important
compatible
cpoptions
insertmode
paste
pastetoggle
option-window

behave very Vi compatible (not advisable)


set nocp
cp
list of flags to specify Vi compatibility
set cpo=aABceFs
use Insert mode as the default mode
set noim
im
paste mode, insert typed text literally
set nopaste
paste
key sequence to toggle paste mode

~
~
[No Name]
/ 1 important

Figure 26-18: :browse set detail screen.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 473

Draft Not for publication


11187
11188
11189
11190
11191
11192
11193
11194
11195
11196
11197
11198
11199
11200
11201
11202
11203
11204
11205
11206
11207
11208
11209
11210
11211
11212
11213
11214
11215

Draft 0.1

Not for widespread publication

The first option in this window is the 'compatible' option. According to


the help text beside it, setting this option causes Vim to "behave very Vi
compatible (not advisable). "The abbreviation for this option is 'cp', and the
current setting is 'nocp'. If you move down to the 'compatible' line and press
<CR>, you get a full help screen on the option (see Figure 26-19).
*'compatible'* *'cp'* *'nocompatible'* *'nocp'*
boolean (default on, off when a |vimrc| or |gvimrc|
file is found)
global
{not in Vi}
This option has the effect of making Vim either more Vi-compatible, or
make Vim behave in a more useful way.
This is a special kind of option, because when it's set or reset,
other options are also changed as a side effect. CAREFUL: Setting or
resetting this option can have a lot of unexpected effects: Mappings
are interpreted in another way, undo behaves differently, etc. If you
set this option in your vimrc file, you should probably put it at the
very start.
By default this option is on and the Vi defaults are used for the
options. This default was chosen for those people who want to use Vim
just like Vi, and don't even (want to) know about the 'compatible'
option.
When a |vimrc| or |gvimrc| file is found while Vim is starting up,
options.txt [Help][RO]
compatible
behave very Vi compatible (not advisable)
option-window
'compatible' 'cp'

[No Name]

11216

Figure 26-19: :browse set help screen.

11217
11218
11219
11220

If you close the help screen and move down to the set nocp line and press
<CR>, the option is toggled. (This works for all Boolean options.) The next option
('cpoptions') is a string. To change its value, just edit it using the normal Vim
editing commands, and then press <CR> to set the option to this value.

11221

Using the Clipboard

11222
11223
11224

The 'clipboard' ('cl') option controls how Vim treats text selected with
the mouse. If you use the following command, Vim takes all the text that should
go in the unnamed register and puts it in the clipboard register:

11225
11226
11227
11228

:set clipboard=unnamed
This means that the text is placed on the system clipboard and can be
pasted into other applications.
Another option is this:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 474

Draft Not for publication


11229

Draft 0.1

Not for widespread publication

:set clipboard=autoselect

11230
11231
11232

When this option is set, any text selected in visual mode is put on the
system clipboard (if possible). (The a flag of the 'guioptions' ('go') option
does the same thing.)

11233
11234

Vim.

11235

Coloring

11236
11237
11238

opt-guioptionsd(27-3)When Vim starts the GUI, it tries to figure out


whether you have a light or dark background and performs the 'background'
('bg') option to set the proper value:

The 'autoselect' option works for both the GUI and console versions of

11239

:set background=value

11240
11241

The syntax files use the value of this option to determine which colors to

11242
11243
11244
11245
11246
11247

use.
Warning: When the GUI is started, the value of this option is light.
The .gvimrc file is then read and processed. After this, the window is
created. Only after the window is created can Vim tell the color of the
background, so it is only after this that the background option is set. This
means that anything in the .gvimrc that depends on the background being
correct will fail.

11248

Selecting the Font

11249
11250

If you do not like the font that Vim uses for its GUI, you can change it by
using the 'guifont' ('gfn') option:

11251
11252
11253
11254
11255
11256

:set guifont=font
Font is the name of a font. On an X Windows System, you can use the
command xlsfonts to list out the available fonts. On Microsoft Windows, you can
get a list of fonts from the Control Panel. You can also use the following
command:
:set guifont=*

11257
11258

This command causes Vim to bring up a font selection window from which
you can pick your font.

11259
11260

You can also turn on and off anti-aliasing with the 'antialias' ('anti')
option. Currently this only works on the Mac.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 475

Draft Not for publication

Draft 0.1

Not for widespread publication

11261

Customizing Select Mode

11262
11263

The 'selection' ('sel') option defines how a selection is handled. The


possible values are as follows

11264
11265
11266

old

Does not allow selection for one character past the end of
a line. The last character of the selection is included in
the operation.

11267
11268
11269

inclusive

The character past the end of the line is included, and the
last character of the selection is included in the
operation.

11270
11271
11272

exclusive

The character past the end of the line is included, and the
last character of the selection is not included in the
operation.

11273

Mouse Usage in Insert Mode

11274
11275

Clicking the left mouse button (<LeftMouse> in Vim terminology) causes


the cursor to move to where the mouse pointer is pointing.

11276
11277

If you have a wheel on your mouse, the mouse-wheel commands act just
like they do in normal mode.

11278

Microsoft Windows - Specific Commands

11279
11280
11281
11282

By setting the 'winaltkeys' ('wnk') option to "no," Vim will take over the
entire keyboard. This means that you can use the Alt key for keyboard
commands and mappings. However, Microsoft Windows generally uses the Alt
key to access menus.

11283
11284

The :simalt (:si) key simulates the pressing of Alt+key. You can use this
in the following command, for example:

11285

:map <M-f> :simalt f<CR>

11286
11287
11288

This command tells Vim that when Meta-F (Alt+f in Microsoft Windows
terminology) is pressed, the editor is to simulate the pressing of the Alt+f key.
This brings down the File menu.

11289

Changing the Appearance of the Cursor

11290
11291

The 'guicursor' ('gcr') option defines how the cursor looks for the GUI
version of Vim. The format of this command is as follows:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 476

Draft Not for publication

Draft 0.1

Not for widespread publication

11292

:set guicursor=mode:style[-highlight],mode:style[-highlight],...

11293

You can set the mode as follows:


Normal mode
Visual mode
Visual mode with 'selection' exclusive (same as v, if not
specified)
Operator-pending mode
Insert mode
Replace mode
Command-line normal (append) mode
Command-line insert mode
Command-line replace mode
showmatch in insert mode
All modes

n
v
ve
o
i
r
c
ci
cr
sm
a
11294

You can combine by separating them with hyphens, as follows:

11295

n-v-c

11296

The style is as follows:


horN
verN
block
blinkwaitN
blinkonN
blinkoffN

11297
11298
11299
11300

For normal, visual, and command modes

Horizontal bar, N percent of the character height


Vertical bar, N percent of the character width
block cursor, fills the whole character
When these options are specified, the system waits for
blinkwait milliseconds, and then turns the cursor off for
blinkoff and on for blinkon.The off/on cycle repeats.

And highlight is a highlight group name.


The 'mouseshape' ('mouses') option defines which cursor to use for the
various modes in the GUI version of Vim. The format of this command is as
follows:

11301

:set mouseshape=mode:cursor,mode:cursor,...

11302

The modes are:


a
c
ci
cr
e
i
m

Everywhere.
Appending to the command-line.
Inserting in the command-line.
Replacing in the command-line.
Any mode, pointer below last window.
Insert mode.
At the Hit ENTER or More prompts.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 477

Draft Not for publication


ml
n
o
r
s
sd
vd
ve
vs
v
11303

Draft 0.1

Not for widespread publication

At the Hit ENTER or More prompts, with cursor in the last line.
Normal mode.
Operator-pending mode.
Replace mode.
Any mode, pointer on a status line.
Any mode, while dragging a status line.
Any mode, while dragging a vertical separator line.
Visual mode with 'selection' "exclusive" (same as 'v', if not specified).
Any mode, pointer on a vertical separator line.
Visual mode.

The cursor names come from the following list:


Normal mouse pointer. (Microsoft Windows, X Window System)
I-beam. (Microsoft Windows, X Window System)
No pointer at all. (Do not use this one unless you really know
what you are doing.) (Microsoft Windows, X Window System)
busy
The system's usual busy pointer. (Microsoft Windows, X
Window System)
crosshair
Like a big thin +. (X Windows System)
hand1
Black hand. (X Windows System)
hand2
White hand. (X Windows System)
leftright
Left-right sizing arrows. (Microsoft Windows, X Window
System)
lrsizing
Indicates left-right resizing. (X Windows System)
no
The system's usual 'no input' pointer. (Microsoft Windows, X
Window System)
pencil
Cursor that looks like a pencil. (X Windows System)
question
Large question mark. (X Windows System)
rightup-arrow Arrow pointing right-up. (X Windows System)
udsizing
Indicates up-down resizing. (X Windows System)
up-arrow
Arrow pointing up. (Microsoft Windows, X Window System)
updown
Up-down sizing arrows. (Microsoft Windows, X Window System)
<number>
Any X11 pointer number. (See X11/cursorfont.h.) (X Windows
System)
arrow
beam
blank

11304

Line spacing

11305
11306

The 'linespacing' ('lsp') option tell Vim how many extra pixels of space
to put between lines.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 478

Draft Not for publication

Draft 0.1

Not for widespread publication

11307

X Windows System - Specific Commands

11308
11309
11310
11311
11312

In the X Windows System, the window manager is responsible for the


border around the window and other decorations. The 'guiheadroom' ('ghr')
option tells the Vim editor how big the margin is around the window (top and
bottom) so that when it goes into full screen mode, it can leave room for the
border.

11313

Selecting the Connection with :shell Commands

11314
11315
11316

What happens when you are using the GUI window and you try to execute
a :shell (:sh) command? Usually the system uses a UNIX device called pty to
handle the command interface.

11317

If you want to connect using a pipe, clear the 'guipty' option:

11318

:set noguipty

11319
11320
11321

Otherwise the default is used and a pty connection made between the shell
and the GUI:
:set guipty

11322

MS-DOS-Specific Commands

11323
11324

The :mode (:mod) command changes the screen mode of an MS-DOS


window:

11325

:mode mode

11326
11327

This command is effective only if you are editing inside MS-DOS; it does
not work inside a Microsoft Windows GUI.

11328
11329

Mode is an MS-DOS screen mode such as B80, B40, c80, c40, or one of the
screenmode numbers.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 479

Draft Not for publication

Draft 0.1

Not for widespread publication

11330

Chapter 27: Expressions and Functions

11331
11332
11333

The Vim Editor contains a rich scripting language. This command


language gives you tremendous flexibility when it comes to customizing your
editor for specialized tasks.

11334

This chapter covers the following:

11335

Basic variables and expressions

11336

The :echo statement Control statements

11337

User-defined functions

11338

A complete list of built-in functions

11339

Basic Variables and Expressions

11340
11341
11342

The Vim editor enables you to define, set, and use your own variables. To
assign a value to a variable, use the :let command. The general form of this
command is as follows:

11343
11344
11345
11346

:let variable = expression


The Vim editor uses the same style variable names as most other
languages--that is, a variable begins with a letter or underscore and then
consists of a series of letters, digits, and the underscore.

11347

To define the variable line_size, for example, use this command:

11348

:let line_size = 30

11349

To find out what the variable is, use the :echo (:ec) command:

11350

:echo "line_size is" line_size

11351
11352
11353
11354
11355
11356

When entered, this command results in Vim displaying the following on the
last line:
line_size is 30
Variables can contain numbers (such as 30) or strings (such as "foo"). For
example:
:let my_name = "Steve Oualline"

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 480

Draft Not for publication

Draft 0.1

Not for widespread publication

11357

Special Variable Names

11358
11359

The Vim editor uses special prefixes to denote different types of variables.
The prefixes are as follows:
Name

Use

All uppercase, digits, and


underscore

Variables which can be stored in the


.viminfo file if the 'viminfo' ('vi') option
contains the ! flag.

Initial uppercase letter,


lowercase letter somewhere
inside

Variable saved by the make session


(:mksession, :mks) command.

:let Save_this_option = 1 " Options saved in session


:let forget_this = "yes" " Discarded between sessions

11360

All lowercase, digits, and


underscore

A variable not stored in any save file.

$environment

Environment variable.

@register

Text register.

&option

The name of an option.

b:name

The variable is local to the buffer. Each


buffer can have a different value of this
variable.

w:name

A variable local to a window.

g:name

A global variable. (Used inside functions to


denote global variables.)

a:name

An argument to a function.

v:name

A Vim internal variable

Some examples:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 481

Draft Not for publication

Draft 0.1

Not for widespread publication

11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377

" The environment variable $PAGER contains


the name of the page viewing command
:let $PAGER = "/usr/local/bin/less"

11378
11379

The internal variables (v:name) are used by Vim to store a variety of


information. The following table shows the full list of variables.

" Display the value of the last search


pattern :echo "Last search was "@/
" The following two commands do the same
thing :let &autoindent = 1
:set autoindent
" Define the syntax for the current buffer
:let b:current_syntax = "c"
"Note: This doesn't handle all the side
effects associated with
"changing the language of the buffer

v:count
v:count1
v:errmsg
v:warningmsg
v:statusmsg
v:shell_error
v:this_session
v:version
11380

The count given for the last normal-mode command.


Like v:count, except that it defaults to 1 if no count is
specified.
The last error message.
The last warning message.
The last status message.
Result of the last shell command. If 0, the command
worked; if non-0, the command failed.
Full filename of the last loaded or saved session file.
Version number of Vim. Version 5.01 is stored as 501.

Constants

11381

The Vim editor uses a variety of constants. There are the normal integers:

11382

123

Simple integer

11383

0123

Octal integer

11384

0xAC

11385

There are also string constants:

11386

"string"

11387

'string'

Hexadecimal

A simple string
A literal string

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 482

Draft Not for publication


11388
11389
11390

Not for widespread publication

The difference between a simple string and a literal string is that in a


simple string, characters escaped by backslash are expanded, whereas in a
literal string a backslash is just a backslash. For example:

11391
11392
11393
11394
11395

Draft 0.1

:echo ">\100<"
>@<
:echo '>\100<'
>\100<
Note: The character number octal 100 is @.

11396

Expressions

11397
11398

You can perform a variety of operations on integers. These include the


arithmetic operator s:
int +
int int *
int /
int %
- int

11399
11400
11401
11402

Addition
Subtraction
Multiplication
Integer divide (and truncate)
Modulo
Negation

Note: Strings are automatically converted to integers when used in


conjunction with these operators.
In addition, a number of logical operators work on both strings and
integers. These return a 1 if the comparison succeeds and 0 if it does not.
var
var
var
var
var
var

11403
11404
11405
11406

int
int
int
int
int

== var
!= var
< var
<= var
> var
>= var

Check for equality.


Inequality.
Less than.
Less than or equal to.
Greater than.
Greater than or equal to.

In addition, the comparison operators compare a string against a regular


expression. For example, the following checks the given string ("word") against
the regular expression "\w*" and returns a 1 if the string matches the
expression:

11407

"word" =~ "\w*"

11408

The two regular expression comparison operators are as follows:


string =~ regexp
string !~ regexp

11409

Regular expression matches.


Regular expression does not match.

In addition, strings have the following special comparisons:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 483

Draft Not for publication


string ==? string

Draft 0.1

Not for widespread publication

Strings equal, ignore case.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 484

Draft Not for publication


string
string
string
string
string
string
string
string
string
string
string

==# string
!=? string
!=# string
<? string
<# string
<=? string
<=# string
>? string
># string
>=? string
>=# string

Draft 0.1
Strings
Strings
Strings
Strings
Strings
Strings
Strings
Strings
Strings
Strings
Strings

Not for widespread publication

equal, case must match.


not equal, ignore case.
not equal, case must match.
less than, ignore case.
less than, case must match.
less than or equal, ignore case.
less than or equal, case must match.
greater than, ignore case.
greater than, case must match.
greater than or equal, ignore case.
greater than or equal, case must match.

11410
11411
11412
11413
11414
11415
11416
11417

There are three forms of each operator. The bare form (i.e. ==) honors the
'ignorecase' option. The ? form (i.e.==?) always ignores case differences while
the # form (i.e.==#) never ignores different case characters.

11418

Deleting a Variable

11419

The :unlet (:unl) command deletes a variable:

11420

:unlet[!] name

11421
11422

Generally, if you try to delete a variable that does not exist, an error result.
If the override (!) character is present, no error message results.

11423

Locking and unlocking a variable

11424
11425

A variable can be locked so that its value can not be changed using the
:lockvar (:lockv) command:

11426
11427
11428
11429

:lockvar line_size
After this command is executed any :let command that attempts to
change this variable will fail. To unlock a variable, use the :unlockvar (:unlo)
command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 485

Draft Not for publication

Draft 0.1

Not for widespread publication

11430

Locking Arrays and Dictionaries

11431
11432
11433
11434

The :lockvar command takes a depth as an argument. A depth of 1 means


that the variable itself is locked. You can not add or remove items. However,
you can change items. That because the item is indirectly referenced and is
considered stored at a depth of 2.

11435
11436
11437

If you lock with a depth of two then the array is locked and any items in the
array are locked. But any items referenced by items in the array (which require
two levels of indexing to access) are not locked.

11438
11439
11440

A level of 3 locks the array, the items, items referenced by the items, but
items referenced by items inside items (requiring three levels of indexing to get
to.)

11441
11442

The :lockvar! command with the override(!) sets the locking level to 100
and pretty much locks everything.

11443

Entering Commands

11444
11445
11446
11447

When you are entering arguments to a command, you can use a number of
special words and characters. The words work when you need to enter an
argument such a file name, directory, or other word argument such as the
argument to :tag and the :vimgrep pattern. The special words are::
%
#
<cword>
<cWORD>
<cfile>
<afile>

<abuf>
<amatch>
<sfile>
11448
11449
11450
11451
11452

Current filename
Alternate filename
The word under the cursor.
The WORD under the cursor.
The filename under the cursor.
The name of a file being read or written during the execution
of a related autocommand. (See Chapter 13: Autocommands
for more information.
The current buffer number in an autocommand.
Like <abuf>, but when used with a FileType or Syntax event
it is not the file name, but the file type or syntax name.
The name of the file currently being :sourced.

You can modify each of these words by one or more of the modifiers listed
here (for example, the :p modifier, which turns a filename into a full pathname).
If the name of the file under the cursor is test.c, for instance, <cfile> would be
test.c. On the other hand, <cfile>:p would be /home/oualline/examples/test.c.
You can use the following modifiers:
:p

Turn a filename into a full path. Must appear first if

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 486

Draft Not for publication

:~

:.
:h
:t
:r
:e
:s?from?to?
:gs?from?to?

Draft 0.1

Not for widespread publication

multiple modifiers are used.


Turn an absolute path such as
/home/oualline/examples/test.c into a short version using
the ~ notation, such as ~oualline/examples/test.c.
Turn the path into one relative to the current directory,
if possible.
Head of the filename. For example, ../path/test.c yields
../path.
Tail of the filename. Therefore, ../path/test.c yields
test.c.
Filename without extension. Therefore, ../path/test.c
yields I../path/test.
Extension.
Substitution changing the pattern from to the pattern to,
first occurrence.
Substitution changing the pattern from to the pattern to,
all occurrences.

11453

How to Experiment

11454
11455
11456
11457

You can determine how Vim will apply modifiers to a filename. First create
a text file whose content is the filename on which you want to run experiments.
Put the cursor on this filename and then use the following command to test out a
modifier:

11458

:echo expand("<cword>:p")

11459

(Change :p to whatever modifier you want to check.)

11460
11461

The following sections discuss the :echo statement and expand function in
more detail.

11462

The :echo Statement

11463
11464
11465
11466
11467
11468
11469
11470
11471

The :echo statement just echoes its arguments. For example:


:echo "Hello world"
Hello world
You can also use it to display the value of a variable:
:let flag=1
:echo flag
1
The :echon command echoes the arguments, but does not output a
newline. For example:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 487

Draft Not for publication


11472
11473
11474
11475
11476
11477

Draft 0.1

Not for widespread publication

:echo "aa" | echo "bb"


aa
bb
:echon "aa" | echon "bb"
aabb
Note: The bar (|) is used to separate two commands on the same line.

11478

Echoing in Color

11479
11480

You can use the :echohl (:echoh) command to change the color of the
output :echo to a given highlight group. For example:

11481
11482
11483
11484
11485
11486
11487
11488
11489

:echohl ErrorMsg
:echo "A mistake has been made"
:echohl None
Note: Good programming practice dictates that you always reset the
highlighting to None after your message. That way you do not affect other
:echo commands.
If you want to see what highlight groups are defined, use the command
:highlight (:hi) :
:highlight

11490

Printing error messages using :echoerr

11491
11492
11493

The :echoerr (:echoe) command acts much like :echo except the string is
highlighted using the same colors as an error message and it is placed in the
error history.

11494
11495

If this command is used in a script or funciton, a line number will be added


to the message.

11496
11497

Finally, if this command occurs inside a :try / :catch block, it acts as if an


exception where thrown. (See Exceptions on page 491 for more information.)

11498

Echoing message

11499
11500

The :echomsg (:echom) command acts just like :echo only the string is
saved in the message buffer and will appear if you issue a :messages command.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 488

Draft Not for publication

Draft 0.1

Not for widespread publication

11501

Control Statements

11502
11503
11504

The Vim editor has a variety of control statements that enable you to
change the flow of a macro or function. With these, you can make full use of
Vim's sophisticated script language.

11505

The :if Statement

11506
11507
11508
11509
11510

The general form of the :if statement is as follows:


:if {condition}
:
" Statement
:
" Statement
:endif

11511
11512

(You can abbreviate :endif as :en, but please don't. It makes your code
hard to read.)

11513
11514
11515
11516

The statements inside the :if statement are executed if the condition is
non-zero. The four-space indent inside the :if is optional, but encouraged
because it makes the program much more readable. The :if statement can have
an :else clause:

11517
11518
11519
11520
11521
11522
11523
11524
11525
11526

:if {condition}
:
" Statement
:
" Statement
:else
:
" Statement
:
" Statement
:endif
(:el can be used for :else if you wish to make your code hard to read.)
Finally, the :elseif (:elsei) keyword is a combination of :if and :else.
Using it removes the need for an extra :endif:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 489

Draft Not for publication


11527
11528
11529
11530
11531
11532
11533

Draft 0.1

Not for widespread publication

:if &term == "xterm"


:
" Do xterm stuff
:elseif &term == "vt100"
:
" Do vt100 stuff
:else
:
" Do non xterm and vt100 stuff
:endif

11534

Looping

11535
11536

The :while (:wh) command starts a loop. The loop ends with the
:endwhile (:endw) command:

11537
11538
11539
11540
11541
11542
11543
11544
11545
11546
11547
11548
11549
11550
11551
11552
11553
11554
11555
11556
11557

:while counter < 30


:
let counter = counter + 1
:
" Do something
:endwhile
The :continue (:con) command goes to the top of the loop and continues
execution. The :break (:brea) command exits the loop:
:while counter < 30
:
if skip_flag
:
continue
:
endif
:
if exit_flag
:
break
:
endif
:
"Do something
:endwhile
The :for Loop
The :for statement loops through all the elements of a list. For example:
:set list=['a', 'b', 'c']
:for item in list
:
echo item
:endfor

11558
11559

(For the lazy, :endfo can be used to end the loop. Please don't use it
however as it makes the code less readable.)

11560
11561
11562

If the items in the list are arrays, you can specify a set variables in the
:for. The variables will be assigned each corresponding element in the array.
For example, the following two code fragments are equivalent:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 490

Draft Not for publication


11563
11564
11565
11566
11567
11568
11569
11570

Draft 0.1

Not for widespread publication

:let m=[[11,12],[21,22],[31,32]]
:for [x,y] in m
:
echo x " -> " y
:endfor
:for q in m
:
echo q[0] " -> " q[1]
:endfor

11571

The :execute Command

11572
11573

The:execute (:exe) executes the argument as a normal command-mode


command:

11574
11575
11576

:let command = "echo 'Hello world!'"


:execute command
Hello World

11577

Exceptions

11578
11579

When an error occurs Vim throws an exception. If this exception is not


caught, Vim will print an error message and abort processing. For example:

11580
11581
11582
11583

:badcommand
E492: Not an editor command: badcommand
If you want to intercept exception you need to create a try/catch block.
You start by putting everything in a a :try block.:

11584
11585

:try
:
Do something that might cause an exception

11586

The :try is followed by all the commands you hope to execute.

11587
11588
11589

Next comes the exception handling code. Each exception gets its own
:catch (:cat) statement which tells Vim, when an error occurs (exception is
throw), come here to handle it.

11590
11591
11592
11593
11594
11595
11596

:catch /^E492/
:
echo 'Someone typed a bad command'
The argument to :catch is a regular expression. Vim is highly text
oriented and the exception handling is no exception.7 Our regular expression
(/^E492/) matches any string beginning with E492. Since all Vim errors are
numbered this will match the Not an editor command error no matter what
language is selected for the error message.
7 No pun intended.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 491

Draft Not for publication


11597
11598
11599
11600
11601
11602
11603

Draft 0.1

Not for widespread publication

The regular expression is optional. If omitted, all error messages would be


caught.
:catch
:
echo 'Something unexpected happened.'
The :catch statements are executed in order. So in our little example,
the statement will be checked against /^E492/, then no-argument :catch
statement.

11604

If we have any cleanup code we can put it a :finally (:fina) block:

11605
11606

:finally
:
Clean up

11607

The entire :try block is then ended with a :endtry (:endt) statement.

11608

:endtry

11609
11610
11611

What's left is to cause an error. The preferred method is to use the :throw
(:th) command. For example:
:throw ERROR: You made a mistake

11612
11613
11614

This will cause current processing to stop and Vim will continue execution
at the first matching :catch statement it finds. If there is no matching :catch
statement, an E605: Exception not caught error will occur.

11615
11616
11617
11618
11619

The other way of throwing an exception is to use the :echoerr command.


(See Printing error messages using :echoerr on page 488 for more information.)
This differs from :throw in that if the error is not caught, the error message is
printed. In other words, an uncaught :echoerr message does not cause a
E605.

11620
11621

All Vim errors (like E492: Not an editor command) act like they were
produced with :echoerr.

11622
11623
11624
11625
11626
11627

The :finish (:fini) command will cause all subsequent statements inside
a :try to be skipped. The next statement to be executed will be the first
statement in the :finally block if there is any. If not, the it will be the first
statement after the :endtry. If this statement is executed outside a :try, all the
remaining statement inside the file will be skipped. (The command can not be
executed outside of a file or :try.)

11628

Defining Your Own Function

11629
11630

The Vim editor enables you to define your own functions. The basic
function declaration begins with a :function (:fu) statement:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 492

Draft Not for publication

Draft 0.1

Not for widespread publication

11631

:function name(var1, var2, ...)

11632

Note: Function names must begin with a capital letter.

11633

It ends with an :endfunction (:endf) statement:

11634

:endfunction

11635
11636
11637
11638
11639
11640
11641
11642
11643
11644
11645
11646
11647
11648
11649
11650

Let's define a short function to return the smaller of two numbers, starting
with this declaration:
:function Min(num1, num2)
This tells Vim that the function is named Min and it takes two arguments
(num1 and num2). The first thing you need to do is to check to see which number
is smaller:
:

if a:num1 < a:num2

The special prefix a: tells Vim that the variable is a function argument.
Let's assign the variable smaller the value of the smallest number:
:
:
:
:
:

if a:num1 < a:num2


let smaller = a:num1
else
let smaller = a:num2
endif

The variable smaller is a local variable. All variables used inside a


function are local unless prefixed by a g:.

11651
11652
11653

Warning: A variable outside a function declaration is called var; whereas


inside if you want to refer to the same variable, you need to call it g:var.
Therefore, one variable has two different names depending on the context.

11654
11655

You now use the :return (:retu) statement to return the smallest number
to the user. Finally, you end the function:

11656
11657

:
return smaller
:endfunction

11658

The complete function definition is as follows:

11659
11660
11661
11662
11663
11664
11665

:function Min(num1, num2)


:
if a:num1 < a:num2
:
let smaller = a:num1
:
else
:
let smaller = a:num2
:
endif
:
return smaller
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 493

Draft Not for publication

Draft 0.1

Not for widespread publication

11666

:endfunction

11667
11668

Note: I know that this function can be written more efficiently, but it is
designed to be a tutorial of features, not efficiency.

11669

Using a Function

11670

You can now use your function in any Vim expression. For example:

11671

:let tiny = Min(10, 20)

11672
11673
11674

You can also call a function explicitly using the function name with the
:call (:cal) command:
:[range] call function([parameters])

11675
11676

If a range is specified, the function is called for each line, unless the
function is a special "range"-type function (as discussed later).

11677

Function Options

11678
11679
11680

If you attempt to define a function that already exists, you will get an error.
You can use the force option (!) to cause the function to silently replace any
previous definition of the function:

11681
11682
11683

:function Max(num1, num2)


:
" Code
:endfunction

11684
11685
11686

:function Max(num1, num2, num3)


-- error --

11687
11688
11689
11690
11691
11692

:function! Max(num1, num2, num3)


-- no error -By putting the range keyword after the function definition, the function is
considered a range function. For example:
:function Count_words() range

11693
11694

When run on a range of lines, the variables a:firstline and a:lastline


are set to the first and last line in the range.

11695
11696

If the word abort follows the function definition, the function aborts on the
first error. For example:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 494

Draft Not for publication


11697
11698
11699
11700

Draft 0.1

:function Do_It() abort


Finally, Vim enables you to define functions that have a variable number of
arguments. The following command, for instance, defines a function that must
have 1 argument (start) and can have up to 19 additional arguments:

11701

:function Show(start, ...)

11702

##explain 000

11703
11704
11705
11706
11707
11708
11709
11710
11711
11712
11713
11714
11715
11716
11717

Not for widespread publication

The variable a:1 contains the first optional argument, a:2 the second, and
so on. The variable a:0 contains the number of extra arguments. For example:
:function Show(start, ...)
:
let index = 1
" Loop index
:
echo "Show is" a:start
:
while (index <= a:0)
:
echo "Arg" index "is " a:000[index]
:
let index = index + 1
:
endwhile
:endfunction
Listing Functions
The :function command lists all the user-defined functions:
:function
function FTCheck_nroff()
function FTCheck_asm()

11718

To see what is in a single function, execute this command:

11719

:function name

11720

##copy from real output

11721
11722
11723
11724
11725
11726
11727
11728
11729
11730

For example:
:function Show
let index = 1
" Loop index
echo "Show is" a:start
while (index <= a:0)
echo "Arg" index "is " a:index
let index = index + 1
endwhile
Deleting a Function
To delete a function, use the command :delfunction (:delf) :
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 495

Draft Not for publication


11731

Draft 0.1

Not for widespread publication

:delfunction name

11732

Running Functions in a Sandbox

11733
11734
11735

Normally when you execute a function, the code has full access to Vim and
can alter settings and the files being edited. If you want to run things in a more
secure environment use the :sandbox (:san) command.

11736

The general form of this command is:

11737

:sandbox command

11738

For example:

11739

:sandbox :call Show("foo", "bar")

11740

Debugging a Function

11741
11742

Vim has a built-in debugger that lets you debug functions. Let's take a look
at a typical function. This one goes through and changes lines such as:

11743
11744
11745

stdio.h
to lines which look like:
#include <stdio.h>

11746
11747
11748

The function is fairly smart. It can tell the difference between system
includes and user includes and insert the correct C statement for each type of
include.

11749
11750

Let's start by listing out the contents of the function so we know what we
are dealing with:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 496

Draft Not for publication

Draft 0.1

Not for widespread publication

11751
11752
11753
11754
11755
11756
11757
11758
11759
11760
11761
11762
11763
11764
11765
11766
11767
11768
11769
11770
11771
11772
11773
11774
11775
11776
11777
11778

:function Include
function Include()
1 :
" Get the current line
2 :
let l:line = getline(".")
3 :
4 :
let l:dir_list = split(&path, ",")
5 :
" Loop through the local dirs looking for the file
6 :
for l:cur_dir in l:dir_list
7 :
if (filereadable(l:cur_dir."/".l:line))
8 :
9 :
" System directory?
10 :
if (match(l:cur_dir, "/usr/include") == 0)
11 :
12 :
" Put the #include in the right place
13 :
let l:line = "#include <".l:line.">"
14 :
else
15 :
" Put the #include in the right place
16 :
let l:line = "#include \"".l:line."\""
17 :
endif
18 :
19 :
call setline(".", l:line)
20 :
return
21 :
endif
22 :
endfor
23 :
24 :
"At this point we did not find anything
25 :
"We could put in a default
endfunction

11779
11780
11781

In order to understand what this function does we would like to single step
through it. So the first thing we do is use the :breakadd (:breaka) command to
add a breakpoint at the beginning of the function.

11782

:breakadd func Include

11783
11784

In this example the func parameter tells Vim to stop at the first line of the
function.

11785
11786
11787

Next we need to start the debugger. The :debug (:deb) command tells
Vim to run the following command, but do so inside the debugger. Without
the :debug, we'd just execute the function normally.

11788
11789
11790
11791
11792
11793

:debug call Include()


Entering Debug mode. Type "cont" to continue.
cmd: call Include()
Breakpoint in "Include" line 1
function Include
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 497

Draft Not for publication


11794
11795

Draft 0.1

Not for widespread publication

line 2: let l:line = getline(".")


>

11796
11797

Vim now starts calling the function Include() and encounters our
breakpoint. So it stops on the first line of code in the function.

11798
11799

Now that we are stopped we can enter debugging commands, or normal


Vim commands for that matter.

11800
11801
11802

The debug command step single steps through the code, stepping into any
functions called along the way. If we wanted to step over the function calls, we
need the debugging command next.

11803

Let's see what happens if we enter step.

11804
11805
11806

>step
function Include
line 4: let l:dir_list = split(&path, ",")

11807

The editor executes the next statement.

11808
11809
11810
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821
11822
11823

Now let's examine one of the function's variables. This is done with the
:echo command:
>:echo l:line
stdio.h
Let's now take a look at the l:dir_list variable. Since this is an array,
the result looks a little different.
>echo l:dir_list
['.', '/usr/include', '']
Next we take a look at what breakpoints we have with the :breaklist
(:breakl) command.
>:breaklist
1 func Include

line 1

The next interesting point for us in this function is line 10 where we do the
match() call. Let's put a breakpoint there. The following command tells Vim to
put a breakpoint in a function (func) named Include at line 10:
>:breakadd func 10 Include

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 498

Draft Not for publication

Draft 0.1

Not for widespread publication

11824

Now we continue execution until we hit the breakpoint:

11825
11826
11827
11828
11829

>cont

11830

From here on things just work so we have no more need of debugging.

Breakpoint in "Include" line 10


function Include
line 10: if (match(l:cur_dir, "/usr/include") == 0)

11831

Other debugging commands

11832
11833

The :breakadd command has both a function and a file. The file forms
looks like:

11834
11835
11836
11837
11838

:breakadd file file-name


:breakadd file line file-name
The first form sets a breakpoint that is triggered when a file is loaded. The
second when a specific line of a file is executed. These commands are useful for
debugging Vim command files and the code that exists outside functions.

11839

There's one more :breakadd command to discuss:

11840

:breakadd here

11841
11842

This sets a breakpoint at the current location. (Which you've arrived at


through step and next commands.)

11843
11844

To remove a breakpoint use the :breakdel (:breakd) command. It has the


same syntax as the :breakadd command:

11845
11846
11847
11848
11849

:breakdel
:breakdel
:breakdel
:breakdel
:breakdel

11850

You can also delete a breakpoint by breakpoint number:

11851

:breakdel number

11852

Finally to delete all breakpoints, use the command:

11853

:breakdel *

11854

Inside the debugger you can type the following commands:

11855

step

func
func
file
file
here

name
line name
name
line name

Single step going into functions.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 499

Draft Not for publication

Draft 0.1

Not for widespread publication

11856

next

Single step treat function calls as a single step.

11857

cont

Continue execution until the next breakpoint.

11858

quit

Abort the current function or file being debugged.

11859
11860

interrupt

Pretend that the script was interrupted with CTRLC. (Useful for debugging catch and finally blocks.)

11861
11862

finish

Continue execution of the current


function or file, then go back to debug mode.

11863
11864
11865
11866
11867

Finally we have the :debugready (:debugg) command. Normally the


debugger reads commands from the console. This makes it impossible to put
debug commands in a file. The :debugready command tells Vim to read debug
commands from the input stream. The :0debugready command turns this
feature off.

11868

Redrawing the screen

11869
11870
11871
11872

Normally Vim does not redraw the screen until the current function or
script finishes. To force a redraw, use the :redraw (:redr) command. If you
have an extreme problem with the screen :redraw! clears and redraws the
screen.

11873
11874
11875

To just redraw the status line, use the :redrawstatus (:redraws). By


default this works on the current window only. To make it work on all windows
use the override: :redrawstatus!.

11876

Profiling a function

11877
11878

Vim has a built-in profiling feature. To start you must turn on profiling
with the command:

11879

:profile start file-name

11880

(:profile can be abbreviated :prof.)

11881
11882
11883
11884
11885
11886

This tells Vim to start profiling and to write the results out to the given file
upon exit. Now at this point we told Vim to do profiling but haven't given it
anything to profile. Let's tell it to profile our Include() function:
:profile func Include
Now when we execute this function Vim records the profile information.
Let's execute the function once:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 500

Draft Not for publication


11887
11888
11889
11890
11891
11892
11893
11894
11895
11896
11897
11898
11899
11900
11901
11902
11903
11904
11905
11906
11907
11908
11909
11910
11911
11912
11913
11914
11915
11916
11917
11918
11919
11920
11921
11922
11923
11924
11925
11926
11927
11928
11929
11930

11931
11932

Draft 0.1

Not for widespread publication

:call Include()
Next we exit with the ZZ command. The profile results are now available
in the file we specified at the beginning of this process:
FUNCTION Include()
Called 1 time
Total time:
0.000244
Self time:
0.000244
count

total (s)

1
1
file
2
2
1
1
1

1
1
1
anything

self (s)
:
0.000017 :
:
0.000015 :
:

" Get the current line


let l:line = getline(".")

0.000011 :
0.000090 :
:
:
0.000009 :
:
:
0.000005 :
0.000002 :
:
:
:
:
0.000013 :
0.000003 :
:
0.000003 :
:
:

for l:cur_dir in l:dir_list


if (filereadable(l:cur_dir."/".l:line))

let l:dir_list = split(&path, ",")


" Loop through the local dirs looking for the

" System directory?


if (match(l:cur_dir, "/usr/include") == 0)
" Put the #include in the right place
let l:line = "#include <".l:line.">"
else

" Put the #include in the right place


let l:line = "#include \"".l:line."\""
endif
call setline(".", l:line)
return
endif
endfor
:profile continue

"At this point we did not find

"We could put in a default

FUNCTIONS SORTED ON TOTAL TIME


count total (s)
self (s) function
1
0.000244
Include()
FUNCTIONS SORTED ON SELF TIME
count total (s)
self (s) function
1
0.000244 Include()

This shows how many times each line was executed and how much time
was spent in the line itself.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 501

Draft Not for publication


11933

Draft 0.1

Not for widespread publication

Other Profile Commands

11934

To profile the code in a file, use the command:

11935

:profile file file-name

11936

If you want to profile a file and all the functions in a file use the command:

11937

:profile! file file-name

11938

To temporarily stop profiling use the command:

11939

:profile pause

11940

To start after a pause use the command:

11941

:profile continue

11942

Deleting Profile Items

11943
11944

If you wish to turn off profiling you can do so with any of the following
commands:

11945
11946
11947
11948
11949

:profdel
:profdel
:profdel
:profdel
:profdel

11950

(:profdel can be abbreviated :profd.)

*
number
func line function-name
file line file-name
here

11951

User-Defined Commands

11952
11953
11954

The Vim editor enables you to define your own commands. You execute
these commands just like any other command-mode command. To define a
command, use the :command (:com) command. For example:

11955

:command DeleteFirst :1delete

11956

Now when you execute the command

11957

:DeleteFirst

11958

the Vim editor performs a

11959

:1delete

11960

which deletes the first line.

11961

Note: User-defined commands must start with a capital letter.

11962

To list out the user-defined commands, execute the following command:


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 502

Draft Not for publication


11963
11964
11965
11966
11967
11968
11969
11970
11971
11972
11973
11974
11975
11976

Draft 0.1

:command
To remove the definition of a user-defined command, issue the
:delcommand (:delc).
:delcommand DeleteOne
You can clear all user-defined commands with the command :comclear
(:comc):
:comclear
User-defined commands can take a series of arguments. The number of
arguments must be specified by the -nargs option on the command line. For
instance, the example DeleteOne command takes no arguments, so you could
have defined it as follows:
:command -nargs=0 DeleteFirst 1delete
However, because -nargs=0 is the default, you do not need to specify it.
The other values of -nargs are as follows:

11977

-nargs=0

No arguments

11978

-nargs=1

One argument

11979

-nargs=*

Any number of arguments

11980

-nargs=?

Zero or one argument

11981

-nargs=+

One or more arguments

11982
11983

Inside the command definition, the arguments are represented by the


<args> keyword. For example:

11984

:command -nargs=+ Say :echo "<args>"

11985

Now when you type

11986
11987
11988
11989
11990
11991

Not for widespread publication

:Say Hello World


the system echoes
Hello World
Some commands take a range as their argument. To tell Vim that you are
defining such a command, you need to specify a -range option. The values for
this option are as follows:
-range
-range=%

Range is allowed. Default is the current line.


Range is allowed. Default is the whole file.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 503

Draft Not for publication


-range=count
11992
11993
11994
11995

Draft 0.1

Not for widespread publication

Range is allowed, but it is really just a single number


whose default is count.

When a range is specified, the keywords <line1> and <line2> get the
values of the first and last line in the range. For example, the following
command defines the SaveIt command, which writes out the specified range to
the file save_file:

11996

:command -range=% SaveIt :<line1>, <line2> write! save_file

11997

Some of the other options and keywords are as follows:


-count=number

-bang
-register

11998
11999
12000

The command can take a count whose default is


number. The resulting count is stored in the <count>
keyword.
You can use the override (!) modifier. If present, a !
will be stored in the keyword <bang>.
You can specify a register. (The default is the
unnamed register.) The register specification is put in
the <reg> (a.k.a. <register>) keyword .

The <f-args> keyword contains the same information as the <args>


keyword, except in a format suitable for use as function call arguments. For
example:

12001
12002

:command -nargs=* DoIt :call AFunction(<f-args>)


:DoIt a b c

12003

is the same as executing the following command:

12004

:call AFunction("a", "b", "c")

12005

Finally, you have the <lt> keyword. It contains the character <.

12006

The Operator Function

12007
12008
12009
12010

Another way to connect a function to a command is through the operator


function. You start by setting the option 'operatorfunc' ('opfunc') to the
name of the function you wish to call. This function will be called when you use
the g@{motion} command.

12011
12012
12013
12014

The function takes one argument which tells it if the motion was line or
char (character) oriented. (It is also possible for it to be called with the block
argument, but this is almost never done because g@ is not useful is block visual
mode.)

12015
12016

When the function is called the starting mark ('[) will be placed where the
motion starts and the ending mark (']) will be located where it ends.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 504

Draft Not for publication

Draft 0.1

Not for widespread publication

12017
12018

This is a highly specialized Vim feature and you may need to refer to the
on-line help for details.

12019

Built-In Functions

12020
12021

The Vim editor has a number of built-in functions. This section lists all the
built-in functions.

12022

append(line_number, string)

12023

What it does:

12024

Parameters:

Appends the string as a new line after line_number.

12025
12026
12027

line_number

The line number after which the text is to be


inserted. A value of 0 causes the text to be inserted
at the beginning of the file.

12028

string

The string to be inserted after the given line.

12029

Returns:

12030
12031

Integer flag.
0 = no error; 1 = error caused by a line_number
out of range.

12032

argc()

12033
12034

What it does:

Counts the number of arguments in the argument


list.

12035

Returns:

Integer.

12036

The argument count.

12037

argv(number)

12038

What it does:

12039

Parameter:

12040
12041
12042
12043
12044
12045

number

Returns:

Returns an argument in the argument list.

The argument index. Argument 0 is the first


argument in the argument list (not the name of the
program, as in C programming).
String.
Returns the requested argument.

browse(save, title, initial_directory, default)


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 505

Draft Not for publication


12046
12047

What it does:

12048

Parameters:

Draft 0.1

Not for widespread publication

Displays a file browser and lets the user pick a file.


This works only in the GUI version of the editor.

12049
12050
12051

save

An integer that indicates whether the file is being


read or saved. If save is non-0, the browser selects
a file to write. If 0, a file is selected for reading.

12052

title

Title for the dialog box.

12053

initial_directory

The directory in which to start browsing.

12054

default

Default filename.

12055

Returns:

12056
12057
12058

String.
The name of the file selected. If the user selected
Cancel or an error occurs, an empty string is
returned.

12059

bufexists(buffer_name)

12060

What it does:

12061

Parameter:

12062
12063

buffer_name
Returns:

12064
12065

Checks to see whether a buffer exists.

The name of a buffer to check for existence.


Integer flag.
Returns true (1) if the buffer exists and false (0)
otherwise.

12066

bufloaded(buffer_name)

12067

What it does:

12068

Parameter:

12069
12070
12071
12072
12073
12074

buffer_name
Returns:

Check to see whether a buffer is loaded.

The name of a buffer to check to see whether it is


currently loaded.
Integer flag.
Returns true (1) if the buffer is loaded and false (0)
otherwise.

bufname(buffer_specification)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 506

Draft Not for publication


12075

What it does:

12076

Parameter:

12077
12078
12079
12080
12081
12082

buffer_specification

12083
12084
12085
12086

Draft 0.1

Find the indicated buffer.

A buffer number or a string that specifies the


buffer. If a number is supplied, buffer number
buffer_specification is returned. If a string is
supplied, it is treated as a regular expression and
the list of buffers is searched for a match and the
match returned.
There are three special buffers: % is the current
buffer, # is the alternate buffer, and $ is the last
buffer in the list.

Returns:

12087
12088
12089

String.
String containing the full name of the buffer or an
empty string if there is an error or no matching
buffer can be found.

12090

bufnr(buffer_expression)

12091

What it does:

12092

Parameter:

12093

Obtains the number of a buffer.

buffer_expression

12094
12095
12096

A buffer specification similar to the one used by the


bufname function.
Returns:

12097

Integer.
Number of the buffer, or -1 for error.

12098

bufwinnr(buffer_expression)

12099

What it does:

12100

Parameter:

12101
12102
12103

Not for widespread publication

Obtains the window number for a buffer.

buffer_expression
A buffer specification similar to the one used by the
bufname function.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 507

Draft Not for publication

Draft 0.1

12104
12105
12106

Returns:

12107

byte2line(byte_index)

12108

What it does:

12109

Parameter:

12110
12111

byte_index
Returns:

12112
12113
12114
char2nr(character)

12116

What it does:

12117

Parameter:

12120

character
Returns:

12121
12122
col(location)

12124

What it does:

12125

Parameter:

12128

Converts a byte index into a line number.

The index of a character within the current buffer.


Integer.

Converts a character to a character number.

A single character to be converted. If a longer


string is supplied, only the first character is used.
Integer.
The character number. For example, char2nr("A")
is 65. (The ASCII code for 'A' is 65.)

12123

12126
12127

Integer. The number of the first window associated


with the buffer or -1 if there is an error or no
buffer matches the buffer_expression.

The line number of the line that contains the


character at byte_index or -1 if byte_index is out of
range.

12115

12118
12119

Not for widespread publication

location
Returns:

12129
12130

Returns the column of the specified location.

Is a mark specification (for example, 'x) or "." to


obtain the column where the cursor is located.
Integer.
The column where the mark or cursor resides, or 0
if there is an error.

12131

confirm(message, choice_list, [default], [type])

12132
12133

What it does:

Displays a dialog box giving the user a number of


choices and returns what the user chooses.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 508

Draft Not for publication


12134

Draft 0.1

Not for widespread publication

Parameters:

12135

message

A prompt message displayed in the dialog box.

12136
12137
12138

choice_list

A string containing a list of choices. The newline


("\n") separates each choice. The ampersand (&) is
used to indicate an accelerator character.

12139
12140
12141

[default]

An index indicating default choice. The first button


is #1. If this parameter is not specified, the first
button is selected.

12142
12143
12144

[type]

The type of the dialog box to be displayed. The


choices are "Error", "Question", "Info", "Warning",
or "Generic". The default is "Generic".

12145
12146
12147
12148
12149

12151

Returns:

Integer.
The choice number (starting with 1), or 0 if the
user aborted out of the dialog box by pressing
<ESC> or CTRL-C.

Figure 27-1 shows the various types of confirmation dialog boxes.

GUI Confirmation

12152
12153
12154
12155
12156
12157

~
~
:confirm :q
Save changes to "Untitled"?
[Y]es, (N)o, (C)ancel:

12158

Confirmation without a GUI

12159

Figure 27-1: Dialog box types.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 509

Draft Not for publication

Draft 0.1

Not for widespread publication

12160
12161

Note: This function works on both the GUI and console version of the
editor. The console versions of the dialog boxes do not look as nice:

12162
12163
12164

:echo confirm("Hello", "&One\n&Two", 1, "Error")


Hello
[O]ne, (T)wo: O

12165
12166

delete(file_name)

12167

What it does:

12168

Parameter:

12169
12170

file_name
Returns:

Deletes the file.

The name of the file to delete.


Integer.
0 means that the file was deleted. Non-0 for error.

12171
12172

did_filetype()

12173
12174
12175

What it does:

12176

Returns:

12177
12178
12179

Checks to see whether the FileType event has


been done. This command is useful in conjunction
with the autocommands.
Integer.
Non-0 if autocommands are being executed and at
least one FileType event has occurred. 0
otherwise.

12180

escape(string, character_list)

12181
12182
12183

What it does:

12184

Parameters:

Turns a {string} of characters into an escaped


string. The {character_list} specifies the character
to be escaped.

12185

string

The string you want to escape.

12186
12187

character_list

The list of characters in string that need to have


the escape character (\) put in front of them.

12188
12189

Returns:

String.
The escaped string.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 510

Draft Not for publication


12190
12191
12192

Draft 0.1

Not for widespread publication

For example:
:echo escape("This is a 'test'.", " '")
This\ is\ a\ \'test\'."

12193
12194

exists(string)

12195
12196

What it does:

12197

Parameters:

12198
12199
12200
12201
12202
12203
12204

string

Returns:

12205

Checks to see whether the item specified by


{string} exits.

An item to check. This can be used to specify an


option ('&autoindent'), an environment variable
('$VIMHOME'), a built-in function name ('*escape'),
or a simple variable ('var_name'). (Note:The
quotation marks are required because you are
passing in a string.)
Integer.
Returns 1 if the item exists, 0 otherwise.

12206

expand(string, [flag])

12207
12208
12209
12210

What it does:

12211

Parameters:

12212
12213
12214
12215

string

Returns a list of files that match the string. This


string can contain wildcards and other
specifications. For example, expand("*.c")
returns a list of all C files.

A string to be expanded. The string can contain


any of the special file characters described earlier.
Note: The 'suffixes' ('su') and 'wildignore'
options affect how the expansion is carried out.

12216
12217
12218
12219

When a special word such as '<cfile>' is


expanded, no further expansion is performed. If
the cursor is on the string '~/.vimrc', for
example, expand('<cfile>') results in '/.vimrc.

12220
12221
12222
12223

If you want the full filename, however, you need to


expand twice. Therefore,
expand(expand('<cfile>')) returns
/home/oualline/.vimrc.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 511

Draft Not for publication


12224
12225
12226

[flag]
Returns:

12227
12228
12229

Draft 0.1

The 'wildignore' and 'suffixes' options are


honored unless a non-0 flag argument is supplied.
String list.
A list of filenames that match the string separated
by newlines. If nothing matches, an empty string is
returned.

12230

filereadable(file_name)

12231

What it does:

12232

Parameter:

12233
12234

Not for widespread publication

file_name
Returns:

12235
12236
12237

Checks to see whether a file is readable.

The name of the file to check.


Integer.
Non-0 number is returned when the file exists and
can be read. A 0 indicates that the file does not
exist or is protected against reading.

12238

fnamemodify(file_name, modifiers)

12239
12240

What it does:

12241

Parameters:

Applies the modifiers to the file_name and return


the result.

12242

file_name

The name of a file.

12243

modifiers

Modification flags such as ":r:h".

12244

Returns:

12245

String.
The modified filename.

12246

getcwd()

12247

What it does:

Obtains the current working directory.

12248

Returns:

String.

12249

The current directory.

12250

getftime(file_name)

12251

What it does:

Gets the modification time of a file.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 512

Draft Not for publication


12252
12253
12254

Draft 0.1

Parameter:
file_name
Returns:

12255
12256

The name of the file to check.


Integer.
The modification time of the file (in UNIX format,
seconds since January 1, 1970), or -1 for error.

12257

getline(line_number)

12258

What it does:

12259

Parameter:

12260
12261
12262

Not for widespread publication

line_number
Returns:

12263
12264

Gets a line from the current editing buffer.

The line number of the line to get or "." for the line
the cursor is on.
String.
The text of the line or an empty string if the
line_number is out of range.

12265
12266

getwinposx()
getwinposy()

12267

What they do:

Return the x or y position of the Vim GUI window.

12268

Returns:

Integer.

12269
12270
12271
12272

The location in pixels of the x or y position of the


GUI window, or -1 when the information is not
available.
glob(file_name)

12273
12274
12275

What it does:

12276

Parameter:

12277
12278
12279
12280

file_name

Expands the wildcards in the filename and return a


list of files.

A string representing the filename pattern to


match. You can also use an external command
enclosed in backticks (`). For example
glob("`find . -name '*.c' -print`")

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 513

Draft Not for publication


12281

Returns:

12284

has(feature)

12285
12286

What it does:

12287

Parameter:

12288

feature
Returns:

12290

String list.

Checks to see whether a particular feature is


installed.

A string containing the feature name.


Integer flag.
1 if the feature is compiled in, or 0 if it is not.

12291

histadd(history, command)

12292

What it does:

12293

Parameters:

12294

history

Adds an item to one of the history lists.

Name of the history to use. Names are as follows:


"cmd"
"search"
"expr"
"input"

12295

Not for widespread publication

The list of files matched (separated by <NL>), or


the empty string if nothing matches.

12282
12283

12289

Draft 0.1

Returns:

12296

":"
" /"
" ="
"@"

Command history
Search pattern history
Expressions entered for "=
Input line history

Integer flag.
1 for okay, 0 for error.

12297

histdel(history, [pattern])

12298

What it does:

12299

Parameters:

Removes commands from a history.

12300

history

Which history list to use.

12301
12302
12303

[pattern]

A regular expression that defines the items to be


removed. If no pattern is specified, all items are
removed from the history.

12304
12305

Returns:

Integer flag.
1 for okay, 0 for error.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 514

Draft Not for publication

Draft 0.1

12306

histget(history, [index])

12307

What it does:

12308

Parameters:

Not for widespread publication

Obtains an item from the history.

12309

history

Which history list to use.

12310
12311
12312
12313

[index]

An index of the item to get. The newest entry is


-1, the next newest-2, and so on. The last entry is
1, next to last 2, and so on. If no index is specified,
the last entry is returned.

12314

Returns:

12315
12316

The specified item in the history, or an empty string


if there is an error.

12317

histnr(history)

12318
12319

What it does:

12320

Parameter:

12321

history

12322

Returns:

12323
12324

Returns the number of the current entry in the


given history.

The history to be examined.


Integer.
The number of the last item in the history or -1 for
error.

12325

hlexists(name)

12326
12327

What it does:

12328

Parameter:

12329

String.

name

12330

Returns:

12331

hlID(name)

12332
12333

What it does:

12334

Parameter:

Checks to see whether a syntax highlighting group


exists.

Name of the group to check for.


Integer flag Non-0, the group exists; 0 it does not.
Given the name of a syntax highlight group, returns
the ID number.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 515

Draft Not for publication


12335
12336

name
Returns:

12337

Draft 0.1

Not for widespread publication

Name of the syntax highlighting group.


Integer.
The ID number.

12338

hostname()

12339

What it does:

Gets the name of the computer.

12340

Returns:

String.

12341

The hostname of the computer.

12342

input(prompt)

12343

What it does:

12344

Parameter:

12345

prompt

Asks a question and gets an answer.

The prompt to be displayed.

12346

Returns:

12347

isdirectory(file_name)

12348

What it does:

12349

Parameter:

12350
12351

file_name
Returns:

12352
12353

String. What the user types in as a response.


Tests to see whether file_name is a directory.

The name of the item to be checked.


Integer flag.
1, it is a directory; 0 it is not a directory or does not
exist.

12354

libcall(dll_name, function, {argument})

12355
12356

What it does:

12357

Parameters:

Calls a function in a DLL file. (Microsoft Windows


only).

12358
12359

dll_name

Name of a shared library (DLL) file in which the


function is defined.

12360

function

The name of the function

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 516

Draft Not for publication


12361
12362
12363

argument

Draft 0.1

Not for widespread publication

A single argument. If this argument is an integer,


it will be passed as an integer. If it is a string, it
will be passed as "char *".

12364
12365

Note: The function must return a string or NULL. A function that returns
a random pointer might crash Vim.

12366

Returns:

12367

Whatever the function returns.

12368

line(position)

12369
12370

What it does:

12371

Parameter:

12372
12373
12374

String.

position
Returns:

12375
12376

Given a marker or other position indicator, returns


the line number.

The position marker. This can be a mark: 'x, the


current cursor location ., or the end-of-file $.
Integer.
The line number or 0 if the marker is not set or
another error occurs.

12377

line2byte(line_number)

12378

What it does:

12379

Parameter:

12380
12381
12382
12383

line_number

Returns:

12384
12385

Converts a line number to a byte index.

The line number to be converted. This can also be


a mark (x), the current cursor position (.) or the
last line in the buffer ($).
Integer.
The byte index of the first character in the line
starting with 1. An error results in a return of -1.

12386

localtime()

12387
12388

What it does:

Returns the current time in the UNIX standard time


format.

12389

Returns:

Integer.

12390

The number of seconds past January 1, 1970.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 517

Draft Not for publication

Draft 0.1

12391

maparg(name, [mode])

12392

What it does:

12393

Parameters:

Not for widespread publication

Returns what a key is mapped to.

12394

name

The name of a lhs mapping.

12395
12396

[mode]

The mode in which the string is mapped. This


defaults to "".

12397

Returns:

12398
12399

String.
The resulting mapping string. An empty string is
returned if there is no mapping.

12400

mapcheck(name, [mode])

12401

What it does:

12402

Parameters:

Checks to see whether a mapping exists.

12403

name

The name of a lhs mapping.

12404
12405

[mode]

The mode in which the string is mapped. This


defaults to "".

12406

Returns:

12407
12408
12409
12410
12411

String.
This returns any mapping that can match name.
This differs slightly from the maparg function in
that it looks at mappings for conflicting names. If
you have a mapping for "ax," for instance, it will
conflict with "axx".

12412

For example:

12413
12414
12415
12416
12417
12418
12419
12420
12421

:map ax Test
:echo maparg("ax")
Test
:echo maparg("axx")
:echo mapcheck("ax")
Test
:echo mapcheck("axx")
Test
match(string, pattern)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 518

Draft Not for publication


12422
12423
12424

What it does:

12425

Parameters:

Draft 0.1

Not for widespread publication

Checks to see whether string matches pattern.


Setting the 'ignorecase' ('ic') option causes the
editor to ignore upper/lowercase difference.

12426

string

String to check.

12427
12428

pattern

Pattern to check it against. This pattern acts like


'magic' is set.

12429

Integer.

12430
12431
12432

Returns:

12433

matchend(string, pattern)

12434
12435
12436

What it does:

12437

matchstr(string, pattern)

12438
12439

What it does:

12440

Parameters:

The index of the first character of string where


pattern occurs. The first character is number 0. If
nothing matches, a -1 is returned.
Similar to the match function, except that it returns
the index of the character of string just after where
pattern occurs.
Like the match function, but returns the string that
matches.

12441

string

String to check.

12442
12443

pattern

Pattern to check it against .This pattern acts like


'magic' is set.

12444
12445

Returns:

12446

nr2char(number)

12447

What it does:

12448

Parameter:

12449
12450
12451

number
Returns:

String. The part of {string} that matches or the


empty string if nothing matches.
Turns a number into a character.

The number of an ASCII character.


String of length 1.
The ASCII character for the number.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 519

Draft Not for publication


12452

rename(from, to)

12453

What it does:

12454

Parameters:

Draft 0.1

Not for widespread publication

Renames a file.

12455

from

The name of the existing file.

12456

to

The name to which we want to rename the file.

12457

Returns:

12458

Integer flag.
0 for success, non-0 for failure

12459

setline(line_number, line)

12460
12461

What it does:

12462

Parameters:

Replaces the contents of line line_number with the


string line.

12463

line_number

The number of the line to change.

12464

line

The text for the replacement line.

12465

Returns:

12466

Integer flag.
0 for no error, non-0 if there was a problem.

12467

strftime(format, [time])

12468
12469
12470
12471

What it does:

12472

Parameters:

Returns the time formatted according to the format


string. The conversion characters that can be put
in the string are determined by your system's
strftime function.

12473

format

The format string.

12474
12475

[time]

The time (in seconds since 1970) to be used.


(Default is now).

12476

Returns:

12477

String.
The time string containing the formatted time.

12478

strlen(string)

12479

What it does:

Computes the length of a string.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 520

Draft Not for publication


12480
12481
12482

12485
12486

string
Returns:

12498

Integer.

strpart(string, start, length)


What it does:

Returns the substring of string that starts at index


start and up to length characters long.
For example:

:echo strpart("This is a test", 0, 4)


This
:echo strpart("This is a test", 5, 2)
is

12492
12493
12494
12495
12496
12497

The string whose length you want.

The length of the string.

12487
12488
12489
12490
12491

Not for widespread publication

Parameter:

12483
12484

Draft 0.1

If the start or length parameters specify nonexistent characters, they are ignored. For example,
the following strpart command starts to the left of
the first character:
:echo strpart("This is a test", -2, 4)
Th
Parameters:

12499

string

The string from which you want a piece.

12500
12501

start

The location of the start of the string you want to


extract.

12502

length

12503

Returns:

12504

strtrans(string)

12505
12506

What it does:

12507

Parameter:

12508
12509

string
Returns:

The length of the string to extract. String.


The substring extracted for string.
Translates the unprintable characters in {string} to
printable ones.

A string containing unprintable characters.


String.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 521

Draft Not for publication


12510
12511

Draft 0.1

Not for widespread publication

The resulting string has unprintable characters,


such as CTRL-A translated to ^A.

12512

substitute(string, pattern, replace, flag)

12513
12514
12515

What it does:

12516

:. substitute /pattern/replace/flag

12517

Parameters:

In string, changes the first match of pattern with


replace. This is the similar to performing the
following on a line containing string:

12518

string

The string in which the replacement is to be made.

12519
12520

pattern

A pattern used to specify the portion of string to be


replaced.

12521

replace

The replacement text.

12522
12523

flag

If the empty string, replace just the first


occurrence. If g, replace all occurrences.

12524

Returns:

12525

String.
The string that results from the substitution.

12526

synID(line, column, transparent_flag)

12527
12528

What it does:

12529

Parameters:

Returns the syntax ID of the item at the given line


and column.

12530

line, column

12531
12532

transparent_flag If non-0, transparent items are reduced to the items


they reveal.

12533

Returns:

12534

The location of the item in the buffer.

Integer.
The Syntax ID.

12535

synIDattr(sytnax_id, attribute, [mode])

12536

What it does:

12537

Parameters:

12538

syntax_id

Obtains an attribute of a syntax color element.

The syntax identification number.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 522

Draft Not for publication


12539
12540

attribute

Draft 0.1

The name of an attribute. The attributes are as


follows:
The name of the syntax item
Foreground color
Background color
Foreground color in #RRGGBB form
Background color in #RRGGBB form
"1" if this item is bold
"1" if this item is italic
"1" if this item is reverse
Same as "reverse"
1" if this item is underlined

name
fg
bg
fg#
bg#
bold
italic
reverse
inverse
underline
12541
12542
12543
12544

mode

Returns:

12545

"Which type of terminal to get the attributes for.


This can be gui, cterm, or term. It defaults to the
terminal type you are currently using.
String.
The value of the attribute.

12546

synIDtrans(syntax_id)

12547

What it does:

12548

Parameter:

12549
12550

syntax_id
Returns:

12551

Returns a translated syntax ID.

The ID of the syntax element.


Integer.
The translated syntax ID.

12552

system(command)

12553
12554
12555
12556

What it does:

12557

Parameter:

12558

Not for widespread publication

command

12559

Returns:

12560

tempname()

Executes the external command specified by


command and captures the output. The options
'shell' ('sh') and 'shellredir' ('ssr') apply to
this function.

A command to execute.
String. Whatever the command output is returned.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 523

Draft Not for publication

Draft 0.1

Not for widespread publication

12561

What it does:

Generates a temporary filename.

12562

Returns:

String.

12563
12564

The name of a file that can be safely used as a


temporary file.

12565

visualmode( )

12566

What it does:

Gets the last visual mode.

12567

Returns:

String.

12568
12569

The last visual mode as a command string. This is


either v, V, or CTRL-V.

12570

virtcol(location)

12571

What it does:

12572

Parameter:

12573
12574
12575

location
Returns:

12576
12577
12578
winbufnr(number)

12580
12581

What it does:

12582

Parameter:

12584

A location indicator such as . (cursor location), 'a


(mark a), or $ (end of the buffer).
Integer.
The location of the virtual column (that is, the
column number assuming that tabs are expanded
and unprintable characters are made printable).

12579

12583

Computes the virtual column of the given location.

number
Returns:

12585

Gets the buffer number of the buffer that is in a


window.

The window number or 0 for the current window.


Integer.
Buffer number or -1 for error.

12586

winheight(number)

12587

What it does:

12588

Parameter:

Gets the height of a window.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 524

Draft Not for publication


12589
12590

number
Returns:

12591

Draft 0.1

Not for widespread publication

The window number or 0 for the current window.


Integer.
Window height in lines or -1 for error.

12592

winnr()

12593

What it does:

Gets the current window number.

12594

Returns:

Integer.

12595
12596

The current window number. The top window is


#1.

12597

Obsolete Functions

12598
12599

A few functions are currently obsolete and have been replaced with newer
versions; however, you might still find some scripts that use them.
Obsolete Name
buffer_exists()
buffer_name()
buffer_number()
last_buffer_nr()
file_readable()
highlight_exists()
highlightID()

Replacement
bufexists()
bufname()
bufnr()
bufnr("$")
filereadable()
hlexists()
hlID()

12600

Plugins and other scripts

12601
12602

To read in a script file you use the command :source (:so) and the script
name:

12603

:source my-file.vim

12604
12605
12606

There are a number of files that Vim reads in automatically. Any file that is
in the $HOME/.vim/plugin directory is considered a plugin and read in
automatically.

12607
12608

The 'runtimepath' ('rtp') option can also be set to a series of directories


in which to look for plugins.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 525

Draft Not for publication


12609
12610
12611
12612
12613

Draft 0.1

Not for widespread publication

Vim has a couple of funny syntax elements that to help avoid name
collisions with plugins or any other script. The <SID> string will be translated
into a magic character (named <SNR>) a unique serial number and an
underscore. So putting <SID> in front of all your variables and functions in a
script assures that they will all have a unique name.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 526

Draft Not for publication

Draft 0.1

Not for widespread publication

12614

Chapter 28: Customizing the Editor

12615
12616

The Vim editor is highly customizable. It gives you a huge number of


options.

12617
12618

This chapter discusses how to use the ones that enable you to customize
the appearance and the behavior of your Vim editor.

12619

This chapter discusses the following:

12620

The :set command (in extreme detail)

12621

Local initialization files

12622

Customizing keyboard usage

12623

Customizing messages and the appearance of the screen

12624

Other miscellaneous commands

12625

Setting

12626
12627

The Vim editor has a variety of ways of setting options. Generally, to set an
option, you use the :set (:st) command:

12628

:set option=value

12629

This works for most options. Boolean options are set with this command:

12630

:set option

12631

They are reset with the following command:

12632

:set nooption

12633

To display the value of an option, use this command:

12634

:set option?

12635
12636
12637
12638
12639

If you want to set an option to its default value, use the following
command:
:set option&
Boolean Options
You can perform the following operations on a Boolean option.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 527

Draft Not for publication

:set
:set
:set
:set
:set
12640

12657

Meaning
Turn the option on.
Turn the option off.
Invert the option.
Invert the option
Set the option to the default value.

:set list
:set list?
list
:set nolist
:set list?
nolist
:set list!
:set list?
list
:set list&
:set list?
nolist
Numeric Options
You can perform the following operations on a numeric option.
:set
:set
:set
:set

12658

Not for widespread publication

For example:

12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
12652
12653
12654
12655
12656

Operation
{option}
no{option}
{option}!
inv{option}
{option}&

Draft 0.1

Command
option += value
option -= value
option ^= value
option&

Meaning
Add value to the option.
Subtract value from the option.
Multiply the option by value.
Set the option to the default value.

For example:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 528

Draft Not for publication


12659
12660
12661
12662
12663
12664
12665
12666
12667
12668
12669
12670
12671
12672
12673
12674
12675
12676

Not for widespread publication

:set shiftwidth=4
:set shiftwidth += 2
:set shiftwidth?
shiftwidth=6
:set shiftwidth-=3
:set shiftwidth
shiftwidth=3
:set shiftwidth ^= 2
:set shiftwidth
shiftwidth=6
:set shiftwidth&
:set shiftwidth
shiftwidth=8
String-Related Commands
You can perform the following operations on string options:
Command
:set option += value
:set option -= value
:set option ^= value

12677

Draft 0.1

Meaning
Add value to the end of the option.
Remove value (or characters) from the
option.
Add value to the beginning of the option.

For example:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 529

Draft Not for publication


12678
12679
12680
12681
12682
12683
12684
12685
12686
12687
12688
12689
12690
12691
12692

Draft 0.1

Not for widespread publication

:set cinwords=test
:set cinwords?
cinwords=test
:set cinwords+=end
:set cinwords?
cinwords=test,end
:set cinwords-=test
:set cinwords?
cinwords=end
:set cinwords^=start
:set cinwords?
cinwords=start,end

12693

Another Set Command

12694
12695

The following command sets a Boolean option (such as 'list' and


'nolist'), but it displays the value of other types of options:

12696
12697
12698
12699

:set option
However, it is not a good idea to use this form of the command to display
an option value because it can lead to errors if you are not careful. It is much
better to use the following command to display the value of an option:

12700

:set option?

12701

An alternative form of the

12702

:set option = value

12703

command is this command:

12704

:set option:value

12705

Other :set Arguments

12706
12707
12708

Error: Reference source not foundError: Reference source not foundTheEr


ror: Reference source not foundError: Reference source not found following
command prints out all the options that differ from their default values:

12709

:set

12710

The following command prints all options:

12711

:set all

12712

This command prints out all the terminal control codes:


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 530

Draft Not for publication

Draft 0.1

Not for widespread publication

12713

:set termcap

12714

Finally, to reset everything to the default values, use this command:

12715

:set all&

12716

Chaining Commands

12717
12718

You can put several :set operations on one line. To set three different
options, for example, use the following command:

12719

:set list shiftwidth=4 incsearch

12720

Automatically Setting Options in a File

12721
12722

You can put Vim settings in your files. When Vim starts editing a file, it
reads the first few lines of the file, looking for a line like this:

12723
12724
12725
12726

vim: set option-command option-command option-command .... :


This type of line is called a modeline. In a program, for instance, a typical
modeline might look like this:
/* vim: set shiftwidth=4 autoindent : */

12727

An alternate format is:

12728

vim: option-command:.option-command: ...:

12729
12730
12731

The option 'modeline' ('ml') turns on and off this behavior. The
'modelines' ('mls') option controls how many lines are read at the start and
end of the file when Vim looks for setting commands.

12732
12733

If you set the following option, for instance, Vim does not look for
modelines:

12734
12735
12736
12737
12738
12739

:set nomodeline
If the following option is set, Vim does look at the top and bottom of each
file for the number of lines specified by the 'modeline' option:
:set modeline
For example, you may see lines like the following at the end of many of the
Vim help files:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 531

Draft Not for publication


12740

Draft 0.1

Not for widespread publication

vim:tw=78:ts=8:sw=8:

12741
12742
12743
12744
12745

This sets the 'tw' ('textwidth') option to 78, the 'ts' ('tabstop') to 8,
and the 'sw' ('shiftwidth') to 8. These settings make the text in the help files
look nice. By using modelines, the creators of the help file make sure that the
text is formatted correctly no matter what local settings you use for your other
files.

12746
12747
12748
12749
12750

Another example: For this book, I have had to create a number of C


programming examples. When I copy these programs into the word processor,
the tabs get really screwed up. The solution to this problem is to make sure that
there are no tabs in the program. One way to do this is to put a line like this at
the end of the file:

12751

/* vim: set expandtab : */

12752
12753
12754
12755

This turns on 'expandtab' and causes Vim to never insert a real tab--well,
almost never; you can force the issue by using CTRL-V <Tab>. If you have some
custom settings for your own C programs, you can put a line near the top of
bottom of your program like this:

12756

/* vim: set cindent shiftwidth=4 smarttabs : */

12757

Local .vimrc Files

12758
12759
12760
12761

Suppose you want to have different settings for each directory. One way to
do this is to put a .vimrc or .gvimrc file in each directory. That is not enough,
however, because by default Vim ignores these files. To make Vim read these
files, you must set the 'exrc' ('ex') option:

12762

:set exrc

12763
12764

Note: The .vimrc and .gvimrc files are read from the current directory,
even if the file being edited is located in a different directory.

12765
12766
12767

Setting this option is considered a security problem. After all, bad things
can easily be dumped into these files, especially if you are editing files in
someone else's directory.

12768
12769

To avoid security problems, you can set the 'secure' option using this
command:

12770
12771
12772

:set secure
This option prevents the execution of the :autocommand, :write, and
:shell commands from inside an initialization file.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 532

Draft Not for publication

Draft 0.1

Not for widespread publication

12773

Customizing Keyboard Usage

12774
12775

The Vim editor is highly customizable. This section shows you how to finetune the keyboard usage so that you can get the most out of your editor.

12776

Microsoft Windows

12777
12778
12779
12780

Most programs that run under Microsoft Windows use the Alt keys to
select menu items. However, Vim wants to make all keys available for
commands. The 'winaltkeys' ('wak') option controls how the Alt keys are
used.

12781
12782

If you use the following command, for example, all the Alt keys are
available for command mapping with the :map command:

12783
12784
12785
12786
12787
12788
12789

:set winaltkeys=no
Typing ALT-F will not select the file menu, but will instead execute the
command ALT-F is mapped to. A typical mapping might be this:
:map <M-f> :write
(Remember: Vim "spells" ALT as M-, which stands for Meta.) If you use the
following command, all the Alt keys will select menu items and none of them can
be used for mapping:

12790

:set winaltkeys=yes

12791

The third option is a combination of yes and no:

12792

:set winaltkeys=menu

12793
12794
12795

In this mode, if an Alt key can be used for a menu, it is; otherwise, it is
used for :map commands. So ALT-F selects the File menu, whereas you can use
ALT-X (which is not a menu shortcut) for :map commands.

12796
12797
12798

Two options control how Vim reads the keyboard when you are using the
console version of Vim from an MS-DOS window. The 'conskey' ('consk')
option tells Vim to read characters directly from the console:

12799

:set conskey

12800
12801

Do not set this option if you plan to use your Vim editor to read a script file
from the standard input.

12802
12803

The 'bioskey' ('biosk') option tells Vim to use the BIOS for reading the
keyboard:

12804

:set bioskey
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 533

Draft Not for publication

Draft 0.1

Not for widespread publication

12805
12806
12807

Again, do not use this if you plan using a script file for a redirected
standard in. By pointing Vim at the BIOS, you get faster response to CTRL-C and
Break interrupts.

12808

Customizing Keyboard Mappings

12809
12810
12811

Most UNIX function keys send out a string of characters beginning with
<Esc> when they are pressed. But a problem exists: the <Esc> key is used to end
insert mode. So how do you handle function keys in insert mode?

12812
12813
12814
12815

The solution is for Vim to wait a little after an <Esc> key is pressed to see
whether anymore characters come in. If they do, Vim knows that a function key
has been pressed and acts accordingly. To turn on this feature, execute the set
the 'esckeys' option:

12816
12817
12818

:set esckeys
But what about other key sequences? These are controlled by the
'timeout' ('to') and 'ttimeout' options:

12819
12820

:set timeout
:set ttimeout

12821

The following table shows the effects of these settings.

12822
12823
12824
12825
12826
12827
12828
12829

timeout
notimeout
timeout

ttimeout
nottimeout
N/A

notimeout

ttimeout

Result
Nothing times out.
All key codes (<F1>, <F2>, and so on) and
:map macros time out.
Key codes (<F1>, <F2>, and so on) only time
out.

The option 'timeoutlen' ('tm') determines how long to wait after <Esc>
has been pressed to see whether something follows. The default is as follows,
which equals one second (1000 milliseconds):
:set timeoutlen=1000
Generally, 'timeoutlen' controls how long to wait for both function keys
and keyboard mapping strings. If you want to have a different timeout for
keyboard mapping strings, use the 'ttimeoutlen' ('ttm') option:
:set ttimeoutlen=500

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 534

Draft Not for publication

Draft 0.1

Not for widespread publication

12830
12831
12832
12833
12834
12835

These two timeouts tell Vim to wait 1/2 second after an <Esc> key has been
pressed to see whether you have a function key or one second to see whether it
is a keyboard mapping. (In other words, if Vim reads enough to determine that
what comes after the <Esc> press cannot possibly be a keyboard mapping
sequence, it will wait only one second between characters trying to figure out
what function key has been typed.)

12836

Confirmation

12837
12838
12839
12840

Generally, when you do something that Vim considers questionable, such


as quitting from a modified buffer, the command fails. If you set the 'confirm'
('cf') option, however, and use the following command, Vim displays a
confirmation dialog box instead of failing:

12841
12842
12843

12845

:set confirm
When you try to :quit a buffer containing a modified file, for example, the
Vim editor displays a confirmation dialog box (see Figure 28-1).

Figure 28-1: Confirmation dialog box.

12846

Customizing Messages

12847
12848
12849
12850
12851

Vim generally uses the bottom line of the screen for messages. Sometimes
these messages exceed one line and you get a prompt that states something like
Press Return to Continue. To avoid these prompts, you can increase the
number of message lines by setting the 'cmdheight' ('ch') options. To change
the height of the message space to 3, for instance, use this command:

12852

:set cmdheight=3

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 535

Draft Not for publication

Draft 0.1

Not for widespread publication

12853

Showing the Mode

12854
12855
12856

When you set the 'showmode' ('smd') option, the Vim editor displays the
current mode in the lower-left corner of the screen. To enable this feature, use
the command:

12857

:set showmode

12858

Showing Partial Commands

12859
12860
12861

If you set the 'showcmd' ('sc') option, any partial command is displayed at
the lower-right of the screen while you type it. Suppose you execute the
following command:

12862

:set showcmd

12863
12864

Now you enter an fx command to search for x. When you type the f, an f
appears in the lower-right corner.

12865
12866
12867

This is nice for more complex commands because you can see the
command as it is assembled. For example, the command displays the entire
command (incomplete as it is) in the lower-right corner: "y2f.

12868
12869

Figure 28-2 shows how 'cmdheight', 'showmode', and 'showcmd' affect


the screen.

12870
12871
12872
12873
12874
12875
12876
12877
12878
12879
12880
12881cmdheight
12882
12883
12884
12885
12886

***
A very intelligent turtle
Found programming UNIX a hurdle
The system, you see,
Ran as slow as did he,
And that's not saying much for the turtle.
***
joke.txt

-- VISUAL --

2f
showcmd

showmode
Figure 28-2: 'showmode' and 'showcmd'.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 536

Draft Not for publication

Draft 0.1

Not for widespread publication

12887

Short Messages

12888
12889
12890
12891

Another way to limit the "Press Return" prompts is to set the "short
message" option. This shortens many common messages. The flags in the
'shortmess' ('shm') option determine which messages are shortened. The
general form of this command is as follows:

12892

:set shortmess=flags

12893

The following table lists the flags.


Flag Short Value
Long Value
Default
(3 of 5)
(file 3 of 5)
f
On
[noeol]
[Incomplete last line]
i
On
999L, 888C
999 lines, 888 characters
l
On
[+]
[Modified]
m
Off
[New]
[New File]
n
On
[RO]
[re
adonly]
r
Off
[w]
written
w
Off
[dos]
[dos
format]
x
On
[unix]
[unix format]
x
On
[mac]
[mac
format]
x
On
a
All the abbreviations: filmnrwx.
A
Eliminate the "attention" messages issued when Vim finds an
existing swap file. (Default = off.)
I
Eliminate the introduction screen. (Default = off.)
o

Sometimes you will perform an operation that writes a file and


then does something else that writes a message, such as
executing a :wnext command.
If this option is not set, you will get two messages and will
probably have to go through a "Press Return" prompt to see the
second one.
If this option is set (the default), the first message is overwritten
by the second.
(Default = on.)

If you get a message stating that you are reading a file, it will
overwrite any previous message.
(Default = on.)

If set, do not issue a "Search Hit Bottom, Continuing at Top" or


"Search Hit Top, Continuing at Bottom" message.
(Default = off.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 537

Draft Not for publication

Draft 0.1

Not for widespread publication

Flag Short Value


Long Value
Default
t
If set, truncate the filename at the beginning of the message if it
is too long to fit on one line. Thus, a long filename, such as
/home/oualline/writing/books/vim-book/editormessages/my-replies/tuesday.txt, appears as <itormessages/my-replies/tuesday.txt (or something similar).
(Default = off.) (Does not change the message in ex mode.)
T

Truncate messages in the middle if they are too long. The


deleted portion will appear as an ellipsis (...).
(Default = on.) (Does not apply to ex mode.)

Drop "written" or "[w]" when writing a file.


(Default = off.)

12894

The 'terse' Option

12895

To set the 'terse' option, issue the command:

12896

:set terse

12897
12898

This command adds the s flag to the 'shortmess' option. Setting


'noterse' removes this flag.

12899

The "File Modified" Warning

12900
12901
12902

Generally, Vim warns when you do a :shell command and the file is
modified before you return to Vim. If you want to turn off this option, execute the
following command:

12903

:set nowarn

12904

Error Bells

12905
12906
12907
12908

When Vim gets an error, it just displays an error message. It is silent. If


you are more audio-oriented than visually proficient, you might want to turn on
the 'errorbells' ('eb') option. This following command causes Vim to beep
when there is an error:

12909
12910
12911
12912
12913
12914

:set errorbells
Beeping can sometimes disturb others in an office or classroom
environment. An alternative to audio bells is a "visual" bell. When the
'visualbell' ('vb') option is set, the screen flashes (everything will go into
reverse video and back to normal quickly). To set this option, use the following
command:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 538

Draft Not for publication


12915

Draft 0.1

Not for widespread publication

:set visualbell

12916

Status Line Format

12917
12918

You can customize the status line. You can use the 'statusline' ('stl')
option to define your status line:

12919
12920
12921

:set statusline=format
The format string is a printf line format string. A % is used to indicate a
special field. For example, %f tells Vim to include the filename in the status line.

12922

The command

12923

:set statusline=The\ file\ is\ \"%f\"

12924

gives you the following status line:

12925

The file is "sample.txt"

12926
12927
12928

You can specify a minimum and maximum width for an item. For example,
the command tells Vim that the filename must take up 8 characters, but is
limited to only 19:

12929
12930
12931

:set statusline=%8.19f
Items are right-justified. If you want them left-justified, put a - just after
the %. For example:

12932
12933
12934
12935
12936

->%10.10f<->
foo.txt<-

->%-10.10f<>foo.txt
<-

Numeric items are displayed with leading zeros omitted. If you want them,
put a zero after the %. To display the column number, for instance, with leading
zeros, use the following command:

12937

:set statusline=%05.10c

12938
Format
%( ... %)

%{n}*

Type

Description
Define an item group. If all the items in this group
are empty, the entire item group (and any text
inside it) disappears.
Uses the highlight group Usern for the rest of the
line (or until another %n* is seen).The format %0*
returns the line to normal highlighting.
If the highlight group User1 is underlined, for
example, the status line
:set statusline=File:\ %1*%f%0*

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 539

Draft Not for publication


Format

Type

%<
%=

%%
%B

Number

%F
%H
%L
%M
%O
%P
%R
%V

String
Flag
Number
Flag
Number
String
Flag
Number

%W
%Y
a%

Flag
Flag
String

%b

Number

%c
%f
%h
%l
%m
%n
%o

Number
String
Flag
Number
Flag
Number
Number

Draft 0.1

Not for widespread publication

Description
gives you the following status line:
File: sample.txt
Define a location where the status line can be
chopped off if it is too long.
Defines a location in the "middle" of the line. All
the text to the left of this will be placed on the left
side of the line, and the text to the right will be put
against the right margin.
For example:
:set statusline=<-Left%=Right->
results in
<-Left
Right->
The character %.
The number of the character under the cursor in
hexadecimal.
Filename including the full path.
HLP if this is a help buffer.
Number of lines in buffer.
+ if the buffer is modified.
Byte offset in the file in hexadecimal form.
The % of the file in front of the cursor.
RO if the buffer is read-only.
Virtual column number. This is the empty string if
equal to %c.
PRV if this is the preview window.
File type
If you are editing multiple files, this string is
"({current} of {arguments})".
For example:
(5 of 18)
If there is only one argument in the command line,
this string is empty.
The number of the character under the cursor in
decimal.
Column number.
The filename as specified on the command line.
[Help] if this is a help buffer.
Line number.
[+] if the buffer is modified.
Buffer number.
Number of characters before the cursor including
the character under the cursor.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 540

Draft Not for publication


Format
%p
%r
%t
%v
%w
%y
%{expr%}
12939
12940
12941

Type
Number
Flag
String
Number
Flag
Flag

Draft 0.1

Description
Percentage through file in lines.
[RO] if the buffer is read-only.
The filename (without any leading path
information).
Virtual column number.
[Preview] if this is a preview window.
Type of the file as [type].
The result of evaluating the expression expr.

The flag items get special treatment. Multiple flags, such as RO and PRV,
are automatically separated from each other by a comma. Flags such as + and
help are automatically separated by spaces.

12942

For example:

12943

:set statusline=%h%m%r

12944

can look like this:

12945
12946
12947
12948
12949
12950

Not for widespread publication

[help] [+] [RO]


Note: For the purpose of this example, we are ignoring the fact that we
have done the improbable and modified a read-only buffer.
The 'fillcharacs' ('fcs') option controls how extra space in the status
lines (and other separation lines) is filled. It is a list of value from the following
table:
diff:{char} Deleted lines in a diff window
fold:{char} Lines which indicate folds
slt:{char} Status line of the current window
stln:{char} Status line of non-current windows
vert:{char} Vertical lines separating windows.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 541

Draft Not for publication


12951
12952
12953
12954
12955
12956
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12969
12970
12971
12972
12973
12974

Draft 0.1

Not for widespread publication

+ +--399 lines: ************************|+ +--399 lines: ***********************


scsi_cmd.cmd[8] = sizeof(log)%256;|
scsi_cmd.cmd[8] = sizeof(log)%256
scsi_cmd.cmd[9] = 0;
|
scsi_cmd.cmd[9] = 0;
|
fold
diff
scsi_cmd.inlen = 0;
|
scsi_cmd.inlen = 0;
scsi_cmd.outlen = sizeof(log);
|
scsi_cmd.outlen = sizeof(log);
|
// For more infomration see:
| ------------------------------------if (ioctl (fd, SCSI_IOCTL_SEND_COM|
if (ioctl (fd, SCSI_IOCTL_SEND_CO
int error = errno;
|
int error = errno;
perror("SCSI command failed: "|
perror("SCSI command failed:
printf("Error code: %d\n", err|
printf("Error code: %d\n", er
exit (1);
|
exit (1);
}
|
}
+ +--282 lines: Copy the the data to the|+ +--282 lines: Copy the the data to th
~
| ~
~
| ~
~
| ~
vert
~
| ~
slt
stln
~
| ~
~
| ~
~
| ~
<tatus/dlt-status.cpp 1,3-8
All </dlt-status.cpp.bad 1,3-8
All
"mtstatus/dlt-status.cpp.bad" 693L, 20156C

12975

Rulers

12976
12977

If you do not like the default status line, you can turn on the 'ruler'
('ru') option:

12978

:set ruler

12979

This causes Vim to display a status line that looks like this:

12980
12981
12982
12983
12984

help.txt [help][RO]

1,3-8

Top

After the file name and flags, this displays the current column, the virtual
column, and an indicator showing you how far you are through the file. If you
want to define your own ruler format, set the 'rulerformat' ('ruf') to the
desired format.

12985

:set rulerformat=string

12986

String is the same string used for the 'statusline' option.

12987

Reporting Changes

12988
12989
12990

When you delete or change a number of lines, Vim tells you about it if the
number of lines is greater than the value of the 'report' option. Therefore, to
report information on all changes, use the following command:

12991

:set report=0
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 542

Draft Not for publication

Draft 0.1

Not for widespread publication

12992
12993

On the other hand, if you do not want to be told about what you have
changed, you can set this to a higher value.

12994

Help Window Height

12995
12996

You can set the minimum size of the help window by using the
'helpheight' ('hh') command:

12997

:set helpheight=height

12998
12999

This minimum is used when opening the help window. The height can get
smaller afterwards .

13000

Preview Window Height

13001
13002

You can also specify the height of the preview window by using the
'previewheight' ('pvh') option:

13003

:set previewheight=height

13004

Defining How 'list' Mode Works

13005
13006
13007

Generally, 'list' ('li') uses ^I for <Tab> and $ for the end of the line.
You can customize this behavior. The 'listchars' ('lcs') option defines how
list mode works. The format for this command is as follows:

13008

:set listchars=key:string,key:string,...

13009

The possible values for the key:string pairs are:


eol:char
tab:char1 char2
trail:char
extends:char

Define the character to be put after the end of


the line.
A tab is displayed as char1 followed by enough
char2 to fill the width.
Character for showing trailing spaces
Character used at the end of a line that wraps to
the next line in screen space.

13010

For example:

13011

:set listchars=tab:>-

13012

shows up with tabs like this:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 543

Draft Not for publication


13013
13014
13015
13016

Draft 0.1

>-------Tabbing
can>----be
fun if you >----know how
to set the list >------->-------command.

13017

Another example:

13018

:set listchars=tab:>-,trail:=

13019

Gives us:

13020
13021
13022
13023

Not for widespread publication

This line>------====
has spaces and tabs>----===
at the end=====
of the line====

13024

Suppose that you have set the following options:

13025
13026

:set nowrap
:set listchars=extends:+

13027

Figure 28-3 displays the results.

13028
13029
13030
13031
13032
13033
13034
13035
13036

The student technicians were


technician took the back off
loose chip and instead found
board. He decided to talk to
Technician:

used to t+
a termina+
a large h+
the prof+

Did you pile papers on+

Professor: Yes.
Figure 28-3: listchars=extends:+.

13037

Changing the line number size

13038
13039
13040

The 'numberwidth' ('nuw') option controls how many characters are taken
up by the line numbers which are displayed if 'number' is set. This is a minimum
width. Vim will increase it if the number of lines in the file gets very large.

13041

Changing the Highlighting

13042
13043

You can change the highlighting of various objects by using the


'highlight' ('hl') option. The format for this option is as follows:

13044
13045
13046

:set highlight=key:group, [key:group]....


Key is a key letter listed in the following table, and group is the name of a
highlight group. The keys are:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 544

Draft Not for publication


Key
Default
8
SpecialKey

13047
13048

NonText

ModeMsg

S
V

StatusLineNC
VisualNOS

W
d
e
i
l
m
n
r
s
t

WildMenu
Directory
ErrorMsg
IncSearch
Search
MoreMsg
LineNr
Question
StatusLine
Title

v
w

Visual
WarningMsg

13051
13052
13053
13054

Not for widespread publication

Meaning
This highlighting is applied when :map lists out a
special key.
Applied to the ~ and @ character that Vim uses to
display stuff that is not in the buffer.
The mode information in the lower left of the screen.
(See the 'showmode' option.)
Status line for every window except the current one.
Text selected in visual mode when Vim does not own
the selection.
Items displayed as part of a wildcard completion set.
Directories listed when you press CTRL-D.
Error messages.
Text highlighted as part of an incremental search.
Text highlighted as part of a search.
The -- More -- prompt.
The line number printed by the :number command.
The Press Return prompt and other questions.
The status line of the current windows.
Titles for commands that output information in
sections, such as :syntax, :set all, and others.
Text selected in visual mode.
Warning

You can use a number of shorthand characters for highlighting, including


the following:
r
i
b
s
u
n
-

13049
13050

Draft 0.1

Reverse
Italic
Bold
Standout
Underline
None
None

Therefore, you can specify that the error message use the highlight group
ErrorMsg by executing the following command:
:set highlight=e:ErrorMsg
Or, you can use the shorthand to tell Vim to display error messages in
reverse, bold, italic, by issuing this command:
:set highlight=e:vrb

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 545

Draft Not for publication

Draft 0.1

Not for widespread publication

13055
13056
13057

In actual practice, you would not define just one mode with a :set
highlight command. In practice, this command can get quite complex. If a key
is not specified, the default highlighting is used.

13058

The 'more' Option

13059
13060
13061

When the 'more' option is set, any command that displays more than a
screen full of data pauses with a More prompt. If not set, the listing just scrolls
off the top of the screen.

13062

The default is:

13063

:set more

13064

Number Format

13065
13066

The following command defines which types of numbers can be recognized


by the CTRL-A and CTRL-X commands:

13067

:set nrformats=octal,hex

13068

(Decimal format is always recognized.)

13069

Restoring the Screen

13070
13071

When the 'restorescreen' ('rs') option is set, Vim attempts to restore


the contents of the terminal screen to its previous value:

13072

:set restorescreen

13073
13074

In other words, it tries to make the screen after you run Vim look just like
it did before your ran the program.

13075

Pasting Text

13076
13077
13078
13079

The X Windows xterm program enables you to select text by drawing the
mouse over it while the left button is held down. This text can then be "pasted"
into another window. However, some of Vim's capabilities can easily get in the
way when pasting text into the window.

13080

To avoid problems, you can set paste mode the 'paste' option:

13081

:set paste

13082

This is shorthand for setting a number of options:

13083

:set textwidth=0
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 546

Draft Not for publication


13084
13085
13086
13087
13088
13089
13090
13091
13092
13093
13094
13095
13096
13097
13098

:set
:set
:set
:set
:set
:set
:set
:set
:set
:set

Draft 0.1

Not for widespread publication

wrapmargin=0
noautoindent
nosmartindent
nocindent
softtabstop=0
nolisp
norevins
noruler
noshowmatch
formatoptions=""

At times, you might want paste mode and you might not. The
'pastetoggle' option enables you to define a key that toggles you between
'paste' mode and 'nopaste' mode. To use the <F12> key to toggle between
these two modes, for instance, use the command:
:set pastetoggle=<F12>

13099
13100

When 'paste' mode is turned off, all the options are restored to the values
they had when you set paste mode.

13101

Wildcards

13102
13103
13104

When you are entering a command in ex mode, you can perform filename
completion. If you want to read in the file input.txt, for example, you can enter
the following command:

13105
13106
13107
13108

:read input<Tab>
Vim will try to figure out which file you want. If the only file in your
current directory is input.txt, the command will appear as:
:read input.txt

13109
13110
13111

If several files that with the word input, the first will display. By pressing
<Tab> again, you get the second file that matches; press <Tab> again, and you
get the third, and so on.

13112
13113

To define which key accomplishes the wildcard completion, set the


'wildchar' ('wc') command:

13114
13115
13116
13117
13118

:set wildchar=character
If you are using filename completion inside a macro, you need to set the
'wildcharm' ('wcm') (which stand for wild-char-macro). It is the character that
accomplishes filename completion from inside a macro.
For example:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 547

Draft Not for publication


13119
13120

Draft 0.1

Not for widespread publication

:set wildcharm=<F12>
:map <F11> :read in<F12>

13121
13122

Now when you press <F11>, it will start a read command for the file inwhatever.

13123
13124

You probably do not want to match backup file or other junk files. To tell
Vim what is junk, use the 'wildignore' ('wig') option:

13125
13126
13127
13128
13129
13130
13131
13132
13133

:set wildignore=pattern,pattern
Every file that matches the given pattern will be ignored. To ignore object
and backup files, for example, use the following command:
:set wildignore=*.o,*.bak
The 'suffixes' ('su') option lists a set of file name suffixes that will be
given a lower priority when it comes to matching wildcards. In other words if a
file has one of these suffixes it will be placed at the end of any wildcard list.
Generally, the filename completion code does not display a list of possible
matches.

13134

If you set the 'wildmenu' ('wmnu') option

13135

:set wildmenu

13136
13137
13138
13139
13140
13141
13142
13143
13144
13145
13146

when you attempt to complete a filename, a menu of possible files displays


on the status line of the window (see Figure 28-4).
This is a test
~
~
~
~
~
~
in.txt index.txt indoors.txt input.txt >
:read /tmp/in.txt

13147

Figure 28-4: Filename completion.

13148
13149
13150
13151

The arrow keys cause the selection to move left and right. The > at the end
of the line indicates that there are more choices to the right. The <Down> key
causes the editor to go into a directory. The <Up> key goes to the parent
directory. Finally, <Enter> selects the item.

13152
13153
13154

You can customize the behavior of the file completion logic by using the
'wildmode' ('wim') option. The following command causes Vim to complete only
the first match:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 548

Draft Not for publication


13155
13156
13157
13158
13159
13160
13161
13162
13163
13164
13165
13166
13167

13171
13172
13173
13174
13175
13176
13177
13178
13179
13180
13181
13182
13183
13184
13185
13186
13187
13188
13189
13190
13191

Not for widespread publication

:set wildmode=
If you keep pressing the 'wildchar' key, only the first match displays.
Figure 28-5 shows how this option works.
First 'wildchar'

in.txt
invoide.txt

13168
13169
13170

Draft 0.1

input.txt

Figure 28-5: wildmode=.


The following command causes Vim to complete the name with the first file
it can find:
:set wildmode=full
After that, if you keep pressing the 'wildchar' key, the other files that
match are gone through in order. Figure 28-6 shows what happens when this
option is enabled.
First 'wildchar'
Next 'wildchar'
Next 'wildchar'
in.txt
invoide.txt

input.txt

Next 'wildchar'
Figure 28-6: wildmode= full.
The following command causes the pressing of 'wildchar' to match the
longest common substring and then stop:
:set wildmode=longest
If you use the following command, you accomplish the same thing; but the
display is just the list of files on the 'wildmenu' line:
:set wildmode=longest:full

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 549

Draft Not for publication


13192
13193
13194

Draft 0.1

Not for widespread publication

The following command displays a list of possible matches when the


'wildchar' is pressed (see Figure 28-7).
:set wildmode=list

13195
13196
13197
13198
13199
13200
13201
13202
13203
13204
13205
13206
13207
13208
13209
13210
13211
13212
13213
13214
13215
13216
13217
13218
13219
13220
13221
13222
13223
13224
13225
13226
13227

~
~
~
~
~
~
~
:r g
getchar.c
gui_at_sb.h
gui.c
gui_beval.h
gui_at_fs.c
gui_gtk_f.h
gui_at_sb.c
gui_x11_pm.h
gui_athena.c
gui_xmebw.h
:r g

gui_beval.c
gui_xmebwp.h
gui_gtk.c

gui_x11.c

gui_gtk_f.c

gui_xmebw.c

gui_gtk_x11.c

globals.h

gui_motif.c

gui.h

gui_xmdlg.c

Figure 28-7 wildmode=list.


This mode does not complete the match. If you want that to happen as
well, use this option:
:set wildmode=list:full
Finally, to complete the longest common substring and list the files, use
the following option :
:set wildmode=list:longest
You can use these options in a set. The first option is used the first time
the 'wildchar' is pressed, the second option is used the second time you press
'wildchar', and so on, for up to four presses. Therefore, if you want to
complete the longest substring (longest) and then go through the list (full), use
the following option:
:set wildmode=longest,full

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 550

Draft Not for publication

Draft 0.1

Not for widespread publication

13228

Customizing Behavior of the Screen Movement Commands

13229
13230
13231
13232

When the 'startofline' ('sol') option is set, the screen movement


commands as well as several cursor movement commands such as H, M, L, G, and
<C-End> move the cursor to the start of a line. If it is not set, the cursor remains
in the same column (or as close as possible).

13233

File Writing Options

13234
13235

If set, the 'write' option lets Vim write files. If this option is not set, you
can view the file only. This is useful if you want to use Vim as a secure viewer.

13236
13237
13238
13239

Generally, when you try to write a file that you should not, Vim makes you
use the override option (!). If you want to live dangerously, you can tell Vim to
always assume that this option is present for writing type commands by
executing setting the 'writeany' ('wa'):

13240

:set writeany

13241

Memory Options

13242
13243

To set the maximum memory for one buffer, use the 'maxmem' ('mm')
option.

13244

:set maxmem=size

13245

size is the memory limit in kilobytes.

13246
13247
13248

To define total amount of memory for all buffers, use the maxmemtot'
('mx') option.
:set maxmemtot=size

13249
13250

To control the amount of memory used for pattern matching (in search) use
the 'maxmempattern'
('mmp') option.

13251

Function Execution Options

13252
13253
13254

The 'maxfuncdepth'('mdf') option defines the maximum number of nested


functions. Similarly, the 'maxmapdepth' ('mmd') parameter defines the
maximum number of nested mappings.

13255

Terminal Options

13256

The following sections describe the terminal options.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 551

Draft Not for publication

Draft 0.1

Not for widespread publication

13257

Terminal Name

13258
13259
13260
13261

The name of your terminal is stored in the 'term' option. ('ttytype' and
'tty' are aliases for this option.) Generally, you do not need to set this option
because it is set by your shell or operating environment. However, you might
need to read it to enable terminal-specific macros.

13262

Lazy Redraw

13263
13264
13265

The 'lazyredraw' ('lz') option is useful for a slow terminal. It also


prevents Vim from redrawing the screen in the middle of a macro. The default is
as follows:

13266

:set nolazyredraw

13267

If you do set this option, you do not see macros being executed.

13268

Internal Termcap

13269
13270
13271

The UNIX system has a database of terminal control codes called termcap.
The Vim editor has its own built-in database as well. If the 'ttybuiltin' ('tbi')
option is enabled, this internal database is searched first.

13272

Fast Terminals

13273
13274
13275

If the 'ttyfast' ('tf') option is set, Vim assumes you have a fast terminal
connection and changes the output to produce a smoother update, but one with
more characters. If you have a slow connection, you should reset this option.

13276

Mouse Usage Inside a Terminal

13277
13278
13279
13280

The 'ttymouse' ('ttym') option controls the terminal mouse codes. This
option is of interest to those trying to do fancy things with terminal control
codes. For example, if you want to use the mouse buttons <LeftMouse> and
<RightMouse> in console editing, you should enable this option.

13281

How Much to Scroll

13282
13283
13284

The 'ttyscroll' ('tls') option controls how many lines to scroll the
screen when an update is required. You can adjust this to a small number if you
are on a slow terminal.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 552

Draft Not for publication

Draft 0.1

Not for widespread publication

13285
13286
13287
13288

Finally we have the 'weirdinvert' ('wiv') option. This is a historical


holdover from the 4.x version of Vim. If you happen to have an ancient terminal
that requires this option, don't set the option. Donate the terminal to a museum
and get a modern Linux system to replace it.

13289

Some More Obscure Options

13290
13291
13292

This section discusses some of the more obscure options in Vim. These
were kept around for compatibility with Vi and to support equipment that was
long ago rendered obsolete.

13293

Compatibility

13294
13295

The 'compatible' ('cp') option makes Vim act as much like Vi as


possible:

13296

:set compatible

13297
13298
13299

If you enable this option, many of the examples in this book will not work
properly. This option is generally set unless there is a $HOME/.vimrc file
present.

13300
13301

Similarly, the 'coptions' ('cpo') option enables you to fine-tune Vi


compatibility:

13302
13303
13304
13305
13306
13307
13308

:set cpoptions=characters
This 'edcompatible' ('ed') command makes the g and c options on the
:substitute command to act like they do for the UNIX editor Ed:
:set edcompatible
The following option sets lisp mode. This sets a number of options to make
Lisp programming easier:
:set lisp

13309
13310

The 'lispwords' ('lw') option contains a set of words that help Vim
properly indent Lisp.

13311
13312
13313
13314

The 'tildeop' ('top') option makes ~ behave like an operator. This is for
Vi compatibility. If this option is turned off, the ~ command will switch the case
of a single character. With the following, the ~ command takes the form of
~motion:

13315

:set tildeop

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 553

Draft Not for publication


13316
13317
13318
13319
13320

Draft 0.1

Not for widespread publication

Note: The g~ command always behaves as an operator regardless of this


option.
The 'helpfile' ('hf') option defines the location of the main help file.
This option proves useful if you want to redirect where the :help command gets
its information.

13321

For example:

13322

:set helpfile=/usr/sdo/vim/my_help.txt

13323

Weirdinvert

13324
13325

The 'weirdinvert' ('wiv') option has been provided for backward


compatibility with version 4.0 of Vim:

13326
13327
13328
13329
13330
13331

:set weirdinvert
It has been made obsolete by the t_xs string. (See the Vim terminal help
documentation for more information.) Some terminals, such as hpterm, need to
have t_xs set to work. If you have one of these, you might want to look at the
help text:
:help hpterm

13332

Debugging

13333
13334

The 'writedelay' ('wd') option causes a delay of time (in milliseconds)


between each character output:

13335
13336
13337
13338

:set writedelay={time}
The 'verbose' ('vbs') option controls how much Vim chatters while
performing its job (the higher the number, the more output). The current
numbers are as follows:
>=
>=
>=
>=
>=
>=
>=
>=
>=

13339
13340

1
2
5
8
9
12
13
14
15

When the viminfo file is read or written.


When a file read because of a :source command.
Every searched tags file and include file.
Files for which a group of autocommands is executed.
Every executed autocommand.
Every executed function.
When an exception is thrown, caught, finished, or discarded.
Anything pending in a :finally clause.
Every executed ex command (truncated at 200 characters).

The :verbose (:verb) command does the same thing except it only affects
a single command. The general form of this command is:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 554

Draft Not for publication


13341

Draft 0.1

Not for widespread publication

:[count] verbose {command}

13342
13343

Where [count] is the verbose number from above. This command is useful
for debugging scripts to understand what's happening in them.

13344
13345
13346
13347

One of the problems with turning on verbose output is that things scroll off
the screen quickly. One way to solve this problem is to set the 'verbosefile'
('vfile') option and save the output to a file. Then when you're done, you can
browse through the file using Vim to look for anything you might have missed.

13348
13349
13350
13351

By default many functions that are called automatically such as those for
'foldexpr', 'formatexpr', and 'indentexpr' do out output error message. If
you set the option 'debug' to msg, error messages which normally are
suppressed.

13352
13353
13354

They still won't throw an exception however. For than you need to set
'debug' to throw. Finally, if you want an audible notification of the error, add a
beep.

13355
13356

You can use the three keywords, msg, throw, and beep in any combination
you want such as:

13357

:set debug=msg,beep

13358

Production

13359
13360
13361

The opposite of :verbose is :silent (:sil). It causes normal information


messages produced during the execution of a command to disappear. If used
with the override (!) option, error messages disappear as well.

13362

Keyboard Mapping

13363
13364
13365

The :loadkeymap (:loadk) load a keyboard mapping file into the system.
These mapping files are highly keyboard and language dependent and beyond
the scope of this book.

13366
13367
13368

If you really must create a keyboard map file, you can examine the current
set of mapping files which come with Vim as well as browse the on-line help
documentation for more information.

13369

Encoding

13370
13371

The 'encoding' ('enc') option controls the character set encoding used by
Vim. Unfortunately languages other English are beyond the scope of this book.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 555

Draft Not for publication

Draft 0.1

Not for widespread publication

13372

Macintosh Silliness

13373
13374
13375

The 'macatsui' is designed to work around a Macintosh drawing bug.


Basically if something is going wrong with Vim on a Mac, try setting this. (As
soon as they figure out what the bug is, this option goes away.)

13376

Obsolete Options

13377
13378

The 'textauto' ('tx') and 'textmode' ('tx') options are obsolete. Use
the options 'fileformats' and 'fileformat' instead.

13379

Legacy Options

13380
13381
13382
13383
13384

Vim tries to be as compatible with the old Vi editor as possible. Vi has a


number of options that mean something to Vi, but are not relevant to Vim. In
order to be fully compatible with Vi, the Vim editor won't generate an error
message if you set any of these options. But the options themselves have no
effect on the editor.

13385

The options are:


autoprint
mesg
redraw
w1200

beautify
novice
slowopen
w9600

flash
open
sourceany

vim-all-good.odt (28. Sep. 2007) The Vim Book

graphic
optimize
window

hardtabs
prompt
w300

Page 556

Draft Not for publication

Draft 0.1

Not for widespread publication

13386

Chapter 29: Language-Dependent Syntax Options

13387
13388

Syntax coloring is controlled by language-dependent syntax files that


reside $VIMRUNTIME/syntax/language.vim.

13389
13390

You can make your own copy of these syntax files and modify and update
them if their syntax coloring is not what you desire.

13391
13392
13393
13394

You can also set a number of language-specific options. (This chapter


covers the language-dependent syntax option for each language Vim knows
about.) These options must be turned on before you edit the file. You can fake
this by setting the option and then turning the syntax coloring off and back on.

13395

Abel

13396
13397

There are only a couple of variable that control the Able syntax
highlighting:
abel_obsolete_ok
Obsolete keywords are statements, not errors
abel_cpp_comments_illegal Do not interpret // as inline comment leader

13398

Ada

13399
13400
13401

Ada is a programming language designed by the United States Defense


Department for embedded programming. There are several options which you
can use to fine tune Ada editing. These are:

13402
g:ada_standard_types

If this variable is set, highlight standard Ada


types

g:ada_space_errors

Highlight spacing errors. These are not


really errors, but they shouldn't be in a high
quality program.

g:ada_no_trail_space_error

Do not highlight trailing spaces at the end of


a line even if g:add_space_errors is set

g:ada_no_tab_space_error

Do not highlight tabs after spaces.

g:ada_all_tab_usage

Highlight all tab use

g:ada_line_errors

Highlight lines which are too long. (And


chew up a lot of CPU figuring out which
lines to highlight.)

g:ada_rainbow_color

Use rainbow colors for parenthesis

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 557

Draft Not for publication

Draft 0.1

Not for widespread publication

g:ada_folding

This string variable controls how Ada folding


is done. For information on this option see
:help ft-ada-syntax

g:ada_abbrev

Create some abbreviations to help you in


writing your Ada programs.

g:ada_withuse_ordinary

Treat with and use as ordinary keywords.

g:ada_begin_preproc

Show all begin line keywords using special


coloring.

g:ada_omni_with_keywords

Add keywords to omni-completion (CTRL-I


CTRL-U)

g:ada_extended_tagging

If set to jump then tags will be jumped to


using :tjump. If set to list tags will be
added to the error list.

g:ada_extended_completion

Use extended completion for CTRL-N and


CTRL-R completions in insert mode.

g:ada_gnat_extensions

Support GNAT extensions

g:ada_with_gnat_project_files Support GNAT project file keywords and


attributes.
g:ada_default_compiler

This string tells Vim if the compiler is gnat


or decada.

13403

Ant

13404
13405
13406
13407

Ant is a tool for building Java program and just about everything else. One
of the problems with Ant is that you can embed scripts written in other
languages inside a Ant file. So not only do you have Ant, but you also have
JavaScript, Perl, Python, and just about anything else.

13408
13409
13410

By default the Ant syntax file correctly highlights JavaScript and Python. If
you want to add another language, for example, Perl, you have to call the
AntSyntaxScript function:

13411

:call AntSyntaxScript('perl', 'perl.vim')

13412
13413

This must be done for each language you to embed in Ant except of course
JavaScript and Python.

13414

Apache

13415
13416

The variable apache_version should be set to the version of Apache you


are using. The default is 1.3.x.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 558

Draft Not for publication

Draft 0.1

Not for widespread publication

13417

Assembly Language

13418
13419
13420

There are a number of different assembly languages out there. By default,


Vim assumes that you are using a GNU-style assembly language. The other
assemblers supported are:
asm68k Motorola 680x0 assembly
asm
GNU assembly (the default)
asmh8300 Hitachi H-8300 version of GNU assembly
fasm
Flat assembly (http://flatassembler.net)
ia64
Intel Itanium 64
masm
Microsoft assembly (probably works for any 80x86)
nasm
Netwide assembly
pic
PIC assembly (currently for PIC16F84)
tasm
Turbo Assembly (with opcodes 80x86 up to Pentium, and MMX)

13421
13422

To let Vim know you are using another assembly language, execute the
following command:

13423

:let asmsyntax=language

13424

The language parameter is one of the languages listed above.

13425
13426
13427

This commands sets the global version of the variable. To set the buffer
specific one (and change the syntax highlighting for a single buffer) use the
command:

13428

:let b:asmsyntax=language

13429

You can also put a line like:

13430

:asmsyntax=nasm

13431
13432

in the first five lines of your code. (Use whatever comment marker is
allowed by your assembler.)

13433
13434

The following variables control the optional parts of the assembly


highlighting:
Do not highlight unofficial parser allowed syntax as an
error.
nasm_ctx_outside_macro Do not flag contexts outside a macro as errors.
nasm_no_warn
Do not flag potential risky syntax as TODOs.
nasm_loose_syntax

13435

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 559

Draft Not for publication

Draft 0.1

Not for widespread publication

13436

ASP

13437
13438
13439
13440

Files that end with .asp and .asa can contain Perl or Visual Basic code. It's
hard for Vim to automatically tell the difference between these two types of file.
So you need to help things along by setting the variables: g:filetype_asa and
g:filetype_asp to aspperl or aspvbs to let Vim know what to do.

13441

BaaN

13442

The following variables control the way Vim handles BaaN files:
bann_code_stds Highlight code that violates coding standards
bann_fold
Enable folding at the function level
baan_fold_block Enable folding at the block level
baan_fold_sql Enable folding at the SQL statement level

13443

Basic

13444
13445
13446
13447

Both Visual Basic and Standard Basic both use files that end in .BAS. To
tell the difference between the two, the Vim editor reads the first five lines of the
file and checks for the string VB_Name. (Files with the extension .FRM are always
Visual Basic.)

13448

C and C++

13449
13450

You can perform a number of customizations for the C and C++ syntax
colors, including the following:
c_comment_strings

Highlight strings and numbers inside


comments.
/* Example a: "Highlighted String" */

c_ansi_constants

Highlight ANSI types. (If c_no_ansi set.)


/*:unlet c_ansi */
/*:unlet c_ansi_constants*/
size_t foo;
int i = INT_MIN;
/* :set c_no_ansi_constants = 1 */
size_t foo;
int i = INT_MIN;

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 560

Draft Not for publication


c_ansi_typedefs

Draft 0.1

Not for widespread publication

Highlight ANSI typedefs. (If c_no_ansi


set.)
/*:unlet c_ansi */
/*:unlet c_ansi_typedefs */
size_t foo;
int i = INT_MIN;
/* :let c_ansi_typedefs = 1n */
size_t foo;
int i = INT_MIN;

c_gnu
c_no_bracket_error
c_no_curly_error
c_no_ansi

Highlight gcc specific items.


Do not flag {} inside [] as an error.
Don't flag {} inside () or [] as an error.
Do not highlight ANSI types and constants.
size_t foo; /* :unlet c_no_ansi */
int i =INT_MIN;/* :unlet c_no_ansi */
size_t foo; /* :let c_no_ansi = 1 */
int i =INT_MIN;/*:let c_no_ansi= 1 */

c_no_c99
c_no_comment_fold

c_no_cformat

Do not highlight C99 items.


Normally you can fold comments when the
'foldmethod' is set to syntax. This
disables that feature.
Do not highlight %-formats in strings.
/* :let c_no_cformat = 1 */
printf("Data %3f\n", f);
/* :unlet c_no_cformat */
printf("Data %3f\n", f);

c_no_if0_fold
c_no_tab_space_error

Don't fold #if 0 / #endif if the


'foldmethod' option is set to syntax.
Do not flag spaces before a <Tab> when
c_space_error is set. In the following we
use "." for blank and ---> for tab.
int..---->foo;......

c_no_if0

Do not highlight #if 0 / #endif blocks as


comments.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 561

Draft Not for publication


c_no_trail_space_error

Draft 0.1

Not for widespread publication

Do not flag trailing whitespace when


c_space_error is set . In the following we
use "." for blank and ---> for tab.
int..---->foo;......
Highlight \u or \U in strings.

c_no_utf

/* :let c_no_utf = 1*/


char *f = "\uFF + \Uffff";
/* :unlet c_no_utf */
char *f = "\uFF + \Uffff";
c_space_errors

Flag trailing whitespace and spaces in


front of a <Tab>.
int..---->foo;......

c_syntax_for_h
13451
13452
13453
13454
13455

Use C (instead of C++) syntax


highlighting for include files.

Sometimes you will notice some highlighting errors in comments or #if


0 / #endif blocks. You can fix these by redrawing the screen using the CTRL-L
command. To fix them permanently, you need to increase the number of lines
searched for syntax matches by using the following command:
:let c_minlines = number

13456
13457

The parameter number is the minimum number of lines to search. Setting


this to a large number helps to eliminate syntax coloration errors.

13458

Doxygen

13459
13460
13461

Doxygen is an embedded documentation system for C and C++ programs.


To enable Doxygen syntax highlighting you need to set the 'syntax' option to
c.doxygen. This can be done through a :set command:

13462

:set syntax=c.doxygen

13463

or by putting a modline in your program:

13464

// vim:syntax=c.doxygen

13465
13466

Another way of doing this for every C, C++ and Idl file is to set the
variable: g:load_doxygen_syntax.

13467

The following variables control the Doxygen syntax coloring:


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 562

Draft Not for publication

Draft 0.1

Not for widespread publication

Use non-standard highlighting for Doxygen


comments.
g:doxygen_enhanced_colour Same thing for people who spell color funny.
doxygen_my_rendering
Disable rendering of HTML bold, italic and
html_my_rendering underline.
doxygen_javadoc_autobrief Set to 0 to disable javadoc autobrief colour
highlighting.
doxygen_end_punctuation
Set to regexp match for the ending punctuation of
brief
g:doxygen_enhanced_color

13468

CH

13469
13470

CH is a C/C++ like interpreter. To tune the C syntax highlighting for it,


set the variable: ch_syntax_for_h.

13471

Chill

13472
13473

Chill is another language with a like syntax. The options for this program
are listed in the following table:
chill_space_errors
Flag trailing whitespace and spaces in front of a <Tab>.
chill_comment_string Highlight strings and numbers inside comments.
chill_minlines
Defines the number of lines searched for syntax
highlighting.

13474

Changelog

13475
13476

By default the Changelog syntax highlights spaces at the beginning of a


line. To turn this off set the variable g:changelog_spacing_errors to 0.

13477

COBOL

13478
13479

There are two versions of COBOL highlighting: fresh development and


legacy. To enable legacy highlighting, use the following command:

13480

:let cobol_legacy_code = 1

13481

Cold Fusion

13482
13483

If you use Cold Fusion style comments, you'll want to set the variable:
html_wrong_comments.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 563

Draft Not for publication

Draft 0.1

Not for widespread publication

13484

CSH / TCSH

13485
13486

Vim can't tell the different between csh and tcsh files. So to help it you can
set the variable filetype_csh to csh or tcsh (including the quotes).

13487

CYNLIB

13488
13489
13490

Cynlib files end with .cc and .cpp which make them very difficult to tell
from C and C++ files. To tell Vim to prefer Cynlib syntax, set the variables:
cynlib_cyntax_for_cc and cynlib_cyntax_for_cpp.

13491

CWEB

13492
13493

Files that end in .w can be Progress or Cweb files. To help Vim know that
they are Cweb files, set the variable: filetype_w.

13494

Desktop

13495
13496
13497

There is a standard highlighting syntax for .desktop and .directory files. To


for Vim to adhere to the standard, set the variable:
enforce_freedesktop_standard.

13498

Dircolors

13499
13500

To highlight directory colors according to the Slackware standard set the


variable: dircolors_is_slackware.

13501

DocBook

13502
13503
13504
13505

DocBook files come in two flavors XML and SGML. Normally Vim will
guess at the type, but if the variable docbk_type is set to sgml or xml
before the syntax file is loaded, that flavor will always be set. (The quotes are
part of the value.)

13506
13507

If Vim guesses wrong you can always manually set the file type using one
of the following commands:

13508
13509

:set filetype=docbksgml
:set filetype=docbkxml

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 564

Draft Not for publication

Draft 0.1

Not for widespread publication

13510

DosBatch

13511
13512
13513
13514

If you are edit MS-DOS batch files you have my deepest sympathy. You
also have a couple of options you can use. The dosbatch_cmdextversion should
be set to 1 if you are using the Windows-NT command processor and 2 if you are
using Windows 2000. The default is Windows 2000.

13515
13516

Also if you are using .btm files, you need to set the variable
g:dosbatch_syntax_for_btm to let Vim know these are MS-DOS batch files.

13517

Doxygen

13518

See C/C++ above.

13519

DTD

13520
13521

DTD is usually case sensitive. To make it not case sensitive, use this
command:

13522
13523
13524
13525
13526
13527
13528

:let dtd_ignore_case = 1
The syntax highlighting flags unknown tags as errors. To turn off this
feature, use the following command:
:let dtd_no_tag_errors = 1
The parameter entity names are highlighted using the Type highlight group
with the Comment group. You can turn this off by using the following command:
:let dtd_no_parameter_entities=1

13529

Eiffel

13530
13531
13532
13533

Eiffel is not case sensitive, but the standard style guidelines require the
use of upper/lowercase. The syntax highlighting rules are designed to encourage
you to follow the standard guidelines. To disable case checking, use the
following command:

13534
13535
13536
13537
13538
13539

:let eiffel_ignore_case = 1
You can cause the syntax coloring to check for the proper capitalization for
Current,Void, Result, Precursor, and NONE, by using this command:
:let eiffel_strict = 1
If you want to really check the syntax against the style guide, use the
following command:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 565

Draft Not for publication


13540
13541
13542

Draft 0.1

Not for widespread publication

:let eiffel_pedantic = 1
You can use the lowercase versions of current, void, result, precursor,
and none by setting eiffel_lower_case_predef, as follows:

13543

:let eiffel_lower_case_predef = 1

13544

To handle ISE's proposed new syntax, use the following command:

13545

:let eiffel_ise = 1

13546

For support of hexadecimal constants, use this:

13547

:let eiffel_hex_constsnts = 1

13548

ERLANG

13549
13550

ERLANG stands for ERicsson LANGuage. The syntax coloring has two
options:
erlang_keywords
erlang_characters
erlang_functions

Disable the highlighting of keywords.


Disable the highlighting of special characters.
Disable built-in function highlighting

13551

FlexWiki

13552
13553
13554
13555

The syntax file not only defines the syntax coloring for FlexWiki, but also
sets a number of options to make editing easier. The only language dependent
control is the variable flexwiki_maps which if set, allows you to move and down
display lines with j and k.

13556

Form

13557
13558
13559

If you enable enhanced color mode, Vim makes it easier to differentiate


between header and body statements in a program. To enable this feature set
the variable form_enhanced_color.

13560

Fortran

13561

The following variables control how Fortran is highlighted:


fortran_dialect

Define the dialect (f95, f90, f77, elf, F) of


Fortran to be used.

fortran_free_source

For using the free format flavor of Fortran

fortran_fixed_source

Use the fixed format flavor of Fortran

fortran_have_tabs

Do not mark tabs as errors

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 566

Draft Not for publication

Draft 0.1

Not for widespread publication

fortran_fold

Allow syntax directed folding

fortran_fold_conditionals

Allow folding of conditional regions

fortran_fold_multilinecomments Allow folding of multi-line comments


fortran_more_precise

If defined the syntax coloring will be more


precise, but slower

13562

FVWM

13563
13564
13565

FVWM is a window manager. If you are editing configuration files for this
program, you need to tell Vim the location of the color file using the following
command:

13566

:let rgb_file="/usr/X11/lib/X11/rgb.txt"

13567
13568

This example shows the location of the rgb.txt file that comes with Linux.
Other systems may put it in /usr/lib or other locations.

13569

Haskell

13570
13571

Haskell is a literate programming language. The options that control the


syntax highlighting for this language are:
hs_allow_hash_operator
hs_highlight_boolean
hs_highlight_debug
hs_highlight_delimiters
hs_highlight_more_types
hs_highlight_types
lhs_markup

13572
13573

Highlight # operators
Highlight true and false as keywords
Highlight the names of debugging functions
Highlight delimiters.
Treat uncommon types as keywords
Treat primitive types as keywords
Define the type of markup. This can be none for no
markup or tex for TeX markup.

HTML
The HTML syntax file uses the following highlight tags:
htmlTitle
htmlH3
htmlH6html
htmlBoldUnderlineItalic
htmlItalic

htmlH1
htmlH4
Boldhtml
htmlUnderline
htmlLink

htmlH2
htmlH5
BoldUnderline
htmlUnderlineItalic

13574

If you want to turn off some of syntax coloring, use the following command:

13575

:let html_no_rendering = 1

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 567

Draft Not for publication


13576
13577

:let html_my_rendering = 1
Some files contain <!-- and --!> or <! and !> for comments. If you want
these comments highlighted, use the following command:

13581
13582

Not for widespread publication

If you want to define your own colors for these items, put the color-setting
commands in your .vimrc and use the following command:

13578
13579
13580

Draft 0.1

:let html_wrong_comments = 1

Inform

13583

Inform language options:


Do highlighting for Glulx/Glk programs (as opposed
to Z machine programs)
inform_highlight_old
Highlight for the older (before version 6.30)
language
inform_highlight_simple Do not highlight library symbols
inform_suppress_obsolete Do not highlight obsolete keywords as errors.
inform_highlight_glulx

13584

IDL (Interface Definition Language)

13585
13586

The syntax for this language can be customized through the following
variables:
Disable some of the Microsoft specific extensions
Disable complex extensions
Show IDL errors (can be rather intrusive, but quite
helpful)
idlsyntax_showerror_soft Use softer colors by default for errors
idl_no_ms_extensions
idl_no_extensions
idlsyntax_showerror

13587

Java

13588

The Java syntax has the following options:

13589
13590
13591
13592

java_mark_braces_in_parens_as_errors

13593
13594
13595

java_highlight_java_lang_ids

If set, braces inside parentheses are flagged as errors (Java 1.0.2).


This is legal in Java 1.1.

Highlight all the identifiers in java.lang.*.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 568

Draft Not for publication

Draft 0.1

13596
13597
13598

java_highlight_functions = "indent"

13599
13600
13601

java_highlight_function = "style"

13602
13603
13604
13605

java_highlight_debug

13606
13607
13608
13609
13610

java_allow_cpp_keywords

13611
13612
13613

java_ignore_javadoc

13614
13615
13616

java_javascript

13617
13618
13619

java_css

13620
13621
13622

java_vb

13623
13624
13625

java_minlines

Not for widespread publication

Set if function declarations are always indented.

Function declarations are not highlighted.

Highlight debug statements (System.out.println and


System.err.println).

If set do not mark all C and C++ keywords as an error. Marking


C/C++ keywords helps prevent you from using them, so your code is
more portable to C or C++.

Turn off highlighting for Javadoc.

Turn on highlighting for JavaScript inside Javadoc.

Turn on highlighting for CSS style sheets inside of Javadoc

Turn on highlighting for VB scripts.

Number of lines to scan for figuring what syntax to highlight.

13626

Lace

13627
13628
13629

The specification of the language states that it is not case sensitive. Good
style is case sensitive. If you want to turn off the "good style" case-sensitive
feature, use the following command:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 569

Draft Not for publication


13630

Draft 0.1

Not for widespread publication

:let lace_case_insensitive=1

13631

Lex

13632
13633
13634
13635

Lex files are divided up into major sections separated by lines consisting of
%%. If you write long Lex files, the syntax highlighting may not be able to find the
%%.To fix this problem you might need to increase the minlines syntax option
by using a command such as this:

13636

:syntax sync minlines = 300

13637

Lisp

13638
13639
13640

The option g:lisp_instring highlights data inside strings as if it were


lisp. To turn on rainbow parent his (very useful in Lisp) set the variable
g:lisp_rainbow.

13641

Lite

13642
13643

Lite uses a SQL-like query language. You can enable highlighting of SQL
inside strings with the following command:

13644
13645
13646

:let lite_sql_query = 1
If you have large commands, you might want to increase the number of
lines used for synchronizing the syntax coloring:

13647

:let lite_minlines = 500

13648

LPC

13649
13650

LPC files end with .c which Vim considers C files. To make them LPC files
you need to set the variable: lpc_syntax_for_c. You can also use a mode line:

13651

// vim:set ft=lpc:

13652

The following variables can be used to customize LPC.


lpc_pre_v22
Color code for LPC v22 and earlier.
lpc_compat_32
Handle the LpMud 3.2 version of LPC.
lpc_use_lpc4_syntax Color for version 4.0 and later.

13653

LUA

13654
13655

LUA is another language who's syntax has changed from version to


version. To customize the highlighting for a particular version use the variables:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 570

Draft Not for publication


:let lua_version = 4

Draft 0.1

Not for widespread publication

Version 4

:let lua_version = 5
Version
:let lua_subversion = 0 5.0
:let lua_version = 5
Version
:let lua_subversion = 1 5.1
13656

Mail

13657
13658

The variable mail_minlines controls the number of lines used for


synchronization.

13659

Make

13660
13661

In Makefiles commands are highlighted to make the stand out. If this


results in confusion you can turn it off by setting: make_no_commands.

13662

Maple

13663
13664
13665

Maple V, by Waterloo Maple Inc., is a symbolic algebra language. It has


many different packages that the user can selectively load. If you want to
highlight the syntax for all packages, use the following command:

13666
13667
13668

:let mvpkg_all = 1
If you want to enable specific packages, use one or more of the following
options:
mv_DEtools
mv_Galois
mv_GaussInt
mv_LREtools
mv_combinat
mv_combstruct
mv_difforms
mv_finance

mv_genfunc
mv_geometry
mv_grobner
mv_group
mv_inttrans
mv_liesymm
mv_linalg
mv_logic

mv_networks
mv_numapprox
mv_numtheory
mv_orthopoly
mv_padic
mv_plots
mv_plottools
mv_powseries

mv_process
mv_simplex
mv_stats
mv_student
mv_sumtools
mv_tensor
mv_totorder

13669

Mathematica

13670
13671

New files ending in .m are assumed to be Mathlib files. To tell Vim that
they should be Mathematica files, execute the command:

13672

:let filetype_m = "mma"

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 571

Draft Not for publication


13673

Draft 0.1

Not for widespread publication

Moo

13674

The variables which control Moo highlighting are:


moo_extended_cstyle_comments Allow C style comments
moo_no_pronoun_sub
Turn off highlighting of pronoun substitution
patterns
moo_no_regexp
Disable highlighting of regular expression
operator %!, %( and %) inside strings
moo_unmatched_quotes
Unmatched double quotes are errors
moo_builtin_properties
Highlight built-in property keywords
moo_unknown_builtin_functions Highlight unknown built-in functions as errors

13675

MSQL

13676
13677
13678
13679

To highlight SQL statements inside strings (stored procedures for example)


set the variable: msql_sql_query. The only other option is msql_minlines
which controls the number of lines to look through when doing syntax
synchronization.

13680

NCF

13681
13682

To highlight unknown statements as error set the variable:


ncf_highlight_unknowns.

13683

Nroff

13684
13685

are:

The variables that control the syntax highlighting for nroff type documents
b:nroff_is_groff
Nroff files use groff syntax
nroff_space_errors
Highlight spacing errors
b:preprocs_as_sections Treat pre-processor entires as section markers

13686
13687

OCAML
Ocaml can be customized by two variables:
ocaml_revised
Support revised syntax with camlp4 preprocessor directives.
ocaml_noend_error Do not highlight end statements as an error. (Useful if you
define very long structures and Vim fails to synchronize
properly.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 572

Draft Not for publication

Draft 0.1

Not for widespread publication

13688

Papp

13689
13690

Normally HMLT inside Papp files is treated as a string. If you want to have
it treated as HTML, set the variable: papp_include_html.

13691

Pascal

13692
13693

By default files that end in .p can be Progress or Pascal. To force Vim to


consider all .p file as Pascal, put the following in your .vimrc.

13694
13695
13696

:let filetype_p = "pascal"


The syntax highlighting for Pascal is configured through the following
variables:

13697
Highlight for the Delphi version of Pascal
Use the fpc variant of Pascal for highlighting
Configure the syntax highlighting for the gpc version
of Pascal
pascal_no_functions
Do not highlight function differently
pascal_no_tabs
Highlight tabs as errors
pascal_one_line_string Highlight multi-line strings as errors
pascal_symbol_operator Highlight operators
pascal_traditional
Turn off highlighting of Turbo Pascal 7.0 features
(stick to the traditional version)
pascal_delphi
pascal_fpc
pascal_gpc

13698

Perl

13699
13700

If you include POD documentation in your files, you can enable POD syntax
highlighting using the following command:

13701

:let perl_include_pod = 1

13702
13703

If you do not include POD documents, you should. Perl is bad enough
when it is documented.

13704
13705

The following option changes how Perl displays package names in


references (such as $PkgName::VarName):

13706
13707
13708
13709

:let perl_want_scope_in_variables = 1
If you do not what to use use complex variable declarations such as @{$
{"var"}}, and have the highlighted you need the following:
:let perl_no_extended_vars = 1

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 573

Draft Not for publication


13710
13711
13712
13713
13714
13715
13716
13717

Draft 0.1

Not for widespread publication

The following option tells the syntax coloring to treat strings as a


statement:
:let perl_string_as_statement = 1
If you have trouble with synchronization, you might want to change some
of the following options:
:let perl_no_sync_on_sub = 1
:let perl_no_sync_on_global = 1
:let perl_sync_dist = {lines}

13718
13719
13720
13721

To use folding with Perl, set the variable perl_fold. Folding is configured
by the variables: perl_fold_blocks which allows folding inside blocks,
perl_nofold_packages which turns off package folding and perl_nofold_subs
which turns off subroutine folding.

13722

Php3/ Php4

13723

The following options control the highlighting for Php:


php_asp_tags
ASP-style short tags get highlighted
php_baselib
Add highlighting for Baselib method
php_folding
Allows folding
php_htmlInStrings
Highlight HTML syntax inside strings
php_noShortTags
Do not highlight short tags
php_oldStyle
Use the older style of highlighting
php_parent_error_close Highlight closing brace errors
php_parent_error_open Highlight opening brace errors
php_sql_query
Highlight SQL queries inside strings
php_sync_method
Define how Vim synchronizes the highlighting. -1 uses
a search method to start synchronization, 0
synchronizes from the start, any positive number
defines a number of lines to go backward to begin
synchronization.

13724
13725

PlainTex

13726
13727
13728

The only option to PlainTex syntax highlighting is the variable


g:plaintex_delimiters which turns on highlighting for the delimiters [] and
{}.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 574

Draft Not for publication

Draft 0.1

Not for widespread publication

13729

PPWizard

13730
13731
13732

If you set the variable ppwiz_highlight_defs to 1 (the default) #define


statement retain the color of their contents. If you set this variable to 2, the
these statements are highlighted using a single color.

13733
13734

Setting ppwiz_with_html to 1 (the default) highlights HTML inside strings.


A setting of 0 treats all string contents as strings.

13735

Phtml

13736

To highlight SQL syntax in a string, use the following:

13737

:let phtml_sql_query = 1

13738

To change the synchronization window, use this command:

13739

:let phtml_minlines = lines

13740
13741

PostScript
The options for PostScript highlighting are:
postscr_level
postscr_display
postscr_ghostscript
postscr_fonts
postscr_encodings
postscr_andornot_binary

Set the PostScript language level


(default = 2).
Highlight display postscript features.
Hightlight GhostScript-specific syntax.
For font highlighting (off by default for
speed).
Encoding tables (off by default for
speed).
Color logical operators differently.

13742

Printcap and Termcap

13743
13744
13745
13746

If you are doing complex printcap or termcap work, I feel for you. These
files are cryptic enough as is and dealing with long and complex ones is
especially difficult. As far as Vim is concerned, you might want to increase the
number of lines used for synchronization:

13747

:let ptcap_minlines = 100

13748

Progress

13749
13750

Progress files can end in .w, .i, or .p. To make Vim detects you Progress
file as Progress files, you may wish to set some of the following variables:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 575

Draft Not for publication


13751
13752
13753
13754
13755

Draft 0.1

Not for widespread publication

:let filetype_w = "progress"


:let filetype_i = "progress"
:let filetype_p = "progress"

Python
The Python highlighting can be tuned by setting the following variables:
python_highlight_all
Turn on all possible Python highlighting
python_highlight_builtins
Highlight builtin functions
python_highlight_exceptions Highlight standard exceptions
python_highlight_numbers
Highlight numbers
python_highlight_space_errors Highlight trailing spaces

13756

Quake

13757
13758
13759
13760

Quake comes in multiple flavors. To tune Vim for your flavor you should
set one of the variables: quake_is_quake1, quake_is_quake2, or
quake_is_quake3. You can set all three, and highlight for Quake Version
1+2+3, but as there is no such game, this may not be useful.

13761

ReadLine

13762
13763

To highlight the bash extensions to ReadLine, set the variable:


readline_has_bash.

13764

Rexx

13765
13766

You can adjust the number of lines used for synchronization with the
following option :

13767
13768
13769

:let rexx_minlines = lines

Ruby
The variables which control the Ruby syntax are:
Allow folding based on the Ruby syntax
The minimum number of lines to use for syntax
synchronization
ruby_no_comment_fold
Do not allow the folding of multi-line comments
ruby_no_expensive
Do not highlight an end statement in a way that
matches it to the opening statement. (This is an
expensive operation, hence the variable name.)
ruby_no_special_methods Do not highlight significant methods of the kernel,
ruby_fold
ruby_minlines

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 576

Draft Not for publication

ruby_operators
ruby_space_errors

Draft 0.1

Not for widespread publication

module, and object.


Highlight Rudy operators
Highlight space errors

13770

Scheme

13771
13772

By default Vim uses the R5RS version of Schema. To tell it that you are
using MzScheme set the variable is_mzscheme.

13773

SDL

13774
13775

To enable SDL-2000 keyword highlighting set the variable sdl_2000. To


disable the older keywords set SDL_no_96.

13776

Sed

13777
13778

To make tabs stand out, you can use the :set list option. You can
highlight them differently by using the following command:

13779

:let highlight_sedtabs = 1

13780

Hint: If you execute a

13781

:set tabstop = 1

13782

as well, it makes it easy to count the number of tabs in a string.

13783

SGML

13784
13785
13786

If you set the sgml_my_rendering Vim assumes that you've already defined
highlighting for SGML and does not overwrite your definitions. (Not syntax, just
the colors for highlighting.)

13787
13788
13789

The variable sgml_no_rendering disable SGML rendering.

Shell
The following options change the highlighting for shell scripts:
is_bash
is_korn_shell
is_posix
is_sh
sh_fold_enable
sh_minlines

The Bash version of the syntax is expected.


Assume the Korn Shell flavor of the syntax.
Assume POSIX syntax.
The old Borne shell syntax is highlighted.
Enable syntax directed folding.
Set the number of lines for synchronization

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 577

Draft Not for publication

Not for widespread publication

Limit the number of lines for synchronization


(speeds things up).

sh_maxlines
13790

Draft 0.1

Speedup

13791

The options for Speedup are:


strict_subsections
highlight_types
oneline_comments = 1
oneline_comments = 2
oneline_comments = 3

Only highlight the keywords that belong in


each subsection.
Highlight stream types as a type.
Allow code after any number of # comments.
Show code starting with the second # as an
error (default).
If the line contains two or more # characters
in it, highlight the entire line as an error.

13792

TCsh

13793
13794

This is a super-set of csh, so all the csh rules apply. It also has the
following customizations:
tcsh_backslash_quote Do not highlight \" as an error
tcsh_minlines
Minimum number of lines for syntax synchronization

13795

TeX

13796
13797

TeX is a complex language that can fool the syntax highlighting. If the
editor fails to find the end of a texZone, put the following comment in your file:

13798

%stopzone

13799

The TeX options include:


tex_fold_enabled Enable syntax directed folding
tex_no_error
Disable flagging of errors
tex_stylish
Indicate that your TeX files use @ commands

13800

TinyFugue

13801

To adjust the synchronization limit for TinyFugue files, use this option:

13802

:let tf_minlines = lines

13803
13804

Vim
Even Vim has its own syntax files. These can customized as well.
vimembedscript

If set to 1, embed scripting languages are highlighted. If set

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 578

Draft Not for publication

Draft 0.1

Not for widespread publication

to 0, the syntax file for embedded scripting languages are


not loaded. If not defined, the files are loaded, just not used.
vim_maxlines
Maximum lines for syntax synchronization
vim_minlines
Minimum lines for syntax synchronization
vimsyntax_noerror Do not highlight errors
13805

XF86Config

13806
13807
13808

There are two different major version of the Xfree86 configuration files.
The variable xf86conf_xfree86_version should be set to 3 or 4 depending on
which version you have.

13809

Xml

13810
13811

Xml namespaces are highlighted by default. To turn off this feature, set
the variable: g:xml_namespace_transparent.

13812
13813

To turn on syntax directed folding for Xml, set the variable:


g:xml_syntax_folding.

13814
13815
13816

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 579

Draft Not for publication

Draft 0.1

Not for widespread publication

13817

Chapter 30: How to Write a Syntax File

13818
13819
13820

Suppose you want to define your own syntax file. You can start by taking a
look at the existing syntax files in the $VIMRUNTIME/syntax directory. After
that, you can either adapt one of the existing syntax files or write your own.

13821

Basic Syntax Commands

13822
13823

Let's start with the basic options. Before we start defining any new syntax,
we need to clear out any old definitions:

13824

:syntax clear

13825

(:sy is the short form of the :syntax command.)

13826
13827
13828
13829
13830

Some languages are not case sensitive, such as Pascal. Others, such as C,
are case sensitive. You need to tell which type you have with the following
commands:
:syntax case match
:syntax case ignore

13831
13832
13833

The match option means that Vim will match the case of syntax elements.
Therefore, int differs from Int and INT. If the ignore option is used, the
following are equivalent: Procedure, PROCEDURE, and procedure.

13834
13835
13836
13837
13838

The :syntax case commands can appear anywhere in a syntax file and
affect all the syntax definitions that follow. In most cases, you have only one
:syntax case command in your syntax file; if you work with an unusual
language that contains both case-sensitive and non-case-sensitive elements,
however, you can scatter the :syntax case command throughout the file.

13839
13840

The most basic syntax elements are keywords. To define a keyword, use
the following form:

13841
13842
13843
13844
13845
13846

:syntax keyword group keyword .......


The group name is the name of a highlight group, which is used by the
:highlight command for assigning colors. The keyword parameter is an actual
keyword. Here are a few examples:
:syntax keyword xType int long char
:syntax keyword xStatement if then else endif

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 580

Draft Not for publication

Draft 0.1

Not for widespread publication

13847
13848
13849
13850

This example uses the group names xType and xStatement. By convention,
each group name is prefixed by a short abbreviation for the language being
defined. This example defines syntax for the x language (eXample language
without an interesting name).

13851
13852

These statements cause the words int, long, and char to be highlighted
one way and the words if and endif to be highlighted another way.

13853
13854

Now you need to connect the x group names to standard Vim names. You
do this with the following commands:

13855
13856

:highlight link xType Type


:highlight link xStatement Statement

13857

(The :highlight command can be shortened to :hi.)

13858

This tells Vim to treat xType like Type and xStatement like Statement.

13859
13860

The x language allows for abbreviations. For example, n and next are both
valid keywords. You can define them by using this command:

13861

:syntax keyword xStatement n[ext]

13862

Defining Matches

13863
13864
13865

Consider defining something a bit more complex. You want to match


ordinary identifiers. To do this, you define a match syntax group. This one
matches any word consisting of only lowercase letters:

13866

:syntax match xIdentifier /[a-z]\+/

13867
13868

Now define a match for a comment. It is anything from # to the end of a


line:

13869

:syntax match xComment /#.*$/

13870
13871

Note: The match automatically ends at the end of a line by default, so the
actual command is as follows:

13872

:syntax match xComment /#.*/

13873

Defining Regions

13874
13875
13876
13877

In the example x language, you enclose strings in double quotation marks


("). You want to highlight strings differently, so you tell Vim by defining a
region. For that, you need a region start (double quote) and a region end (double
quote). The definition is as follows:

13878

:syntax region xString start=/"/ end=/"/


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 581

Draft Not for publication


13879
13880
13881
13882
13883
13884

Draft 0.1

Not for widespread publication

The start and end directives define the patterns used to define the start
and end of the region. But what about strings that look like this?
"A string with a double quote (\") in it"
This creates a problem: The double quotation marks in the middle of the
string will end the string. You need to tell Vim to skip over any escaped double
quotes in the string. You do this with the skip keyword:

13885

:syntax region xString start=/"/ skip=/\\"/ end=/"/

13886
13887

Note: The double backslash is needed because the string you are looking
for is \", so the backslash must be escaped (giving us \\").

13888
13889
13890
13891
13892
13893
13894
13895
13896
13897
13898
13899

Nested Regions
Take a look at this comment:
# Do it TODO: Make it real
You want to highlight TODO in big red letters even though it is in a
comment. To let Vim know about this, you define the following syntax groups:
:syntax keyword xTodo TODO contained
:syntax match xComment /#.*$/ contains=xTodo
In the first line, the contained parameter tells Vim that this keyword can
exist only inside another syntax element. The next line has a contains=xTodo
parameter. This indicates that the xTodo syntax element is inside it. The results
(xTodo=underline, xComment=italic) are as follows:
# Do it TODO: Make it real

13900

Consider the following two syntax elements:

13901
13902

:syntax region xComment start=/%.*/ end=/$/ contained


:syntax region xPreProc start=/#.*/ end=/$/ contains=xComment

13903
13904
13905
13906
13907

You define a comment as anything from % to the end of the line. A


preprocessor directive is anything from # to the end of the line. Because you can
have a comment on a preprocessor line, the preprocessor definition includes a
contains=xComment paramter. The result (xComment=italic,
xPreProc=underline) is as follows:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 582

Draft Not for publication


13908
13909

Draft 0.1

Not for widespread publication

#define X = Y % Comment
int foo = 1;

13910
13911
13912
13913
13914
13915

But there is a problem with this. The preprocessor directive should end at
the end of the line. That is why you put the end=/$/ directive on the line. So
what is going wrong? The problem is the contained comment. The comment
start starts with % and ends at the end of the line. After the comment is
processed, the processing of the preprocessor syntax contains. This is after the
end of the line has been seen, so the next line is processed as well.

13916
13917
13918

To avoid this problem and to force contained syntax from eating a needed
end of line, use the keepend parameter. This takes care of the double end-of-line
matching:

13919
13920
13921
13922
13923

:syntax region xComment start=/%.*/ end=/$/ contained


:syntax region xPreProc start=/#.*/ end=/$/
\ contains=xComment keepend
You can use the contains parameter to specify that everything can be
contained. For example:

13924

:syntax region xList start="\[" end="\]" contains=ALL

13925
13926

You can also use it to include a group of elements except for the ones
listed:

13927
13928

:syntax region xList start="\[" end="\]"


\ contains=ALLBUT,xString

13929

Multiple Group Options

13930
13931
13932

Some syntax is context-dependent. You expect if to be followed by then,


for example. Therefore, a then/if statement would be an error. The Vim syntax
parser has options that let it know about your syntax order.

13933
13934
13935

For example, you define a syntax element consisting of > at the beginning
of a line. You also define a element for the KEY string. In this case, the KEY is
important only if it is part of a > line. The definition for this is as follows:

13936
13937
13938
13939

:syntax match xSpecial "^>" nextgroup=xKey


:syntax match xKey "KEY" contained
The nextgroup option tells Vim to highlight KEY, but only if it follows
xSpecial. The result (xKey=italic, xSpecial=underline) is:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 583

Draft Not for publication


13940
13941
13942
13943
13944
13945
13946

Draft 0.1

Not for widespread publication

KEY (Normal key, nothing special, no >)


>KEY Key follows the > so highlighted
However, the KEY must immediately follow the >. If there is a space
present, the KEY will not be highlighted:
> KEY
If you want to allow whitespace between the two groups, you can use the
'skipwhite' op tion :

13947
13948

:syntax match xSpecial "^>" skipwhite nextgroup=xKey


:syntax match xKey "KEY" contained

13949

This gives you:

13950
13951
13952
13953
13954
13955
13956
13957
13958
13959
13960

>

KEY

The skipwhite directive tells Vim to skip whitespace between the groups.
There are two other related options. The skipnl option skips newline in the
pattern. If it were present, you would get the following:
>
KEY
The 'skipempty' option causes empty lines to be skipped as well:
>
KEY

13961
13962

Transparent Matches

13963
13964
13965
13966

The 'transparent' option causes the syntax element to become


transparent, so the highlighting of the containing syntax element will show
through. For example, the following defines a string with all the numbers inside
highlighted:

13967
13968
13969

:syntax region xString start=/"/ skip=/\\"/ end=/"/


\ contains=xNumbers,xSpecial
:syntax match xNumbers /[0-9]\+/ contained

13970

Now add a special group that does not take on any special highlighting:

13971
13972

:syntax match xSpecial /12345/ transparent contained


\ contains=xNothing

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 584

Draft Not for publication


13973
13974
13975
13976
13977

Draft 0.1

Not for widespread publication

This also has a contains argument to specify that xNothing can be


contained. Otherwise, the contains argument xString would be used, and
xNumbers would be included in xSpecial. The results (xString=italic,
xNumbers=underline, xSpecial=N.A.) look like this:
"String 12 with number 45 in it 12345 "

13978

Other Matches

13979
13980

The oneline option indicates that the region does not cross a line
boundary. For example:

13981
13982
13983
13984
13985
13986
13987
13988

:syntax region xPrePoc start=/^#/ end=/$/ oneline


Things now become a little more complex. Let's allow continuation lines.
In other words, any line that ends with \ is a continuation line. The way you
handle this is to allow the xPreProc syntax element to contain a continuation
pattern:
:syntax region xPreProc start=/^#/ end=/$/ oneline
\ contains=xLineContinue
:syntax match xLineContinue "\\$" contained

13989
13990

In this case, although xPreProc is on a single line, the groups contained in


it (namely xLineContinue) let it go on for more than one line.

13991
13992
13993
13994

This is what you want. If it is not what you want, you can call for the
region to be on a single line by adding excludenl to the contained pattern. For
example, you want to highlight "end" in xPreProc, but only at the end of the line.
To avoid making the xPreProc continue on the next line, use excludenl like this:

13995
13996
13997

:syntax region xPreProc start=/^#/ end=/$/


\ contains=xLineContinue,xPreProcEnd
:syntax match xPreProcEnd excludenl /end$/ contained

13998
13999
14000

Note that excludenl is placed before the pattern. Now you can still use
xLineContinue as previously. Because it doesn't have excludenl, a match with
it will extend xPreProc to the next line.

14001

Match Groups

14002
14003
14004

When you define a region, the entire region is highlighted according to the
group name specified. To highlight the text enclosed in parentheses () with the
highlight group xInside, for example, use the following command:

14005

:syntax region xInside start=/(/ end=/)/

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 585

Draft Not for publication

Draft 0.1

Not for widespread publication

14006
14007
14008
14009

Suppose, however, that you want to highlight the parentheses separately.


You can do this with a lot of convoluted region statements, or you can use the
matchgroup option. This option tells Vim to highlight the start and end of a
region with a different highlight group (in this case, the Xparen group).

14010

:syntax region xInside matchgroup=Xparen start=/(/ end=/)/

14011

Match Offsets

14012
14013
14014
14015

Several options enable you to adjust the start and end of a pattern used in
matching for the :syntax match and :syntax region directives. For example,
the offset ms=s+2 indicates that the match starts two characters from the start of
the match.

14016

For example:

14017

:syntax match xHex /0x[a-fA-F0-9]*/ms=s+2

14018

The general form of a match offset is as follows:

14019

location=offset

14020

Location is one of the following:


Start of the element
End of the element
Start highlighting here
End highlighting here
Marks the start of a region
Marks the end of region
Leading context

ms
me
hs
he
rs
re
lc
14021

The offset can be as follows:

14022

Start of match

14023

End of the match

14024
14025

Clusters

14026
14027
14028
14029
14030
14031

One of the things you will notice as you start to write a syntax file is that
you wind up generating a lot of syntax groups. The Vim editor enables you to
define a collection of syntax groups called a cluster. Suppose you have a
language that contains for loops, if statements, while loops, and functions.
Each of them contains the same syntax elements: numbers and identifiers. You
define them like this:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 586

Draft Not for publication


14032
14033
14034
14035
14036
14037
14038
14039
14040
14041

Draft 0.1

Not for widespread publication

:syntax match xFor /^for.*/ contains=xNumber,xIdent


:syntax match xIf /^if.*/ contains=xNumber,xIdent
:syntax match xWhile /^while.*/ contains=xNumber,xIdent
You have to repeat the same contains= every time. If you want to add
another contained item, you have to add it three times. Syntax clusters simplify
these definitions by enabling you to group elements. To define a cluster for the
two items that the three groups contain, use the following command:
:syntax cluster xState contains=xNumber,xIdent
Clusters are used inside other :syntax elements just like any syntax
group. Their names start with @. Thus, you can define the three groups like this:

14042
14043
14044

:syntax match xFor /^for.*/ contains=@xState


:syntax match xIf /^if.*/ contains=@xState
:syntax match xWhile /^while.*/ contains=@xState

14045

You can add new elements to this cluster with the add argument:

14046

:syntax cluster xState add=xString

14047

You can remove syntax groups from this list as well:

14048

:syntax cluster xState remove=xNumber

14049

Including Other Syntax Files

14050
14051
14052

The C++ language syntax is a superset of the C language. Because you do


not want to write two syntax files, you can have the C++ syntax file read in the
one for C by using the following command:

14053

:source <sfile>:p:h/c.vim

14054

(:so is short for :source.)

14055
14056
14057
14058

The word <sfile> is the name of the syntax file that is currently being
processed. The :p:h modifiers remove the name of the file from the <sfile>
word. Therefore, <sfile>:p:h/c.vim is used to specify the file c.vim in the
same directory as the current syntax file.

14059
14060
14061

Now consider the Perl language. The Perl language consists of two distinct
parts: a documentation section in POD format, and a program written in Perl
itself.

14062
14063
14064
14065

The POD section starts with =head and the end starts with =cut. You want
to construct the Perl syntax file to reflect this. The :syntax include reads in a
syntax file and stores the elements it defined in a syntax cluster. For Perl, the
statements are as follows:
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 587

Draft Not for publication


14066
14067
14068

Draft 0.1

Not for widespread publication

:syntax include @POD <sfile>:p:h/pod.vim


:syntax region perlPOD start="^=head" end="^=cut"
\ contains=@POD

14069
14070

In this example, the top-level language is Perl. All the syntax elements of
the POD language are contained in the Perl syntax cluster @POD.

14071

Listing Syntax Groups

14072

The following command lists all the syntax items:

14073

:syntax

14074

To list a specific group, use this command:

14075

:syntax list group-name

14076

This also works for clusters as well:

14077

:syntax list @cluster-name

14078

Synchronization

14079
14080
14081

Compilers have it easy. They start at the beginning of a file and parse it
straight through. The Vim editor does not have it so easy. It must start at the
middle, where the editing is being done. So how does it tell where it is?

14082
14083
14084

The secret is the :syntax sync command. This tells Vim how to figure out
where it is. For example, the following command tells Vim to scan backward for
the beginning or end of a C-style comment and begin syntax coloring from there:

14085

:syntax sync ccomment

14086
14087
14088

You can tune this processing with some options. The minlines option tells
Vim the minimum number of lines to look backward, and maxlines tells the
editor the maximum number of lines to scan.

14089
14090

For example, the following command tells Vim to look at 10 lines before
the top of the screen:

14091
14092
14093
14094
14095
14096
14097

:syntax sync ccomment minlines=10 maxlines=500


If it cannot figure out where it is in that space, it starts looking farther and
farther back until it figures out what to do. But it looks no farther back than 500
lines. (A large maxlines slows down processing. A small one might cause
synchronization to fail.) By default, the comment to be found will be colored as
part of the Comment syntax group. If you want to color things another way, you
can specify a different syntax group:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 588

Draft Not for publication


14098
14099
14100
14101
14102
14103
14104
14105
14106
14107

Draft 0.1

Not for widespread publication

:syntax sync ccomment xAltComment


If your programming language does not have C-style comments in it, you
can try another method of synchronization. The simplest way is to tell Vim to
space back a number of lines and try to figure out things from there. The
following command tells Vim to go back 150 lines and start parsing from there:
:syntax sync minlines=150
A large minlines option can make Vim slower. Finally, you can specify a
syntax group to look for by using this command:
:syntax sync match sync-group-name
\ grouphere group-name pattern

14108
14109
14110

This tells Vim that when it sees pattern the syntax group named groupname begins just after the pattern given. The sync-group-name is used to give a
name to this synchronization specification.

14111
14112

For example, the sh scripting language begins an if statement with if and


ends it with fi:

14113
14114
14115
14116
14117
14118
14119
14120
14121

if [ -f file.txt ] ; then
echo "File exists"
fi
To define a grouphere directive for this syntax, you use the following
command:
:syntax sync match shIfSync grouphere shIf "\<if\>"
The groupthere option tells Vim that the pattern ends a group. For
example, the end of the if/fi group is as follows:
:syntax sync match shIfSync groupthere NONE "\< fi\> "

14122
14123

In this example, the NONE tells Vim that you are not in any special syntax
region. In particular, you are not inside an if block.

14124
14125
14126
14127

You also can define matches and regions that are with no grouphere or
'groupthere' options. These groups are for syntax groups skipped during
synchronization. For example, the following skips over anything inside {}, even
if would normally match another synchronization method:

14128

:syntax sync match xSpecial /{.*}/

14129

To clear out the synchronization commands, use the following command:

14130

:syntax sync clear

14131

To remove just the named groups, use this command:


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 589

Draft Not for publication


14132

Draft 0.1

Not for widespread publication

:syntax sync clear sync-group-name sync-group-name ...

14133
14134
14135
14136

The :syntax sync commands only control the number of lines used to do
syntax matching. The 'synmaxcol' ('smc') option tells Vim how many columns
to use for syntax matching. The default is 3000, and if you have a file with more
that 3000 characters per line, syntax matching is the least of your problems.

14137

Adding Your Syntax File to the System

14138
14139
14140

Suppose that you have defined your own language and want to add it to the
system. If you want it to be a part of Vim, you need to perform the following
steps:

14141
14142

1. Create your syntax file and put it in the


$VIMRUNTIME/syntax/language.vim file.

14143
14144

2. Edit the file $VIMRUNTIME/syntax/synload.vim and add a line to this


file for your language. The line should look like this:

14145

SynAu language

14146
14147
14148

3. Edit the file $VIMRUNTIME/filetype.vim and insert an :autocmd that


recognizes your files and sets the filetype to your language. For example,
for the foo language, execute the following command:

14149

:autocmd BufRead,BufNewFile *.foo set ft=foo

14150
14151
14152

Now Vim should automatically recognize your new language. If the file
works well, you might want to send your changes to the Vim people so that they
can put it in the next version of Vim.

14153

Option Summary
contained

Syntax group is contained in another


group. Items that are contained cannot appear
at the top level, but must be contained in
another group.

contains=group-list

Define a list of syntax groups that can be


included inside this one. The group name can
be ALL for all groups or ALLBUT,group-name for
all groups except the names specified.
Define a group that may follow this one.
Skip whitespace between this group and the
next one specified by nextgroup.
Skip over the end of a line between this group

nextgroup=group
skipwhite
skipnl

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 590

Draft Not for publication

skipempty
transparent
oneline
keepend

excludenl

Draft 0.1

Not for widespread publication

and the next one specified by nextgroup


Skip over empty lines between this group and
the next one specified by nextgroup.
This group takes on the attributes of the one in
which it is contained.
Do not extend the match over more than one
line.
Do not let a pattern with an end-of-line ($)
match in it extend past the end of a line. This
avoids the inner pattern inside a nested pattern
eating an end of line. If this is a contained
match, the match will not match the end-of-line
character.
Do not let a contained pattern extend the item
in which it is contained past the end of a like

14154

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 591

Draft Not for publication


14155

Draft 0.1

Not for widespread publication

Appendix A: Installing Vim

14156
14157

You can obtain Vim from the web site at www.vim.org. This site contains
the source to Vim as well as precompiled binaries for many different systems.

14158

UNIX

14159
14160
14161
14162
14163

You can get precompiled binaries for many different UNIX systems from
www.vim.org. Go to http://www.vim.org, click the "Download Vim" link, and then
follow the "Binaries Page" link. This takes you to the "Binaries" page, which lists
the various precompiled binaries for many different systems along with the links
to download them.

14164
14165
14166
14167

Volunteers maintain the binaries, so they are frequently out of date. It is a


good idea to compile your own UNIX version from the source. Also, creating the
editor from the source allows you to control which features are compiled. To
compile and install the program, you'll need the following:

14168

A C compiler (GCC preferred)

14169

The bzip program (you can get it from http://www.bzip.org)

14170
14171
14172
14173

To obtain Vim, go to http://www.vim.org and click the "Download Vim" link.


This page displays a list of sites that contain the software. Click a link to one
that's near you. This takes you to a directory listing. Go into the "UNIX"
directory and you'll find the sources for Vim. You'll need to download one files:

14174

vim-7.2.tar.bz2

14175

Unpacking the sources

14176
14177

Unpacking the sources is a simple matter of using bzcat (part of the bzip
software suite) to decompress the archive, and tar to extract the members:

14178

$ bzcat vim-7.2.tar.bz2 | tar xf -

14179

Next we go into the directory containing the sources:

14180

$ cd vim

14181

Running configure

14182
14183
14184

The configure script configures the source so that it can be properly built.
First let's take a look at the --help option (that is <dash><dash>help) to see
what the command does:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 592

Draft Not for publication

Draft 0.1

Not for widespread publication

14185
14186
14187
14188
14189
14190
14191
14192
14193
14194
14195
14196
14197
14198
14199
14200
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
14212
14213
14214
14215
14216
14217
14218
14219
14220
14221
14222
14223
14224
14225
14226
14227
14228
14229
14230
14231
14232
14233
14234
14235
14236
14237
14238
14239

$ ./configure --Khelp
`configure' configures this package to adapt to many kinds of systems.
Usage: auto/configure [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --help
--help=short
--help=recursive
-V, --version
-q, --quiet, --silent
--cache-file=FILE
-C, --config-cache
-n, --no-create
--srcdir=DIR

display this help and exit


display options specific to this package
display the short help of all the included packages
display version information and exit
do not print `checking...' messages
cache test results in FILE [disabled]
alias for `--cache-file=config.cache'
do not create output files
find the sources in DIR [configure dir or `..']

Installation directories:
--prefix=PREFIX
install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX
install architecture-dependent files in EPREFIX
[PREFIX]
By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc. You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR
user executables [EPREFIX/bin]
... three pages of options deleted ...
--with-tlib=library

terminal library to be used

Some influential environment variables:


CC
C compiler command
CFLAGS
C compiler flags
LDFLAGS
linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
LIBS
libraries to pass to the linker, e.g. -l<library>
CPPFLAGS
C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
CPP
C preprocessor
XMKMF
Path to xmkmf, Makefile generator for X Window System
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 593

Draft Not for publication


14240
14241
14242
14243

Draft 0.1

Not for widespread publication

Don't worry about all these options. You'll probably never use most of
them. They only really important option is --prefix (<dash><dash>prefix) which
tells configure where you want to install the program. For example, in a users
home directory.

14244

$ ./configure --prefix=/home/auser/local

14245

Now configure looks through system and figures out how to make Vim.

14246
14247
14248
14249
14250
14251
14252
14253
14254
14255
14256
14257
14258
14259
14260
14261

configure: creating cache auto/config.cache


checking whether make sets $(MAKE)... yes
checking for gcc... gcc
... many many checks omitted ...
checking for setjmp.h... yes
checking for GCC 3 or later... yes
configure: updating cache auto/config.cache
configure: creating auto/config.status
config.status: creating auto/config.mk
config.status: creating auto/config.h
Most of this output you can ignore. However one common problem
(discussed below) occurs when you attempt to make the GUI version of Vim and
don't have the development files for the approbate toolkit installed. How to deal
with this is discussed in the troubleshooting section below.

14262

Next it's time to actually build the program.

14263

$ make 2>&1 | tee log

14264
14265
14266
14267
14268
14269
14270
14271
14272
14273
14274
14275
14276
14277
14278
14279
14280
14281
14282
14283

This version of the command tells the shell to redirect standard error to
standard out (2>&1) and to send the whole thing to the tee command (| tee).
The tee command prints the results on the screen and records the data in the file
log.
$ make 2>&1 | tee log
Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && make first
make[1]: Entering directory `/mnt/disk/vim/build/vim72/src'
mkdir objects
CC="gcc -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -I/usr/include/gtk-2.0
-I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo
-I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/freetype2 -I/usr/include/libpng12
" srcdir=. sh
./osdef.sh
... a few hundred lines of log file later ...
make[2]: Leaving directory `/mnt/disk/vim/build/vim72/src/xxd'
make[1]: Leaving directory `/mnt/disk/vim/build/vim72/src'

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 594

Draft Not for publication


14284

14285
14286

Draft 0.1

Assuming that you compiled without error, the next step is to install the
software with the command:

14287

$ make install 2>&1 | tee log.install

14288

The results can be seen below.

14289
14290
14291
14292
14293
14294
14295
14296
14297
14298
14299
14300
14301
14302
14303
14304
14305
14306

Not for widespread publication

$ make install 2>&1 tee log.install


Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && make install
make[1]: Entering directory `/mnt/disk/vim/build/vim72/src'
... Many lines omitted
if test -d /home/sdo/local/share/icons/locolor/16x16/apps -a -w
/home/sdo/local/share/icons/locolor/16x16/apps \
-a ! -f
/home/sdo/local/share/icons/locolor/16x16/apps/gvim.png; then \
cp ../runtime/vim16x16.png
/home/sdo/local/share/icons/locolor/16x16/apps/gvim.png; \
fi
cp gvimtutor /home/sdo/local/bin/gvimtutor
chmod 755 /home/sdo/local/bin/gvimtutor
make[1]: Leaving directory `/mnt/disk/vim/build/vim72/src'

14307
14308

If you are lucky these commands will run without error and you'll have a good Vim installation.
If not, read the next section;

14309

Dealing with common installation problems

14310
14311
14312

The console (text) version of Vim is fairly robust and has compiled
successfully on every machine I've tried it on, and I've compiled on a lot of very
strange machines. (Microsoft Windows excluded.)

14313
14314
14315
14316
14317

The big problem comes in configuring and compiling the GUI version of
Vim. No matter which version you choose, the system will make heavy use of
several X Windows GUI libraries. If these libraries are not installed on your
system, or you do not have the correct version of the library, Vim will fail to build
the GUI version of itself.

14318
14319
14320

To see if you have a GUI problem, after executing the make command
(make only, not make install), go into the src directory and execute the command
./vim -g:

14321

$ make

14322

$ cd src

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 595

Draft Not for publication


14323

Draft 0.1

Not for widespread publication

$ ./vim -g

14324
14325

If a GUI appears and it's the correct GUI, then you don't have a problem.
You're done.

14326
14327

But if you get an error, then look at your configuration log file: log.config.
The relevant lines are:

14328

###

14329
14330
14331

This is where the configuration command is attempting to figure out what


libraries are installed so it can figure out what GUI to build. In this example we
have the xx library, but not the yy library.

14332
14333
14334
14335

Now you may think that you have the yy library installed but Vim fails to
detect it. You need to find out why. Some clues can be found the config.log file
which is automatically generated by the configure command. This file gives you
some idea of what tests are being run to determine which libraries are installed.

14336
14337
14338
14339

If the config.log file does not help you, you'll need to examine the contents
of the configuration command itself. It is written the shell programming
language so it is somewhat readable, although if you are not a expert shelling
program going into the script, you will be before you leave.

14340
14341
14342

If all else fails you can hit the mail list and ask for help. But before doing
so, please, please search the archive. Someone may have already expierenced
your problem and found a solution.

14343
14344
14345
14346
14347

In closing I must say that the last time I got Vim installed it went surpising well
even through it was on a rather difficult platform. I simply sent a request to the
IT department, and a week later I got an E-Mail saying: We finally got Vim
installed and you wouldn't believe the trouble we had getting the thing to work.
(Yes I would, I wrote the book, literally, on Vim.)

14348

Installation for Each UNIX User

14349
14350

Each UNIX user should make sure that Vim is in his path. If you have an
.exrc file, copy it to .vimrc:

14351
14352
14353
14354

$ cp ~/.exrc ~/.vimrc
If you do not have an .exrc file, create an empty .vimrc file by executing the
following command:
$ touch ~/.vimrc

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 596

Draft Not for publication


14355
14356
14357

Draft 0.1

Not for widespread publication

Note: The presence of the .vimrc file turns on all the fancy features of Vim.
If this file is not present, Vim tries very hard to look like Vi, even disabling
some of its features to do so.

14358

Installing on Microsoft Windows

14359
14360
14361

Installation on Microsoft Windows is now a very simple operation. First of


all download the Microsoft Windows binary from http://www.vim.org. Next
simply run the installer and answer the questions.

14362

### do it with vmware ##

14363

Common Installation Problems and Questions

14364
14365
14366

This section describes some of the common problems that occur when
installing Vim and suggests some solutions. It also contains answers to many
installation questions.

14367
14368

I Do Not Have Root Privileges. How Do I Install Vim? (UNIX)

14369
14370

Use the following configuration command to install Vim in a directory


called $HOME/vim :

14371

$ configure --prefix=$HOME/vim

14372
14373

This gives you a personal copy of Vim. You need to put $HOME/vim/bin in
your path to access the editor.

14374

The Colors Are Not Right on My Screen. (UNIX)

14375

Check your terminal settings by using the following command:

14376

$ echo $TERM

14377
14378
14379
14380
14381
14382

If the terminal type listed is not correct, fix it. UNIX has a database called
termcap, which describes the capabilities of your terminal. Almost all xterm
programs support color. Frequently, however, the termcap entry for xterm
defines a terminal without color. To get color to work, you might have to tell the
system that you have an xtermc or cxterm terminal. (Another solution is to
always use the GUI version of Vim called gvim.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 597

Draft Not for publication

Draft 0.1

Not for widespread publication

14383
14384

I Am Using RedHat Linux. Can I Use the Vim That Comes with the
System?

14385
14386

By default RedHat installs a minimal version of Vim. Check your RPM


packages for something named vim-enchanced-version.rpm and install that.

14387

How Do I Turn Syntax Coloring On? (All)

14388

Use the following command:

14389

:syntax on

14390
14391

What Is a Good vimrc File to Use? (All)


See the www.vim.org Web site for several good examples.

14392
14393

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 598

Draft Not for publication


14394
14395
14396
14397

Appendix A: This appendix provide a quick reference for the <> key
names in Vim.

The Function Keys


<F2>
<F8>
<F14>
<F20>
<F26>
<F32>

<Return>
<LineFeed>
<NewLine>

<Home>

14404

<Enter>

<PageDown>

<PageUp>

Arrow Keys
<Right>

<Up>

<Down>

Keypad Keys
<kDivide>
<kHome>
<kPageDown>

14403

<F6>
<F12>
<F18>
<F24>
<F30>

<BackSpace>
<Insert>
<Delete>

<Left>
14402

<F5>
<F11>
<F17>
<F23>
<F29>
<F35>

Editing Keys
<End>

14401

<F4>
<F10>
<F16>
<F22>
<F28>
<F34>

Other Special Characters


<BS >
<Ins>
<Del>

14400

<F3>
<F9>
<F15>
<F21>
<F27>
<F33>

Line Endings
<CR>
<LF>
<NL>

14399

Not for widespread publication

Appendix B: The <> Key Names

<F1>
<F7>
<F13>
<F19>
<F25>
<F31>
14398

Draft 0.1

<kPlus>
<kPageUp>

<kEnd>
<kMinus>

<kEnter>
<kMultiply>

VT100 Special Keys


The VT100 terminal has an extra set of function keys:
<xF1>

<xF2>

<xF3>

<xF4>

vim-all-good.odt (28. Sep. 2007) The Vim Book

<xEnd>

<xHome>

Page 599

Draft Not for publication


14405

Not for widespread publication

Printable Characters
<Bar>
<Bslash>
<Space>
<Tab>
<Lt>

14406

Draft 0.1

|
\

<

Other Keys
<Esc>

<Help>

<Nul>

<Undo>

14407

Termcap Entries

14408
14409
14410

On UNIX systems, the Termcap or Terminfo database contains a


description of the terminal, including function keys. The special key <t_XX>
represents the key defined by XX Termcap entry.

14411
14412

See your UNIX documentation for a complete list of keys. One way to get a
list (for most systems) is to execute the following command:

14413
14414

$ man terminfo

Mouse Actions
<LeftMouse>
<LeftRelease>
<LeftDrag>
<MiddleDrag>
<MouseUp>
<MiddleMouse>

14415

Modifiers
M
C
S
D

14416

<RightMouse>
<RightRelease>
<RightDrag>
<MiddleRelease>
<MouseDown>
<Mouse>

Meta (Alt)
Control
Shift
Macintosh command key

Mouse Modifiers
<Blank>
2
3
4

Mouse
Mouse
Mouse
Mouse

button
button
button
button

one
two
three
four

14417

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 600

Draft Not for publication


14418
14419
14420

Draft 0.1

Not for widespread publication

Note: If you want to find the name of a key on the keyboard, you can go
into Insert mode and press CTRL-K key. The <> name of the key will be
inserted. This works for the function keys and many other keys.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 601

Draft Not for publication


14421

Draft 0.1

Not for widespread publication

Appendix C: Normal-Mode Commands


Move count characters to the left. See the 'backspace'
option to change this to delete rather than backspace.
(Same as: <Left>, CTRL-H, CTRL-K, h. See page 31, 32,
38, 49, 264.)
[count]<C-End>
Move to the end of line count. If no count is specified,
go to the end of the file. (Same as: G.) (See pages 551.)
[count]<C-Home>
Move to the start (first non-blank character) of line
[count]. Default is the beginning of the file. (Same as:
gg.) (See page 223.)
[count]<C-Left>
Move count WORDS backward. (Same as: B.) (See
page 260.)
<C-LeftMouse>
Jump to the location of the tag whose name is under the
cursor. (Same as: CTRL-], g<LeftMouse>.) (See pages
130, 131, 133, 237.)
[count] <C-PageDown> Go to the next tab. If a [count] is specified, go to the
given tab. (Same as :tabn :tabnext, gt.) (See page
97.)
[count] <C-PageUp>
Go to the previous tab. If a [count] is specified, go to
the given tab. (Same as :tabN :tabNext, :tabp,
:tabprevious, gT.) (See page 97.)
<C-Right>
Move count WORDS forward. (Same as: W.) (See page
260.)
[count]<C-RightMouse>
Jump to a previous entry in the tag stack. (Same as:
CTRL-T, g<RightMouse>.) (See pages 132, 133.)
[count]<CR>
Move down count lines. Cursor is positioned on the
first nonblank character on the line. (Same as:
<ENTER>, CTRL-M, and +.) (See page 262.)
["{register}][count]<Del>
Delete characters. If a "{register} is present, the
deleted text is stored in it. (Same as: x.) (See pages
33, 36, 69, 229, 273.)
[count]<Down>
Move [count] lines down. If the 'keymodel' is set to
startselect, start a selection. (Same as: <NL>, CTRL-J,
CTRL-N, j.) (See pages 326, 459.)
[count]<End>
Move the cursor to the end of the line. If a [count] is
present, move to the end of the count line down from
the current one. (Same as: <kEnd>, $.) (See pages 43,
325.)
[count]<Enter>
Move down [count] lines. (Default = 1.) Cursor is
positioned on the first nonblank character on the line.
[count]<BS>

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 602

Draft Not for publication

Draft 0.1

Not for widespread publication

(Same as: <CR>, CTRL-M, +.) (See page 262.)


Go to the initial help screen. (Same as: <Help>, :h, and
:help.) (See pages 40, 129, 130, 224.)
<F8>
Toggle between left-to-right and right-to-left modes.
(See page 249.)
<F9>
Toggles the encoding between ISIR-3342 standard and
Vim extended ISIR-3342 (supported only in right-to-left
mode when 'fkmap' [Farsi] is enabled). (See page
252.)
<Help>
Go to the initial help screen. (Same as: <F1>, :h,
:help.) (See pages 40, 129, 130, 224.)
<Home>
Move to the first character of the line. (Same as:
<kHome>.) (See page 44, 325.)
[count]<Insert>text<Esc>
Insert text. If [count] is present, the text will be
inserted count times. (Same as: i.) (See pages 30, 32,
56.)
[count]<kEnd>
Move the cursor to the end of the line. If a count is
present, move to the end of the count line down from
the current one. (Same as: <End>, $.) (See page 43,
325.)
<kHome>
Move to the first character of the line. (Same as:
<Home>. See page 44, 325.)
[count]<Left>
Move left count characters. If the 'keymodel' is set to
startselect, start a selection. (Same as: <BS>, CTRL-H,
CTRL-K, h.) (See page 264, 459.)
<LeftMouse>
Move the text cursor to the location of the mouse
cursor. (See pages 458.)
["register] <MiddleMouse>
Insert the text in register at the location of the mouse
cursor. (Same as: P.) (See pages 232, 233, 233, 458.)
<MouseDown>
Scroll three lines down. (See page 458.)
<MouseUp>
Scroll three lines up. (See page 458.)
[count]<NL>
Move count lines down. (Same as CTRL-N.) (See page
326.)
[count]<PageDown>
Scroll count pages forward. If the 'keymodel' is set to
startselect, stop a selection. (Same as: <S-Down>,
CTRL-F.) (See page 268, 459.)
[count]<PageUp>
Scroll the window count pages backward. If the
'keymodel' is set to startselect, stop a selection.
(Same as: <S-Up>, CTRL-B.) (See page 267, 459.)
[count]<Right>
Move right count characters. f the 'keymodel' is set to
startselect, stop a selection. (Same as: <Space>, l.)
<F1>

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 603

Draft Not for publication

<RightMouse>
[count]<S-Down>

[count]<S-Left>
[count]<S-LeftMouse>

<S-MouseDown>
<S-MouseUp>
[count]<S-Right>

Draft 0.1

Not for widespread publication

(See page 264, 459.)


Start select mode with the text from the text cursor to
the mouse cursor highlighted. (See pages 458.)
Scroll [count] pages forward. If you are running
Windows GUI version, <S-Down> enters visual mode and
selects down. (Same as: <PageDown>, CTRL-F.) (See
page 268.)
Move left count words. (Same as: b.) (See page 42.)
Find the next occurrence of the word under the cursor.
(See page 289.)
Scroll a full page up. (See page 458.)
Scroll a full page down three lines up. (See page 458.)
Move count words forward. (Same as: w.) (See pages
42, 49, 49, 51.)

[count]<S-RightMouse>

[count]<S-Up>
[count]<Space>
[count]<Tab>
[count]<Undo>
[count]<Up>

CTRL-\ CTRL-N
CTRL-]

[count]CTRL-^

CTRL-_
[count]CTRL-A

Search backward for the word under the cursor. (See


page 290.)
Scroll count pages up. (Same as: <PageUp>, CTRL-B.)
(See page 267.)
Move count spaces to the right. (Same as: <Right>, l.
See page 264.)
Go to the count position in the jump list. (Same as:
CTRL-I. See page 262.)
Undo the last count changes. (Same as: u.) (See page
34.)
Move count lines up. If the 'keymodel' is set to
startselect, start a selection. (Same as: CTRL-P, k.
See page121, 459.)
Enter normal mode from any other mode. (See page
102.)
Jump to the function whose name is under the cursor.
(In the help system, jump to the subject indicated by a
hyperlink.) (Same as: <C-LeftMouse>, g<LeftMouse>.)
(See pages 38, 130, 131, 133, 237.)
If a [count] is specified, edit the [count] file on the
command line. If no [count] is present, edit the
previously edited file. Thus repeated CTRL-^ can be
used to toggle rapidly between two files. (See page 81.)
Switch between English and a foreign language
keyboard. (See pages 252, 253, 336.)
Add [count] to the number under the cursor. If no
[count] is specified, increment the number. (See

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 604

Draft Not for publication

[count]CTRL-B
CTRL-BREAK
CTRL-C
[count]CTRL-D

[count]CTRL-E
[count]CTRL-F
CTRL-G
1 CTRL-G
2 CTRL-G
[count]CTRL-H

[count]CTRL-I
[count]CTRL-J
[count]CTRL-K
CTRL-L
CTRL-L
CTRL-M

[count]CTRL-N
[count]CTRL-O
[count]CTRL-P
CTRL-Q

Draft 0.1

Not for widespread publication

pages 274, 546.)


Move back [count] screens. (Default = 1.) (Same as:
<PageUp>, <S-Up>. See pages 267.)
Interrupt search (Same as CTRL-C). (See page 289.)
Interrupt search. (Same as CTRL-BREAK). (See page
289.)
Move down the number of lines specified by the
'scroll' option. If a [count] is specified, set the
'scroll' option to [count] and then move down. (See
pages 48, 268.)
Move down [count] lines. (See page 268, 269.)
Scroll the window [count] pages forward. (Same as:
<PageDown>, <S-Down>.) (See page 268.)
Display the current file and location of the cursor within
that file. (Same as: :file.) (See pages 47, 265.)
Same as CTRL-G, but include the full path in the
filename. (See pages 265.)
Same as 1 CTRL-G, but adds a buffer number. (See
pages 265.)
Move [count] characters to the left. See the
'backspace' option to change this to delete rather than
backspace. (Same as: <BS>, <Left>, CTRL-K, h.) (See
page 31, 32, 38, 49, 264.)
Jump to the [count] next item in the jump list. (Same
as: <Tab>. See page 262.)
Move down [count] lines. (Same as: <Down>, <NL>,
CTRL-J, j.) (See pages 326.)
Move [count] characters to the left. (Same as: <BS>,
<Left>, CTRL-H, h.) (See page 31, 32, 38, 49, 264.)
Redraw screen. (See page 224.)
Leave insert mode if 'insertmode' is set. (See page
255.)
Move down count lines. Cursor is positioned on the
first nonblank character on the line. (Same as:
<ENTER>, <CR>, and +.) (See page 262.)
Move count lines down. (Same as: <Down>, <NL>,
CTRL-J, j.) (See pages 326.)
Jump to the count previous item in the jump list. (See
page 262.)
Move count lines upward. (Same as: <Up>, k.) (See
pages 31, 32, 38, 41, 121.)
Not a Vim command. Used by some terminals to start
output after it was stopped by CTRL-S. (See page 224.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 605

Draft Not for publication


CTRL-R
CTRL-S
[count]CTRL-T

[count]CTRL-U

CTRL-V
[count]CTRL-W<Down>

Draft 0.1

Not for widespread publication

Redo the last change that was undone. (See page 34,
283.)
Not a Vim command. Used by some terminals to stop
output. (See page 224.)
Go back [count] tags. If the current buffer has been
modified, this command fails unless the force (!) option
is present. When using the help system, this command
returns to the location you were at before making the
last hyperlink jump. (Same as: <C-RightMouse>,
g<RightMouse>.) (See pages 39, 132, 133.)
Move up the number of lines specified by the 'scroll'
option. If a [count] is specified, set the 'scroll'
option to [count] and then scroll up. (See pages 48,
266.)
Start visual block mode. (See pages 101, 103 and 105.)

Move down a window. If a [count] is specified, move to


window number [count]. (Same as: CTRL-W CTRL-J,
CTRL-Wj. See page 84, 331, 457.)
[count]CTRL-W<Left> Go left [count] windows. (Same as: CTRL-W CTRL-h,
CTRL-W<Left>. See page 85.)
[count]CTRL-W<Right> Go right [count] windows. (Same as: CTRL-W CTRL-l,
CTRL-W<Right>. See page 85.)
[count]CTRL-W<Up>
Move up a window. If a [count] is specified, move to
window number [count]. (Same as: CTRL-W CTRL-K,
CTRL-Wk. See page 84, 331, 457.)
[count]CTRL-W CTRL-]
Split the current window and jump to the function
whose name is under the cursor. If a [count] is
specified, it is the height of the new window. (Same as:
CTRL-W].) (See page 133.)
CTRL-W CTRL-^
Split the window and edit the alternate file. If a
[count] is specified, split the window and edit the
[count] file on the command line. (Same as: CTRL-W^.)
(See page 336.)
[count]CTRL-W CTRL-_
Set the height of the current window to [count].
(Same as: CTRL-W_, :resize.) (See page 89.)
CTRL-W CTRL-B
Move to the bottom window. (Same as: CTRL-Wb.) (See
page 331.)
CTRL-W CTRL-C
Cancel any pending window command. (See page 84.)
CTRL-W CTRL-D
Split the window and find the definition of the word
under the cursor. If the definition cannot be found, do
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 606

Draft Not for publication

Draft 0.1

Not for widespread publication

not split the window. (Same as: CTRL-Wd.) (See page


337.)
CTRL-W CTRL-F
Split the window and edit the file whose name is under
the cursor. Looks for the file in the current directory,
and then all the directories specified by the 'path'
option. (Same as: CTRL-Wf.) (See page 337.)
[count]CTRL-W CTRL-G CTRL-]
:split followed a CTRL-]. If a [count] is specified,
make the new window [count] lines high. (Same as:
CTRL-Wg CTRL-], CTRL-Wg.) (See page 337.)
[count]CTRL-W CTRL-G }
Do a :ptjump on the word under the cursor. If a
[count] is specified, make the new window [count]
lines high. (Same as: CTRL-W CTRL-G}.) (See page 389.)
[count]CTRL-W CTRL-H Go left [count] windows. (Same as: CTRL-W h,
CTRL-W<Left>.) (See page 85.)
[count]CTRL-W CTRL-I
Split the window and search for the [count]
occurrence of the word under the cursor. Start the
search at the beginning of the file. (Same as: CTRL-Wi.
See page 336.)
[count]CTRL-W CTRL-J
Move down a window. If a count is specified, move to
window number count. (Same as: CTRL-W<Down>,
CTRL-Wj.) (See page 84, 331, 457.)
[count]CTRL-W CTRL-K
Move count windows up. (Same as: CTRL-W<Up>, CTRLWk.) (See page 84, 331, 457.)
[count]CTRL-W CTRL-L Go right [count] windows. (Same as: CTRL-W l, CTRLW<Right>. See page 85.)
CTRL-W CTRL-N
Split the window like :split. The window is started on
a blank file. (Same as: CTRL-Wn. See page 86.)
CTRL-W CTRL-O
Make the current window the only one. (Same as:
CTRL-Wo, :on, :only.) (See page 335.)
CTRL-W CTRL-P
Move to the previous window. (Same as: CTRL-Wp.)
(See pages 232, 233, 331.)
CTRL-W CTRL-Q
Close a window. If this is the last window, exit Vim.
The command fails if this is the last window for a
modified file, unless the force (!) option is present.
(Same as: CTRL-W q, :q, :quit.) (See pages 35, 84,
164, 284, 334.)
[count]CTRL-W CTRL-R
Rotate windows downward. (Same as: CTRL-Wr.) (See
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 607

Draft Not for publication

Draft 0.1

Not for widespread publication

page 332.)
[count]CTRL-W CTRL-S

CTRL-W CTRL-T
CTRL-W CTRL-W

Split the current window. (Make the new window count


lines high.) (Same as: CTRL-Ws, CTRL-WS, :sp, :split.
See pages 232, 233.)
Move the top window. (Same as: CTRL-Wt. See page
331.)
Move to the next window down. (if in vertical mode
move to the next window to the right.) If there is no
next window, move to the first one. If a [count] is
specified, move to window number [count]. (Same as:
CTRL-Ww.) (See pages 84, 85, 332.)

[count]CTRL-W CTRL-X
Exchange the current window with the next one. If
there is no next one, exchange the last window with the
first. If a [count] is specified, exchange the current
window with window number [count]. (Same as:
CTRL-Wx.) (See page 333.)
CTRL-W CTRL-Z
Close the preview window. Discard any changes if the
force (!) option is present. (Same as: CTRL-Wz, :pc,
:pclose.) (See page 388.)
[count]CTRL-W +
Increase the size of the current window by [count].
(Default = 1.) (Same as: :res +, :resize +.) (See page
89.)
[count]CTRL-W - (CTRL-W <dash>)
Decrease the size of the current window by [count].
(Default = 1.) (Same as :res -, :resize -.) (See page
89.)
CTRL-W=
Make all windows the same size (or as close as
possible). (See page 89.)
[count]CTRL-W ]
Split the current window and jump to the function
whose name is under the cursor. If a [count] is
specified, it is the height of the new window. (Same as:
CTRL-W CTRL-].) (See page 133.)
[count]CTRL- W ^
Split the window and edit the alternate file. If a
[count] is specified, split the window and edit the
[count] file on the command line. (Same as: CTRL-W
CTRL-^.) (See page 336.)
[count]CTRL-W _
Set the current window to be [count] lines high. If no
count is specified, make the window as big as possible.
(Same as: CTRL-W CTRL-_, :res, :resize.) (See page
89.)
CTRL-W }
Do a :ptag on the word under the cursor. (See page
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 608

Draft Not for publication

CTRL-W b
CTRL-W c
CTRL-W d

CTRL- W f

CTRL-W g CTRL-]
CTRL- W g ]
CTRL- W g }
CTRL-Wgf

CTRL-WgF

[count]CTRL-W h
[count]CTRL-W i

[count]CTRL-W j

[count]CTRL-W k
[count]CTRL-W l
CTRL-W n
CTRL-W o

Draft 0.1

Not for widespread publication

389.)
Move to the bottom window. (Same as: CTRL-W
CTRL-B.) (See page 331.)
Close the current window. (Same as: :clo, :close.)
(See page 84.)
Split the window and find the definition of the word
under the cursor. If the definition cannot be found, do
not split the window. (Same as: CTRL-W CTRL-D.) (See
page 337.)
Split the window and edit the file whose name is under
the cursor. Looks for the file in the current directory,
then all the directories specified by the 'path' option.
(Same as: CTRL-W CTRL-F.) (See page 337.)
:split followed a CTRL-]. (Same as: CTRL-W CTRL-G],
CTRL-Wg].) (See page 337.)
:split followed a CTRL-]. (Same as: CTRL-W g CTRL-],
CTRL-W CTRL-G].) (See page 337.)
Do a :ptjump on the word under the cursor. (Same as:
CTRL-W CTRL-G}. ( See page 389.)
Open a new tab and do a :find on the file who's name
is under the cursor. (Similar to :tabfind, :tabf) (See
page 98.)
Open a new tab and do a :find on the file who's name
is under the cursor. Position the cursor on the line
who's number appears after the file name. (Similar to
:tabfind, :tabf) (See page 98.)
Go left [count] windows. (Same as: CTRL-W CTRL-h,
CTRL-W<Left>.) (See page 85.)
Split the window and search for the [count]
occurrence of the word under the cursor. Start the
search at the beginning of the file. (Same as: CTRL-W
CTRL-I.) (See page 336.)
Move down a window. If a [count] is specified, move to
window number [count]. (Same as: CTRL-W CTRL-J,
CTRL-W<Down>.) (See page 84, 331, 457)
Go up [count] windows. (Same as: CTRL-W CTRL-K,
CTRL-W<Up>.) (See page 84, 331, 457.)
Go right [count] windows. (Same as: CTRL-W CTRL-L,
CTRL-W<Right>.) (See page 85.)
Split the window like :split. The window is started on
a blank file. (Same as: CTRL-W CTRL-N.) (See page 86.)
Make the current window the only one. If ! is specified,
modified files whose windows are closed will have their

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 609

Draft Not for publication

CTRL-W p
CTRL-W q

[count]CTRL-W r
[count]CTRL-W R
[count]CTRL-W s

[count]CTRL-W S

CTRL-W t
[count]CTRL-W w

[count]CTRL-W W

[count]CTRL-W x
CTRL-W z
[count]CTRL-X

[count]CTRL-Y
CTRL-Z
!{motion}{command}

[count]!!{command}

Draft 0.1

Not for widespread publication

contents discarded. (Same as: CTRL-W CTRL-O, :on,


:only.) (See page 335.)
Move to the previous window. (Same as: CTRL-W CTRLP.) (See pages 232, 233, 331.)
Close a window. If this is the last window, exit Vim.
The command fails if this is the last window for a
modified file, unless the force (!) option is present.
(Same as: CTRL-W CTRL-Q, :q, :quit.) (See pages 35,
84, 164, 284, 334.)
Rotate windows downward. (Same as: CTRL-W CTRL-R,
CTRL-WR.) (See page 332.)
Rotate windows upward. (See page 332.)
Split the current window. Make the new window
[count] lines high (same as [count]CTRL-WS). (Same
as: CTRL-W CTRL-S, CTRL-WS, :sp, :split.) (See pages
232, 233.)
Split the current window. Make the new window count
lines high (same as [count]CTRL-Ws). (Same as: CTRLW CTRL-S, CTRL-Ws, :sp, :split.) (See page 232, 233.)
Move the top window. (Same as: CTRL-W CTRL-T.) (See
page 331.)
Move to the next window down (to the right in vertical
mode). If there is no next window, move to the first
one. If a [count] is specified, move to window number
[count]. (Same as: CTRL-W CTRL-W.) (See pages 84, 85,
332.)
Move to the previous window. If at the top window, go
to the bottom one. >If a [count] is specified, move to
window number [count]. (See page 332.)
Exchange the current window with window number
count. (Same as: CTRL-W CTRL-X.) (See page 333.)
Close the preview window. (Same as: CTRL-W CTRL-Z,
:pc, :pclose.) (See page 388.)
Subtract [count] from the number under the cursor. If
no [count] is specified, decrement the number. (See
pages 274, 546.)
Move up [count] lines. (See pages 266, 269.)
Suspend the editor (Unix only). (Same as CTRL-Z,
:suspend, :sus, :st, and :stop.) (See page 224.)
Filter the block of text represented by {motion}
through the an external {command}command. (See
pages 76, 138, 181, 235.)
Filter the current line (or [count] lines} through the an

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 610

Draft Not for publication

Draft 0.1

Not for widespread publication

external command. (See page 76, 77.)


Search for the word under the cursor, backward.
(Same as: , <S-RightMouse>.) (See page 290.)
[count]$
Move the cursor to the end of the line. If a [count] is
present, move to the end of the [count] line down from
the current one. (Same as: <End>, <kEnd>.) (See pages
43, 50, 56, 324, .)
%
Find the matching (), {}, #ifdef/#else/#endif.
(See pages 112, 113, 119, 121, 128, 369.)
[count]%
Jump to the line whose [count] percent of the way
through the file. (See page 46.)
&
Synonym for :s//~/ Repeat last substitution. (See
page 429.)
'{letter}
Go to the line containing mark named {letter}. (See
(single quote) pages 235, 315.)
[count](
Move backward [count] sentences. (See page 186.)
[count])
Move forward [count] sentences. (See page 181, 186.)
[count]*
Search for the word under the cursor, forward. (See
page 289.)
[count]+
Move down [count] lines. (Default = 1.) Cursor is
positioned on the first nonblank character on the line.
(Same as: <CR>, +, CTRL-M.) (See page 262.)
[count],
Reverse the direction of the last single character and
perform the search [count] times. (See page 261.)
[count]Move up [count] lines. (Default = 1.) Cursor is
positioned on the first non-blank character on the line.
(See page 261.)
[count] . (dot)
Repeat the last simple normal mode command that
changed text. If [count] is specified use it instead of
the [count] specified with the original command. (See
page 53, 230, 182.)
[count]/
Repeat last search in the forward direction. (See pages
60, 60.)
[count]/{pattern}
Search forward. (See pages 59-67, 230, 315.)
[count]/{pattern}/{offset}
Search forward, position the cursor at {offset} from
the search pattern. (See page 290.)
[count]//{offset}
Repeat last search in the forward direction with a new
offset. (See page 292.)
[count];
Repeat the last single character search [count] times.
(Default = 1.) (See page 261.)
[count]<<
Shift count lines to the left. (See pages 114.)
<{motion}
Shift lines from cursor to {motion} to the left. (See
[count]#

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 611

Draft Not for publication

Draft 0.1

Not for widespread publication

pages 114.)
Shift [count] lines to the right. (See page 114.)
Shift lines from cursor to {motion} to the right. (See
pages 114, 128, 128.)
={motion}
Filter {motion} lines through the internal indentation
program or if the 'equalprg' option is defined, the
external program given by 'equalprg'. (See page
118.)
[count]?
Repeat last search in the backward direction. (See
page 64, 64.)
[count]?{pattern}
Search backward. (See page 292.)
[count]?{pattern}?{offset}
Search backward, position the cursor at {offset} from
the search pattern. (See page 292.)
[count]??{offset}
Repeat last search in the backward direction with a
new {offset}. (See page 292.)
[count]@{character}
Execute the macro in register {character}. (See page
55.)
["{register}]
[<MiddleMouse>
Put the {register} in the buffer like the p command,
but adjust the text to fit the indent of the current line.
(Same as: [p, [P, ]P.) (See page 363.)
[count]
[CTRL-D
Find definition of the macro currently sitting under the
cursor. Start the search from the beginning of the file.
(See page 126.)
[count]
[CTRL-I
Search for the word under the cursor starting at the
beginning of the file. (See pages 125, 398.)
[count]
["{register}<MiddleMouse>
Put the {register} in the buffer like the p command,
but adjust the text to fit the indent of the current line.
(See page 363.)
[#
Finds the previous unmatched #if/#else/#endif.
(See page 390.)
[count]
[*
Move backward to the beginning of the [count]
comment from the cursor. (Same as: [/.) (See page
391.)
[count]
[/
Same as: [*. (See page 391.)
[count]
[(
Move backward to the [count] previous unmatched
( in column 1. (See page 390.)
[count]
[)
Move backward to the [count] previous unmatched ).
(See page 390.)
[count]
[[
Move backward [count] sections or to the previous { in
[count]>>
>{motion}

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 612

Draft Not for publication

Draft 0.1

Not for widespread publication

column 1. (See pages 188, 391.)


Move [count] sections backwards or to the previous }
in column 1. (See pages 391.)
[count]
[}
Finds the [count] previous unmatched }. (See page
390.)
[count]
[c
Go to the [count] next change in the current diff. (See
page 380.)
[count]
[d
List the definition of the macro. Start search at the
beginning of the file. (See pages 126, 398.)
[count]
[D
List all definitions of the macro whose name is under
the cursor. Start the list with the next first definition in
the file. (See page 126.)
[f
Deprecated. Use gf instead. (Same as: gf, ]f.) (See
page 394.)
[count]
[i
Display the [count] line that contains the keyword
under the cursor. The search starts from the beginning
of the file. (See page 398.)
[I
List all lines in the current and included files that
contain the word under the cursor. (See page 398.)
[m
Search backward for the start of a method. (See page
391.)
[M
Search backward for the end of a method. (See page
391.)
["{register}]
[p
Put the {register} in the buffer like the P command,
but adjust the text to fit the indent of the current line.
(Same as: [<MiddleMouse>, [P, ]P.) (See page 363.)
["{register}]
[P
Put the {register} in the buffer like the P command,
but adjust the text to fit the indent of the current line.
(Same as: [<MiddleMouse>, [p, [P.) (See page 363..)
[count] [s
Search for the next misspelled word starting at the
current location. A [count] cause the command to
repeat [count] times. (See page 183.)
[count] [S
Search for the next misspelled word starting at the
current location, but do not stop at bad words or
uncommon words. A [count] cause the command to
repeat [count] times. (See page 183.)
[z
Move to the start of the current open fold. (See page
386.)
["{register}]
]<MiddleMouse>
Put the {register} in the buffer like the p command,
but adjust the text to fit the indent of the current line.
(Same as: ]p.) (See page 363.)
[count]
]CTRL-D
Find definition of the macro currently sitting under the
[count]

[]

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 613

Draft Not for publication

[count]

]CTRL-I

[count]

]#

[count]

])

[count]
[count]

]/
]*

[count]

](

[count]

][

[count]

]]

[count]
[count]
[count]

]{
]}
]c

[count]

]d

[count]

]D

]f
[count]

]i

]I

]m
]M
["{register}]

]p

["{register}]

]P

Draft 0.1

Not for widespread publication

cursor. Start the search from the beginning current


location. (See page 126, 433.)
Search for the word under the cursor starting at the
current cursor location. (See pages 125,-398.)
Finds the next unmatched #if/#else/#endif. (See
page 390.)
Move forward to the [count] next unmatched ). (See
page 391.)
-or Move forward to the end of the [count] comment from
the cursor. (See page 391.)
Move forward to the count next unmatched (. (See
page 390.)
Move count sections forward or to the next } in column
1. (See pages 391.)
Move count sections forward or to the next { in column
1. (See pages 188, 391.)
Finds the count previous unmatched {.(See page 390.)
Finds the count previous unmatched }. (See page 390.)
Go to the [count] previous change in the current diff.
(See page 380.)
List the definition of the macro. Start search at the
current cursor position. (See pages 126, 260, 398.)
List all definitions of the macro whose name is under
the cursor. Start the list with the first next definition.
(See page 126.)
Deprecated. Use gf instead. (Same as: gf, and
depreciated command [f. See page 394.)
Display the [count] line that contains the keyword
under the cursor. The search starts from the current
cursor position. (See page 398.)
List all lines in the current and included files that
contain the word under the cursor starting at the
current location. (See page 398.)
Search forward for the start of a method. (See page
391.)
Search forward for the end of a method. (See page
391.)
Put the {register} in the buffer like the P command,
but adjust the text to fit the indent of the current line.
(Same as: ]<MiddleMouse>.) (See page 363.)
Put the {register} in the buffer like the P command,
but adjust the text to fit the indent of the current line.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 614

Draft Not for publication

[count]

]s

[count]

]S

]z
[count]_
`{mark}
`{mark}

(backtick)

[count]
[count]|

[count]

~{motion}

[count]~

[count]
0 (Zero)

Draft 0.1

Not for widespread publication

(Same as ]<MiddleMouse>, [p, [P. See page 363.)


Search for the next misspelled word starting at the
current location. A [count] cause the command to
repeat [count] times. (See page 183.)
Search for the next misspelled word starting at the
current location, but do not stop at bad words or
uncommon words. A [count] cause the command to
repeat [count] times. (See page 183.)
Move to the end of the current open fold. (See page
386.)
Move to the first printing character of the [count]-1
line below the cursor. (See page 262.)
Go to the mark named mark. Cursor is positioned
exactly on the mark. (See page 72.)
Go to the line containing mark. Position the cursor at
the first non-blank character on the line. (See page 72)
Move backward [count] paragraphs. (See page 186.)
Move to the column [count] on the current line. (See
page 326.)
Move forward [count] paragraphs. (See page 175,
186, 231.)
Change the case of the indicated characters. (This
version of the command depends on the 'tildeop'
option being on. (The default is off.) (See page 55.)
Change the case of count characters. (This version of
the command depends on the 'tildeop' option being
off (the default). (See pages 264.)
Search for the word under the cursor, backward.
(Same as #, <S-RightMouse>.) (See page 290.)
Move to the first character on the line. (See pages 44,
260, 325.)

[count]a{text}<Esc>
Insert text starting after the character under the
cursor. If a [count] is specified, the text is inserted
count times. (See page 36, 41, 56.)
[count]A{text}<Esc>

[count]b
[count]B
c{motion}

Append the text on to the end of the line. (See page


274.)
Move backward count words. (Same as: <S-Left>.)
(See page 42.)
Move count WORDS backward. (Same as: <C-Left>.
See page 260.)
Delete from the cursor to the location specified by the

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 615

Draft Not for publication

Draft 0.1

Not for widespread publication

{motion} then enter insert mode. (See pages 51, 103,


230.)
[count]C
Delete from the cursor to the end of the current line
and [count]-1 more lines, and then enter insert mode.
(See page 52, 103, 272, 272.)
[count]cc
Delete [count] entire lines (default = 1) and enter
insert mode. (See page 52.)
["{register}] d{motion}
Delete from the cursor location to where {motion}
goes. (See pages 49, 50, 53, 69, 70, 72, 231, 271.)
do
Copy the current diff from the other window to this
one. (See page 120.)
dp
Copy the current diff from the this window to the other
one. (See page 120.)
[count]D
Delete from the cursor to the end of the line. If a
[count] is specified, delete an additional [count]-1
lines. (See pages 50, 271.)
["{register}][count]dd
Delete [count] lines. (See pages 36, 49, 308.)
[count]e
Move [count] words forward, stop at the end of the
word. (See page 257.)
[count]E
Move [count] WORDS forward to the end of the
WORD. (See page 260.)
[count]f{char}
Search forward for character {char} on the current
line. Stop on the character. (See pages 44, 53, 261,
279.)
[count]F{char}
Search backward for character {char} on the current
line. Stop on the character. (See page 45.)
[count]G
Go to the line [count]. If no line is specified, go to the
last line in the file. (Same as: <C-End>. See pages 46,
223, 230, 262, 551.)
[count]g<Down>
Move down one line on the screen. (Same as: gj.) (See
page 326.)
g<End>
Move to the rightmost character on the screen. (Same
as: g$.) (See page 325.)
g<Home>
Move to the leftmost character on the screen. (In other
words, move to column 1.) (Same as: g0. See page
325.)
g<LeftMouse>
Jump to the location of the tag whose name is under the
cursor. (Same as: <C-LeftMouse>, CTRL-].) (See page
130, 131, 133, 237.)
[count]g<RightMouse>

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 616

Draft Not for publication

[count]]g<Up>
g CTRL-]
g CTRL-G
g CTRL-H
g@{Motion}
[count]g[count]g+
[count]g,
[count]g;
[count]g

g$
[count]g*
g?{motion}

[count]g??
[count]g?g?
g#

g]
g^
[count]g;
g~{motion}
[count]g~g~

Draft 0.1

Not for widespread publication

Jump to a previous entry in the tag stack. (Same as:


<C-RightMouse>, CTRL-T.) (See page 132, 133.)
Move up lines in one the screen space. (Same as: gk.)
(See page 326.)
Do a :tjump on the word under the cursor. (See page
135.)
Display detailed information about where you are in the
file. (See page 223.)
Start select block mode. (See page 356.)
Call the function specified by the 'operatorfunc' to
process the text. (See page 504.)
Go to the [count] older text state. (See page 283.)
Go to the [count] newer text state. (See page 283.)
Go [count] forward cursor positions in the change list
(Seepage 264.)
Go [count] backward cursor positions in the change
list (Seepage 264.)
Search for the word under the cursor, backward. Unlike
, this finds partial words. (Same as: g#.) (See page
290.)
Move to the rightmost character on the screen. (Same
as: g<End>.) (See page 325.)
Search for the word under the cursor, forward. Unlike
*, this finds partial words. (See page 290.)
Encrypt the text from the current cursor location to
where {motion} takes you using rot13 encryption. (See
page 189.)
Encrypt the lines using the rot13 encryption. (Same as:
g?g?. See page 189.)
Encrypt the lines using the rot13 encryption. (Same as:
g??. See page 189.)
Search for the word under the cursor, backwards.
Unlike #, this finds partial words. (Same as: g. See
page 290.)
Do a :tselect on the word under the cursor. (See
page 135.)
Move to the leftmost printing character visible on the
current line. (See page 325.)
Go [count] cursor positions back in the change list.
(See page 264.)
Reverse the case of the text from the cursor to
{motion}. (See pages 279.)
-or -

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 617

Draft Not for publication


[count]g~~

g0 (zero)

ga
gd
gD
[count]ge
[count]gE
gf

[count]gg
gh
gH
[count]gI{text}<Esc>
[count]gj
[count]gJ

[count]] gk
gm
[count]go
[""{register}] gp
[""{register}] gP

Draft 0.1

Not for widespread publication

Reverse the case of the entire line. If a [count] is


specified, change the case of [count] lines. (See page
280.)
Move to the leftmost character on the screen. (In other
words, move to column 1.) (Same as: g<Home>.) (See
page 325.)
Search for the word under the cursor, backwards.
Unlike #, this finds partial words. (Same as: g#. See
page 290.)
Print the ASCII value of the character under the cursor.
(Same as: :as, :ascii. See page 223.)
Find the local definition of the variable under the
cursor. (See pages 125.)
Find the global definition of the variable under the
cursor. (See pages 125.)
Move [count] words backward stopping on the end of
the word. (See page 257.)
Move [count] WORDS backward to the end of the
WORD. (See page 260.)
Edit the file whose name is under the cursor. If the file
is not in the current directory, search the directory list
specified by the 'path' option. (Same as: [f, ]f. See
page 260.)
Move to line count. Default is the first line. (Same as:
<C-Home>. See page 223.)
Start select mode characterwise. (See page 356.)
Start select mode linewise. (See page 356.)
Insert text in column 1, [count] times. (See page 274.)
Move down one line on the screen. (Same as: g<Down>.)
(See page 326.)
Join lines. No spaces are put between the assembled
parts. If a [count] is specified, [count] lines are
joined (minimum of two lines). (See page 275.)
Move up lines in the screen space. (Same as: g<Up>.)
(See page 326.)
Move to the middle of the screen. (See page 325.)
Go to [count] byte of the file. (Same as: :go, :goto.
See page 223.)
Paste the text before the cursor, but do not move the
cursor. (See page 304.)
Paste the text after the cursor, but do not move the
cursor. (See page 304.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 618

Draft Not for publication


gq{motion}

gqq
gqgq
qQ
[count]gr{character}

Draft 0.1

Not for widespread publication

Format the text from the line the cursor is on to the line
where {motion} takes you. (See pages 155, 175, 178,
181, 369.)
Format the current line. (Same as: gqgq. See page
175.)
Format the current line. (Same as: gqq. See page 175.)
Enter :ex mode. (See page 158.)

Replace the virtual character under the cursor with


{character}. (See pages 278.)
[count]gR{string}<Esc>
Enter virtual replace mode until <Esc> is pressed. (See
page 278.)
[count] gs
Sleep for the specified number of seconds. (Same as:
:sl, :sleep.) (See page 224.)
[count] gt
Go to the next tab. If a [count] is specified, go to the
given tab. (Same as :tabn :tabnext, <C-PageDown>.)
(See page 97.)
[count] gT
Go to the previous tab. If a [count] is specified, go to
the given tab. (Same as :tabN :tabNext, :tabp,
:tabprevious, <C-PageUp>.) (See page 97.)
gu{motion}
Lowercase the text from the cursor to {motion}. (See
page 280.)
gU{motion}
Uppercase the text from the cursor to {motion}. (See
page 280.)
[count]gugu
-or [count]guu
Lowercase the entire line. If a [count] is specified
change the case of [count] lines. (See page 280.)
[count]gUgU
-or [count]gUU
Uppercase the entire line. If a [count] is specified
change the case of [count] lines. (See page 280.)
gv
Repeat the last visual-mode selection. (See page Error:
Reference source not found348.)
gV
Do not automatically reselect the selected text. (See
page 358.)
[count]h
Move cursor left. (Same as: <BS>, <Left>, CTRL-H,
CTRL-K.) (See page 31, 32, 38, 49, 264.)
[count]H
Move to the cursor to the top of the screen. If a
[count] is specified, move to the count line from the
top. (See page 262, 551.)
[count]i{text}<Esc>
Insert text starting before the character under the
cursor. If a count is specified, the text is inserted count
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 619

Draft Not for publication

Draft 0.1

Not for widespread publication

times. (Same as: <Insert>.) (See pages 30, 32, 56.)


[count]I{text}<Esc>

[count]j
[count]J

[count]k
[count]K

[count]l
[count]L

m{letter}

M
[count]n
[count]N
[count]o
[count]O

Insert the text at the beginning of the line. (See page


274.)
Down. (Same as: <Down>, <NL>, CTRL-J, CTRL-N. See
pages 31, 32, 38, 326.)
Join lines. Spaces are put between the assembled
parts. If a [count] is specified, [count] lines are joined
(minimum of 2 lines). (See pages 54, 177, 275.)
Move cursor up. (Same as: <Up>, CTRL-P.) (See pages
31, 32, 38, 41, 121.)
Run the man command on the word under the cursor.
If a [count] is specified, use [count] as the section
number. On Microsoft Windows, by default, this
command performs a :help on the word under the
cursor. (See page 129, Error: Reference source not
found130.)
Right. (Same as: <Right>, <Space>. See page 31, 32,
38, 264, 324.)
Move the cursor to the bottom of the screen. If a count
is specified, move to the [count] line from the bottom.
(See page 262, 551.)
Mark the current text with the name {letter}. If
{letter} is lowercase, the mark is local to the buffer
being edited. In other words, just the location in the
file is marked, and you have a different set of marks for
each file.
If an uppercase letter is specified, the mark is global.
Both the file and the location within are marked. If you
execute a "go to mark(`)" command to jump to a global
mark, you may switch files. (See pages 72, 75, 138,
160, 231, 232, 235, 315.)
Move to the cursor to the middle of the screen. (See
page 262, 551.)
Repeat last search. Search in the same direction. (See
pages 64, 64, 230.)
Repeat last search. Search in the reverse direction.
(See pages 64, 64.)
Open a new line below the cursor and put the editor
into insert mode. (See page 37, 179, 371.)
Open a new line above the cursor and put the editor
into insert mode. (See page 37, 179, 371.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 620

Draft Not for publication


["{register}] p

["{register}] P

q/
q:
q?
q{character}

Q
[count]r{char}

Draft 0.1

Not for widespread publication

Paste the test in the unnamed register (") after the


cursor. (If the register contains complete lines, the text
will be placed after the current line.) (See pages 69, 70,
71, 75, 229, 231, 304, 363.)
Paste the text in the {register} before the cursor. If
no {register} is specified, the unnamed register is
used. (Same as: <MiddleMouse>. See pages 71, 232,
233, 233, 304, 308, 363.)
Open a command window and allow the user to browse
through the forward search history. (See page 60.)
Open a command window and allow the user to browse
through the command history. (See page 421.)
Open a command window and allow the user to browse
through the reverse search history. (See page 64.)
Begin recording keys in register {character}
(character is a-z). Stop recording with a q command.
(See page 55.)
Enter ex mode. (See page 158.)
Replace count characters with the given character.
(See pages 54, 55, 277.)

[count]R{text}<Esc>

[count]s
[count]S
[count]t{char}
[count]T{char}
u
U
v
V
[count]w

Enter replace mode and replace each character in the


file with a character from {text}. If a [count] is
specified, repeat the command [count] times. (See
page 275.)
Delete [count] characters and enter insert mode. (See
page 272.)
Delete [count] lines and enter insert mode. (See page
272.)
Search forward for character {char} on the current
line. Stop one before the character. (See page 45.)
Search backward for character {char} on the current
line. Stop one after the character. (See page 45.)
Undo the last change. (Same as: <Undo>.) (See page
34, 283.)
Undo all the changes on the last line edited. (A second
U redoes the edits.) (See page 34, 308.)
Start visual character mode. (See pages 49, 51, 53, 71,
76, 99, 100, 103, 103, 129, 369.)
Start visual line mode. (See pages 71, 74, 100, 121,
139, 233, 233, 233, 234, 361.)
Move count words forward. (Same as: <S-Right>.)
(See pages 42, 49, 49, 51.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 621

Draft Not for publication

Draft 0.1

Not for widespread publication

Move count WORDS forward. (Same as: <C-Right>.)


(See page 260.)
["[register}] [count]x
Delete [count] characters. (Default = 1.) Deleted text
goes into {register} or the unnamed register if no
register specification is present. (Same as: <Del>.)
(See pages 33 , 36, 69, 229, 273.)
["{register}][count]X
Delete the characters before the cursor. (See pages
273.)
xp
Exchange the character under the cursor with the next
one. Useful for turning "teh" into "the". (See pages 70,
229.)
["{register}] y{motion}
Yank the text from the current location to {motion} into
the register named {register}. Lowercase register
specifications cause the register to be overwritten by
the yanked text. Uppercase register specifications
append to the contents of the register. (See pages 74,
75, 103, 232.)
["{register}][count]Y
-or ["{register}] [count]yy
-or [count]["{register}] yy
Yank [count] lines into the register named {register}.
Lowercase register specifications cause the register to
be overwritten by the yanked text. Uppercase register
specifications append to the contents of the register.
(See pages 74, 76, 103, 306, 308.)
z{height}<CR>
Make the window {height} lines high. (See page 225.)
[count]z<CR>
(Same as: z<Enter>, see next entry..)
[count]z<Enter>
Position the line count at the top of the screen. If no
[count] is specified, the current line is used. Cursor is
positioned on the first nonblank character after this
command. (Same as: z:<CR>. See page 269.)
[count]z<Left>
Scroll the screen [count] characters to the right.
(Same as: zh. See page 237.)
[count]z<Right>
Scroll the screen [count] characters to the left. (Same
as: zl. See page 326.)
[count]zPosition the line [count] at the bottom of the screen. If
no [count] is specified, the current line is used. Cursor
is positioned on the first nonblank character after this
command. (See page 269.)
[count]z.
Position the line [count] at the middle of the screen. If
[count]W

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 622

Draft Not for publication

[count]z=

za
zA
[count]zb

zc
zC
zd
zD
zE
zf{motion}
[count]zF
[count]zg

zG

[count]zh
zi
[count] zj

[count] zk

[count]zl

Draft 0.1

Not for widespread publication

no [count] is specified, the current line is used. Cursor


is positioned on the first nonblank character after this
command. (See pages 270.)
Display a list of suggested corrections for the
misspelled word under the cursor. If [count] is
present, automatically the [count] entry from the list.
(See page 182.)
Open a fold if it's closed. Close it if it's open. Works on
a single level of folding. (See page 385.)
Open a fold if it's closed. Close it if it's open. Works on
a all levels of folding. (See page 385.)
Position the line [count] at the bottom of the screen. If
no [count] is specified, the current line is used. Cursor
is positioned on the same column after this command.
(See page 269.)
Close one fold at the cursor. (See page 123, 385.)
Close all folds at the cursor. (See page 385.)
Delete the current fold. (See page 385.)
Delete the current fold and all nested folds. (See page
385.)
Open all the folds current visible in the window. (See
page 385.)
Create a fold. (See page 121, 383.)
Create a fold starting at the cursor and containing
[count] lines. (See page 385.)
Add the word under the cursor to the list of good words.
If a [count] is specified, add it to the [count] word
file. (See page 183.)
Add the word under the cursor to the internal list of
good words. This list is temporary and is not stored
between sessions. (See page 184.)
Scroll the screen [count] character to the right. (Same
as z<Left>. See page 326.)
Invert 'foldenable'. If this option is set, folding is
allowed, if not all text is displayed. (See page 386.)
Move down to the start of the next fold. The [count]
parameter tells Vim how many folds to move down.
(See page 386.)
Move up to the end of the previous fold. The [count]
parameter tells Vim how many folds to move up. (See
page 386.)
Scroll the screen count character to the left. (Same as
z<Right>. See page 326.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 623

Draft Not for publication


zm
zM
zn
zN
zo
zO
zL
ZQ
zr
zR
[count]zt

[count]zug

zuG
[count]zuw

zuW
zv
[count]zw

zW

zX
ZZ

Draft 0.1

Not for widespread publication

Increase the folding by one level, but subtracting one to


'foldlevel'. (See page 123.)
Open all folds by setting the 'foldelevel' to 0. (See
page 124.)
Turn off 'foldenable' opening all folds. (See page
386.)
Turn on 'foldenable' causing all folds to return to the
current open / closed state. (See page 386.)
Open a fold at the cursor. (See page 122, 122, 385,
385.)
Open all folds under the cursor. (See page 385.)
Move the screen screen-full left. (See page 326.)
Abandon the file discarding all edits. (Same as :quit!.)
(See page 284.)
Decrease the folding by one level, but adding one to
'foldlevel'. (See page 123.)
Remove all folding by setting 'foldlevel' to the
highest fold level. (See page 124.)
Position the line count at the top of the screen. If no
[count] is specified, the current line is used. Cursor is
positioned on the same column after this command.
(See pages 269.)
Remove the word under the cursor from the good list.
If a [count] is specified, remove it from the [count]
word file. (See page 184.)
Remove the word under the cursor from the internal
good list. (See page 184.)
Remove the word under the cursor from the wrong list.
If a [count] is specified, remove it from the [count]
word file. (See page 184.)
Remove the word under the cursor from the internal
wrong list. (See page 184.)
Undo enough folds to make the line the cursor is on
visible. (See page 123.)
Add the word under the cursor to the list of wrong
words. If a [count] is specified, add it to the [count]
word file. (See page 184.)
Add the word under the cursor to the internal list of
good words. This list is temporary and is not stored
between sessions. (See page 184.)
Clear all manually opened and closed folds. (See page
123.)
Write file and exit. (See pages 35, 38, 96, 221, 239.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 624

Draft Not for publication


14422

Draft 0.1

Not for widespread publication

Motion Commands
[count]a"
[count]a'
[count]a(
[count]a)
[count]a<]
[count]a>
[count]a[
[count]a]
[count]a`
[count]a{
[count]a}
[count]ab
[count]aB
[count]ap
[count]as
[count]aw
[count]aW
[count]at
[count]i"
[count]i'
[count]i(
[count]i)
[count]i<
[count]i>
[count]i[
[count]i]
[count]i`
[count]i{
[count]i}
[count]ib
[count]iB
[count]ip
[count]is

Select matching "" pair, including the "". (See page 350.)
Select matching '' pair, including the ''. (See page 350.)
From with text enclosed in (), select the text up to and
including the (). (See page 350.)
Select matching <> pair, include the <>. (See page 350.)
Select matching [] pair, include the []. (See page 350.)
Select matching `` pair, including the ``. (See page 350.)
Select matching {} pair, including the {}. (See page 350.)
From with text enclosed in (), select the text up to and
including the (). (See page 350.)
Select matching {} pair, including the {}.
Select a paragraph and the following space. (See page 350.)
Select a sentence (and spaces after it). (See page 350.)
Select a word and the space after it. (Word is defined by the
'iskeyword' option . (See page 349, 350.)
Select a word and the space after it. (Word is defined to be
any series of printable characters.) (See page 350.)
Select the enclosing XML tag block ( <foo> ... </foo>)
including the tags. (See 350.)
Select matching "" pair, not including the "". (See page
350.)
Select matching '' pair, not including the ''. (See page 350.)
From with text enclosed in (), select the text up to but not
including the (). (See page 350.)
Select matching <> pair, excluding the <>. (See page 350.)
Select matching [] pair, excluding the []. (See page 350.)
Select matching `` pair, not including the ``. (See page
350.)
Select matching {} pair, excluding the {}. (See page 122,
129.)
From with text enclosed in (), select the text up to but not
including the (). (See page 350.)
Select matching {} pair, excluding the {}. (See page 350.)
Select a paragraph only. (See page 175, 350.)
Select the sentence only. Do no select whitespace after a
sentence. (See page 350.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 625

Draft Not for publication


[count]it
[count]iw

[count]iW

Draft 0.1

Not for widespread publication

Select the enclosing XML tag block ( <foo> ... </foo>)


excluding the tags. (See page 350.)
Select inner word (the word only). (Word is defined by the
'iskeyword' option.) (See page Error: Reference source not
found349, 350.)
Select inner word (the word only). (Word is defined to be any
series of printable characters.) (See page 350.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 626

Draft Not for publication

Draft 0.1

Not for widespread publication

Appendix D: Command-Mode Commands

14423
:!

:!{cmd}
Execute shell command.
(See page 440.)

:!!

:!!
Repeat last :!{cmd}.
(See page 440.)

:#

:[range] #
Print the lines with line numbers.
(See page 427.)

:&

:[count] &
Repeat the last :substitute command on the next [count] lines.
(Default = 1.)

:&

(See page 429.)


cmd-zm(7-1)

:[range] & [flags] [count]

Repeat the last substitution with a different [range] and [flags].


(See page 429.)
:*

[line] *{register}
Execute the contents of the {register} as an ex-mode command.
(Same as: :@.) (See page 438.)

:<

:[line] < {count}


Shift lines left.
(See page 439.)

:=

:=
Print line number.
(See page 437.)

:>

:[line] > {count}


Shift lines right.
(See page 439.)

:@

:[line] @{register}
Go to line and execute {register} as a command. (Same as: :*.)
(See page 438.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 627

Draft Not for publication

Draft 0.1

Not for widespread publication

:@:

:[line] @:
Repeat the last command-mode command.
(See page 438.)

:@@

:[line] @@
Repeat the last :@{register} command.
(See page 438.)

:~

:[range]~ {flags} {count}


Repeat the last substitution, but the last search string as the {from}
pattern instead of the {from} from the last substitution.
(See page 431.)

:a

:[line] a
Insert text after the specified line. (Default = current.)
(Same as: :append.) (See page 426.)

:ab

:ab
List all abbreviations. (Same as: :abbreviate.)
(See pages 148, 414.)

:ab

:ab {lhs} {rhs}


Define an abbreviation. When {lhs} is entered, put {rhs} in the
text. (Same as :abbreviate.)

(See page 147, 156, 237, 413.)


:abbreviate

:abbreviate

List all abbreviations. (Same as: :ab.)


( See pages 148, 414.)
:abbreviate

:abbreviate {lhs} {rhs}

Define an abbreviation. When {lhs} is entered, put {rhs} in the


text. (Same as :ab.) (See pages 147, 156, 237, 413.)
:abc

:abc

:abclear

:abclear
Remove all abbreviations.
(See page 413.)

:abo

:abo {cmd}

:aboveleft

:aboveleft {cmd}
Execute the Vim command {cmd}. If the command splits a window,
the window is opened above the current one or to its left (overriding
any any split options that are currently set.) (Same as :lefta,

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 628

Draft Not for publication

Draft 0.1

Not for widespread publication

:leftabove)
(See page 342.)
:al

:[count] al

:all

:[count] all
Open a window for all the files being edited. When a [count] is
specified, open up to [count] windows. (Note that the [count] can
be specified after the command, such as ":all [count].) (Same as
:sal, :sall.)
(See page 335.)

:am

:[priority] am {menu-item} {command-string}

:amenu

:{priority amenu {menu-item} {command-string}


Define a menu item that's that is valid for all modes .
(See page 461.)
The following characters are automatically inserted for some modes:
Mode
Prefix Character
Meaning
Inserted

Normal

(Nothing)

?N/A

Visual

<Esc>

Exit visual mode

Insert

CTRL-O

Execute one normal command.

Command Line

CTRL-C

Exit command-line mode

Operator pending mode <ESC>

End operator-Pending

:{priority} an {menu-item} {command-string}

:an
:anoremenu

:{priority} anoremenu {menu-item} {command-string}


Perform a :amenu command in which the {command-string} is not
remapped.
(See page 466.)

:append

:[line] append
Insert text after the specified line. (Default = current). (Same as:
:a.)
( See page 426.)

:ar

:ar
List the files being edited. The name of the current file is enclosed in
square brackets ([]). (Same as :args.)
(See page 78, 242, 311, 313.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 629

Draft Not for publication

Draft 0.1

:arga

Not for widespread publication


:[count]arga {file}

:argadd

:[count]argadd {file}
Add the {file} to the argument list. If [count] is given, the {file}
will be added after the [count] parameter. If no [count] is
specified, the {file} will be added after the current file.
(See page 314.)

:argd

:argd {pattern}

:argdelete
:argadelete {pattern}
Delete all the files which match {pattern} from the argument list.
(See page 314.)
:argd

:{range}argd

:argdelete:

:{range}argadelete

Delete all the files specified {range} from the argument list.
(See page 314.)
:argdo

:argdo[!] {cmd}
Execute the command {cmd} for each argument on the argument list.
(See page 78.)

:arge

:arge[!] [++opt] [+cmd] {file-name}

:argedit

:argedit[!] [++opt] [+cmd] {file-name}


A combination of :argadd and :edit. Add a file to the argument list
(if it's not already there and then edit it.)
(See page 314.)

:argg

:argg[!] [++opt] [+cmd] {file-list}

:argglobal

:argglobal[!] [++opt] [+cmd] {file-list}


Define a new global argument list and use it for this window. If a
{file-list} is not specified, use the existing global argument list.
(See page 315.)

:arg

:argl[!] [++opt] [+cmd] {file-list}

:arglocal

:arglocal[!] [++opt] [+cmd] {file-list}


Define a new local argument list and use it for this window. If a
{file-list} is not specified, use the existing global argument list,
but make a local copy.
(See page 315.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 630

Draft Not for publication

Draft 0.1

Not for widespread publication

:args

:args
List the files being edited. The name of the current file is enclosed in
square brackets ([]). (Same as: :ar.)
(See pages 79, 313.)

:args

:args {file-list}
Change the list of files to {file-list} and start editing the first one.
(Same as: :ar.)
(See page 78, 242, 311, 313.)

:argu

:argu {number}

:arguement
:argument {number}
Edit the {number} file in the file list. _
(See page 312.)
:as

:as

:ascii

:ascii
Print the number of the character under the cursor. (Same as: ga.)
(See page 223.)

:au

:au
List all the autocommands. (Same as: :autocmd.)
(See page 206.)

:au

:au {group} {event} {pattern}


Lists the autocommands that match the given specification. If * is
used for the event, all events will match.

:au

(See pages 155.)


:au {group} {events} {file_pattern} nested {command}
Define an autocommand to be executed when one of the {events}
happens on any files that match {pattern}. The group parameters
enables you to put this command in a named group for easier
management. The nested flag allows for nested events. (Same as
:autocmd.)
(See page 116, 201, 201, 205, 590.)

:au

:au !
Delete all the autocommands. (Same as :autocmd!)
(See page 207.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 631

Draft Not for publication


:au

Draft 0.1

Not for widespread publication

:au! {group} {event} {pattern} nested {command}


Remove any matching autocommands and replace them with a new
version.
(See page 207.)

:aug

:aug {name}

:augroup

:augroup {name}
Start an autocommand group. The group ends with a :augroup END
statement.
(See page 201.)

:aun

:aun {menu-item}

:aunmenu

:aunmenu {menu-item}
Remove the menu item named {menu-item} that was defined with an
:amenu command. The wildcard * will match all menu items. (Same
as: :aun.)
(See page 466.)

:autocmd

:autocmd
List all the autocommands. (Same as: :au.)
(See page 206.)

:autocmd

:autocmd {group} {event} {pattern}


Lists the autocommands that match the given specification. If * is
used for the event, all events will match. (Same as: :au.)

:autocmd

(See pages 155, 201, 201.)


:autocmd {group} {events} {file_pattern} [nested] {command}
Define an autocommand to be executed when one of the {events}
happens on any files that match {pattern}.The group parameters
enables you to put this command in a named group for easier
management. The nested flag allows for nested events. (Same as
:au.)
(See pages 116, 146, 205, 590.)

:autocmd

:autocmd !
Delete all the autocommands. (Same as :au!)
(See page 207.)

:autocmd

:autocmd! {group} {event} {pattern}


Remove the specified autocommands. (Same as :au!)
(See page 207.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 632

Draft Not for publication


:autocmd

Draft 0.1

Not for widespread publication

:autocmd! {group} {event} {pattern} [nested] {command}


Remove any matching autocommands and replace them with a new
version.
(See page 207.)

:b

:[count] b[!]
Switch the current window to buffer number count. (If a count is not
specified, the current buffer is used.) If ! is specified, if the switch
abandons a file, any changes might be discarded.
(An alternative version of this command has count at the end--for
example, :buffer 5.) (Same as: :buffer.)
(See page 92.)

:b

:b[!] {file-name}
Switch the current window to the buffer containing {file-name}. If
! is specified, if the switch abandons a file, any changes might be
discarded. (Same as: :buffer.)
(See page 92.)

:ba

:[count] ba
Open a window for each buffer. If a count is specified, open at most
count windows. (Same as: :ball, :sba, :sball.)
(See page 339.)

:bad

:bad [+line] {file}

:badd

:badd [+line] {file}


Add the file to the buffer list. If a +line is specified, the cursor will
be positioned on that line when editing starts.
(See page 338.)

:ball

:[count] ball
Open a window for each buffer. If a count is specified, open at most
count windows. (Same as: :ba, :sba, :sball.)
(See page 339.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 633

Draft Not for publication

Draft 0.1

Not for widespread publication

:bd

:bd[!] {file}

:bdelete

:bdelete[!] {file}
:[n] bd[!]
:[n] bdelete[!]
:[n,m] bd[!]
:[n,m] bdelete[!]
:bd[!] [n]
:bdelete[!] [n]
Delete the specified buffer, but leave it on the buffer list. (Reclaims
all the memory allocated to the buffer and closes all windows
associated with.) If the override option (!) is specified, any changes
made are discarded. If {file} is specified, the buffer for that file is
deleted. A buffer number [n] or a range of buffer numbers [n,m]
can be specified as well.
(See page 338.)

:be

:be {mode}

:behave

:behave {mode}
Sets the behavior of the mouse. The {mode} is either xterm for X
Windows System-style mouse usage or mswin for Microsoft Windowsstyle usage.
(See page 168.)

:bel

:bel {cmd}

:belowright

:belowright {cmd}

Execute the Vim command {cmd}. If the command splits a window,


the window is opened below the current one or to its right
(overriding any any split options that are currently set.)
(See page 342.)
:bf

:bf[!]

:bfirst

:bfirst[!]
Go to the first buffer in the list. (Same as: :brewind, :br.)
(See page 93.)

:bl

:bl[!]

:blast

:blast[!]
Go to the last buffer in the list. (Same as: :bl.)
(See page 93.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 634

Draft Not for publication

Draft 0.1

Not for widespread publication

:bm

:bm [count]

:bmodified

:bmodified [count]
Go to count-modified buffer. (Same as: :bm.)
(See page 93.)

:bn

:[count] bn[!]
Go to the next buffer. If ! is specified, if the switch abandons a file,
any changes might be discarded. If a [count] is specified, go to the
[count] next buffer. (Same as: :bnext.)
(See page 93.)

:bN

:[count] bN[!]
Go to previous buffer. If a [count] is specified, go to the [count]
previous buffer. (Same as: :bNext, :bp, :bprevious.)
(See page 93.)

:bnext

:[count] bnext[!]
Go to the next buffer. If ! is specified, if the switch abandons a file,
any changes might be discarded. If a [count] is specified, go to the
[count] next buffer.
(See page 93.)

:bNext

:[count] bNext[!]
Go to previous buffer. If a [count] is specified, go to the [count]
previous buffer. (Same as: :bN, :bNext, :bp, :bprevious.)
(See page 93.)

:bo

:bo {cmd}

:botright

:botright {cmd}
Execute the Vim command {cmd}. If the command splits a window
horizontally, a new full width window is created at the bottom of the
screen. Commands that cause a vertical split create a full height
window at the right of the screen. This overrides any any split
options that are currently set.
(See page 342.)

:bp

:[count] bp

:bprevious

:[count] bprevious
Go to previous buffer. If a [count] is specified, go to the [count]
previous buffer. (Same as: :bN, :bNext, :bf, :bfirst.)
(See page 93.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 635

Draft Not for publication

Draft 0.1

Not for widespread publication

:br

:br[!]
Go to the first buffer in the list. (Same as: :brewind, :bf,
:bfirst.)
(See page 93.)

:brea

:brea

:break

:break
Break out of a loop.

(See page 490.)


:breaka file

:breaka file [line] {file-name}

:breakadd file

:breakadd file [line] {file-name}

Set a breakpoint that will be triggered when the specified file is read
by a :source command. If [line] is specified, stop on that line,
otherwise stop on the first line.
(See page 499.)
:breaka func
:breakadd func

:breaka func [line} {function-name}


:breakadd func [line} {function-name}

Create a breakpoint in the specified {function-name}. If no [line]


is specified, the breakpoint will be set at the start of the function,
otherwise it is set at the specified line.
(See page 497, 498.)
:breaka here

:breaka here

:breakadd here

:breakadd here

Add a breakpoint at the current file and line.


(See page 499.)
:breakd

:breaka {number}

:breakdel

:breakadd {number}
Delete a breakpoint specified by number. The special number *
(star) deletes all breakpoints.

(See page 499.)


:breakd file
:breakdel file

:breakd file [line] {file-name}


:breakdel file [line] {file-name}

Delete a file type breakpoint.


(See page 499.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 636

Draft Not for publication

Draft 0.1

:breakd func
:breakdel func

Not for widespread publication

:breakd func [line} {function-name}


:breakdel func [line} {function-name}

Delete function breakpoint.


(See page 499.)
:breakd here
:breakdel here

:breakd here
:breakdel here

Delete a breakpoint at the current location.


(See page 499.)
:breakl

:breakl

:breaklist

:breaklist
List breakpoints.
(See page 498.)

:brewind

:brewind[!]
Go to the first buffer in the list. (Same as: :br, :bf, :bfirst.)
(See page 93.)

:bro

:bro {command}
Open a file browser window and then run {command} on the chosen
file. (Same as: :browse.)
(See page 468.)

:bro set

:bro set
Enter an option browsing window that enables you to view and set all
the options. (Same as: :browse set, :opt, :options.)
(See page 472.)

:browse

:browse {command}
Open a file browser window and then run {command} on the chosen
file. (Same as: :bro.)

(See page468.)
:browse set

:browse set

Enter an option browsing window that enables you to view and set all
the options. (Same as: :bro set, :opt, :options.)
(See page 472.)
:buffer

:[count] buffer[!]
Switch the current window to buffer number [count]. (If a [count]
is not specified, the current buffer is used.) If ! is specified, if the
switch abandons a file, any changes might be discarded. (An

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 637

Draft Not for publication

Draft 0.1

Not for widespread publication

alternative version of this command has [count] at the end--for


example, :buffer 5.) (Same as: :b.)
(See page 92.)
:buffer

:buffer[!] {file-name}
Switch the current window to the buffer containing {filename}. If !
is specified, if the switch abandons a file, any changes might be
discarded. (See page 92.)

:buffers
List all the specified buffers. (Same as: :files, :ls.)
(See pages 90.)
:bun

:bun[!] {file}

:bun

:[n]bun[!]

:bun

:[n,m]bun[!]

:bun

:bun[!] [n]-

:bunload

:bunload[!] {file}

:bunload

:[n]bunload[!]

:bunload

:[n,m]bunload[!]

:bunload

:bunload[!] [n]
Unload the specified buffer. If the override option is specified, if
there are any changes, discard them.
(See page 338.)

:bw

:bw[!] {file}

:bw

:[n]bw[!]

:bw

:[n,m]bw[!]

:bw

:bw[!] [n]-

:bwipeout

:bwipeout[!] {file}

:bwipeout

:[n]bwipeout[!]

:bwipeout

:[n,m]bwipeout[!]

:bwipeout

:bwipeout[!] [n]
Wipeout the the specified buffer. If the override option is specified, if
there are any changes, discard them. This is similar to unloading a
buffer, but everything about the buffer disappears.
(See page 339.)

:c

:[range] c
Delete the specified lines, and then do a :insert. (Same as:

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 638

Draft Not for publication

Draft 0.1

Not for widespread publication

:change, :t.)
(See page 424, 439.)
:ca

:ca {lhs} {rhs}

:cabbrrev

:cabbrrev {lhs} {rhs}


Define an abbreviation for command-mode only.
(See page 414.)

:cabc

:cabc

:cabclear

:cabclear
Remove all for command mode.
(See page 414.)

:cad

:cad [buffer-number]

:caddbuffer

:caddbuffer [buffer-number]

Adds the contents of the buffer to the quick fix list. If not buffer is
specified the current one is used.
(See page 399, 401.)
:cadde

:cadde[!] {expression}

:caddexpr

:caddexpr[!] {expression}
Add the results of {expression} to the quick fix buffer.
(See page 399, 401.)

:caddf

:caddf[!] {file}

:caddfile

:caddfile[!] {file}
Add the contents of {file} to the quick fix buffer.
(See page 399, 399, 400.)

:cal

:[range] cal {name}({argument list})

:call

:[range] call {name}({argument list})


Call a function.
(See page 494.)

:cat

:cat /{pattern}/

:catch

:catch /{pattern}/
Catch an exception. If no /{pattern}/ is specified, all exceptions
will be caught.
(See page 491.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 639

Draft Not for publication

Draft 0.1

:cb

Not for widespread publication


:cb [buffer-number]

:cbuffer

:cbuffer [buffer-number]
Replace the contents of the quick fix list with the current buffer. If
not buffer is specified the current one is used.
(See page 399, 400.)

:cc

:cc[!] [number]
Display error number. If the [number] is omitted, display the
current error. Position the cursor on the line that caused it.
(See page 400.)

:ccl

:ccl

:cclose

:cclose
Close the quick fix window.
(See page 401.)

:cd

:cd [path]
Change the directory to the specified path. If path is -, change the
previous path. If no path is specified, on UNIX go to the home
directory. On Microsoft Windows, print the current directory. (Same
:chd, :chdir.)
(See page 435.)

:ce

:[range] ce [width]

:center

:[range] center [width]


Center the specified lines. If the width of a line is not specified, use
the value of the 'textwidth'. (If 'textwidth' is 0, 80 is used.)
(See page 175.)

:cex

:cex[!] {expr}

:cexpr

:cexpr[!] {expr}
Create a quick fix list from {expr}.
(See page 399, 401.)

:cf

:cf[!] [errorfile]

:cfile

:cfile[!] [errorfile]
Read an error list from file. (Default = the file specified by the
'errorfile' option.) Go to the first error. If the override option is
specified and a file switch is made, any unsaved changes might be
lost.
(See page 399, 399, 400.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 640

Draft Not for publication

Draft 0.1

:cfir

Not for widespread publication


:cfir[!] [number]

:cfirst

:cfirst[!] [number]
Go the first error in the list. If a number is specified, display that
error. (Same as :cr, :crewind.)
(See page 141, 144, 400.)

:cg

:cg[!] [error-file]
Create a quick fix list from the contents of [error-file] but do not
jump to the first error. (Sames as :cgetfile)
(See page 399, 400.)

:cgetb

:cgetb [buffer-number]

:cgetbuffer

:cgetbuffer [buffer-number]

Create a quick fix list from [buffer-number] but do not jump to the
first error. If no [buffer-number] is specified, the current one is
used.
(See page 399, 401.)
:cgete

:cgetx {expr}

:cgetexpr

:cgetexpr {expr}
Create a quick fix list from {expr} but do not jump to the first error.
(See page 399, 400, 401.)

:cgetfile

:cgetfile[!] [error-file]
Create a quick fix list from the contents of [error-file] but do not
jump to the first error. (Sames as :cgetfile)
(See page 399.)

:change

:[range] change
Delete the specified lines, and then do an :insert. (Same as: :c. )
(See page 439.)

:changes

:changes
Print the change list.
(See page 264.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 641

Draft Not for publication

Draft 0.1

:chd

Not for widespread publication


:chd [path]

:chdir

:chdir [path]
Change the directory to the specified path. If path is -, change the
previous path. If no path specified, on UNIX go to the home
directory. On Microsoft Windows, print the current directory. (Same
as :cd)
(See page 435.)

:che

:che[!]

:checkpath

:checkpath[!]
Check all the #include directives and make sure that all the files
listed can be found. If the override option (!) is present, list all the
files. If this option is not present, only the missing files are listed.
(See page 395, 398.)

:cl

:cl[!] [from], [to]


List out the specified error messages. If the override option is
present, list out all the errors. (Same as: :clist.)
(See page 143, 401.)

:cla

:cla [number]

:clast

:clast [number]
Go the last error in the list. If a number is specified, display that
error.
(See page 141, 144, 400.)

:clist

:clist[!] [from], [to]


List out the specified error messages. If the override option is
present, list out all the errors. (Same as: :cl.)
(See page 143, 401.)

:clo

:clo[!]

:close

:close[!]
Close a window. If this is the last window, exit Vim. The command
fails if this is the last window for a modified file, unless the force (!)
option is present. (Same as: CTRL-Wc.)
(See page 84.)

:cm

:cm
Listing all the mappings for command-line mode maps. (Same as:
:cmap.)
(See page 415, 418, 420.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 642

Draft Not for publication

Draft 0.1

Not for widespread publication

:cm

:cm {lhs}
List the command-line mapping of {lhs}. (Same as: :cmap.)
(See page 415, 420.)

:cm

:cm {lhs} {rhs}


Define a keyboard mapping for command-line mode. (Same as:
:cmap.)
(See page 415, 420.)

:cmap

:cmap
Listing all the command-line mode mappings. (Same as: :cm.)
(See page 415, 418, 420.)

:cmap

:cmap {lhs}
List the command-line mode mapping of {lsh}. (Same as: :cm.)
(See page 415, 420.)

:cmap

:cmap {lhs} {rhs}


Define a keyboard mapping for command-line mode. (Same as: :cm.)
(See page 415, 420:d(25-1).)

:cmapc

:cmapc-

:cmapclear

:cmapclear
Clear all the command-mode mappings.
(See page 420.)

:cme
:cmenu

:[priority] cme {menu-item} {command-string}


:[priority] cmenu {menu-item} {command-string}
Define a menu item that is available for command-line mode only.
The priority determines its placement in a menu. Higher numbers
come first. The name of the menu item is {menu-item}, and when
the command is selected, the command {command-string} is
executed.
(See page 460.)

:cn

:[count] cn[!]
Go to the [count] next error. (Same as: :cnext.)
(See pages 242, 400.)

:cN

:[count] cN[!]
Go the previous error in the error list. (Same as: :cNext, :cp,
:cprevious.)
(See page 242, 400.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 643

Draft Not for publication

Draft 0.1

Not for widespread publication

:cnew

:cnew [count]

:cnewer

:cnewer [count]
Go to the [count] newer error list.
(See page 398, 401.)

:cnext

:[count] cnext[!]
Go to the [count] next error. (Same as: :cn.)
(See pages 242, 400.)

:cNext

:[count] cNext[!]
Go the previous error in the error list. (Same as: :cN, :cp,
:cprevious.)
(See page 242, 400.)

:cnf

:[count] cnf[!]
Go the first error in the next file. If the override option (!) is present,
if there are any unsaved changes, they will be lost.
(See page 400.)

:cNf

:[count] cNf[!]
Go the first last in the previous file. If the override option (!) is
present, if there are any unsaved changes, they will be lost.
(See page 400.)

:cnfile

:[count] cnfile[!]
Go the first error in the next file. If the override option (!) is present,
if there are any unsaved changes, they will be lost.
(See page 400.)

:cNfile

:[count] cNfile[!]
Go the last error in the previous file. If the override option (!) is
present, if there are any unsaved changes, they will be lost.
(See page 400.)

:cno

:cno {lhs} {rhs}


Same as :cmap, but does not allow remapping of the {rhs}. (Same
as: :cnoremap.)
(See page 420.)

:cnorea

:cnorea {lhs} {rhs}

:cnoreabbr

:cnoreabbr {lhs} {rhs}


Do a :noreabbrev that works in command-mode only.
(See page 414, 420.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 644

Draft Not for publication

Draft 0.1

:cnoremap

Not for widespread publication


:cnoremap {lhs} {rhs}

Same as :cmap, but does not allow remapping of the {rhs}. (Same
as: :cno.
:cnoreme

(See page 420.)


:[priority] cnoreme {menu-item} {command-string}

:cnoremenu

:[priority] cnoremenu {menu-item} {command-string}


Like :cmenu, except the {command-string} is not remapped.
(See page 466.)

:co

:[range] co {address}
Copy the range of lines below {address}. (Same as: :copy, :t.)
(See page 424.)

:col

:col [count]

:colder

:colder [count]
Go to the [count] older error list.
(See page 398, 401.)

:colo

:colo {name}

:colorscheme

:colorscheme {name}

Load the color scheme {name}.


:com

:com
List the user-defined commands. (Same as: :command.)
(See page 502.)

:com

:com {definition}
Define a user-defined command. (Same as: :command.)
(See pages 502.)

:comc

:comc

:comclear

:comclear
Clear all user-defined commands.
(See page 503.)

:command

:command
List the user-defined commands. (Same as: :com.)
(See page 502.)

:command

:command {definition}
Define a user-defined command. (Same as: :com.)
(See page 502.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 645

Draft Not for publication

Draft 0.1

Not for widespread publication

:con

:con {command}
Start a loop over. (Same as: :continue.)
(See page 490.)

:conf

:conf {command}

:confirm

:confirm {command}
Execute the {command}. If this command would result in the loss of
data, display a dialog box to confirm the command.
(See page 471.)

:continue

:continue
Start a loop over. (Same as: :con.)
(See page 490.)

:cope

:cope [height]

:copen

:copen [height]
Open a window for the quick fix list. If [height] is specified, use it
as the window height.
(See page 145, 401.)

:copy

:[range] copy {address}


Copy the range of lines below {address}. (Same as: :co, :t.)
(See page 424.)

:cp

:[count] cp[!]
Go to the [count] previous error. (Same as: :cpevious, :cN,
:cNext.)
(See pages 242, 400.)

:cpf

:[count]cpf[!]

:cpfile

:[count]cpfile[!]
Go to the last error in the previous file. If a [count] is specified, go
back that many files.
(See page 400.)

:cprevious

:
[count] cprevious[!]
Go to the [count] previous error. (Same as: :cp, :cN, :cNext.)
(See pages 242 400.)

:cq

:cq

:cquit

:cquit
Exit Vim with an error code. (This is useful in integrating Vim into an

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 646

Draft Not for publication

Draft 0.1

Not for widespread publication

IDE.)
(See page 143.)
:cr

:cr[!] [number]

:crewind

:crewind[!] [number]
Go the first error in the list. If a number is specified, display that
error. (Same as :cfir, :cfirst.)
(See page 141, 144, 400.)

:cs

:cs {arguments}

:cscope

:cscope {argument}
Handle various activities associated with the CScope program.
(See page 244.)

:cst

:cst {procedure}

:cstag

:cstag {procedure}
Go to the tag in the CScope database named {procedure}.
(See page 244.)

:cu

:cu {lhs}
Remove a command-mode mapping. (Same as: :cunmap.)
(See page 420.)

:cuna

:cuna {lhs}

:cunabbreviate

:cunabbreviate {lhs}

Remove the command-line mode abbreviation.


(See page 414, 420.)
:cunmap

:cunmap {lhs}
Remove a command-mode mapping. (Same as: :cu.)
(See page 420.)

:cunm

:cunm

:cunmenu

:cunmenu {menu-item}
Remove the command-mode menu item named {menu-item}.The
wildcard * will match all menu items.
(See page 466.)

:cw

:cw [height]

:cwindow

:cwindow [height]
If there are errors, open a quick fix window of the specified height. If
there are no errors, close the quick fix window.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 647

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 401.)


:d

:[range] d {register} [count]


Delete text. (Same as: :delete.)
(See page 421.)

:deb

:deb {command}

:debug

:debug {command}
Execute {command} in debug mode.
(See page 497.)

:debugg

:[0]debugg

:debuggreedy

:[0]debuggreedy

The :debugg command tells Vim to read debug commands from the
standard command stream instead of forcing all debug input to come
from the user. This is useful for starting a debug session with a
script. The :0debugg command cancels this feature and all future
debug input must come from the user.
(See page 500.)
:delc

:delc {command}

:delcommand

:delcommand {command}

Delete a user-defined command.


(See page 503.)
:delete

:[range] delete {register} [count]


Delete text. (Same as: :d.)
(See page 421.)

:delf

:delf {name}

:delfunction

:delfunction {name}

Delete the function named {name}.


(See page 495.)
:delm

:delm {marks}
Delete the specified {marks}. (Same as :delmarks.)
(See page 306.)

:delm

:delm!
Delete all marks. (Same as :delmarks.)
(See page 306.)

:delmarks

:delmarks {marks}
Delete the specified {marks}. (Same as :delm.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 648

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 306.)


:delmarks

:delmarks!
Delete all marks. (Same as :delm.)
(See page 306.)

:di

:di {list}
Display the registers. (Same as: :display, :reg, :registers.)
(See page 307.)

:dif

:dif
When in diff mode, update the list of differences between the files.
(Same as :diffupdate.)
(See page 379.)

:diffg

:[range]diffg [buffer-spec]

:diffget

:[range]diffget [buffer-spec]
Get a different from the other buffer. In other words, take the
change from the other buffer and put it in the current file.
(See page 380.)

:diffo

:diffo[!]

:diffoff

:diffoff[!]
Turn off diff mode for the current window. If the override (!) is
specified, turn off diff mode for all windows in the current tab.
(See page 380.)

:diffp

:diffp {patchfile}

:diffpatch
:diffpatch {patchfile}
Apply the diffs in the {patchfile} to the current buffer.
(See page 379.)
:diffpu

:[range]diffpu [buffer-spec]

:diffput

:[range]diffput [buffer-spec]
Put a different from the current buffer to the other one.
(See page 380.)

:diffs

:diffs {file-name}

:diffsplit

:
diffsplit {file-name}
Open a new window for the file {file-name}. Both windows will be
part of a difference set.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 649

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 379.)


:difft

:difft

:diffthis

:diffthis
Make this window part of the set of files being diffed.

(See page 379.)


:diffupdate

:diffupdate

When in diff mode, update the list of differences between the files.
(Same as :dif.)
(See page 379.)
:dig

:dig
List all the digraph definitions. (Same as: :digraphs.)
(See page 57.)

:dig

:dig {character1}{character2} {number}


Define a digraph. When is pressed, inset character whose number
CTRL-K{character1}{character2} is {number}.
(See page 278.)

:digraphs

:digraphs
List all the digraph definitions. (Same as: :dig.)
(See page 57.)

:digraphs

:digraphs {character1}{character2} {number}


Define a digraph. When CTRL-K{character1}{character2} is
pressed, insert character whose number is {number}.
(See page 278.)

:display

:display [arg]
Display the contents of the registers. (Same as :registers, :di. )
(See page 307.)

:dj

:[range] dj [count] /{pattern}/

:djump

:[range] djump [count] /{pattern}/


Search the range (default = whole file) for the definition of the macro
named {pattern} and jump to it. If a [count] is specified, jump to
the [count] definition. If the pattern is enclosed in slashes (/), it is a
regular expression; otherwise, it is the full name of the macro.
(See page 433.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 650

Draft Not for publication

Draft 0.1

:dl

Not for widespread publication


:[range] dl /{pattern}/

:dlist

:[range] dlist /{pattern}/


List the all the definitions of the macro named {pattern} in the
range. (Default = the whole file.) If the pattern is enclosed in
slashes (/), it is a regular expression; otherwise, it is the full name of
the macro.
(See page 434.)

:do

:do {group} {event} [file_name]


Execute a set of autocommands pretending that {event} has just
happened. If a group is specified, execute only the commands for
that group. If a filename is given, pretend that the filename is
file_name rather than the current file during the execution of this
command. (Same as: :doautocmd.)
(See page 202, 202, 204.)

:doautoa

:doautoa {group} {event} [file_name]

:doautoall
:doautoall {group} {event} [file_name]
Like :doautocmd, but repeated for every buffer.
(See page 202.)
:doautocmd

:
doautocmd {group} {event} [file_name]
Execute a set of autocommands, pretending that {event} has just
happened. If a group is specified, execute only the commands for
that group. If a [file_name] is given, pretend that the filename is
file_name rather than the current file during the execution of this
command. (Same as: :do.)
(See page 202, 202, 204.)

:dr

:dr {file} [file] ...

:drop

:drop {file} [file] ...


Edit the first file in the list. If the file is already in a window, then
switch to that window. If not attempt to open the file in the current
window. If switching files would cause changes in the current
window to be lost, split the current window and then edit the file.
(See page 315.)

:ds

:[range] ds /{pattern}/

:dsearch

:[range] dsearch /{pattern}/


List the first definition of the macro named {pattern} in the range.
(Default = the whole file.) If the pattern is enclosed in slashes (/), it

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 651

Draft Not for publication

Draft 0.1

Not for widespread publication

is a regular expression; otherwise, it is the full name of the macro.


(See page 434.)
:dsp

:[range] dsp [count] /{pattern}/

:dsplit

:[range] dsplit [count] /{pattern}/


Do a :split and a :djump.
(See page 434.)

:e

:e [+cmd] [file]
Close the current file and start editing the named file. If no file is
specified, re-edit the current file. If [+cmd] is specified, execute it as
the first editing command. (Same as: :edit.)
(See page 77.)

:ea

:ea {time}

:earlier

:earlier {time}
Go to an earlier text state. If {time} is specified as a count, then
count changes are undone. Time also can be specified as {n}s, then
the state will go back that many seconds. Time can also be specified
as {n}m for minutes, and {n}h for hours.
(See page 281.)

:ec

:ec {arguments}

:echo

:echo {arguments}
Print the arguments.
(See pages 480, 498.)

:echoe

:echoe {arguments}

:echoerr

:echoerr {arguments}
Print the arguments as an error message and save it in the message
history.
(See page 488, 492.)

:echoh

:echoh {name}

:echohl

:echohl {name}
Change the color of future echoes to be in the color of highlight
group {name}.
(See page 487.)

:echom

:echom {arguments}

:echomsg

:echomsg {arguments}
Print the arguments as a message and save it in the message history.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 652

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 488.)


:echon

:echon {arguments}
Echo the arguments without a newline.
(See page 487.)

:edit

:edit [+cmd] [file]


Close the current file and start editing the named file. If no file is
specified, re-edit the current file. If +cmd is specified, execute it as
the first editing command. (Same as: :e.)
(See page 77.)

:el

:el

:else

:else
Reverse the condition of an :if.
(See page 489.)

:elsei

:elsei

:elseif

:elseif
A combination of :else and :if.
(See page 489.)

:em

:em {menu-item}

:emenu

:emenu {menu-item}
Execute the given {menu-item} as if the user had selected it.
(See page 466.)

:en

:en
End an :if statement. (Same as: :endif.)
(See page 489.)

:endf

:endf
End a function. (Same as :endfunction.)
(See page 493.)

:endfo

:endfo

:endfor

:endfor
End a :for loop.

(See page 490.)


:endfunction

:endfunction

End a function. (Same as :endf.)


(See page 493.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 653

Draft Not for publication

Draft 0.1

Not for widespread publication

:endif

:endif
End an :if statement. (Same as: :en.)
(See page 489.)

:endt

:endt

:endtry

:endtry
End a :try block.
(See page 492.)

:endw

:endw

:endwhile

:endwhile
End a :while loop.
(See page 490.)

:ene

:ene[!]

:enew

:enew[!]
Start editing a new buffer.
(See page 77.)

:ex

:ex[!] [+command] [filename]


Enter ex mode. If a filename is specified, edit that file; otherwise,
use the current file. The +command argument is a single command
that will be executed before any editing begins. If the override
option (!) is specified, switching files will discard any changes that
have been made.

:ex

(See page Error: Reference source not found.)


:[range] ex[!] [file]
If the buffer has been modified, write the file and exit. If a range is
specified, write only the specified lines. If a file is specified, write
the data to that file. When the override option (!) is present, attempt
to overwrite existing files or read-only files.
(See page Error: Reference source not found.)

:exe

:exe {string}

:execute

:execute {string}
Execute a string as a command.
(See page 491.)

:exi

:[range] exi[!] [file]

:exit

:[range] exit[!] [file]


If the buffer has been modified, write the file and exit. If a range is

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 654

Draft Not for publication

Draft 0.1

Not for widespread publication

specified, write only the specified lines. If a file is specified, write


the data to that file. When the override option (!) is present, attempt
to overwrite existing files or read-only files. (Same as :xit, :x.)
(See page 444.)
:exu

:exu

:exusage

:exusage
Provides help on the ex mode commands. Included for compatibility
with Nvi. The :help command is much better for getting information
than this one.
(See page 225.)

:f

:f[!] [file]

:file

:file[!] [file]
Print the current filename. The override (!) option causes the short
version of the message to be printed.
If a file is specified, set the name of the current file to file. (Same as:
CTRL-G.)
(See pages 202, 436.)

:files
List all the specified buffers. (Same as: :buffers, :ls.)
(See page 90.)
:filet

:filet {on|off}

:filetype

:filetype {on|off}
Tell Vim to turn on or off the file type detection logic.
(See page 116.)

:fin

:fin[!] {+command} {file}


Edit a file like the :vi command, but searches for the file in the
directories specified by the path option. (Same as :find.)
(See page 394.)

:fina

:fina

:finally

:finally
This command starts the part of a try/catch block which is executed
after all other code.
(See page 492.)

:find

:find[!] {+command} {file}


Edit a file like the :vi command, but searches for the file in the
directories specified by the path option. (Same as :fin.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 655

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 394.)


:fini

:fini

:finish

:finish
Stop sourcing a script.
(See page 492.)

:fir

:fir

:first

:first
Edit the first file in the list. (Same as :rew, :rewind.)
(See pages 80, 242, 313.)

:fix

:fix

:fixdel

:fixdel
Make the <Delete> key do the right thing on UNIX systems.
(See page 150.)

:fo

:{range}fo

:fold

:{range}fold
Manually create a fold.
(See page 385.)

:foldc

:{range}foldc[!]

:foldclose

:{range}foldclose[!]
Close a fold. One level of folding is closed unless the override (!)
option is present, then all levels are closed.
(See page 385.)

:foldd

:[range]foldd {cmd}
(Fold Do Open) Execute the {cmd} for each line in the [range] which
is not folded. Much like :global only for open folds. (Same as
:folddoopen.)
(See page 386.)

:folddoc

:[range]folddoc {cmd}

:folddoclosed

:[range]folddoclosed {cmd}

(Fold Do Closed) Execute the {cmd} for each line in the [range]
which is folded. Much like :global only for closed folds.
(See page 386.)
:folddoopen

:[range]folddoopen {cmd}

(Fold Do Open) Execute the {cmd} for each line in the [range] which
is not folded. Much like :global only for open folds. (Same as
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 656

Draft Not for publication

Draft 0.1

Not for widespread publication

:foldd.)
(See page 386.)
:foldo

:[range]foldo[!]

:foldopen

:[range]foldopen[!]
Open one level of folding for all lines within the given [range]. If the
override option (!) is present, open all levels.
(See page 385.)

:for

:for {var} in {list}

:for

:for {var1}, {var2} ... in {list}


Start a loop. For scripting.
(See page 490.)

:fu

:fu
List all functions. (Same as: :function.)
(See page 495.)

:fu

:fu {name}
List the contents of function {name}. (Same as :function.)
(See page 495.)

:fu

:fu {function definition}


Start a function definition.
(See page 492.)

:function

:function
List all functions. (Same as: :fu.)
(See page 495.)

:function

:function {name}
List the contents of function {name}.
(See page 495.)

:function

:function {function definition}


Start a function definition.
(See page 492.)

:g

: [range] g /{pattern}/ {command}


Perform {command} on all lines that have {pattern} in them in the
given range. (Same as: :global.)
(See page 432.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 657

Draft Not for publication

Draft 0.1

:g!

Not for widespread publication

: [range] g! /{pattern}/ {command}


Perform {command} on all lines that do not have {pattern} in them in
the given range. (Same as :global!, :v, :vglobal.)
(See page 432.)

:global

:[range] global /{pattern}/ {command}


Perform {command} on all lines that have {pattern} in them in the
given range. (Same as: :g.)
(See page 432.)

:global!

:[range] global! /{pattern}/ {command}


Perform {command} on all lines that do not have {pattern} in them in
the given range. (Same as :g!, :v, :vglobal.)
(See page 432.)

:go

:go [count]

:goto

:goto [count]
Go to [count] byte of the file. If no [count] is specified, go to the
first byte of the file.
(See page 223.)

:gr

:gr {arguments}

:grep

:grep {arguments}
Run the grep program with the given {arguments} and capture the
output so that the :cc, :cnext, and other commands will work on it.
(Like :make, but with grep rather than make.)
(See pages 398, 406, 401.)

:grepa

:grepa {arguments}

:grepadd

:grepadd {arguments}
Like :grep, but add to the quick fix list instead of replacing it.
(See page 401.)

:gu
:gui
:gv
:gvim

:gu [+command] [-f|-b] [files...]


:gui [+command] [-f|-b] [files...]
:gv [+command] [-f|-b] [files...]
:gvim [+command] [-f|-b] [files...]
Start GUI mode. If a +command is specified, execute that after loading
the files. If the -b flag is specified, execute the command in the
background (the default).The -f flag tells Vim to run in the
foreground. If a list of files is specified, they will be edited;
otherwise, the current file is edited.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 658

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 446.)


:h

:h [topic]
Display help on the given topic. If no topic is specified, display
general help. (Same as: :help, <F1>, <Help>)
(See pages 37, 39, 41, 129, 130, 224.)

:ha

:[range]ha[!] [arguements]

:hardcopy

:[range]hardcopy[!] [arguments]
Send the lines in [range] to the printer. The [arguments], if
specified will be given to the print command. The override (!) option
will cause printing on Microsoft Windows to skip the printer selection
dialog and go directly to the default printer.
(See page 165.)

:ha

:[range]ha[!] >{file-name}

:hardcopy

:[range]hardcopy[!] >{file-name}
Send the lines in [range] to the a printable (PostScript) file. The
[arguments], if specified will be given to the print command. This
command does not work on Microsoft Windows, use the print to file
feature in the printer dialog instead.
(See page 445.)

:help

:help [topic]
Display help on the given topic. If no topic is specified, display
general help. (Same as: :h, <F1>, <Help>)
(See pages 37, 39, 41, 109, 129, 130, 224.)

:help!

:help!

:help 42

:help 42

:help holy-grail

:help hold-grail

These commands do something interesting. Not useful, but


interesting.
:helpf

:helpf

:helpfind

:helpfind
Open a dialog box that enables you to type in a help subject.
(See page 471.)

:helpg

:helpg {pattern} [@lang]

:helpgrep

:helpgrep {pattern} [@lang]


Search the help text for the given {pattern} and put the results in
the quick fix list. If @lang is included, limit results to that language.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 659

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 225.)


:helpt

:helpt {dir}

:helptags

:helptags {dir}
Generate the help tags. Useful for those of you rewriting the help
file. But if you're rewriting the help files you probably don't need this
book.
(See page 225.)

:hi

:hi
List all highlight groups. (Same as: :highlight.)
(See page 81, 488.)

:hi

:hi {options}
Customize the syntax coloration.
(See page 408.)

:hi link

:hi link {new-group} {old-group}


Highlight the {new-group} the same as {old-group}.
(See page 581.)

:hid

:hid

:hide

:hide
Hide the current buffer.
(See page 90, 94.)

:highlight
:highlight
List all highlight groups.
(See page 81, 488.)
:highlight
:highlight {options}
Customize the syntax coloration. (Same as: :hi.)
(See pages 408.)
:highlight link

:highlight link {new-group} {old-group}

Highlight the {new-group} the same as {old-group} .


(See page 581.)
:his
:history

:his {code} [first] ,[last]


:history {code} [first] ,[last]
Print the last few commands or search strings (depending on the
code). The code parameter defaults to cmd for command-mode

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 660

Draft Not for publication

Draft 0.1

Not for widespread publication

command history. The first parameter defaults to the first entry in


the list and last defaults to the last.
(See page 441.)
:i

:[line] i
Start inserting text before line. Insert ends with a line consisting of
just .. (Same as: :insert.)
(See page 426.)

:ia

:ia {lhs} {rhs}

:iabbrev

:iabbrev {lhs} {rhs}


Define an abbreviation for insert mode only.
(See page 414.)

:iabc

:iabc

:iabclear

:iabclear
Remove all for insert mode.
(See page 414.)

:if

:if {expression}
Start a conditional statement.
(See page 489.)

:ij

:[range] ij [count] /{pattern}/

:ijump

:[range] ijump [count] /{pattern}/


Search the range (default = whole file) for the {pattern} and jump
to it. If a [count] is specified, jump to the [count] occurrence. If
the pattern is enclosed in slashes (/), it is a regular expression;
otherwise, it is just a string.
(See page 432.)

:il

:[range] il /{pattern}/

:ilist

:[range] ilist /{pattern}/


List all the occurrences {pattern} in the range. (Default = the
whole file.) If the pattern is enclosed in slashes (/), it is a regular
expression; otherwise, it is a string.
(See page 432.)

:im

:im
List all the insert-mode mappings. (Same as: :imap.)
(See page 415, 418, 420.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 661

Draft Not for publication

Draft 0.1

Not for widespread publication

:im

:im {lhs}
List the insert-mode mapping of {lhs}. (Same as: :imap.)
(See page 415, 420.)

:im

:im {lhs} {rhs}


Define a keyboard mapping for insert mode. (Same as: :imap.)
(See page 415, 420.)

:imap

:imap
List all the insert-mode mappings. (Same as: :im.)
(See page 415, 418, 420.)

:imap

:imap {lhs}
List the insert-mode mapping of {lhs}. (Same as: :im.)
(See page 415, 420.)

:imap

:imap {lhs} {rhs}


Define a keyboard mapping for insert mode. (Same as: :im.)
(See page 415, 420.)

:imapc

:imapc

:imapclear

:imapclear
Clear all the insert-mode mappings.
(See page 420.)

:ime

:[priority] ime {menu-item} {command-string}

:imenu

:[priority] imenu {menu-item} {command-string}


Define a menu item that is available for insert mode only. The
priority determines its placement in a menu. Higher numbers come
first. The name of the menu item is {menu-item}, and when the
command is selected, the command {command-string} is executed.
(See page 461.)

:ino

:ino {lhs} {rhs}


Same as :imap, but does not allow remapping of the {rhs}. (Same
as: :inoremap.)
(See page 420.)

:inorea

:inorea {lhs} {rhs}

:inoreabbrev

:inoreabbrev {lhs} {rhs}

Do a :noreabbrev that works in insert mode only.


(See page 414, 420.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 662

Draft Not for publication

Draft 0.1

Not for widespread publication

:inoremap

:inoremap {lhs} {rhs}


Same as :imap, but does not allow remapping of the {rhs}. (Same
as: :ino.)

:inoreme

(See page 420.)


:[priority] inoreme {menu-item} {command-string}

:inoremenu

:[priority] inoremenu {menu-item} {command-string}


Like :imenu, except the {command-string} is not remapped.
(See page 466.)

:insert

:[line] insert
Start inserting text before line. Insert ends with a line consisting of
just .. (Same as: :i.)
(See page 426.)

:int

:int

:intro

:intro
Display the introductory screen.
(See page 227.)

:is

:[range] is /{pattern}/

:isearch

:[range] isearch /{pattern}/


List the first occurrence {pattern} in the range. (Default = the
whole file.) If the pattern is enclosed in slashes (/), it is a regular
expression; otherwise, it is a string.
(See page 433.)

:isp

:[range] isp [count] /{pattern}/

:isplit

:[range] isplit [count] /{pattern}/


Combination of :split and :ijump. Split the window and jump to
the first occurrence of the {pattern}. Things that look like
comments are ignored.
(See page 433.)

:iu

:iu {lhs}
Remove an insert-mode mapping. (Same as: :iunmap.)
(See page 420.)

:iuna

:iuna {lhs}

:iunabbreviate

:iunabbreviate {lhs}

Remove the insert line-mode abbreviation.


(See page 414, 420.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 663

Draft Not for publication

Draft 0.1

Not for widespread publication

:iunmap

:iunmap {lhs}
Remove an insert-mode mapping. (Same as :iu.)
(See page 420.)

:iunme

:iunme {menu-item}

:iunmenu

:iunmenu {menu-item}
Remove the insert-mode menu item named {menu-item}.The
wildcard * will match all menu items.
(See page 466.)

:j

:[range] j[!]

:join

:[range] join[!]
Join the lines in range into one line. Spaces are used to separate the
parts unless the ! is specified.
(See page 439.)

:ju

:ju

:jumps

:jumps
List out the jump list.
(See page 262.)

:k

:[line] k{letter}
Place mark {letter} on the indicated line. (Same as: :mar, :mark.)
(See page 440.)

:ke

:ke {command}
Execute {command} and attempt to preserve the marks inside the text
affected by the command. Currently only filter ([range]!)
commands are supported. The number of lines after filtering must be
greater or equal to the number of lines before for this to work.
(Same as :keepmarks.)
(See page 306.)

:keepa

:keepa {command}

:keepalt

:keepalt {command}
Execute {command} but do not change the name of the alternate file.
(Even if the {command} would normally cause it to change.)
(See page 225.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 664

Draft Not for publication

Draft 0.1

Not for widespread publication

:keepj

:keepj {command}

:keepjumps
:keepjump {command}
Execute a command which might normally move or destroy the jump
list or the marks '', '., or '^, but do not destroy the marks.
(See page 225.)
:keepmarks
:keepmarks {command}
Execute {command} and attempt to preserve the marks inside the text
affected by the command. Currently only filter ([range]!)
commands are supported. The number of lines after filtering must be
greater or equal to the number of lines before for this to work.
(Same as :ke.)
(See page 306.)
:l

:[range] l [count]
Like :print, but assumes that the 'list' option is on.
(See page 427.)

:la

:la [+command]
Edit the last file in the list. (Same as :last.)
(See page 80, 313.)

:lad

:lad[!] {expr}
Add the results of {expr} to the location list. (Same as :laddexpr.)
(See page 401.)

:laddb

:laddb {buffer}

:laddbuffer

:laddbuffer {buffer}

Add the contests of {buffer} to the location list.


(See page 401.)
:laddexpr

:laddexpr[!] {expr}
Add the results of {expr} to the location list. (Same as :lad.)
(See page 401.)

:laddf

:laddf {file}

:laddfile

:laddfile {file}
Add the contests of {file} to the location list.
(See page 400.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 665

Draft Not for publication

Draft 0.1

Not for widespread publication

:last

:last [+command]
Edit the last file in the list. (Same as :la.)
(See page 80, 313.)

:lat

:lat {time}

:later

:later {time}
Go to an later text state. If {time} is specified as a count, then count
changes are redone. Time also can be specified as {n}s, then the
state will go forward that many seconds. Time can also be specified
as {n}m for minutes, and {n}h for hours.
(See page 281.)

:lb

:lb[!] [buffer-number]

:lbuffer

:lbuffer[!] [buffer-number]
Read the contents of the buffer into the location list and jump to the
first location.
(See page 400.)

:lc

:lc[!] [path]

:lcd

:lcd[!] [path]

:lch

:lch[!] [path]

:lchdir

:lchdir[!] [path]
Change the directory like :cd, but only for the current window.
(See page 436.)

:lcl

:lcl

:lclose

:lclose
Close the window with the location list in it.
(See page 401.)

:lcs

:lcs {arguments}

:lcscope

:lcscope {argument}
Handle various activities associated with the CScope program
sending the results to the location list.
(See page 244.)

:le

:[range] le [margin]

:left

:[range] left [margin]


Left justify the text putting each line [margin] characters from the
left margin. (Default = 0.)
(See page 176.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 666

Draft Not for publication

Draft 0.1

Not for widespread publication

:lefta

:lefta {cmd}

:leftabove
:leftabove {cmd}
Execute the Vim command {cmd}. If the command splits a window,
the window is opened above the current one or to its left (overriding
any any split options that are currently set.) (Same as :abo,
:aboveleft)
(See page 342.)
:let

:let {variable} = {expression}


Assign a {variable} a value.
(See page 480.)

:lex

:lex[!] {expr}

:lexpr

:lexpr[!] {expr}
Evaluate {expr} and use it to create a location list.
(See page 401.)

:lf

:lf[!] {file}

:lfile

:lfile[!] {file}
Create a location list from the contents of {file}.
(See page 400.)

:lfir

:lfir[!] [number]

:lfirst

:lfirst[!] [number]
Go to the first location in the location list. If a number is specified go
to that error number. (Same as :lr, :lrewind.)
(See page 400.)

:lg

:lg[!] {file}
Read the file into the location list but do not jump to the first
location. (Same as :lgetfile.)
(See page 400.)

:lgetb

:lgetb {buffer}

:lgetbuffer

:lgetbuffer {buffer}

Read the {buffer} into the location list, but do not jump to the first
location.
(See page 401.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 667

Draft Not for publication

Draft 0.1

:lgete

Not for widespread publication


:lgete[!] {expr}

:lgetexpr

:lgetexpr[!] {expr}
Evaluate the expression and turn it into a location list. Do not jump
to the first location.
(See page 401.)

:lgetfile

:lgetfile[!] {file}
Read the file into the location list but do not jump to the first
location. (Same as :lg.)
(See page 400.)

:lgr

:lgr[!] [arguemets]

:lgrep

:lgrep[!] [arguemets]
Execute a grep command and use the results to create a location list.
(See :grep.)
(See page 401.)

:lgrepa

:lgrepa[!] [arguemets]

:lgrepadd

:lgrepadd[!] [arguemets]
Execute a grep command and add the results to the location list.
(See :grep.)
(See page 401.)

:lh

:lh {pattern} [@lang]

:lhelpgrep
:lhelpgrep {pattern} [@lang]
Search the help text for the given {pattern} and put the results in
the location list. If @lang is included, limit results to that language.
(See page 225.)
:list

:[range] list [count]


Like :print, but assumes that the 'list' option is on. (Same as:
:l.)
(See page 427.)

:ll

:ll[!] [number]
Move to the current location in the location list. If a number is
specified, move to the indicated entry in the location list.
(See page 400.)

:lla

:lla[!] [number]

:llast

:llast[!] [number]
Move to the last location in the location list (or a [number] of entries

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 668

Draft Not for publication

Draft 0.1

Not for widespread publication

from the end if specified.)


(See page 400.)
:lli

:lli[!] [from] [,to]

:llist

:llist[!] [from] [,to]


List all the locations in the list that match the given range (the
default being all). If the override (!) option is given, output is limited
to those locations valid for the current window.
(See page 401.)

:lm

:lm {lhs} {rhs}


Define a language dependent mapping that's will be used in
command mode, insert mode, and when entering a language
dependent argument. (Same as :lmap.)
(See page 420.)

:lmak

:lmak[!] [arguements]

:lmake

:lmake[!] [arguments]
Execute the make command and capture the results in the location
list. Position the editor on the first error.
(See page 401.)

:lmap

:lmap {lhs} {rhs}


Define a language dependent mapping that's will be used in
command mode, insert mode, and when entering a language
dependent argument. (Same as :lm.)
(See page 420.)

:lmapc

:lmapc

:lmapclear
:lmapclear
Clear all language dependent mappings.
(See page 420.)
:lN

:[count]lN [!]
Go to the previous location in the location list. (Same as :lNext, :lp,
:lprevious.)
(See page 400.)

:ln

:ln {lhs} {rhs}


Create a language dependent mapping which is used for command
mode, insert mode, and language input which does not remap {rhs}.
(Same as :lnoremap.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 669

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 420.)


:lne

:[count]lne[!]
Go to the next location in the location list. (Same as :lnext.)
(See page 400.)

:lnew

:lnew [count]

:lnewer

:lnewer [count]
Go to a newer version of the location list.
(See page 401.)

:lNext

:[count]lNext [!]
Go to the previous location in the location list. (Same as :lN :lp,
:lprevious.)
(See page 400.)

:lnext

:[count]lnext[!]
Go to the next location in the location list. (Same as :lne.)
(See page 400.)

:lNf

:[count]lNf[!]

:lNfile

:[count]lNfile[!]
Go to the last location in the previous file. (Same as :lpf, :lpfile.)
(See page 400.)

:lnf

:[count]lnf[!]

:lnfile

:[count]lnfile[!]
Go to the first location in the next file in the location list.
(See page 400.)

:lnoremap

:lnoremap {lhs} {rhs}


Create a language dependent mapping which is used for command
mode, insert mode, and language input which does not remap {rhs}.
(Same as :ln.)
(See page 420.)

:lo

:lo [number]
Load a view which has been made with :mkview for the current file.
(Same as :loadview.)
(See page 346.)

:loadk

:loadk {file}

:loadkeymap

:loadkeymap {file}

Load a keymap file.


vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 670

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 555.)


:loadview

:loadview [number]
Load a view which has been made with :mkview for the current file.
(Same as :lo.)
(See page 346.)

:loc

:loc {cmd}

:lockmarks
:lockmarks {cmd}
Execute {cmd} without changing the location of any marks.
(See page 306.)
:lockv

:lockv[!] [depth] {name}

:lockvar

:lockvar[!] [depth] {name}


Lock a variable so it can not be changed. The [depth] if specified is
a code which indicates how to lock dictionaries and list. A value of 1
locks the size of the dictionary or list, but lets you change values.
The 2 code indicates that the top level values can not be changed. A
level of 3 indicates that the array, the values in the array, and their
values can not be changed. The override option (!) tell Vim that
nothing can be changed.
(See page 485.)

:lol

:lol [count]

:lolder

:lolder [count]
Use an older version of the location list.
(See page 401.)

:lop

:lop [height]

:lopen

:lopen [height]
Open a window containing the location list.
(See page 401.)

:lp

:[count]lp [!]
Go to the previous location in the location list. (Same as :lN,
:lNext, :lprevious.)
(See page 400.)

:lpf

:[count]lpf[!]

:lpfile

:[count]lpfile[!]
Go to the last location in the previous file. (Same as :lNf, :lNfile.)
(See page 400.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 671

Draft Not for publication

Draft 0.1

Not for widespread publication

:lprevious
:[count]lprevious [!]
Go to the previous location in the location list. (Same as :lN,
:lNext.)
(See page 400.)
:lr

:lr[!] [number]

:lrewind

:lrewind[!] [number]
Go to the first location in the location list. If a number is specified go
to that error number. (Same as :lfir, :lfirst.)
(See page 400.)

:ls

:ls
List all the buffers. (Same as: :buffers, :files.)
(See page 90.)

:lt

:lt[!] {name}

:ltag

:ltag[!] {name}
Jump to the first tag {name} and create a location list for this window
containing all matching tags.
(See page 401.)

:lu

:lu {lhs}

:lunmap

:lunmap {lhs}
Remove a language entry mode mapping from the system.
(See page 420.)

:lv

:lv[!] /{pattern}/[g][j] {file-list]

:lvimgrep

:lvimgrep[!] /{pattern}/[g][j] {file-list]


Perform a search using the Vim internal grep command and store the
results in a new location list for the current window.
(See page 401.)

:lvimgrepa
:lvimgrepa[!] /{pattern}/[g][j] {file-list]
:lvimgrepadd

:lvimgrepadd[!] /{pattern}/[g][j] {file-list]

Perform a search using the Vim internal grep command and add the
results to the existing location list for the current window.
(See page 401.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 672

Draft Not for publication

Draft 0.1

:lw

Not for widespread publication


:lw [height]

:lwindow

:lwindow [height]
Open the location window if it contains data. If it is open and empty,
close it.
(See page 401.)

:m

:[range] m {address}
Move the range of lines from their current location to below
{address}. (Same as: :move.)
(See pages 231, 425.)

:ma

:[line] ma{letter}
Mark the current line with mark {letter}. (Same as: :k, :mark.)
(See page 440.)

:mak

:mak {arguments}

:make

:make {arguments}
Run the external make program, giving it the arguments indicated.
Capture the output in a file so that error-finding commands such as
:cc and :cnext can be used.
(See pages 143, 398, 401.)

:map

:map[!]
List all the mappings. Note: Only :map and :map! list the mappings
for all modes. The other mode-dependent versions of these
commands list the mapping for their modes only. Normally this
command lists the mappings for the normal, visual, select, and
operating pending modes. With the override (!) it lists the mappings
for the Insert, Command Line, and Language argument modes.
(See pages 149, 415, 418, 420.)

:map

:map {lhs}
List the mapping of {lhs}.
(See page 415, 418, 420.)

:map!

:map! {lhs}
List the mapping of {lhs} for insert and command mode..
(See page 415, 420.)

:map

:map {lhs} {rhs}


Define a keyboard mapping. When the {lhs} is typed in normal
mode, pretend that {rhs} was typed.
(See page 148, 415, 415, 420, 533.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 673

Draft Not for publication

Draft 0.1

:map!

Not for widespread publication


:map! {lhs} {rhs}

Define a keyboard mapping. When the {lhs} is typed in insert or


command mode, pretend that {rhs} was typed.
(See page 148, 415, 415, 420.)
:mapc

:{mode} mapc[!]

:mapclear

:{mode} mapclear[!]
Clear all the mappings. Normally this command clears the mappings
for the normal, visual, select, and operating pending modes. With
the override (!) it clears the mappings for the Insert, Command Line,
and Language argument modes.
(See page 417, 420.)

:mark

:[line] mark {letter}


Mark the given line with mark {letter}. (Same as: :k.)
(See page 440.)

:marks

:marks
List all the marks.
(See page 73, 74.)

:marks

:marks {chars}
List the marks specified by the character list: {chars}.
(See page 73, 74.)

:mat

:[number]mat {group} /{pattern}/

:match

:[number]match {group} /{pattern}/


Display text that matches {pattern} using the given highlight
{group}. Multiple matches may be displayed at the same time by
using the numbers 1-3.

:me
:menu

(See page 81.)


:[priority][mode] me {menu-item} {command-string}

:[priority][mode] menu {menu-item} {command-string}


Define a menu item. The priority determines its placement in a
menu. Higher numbers come first. The mode parameter defines
which Vim mode the item works in. The name of the menu item is
{menu-item}, and when the command is selected, the command
{command-string} is executed.
(See page 460.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 674

Draft Not for publication

Draft 0.1

Not for widespread publication

:menut

:menut {english} {lang}

:menut

:menut clear

:menutranslate

:menutranslate {english} {lang}

:menutranslate

:menutranslate clear

Create a menu translation from English to another language. If the


keyword clear is use, clear all translations.
(See page 467.)
:mes

:mes

:messages

:messages
View previous messages.
(See page 443, 488.)

:mk

:mk[!] [file]

:mkexrc

:mkexrc[!] [file]
Like :mkvimrc, except the [file] defaults to .exrc. This command
has been superseded by the :mkvimrc command. (Same as: :mk.)
(See page 154.)

:mks

:mks[!] [file]

:mksession

:mksession[!] [file]
Create a session file and save the current settings. If the override
option (!) is specified, overwrite any existing session file.
(See page 344, 481.)

:mksp

:mksp[!] [-ascii] {outname} [inname]

:mkspell

:mkspell[!] [-ascii] {outname} [inname]


Create a spelling word list file.
(See page 328.)

:mkv

:mkv[!] {file}
Write out setting to {file} in a manner suitable for including in
a .vimrc file. In fact, if you do not specify {file}, it defaults
to .vimrc. If the file exists, it will be overwritten if the override
option (!) is used. (Same as :mkvimrc.)
(See page 151.)

:mkvie

:mkvie[!] {file}

:mkview

:mkview[!] {file}
Create a view file which stores the view information about the
current window. See :loadview.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 675

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 346.)


:mkvimrc

:mkvimrc[!] {file}
Write out setting to {file} in a manner suitable for including in
a .vimrc file. In fact, if you do not specify {file}, it defaults
to .vimrc. If the file exists, it will be overwritten if the override
option (!) is used. (Same as :mkv.)
(See page 151.)

:mod

:mod {mode}

:mode

:mode {mode}
Set the screen mode for an MS-DOS editing session.
(See page 479.)

:move

:[range] move {address}


Move the range of lines from their current location to below
{address}. (Same as: :m.)
(See pages 231, 425.)

:mz

:[range]mz {statement}
Execute the MzScheme statement {statement}. (Same as
:mzscheme.)
(See page 245.)

:mz

:[range]mz << {marker}


Execute the MzScheme statements that follow up to {marker}.
(Same as :mzscheme.)
(See page 245.)

:mzf

:[range]mzf {file}

:mzfile

:[range]mzfile {file}
Execute the MzScheme statements in {file}.
(See page 245.)

:mzscheme

:[range]mzscheme {statement}
Execute the MzScheme statement {statement}. (Same as :mz.)
(See page 245.)

:mzscheme

:[range]mzscheme << {marker}


Execute the MzScheme statements that follow up to {marker}.
(Same as :mz.)
(See page 245.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 676

Draft Not for publication

Draft 0.1

:n

Not for widespread publication


:[count] n {+cmd} {file-list}

When editing multiple files, go to the next one. If [count] is


specified, go to the [count] next file. (If no {file-list}, same as:
:next. If {file-list} same as: :args, :ar, :next.)
:N

(See pages 78, 242, 242, 313, 315.)


:[count] N {+cmd} {file-list}
When editing multiple files, go to the previous one. If a [count] is
specified, go to the [count] previous file. (Same as: :Next,
:prev, :previous.)
(See page 80, 313.)

:nb

:nb {key}

:nbkey

:nbkey {key}
Used to send ean:q the given key for when Vim is working inside of
Netbeans.
(See page 246.)

:new

:new[!] [+command] [file-name]


Split the window like :split. The only difference is that if no
filename is specified, a new window is started on a blank file. (Same
as: CTRL-W CTRL-N, CTRL-Wn.)
(See page 88.)

:next

:[count] next [+cmd] [file-list]


When editing multiple files, go to the next one. If count is specified,
go to the count next file. (If no {file-list}, same as: :n. If {filelist} same as: :args, :ar, :n.)

:Next

(See pages 78, 242, 242, 313, 315.)


:[count] Next [+cmd] [file-list]
When editing multiple files, go to the previous one. If [count] is
specified, go to the [count] previous file. (Same as: :N, :prev,
:previous.)
(See page 80, 313.)

:nm

:nm
Listing all the mappings for normal-mode maps. (Same as: :nmap.)
(See page 415, 418, 420.)

:nm

:nm {lhs}
List the normal mapping of {lhs}. (Same as :nmap.)
(See page 415, 420.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 677

Draft Not for publication

Draft 0.1

:nm

Not for widespread publication


:nm {lhs} {rhs}

Define a keyboard mapping for normal mode. (Same as :nmap.)


(See page 415, 420.)
:nmap

:nmap
Listing all the normal-mode mappings. (Same as: :nm.)
(See page 415, 418, 420.)

:nmap

:nmap {lhs}
List the normal-mode mapping of {lhs}. (Same as :nm.)
(See page 415, 420.)

:nmap

:nmap {lhs} {rhs}


Define a keyboard mapping for normal mode. (Same as :nm.)
(See page 415, 420.)

:nmapc

:nmapc

:nmapclear
:nmapclear
Clear all the normal mappings.
(See page 420.)
:nme

:[priority]nme {menu-item} {command-string}

:nmenu

:[priority]nmenu {menu-item} {command-string}


Define a menu item that is available for normal mode only. The
priority determines its placement in a menu. Higher numbers come
first. The name of the menu item is {menu-item}, and when the
command is selected, the command {command-string} is executed.
(See page 461.)

:nn

:nn {lhs} {rhs}

:nnoremap

:nnoremap {lhs} {rhs}


Same as :nmap, but does not allow remapping of the {rhs}.

:nnoreme

(See page 420.)


:[priority] nnoreme {menu-item} {command-string}

:nnoremenu

:[priority] nnoremenu {menu-item} {command-string}


Like :nmenu, but the {command-string} is not remapped.
(See page 466.)

:no

:no {lhs} {rhs}


Same as :map, but does not allow remapping of the {rhs}. (Same as:
:noremap.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 678

Draft Not for publication

Draft 0.1

Not for widespread publication

(See pages 414, 415, 420.)


:noh

:noh

:nohlsearch

:nohlsearch

Turn off the search highlighting. (It will be turned on by the next
search. To turn it off permanently, use the :set nohisearch
command.)
(See page 321.)
:norea

:norea {lhs} {rhs}

:noreabbrev

:noreabbrev {lhs} {rhs}

Define an abbreviation, but do not allow remapping of the right side.


(See page 419, 420.)
:noremap

:noremap {lhs} {rhs}


Same as :map, but does not allow remapping of the {rhs}. (Same as:
:no.)

:noreme

(See pages 414, 420.)


:[priority][mode] noreme[!] {menu-item} {command-string}

:noremenu :[priority][mode] noremenu [!] {menu-item} {command-string}


Define a menu item like defined with :menu, but do not allow
remapping of the {command-string}.
(See page 466.)
:norm

:norm[!] {commands}

:normal

:normal[!] {commands}
Execute the commands in normal mode. If the override option (!) is
present, mappings will not be used.
(See page 444.)

:nu

:[range] nu

:number

:[range] number
Print the lines with line numbers.
(See page 427.)

:nun

:nun {lhs}

:nunmap

:nunmap {lhs}
Remove a normal mapping.
(See page 420.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 679

Draft Not for publication

Draft 0.1

Not for widespread publication

:nunme

:nunme {menu-item}

:nunmenu

:nunmenu {menu-item}
Remove the normal menu item named {menu-item}. The wildcard *
will match all menu items. (Same as: :nunme.)
(See page 461.)

:o

:o
The one command that Vi has that Vim does not. (In Vi, this
command puts the editor into "open" mode, a mode that no sane
persons ever use if they can avoid it.) (Same as: :open.)
(See page 228.)

:om

:om
List all the mappings for operator-pending-mode maps. (Same as:
:omap.)
(See page 415, 418, 420.)

:om

:om {lhs}
List the operator-pending mapping of {lhs}. (Same as :omap.)
(See page 415, 420.)

:om

:om {lhs} {rhs}


Define a keyboard mapping for operator-pending mode. (Same as
:omap.)
(See page 415, 420.)

:omap

:omap
List all the operator-pending-mode mappings. (Same as: :om.)
(See page 415, 418, 420.)

:omap

:omap {lhs}
List the operator-pending-mode mapping of {lhs}. (Same as :om.)
(See page 415, 420.)

:omap

:omap {lhs} {rhs}


Define a keyboard mapping for operator-pending mode. (Same as
:om.)
(See page 415, 420.)

:omapc

:omapc

:omapclear
:omapclear
Clear all the operator-pending-mode mappings.
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 680

Draft Not for publication

Draft 0.1

Not for widespread publication

:ome

(See page 420.)


:[priority] ome {menu-item} {command-string}

:omenu

:[priority] omenu {menu-item} {command-string}


Define a menu item that is available for operator-pending mode only.
The priority determines its placement in a menu. Higher numbers
come first. The name of the menu item is {menu-item}, and when
the command is selected, the command {command-string} is
executed.
(See page 460.)

:on

:on[!]

:only

:only[!]
Make the current window the only one. If ! is specified, modified files
whose windows are closed will have their contents discarded. (Same
as: :CTRL-W CTRL-O, CTRL-Wo.)
(See page 335.)

:ono

:ono {lhs} {rhs}

:onoremap

:onoremap {lhs} {rhs}


Same as :omap, but does not allow remapping of the {rhs}.

:onoreme

(See page 420.)


:[priority] onoreme {menu-item} {command-string}

:onoremenu
:[priority] onoremenu {menu-item} {command-string}
Like :omenu, but the the {command-string} is not remapped.
(See page 466.)
:open

:open
The one command that Vi has that Vim does not. (In Vi, this
command puts the editor into "open" mode, a mode that no sane
persons ever use if they can avoid it.) (Same as: :o. See page 228.)

:opt

:opt

:options

:options
Enter an option-browsing window that enables you to view and set all
the options. (Same as: :bro set, :browse set.)
(See page 472.)

:ou

:ou {lhs}

:ounmap

:ounmap {lhs}
Remove an operator-pending-mode mapping.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 681

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 417, 420.)


:ounme

:ounme {menu-item}

:ounmenu

:ounmenu {menu-item}
Remove the command-mode menu item named {menu-item}.The
wildcard * will match all menu items.
(See page 466.)

:p

:[range] p

:p

:[range] P
Print the specified lines. (Same as: :print, :Print.)
(See page 159, 159, 160.)

:pc

:pc[!]

:pclose

:pclose[!]
Close the preview window. Discard any changes if the force (!)
option is present. (Same as: CTRL-W CTRL-Z, CTRL-Wz.)
(See page 388.)

:pe

:pe {command}
Execute a single Perl command. Requires Vim be compiled with Perl
support (not on by default). (Same as :perl.)
(See page 246.)

:pe

:pe << pattern


Execute Perl commands until a line containing only pattern is seen..
Requires Vim be compiled with Perl support (not on by default).
(Same as :perl.)
(See page 246.)

:ped

:ped[!] [++opt] [+cmd] {file}

:pedit

:pedit[!] [++opt] [+cmd] {file}


Edit a file in the preview window.
(See page 389.)

:perl

:perl {command}
Execute a single Perl command. Requires Vim be compiled with Perl
support (not on by default). (Same as :pe.)
(See page 246.)

:perl

:perl << pattern


Execute Perl commands until a line containing only pattern is seen..
Requires Vim be compiled with Perl support (not on by default).

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 682

Draft Not for publication

Draft 0.1

Not for widespread publication

(Same as :pe.)
(See page 246.)
:perld

:[range] perld {command}

:perldo

:[range] perldo {command}


Execute a Perl command on a range of lines. The Perl variable $_ is
set to each line in range.
(See page 246.)

:po

:[count]po[!]

:pop

:[count]pop[!]
Go back [count] tags. If the current buffer has been modified, this
command will fail unless the force (!) option is present.
(See page 389.)

:pp

:[count]pp[!]

:ppop

:[count] ppop[!]
Do a :pop command in the preview window. If the force option (!) is
specified, discard any changes made on the file in the preview
window. If a [count] is specified, pop that many tags.
(See page 389.)

:pre

:pre

:preserve

:preserve
Write out entire file to the swap file. This means that you can
recover the edit session from just the swap file alone.
(See pages 221, 440.)

:prev

:[count] prev {[+cmd]} {[filelist]}

:previous

:[count] previous {[+cmd]} [{filelist]}


Edit the previous file in the file list. (Same as :N, :Next.)
(See page 80, 313.)

:print

:[range]print

:Print

:[range]Print
Print the specified lines. (Same as :p.)
(See pages 159, 159, 160.)

:pro

:pro
Open a Find dialog box. (Same as :promptfind.)
(See page 470.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 683

Draft Not for publication

Draft 0.1

Not for widespread publication

:prof

:prof continue
Continue profiling after a profiling pause. (Same as :profile.)
(See page 502.)

:prof

:prof[!] file {pattern}


Profile all files which match {pattern}. If the override (!) operator
is used, profile the functions inside these files as well. (Same as
:profile.)
(See page 502.)

:prof

:prof func {pattern}


Profile all functions that match {pattern}. (Same as :profile.)
(See page 500.)

:prof

:prof pause
Stop profiling until a :profile continue command is executed.
(Same as :profile.)
(See page 502.)

:prof

:prof start {file}


Start profiling. Write the results to {file} when done. (Same as
:profile.)
(See page 500.)

:profd

:profd *

:profd

:profd {number}

:profd

:profd func {line} {function-name}

:profd

:profd file {line} {file-name}

:profd

:profd here

:profdel

:profdel *

:profdel

:profdel {number}

:profdel

:profdel func {line} {function-name}

:profdel

:profdel file {line} {file-name}

:profdel

:profdel here
Stop profiling the indicated item. The item specification can be *
(star) which deletes all profiles, or a profile {number}. A specific line
in a function or file can be used. Finally the profiling of the current
location can be turned off by using the here keyword.
(See page 502.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 684

Draft Not for publication

Draft 0.1

Not for widespread publication

:profile

:profile continue
Continue profiling after a profiling pause. (Same as :prof.)
(See page 502.)

:profile

:profile[!] file {pattern}


Profile all files which match {pattern}. If the override (!) operator
is used, profile the functions inside these files as well. (Same as
:prof.)
(See page 502.)

:profile

:profile func {pattern}


Profile all functions that match {pattern}. (Same as :prof.)
(See page 500.)

:profile

:profile pause
Stop profiling until a :profile continue command is executed. (Same
as :prof.)
(See page 502.)

:profile

:profile start {file}


Start profiling. Write the results to {file} when done. (Same as
:prof.)

(See page 500.)


:promptfind

:promptfind

Open a Find dialog box. (Same as :pro.)


(See page 470.)
:promptr

:promptr

:promptrepl

:promptrepl

Open a Replace dialog box.


(See page 470.)
:ps
:psearch

:[range]ps[!] [count] /{pattern}/


:[range]psearch[!] [count] /{pattern}/
Search for the given pattern and show the first match in the preview
window. If the override option (!) is present, things that look like
comments are searched. If the pattern is enclosed in slashes (/) then
it's a regular expression. Without the slashes (/) it's considered a set
of independent words.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 685

Draft Not for publication

Draft 0.1

:pt

Not for widespread publication


:pt[!] {identifier}

:ptag

:ptag[!] {identifier}
Open a preview window and do a :tag. Discard any changes in the
preview window if the override (!) option is present.
(See page 388, 389.)

:ptf

:[count] ptf[!]

:ptfirst

:[count] ptfirst[!]
Do a :trewind in the preview window. Discard any changes in the
preview window if the override (!) option is present. (Same as :ptr,
:ptrewind.)
(See page 389.)

:ptj

:ptj[!] {identifier}

:ptjump

:ptjump[!] {identifier}
Open a preview window and do a :tjump. Discard any changes in the
preview window if the override (!) option is present.
(See page 389.)

:ptl

:ptl[!]

:ptlast

:ptlast[!]
Do a :tlast in the preview window. Discard any changes in the
preview window if the override (!) option is present.
(See page 389.)

:ptn

:[count] ptn[!]
Open a preview window and do a :[count] tnext. Discard any
changes in the preview window if the override (!) option is present.
(Same as: :ptnext.)
(See page 389.)

:ptN

:[count] ptN[!]
Open a preview window and do a :[count] tprevious. Discard any
changes in the preview window if the override (!) option is present.
(Same as: :ptNext, :ptp, :ptprevious.)
(See page 389.)

:ptnext

:[count] ptnext[!]
Open a preview window and do a :[count] tnext[!]. Discard any
changes in the preview window if the override (!) option is present.
(Same as: :ptn.) (See page 389.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 686

Draft Not for publication

Draft 0.1

:ptNext

Not for widespread publication


:[count] ptNext[!]

Same as :[count] ptnext!. (Same as: :ptNext, :ptprevious.)


(See page 389.)
:ptp

:[count] ptp[!]

:ptprevious

:[count] ptprevious[!]

Do a :tprevious in the preview window. Discard any changes in the


preview window if the override (!) option is present. (Same as: :ptN,
:ptNext.)
(See page 389.)
:ptr

:[count] ptr[!]

:ptrewind

:[count] ptrewind[!]
Do a :trewind in the preview window. Discard any changes in the
preview window if the override (!) option is present. (Same as :ptf,
:ptfirst.)
(See page 389.)

:pts

:pts[!] {identifier}

:ptselect

:ptselect[!] {identifier}
Open a preview window and do a :tselect. Discard any changes in
the preview window if the override (!) option is present.
(See page 389.)

:pu

:[line] pu[! register

:put

:[line] put[!] register


Put the text in the register after (before ! is specified) the specified
line. If a register is not specified, it defaults to the unnamed register.
(See page 439.)

:pw

:pw

:pwd

:pwd
Print current working directory.
(See page 435.)

:py

:[range] py {statement}
Execute a single Python {statement}. (Same as: :python.)
(See page 247.)

:pyf

:[range] pyf {file}

:pyfile

:[range] pyfile {file}


Executes the Python program contained in {file}.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 687

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 247.)


:python

:[range] python {statement}


Execute a single Python {statement}. This works only if Python
support was compiled into Vim; it is does not work by default. (Same
as: :py.)
(See page 247.)

:q

:q[!]
Close a window. If this is the last window, exit Vim. The command
fails if this is the last window for a modified file, unless the force (!)
option is present. (Same as: CTRL-W CTRL-Q, CTRL-Wq, :quit. )
(See pages 35, 84, 164, 284, 334, 96.)

:qa

:qa[!]

:qall

:qall[!]
Close all windows. If the force option is present, any modifications
that have not been saved will be discarded. (Same is :quita,
:quitall.)
(See page 334.)

:quit

:quit[!]
Close a window. If this is the last window, exit Vim. The command
fails if this is the last window for a modified file, unless the force (!)
option is present. (Same as: CTRL-W CTRL-Q, CTRL-Wq, :q.)
(See pages 35, 84, 164, 284, 334, 9696.)

:quita

:quita[!]

:quitall

:quitall[!]
Close all windows. If the force option is present, any modifications
that have not been saved will be discarded. (Same is :qa, :qall.)
(See page 334.)

:r

:[line] r {file}
Read the specified file (default = current file) and insert it after the
given line (default = current line). (Same as :read.)
(See page 164, 438.)

:r

:[line] r !{command}
Run the given command, capture the output, and insert it after the
given line (default = current line). (Same as :read.)
(See page 438.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 688

Draft Not for publication

Draft 0.1

:read

Not for widespread publication


:[line] read {file}

Read the specified file (default = current file) and insert it after the
given line (default = current line). (Same as :r.)
(See page 438.)
:read

:[line] read !{command}


Run the given command, capture the output, and insert it after the
given line. (Default = current line.) (Same as :r.)
(See page 438.)

:rec

:rec[!] {file}

:recover

:recover[!] {file}
Recover the editing session from the specified file. If no file is
specified, the current file is used. If changes have been made to the
file, this command will result in an error. If the force (!) option is
present, attempting to recover a file changed in the current session
will discard the changes and start recovery.
(See page 221.)

:red

:red
Redo the last edit. (Same as: :redo.)
(See page 440.)

:redi

:redi[!] {>|>>} {file}

:redir

:redir[!] {>|>>} {file}


Copy messages to the file as they appear on the screen. If the
override option (!) is present, the command will overwrite an existing
file. The flag > tells the command to write the file; the >> indicates
append mode. To close the output file, use the command
:redir END.
(See page 443.)

:redo

:redo
Redo the last edit. (Same as :red,)
(See page 440.)

:redr

:redr[!]

:redraw

:redraw[!]
Redraw the screen. If the override option (!) is present, clear, then
redraw the screen. This command is useful to show progress in
scripts and mappings.
(See page 500.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 689

Draft Not for publication

Draft 0.1

:redraws

Not for widespread publication


:redraws[!]

:redrawstatus
:redrawstatus[!]
Redraw the status line of the current window. If the override option
(!) is present, clear, then redraw the status line of all windows. This
command is useful to show progress in scripts and mappings.
(See page 500.)
:reg

:reg {list}

:registers

:registers {list}
Show the registers in list. If no list is specified, list all registers.
(Same as :di, :display.)
(See page 307.)

:res

:res [count]
Change the size of the current window to [count]. If no [count] is
specified, make the window as large as possible. (Similar to: CTRL-W
CTRL-_, CTRL-W+, CTRL-W-, CTRL-W_, :resize.)
(See page 89.)

:res

:res +[count]
Increase the size of the current window by [count]. (Default = 1.)
(Similar to: CTRL-W CTRL-_, CTRL-W+, CTRL-W-, CTRL-W_, :resize-.)
(See page 89.)

:res

:res -[count]
Decrease the size of the current window by [count]. (Default = 1.)
(Similar to: CTRL-W CTRL-_, CTRL-W+, CTRL-W-, CTRL-W_, :resize-.)
(See page 89.)

:resize

:resize [count]
Change the size of the current window to [count]. If no [count] is
specified, make the window as large as possible. (Similar to CTRL-W
CTRL-_, CTRL-W+, CTRL-W-, CTRL-W_, :res.)
(See page 89)

:resize

:resize +[count]
Increase the size of the current window by [count]. (Default = 1.)
(Similar to: CTRL-W+, :res +.)
(See page 89.)

:resize

:resize -[count]
Decrease the size of the current window by [count]. (Default = 1.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 690

Draft Not for publication

Draft 0.1

Not for widespread publication

(Similar to: CTRL-W-, :res -.)


(See page 89.)
:ret

:[range] ret [!] {tabstop}

:retab

:[range] retab [!] {tabstop}


Replace tabs at the current tab stop with tabs with the tab stops set
at {tabstop}. If the 'expandtab' option is set, replace all tabs with
space. If the force option (!) is present, multiple spaces will be
changed into tabs where appropriate.
(See page 366.)

:retu

:retu {expression}

:return

:return {expression}
Return a value from a function.
(See page 493.)

:rew

:rew {file-list}

:rewind

:rewind {file-list}
Edit the first file in the list. (Same as :fir, :first.)
(See pages 80, 242, 313, 315.)

:ri

:[range] ri {width}

:right

:[range] right {width}


Right-justify the specified lines. If the width of a line is not specified,
use the value of the 'textwidth'. (If 'textwidth' is 0, 80 is used.)
(See page 176.)

:rightb

:rightb {cmd}

:rightbelow

:rightbelow {cmd}

Execute {cmd} and if it owns a new window, open the window to the
below or right of the current window overriding all other windowing
options. (Same as :bel, :belowright.)
(See page 342.)
:ru

:ru[!] {file-spec}
Read the command in the first file on the 'runtimepath' that
matches {file-spec}. If the override options (!) is present, read all
the files. If this option is not present, only the first file is read. No
error message is issued if no file is found. (Same as :runtime.)
(See page 156.)

:rub

:[range]rub {statement}
Execute the Ruby statement {statement}. (Same as :ruby.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 691

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 247.)


:rub

:[range]rub << {marker}


Execute the Ruby statements that follow up to {marker}. (Same as
:ruby.)
(See page 247.)

:ruby

:[range]ruby {statement}
Execute the Ruby statement {statement}. (Same as :rub.)
(See page 247.)

:ruby

:[range]ruby << {marker}


Execute the Ruby statements that follow up to {marker}. (Same as
:rub.)
(See page 247.)

:rubyd

:[range] rubyd {command}

:rubydo

:[range] rubydo {command}


Execute a Ruby command on a range of lines. The Ruby variable $_
is set to each line in range.
(See page 247.)

:rubyf

:[range]rubyzf {file}

:rubyfile

:[range]rubyfile {file}
Execute the Ruby statements in {file}.
(See page 247.)

:runtime

:runtime[!] {file-spec}
Read the command in the first file on the 'runtimepath' that
matches {file-spec}. If the override options (!) is present, read all
the files. If this option is not present, only the first file is read. No
error message is issued if no file is found. (Same as :ru.)
(See page 156.)

:rv

:rv[!] {file}

:rviminfo

:rviminfo[!] {file}
Read the .viminfo file specified. If the override option is present (!),
settings in the file override the current settings.
(See page 322.)

:s

:[range] s /{from}/{to}/{flags}
Change the regular expression {from} to the string {to}. See
:substitute for a list of flags. (Same as: :substitute.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 692

Draft Not for publication

Draft 0.1

Not for widespread publication

(See pages 161, 163, 229, 231, 238, 240, 428, 553.)
See section Substitute flags on page 431 for a list of {flags}
:sa

:[count] sa[!] {number}


Do a :[count]split followed by :argument[!] number. (Same as:
:sargument.)
(See page 337.)

:sal

:[count] sal

:sall

:[count] sall
Open a window for all the files being edited. When a count is
specified, open up to count windows. (Note that the count can be
specified after the command--for example, :all count.) (Same as:
:all.
(See page 335.)

:san

:san {cmd}

:sandbox

:sanbox {cmd}
Evaluate {cmd} in a sandbox. The sandbox prevents the command
from modifying a number of things like the text in the buffer and is
designed for the secure execution of the command.

(See page496.)
:sarguement

:[count] sargument[!] {number}

Do a :[count]split followed by :argument[!] number. (Same as:


:sa.)
(See page 337.)
:sav

:sav[!] {file-name}

:saveas

:saveas[!] {file-name}
Save the file under a new name and change the name of the file to
this name.
(See page 164.)

:sb

:sb [number]
Shorthand for :split and :buffer [number].
(See page 92, 92.)

:sba

:[count] sba

:sball

:[count] sball
Open a window for each buffer. If a [count] is specified, open at
most [count] windows. (Same as: :ba, :ball, :sba.)
(See page 339.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 693

Draft Not for publication

Draft 0.1

Not for widespread publication

:sbf

:sbf[!]

:sbfirst

:sbfirst[!]
Shorthand for :split and :bfirst. (Same as :sbr, :sbrweind.)
(See page 93.)

:sbl

:sbl[!]

:sblast

:sblast[!]
Shorthand for :split and :blast.
(See page 93.)

:sbm

:sbm [count]

:sbmodified

:sbmodified [count]

Shorthand for :split and :bmodified.


(See page 93.)
:sbn

:[count] sbn
Shorthand for :split followed by :[count] bnext. (Same as:
:sbnext.)
(See page 93.)

:sbN

:[count] sbN
Shorthand for :split and :[count] bprevious. (Same as: :sbNext,
:sbp, :sbprevious.)
(See page 93.)

:sbnext

:[count] sbnext
Shorthand for :split followed by :[count] bnext. (Same as: :sbn.)
(See page 93.)

:sbNext

:[count] sbNext

:sbp

:[count] sbp

:sbprevous
:[count] sbprevious
Shorthand for :split and :[count] bprevious. (Same as: :sbN.)
(See page 93.)
:sbr

:sbr[!]

:sbrewind

:sbrewind[!]
Shorthand for :split and :brewind. (Same as :sbf, :sbfirst.)
(See page 93.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 694

Draft Not for publication

Draft 0.1

Not for widespread publication

:sbuffer

:sbuffer {number}
Shorthand for :split and :buffer {number}. (Same as: :sb.)
(See page 92, 92.)

:scr

:scr
List the name of all the sourced scripts in the order they were
sourced. (Same as :scriptnames.)
(See page 156.)

:scripte

:scripte [encoding]

:scriptencoding

:scriptencoding [encoding]

Specify the encoding that's used for a script.


(See page 157.)
:scriptnames

:scriptnames

List the name of all the sourced scripts in the order they were
sourced. (Same as :scr.)
(See page 156.)
:scs

:scs {arguments}

:scscope

:scscope {argument}
Split the window and handle various activities associated with the
CScope program.
(See page 244.)

:se

:se
List all options that are not set to the default. (Same as: :set.)
(See page 530.)

:se

:se {option}
Set Boolean option. Depreciated. For all other types of options, show
the value of the option.
(See page 158, 527, 529.)

:se

:se {option}:{value}

:se

:se {option}={value}
Set an {option} to a {value}.
(See page 527, 529.)

:se

:se {option}^={number}

:se

:se {option}[!]
Multiple an option by the given value.
(See page 528.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 695

Draft Not for publication

Draft 0.1

Not for widespread publication

:se

:se {option}&
Set the option to the default value.
(See page 527.)

:se

:se {option}+={value}
Add a number to a numeric option. For a string option, append the
{value} to the string.
(See page 528, 528.)

:se

:se {option}-={number}
Subtract a number to a numeric option. For a string option, remove
the {value} from the string.
(See page 528, 528.)

:se

:se {option}?
List the value of an option.
(See page 527, 529.)

:se

:se {option}^={number}
Multiply a number to a numeric option. Prepend string to the
beginning of the option.
(See page 393, 528, 528.)

:se

:se all
List all options.
(See page 530.)

:se

:se all&
Set all options to their default values.
(See page 531.)

:se

:se inv{option}
Invert a Boolean option.
(See page 527.)

:se

:se no{option}
Clear a Boolean option.
(See page 527.)

:set

:set
List all options not set to the default. (Same as: :se.)
(See page 530.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 696

Draft Not for publication

Draft 0.1

:set

Not for widespread publication


:set {option}

Set Boolean option. Depreciated. For all other types of options,


show the value of the option. Depreciated: show all others.
(See page 158, 527, 529.)
:set

:set {option}:{value}

:set

:set {option}={value}
Set an option.
(See page 527, 528, 529.)

:set

:set {option}[!]
Invert a Boolean option.
(See page 527.)

:set

:set {option}&
Set the option to the default value.
(See page 527, 528.)

:set

:set {option}+={value}
Add a number to a numeric option. Append a string to a string
option.
(See page 528, 529.)

:set

:set {option}-={value}
Subtract a number from a numeric option. Remove a string from a
string option.
(See page 528, 528, 528.)

:set

:set {option}?
List the value of an option.
(See page 527, 529.)

:set

:set {option}^={number}
Multiply a number to a numeric option. Prepend string to the
beginning of the option.
(See page 393, 528, 528.)

:set

:set all
List all options.
(See page 530.)

:set

:set all&
Set all options to their default values.
(See page 531.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 697

Draft Not for publication

Draft 0.1

Not for widespread publication

:set

:set inv{option}
Invert a Boolean option.
(See page 527.)

:set

:set no{option}
Clear a Boolean option.
(See page527.)

:setf

:setf {file-type}

:setfiletype

:setfiletype {file-type}

Set the 'filetype' option if it has not already been set by in this
series of autocommands.
(See page 116.)
:sf

:[count] sf[!] [+command] {file}

:sfind

:[count] sfind[!] [+command] {file}


A combination of :[count] split and :find.
(See page 394.)

:sfir

:sfir[!]

:sfirst

:sfirst[!]
:split followed by :rewind. If ! is specified, modified files whose
windows are closed will have their contents discarded. (Same as :sr,
:srewind.)
(See page 337.)

:sh

:sh

:shell

:shell
Suspend the editor and enter command mode (a.k.a. run a shell).
(See pages 164, 222, 479.)

:si

:si {char}
Simulate the pressing of Alt-{char}. (Same as :simalt.)
(See page 476.)

:sig

:sig [arguments]

:sign

:sign [arguments]
Handle the placement of signs, that is markers in the text. This is
designed for integration with other programs such as debuggers
which need to annotate the code.
(See page 225.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 698

Draft Not for publication

Draft 0.1

Not for widespread publication

:sil

:sil[!] {cmd}

:silent

:silent[!] {cmd}
Execute {cmd} silently. Normal messages will not be output. With
the override option (!), error message disappear as well.
(See page 555.)

:simalt

:simalt {char}
Simulate the pressing of Alt-{char}. (Same as :si.)
(See page 476.)

:sl

:sl {seconds}

:sl

:sl {milliseconds}m
Sleep the specified number of seconds or milliseconds. (Same as: gs,
:sleep.)
(See page 224.)

:sla

:sla[!]!

:slast

:slast![!]
:split followed by :last. If ! is specified, modified files whose
windows are closed will have their contents discarded.
(See page 337.)

:sleep

:sleep {seconds}

:sleep

:sleep {milliseconds)m
Sleep the specified number of seconds or milliseconds. (Same as: gs,
:sl.)
(See page 224.)

:sm

:[range] sm /{from}/{to}/[flags]

:smagic

:[range] smagic /{from}/{to}/[flags]


Substitute the pattern {to} for the pattern {from} for the given
range assuming that the 'magic' option is set for the duration of the
command.
(See page 429.)

:smap

:smap {lhs} {rhs}


Define a mapping that works only in select mode.
(See page 416.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 699

Draft Not for publication

Draft 0.1

Not for widespread publication

:smapc

:smapc

:smapclear
:smapclear
Clear all select mode mappings.
(See page 420.)
:sme
:smenu

:[priority] sme {menu-item} {command-string}

:[priority] smenu {menu-item} {command-string}


Define a menu item for select mode only. The priority determines its
placement in a menu. Higher numbers come first. The name of the
menu item is {menu-item}, and when the command is selected, the
command {command-string} is executed.
(See pages 461.)

:sn

:[count] sn[!] [file-list]


:split followed by :[count] next. If ! is specified, discard any
changes to buffers that have been modified, but not written. If filelist is specified, change the arguments to that list. (Same as:
:snext.)
(See page 337.)

:sN

:[count] sN[!]
:split followed by :[count] previous. If ! is specified, discard any
changes to buffers that have been modified, but not written.
(Note:The [count] parameter can be specified after the command-for example, :sN [count] .) (Same as: :sNext, :spr, :sprevious.)
(See page 337.)

:snext

:[count] snext[!] [file-list]


:split followed by :[count] next. If ! is specified, discard any
changes to buffers that have been modified, but not written. If
[file-list] is specified, change the arguments to that list. (Same
as: :sn.)
(See page 337.)

:sNext

:[count] sNext[!]
:split followed by :[count] previous. If ! is specified, discard any
changes to buffers that have been modified, but not written.
(Note:The [count] parameter can be specified after the command-for example, :sN [count] .) (Same as: :sN, :spr, :sprevious.)
(See page 337.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 700

Draft Not for publication

Draft 0.1

Not for widespread publication

:sni

:sni {command}

:sniff

:sniff {command}
Perform a command using the interface to Sniff+. If no command is
present, list out information on the current connection. Sniff+
support has to be compiled in for this to work (not on by default).
(See page 247.)

:sno

:[range] sno /{from}/{to}/[flags]

:snomgic

:[range] snomagic /{from}/{to}/[flags]


Substitute the pattern {to} for the pattern {from} for the given
range assuming that the 'nomagic' option is set.

:snoreme

(See page 429.)


:[priority] snoreme {menu-item} {command-string}

:snoremenu

:[priority] snoremenu {menu-item} {command-string}


Define a menu item like defined with :smenu, but do not allow
remapping of the {command-string}.
(See page 466.)

:so

:so {file}
Read in a session file. (Actually read in a whole set of commands.)
(Same as :source.)

:sor

(See pages 151, 156 344, 346, 411, 525, 554, 587.)
:[range] sor [flags] [/{pattern}/]

:sort

:[range] sort [flags] [/{pattern}/]


Sort a [range] of lines (default = entire file).
Flags are:
! -- Sort in reverse
i Ignore case
n Sort on the first decimal number
o Sort on the first octal number
r Sort on the pattern
u Output only unique lines
x Sort on the first hexadecimal number
The {pattern} denotes a pattern to be sorted on (r flag present) or
text to be ignored (no r flag.)
(See page 234.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 701

Draft Not for publication

Draft 0.1

:source

Not for widespread publication


:source {file}

Read in a session file. (Actually read in a whole set of commands.)


(Same as :so.)
:sp

(See pages 151, 156, 344, 346, 411, 525, 554, 587.)
:[count] sp [+cmd] [file-name]
Split the current window. If a [count] is specified, make the new
window [count] lines high. If a filename is present, put that file in
the new window. (Otherwise, use the current file.) (Same as:
:split, CTRL-W CTRL-S, CTRL-Ws, CTRL-WS.)

:spe

( See pages 83, 86, 86, 133, 136, 147, 232, 233.)
:[count] spe {word}
Add the {word} to the list of good words in the spelling list. The
optional [count] select which entry in the 'spellfile' list is used.
(Same as :spellgood.)
(See page 184.)

:spelld

:spelld[!]

:spelldump

:spelldump[!]
Open a new window and dump the list of spelling words into it. If the
override (!) option is used include the word count.
(See page 329.)

:spellgood
:[count] spellgood {word}
Add the {word} to the list of good words in the spelling list. The
optional [count] select which entry in the 'spellfile' list is used.
(Same as :spellg.)
(See page 184.)
:spelli

:spelli

:spellinfo

:spellinfo
Display current list of spell files.
(See page 185.)

:spellr

:spellr

:spellrepall

:spellrepall

Repeat the replace done with the last z= command for all matching
words.
(See page 182.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 702

Draft Not for publication

Draft 0.1

:spellu

Not for widespread publication


:[count]spellu[!] {word}

:spellundo

:[count]spellundo[!] {word}
Remove the {word} from the list of wrong wrong. If the override
option (!) is present the word in removed from the internal word list.
If [count] is specified, then [count] file in 'spellfile' is used.
(See page 184.)

:spellw

:[count]spellw[!] {word}

:spellwrong

:[count]spellwrong[!] {word}

Add {word} to the list of incorrect words. The override operator (!)
causes it to be added to the internal word list. If a [count] is
specified, the word is added to the [count] file in 'spellfile'.
(See page 184.)
:split

:[count] split [+cmd] [file-name]


Split the current window. If a [count] is specified, make the new
window [count] lines high. If a filename is present, put that file in
the new window. (Otherwise, use the current file.) (Same as: :sp,
CTRL-W CTRL-S, CTRL-Ws, CTRL-WS.)
( See pages 83, 86, 86, 133, 136, 232, 233.)

:spr

:[count] spr[!]

:sprevious

:[count] sprevious[!]
:split followed by :[count] previous. If ! is specified, discard
any changes to buffers that have been modified, but not written.
(Note:The [count] parameter can be specified after the command-for example, :sN [count].) (Same as: :sN, :sNext.)
(See page 337.)

:sr

:sr[!]

:srewind

:srewind[!]
:split followed by :rewind. If ! is specified, modified files whose
windows are closed will have their contents discarded. (Same as
:sfir, :sfirst.)
(See page 337.)

:st

:st[!]
Suspend the editor (UNIX terminal only). If the ! option is not
present and 'autowrite' is set, all changed files will be saved.
(Same as: :stop, :sus, :suspend and CTRL-Z.)
(See page 224.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 703

Draft Not for publication

Draft 0.1

:sta

Not for widespread publication


:[count] sta[!] {function}

:stag

:[count] stag[!]! {function}


A combination of :split and :tag. If a [count] is specified it is the
height of the new window.
(See page 133.)

:star

:star[!]
Begin insert mode as if a normal i command had been entered. If
the ! is present, the insert starts at the end of line as if an A
command had been issued. (Same as :startinsert.)
(See page 439.)

:startg

:startg[!]

:startgreplace

:startgreplace[!]

Begin virtual replace mode as if a normal gR command had been


entered. If the ! is present, the insert starts at the end of line as if an
$gR command had been issued.
(See page 278.)
:startinsert

:startinsert[!]

Begin insert mode as if a normal i command had been entered. If


the ! is present, the insert starts at the end of line as if an A
command had been issued. (Same as :star.)
(See page 439.)
:startr

:startr[!]

:startreplace

:startreplace[!]

Begin replace mode as if a normal R command had been entered. If


the ! is present, the insert starts at the end of line as if an $R
command had been issued.
(See page 427.)
:stj

:stj[!]! {ident}

:stjump

:stjump[!]! {ident}
Do a :split and a :tjump.
(See page 136.)

:stop

:stop[!]
Suspend the editor (UNIX terminal only). If the ! option is not
present and 'autowrite' is set, all changed files will be saved.
(Same as: :st, :sus, :suspend and CTRL-Z.)
(See page 224.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 704

Draft Not for publication

Draft 0.1

Not for widespread publication

:stopi

:stopi

:stopinsert

:stopinsert

Stop insert mode.


(See page 426.)
:sts

:sts[!] {ident}

:stselect

:stselect[!] {ident}
Do a :split and a :tselect.

(See page 136.)


:substitute
:[range] substitute /{[from}]/{[to}]/{[flags}]
Change the regular expression {from} to the string {to}. (Same as:
:s.)
(See pages 161, 163, 229, 231, 238, 240, 428, 553.)
See section Substitute flags on page 431 for a list of {flags}
:sun

:sun [count]

:sunhide

:sunhide [count]
Open a new window for all hidden buffer. Limit the number of
window to count, if specified. (Same as: :unh, :unhide.)
(See page 336.)

:sus

:sus[!]

:suspend

:suspend[!]
Suspend the editor (UNIX terminal only). Actually, works in Win32
also.). If the ! option is not present and 'autowrite' is set, all
changed files will be saved. (Same as: :stop, :st, and CTRL-Z.)
(See page 224.)

:sv

:sv [+command] [filename]

:sview

:sview [+command] [file-name]


Split the window like :split. The only difference is that the file is
opened for viewing.
(See page 88.)

:sw

:sw

:swapname

:swapname
List name of the current swap file.
(See page 219.)

:sy

:sy
List out all the syntax elements. (Same as: :syntax.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 705

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 588.)


:sy case match

:sy case match

Syntax definitions are case sensitive. In other words, the case of the
letters must match.
(See page 580.)
:sy case ignore

:sy case ignore

Syntax definitions are case not sensitive. In other words, case


differences are ignored.
(See page 580.)
:sy clear

:sy clear
Clear out any existing syntax definitions.
(See page 580.)

:sy cluster

:sy cluster {name} contains={groups}


\
add={groups} remove={group}

Define a cluster of syntax groups.


(See page 587.)
:sy include

:sy include @{cluster} {file}

Read in a syntax file and put all the defined groups in the specified
cluster. (See page 587.)
:sy keyword
:sy keyword {group}
\ {keyword} ... {keyword} {options}
Define a set of keywords for syntax highlighting. They will be
highlighted according to {group-name}. The options may appear
anywhere within the {keyword} list. Options can include 'contained',
nextgroup, skipwhite, skipnl, 'skipempty', and transparent.
Keywords for abbreviations can be defined like abbreviation. This
matches both abb and abbreviation.
(See page 580.)
:sy list

:sy list {group-name}


List out the named syntax groups.
(See page 588.)

:sy list

:sy list @{cluster-name}


List out the elements for syntax cluster.
(See page 588.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 706

Draft Not for publication


:sy match

Draft 0.1

Not for widespread publication

:sy match {group} excludenl {pattern} {options}


Define a regular expression that matches a syntax element. Options
can be contained, nextgroup, skipwhite, skipnl, skipempty,
transparent, and contains.
(See page 581.)

:sy off

:sy off
Turn off syntax highlighting. (Same as :syntax off.)
(See page 110.)

:sy on

:sy on
Turn on syntax highlighting. (Same as :syntax on.)

(See page 110, 155.)


:sy region
:sy region {options} matchgroup={group} keepend
\
\

excludenl start={pattern}
skip={pattern} end={pattern}

Define a syntax-matching region that starts and ends with the


specified pattern. Options can be contained, nextgroup, skipwhite,
skipnl, skipempty, transparent, 'contains', and oneline.
(See page 581.)
:sy sync

:sy sync ccomment {group-name}


\

minlines={min} maxlines={max}

Tell Vim to synchronize based on C-style comments. If a group name


is specified, use that group for highlighting; otherwise, use the group
name Comment. The 'minlines' and 'maxlines' options tell Vim
how much to look backward through the file for a comment.
(See page 588.)
:sy sync clear
:sy sync clear
Remove all syntax synchronization directives.
(See page 589.)
:sy sync clear

:sy sync clear {sync-group-name}


\

sync-group-name ...

Clear all the syntax synchronization commands for the named


groups.
(See page 589.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 707

Draft Not for publication

Draft 0.1

:sy sync match

Not for widespread publication

:sy sync match {sync-group-name}


\

grouphere {group-name} {pattern}

Define a synchronization command (in the group {sync-groupname}) that tells Vim that when it sees {pattern} that the group
{group-name} follows the match.
(See page 588.)
:sy sync match

:sy sync match {sync-group-name}


\

groupthere {group-name} {pattern}

Define a synchronization command (in the group {sync-groupname}) that tells Vim that when it sees {pattern} that the group
{group-name} precedes the match.
(See page 588.)
:sy sync minlines

:sy sync minlines={min}

Define the minimum number of lines for a brute-force


synchronization match.
(See page 588.)
:sy sync match

:sy sync match {match-specification}

Define a match or region to be skipped during synchronization.


(See page 588.)
:sync

:sync

:syncbind

:syncbind
Cause all scroll-bound windows to go to the same location.
(See page 382.)

:syntax

:syntax
List out all the syntax elements. (Same as: :sy.)

(See page 588.)


:syntax case match

:syntax case match

Syntax definitions are case sensitive. In other words, the case of the
letters must match.
(See page 580.)
:syntax case ignore

:syntax case ignore

Syntax definitions are not case sensitive. In other word, case


differences are ignored.
(See page 580.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 708

Draft Not for publication

Draft 0.1

Not for widespread publication

:syntax clear

:syntax clear

Clear out any existing syntax definitions.


(See page 580.)
:syntax cluster

:syntax cluster {name} contains={groups}


\

add={groups} remove={group}

Define a cluster of syntax groups.


(See page 587.)
:syntax sync

:syntax sync ccomment [group-name]


\

minlines={min} maxlines={max}

Tell Vim to synchronize based on C-style comments. If a group name


is specified, use that group for highlighting; otherwise, use the group
name Comment. The minlines and maxlines options tell Vim how
much to look backward through the file for a comment.
(See page 588.)
:syntax include

:syntax include @{cluster} {file}

Read in a syntax file and put all the defined groups in the specified
cluster.
(See page 587.)
:syntax keyword

:syntax keyword {group}


\

{keyword} ... {keyword} options

Define a set of key words for syntax highlighting. They will be


highlighted according to {group-name}. The options may appear
anywhere within the {keyword} list. Options can include contained,
nextgroup skipwhite, skipnl, skipempty, and transparent.
Keywords for abbreviations can be defined like abbreviation. This
matches both abb and abbreviation.
(See page 580.)
:syntax list

:syntax list {group-name}

List out the named syntax groups.


(See page 588.)
:syntax list

:syntax list @{cluster-name}

List out the elements for syntax cluster.


(See page 588.)
:syntax match
:syntax match {group} excludenl {pattern} options
Define a regular expression that matches a syntax element. Options
can be contained, nextgroup, skipwhite, skipnl, skipempty,
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 709

Draft Not for publication

Draft 0.1

Not for widespread publication

transparent, and contains.


(See page 581.)
:syntax off

:syntax off

Turn off syntax highlighting. (Same as :sy off.)


(See page 110, 155.)
:syntax on

:syntax on
Turn on syntax highlighting. (Same as :sy on.)

(See page 110.)


:syntax region

:syntax region options matchgroup={group}


\

keepend excludenl

start={pattern} skip={pattern} end={pattern}

Define a syntax-matching region that starts and ends with the


specified pattern. Options can be contained, nextgroup, skipwhite,
skipnl, skipempty, transparent, contains, and oneline.
(See page 581.)
:syntax sync clear

:syntax sync clear

Remove all syntax synchronization directives.


(See page 589.)
:syntax sync clear

:syntax sync clear {sync-group-name}


\

sync-group-name ...

Clear all the syntax synchronization commands for the named


groups.
(See page 588.)
:syntax sync match

:syntax sync match {sync-group-name}


\

grouphere {group-name} {pattern}

Define a synchronization command (in the group {sync-groupname}) that tells Vim that when it sees {pattern} that the group
{group-name} follows the match.
(See page 588.)
:syntax sync match

:syntax sync match {sync-group-name}


\

groupthere {group-name} {pattern}

Define a synchronization command (in the group {sync-groupname}) that tells Vim that when it sees {pattern} that the group
{group-name} precedes the match.
(See page 588.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 710

Draft Not for publication

Draft 0.1

:syntax sync minlines

Not for widespread publication


:syntax sync minlines={min}

Define the minimum number of lines for a brute- force


synchronization match.
(See page 588.)
:syntax sync region

:syntax sync region {region-specification}

Define a match or region to be skipped during synchronization.


(See page 588.)
:t

:[range] t {address}
Copy the range of lines below {address}. (Same as: :copy.)
(See page 424.)

:ta

:[count] ta[!]
Go forward [count] tags. (Same as: :tag.)
(See pages 132, 133, 407.)

:ta

:ta[!] /{pattern}
Search for all functions that match the regular expression defined by
{pattern} and jump to the first one.
(See page 134.)

:tab

:[count]tab {cmd}
Execute a command that normally opens a new window, but open a
new tab instead. If [count] is specified, then open the new tab after
the [count] tab in the list. Otherwise open a new tab to the right.
(See page 96.)

:tabc

:tabc[!]

:tabclose

:tabclose[!]
Close the current tab. If there are unsaved changes, this will fail
with an error, unless the override option (!) is present.
(See page 96.)

:tabd

:tabd {cmd}

:tabdo

:tabdo {cmd}
Execute the {cmd} for each tab. (See page 342.)

:tabe

:tabe

:tabedit

:tabedit
Create an empty buffer in a new tab. (Same as :tabnew.)
(See page 96.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 711

Draft Not for publication

Draft 0.1

Not for widespread publication

:tabnew

:tabedit
Create an empty buffer in a new tab. (Same as :tabe, :tabedit.)
(See page 96.)

:tabf

:tabf [++opt] [+cmd] {file}

:tabfind

:tabfind [++opt] [+cmd] {file}


Like :find, but in a new tab.
(See page 98.)

:tabfir

:tabfir

:tabfirst

:tabfirst
Go to the first tab. (Same as :tabr, :tabrewind.)
(See page 97.)

:tabl

:tabl

:tablast

:tablast
Go to the last tab.
(See page 97.)

:tabm

:tabm [position]

:tabmove

:tabmove [position]
Move the current tab to just after [postion]. If not specified, the
tab will be moved to the last position.
(See page 342.)

:tabn

:tabn [count]
Go to the next tab. If at the last tab, then wrap to the first. If a
[count] is specified, go to the indicated tab. (Same as :tabnext, <CPageDown>, gt.)
(See page 97.)

:tabN

:tabN [count]
Go to the previous tab. If you are already on the first one, wrap to
the last one. If a [count] is specified, go to the indicated tab.
(Same as :tabNext, :tabp, :tabPrevious, <C-PageUp>, gT.)
(See page 97.)

:tabnext

:tabnext [count]
Go to the next tab. If at the last tab, then wrap to the first. If a
[count] is specified, go to the indicated tab. (Same as :tabn,
<C-PageDown>, gt.)
(See page 97.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 712

Draft Not for publication

Draft 0.1

Not for widespread publication

:tabNext

:tabNext [count]
Go to the previous tab. If you are already on the first one, wrap to
the last one. If a [count] is specified, go to the indicated tab. (Same
as :tabN, :tabp, :tabPrevious, <C-PageUp>, gT.)
(See page 97.)

:tabo

:tabo[!]

:tabonly

:tabonly[!]
Make this tab the only tab closing all others.
(See page 96.)

:tabp

:tabp [count]

:tabprev

:tabprev [count]
Go to the previous tab. If you are already on the first one, wrap to
the last one. If a [count] is specified, go to the indicated tab. (Same
as :tabN, :tabNext, <C-PageUp>, gT.)
(See page 97)

:tabr

:tabr

:tabrewind

:tabrewind
Go to the first tab. (Same as :tabfir, :tabfirst.)
(See page 97.)

:tabs

:tabs
List each tab and the windows contained in them.
(See page 342.)

:tag

:[count] tag!
Go forward [count] tags. (Same as: :ta.)
(See pages 130, 131, 132, 133.)

:tag

:tag! /{pattern}
Search for all functions that match the regular expression defined by
{pattern} and jump to the first one. (Same as: :ta.)
(See pages 134, 407.)

:tags

:tags
List the tags.
(See page 131.)

:tc

:tc {command}

:tcl

:tcl {command}
Execute a single Tcl {command}.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 713

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 248.)


:tcld

:[range] tcld {command}

:tcldo

:[range] tcldo {command}


Execute a Tcl {command} once for each line in the range. The
variable "line" is set to the contents of the line.
(See page 248.)

:tclf

:tclf {file}

:tclfile

:tclfile {file}
Execute the Tcl script in the given {file}.
(See page 248.)

:te

:te {name}

:tearoff

:tearoff {name}
Tear off the named menu.
(See page 467.)

:th

:th {expr}

:throw

:throw {expr}
Throw an exception.
(See page 440.)

:tf

:[count] tf

:tfirst

:[count] tfirst
Go to the first tag. (Same as :tr, :trewind.)
(See page 135, 389.)

:tj

:tj[!] {ident}

:tjump

:tjump[!] {ident}
Like :tselect, but if there is only one tag, automatically pick it.
(See page 135, 136, 389, 407.)

:tl

:[count] tl

:tlast

:[count] tlast
Go to the last tag.
(See page 135, 389.)

:tm

:tm {menu-item} {tip}

:tmenu

:tmenu {menu-item} {tip}


Define the "tip" text that displays when the cursor is placed over an
icon in the toolbar.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 714

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 464.)


:tn

:[count] tn
Go to the next tag. (Same as: :tnext.)
(See page 135, 389.)

:tN

:[count] tN
Go to the previous tag. (Same as: :tNext, :tp, :tprevious.)
(See page 135, 389.)

:tnext

:[count] tnext
Go to the next tag. (Same as: :tn.)
(See page 135, 389.)

:tNext

:[count] tNext
Go to the next tag. (Same as: :tN, :tp, :tprevious.)
(See page 135, 389.)

:to

:to {cmd}

:topleft

:topleft {cmd}
Execute a command which which opens a window and make that
window to the top or left of the current window, overriding all other
windowing options.
(See page 342.)

:tp

:[count] tp

:tprevious
:[count] tprevious
Go to the previous tag.
(See page 135, 389.)
:tr

:[count] tr

:trewind

:[count] trewind
Go to the first tag. (Same as :tf, :tfirst.)
(See page 135, 389.)

:try

:try
Begin a try / catch block of commands. (For scripting.)
(See page 491.)

:ts

:ts[!] [ident]

:tselect

:tselect[!] [ident]
List all the tags that match [ident]. If [ident] is not present, use
the results of the last :tag command. After listing the tags, give the

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 715

Draft Not for publication

Draft 0.1

Not for widespread publication

user a chance to select one and jump to it.


(See page 134, 135, 136, 136, 389.)
:tu

:tu {menu-item}

:tunmenu

:tunmenu {menu-item}
Remove a "tip" from an menu item.
(See page 466.)

:u

:u
Undo a change. (Same as: :undo.)
(See page 283, 440.)

:una

:una {lhs}

:unabbreviate

:unabbreviate {lhs}

Remove the abbreviation.


(See page 413.)
:undo

:undo
Undo a change. (Same as: :u.)
(See page 283, 440.)

:undoj

:undoj

:undojoin

:undojoin
Make any additional changes part of the previous undo block. The
command set ends with the next user keypress.
(See page 284.)

:undol

:undol

:undolist

:undolist
List undo information.
(See page 282.)

:unh

:unh [count]

:unhide

:unhide [count]
Write the file in all windows. (Same as: :su, :sunhide.)
(See page 336.)

:unl

:unl[!] {variable}

:unlet

:unlet[!] {variable}
Remove the definition of the variable. If the force (!) option is
present, do not issue an error message if the variable is not defined.
(See page 485.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 716

Draft Not for publication

Draft 0.1

:unlo

Not for widespread publication


:unlo[!] [depth] {name}

:unlockvar
:unlockvar[!] [depth] {name}
Unload a variable locked with :lockvar. The [depth] if specified is a
code which indicates how to lock dictionaries and list. A value of 1
locks the size of the dictionary or list, but lets you change values.
The 2 code indicates th:unmenu(x1)at the top level values can not be
changed. A level of 3 indicates that the array, the values in the array,
and their values can not be changed. The override option (!) tell Vim
that nothing can be changed.
(See page 485.)
:unm

:unm[!] {lhs}

:unmap

:unmap[!] {lhs}
Remove a mapping. The override option (!) is used to :unmap for a
command in insert and command modes.
(See pages 417, 420.)

:unme

:[mode] unme {menu-item}

:unmenu

:[mode] unmenu {menu-item}


Remove the menu item named {menu-item}. The wildcard * will
match all menu items.
(See page 466.)

:up

:[range] up[!] [file]

:up

:[range] up[!] >> [file]

:up

:[range] up !{command}

:update

:[range] update[!] [file]

:update

:[range] update[!] >> [file]

:update

:[range] update !{command}


Acts just like the :write command if the buffer is modified. Does
absolutely nothing if it's it is not.
(See page 438.)

:v

:[range] v /{pattern}/ {command}


Perform {command} on all lines that do not have {pattern} in them in
the given range. (Same as: :vglobal, :global!, :g!.)
(See page 432.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 717

Draft Not for publication

Draft 0.1

Not for widespread publication

:ve

:ve
List version and configuration information, including the list of
.vimrc files read in at startup. (Same as :version.)
(See page 152.)

:verb

:[count]verb {cmd}

:verbose

:[count]verbose {cmd}
Execute {cmd} with the 'verbose' option set to [count].
(See page 554.)

:vert

:vert {cmd}

:vertical

:vertical {cmd}
Execute {cmd}. If it opens a new window, perform a vertical split.
(See page 88, 92.)

:version

:version
List version and configuration information, including the list of .vimrc
files read in at startup. (Same as :ve.)
(See page 152.)

:vglobal

:[range] vglobal /{pattern}/ {command}


Perform {command} on all lines that do not have {pattern} in them in
the given range. (Same as :v, :global!, :g!.)
(See page 432.)

:vi

:vi [+cmd] {file}


Close the current file and start editing the named file. If [+cmd] is
specified, execute it as the first editing command. (Same as:
:visual.)
(See page 158, 313, 237, 393.)

:vie

:vie [+cmd] {file}

:view

:view [+cmd] {file}


Like :vi, but open the file read-only.
(See page 77.)

:vim
:vimgrep

:vim[!] /{pattern}/[g][j] {file-list}


:vimgrep[!] /{pattern}/[g][j] {file-list}
Search the {file-list} for the given {pattern} and put the
results in the quick fix list. Go to the location of the first occurrence.
The g option causes lines which match {pattern} more than once to
be added more than once. The j flag tells Vim to update the list but
do not do the jump. The override (!) option will cause Vim to

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 718

Draft Not for publication

Draft 0.1

Not for widespread publication

abandon the current buffer even if there are unsaved modifications in


it.
(See page 242, 398, 401.)
:vimgrepa
:vimgrepa[!] /{pattern}/[g][j] {file-list}
:vimgrepadd

:visual

:vimgrepadd[!] /{pattern}/[g][j] {file-list}

Like :vimgrep, but add to the quick fix list instead of replacing it.
(See page 401.)
:visual [+cmd] {file}
Close the current file and start editing the named file. If [+cmd] is
specified, execute it as the first editing command. (Same as: :vi.)
(See page 158, 313.)

:viu

:viu

:viusage

:viusage
Show help on normal mode commands. This is for compatibility with
Nvi. The :help command is much more useful for getting help.
(See page 225.)

:vm

:vm
List all the mappings for visual-mode maps. (Same as: :vmap.)
(See pages 415, 418, 420.)

:vm

:vm {lhs}
List the visual mode mapping of {lhs}. (Same as: :vmap.)
(See pages 415, 420.)

:vm

:vm {lhs} {rhs}


Define a keyboard mapping for visual mode. (Same as: :vmap.)
(See pages 415, 420.)

:vmap

:vmap
List all the visual-mode mappings. (Same as: :vm.)
(See pages 415, 418, 420.)

:vmap

:vmap {lhs}
List the visual-mode mapping of {lhs}. (Same as: :vm.)
(See page 415, 420.)

:vmap

:vmap {lhs} {rhs}


Define a keyboard mapping for visual mode. (Same as: :vm.)
(See page 415, 415, 420.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 719

Draft Not for publication

Draft 0.1

Not for widespread publication

:vmapc

:vmapc

:vmapclear

:vmapclear
Clear all the visual-mode mappings.
(See page 420.)

:vme

:[priority] vme {menu-item} {command-string}

:vmenu

:[priority] vmenu {menu-item} {command-string}


Define a menu item that is available for visual mode only. The
priority determines its placement in a menu. Higher numbers come
first. The name of the menu item is {menu-item}, and when the
command is selected, the command {command-string} is executed.
(See page 461.)

:vn

:vn {lhs} {rhs}


Same as :vmap, but does not allow remapping of the {rhs}. (Same as
:vnoremap.)
(See page 420.)

:vne

:[n]vne [++opt] [+cmd] [file]

:vnew

:[n]vnew [++opt] [+cmd] [file]


Split the current window vertically and edit a new file. If no file is
specified a blank window is created.
(See page 88.)

:vnoremap

:vnoremap {lhs} {rhs}


Same as :vmap, but does not allow remapping of the {rhs}. (Same as
:vn.)

:vnoreme

(See page 420.)


:[priority] vnoreme {menu-item} {command-string}

:vnoremenu

:[priority] vnoremenu {menu-item} {command-string}


Like :vmenu, but the {command-string} is not remapped.
(See page 466.)

:vs

:[n]vs [++opt] [+cmd] [file]

:vsplit

:[n]vsplit [++opt] [+cmd] [file]


Split the window vertically and start editing the given file.
(See page 84.)

:vu

:vu {lhs}

:vunmap

:vunmap {lhs}
Remove the visual mode mapping for {lhs}.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 720

Draft Not for publication

Draft 0.1

Not for widespread publication

(See page 420.)


:vunme

:vunme {menu-item}

:vunmenu

:vunmenu {menu-item}
Remove the visual mode menu item named {menu-item}. The
wildcard * will match all menu items.
(See page 466.)

:w

:w[!]
Write out the current file. (Same as: :write.)

:w

(See page 77, 78, 164, 221, 239, 285, 334, 436.)
:[range] w[!]! filename
Write out the specified file. If no filename is specified, write to the
current file. The range defaults to the entire file. If the force (!)
option is present, overwrite an existing file, or override the read-only
flag. (Same as: :write.)
(See pages 77, 164, 239.)

:w

:[range] w[!]! >> file


Append the specified range to the file. This will fail if the file does
not exist unless the force (!) option is specified. (Same as: :write.)
(See page 77, 437.)

:wa

:wa

:wall

:wall
Write the file in all windows.
(See page 334.)

:wh

:wh {expression}

:while

:while {expression}
Start a loop.
(See page 490.)

:wi

:wi {width} {height}


Obsolete older command to set the number of rows and columns.
Use :set rows and :set columns instead. (Same as: :winsize.)
(See page 448.)

:winc

:[count]winc {arg}

:wincmd

:[count]wincmd {arg}
Simulate a CTRL-W command of the form [count] CTRL-W {arg}.
(See page 338.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 721

Draft Not for publication

Draft 0.1

Not for widespread publication

:wind

:wind {cmd}

:windo

:windo {cmd}
Execute {cmd} for each window.
(See page 338.)

:winp

:winp {X} {Y}

:winpos

:winpos {X} {Y}


Set the position opt-columns(26-1)of the window on the screen.
(See page 448.)

:winsize

:winsize {width} {height}


Obsolete older command to set the number of rows and columns.
Use :set rows and :set columns instead. (Same as: :wi.)
(See page 448.)

:wn

:count] wn[!] {+command} [files]


Shorthand for :write and :[count] next. (Same as: :wnext.)
(See page 79, 81, 313.)

:wN

:[count] wN[!]
Shorthand for :write and :[count] previous. (Same as:
:wprevious, :wp, :wNext.)
(See page 80, 313.)

:wnext

:[count] wnext[!] {+command} [files]


Shorthand for :write and :[count] next. (Same as: :wn.)
(See page 79, 81, 313.)

:wNext

:[count] wNext[!] {+command} [files]

:wp

:[count]wp[!] {+command} [files]

:wprevious

:
[count] wprevious[!] {+command} [files]
Shorthand for :write and :[count] previous. (Same as: :wN,
:wNext.)
(See page 80, 313.)

:wq

:[range] wq[!] file


Write the file and exit. If a range is specified, only write the specified
lines. If a file is specified, write the data to that file. When the
override option (!) is present, attempt to overwrite existing files or
read-only files.
(See pages 444.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 722

Draft Not for publication

Draft 0.1

Not for widespread publication

:wqa

:wqa[!]

:wqall

:wqall[!]
Shorthand for :wall and :qall. (Same as: :xa, :xall.)
(See page 334.)

:write

:write[!]
Write out the current file. (Same as: :w.)

:write

(See page 77, 78, 164, 221, 239, 285, 334, 436.)
:[range] write[!] [filename]
Write out the specified file. If no [filename] is specified, write to
the current file. The range defaults to the entire file. If the force (!)
option is present, overwrite an existing file, or override the read-only
flag. (Same as: :w.)
(See pages 77, 164, 239.)

:write

:[range] write[!] >> {file}


Append the specified range to the file. This will fail if the file does
not exist unless the force (!) option is specified. (Same as: :w.)
(See page 437.)

:ws

:ws {verb}

:wsverb

:wsverb {verb}
Used for integration with the Sun Visual WorkShop program.
(See page 248.)

:wv

:wv[!] {file}

:wviminfo

:wviminfo[!] {file}
Write the .viminfo file specified. If the override option is present (!),
any existing file will be overwritten.
(See page 322.)

:x

:[range] x[!] file


If the file has been modified, write it. Then exit. If the override (!)
option is present, overwrite any existing file. (Same as: :xit.)
(See page 285, 444.)

:X

:X
Prompt for an encryption key and assign the resulting value to the
'key' option.
(See page 210.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 723

Draft Not for publication

Draft 0.1

Not for widespread publication

:xa

:xa

:xall

:xall
Write all changed buffers and exit.
(See page 334.)

:xit

:[range] xit[!] {file}


If the file has been modified, write it. Then exit. If the override (!)
option is present, overwrite any existing file. (Same as: :x,
:exi, :exit.)
(See page 285, 444.)

:xm

:xm
List all the mappings for visual-mode only maps. (Same as: :xmap.)
(See page 420.)

:xm

:xm {lhs}
List the visual mode only mapping of {lhs}. (Same as: :xmap.)
(See page 420.)

:xm

:xm {lhs} {rhs}


Define a keyboard mapping for visual mode only. (Same as: :xmap.)
(See pages 420.)

:xmap

:xmap
List all the visual-mode only mappings. (Same as: :xm.)
(See pages 420.)

:xmap

:xmap {lhs}
List the visual-mode only mapping of {lhs}. (Same as: :xm.)
(See page 420.)

:xmap

:xmap {lhs} {rhs}


Define a keyboard mapping for visual mode only. (Same as: :xm.)
(See page 420.)

:xmapc

:xmapc

:xmapclear

:xmapclear
Clear all the visual-mode only mappings.
(See page 420.)

:xme
:xmenu

:[priority] xme {menu-item} {command-string}


:[priority] xmenu {menu-item} {command-string}
Define a menu item that is available for visual mode only. The

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 724

Draft Not for publication

Draft 0.1

Not for widespread publication

priority determines its placement in a menu. Higher numbers come


first. The name of the menu item is {menu-item}, and when the
command is selected, the command {command-string} is executed.
(See page 461.)
:xn

:xn {lhs} {rhs}

:xnoremap

:xnoremap {lhs} {rhs}


Same as :xmap, but does not allow remapping of the {rhs}.
(See page 461.)
:[priority] xnoreme {menu-item} {command-string}

:xnoreme
:xnoremenu

:[priority] xnoremenu {menu-item} {command-string}


Like :xmenu, but the {command-string} is not remapped.
(See page 461.)

:y

:[range] y {register}

:yank

:[range] yank {register}


Yank the range (default = current line) into the register (default =
the unnamed register).
(See page 439.)

:z

:[line] z{code} [count]


List the given line (default = current) and a few lines after it. The
code controls what section of the text is listed. The [count] defines
what "a few" is.
(See page 428.)

14424

:map Mode Table

14425

needs updating -- copy from chapter 24 end


NVO
:map
:no
:noreamp
:unm
:unmap
:mapc
:mapclear

14426

IC

:nm
:nmap
:nn
:nnremap
:nun
:numap
:nmapc
:nmapclear

:vm
:vmap
:vn
:vnoremap
:vu
:vumap
:vmapc
:vmapclear

:om
:omap
:ono
:onoremap
:ou
:oumap
:omapc
:omapclear

:map!
:imap
:no!
:noremap!
:unm!
:unmap!
:mapc!
:mapclear!

:im
:cmap
:ino
:inoremap
:iu
:iunmap
:imapc
:imapclear

C
:cm
:cno
:cnoremap
:cu
:cunmap
:cmapc
:cmapclear

Modes
N

Normal

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 725

Draft Not for publication

Draft 0.1

Visual

Operator pending

Insert

Command

vim-all-good.odt (28. Sep. 2007) The Vim Book

Not for widespread publication

Page 726

Draft Not for publication


14427

Draft 0.1

Not for widespread publication

Appendix E: Visual-Mode Commands


<Esc>
<Del>
CTRL-]
CTRL-\ CTRL-N
CTRL-G
CTRL-V
!{program}
$

<
=
>
:{command}
~
"{register}c
"{register}C

"{register}d

"{register}D
g@
g?

Cancel visual mode.


(See page 101, 103.)
Delete the highlighted text. (Same as visual d and x)
(See pages 49, 72, 99, 100, 101, 102, 347.)
Jump to highlighted tag.
(See page 104.)
Enter normal mode.
(See page 102.)
Toggle between select and visual mode.
(See page 358.)
Switch to visual block mode or exit block visual mode.
(See page 103.)
Pipe the selected text through an external program.
(See page 76, 355.)
Move to the end of the line and extend the
highlighting to the end of all the selected lines. (See
page 107, 347.)
Shift lines to the left (different in block visual mode.)
(See page 104, 115.)
Indent the lines.
(See page 104, 119.)
Shift lines to the right (different in block visual mode.)
(See page 104, 115, 129.)
Execute a colon-mode command on the selected lines.
(See page 355.)
Invert the case of the selected text.
(See page 353.)
Delete and enter insert mode. (Same as r and s.)
(See page 51, 103.)
Delete the selected lines and enter insert mode.
(Same as R and S.)
(See pages 103 and 107.)
Delete the highlighted text. (Same as visual x and
<Del>)
(See pages 49, 72, 99, 100, 101, 102, 347.)
Delete the highlighted lines.
(See page 102, 347.)
Call the function specified by the 'operatorfunc' to
process the text. (See page 504.)
Rot13 the text.
(See page 354.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 727

Draft Not for publication


gJ

gq
gv

J
K
o
"{register}r

"{register}R

"{register}s
"{register}S

u
U
V
"{register}x

"{register}X
"{register}y
"{register}Y
zf

Draft 0.1

Not for widespread publication

Join the selected lines with no spaces inserted


between the words.
(See page 103, 353.)
Format a block.
(See page 155, 175, 181, 354, 369.)
Toggle between the current and previous visual-mode
selection.
(See page 348.)
Join the selected lines.
(See pages 53, 103, 353.)
Look up the selected word using the man command.
(See page 104, 129.)
Jump to the other end of a visual selection.
(See page 351.)
Delete and enter insert mode (different in block visual
mode.) (Same as c and s.)
(See page 103.)
Delete the selected lines and enter insert mode. (Same
as C and S.)
(See page 103 and 107.)
Delete and enter insert mode. (Same as c and r.)
(See page 103.)
Delete the selected lines and enter insert mode. (Same
as C and R.)
(See page 103 and 107.)
Make the selected case all lowercase.
(See page 353.)
Make the selected case all uppercase.
(See page 353.)
Enter line visual mode, or exit to normal mode.
(See page 103.)
Delete the highlighted text. (Same as visual d and
<Del>)
(See pages 49, 72, 99, 100, 101, 102, 347.)
Delete the highlighted lines. (Same as visual D)
(See page 102.)
Yank the highlighted text into a register.
(See pages 74, 74, 103, 233, 233, 347, 361)
Yank the highlighted lines into a register. (See page
347.)
Create fold. (See page 384.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 728

Draft Not for publication


14428

Draft 0.1

Not for widespread publication

Visual Block Commands


Move the block to the right.
(See page 108.)
Move the block to the left.
(See page 108.)
Append string to the right side of each line.
(See page 107.)
Delete the selected text and then insert the string on
each line.
(See page 106.)
Delete selected text to end of line, then insert on
each line.
(See page 106.)
Insert text on the left side of each line.
(See page 105 and 106.)
Go to the other corner diagonally.
(See page 352.)
Replace all the text with a single character.
(See page 108.)

>
<
A{string}<Esc>
c{string}<Esc>

C{string}<Esc>

I{string}<Esc>
O
r{char}
14429
14430

Starting Select Mode


gCTRL-H
gh
gH
gV

14431

Start select block mode.


(See page 356.)
Start select character mode.
(See page 356.)
Start select line mode.
(See page 356.)
Do not automatically reselect an area after a command has
been executed.
(See page 356.)

Select Mode Commands


Arrow, CTRL,
Function Keys
(cursor motion)
{string}<Esc>
<BS>
CTRL-G

Extend selection.
(See page 356.)
Delete the selected text and replace it with string.
(See page 356.)
Backspace.
(See page 356.)
Go to visual mode. (See page 358.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 729

Draft Not for publication


CTRL-H
CTRL-O

Draft 0.1

Not for widespread publication

Delete the selected text. (See page 356.)


(See page 356.)
Switch from select mode to visual mode for one
command.
(See page 358.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 730

Draft Not for publication


14432

Draft 0.1

Not for widespread publication

Appendix F: Insert Mode Commands


<BS>
<BS>char1<BS>char2
<C-End>
<C-Home>
<C-Left>
<C-LeftMouse>
<C-Right>
<C-RightMouse>
<CR>
<Del>
<Down>
<End>
<Esc>
<F1>
<Help>
<Home>
<Insert>
<Left>
<LeftMouse>
<MiddleMouse>
<MouseDown>
<MouseUp>
<NL>
<PageDown>
<PageDown>
<Right>
<RightMouse>
<S-Down>
<S-Left>
<S-LeftMouse>

<S-MouseDown>
<S-MouseUp>
<S-Right>
<S-RightMouse>

Delete character before the cursor. (See page 317.)


Enter digraph (only when digraph option set). (See
page 278.)
Cursor past end of file. (See page 317.)
Cursor to start of file. (See page 317.)
Cursor one word left. (See page 317.)
Jump to the tag who's name is under the cursor. (See
page 169.)
Cursor one word right. (See page 317.)
Jump to the preceding tag in the stack. (See page 169.)
Begin new line.
Delete character under the cursor.
Cursor one line down. (See page 317.)
Cursor past end of line. (See page 317.) 476
End insert mode (unless 'insertmode' set). (See page
31, 37, 319, 415.)
Same as <Help>.
Stop insert mode and display help window.
Cursor to start of line. (See page 317.)
Toggle insert/replace mode.
Cursor one character left. (See page 317.)
Move cursor to mouse click. (See page 169, 476.)
Paste selected text into buffer at the mouse location.
(See page 169.)
Scroll three lines downward.
Scroll three lines upward.
Same as <CR>.
Scroll one screen forward. (See page 317.)
Scroll one screen backward. (See page 317.)
Cursor one character right. (See page 317.)
Extend selection from cursor to current mouse
location. (See page 169.)
Move one screen forward.
Cursor one word left.
Search for the word under the cursor. (If :behave
xterm.) Extend selection from cursor to mouse click.
(If :behave mswin.) (See page 169.)
Scroll a full page downward.
Scroll a full page upward.
Cursor one word right.
Search for previous occurance of the word under the

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 731

Draft Not for publication

<S-Up>
<Tab>
<Up>
CTRL-@
CTRL-[
CTRL-\ CTRL-N
CTRL-]
CTRL-_

CTRL-A
CTRL-C
CTRL-D
CTRL-E

Draft 0.1

Not for widespread publication

cursor. (If :behave xterm.) Popup menu. (If :behave


mswin.) (See page 169.)
Scroll one screen backward.
Insert a <Tab> character.
Move one line up. (See page 317.)
Insert previously inserted text and stop insert. (See
page 318.)
Same as <Esc>. (See page 31, 37, 319, 415.)
Go to Normal mode. (See page 319.)
Trigger abbreviation. (See page 415.)
When 'allowrevins' is set: change language
(Hebrew, Farsi) (only works when compiled with
+rightleft feature). (See page 253.)
Insert previously inserted text. (See page 317.)
Quit insert mode, without checking for abbreviation,
unless 'insertmode' set. (See page 415.)
Delete one shift width of indent in the current line.
(See page 118, 360.)
Insert the character that is below the cursor. (See
page 318.)

CTRL-G
CTRL-H
Same as <BS>.
CTRL-I
Same as <Tab>.
CTRL-J
Same as <CR>.
CTRL-K {char1} {char2} Insert digraph. (See page 57, 278.)
CTRL-L
When 'insertmode' is set, this command enables you
to leave insert mode. (See page 255.)
CTRL-M
Same as <CR>.
CTRL-N
Find next match for keyword in front of the cursor.
(See page 191.)
CTRL-O
Execute one normal mode command, then return to
insert mode. (See page 255, 320, 362.)
CTRL-P
Find previous match for word in front of the cursor.
(See page 190.)
CTRL-Q
Same as CTRL-V (used for terminal control flow on
some terminals). (See page 137, 318, 319, 366.)
CTRL-R register
Insert the contents of a register. (See page 319, 361.)
CTRL-R CTRL-O register Insert the contents of a register literally and do not
auto-indent. (See pages 319, 361, 362.)
CTRL-R CTRL-P register Insert the contents of a register literally and fix indent.
(See pages 361, 362.)
CTRL-R CTRL-R register Insert the contents of a register literally. (See pages
319.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 732

Draft Not for publication


CTRL-S
CTRL-T
CTRL-U
CTRL-V character
CTRL-V digit digit
digit
CTRL-W
CTRL-X
CTRL-X CTRL-]
CTRL-X CTRL-D
CTRL-X CTRL-E
CTRL-X CTRL-F
CTRL-X CTRL-I
CTRL-X CTRL-K
CTRL-X CTRL-L
CTRL-X CTRL-N
CTRL-X CTRL-O

CTRL-X CTRL-P
CTRL-X CTRL-T
CTRL-X CTRL-U

CTRL-X CTRL-V
CTRL-X CTRL-Y
CTRL-X s
CTRL-Y
CTRL-Z

Draft 0.1

Not for widespread publication

Used for terminal control flow. Not a Vim command.


Insert one shift width of indent in current line. (See
page 361.)
Delete all entered characters in the current line. (See
page 317.)
Insert next non-digit literally. (See pages 137, 318,
319, 366.)
Insert three-digit decimal number as a single byte.
(See page 318.)
Delete word before the cursor. (See page 317.)
Enter CTRL-X sub mode, see the following entries.
(See page 193.)
Search for the tag that completes the word under the
cursor. (See pages 193, 194).
Search for a macro definition for completion. (See
pages 193.)
Scroll up. (See page 199.)
Search filenames for completion. (See pages 193,
197.)
Search the current file and #include files for
completion. (See page 193.)
Complete identifiers from dictionary. (See page 193,
198.)
Search the line completion of the line under of the
cursor. (See pages 193, 198.)
Search for next word that matches the word under the
cursor. (See page 193.)
Perform omni completion. The word list for this is
obtained by calling the function named in the
'omnfunc' option. (See page 199.)
Search for previous word that matches the word under
the cursor. (See page 193.)
Perform a thesaurus search. (See page 198.)
Perform user completion. The word list for this is
obtained by calling the function named in the
'completefunc' option. (See page 199.)
Guess the type of the word before the cursor and
perform the appropriate completion. (See page 198.)
Scroll down. (See page 199.)
Use the spelling system to search for completions.
(See page 194.)
Insert the character that is above the cursor. (See
pages 318.)
When in insert mode, suspend Vim.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 733

Draft Not for publication


^CTRL-D
0 CTRL-D

Draft 0.1

Not for widespread publication

Delete all indent in the current line, and restore it in


the next. (See page 360.)
Delete all indent in the current line. (See page 360.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 734

Draft Not for publication


14433

Draft 0.1

Not for widespread publication

Appendix G: Option List


-A-

14434
aleph

al

Global Number Default: 128 for MS-DOS


224 otherwise

ASCII code for the first letter of the Hebrew alphabet. (See page 253.)
allowrevins ari
Global Boolean Default: off
All CTRL-_ to reverse the input direction. (See page 249.)
altkeymap
akm
Global Boolean Default: off
Used for Farsi and Hebrew input. (See page 252, 253.)
ambiwidth
ambw
Global String
Default: single
Used for foreign languages. (See page 250.)
antialias
anti
Global Boolean Default: off
If enabled some fonts will be antialised making them easier to read. (See page
475.)
autochdir
acd
Global Boolean Default: off
If set, change the current directory as you change files. (See page 436.)
arabic
arab
Local Boolean Default: off
Used for the Arabic language. (See page 251.)
arabicshape arshape Global Boolean Default: on
Used for the Arabic language. (See page 251.)
autoindent
ai
Local Boolean Default: off
Turn on automatic indentation. (See page 115, 117, 117, 156, 360, 546)
autoread
ar
Global Boolean Default off
If a file is changed outside Vim, just read it in instead of asking you about it.
(See page 145.)
autowrite
aw
Global Boolean Default: off
Instead of warning you when your command is going to discard change, write
out the file automatically. (See 79, 156.)
autowriteall awa
Global Boolean Default: off
Turns on automatic writing for a number of commands. (See page 79.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 735

Draft Not for publication

Draft 0.1

Not for widespread publication

-B-

14435

Default: dark or light depending on


terminal type.
Tells Vim if the default backup ground color is light or dark. (See page 111,
475.)
backspace
bs
Global String
Default: empty
background

bg

Global String

Defines how backup space types commands work in insert mode. (See page
150.)
backup
bk
Global Boolean Default: off
If set, create backup files. (See page 214.)
backupcopy
bkc
Global String
Vi Default: Unix: yes
Otherwise: auto
Defines the method to be used to make a backup copy of a file. (See page 215.)
backupdir
bdir Global String
Default: System dependent
A list of directories in which to place the backup. The first writable directory on
the list gets the file. (See page 214.)
backupext
bex
Global String
Default: ~
VMS: _
String thats added to a file name to make it a backup file name. (See page 214.)
backupskip
bsk
Global String
Default: /tmp/*,$TMPDIR/*,$TMP/*,
$TEMP/*
A set of file patterns that when matched will cause Vim to skip backup
generation. (See page 215.)
balloondelay bdlay Global Number Default: 600
Delay in milliseconds before a balloon may pop up. (See page 248.)
ballooneval beval Global Boolean Default: off
Enables the balloon text. (See page 248.)
balloonexpr bexpr Global String
Default: empty
Set the function to be called when deciding what balloon text to display. (See
page 248.)
binary
bin
Local Boolean Default: off
Indicates that the file is binary. (See page 186, 254.)
bioskey
biosk Global Boolean Default: on
When set, keyboard input is obtained from the BIOS. (See page 533.)
bomb

Local Boolean Default: off

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 736

Draft Not for publication

Draft 0.1

Not for widespread publication

If set a byte order mark (BOM) is placed at the beginning of the file. (See page
250.)
breakat
brk
Global String
Default: ^I!@*-+;:,./?
Defines characters which can be used for breaking long lines. (See page 328.)
browsedir
bsdir Global String
Default: last
Controls the initial directory for browse mode. (See page 470.)
bufhidden
bh
Local String
Default: empty
If set this buffer becomes hidden. (Don't use unless you know what you are
doing.) (See page 94.)
buflisted
bl
Local Boolean Default: on
If set the buffer is show in the list of buffers. If off, it is not shown. (See page
94.)
buftype
bt
Local String
Default: empty
Type of buffer. (See page 94.)

-C-

14436
casemap

cmp

Global String

Default: internal,keepascii

Defines the character set for the case changing operators. (See page 250.)
cdpath
cd
Global String
Default: equivalent to $CDPATH or ,,
A set of directories that will be searched when changing directory. (See page
436.)
cedit
Global String
Vi Default: empty
Vim Default: CTRL-F
The key that opens the command line window. (See page 421.)
charconvert
ccv
Global String
Default: empty
Used to convert characters when different encodings are used. (See page 250.)
cindent
cin
Local Boolean Default: off
If set use C style indenting. (See page 115, 155, 361, 546.)
cinkeys
cink Local String
Default: 0{,0},0
A set of keys that trigger cindent mode. (See page 372, 372.)
cinoptions
cino Local String
Default: empty
Defines how cindent mode works. (See page 372, 373,375.)
cinwords
cinw Local String
Default: if,else,while,do,for,
switch
Words that cause the next line to be indented in 'cindent' mode. (See page
117. 372, 379.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 737

Draft Not for publication


clipboard

cb

Draft 0.1

Global String

Not for widespread publication

X windows Default: autoselect,


exclude:cons\|linux
Otherwise: empty

Defines how the clipboard is used. (See page 474.)


cmdheight
ch
Global Number Default: 1
Number of lines for command prompts. (See page 535, 536.)
cmdwinheight
cwh
Global Number Default: 7
Number of lines that can be used for a command window. (See page 421.)
columns
co
Global Number Default: 80 or terminal width
Number of columns in the window. (See page 448.)
comments
com
Local String
Default:
s1:/*,mb:*,ex:*/,://,b:#,:%,:
XCOMM,n:>,fb:List of strings that can start a comment. (See page 155, 369.)
commentstring cms
Local String
Default /*%s*/
Comment template used for creating folding markers. (See page 384.)
compatible
cp
Global Boolean Default: Off unless a Vim specific
initialization file is found (i.e. .vimrc)
Controls Vi compatibility. (See page 28, 553.)
complete

cpt

Local

String

Default: .,w,b,u,t,i

Controls how completion works. (See page 192.)


completefunc
cfu
Local String
Default: empty
Function that is called as a result of the insert mode CTRL-X CTRL-U command.
(See page 199.)
completeopt
cot
Global String
Default: menu,preview
A list of options that define how insert mode completion is to be done. (See
page 192.)
confirm
cf
Global Boolean Default off
Confirm operations such as :q with a modified buffer. (See page 535.)
conskey
consk Global Boolean Default: off
When on, try to go directly to the BIOS for console keys. (Leave off unless you
know what you are doing.) (See page 533.)
copyindent
ci
Local Boolean Default: off
If set, try to copy the existing indentation structure when reindenting a file.
(See page 367.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 738

Draft Not for publication


cpoptions

cpo

Draft 0.1

Global String

Not for widespread publication

Vim Default: aABceFs


Vi Default: all flags

Compatibility options. (See page 553.)


cscopepathcomp cspc Global Number Default: 0
Defines the number of path components to include with a tag in a tag list for
Cscope. (See page 244.)
cscopeprg
csprg Global String
Default: cscope
Specifies the command to execute Cscope. (See page 244.)
cscopequickfix csqf Global String
Default: empty
If set, Cscope output goes to the quickfix window. (See page 244.)
cscopetag
cst
Global Boolean Default: off
If set Cscope will be used for tag commands. (See page 244.)
cscopetagorder csto Global Number Default: 0
Determines the search order for :cstabs. (See page 244.)
cscopeverbose csverb Global Boolean Default: off
When enabled a message is issued when a new cscope database is enabled. (See
page 244.)
cursorcolumn
cuc
Local Boolean Default: off
Highlight the column of where the cursor is located, if enabled. (See page 172.)
cursorline
cul
Local Boolean Default: off
When enabled the line on which the cursor rests will be highlighted. (See page
172.)
14437

-Ddebug
Global String
Default: empty
Used for debugging some macros. (See page 555.)
define
def Global String
Default: ^\s*#\s*define
Pattern used to locate macro definitions. (See page 397.)
delcombine
deco Global Boolean Default: off
Defines how Unicode characters are handled for foreign languages. (See page
250.)
dictionary
dict Global String
Default: empty
List of dictionary files used for word completion. (See page 192, 220.)
diff
Local
Boolean Default: off
Add this window to the set being used for a diff. (See page 380.)
diffexpr
dex Global String
Default: empty
Expression that defines the command to be used for a diff. (See page 380.)
diffopt
dip Global String
Default: filler
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 739

Draft Not for publication

Draft 0.1

Not for widespread publication

Controls how diff mode works. (See page 380.)


digraph
dg
Global Boolean Default: off
Enable the entry of digraphs using {char1}<BS>{char2}. (See page 278.)
directory
dir Global String
Default: System dependent
Defines where a swap file can be created. (See page 220.)
display
dy
Global String
Default: empty
Defines how text is displayed.

-E-

14438

Global String
Default: both
When 'equalalways' is set defines if vertical windows, horizontal windows, or
both are to be affected. (See page 341.)
edcompatible ed
Global Boolean Default: off
eadirection

ead

Turning this option on make the e and g flags of :substutute toggle. (For Vi
compatibility.) Please do not turn this on. (See page 553.)
encoding
enc Global String
Default: $LANG or latin1
Sets the character encoding. (See page 555.)
endofline
eol Local
Boolean Default: on
If not set, Vim will not automatically add an EOL to a file that does not have one.
(See page 186.)
equalalways ea
Global Boolean Default: on
When set try and keep windows the same size. (See page 340.)
equalprg
ep
Global String
Default: empty
Program to use for the = command. If not set, Vim's internal indention program
will be used. (See page 369.)
errorbells
eb
Global Boolean Default: off
If set, error which would ring the bell instead flash the screen. (See page 538.)
errorfile
ef
Global String
Amiga Default: AztecC.Err
Others: errors.err
Name of the error file for quickfix mode. (See page 143.)
errorformat efm Global String
Default: Complex
Defines the format of the error messages for quickfix mode. (See page 402.)
esckeys
ek
Global Boolean Vim Default: on
Vi Default: off
If set, Vim will recognize function keys even if they send an escape sequence.
(See page 534.)
eventignore ei
Global String
Default: empty

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 740

Draft Not for publication

Draft 0.1

Not for widespread publication

A list of event names that will be ignored. (Turns off events for some :autocomd
commands.) (See page 207.)
expandtab
et
Local
Boolean Default: off
In insert mode turn tabs into spaces if set. (See page 213, 366.)
exrc
ex
Global Boolean Default: off
If set, initialization files in the current directory will be read. (See page532.)

- F-

14439
fileencoding

fenc Local String

Default: empty

The current file encoding. (See page 252, 253, 254.)


fileencodings fencs Global String
Default: System dependent
A list of file encodings to try when reading a file. (See page 204.)
fileformat
ff
Global String
Default: File dependent
Current file format. (See page 185.)
fileformats
ffs Global String

Default: System dependent

A list of file formats which Vim will try and detect when reading a new file. (See
page 185.)
filetype
ft
Local String
Default: File dependent.
The type of file. (See page 112, 203)
fillchars
fcs Global String
Default: vert:|,fold:Define the fill characters for the status line and other informational lines. (See
page 541.)
fkmap
fk
Global Boolean Default: off
Used for Faris editing. (See page 252.)
foldclose
fcl Global String
Default: empty
When set to all, folds are closed automatically when the cursor moves off of
them. (See page 387.)
foldcolumn
fdc Local Number Default: 0
The width of the column showing the number of lines folded. (See page 386.)
foldenable
fen Local Boolean Default: on
When off, show all folds. When on, do folding normally. (See page 386.)
foldexpr
fde Local String
Default: 0
The expression to be used when 'foldmethod' is expr. (See page388, 555.)
foldignore
fdi Local String
Default: #

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 741

Draft Not for publication

Draft 0.1

Not for widespread publication

Lines starting with this character will be ignored when doing indent type
folding. (See page 124.)
foldlevel
fdl Local Number Default: 0.
Defines the level of folding for this buffer. (See page 123.)
foldlevelstart fdls Global Number Default: -1
Initial 'foldlevel' to be used when editing a new file. (See page 124.)
foldmarker
fmr Local String
Default: {{{,}}}
If we are using the marker method of folding, this option defines the markers.
(See page 383.)
foldmethod
fdm Local String
Default: manual.
Defines how folding is to be done. (See page 122, 383, 387, 388.)
foldminlines
fml Local Number Default: 1
The minimum number of lines for which to display a fold. (See page 387.)
foldnestmax
fdn Local Number Default: 20
The maximum nesting level of folds. (See page 387.)
foldopen
fdo Global String
Default: block,hor,mark,percent,
quickfix,search,tag,undo
The commands for which folds will be opened. (See page 387.)
foldtext
fdt Local String
Default: foldtext()
Configures how text folds are displayed. (See page 386.)
formatoptions fo
Local String
Vim Default: tcq
Vi Default: vt
A series of options that define how automatic formatting is to be done. (See
page 155, 178, 178, 180, 181, 371, 546.)
formatlistpat flp Local String
Default: ^\s*\d\+[\]:.)}\t ]\s*
A regular expression that is used to detect lists so that the -n flag may be
passed to the format programming. (See page 181.)
formatprg
fp
Global String
Default: empty
Name of the command used to format lines for gq if 'formatexpr' is empty.
(See page 181.)
formatexpr
fex Local String
Default: empty
Expression used to format lines for gq. If this is not set, the lines are run
through 'formatprg'. (See page 181, 555.)
fsync
fs
Global Boolean Default: on

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 742

Draft Not for publication

Draft 0.1

Not for widespread publication

When enabled, Vim tries to make sure that data is written to disk using the
fsync() system call. (See page 181.)

-G-

14440
gdefault

gd

Global

Boolean Default: off

When set all :substitute commands will be global. (See page 431.)
grepformat
gfm Global String
Default: %f:%l%m,%f %l%m
Format used to recognize what comes out of the :grep command. (The :grep
command is obsolete. Use :vimgrep instead.) (See page 407.)
grepprg
gp Global String
Default: System dependent
Program to use for the :grep command. (The :grep command is obsolete. Use
:vimgrep instead.) (See page 406.)
guicursor
gcr Global String
Default: System dependent
Define how the cursor looks in GUI mode. (See page 476.)
guifont
gfn Global String
Default: empty
Font to use for the GUI. (See page 475.)
guifontset
gfs Global String
Default: empty
Fonts to be used for the GUI. The first is for English, the second for special
characters. (See page 249.)
guifontwide
gfw Global String
Default: empty
Font to use for double wide characters. (See page 249.)
guiheadroom
ghr Global Number Default: 50
The number of pixels that you expect the windowing system to use for
decorations. (So when we go full screen we don't push any decorations off the
display.) (See page 479.)
guioptions
go Global String
Default: System dependent
A set of options which controls the behavior and appearance of the GUI. (See
page 323, 449, 475.)
guipty
Global Boolean Default: on
In GUI mode, try and open a pty (Psuedo Teletype) when executing an external
process. (See page 479.)
guitablabel
gtl Global String
Default: empty
Text to appear in the tab label for the GUI. (See page 343.)
guitabtooltip gtt Global String
Default: empty
Tooltip for the tab line of a GUI. (See page 343.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 743

Draft Not for publication

Draft 0.1

Not for widespread publication

-H-

14441

helpfile
hf
Global String
Default: System dependent
Name of the top level help file. (See page 554.)
helpheight
hh
Global Number Default: 20
Minimum height of the help window. (Seepage 543.)
helplang
hlg Global String
Default: locale dependent
Comma separated list of languages to search for help text. (See page 40.)
hidden
hid Global Boolean Default: off
Make buffers that become abandon hidden instead of making them just go away.
(See page 94.)
highlight
hl
Global String
Default: Complex string
Defines the highlighting for various system items. (See page 544.)
hlsearch
hls Global Boolean Default: off
If set, search results are highlighted. (See page 61, 156, 286, 293, 321)
history
hi
Global Number Vim Default: 20
Vi Default: 0
The number of entries remembered in the command mode (:) and search (/)
histories. (See page 321, 443.)
hkmap
hk
Global Boolean Default: off
Used for Hebrew input. (See page 253.)
hkmapp
hkp Global Boolean Default: off
Option for configuring the Hebrew keyboard. (See page 253.)

-I-

14442
icon

Global Boolean Default: off, on when title can be restored

When enabled, the name in the iconified Vim window will be set to the value of
'iconstring'. If that option is not set, the name of the current file will be
used. (See page 456.)
iconstring
Global String
Default: empty
The string to be used when the editing window is iconified. You have to have
the 'icon' option enabled for this to work. (See page 456.)
ignorecase
ic
Global Boolean Default: off
Determines if searches and completion commands are case sensitive or
insensitive. (See page 191, 287, 485, 519.)
imactivatekey imak Global String
Default: empty
Specifies which keys are used by the Input Method when using the X Windows
system. (See page 251.)
imcmdline
imc Global Boolean Default: off

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 744

Draft Not for publication

Draft 0.1

Not for widespread publication

If set automatically turns the input method (for foreign languages) when enter
commands. (Except for search patterns which is controlled by the 'imsearch'
option.) (See page 251.)
imdisable
imd Global Boolean Default: System dependent
When set, the input method is disabled. (See page 251.)
iminsert
imi Local Number Default: System dependent
Specifies how foreign language text is to be input. (See page 251.)
imsearch
ims Local Number Default: System Dependent
Specifies how foreign language text is to be input. (See page 251.)
include
inc Global String
Default: ^\s*#\s*include
Pattern that matches a #include line. (See page 398.)
includeexpr
inex Local String
Default: empty
Expression that changes a included file name from text to file name. For C this
is a noop, but for Java you have to change each . to /. (See page 398, 394.)
incsearch
is
Global Boolean Default: off
Turn on incremental searching. (See page 62, 156.)
indentexpr
inde Local String
Default: Language specific.
Expression which controls how indentation is done. (See page 555.)
indentkeys
indk Local String
Default: 0{,0},:,0#,!^F,o,O,e
A set of keys that when typed will trigger an indentation event.
infercase
inf Local Boolean Default: off
When doing replacement and work completion, see if you can determine the
correct case of the new word. (See page 191.)
insertmode
im
Global Boolean Default: off
When enabled, Vim works in insert mode as Default:. This option is useful for
people who don't know Vim and don't want to learn. However, if you're reading
this book, you are not one of those people. (See page 255.)
isfname
isf Global String
Default: System dependent
Determines which characters are considered part of a file name. (See page
260.)
isident
isi Local String
Default: system dependent
Determines which characters are part of an identifier. (See page 260.)
iskeyword
isk Global String
Default: Operating system and
compatibility mode dependent.
Defines what characters are considered part of a keyword. (See page 130,
258.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 745

Draft Not for publication


isprint

isp

Draft 0.1

Global String

Not for widespread publication

Default: System dependent

Determines which characters are printable. (See page 260.)

-J-

14443

joinspaces
js
Global Boolean Default: on
When enabled, Vim will insert spaces when two lines are joined. (See page
177.)

-K-

14444

key
Local
String
Default: empty
The current encryption key. (See page 210.)
keymap
kmp Local
String
Default: empty
Set the keyboard mapping. (See page 251.)
keymodel
km
Global String
Default: empty
A quick and dirty way for setting the behavior of certain special keys. (See page
168, 459.)
keywordprg
kp
Global String
System dependent.
Program that's used when the K command is executed. (See page 130.)

-L-

14445
langmap

lmap Global

String

Default: empty

Define a keyboard map for a foreign language. (See page 249.)


langmenu
lm
Global String
Default: empty
Language for menus. (See page 467.)
laststatus
ls
Global Number Default: 1
Determines when a status line is displayed at the bottom of a window. (See
page 340.)
lazyredraw
lz
Global Boolean Default: off
If set, redrawing will be done as little as possible in order to save terminal
bandwidth. (See page 552.)
linebreak
lbr Local
Boolean Default: off
If enabled Vim will try to break long lines in nice places. (See page 327.)
lines
Global Number Default: Terminal height.
Number of lines to use for the editing window. (See page 448.)
linespace
lsp Global Number Default: 0
Windows: 1
Amount of whitespace in pixels to add between lines in the GUI. (See page
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 746

Draft Not for publication


478.)
lisp

Local

Draft 0.1

Not for widespread publication

Boolean Default: off

Turns on a number of options to make editing Lisp easier. A holdover from the
Vi days. (See page 213, 546, 553.)
lispwords
lw
Global String
Default: Long and complex.
Words to use for Lisp indenting. (See page 553.)
list
Local
Boolean Default: off
Make all the invisible characters visible. Looks ugly, but you can see everything.
Good for finding out where you have tabs and where you have just a series of
spaces. (See page 137, 427, 543.)
listchars
lcs Global String
Default: eol:$
When the 'list' option is set, this controls how the invisible characters are
displayed on the screen. (See page 137, 543.)
loadplugins lpl Global Boolean Default: on
If set, load plugins from the plugin directory. (See page 154.)
14446

-Mmacatsui
Global Boolean Default: on
When set, enabled a hack to work around some drawing problems which are only
seen on Macintosh computers. Set it to off if you are on a Mac and experience
drawing problems.
Ideally this option should go away as soon as the underlying bug is fixed. (See
page 556.)
magic
Global Boolean Default: on
Changes the way certain pattern matching characters work. (See page 299, 429,
519.)
makeef
mef
Global String
Default: empty
Name of the error file for :make. If no string is specified, a temporary file is used.
If you put ## in the file name it will be replaced by a unique number.
(See
page 402.)
makeprg
mp
Global String
Default: make
VMS: MMS
The program to use when :make is executed. (See page 402.)
matchpairs
mps
Local String
Default: (:),{:},[:]
Things that can are considered matching pairs. Examples include (), [], and <>.
(See page 390.)
matchtime
mat
Global Number Default: 5
The time, in tenths of a second, to show the matching parenthesis (assuming
'showmatch' is set.) In order to be compatible with Nvi, this option uses tenths
of a second, while every other timing option uses milliseconds. (See page 390.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 747

Draft Not for publication

Draft 0.1

Not for widespread publication

maxcombine
mco
Global Number Default: 2
Maximum number of combining characters that are displayed when entering
text. (You can enter more, you just can't see them.) (See page 251.)
maxfuncdepth
mfd
Global Number Default: 100
Maximum length of the function call stack. (See page 551.)
maxmapdepth
mmd
Global Number Default: 1000
Number of times one mapping can trigger another. This prevents bad mappings
from going on endlessly. (See page 551.)
maxmem
mm
Global Number Default: System dependent
Maximum amount of memory to use for one buffer. (Seepage 551.)
maxmempattern mmp
Global Number Default: 1000
Maximum amount of memory to use for pattern matching. (See page 551.)
maxmemtot
mmt
Global Number Default: System dependent
Total amount of memory to use for buffers. (See page 551.)
menuitems
mis
Global Number Default: 25
Maximum number of items for a menu like the buffer menu who's contents are
generated automatically. (See page 462.)
mkspellmem
msm
Global String
Default: 460000,2000,500
Sets tuning parameters for the :mkspell command. (See page 329.)
modeline
ml
Local Boolean Vim Default: on,
Vi Default: off
If enabled Vim will check for mode lines within the files. These lines contain
Vim directives and are used to supply file specific to Vim. (See page 213, 531.)
modelines
mls
Global Number Default: 5
If non-zero the first and last 'modelines' number of lines is searched for a
mode line. (See page 368.)
modifiable
ma
Local Boolean Default: on
When enabled, the buffer can be modified. (See page 209.)
modified
mod
Local Boolean Default: off
Set automatically when the buffer is modified. (See page 222.)
more
Global Boolean Vim Default: on
Vi Default: off
When enabled, if the screen fills with messages, you'll get a More prompt.
(See page 546.)
mouse
Global String
Default: empty
GUI, MS-DOS and Win32: a
Enable the use of the mouse for certain types of text terminals. (See page 458.)
mousefocus
mousef Global Boolean Default: off
If enabled focus is automatically switched to whatever window is under the
mouse. (See page 457.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 748

Draft Not for publication

Draft 0.1

Not for widespread publication

mousehide
mh
Global Boolean Default: on
If enabled the mouse is hidden when typing text. (Actually mis-named, the
cursor is hidden. The mouse remains visible right next to your keyboard.) (See
page 459.)
mousemodel
mousem Global strings
Default: extend
MS-DOS and Win32: popup
Defines how the mouse works when selecting text. (See page 168, 457, 459.)
mouseshape
mouses Global String
Default: i:beam,r:beam,s:updown,
sd:cross, m:no,ml:up-arrow,
v:rightup-arrow
Defines how the mouse should look in various modes. (See page 477.)
mousetime
mouset Global Number Default: 500
Maximum time between the two mouse clicks of a double click. (See page 459.)
mzquantum
mzq
Global Number Default: 100
Controls polling times for MzScheme threads. (See page 246.)

-N-

14447
nrformats

nf

Local

String

Default: octal,hex

Defines the number formats recognized by Vim. Can be any combination of


octal and hex. (Decimal is always recognized.) (See page 274, 546.)
number
nu
Local
Boolean Default: off
Show line numbers in front of each line. (See page 46, 158, 361.)
numberwidth nuw Local
Number Vim Default: 4
Vi Default: 8
When line numbering is turned on, the minimum number of columns for the line
number. (See page 544.)

-O-

14448
omnifunc

ofu

Local

String Default: empty

Function to be used for the insert omni completion commands (CTRL-X CTRL-O).
(See page 199.)
operatorfunc opfunc Global String Default: empty
The function called by the g@ opeator. (See page 504.)
osfiletype
oft
Local String Default: System dependent.
For systems which support a file type, the file type to write. (See page 255.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 749

Draft Not for publication

Draft 0.1

Not for widespread publication

-P-

14449
paragraphs

para

Global

String

Default: IPLPPPQPP LIpplpipbp

When editing troff files, this option specifies the macros that start a paragraph.
(See page 187.)
paste
Global Boolean Default: off
When enabled a lot of other options are set so you can cut text from another
window and easily paste it in Vim. (See page 546.)
pastetoggle
pt
Global String
Default: empty
Define a key that will toggle the 'paste' option. (See page 546.)
patchexpr
pex
Global String
Default: empty
Expression to use for patching files. (See page 379.)
patchmode
pm
Global String
Default: empty
When set, if a file of this extension does not exist, Vim will use it to create a
backup file. Once this file is created, it is not overwritten. (See page 214.)
path
pa
Global String
Default: System dependent
Path on which to look for file when using gf , :find, and similar commands.
(See page 192, 393Error: Reference source not found.)
preserveindent pi
Local
Boolean Default: off
When redoing the indentation, attempt to preserve the existing indentation as
much as possible. (See page 367.)
previewheight pvh
Global Number Default: 12
Default height of the preview window. (See page 543.)
previewwindow pvw
Local
Boolean Default: off
If set, then this window is the preview window. (Only one preview window is
allowed.) (See page 390.)
printdevice
pdev
Global String
Default: empty
Name of the device to be used for hardcopy output. (See page 445.)
printencoding penc
Global String
System dependent
Character encoding for :hardcopy output. (See page 445.)
printexpr
pexpr
Global String
System dependent.
The command that prints the Postscript file produced for :hardcopy output.
(See page 445.)
printfont
pfn
Global String
Default: courier
Name of the font for :hardcopy output. (See page 445.)
printheader
pheader
Global String
Default: %<%f%h%m%=Page %N
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 750

Draft Not for publication

Draft 0.1

Not for widespread publication

Specifies the header for :hardcopy output. (See page 445.)


printmbcharset pmbcs
Global String
Default: empty
Controls the character set for CJK (Korean) printing. (See page 445.)
printmbfont
pmbfn
Global String
Default: empty
Controls the fonts to be used for CJK (Korean) printing. (See page 445.)
printoptions
popt
Global String
Default: empty
Controls how :hardcopy printing is done. (See 165.)
prompt
Global Boolean Default: on
When on a ":" prompt is used in Ex mode. (See page 158.)
pumheight
ph
Global Number Default: 0
Determines the maximum number of items to show in the popup menu for Insert
mode completion. When zero as much space as available is used.

-Q-

14450
quoteescape

qe

Local String

Default: \

The string to use for quoting characters when a shell command is issued. (See
page 441.)

-R-

14451
readonly

ro

Local Boolean Default: off

If enabled, no changes are allowed to the current file. (See page 222.)
remap
Global Boolean Default: on
Allows for mappings to work recursively. (See page419.)
report
Global Number Default: 2
When more than this many lines are changed, Vim will output a short message
telling you how many where changed. (See page 542.)
restorescreen rs Global Boolean Default: on
When set Vim will attempt to restore the original terminal screen when existing.
(See page 546.)
revins
ri Global Boolean Default: off
Inserting character will work right to left. (See page 249, 546.)
rightleft
rl Local Boolean Default: off
Enables right to left mode. (See page 249.)
rightleftcmd
rlc Local String
Default: search
Edit right to left instead of left to right. (See page 249.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 751

Draft Not for publication


ruler

ru

Draft 0.1

Not for widespread publication

Global Boolean Default: off

Show ruler. (See page 265, 542, 546.)


rulerformat
ruf Global String
Default: empty
Defines the look of a ruler line if set. (See page 542.)
runtimepath
rtp Global String
Default: System dependent
Path to use for locating runtime files. (See page 156, 525.)

-S-

14452
scroll

scr

Local

Number Default: half the window height

Number of lines to scroll with CTRL-U and CTRL-D commands. (See page 266.)
scrollbind
scb Local Boolean Default: off
All windows with 'scrollbind' set will scroll together. (See page 381.)
scrolljump
sj
Global Number Default: 1
Minimum number of lines to scroll when scrolling is needed. (See page 268.)
scrolloff
so
Global Number Default: 0
Minimum of lines to keep above or below the cursor before the screen scrolls.
(See page 268.)
scrollopt
sbo Global String
Default: ver,jump
Determines how scrolling is done. (See page 382.)
sections
sect Global String
Default: SHNHH HUnhsh
For users of troff, controls the macros that denote a section start. (See page
188.)
secure
Global Boolean Default: off
When set, locks Vim down so that a user can't do bad things like start a shell or
perform other insecure commands. (See page 532.)
selection
sel Global String
Default: inclusive
Controls how selection mode works. (See page 168, 476.)
selectmode
slm Global String
Default: empty
Defines what starts select mode. (See page 168, 356, 459.)
sessionoptions ssop Global String
Default: blank,buffers,curdir,
folds,help,options,tabpages,
winsize"
Controls what goes into a session created by the :mksession command. (See
page 344, 344.)
shell
sh
Global String
Default: System dependents.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 752

Draft Not for publication

Draft 0.1

Not for widespread publication

Name of the shell program to use for shell commands. (See page 441, 523.)
shellcmdflag
shcf Global String
Default: System dependent.
The flag you have to send to the shell to tell it that a command files. (See page
441.)
shellpipe
sp
Global String
Default: System dependent
Determines how shell output is piped to the user and a file. (See page 441.)
shellquote
shq Global String
Default: System dependent
Determines show shell arguments are quoted. (See page 441.)
shellredir
srr Global String
Default: System dependent
Controls how the output of shells are redirected to a file. (See page 441, 523.)
shellslash
ssl Global Boolean Default: off
When set a forward slash is used when expanding file names. (See page 441.)
shelltemp
stmp Global Boolean Vi Default: off,
Vim Default: on
When enabled use temporary files for shell output. When disabled, pipes are
used. (See page 441.)
shelltype
st
Global Number Default: 0
Determines how shell commands are spawned on an Amiga. (See page 255.)
shellxquote
sxq Global String
Default: System dependent
Determines how arguments are quoted for shell commands. Don't fiddle with
this unless you know what you are doing. (See page 441.)
shiftround
sr
Global Boolean Default: off
When set, indent commands move things to the a rounded indent stop. When
clear, shift commands move things a full 'shiftwidth' regardless of the current
position. (See page 368.)
shiftwidth
sw
Local Number Default: 8
Number of spaces for indenting. (See page 114, 156, 361, 361, 364, 373.)
shortmess
shm Global String
Vim Default: filnxtToO
Vi Default: empty
POSIX Default: A
A set of letters that control when short messages are used instead of long ones.
This help prevent excessive Hit Enter prompts due to long messages. (See
page 537.)
shortname
sn
Local Boolean Default: off
When turned on, file names are restricted to the MS-DOS 8.3 style. You have to
have a pretty old and restricted system to need this option. (See page 222.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 753

Draft Not for publication


showbreak

sbr

Draft 0.1

Global String

Not for widespread publication

Default: empty

When wrapping lines, this string is put at the beginning of the continuation line.
The character > is a common value for this option. (See page 328.)
showcmd
sc
Global Boolean Vim Default: on
Unix: off
Vi Default: off
When typing a multi-character command, show the portion already entered on
the status line. (See page 536, 536.)
showfulltag
sft Global Boolean Default: off
When completing a tag in insert mode, show not only the tag (procedure name)
but the full tag (procedure name and arguments). (See page 196.)
showmatch
sm
Global Boolean Default: off
When enabled, inserting a parenthesis, bracket, or similar character causes the
cursor to temporarily jump to the matching character. (See page 213, 390, 546.)
showmode
smd Global Boolean Vim Default: on
Vi Default: off
When set, show the current mode in the status line. (See page 536, 536.)
showtabline
stal Global Number Default: 1
Tells Vim when to display the tab line at the top of the screen. Values include:
0 Never
1 Only if two or more tabs are present.
2 Always
(See page 344.)
sidescroll
ss
Global Number Default: 0
Minimum number of character to scroll when moving horizontally. The default
(0) causes the cursor to jump to the middle of the screen when scrolling. (See
page 268.)
sidescrolloff siso Global Number Default: 0
If you have 'nowrap' set, the minimum number of columns to keep on either
side of the cursor (if possible). (See page 268.)
smartcase
scs Global Boolean Default: off
If enabled and you have 'ignorecase' then typing in a mixed character string
will cause 'ignorecase' to be ignored. (See page 288.)
smartindent
si
Local Boolean Default: off
Enables an indenting algorithm that mostly works for C like languages, but has
been obsoleted by 'cindent'. (See page 115, 117, 546)
smarttab
sta Global Boolean Default: off

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 754

Draft Not for publication

Draft 0.1

Not for widespread publication

When enabled a <Tab> at the front of the line inserts spaces or blanks according
to your 'shiftwidth'. In the middle of a line, it inserts tabs. (See 364.)
softtabstop
sts Local Number Default: 0
Number of columns that are used for tabstops when the <Tab> key is pressed.
Depending on your settings, this may result in a tab or spaces being inserted.
(See 364, 546.)
spell
Local Boolean Default: off
When on spell checking will be done. (See page 181.)
spellcapcheck spc Local String
Default: [.?!]\_[\]
Regular expression used to find an end of sentence. (See page 329.)
spellfile
spf Local String
Default: empty
Name of the file where Vim is to store words added to the dictionary. (See page
183, 184.)
spelllang
spl Local String
Default: en
A list of languages to use for spelling. (See page 183.)
spellsuggest
sps Global String
Default: best
A list of methods to be used for deciding how to to suggest spelling corrections.
Values include best, double, fast, {number}, file:{filename}, expr:
{expression}. (See page 329.)
splitbelow
sb
Global Boolean Default: off
When enabled, the split command creates a new window below the current one.
(See page 341.)
splitright
spr Global Boolean Default: off
When enabled, the split command creates the new window to the right of the
current one. (See page 341.)
startofline
sol Global Boolean Default: on
When enabled, changes the behavior of some movement commands so that they
also move the cursor to the first non-blank column of the line. If disabled, Vim
attempts to keep the cursor in the same column. (See page 551.)
statusline
stl Global String
Default: empty
Define how the status line is displayed. (See page 539.)
suffixes
su
Global String
Default: .bak,~,.o,.h,.info,
.swp,.obj
When doing a wildcard match, put files with these suffixes last on the list. (See
'wildignore' for how to completely ignore files.) (See page 511, 548.)
suffixesadd
sua Local String
Default: empty

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 755

Draft Not for publication

Draft 0.1

Not for widespread publication

List of suffixes used when searching for a file using gf. (See page 394.)
swapfile
swf Local Boolean Default: on
If set, use a swap file for this buffer. (See page 220.)
swapsync
sws Global String
Default: fsync
When set, causes a sync operation to be executed each time the swap file is
written. This causes Vim to tell the operating system to flush the disk buffers so
that the data is really written to the disk. If set to sync all buffers for all files
will be flushed. Setting it to the null string turns off this operation. (See page
220.)
switchbuf
swb Global String
Default: empty
Controls how buffers are displayed when switching buffers. (See 95, 95, 406.)
synmaxcol
smc Local Number Default: 3000
Limit on the number of columns to be used for searching for syntax highlighting
elements. (0 is no limit.) (See page 590.)
syntax
syn Local String
Default: empty
The name of the syntax to use for syntax highlighting. This can actually contain
more than one language, for example c.doxygen tells Vim to use C syntax
highlighting and then the doxygen highlighting. The special string ON and OFF
turn syntax highlighting on and off. (See page 412.)

-T-

14453
tabline

tal

Global String

Default: empty

Defines how the tab line (the line at the top of the screen containing a list of
tabs) looks in terminal (non-GUI) mode. (See page 344.)
tabpagemax
tpm
Global Number Default: 10
Maximum number of tabbed panes that can be opened from the command line.
(See page 98.)
tabstop
ts
Local Number Default: 8
Number of spaces for each tab stop. (This value was chosen because the old
Teletype terminals had tab stops hardwired in at 8. Most programs honor this
value, so don't change this value unless you are ready to deal with a lot of
problems external programs.) (See page 361, 364, 366.)
tagbsearch
tbs
Global Boolean Default: on
If enabled, use a binary search to locate tags. This is faster for large tagfiles,
but won't work if the tagfile is not sorted. (See page 407.)
taglength
tl
Global Number Default: 0
If non-zero, tags are significant up to this number of characters. (See page 407.)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 756

Draft Not for publication

Draft 0.1

Not for widespread publication

tagrelative
tr
Global Boolean Default: on
If enabled, then tags are resolved relative to the directory where the tagfile
resides. (See page 407.)
tags
tag
Global String
Default: ./tags,tags
If compiled with with the
+emacs_tags:
./tags,./TAGS,tags,TAGS
A list of files which contains the tags for use with tag related commands. (See
page 407.)
tagstack
tgst Global Boolean Default: on
When enabled, the tagstack acts normally. When disabled, the :tag and
:tselect commands with an argument will not push a tag onto the stack. (See
page 407.)
term
on
String
Default: System dependent
The name of the terminal being used. (See page 552.)
termbidi
tbidi Global Boolean Default: off
mlterm: on
If set, the terminal handles bidirection text instead of Vim. (See page 250.)
termencoding
tenc Global String
Default: System dependent
Character encoding system used by the GUI. (See page 250.)
terse
Global Boolean Default: off
When set, output terse messages. See the 'shortmess' option for details. (See
page 538.)
textauto
ta
Global Boolean Vim Default: on
Vi Default: off
This option is obsolete. Use 'fileformats'. (See page 556.)
textmode
tx
Local Boolean Operating system dependent
This option is obsolete. Use 'fileformat'. (See page 556.)
textwidth
tw
Local Number Default: 0
The width of the text being inserted. Lines longer than this will be
automatically wrapped. A value of 0 turns off automatic line wrapping. (See
page 156, 173, 178, 179, 180, 181, 213, 546.)
thesaurus
tsr
Global String
Default: empty
Name of the file used for the thesaurus completion commands (CTRL-X CTRL-T).
(See page 192,220.)
tildeop
top
Global Boolean Default: off

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 757

Draft Not for publication

Draft 0.1

Not for widespread publication

When set the tilde (~) command acts like an operator. If not set, the tilde (~)
command acts like a motion command. (See page 279, 553.)
timeout
to
Global Boolean Default: on
ttimeout
Global Boolean Default: off
These two options control whether Vim will timeout in the middle of a function
key sequence or sequence defined by the :map command. The values are:
'timeout' 'ttimeout'
Action
off

off

do not time out

on

n.a.

Time out on both :map and function key sqeuences

off
on
(See page 534.)
timeoutlen
ttimeoutlen

time out key codes


tm
ttm

Global Number
Global Number

Default: 1000
Default: -1

These two options control the time (in milliseconds) allowed between characters
when Vim is looking for a sequence of keystrokes. Terminal function keys send
out such sequences, but sequences can also be defined using the :map
command.
Normally only 'timeoutlen' is used. If 'ttimeoutline' is set to then it is used
for function key sequences, and 'timeoutlen' is then only used for :map
sequences. (See page 534.)
title
Global Boolean Default: Terminal dependent
If set, Vim will attempt to change the title of the terminal window in which it is
running. (See page 454.)
titlelen
Global Number Default: 85
What percentage of the window to use for the title. (See page 455.)
titleold
Global String
Default: Thanks for flying Vim
When Vim exists, it tries to restore the original title. If it can't it will use the
value of this option as the title to be displayed after Vim has stopped. (See page
456.)
titlestring
Global String
Default: empty
The title of the window. (See page 456.)
toolbar
tb
Global String
Default: icons,tooltips
Controls what goes into the toolbars. Possible values are: icons, text, horiz,
tooltips. (See page 454.)
toolbariconsize tbis Global String
Default: small
The size of the icons in the toolbar. Values are tiny, small, medium, and large.
(See page 455.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 758

Draft Not for publication


ttybuiltin

tbi

Draft 0.1
Global Boolean

Not for widespread publication

Default: on

When enabled Vim will search its internal terminal database before searching
any external ones. (See page 552.)
ttyfast
tf
Global Boolean Default: on for most terminals
If set indicates you have a fast terminal and Vim can redraw the screen using a
system which sends more characters, but looks better. (See page 552.)
ttymouse
ttym Global String
Default: depends on 'term'
Controls how mouse events are sent to Vim through a terminal. (See page 552.)
ttyscroll
tsl
Global Number Default: 999
Maximum number of lines to scroll the screen. If there are more lines
to scroll the window is redrawn. For terminals where scrolling is
very slow and redrawing is not slow this can be set to a small number,
e.g., 3, to speed up displaying. (See page 552.)
ttytype
tty
Global String
Default: from $TERM
Alias for 'term', see above. (See page 552.)

-U-

14454
undolevels

ul

Global

Number 100
Unix, VMS, Win32, OS/2: 1000

Maximum number of changes that can be undone. (See page 281.)


updatecount uc
Global Number Default: 200
The number of characters you can type before the swap file is written. (See
page 219.)
updatetime
ut
Global Number Default: 4000
If set, the number of milliseconds of idle time before the swap file is written.
(See page 203, 219.)

-V-

14455
verbose

vbs

Global Number Default: 0

Controls how much debugging information is displayed. (See page 554.)


verbosefile vfile Global String
Default: empty
If set, the name of a file where verbose messages are logged. (See page 555.)
viewdir
vdir
Global String
Amiga, MS-DOS, OS/2 and Win32:
$VIM/vimfiles/view,
Macintosh: $VIM:vimfiles:view
VMS: sys$login:vimfiles/view

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 759

Draft Not for publication

Draft 0.1

Not for widespread publication

RiscOS: Choices:vimfiles/view
Directory where view files (:mkview) are stored. (See page 346.)
viewoptions

vop

Global String

Default: folds,options,cursor

Controls what's saved using the :mkview command. (See page 346.)
viminfo
vi
Global String
Vi mode: empty
Vim mode for MS-DOS, Windows and
OS/2: '20,<50,s10,h,rA:,rB:
Vim mode for other systems:
'20,<50,s10,h
A string defining what data is stored in a .viminfo file. (See page 320-322, 481.)
virtualedit ve
Global String
Default: empty
Tells Vim when you can do virtual editing. (See page 277.)
visualbell
vb
Global Boolean Default: off
Use a visual bell instead of beeping. (See page 538.)
14456

-Wwarn
Global Boolean Default: on
Give a warning message when a shell command is used while the buffer
has been changed. (See page 538.)
weirdinvert wiv Global Boolean Default: off
Provided for backward compatibility with version 4.x. Mostly it's here to get
around some problems with strange terminals. (See page 553.)
whichwrap
ww
Global String
Vim Default: b,s
Vi Default: empty
Specifies which characters are allowed to move the cursor past the end of line or
beginning on line. (See page 264.)
wildchar
wc
Global Number Vim mode: <Tab>
Vi mode: CTRL-E
Character that starts wildcard expansion in command line mode. (See page
547.)
wildcharm
wcm Global Number Default: 0
The character number of a character will act like 'wildchar' when used inside
macros. (See page 547.)
wildignore
wig Global String
Default: empty
A list of file patterns of files that you want to ignore when doing command line
completion. For example, you probably want to ignore all object files because
you never edit them in Vim. (See page 511, 548.)
wildmenu
wmnu Global Boolean Default: off
When 'wildmenu' is enabled then attempting to complete a command line
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 760

Draft Not for publication

Draft 0.1

Not for widespread publication

command with <Tab> may result in a menu being shown giving you a list of
possible completions to accept. (See page 548.)
wildmode
wim Global String
Default: full
Along with 'wildchar', controls how completion mode operates. Values
include:
<empty>
Complete only the first match
full

Cycle through each complete match.

longest

Complete the longest possible string. If this does not result


in a completion, then use the next completion mode.

longest:fill Like longest, but start 'windmenu' mode if enabled.


list

If more than one match, show a list of possible matches.

list:full

When more that one match, list all matches, then select the
first full match.

list:longest When there is more than one match, list all the matches
and then select the longest string.
(See page 548.)
wildoptions wop Global String
Default: empty
In command mode the CTRL-D key causes a matching list of files to be displayed.
When this option is set to tagfile, a matching list of tags and files will be
displayed. (See page ##.)
winaltkeys
wak Global String
Default: menu
If set to no, the ALT key will work like it normally does in Microsoft Windows.
It will select menu items. If set to menu, then ALT is just another keyboard
modifier that can be used for Vim commands. (See page 476, 533.)
window
wi
Global Number Default: screen height - 1
When CTRL-F, <PageUp>, CTRL-B, and <PageDown> are used to move the screen
up or down a page, this option defines the number of lines in a page. (See page
267, 268.)
winheight
wh
Global Number Default: 1
Minimum height of the current window. (See page 340.)
winfixheight wfh Local
Boolean Default: off
Do not change the height of this window even if 'equalalways' is set. (See
page 341.)
winfixwidth wfw Local
Boolean Default: off
Do not change the width of this window even if 'equalalways' is set. (See page
341.)
winminheight wmh Global Number Default: 1
Minimum height of a window that's not the current window. (See page 340.)
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 761

Draft Not for publication

Draft 0.1

Not for widespread publication

winminwidth wmw Global Number Default: 1


Minimum width of the windows that are not current. (See page 340.)
winwidth
wiw Global Number Default: 20
Minimum width of the current window. (See page 340.)
wrap
Local
Boolean Default: on
If set, long lines will wrap around and be displayed on the screen. If not set the
ends of long lines go off the screen and can only be seen when you use horizontal
scrolling. (See page 323, 327.)
wrapmargin
wm
Local
Number Default: 0
When typing characters with auto-wrap turned on, the number of characters to
use for a right margin. (See page 174, 546.)
wrapscan
ws
Global Boolean Default: on
If set searches wrap past the beginning or end of the file. (See page 289.)
write
Global Boolean Default: on
If set, the user is allowed to write files. If not set, you can look but not touch
(write) files. (See page 551.)
writeany
wa
Global Boolean Default: off
If set, when writing files do not force the user to use the overwrite (!) option if a
file is going to overwrite an existing file. (See page 551.)
writebackup wb
Global Boolean Default: on with writebackup feature
off otherwise
If set, then files are written by making a backup, writing the file, and deleting
the backup. (See page 215.)
writedelay
wd
Global Number Default: 0
A debugging option which inserts the specified amount of time (in milliseconds)
between each character output. Basically a simple way of slowing down the
editor so you can see how it redraws the screen. (See page554.)
14457
14458

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 762

Draft Not for publication

Not for widespread publication

Appendix H: Vim License Agreement

14459
14460
14461
14462
14463
14464
14465
14466
14467
14468
14469
14470
14471
14472
14473
14474
14475
14476
14477
14478
14479
14480
14481
14482
14483
14484
14485
14486
14487
14488
14489
14490
14491
14492
14493
14494
14495
14496
14497
14498
14499
14500
14501
14502
14503
14504
14505
14506
14507
14508
14509
14510
14511

Draft 0.1

VIM LICENSE
I)

There are no restrictions on distributing unmodified copies of Vim except


that they must include this license text. You can also distribute
unmodified parts of Vim, likewise unrestricted except that they must
include this license text. You are also allowed to include executables
that you made from the unmodified Vim sources, plus your own usage
examples and Vim scripts.

II) It is allowed to distribute a modified (or extended) version of Vim,


including executables and/or source code, when the following four
conditions are met:
1) This license text must be included unmodified.
2) The modified Vim must be distributed in one of the following five ways:
a) If you make changes to Vim yourself, you must clearly describe in
the distribution how to contact you. When the maintainer asks you
(in any way) for a copy of the modified Vim you distributed, you
must make your changes, including source code, available to the
maintainer without fee. The maintainer reserves the right to
include your changes in the official version of Vim. What the
maintainer will do with your changes and under what license they
will be distributed is negotiable. If there has been no negotiation
then this license, or a later version, also applies to your changes.
The current maintainer is Bram Moolenaar <Bram@vim.org>. If this
changes it will be announced in appropriate places (most likely
vim.sf.net, www.vim.org and/or comp.editors). When it is completely
impossible to contact the maintainer, the obligation to send him
your changes ceases. Once the maintainer has confirmed that he has
received your changes they will not have to be sent again.
b) If you have received a modified Vim that was distributed as
mentioned under a) you are allowed to further distribute it
unmodified, as mentioned at I). If you make additional changes the
text under a) applies to those changes.
c) Provide all the changes, including source code, with every copy of
the modified Vim you distribute. This may be done in the form of a
context diff. You can choose what license to use for new code you
add. The changes and their license must not restrict others from
making their own changes to the official version of Vim.
d) When you have a modified Vim which includes changes as mentioned
under c), you can distribute it without the source code for the
changes if the following three conditions are met:
- The license that applies to the changes permits you to distribute
the changes to the Vim maintainer without fee or restriction, and
permits the Vim maintainer to include the changes in the official
version of Vim without fee or restriction.
- You keep the changes for at least three years after last
distributing the corresponding modified Vim. When the maintainer
or someone who you distributed the modified Vim to asks you (in
any way) for the changes within this period, you must make them
available to him.
- You clearly describe in the distribution how to contact you. This
contact information must remain valid for at least three years

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 763

Draft Not for publication


14512
14513
14514
14515
14516
14517
14518
14519
14520
14521
14522
14523
14524
14525
14526
14527
14528
14529
14530
14531
14532
14533
14534
14535
14536
14537

14538
14539

Draft 0.1

Not for widespread publication

after last distributing the corresponding modified Vim, or as long


as possible.
e) When the GNU General Public License (GPL) applies to the changes,
you can distribute the modified Vim under the GNU GPL version 2 or
any later version.
3) A message must be added, at least in the output of the ":version"
command and in the intro screen, such that the user of the modified Vim
is able to see that it was modified. When distributing as mentioned
under 2)e) adding the message is only required for as far as this does
not conflict with the license used for the changes.
4) The contact information as required under 2)a) and 2)d) must not be
removed or changed, except that the person himself can make
corrections.
III) If you distribute a modified version of Vim, you are encouraged to use
the Vim license for your changes and make them available to the
maintainer, including the source code. The preferred way to do this is
by e-mail or by uploading the files to a server and e-mailing the URL.
If the number of changes is small (e.g., a modified Makefile) e-mailing a
context diff will do. The e-mail address to be used is
<maintainer@vim.org>
IV)

It is not allowed to remove this license from the distribution of the Vim
sources, parts of it or from a modified version. You may use this
license for previous Vim releases instead of the license that they came
with, at your option.

Author's Note
By Steve Oualline

14540
14541
14542
14543

The people behind Vim have spent a lot of time and effort to make one of
the best editors in the world. Yet they do not ask anything for themselves;
instead, they ask that you help some of the poorest and most needy people in
Africa. Please send them a donation.

14544
14545
14546

If you work for a medium-size or large company, please take the time to
tell your boss how much using Vim has helped you and encourage your company
to make a substantial donation.

14547

The people behind Vim are good people. Please help them out.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 764

Draft Not for publication


14548

Draft 0.1

Not for widespread publication

Appendix I: Basic Vim Quick Reference

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 765

Draft Not for publication

Draft 0.1

Not for widespread publication

14549

Appendix J: Vim Quick Reference

14550

Minimum Command Set. Learn This First.


Basic Movement

k
l

[number]j Down
[number]k Up
[number]h Left

[number]r Right

Basic Movement
14551

Editing Commands

14552

u Undo

14553

CTRL-R Redo

14554

i{text}<Esc> Insert text in front of cursor

14555

a{text}<Esc> Insert text after cursor

14556

[number]x Delete characters

14557

[number]dd Delete Lines

14558

Getting Out
ZZ Write file and exit

14559

:q! Abort edits and discard all work (since editing


started or the last :write command).

Note: On Linux and Unix you must enable the Vim command set

14560

Use the command:

14561

$ touch .vimrc

14562

to create a .vimrc file which tells Vim it's OK to act like Vim.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 766

Draft Not for publication


14563

Draft 0.1

Not for widespread publication

Vertical Movement / Scrolling

14564

[number]CTRL-B Screen down (also <PageUp>)

14565
14566
14567

[number]CTRL-U Window down (Actually the number of lines defined by


'scroll'. The [number] set the size of the movement
('scroll'), down not specify the number of moves.)

14568

[number]CTRL-Y Lines down

14569

[number]CTRL-F Screens up

14570
14571
14572

[number]CTRL-D Window up. Actually the number of lines defined by


'scroll'. The [number] set the size of the movement
('scroll'), down not specify the number of moves.)

14573

[number]CTRL-E Lines up

14574
Line
Line
Line
Line
Line
Line
Line
Line
Line
Line

10
11
12
13
14
15
16
17
18
19

Line
Line
Line
Line
Line
Line
Line
Line
Line
Line

10
11
12
13
14
15
16
17
18
19

CTRL-Y
(Line 9 is new top line)

Line
Line
CTRL-U (Line 5 top)
Line
Line
Line
Line
Line
Line
CTRL-B
Line
(Line 1 is new top line)
Line

?
?
?
?
?
?
?
?
?
?

Line
Line
Line
Line
Line
Line
Line
Line
CTRL-D (Line 15 top)
Line
Line
CTRL-E
(Line 11 is new top line)

?
?
?
?
?
?
?
?
?
?

14575
14576

14577

CTRL-F
(Line 18 is new top line)

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 767

Draft Not for publication

Draft 0.1

Not for widespread publication

14578

[number]-

Go up [number] lines to start

14579

[number]<CR>

Forward to start of the next [number] line

14580

[number]_

Cursor to start of [number] lines lower

14581
14582
14583
14584
14585
14586
14587
14588
14589
14590
14591
14592
14593

User interfaces are


interesting. First we had
text, but that was not good
enough. Then we had icons,
but then the icons got to
confusing, so we added
(minus) tooltips. So now when you
place a cursor over an icon
you get text. The icon you
can't understand with the
<CR>
text you can, replaced the
original text menus.

2_

14594
14595

m{mark}

Place mark.

14596

`{mark}

-- Go to mark.

14597
14598

'{mark}

Go to first non-blank character of the line containing


{mark}

14599
14600
14601

{count}%

Go to {count} percent of the file. The {count} must be


specified because % with no {count} goes to the matching
brace, parenthesis, or curly bracket.

14602

[number]G

-- Go to line [number] (default = last line).

14603

Screen Location
[number]H line from top of screen

M Middle of the screen

[number]L line from bottom of the


screen

"What's the fastest way to


move 500GB of data daily
from Santa Cruz to
Los Angeles?".
Answer:

FedEx.

14604

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 768

Draft Not for publication


14605

Screen Redrawing

14606
14607
14608

[count]z<cr>

Not for widespread publication

Redraw with this line at the top of the window. If


[count] is specified, the line will be [count] lines from
the top.

A dozen, a gross, and a score,


Plus three times the square root of
four,
Divided by seven,
Plus five time eleven,
Equals nine squared plus zero, no
more.

14609

Draft 0.1

Plus five time eleven,


Equals nine squared plus zero, no
more.

z<cr>
***
A UNIX sales lady, Lenore,

[count]z{height}<cr>

14610

Like z<cr> only set the window height as well.

14611
14612

[count]z+

Redraw the screen with [count] line at the top. If no


[count] specified, this command acts like z<cr>.

14613
Line
Line
Line
Line
Line

14614
14615

10
11
12
13
14

[count]zLine
Line
Line
Line
Line

14616
14617

10
11
12
13
14

[count]z.

2z+

Line
Line
Line
Line
Line

2
3
4
5
6

Put line [count] at the bottom of the screen. If no


[count] is specified, put the current line at the bottom.

12z-

Line
Line
Line
Line
Line

8
9
10
11
12

Put line [count] at the center of the screen. If no


[count] is specified, put the current line at the center.

14618
Line
Line
Line
Line
Line

10
11
12
13
14

33z.

Line
Line
Line
Line
Line

vim-all-good.odt (28. Sep. 2007) The Vim Book

31
32
33
34
35

Page 769

Draft Not for publication


14619

Draft 0.1

Not for widespread publication

Virtual movement
j Move up

gj Virtual Move up

k Move down gk Virtual Move down


l Move right gl Virtual Move right
h Move left
14620
14621
14622
14623
14624

gh Virtual Move left

'virtualedit' option values:


block
Allow virtual editing in Visual block mode.
insert Allow virtual editing in Insert mode.
all
Allow virtual editing in all modes.
onemore Allow the cursor to move just past the end of the line

14625

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 770

Draft Not for publication


14626
14627

Draft 0.1

Not for widespread publication

Commands for English Text


:set tw={number}

14628
14629

Set the width for automatic text wrapping. (Does not


wrap existing text.)

14630

:set spell

Turn on spell checking

14631
14632

z=

Suggest corrections for the misspelled word under the


cursor.

14633

[s

Previous spelling error

14634

]s

Next spelling error

14635

Text Movement

14636

'(

Sentence start

14637

')

Sentence end

14638

[number](

Sentences backward

14639

[number])

Sentences forward

14640

'{

Paragraph start

14641

'}

Paragraph end

14642

[number]{

Paragraph backwards

14643

[number]}

Paragraph forward.

14644

gq{motion}

Format text

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 771

Draft Not for publication


14645

Draft 0.1

Not for widespread publication

Horizontal Movement

14646

[number]fx

Single character forward search, stop on character.

14647

[number]Fx

Single character reverse search, stop on character.

14648

[number]tx

Single character forward search, stop before character.

14649

[number]Tx

Single character forward search, stop before character.

14650

fi

14651
14652
14653

Fh

To err is human.
To really foul up you need a computer.
ty
Ty

14654

[number];

Repeat last single character search

14655

[number],

Repeat last single character search in the other direction

14656

fo

14657

To keep things fouled up you need a government.

14658

14659

[number]e

Forward to end of word.

14660

[number]E

Forward to end of WORD.

14661

[number]w

Forward to start of word.

14662

[number]W

Forward to start of WORD.

14663

[number]b

Backward to start of word.

14664

[number]B

Backward to start of WORD.

14665

[number]ge

Backward to end of word.

14666

[number]gE

Backward to end of WORD.

14667
14668
14669
14670

3w

In Vim A.word is not A.WORD need.more.words.


And hereis an-example of back-ward stuff.
b
B
gE
ge
vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 772

Draft Not for publication

Draft 0.1

14671

First character of the line

14672

Last character on the line

14673

14674

Not for widespread publication

This is a test.

14675

g0

First character of the screen line

14676

g$

Last character of the screen line

14677
14678

g$

g^

This is a very long unwrapped text that exceeds the screen size

14679
14680

m{mark}

Place mark

14681

'{mark}

Go to line containing mark

14682

`{mark}

Go to character containing mark

14683

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 773

Draft Not for publication


14684
14685

[number]i{text}<ESC>
Insert text at the current cursor position..
[number]I{text}<ESC>

14688
14689
14690

Insert text at the beginning (first no blank character) of


the line.
[number]a{text}<ESC>

14691
14692

Not for widespread publication

Changing text

14686
14687

Draft 0.1

Insert text after the cursor.


[number]a{text}<ESC>

14693

Append text to the end of the line.

14694

[number]O

Open [number] line above

14695

[number]o

Open [number] lines below

14696

xp

14697

[number][{register}]d{move}

14698
14699
14700
14701
14702
14703
14704
14705
14706
14707

Reverse characters

Delete text from the current position to where the move


takes you.
[number][{register}]dd
Delete lines.
[number][{register}]D
Delete to the end of line (and [number]-1 more lines).
[number][{register}P
Put text in front of the cursor.
[number][{register}P
Put text in back of the cursor.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 774

Draft Not for publication

Draft 0.1

Not for widespread publication

14708

[{register}][number]c{motion}{text}<ESC>

14709

Change text.

14710

[{register}][number]cc{text}<ESC>

14711
14712

Change lines of text.


[{register}][number]C{text}<ESC>

14713
14714

Change text from the cursor to the end of the line.


[number]r{char}

14715
14716

Replace character under the cursor.


[number]R{text}<ESC>

14717
14718

Replace a series of characters.


[number]gr{char}

14719
14720

Replace a single virtual character.


[number]gR{text}<ESC>

14721

Replace a series of virtual characters.

14722

[number]J

Join lines

14723

[number]gJ

Join lines without adding a space

14724

[number][{register}]s{text}<ESC>

14725
14726

Delete [number] characters, then enter insert mode.


[number][{register}]S{text}<ESC>

14727

Delete [number] lines, then enter insert mode.

14728

14729

[number][{register}]X

14730

Undo all the changes on a line (twice redoes them).

Delete characters before the cursor.

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 775

Draft Not for publication


14731

Yank text into a register. (Copy.)


[number][{register}]yy

14734
14735

Yank lines into a register. (Copy.)


[number][{register}]Y

14736
14737

Yank to the end of the line.


[number]gU{motion}

14738

Make the text upper case.

14739

[number]gUgU

14740

[number]gUU

14741

[number]gu{motion}

14742

Make lines upper case.

Make the text lower case.

14743

[number]gugu

14744

[number]guu

14745

[number]g?{motion}

14746

Make lines lower case.

Encode / decode text with rot13.

14747

[number]g?g?

14748

[number]g??

14749

[number]!!{motion}{command}

14750
14751
14752

Not for widespread publication

[number][{register}]y{motion}

14732
14733

Draft 0.1

Encode / decode lines with rot13.

Filter lines through {command}.


[number]!!
Filter lines through {command}.

14753

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 776

Draft Not for publication


14754
14755

[number]CTRL-W +
Increase the current window's height.
[number]CTRL-W -

14758
14759

Decrease the current window's height.


[number]CTRL-W <

14760
14761

Increase the current window's width.


[number]CTRL-W >

14762

Decrease the current window's width.

14763
14764
14765
14766
14767
14768

CTRL-W <
O woe to Myrtle the turtle
Who found programming quite a hurtle
CTRL-W the system you see
was slower than he
and that's not saying much for the turtle.

14769

CTRL-W +

CTRL-W >

14770

CTRL-W =

14771

[number]CTRL-W _

14772
14773

Not for widespread publication

Windows

14756
14757

Draft 0.1

Make all windows the same height.

Set window height.


[number]CTRL-W |

14774

Set window width.

14775

CTRL-W H

Move the window to far left.

14776

CTRL-W L

Move the window to far right

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 777

Draft Not for publication

Draft 0.1

Not for widespread publication

14777
CTRL-W H

14778
14779
14780
14781
14782
14783
14784
14785

One
~
~
~
~
~
one.c [+]

|Two
|~
|~
|~
|~
|~
two.c [+]

14786

|Three
|~
|~
|~
|~
|~
three.c [+]

CTRL-W L

14787
14788

CTRL-W K

Window to top

14789

CTRL-W J

Window to bottom

14790
14791
14792
14793
14794
14795
CTRL-W J
14796
14797
14798
14799
14800
14801
14802
14803

One
~
~
~
one.c [+]
Two
~
~
two.c [+]
Three
~
~
three.c [+]

14804

CTRL-W R

Rotate windows up.

14805

CTRL_W r

Rotate windows down.

vim-all-good.odt (28. Sep. 2007) The Vim Book

CTRL-W K

Page 778

Draft Not for publication


14806
14807
14808
14809
14810
14811
14812
14813
14814
14815
14816
14817
14818 CTRL-W r
14819
14820
14821
14822
14823
14824
14825
14826
14827
14828
14829

One
~
~
~
one.c [+]
Two
~
~
two.c [+]
Three
~
~
three.c [+]

CTRL_W x

CTRL-W r

Draft 0.1

One
~
~
~
one.c [+]
Two
~
~
two.c [+]

CTRL-WW

Previous window (wrap)

14831

CTRL-Wn

Next window (wrap)

14832

CTRL-Wb

Bottom window

14833

CTRL-Wj

Window up

14834

CTRL-Wk

Window down

14835

CTRL-Wl

Window left

14836

CTRL-Wh

Window left

14837

CTRL-Wt

Window top

14838

CTRL-WP

Preview window

14840

CTRL-W R

Exchange window

14830

14839

Not for widespread publication

Others
CTRL-Ws

Split current window

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 779

Draft Not for publication

Draft 0.1

Not for widespread publication

14841

CTRL-Wv

Vertical split

14842

CTRL-W^

Split and edit alternate file

14843

CTRL-Wf

Split and edit file under cursor

14844

CTRL-WF

Split and edit file with line number

14845

CTRL-Wgf

Edit file with new tab

14846

CTRL-WgF

Same thing with line number

14847

CTRL-Wn

New window

14848

CTRL-WT

Make window a new tab.

14849

CTRL-Wc

Close window

14850

CTRL-Wo

Close everyone else (only window)

14851

CTRL-Wq

Quit window

14852

CTRL-Wz

Close preview

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 780

Draft Not for publication


14853
14854

Draft 0.1

Not for widespread publication

Multiple Files
:args {file-list}

14855
14856

Set the file list to the given files. Wildcards like *, **,
and ? may be used.

14857

CTRL-^

Edit alternate file

14858

:n

Next file in the argument list

14859

:p

Previous file in the argument list

14860

:first

First file on the list

14861

:last

Last file on the list.

14862

gf

Edit the file who's name is under the cursor

14863
14864

gF

Like gf but if a line number follows, position the cursor


on that line.

14865

CTRL-W gf

Edit the file who's name is under the cursor in a new tab.

14866

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 781

Draft Not for publication

Draft 0.1

Not for widespread publication

14867

Searching

14868

Search word forward for the word under the cursor

14869

Search word backward for the word under the cursor

14870

g#

Search string forward for the word under the cursor

14871

g*

Search string backwards for the word under the cursor

14872

/{text}

14873

?{text}

Search reverse

14874

Repeat search

14875

Repeat search backward

Search forward

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 782

Draft Not for publication


14876

Search Pattern Reference

14877

Simple atoms
Pattern
abc
\\
\/
\.
\{
\[
\$
\^
\%dnnn
\%xnn
\%onnn
\%unnnn
\%Unnnnnnnn
\e
\t
\r
\b
\n

14878

Draft 0.1

Not for widespread publication

Description
Example
Result
/abc
abcdef
cba
Literal
/\\
a\b
Literal \
/\/
a/b
Literal /
/\.
a.b a+b
Literal .
/\{
a{b a+b
Literal {
/\[
a[b a+b
Literal [
/\$
a$b a+b
Literal $
/\^
a^b a+b
Literal ^
The character who's decimal number is nnn
The character who's hexadecimal number is nn
The character who's octal number is nnn
The multibyte character who's number is nnnn
The large multibyte character who's number is nnnnnnnn
<Esc> Character
<Tab> Character
<CR> Character
<BS> Character
End of line

Character Classes
Pattern
Description
Example
\a
\a
Alphabetic character
\i
\i
Identifier
(defined by 'isident')
\I
Identifier excluding digits \I
\k
\k
Keyword
(defined by 'iskeyword')
\K
Keyword excluding digits \k
\f
\f
File name
(defined by 'isfname')
\F
File name excluding digits \F
\p
\p
Printable
(defined by 'isprint')
\P
Pritable name excluding \P
digits
\s
\s
Whitespace

Result
ab123(*&ab
abc def a10b
abc def a10b
abc def a10b
abc def a10b
sam.txt /root/sam.txt f10.dat
sam.txt /root/sam.txt f10.dat
sam.txt ^A^B^C f10.dat
sam.txt ^A^B^C f10.dat
Space tab

vim-all-good.odt (28. Sep. 2007) The Vim Book

done

Page 783

Draft Not for publication

Draft 0.1

Pattern
\S
\d
\D
\x
\X
\o
\O
\w

Example
\S
\d
\D
\x
\X
\o
\O
\w

Result
Space tab
done
1234 abc xyz
1234 abc xyz
1234 abc xyz
1234 abc xyz
1234567890 abc xyz
1234567890 abc xyz
_test10 -- a -- test

\W

_test10 -- a -- test

\w
14879

Description
Non-whitespace
Digit
Non-digit
Hex-digit
Non-hex digit
Octal-digit
Non-octal digit
Word character
(a-z,A-Z,0-9, underscore)
Non-word character

Modifiers
Pattern
\c
\C
\m
\M
\v
\V
\Z

14880

Description
Example
Result
ABC abc
\cabc
Ignore case
aBC abc ABC
\ca\CBC
Match case
Turn 'magic' off
Turn 'magic' on
Turn very magic on
Turn off very magic
Ignore differences in Unicode combination characters

Grouping and Repeats


Pattern
\~
\(xx\)
\1
\9

14881

Not for widespread publication

Description
Example
Last substitute
string
/\(ab\)\1
Grouping
First match inside \(...\)
Ninth match inside \(...\)

Result

abab abx

Sets of Characters
Pattern
[abc]
[a-f]
[^abc]
\%[string]

Description
Example
Any of the given [abc]
characters
[a-f]
From a to f
Any character [^a-f]
except a,b, or c
Match as much a\%[bcd]
of string as
possible

vim-all-good.odt (28. Sep. 2007) The Vim Book

Result
abcdefgaaxxyycc
axbxefxx
axbxefxx
abxx
abcxx

Page 784

Draft Not for publication


14882

Draft 0.1

Not for widespread publication

Anchors
Pattern
^
$
\_^

\_$

\<
\>
\%^
\%$
\%V
\%#
\%55l
\%5l
\%7l
\%'m
\zs
\ze

Description
Start of line
End of line
Start of line
(can be inside
pattern)
End of line (can
be inside
pattern)
Beginning of
word
End of word
Beginning of
file
End of file

Example
^abc
abc$
abc\_^def

Action
abc abc abc
abc abc abc
line with abc
def on next

abc\_$def

line with abc


def on next

\<abc

abc xxabc

abc\>
\%^abc

abcxx xxabc abcyy


abc
abc
abc
abc

abc\%$

Inside visual
area
Cursor position
Inside line 55
Inside column 5
Inside virtual
column 7
Mark m postion
Set start of
match
Set end of
match

14883
14884

Repeats and Wildcards


Pattern
Description
.
Any single character
\_.
Any single character (eol
included)
*
Repeat 0 or more times
\+
Repeat 1 or more times
\=
Zero or one times
\?
Zero or one times
\{n,m} Between n to m times
\{n}
Exactly n times

Example
a.c
a\_.c
ab*
ab\+
ab\=
ab\?
ab\{2,3}
ab\{2}

vim-all-good.odt (28. Sep. 2007) The Vim Book

Result
abc axc ac
abc a
c
ax abx abbx
ax abx abbx
ax abx abbx
ax abx abbx
ab abb abbb abbbb
ab abb abbb abbbb

Page 785

Draft Not for publication


Pattern
\{n,}
\{,m}
\{}
\{-n,m}
\{-n}
\{-n,}
\{-,m}
\{-}

Draft 0.1

Not for widespread publication

Example
Description
ab\{2,}
At least n times
ab\{,2}
m or less times
ab\{}
0 or more times (like *)
Between n to m times, as few ab\{-2,3}
as possible
ab\{-2}
Exactly n times, as few as
possible
ab\{-2,}
At least n times, as few as
possible
ab\{-,2}
m or less times, as few as
possible
0 or more times (like *), as ab\{-}
few as possible

ab
ab
ax
ab

Result
abb abbb abbbb
abb abbb abbbb
ab abb abbb abbb
abb abbb abbbb

ab abb abbb abbbb


ab abb abbb abbbb
ab abb abbb abbbb
ax ab abb abbb abbb

14885
14886

Choices
Pattern
a|b
a\&b

Description
Example
a|b
a or b
a followed by b a\&b

Result
abcdef cba
ab ac

14887
14888

Zero Width Conditionals


Pattern
Description
Example
\@>
\(a*\)ab
Makes the preceding atom
a whole pattern
\(a*\)ab
\@=
Zero with pattern match foo\(bar\)\@=
for the preceding atom
which must follow.
\@!
foo\(bar\)\@!
Zero with pattern not
matching for the
preceding atom which
must follow.
\@<=
Zero with pattern match f[ox]*\(oo\)\@<=
for the preceding atom
which must come before.
\@<!
f[ox]*\(oo\)\@<!
Zero with pattern nonmatch for the preceding
atom which must come
before.

Result
aaab
aaab
foobar foofoo

foobar foofoo

foxo fxoo

foxo fxoo

14889

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 786

Draft Not for publication


14890

Draft 0.1

Not for widespread publication

For programmers
Command
:tag {tag}
:tselect {tag}
:tjump {tag}
:stag {tag}
:stselect {tag}
:stjump {tag}
:ptag {tag}
:ptselect
:ptjump
CTRL-]
g]
g CTRL-]
gf
CRL-Wf
CTRL-Wgf
CTRL-W]
CTRL-Wg]
CTRL-wgCTRL-]
CTRL-W}
CTRL-Wg}

Go to
Tag
Tag
Tag
Tag
Tag
Tag
Tag
Tag
Tag
Tag
Tag
Tag
File
File
File
Tag
Tag
Tag
Tag
Tag

If one tag
Jump
Select
Jump
Jump
Select
Jump
Jump
Select
Jump
Jump
Select
Jump
Jump
Jump
Jump
Jump
Select
Jump
Jump
Jump

If many
Jump
Select
Select
Jump
Select
Select
Jump
Select
Select
Jump
Select
Select
N.A.
N.A.
N.A.
Jump
Select
Select
Jump
Select

14891

CTRL-Wd

Split and jump to definition

14892

CTRL-Wi

Split and jump to declaration of id

14893

[number]>>

Right shift lines

14894

>{motion}

Right shift lines to {motion}.

14895

<<

Left shift

14896

<{motion}

Left shift lines to {motion}.

14897

={motion}

Reindent

14898

=%

Reindent to matching curly bracket

14899

==

Reindent line

vim-all-good.odt (28. Sep. 2007) The Vim Book

Result in
Same window
Same window
Same Window
New window
New window
New Window
Preview Window
Preview Window
Preview Window
Same Window
Same Window
Same Window
Same Window
Same Window
New tab
New Window
New Window
New Window
Preview Window
Preview Window

Page 787

Draft Not for publication

Draft 0.1

Not for widespread publication

14900

[p

Paste but with current indent

14901

Match curly bracket

14902

Keyword lookup

14903

CTRL-X

Increment the number under the cursor

14904

CTRL-A

Decrement the number under the cursor

14905

Do a man on the keyword under the cursor

14906

Program searches
Command

Search For

Start

Result

[d

Macro definition

Start of file

]d

Macro definition

Current position Show line

[D

Macro definition

Start of file

]D

Macro definition

Current position Show all

[ CTRL-D

Macro definition

Start of file

] CTRL-D

Macro definition

Current position Jump

CTRL-W d

Macro definition

Start of file

CTRL-W i

Line containing word Start of file

Open new window

[ CTRL-I

Line containing word Start of file

Jump

] CTRL-I

Line containing word Current position Jump

[i

Line containing word Start of file

]i

Line containing word Current position Show line

[I

Line containing word Start of file

]I

Line containing word Current position List all

Show line
Show all
Jump
New window

Show line
List all

14907

[#

Go to the next unmatched #if/#else/#endif

14908

]#

Go to the previous unmatched #if/#else/#endif

14909

[(

Go to the previous unmatched ().

14910

[(

Go to the next unmatched ().

14911

gD

Go to global declaration

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 788

Draft Not for publication


14912

gd

Draft 0.1

Not for widespread publication

Go to local declaration

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 789

Draft Not for publication


14913

Draft 0.1

Not for widespread publication

Text selection
Command Delimiter

Include
Example
Delimiter

a"

"

Yes

print "Hello world"

a'

'

Yes

ch = 'x';

a(
a)
ab

[] ()

Yes

x = data[j];
x = f(y);

a<
a>

<>

Yes

<bold>Bold text

a{
a}
aB

{}

Yes

if (a) { b(c); }

aw

word

Yes

This is an example

aW

WORD

Yes

This word-style example

a[
a]

[]

Yes

a = x[3];

a`

Yes

x = `ls -1`

ap

Paragraph Yes

This is a sentence. And


this is another.
Different paragraph.

as

Sentence

Yes

No way. Yes way.

at

Tag block

Yes

<b><i>Yell</i></b>

i"

No

print "Hello world"

i'

'

No

ch = 'x';

i(
i)
ib

[] ()

No

x = data[j];
x = f(y);

i<
i>

<>

No

<bold>Bold text

i{
i}
iB

{}

No

if (a) { b(c); }

iw

word

No

This is an example

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 790

Draft Not for publication


Command Delimiter

Draft 0.1

Not for widespread publication

Include
Example
Delimiter

iW

WORD

No

This word-style example

i[
i]

[]

No

a = x[3];

i`

No

x = `ls -1`

ip

Paragraph No

This is a sentence. And


this is another.
Different paragraph.

is

Sentence

No

No way. Yes way.

it

Tag block

No

<b><i>Yell</i></b>

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 791

Draft Not for publication


14914

Draft 0.1

Not for widespread publication

Display options

14915

:set number

Show line numbers

14916

:set list

Show unprintable characters

14917

:set linebreak Break lines at nice boundaries

14918

:set breakat

The nice boundaries to use if 'linebreak' set.

14919

:set nowrap

Do not wrap the screen

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 792

Draft Not for publication

Draft 0.1

Not for widespread publication

14920

Diff mode

14921

do

Get (obtain) difference from the other window

14922

dp

Put difference to the other window

14923

:diffsplit {file}

14924

:diffthis

Add this file to the ones being used for this diff.

14925

:diffoff

Turn off diff mode

14926

:diffupdate

Update the differences between files

14927

[number] [c

Backward change.

14928

[number] ]c

Forward change

Split the window and start diff mode.

14929

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 793

Draft Not for publication


14930

Draft 0.1

Not for widespread publication

Folding

14931

zf{motion}

Fold text

14932

zO

Open all folds under the cursor

14933

zo

Open a single fold under the cursor

14934

zC

Close all folds under the cursor

14935

zc

Close fold under the cursor

14936

zR

Set 'foldlevel' to it's lowest level

14937

zr

Reduce 'foldlevel' by one

14938

zi

Invert 'foldenable'

14939

[z

Move to start of fold

14940

]z

Move to end of fold

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 794

Draft Not for publication

Draft 0.1

14941

Misc commands

14942

qa{commands}q

Start macro

14943

@a

Execute macro

14944

q:

Edit : commands

14945

q/

Edit searches

14946

q?

Edit reverse searches

Not for widespread publication

14947
14948

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 795

Draft Not for publication

Draft 0.1

Not for widespread publication

Index
basic....................................................
editing.........................................28
Basic....................................................
Movement Commands.................28
Basic Editing...................................28
Basic Movement Commands...........28
Command............................................
Delete..............................................
Normal Mode...........................28
Esc...................................................
Insert Mode.............................31
i........................................................
Normal Mode...........................30
Insert...............................................
Normal Mode...........................28
x.......................................................
Normal Mode...........................33
<Enter>..........................................
Insert Mode.............................33
<Esc>..............................................
Insert Mode.............................31
Command mode..................................
:set...................................................
Command.................................28
compatible...........................................
Option..........................................28
compatible option...........................28
cp.........................................................
option..........................................28
cp option.........................................28
CTRL-H................................................
Normal Mode Command.............32
CTRL-H, Normal Mode Command. .32
CTRL-J.................................................
Normal Mode Command.............32
CTRL-K................................................
Normal Mode Command.............32
CTRL-K, Normal Mode Command...32
CTRL-N................................................
Normal Mode Command.............32
CTRL-N, Normal Mode Command. .32

CTRL-P................................................
Normal Mode Command.............32
CTRL-P, Normal Mode Command...32
Delete Character.................................
Normal Mode...............................33
Delete Command (Normal Mode)...28
deleting characters, Normal Mode. 33
Down (j)...............................................
Normal Mode...............................31
Down (k)..............................................
Movement Command (Normal
mode)...........................................31
Esc (key) Insert Mode command. . .31
Exiting the editor............................28
Getting Out.........................................
Insert Mode.................................31
Getting out of Insert Mode..............31
gvim command................................29
Help.....................................................
Command....................................28
Help Command...............................28
Inseert.................................................
Mode............................................30
Insert...................................................
Mode............................................30
Insert (i)..............................................
Normal Mode...............................30
Insert command (i)..........................30
Insert Command (Normal Mode)....28
Insert Mode.....................................30
Leavingf Insert Mode......................31
Left (h)................................................
Movement Command (Normal
mode)...........................................31
Normal Mode...............................31
Linux...............................................28
Microsoft Windows,........................29
Mode Visual....................................30
Modes..............................................30
Movement...........................................
Basic................................................

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 796

Draft Not for publication

Draft 0.1

Command.................................28
Normal Mode......................................
Delete..............................................
Command.................................28
Insert...............................................
Command.................................28
Normal Mode command (h)................
Left..............................................31
Normal Mode command (j).................
Down...........................................31
Normal Mode command (k)................
Up................................................31
Normal Mode command (l).................
Right............................................31
Right (l)...............................................
Movement Command (Normal
mode)...........................................31
Normal Mode...............................31
running vim.....................................29
starting vim.....................................29
Trouble (Getting out of)..................31
UNIX...............................................28
Up (j)...................................................
Movement Command..................31
Movement Command (Normal
mode)...........................................31
Up (k)..................................................
Normal Mode...............................31
Vi mode...........................................28
vim.......................................................
command line command..............29
Vim......................................................
Mode............................................28
vim command..................................29
Vim mode........................................28
Visual...................................................

Not for widespread publication

Mode............................................30
Visual Mode....................................30
Windows, Microsoft........................29
x command, Normal Mode..............33
x, Normal Mode Command.............33
:set.......................................................
Command command....................28
:set command..................................28
.vimrc..................................................
File...............................................28
.vimrc file........................................28
<BS>...................................................
Normal Mode Command.............32
<BS>, Normal Mode Command.....32
<Down>..............................................
Normal Mode Command.............32
<Down>, Normal Mode Command.32
<Enter>, Insert Mode....................33
<Enter>, Insert Moder...................33
<Esc> Insert Mode command........31
<Left>.................................................
Normal Mode Command.............32
<Left>, Normal Mode Command. . .32
<NL>..................................................
Normal Mode Command.............32
<NL>, Normal Mode Command.....32
<Right>..............................................
Normal Mode Command.............32
<Right>, Normal Mode Command. 32
<Space>.............................................
Normal Mode Command.............32
<Space>, Normal Mode Command 32
<Up>..................................................
Normal Mode Command.............32
<Up>, Normal Mode Command.....32

14949
14950

vim-all-good.odt (28. Sep. 2007) The Vim Book

Page 797

You might also like