คุณจะแสดงรายการที่ตรงกันของการค้นหาของกลุ่มได้อย่างไร?


คำตอบ:


3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps

1
ฉันชอบไอเดีย F5-F8 ของคุณมาก จะเป็นการดีที่จะมีการแสดงภาพ / เอาต์พุตของคำสั่งเหล่านั้นที่นี่ F8 ออกแบบมาให้ทำงานอย่างไร? ค้นหาเฉพาะไดเร็กทอรีปัจจุบัน? - - การละเว้นของผบ. เป็นประเพณี - ​​- ทำไมnode_modules? - - regexes perl เปลี่ยนการทำงานเริ่มต้นของ Vim อย่างไร? - - ต่อไปนี้เป็นวิธีที่ฉันออกแบบการค้นหาไฟล์. tex askubuntu.com/a/789769/25388มันจะเป็นการดีที่จะเรียนรู้วิธีปรับปรุงจากคุณ มันไม่ได้ใช้งานง่ายดังนั้นฉันจึงลืมตรรกะของตัวเองบ่อยเกินไป
LéoLéopold Hertz 준영

node_modules เป็น dir ที่มีโค้ด js จำนวนมากจากโมดูล npm หากคุณจะพัฒนาส่วนหน้า ... มันเป็นเพียงตัวอย่างเท่านั้น ...
Yordan Georgiev

1
ทำการสำรองข้อมูลของคุณ. vimrc และเพิ่มการตั้งค่าเหล่านั้นโหลดด้วย: ดังนั้น% และกว่าจะพยายามเรียกใช้ "help" ในคำสั่ง ... vim นั้นยาก - คุณจะต้องทำซ้ำหลายพันครั้ง แต่เมื่อคุณ เชี่ยวชาญพวกเขาคุณจะหัวเราะ @ ทุกคนที่ชี้ให้เห็นคุณสมบัติ UI IDE ใหม่ของพวกเขา ...
Yordan Georgiev

226
:g//p

ในรูปแบบที่ยาวขึ้น:

:global/regular-expression/print

คุณสามารถละทิ้งรูปแบบ / regex และกลุ่มจะใช้คำค้นหาก่อนหน้านี้ซ้ำ

Trivia: grepเครื่องมือที่ได้รับการตั้งชื่อตามลำดับคำสั่งนี้


18
:g//- เนื่องจาก p (rint) เป็นการกระทำเริ่มต้นคุณสามารถปล่อยให้มันออกไปได้เช่นกัน
dekeguard

6
:g/ยิ่งสั้น!
Sparhawk

2
มันเป็นไปได้ที่จะเห็นบริบทที่นี่เหมือนใน grep --context 9?
Vitaly Zdanevich

@VitalyZdanevich ลอง:%s/regular-expression//gn มันจะสร้างบางสิ่งบางอย่างตามบรรทัดเหล่านี้:X matches on Y lines
Alexej Magura

@AlexejMagura ฉันหมายถึง - จะดูไม่กี่บรรทัดก่อนและหลังสตริงได้อย่างไร
Vitaly Zdanevich

50

คุณยังสามารถทำสิ่งต่อไปนี้

g/pattern/#

ที่จะพิมพ์รูปแบบที่คุณต้องการและจำนวนบรรทัด


2
ทำได้ดีนี่. แต่ถ้าคุณเปิดใช้งานหมายเลขบรรทัดแล้วก็#ไม่จำเป็นต้องใช้ มันแสดงหมายเลขบรรทัดโดยค่าเริ่มต้น
Pavan Manjunath

44

หากคุณต้องการดูรายการนี้และข้ามไปมาระหว่างการแข่งขันอย่างรวดเร็วให้พิจารณาใช้

:vimgrep example %

หรือ

:grep example %

การดำเนินการนี้จะเติมข้อมูล "รายการข้อผิดพลาด" พร้อมกับรายการที่ตรงกันทั้งหมดเพื่อให้คุณสามารถใช้:copenเพื่อแสดงรายการทั้งหมดในบัฟเฟอร์แก้ไขด่วนกด Enter ที่บรรทัดใดบรรทัดหนึ่งเพื่อข้ามไปยังรายการที่ตรงกันหรือใช้คำสั่งเช่น:cnและ:cpเพื่อย้อนกลับไปมา

สำหรับคำอธิบายอย่างละเอียดโปรดดูคำตอบของฉันสำหรับคำถามที่คล้ายกัน


สิ่งนี้ให้E499: Empty file name for '%' or '#', only works with ":p:h"ใน MacVim 8.1
Lincoln Bergeson

35

