Real Vim ninjas count every keystroke - do you?

Pick a challenge, fire up Vim, and show us what you got.

Changelog, Rules & FAQ, updates: @vimgolf, RSS.

Your VimGolf key: please sign in

$ gem install vimgolf
$ vimgolf setup
$ vimgolf put 591903ff3060ed0b32000007

Adam's challenge

Change both normal to bold and 4 by 2. Adam Wathan challenge this on twitter . He did it in 11 keystrokes on Sublime.

Start file
<div>
    <span class="text-base text-dark wt-normal">
        @icon('line-graph', 'icon-sm text-dark-faint m-r-4') ${{ number_format($product->totalRevenue() / 100) }}
    </span>
    <span class="text-base text-dark wt-normal">
        @icon('users', 'icon-sm text-dark-faint m-r-4') {{ $product->totalPurchases() }}
    </span>
</div>
End file
<div>
    <span class="text-base text-dark wt-bold">
        @icon('line-graph', 'icon-sm text-dark-faint m-r-2') ${{ number_format($product->totalRevenue() / 100) }}
    </span>
    <span class="text-base text-dark wt-bold">
        @icon('users', 'icon-sm text-dark-faint m-r-2') {{ $product->totalPurchases() }}
    </span>
</div>

View Diff

2,3c2,3
<     <span class="text-base text-dark wt-normal">
<         @icon('line-graph', 'icon-sm text-dark-faint m-r-4') ${{ number_format($product->totalRevenue() / 100) }}
---
>     <span class="text-base text-dark wt-bold">
>         @icon('line-graph', 'icon-sm text-dark-faint m-r-2') ${{ number_format($product->totalRevenue() / 100) }}
5,6c5,6
<     <span class="text-base text-dark wt-normal">
<         @icon('users', 'icon-sm text-dark-faint m-r-4') {{ $product->totalPurchases() }}
---
>     <span class="text-base text-dark wt-bold">
>         @icon('users', 'icon-sm text-dark-faint m-r-2') {{ $product->totalPurchases() }}

Solutions by @skewcy-bot:

Unlock 20 remaining solutions by signing in and submitting your own entry
Created by: @TresErresCo

281 active golfers, 1043 entries

Solutions by @skewcy-bot:
19
#136 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

20
#>143 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

21
#>173 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

22
#>208 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

23
#>235 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

24
#>241 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

25
#>248 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

26
#>258 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

27
#>261 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

28
#>266 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

28
#>266 - skewcy-bot / @skewcy-bot

09/13/2026 at 01:01AM

29
#>269 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

30
#>274 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

31
#>275 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

34
#>276 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

37
#>277 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

39
#>278 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

41
#>279 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

46
#>280 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM

55
#>281 - skewcy-bot / @skewcy-bot

08/18/2026 at 03:37PM