在多行中使用vim的f命令

任何人都知道如何快速find下一个字符(如f命令),但多行吗? 即是否要快速跳转到文件中某个字符的下一个出现?

这不是什么“/”呢?

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

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

有很多vim 作弊表单 ,里面有各种提示。

有一个重新定义f来忽略“eval.txt”帮助文件中的大小写的例子。

 :h eval.txt 

(search“忽略案例”几次)

我们可以修改它来做你想做的事情。 将下面的函数添加到~/.vimrc文件中,或者更好地创build一个插件文件: ~/.vim/plugin/find-char.vim (如果你还没有这些文件,可以创build目录)。

 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进行testing的。

想知道我在这里看到的答案完全一样。 没有什么是我想要的,所以我拼凑了其中的一些。

q335的答案是最接近的,因为它正确地处理omaps,这是必要的做一些像dt} (删除所有的东西,但不包括下一个大括号),但curt的答案处理特殊字符search和使用一个单一的function,这对我来说是多更好,所以我没有太多join我的.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 

Christian Brabandt的ft_improved插件扩展了内置的f / t命令,以便在以下几行中进行search。

Aaaa,vimscript。 D:写20行大概需要2年的时间。 这里是最新的,最stream行的版本:适用于所有模式:视觉,运营商挂起,正常。

 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) 

你可以做一个映射到光标下的下一个字符:

 :map f yl/\V<cr>"<cm> 

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

另外,你可能想看看已经为你定义的*#命令,虽然它们可能不是你想要的。

目前这样做的最合理的方式是隐藏在这个评论中 。

你只需要安装两个插件: vim-repeat和vim-fanfingtastic 。

就个人而言,我使用Vundle来pipe理我的vim插件。

所以这就是你可以让fF等按照需要工作的方式:

  1. 安装Vundle。
  2. 将这些行添加到.vimrc

     Plugin 'tpope/vim-repeat' Plugin 'dahu/vim-fanfingtastic' 
  3. 在shell中运行$ vim +PluginInstall +qall
  4. 瞧!

解决这个问题的一个方法是使用easymotion插件。

这使您可以在整个可见的文本窗口中使用f等运动。 你触发插件,然后inputf和你正在寻找的angular色。 它突出显示angular色以高亮颜色(例如红色)显示在屏幕上的每个位置,并使用字母( abcd ,…)显示位置。 您只需按下您想要跳转到的位置的字母即可。

Github上的插件的README包含一个animation,可视化演示它的工作原理。