แสดงเส้นที่ตรงกันเท่านั้นหรือ


31

ในไฟล์ขนาดยาวฉันต้องการค้นหารูปแบบที่จะจับคู่ประมาณ 200 บรรทัดหรือมากกว่านั้น บรรทัดที่จับคู่อยู่ในตำแหน่งสุ่มในไฟล์
เมื่อบรรทัดตรงกันเฉพาะบรรทัดนั้นเกี่ยวข้องเท่านั้นไม่มีบริบทด้านบนหรือด้านล่าง

ปกติผมจะค้นหาด้วยและกระโดดผ่านการแข่งขันด้วย/ แต่นั่นหมายความว่ามีเพียงหนึ่งหรือสองบรรทัดที่เกี่ยวข้องบนหน้าจอในแต่ละครั้ง n

มีวิธีซ่อนทุกบรรทัดที่ไม่ตรงกันหรือไม่ในขณะที่กำลังดูรายการของบรรทัดผลลัพธ์


วิธีเดรัจฉานบังคับจะเป็นการลบบรรทัดที่ไม่ตรงกันทั้งหมดและยกเลิกการลบนั้นในภายหลัง แต่มันก็น่าเกลียดในหลาย ๆ ทางแม้ว่ามันจะไม่จบลงด้วยการเลิก ...

คำตอบ:


34
:vimgrep pattern %
:cwin

vimgrepจะค้นหารูปแบบของคุณในไฟล์ปัจจุบัน ( %) หรือไฟล์อะไรก็ได้ที่คุณระบุ

cwinจะเปิดบัฟเฟอร์ในหน้าต่างของคุณซึ่งจะแสดงเฉพาะบรรทัดที่ต้องการ คุณสามารถใช้คำสั่งการนำทาง / ค้นหาใดก็ได้ในcwinบัฟเฟอร์ กด Return เพื่อข้ามไปยังบรรทัดใต้เคอร์เซอร์ของคุณในไฟล์ต้นฉบับ


1
:vimgrepสามารถย่อให้:vim
D. Ben Knoble

ฉันจะกลับไปที่บัฟเฟอร์อีกครั้งได้อย่างไร
มหาอำมาตย์

ยังฉันจะปิดบัฟเฟอร์ได้อย่างไร ขอบคุณล่วงหน้า
pasha

จากบัฟเฟอร์ด่วน (cwindow) คุณสามารถกดย้อนกลับบนบรรทัดใดก็ได้เพื่อข้ามไปยังตำแหน่งนั้นในบัฟเฟอร์เดิม คุณสามารถปิดบัฟเฟอร์ cwindow ได้จากทุกที่ด้วย:ccl[ose]หรือตามปกติคุณจะปิดบัฟเฟอร์ (เช่นเปลี่ยนเป็นและ:bd) คุณสามารถเปิดบัฟเฟอร์การแก้ไขด่วน:cw[indow]อีกครั้งโดยเรียกใช้อีกครั้งและจะใช้ผล vimgrep ล่าสุดของคุณ
Zach Ingbretsen

15

คุณสามารถแสดงรายการบรรทัดที่ตรงกันทั้งหมดด้วย

:g/{pattern}

( :printสามารถละเว้นคำสั่งได้ซึ่งเป็นค่าเริ่มต้นสำหรับ:g)


1
นี่คือ "grep ดั้งเดิม" ( g/REgexp/p) ... ปัญหาคือคุณไม่สามารถข้ามไปยังหนึ่งในแมตช์ได้อย่างง่ายดายแม้ว่า ...
Martin Tournoij

@Carpetsmoker: คุณพูดถูก; เพื่อที่ฉันมีปลั๊กอินดูคำตอบอื่น ๆ ของฉัน
Ingo Karkat

นั่นอาจเป็นประโยชน์สำหรับหลาย ๆ กรณี สามารถเปลี่ยนเส้นทางไปยังบัฟเฟอร์ใหม่ได้หรือไม่? ที่จะช่วยให้ยังคงมีการเน้นไวยากรณ์ในบรรทัด (อืม ... นั่นทำให้เกิดคำถามอื่นรอสักครู่ ... )
Volker Siegel

