LINUX.ORG.RU

Find all в vim

 


1

2

Подскажите, пожалуйста, как сделать в vim поиск по открытому файлу, чтобы он вывел результаты в split с указанием номера строки и возможностью переключения м/у ними? Как это сделано в geany, notepad++ etc. Т.е. аналог g//, но чтобы можно было переключаться м/у результатами поиска.

Гуглил на тему, как заредиректить вывод поиска в quickfix, ничего удобного не нашлось.

Или как вариант: как просто заредиректить вывод поиска в split, с указанием номера строки, чтобы его можно было нормально скроллить?


Решил вот так. Если есть способы получше, буду признателен.

command! -nargs=+ MyGrep execute 'silent grep! --no-filename <args>' | copen 33

emcode
() автор топика
Ответ на: комментарий от emcode

Этот способ слишком полагается на то, что в 'grepprg' находится grep. Было бы надежней использовать :vimgrep. Плюс в нем можно зареюзать последний поиск.

:vimgrep /pattern/ %

salsa
()
Ответ на: комментарий от salsa
:lv /pattern/ % | lw20

":lv /pattern/" - lvimgrep, просто lv набрать быстрее
"%" - искать в текущем файле
" | lw20" - открыть quickfix (или второй, не помню название) и расайзнуть на 20 строк

q11q11 ★★★★★
()

То, что ты выбрал и что предложили выше — отстой.

Вот это (http://i.imgur.com/ipWEZUi.png) куда лучше вещь:

function! List(command, selection, start_at_cursor, ...)
    let excmd   = a:command . "list"
    let normcmd = toupper(a:command)
    let output  = ""

    if a:selection
        if a:0 > 0 && len(a:1) > 0
            let search_pattern = a:1
        else
            let old_reg = @v
            normal! gv"vy
            let search_pattern = substitute(escape(@v, '\/.*$^~[]'), '\\n', '\\n', 'g')
            let @v = old_reg
        endif
        redir => output
        silent! execute (a:start_at_cursor ? '+,$' : '') . excmd . ' /' . search_pattern
        redir END
    else
        redir => output
        silent! execute 'normal! ' . (a:start_at_cursor ? ']' : '[') . normcmd
        redir END
    endif
    let lines = split(output, '\n')
    if lines[0] =~ '^Error detected'
        echomsg 'Could not find "' . (a:selection ? search_pattern : expand("<cword>")) . '".'
        return
    endif
    let filename   = ""
    let qf_entries = []
    for line in lines
        if line !~ '^\s*\d\+:'
            let filename = line
        else
            call add(qf_entries, {"filename" : filename, "lnum" : split(line)[1], "text" : join(split(line)[2:-1])})
        endif
    endfor
    call setqflist(qf_entries)
    cwindow
endfunction

" nnoremap <silent> [I :call List("i", 0, 0)<CR>
" nnoremap <silent> ]I :call List("i", 0, 1)<CR>
" xnoremap <silent> [I :<C-u>call List("i", 1, 0)<CR>
" xnoremap <silent> ]I :<C-u>call List("i", 1, 1)<CR>

" nnoremap <silent> [D :call List("d", 0, 0)<CR>
" nnoremap <silent> ]D :call List("d", 0, 1)<CR>
" xnoremap <silent> [D :<C-u>call List("d", 1, 0)<CR>
" xnoremap <silent> ]D :<C-u>call List("d", 1, 1)<CR>

command! -nargs=1 Ilist call List("i", 1, 0, <f-args>)
command! -nargs=1 Dlist call List("d", 1, 0, <f-args>)

nmap <silent> <F4> :call List("i", 0, 0)<CR>

Это результат колаборации многих людей, лучше не найдешь. Теперь по F4 ищет то, что по курсору и открывает в quicklist с автоматическим переходом по кликнутому. Обрати внимание на закомментированые настройки. Позже это родилось в vim-qlist, который можно использовать как плагин, но лично я продолжаю использовать вышеуказанную настройку.

Для сразу многих файлов лучше использовать мощный CtrlSF, он грепает быстрым ag (silver searcher), с возможностью множественного изменения и т.п.

kep
()
Ответ на: комментарий от kep

vim-qlist

да, он там его допилил, лучше уж использовать его, чем простыню выше.

kep
()
Ответ на: комментарий от kep

по F4 ищет то, что по курсору

а как оно ищет как целое слово или как часть?
ну в смысле /\<pattern\> или просто как /pattern ?

q11q11 ★★★★★
()
Последнее исправление: q11q11 (всего исправлений: 1)

А в emacs это «M-s o» из коробки.

fmdw
()
Ответ на: комментарий от q11q11

Зависит от представлений ТСа о результатах(глобальные или локальные). А уж настройка конечной команды — дело вкуса.

salsa
()
Ответ на: комментарий от kep

local quickfix заполнять не умеет, хотя вроде есть :colder.. И контекст, в случае необходимости, не добавит. Не говоря уже о том, что всю инфу из инклудов тащит. Короче, этот способ просто повторяет поведение :*list, но с заполнением quickfix.

лучше не найдешь

:Unite -line, как вариант.

Для сразу многих файлов лучше использовать мощный CtrlSF, он грепает быстрым ag (silver searcher), с возможностью множественного изменения и т.п.

Не нашел никаких преимуществ перед настроенным 'grepprg' и :grepadd. Ну может редактирование грепнутого разве что, но для этого уже есть отдельные плагины. Раз ты тут, он редактирование *контекста* тоже отражает на файлах?

salsa
()
Ответ на: комментарий от salsa

Раз ты тут, он редактирование *контекста* тоже отражает на файлах?

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

kep
()
Ответ на: комментарий от salsa

ну да, но ТС хочет чтоб quickfix сразу и открылся

q11q11 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.