Кто-нибудь знает, как быстро найти следующее появление символа (например, команду f), но многострочный? То есть быстро перейти к следующему вхождению какого-либо символа в файл?
Использование команды vim f для нескольких строк
Ответ 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 включает анимацию, которая наглядно демонстрирует, как она работает.