top | item 2046387

VimGolf.com - real Vim ninjas count every keystroke

178 points| igrigorik | 15 years ago |vimgolf.com | reply

79 comments

order
[+] SwellJoe|15 years ago|reply
Where are the solutions? That's the fun thing about Perl golf is seeing how people did it in X characters. Without solutions...well, I don't see the point.
[+] igrigorik|15 years ago|reply
I'm logging the solutions, but in real MVP fashion... not showing them just yet. Need to bootstrap a vimscript parser first.

If anyone is up for it, would love some help with the client/parser: https://github.com/igrigorik/vimgolf

[+] Calamitous|15 years ago|reply
This awesomeness unexpectedly sucked away half my afternoon. Not really sure whether to be upset about it our not. :)

Only thing is that the key counting doesn't seem to be consistent. :\ Using the command history seems to really, really screw with the counts. I thought it counted up all the characters in the submitted command, but this doesn't seem to be the case. I submitted an 18 for the "Sort and add attributes" challenge, then realized that the text for the new key is longer than that. :\

I'm not really clear on what "counts" as a keypress (shift key? colon for commands? Paste commands? Esc?) and I haven't been able to get any of my "scores" to match up with the count in my head.

All that aside, this is a barrel of fun, and I'm sure these kinks will get worked out.

[+] Calamitous|15 years ago|reply
Also, it would be awesome if I could delete some of my scores. :\ My bogus win and early attempts are cluttering up the leaderboard.
[+] luigi|15 years ago|reply
I want to go head to head with someone in match play.
[+] steveklabnik|15 years ago|reply
DJ Hero has a great feature where after you beat a song, you can "Challenge a friend" and it sends a message to them that says something along the lines of "Steve just scored 200,000 points on $SONG_NAME. Can you do better? OK/CANCEL/ABORT"
[+] gfodor|15 years ago|reply
The people submitting scores of 4 are probably just adding macros to their .vimrc
[+] gfodor|15 years ago|reply
OP: can you figure out a way to get vim to not load vimrc?
[+] duck|15 years ago|reply
They just fixed that.
[+] Bud|15 years ago|reply
This is one of the most wonderfully geeky things I have ever seen. The analogy to golf is exceptionally well-drawn, too! It might be entertaining if you developed the parallel even more, perhaps by adapting some of The Rules of Golf to your project.
[+] devin|15 years ago|reply
I had an idea for an emacs version of this.

Anyone have any ideas on how you'd implement this with emacs?

[+] jlongster|15 years ago|reply
My emacs-fu is pretty stale, but I'm sure it has the hooks to track what you need. Although, Emacs isn't all about keystrokes, it's more about interactive coding and an integrated development environment.

Maybe you could do something more along the lines of Perl golf, where you achieve certain things in as little code as possible.

[+] silentbicycle|15 years ago|reply
You could check keystrokes used with C-h l (or M-x view-lossage), but Emacs's whole design is based on extensibility rather than terse, orthogonal, and (usually) single-key commands. Don't find a clever way to knock it down to 30 keystrokes (or whatever) - when you notice a common operation, script it, name it, bind it, now it's two or three keystrokes.
[+] aerique|15 years ago|reply
Perhaps Xah Lee's command frequencies script is a start?
[+] lelele|15 years ago|reply
What? Viewing/counting keystrokes? Then "C-h l".
[+] DEinspanjer|15 years ago|reply
Ugh.. wanted to play with it, but after three years, there still isn't a simple way to get Ruby and Gems working nicely with modern Ruby apps on OSX. Searching for ways to update show a variety of hacks, each uglier than the last. Of course, I could always build it from source.. ::sigh::
[+] luigi|15 years ago|reply
Not sure what you mean, as the vast majority of Ruby developers I know use OS X. Ruby works out of the box on Snow Leopard. Or try Homebrew. Or RVM.
[+] exogen|15 years ago|reply
Ha, I just started working on the same exact project a few weeks ago. Great minds think alike, I guess. I'm taking a different approach, so I'll still launch it to see what people think.

I brought up this idea in a "gamification of software development" talk I gave last April.

[+] clvv|15 years ago|reply
Until somebody can come up with at least some method of restricting vim scripting, the results are useless(one can easily only use 4 key strokes by key mapping as you can see). But, on the other hand, you can't just disable vim from loading scripts, because there's no point in mastering the plain old vim without any plugins, custom key mappings and such.
[+] askedrelic|15 years ago|reply
I've been trying with editing the file in another editor, then :e! :wq which seems to give 17/18 score mostly.

I love this idea and love the challenge, but would love to make it less hackable as well.

[+] jjcm|15 years ago|reply
You should really make some challenges that require the users to pass multiple tests with the same script. Sure, you can solve the reformat/refactor challenge by

    jd2jVjj=f(ci)*a^]jcfda.join(',')^]
but it wont generalize anywhere. Having a full script though that will detect and do that automagically, now there's the fun part.
[+] jjcm|15 years ago|reply

    4JD=Gjwci(*a^]jcfda.join(',')^]
God this is addicting. Shaved off a few characters.

edit: switch the first three letters to j3D, as 4JD seems to work differently between my two machines.

[+] DEinspanjer|15 years ago|reply
This one gives a score of 32, but I like it just for the sheer one-liner obsfucatedness:

  :g/#/+1s/\v(.*)\n.*/\1\r\1
[+] jh3|15 years ago|reply
Only scored a 27 on the 'Reverse characters in a line' challenge...

I was trying to do this:

  :s/./&\r/g|g/^/m0|j!
However, that causes a to be before b for some reason.

So I ended up doing:

  :s/./&\\r/g|g/^/m0\rV}gJ
Anyone know why appending j! joins everything correctly except a and b?
[+] eterps|15 years ago|reply
Any tips on improving 'Sort and add attributes'?

I have scored 38 with:

:sor<ENTER>:%s/)/, :country => "USA")/<ENTER>

[+] birken|15 years ago|reply
:sor|%s/)/, :country => "USA")<ENTER> works for me

This shaves off a few chars: a) combining the commands b) leaving off the last / in the search/replace

[+] clvv|15 years ago|reply
I think this is the shortest solution unless someone has sort mapped to hot-keys, which is unlikely.
[+] Symmetry|15 years ago|reply
Lets see, for the simple text editing: qa/vim<ENTER>yypjddq@a@a so 18.
[+] burgerbrain|15 years ago|reply
Yeah, how does this prevent somebody from making a macro that does the entire file, then "completing" the file with the two* keystrokes it takes to fire off that macro?

Or one, mapping space to @q is convenient :)

[+] BrandonM|15 years ago|reply
qq3jYpJDq@q@@

13

Edit: I can trim one more off, to make it 12:

qq3jYpJDq2@q

[+] Complete|15 years ago|reply
qa/v<ENTER>yypjddq@a@a

16 :P

[+] meastham|15 years ago|reply
Kinda a bummer for those of us who don't use twitter..

Edit: Still a very cool project though

[+] seles|15 years ago|reply
You can also use Vi for hundreds of challenges at http://golf.shinh.org alot of the newer challenges are stale but some of the older ones are gold.
[+] jjcm|15 years ago|reply
Different game, that's counting the resulting code that you create. This is counting the number of keystrokes to create the code (for some at least).
[+] meastham|15 years ago|reply
Is there anything to stop people form just writing a macro beforehand that does each task? I'm guessing that's how the guy who 4 keystrokes on Simple Text Editing accomplished that.