ฉันได้เริ่มเรียนรู้การใช้คำค้นหาเป็นกลุ่ม*
และ#
ในขณะที่เคอร์เซอร์อยู่เหนือคำศัพท์ปัจจุบัน แต่การค้นหานี้ถูก จำกัด ไว้ที่บัฟเฟอร์ไฟล์ปัจจุบัน
มีคำสั่งหรือทางลัดเพื่อขยายการค้นหานี้:
- แท็บที่เปิดอยู่ทั้งหมดหรือไม่
- บัฟเฟอร์ที่เปิดทั้งหมดหรือไม่
ฉันได้เริ่มเรียนรู้การใช้คำค้นหาเป็นกลุ่ม*
และ#
ในขณะที่เคอร์เซอร์อยู่เหนือคำศัพท์ปัจจุบัน แต่การค้นหานี้ถูก จำกัด ไว้ที่บัฟเฟอร์ไฟล์ปัจจุบัน
มีคำสั่งหรือทางลัดเพื่อขยายการค้นหานี้:
คำตอบ:
ฉันไม่มีทางออกที่แน่นอนสำหรับปัญหาของคุณหวังว่าจะได้คำตอบที่ดีกว่าของฉัน แต่นี่คือวิธีที่ฉันจัดการกับปัญหาการหาคำในบัฟเฟอร์ทั้งหมด
" 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>
…
:cn
หรือ:cp
สลับไปยังเอกสารถัดไป
เป็นจริงการทำงานเริ่มต้นถึงแม้ว่ามันอาจจะยากที่จะแจ้งให้ทราบล่วงหน้า: ลอง*
แล้วเปลี่ยนไปยังแท็บและการใช้งานอื่นn
ans N
ในโหมดคำสั่งที่จะกระโดดไปข้างหน้าและข้างหลังระหว่างการค้นหาเพลงฮิต
วิธีนี้อาจเหมาะสมกว่าหากคุณเปิดการเน้นเป็นครั้งแรกสำหรับรายการยอดนิยมทั้งหมด
:set hlsearch
hlsearch
ฉันไม่รู้และสิ่งใดที่ฉันจะต้องค้นหาสักวันหนึ่ง :-) อย่างไรก็ตามโดยค่าเริ่มต้นฉันได้ลอง * #, n และ N และมันไม่ข้ามไปยังบัฟเฟอร์ไฟล์อื่น ...
n
และN
อย่ากระโดดบัฟเฟอร์ (ล้อมรอบ) แต่คำที่เป้าหมายกำหนดไว้จะถูกค้นหาในแท็บทั้งหมด กด*
ด้วยการเน้นสีแล้ววนผ่านแท็บของคุณ - พวกเขาทั้งหมดจะถูกเน้นด้วยคำเดียวกันเพื่อให้คุณสามารถใช้n
และN
ในพื้นที่นั้นโดยไม่ต้องค้นหาใหม่
hlsearch
ตั้งค่า
:bufdo vimgrepadd yoursearchterm % | copen
ในขณะที่ฉันพบว่าตัวเองทำสิ่งนี้บ่อยครั้งฉันก็ทำสคริปต์ (ที่แก้ไขไม่ได้)
คุณหรือคนอื่นอาจเห็นว่ามีประโยชน์
โดยทั่วไปจะค้นหารายการบัฟเฟอร์และแสดงผลลัพธ์ในหน้าต่างโปรแกรมแก้ไขด่วน
มีการเพิ่มคำสั่งพื้นฐานสองคำ
Search <pattern>
: <pattern>
ค้นหาบัฟเฟอร์ทั้งหมดSearch1 <pattern>
: ค้นหาบัฟเฟอร์ทั้งหมด<pattern>
แต่จะแสดงเฉพาะผลลัพธ์แรกสำหรับแต่ละบัฟเฟอร์ โดยทั่วไปมีประโยชน์สำหรับการแสดงรายการบัฟเฟอร์ทั้งหมดที่ใช้ฟังก์ชันตัวแปรfoo
(หรืออะไรก็ตาม)ใช้ bang ( :Search! foo
) เพื่อต่อท้ายผลลัพธ์
นอกจากนี้GSearch
และGSearch1
ถูกเพิ่มโดยที่ความแตกต่างคือกับSearch
สคริปต์เพิ่มตัวคั่น regex เช่น:
foo -> /foo/
ที่ซึ่งGSearch
คาดว่ามันจะถูกปิดล้อม
j
มีการเพิ่มการตั้งค่าสถานะเพื่อป้องกันการข้าม
มีแฮ็กบางอย่างเพื่อป้องกันการแสดงรายการข้อผิดพลาดในขณะเดียวกันก็ทำให้รหัสสั้น เป็นบิตยุ่งยากในtry / catch
bufdo
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)