targets.vim icon indicating copy to clipboard operation
targets.vim copied to clipboard

Separator Text Object: First Field Unreferenceable

Open orbisvicis opened this issue 10 years ago • 8 comments

vi,
+
a , b , cccccccc , d , e
   +++

orbisvicis avatar Apr 03 '15 04:04 orbisvicis

Works as expected. vi, selects between commas. a is not between any commas, so it can not be selected with vi,.

Adding linebreaks to the mix makes it impossible to select multiline entries separated by comma (like function argument lists with one argument per line).

Adding the beginning and end of the buffer seems would be such a special case that I don't think it makes much sense to break consistency here.

So what do you suggest?

wellle avatar Apr 03 '15 11:04 wellle

I think this should be fixed:

  • current behaviour unexpected
  • current behaviour has problems
  • significantly more useful if fixed

Given a document containing multiple lists in multi-line style, attempting to select the first or last elements instead selects multiple lists:

List Style 1:

a ,
b ,
cccccc ,


d ,
e


List Style 2:

    a
,   b
,   ccccccc


,   d
,   e


List Style 3:

  a, b, ccccc, d, e


List Style 4: (3&1 or 3&2):

a, b,
c
, d,
e, f, g

The beginning of a multi-line list can't be accurately determined in style#1. The end of a multi-line list can't be accurately determined in style#2. However a list-boundary condition needs to exist, if only to prevent the aforementioned selection problem.

The simplest boundary condition is to stop on lines without the selected delimiter. However I think this might be more effective:

  1. Move in direction X to next line
  2. Get line contents
  3. Strip out comments (requires filetype support, but isn't dependent on any particular filetype)
  4. Continue (to 1) if:
  • Line contains whitespace (\s) only
  • Line is empty after stripping but not empty before (entire line was a comment)
    1. Stop. Selection includes starting line only (ignore lines in 4)

Single-line lists should be relatively simple to fix.

orbisvicis avatar Apr 06 '15 18:04 orbisvicis

I think this should be fixed ... I think as @orbisvicis this is more usefull and expected when fixed, see also #116

hoschi avatar Apr 19 '15 18:04 hoschi

I would like to have this (or #84) since it would allow to select things like the left and right sides of an assignment, or multi-line hashes in several languages.

krusty avatar Aug 24 '15 22:08 krusty

This seems to be an issue that multiple people have found unexpected.

However, I understand fixing it would be a backwards incompatible change.

So what about making this a configurable option. There are a multitude of ways of implementing this, one has already been described above. A simplest one would be to just consider BOL and EOL as an instance of whatever delimiter is being used.

acornejo avatar Sep 02 '17 18:09 acornejo

Opt-in sounds like a good compromise.

hoschi avatar Sep 27 '17 06:09 hoschi

this issue affects more than just beginning/end of line, for instance:

fn(a, b)

targets.vim cannot delete a or b with di,. i think a general solution is an ANY delimiter: in this example, placing the cursor on a would seek left to the first delimiter and find (, seeking right would find ,. in the OP example, ANY would seek left to find BOL, seek right to find ,.

aeosynth avatar Nov 02 '18 17:11 aeosynth

@aeosynth: Your specific example is covered by the argument text objects. Try daa or cina.

wellle avatar Nov 04 '18 23:11 wellle