# Vi Introduction Vi is the free and open-source editor that is present on most UNIX systems. Vi is a modal editor. It has three main modes (ways to interact with the editor). [[https://en.m.wikibooks.org/wiki/Learning_the_vi_Editor]] is a good resource for an introduction. ## Starting Vi vi [[files to edit]]##ENDCODEBLOCK## Examples: * Without any arguments, ##STARTCODEBLOCK## vi ##ENDCODEBLOCK## will just start a blank new file. * ##STARTCODEBLOCK## vi a.txt ##ENDCODEBLOCK## will open ##STARTCODEBLOCK## vi ##ENDCODEBLOCK## with the file ##STARTCODEBLOCK## a.txt ##ENDCODEBLOCK## ## Insertion Mode In insert mode, you can type in text i ##ENDCODEBLOCK## switches to insert mode and ##STARTCODEBLOCK## a ##ENDCODEBLOCK## switches to insert mode moving the cursor one character forward. ##ENDCODEBLOCK## can be used to exit insert mode. ## Command Mode Command mode is used to send commands to the text editor. User ##STARTCODEBLOCK## : ##ENDCODEBLOCK## to enter command mode. ### Saving and Opening Files :w ##ENDCODEBLOCK## saves a files :w [filename] ##ENDCODEBLOCK## Saves the file as ##STARTCODEBLOCK## filename ##ENDCODEBLOCK## :q ##ENDCODEBLOCK## exits the editor :wq ##ENDCODEBLOCK## saves and exits :q# ##ENDCODEBLOCK## exits without saving :e [filename] ##ENDCODEBLOCK## opens file ##STARTCODEBLOCK## filename ##ENDCODEBLOCK## for editing :e# [filename] ##ENDCODEBLOCK## discards changes in current buffer and opens file ##STARTCODEBLOCK## filename ##ENDCODEBLOCK## for editing ## Normal Mode By default ##STARTCODEBLOCK## vi ##ENDCODEBLOCK## , opens in Normal Mode. Normal Mode allows you to cut, copy, paste, etc. To come back to Normal Mode from any mode, press ##STARTCODEBLOCK## Escape ##ENDCODEBLOCK## . [num]command ##ENDCODEBLOCK## will execute ##STARTCODEBLOCK## command ##ENDCODEBLOCK## ##STARTCODEBLOCK## num ##ENDCODEBLOCK## times. ### Movement Vi uses ##STARTCODEBLOCK## h, j, k, l ##ENDCODEBLOCK## for movement. It allows for faster editing as the keys are present in the home row. * ##STARTCODEBLOCK## h ##ENDCODEBLOCK## moves one character left * ##STARTCODEBLOCK## j ##ENDCODEBLOCK## moves one line down * ##STARTCODEBLOCK## k ##ENDCODEBLOCK## moves one line up * ##STARTCODEBLOCK## l ##ENDCODEBLOCK## moves one character right k (up) h (left) l (right) j (down) w ##ENDCODEBLOCK## moves to the beginning of the next word while b ##ENDCODEBLOCK## moves to beginning of the previous word. e ##ENDCODEBLOCK## moves to the end of the next word. 0 ##ENDCODEBLOCK## moves to the beginning of the sentence while ##STARTCODEBLOCK## $ ##ENDCODEBLOCK## moves to the end of the sentence. G ##ENDCODEBLOCK## moves to the end of the file [num]G ##ENDCODEBLOCK## moves to the line number ##STARTCODEBLOCK## num ##ENDCODEBLOCK## Examples: * Initial Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## w ##ENDCODEBLOCK## will move one word forward to ##STARTCODEBLOCK## # ##ENDCODEBLOCK## Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## 2w ##ENDCODEBLOCK## will move two words forward to ##STARTCODEBLOCK## l ##ENDCODEBLOCK## Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## e ##ENDCODEBLOCK## will move to the end of the word Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## $ ##ENDCODEBLOCK## will move to the end of the line. Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## 3b ##ENDCODEBLOCK## will move three words back Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## 0 ##ENDCODEBLOCK## will move to the beginning of the line Hello# I like Vi. ^##ENDCODEBLOCK## ### Cutting and Pasting yw ##ENDCODEBLOCK## copies a word, ##STARTCODEBLOCK## yy ##ENDCODEBLOCK## or ##STARTCODEBLOCK## Y ##ENDCODEBLOCK## copies a line. dw ##ENDCODEBLOCK## cuts/deletes a word, ##STARTCODEBLOCK## dd ##ENDCODEBLOCK## cuts a line, ##STARTCODEBLOCK## D ##ENDCODEBLOCK## cuts a line from the cursor till the end (same as ##STARTCODEBLOCK## d$ ##ENDCODEBLOCK## ). cw ##ENDCODEBLOCK## changes a word, ##STARTCODEBLOCK## cc ##ENDCODEBLOCK## changes a line, ##STARTCODEBLOCK## C ##ENDCODEBLOCK## changes a line from the cursor till the end (same as ##STARTCODEBLOCK## c$ ##ENDCODEBLOCK## ). y, d and c ##ENDCODEBLOCK## can be combined with $0, $, f, t, etc.$ p ##ENDCODEBLOCK## is used to paste after the cursor while ##STARTCODEBLOCK## P ##ENDCODEBLOCK## is used to paste before the cursor. ### Searching / ##ENDCODEBLOCK## is used to search forwards. ? ##ENDCODEBLOCK## is used to search backwards. n ##ENDCODEBLOCK## goes to the next occurrence while ##STARTCODEBLOCK## N ##ENDCODEBLOCK## goes to the previous occurrence. f[char] ##ENDCODEBLOCK## goes to the first occurrence (after the cursor) of ##STARTCODEBLOCK## char##ENDCODEBLOCK## . ##STARTCODEBLOCK## F[char] ##ENDCODEBLOCK## does the same thing but backwards. t[char] ##ENDCODEBLOCK## goes to the position just before the first occurrence (after the cursor) of ##STARTCODEBLOCK## char##ENDCODEBLOCK## . ##STARTCODEBLOCK## T[char] ##ENDCODEBLOCK## does the same thing but backwards. Examples: * Initial Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## fl##ENDCODEBLOCK## goes to the third character in the line Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## tI##ENDCODEBLOCK## goes to the seventh character in the line Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## Fl##ENDCODEBLOCK## goes to the fourth character in the line Hello# I like Vi. ^##ENDCODEBLOCK## * ##STARTCODEBLOCK## TH##ENDCODEBLOCK## goes to the second character in the line because ##STARTCODEBLOCK## e ##ENDCODEBLOCK## is the character just before ##STARTCODEBLOCK## H ##ENDCODEBLOCK## backwards. Hello# I like Vi. ^##ENDCODEBLOCK##