Може це можна зробити в Vim?
Що я маю на увазі: пошук "BadJob" і заміна на "GoodJob" виконають наступні заміни
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Може це можна зробити в Vim?
Що я маю на увазі: пошук "BadJob" і заміна на "GoodJob" виконають наступні заміни
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Відповіді:
Використовуйте cancelish.vim :
:%S/badjob/goodjob/g
BadJob
і я хочу його замінити GoodJob
, я не можу використовувати %S/badjob/goodjob/g
. Не вдається виявити відповідність.
%S/BadJob/GoodJob/g
тоді команда Subvert перейде в режим змішаного регістру і виконає всі підстанції, як задано ОП.
Я не знаю, чи це таке рішення, яке ви шукаєте ... але я використав це: Keepcase.vim
Інакше немає підтримки в vim ...
впевнений, ти можеш
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
пс. Я здогадуюсь, що у codecase.vim інкапсулює схожу логіку :)
:set ignorecase
. 2. Bad
буде заміщений GOOD
замість Good
. 3. "" job
"частина питання ігнорується, тому це також замінить lambada
→ lamgooda
. Виправлення та пояснення цих помилок та ще декількох речей у моїй відповіді . (Також LOLOWLs!)
Ви можете просто вставити та адаптувати це:
(Звичайно, якщо ви робите це час від часу, вам потрібен плагін замість цієї жахливості. Але для тих, хто поспішає і потрібен лише один раз, це швидкий злом за ваше задоволення від приклеювання :)
:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
Крім шаблону пошуку, вам потрібно відредагувати чотири '
рядки '
в коді заміни: Редагуйте частини жирним шрифтом :
:% s / \ c погано \ ze робота / \ =
(підматч (0) [0] є # toupper (субматч (0) [0])? ' G ': ' g ').
(submatch (0) [1] є # toupper (submatch (0) [1])? ' OOD ': ' ood ')
Не використовуйте цю "помаранчеву" версію для вставки, оскільки її символи рядка також порушують команду.
/\ze
є синтаксичним цукром vim regex для позначення позитивного лукахеда: Шаблон після \ze
перевіряється на, але не замінюється.
is#
?? Дозвольте мені пояснити… (Якщо зацікавлено)
#
(також у ==#
та інших ) застосовує чутливість до справ. В іншому випадку, з :set ignorecase
(що я використовую, тому що це потрібно для корисного :set smartcase
), vim вважатиме 'a' == 'A'
!!
Божевірно, як насправді, ми мусимо це ==
пояснювати : Оскільки це залежить від налаштувань користувачів, слід НЕВАРИ використовувати! (За винятком випадків, де це насправді те, що ви хочете.) Я навіть буду дотримуватися рекомендації, яку потрібно використовувати ==#
при порівнянні цілих чисел: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensesly
is#
замість ==#
іншого способу кодування захисно: Він покращує безпеку типу: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Його слід використовувати при порівнянні з рядковим літералом.
'single-quoted'
замість "double quoted"
рядків - ще одна вдала практика: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc. - ця відповідь будується на їхній відповіді , виправляючи кілька недоліків.
Альтернативою плагіну зберігання є SmartCase - заміна слів, зберігаючи оригінальний регістр . (Не дозволяйте себе відштовхувати від поганих оцінок.)
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
?
:SmartCase
команду. Я продовжив це у власній вилці . Зауважте, що для цього потрібна бібліотека ingo як залежність.