Jak powstrzymać vima przed podświetlaniem meczów po zamianie?

13

Mam set hlsearchw sobie ~/.vimrc. Jest to zwykle bardzo przydatne, ale denerwujące jest to, że muszę to zrobić :nohpo tym, jak wykonam zamianę '<,'>s/$/',/(co podkreśla koniec każdej linii po jej uruchomieniu). Jak mogę vimnie wyróżniać po takiej wymianie?

Jestem na Ubuntu 9.04 z vim7.2. Mam ten sam problem na OS X 10.6 (także vim7.2). Pożądane byłoby coś, co działałoby na obu.

AKTUALIZACJA: Wszystkie odpowiedzi, które otrzymałem, po prostu dodają mapowanie klawiszy do zrobienia :noh(lub równoważne). Naprawdę staram się unikać niestandardowych kluczowych zachowań, do których naprawdę się przyzwyczaiłem, ale potem doprowadzam mnie do żałości bez nich (np. Na komputerze znajomego itp.). Chciałbym vimzrobić to automatycznie :nohpo dokonaniu wymiany. To znaczy, chcę tylko hlsearchprzy użyciu /lub *(może kilka innych przypadków), ale nie innym razem.

Benjamin Oakes
źródło

Odpowiedzi:

7

Jeśli nie chcesz trwale wyłączać, możesz przypisać klawisz do przełączania podświetlenia, zgodnie z sugestią zawartą w tej odpowiedzi na podobne pytanie dotyczące przepływu stosu.

map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

Jeśli chcesz na stałe wyłączyć podświetlenie:

11.1. After I searched for a text with a pattern, all the matched text
      stays highlighted. How do I turn off the highlighting
      temporarily/permanently?

The 'hlsearch' option controls whether all the matches for the last
searched pattern are highlighted or not. By default, this option is not
enabled. If this option is set in a system-wide vimrc file, then you can
turn off the search highlighting by using the following command:

    :set nohlsearch

(z FAQ VIM )

Doug Harris
źródło
2
Byłem świadomy tej opcji. Problem polega na tym, że zwykle nie szukam tego, co chcę zastąpić, więc nie ma sensu wyróżniać w większości przypadków, które zastępuję. Jednakże, jest to bardzo przydatne, gdy ja jestem szukając czegoś, więc ja nie chcę, aby przejść całkowicie z dala.
Benjamin Oakes
@Benjamin: Niejawnie go szukałeś. To właśnie robi: s. Wyszukuje wzór, a następnie dokonuje transformacji dopasowania (-ów). Używanie: nohl jest właściwym rozwiązaniem, ponieważ wyłącza zaznaczenie bieżącego wzorca wyszukiwania do czasu następnego wyszukiwania. Robi to bez zmiany stanu opcji „hlsearch” lub wpływu na przechowywaną wartość poprzedniego wyszukiwanego hasła.
jamessan,
2
@jamessan: Rozumiem, że to wyszukiwanie i zamiana. Po prostu nie potrzebuję tego wyróżniać. Przede wszystkim przede wszystkim irytacja.
Benjamin Oakes,
Jakiś czas temu zacząłem domyślnie wyłączać podświetlanie i włączać je, kiedy chcę, tak jak sugerowałeś. Nadal nie jest idealny, ale jest lepszy.
Benjamin Oakes
9

Mam dwa różne rozwiązania, oba całkiem niezłe, każde o zróżnicowanym zachowaniu. Moim ulubionym jest opcja 2:

  1. Mam następujące 2 wiersze w moim .vimrc:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    Pierwszy czeka na przekroczenie limitu czasu (nie można go skonfigurować), jeśli kursor się nie porusza i wyłącza hlsearch. Drugi włącza go ponownie, jeśli kursor ponownie się poruszy.

    To nie jest idealne rozwiązanie, ale działa dla mnie (i będzie prawie idealne, gdy limit czasu można skonfigurować - na razie limit czasu jest powiązany z wbudowanym timerem dla vima.)

  2. Lub możesz wypróbować następujące linie:

    autocmd cursorhold * set nohlsearch
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    

