วิธีค้นหาคำปัจจุบันในแท็บที่เปิดทั้งหมดใน Vim


16

ฉันได้เริ่มเรียนรู้การใช้คำค้นหาเป็นกลุ่ม*และ#ในขณะที่เคอร์เซอร์อยู่เหนือคำศัพท์ปัจจุบัน แต่การค้นหานี้ถูก จำกัด ไว้ที่บัฟเฟอร์ไฟล์ปัจจุบัน

มีคำสั่งหรือทางลัดเพื่อขยายการค้นหานี้:

  1. แท็บที่เปิดอยู่ทั้งหมดหรือไม่
  2. บัฟเฟอร์ที่เปิดทั้งหมดหรือไม่

1
คุณอาจพบว่าคำอธิบายของแท็บกับบัฟเฟอร์น่าสนใจและเป็นประโยชน์
สัญลักษณ์แทน

คำตอบ:


4

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

" enables to search in all open buffers with :Search <pattern>
command! -nargs=1 Search call setqflist([]) | silent bufdo grepadd! <args> %

nnoremap <left>  :cprev<cr>zvzz
nnoremap <right> :cnext<cr>zvzz

บรรทัดแรกสร้างคำสั่งที่Searchมีรูปแบบการค้นหาเป็นอาร์กิวเมนต์ซึ่งจะเขียนผลลัพธ์ในรายการ quickfix อีกสองบรรทัดทำแผนที่ปุ่มลูกศรไร้ประโยชน์ (อย่างน้อยสำหรับฉัน) กับสิ่งที่มีประโยชน์ พวกเขาจะถูกแมปเพื่อข้ามไปยังการค้นหาถัดไป / ก่อนหน้าหรือไปที่ข้อผิดพลาดการคอมไพล์ครั้งต่อไป / ก่อนหน้า ฯลฯ พวกเขาเพียงแค่ก้าวผ่านรายการ Quickfix คุณสามารถใช้สิ่งต่อไปนี้:

:Search foobar
<right>
<right>
…

ฉันรักคำสั่งนี้ แต่เพิ่มบางสิ่งดังนั้นมันจะหนีคำค้นหาได้ดีขึ้นและบังคับให้วาดใหม่ (การใช้เสียงเงียบด้วยการแยกอาจทำให้ vim ui เกิดข้อผิดพลาด) คำสั่ง! -nargs = 1 ค้นหาการโทร setqflist ([]) | ดำเนินการแบบเงียบ "bufdo grepadd! '<args>'%" | วาด!
Igorio

คุณยังสามารถพิมพ์:cnหรือ:cpสลับไปยังเอกสารถัดไป
phyatt

7

เป็นจริงการทำงานเริ่มต้นถึงแม้ว่ามันอาจจะยากที่จะแจ้งให้ทราบล่วงหน้า: ลอง*แล้วเปลี่ยนไปยังแท็บและการใช้งานอื่นnans Nในโหมดคำสั่งที่จะกระโดดไปข้างหน้าและข้างหลังระหว่างการค้นหาเพลงฮิต

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

:set hlsearch

1
+1 เพียงเพราะhlsearchฉันไม่รู้และสิ่งใดที่ฉันจะต้องค้นหาสักวันหนึ่ง :-) อย่างไรก็ตามโดยค่าเริ่มต้นฉันได้ลอง * #, n และ N และมันไม่ข้ามไปยังบัฟเฟอร์ไฟล์อื่น ...
Stephane Rolland

ไม่nและNอย่ากระโดดบัฟเฟอร์ (ล้อมรอบ) แต่คำที่เป้าหมายกำหนดไว้จะถูกค้นหาในแท็บทั้งหมด กด*ด้วยการเน้นสีแล้ววนผ่านแท็บของคุณ - พวกเขาทั้งหมดจะถูกเน้นด้วยคำเดียวกันเพื่อให้คุณสามารถใช้nและNในพื้นที่นั้นโดยไม่ต้องค้นหาใหม่
goldilocks

2
จุดทั้งหมดไม่จำเป็นต้องวนรอบแท็บของคุณเพื่อค้นหารายการที่ตรงกันทั้งหมด
แมกนัส

