ฉันจะทำให้ 'n' ก้าวไปข้างหน้าได้อย่างไรแม้ว่าฉันจะเริ่มค้นหาด้วย '?' หรือ '#'?


19

กลุ่มมี (อย่างน้อย) ชุดคำสั่งสองชุดที่ค้นหาในทิศทางตรงกันข้าม การพิมพ์/จากนั้นรูปแบบจะค้นหาไปข้างหน้าผ่านเอกสารเพื่อหารูปแบบ พิมพ์?แล้วรูปแบบจะค้นหาย้อนหลัง มีความสัมพันธ์เดียวกันระหว่างคำสั่ง*และ#

สิ่งที่ฉันไม่ชอบคือคำสั่งเหล่านี้ยังกำหนดทิศทางการค้นหาสำหรับnและNคำสั่ง หลังจากใช้ไป/แล้วให้nเดินหน้าเอกสารและNย้อนกลับ หลังจากที่ใช้?, nไปข้างหลังและNไปข้างหน้า (ในคำอื่น ๆnไปในทิศทางเดียวกันเสมอกับการค้นหาเดิมและNไปในทิศทางอื่นเสมอ)

ฉันnจะก้าวไปข้างหน้าผ่านเอกสารและNถอยหลังได้อย่างไรโดยไม่คำนึงถึงทิศทางที่ฉันเริ่มค้นหา

คำตอบ:


29

คุณสามารถเปลี่ยนพฤติกรรมของnและNเพื่อค้นหาอย่างต่อเนื่องลง / ขึ้นไปโดยใช้สิ่งต่อไปนี้:

nnoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]

อัปเดต:มันทำงานอย่างไร

นี่ใช้ expression-maps ซึ่งแม็พ lhs ของแผนที่กับนิพจน์ที่จะถูกประเมินทุกครั้งที่พบ lhs ดู:h map-expressionในความช่วยเหลือ

สิ่งที่เกิดขึ้นคือตัวแปร v: searchforward (ซึ่งกำหนดสถานะภายในของทิศทางที่การค้นหาล่าสุดดู:h v:searchforward) ใช้เป็นดัชนีสำหรับสตริงที่อยู่ข้างหน้า ดังนั้นในกรณีของแผนที่แรกหากทิศทางการค้นหาสุดท้ายถูกส่งต่อไป n จะถูกแมปกับ 'n' (ดัชนี 1 หมายถึงคืนอักขระที่สอง) และถ้าย้อนหลังจะมีการแมป 'n' 'N' (เพราะตัวแปร v: searchforward เป็น 0 ดังนั้น 'N' จะถูกส่งกลับ

อีกทางเลือกหนึ่งในการเขียนแผนที่เหล่านั้นจะเป็น (ซึ่งอาจชัดเจนกว่า):

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

นอกจากนี้ยังมีปลั๊กอินบางตัวที่ทำเช่นนั้น (เช่นปลั๊กอิน SearchRepeatและอื่น ๆ ด้วย)


ขอบคุณที่พูดถึงปลั๊กอินของฉัน ฉันเพิ่งจะแนะนำว่าเป็นทางเลือก :-)
Ingo Karkat

2
ใช้การห้อยอย่างฉลาด!
wchargin

6
คุณช่วยเพิ่มคำอธิบายได้ไหม? ฉันไม่เคยเห็นรูปแบบนี้มาก่อนและฉันต้องการที่จะรู้ว่ามันทำงานอย่างไร
EvergreenTree

1
@EvergreenTree: เพิ่มคำอธิบายเพิ่มเติม
Christian Brabandt

2
@ChristianBrabandt นั่นฉลาดมาก ฉันไม่เคยคิดว่าคุณจะใช้v:searchforwardเป็นดัชนี
EvergreenTree

1

ตามวิธีการแก้ปัญหาของ Christian Brabandt

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

การแมปเหล่านี้ยังเชื่อฟังการfoldopenตั้งค่า


0

ฉันใช้ปลั๊กอินSearchIndex หากต้องการใช้คำตอบของ Christian Brabandt แต่ให้ฟังก์ชั่นการทำงานของปลั๊กอินในการแสดงหมายเลขที่ตรงกันทุกครั้งที่พิมพ์nหรือNฉันใส่สิ่งนี้ลงใน vimrc ของฉัน:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.