Markieren Sie alle Vorkommen eines ausgewählten Wortes?


159

Wie kann ich alle Vorkommen eines ausgewählten Wortes in GVim wie in Notepad ++ hervorheben?

Antworten:


202

Im normalen Modus:

:set hlsearch

Dann suchen Sie nach einem Muster mit dem Befehl /im Normalmodus oder <Ctrl>ogefolgt von /im Insert - Modus. *Im normalen Modus wird nach dem nächsten Vorkommen des Wortes unter dem Cursor gesucht. Die hlsearchOption hebt alle hervor, falls festgelegt. #sucht nach dem vorherigen Vorkommen des Wortes.

So entfernen Sie die Markierung der vorherigen Suche:

:nohlsearch

Möglicherweise möchten Sie :nohlsearch<CR>einem praktischen Schlüssel zuordnen.


34
Wenn Sie hlsearchviel umschalten möchten, möchten Sie möglicherweise :set hlsearch!statt zuordnen :set nohlsearch. Dadurch wird die Einstellung umgeschaltet, anstatt sie immer auszuschalten.
David Winslow

1
Beachten Sie auch, dass sich der Cursor zum vorherigen (#) oder nächsten (*) Vorkommen des Wortes bewegt
Juan Campa

1
Aber Sie können in die Position zurück , wo Sie gedrückt *oder #von <Ctrl>oim Normalbetrieb.
Ruslan

8
Stattdessen :nohlsearchkönnen Sie einfach verwenden:noh
Crisron

Set in .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>zum Umschalten zwischen Hervorheben und Entfernen von Hervorheben durch <F4>.
Chalist

123

Die *Taste hebt alle Vorkommen des Wortes hervor, das sich unter dem Cursor befindet.


31
Nur wenn eingeschaltet &hlsearchist.
Wilhelmtell

10
Es wird auch zum nächsten Vorkommen des Wortes unter dem Cursor gesprungen. Wenn Sie zum vorherigen Vorkommen springen möchten, verwenden Sie #.
Vinicius Pinto

7
Kann ich dafür sorgen, dass es einfach auf der aktuellen Position bleibt?
nn0p

@ nn0p Ja, Sie können - in diesem Fall folgen Sie der akzeptierten Antwort stackoverflow.com/a/3431203/363688 . Dies ist nur eine alternative Aktion, die auch alle Vorkommen hervorhebt.
Sleepynate

1
Gibt es eine Möglichkeit, diese Funktionalität zu verwenden, jedoch mit einem oder mehreren hervorgehobenen Wörtern?
Sung Cho

22

Ich weiß, dass es eine wirklich alte Frage ist, aber wenn jemand an dieser Funktion interessiert ist, kann er diesen Code überprüfen 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
Ist es möglich, dieses Skript so zu ändern, dass der Text unter dem Cursor, der anfänglich hervorgehoben wird, wenn z / gedrückt wird, auch dann hervorgehoben bleibt, wenn der Cursor auf andere Wörter bewegt wird? Dies ist nützlich, wenn Sie im Quellcode nach dem Anfangswort suchen.
Sensootla

18

Am einfachsten tippen Sie im normalen Modus *

Ich habe auch diese Zuordnungen zum Aktivieren und Deaktivieren

"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

Wählen Sie ein Wort aus, indem Sie darauf klicken

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

Bonus: 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>

Wort mit der Maus auswählen und Vorkommen gleichzeitig zählen: OBS: Beachten Sie, dass in dieser Version am Ende der Befehl "CountWord" steht

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

Jetzt benutze ich nnoremap * *``cgnundnnoremap # #``cgN
SergioAraujo

so , nachdem ich geben *, wie schalte ich die Markierung aus?
user5359531

Dies ist für das aktuelle Wort im Dokument
hervorzuheben

@ user5359531 :nohoder:nohlsearch
dylnmc

@ user5359531 was ist mit nnoremap <silent> * :execute "normal! *N"<cr>und nnoremap <silent> # :execute "normal! #n"<cr>? Diese markieren nur das Wort unter dem Cursor, verschieben es jedoch nicht zum nächsten Vorkommen.
dylnmc

10

Suchbasierte Lösungen ( *, /...) bewegen den Cursor, was unglücklich sein kann.

Eine Alternative besteht darin, das erweiterte mark.vim- Plugin zu verwenden und dann das .vimrcDoppelklicken auf Trigger-Hervorhebung abzuschließen (ich weiß nicht, wie eine Tastaturauswahl einen Befehl auslösen kann):

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

Es ermöglicht mehrere Hervorhebungen, Persistenz usw.

So entfernen Sie Hervorhebungen:

  • Doppelklicken Sie erneut
  • :Mark (bis zur nächsten Auswahl ausschalten)
  • :MarkClear

2
Suchbasierte Lösungen bewegen den Cursor nur, wenn die inkrementelle Suche aktiviert ist. Sie können es folgendermaßen ausschalten : :set noincsearch. Meiner Meinung nach ist dies eine der nervigsten Funktionen in Vim und eines der ersten Dinge, die ich für Neuinstallationen deaktiviere.
Jahroy

3
Ich denke, *wird den Cursor bedingungslos bewegen. Und ich kann nicht sehen, wie incsearchärgerlich es sein könnte, da es nur ein Blick nach vorne ist, eine aktuelle Suche durchzuführen, ohne Ihre Position tatsächlich zu ändern.
YvesgereY

3
Wow ... du hast recht. Ich nahm an incsearch, dass das Ausschalten die Bewegung verhindern würde, aber ein schneller Test bestätigt, dass Sie korrekt sind. Entschuldigen Sie. Es ist jedoch sehr einfach, ein Mapping zu erstellen, das die Bewegung verhindert : :nnoremap * *N. Ich kann nicht glauben, dass du es nicht tust ärgerlich finden, wenn Ihr Cursor während einer Suche über den gesamten Bildschirm springt. Aber ... diese Dinge sind völlig subjektiv. Vive la différence ;-)
Jahroy

