在多行上使用vim的f命令

时间:2010-10-13 15:19:49

标签: vim

任何人都知道如何快速找到下一个字符(如f命令)但多行?即快速跳转到文件中某个字符的下一个出现位置?

7 个答案:

答案 0 :(得分:40)

这不是“/”的作用吗?

如果您正在寻找下一个“x”,那么在命令模式下执行/ x。

然后你可以点击“n”前进到下一个x,然后是下一个x等等。

有很多vim cheat sheets有各种各样的提示。

答案 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应该像你想要的那样工作。

BTW,在Ubuntu 10.04上使用Vim 7.2进行了测试。

答案 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和您要查找的角色。它突出显示角色以高亮颜色(例如红色)显示在屏幕上的每个位置,并使用字母abcd显示位置,...)。您只需按下要跳转到的位置对应的字母即可。

Github上的插件自述文件包含一个可视化演示其工作原理的动画。

答案 6 :(得分:1)

您可以制作映射以转到光标下的下一个字符:

:map f yl/\V<c-r>"<c-m>

\ V将确保符号按字面匹配。

此外,您可能希望查看已为您定义的*#命令,尽管它们可能不是您想要的。