อะไรคือความแตกต่างระหว่างการทำงาน: nohlsearch และ: set nohlsearch?


13

ผมสังเกตเห็นว่าเมื่อฉันใช้ว่ามันไม่ได้ทำจริงเป็นสิ่งเดียวกับ:nohlsearch:set nohlsearch

โดยเฉพาะอย่างยิ่งการhlsearchตั้งค่าไม่ได้ปิดจริง (ซึ่งเป็นสิ่งที่:set hlsearch) สำเร็จ

เพื่อแสดงให้เห็นถึงสิ่งที่ฉันหมายถึง:

:set hlsearch
:nohlsearch
:echo &hlsearch

ภาพนี้1( hlsearch ยังคงตั้งค่า! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

พิมพ์นี้0เพราะเราปิด hlsearch โดยใช้วิธีมาตรฐานเพื่อปิดการตั้งค่าในกลุ่ม

ดังนั้นฉันจึงสงสัยเพราะจะต้องมีเหตุผลที่แท้จริงสำหรับ:nohlsearchคำสั่ง ex

เหตุผลที่ผมสนใจก็คือว่าตอนนี้ผมมีความจำเป็นในการเขียนสคริปต์ที่เป็นกลุ่มของฉันในการทดสอบไม่ว่าจะเป็นไฮไลท์ที่มีการใช้งานการค้นหาและตั้งแต่ผมใช้:nohlsearchแทน "ชุด nohlsearch" ในการเขียนสคริปต์อื่น ๆ ของฉันฉันทดสอบเสมอผลตอบแทน&hlsearch 1ดังนั้นฉันสงสัยว่าฉันกำลังเปลี่ยนอะไรโดยไม่ใช้nohlsearchคำสั่ง ex อีกต่อไป

คำตอบ:


15

จาก :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] หยุดการไฮไลต์สำหรับตัวเลือก 'hlsearch' มัน
                        จะถูกเปิดอีกครั้งโดยอัตโนมัติเมื่อใช้การค้นหา
                        คำสั่งหรือการตั้งค่าตัวเลือก 'hlsearch'
                        คำสั่งนี้ไม่ทำงานในข้อความอัตโนมัติเพราะ
                        สถานะการไฮไลต์จะถูกบันทึกและกู้คืนเมื่อ
                        กำลังเรียกใช้ autocommands autocmd-searchpat
                        สิ่งเดียวกันเมื่อเรียกใช้ฟังก์ชันผู้ใช้

จุดสำคัญคือมันจะเปิดการเน้นโดยอัตโนมัติเมื่อคุณเริ่มการค้นหาใหม่ ปิด:set nohlsearchจริงhlsearchซึ่งหมายความว่าในครั้งต่อไปที่คุณค้นหาสิ่งที่ไม่มีการเน้นเกิดขึ้น

ตัวอย่าง: สมมติว่าhlsearchเปิดถ้าคุณกำลังค้นหา "hello" ในบัฟเฟอร์ทั้งหมด "hello" จะถูกเน้น ถ้าคุณใช้:nohlsearchอะไรจะถูกเน้น แต่ถ้าคุณค้นหา "โลก" แล้ว "โลก" ทั้งหมดจะถูกเน้น หากคุณใช้set nohlsearchแทน "โลก" จะไม่ถูกเน้น


โปรดทราบด้วยว่าคำสั่งนี้ไม่ทำสิ่งใดในฟังก์ชั่นผู้ใช้ ตัวอย่างเช่น,

function! NoHlsearch()
    nohlsearch
endfunction

ไม่มีผลกระทบที่มองเห็นได้เมื่อทำงาน


หากต้องการดูว่า hlsearch v:hlsearchมีการใช้งานจริงคุณต้องการตรวจสอบตัวแปร เมื่อการv:hlsearch = 0ไฮไลต์ปิดอยู่และเมื่อการv:hlsearch = 1ไฮไลต์เปิดอยู่ คุณอาจจะตรวจสอบให้แน่ใจก่อนที่จะตรวจสอบ&hlsearch = 1v:hlsearch

จาก :h v:hlsearch

                                        v: hlsearch hlsearch-variable
v: hlsearch ตัวแปรที่กำหนดว่าการไฮไลต์การค้นหาเปิดอยู่หรือไม่
                เหมาะสมหากเปิดใช้งาน 'hlsearch' ซึ่งจำเป็นต้องใช้
                + extra_search การตั้งค่าตัวแปรนี้ให้เป็นศูนย์ทำหน้าที่คล้ายกัน
                : คำสั่ง nohlsearch ตั้งค่าเป็นหนึ่งการกระทำเช่น
                        ให้ & hlsearch = & hlsearch

คุณสามารถอธิบายสิ่งที่คุณหมายถึงโดย "ไม่มีอะไรโดยพื้นฐาน" จากภายในฟังก์ชั่น? มันทำสิ่งมาตรฐาน (หยุดการเน้นการค้นหาชั่วคราวจนกว่าการค้นหาครั้งต่อไปจะถูกเรียกใช้)
Steven Lu

ฉันยังหวังที่จะหาวิธีในการเข้าถึงธงที่ควบคุมว่าทรานแซคชัน:nohlsearchนั้นมีผลหรือไม่ ... ฉันคิดว่าในกรณีที่ไม่มีฉันต้องหันไปใช้การติดตามการ:nohlsearchโทรทั้งหมดด้วยตัวแปร
Steven Lu

@StevenLu ดูการแก้ไข
FDinoff

ขอบคุณ ดูเหมือนว่ารหัสฉันได้ใช้ hacks รอบด้าน "โดยทั่วไปทำอะไร" ของมันโดยการทำเช่นนี้nnoremap <silent> <expr> <boundkey> SearchHighlight()ที่อาจจะกลับสตริงSearchHighlight() ":silent nohlsearch\<CR>"ขอบคุณสำหรับv:hlsearchเคล็ดลับสิ่งที่ฉันต้องการ
Steven Lu

1

สคริปต์ของคุณต้องการให้ทราบสถานะการไฮไลต์ปัจจุบันหรือไม่?

หากต้องการปิดhlsearchการค้นหาปัจจุบันเท่านั้นฉันใช้โดยใช้Ctrl-lสิ่งนี้ใน. vimrc ของฉัน:

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>

การไฮไลต์การค้นหาจะส่งคืนพร้อมการค้นหาถัดไปเมื่อใช้คำสั่งด้านบน Ctrl-lสะดวกเพราะเป็นการใช้งานปกติคือการล้างและวาดหน้าจอใหม่

หากต้องการเปลี่ยนสถานะการเปิดหรือปิดการไฮไลต์การค้นหาอย่างต่อเนื่องฉันใช้ F3 เป็นสลับของฉัน:

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