3
Sie können dies auch tun :let @/='hilight_this', vorausgesetzt, Sie haben hlsearchaktiviert. Es hebt Text hervor, ohne zu springen, und Sie müssen vorhandene Einstellungen nicht ändern. Dies ändert den Wert, der aktuell im Suchregister gespeichert ist.
Ben Davis

1
Dies sollte die akzeptierte Antwort sein. <Leiter> m erledigt den Job, es ist kein Doppelklick erforderlich.
Sassan

4

Zuerst (oder in Ihrer .vimrc):

:set hlsearch

Positionieren Sie dann den Cursor über dem Wort, das hervorgehoben werden soll, und drücken Sie *.

hlsearchbedeutet, alle Vorkommen der aktuellen Suche hervorzuheben und *nach dem Wort unter dem Cursor zu suchen.


3

Stellen Sie zunächst sicher, dass hlsearch aktiviert ist, indem Sie den folgenden Befehl eingeben

:set hlsearch

Sie können dies auch wie festgelegt zu Ihrer .vimrc-Datei hinzufügen

set hlsearch

Wenn Sie jetzt den Schnellsuchmechanismus im Befehlsmodus oder einen regulären Suchbefehl verwenden, werden alle Ergebnisse hervorgehoben. Um zwischen den Ergebnissen vorwärts zu wechseln, drücken Sie 'n', um rückwärts zu gehen. Drücken Sie 'N'.

Um im normalen Modus eine schnelle Suche nach dem Wort unter dem Cursor durchzuführen und mit einem Befehl zum nächsten Vorkommen zu springen, drücken Sie '*'. Sie können auch nach dem Wort unter dem Cursor suchen und zum vorherigen Vorkommen wechseln, indem Sie '# drücken '

Im normalen Modus kann die Schnellsuche auch mit dem aufgerufen werden

/searchterm<Enter>

Um Markierungen bei der Verwendung von Okulenzen zu entfernen, habe ich dies an eine Verknüpfung in meiner .vimrc gebunden

:nohl

2

