有没有人知道如何快速找到下一个字符的位置(类似于f命令),但是针对多行?也就是说,如何快速跳转到文件中某个字符的下一个出现位置?
dfx
会删除从光标所在位置一直到包括x
这个字符。而另一方面,d/x<enter>
会删除从光标所在位置一直到但不包括x
这个字符。 - Andy E'eval.txt' 帮助文件中有一个重新定义 f
忽略大小写的示例。
:h eval.txt
在几个地方搜索"忽略大小写"。
我们可以修改它以满足您的需求。将以下函数添加到您的~/.vimrc
文件中,或更好的方法是创建一个插件文件:~/.vim/plugin/find-char.vim
(如果没有则创建目录)。
function FindChar()
let c = nr2char( getchar() )
let match = search('\V' . c)
endfunction
然后,在您的~/.vimrc
文件中添加以下行:nmap f :call FindChar()<CR>
现在,f
应该像你想要的那样工作。
顺便提一下,这是在 Ubuntu 10.04 上测试过 Vim 7.2 的。
$
, \
, ^
或 /
等字符(可能还包括星号、问号等),那么这种方法将行不通。你可以尝试使用 let command = "normal! /\V" . c . "^M"
,但这对于反斜杠也无法正常工作。 - BenoitChristian Brabandt的ft_improved插件扩展了内置的f
/t
命令,使其可以在下一行中搜索。
2f,
这样的内容,人们可能期望将光标跳转到下一个逗号后面。前者插件在遇到这个序列时什么也不做,而后者只会简单地跳过一个逗号,而不是两个。 - koyae我曾经也想知道同样的问题,所以我查看了这里的答案。但是,没有一个答案完全符合我的要求,所以我将它们拼凑在一起。
q335的答案最接近,因为它正确处理了omaps,这对于像dt}
(删除到下一个花括号,但不包括它)这样的操作是必要的。但是,Curt的答案处理特殊字符搜索并使用单个函数,这对我来说更加可取,因此我不会在我的.vimrc文件中添加太多内容。
以下是我的结果:
"Makes f and t work across multiple lines
nmap <silent> f :call FindChar(0, 0, 0)<cr>
omap <silent> f :call FindChar(0, 1, 0)<cr>
nmap <silent> F :call FindChar(1, 0, 0)<cr>
omap <silent> F :call FindChar(1, 1, 0)<cr>
nmap <silent> t :call FindChar(0, 0, 1)<cr>
omap <silent> t :call FindChar(0, 0, 0)<cr>
nmap <silent> T :call FindChar(1, 0, 1)<cr>
omap <silent> T :call FindChar(1, 0, 0)<cr>
"Functions
fun! FindChar(back, inclusive, exclusive)
let flag = 'W'
if a:back
let flag = 'Wb'
endif
if search('\V' . nr2char(getchar()), flag)
if a:inclusive
norm! l
endif
if a:exclusive
norm! h
endif
endif
endfun
c2fa
只会更改到第一个 a
。 - instanceof me嗨,vimscript。要写好20行代码需要大约2年时间:D。这里是最新、最流畅的版本:适用于所有模式:可视、操作挂起、普通。
let prvft='f'
let prvftc=32
fun! MLvF(c,...)
let [g:prvftc,g:prvft]=[a:c,a:0? 'f':'F']
let pos=searchpos('\C\V'.nr2char(g:prvftc),'bW')
call setpos("'x", pos==[0,0]? [0,line('.'),col('.'),0] : [0,pos[0],pos[1],0])
return "`x"
endfun
fun! MLvf(c,...)
let [g:prvftc,g:prvft]=[a:c,a:0? 'F':'f']
let pos=searchpos('\C\V'.nr2char(g:prvftc).(mode(1)=='no'? '\zs' : ''),'W')
call setpos("'x", pos==[0,0]? [0,line('.'),col('.'),0] : [0,pos[0],pos[1],0])
return "`x"
endfun
fun! MLvT(c,...)
let [g:prvftc,g:prvft]=[a:c,a:0? 't':'T']
let pos=searchpos('\C\V'.nr2char(g:prvftc).'\zs','bW')
call setpos("'x", pos==[0,0]? [0,line('.'),col('.'),0] : [0,pos[0],pos[1],0])
return "`x"
endfun
fun! MLvt(c,...)
let [g:prvftc,g:prvft]=[a:c,a:0? 'T':'t']
let pos=searchpos('\C\V\_.'.(mode(1)=='no'? '\zs' : '').nr2char(g:prvftc),'W')
call setpos("'x", pos==[0,0]? [0,line('.'),col('.'),0] : [0,pos[0],pos[1],0])
return "`x"
endfun
no <expr> F MLvF(getchar())
no <expr> f MLvf(getchar())
no <expr> T MLvT(getchar())
no <expr> t MLvt(getchar())
no <expr> ; MLv{prvft}(prvftc)
no <expr> , MLv{prvft<#'Z'? tolower(prvft) : toupper(prvft)}(prvftc,1)
let [pvft,pvftc]=[1,32]
fun! Multift(x,c,i)
let [g:pvftc,g:pvft]=[a:c,a:i]
let pos=searchpos((a:x==2? mode(1)=='no'? '\C\V\_.\zs' : '\C\V\_.' : '\C\V').(a:x==1 && mode(1)=='no' || a:x==-2? nr2char(g:pvftc).'\zs' : nr2char(g:pvftc)),a:x<0? 'bW':'W')
call setpos("'x", pos[0]? [0,pos[0],pos[1],0] : [0,line('.'),col('.'),0])
return "`x"
endfun
no <expr> F Multift(-1,getchar(),-1)
no <expr> f Multift(1,getchar(),1)
no <expr> T Multift(-2,getchar(),-2)
no <expr> t Multift(2,getchar(),2)
no <expr> ; Multift(pvft,pvftc,pvft)
no <expr> , Multift(-pvft,pvftc,pvft)
f
等运动。您触发插件,然后输入要查找的字符和 f
。它会用高亮颜色(例如红色)突出显示屏幕上每个字符出现的位置,并使用字母(a
、b
、c
、d
等)显示位置。您只需按下对应于所需跳转位置的字母即可。f
,F
等按预期工作的方法:
Add these lines to your .vimrc
:
Plugin 'tpope/vim-repeat'
Plugin 'dahu/vim-fanfingtastic'
$ vim +PluginInstall +qall
in your shell.:map f yl/\V<c-r>"<c-m>
将确保符号被逐字匹配。此外,您可能需要查看已为您定义的*
和#
命令,尽管它们可能不是您想要的。
jk
要比f{char}
更便宜或者等价。如果相隔多于一行,则使用/
更便宜。你也可以跳转到该行,然后使用f
命令(#G
f{char}
)。 - young_souvlaki