ฉันจะป้องกันไม่ให้กลุ่มที่เน้นการแข่งขันหลังจากที่แทนที่ได้อย่างไร


13

ฉันมีset hlsearchใน~/.vimrcตัว ปกติแล้วมันจะมีประโยชน์มาก แต่ก็น่ารำคาญที่ต้องทำ:nohหลังจากที่ฉันแทนที่สิ่งที่ชอบ'<,'>s/$/',/(ซึ่งเน้นจุดสิ้นสุดของทุกบรรทัดหลังจากที่ฉันเรียกใช้) ฉันvimจะไม่ไฮไลต์หลังจากเปลี่ยนเช่นนี้ได้อย่างไร

ฉันใช้ Ubuntu 9.04 กับvim7.2 ฉันมีปัญหาเดียวกันกับ OS X 10.6 (เช่นvim7.2) สิ่งที่จะทำงานทั้งสองจะเป็นที่ต้องการ

อัปเดต:คำตอบทั้งหมดที่ฉันได้รับเป็นเพียงการเพิ่มการจับคู่คีย์เพื่อทำ:noh(หรือเทียบเท่า) ฉันพยายามหลีกเลี่ยงพฤติกรรมของคีย์ที่กำหนดเองที่ฉันจะคุ้นเคย แต่แล้วทำให้ฉันล้มเหลวอย่างน่าสังเวชหากไม่มีพวกเขา (เช่นที่คอมพิวเตอร์ของเพื่อน ฯลฯ ) ฉันต้องการที่vimจะทำโดยอัตโนมัติ:nohหลังจากทำการเปลี่ยน นั่นคือฉันต้องการเฉพาะhlsearchเมื่อใช้/หรือ*(อาจเป็นกรณีอื่น ๆ ไม่กี่) แต่ไม่ใช่เวลาอื่น

คำตอบ:


7

หากคุณไม่ต้องการปิดการใช้งานอย่างถาวรคุณสามารถผูกคีย์เพื่อสลับไฮไลต์ตามที่แนะนำในคำตอบนี้สำหรับคำถามที่คล้ายกันในสแต็คโอเวอร์โฟลว์

map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

หากคุณต้องการปิดการใช้งานไฮไลต์อย่างถาวร:

11.1. After I searched for a text with a pattern, all the matched text
      stays highlighted. How do I turn off the highlighting
      temporarily/permanently?

The 'hlsearch' option controls whether all the matches for the last
searched pattern are highlighted or not. By default, this option is not
enabled. If this option is set in a system-wide vimrc file, then you can
turn off the search highlighting by using the following command:

    :set nohlsearch

(จากคำถามที่พบบ่อย VIM )


2
ฉันตระหนักถึงตัวเลือกนี้ ปัญหาคือฉันมักจะไม่ค้นหาสิ่งที่ฉันต้องการแทนที่ดังนั้นจึงไม่มีประโยชน์ที่จะเน้นในกรณีส่วนใหญ่ที่ฉันแทนที่ แต่ก็มีประโยชน์มากสำหรับเมื่อฉันกำลังมองหาบางสิ่งบางอย่างดังนั้นผมจึงไม่อยากให้มันเป็นไปอย่างสมบูรณ์ออกไป
เบนจามินเคส

@Benjamin: คุณค้นหาโดยปริยาย นั่นคือสิ่งที่: ค้นหารูปแบบแล้วทำการแปลงในการจับคู่ (es) การใช้: nohl เป็นคำตอบที่ถูกต้องเนื่องจากจะปิดการไฮไลต์ของรูปแบบการค้นหาปัจจุบันจนกว่าจะทำการค้นหาถัดไป มันทำได้โดยไม่เปลี่ยนสถานะของตัวเลือก 'hlsearch' หรือส่งผลต่อค่าที่เก็บไว้ของคำค้นหาก่อนหน้า
27499 jamessan

2
@jamessan: ฉันเข้าใจว่ามันเป็นการค้นหาและแทนที่ เป็นเพียงว่าฉันไม่ต้องการให้มีการเน้นในตอนนั้น ส่วนใหญ่เป็นเรื่องน่ารำคาญมากกว่าอะไร
4324 Benjamin Oakes

เมื่อไม่นานมานี้ฉันเริ่มปิดการไฮไลต์ตามค่าเริ่มต้นและเปิดใช้เมื่อต้องการตามที่คุณแนะนำ ยังไม่สมบูรณ์ แต่ก็ดีกว่า
Benjamin Oakes

9

ฉันมีวิธีแก้ปัญหาที่แตกต่างกันสองแบบซึ่งก็ค่อนข้างดีแต่ละอันมีพฤติกรรมที่แตกต่างกัน สิ่งที่ฉันชอบคือตัวเลือก 2:

  1. ฉันมี 2 บรรทัดต่อไปนี้ใน. vimrc ของฉัน:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    อันแรกรอการหมดเวลา (ไม่สามารถกำหนดค่าได้) หากเคอร์เซอร์ไม่เคลื่อนที่และปิด hlsearch ส่วนที่สองจะเปิดขึ้นมาอีกครั้งหากเคอร์เซอร์เคลื่อนที่อีกครั้ง

    มันไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่ใช้งานได้สำหรับฉัน (และจะใกล้เคียงกับความสมบูรณ์แบบเมื่อการหมดเวลาสามารถกำหนดได้ - สำหรับตอนนี้การหมดเวลาจะเชื่อมโยงกับตัวจับเวลาในตัวสำหรับ vim)

  2. หรือคุณสามารถลองบรรทัดเหล่านี้:

    autocmd cursorhold * set nohlsearch
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    

