Можно ли это сделать в Vim?
Я имею в виду: поиск «BadJob» и замена на «GoodJob» сделают следующие замены
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Можно ли это сделать в Vim?
Я имею в виду: поиск «BadJob» и замена на «GoodJob» сделают следующие замены
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Ответы:
Используйте abolish.vim :
:%S/badjob/goodjob/g
BadJob
и я хочу заменить его GoodJob
, я не могу использовать %S/badjob/goodjob/g
. Не удается обнаружить совпадение.
%S/BadJob/GoodJob/g
то команда Subvert переключится в смешанный режим и выполнит все подстановки, как указано в OP.
Я не знаю, если это то решение, которое вы ищете ... но я использовал это: keepcase.vim
Там нет никакой поддержки в Vim ...
конечно ты можешь
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
пс. я предполагаю, что keepcase.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 bad \ ze job / \ =
(submatch (0) [0] равно # toupper (submatch (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-defensively
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. - этот ответ основывается на их ответе , исправляя несколько недостатков.
Если вы сопоставляете только точную (независимую от регистра) строку с несколькими возможными заглавными буквами, другая возможность:
:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i
Альтернативой плагину keepcase является SmartCase - замена слов при сохранении исходного регистра . (Не позволяйте себе быть обескураженным плохими оценками.)
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
?
:SmartCase
команду. Я продлил это в моей собственной развилке . Обратите внимание, что это требует ingo-библиотеки в качестве зависимости.