在vim中选择一行中的第二个对象

时间:2014-09-10 13:50:51

标签: vim

当我有如下所示的行时,我可以使用vi"直观地选择第一个引号中的所有内容。

if foo == "bar" and bar == "foo":

在vim中我是否可以通过使用vi之类的方式直观地选择 foo 而不是 bar

3 个答案:

答案 0 :(得分:2)

没有更快的方法,您必须移至目标"foo",然后执行vi"

当你在行的开头(或"bar"之前)时,可以选择"bar"。因为"不是"配对字符"。

E.g。当您光标在and上时,执行vi",您将选择and bar ==,这不是您所期望的。

所以你必须将光标移动到目标"foo"

P.S,我前段时间曾问过一个问题,你可能想看看:

Why ci" and ci(, ci{.... behave differently?

答案 1 :(得分:2)

来自this gist by Steve Losh(还有其他版本):

" Motion for "next/last object". For example, "din(" would go to the next "()" pair
" and delete its contents.

onoremap an :<c-u>call <SID>NextTextObject('a', 'f')<cr>
xnoremap an :<c-u>call <SID>NextTextObject('a', 'f')<cr>
onoremap in :<c-u>call <SID>NextTextObject('i', 'f')<cr>
xnoremap in :<c-u>call <SID>NextTextObject('i', 'f')<cr>

onoremap al :<c-u>call <SID>NextTextObject('a', 'F')<cr>
xnoremap al :<c-u>call <SID>NextTextObject('a', 'F')<cr>
onoremap il :<c-u>call <SID>NextTextObject('i', 'F')<cr>
xnoremap il :<c-u>call <SID>NextTextObject('i', 'F')<cr>

function! s:NextTextObject(motion, dir)
  let c = nr2char(getchar())

  if c ==# "b"
      let c = "("
  elseif c ==# "B"
      let c = "{"
  elseif c ==# "d"
      let c = "["
  endif

  exe "normal! ".a:dir.c."v".a:motion.c
endfunction

答案 2 :(得分:1)

我会像f";;vi"那样做。