Czy to może być wykonane w vim?
Chodzi mi o to, że wyszukanie „BadJob” i zastąpienie go „GoodJob” spowodowałoby następujące zastąpienia
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Czy to może być wykonane w vim?
Chodzi mi o to, że wyszukanie „BadJob” i zastąpienie go „GoodJob” spowodowałoby następujące zastąpienia
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Odpowiedzi:
Użyj abolish.vim :
:%S/badjob/goodjob/g
BadJob
i chcę je zastąpić GoodJob
, nie mogę użyć %S/badjob/goodjob/g
. Nie udaje się wykryć dopasowania.
%S/BadJob/GoodJob/g
, to:, wtedy polecenie Subvert przełączy się na tryb mieszanych wielkości liter i wykona wszystkie podmiany podane przez OP.
Nie wiem, czy jest to rozwiązanie, którego szukasz ... ale użyłem tego: keepcase.vim
W vimie nie ma innego wsparcia ...
pewnie, że możesz
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
ps. Zgaduję, że keepcase.vim zawiera podobną logikę :)
:set ignorecase
. 2. Bad
zostanie zastąpiony przez GOOD
zamiast Good
. 3. Część „ job
” pytania jest ignorowana, więc spowoduje to również zastąpienie lambada
→ lamgooda
. Poprawki i wyjaśnienia tych błędów i kilka innych rzeczy w mojej odpowiedzi . (Również LOLOWLs!)
Możesz po prostu wkleić i dostosować to:
(Oczywiście, jeśli robisz to od czasu do czasu, zamiast tej potworności będziesz potrzebować wtyczki. Ale dla niektórych, którzy się spieszą i potrzebują jej tylko raz, jest to szybki hack dla przyjemności wklejania :)
:%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 musisz edytować cztery '
ciągi '
w kodzie zastępczym: Edytuj części pogrubione :
:% s / \ c bad \ ze job / \ =
(submatch (0) [0] to # toupper (submatch (0) [0])? ' G ': ' g ').
(submatch (0) [1] to # toupper (submatch (0) [1])? ' OOD ': ' ood ')
Nie używaj tej „pomarańczowej” wersji do wklejania, ponieważ znaki podziału wiersza również spowodują przerwanie polecenia.
/\ze
to cukier syntaktyczny vim regex do oznaczania dodatniego wyprzedzenia: wzorzec po \ze
jest sprawdzany, ale nie zastępowany.
is#
?? Pozwól, że wyjaśnię… (jeśli zainteresowany.)
#
(także w ==#
i inne ) wymusza uwzględnianie wielkości liter. W przeciwnym razie, z :set ignorecase
(którego używam, ponieważ jest to wymagane dla użytecznego :set smartcase
), vim rozważy 'a' == 'A'
!!
Choć jest to szalone, naprawdę powinniśmy to uwzględnić: ponieważ jest to zależne od ustawień użytkownika, ==
należy użyć NEVAR! (Z wyjątkiem miejsca, w którym faktycznie byłoby to tym, czego chcesz). Będę nawet postępować zgodnie z zaleceniami dotyczącymi ==#
porównywania liczb całkowitych: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively
is#
zamiast ==#
to inny sposób kodowania defensywnego: poprawia bezpieczeństwo typów: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Powinien być używany do porównywania z literałem ciągu.
'single-quoted'
zamiast "double quoted"
ciągów znaków to kolejna dobra praktyka: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc. - ta odpowiedź opiera się na ich odpowiedzi , naprawiając kilka niedociągnięć.
Alternatywą dla wtyczki Keepcase jest SmartCase - zastępowanie słów przy zachowaniu oryginalnej wielkości liter . (Nie zrażaj się złymi ocenami).
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
?
:SmartCase
polecenia. Rozszerzyłem to w swoim własnym widelcu . Zauważ, że wymaga to ingo-library jako zależności.