Pet*_*ore 40
这不是"/"的作用吗?
如果您正在寻找下一个"x",那么在命令模式下执行/ x.
然后你可以点击"n"前进到下一个x,然后是下一个x,等等.
有很多vim 作弊表有各种提示.
Cur*_*son 12
f
在"eval.txt"帮助文件中有一个重新定义以忽略大小写的示例.
:h eval.txt
Run Code Online (Sandbox Code Playgroud)
(搜索"忽略案例"几次)
我们可以修改它来做你想要的.将以下函数添加到您的~/.vimrc
文件或更好的是,创建一个插件文件:( ~/.vim/plugin/find-char.vim
如果您还没有它们,则创建目录).
function FindChar()
let c = nr2char( getchar() )
let match = search('\V' . c)
endfunction
Run Code Online (Sandbox Code Playgroud)
然后,在您~/.vimrc
添加以下行:
nmap f :call FindChar()<CR>
Run Code Online (Sandbox Code Playgroud)
现在,f
应该像你想要的那样工作.
顺便说一句,这是在Ubuntu 10.04上用Vim 7.2测试的.
Christian Brabandt的ft_improved插件扩展了内置f
/ t
命令,以便在以下行中进行搜索.
我想知道完全相同的事情,我在这里看了解答案.没有一个是我想要的,所以我拼凑了一些.
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
Run Code Online (Sandbox Code Playgroud)
Aaaa,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)
Run Code Online (Sandbox Code Playgroud)
还是超级乱码:
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)
Run Code Online (Sandbox Code Playgroud)
解决此问题的一种方法是使用easymotion插件。
f
这使您可以在整个可见文本窗口中使用动作。您触发插件,然后输入f
您要查找的角色。它以高亮颜色(例如红色)突出显示字符在屏幕上出现的每个位置,并使用字母(a
、b
、c
、d
、 ...)显示该位置。您只需按与您想要跳转到的位置相对应的字母即可。
该插件在 Github 上的自述文件包含一个动画,直观地展示了它的工作原理。