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'
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'
Nie wiem, czy to jest rodzaj rozwiązania szukasz ... ale ja używałem tego: keepcase.vim
nie ma wsparcie w vim inaczej ...
ż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ę :)
Tak, ma to miejsce od 2007 roku::% SubstituteCase/\ cbadjob/GoodJob/g ^^ –
Znaczenie od gVim 7.2? Próbowałem go w gVim 7.1 (12 maja 2007) i to nie działa :( –
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 –
Alternatywą dla wtyczkijest SmartCase - replacing words while keeping original case. (Nie daj się zniechęcić przez złych ocen).
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'? –
@ 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. –
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ęć.
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
ta powinna być cechą vim. To ma sens. – Bach