สิ่งนี้จะปิด hlsearch หลังจากหมดเวลาสั้น ๆ โดยไม่มีการเคลื่อนไหวของเคอร์เซอร์และเปิดใหม่สำหรับคำสั่งการค้นหามาตรฐาน มันไม่ครอบคลุมความเป็นไปได้ทั้งหมดของการเปิด hlsearch อีกครั้ง แต่ก็เพียงพอสำหรับผู้เริ่มต้นเพื่อพิสูจน์แนวคิด


ขอบคุณสำหรับการอัปเดต - ไม่เห็นจนกว่าจะถึงตอนนี้ (ดูเหมือนว่าคุณเพิ่งเพิ่มเข้าไปด้วยหรือไม่ตลกนั่น) นี่เป็นแนวคิดที่ยอดเยี่ยม ฉันจะต้องเล่นกับมัน
4324 Benjamin Oakes

ข้อแม้ของ 2 คือมันทำให้การค้นหาด้วยโหมดภาพVไม่ทำงาน
Bryce Guinta

ฉันได้แก้ไขบรรทัดแรกในตัวเลือก 1 ด้วยต่อไป autocmd cursorhold * set nohlsearch | let @/ = "" นี้ซึ่งจะล้างการลงทะเบียนการค้นหารวมถึงลบไฮไลต์ ยังไม่ได้ใช้เวลามากกับการตั้งค่านี้ แต่ฉันต้องการที่จะนำมันออกมาสำหรับผู้ที่จบลงที่นี่
Berkeley Martinez

2

ฉันพิมพ์ "/ asdf" (สมมติว่า "asdf" ไม่ได้อยู่ในไฟล์) เพื่อกำจัดไฮไลต์ ฉันรู้ว่ามันค่อนข้างเรียบง่าย แต่ใช้งานได้สำหรับฉัน


2
นั่นเป็นแนวคิดเดียวกัน:nohแต่ไม่ได้ผลเสมอไป :) ตลกที่คุณพูดถึงว่า: ฉันเคยมีเพื่อนที่มักจะพิมพ์ชื่อของเขาเพราะมันจะเกิดขึ้นน้อยกว่าสิ่งที่เหมือน "asdf" ในสิ่งที่เขาเขียน (Kinda ตลกผมคิดว่า.)
เบนจามินเคส

จริง บางทีฉันอาจจะจำได้ว่า: ไม่มีในครั้งต่อไป
เกร็กเกรแฮม

1

วางสิ่งต่อไปนี้ในไฟล์. vimrc ของคุณ:

nnoremap <silent> <F11> :exe ":silent! normal /$^\r"<CR>

การทำเช่นนี้จะซ่อนคำค้นหาที่ไฮไลต์ไว้อย่างเงียบ ๆ แต่ไม่ได้ปิดใช้งาน:set hlsearchคุณลักษณะนี้ มันเปิดใช้งานอีกครั้งในการค้นหาถัดไป


เป็นการดีกว่าที่จะใช้คำสั่ง builtin ที่ออกแบบมาเพื่อจุดประสงค์นี้ -: nohl จากนั้นคุณจะไม่ละทิ้งเนื้อหาของการลงทะเบียนการค้นหาของคุณซึ่งใช้สำหรับสิ่งต่าง ๆ เช่นการข้ามไปยังการแข่งขันครั้งถัดไปค่าเริ่มต้นของรูปแบบเมื่อไม่มีการระบุ ฯลฯ
jamessan

ใช่ แต่มันทำให้ฉันรำคาญว่าการค้นหาครั้งต่อไปของฉันไม่ได้เน้นอย่างที่คิด ดังนั้นฉันจึงคิดวิธีแก้ปัญหาอย่างรวดเร็ว มันอาจจะสกปรก แต่ก็ใช้งานได้ ฉันคิดว่านี่เป็นสิ่งที่ยอมรับได้สำหรับกลุ่ม - แม้ว่าฉันจะไม่ใช้สิ่ง "สกปรก" ในซอร์สโค้ดของโครงการขนาดใหญ่ที่แท้จริง
Gregor Müllegger

1

ความเป็นไปได้อีกอย่างหนึ่งคือการรีเซ็ต@/รีจิสเตอร์ (ซึ่งจริง ๆ แล้วเป็นเรจิสเตอร์แบบอ่าน - เขียน) หลังจากทำการทดแทน สิ่งนี้จะเรียกคืนไฮไลต์ก่อนหน้า:

command! -nargs=* -range S
\ let atslash=@/|exe ':'.<line1>.','.<line2>.'s'.<q-args>|let @/=atslash

อย่างไรก็ตามสิ่งนี้ยังคงมีปัญหาอยู่สองสามข้อ:
- แทนการแก้ไข:sมันกำหนดคำสั่งใหม่ ขณะที่มันเป็นไปได้ที่จะใช้cabbrevในการแมป:sไปฉันรู้วิธีที่จะจับการก่อสร้างทั้งหมดเช่นไม่มี:S - หากคุณเคยซ่อนการค้นหาเพียงครั้งเดียวการดำเนินการนี้จะเน้นการค้นหาก่อนหน้าอีกครั้ง ฉันไม่รู้วิธีที่จะค้นหาว่าถูกโทรมาก่อน (อาจเป็นไปได้ที่จะทำสิ่งนี้และแทนที่คำสั่งด้วย แต่สิ่งนี้จะต้องมีการแทนที่คำสั่งการค้นหาทั้งหมดซึ่งอาจมากเกินไป ... ):<range>s
:nohl:nohl:nohl

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