1
@ Magnus แม้ว่ามันอาจจะดีกว่า แต่จริงๆแล้วมันไม่ได้ระบุไว้อย่างชัดเจนในคำถามซึ่งถามถึงวิธี"ขยายการค้นหานี้ไปยัง ... บัฟเฟอร์ทั้งหมด" -> มันขยายไปทั่วบัฟเฟอร์ทั้งหมด ประเด็นของคำตอบของฉันคือทำให้ชัดเจนเนื่องจากอาจไม่เป็นเช่นนั้นโดยเฉพาะถ้าคุณยังไม่ได้hlsearchตั้งค่า
goldilocks


1

ในขณะที่ฉันพบว่าตัวเองทำสิ่งนี้บ่อยครั้งฉันก็ทำสคริปต์ (ที่แก้ไขไม่ได้)

คุณหรือคนอื่นอาจเห็นว่ามีประโยชน์


คำอธิบายสั้น ๆ :

โดยทั่วไปจะค้นหารายการบัฟเฟอร์และแสดงผลลัพธ์ในหน้าต่างโปรแกรมแก้ไขด่วน

มีการเพิ่มคำสั่งพื้นฐานสองคำ

  1. Search <pattern> : <pattern>ค้นหาบัฟเฟอร์ทั้งหมด
  2. Search1 <pattern>: ค้นหาบัฟเฟอร์ทั้งหมด<pattern>แต่จะแสดงเฉพาะผลลัพธ์แรกสำหรับแต่ละบัฟเฟอร์ โดยทั่วไปมีประโยชน์สำหรับการแสดงรายการบัฟเฟอร์ทั้งหมดที่ใช้ฟังก์ชันตัวแปรfoo(หรืออะไรก็ตาม)

ใช้ bang ( :Search! foo) เพื่อต่อท้ายผลลัพธ์

นอกจากนี้GSearchและGSearch1ถูกเพิ่มโดยที่ความแตกต่างคือกับSearchสคริปต์เพิ่มตัวคั่น regex เช่น:

foo -> /foo/

ที่ซึ่งGSearchคาดว่ามันจะถูกปิดล้อม

jมีการเพิ่มการตั้งค่าสถานะเพื่อป้องกันการข้าม


รหัส:

มีแฮ็กบางอย่างเพื่อป้องกันการแสดงรายการข้อผิดพลาดในขณะเดียวกันก็ทำให้รหัสสั้น เป็นบิตยุ่งยากในtry / catchbufdo

let s:not_idents = split("/!#$%&\"`´¨'¯()*+,-.:;<=>?¿@[\]^{|}µ¶·¸~±×÷®©«»¬­ª°º¹²³¼½¾", '\zs')
" Create a delimited pattern. "
fun! s:Parse_pat(pat)
    for c in s:not_idents
        if stridx(a:pat, c) == -1
            return c . a:pat . c
        endif
    endfor
    echohl Error
    echom "Could not delimit pattern '". a:pat ."'"
    echohl None
    return ''
endfun

fun! s:AllBufSearch(pat, bang, uno, isg)
    if a:isg
        let pat = a:pat
    else
        let pat = s:Parse_pat(a:pat)
    endif
    if pat == ''
        return
    endif
    cclose
    let [_buf, _view] = [bufnr("%"), winsaveview()]
    let _foldenable = &foldenable
    set nofoldenable

    " Copy of current qflist. "
    let qfc = getqflist()
    " Hack to prevent error if no matches. "
    call setqflist([{}])
    silent execute "bufdo vimgrepadd! " . pat . "j %"
    " Restore "
    exec "buffer " . _buf
    let &foldenable = _foldenable
    call winrestview(_view)
    " Fix "
    let qf = getqflist()
    call remove(qf, 0)
    " Only one listing per buffer. "
    if a:uno
        let bn = {}
        let i  = 0
        for m in qf
            if has_key(bn, m["bufnr"])
                call remove(qf, i)
            else
                let bn[m["bufnr"]] = 1
                call remove(qf[i], "valid")
                let i += 1
            endif
        endfor
    endif
    if a:bang == "!"
        let qf = qfc + qf
    endif
    " If any matches, copen. "
    if len(qf)
        call setqflist(qf)
        copen
    endif
endfun

command! -nargs=1 -bang Search   call s:AllBufSearch(<q-args>, "<bang>", 0, 0)
command! -nargs=1 -bang Search1  call s:AllBufSearch(<q-args>, "<bang>", 1, 0)
command! -nargs=1 -bang GSearch  call s:AllBufSearch(<q-args>, "<bang>", 0, 1)
command! -nargs=1 -bang GSearch1 call s:AllBufSearch(<q-args>, "<bang>", 1, 1)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.