วิธีแสดงผลการค้นหาสำหรับบัฟเฟอร์ที่เปิดอยู่ทั้งหมด


17

สิ่งหนึ่งที่ฉันทำบ่อย ๆ (แต่ต้องพึ่งพาบรรทัดคำสั่งที่ต้องทำ) คือการค้นหา / grepping ในหลาย ๆ ไฟล์

มีวิธีแสดงผลการค้นหาสำหรับบัฟเฟอร์ที่เปิดทั้งหมดหรือไม่

โดยหลักแล้วฉันต้องการบัฟเฟอร์แยกใหม่ที่มีตำแหน่งผลลัพธ์และข้อมูลโค้ดคล้ายกับที่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อีกตัวเลือกหนึ่งคือการเขียนสคริปต์ที่สร้างรายการไฟล์จาก ต่อโพสต์นี้ด้วย tweek เล็กน้อยที่เราได้รับ:

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/
Peter Rincker

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 วินาที มันค่อนข้างยากที่จะเอาชนะ ripgrep

เพื่อทดสอบทางเลือกใดทางเลือกหนึ่งเหล่านี้โดยไม่มีปลั๊กอินหรือคุณไม่ต้องการปลั๊กอินที่คุณสามารถตั้งค่า'grepprg'ตัวเลือกของคุณได้ เช่นหรือset grepprg=ag\ --vimgrep set grepprg=rg\ --vimgrepดู:h 'grepprg'และ:h 'grepformat'สำหรับข้อมูลเพิ่มเติม :grepตอนนี้คุณสามารถค้นหาผ่าน :grep 'foo'เช่น

ในฐานะทางเลือกสุดท้ายคุณสามารถใช้งาน:vimgrepได้ในทุกระบบที่มี Vim ให้บริการ ดู:h :vimgความช่วยเหลือเพิ่มเติม

รายการ QuickFix

เนื่องจากตัวเลือกเหล่านี้ส่วนใหญ่ใช้รายการ quickfix ฉันขอแนะนำให้คุณใช้การแม็พที่เป็นมิตรมากกว่าเพื่อข้ามรายการ Quickfix ฉันใช้ปลั๊กอินunimpairedของ Tim Pope ที่ใช้]qและ[qสำหรับ:cnextและ:cprevตามลำดับ บางคนชอบ QuickFIX เพื่อเปิดหลังจากการค้นหาจะดำเนินการแล้วเพิ่มต่อไปนี้เพื่อคุณไฟล์:~/.vimrc นอกจากนี้คุณยังสามารถเปิดรายการด้วยตนเองผ่านทางautocmd QuickFixCmdPost *grep* cwindow QuickFix:copen

ต้องการ "การค้นหา" ที่เร็วยิ่งขึ้นหรือไม่

คุณจะต้องใช้เครื่องมือบางอย่างที่ใช้ดัชนีที่สร้างไว้ล่วงหน้าเช่นctags , cscopeหรือGNU ทั่วโลก

  • เป็นกลุ่มได้สร้างขึ้นในการสนับสนุน ctag ผ่าน:tag, <c-]>และอีกหลายคำสั่งอื่น ๆ และตัวเลือก :h tagsดู นอกจากนี้อาจต้องการอ่านCtags ที่พยายามอย่างง่ายดายด้วย 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 %

หากรายการคำแนะนำด่วนของคุณไม่ว่างเปล่าคุณอาจต้องการล้างมันก่อน (ดู/programming//q/27385970/1057593 ) ซึ่งสามารถทำได้ด้วย

:cexpr []

vim-unimpairedจัดเตรียมการแมป]qและ[qวนรอบการแข่งขัน

cmdline ประวัติศาสตร์

/patternมันเป็นสิ่งที่ดีที่จะเข้าสู่ขั้นตอนการทำงานรูปแบบการค้นหาแยกต่างหากกับ สิ่งนี้อนุญาตให้คุณใช้คำสั่งทั่วไปจากประวัติ commandline ของคุณโดยใช้รูปแบบการค้นหาปัจจุบัน มันจะดูเหมือน

/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

คุณสามารถเพิ่มคำสั่ง reusable :copenเพื่อดูรายการ quickfix ได้ทันทีด้วยวิธีต่อไปนี้:

:execute "bufdo vimgrepadd // %" | copen

ข้อเสนอจาก stackoverflow :bufdo vimgrepadd // % | copenเปิดหน้าต่างที่ไม่ได้ตั้งใจหลายบานในกรณีของฉัน

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