Vim:在点号内进行选择

11

我找不到一个简单的解决方案(无论是在这里还是在网络上),可以选择/插入/删除由点包围的内容(这在开发中很常见):

    someobject.some-property-with-hyphens.otherproperty

如何选择中间属性?
我尝试了以下方法:
    vi.  (dot is for executing last command)
    viw  (don't include hyphens)
    4viw (still nop)
    vis  (select full line)


编辑:更常见的例子(使用JavaScript)

    app.object['key'].$object_with_a_dollar_sign.function()

更新了我的回答,添加了操作符映射以使“.”成为常规文本对象运动(我每天都在学习:)) - sehe
5个回答

19
我怀疑这里的真正问题是连字号不被视为标识符的一部分。
你应该尝试添加。
:se iskeyword+=-

对于你的文件类型,可以设置默认程序。这样,viw 将会执行你想要的操作。

要使这个设置自动适用于,比如说,strange 文件:

:autocmd BufReadPost *.strange se isk+=-

将该行代码添加到你的vimrc文件中 (:e $MYVIMRC),你将不再需要考虑添加iskeyword设置。还可以查看:he modeline以了解其他在每个文件中设置此设置的方法。


更新一个更纯粹的解决方案是创建自己的操作符映射

下面是一个快速草稿,对我来说非常有效:

xnoremap <silent>.  f.oT.o
xnoremap <silent>a. f.oF.o
xnoremap <silent>i. t.oT.o

onoremap <silent>.  :<C-u>exec 'normal v' . v:count1 . '.'<CR>
onoremap <silent>a. :<C-u>exec 'normal v' . v:count1 . 'a.'<CR>
onoremap <silent>i. :<C-u>exec 'normal v' . v:count1 . 'i.'<CR>

以下是缓冲区内容的示例(鼠标位于字母w上方):

someobject.some-property-with-hyphens.SUB.otherproperty
  • v.选择了可视模式下的some-property-with-hyphens.
  • va.选择了可视模式下的.some-property-with-hyphens.
  • vi.选择了可视模式下的some-property-with-hyphens

动作可以链接并接受count

  • v..选择了可视模式下的some-property-with-hyphens.SUB.
  • v2. 同样选择了可视模式下的some-property-with-hyphens.SUB.
  • v2a.选择了可视模式下的.some-property-with-hyphens.SUB.
  • v2i.选择了可视模式下的some-property-with-hyphens.SUB

您可以将运算符用作任何编辑命令的运算符:

  • d.结果为someobject.SUB.otherproperty
  • ci.shortname的结果为someobject.shortname.SUB.otherproperty
  • c2.get("结果为someobject.get("otherproperty

光标最初位于“点分标识符”中的任何位置都没有关系。请注意,为了方便起见,所有可视模式映射将光标定位于所选内容的末尾(这样您就可以通过例如%和其他动作继续扩展所选内容)。


绝对比我的解决方案好。 - lucapette
1
@lucapette: 我不会说_绝对的_ - 这取决于 OP 用它做什么...我发现改变 iskeywordisident 的设置确实需要适应一段时间; 但是如果逻辑与文件的语法匹配,那么就应该完美! - sehe
没错,你又说对了。如果逻辑与语法文件匹配,那么你的解决方案就是完美的。无论如何,我认为你解决问题的方法更加偏向于 vim,感觉像是在使用 vim。而且我总是喜欢用 vim 的方式来解决问题。我相信你知道我的意思。 - lucapette
如果在属性中发现其他特殊字符,我也会记住“vt。”。 - Placoplatr
刚刚找到了一个。在JavaScript中,你通常可以这样做:app.object['key'].property。在这种情况下,两种解决方案都很有用,具体取决于我是想选择 object 还是 object['key'] :) - Placoplatr
显示剩余3条评论

1

我不是绝对确定(我每天都在学习新的vim功能),但我认为你不能使用文本对象在点之间进行选择。因此,如果这是一个常见情况,也许你可以创建以下映射:

nnoremap <leader>d t.vT.

只是为了避免每次需要在点之间选择时都要输入五个字符。


1
它能解决问题。但是它也会选择介于空格、括号等之间的内容。例如,在 Console.WriteLine(new Random().Next)); 中,它会一次性选择 WriteLine(new Random()。这可能不是您想要的结果。 - sehe
是的,你说得对。我当时只关注了展示的例子。顺便说一下,我经常忘记iskeyword选项。 - lucapette

1

也许这不是你想要的,但我使用了标准搜索功能并输入了

/\..*\.
,它选择了上面示例中的 .some-property-with-hyphens. 值。


0
你可能想尝试这个,虽然它不是一个正确的答案:
将光标放在 s 上(点号后面),然后输入:(意思是视觉直到点号)。
vf. 

我相信你无法使用vi的原因是点号不是vim能够找到其另一对像(或' ")那样的字符。


实际上,f是查找字符的函数。但我不知道如何在那之前停止。 - Omid
用vt.c就可以完成这个任务。 - Omid
@lucapette 我更喜欢你的解决方案。 - Omid
@dash-tom-bang:从技术上讲,它们只是不同的:vt,c设置<>标记;gv在两者之后执行不同的操作;您可以像vt.%t.o3b这样链接动作,但不能使用c;在可视模式下查看,;键,以了解这个问题的完全混乱。 - sehe
我通常没有智力来像那样链接动作。 :) - dash-tom-bang
显示剩余2条评论

0

我不知道任何通用的解决方案。对于选择/删除/插入,我使用正则表达式。

:%s/\.some-property-with-hyphens\./.i-like-this-property./g

仅选择

/\.some-property-with-hypehns\.

更通用的规则

/\.[\-a-zA-Z0-9]*\.

希望这就是你所询问的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接