วิธีการปิด "hlsearch" โดยอัตโนมัติหลังจากฉันค้นหาเสร็จแล้วจะทำอย่างไร


19

ฉันชอบการตั้งค่า "hlsearch" แต่หลังจากฉันค้นหาเสร็จฉันก็พบว่ามันน่ารังเกียจ โดยเฉพาะอย่างยิ่งถ้าฉันค้นหาบางอย่างที่มีการแข่งขันมาก ฉันรู้ว่าฉันสามารถปิดสิ่งนี้ด้วย

:set nohlsearch

แต่มันใช้การกดแป้นทั้ง 16 ครั้งและน่ารำคาญยิ่งกว่านั้นฉันต้องกลับไปค้นหาต่อไปด้วย

:set hlsearch    

มีวิธีที่ฉันสามารถสลับ hlsearch โดยอัตโนมัติเมื่อฉันเริ่มค้นหาและปิดเมื่อฉันค้นหาเสร็จหรือไม่ ตัวอย่างเช่นหากฉันเข้าสู่โหมดแทรกหรือแก้ไขข้อความให้ปิด hlsearch โดยไม่ต้องกดแป้นเพิ่มเติมใด ๆ


3
กำหนดอัตโนมัติ
Antony

@Antony ในถ้าฉันทำการแก้ไขหรือในโหมดแทรกมันจะปิดโดยไม่ต้องกดปุ่มใด ๆ ถ้าฉันเริ่มค้นหาด้วย/หรือ?หรือถ้าฉันกดnหรือNมันจะเปิดโดยไม่ต้องกดปุ่มอีกต่อไป
DJMcMayhem

1
โอ้แล้วค้นหาคำว่า "เสร็จสิ้น"
Christian Brabandt

1
:nno <BS> :set hls!\|set hls?<CR>- หนึ่งบรรทัด, หนึ่งปุ่มกด, ข้อเสนอแนะสถานะและไม่พยายามเดาครั้งที่สองเมื่อคุณอาจต้องการหรือไม่เน้น บางครั้งฉันต้องการไฮไลต์ทิ้งไว้บนหน้าจอเมื่อทำการแก้ไข บางครั้งฉันทำไม่ได้เช่นใช้/เป็นภาพเคลื่อนไหวกับโอเปอเรเตอร์
Antony

nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Sato Katsura

คำตอบ:


26

มีวิธีที่สะดวกกว่ามาก แทนที่จะใช้

:set nohlsearch

ซึ่งจริง ๆ แล้วปิดการตั้งค่า hlsearch ใช้

:nohls

สิ่งนี้จะปิด hlsearch จนกว่าคุณจะค้นหาอีกครั้ง จาก:help nohls

                 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'    boolean (default off)
            global
            {not in Vi}
            {not available when compiled without the
            |+extra_search| feature}

    ...

    When you get bored looking at the highlighted matches, you can turn it
    off with |:nohlsearch|.  This does **not change the option value**, as
    soon as you use a search command, the highlighting comes back.

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

nnoremap <esc><esc> :silent! nohls<cr>

แต่มีทางออกที่ดีกว่า ! haya14busa / incsearch.vim อย่างน้อยก็ในความคิดของฉันปลั๊กอินเสียงเรียกเข้าที่จำเป็น คุณสมบัติหลักคือการจับคู่การค้นหาทั้งหมดจะถูกเน้นในเวลาจริงในขณะที่คุณพิมพ์ regex ของคุณ ตัวอย่างเช่น:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามคุณสมบัติรองที่มีให้ยังเป็นตัวเลือกในการสลับเปิดและปิด hlsearch ทันทีเมื่อคุณเริ่ม / หยุดการค้นหา หากต้องการเปิดใช้งานคุณลักษณะนี้คุณจะต้องเพิ่ม

set hlsearch
let g:incsearch#auto_nohlsearch = 1
map n  <Plug>(incsearch-nohl-n)
map N  <Plug>(incsearch-nohl-N)
map *  <Plug>(incsearch-nohl-*)
map #  <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

.vimrcที่คุณ

หากคุณมีnการแมปอื่น ๆคุณจะต้องปิดสิ่งเหล่านี้ ตัวอย่างเช่นฉันเคยมี

nnoremap n nzz
nnoremap N Nzz

การแมปสองรายการนี้ไม่สามารถใช้งานร่วมกันได้!


set hlsearchเนื่องจากคุณกำลังทำคำตอบที่ตัวเองผมอยากจะชี้ให้เห็นว่าคุณยังเพิ่มปัญหาอื่นด้วย ถ้าคุณมีมันกำหนดไว้ในvimrcมันจะเขียนทับทุกครั้งที่คุณแหล่ง:noh vimrcเพื่อจัดเรียงออกมานี้ผมมีในของฉันif !&hlsearch | set hlsearch | endif vimrc(และนี่เป็นอีกปัญหาที่ปลั๊กอินแก้ไข)
grochmal

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

+1 สำหรับคำถามการตอบปลั๊กอินที่ยอดเยี่ยมและทำสิ่งต่างๆได้มากขึ้น!
RichVel

7

