Подтвердить что ты не робот

Использование команды vim f для нескольких строк

Кто-нибудь знает, как быстро найти следующее появление символа (например, команду f), но многострочный? То есть быстро перейти к следующему вхождению какого-либо символа в файл?

4b9b3361

Ответ 1

Разве это не то, что делает "/"?

Если вы ищете следующий "x", тогда do/x в режиме командной строки.

Затем вы можете нажать "n", чтобы перейти к следующему x, а затем к следующему x и т.д.

Есть много vim чит-листов там со всеми советами.

Ответ 2

Вот пример переопределения f, чтобы игнорировать регистр в файле справки 'eval.txt'.

: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, это было протестировано с Vim 7.2 на Ubuntu 10.04.

Ответ 3

Желая узнать точно то же самое, я просмотрел ответы здесь. Ни один из них не является тем, что я хотел, поэтому я собрал несколько из них.

Ответ

q335 был самым близким, потому что он правильно обрабатывает omaps, что необходимо сделать, например, dt} (удалить все до, но не включая следующую фигурную скобку), но ответ Курта обрабатывает специальный поиск символов и использует одну функцию, которая для меня гораздо предпочтительнее, поэтому я не добавляю слишком много к моему .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

Christian Brabandt ft_improved plugin расширяет встроенные команды f/t для поиска в следующих строках.

Ответ 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)

Ответ 6

Вы можете сделать сопоставление, чтобы перейти к следующему символу под курсором:

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

\ V будет гарантировать, что символы соответствуют буквально.

Кроме того, вы можете посмотреть команды * и #, которые уже определены для вас, хотя они могут и не быть тем, что вы хотите.

Ответ 7

Самый разумный способ сделать это на данный момент скрыт в этом комментарии.

Вам просто нужно установить два плагина: vim-repeat и vim-fanfingtastic.

Лично я использую Vundle для управления моими плагинами vim.

Таким образом, вы можете сделать f, f и т.д. по желанию:

  • Установить Vundle.
  • Добавьте эти строки в свой .vimrc:

    Plugin 'tpope/vim-repeat'
    Plugin 'dahu/vim-fanfingtastic'
    
  • Запустите $ vim +PluginInstall +qall в своей оболочке.
  • Voila!

Ответ 8

Один из подходов к этой проблеме - использовать плагин easymotion.

Это позволяет использовать движения, такие как f во всем видимом окне текста. Вы запускаете плагин, затем введите f и персонаж, который вы ищете. Он выделяет каждую позицию, когда символ появляется на экране в цвет подсветки (например, красный) и показывает позицию с помощью буквы (a, b, c, d,...). Вы просто нажимаете букву, соответствующую позиции, в которую хотите перейти.

Плагин README на Github включает анимацию, которая наглядно демонстрирует, как она работает.