วิธีค้นหาบรรทัดที่ตรงกับบรรทัดปัจจุบันเป็นกลุ่ม


11

ฉันมักจะค้นหาคำด้วย:/stringแต่ถ้าฉันต้องค้นหาทั้งบรรทัดปัจจุบันวิธีการทำ

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

ตัวอย่างเช่นหากcursorปัจจุบันอยู่ที่line 1วิธีการค้นหาในทำนองเดียวกันกับ:/ข้อความที่มีทั้งบรรทัดปัจจุบัน เคอร์เซอร์ควรข้ามจากนั้นไปที่การจับคู่line 4และอีกครั้งเพื่อline 7

คำตอบ:


7

นี่คือวิธีที่ฉันจะทำ:

  1. ดึงบรรทัด (ลงในการลงทะเบียนที่ไม่มีชื่อ) โดยไม่รวมบรรทัดใหม่ท้าย: 0y$
  2. เริ่มการค้นหาที่น่าสนใจมาก :/\V
  3. เพิ่มบรรทัด yanked: <c-r>"
  4. ดับการค้นหา: <cr>

ในฐานะที่เป็นจุด @EvergreenTree ออกในความคิดเห็นคุณแน่นอนสามารถสร้างแผนที่เพื่อดำเนินการตามขั้นตอนทั้งหมดในหนึ่งไป:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

หัวข้อความช่วยเหลือที่เกี่ยวข้อง:

:help registers
:help /magic
:help c_CTRL-R

NB ถ้าบรรทัดที่คุณค้นหากำลังมีเครื่องหมายสำหรับคุณยังจะต้องไปผ่านและหลบหนีพวกเขา (โดยการเพิ่มเครื่องหมายทับขวาอื่น) แม้จะมีnomagic มากค้นหา


4
แน่นอนคุณสามารถสร้างการแมปสำหรับสิ่งนี้: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree

9

โดยเฉพาะอย่างยิ่งเพื่อจุดประสงค์ในการทำแผนที่ฉันพบว่าการใช้getline()ความสง่างามยิ่งกว่าการดึงตัวคุณออก การโทรgetline()ด้วยสายอักขระ'.'จะส่งคืนบรรทัดใต้เคอร์เซอร์ มีสองตัวเลือกที่ดีสำหรับการใช้สิ่งนี้:

:exec '/' . getline('.')

ซึ่งแยกวิเคราะห์สตริง'/'และสิ่งที่ส่งคืนจากgetline()กันและเรียกใช้งานเป็นคำสั่ง vim

หรือ

/<C-r>=getline('.')<CR>

@=ซึ่งใช้การลงทะเบียนการแสดงออก การแสดงออกต่อไปนี้=มีการประเมินหลังจากแรก<CR>และวางไว้ในบรรทัดคำสั่ง


ดี! เมื่อสายมีตัวละครที่ชอบ/หรือ'ไม่ทำงานดีมาก อย่างไรก็ตามฉันเรียนรู้บางสิ่งบางอย่างในวันนี้! ขอบคุณ
Luc M

4

โดยส่วนตัวฉันจะได้รับปลั๊กอินภาพ ( มีอยู่ไม่มาก) : มีความสุข Vimcast เกี่ยวกับเรื่องนี้คือการค้นหาข้อความที่เลือก *ซึ่งหมายความว่าคุณสามารถเลือกเส้นสายตาและกด

หากปลั๊กอินไม่ใช่สิ่งที่คุณสามารถเพิ่มการแมปต่อไปนี้ในvimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

หมายเหตุ: Visual-block ( <c-v>) ไม่รองรับการทำแผนที่นี้


ฉันเพิ่มการแมป แต่จริงๆแล้วมันกระโดดไปที่คำแรกที่ตรงกันและไม่เลือกทั้งบรรทัด
manav mn

ถ้ามันตรงกับคำฉันคิดว่าคุณกำลังใช้งาน*จากโหมดปกติหรือไม่ได้ติดตั้งการแมปอย่างถูกต้อง
Peter Rincker

4

คำตอบที่มีอยู่ทั้งหมดล้มเหลวหากรายการของคุณมีบางรายการที่ถูกตีความว่าเป็นส่วนหนึ่งของรูปแบบ \Vจุดที่ได้รับส่วนใหญ่ของทางมี แต่ยังคงยุ่งขึ้นมาพร้อมกับเครื่องหมาย

ลองใช้วิธีนี้เพื่อหลีกเลี่ยงแบ็กสแลช ...

/\V<C-R>=escape(getline('.'), '\')

และถ้าคุณใช้มันในการทำแผนที่คุณจะต้องใช้หนึ่งหรือสอง<Enter>ตัวในตอนท้ายขึ้นอยู่กับว่าคุณต้องการให้มันทำงานอย่างไร


คำตอบที่ยอดเยี่ยม! เส้นมักจะมีเครื่องหมายทับทั้งสองซึ่งทำให้คำตอบอื่นสับสน อาร์กิวเมนต์สุดท้ายของการหลบหนีควรรวมเครื่องหมายทับไว้ด้วยแม้ว่า:escape(…, '/\')
bobbogo

2

เมื่อติดตั้งvim-asterisk ให้ใช้V$*(หรือ0v$*) เพื่อเลือกบรรทัดปัจจุบันและค้นหา

ในคำสั่งที่สอง0ไม่จำเป็นถ้าเคอร์เซอร์อยู่ที่จุดเริ่มต้นของบรรทัดอยู่แล้ว


1
ไม่*เพียงค้นหาคำที่อยู่ใต้เคอร์เซอร์และไม่ใช่การเลือกภาพปัจจุบัน
EvergreenTree

1
@EvergreenTree ฉันลืมพูดถึงปลั๊กอิน ขอบคุณสำหรับการแจ้งให้ทราบ
adelarsq

2

อีกวิธีหนึ่งในการทำเช่นนี้คือการใช้หน้าต่างบรรทัดคำสั่ง: yy/<Ctrl-F>p<Enter>

  • งัดสายทั้งหมดที่คุณต้องการด้วย yy
  • กด/จากนั้นกด Ctrl-F เพื่อเปิดหน้าต่างบรรทัดคำสั่ง
  • กดpเพื่อวางสาย
  • กด Enter เพื่อเริ่มการค้นหา

5
คุณสามารถใช้q/เพื่อให้ได้ผลเช่นเดียวกับ/<c-f>
evilsoup

2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashesชี้ให้เห็นว่าการตั้งค่าการค้นหาสามารถตั้งค่าได้โดยตรงเช่นนี้

:let @/='/abc/def/ghi/'

สิ่งนี้ช่วยให้ค้นหาในบรรทัดและทำงานได้แม้ในขณะที่มีการทับ

ดังนั้นในการทำ\*แผนที่การค้นหาบรรทัด:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.