为什么在 Vim 中编辑 " 和 ( 之间有区别?

Ada*_*erg 5 vim

执行命令时,ci"Vim 将编辑行中下一个带引号的字符串内的文本,即使光标在引号外。但是,ci(只有在光标位于括号内时才有效。

为什么?可以ci(使跳转到第一次出现的(asci"吗?

我正在玩的示例文本(使用 Erlang 语法):

    ?assertEqual({200, "OK"}, status(FirstResponse)),
%   ^
%   Here I'm expecting  ci(  to jump in to the parenthesis ( ci"  works)
Run Code Online (Sandbox Code Playgroud)

小智 5

快速浏览文档 ( help v_aquote, help v_iquote) 后,我倾向于说这是 中的错误ci",而不是 中的缺陷ci(。观察到的ci(行为与ci{和一致ci[

也就是说,您可以ci(通过此映射获得所需的行为:

nnoremap ci( f(ci(
Run Code Online (Sandbox Code Playgroud)

- - 编辑 - -

---(此问题已迁移到超级用户,我不是其中的成员)

以下函数/映射根据是否(检测到前一个而具有不同的行为。它解决了(a) (b)我原始映射的问题(如评论中所指出的)。虽然它可能仍然不完美......

function New_cib()
    if search("(","bn") == line(".")
        sil exe "normal! f)ci("
        sil exe "normal! l"
        startinsert
    else
        sil exe "normal! f(ci("
        sil exe "normal! l"
        startinsert
    endif
endfunction

nnoremap ci( :call New_cib()<CR>
nnoremap cib :call New_cib()<CR>
Run Code Online (Sandbox Code Playgroud)

  • 这有一个缺点,当在一个括号内时,命令跳转到下一个: `(|a) (b)` 其中 `|` 是光标位置。所以它在那种特殊情况下打破了`ci(`的行为。 (2认同)

Ben*_*oit 5

原因是:大括号、尖括号和大括号成对出现。因此,它们可以筑巢。

单引号和双引号一般不能嵌套(除了在有"$("something")"语法的bash脚本中,所以即使光标不在里面也可以找到文本对象,因为不能有任何外部对象。

  • 虽然一个有用的属性是,如果没有找到外部作用域,可以选择该行的下一个? (2认同)