To wyłącza hlsearch po krótkim czasie braku ruchu kursora i włącza go ponownie dla standardowych poleceń wyszukiwania. Nie obejmuje wszystkich możliwości ponownego włączenia hlsearch, ale wystarcza jako starter do potwierdzenia koncepcji.

Gafel
źródło
Dzięki za aktualizację - dopiero teraz ją widziałem. (Wygląda na to, że właśnie go dodałeś? Zabawne.) To jest fajna koncepcja; Będę musiał się z tym bawić.
Benjamin Oakes,
Zastrzeżenie 2. polega na tym, że wyszukiwanie w trybie wizualnym Vnie działa
Bryce Guinta
Zmodyfikowałem pierwszy wiersz w opcji 1 w następujący sposób. autocmd cursorhold * set nohlsearch | let @/ = "" Spowoduje to wyczyszczenie rejestru wyszukiwania oraz usunięcie wyróżnienia. Nie spędziłem dużo czasu z tym zestawem, ale chciałem go udostępnić tym, którzy tu trafią.
Berkeley Martinez,
2

Po prostu wpisuję „/ asdf” (zakładając, że „asdf” nie ma w pliku), aby pozbyć się podświetlania. Wiem, że to dość uproszczone, ale działa dla mnie.

Greg Graham
źródło
2
To ten sam pomysł :noh, ale nie zawsze działa. :) Zabawne, że o tym wspominasz: kiedyś miałem przyjaciela, który zawsze wpisywał swoje imię, ponieważ pojawiało się rzadziej niż coś takiego jak „asdf” w tym, co napisał. (Myślę, że to trochę zabawne.)
Benjamin Oakes,
Prawdziwe. Może zapamiętam: nie, następnym razem.
Greg Graham,
1

Umieść następujące dane w pliku .vimrc:

nnoremap <silent> <F11> :exe ":silent! normal /$^\r"<CR>

To po cichu ukryje podświetlony wyszukiwany termin, ale nie wyłącza tej :set hlsearchfunkcji. Aktywuje się ponownie przy następnym wyszukiwaniu.

Gregor Müllegger
źródło
Lepiej po prostu użyć wbudowanego polecenia przeznaczonego do tego celu -: nohl. Następnie nie usuwasz zawartości rejestru wyszukiwania, który jest używany do takich rzeczy, jak przeskakiwanie do następnego dopasowania, domyślna wartość wzorca, gdy żaden nie jest określony, itp.
jamessan
Tak, ale zirytowało mnie to, że moje następne wyszukiwanie nie zostało wyróżnione tak, jak powinno. Wymyślam więc to szybkie rozwiązanie. Może być również brudny, ale działa. Myślę, że jest to do przyjęcia dla vima - nawet gdybym nie użył „brudnych” rzeczy w kodzie źródłowym prawdziwego, dużego projektu.
Gregor Müllegger,
1

Inną możliwością jest zresetowanie @/rejestru (który w rzeczywistości jest rejestrem do odczytu i zapisu) po wykonaniu podstawienia. To przywraca poprzednią atrakcję:

command! -nargs=* -range S
\ let atslash=@/|exe ':'.<line1>.','.<line2>.'s'.<q-args>|let @/=atslash

Jednak nadal ma to kilka problemów:
- zamiast modyfikować :s, definiuje nowe polecenie. Choć możliwe jest użycie cabbrevdo map :sdo :Swiem, nie sposób złapać wszystkie konstrukcje, takie jak :<range>s.
- jeśli :nohlwcześniej używałeś do ukrywania tylko jednego wyszukiwania, spowoduje to ponowne podświetlenie poprzedniego wyszukiwania. Nie wiem, jak sprawdzić, czy :nohlzostał wcześniej wywołany. (Możliwe, że można to obejść i również zastąpić :nohlpolecenie, ale wymagałoby to również zastąpienia wszystkich poleceń wyszukiwania, co może być za dużo ...).

Circonflexe
źródło