Як відобразити результати пошуку для всіх відкритих буферів


17

Одне, що я часто роблю (але покладаюся на командний рядок) - це пошук / прив'язка до кількох файлів.

Чи є спосіб відобразити результати пошуку для всіх відкритих буферів?

В ідеалі, я хотів би створити новий розділений буфер, що містить розташування результатів та фрагмент, як grepце робиться. Наприклад ( /statistics):

models/statistics.php: /*! \file   statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();

Як бонус, я хотів би мати можливість шукати цей термін під курсором, як gdі у нас.


Відповіді:


15

Ви можете використовувати :vimgrep /pattern/ {files}для заповнення списку швидких виправлень відповідними шаблонами. Проблема полягає в тому, що :vimgrepопція файлів не дозволяє безпосередньо створювати буфери. Ви можете використовувати:

%   Is replaced with the current file name.       *:_%* *c_%*
#   Is replaced with the alternate file name.     *:_#* *c_#*
#n  (where n is a number) is replaced with        *:_#0* *:_#n*
    the file name of buffer n.  "#0" is the same as "#".     *c_#n*
##  Is replaced with all names in the argument list   *:_##* *c_##*
    concatenated, separated by spaces.  Each space in a name
    is preceded with a backslash.
#<n (where n is a number > 0) is replaced with old    *:_#<* *c_#<*
    file name n.  See |:oldfiles| or |v:oldfiles| to get the
    number.                         *E809*
    {only when compiled with the |+eval| and |+viminfo| features}

Інший варіант - написати сценарій, який генерує список файлів із :buffers. За цю посаду ТА з невеликим твіком ми отримуємо:

function! BuffersList()
  let all = range(0, bufnr('$'))
  let res = []
  for b in all
    if buflisted(b)
      call add(res, bufname(b))
    endif
  endfor
  return res
endfunction

function! GrepBuffers (expression)
  exec 'vimgrep/'.a:expression.'/ '.join(BuffersList())
endfunction

command! -nargs=+ GrepBufs call GrepBuffers(<q-args>)

Тепер ви можете зателефонувати :GrepBufs <expression>та отримати стандартний :vimgrepвихід, але замість цього використовувати буфери.

Оновлення Якщо ви хочете зателефонувати GrepBuffersза допомогою значення під курсором, додайте це нове відображення.

nnoremap <leader>z :call GrepBuffers("<C-R><C-W>")<CR>

Коли ви перебуваєте в звичайному режимі, <leader>zви :vimgrepвкажете слово курсору над відкритими буферами.


2
У вигляді одного рядка: command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' '). Використання::Bufgrep/foo/
Пітер Рінкер

8

Пошук у лише відкритих буферах приємний, але може настати час, коли ви хочете здійснити пошук у всьому проекті. Це може бути швидше і простіше, ніж ви думаєте!

Пошук по проекту

  • grepє стандартним інструментом пошуку Unix. Варто згадати через всю його повсюдність. Вже інтегровано у Vim за допомогою :grepкоманди. напр :grep -r 'foo'. Див :h :grep.
  • Ack швидше звичайного grep, оскільки він пропускає каталоги VCS, бінарні файли та може шукати певний тип файлів, таких як --perl. Про інтеграцію Vim див. Ack.vim
  • Ag Silver Silver - це інструмент пошуку коду, схожий на ack, але швидший. Плагін Vim: Ag.vim
  • git grepшукає сховище дуже швидко. Fugitive.vim забезпечує :Ggrep.
  • Ripgrep навіть швидше, ніж Ag і git grep. Можна використовувати і з :grep.

Я рекомендую як ripgrep, Ag, так git grepяк вони всі дуже швидкі. Я шукав понад 4700+ менше ніж за 1 секунду. Досить важко перемогти рипграп.

Щоб випробувати одну з цих альтернатив без плагіна або просто не хочете плагін, ви можете встановити 'grepprg'відповідний варіант. наприклад set grepprg=ag\ --vimgrepабо set grepprg=rg\ --vimgrep. Див. :h 'grepprg'Та :h 'grepformat'для отримання додаткової інформації. Тепер ви можете шукати через :grep. напр :grep 'foo'.

В якості остаточної резервної копії ви можете використовувати, :vimgrepяк це доступно для всіх систем, на яких Vim доступний. Зверніться :h :vimgза додатковою допомогою.

Список QuickFix

Оскільки в більшості з цих опцій використовується список швидких виправлень, я пропоную вам скористатись більш дружніми відображеннями для перекреслення списку швидких виправлень. Я використовую безперешкодний плагін Тіма Попа, який використовує ]qі [qдля, :cnextі :cprevвідповідно. Деякі люди , як QuickFix відкрити після пошуку виконується , то додайте наступні рядки в ~/.vimrcфайл: autocmd QuickFixCmdPost *grep* cwindow. Ви також можете вручну відкрити список QuickFix через :copen.

Хочете ще швидших "пошуків"?

Вам знадобиться використовувати якийсь інструмент, який використовує попередньо вбудовані індекси, такі як ctags , cscope або GNU global .

  • Vim має вбудовану підтримку ГКДА через :tag, <c-]>і багато інших команд і опції. Див :h tags. Також можна прочитати прості каталоги з Git або переглянути плагін Gutentags
  • Підтримка Cscope також вбудована і може використовуватися за допомогою :cscopeкоманди. Побачити:h cscope

Більше допомоги

Я б почав з цього приємного епізоду Vimcast : Шукайте декілька файлів:vimgrep .

Для отримання додаткової інформації про Vim дивіться документацію:

:h grep
:h :vimgrep
:h :grep
:h 'grepprg'
:h 'grepformat'
:h quickfix
:h :cnext
:h tags
:h cscope

6

Мій плагін GrepCommands визначає варіанти вбудованої :vimgrepкоманди, націлені на всі аргументи, перелічені буфери, вікна на поточній сторінці вкладки або на всіх сторінках вкладки для її пошуку. В основному, надійна реалізація плагіну відповіді @ jecxjo.


1

Команди :bufdoі:vimgrepadd

Ця відповідь заснована на /programming//a/11976158/1057593 .

Однак я хотів додати кілька біт. Знову ж таки основна команда

:bufdo vimgrepadd pattern %

Якщо ваш список швидких виправлень не порожній, ви, ймовірно, хочете очистити його спочатку (див. Https://stackoverflow.com/q/27385970/1057593 ). Це можна зробити за допомогою

:cexpr []

vim-unmapaired надає відображення ]qта [qпрокручує сірники.

cmdline-історія

Це хороший робочий процес, щоб ввести шаблон пошуку окремо за допомогою /pattern. Це дозволяє використовувати загальну команду з історії вашого командного рядка, використовуючи поточний шаблон пошуку. Це виглядало б так

/pattern
:bufdo vimgrepadd // %

Типовий новий широкий пошук буфера був би

/pattern2
:bufdo<up><up>...

Я додав наступні відображення до свого vimrc для використання, <C-N>а <C-P>не клавіш зі стрілками

cmap <C-P> <Up>
cmap <C-N> <Down>

Для пошуку історії команд використовуйте q:, а потім /bufdo<CR>викликайте команду за допомогою <CR>. Докладніше див. На https://vim.fandom.com/wiki/Using_command-line_history та на довідкових сторінках :h historyта :h cmdline-window.

Ви можете додати до команди багаторазового використання, :copenщоб негайно побачити список виправлень таким чином:

:execute "bufdo vimgrepadd // %" | copen

Пропозиція від stackoverflow :bufdo vimgrepadd // % | copenу моєму випадку відкрила декілька ненавмисних вікон.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.