Challenges

Timed, scored Vim puzzles. Unlike lessons, challenges don't teach — they test. Transform a buffer to match the target using as few keystrokes as possible.

Race the clock Scored 0–100 Hints cost points (−10 each) Match the target buffer exactly
Beginner
16 challenges

Delete a Line

Learn the dd command to delete the current line in vim.

dd 2 hints
Start Challenge

Copy and Paste

Master the yank and paste commands to duplicate a line.

yyp 1m 3 hints
Start Challenge

Word Navigation

Use w, b, and e to navigate between words efficiently.

wbe 30s 3 hints
Start Challenge

Jump to Line

Learn to quickly jump to specific lines using line numbers.

ggG5G:5 30s 3 hints
Start Challenge

Swap Two Lines

Use dd and p to swap adjacent lines.

ddp 30s 2 hints
Start Challenge

Fix a Typo

Use r to replace individual characters and fix typos.

r 20s 2 hints
Start Challenge

Append Semicolons

Use A to append a semicolon to the end of each line.

A<Esc>j 45s 3 hints
Start Challenge

Delete to End of Line

Use D to delete everything from the cursor to the end of the line.

D 30s 3 hints
Start Challenge

Join Two Lines

Use J to join lines together.

J 20s 1 hint
Start Challenge

Undo Chain

Delete two lines, then undo both deletions to restore the original buffer.

ddu 30s 2 hints
Start Challenge

Insert at Beginning

Use I to insert "# " at the beginning of each line to create markdown headers.

I<Esc>j 45s 3 hints
Start Challenge

Open Line Below

Use o to insert a new line between two existing lines.

o<Esc> 30s 2 hints
Start Challenge

Duplicate a Line

Duplicate the middle line so it appears twice.

yyp 20s 3 hints
Start Challenge

Delete Single Characters

Remove extra characters using x.

x 30s 2 hints
Start Challenge

Move Lines Down

Move the first line to become the last line.

ddp 30s 3 hints
Start Challenge

Replace Mode Overwrite

Use R to overwrite a date in-place.

R 30s 4 hints
Start Challenge
Intermediate
15 challenges

Change Word

Learn to change words using the "cw" command.

cwiESC 45s 3 hints
Start Challenge

Visual Line Selection

Use visual line mode to select and delete multiple lines.

Vjd 1m 4 hints
Start Challenge

Delete Inside Quotes

Use text objects to delete the contents of a string.

di" 30s 2 hints
Start Challenge

Change Inside Parentheses

Replace function arguments using ci(.

ci( 45s 3 hints
Start Challenge

Block Comment

Use visual block mode to add "// " to the beginning of multiple lines.

<C-v>I 1m 4 hints
Start Challenge

Indent a Block

Select lines and indent them inside a function body.

Vj> 45s 3 hints
Start Challenge

Swap Two Words

Swap two adjacent words.

dwP 45s 4 hints
Start Challenge

Delete a Paragraph

Delete an entire paragraph using the paragraph text object.

dap 30s 2 hints
Start Challenge

Surround with Parentheses

Manually wrap a word in parentheses without a surround plugin.

iea 1m 4 hints
Start Challenge

Yank and Put to New Location

Copy a line from the top and paste it at the bottom of the file.

yyGp 1m 3 hints
Start Challenge

Change Tag Contents

Change the text inside an HTML tag using cit.

cit 45s 3 hints
Start Challenge

Delete Between Braces

Empty out a function body using di{.

di{ 30s 2 hints
Start Challenge

Search and Delete Lines

Use search and the dot command to delete all lines containing console.log.

/ddn. 1m 4 hints
Start Challenge

Fix Indentation

Fix the indentation of a badly formatted code block.

V= 1m 2 hints
Start Challenge

Move a Function Up

Move a function block above another.

VdP 1m 4 hints
Start Challenge
Advanced
17 challenges

Find and Replace

Use the substitute command to replace all occurrences of a word.

:%s///g 1m 30s 3 hints
Start Challenge

Macro: Wrap in Quotes

Record a macro to wrap each line's content in double quotes, then apply it to all remaining lines.

qaIAq@a 1m 30s 5 hints
Start Challenge

Global Delete Blank Lines

Remove all blank lines from a file using the global command.

:g 30s 1 hint
Start Challenge

Regex Rename Variable

Rename a variable using word boundaries to avoid partial matches.

:%s 1m 2 hints
Start Challenge

Reverse All Lines

Reverse the order of all lines in the buffer.

:g 45s 2 hints
Start Challenge

Sort and Deduplicate

Sort lines alphabetically and remove duplicates.

:%! 1m 1 hint
Start Challenge

CSV to JSON

Convert CSV rows into JSON objects using substitution.

:%s 3m 2 hints
Start Challenge

Number Lines

Prepend each line with its line number.

:%s 1m 2 hints
Start Challenge

Extract a Column

Extract only the second column from tab-separated data.

:%s<C-v> 1m 2 hints
Start Challenge

Camel to Snake Case

Convert camelCase variable names to snake_case.

:%s 1m 30s 3 hints
Start Challenge

Conditional Replace

Use interactive substitution (gc flag) to selectively replace occurrences.

:%s//gc 1m 30s 2 hints
Start Challenge

Multi-Cursor Style Edit

Use visual block mode to change a word across multiple lines simultaneously.

<C-v>c 1m 30s 4 hints
Start Challenge

Register Juggling

Use named registers to rearrange three sections into alphabetical order.

"a"b"ap"bp 2m 3 hints
Start Challenge

Macro: Reformat Log Lines

Record a macro to reformat log lines from "[TIMESTAMP] LEVEL: message" to "LEVEL | message".

qafdcq@a 2m 5 hints
Start Challenge

Keep Only Matching Lines

Keep only lines containing "error" and delete everything else.

:v 30s 2 hints
Start Challenge

Align Assignments

Align the = signs in variable declarations so they form a column.

<C-v>:s 2m 2 hints
Start Challenge

Recursive Macro

Use a recursive macro to convert all TODO: prefixes to DONE: until end of file.

qacw@a 2m 5 hints
Start Challenge

Sign in to track your scores and completion history