在多行中使用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插件。
所以这就是你可以让f
, F
等按照需要工作的方式:
- 安装Vundle。
-
将这些行添加到
.vimrc
:Plugin 'tpope/vim-repeat' Plugin 'dahu/vim-fanfingtastic'
- 在shell中运行
$ vim +PluginInstall +qall
。 - 瞧!
解决这个问题的一个方法是使用easymotion插件。
这使您可以在整个可见的文本窗口中使用f
等运动。 你触发插件,然后inputf
和你正在寻找的angular色。 它突出显示angular色以高亮颜色(例如红色)显示在屏幕上的每个位置,并使用字母( a
, b
, c
, d
,…)显示位置。 您只需按下您想要跳转到的位置的字母即可。
Github上的插件的README包含一个animation,可视化演示它的工作原理。