当我有如下所示的行时,我可以使用vi"
直观地选择第一个引号中的所有内容。
if foo == "bar" and bar == "foo":
在vim中我是否可以通过使用vi
之类的方式直观地选择 foo 而不是 bar ?
答案 0 :(得分:2)
没有更快的方法,您必须移至目标"foo"
,然后执行vi"
。
当你在行的开头(或"bar"
之前)时,可以选择"bar"
。因为"
不是"配对字符"。
E.g。当您光标在and
上时,执行vi"
,您将选择and bar ==
,这不是您所期望的。
所以你必须将光标移动到目标"foo"
P.S,我前段时间曾问过一个问题,你可能想看看:
答案 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"
那样做。