Использование команды vim для нескольких строк - PullRequest
41 голосов
/ 13 октября 2010

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

Ответы [ 8 ]

40 голосов
/ 13 октября 2010

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

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

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

Есть много vim шпаргалок со всеми видами подсказок.

12 голосов
/ 14 октября 2010

Существует пример переопределения 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 должен работать так, как вы хотите.

Кстати, это было протестировано с Vim 7.2 на Ubuntu 10.04.

8 голосов
/ 02 марта 2013

Плагин Кристиана Брабандта ft_improved расширяет встроенные команды f / t и для поиска в следующих строках.

7 голосов
/ 21 августа 2012

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

Ответ 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
5 голосов
/ 12 мая 2012

Аааа, 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)
2 голосов
/ 21 декабря 2015

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

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

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

2 голосов
/ 21 декабря 2015

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

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

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

Так что вы можете сделать f,F и т. Д. Работают по желанию:

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

    Plugin 'tpope/vim-repeat'
    Plugin 'dahu/vim-fanfingtastic'
    
  3. Запустите $ vim +PluginInstall +qall в вашей оболочке.
  4. Вуаля!
1 голос
/ 14 октября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...