Показати лише відповідні рядки?


31

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

Як правило, я б шукав /і стрибав через матчі n.
Але це означає, що на екрані одночасно є лише одна або дві відповідні лінії.

Чи є спосіб приховати всі рядки, які не збігалися, переглядаючи список рядків результатів?


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

Відповіді:


34
:vimgrep pattern %
:cwin

vimgrepбуде шукати ваш шаблон у поточному файлі ( %) або будь-яких файлах, які ви вказали.

cwinпотім відкриє у вашому вікні буфер, який відображатиме лише потрібні рядки. Ви можете використовувати майже будь-яку команду навігації / пошуку в cwinбуфері. Натисніть кнопку return, щоб перейти до рядка під курсором у вихідному файлі.


1
:vimgrepможна скоротити до:vim
D. Ben Knoble

як мені знову повернутися до буфера?
паша

також як я закриваю буфер? заздалегідь дякую
паша

Із буфера швидкої виправлення (cwindow) ви можете натиснути повернення на будь-якому рядку, щоб перейти до цього місця у вихідному буфері. Ви можете закрити буфер вікна з будь-якого місця, :ccl[ose]однак буфер зазвичай закрийте (наприклад, перемкніть його на :bd). Ви можете повторно відкрити буфер :cw[indow]швидкого виправлення, запустивши його знову, і він використовуватиме ваші останні результати vimgrep.
Zach Ingbretsen

15

Ви можете перелічити всі відповідні рядки

:g/{pattern}

( :printКоманду можна опустити; вона є типовою для :g.)


1
Це "оригінальний греп" ( g/REgexp/p) ... Проблема в тому, що ви не можете легко перейти до одного з матчів, хоча ...
Мартін Турной

@Carpetsmoker: Ти маєш рацію; для цього у мене є плагін, дивіться іншу відповідь.
Інго Каркат

Це може бути корисним у багатьох випадках. Чи можна вивід переадресувати на новий буфер? Це дозволило б все ще мати підкреслення синтаксису на рядках. (Гм ... що викликає ще одне питання, почекайте секунду ...)
Волкер Зігель,

@IngoKarkat, що означає значення g. Я припускаю, що це глобальна закономірність. Я зазвичай роблю VI пошук з косою рисою, /patternі це знайде всі випадки. Можна перейти до них, натиснувши листn
Олександр Цска

@AlexanderCska: Ні, це не модифікатор пошуку, а окрема команда, :g[lobal]яка бере аргумент як аргумент. Ви знайдете всі деталі на :help :global.
Інго Каркат

12

Ви можете використовувати foldmethodі foldexprпараметри, щоб відкидати нерелевантні лінії.

Після пошуку останній пошук зберігається в @/реєстрі. Отже, ви можете легко скласти все, що не відповідає цьому (лише для однорядкових матчів):

:setlocal foldexpr=getline(v:lnum)=~@/?0:1 foldmethod=expr

Більш прогресивні методи, такі як додавання декількох рівнів складання для контекстних ліній, які ви можете показати або приховати, або збіг декількох рядків, можна знайти в Вікі-підказках Вікі .


Здається, є set foldlevel=0необхідність? Але, можливо, це за замовчуванням.
Volker Siegel

1
Так, за замовчуванням дорівнює нулю, але якщо він не працює без додавання, це не може зашкодити. :-)
Бен

Але тепер ... як знову повернути його назад, без слідів?
Volker Siegel

у звичайному режимі ви можете використовувати "zi" для вимкнення та ввімкнення складання.
Джон О'М.

Більшу частину часу, коли я роблю це, я спочатку :tab spотримую новий перегляд файлу. Тоді повернутися назад так само просто, як :closeі будь-який інший спосіб вбити вкладку.
Бен

6

Якщо замовлення не має значення, просто перемістіть рядки.

:g/pat/m0

Докладнішу інформацію див.

:h :g
:h :m

1
І :g/pat/m$(перемістіть відповідні лінії до кінця) також добре,
Лернер Чжан

6

[d] виділити всі рядки, що не (!) відповідають шаблонам:

:g!/pattern/d

або навіть простіше (дякую за коментарі "B Layer"):

:v/pattern/d

Так, але більш звичайно використовувати еквівалент, :vа не :g!. (Я не пам’ятаю востаннє, коли я бачив останнє вживане, TBH!)
B Layer

2

Якщо ви хочете перерахувати всі відповідні рядки (як у моїй іншій відповіді), а потім перейти до однієї конкретної відповідності, мій плагін FindOccurrence надає [/відображення для цього (і [nдля останнього шаблону пошуку, замість запиту для одного). [/patternсписки на кшталт :g/pattern, але потім просить номер матчу перейти до.


0

Інший спосіб - це використовувати :h :ilist, я використовую його, щоб отримати огляд сторінки людини. результат виглядає приблизно так:

~/find.~
  1:    3 NAME
  2:    6 SYNOPSIS
  3:    9 DESCRIPTION
  4:   18 OPTIONS
  5:   93 EXPRESSION
  6:  779 EXAMPLES
  7:  877 HISTORY
  8:  931 BUGS

Ось невелика функція, за допомогою якої ви можете перейти до рядка результатів за індексом:

function! s:select_ilist(ilist_result)
  if empty(a:ilist_result) || a:ilist_result =~# '^\_s*Error'
    return
  endif

  let select = input(a:ilist_result . "\ngoto : ")
  if empty(select) | return | endif

  " ilist result starts with '\nfilename\n', filename can be empty
  let lines = split(a:ilist_result[stridx(a:ilist_result, "\n", 1) : ], "\n")
  if select <= 0 || select > len(lines) | return | endif

  exec matchstr(lines[select-1], '^\v\s*\d+\:\s+\zs\d+')
endfunction

Його можна використовувати так:

command! -buffer Section call s:select_ilist(execute('silent! ilist /\v\C^[A-Z][^a-z]+$/'))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.