在多行上使用vim的f命令

Kok*_*oko 41 vim

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

Pet*_*ore 40

这不是"/"的作用吗?

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

然后你可以点击"n"前进到下一个x,然后是下一个x,等等.

有很多vim 作弊表有各种提示.

  • 你的答案中没有涉及到一个显着的区别,`dfx`会删除,包括`x`.另一方面,`d/x <enter>`将删除但不包括`x`. (7认同)
  • 嗯......"fx"是两次击键.点击"/ x <enter>"是三次击键.在第一场比赛之后,您可以在两种情况下再次进行一次击键.谁除了vi(m)用户可能会因为效率低下而烦恼:)你总是在寻找相同的角色或角色类型吗?如果是这样,可能会有解决方案,特别是如果它是编程相关的,如"移动到下一个大括号" (5认同)

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测试的.

  • @Benoit:啊,特殊人物,我应该知道的更好.我已经更新了回复. (2认同)

Ing*_*kat 8

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

  • 谢谢,我试过了.但我最终使用http://github.com/dahu/vim-fanfingtastic(如果你还安装了http://github.com/tpope/vim-repeat,可以使用`.`命令).9个月没有投诉! (4认同)

tha*_*orn 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
Run Code Online (Sandbox Code Playgroud)


q33*_*r49 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)
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)


Dan*_*owe 5

解决此问题的一种方法是使用easymotion插件。

f这使您可以在整个可见文本窗口中使用动作。您触发插件,然后输入f您要查找的角色。它以高亮颜色(例如红色)突出显示字符在屏幕上出现的每个位置,并使用字母(abcd、 ...)显示该位置。您只需按与您想要跳转到的位置相对应的字母即可。

该插件在 Github 上的自述文件包含一个动画,直观地展示了它的工作原理。