Chỉ hiển thị các dòng phù hợp?


31

Trong một tệp dài, tôi muốn tìm kiếm một mẫu phù hợp với khoảng 200 dòng hoặc hơn. Các dòng phù hợp là ở những nơi ngẫu nhiên trong tập tin.
Khi một dòng khớp, chỉ có chính dòng đó là phù hợp, không có ngữ cảnh bên trên hoặc bên dưới.

Thông thường, tôi sẽ tìm kiếm /và nhảy qua các trận đấu với n.
Nhưng điều đó có nghĩa là chỉ có một hoặc hai dòng có liên quan trên màn hình tại một thời điểm.

Có cách nào để ẩn tất cả các dòng không khớp, trong khi đi qua danh sách các dòng kết quả không?


Một cách tiếp cận mạnh mẽ sẽ là xóa tất cả các dòng không khớp và hoàn tác xóa sau đó. Nhưng điều đó thật xấu xí theo nhiều cách khác nhau, ngay cả khi nó sẽ không tồn tại mãi mãi ...

Câu trả lời:


34
:vimgrep pattern %
:cwin

vimgrepsẽ tìm kiếm mẫu của bạn trong tệp hiện tại ( %) hoặc bất kỳ tệp nào bạn chỉ định.

cwinsau đó sẽ mở một bộ đệm trong cửa sổ của bạn sẽ chỉ hiển thị các dòng mong muốn. Bạn có thể sử dụng khá nhiều bất kỳ lệnh điều hướng / tìm kiếm nào trong cwinbộ đệm. Nhấn return để nhảy đến dòng dưới con trỏ của bạn trong tệp nguồn.


1
:vimgrepcó thể được viết tắt thành:vim
D. Ben Knoble

Làm thế nào để tôi trở lại bộ đệm một lần nữa?
pasha

làm thế nào để tôi đóng bộ đệm? cảm ơn trước
pasha

Từ bộ đệm quickfix (cwindow), bạn có thể nhấn return trên bất kỳ dòng nào để nhảy đến vị trí đó trong bộ đệm ban đầu. Bạn có thể đóng bộ đệm cwindow từ bất cứ đâu bằng :ccl[ose]hoặc tuy nhiên bạn thường đóng bộ đệm (ví dụ: chuyển sang bộ đệm và :bd). Bạn có thể mở lại bộ đệm quickfix bằng cách chạy :cw[indow]lại và nó sẽ sử dụng kết quả vimgrep cuối cùng của bạn.
Zach Ingbretsen

15

Bạn có thể liệt kê tất cả các dòng khớp với

:g/{pattern}

( :printLệnh có thể được bỏ qua; nó là mặc định cho :g.)


1
Đây là "grep gốc" ( g/REgexp/p) ... Vấn đề là bạn không thể dễ dàng nhảy vào một trong những trận đấu, mặc dù ...
Martin Tournoij

@Carpetsmoker: Bạn nói đúng; cho rằng, tôi có một plugin, xem câu trả lời khác của tôi.
Ingo Karkat

Điều đó có thể hữu ích cho nhiều trường hợp. Đầu ra có thể được chuyển hướng đến một bộ đệm mới không? Điều đó sẽ cho phép vẫn có cú pháp tô sáng trên các dòng. (Hmm ... điều đó đặt ra một câu hỏi khác, đợi một chút ...)
Volker Siegel

@IngoKarkat nghĩa là gì g. Tôi cho rằng đó là một mô hình toàn cầu. Tôi thường thực hiện tìm kiếm VI với một dấu gạch chéo /patternvà điều này sẽ tìm thấy tất cả các lần xuất hiện. Người ta có thể điều hướng đến họ bằng cách nhấn vào bức thưn
Alexander Cska

@AlexanderCska: Không, nó không phải là công cụ sửa đổi cho tìm kiếm, mà là một lệnh riêng biệt :g[lobal]lấy một mẫu làm đối số. Bạn sẽ tìm thấy tất cả các chi tiết tại :help :global.
Ingo Karkat

12

Bạn có thể sử dụng foldmethodfoldexprcác tùy chọn để gấp các dòng không liên quan.

Sau khi tìm kiếm, tìm kiếm cuối cùng được lưu trữ trong @/sổ đăng ký. Vì vậy, bạn có thể dễ dàng gấp lại mọi thứ không khớp như thế này (chỉ dành cho khớp một dòng):

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

Các phương pháp nâng cao hơn, như thêm nhiều cấp độ gấp cho các dòng ngữ cảnh bạn có thể hiển thị hoặc ẩn hoặc khớp nhiều dòng, có thể được tìm thấy trên Vim Tips Wiki .


Có vẻ như là set foldlevel=0cần thiết? Nhưng có lẽ đó là mặc định.
Volker Siegel

1
Vâng, mặc định là 0, nhưng nếu nó không hoạt động mà không có, thêm nó không thể làm tổn thương. :-)
Ben

Nhưng bây giờ ... làm thế nào để chuyển nó trở lại, không có dấu vết?
Volker Siegel

ở chế độ bình thường, bạn có thể sử dụng 'zi' để bật và tắt.
John O'M.

Hầu hết thời gian khi tôi làm điều này trước tiên tôi :tab spsẽ có được một cái nhìn mới về tập tin. Sau đó, quay trở lại là đơn giản như :closehoặc bất kỳ cách nào khác để giết tab.
Ben

6

Nếu thứ tự không quan trọng thì chỉ cần di chuyển các dòng.

:g/pat/m0

Để được trợ giúp thêm xem:

:h :g
:h :m

1
:g/pat/m$(di chuyển các dòng trùng khớp đến cuối) cũng được,
Lerner Zhang

6

[d] xóa tất cả các dòng không khớp (!):

:g!/pattern/d

hoặc thậm chí đơn giản hơn (cảm ơn vì đã nhận xét bởi 'Lớp B'):

:v/pattern/d

Vâng, nhưng thông thường hơn là sử dụng tương đương :vchứ không phải :g!. (Tôi không nhớ lần cuối cùng tôi nhìn thấy cái sau được sử dụng, TBH!)
Lớp B

2

Nếu bạn muốn liệt kê tất cả các dòng phù hợp (như trong câu trả lời khác của tôi), và sau đó nhảy tới một trận đấu đặc biệt, tôi cắm FindOccurrence cung cấp một [/bản đồ cho rằng (và [ncho các mô hình tìm kiếm cuối cùng, thay vì truy vấn cho một). [/patternliệt kê như thế :g/pattern, nhưng sau đó yêu cầu số lượng trận đấu để chuyển đến.


0

Một cách khác là sử dụng :h :ilist, tôi sử dụng nó để có cái nhìn tổng quan về trang man. kết quả của nó trông như thế này:

~/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

Đây là một hàm nhỏ cho phép bạn chọn đi đến dòng kết quả theo chỉ mục:

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

Nó có thể được sử dụng như thế này:

command! -buffer Section call s:select_ilist(execute('silent! ilist /\v\C^[A-Z][^a-z]+$/'))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.