เน้นคำที่เลือกทั้งหมดหรือไม่


คำตอบ:


202

ในโหมดปกติ:

:set hlsearch

จากนั้นค้นหารูปแบบด้วยคำสั่ง/ในโหมดปกติหรือ<Ctrl>oตามด้วย/ในโหมดแทรก *ในโหมดปกติจะค้นหาคำถัดไปที่อยู่ใต้เคอร์เซอร์ hlsearchตัวเลือกที่จะเน้นทั้งหมดของพวกเขาถ้าชุด #จะค้นหาคำที่เกิดขึ้นก่อนหน้านี้

หากต้องการลบไฮไลต์ของการค้นหาก่อนหน้า:

:nohlsearch

คุณอาจต้องการแมป:nohlsearch<CR>กับรหัสที่ใช้สะดวก


34
ถ้าคุณวางแผนในการสลับhlsearchมากคุณอาจต้องการ map แทน:set hlsearch! :set nohlsearchการทำเช่นนี้จะสลับการตั้งค่าแทนที่จะปิดอยู่เสมอ
เดวิดวินสโลว์

1
นอกจากนี้โปรดทราบว่าเคอร์เซอร์จะย้ายไปยังการเกิดขึ้นของคำก่อนหน้า (#) หรือถัดไป (*)
Juan Campa

1
แต่คุณสามารถกลับไปยังตำแหน่งที่คุณกด*หรือ#โดย<Ctrl>oในโหมดปกติ
Ruslan

8
แทนที่จะใช้:nohlsearchคุณสามารถใช้:noh
crisron

ตั้งอยู่ใน.vimrc: สำหรับสลับระหว่างไฮไลท์ไฮไลท์และลบโดยnoremap <F4> :set hlsearch! hlsearch?<CR> <F4>
Chalist

124

*ที่สำคัญจะเน้นเหตุการณ์ทั้งหมดของคำที่อยู่ภายใต้เคอร์เซอร์


31
เฉพาะในกรณี&hlsearchที่เปิด
wilhelmtell

10
มันจะข้ามไปยังการเกิดขึ้นครั้งถัดไปของคำใต้เคอร์เซอร์ #หากคุณต้องการที่จะข้ามไปยังที่เกิดขึ้นก่อนหน้านี้การใช้งาน
Vinicius Pinto

7
ฉันสามารถทำให้มันอยู่ในตำแหน่งปัจจุบันได้หรือไม่?
nn0p

@ nn0p ใช่คุณสามารถ - ในกรณีที่เป็นไปตามคำตอบที่ได้รับการยอมรับstackoverflow.com/a/3431203/363688 นี่เป็นเพียงการกระทำทางเลือกที่จะเน้นเหตุการณ์ทั้งหมด
sleepynate

1
มีวิธีการใช้ฟังก์ชั่นนี้ แต่มีคำที่ไฮไลต์อย่างน้อยหนึ่งคำ?
Sung Cho

22

ฉันรู้ว่ามันเป็นคำถามที่เก่ามาก แต่ถ้ามีใครสนใจคุณสมบัตินี้สามารถตรวจสอบรหัสนี้ได้ที่ http://vim.wikia.com/wiki/Auto_highlight_current_word_when_idle

" Highlight all instances of word under cursor, when idle.
" Useful when studying strange source code.
" Type z/ to toggle highlighting on/off.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
   let @/ = ''
   if exists('#auto_highlight')
     au! auto_highlight
     augroup! auto_highlight
     setl updatetime=4000
     echo 'Highlight current word: off'
     return 0
  else
    augroup auto_highlight
    au!
    au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
    augroup end
    setl updatetime=500
    echo 'Highlight current word: ON'
  return 1
 endif
endfunction

1
เป็นไปได้หรือไม่ที่จะแก้ไขสคริปต์นี้โดยที่ข้อความใต้เคอร์เซอร์ซึ่งถูกเน้นไว้ในตอนแรกเมื่อกด z / จะยังคงเน้นอยู่แม้เมื่อเคอร์เซอร์ถูกย้ายไปที่คำอื่น ๆ ? ซึ่งจะมีประโยชน์เมื่อเลื่อนดูซอร์สโค้ดเพื่อค้นหาคำเริ่มต้น
stensootla

18

วิธีที่ง่ายที่สุดพิมพ์ในโหมดปกติ *

ฉันยังมีการแม็พเหล่านี้เพื่อเปิดใช้งานและปิดใช้งาน

"highligh search enabled by default
set hlsearch
"now you can toggle it
nnoremap <S-F11> <ESC>:set hls! hls?<cr>
inoremap <S-F11> <C-o>:set hls! hls?<cr>
vnoremap <S-F11> <ESC>:set hls! hls?<cr> <bar> gv

เลือกคำโดย clickin ที่มัน

set mouse=a     "Enables mouse click
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

โบนัส: CountWordFunction

fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        let l:old_query = getreg('/')
        let var = expand("<cword>")
        exec "%s/" . var . "//gn"
    finally
        call winrestview(l:win_view)
        call setreg('/', l:old_query)
    endtry
endfun
" Bellow we set a command "CountWord" and a mapping to count word
" change as you like it
command! -nargs=0 CountWord :call CountWordFunction()
nnoremap <f3> :CountWord<CR>

การเลือกคำด้วยเมาส์และการนับที่เกิดขึ้นพร้อมกัน: OBS: โปรดสังเกตว่าในรุ่นนี้เรามีคำสั่ง "CountWord" ที่ส่วนท้าย

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>

ตอนนี้ฉันใช้nnoremap * *``cgnและnnoremap # #``cgN
SergioAraujo

ดังนั้นหลังจากฉันพิมพ์*ฉันจะปิดการเน้นได้อย่างไร
user5359531

คำนี้ใช้สำหรับไฮไลต์คำปัจจุบันในเอกสาร
Chalist

@ user5359531 :nohหรือ:nohlsearch
dylnmc

@ user5359531 สิ่งที่เกี่ยวกับnnoremap <silent> * :execute "normal! *N"<cr>และnnoremap <silent> # :execute "normal! #n"<cr>? สิ่งเหล่านี้เพียงแค่ไฮไลต์คำที่อยู่ใต้เคอร์เซอร์ แต่อย่าย้ายไปที่การเกิดขึ้นครั้งถัดไป
dylnmc

10

การค้นหาโซลูชันตาม ( *, /... ) เลื่อนเคอร์เซอร์ซึ่งอาจโชคร้าย

อีกทางเลือกหนึ่งคือการใช้ปลั๊กอินmark.vim ที่ปรับปรุงแล้วทำของคุณ.vimrcให้เสร็จสิ้นเพื่อให้ดับเบิลคลิกที่การไฮไลต์ทริกเกอร์ (ฉันไม่รู้ว่าการเลือกแป้นพิมพ์อาจเรียกคำสั่ง) ได้อย่างไร:

"Use Mark plugin to highlight selected word  
map <2-leftmouse> \m   

มันช่วยให้การไฮไลท์หลาย ๆ การติดตา ฯลฯ

หากต้องการลบไฮไลต์ให้ทำดังนี้

  • คลิกสองครั้งอีกครั้ง
  • :Mark (ปิดจนกว่าจะเลือกต่อไป)
  • :MarkClear

2
โซลูชันการค้นหาที่ใช้จะเลื่อนเคอร์เซอร์เมื่อเปิดการค้นหาที่เพิ่มขึ้นเท่านั้น :set noincsearchคุณสามารถปิดได้เช่นนี้ ในความคิดของฉันมันเป็นหนึ่งในคุณสมบัติที่น่ารำคาญที่สุดใน Vim และเป็นหนึ่งในสิ่งแรกที่ฉันปิดการใช้งานสำหรับการติดตั้งใหม่
jahroy

3
ฉันคิดว่า*จะย้ายเคอร์เซอร์โดยไม่มีเงื่อนไข และฉันไม่สามารถเห็นได้ว่าincsearchอาจจะน่ารำคาญเพราะเป็นเพียง 'มองไปข้างหน้า' การค้นหาปัจจุบันโดยไม่ต้องเปลี่ยนตำแหน่งของคุณ
YvesgereY

3
ว้าว ... คุณพูดถูก ฉันคิดว่าการปิดเครื่องincsearchจะป้องกันการเคลื่อนไหว แต่การทดสอบอย่างรวดเร็วยืนยันว่าคุณถูกต้อง ขอโทษด้วย. :nnoremap * *Nแต่ก็สุดง่ายต่อการสร้างแผนที่ที่ป้องกันไม่ให้การเคลื่อนไหว: ฉันไม่อยากเชื่อว่าคุณจะไม่พบว่ามันน่ารำคาญที่เคอร์เซอร์ของคุณกระโดดไปทั่วหน้าจอเมื่อคุณทำการค้นหา แต่ ... สิ่งเหล่านี้เป็นอัตวิสัยอย่างสมบูรณ์ Vive la différence ;-)
jahroy

3
คุณสามารถทำได้:let @/='hilight_this'โดยสมมติว่าคุณhlsearchเปิดใช้งาน มันเน้นข้อความโดยไม่ต้องกระโดดและคุณไม่จำเป็นต้องเปลี่ยนการตั้งค่าที่มีอยู่ สิ่งนี้จะเปลี่ยนค่าที่เก็บไว้ในทะเบียนการค้นหาในปัจจุบัน
Ben Davis

1
นี่ควรเป็นคำตอบที่ยอมรับได้ <leader> m ทำงานได้โดยไม่ต้องคลิกสองครั้งที่การแมป
Sassan

4

ครั้งแรก (หรือใน. vimrc ของคุณ):

:set hlsearch

*จากนั้นวางเคอร์เซอร์ของคุณมากกว่าคำที่คุณต้องการเน้นและตี

hlsearchหมายถึงเน้นการค้นหาทั้งหมดที่เกิดขึ้นในปัจจุบันและ*หมายถึงการค้นหาคำที่อยู่ใต้เคอร์เซอร์


3

ก่อนอื่นให้แน่ใจว่าเปิดใช้งาน hlsearch โดยออกคำสั่งต่อไปนี้

:set hlsearch

คุณยังสามารถเพิ่มสิ่งนี้ลงในไฟล์. vimrc ของคุณได้ตามที่ตั้งไว้

set hlsearch

ตอนนี้เมื่อคุณใช้กลไกการค้นหาอย่างรวดเร็วในโหมดคำสั่งหรือคำสั่งการค้นหาปกติผลลัพธ์ทั้งหมดจะถูกเน้น หากต้องการเลื่อนไปข้างหน้าระหว่างผลลัพธ์ให้กด 'n' เพื่อเลื่อนไปข้างหลังกด 'N'

ในโหมดปกติในการค้นหาอย่างรวดเร็วสำหรับคำที่อยู่ใต้เคอร์เซอร์และเพื่อข้ามไปยังสิ่งที่เกิดขึ้นต่อไปในหนึ่งคำสั่งกด '*' คุณยังสามารถค้นหาคำที่อยู่ใต้เคอร์เซอร์และย้ายไปที่เหตุการณ์ก่อนหน้าโดยการกด '# '

ในโหมดปกติคุณสามารถเรียกใช้การค้นหาอย่างรวดเร็วด้วย

/searchterm<Enter>

ในการลบไฮไลต์เกี่ยวกับการใช้งานฉันได้ผูกสิ่งนี้กับทางลัดใน. vimrc ของฉัน

:nohl



2

เพื่อไฮไลต์คำโดยไม่เลื่อนเคอร์เซอร์, ป๋อม

" highlight reg. ex. in @/ register
set hlsearch
" remap `*`/`#` to search forwards/backwards (resp.)
" w/o moving cursor
nnoremap <silent> * :execute "normal! *N"<cr>
nnoremap <silent> # :execute "normal! #n"<cr>

เป็น vimrc ของคุณ

สิ่งที่ดีเกี่ยวกับการนี้อยู่g*และg#จะยังคงทำงานเหมือน "ปกติ" และ*#


ในการตั้งค่าhlsearchปิดคุณสามารถใช้ "แบบสั้น" (เว้นแต่คุณจะมีฟังก์ชั่นอื่น ๆ ที่เริ่มต้นด้วย "โนห์" :nohในโหมดคำสั่ง): หรือคุณสามารถใช้รุ่นยาว::nohlsearch

เพื่อความสะดวกมาก (ฉันพบว่าตัวเองกำลังสลับกันhlsearchวันละ 20 ครั้ง) คุณสามารถแมปบางอย่างเพื่อสลับhlsearchเช่น:

" search highlight toggle
nnoremap <silent> <leader>st :set hlsearch!<cr>

.: ถ้าคุณ<leader>มี\(มันคือการเริ่มต้น), คุณสามารถกด\st(อย่างรวดเร็ว) ในปกติhlsearchโหมดสลับ

หรือบางทีคุณแค่ต้องการ:nohทำแผนที่:

" search clear
nnoremap <silent> <leader>sc :nohlsearch<cr>

ข้างต้นจะทำงาน:nohlsearchเพื่อ (ไม่เหมือน:set hlsearch!) มันจะยังคงเน้นคำในครั้งถัดไปที่คุณกด*หรือ#ในโหมดปกติ

ไชโย



1

ใช้ autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))

ตรวจสอบให้แน่ใจว่าคุณได้IncSearchตั้งค่าบางอย่าง call s:Attr('IncSearch', 'reverse')เช่น หรือคุณสามารถใช้กลุ่มไฮไลต์อื่นแทน

การทำเช่นนี้จะเน้นคำทั้งหมดที่อยู่ใต้เคอร์เซอร์ของคุณโดยไม่ล่าช้า ฉันพบว่าการหน่วงเวลาทำให้ฉันช้าลงเมื่อฉันใช้รหัสผ่าน สีไฮไลต์จะตรงกับสีของคำศัพท์เพื่อให้สอดคล้องกับแบบแผนของคุณ


0

ทำไมไม่เพียงแค่: z /

ที่จะเน้นคำปัจจุบันภายใต้เคอร์เซอร์และเหตุการณ์อื่น ๆ และคุณไม่จำเป็นต้องให้คำสั่งแยกต่างหากสำหรับแต่ละรายการที่คุณกำลังค้นหา บางทีนั่นอาจไม่พร้อมใช้งานใน gvim ที่ไม่บริสุทธิ์? เป็นค่าเริ่มต้น

* จะใช้งานได้ก็ต่อเมื่อคุณต้องการให้เคอร์เซอร์เลื่อนไปที่เหตุการณ์ถัดไป เมื่อเปรียบเทียบสองสิ่งที่มองเห็นได้บ่อยครั้งคุณไม่ต้องการให้เคอร์เซอร์เคลื่อนที่และมันน่ารำคาญที่จะกดปุ่ม * ทุกครั้ง


Vim และ gvim ปกติมีชุดคำสั่งเดียวกัน ไม่มีการอ้างอิงในเอกสารช่วยเหลือของคำสั่ง "z /"
wds

มันไม่ได้มีให้เฉพาะใน gvim เท่านั้น แต่ยังรวมถึง vim ด้วย เพียงตรวจสอบแล้ว - ไม่ได้ผลแน่ชัด
Ruslan

z / ทำงานเมื่อสคริปต์นี้กล่าวถึงในคำตอบที่ก่อนหน้านี้มีการใช้งาน
fzzylogic

0
  1. เพิ่มบรรทัดเหล่านั้นใน~/.vimrcไฟล์ของคุณ

" highlight the searched items set hlsearch " F8 search for word under the cursor recursively , :copen , to close -> :ccl nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

  1. รีโหลดการตั้งค่าด้วย :so%
  2. ในรูปแบบปกติไปกว่าคำว่า

  3. กด * กด F8 เพื่อค้นหาคำซ้ำ ๆ ของโครงการ


0

ตัวอย่างเช่นปลั๊กอินนี้:

เพียงค้นหาภายใต้เคอร์เซอร์ในvimawesome.com

คีย์ดังที่clagccsกล่าวถึงคือไฮไลต์ไม่ขัดแย้งกับการค้นหาของคุณ : https://vim.fandom.com/Auto_highlight_current_word_when_idle

สกรีนช็อตว่าไม่ขัดแย้งกับการค้นหาอย่างไร: ป้อนคำอธิบายรูปภาพที่นี่ หมายเหตุ:

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