Matchit.vim is great too, but you have to position your cursor on one of the block delimiting keywords (e.g. class, module, def, if, do or end) to make `v%` do what you want. The nice thing about text-objects is that the target area where you can trigger them to achieve the desired effect is much larger.
Yep. This kind of stuff can also be done with vimscript, python, or ruby, but macros are short and terse and easy to write. Vim even allows you to record your keypresses and save them to a macro.
It is indeed a macro in vim. The key to realizing what's going on is to realize that when I made it I didn't sit down an type that out... well, not really.
Rather I just pressed qf (which starts recording a macro to 'f'), then preformed the sequence of commands that would need to be done to do what I wanted. You do it step by step while watching what's actually going on, so it's not as hard as it seems. Then from then on I can just press @f to do what would normally take all of those keys.
broken down, this is how the macro works:
zE - clear other folds
k - up
zf - start creating a fold from here to...
gg - ...the top of the document
j - down
% - go to the matching bracket
j - down
zf - start creating a fold from here to...
G - ...the bottom of the document
I don't really remember why those ups and downs were needed, maybe they're not. Just how I typed it out at the time.
Yes usually. However ruby doesn't necessarily use single characters (e.g. {/})to indicate the start/end of blocks, so vim doesn't know how to get to the beginning/end of a block.
N.B. When I say blocks I mean the standard understanding of blocks i.e. the code between two curly braces, not ruby blocks which are roughly equivalent to anonymous functions.
An indentation-based text object solves the same problem in a language-agnostic way. There are several implementations out there. I maintain one that includes proper handling of languages without ending block delimiters (python, haml, sass): http://github.com/austintaylor/vim-indentobject
This made me smile. Such a nice Christmas gift. I just started getting into vim and things that solve little nagging annoyances really help me stick with it. Thank you!
One of the little things that I love most about IntelliJ is its expand/shrink selection command. It's one of those things that you have no idea how useful it will be until you get used to it, then you can't live without it.
14 comments
[ 3.5 ms ] story [ 32.8 ms ] threadI just use matchit (http://www.vim.org/scripts/script.php?script_id=39) and then I can do v% to visually select everything to the end of a block.
For example, I use the macro `zEkzfggj%jzfG` (minus backticks) to fold everything above and below the current { and it's corresponding C block.
And now that I see all of it typed out like that, I'm not sure myself if this is an argument for Vim, or a parody of an argument for it ;)
Rather I just pressed qf (which starts recording a macro to 'f'), then preformed the sequence of commands that would need to be done to do what I wanted. You do it step by step while watching what's actually going on, so it's not as hard as it seems. Then from then on I can just press @f to do what would normally take all of those keys.
broken down, this is how the macro works:
zE - clear other folds
k - up
zf - start creating a fold from here to...
gg - ...the top of the document
j - down
% - go to the matching bracket
j - down
zf - start creating a fold from here to...
G - ...the bottom of the document
I don't really remember why those ups and downs were needed, maybe they're not. Just how I typed it out at the time.
N.B. When I say blocks I mean the standard understanding of blocks i.e. the code between two curly braces, not ruby blocks which are roughly equivalent to anonymous functions.