เป็นกลุ่มเย็นเป็นปลั๊กอินที่เรียบง่ายที่ไม่เพียงแค่นี้

Vim-cool ปิดใช้งานการไฮไลต์การค้นหาเมื่อคุณค้นหาเสร็จแล้วและเปิดใช้งานอีกครั้งเมื่อคุณค้นหาอีกครั้ง

มันทำงานได้โดยไม่ต้องแมปโดยใช้CursorMovedและInsertEnterautocommands


เทคนิคนี้ (ใช้การเติมข้อความอัตโนมัติ) นั้นดีกว่าคำตอบของฉันและฉันไม่อยากจะเชื่อเลยว่าฉันไม่ได้คิดถึงมันเมื่อฉันเขียนฉัน upvote
รวย

5

ฉันจะใช้เป็นทางลัดไปยัง<Leader><Enter> :noh(หัวหน้าของฉันคือ,มันจึงค่อนข้างใกล้)

วิธีนี้จะปิดไฮไลต์จนกว่าการค้นหาครั้งต่อไปของคุณ


3

ดังที่คุณได้จดบันทึกไว้ในคำตอบของคุณเองแล้วการปิดใช้งานการไฮไลต์ด้วย:nohlsearchคำสั่งนั้นมีประสิทธิภาพ:nohมากกว่าการปิดคุณลักษณะทั้งหมดแล้วเปิดในครั้งต่อไปที่คุณค้นหา

หากคุณต้องการปิดการไฮไลต์ทุกครั้งที่คุณใช้iเพื่อเข้าสู่โหมดแทรกคุณสามารถสร้างการแมปง่าย ๆ ได้:

:nnoremap i :noh<cr>i

มันเหลือเป็นแบบฝึกหัดสำหรับผู้อ่านเพื่อสร้างการแมปที่คล้ายกันสำหรับคำสั่งอื่น ๆ ที่พวกเขาต้องการปิดไฮไลต์


2

มันอาจฟังดูไร้สาระหรือไร้เดียงสา แต่สิ่งที่ฉันทำเมื่อฉันต้องการหยุดการไฮไลต์คือฉันค้นหาสตริงแบบสุ่มที่ไม่ได้ปรากฏอยู่ในเอกสาร บางสิ่งเช่นนี้

/skljdfhadhfs

จริงอยู่ที่มันต้องใช้เวลาสักสองสามครั้ง แต่พวกเขาก็สุ่มดังนั้นพวกเขาสามารถพิมพ์ได้ในเวลาไม่นาน


1
แต่ทำให้นี้nและNไม่ทำงานและสิ่งที่ต้องการหรือ:%s//something :g//somethingนอกจากนี้ยังตัดประวัติการค้นหาของคุณ
DJMcMayhem

ใช่ แต่ข้อสันนิษฐานของฉัน (อาจไม่ถูกต้อง) ก็คือเนื่องจากคุณไม่ต้องการเน้นอีกต่อไปคุณจึงไม่สนใจการค้นหานั้น ความยุ่งเหยิงของประวัติการค้นหาเป็นปัญหาจริงหากมีใครอาศัยอยู่
Kostas

1

ฉันพบว่ามันง่ายกว่าที่จะทำการแมปCtrl- Lทาสีใหม่เพื่อรวม:nohls:

nnoremap <C-L> :nohls<cr><C-L>

ยินดีต้อนรับสู่Vi และกลุ่ม ! ขอบคุณสำหรับการแบ่งปันความรู้ในสิ่งที่เป็นคำถามเก่าที่ยอมรับ คำตอบที่มีคุณภาพสูงอย่างที่คุณอาจสังเกตเห็นโดยทั่วไปมาพร้อมกับคำอธิบายว่าโค้ดทำอะไร (นี่เป็นประโยชน์อย่างยิ่งสำหรับ vimmers รุ่นใหม่ที่อาจลงจอดที่นี่โดยที่ไม่รู้มาก) มันอาจเป็นความคิดที่ดีสำหรับ:helpส่วนที่เกี่ยวข้อง!
D. Ben Knoble

0

ฉันใช้<Leader><Enter>เป็นทางลัดเพื่อ:hlsตั้งค่าตำแหน่งผู้นำของฉัน

let mapleader = "\<Space>"
nmap <silent> <leader><Esc> :set hls!<cr>

<Space><Esc>หลังจากการค้นหารายการที่จะได้รับการเน้นที่จะปิดตี <Space><Esc>และถ้าคุณตัดสินใจว่าคุณต้องการที่จะต์ผลการค้นหายอดฮิต hls!วิธี map คีย์นี้มีผลผูกพันเพื่อสลับการตั้งค่าสำหรับhls(ชวเลขhlsearchคือการเน้นผลการค้นหา) (เพื่อ!สลับการตั้งค่าที่เหมาะสมก่อนที่มัน)


-1

เพิ่มมาโครนี้ใน. vimrc ของคุณ

map #h :set hls!<CR>

วิธีนี้จะช่วยให้คุณสลับกับ #h


นี่ไม่ต่างไปจากคำตอบของ James Affleck
jamessan

ฉันดูเหมือนรัดกุมมากขึ้น
Darrel Lee

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