@IngoKarkat ความหมายคือgอะไร ฉันคิดว่ามันเป็นรูปแบบทั่วโลก ฉันมักจะทำการค้นหาด้วย VI ด้วยเครื่องหมายทับ/patternและสิ่งนี้จะพบเหตุการณ์ทั้งหมด หนึ่งสามารถนำทางไปยังพวกเขาโดยการกดตัวอักษรn
Alexander Cska

@AlexanderCska: ไม่มันไม่ใช่ตัวดัดแปลงสำหรับการค้นหา แต่เป็นคำสั่งแยกต่างหาก:g[lobal]ที่ใช้รูปแบบเป็นอาร์กิวเมนต์ :help :globalคุณจะพบรายละเอียดทั้งหมดได้ที่
Ingo Karkat

12

คุณสามารถใช้ตัวเลือกfoldmethodและfoldexprตัวเลือกเพื่อย่อบรรทัดที่ไม่เกี่ยวข้องออกไป

หลังจากค้นหาการค้นหาล่าสุดจะถูกเก็บไว้ในการ@/ลงทะเบียน ดังนั้นคุณสามารถพับเก็บทุกอย่างที่ไม่ตรงกันเช่นนี้ได้ (สำหรับการแข่งขันแบบบรรทัดเดียวเท่านั้น):

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

วิธีการขั้นสูงอื่น ๆ เช่นการเพิ่มหลายระดับของการพับสำหรับสายบริบทคุณสามารถแสดงหรือซ่อนหรือตรงกับหลายบรรทัดสามารถพบได้ในกลุ่มเคล็ดลับวิกิพีเดีย


ดูเหมือนว่ามีความset foldlevel=0จำเป็น? แต่อาจเป็นค่าเริ่มต้น
Volker Siegel

1
ใช่ค่าเริ่มต้นคือศูนย์ แต่ถ้ามันไม่ทำงานหากไม่มีการเพิ่มมันจะไม่เจ็บ :-)
เบ็น

แต่ตอนนี้ ... จะเปลี่ยนกลับอย่างไรโดยไม่มีร่องรอย?
Volker Siegel

ในโหมดปกติคุณสามารถใช้ 'zi' เพื่อสลับการปิดและเปิด
John O'M

ส่วนใหญ่เวลาที่ฉันทำสิ่งนี้ฉัน:tab spจะได้รับมุมมองใหม่ของการโยนทิ้งในไฟล์ จากนั้นการย้อนกลับนั้นง่ายพอ:closeๆ กับการฆ่าแท็บ
เบ็น

6

หากคำสั่งซื้อไม่สำคัญเพียงแค่ย้ายเส้น

:g/pat/m0

สำหรับความช่วยเหลือเพิ่มเติมดู:

:h :g
:h :m

1
และ:g/pat/m$(ย้ายเส้นที่ตรงกันไปยังจุดสิ้นสุด) ก็เป็นเช่นนั้น
Lerner Zhang

6

[d] ลบทุกบรรทัดที่ไม่ใช่ (!) รูปแบบการจับคู่:

:g!/pattern/d

หรือง่ายยิ่งขึ้น (ขอบคุณสำหรับความคิดเห็นโดย 'B Layer'):

:v/pattern/d

ใช่ แต่มันก็เป็นธรรมดาที่จะใช้เทียบเท่ามากกว่า:v :g!(ฉันจำไม่ได้ว่าครั้งสุดท้ายที่ฉันเห็นหลังใช้ TBH!)
B Layer

2

หากคุณต้องการรายชื่อสายการจับคู่ทั้งหมด (ในขณะที่คำตอบอื่น ๆ ของฉัน) แล้วกระโดดจะมีการแข่งขันอย่างใดอย่างหนึ่งโดยเฉพาะอย่างยิ่งของฉันปลั๊กอิน FindOccurrenceมี[/การทำแผนที่สำหรับการที่ (และ[nสำหรับรูปแบบการค้นหาล่าสุดแทนการสอบถามหนึ่ง) [/patternรายการที่ต้องการ:g/patternแต่จากนั้นจะถามจำนวนการแข่งขันที่จะข้ามไป


0

อีกวิธีคือใช้:h :ilistฉันใช้เพื่อดูภาพรวมของ man page มันเป็นผลลัพธ์เช่นนี้:

~/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]+$/'))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.