任何人都知道如何快速找到下一个字符(如f命令)但多行?即快速跳转到文件中某个字符的下一个出现位置?
答案 0 :(得分:40)
答案 1 :(得分:12)
在“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
应该像你想要的那样工作。
答案 2 :(得分:8)
Christian Brabandt的ft_improved plugin扩展了内置的f
/ t
命令,以便在以下行中进行搜索。
答案 3 :(得分:7)
我想知道完全相同的事情,我在这里看了解答案。没有一个是我想要的,所以我拼凑了一些。
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
答案 4 :(得分:5)
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)
或超级乱码:
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)
答案 5 :(得分:2)
解决此问题的一种方法是使用easymotion插件。
这使您可以在整个可见的文本窗口中使用f
等动作。您触发插件,然后输入f
和您要查找的角色。它突出显示角色以高亮颜色(例如红色)显示在屏幕上的每个位置,并使用字母a
,b
,c
,d
显示位置,...)。您只需按下要跳转到的位置对应的字母即可。
Github上的插件自述文件包含一个可视化演示其工作原理的动画。
答案 6 :(得分:1)
您可以制作映射以转到光标下的下一个字符:
:map f yl/\V<c-r>"<c-m>
\ V将确保符号按字面匹配。
此外,您可能希望查看已为您定义的*
和#
命令,尽管它们可能不是您想要的。