This Vim plugin provides text objects for chain members: im
and am
. It
depends on the textobj-user
plugin.
There is no established terminology, so I made one up. You know method
chaining as in foo.bar().baz()
, right? A member chain is an abstraction
of that, because such a chain could also consist of attributes, fields,
properties, however you want to call variables of a class. A chain member then
is just a member in a member chain. Easy. :)
Why not just use targets.vim's i.
and a.
?
Let me show a few examples, in the fantastic notation of that plugin.
For am
, the first chain member includes the dot to its right:
cursor position │ .....
buffer line │ first.second.third
selection │ └ am ┘
..., all following members the one to their left:
.......
first.second.third
└ am ─┘
im
does not include the dot:
.......
first.second.third
└ im ┘
Method calls can be selected outside their argument list:
........ .
first.second(arg1, arg2).third
└────── am ───────┘
Dots and other special characters inside the argument list are skipped:
........ .
first.second(arg1.var, foo()).third
└───────── am ─────────┘
Inside the argument list, the outside is ignored:
......
first.second(foobar.var, arg2).third
└ am ─┘
Chars and string contents are ignored:
........ .
first.second(") ", '.').third
└────── am ──────┘
Type parameters are no problem, either:
........ ...
first.second<Type.InnerType>().third
└────────── am ─────────┘
..., nor are (multi-dimensional) arrays:
........ .. .
first.second[foo.index][j].third
└─────── am ────────┘
... and curried function calls:
........ .. .
first.second(foo.bar)(foobar.baz).third
└─────────── am ───────────┘
More than one member can be selected:
.....
first.second.third
└── 2im ───┘
..., or the next or last one:
.....
first.second.third
└ anm ┘
......
first.second.third
└ alm ┘
..., which can be combined with a count:
.....
first.second.third
└── 2anm ───┘
So it turns out that these text objects are also pretty handy to select all sorts of function calls and accesses by index. However, there are a few things that fall inside undefined behavior. Consult :help textobj-chainmember-limitations for more information.