Aktivieren Sie die Hervorhebung der Suche:

:set hlsearch

Dann suchen Sie nach dem Wort:

/word<Enter>


2

Um ein Wort hervorzuheben, ohne den Cursor zu bewegen, ploppieren Sie

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

in dein vimrc.

Das Schöne daran ist g*und g#bleibt wie "normal" *und #.


Zum hlsearchStarten können Sie "Kurzform" verwenden (es sei denn, Sie haben eine andere Funktion, die im Befehlsmodus mit "noh" beginnt) : :noh. Oder Sie können eine lange Version verwenden::nohlsearch

Für extreme Bequemlichkeit (ich schalte hlsearchvielleicht 20 Mal pro Tag um) können Sie etwas zum Umschalten hlsearchwie folgt zuordnen :

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

.:. Wenn dies der Fall <leader>ist \(dies ist standardmäßig der Fall), können Sie \stim normalen Modus (schnell) drücken, um umzuschalten hlsearch.

Oder vielleicht möchten Sie nur :nohkartiert haben:

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

Das obige wird einfach :nohlsearchso ausgeführt, dass es (anders als :set hlsearch!) das Wort beim nächsten Drücken *oder #im normalen Modus immer noch hervorhebt .

Prost



1

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

Stellen Sie sicher, dass Sie etwas IncSearcheingestellt haben. zB call s:Attr('IncSearch', 'reverse'). Alternativ können Sie stattdessen eine andere Markierungsgruppe verwenden.

Dadurch werden alle Vorkommen von Wörtern unter Ihrem Cursor unverzüglich hervorgehoben. Ich stelle fest, dass mich eine Verzögerung verlangsamt, wenn ich durch den Code flitze. Die Hervorhebungsfarbe stimmt mit der Farbe des Wortes überein, sodass sie mit Ihrem Schema übereinstimmt.


0

Warum nicht einfach: z /

Dadurch werden das aktuelle Wort unter dem Cursor und alle anderen Vorkommen hervorgehoben. Und Sie müssen nicht für jedes gesuchte Element einen separaten Befehl eingeben. Vielleicht ist das in der unheiligen GVIM nicht verfügbar? Es ist standardmäßig in vim.

* ist nur dann gut, wenn der Cursor zum nächsten Vorkommen bewegt werden soll. Wenn Sie zwei Dinge visuell vergleichen, möchten Sie oft nicht, dass sich der Cursor bewegt, und es ist ärgerlich, jedes Mal die Taste * zu drücken.


Vim und gvim haben normalerweise den gleichen Befehlssatz. In den Hilfedokumenten gibt es keinen Verweis auf einen "z /" - Befehl.
WDS

Es ist nicht nur in gvim verfügbar, sondern auch in vim. Einfach überprüft - funktioniert einfach nicht.
Ruslan

z / funktioniert, wenn dieses in einer früheren Antwort erwähnte Skript verwendet wird.
Fzzylogic

0
  1. Fügen Sie diese Zeilen in Ihre ~/.vimrcDatei ein

" 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. Laden Sie die Einstellungen mit neu :so%
  2. Im normalen Modell gehen Sie über das Wort.

  3. Drücken Sie * Drücken Sie F8, um rekursiv unter Ihrem gesamten Projekt über das Wort zu suchen


0

Zum Beispiel diese PlugIns:

Suchen Sie einfach nach unter dem Cursor in vimawesome.com

Der Schlüssel ist, wie bereits erwähnt, dass das Highlight NICHT mit Ihrer Suche in Konflikt steht : https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

Screenshot davon, wie es NICHT mit der Suche in Konflikt steht: Geben Sie hier die Bildbeschreibung ein Hinweise:

  • vim-illuminate Highlights standardmäßig habe ich in meinem Screenshot auf Unterstreichen umgestellt
  • vim-illuminate hebt / unterstreicht das Wort standardmäßig unter dem Cursor hervor. In meinem Screenshot habe ich es deaktiviert
  • Meine Farbschemata sind sehr grau. Überprüfen Sie Ihre, um es auch anzupassen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.