4 ms·
Vim plugin makes Ruby blocks into text objects
- aditya 16y agoNifty, but this seems like plugin overkill. I just use matchit (http://www.vim.org/scripts/script.php?script_id=39 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.
- nelstrom 16y agoMatchit.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.
- subelsky 16y agoplus you get the ability to increase and decrease the block scope with ir / ar
- nelstrom 16y agoIncidentally, the rubyblock text-object uses matchit under the hood.
- burgerbrain 16y agoStuff like this can usually be handled with a quick macro in Vim. 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 ;)
- jamesjyu 16y agoI couldn't even tell if your parody is a parody. Is that seriously the macro??
- jcw 16y agoYep. 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.
- burgerbrain 16y agoIt 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.
- alinajaf 16y agoYes 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.
- austintaylor 16y agoAn 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 http://github.com/austintaylor/vim-indentobject
- wmwong 16y agoThis 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!
- chrismealy 16y agoAnybody know an emacs equivalent?
- kingsidharth 16y agoAnything like this for Python? Any plug-in or built in macro?
- lemming 16y agoOne 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.