Чехол сохраняющий заменитель в Vim - PullRequest
141 голосов
/ 23 апреля 2009

Может это можно сделать в Vim?

Что я имею в виду: поиск 'BadJob' и замена на «GoodJob» будет делать следующие замены

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

Ответы [ 6 ]

100 голосов
/ 18 апреля 2014

Использование abolish.vim :

:%S/badjob/goodjob/g
27 голосов
/ 23 апреля 2009

Я не знаю, ищите ли вы именно такое решение ... но я использовал это: keepcase.vim

В vim нет никакой поддержки ...

10 голосов
/ 23 апреля 2009

уверен, что вы можете

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

пс. Я предполагаю, что keepcase.vim заключает в себе похожую логику:)

5 голосов
/ 06 июня 2015

Вы можете просто вставить и адаптировать это:
(Конечно, если вы будете делать это время от времени, вам понадобится плагин вместо этого чудовища. Но для тех, кто спешит и нуждается в нем только один раз, это быстрый взлом для вашего удовольствия от вставки: )

:%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 работа / \ =
(submatch (0) [0] равно # toupper (submatch (0) [0])? ' G ': ' g ').
(submatch (0) [1] равно # toupper (submatch (0) [1])? ' OOD ': ' ood ')

Не используйте эту «оранжевую» версию для вставки, так как символы переноса строки также нарушают команду.

/\ze - синтаксический сахар vim regex для обозначения положительного взгляда: шаблон после \ze проверяется, но не подставляется.


is# ?? Позвольте мне объяснить ... (Если интересно.)

# (также в ==# и others ) обеспечивает чувствительность к регистру. Иначе, с :set ignorecase (который я использую, потому что это требуется для полезного :set smartcase), vim будет считать 'a' == 'A' !!
image image image
Как бы безумно это ни было, мы действительно должны учитывать это: поскольку это зависит от пользовательских настроек, == следует использовать НЕ ВСЕ! (За исключением случаев, когда это действительно будет тем, что вы хотите.) Я даже следуйте рекомендации использовать ==# при сравнении целых чисел: 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. - этот ответ основан на их ответе , исправляя несколько недостатков.

3 голосов
/ 01 марта 2018

Если вы сопоставляете только точную (независимую от регистра) строку с несколькими возможными заглавными буквами, другая возможность:

:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i
2 голосов
/ 06 мая 2013

Альтернативой плагину keepcase является SmartCase - замена слов при сохранении исходного регистра . (Не позволяйте себе расстраиваться из-за плохих оценок.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...