============================================================================= COMPOUND RECIPES *sandwich-compound-recipes* A compound recipe is one that contains multiple simple recipes. A simple recipe could be a pair of parentheses `()` or braces `{}`, while a compound recipe could be made up of all types of brackets `(),[],{}`, or both types of quotes `'',""`. sandwich.vim allows for the creation of compound recipes. This tutorial demonstrates the creation of two compound recipes, brackets and quotes. Users can adapt the code provided to customize their own compound recipes. Compound text-objects~ By default, sandwich.vim can automatically search for a set of surroundings. This functionality is provided by the `srb` and `sdb` |sandwich-keymappings|. Under the hood, these mappings call |textobj#sandwich#auto()|. This function |textobj#sandwich#auto()| also accepts an optional fourth argument. If a list of (simple) recipes is given to the fourth argument, this list is used instead. We create a list of recipes for the brackets > let g:sandwich_bracket_recipes = [ \ {'buns': ['{', '}'], 'nesting': 1, 'skip_break': 1}, \ {'buns': ['[', ']'], 'nesting': 1}, \ {'buns': ['(', ')'], 'nesting': 1}, \ ] < and another for the quotes > let g:sandwich_quote_recipes = [ \ {'buns': ['"', '"'], 'quoteescape': 1, 'expand_range': 0, 'nesting': 0, 'linewise': 0}, \ {'buns': ["'", "'"], 'quoteescape': 1, 'expand_range': 0, 'nesting': 0, 'linewise': 0}, \ ] < Then, we pass these lists of (simple) recipes into |textobj#sandwich#auto()| to create our text-objects. It is also convenient to access these text-objects with key mappings. In this tutorial, we assign the mappings `ij, aj` and `io, ao` to the brackets and quotes text-objects respectively > onoremap ij textobj#sandwich#auto('x', 'i', {}, g:sandwich_bracket_recipes) onoremap aj textobj#sandwich#auto('x', 'a', {}, g:sandwich_bracket_recipes) xnoremap ij textobj#sandwich#auto('x', 'i', {}, g:sandwich_bracket_recipes) xnoremap aj textobj#sandwich#auto('x', 'a', {}, g:sandwich_bracket_recipes) onoremap io textobj#sandwich#auto('x', 'i', {}, g:sandwich_quote_recipes) onoremap ao textobj#sandwich#auto('x', 'a', {}, g:sandwich_quote_recipes) xnoremap io textobj#sandwich#auto('x', 'i', {}, g:sandwich_quote_recipes) xnoremap ao textobj#sandwich#auto('x', 'a', {}, g:sandwich_quote_recipes) < With these, one can visually select the nearest pair of brackets with `vaj`. In a similar manner, `dio` deletes the text between the two nearest quotes. Compound recipes~ The next step is to add these text objects as compound recipes, and use them with sandwich operators such as |(operator-sandwich-delete)| and |(operator-sandwich-replace)| (default: `sd` and `sr`). We define these compound recipes using external requisites (see |textobj-sandwich-configuration| or |operator-sandwich-configuration|). The text objects defined above and are passed into the `'external'` item, as seen below > let g:sandwich_compound_recipes = [ \ { \ 'external': ['ij', 'aj'], \ 'kind' : ['delete', 'replace', 'query'], \ 'noremap' : 0, \ 'input' : ['j'], \ }, \ { \ 'external': ['io', 'ao'], \ 'kind' : ['delete', 'replace', 'query'], \ 'noremap' : 0, \ 'input' : ['o'], \ }, \ ] < These recipes require an `'input'`, which we specify to be `'j'` and `'o'` for brackets and quotes respectively. Finally, we add these compound recipes to |g:sandwich#recipes|, that is, the list of recipes used by sandwich.vim > call extend(g:sandwich#recipes, g:sandwich_compound_recipes) < With these, one can delete the nearest pair of quotes simply with `sdo`. Similarly, one can replace the nearest pair of brackets with `srj{char}`. ============================================================================== vim:tw=78:ts=8:noet:ft=help:norl: