Destacar toda a ocorrência de uma palavra selecionada?

159

Como posso destacar toda a ocorrência de uma palavra selecionada no GVim, como no Notepad ++?

Matteo Cocon
fonte

Respostas:

202

No modo Normal:

:set hlsearch

Em seguida, procure um padrão com o comando /no modo Normal ou <Ctrl>oseguido /no modo Inserir. *no modo Normal, procurará a próxima ocorrência da palavra sob o cursor. A hlsearchopção destacará todos eles, se configurados. #procurará a ocorrência anterior da palavra.

Para remover o destaque da pesquisa anterior:

:nohlsearch

Você pode mapear :nohlsearch<CR>para alguma tecla conveniente.

wilhelmtell
fonte
34
Se você planeja alternar hlsearchmuito, pode querer mapear em :set hlsearch!vez de :set nohlsearch. Isso alterna a configuração em vez de sempre desativá-la.
David Winslow
1
Além disso, estar ciente de que o cursor irá se mover para o anterior (#) ou próxima ocorrência (*) da palavra
Juan Campa
1
Mas você pode voltar para a posição em que carregou *ou #por <Ctrl>ono modo normal.
Ruslan
8
Em vez de :nohlsearch, você pode apenas usar:noh
crisron
Definir .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>para alternar entre realçar e remover realce por <F4>.
Chalist
124

A *tecla destacará todas as ocorrências da palavra que está sob o cursor.

sonolento
fonte
31
Somente se &hlsearchestiver ativado.
Wilhelmtell
10
Irá também pular para a próxima ocorrência da palavra sob o cursor. Se você quiser pular para a ocorrência anterior, use #.
Vinicius Pinto
7
Posso fazer com que fique na posição atual?
Nn0p
@ nn0p Sim, você pode - nesse caso, siga a resposta aceita stackoverflow.com/a/3431203/363688 . Essa é apenas uma ação alternativa que também destacará todas as ocorrências.
sleepynate
1
existe uma maneira de usar essa funcionalidade, mas com as uma ou mais palavras destacadas?
Sung Cho
22

Eu sei que é uma pergunta muito antiga, mas se alguém estiver interessado nesse recurso, pode verificar este código 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
clagccs
fonte
1
É possível modificar esse script para que o texto sob o cursor que é destacado inicialmente quando z / é pressionado permaneça destacado, mesmo quando o cursor é movido para outras palavras? Isso seria útil ao percorrer o código-fonte procurando a palavra inicial.
Steveotla
18

da maneira mais simples, digite no modo normal *

Eu também tenho esses mapeamentos para ativar e desativar

"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

Selecione a palavra clicando nela

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

Bônus: 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>

Selecionando palavras com o mouse e contando as ocorrências de uma só vez: OBS: Observe que nesta versão temos o comando "CountWord" no final

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>
SergioAraujo
fonte
Agora eu uso nnoremap * *``cgnennoremap # #``cgN
SergioAraujo 3/16/16
então, depois que eu digito *, como desativo o destaque?
user5359531
Isto é para palavra atual destaque no documento
Chalist
@ user5359531 :nohou:nohlsearch
dylnmc
@ user5359531 nnoremap <silent> * :execute "normal! *N"<cr>e quanto nnoremap <silent> # :execute "normal! #n"<cr>? Eles apenas destacam a palavra sob o cursor, mas não a movem para a próxima ocorrência.
precisa saber é o seguinte
10

As soluções baseadas em pesquisa ( *, /...) movem o cursor, o que pode ser lamentável.

Uma alternativa é usar o plug- in mark.vim aprimorado e , em seguida, complete o seu .vimrcpara permitir um clique duplo no destaque do acionador (não sei como uma seleção de teclado pode acionar um comando):

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

Permite vários destaques, persistência, etc.

Para remover o realce:

  • Clique duas vezes novamente
  • :Mark (desligue até a próxima seleção)
  • :MarkClear
YvesgereY
fonte
2
As soluções baseadas em pesquisa apenas movem o cursor se a pesquisa incremental estiver ativada. Você pode desligá-lo como este: :set noincsearch. Na minha opinião, é um dos recursos mais irritantes do Vim e uma das primeiras coisas que desabilito para novas instalações.
jahroy
3
Eu acho que *irá mover incondicionalmente o cursor. E não vejo como isso incsearchpode ser irritante, já que é apenas um 'olhar para o futuro', realizando a pesquisa atual sem realmente mudar sua posição.
YvesgereY
3
Uau ... Você está certo. Eu supus que desligar incsearchseria impedir o movimento, mas um teste rápido confirma que você está correto. Me desculpe. No entanto, é super fácil de criar um mapeamento que impede o movimento: :nnoremap * *N. Não acredito que você não ache irritante que seu cursor pule por toda a tela enquanto você faz uma pesquisa. Mas ... essas coisas são completamente subjetivas. Vive la différence ;-)
jahroy 16/07/2013
3
Você também pode fazer :let @/='hilight_this', supondo que você tenha hlsearchativado. Destaca o texto sem pular, e você não precisa alterar as configurações existentes. Isso altera o valor atualmente armazenado no registro de pesquisa.
Ben Davis
1
Essa deve ser a resposta aceita. <líder> m faz o trabalho, não há necessidade de mapear clique duplo.
Sassan
4

Primeiro (ou no seu .vimrc):

:set hlsearch

Posicione o cursor sobre a palavra que você deseja destacar e pressione *.

hlsearchsignifica destacar todas as ocorrências da pesquisa atual e *significa pesquisar a palavra sob o cursor.

Ned Batchelder
fonte
3

Primeiro, verifique se o hlsearch está ativado emitindo o seguinte comando

:set hlsearch

Você também pode adicionar isso ao seu arquivo .vimrc como definido

set hlsearch

agora, quando você usar o mecanismo de pesquisa rápida no modo de comando ou um comando de pesquisa regular, todos os resultados serão destacados. Para avançar entre os resultados, pressione 'n' para retroceder, pressione 'N'

No modo normal, para executar uma pesquisa rápida pela palavra sob o cursor e pular para a próxima ocorrência em um comando, pressione '*', você também pode procurar a palavra sob o cursor e avançar para a ocorrência anterior pressionando '# "

No modo normal, a pesquisa rápida também pode ser chamada com o

/searchterm<Enter>

para remover destaques no uso de ocuurências, vinculei isso a um atalho no meu arquivo .vimrc

:nohl
kashif
fonte
2

Ative o destaque da pesquisa:

:set hlsearch

Em seguida, procure a palavra:

/word<Enter>
John Kugelman
fonte
2

para destacar a palavra sem mover o cursor, plop

" 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>

no seu vimrc.

O que é legal nisso é g*e g#ainda funcionará como "normal" *e #.


Para definir hlsearchoff, você pode usar "short-form" (a menos que você tem uma outra função que começa com "noh" no modo de comando): :noh. Ou você pode usar a versão longa::nohlsearch

Para extrema conveniência (eu me vejo alternando hlsearchtalvez 20 vezes por dia), você pode mapear algo para alternar da seguinte hlsearchforma:

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

.:. se você <leader>é \(por padrão), você pode pressionar \st(rapidamente) no modo normal para alternar hlsearch.

Ou talvez você só queira ter :nohmapeado:

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

A descrição acima simplesmente é executada, :nohlsearchentão (ao contrário :set hlsearch!) ainda destacará a palavra na próxima vez que você pressionar *ou #no modo normal .

Felicidades

dylnmc
fonte
1
set hlsearch

talvez ?

Torre
fonte
1

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

Certifique-se de ter IncSearchdefinido algo. por exemplo call s:Attr('IncSearch', 'reverse'). Como alternativa, você pode usar outro grupo de destaque em seu lugar.

Isso destacará todas as ocorrências de palavras sob o cursor sem demora. Percebo que um atraso me atrasa quando estou analisando o código. A cor de destaque corresponderá à cor da palavra, para que fique consistente com o seu esquema.

Seph
fonte
0

Por que não apenas: z /

Isso destacará a palavra atual sob o cursor e outras ocorrências. E você não precisa fornecer um comando separado para cada item que está procurando. Talvez isso não esteja disponível no profano gvim? Está no vim por padrão.

* só é bom se você deseja que o cursor vá para a próxima ocorrência. Ao comparar duas coisas visualmente, muitas vezes você não deseja que o cursor se mova, e é irritante pressionar a tecla * toda vez.

INL
fonte
Vim e gvim normalmente têm o mesmo conjunto de comandos. Não há referência nos documentos de ajuda a um comando "z /".
Wd
Não está disponível não apenas no gvim, mas também no vim. Apenas verifiquei - claramente não funciona.
Ruslan
O z / funciona quando esse script mencionado em uma resposta anterior está em uso.
Fzzylogic 19/03/19
0
  1. Adicione essas linhas ao seu ~/.vimrcarquivo

" 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. Recarregue as configurações com :so%
  2. No modelo normal, repasse a palavra.

  3. Pressione * Pressione F8 para pesquisar abaixo recursivamente todo o seu projeto sobre a palavra

Yordan Georgiev
fonte
0

Por exemplo, esses plugins:

Basta procurar no cursor em vimawesome.com

A chave, como clagccs mencionados, é que o destaque NÃO entra em conflito com sua pesquisa : https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

Captura de tela de como NÃO entra em conflito com a pesquisa: insira a descrição da imagem aqui Notas:

  • os destaques do vim-illuminate por padrão, na minha captura de tela, mudei para sublinhar
  • O vim-illuminate destaca / sublinha a palavra sob o cursor por padrão, na minha captura de tela eu a desabilito
  • meus esquemas de cores são muito cinzentos. Verifique o seu para personalizá-lo também.
Xopi García
fonte