เพิ่งเรียนรู้ใหม่: Location List!
พิมพ์:lvim foo %เพื่อค้นหาfooในแฟ้มปัจจุบันและป้อนการแข่งขันทั้งหมดที่มีfooเข้ามาในรายการสถานที่
พิมพ์:lopenเพื่อเปิดรายการตำแหน่งในหน้าต่างแก้ไขด่วนซึ่งสามารถนำทางได้อย่างสมบูรณ์ตามปกติ
ใช้:lnext/ :lpreviousเพื่อผ่านรายการ (ใช้tpope / unimpaired mappings เพื่อประสบการณ์ที่ดีที่สุด)


2
เคล็ดลับที่ดี! สิ่งนี้ทำให้ฉันทำการแมปนี้ซึ่งจะขยายคำภายใต้เคอร์เซอร์โดยอัตโนมัติและเปิดในการกวาดครั้งเดียว: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen

16

ความเป็นไปได้อีกประการหนึ่งคือการใช้คำสั่งรวมไฟล์ค้นหา

[I

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

แต่สิ่งที่ดีเกี่ยวกับคำสั่งนี้ก็คือการแสดงผลการค้นหายังแสดงจำนวนการแข่งขันนอกเหนือจากหมายเลขบรรทัดของการแข่งขันแต่ละรายการ

:help include-search

เพื่อดูรูปแบบต่างๆมากมาย

หมายเหตุเกี่ยวกับ

:g//p

ซึ่งสามารถลดลงได้อีกถึง

:g//

เพราะอย่างที่คนอื่นพูด p (rint) เป็นการกระทำเริ่มต้น


เป็นไปได้ไหมที่จะได้รับผลลัพธ์จาก[Iบริบทเช่นบน grep --context 9?
Vitaly Zdanevich

10

คุณจะได้quickfixหน้าต่างที่สวยงามพร้อมการจับคู่จากรูปแบบการค้นหาปัจจุบันของคุณ

:vim // %
:copen

มีประโยชน์มากหากคุณเคยสร้างรูปแบบการค้นหาที่ซับซ้อนโดยใช้เพียง /pattern

แก้ไข : เพิ่งค้นพบว่าสิ่งนี้ใช้ได้กับบัฟเฟอร์ที่เปิดอยู่ทั้งหมด

:bufdo vimgrepadd // %
:copen

10

การใช้:set hlsearchจะเน้นการแข่งขันทั้งหมดเป็นสีเหลืองช่วยให้คุณสแกนไฟล์เพื่อหาการแข่งขันได้อย่างง่ายดาย นั่นอาจไม่ใช่สิ่งที่คุณต้องการหลังจากค้นหา: g // p จะให้รายการที่ตรงกัน


2
ควรเป็น ': set hlsearch' not ': hlsearch'
php มากเกินไป

นอกจากนี้ยังมีประโยชน์ในการแมป:nohlเพื่อล้างไฮไลต์เมื่อคุณไม่ต้องการอีกต่อไป
คอส

9

เพื่ออธิบายรายละเอียดเกี่ยวกับเรื่องนี้ ... แทนที่จะเป็น

/example
:g//p

คุณยังสามารถเขียนโดยตรง

:g/example/p

หรือเนื่องจาก p (rint) เป็นการกระทำเริ่มต้นสำหรับคำสั่ง: g (lobal) จึงสามารถย่อให้สั้นลงได้

:g/example

และแทนที่จะเป็น p (rint) สามารถดำเนินการอื่น ๆ ได้เช่น d (elete) โปรดดู: help: global


6
g/pattern

หากคุณมี:set numberคำสั่งด้านบนจะแสดงหมายเลขบรรทัดด้วย

หากคุณไม่ได้:set numberแล้ว

g/pattern/#

จะแสดงหมายเลขบรรทัด


0

ฉันได้เขียนโค้ดสำหรับสิ่งนี้แล้ว มันช่วยหลีกเลี่ยงปัญหาในvimgrep. ใช้งานได้แม้กับไฟล์ที่ไม่มีชื่อ และใช้งานง่ายกว่า

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

เมื่อคุณเรียกมันด้วยรูปแบบระบบจะเปิดหน้าต่างตำแหน่งที่ตรงกันทั้งหมด

นี่อาจเป็นคำสั่ง

command! -nargs=1 Mat call Matches(<f-args>)

ดังนั้นสิ่งที่คุณต้องทำคือพิมพ์ :Mat pattern

ฉันยังใช้การแมปต่อไปนี้เพื่อจับคู่การเลือกภาพปัจจุบัน

vnoremap Y "xy:call Matches(@x)<CR>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.