2009-04-23 14 views
117

Czy można wykonać this w Vim?Zamiennik przypadku w Vim

Chodzi mi o to: poszukiwanie „BadJob” i zastąpienie „GoodJob” zrobi następujące zamienniki

'badjob' -> 'goodjob' 
'BadJob' -> 'GoodJob' 
'badJob' -> 'goodJob' 
'BADJOB' -> 'GOODJOB' 
+11

ta powinna być cechą vim. To ma sens. – Bach

Odpowiedz

74

Zastosowanie abolish.vim:

:%S/badjob/goodjob/g 
+3

Pełna nazwa polecenia to: Subvert –

26

Nie wiem, czy to jest rodzaj rozwiązania szukasz ... ale ja używałem tego: keepcase.vim

nie ma wsparcie w vim inaczej ...

9

że u może

:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/

ps. Zgaduję, że keepcase.vim zawiera pewną podobną logikę :)

+0

Tak, ma to miejsce od 2007 roku::% SubstituteCase/\ cbadjob/GoodJob/g ^^ –

+0

Znaczenie od gVim 7.2? Próbowałem go w gVim 7.1 (12 maja 2007) i to nie działa :( –

+0

Nie, dodałem polecenie: SubstituteCase do wtyczki w 2007 roku. To wszystko. Wtyczka jest dostępna na vim.org, i nie jest dostarczany z vim jak zwykle z większością wtyczek –

2

Alternatywą dla wtyczkijest SmartCase - replacing words while keeping original case. (Nie daj się zniechęcić przez złych ocen).

+1

Czy jest jakaś sztuczka, aby skrócić te trudne do zapamiętania i nużące do wpisywania komend takich jak ':% s/file \ A \ ? size/\ = SmartCase ("LastModifiedTime")/ig'? –

+0

@ MichaelHärtl: Możesz użyć polecenia ': SmartCase'. Rozszerzyłem to [w moim własnym widelcu] (https://github.com/in karkat/SmartCase). Zauważ, że wymaga to [ingo-library] (http://www.vim.org/scripts/script.php?script_id=4433) jako zależności. –

4

Wystarczy wkleić i dostosować to:
(Oczywiście, jeśli to zrobić od czasu do czas, będziesz chciał wtyczki zamiast tego monstrum. Ale dla niektórych, którzy są w pośpiechu i tylko trzeba go raz, to jest szybkie Hack do wklejenia przyjemności :)

:%s/\cbad\zejob/\= (submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g') . (submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood')

Oprócz wzorca wyszukiwania, trzeba edytować cztery ' ciągi ' w kodzie zastępczej: Edycja części w pogrubioną:

:% s/\ c złe \ ZE praca/\ =
(submatch (0) [0] is # toupper (submatch (0) [0])? 'G': 'g').
(submatch (0) [1] # toupper (submatch (0) [1]) 'OOD'? 'ood')

Nie używaj tego 'pomarańczowych' wersja do wklejania, ponieważ jej znaki łamania linii również przerwie polecenie.

/\ze jest vim regex cukier składniowym do znakowania pozytywnego lookAhead: Wzór po \ze jest sprawdzane, ale nie podstawione.


is# ?? Pozwól mi wyjaśnić ... (Jeśli zainteresowany.)

# (również w ==# i others) wymusza rozróżnianie wielkości liter. W przeciwnym razie, z :set ignorecase (którego używam, ponieważ jest to wymagane dla użytecznego :set smartcase), vim będzie rozważać 'a' == 'A' !!

Szalony jak to jest, że naprawdę powinien stanowić dla niego: Ponieważ jest user-ustawienia-zależne, == należy nevar używane! (. Z wyjątkiem przypadków, które mogłyby być w rzeczywistości, co chcesz) będę nawet zalecenia do korzystania ==# przy porównywaniu liczby całkowite: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is# zamiast ==# jest kolejnym sposobem kodowania defensywnie: Poprawia Typ bezpieczeństwa: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Powinny być używane podczas porównywania z literałem łańcuchowym.

'single-quoted' zamiast "double quoted"strings to kolejna dobra praktyka: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @fc. - ta odpowiedź opiera się na ich answer, naprawiając kilka niedociągnięć.

0

Jeśli tylko dokładne dopasowanie (case-niezależne) łańcuch z kilku możliwych kapitalizacji, inną możliwością jest:

:s/abc/\={'abc':'xyz','Abc','Xyz'}[submatch(0)]/i